Вы находитесь на странице: 1из 13

Manejo de fechas en visual fox pro

Visual FoxPro posee muchas funciones nativas que generan y manipulan expresiones de tipo Date y DateTime. En este artculo veremos las caractersticas de algunas de estas funciones y una recopilacin de funciones definidas por el usuario publicadas en PortalFox que nos permitirn obtener diversos resultados a partir de este tipo de expresiones. Funciones DATE() y DATETIME() La funcin DATE() nos retorna la fecha actual del sistema si se ejecuta sin argumentos. Para evitar complicaciones con fechas ambiguas es conveniente que siempre utilicemos la funcin DATE(nAnio,nMes,nDia) con sus argumentos para crear expresiones de tipo Date. dFecha = DATE() dFecha = DATE(2000,03,01) && Fecha actual del sistema && 1 de Marzo de 2000

La diferencia entre dos expresiones de tipo Date nos retorna el nmero de das transcurridos entre ambas fechas. ? DATE(2004,12,31) - DATE(2004,1,1) Si se suman o restan cantidades numricas de das a una expresin de tipo Date, el resultado es otra expresin de tipo Date. ? DATE() + 7 ? DATE() - 15 && La fecha actual mas 7 das && La fecha actual menos 15 das

La funcin DATETIME() nos retorna la fecha y hora actual del sistema si se ejecuta sin argumentos. Al igual que la funcin DATE() y para evitar complicaciones con fechas ambiguas es conveniente que siempre utilicemos la funcin DATETIME(nAnio,nMes,nDia,nHoras,nMinutos,nSegundo) con todos sus argumentos para crear expresiones de tipo DateTime. tFHora = DATETIME() tFHora = DATETIME(2000,03,01,16,15,30) && Fecha y hora actual del sistema && 1 de Marzo de 2000, 16:15:30 horas

La diferencia entre dos expresiones de tipo DateTime nos retorna el nmero de segundos transcurridos entre ambas fechas y horas. ? DATETIME(2004,12,31,23,59,59) - DATETIME(2004,12,31,6,0,0) NOTA: Debido a un bug con el redondeo en las fracciones de segundos en variables del tipo DateTime es conveniente redondear las diferencias de estas variables con ROUND(lnSeg,0) ? ROUND(DATETIME(2004,12,31,23,59,59) - DATETIME(2004,12,31,6,0,0), 0) Si se suman o restan cantidades de segundos a una expresin de tipo DateTime, el resultado es una expresin de tipo DateTime. ? DATETIME() + 60 ? DATETIME() - 3600 && Fecha y hora actual mas 60 segundos && Fecha y hora actual menos 3600 segundos

Si deseamos generar expresiones Date y DateTime "vacas" lo hacemos de la siguiente manera: dFecha dFecha tFHora tFHora = = = = {} {//} {/:} {//::} && && && && Expresion Expresion Expresin Expresin Date vacia Date vacia DateTime vacia DateTime vacia

En estos ltimos ejemplos, se debe tener en cuenta que la mayora de los servidores de bases de datos no trabaja con el concepto de fechas "vacas" como lo hace Visual FoxPro. En estos casos se debe utilizar fechas nulas debido a que se tendrn fechas incoherentes y/o no esperadas. dFecha = .null. tFHora = .null. Funciones con expresiones Date y DateTime Se pueden convertir expresiones de tipo Date a DateTime y viceversa con las funciones DTOT() y TTOD() respectivamente. En el caso de la funcin DTOT() (al igual que si omitimos los argumentos de horas en la funcin DATETIME(nAnio,nMes,nDia)) la hora se sustituye por 00:00:00 (12:00:00AM). dFecha = DATE(2004,06,03) tFHora = DATETIME(2004,05,18,11,30,45) ? DTOT(dFecha) ? TTOD(tFHora) Las siguientes funciones de Visual FoxPro sirven para poder extraer algunos valores de las expresiones Date y DateTime, como el ao, el mes, el da, la semana, etc. dFecha = DATE(2004,06,03) tFHora = DATETIME(2004,05,18,11,30,45) ? YEAR(dFecha) && Ao de una expresin Date o DateTime ? MONTH(tFHora) && Mes de una expresin Date o DateTime ? DAY(dFecha) && Da de una expresin Date o DateTime ? HOUR(tFHora) && Horas de una expresin DateTime ? MINUTE(tFHora) && Minutos de una expresin DateTime ? SEC(tFHora) && Segundos de una expresin DateTime ? DOW(dFecha) && Nmero del da de la semana de una expresin Date o DateTime ? WEEK(dFecha) && Nmero de semana del ao de una expresin Date o DateTime ? QUARTER(tFHora) && Trimestre del ao de una expresin Date o DateTime Todas las funciones anteriores retornan valores numricos. Otras funciones de Visual FoxPro retornan cadenas de caracteres a partir de expresiones Date o DateTime, como por ejemplo: dFecha = DATE(2004,06,03) tFHora = DATETIME(2004,05,18,11,30,45) ? CMONTH(dFecha) && Nombre del mes de una expresin Date o DateTime ? CDOW(tFHora) && Nombre del da de la semana de una expresin Date o DateTime ? DMY(tFHora) && Cadena con el formato da-mes-ao de una expresin Date o DateTime ? MDY(tFHora) && Cadena con el formato mes-da-ao de una expresin Date o DateTime ? TTOC(tFHora) && Convierte una expresin DateTime a caracter ? DTOC(dFecha) && Convierte una expresin Date a caracter Para retornar una cadena de caracteres solo con la hora de una variable DateTime se utiliza la funcin TTOC() con el segundo parmetro igual a 2. ? TTOC(DATETIME(),2) En Visual FoxPro se puede retornar una fecha con "n" meses anteriores o posteriores de una expresin Date o DateTime con la funcin GOMONTH(). ? GOMONTH(DATE(),3) ? GOMONTH(DATETIME(),-12) && Tres meses despus a partir de la fecha actual && Doce meses anteriores a partir de la fecha y hora actual

Otras funciones con argumentos de expresiones Date y DateTime Existen otras funciones en Visual FoxPro que reciben como argumento expresiones de tipo Date y DateTime, y retornan valores lgicos, Date o DateTime. dFecha0 = {} dFecha1 = DATE(2004,1,1) dFecha2 = DATE(2004,12,31) dFecha3 = .null. *-- Retorna .T. si una fecha es "vacia" ? EMPTY(dFecha0) *-- Retorna .T. si una fecha es "nula" ? ISNULL(dFecha3) *-- Retorna .T. si la 1 expresin est dentro de los valores 2 y 3 ? BETWEEN(DATE(),dFecha1,Dfecha2) *-- Retorna .T. si la expresin 1 coincide con alguna de la lista ? INLIST(DATE(2004,1,1),dFecha0,dFecha1,dFecha2,dFecha3) *-- Retorna la expresin Date o DateTime con valor mnimo ? MIN(dFecha1,dFecha2) *-- Retorna la expresin Date o DateTime con valor mximo ? MAX(dFecha0,dFecha1,dFecha2) Mas funciones de tiempo Visual FoxPro posee las siguientes funciones referidas a tiempo: TIME() retorna la hora actual del sistema en formato de 24 horas en una cadena de 8 caracteres con el formato "HH:MM:SS". Al retornar una cadena de caracteres no se pueden realizar operaciones aritmticas con estos valores. ? TIME() && Hora actual del sistema

SECONDS() retorna el nmero de segundos pasados desde la medianoche. Se puede utilizar para medir intervalos cortos de tiempo en un proceso. Recordar que este valor vuelve a 0 (cero) a partir de la medianoche. nSegundos = SECONDS() FOR nI = 1 TO 3 INKEY(1) ENDFOR ? SECONDS() - nSegundos, "segundos transcurridos" SYS(1) retorna una cadena de caracteres con el nmero de da Juliano de la fecha actual del sistema. SYS(10,nDiaJuliano) retorna una cadena de caracteres con la fecha correspondiente al da Juliano pasado como parmetro. SYS(11,dFecha) retorna una cadena de caracteres con el nmero de da Juliano de la fecha pasada como parmetro. ? SYS(1) ? SYS(10,VAL(SYS(1))) ? SYS(11,DATE(2005,1,1)) Los valores vlidos en Visual FoxPro para los das das del calendario Juliano estn comprendidos entre el 14 de Setiembre de 1752 y el 31 de Diciembre de 9999. Funciones definidas por el usuario

A continuacin describiremos diversas funciones definidas por el usuario (UDF) que utilizan las funciones nativas de Visual FoxPro descriptas al comienzo de este artculo, que nos permiten trabajar con expresiones Date y DateTime. Esta funciones estn publicadas en PortalFox y algunas fueron ligeramente modificadaspara este este artculo. ltimo da del mes: Esta funcin retorna la fecha del ltimo da del mes de una expresin Date o DateTime pasada como parmetro. ? EoM(DATE()) FUNCTION EoM(tdFecha) LOCAL ld ld = GOMONTH(tdFecha,1) RETURN ld - DAY(ld) ENDFUNC Primer da del mes: Esta funcin retorna la fecha del primer da del mes de una expresin Date o DateTime pasada como parmetro. ? BoM(DATE()) FUNCTION BoM(tdFecha) RETURN DATE(YEAR(tdFecha),MONTH(tdFecha),1) ENDFUNC Cantidad de das de un mes: Esta funcin retorna la cantidad de das que tiene el mes de una expresin Date o DateTime pasada como parmetro. ? DiasDelMes(DATE(2004,2,1)) FUNCTION DiasDelMes(tdFecha) LOCAL ld ld = GOMONTH(tdFecha,1) RETURN DAY(ld - DAY(ld)) ENDFUNC Edad de una persona: Calcula la edad de una persona pasando como parmetros la fecha de nacimiento y la fecha a la cual calculamos la edad. Si no se pasa el segundo parmetro se toma por defecto la fecha actual. ? Edad(DATE(2000,3,1)) FUNCTION Edad(tdNac, tdHoy) LOCAL lnAnios IF EMPTY(tdHoy) tdHoy = DATE() ENDIF lnAnios = YEAR(tdHoy) - YEAR(tdNac) IF GOMONTH(tdNac, 12 * lnAnios) > tdHoy lnAnios = lnAnios - 1 ENDIF RETURN lnAnios ENDFUNC Diferencia entre dos fechas en aos, meses y das: Calcula la cantidad de aos, meses y das entre dos expresiones de tipo Date pasadas como parmetros. (esta funcin utiliza la UDF DiasDelMes()). ? Diferencia_AMD(DATE(2000,3,1), DATE()) FUNCTION Diferencia_AMD(tdIni, tdFin) LOCAL ldAux, lnAnio, lnMes, lnDia, lcRet *--- Fecha inicial siempre menor IF tdIni > tdFin ldAux = tdIni tdIni = tdFin

tdFin = ldAux ENDIF lnAnio = YEAR(tdFin) - YEAR(tdIni) ldAux = GOMONTH(tdIni, 12 * lnAnio) *--- No cumplio el ao aun IF ldAux > tdFin lnAnio = lnAnio - 1 ENDIF lnMes = MONTH(tdFin) - MONTH(tdIni) IF lnMes < 0 lnMes = lnMes + 12 ENDIF lnDia = DAY(tdFin) - DAY(tdIni) IF lnDia < 0 lnDia = lnDia + DiasDelMes(tdIni) ENDIF *--- Si el dia es mayor, no cumplio el mes IF (DAY(tdFin) < DAY(tdIni)) IF lnMes = 0 lnMes = 11 ELSE lnMes = lnMes - 1 ENDIF ENDIF lcRet = ALLTRIM(STR(lnAnio))+ " aos, " + ; ALLTRIM(STR(lnMes))+ " meses y " + ; ALLTRIM(STR(lnDia))+ " das" RETURN lcRet ENDFUNC Diferencias entre dos variables DateTime: Calcula la cantidad de das, horas, minutos y segundos entre dos expresiones DateTime pasadas como parmetros. ? Diferencia_DHMS(DATETIME(2000,3,1,12,10,05),DATETIME()) FUNCTION Diferencia_DHMS(ttIni,ttFin) LOCAL ln, lnDia, lnHor, lnMin, lnSeg IF EMPTY(ttFin) ttFin = DATETIME() ENDIF ln = ttFin - ttIni lnSeg = MOD(ln,60) ln = INT(ln/60) lnMin = MOD(ln,60) ln = INT(ln/60) lnHor = MOD(ln,24) lnDia = INT(ln/24) RETURN ALLTRIM(STR(lnDia))+ " das, "+ ; TRANSFORM(lnHor, "@L 99")+ " horas, "+ ; TRANSFORM(lnMin, "@L 99")+ " minutos, "+ ; TRANSFORM(lnSeg, "@L 99")+ " segundos" ENDFUNC Segundos a hora: Transforma una cantidad de segundos pasados como parmetro al formato hora "HH:MM:SS". Con esta funcin podemos transformar la cantidad de segundos devueltos de una diferencia de dos expresiones DateTime. lnSeg = DATETIME() - DATETIME(2004,3,1,12,10,05) ? Seg2Hor(lnSeg) FUNCTION Seg2Hor(tnSegundos) LOCAL lnHoras, lnMinutos, lnSegundos lnHoras = INT(tnSegundos/3600) lnMinutos = INT(((tnSegundos-(lnHoras*3600))/60)) lnSegundos = MOD(tnSegundos,60) RETURN IIF(lnHoras < 100,TRANSFORM(lnHoras,"@L 99"),ALLTRIM(STR(lnHoras))) + ; ":" + TRANSFORM(lnMinutos,"@L 99") + ;

":" + TRANSFORM(lnSegundos,"@L 99") ENDFUNC Validar una fecha: Retorna verdadero si la fecha (ao,mes,da) pasada como parmetro es vlida. ? EsFechaValida(2004,2,30) FUNCTION EsFechaValida(tnAnio, tnMes, tnDia) RETURN ; VARTYPE(tnAnio) = "N" AND ; VARTYPE(tnMes) = "N" AND ; VARTYPE(tnDia) = "N" AND ; BETWEEN(tnAnio, 100, 9999) AND ; BETWEEN(tnMes, 1, 12) AND ; BETWEEN(tnDia, 1, 31) AND ; NOT EMPTY(DATE(tnAnio, tnMes, tnDia)) ENDFUNC Saber si un ao es bisiesto: Retorna verdadero si el ao pasado como parmetro es bisiesto. ? EsBisiesto(2004) FUNCTION EsBisiesto(tnAnio) RETURN NOT EMPTY(DATE(tnAnio,2,29)) ENDFUNC Calcular una fecha festiva: Retorna una fecha festiva como por ejemplo el "Da de la Madre" que en algunos pases se celebra el "Tercer Domingo de Octubre". Los parmetros que recibe la esta funcin son los siguientes: tnOrdinal: El ordinal que se desea saber (1, 2, 3, ...) tnDiaSem: El da de la semana (1=Dom, 2=Lun, ..., 7=Sb) tnMes: El nmero del mes (1=Ene, 2=Feb, ..., 12=Dic) tnAnio: El ao *-- Tercer Domingo de Octubre de 2004 ? FechaFestiva(3,7,10,2004) FUNCTION FechaFestiva(tnOrdinal,tnDiaSem,tnMes,tnAnio) RETURN DATE(tnAnio,tnMes,1) + tnOrdinal * 7 - ; DOW(DATE(tnAnio,tnMes,1) + tnOrdinal * 7 -1,tnDiaSem) ENDFUNC Fecha en espaol: Retorna una cadena con la fecha en espaol en formato "Sbado 01 de Enero de 2005" ? cFecha(DATE(2005,1,1)) FUNCTION cFecha(tdFecha) LOCAL aDias(7), aMeses(12) aDias[1]="Domingo " aDias[2]="Lunes " aDias[3]="Martes " aDias[4]="Mircoles " aDias[5]="Jueves " aDias[6]="Viernes " aDias[7]="Sbado " aMeses[1]="Enero" aMeses[2]="Febrero" aMeses[3]="Marzo" aMeses[4]="Abril" aMeses[5]="Mayo" aMeses[6]="Junio" aMeses[7]="Julio" aMeses[8]="Agosto" aMeses[9]="Setiembre" aMeses[10]="Octubre" aMeses[11]="Noviembre"

aMeses[12]="Diciembre" RETURN aDias(DOW(tdFecha,1)) + ; TRANSFORM(DAY(tdFecha),"@L 99") + ; " de " + aMeses(MONTH(tdFecha)) + ; " de " + TRANSFORM(YEAR(tdFecha),"@L 9999") ENDFUNC Configuraciones Se debe recordar que muchas de las funciones de fecha y hora estn afectadas por las configuraciones de Windows y Visual FoxPro.Se recomienda la lectura en la ayuda de la sintaxis y alcance de los siguientes comandos: SET DATE, SET CENTURY, SET HOURS, SET SECONDS, SET SYSFORMAT, SET FDOW, SET FWEEK, SET STRICTDATE y SET MARK. Final Estas son la mayora de las funciones de Visual FoxPro referidas a expresiones de fechas y horas. En PortalFox se pueden encontrar mas funciones definidas por el usuario referidas a fechas y horas.

//fin de manejo de fechas en visual fos pro

Diferencias en sql y visual fox pro

Veamos estas diferencias en la sintaxis cuando se mueven datos entre Visual FoxPro y SQL Server. A lo largo de estos ltimos aos, el Fox team en Microsoft ha hecho un trabajo excelente para acercar lo ms posible el sublenguaje SQL de VFP para que acepten los estndares. En particular, se ha hecho el comando SELECT ms cercano, conforme a los estndares ANSI-92, lo que es una buena noticia para los desarrolladores que necesitan moverse entre VFP y tener datos en Bases de datos SQL Server y Oracle. Aun la versin actual de SELECT tiene suficientes diferencias que atrapan al programador desprevenido. Algunas de estas diferencias reflejan peculiaridades del lenguaje FoxPro, mientras otras son servicios tan genuinamente tiles - aunque no son estndar - que los desarrolladores no dejaran de emplearlo - por ejemplo, la capacidad para enviar los resultados de una consulta directamente a una matriz. En este artculo, veremos las diferencias entre la sintaxis de las versiones de SELECT para VFP y SQL Server (T-SQL). Nosotros compilamos la lista especficamente teniendo en mente SQL Server 2000 , casi todos los puntos se refieren a las versiones 7 y 2005 (hemos actualizado el artculo despus de que ha salido SQL Server 2005). Si conoce otras diferencias no cubiertas aqu, estaremos encantados de recibir su comentario. Orden de las clusulas VFP siempre ha estado relajado en cuanto al orden de las clusulas en una instruccin y esto se aplica al SELECT. Coloque su ORDER BY antes de la clusula FROM, o su TOP N justo al final del comando y VFP ni

siquiera va a pestaar. T-SQL es mucho ms estricto. En general T-SQL exige que la clusula aparezca en orden en el que se ha escrito en el diagrama de sintaxis del archivo de Ayuda. Nombres de columnas vacos Algo raro de T-SQL que sorprende a los desarrolladores VFP, es la posibilidad de generar consultas de resultados con columnas de nombres vacas. Esto ocurre de forma predeterminada con columnas calculadas o agregadas. Por ejemplo, en los resultados de esta consulta: SELECT EmployeeID, UPPER(LEFT(LastName,4)) FROM Employees La segunda columna no tendr nombre, en VFP, el nombre de la columna va a ser de forma predeterminada como Exp_1. En ambas versiones, puede emplear la clusula AS para asignar un nombre a una columna: SELECT EmployeeID, UPPER(LEFT(LastName,4)) AS ShortName FROM Employees pero T-SQL brinda una sintaxis alternativa que no est soportada por VFP. SELECT EmployeeID, ShortName = UPPER(LEFT(LastName,4)) FROM Employees WITH TIES En T-SQL puede agregar WITH TIES es la clusula TOP N para indicar que el conjunto resultante debe incluir y agrupar los valores en la fila ensima. Entonces, si especifica TOP 10 WITH TIES, y las filas 10ma y 11na tienen el mismo valor. Obtendr 11 filas en el conjunto resultante. VFP no admite esta clusula. Clusula FROM opcional Aqu hay otra diferencia que sorprende a mucha gente. En T-SQL, es legal omitir la clusula FROM en un comando SELECT - pero slo si las expresiones, en la lista de expresiones, no referencian a ninguna columna en una tabla. Haciendo esto siempre genera un conjunto resultante con una fila exactamente. El comando siguiente, por tanto, va a producir un conjunto resultante que contiene solamente la fecha-hora actual: SELECT GETDATE() AS Current VFP va a oponerse resueltamente a un comando de este tipo. Operador LIKE Tanto VFP y T-SQL admiten caracteres comodn ('_' y '%') con el operador LIKE. Esto representa un nico carcter y un nmero arbitrario de caracteres respectivamente. Por tanto, en esta consulta: SELECT * FROM Products WHERE Product_Name LIKE '%chocolate%' Tendremos todos los productos cuyo nombre incluya "chocolate" T-SQL lo hace un poco mejor, ya que nos permite utilizar corchetes para denotar rangos y conjuntos. Por ejemplo, la sentencia siguiente va a encontrar productos cuyo cdigo comience con A,B,C seguido por dos dgitos:

SELECT * FROM Products WHERE Product_Code LIKE '[A-C][0-9][0-9]' Desafortunadamente, esta caracterstica tan cmoda, no est disponible en VFP. Las funciones agregadas y GROUP BY Esto ha atrapado a muchos desarrolladores VFP, especialmente desde VFP 8.0, que fue donde apareci por primera vez. En versiones anteriores, la sintaxis siguiente estaba admitida: SELECT Country, City, AVG(Inv_Total) FROM Invoices GROUP BY Country Sin embargo, aunque es legal, la sintaxis provocar datos potencialmente incorrectos. En el ejemplo de arriba, VFP va a seleccionar una ciudad arbitraria para que se corresponda con cada pas, incluso aunque ese pas pueda tener muchas ciudades. SQL ANSI-92 impone una regla muy sencilla: si la consulta tiene clusula GROUP BY. T-SQL fuerza estrictamente esa regla, como hace VFP 8.0 y superior, pero las versiones anteriores de FoxPro no (en VFP 8.0 y superior, puede sobreescribir este comportamiento estableciendo ENGINEBEHAVIOR 70). Agrupar columnas numricas Todava en la clusula GROUP BY, la siguiente sintaxis es legal en todas las versiones de VFP: SELECT Country, AVG(Inv_Total) FROM Invoices GROUP BY 1 T-SQL puede ahogarse aqu, porque las columnas numricas no estn admitidas en la clusula GROUP BY. Tendra que utilizar la forma siguiente (lo que tambin es legal en VFP): SELECT Country, AVG(Inv_Total) FROM Invoices GROUP BY Country Sin embargo, ambas versiones permiten utilizar columnas numricas con ORDER BY. Clusula HAVING En VFP, puede utilizar la clusula HAVING, incluso si no existe clusula GROUP BY. En este caso, HAVING se comporta como WHERE. En T-SQL, HAVING no est permitido sin GROUP BY. Outer joins En T-SQL, no puede especificar un join nico como OUTER. A diferencia en VFP, puede incluir la palabra apropiada: LEFT, RIGHT o FULL. Proyecciones y tablas derivadas Tanto VFP y T-SQL admiten subconsultas en la clusula WHERE. Tanto en VFP 9.0, como en T-SQL, las subconsultas pueden aparecer adems, en la lista de expresiones y en las clusulas FROM y JOIN. Las subconsultas en la lista de expresiones se llaman proyecciones, mientras aquellas de FROM o JOIN se llaman tablas derivadas. El archivo Ayuda tanto para VFP 9.0 como para SQL Server tienen ejemplos de cmo se pueden emplear. VFP 8.0 y anterior no admiten proyecciones o tablas derivadas.

Destino de las consultas VFP permite enviar los resultados de las consultas a varios destinos. De forma predeterminada, van a un cursor que crea VFP y muestra con un Browse. Puede utilizar la clusula PREFERENCE para especificar opciones para esta ventana. Alternativamente, puede utilizar la clusula TO para enviar los resultados de la pantalla, una impresora o un archivo texto. O puede utilizar INTO para localizar los resultados en un cursor, tabla o matriz. En T-SQL, los resultados de las consultas se devuelven sencillamente al proceso del cliente en el formulario o el conjunto resultante. La nica opcin para redireccionarlos es para enviarlos a una tabla nueva, lo que puede hacer de esta forma: SELECT * INTO Choc_Products FROM Products WHERE Product_Name LIKE '%chocolate%' A diferencia de VFP, la posicin de la clusula INTO es significativa - puede aparecer entre la lista de expresiones y la clusula FROM - no se puede incluir la palabra clave TABLE. Si desea enviar el resultado de la consulta para una tabla temporal - similar a un cursor en VFP - utilice la sintaxis de nombre como antes; pero inicie el nombre de la tabla con #. Las tablas, cuyos nombres comiencen con #, se guardan en la base de datos Tempdb de SQL Server, y se destruyen cuando las conecciones que la crean, se cierran. Los campos memo y general en clusulas DISTINCT VFP 7.0 y superior admite especificar campos memo y general en la lista de expresiones de una consulta que incluye la palabra clave DISTINCT, aunque esas consultas producen resultados incorrectos. Para VFP 8.0, el MS FoxTeam ha mejorado esta sintaxis. Ahora se prohben los campos memo y general en consultas DISTINCT, a menos que ENGINEBEHAVIOR sea 70. Los equivalentes de campos memo y general en SQL Server son columnas de texto e imagen. T-SQL no admite columnas de esos tipos en el conjunto resultante de consultas que tienen una clusula DISTINCT. Cantidad de tablas VFP 8.0 y anteriores impone un lmite de 30 tablas (para ser preciso, 30 alias) en una sentencia SELECT. La equivalencia en T-SQL es 256. VFP 9.0 tericamente, no tiene lmites . Enlazando subconsultas En VFP 8.0 y anteriores slo puede tener un nico nivel de subconsultas enlazadas. En VFP 9.0, tericamente no existen lmites. En T-SQL, el lmite es 32 niveles. Valores nulos Si desea excluir valores nulos desde un conjunto resultante (o excluir todo excepto valores nulos), puede (y debe) utilizar IS [NOT] NULL en la clusula WHERE. Pero aplica en ambos casos VFP y T-SQL. Sea cuidadoso con la funcin ISNULL() que es aparentemente similar. En VFP, esta funcin hace lo que sugiere su nombre: le dice si la evaluacin de la expresin dada es null. En T-SQL, ISNULL() es ms parecido a la funcin NVL() de VFP . Tiene dos argumentos: si el primer argumento es nulo, la funcin devuelve el segundo argumento, en caso contrario devuelve el primero.

Fin de diferencias entre sql y visual fox pro

String Functions Basic Dim str1 As String Dim str1 As String * 5 C++ / Java Delphi / Pascal Java (String Class)

Declare

char str1[256]

str1 : string;

string str1 String str1 = "abc";

Assignment str1 = "test"

strcpy(str1, "test"); str1 := 'test'; No error checking if str1 = str2 CompareStr(S1, S2) CompareText(S1, S2) SameText(S1, S2) AnsiSameText(S1, S2) AnsiSameCaption(S1, S2) TMask.Matches(S2)

str1 = "test";

Compare

strcmp(str1, str2) stricmp(str1, if str1 = str2 str2) StrComp(string1, strcmpi(str1, string2) str2) strcspn(str1, str2)

if (str1==str2) str1.equals(str2) str1.compareTo(str2)

Substring

Mid(string, start[, length])

strncpy(str1, "test", 2); Copy(Str1, Index, Count); strncpy(str1, str1[i]; str2[3], 2);

str1.substring(1, 2);

Left, Right, Trim

Left(string, length) Right(string, length) LTrim(string) RTrim(string) Trim(string) UCase(string) LCase(string)

N/A

Delete(s, Start, Count) TrimLeft(s) TrimRight(s) Trim(s)

trimBlanks(str1) str1.trim()

Set Case

strupr(str1); UpperCase(str1) strlwr(str1); LowerCase(str1) strcat(str1, str2); str3 := str1 + str2; S := Concat('ABC', 'DEF');

str1.toUpperCase() str1.toLowerCase() str3 = str1 + str2; str3 = str1 + 5; str3 += str2;

str1 = str1 & Concatenate str2 (& preferred)

str1 = str1 + str2 (+ is not reliable) str$(tempInt) str(tempInt) Int to String cstr(tempInt) hex$(tempInt)

str1.concat(str2);

IntToStr(tempInt) itoa(int1, Str(X, s) str1, bytes); IntToHex(int, 4)

toString() toString(int) toBinaryString(int) toHexString(int) toOctalString(int)

val(str1) String to Int cint(str1) clng(str1) Length len(TempStr)

atoi(char*) atol(char*)

StrToInt(str1) StrToIntDef(str1, 100) Val(S; var V; var Code: Integer); Length(str1)

str1.valueOf(int)

strlen(str1)

str1.length()

Search

InStr([start, ]str1, str2[, compare]) InstrRev(str1, str2 [,...])

strchr(str1, ch1) strrchr(str1, ch1) strstr(str1, Pos(Substr: string; S: string): str2) Integer; strpbrk(str1, str2) strtok(str1, str2, ??)

str1.indexOf(...) str1.lastIndexOf(...)

Replace

Replace(str1, str2, str3 [,...])

N/A

StringReplace(str1, str2, str3 , str1.replace(..) flags) Characters only s[i] := 'a' Format(...) FmtStr(...) Notes Ord(Ch) Chr(48) Integer('A') Insert(s, NewStr, index) Format(...) StringTokenizer str1.charAt(int) String(character, number) str1.toCharArray()

Format Parse

Format(...) N/A Asc(string) Chr(charcode) Space(number) String(number, character)

sprintf(...) N/A

Misc

str1[3]

Вам также может понравиться