Aunque hay mucha similitud, no existe una conversión directa entre todos los tipos de datos de Firebird al Visual FoxPro. Las diferencias son las siguientes:

Tipo numérico

La única diferencia es que el tipo BIGINT de Firebird pasa como CHAR(19) a Visual FoxPro. Para convertir una columna de tipo BIGINT a su valor numérico hay que usar la función VAL(). Ejemplo:

ThisForm.Text1.Value = Val(CLI_IDENTI)     && la columna CLI_IDENTI es de tipo BIGINT

Tipo alfanumérico

No hay diferencias. Si se necesita se puede usar la función CAST() para acortar la longitud. Ejemplo:

SELECT CAST(MiComentario AS VARCHAR(128)) AS MiColumnaChar FROM MiTabla

NOTA: Si el argumento de la función VARCHAR() es menor que el ancho de la columna que se está “casteando” ocurrirá un error. En el ejemplo anterior, si la columna MiComentario tiene un ancho de 140 entonces ocurrirá un error “string right truncation” porque se la acortó a 128. Sin embargo, igualmente se mostrará la columna.

Tipo fecha

En SQL no se permiten fechas vacías, en Visual FoxPro sí. En SQL todas las fechas deben tener un valor o ser NULL. Para lidiar con fechas NULL en Visual FoxPro escribiríamos:

ThisForm.Text2.Value = IIF(!ISNULL(MiFechaFirebird), MiFechaFirebird, {})

Adicionalmente, podríamos asignarle un valor predeterminado cuando la fecha sea NULL, por ejemplo:

ThisForm.Text2.Value = IIF(!ISNULL(MiFechaFirebird), MiFechaFirebird, DATE(2013, 6, 20))

le asignaría la fecha 20 de junio de 2013 a todas las fechas NULL

Grabación de fechas

Pueden ocurrir problemas cuando se quiere guardar una fecha de VFP en Firebird, para evitarlos se agrega un caracter CHR(0) al final. Como la grabación de fechas es algo muy común lo más conveniente es tener una función que realice la tarea de convertir la fecha de VFP a fecha de Firebird:

FUNCTION FECHA_FIREBIRD_1 && Le agrega un caracter CHR(0) al final. Se usa cuando se AGREGAN o MODIFICAN datos
LParameters tuFecha
Local lcFechax

   lcFechax = iif(VarType(tuFecha) == "D", DtoC(tuFecha), tuFecha)

   lcFechax = SubStr(lcFechax, 4, 2) + "-" + Left(lcFechax, 2) + "-" + Right(lcFechax, 4) + Chr(0)

Return(lcFechax)

Esa función la usaríamos así:

M.VEN_FECHAX = Fecha_Firebird_1(ThisForm.Text3.Value)

lcComando = “EXECUTE PROCEDURE GRABAR_VENTA(?M.VEN_FECHAX)”

lnResultado = SQLExec(lnHandle, lcComando)

Además, cuando lo que queremos es consultar datos es conveniente también tener una función que convierta las fechas:

FUNCTION FECHA_FIREBIRD_2 && Sin el caracter CHR(0) al final. Se usa cuando se CONSULTAN datos
LParameters tuFecha
Local lcFechax

   lcFechax = iif(VarType(tuFecha) == "D", DtoC(tuFecha), tuFecha)

   lcFechax = SubStr(lcFechax, 4, 2) + "-" + Left(lcFechax, 2) + "-" + Right(lcFechax, 4)

Return(lcFechax)

A esta función la usaríamos así:

lcFechaVenta = Fecha_Firebird_2(ThisForm.Text2.Value)

lcComando = “SELECT VEN_FECHAX FROM VENTAS WHERE VEN_FECHAX = ?lcFechaVenta”

lnResultado = SQLExec(lnHandle, lcComando)

Tipo boolean

Firebird no dispone de un tipo boolean (se tiene previsto que en la versión 3 si haya) por lo cual generalmente se usa un dominio para emularlo. Algo como:

CREATE DOMAIN D_BOOLEAN AS
   CHAR(1)
   CHECK (VALUE = 'F' OR VALUE = 'T');

Entonces en nuestro programa VFP podríamos escribir:

llMiValorBoolean = MiColumnaFirebird == “T”

y así, la variable llMiValorBoolean tendrá .T. cuando MiColumnaFirebird sea “T” y tendrá .F. cuando tenga “F”.

si el código de arriba no te resulta claro también podrías escribir:

llMiValorBoolean = IIF(MiColumnaFirebird == “T”, .T., .F.)

Artículo relacionado:

El índice del blog Firebird21

 

Anuncios