Optimizar MySQL en Windows (I)

Si tienes muchos usuarios aumenta las conexiones.

Para saber el número de conexiones permitidas ejecuta: SHOW VARIABLES LIKE ‘max_connections’

Para aumentarlas, en la seccion mysqld del my.ini pon: max_connections = 200

El limite máximo es 10.000

Establece el Max_Allowed_Packet = 100M
Key_Buffer_Size=512M
query_cache_size = 128MB
query_cache_limit = 4MB
table_cache=512
tmp_table_size = 64MB

Mas info sobre la optimizacion en: http://dev.mysql.com/doc/refman/5.0/en/optimization.html

Para saber el número de conexiones activas puedes usar:

SHOW STATUS WHERE `variable_name` LIKE ‘Threads_%’ OR variable_name = ‘Connections’

Esto te da algo parecido a:

Cómo usar .NET en tu aplicacion

1.- Crear la DLL y dejala en la carpeta /Exe Te recomiendo que uses .NET 2.0 que está en todas las máquinas Win 7 y superiores.

2.- Pulsa con el boton derecho en .NET Assemblies y añadela.

3.- Añadela a la lista

El resto ya es usar las funciones que tengas creadas con:

NombredelaLibreria.funcion()

La función SUM

Hoy le toca a la función SUM… que es distinta de la función SUM de Fox. En WD se usa para sumar valores numéricos de un array o elementos de una estructura. Mas info en http://doc.windev.com/?1000019892

Ejemplo de sumar elementos de un array unidimensional:

arrDatos is array of 0 int
ArrayAddLine(arrDatos,10)
ArrayAddLine(arrDatos,5)
AddLine(arrDatos,20)
Info(Sum(arrDatos))

AddlLine es parecido a ArrayAddLine

Ejemplo de sumar elementos de un array bidimensional:

arrDatos is array of 0,2 int
ArrayAddLine(arrDatos,1, 10)
ArrayAddLine(arrDatos,2, 5)
AddLine(arrDatos,3, 20)
Info(Sum(arrDatos,2))

Ejemplo de sumar elementos de una estructura:

strPersona is Structure
 Nombre is string
 Edad is int 
END

arrDatos is array of 0 strPersona
arrDatos[1].Nombre = "uno"
arrDatos[1].Edad = 30
arrDatos[2].Nombre = "dos"
arrDatos[2].Edad = 20
arrDatos[3].Nombre = "tres"
arrDatos[3].Edad = 25
 //* Otra forma de rellenar el array de estructuras :-)
//* Asigna valores al array. Cada Línea se corresponde con los valores de la estructura
//arrDatos = [
// ["uno", 30],
// ["dos",20],
// ["tres", 25]
//]
 Info(Sum(arrDatos, "Edad"))

Accede a datos Fox sin romper los indices

WinDev tiene una serie de funciones xBase pero tienen la cualidad de que siempre que escribes te rompen los indices *.CDX de Fox.

Pero hay una alternativa que sí funciona: OLE DB

OLE DB es una tecnologia de 32 bits que funciona también en 64.

Lo primero que tienes que hacer es bajarte el driver OLE DB para Fox:

https://www.microsoft.com/en-us/download/details.aspx?id=14839

Una vez instalado prueba el siguiente código:

gctMiConexion is Connection

// Completa valores generales de la conexión
gctMiConexion..User = ""
gctMiConexion..Password = ""
gctMiConexion..Database = ""
gctMiConexion..Access = hOReadWrite 
gctMiConexion..Provider = "VFPOLEDB.1"
gctMiConexion..Server = "localhost"
gctMiConexion..Source = CompleteDir(fExeDir()) + "\dbfs\data1.dbc"
gctMiConexion..ExtendedInfo = "Window Handle=0;Locale Identifier=1033;Mode=3;Prompt=4;Extended Properties=;Mask Password=False;Cache Authentication=False;Encrypt Password=False;OLE DB Services=-1;Collating Sequence=SPANISH;DSN=;DELETED=True"

// Abre la conexión
IF NOT HOpenConnection( gctMiConexion ) THEN
	Info(HErrorInfo())
	Close()
END

Ejecuta código externo

WinDev permite ejecutar código WinDev externo que tengas por ejemplo en un archivo de texto.

Mira este sencillo juego.

Copia en un fichero de texto que podemos llamar prueba.txt el siguiente código:

InitRandom()
nRandomNumber is int
nRandomNumber = Random(0, 10)
 nNumero is int=0
 Input("Pon un número del 0 al 10..",nNumero)
IF nNumero = nRandomNumber THEN
 info("¡Enhorabuena!, has acertado el número que he pensado")
else
 InfoBuild("¡Has fallado!, mi número era el %1",nRandomNumber)
END

A continuacón en WinDev create un boton en una pantalla con el siguiente código:

lcCadena is string = fLoadText("D:\prueba.txt")

ExecuteCode(lcCadena)

Más info en http://doc.windev.com/?1000019783

Usar el API de Windows

Por ejemplo, para saber el nombre del PC usariamos:

ppBuffer is string ASCIIZ on 256
pBytesReturned is int = 128

API("kernel32.dll", "GetComputerNameA" , &ppBuffer,&pBytesReturned)

sResult is string = ppBuffer

Info(sResult)

Como se sabe System32 tiene tanto las funciones de 32 como las de 64 y así con el resto.
Una lista de referencia de funciones la puedes tomar de: http://doc.pcsoft.fr/fr-FR/?6510002&productversion=01F150038E

Añadir propiedades a una clase

En tiempo de ejecución no se le pueden añadir propiedades a una clase, pero puedes hacerlo con este pequeño truco

STProperty is Structure
         _value is Variant // the value
         _name is string // property ID
         _targetType is int // use wlConstants  por ejemplo wlEntier ( france )
END

Resize is a Class

PRIVATE
         _properties is dynamic array of 0 STProperty
END


PROCEDURE  addProp(newProp is STProperty)
       Add(_properties,newProp)

PROCEDURE getProp(pName is string)
       vReturn is Variant
     
       // Busca la propiedad en el array y devuelve el valor
        FOR EACH stAProperty OF _properties WHERE _name = pName
	      vReturn = stAProperty._value
	      BREAK
         END

         RESULT vReturn

PROCEDURE  deleteProp(pName is string):boolean

      // Busca la propiedad en el array y devuelve el valor
      FOR EACH stAProperty,nIndex of _properties WHERE _name = pName
	ArrayDelete(_properties,nIndex)
	BREAK	
      END

      RESULT True