Extensiones de la Base de Datos

Cuando estás en desarrollo, en el Analisis sueles tener tablas como:

– product
– customer
– order

etc…

Pero el cliente cuando ha instalado la base de datos le ha puesto una extensión por ejemplo: ph_

Y así el cliente tiene las tablas como:

– ph_product
– ph_customer
– ph_order

Tu aplicación dará error, cuando la corra el cliente salvo que al principio del proyecto hagas.

DB_ext is string = "ph_"
HChangeName(product, DB_ext + "product")
HChangeName(customer, DB_ext + "customer")
HChangeName(order, DB_ext + "order")

Escribir una etiqueta por código

iDestination(iPrinter,"Imprimiendo Documento de venta")
iCreateFont(1, 9, iNormal, "Times New Roman", iBlack, 0)

iPrint(iFont(1)+iXPos(0,False)+ "Vendedor: " )
iPrint(iFont(1)+iXPos(0,False)+"Fecha: "+ " Hora: "+TimeSys() )
iPrint(iFont(1)+iXPos(0,False)+"Cliente: " )
iPrint(iFont(1)+iXPos(0,False)+"NIF: " )
iPrint(iFont(1)+iXPos(0,False)+"Direccion: ")
iPrint()

iEndPrinting()

Librerias de MySQL

Las librerias del MySql las puedes poner en el proyecto (las correspondientes de 32 y 64 según el tipo de aplicación).

pero, hay un sitio mejor que sirve para todas las aplicaciones que hagas:

C:\WinDev 20\Programs\Framework\Win32x86 (para las de 32)

C:\WinDev 20\Programs\Framework\Win64x86 (para las de 64)

Ahí las tendrás siempre disponibles para todos los proyectos.

Al entregar el ejecutable al cliente tienes que adjuntarle las librerías correspondientes.

Otra forma de crear un cursor

En el ejemplo anterior se creaba un cursor partiendo de una tabla existente.

En este caso se crea totalmente desde 0 el cursor:

CRES is Data Source
AFile is File Description
AnItem is Item Description
 
// Nombre y descripcion del cursor
AFile..Name = "CRES"
AFile..Type = hFileNormal
AFile..FicCryptMethod = hCryptStandard
 
// Campo tipo texto
AnItem..Name = "TITULO"
AnItem..Type = hItemText
AnItem..Size = 40
HDescribeItem(AFile, AnItem)
 
// Campo numerico
AnItem..Name = "IMPORTEd"
AnItem..Type = wlNumeric
AnItem..Size = 10
HDescribeItem(AFile, AnItem)
 
// Validates the description of the data file
HDescribeFile(AFile)
 
// Nos situamos en un directorio de temporales para crear el cursor fisico
HChangeDir(CRES, "C:\TEMP\")
 
// Se crea el fichero. Lo crea con ese nombre y la extension *.FIC
HCreation( CRES )
 
// vinculamos temporalmente el cursor al analisis
HDeclareExternal("C:\temp\CRES.fic", "cCursor")

Crear un cursor

lqQry is Data Source
lcSQL is string
 
// Preparamos cursor
lcSQL = "Select * from tabla1 where 1 = 0"
 
HExecuteSQLQuery(lqQry, lcSQL)
 
// borramos ficheros anteriores
fDelete("C:\temp\tmp.fic")
fDelete("C:\temp\tmp.ndx")
 
// guardamos el resultado en un fichero
IF HToFile(lqQry, "C:\temp\tmp.fic") = True THEN
    Trace("si")
END
 
// vinculamos temporalmente el cursor al analisis
HDeclareExternal("C:\temp\tmp.fic", "cCursor")
 
// A continuacion se puede hacer una relacion con el cursor lcSQL = "Select
* from tabla2 left join tabla2.campo1 = cCursor.Capo1"
HExecuteSQLQuery(lqQry, lcSQL)

Conexión a MySQL

Como sabes hay 2 formas de conectarse.

Con

– HDescribeConnection (la base de datos debe estar en el análisis)
– SQLConnect (no hace falta que la base de datos esté en el análisis)

Si te conectas al Mysql con SQLConnect pero la base de datos está en otro puerto tienes que ponerle el parametro del final acabado en ;

nHandle is int
nHandle = SQLConnect(DBHostName, DB_USERNAME, lcPassword, db_database,»MySQL»,»»,»Server Port=3307;»)

IF nHandle < 0 THEN Info("Imposible conectarse") RETURN END

Invocar Objetos COM

WHEN EXCEPTION IN
    oCom is object OLE dynamic
    oCom = GetActiveObject(“SYStree.fls_sysfunc”)
    IF oCom=Null THEN
        Error("No se ha podido instanciar el objeto SYStree.fls_sysfunc")
        EndProgram()
    END
DO
    Info(oCom>>cPathDAtos + " " + oCom>>cPathRaiz)
    oCom = Null
END

Creación de controles en tiempo de ejecución

Tasa is Control
y is int = 567
WHILE NOT HOut
   //Crear el control
   Tasa <- ControlCreate(dsTasas.name, typNum, 66, y, 200, 25)
   
   //Darle Valor
   Tasa = (EDT_SubTotal * dsTasas.rate)/100
   //Maquetacion del control
   Tasa..Caption = dsTasas.name
   Tasa..Style = EDT_ID..Style
   Tasa..CaptionWidth = 150
   Tasa..HorizontalAlignment = haRight
   Tasa..InputMask = "9.999,99"
   Tasa..State = DisplayOnly
   //Ubicacion del siguiente control
   y+=30
   HReadNext(dsTasas)
END