Sunteți pe pagina 1din 60

Introduccin a Visual Fox Pro

Captulo 1. Funciones de Bsqueda y Remplazo.


Consultas de Seleccin (SELECT)
Las consultas de seleccin se utilizan para indicar al motor de datos que devuelva informacin de las bases de datos, esta informacin es devuelta en forma de conjunto de registros que se pueden almacenar en un objeto recordset. Este conjunto de registros es modificable.

Consultas Bsicas.
La sintaxis bsica de una consulta de seleccin es la siguiente:
SELECT CAMPOS FROM TABLA;

En donde campos es la lista de campos que se deseen recuperar y tabla es el origen de los mismos, por ejemplo:
SELECT NOMBRE, TELEFONO FROM CLIENTES;

Esta consulta devuelve un recordset con el campo nombre y telfono de la tabla clientes. En Introduciendo SQL en Access podemos observar cmo se introducen consultas directamente en una base de datos de Access sin utilizar el Asistente.

Ordenar los registros (ORDER BY)


Adicionalmente se puede especificar el orden en que se desean recuperar los registros de las tablas mediante la clasula ORDER BY Lista de Campos. En donde Lista de campos representa los campos a ordenar. Ejemplo:
SELECT CODIGOPOSTAL, NOMBRE, TELEFONO FROM CLIENTES ORDER BY NOMBRE;

Esta consulta devuelve los campos CodigoPostal, Nombre, Telefono de la tabla Clientes ordenados por el campo Nombre. Se pueden ordenar los registros por mas de un campo, como por ejemplo:
SELECT CODIGOPOSTAL, NOMBRE, TELEFONO FROM CLIENTES ORDER BY CODIGOPOSTAL, NOMBRE;

Incluso se puede especificar el orden de los registros: ascendente mediante la clasula (ASC -se toma este valor por defecto) descendente (DESC)
SELECT CODIGOPOSTAL, NOMBRE, TELEFONO FROM CLIENTES ORDER BY CODIGOPOSTAL DESC , NOMBRE ASC;

Consultas con Predicado (ALL, TOP, DISTINCT)


El predicado se incluye entre la clusula y el primer nombre del campo a recuperar, los posibles predicados son:
Comando Descripcin

ALL TOP DISTINCT DISTINCTROW

Devuelve todos los campos de la tabla Devuelve un determinado nmero de registros de la tabla Omite los registros cuyos campos seleccionados coincidan totalmente Omite los registros duplicados basndose en la totalidad del registro y no slo en los campos seleccionados.

ALL
Si no se incluye ninguno de los predicados se asume ALL. El Motor de base de datos selecciona todos los registros que cumplen las condiciones de la instruccin. No se conveniente abusar de este predicado ya que obligamos al motor de la base de datos a analizar la estructura de la tabla para averiguar los campos que contiene, es mucho ms rpido indicar el listado de campos deseados.
SELECT ALL FROM EMPLEADOS; SELECT * FROM EMPLEADOS;

TOP
Devuelve un cierto nmero de registros que entran entre al principio o al final de un rango especificado por una clusula ORDER BY. Supongamos que queremos recuperar los nombres de los 25 primeros estudiantes del curso 1994:
SELECT TOP 25 NOMBRE, APELLIDO FROM ESTUDIANTES ORDER BY NOTA DESC;

Si no se incluye la clusula ORDER BY, la consulta devolver un conjunto arbitrario de 25 registros de la tabla Estudiantes .El predicado TOP no elige entre valores iguales. En el ejemplo anterior, si la nota media nmero 25 y la 26 son iguales, la consulta devolver 26 registros. Se puede utilizar la palabra reservada PERCENT para devolver un cierto porcentaje de registros que caen al principio o al final de un rango especificado por la clusula ORDER BY. Supongamos que en lugar de los 25 primeros estudiantes deseamos el 10 por ciento del curso:
SELECT TOP 10 PERCENT NOMBRE, APELLIDO FROM ESTUDIANTES ORDER BY NOTA DESC;

El valor que va a continuacin de TOP debe ser un Integer sin signo.TOP no afecta a la posible actualizacin de la consulta.

DISTINCT
Omite los registros que contienen datos duplicados en los campos seleccionados. Para que los valores de cada campo listado en la instruccin SELECT se incluyan en la consulta deben ser nicos. Por ejemplo, varios empleados listados en la tabla Empleados pueden tener el mismo apellido. Si dos registros contienen Lpez en el campo Apellido, la siguiente instruccin SQL devuelve un nico registro:
SELECT DISTINCT APELLIDO FROM EMPLEADOS;

Con otras palabras el predicado DISTINCT devuelve aquellos registros cuyos campos indicados en la clusula SELECT posean un contenido diferente. El resultado de una consulta que utiliza DISTINCT no es actualizable y no refleja los cambios subsiguientes realizados por otros usuarios.

DISTINCTROW

Devuelve los registros diferentes de una tabla; a diferencia del predicado anterior que slo se fijaba en el contenido de los campos seleccionados, ste lo hace en el contenido del registro completo independientemente de los campo indicados en la clusula SELECT.
SELECT DISTINCTROW APELLIDO FROM EMPLEADOS;

Si la tabla empleados contiene dos registros: Antonio Lpez y Marta Lpez el ejemplo del predicado DISTINCT devuleve un nico registro con el valor Lpez en el campo Apellido ya que busca no duplicados en dicho campo. Este ltimo ejemplo devuelve dos registros con el valor Lpez en el apellido ya que se buscan no duplicados en el registro completo.

Alias (AS)
En determinadas circunstancias es necesario asignar un nombre a alguna columna determinada de un conjunto devuelto, otras veces por simple capricho o por otras circunstancias. Para resolver todas ellas tenemos la palabra reservada AS que se encarga de asignar el nombre que deseamos a la columna deseada. Tomado como referencia el ejemplo anterior podemos hacer que la columna devuelta por la consulta, en lugar de llamarse apellido (igual que el campo devuelto) se llame Empleado. En este caso procederamos de la siguiente forma:
SELECT DISTINCTROW APELLIDO AS EMPLEADO FROM EMPLEADOS;

Para concluir este captulo se debe hacer referencia a la recuperacin de registros de bases de datos externa. Es ocasiones es necesario la recuperacin de informacin que se encuentra contenida en una tabla que no se encuentra en la base de datos que ejecutar la consulta o que en ese momento no se encuentra abierta, esta situacin la podemos salvar con la palabra reservada IN de la siguiente forma:
SELECT DISTINCTROW APELLIDO AS EMPLEADO FROM EMPLEADOS IN 'C:\DATABASES\GESTION.MDB';

En donde c:\databases\gestion.mdb es la base de datos que contiene la tabla Empleados.

Captulo 2. Tablas Temporales y Cursores.


Otro tipo de tablas temporales son los cursores, que tienen la misma utilidad que una tabla temporal, excepto que no se crean en disco, solo en la memoria del ordenador.
EL PROCESO DE CREACIN ES EL MISMO:

CREATE CURSOR|TABLE nombre_alias (campo1 tipo1 (tamao1[, decimales1]), campo2 tipo2 (tamao2[, decimales2])... ) Donde: "nombre_alias" es el nombre del cursor o tabla a crear "campo-n" es el nombre del campo "tipo-n" es el tipo del campo, se indica con una sola letra: o o o C = Caracter D = Fecha T = DateTime

o o o o o o o o o

N = Numrico F = Flotante I = Entero B = Doble Y = Moneda L = Lgico M = Memo G = General P = Imagen

"tamao-n" es el tamao del campo "decimales-n" es el nmero de decimales a contener Nota: Estos ltimos dos datos son de acuerdo al tipo de dato, segn la siguiente tabla: o C( n ) Carcter de ancho n o N( n, de ) Numrico de ancho n con de decimales o F( n, de ) Flotante de ancho n con de decimales

El tamao del campo y el nmero de decimales se pasan por alto para los tipos DE, T, Y, L, M, G y P. Si no se incluye el nmero de decimales en los tipos N, F o B, de forma predeterminada ser cero (sin lugares decimales). Verificar este Codigo Select tabla1.nombre, deuda_ini,deuda_fin from tabla1,tabla2 where tabla1.nombre=tabla2.nombre INTO CURSOR tabla3.

Captulo 3. Consultas de SQL Aplicadas a Visual Foxpro.


INTRODUCCIN
La documentacin acerca del uso de los comandos SQL en Visual Fox Pro es limitada. Tomando esto como referencia he aqu un primer material de trabajo que espero sirva de inicio a los estudiantes y programadores que trabajan con este manejador de bases de datos relacinales. Se ha tomado como base bibliogrfica la Ayuda HTML del MSDN Library y se ha enriquecido las explicaciones con grficas de los resultados de las consultas que se exponen como ejemplos. Es importante destacar que trabajo presenta ejemplos del uso del comando SELECT SQL en Visual Fox Pro 6.0 lo ms sencillas posibles, buscando orientar a los ya conocedores pero tambin ayudar a aquellos que se estn iniciando en el mundo de la programacin. Sin duda luego del estudio de los ejemplos aqu citados se les ocurrirn unos cada vez ms complejos y vistosos, espero que los hagan llegar a este servidor as como tambin sugerencias del acerca del trabajo a travs del correo electrnico para aprender tambin yo de ustedes. Como recomendacin final sera interesante que crearan las tablas que se utilizan en los ejemplos y fueran trabajando en forma paralela en la medida que van leyendo el material, considero que es la mejor manera de aprender. A todos mis saludos y Manos a la Obra.

ESTRUCTURA DE LAS TABLAS USADAS EN LOS EJEMPLOS

Select SQL en visual FOX PRO 6.0


Visual FoxPro admite comandos de Lenguaje de consultas estructurado SQL. Los comandos SQL de Visual FoxPro utilizan la tecnologa Rushmore para optimizar el rendimiento y puede utilizarse un slo comando SQL para sustituir a varios comandos Visual FoxPro. VISUAL FOXPRO ADMITE LOS SIGUIENTES COMANDOS SQL: SELECT - SQL: Especifica los criterios en los que se basa una consulta y ejecuta la consulta. Visual FoxPro interpreta la consulta y recupera los datos especificados de la tabla o tablas. El comando SELECT se construye dentro de Visual FoxPro como cualquier otro comando de Visual FoxPro. Puede crear una consulta con el comando SELECT en la ventana Comandos. En un programa Visual FoxPro (como cualquier otro comando de Visual FoxPro).

En el Diseador de consultas.
ALTER TABLE SQ: Modifica una tabla existente. Puede modificar el nombre, el tipo, la precisin, la escala, la admisin de un valor nulo y las reglas de integridad referencial para cada campo de la tabla. CREATE CURSOR SQL: Crea una tabla temporal. Cada campo de la tabla temporal se define con un nombre, tipo, precisin, escala, soporte de valor nulo y reglas de integridad referencial. Las definiciones pueden obtenerse del propio comando o de una matriz. CREATE TABLE SQL: Crea una tabla. Cada campo de la tabla nueva se define con un nombre, tipo, precisin, escala, aceptacin de valores nulos y reglas de integridad referencial. Estas definiciones pueden obtenerse del propio comando o de una matriz. DELETE SQL: Marca para su eliminacin los registros de una tabla mediante la sintaxis de SQL. INSERT SQL: Anexa un registro al final de una tabla existente. El nuevo registro incluye los datos mostrados en el comando INSERT o incluidos en la matriz especificada. UPDATE SQL: Actualiza los registros de una tabla. Los registros se pueden actualizar segn los resultados de una instruccin SELECT SQL

El propsito de este material es brindar al estudiante ejemplos que le permitan utilizar SELECT SQL en el diseo de consultas usando para ello una o ms tablas diseadas en Visual Fox Pro.

Componentes del SQL


El lenguaje SQL est compuesto por comandos, clusulas, operadores y funciones de agregado. Estos elementos se combinan en las instrucciones para crear, actualizar y manipular las bases de datos. Comandos EXISTEN DOS TIPOS DE COMANDOS SQL: 1. 2. Los DLL que permiten crear y definir nuevas bases de datos, campos e ndices. Los DML que permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos.
Comandos DLL Comando Descripcin CREATE Utilizado para crear nuevas tablas, campos e ndices DROP Empleado para eliminar tablas e ndices ALTER Utilizado para modificar las tablas agregando campos o cambiando la definicin de los campos. Comandos DML Descripcin Utilizado para consultar registros de la base de datos que satisfagan un criterio determinado Utilizado para cargar lotes de datos en la base de datos en una nica operacin. Utilizado para modificar los valores de los campos y registros especificados Utilizado para eliminar registros de una tabla de una base de datos Clusulas Descripcin Utilizada para especificar la tabla de la cual se van a seleccionar los registros Utilizada para especificar las condiciones que deben reunir los registros que se van a seleccionar Utilizada para separar los registros seleccionados en grupos especficos Utilizada para expresar la condicin que debe satisfacer cada grupo

Comando SELECT INSERT UPDATE DELETE

Comando FROM WHERE GROUP BY HAVING

ORDER BY Utilizada para ordenar los registros seleccionados de acuerdo con un orden especfico

*Las clusulas son condiciones de modificacin utilizadas para definir los datos que desea seleccionar o manipular.
Operadores Lgicos Comando Descripcin AND Es el "y" lgico. Evala dos condiciones y devuelve un valor de verdad slo si ambas son ciertas. OR Es el "o" lgico. Evala dos condiciones y devuelve un valor de verdadero si alguna de las dos es cierta. NOT Negacin lgica. Devuelve el valor contrario de la expresin. Operadores de Comparacin Descripcin Menor que Mayor que Distinto de Menor Igual que Mayor Igual que Igual que Utilizado para especificar un intervalo de valores. Utilizado en la comparacin de un modelo Utilizado para especificar registros de una base de datos

Comando < > <> <= >= = BETWEEN LIKE In

CONSULTAS BSICAS
La sintaxis bsica de una consulta de seleccin es la siguiente: SELECT CAMPOS FROM TABLA En donde campos es la lista de campos que se deseen recuperar y tabla es el origen de los mismos, por ejemplo: SELECT NOMBRE, TELEFONO FROM CLIENTES

Esta consulta devuelve una visualizacin de la tabla Clientes con el campo nombre y telfono. Esta visualizacin en VFP es un browse pero no es necesario agregar esta orden, SQL lo invoca automticamente. Vea el orden de los campos en el browse.

ORDENAR LOS REGISTROS


Adicionalmente se puede especificar el orden en que se desean recuperar los registros de las tablas mediante la clusula ORDER BY Lista de Campos. En donde Lista de campos representa los campos a ordenar. Ejemplo: SELECT COD_POSTAL, NOMBRE, TELEFONO FROM CLIENTES ORDER BY NOMBRE

Esta consulta devuelve los campos CodigoPostal, Nombre, Telefono de la tabla Clientes ordenados por el campo Nombre. Se pueden ordenar los registros por ms de un campo, como por ejemplo: SELECT CODIGOPOSTAL, NOMBRE, TELEFONO FROM CLIENTES ORDER BY COD_POSTAL, NOMBRE

Incluso se puede especificar el orden de los registros: ascendente mediante la clusula (ASC -se toma este valor por defecto) descendente (DESC) SELECT CODIGOPOSTAL, NOMBRE, TELEFONO FROM CLIENTES ORDER BY CODIGOPOSTAL, NOMBRE ASC

CONSULTAS CON PREDICADO


El predicado se incluye entre la clusula y el primer nombre del campo a recuperar, los posibles predicados son:
Predicado * TOP DISTINCT DISTINCTROW Descripcin Devuelve todos los campos de la tabla Devuelve un determinado nmero de registros de la tabla Omite los registros cuyos campos seleccionados coincidan totalmente Omite los registros duplicados basndose en la totalidad del registro y no slo en los campos seleccionados.

(ALL) Si no se incluye ninguno de los predicados se asume ALL. El Motor de base de datos selecciona todos los registros que cumplen las condiciones de la instruccin SQL. No se conveniente abusar de este predicado ya que obligamos al motor de la base de datos a analizar la estructura de la tabla para averiguar los campos que contiene, es mucho ms rpido indicar el listado de campos deseados. SELECT * FROM CLIENTES TOP Devuelve un cierto nmero de registros que entran entre al principio o al final de un rango especificado por una clusula ORDER BY. Supongamos que queremos recuperar los nombres de los tres primeros clientes tomando como referencia un orden ASC para el campo cedula. SELECT TOP 3 CEDULA, NOMBRE FROM CLIENTES ORDER BY CEDULA DESC

El resultado de la consulta mostrar en pantalla los tres primeros registros que correspondan al orden. Observe en la figura los nmeros de cedula.

Como la sentencia ORDER BY cedula DESC indica que se deben ordenar en orden descendente los registros, se muestran los tres primeros contando del ltimo en adelante. Observe el cambio en el resultado de la consulta si ORDER BY cedula ASC SELECT TOP 3 CEDULA, NOMBRE FROM CLIENTES ORDER BY CEDULA ASC

El orden establecido para el campo cedula es ASC, por lo tanto toma los tres primeros registros en forma ascendente. Si no se incluye la clusula ORDER BY, la consulta devolver un conjunto arbitrario de 3registros de la tabla Clientes .El predicado TOP no elige entre valores iguales. Si se incluye la palabra clave PERCENT, se redondear al nmero entero ms alto el nmero de columnas devuelto en el resultado. Los valores permitidos para nExpr cuando se incluye la palabra clave PERCENT son 0.01 a 99.99. Ejemplo La tabla Clientes tiene un total de 10 registros, si se quiere visualizar en pantalla un 20% ordenado por cedula en orden ascendente la lnea de cdigo ser: SELECT TOP 20 PERCENT CEDULA, NOMBRE FROM CLIENTES ORDER BY CEDULA ASC Y el resultado de la bsqueda como se puede apreciar son dos registros correspondientes al 20 % de 10 que hay en total

El valor que va a continuacin de TOP debe ser un Integer sin signo. DISTINCT Omite los registros que contienen datos duplicados en los campos seleccionados. Para que los valores de cada campo listado en la instruccin SELECT se incluyan en la consulta deben ser nicos. Por ejemplo, suponga que se desea saber los cdigos de rea de los nmeros de telfono de los clientes almacenados en la tabla. Es de supones que con que aparezca una sola vez 0274 o 0416 es suficiente as existan otros clientes con el mismo cdigo de rea. SELECT DISTINCT SUBSTR(TELEFONO, 1, 4) FROM CLIENTES En vista que el cdigo de rea y el nmero del telfono estn integrados en un atributo atmico, se debe extraer el dato que se necesita para la consulta usando la Funcin SUBSTR(), y as en la consulta se podrn observar los diferentes cdigos de rea que conforman los telefonos de los clientes.

VISTA DE LA CONSULTA USANDO DISTINCT Con otras palabras el predicado DISTINCT devuelve aquellos registros cuyos campos indicados en la clusula SELECT posean un contenido diferente. El resultado de una consulta que utiliza DISTINCT no es actualizable y no refleja los cambios subsiguientes realizados por otros usuarios. En el ejemplo anterior tambin se puede apreciar como se mezcla de forma eficiente cdigo de SQL con el de VFP y se consiguen mejores resultados.

CRITERIOS DE SELECCIN
Se vio la forma de recuperar los registros de las tablas, las formas empleadas devolvan todos los registros de la mencionada tabla. A lo largo de este apartado se estudiarn las posibilidades de filtrar los registros con el fin de recuperar solamente aquellos que cumplan una o unas condiciones preestablecidas WHERE Indica a Visual FoxPro que incluya nicamente ciertos registros en el resultado de la consulta. WHERE es necesario para recuperar datos de varias tablas. Para las condiciones de filtro se puede utilizar cualquiera de los siguientes operadores: Operador Comparacin = Igual == Exactamente igual

LIKE <> > >= < <=

SQL LIKE Distinto de Mayor que Mayor o igual que Menor que Menor o igual que

Cuando utiliza el operador = con cadenas, acta de forma distinta dependiendo del ajuste de SET ANSI. Cuando SET ANSI est OFF, Visual FoxPro trata las comparaciones de cadenas en la forma habitual en Xbase. Cuando SET ANSI est a ON, Visual FoxPro sigue las normas ANSI para comparaciones de cadenas. Vea SET ANSI y SET EXACT para obtener informacin adicional sobre la forma en que Visual FoxPro realiza las comparaciones de cadenas. Ejemplo 1 Suponga que deseamos conocer todos los clientes Movilnet (cdigo 0416) de la tabla y adems queremos enmascarar el titulo del campo. Para esto la lnea de cdigo SQL ser: SELECT NOMBRE AS CLIENTES_MOVILNET FROM CLIENTES WHERE SUBSTR (TELEFONO,1,4) = '0416' SELECT nombre = selecciona el campo nombre de la tabla AS Clientes_Movilnet = crea la mascara para la consulta. Se debe tomar en cuenta que no pueden existir espacios en blanco en la cadena de caracteres. FROM clientes = establece el origen de los datos para la consulta. WHERE substr (telefono, 1,4) = '0416' => criterio de filtro para la consulta.

Ejemplo 2 Se necesita conocer el nombre y el telfono de los clientes con crdito hasta Bs. 100.000,00 SELECT NOMBRE AS CREDITO_HASTA_100000, TELEFONO FROM CLIENTES WHERE CREDITO <= 100000

Ejemplo 3 Disear una consulta SQL de todos los clientes foraneos (codigo postal diferente de 5101). Para resolver este problema usaremos la clusula IN la cual indica que el campo debe contener uno de los valores antes de que el registro se incluya en los resultados de la consulta. Pero para este caso en particular la negaremos con NOT SELECT NOMBRE AS CLIENTES_FORANEOS, TELEFONO, COD_POSTAL FROM CLIENTES; WHERE COD_POSTAL NOT IN ('5101')

Observe el resultado de la consulta, estn todos los clientes a excepcin de los que tienen como cdigo postal 5101.

INTERVALOS DE VALORES
EL OPERADOR BETWEEN Para indicar que deseamos recuperar los registros segn el intervalo de valores de un campo emplearemos el operador BETWEEN cuya sintaxis es: CAMPO [NOT] BETWEEN VALOR1 AND VALOR2

*La condicin NOT es opcional.

En este caso la consulta devolvera los registros que contengan en "campo" un valor incluido en el intervalo valor1, valor2 (ambos inclusive). Si anteponemos la condicin Not devolver aquellos valores no incluidos en el intervalo. Ejemplo 1 Se necesita conocer los datos de los clientes que tienen una carta de crdito entre dos y tres millones de Bolvares. La lnea de cdigo SQL ser: SELECT NOMBRE AS CREDITO_ENTRE_200000_Y_3000000, TELEFONO, COD_POSTAL,; CREDITO FROM CLIENTES WHERE CREDITO BETWEEN 2000000 AND 3000000

EL OPERADOR LIKE
Se utiliza para comparar una expresin de cadena con un modelo en una expresin SQL. Su sintaxis es: EXPRESIN LIKE MODELO En donde expresin es una cadena modelo o campo contra el que se compara expresin. Se puede utilizar el operador LIKE para encontrar valores en los campos que coincidan con el modelo especificado. Por modelo puede especificar un valor completo (Ana Mara), o se pueden utilizar caracteres comodn para e ncontrar un rango de valores (LIKE An%). El operador LIKE se puede utilizar en una expresin para comparar un valor de un campo con una expresin de cadena. Por ejemplo, si introduce LIKE C% en una consulta SQL, la consulta devuelve todos los valores de campo que comiencen por la letra C. En una consulta con parmetros, puede hacer que el usuario escriba el modelo que se va a utilizar. Puede utilizar el signo de porcentaje (%) y subrayado ( _ ) como parte de la expresin. El signo de porcentaje representa a cualquier secuencia de caracteres desconocidos en la cadena. El subrayado representa un solo carcter desconocido en la cadena.

Ejemplo Listar por pantalla todos los clientes cuyos nombres comiencen con la letra I La lnea SQL ser: SELECT NOMBRE AS CLIENTES_CUYOS_NOMBRES_EMPIEZAN_POR_I FROM CLIENTES; WHERE UPPER (NOMBRE) LIKE 'I%'

Observe el resultado de la consulta, no importa que siga a la letra I en el campo nombre, SQL lo muestra en pantalla.

AGRUPAMIENTO DE REGISTROS
GROUP BY COLUMNAGRUPO [, COLUMNAGRUPO...] Agrupa las filas de la consulta basndose en los valores de una o ms columnas. ColumnaGrupo puede ser el nombre de un campo normal de una tabla, o un campo que incluya una funcin de campo SQL, o una expresin numrica indicando la posicin de la columna en la tabla resultado (la columna ms a la izquierda tiene el nmero 1). Su sintaxis es: SELECT CAMPOS FROM TABLA WHERE CRITERIO GROUP BY CAMPOS DEL GRUPO HAVING CONDICIN Los valores Null en los campos GROUP BY se agrupan y no se omiten. No obstante, los valores Null no se evalan en ninguna de las funciones SQL agregadas. Se utiliza la clusula WHERE para excluir aquellas filas que no desea agrupar, y la clusula HAVING para filtrar los registros una vez agrupados. A menos que contenga un dato Memo u Objeto OLE , un campo de la lista de campos GROUP BY puede referirse a cualquier campo de las tablas que aparecen en la clusula FROM, incluso si el campo no esta incluido en la instruccin SELECT. Todos los campos de la lista de campos de SELECT deben o bien incluirse en la clusula GROUP BY. HAVING es similar a WHERE, determina qu registros se seleccionan. Una vez que los registros se han agrupado utilizando GROUP BY, HAVING determina cuales de ellos se van a mostrar. Si tenemos una tabla llamada clientes con los siguientes registros:

Se nos plantea la siguiente interrogante Cules registros cumplen con la condicin de poseer Cdigo Postal 5101 y adems son clientes Movilnet? Agrupamos los clientes con Cod_Postal 5101 y luego con HAVING seleccionamos los clientes Movilnet (0416) SELECT CEDULA, NOMBRE, COD_POSTAL FROM CLIENTES WHERE COD_POSTAL = '5101'; GROUP BY CEDULA, NOMBRE, COD_POSTAL HAVING SUBSTR (TELEFONO,1,4) = '0416'

AVG
Calcula la media aritmtica de un conjunto de valores contenidos en un campo especificado de una consulta. Su sintaxis es la siguiente AVG (EXPR) En donde expr representa el campo que contiene los datos numricos para los que se desea calcular la media o una expresin que realiza un clculo utilizando los datos de dicho campo. La media calculada por AVG es la media aritmtica (la suma de los valores dividido por el nmero de valores). La funcin AVG no incluye ningn campo Null en el clculo. Ejemplo Usando la tabla CLIENTES se desea conocer el promedio de crdito de los clientes de la ciudad de Mrida (cod_postal = 5101) SELECT AVG (CREDITO) AS CLIENTES_MERIDA FROM CLIENTES; WHERE COD_POSTAL IN ('5101') El resultado de la consulta ser:

COUNT
Calcula el nmero de registros devueltos por una consulta. Su sintaxis es la siguiente COUNT (EXPR) En donde expr contiene el nombre del campo que desea contar. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una funcin. Aunque expr puede realizar un clculo sobre un campo, COUNT simplemente cuenta el nmero de registros sin tener en cuenta qu valores se almacenan en los registros. La funcin COUNT no cuenta los registros que tienen campos NULL. SELECT COUNT (CAMPO) AS NOMBRE_MSCARA FROM TABLA Ejemplo Se desea determinar Cuntos Clientes tienen crdito entre Bs. 100.000,00 y Bs. 300.000,00?

SELECT COUNT (CREDITO) AS CLIENTES_ENTRE_100000_Y_300000 FROM CLIENTES; WHERE CREDITO BETWEEN 100000 AND 300000

Como puede observar SQL proporciona el nmero de clientes que cumplen con la condicin especificada en WHERE. Max y Min Devuelven el mnimo o el mximo de un conjunto de valores contenidos en un campo especifico una consulta. Su sintaxis es: MIN (EXPR) MAX (EXPR) En donde expr es el campo sobre el que se desea realizar el clculo. Expr puede incluir el nombre de un campo de una tabla o una constante. Ejemplo Se desea conocer el monto en Bs. De la mayor carta de crdito de un cliente forneo cdigo postal 5102 SELECT MAX (CREDITO) AS CLIENTE_CON_MAYOR_CRDITO_5102 FROM CLIENTES; WHERE COD_POSTAL IN ('5102')

SELECT MIN (CREDITO) AS CLIENTE_CON_MENOR_CRDITO_5102 FROM CLIENTES; WHERE COD_POSTAL IN ('5102')

El cdigo SQL anterior muestra el uso de MIN para ubicar el monto de la menor carta de crdito de la zona 5102. SUM Devuelve la suma del conjunto de valores contenido en un campo especfico de una consulta. Su sintaxis es: SUM (expr) En donde expr representa el nombre del campo que contiene los datos que desean sumarse o una expresin que realiza un clculo utilizando los datos de dichos campos. Los operandos de expr pueden incluir el nombre de un campo de una tabla o una constante. Ejemplo Se desea conocer el monto total de las carteras de crdito de los clientes cdigo de rea 5102

SELECT SUM (CREDITO) AS TOTAL_CRDITO_5102 FROM CLIENTES WHERE COD_POSTAL IN ('5102') Este ejemplo suma los resultados de las consultas anteriores con MAX Y MIN.

SUBCONSULTAS
Una subconsulta es una instruccin SELECT anidada dentro de una instruccin SELECT, SELECT...INTO, INSERT...INTO, DELETE, o UPDATE o dentro de otra subconsulta. Puede utilizar tres formas de sintaxis para crear una subconsulta: 1. 2. 3. Comparacin [ANY | ALL | SOME] (instruccin SQL) Expresin [NOT] IN (instruccin SQL) [NOT] EXISTS (instruccin SQL)

En donde: Comparacin: Es una expresin y un operador de comparacin que compara la expresin con el resultado de la subconsulta. Expresin: Es una expresin por la que se busca el conjunto resultante de la subconsulta. Instruccin SQL: Es una instruccin SELECT, que sigue el mismo formato y reglas que cualquier otra instruccin SELECT. Debe ir entre parntesis.

Se puede utilizar una subconsulta en lugar de una expresin en la lista de campos de una instruccin SELECT o en una clusula WHERE o HAVING. En una subconsulta, se utiliza una instruccin SELECT para proporcionar un conjunto de uno o ms valores especificados para evaluar en la expresin de la clusula WHERE o HAVING. Se puede utilizar el predicado ANY, ALL o SOME, los cuales son sinnimos, para recuperar registros de la consulta principal, que satisfagan la comparacin con cualquier otro registro recuperado en la subconsulta. Cuando la condicin de filtro incluye ANY o SOME, el campo debe cumplir la condicin de comparacin en al menos uno de los valores generados por la subconsulta. Cuando la condicin de filtro incluye ALL, el campo debe cumplir la condicin de comparacin para todos los valores generados por la subconsulta antes de que se incluya el registro en el resultado de la consulta. Ejemplo Usando una subconsulta muestre una lista de clientes cuyo telfono sea Movilnet (cdigo de rea 0416) SELECT NOMBRE, CREDITO, TELEFONO FROM CLIENTES WHERE SUBSTR (TELEFONO, 1, 4); IN (SELECT TELEFONO FROM CLIENTES WHERE SUBSTR (TELEFONO, 1, 4) = '0416') Ejemplo Suponga que se desea conocer los datos personales de los clientes con cartas de crdito por arriba de Bs. 2.500.000,00 SELECT NOMBRE, CREDITO, TELEFONO FROM CLIENTES WHERE CREDITO = ALL ; (SELECT CREDITO FROM CLIENTES WHERE CREDITO > 2500000) Ejemplo Encontrar los clientes con carteras de crdito entre Bs. 2.300.000,00 Y Bs. 2.500.000

SELECT NOMBRE, CREDITO, TELEFONO FROM CLIENTES WHERE CREDITO = ANY; (SELECT CREDITO FROM CLIENTES WHERE CREDITO BETWEEN 2300000 AND 2500000) **** WHERE credito = ANY (subconsulta SQL) indica que se incluya en la consulta a cualquier registro que cumpla aunque sea una parte de la condicin de la subconsulta. Ejemplo Liste a todos los clientes que tengan residencia en la ciudad de Mrida. SELECT NOMBRE, CREDITO, TELEFONO, CIUDAD FROM CLIENTES WHERE CIUDAD = ALL; (SELECT CIUDAD FROM CLIENTES WHERE UPPER (CIUDAD) = 'MERIDA')

Observe el efecto que se produce en la consulta cuando se cambia el operador = antes de ALL SELECT NOMBRE, CREDITO, TELEFONO, CIUDAD FROM CLIENTES WHERE CIUDAD > ALL; (SELECT CIUDAD FROM CLIENTES WHERE UPPER (CIUDAD) = 'MERIDA')

SELECT NOMBRE, CREDITO, TELEFONO, CIUDAD FROM CLIENTES WHERE CIUDAD < ALL; (SELECT CIUDAD FROM CLIENTES WHERE UPPER (CIUDAD) = 'MERIDA')

Se puede ver claramente que el resultado de la consulta vara sustancialmente cuando se cambia el operador = antes de ALL. Al utilizar > se muestran en la consulta todos aquellos registros que cumplen con la condicin de comenzar con una letra mayor a M. Y al utilizar < se agregan a la consulta slo aquellos cuya letra inicial en el campo ciudad est por deba jo de M. Ejemplo Mostrar en pantalla los clientes con cartas de crdito menores a Bs. 200.000,00 SELECT NOMBRE, CREDITO, TELEFONO FROM CLIENTES WHERE CREDITO < ALL; (SELECT CREDITO FROM CLIENTES WHERE CREDITO = 200000) Con la condicin del WHERE de la consulta principal se establece que se deben mostrar todos aquellos registros menores a la condicin establecida en la subconsulta (credito = 200000)

CONSULTAS DE UNIN INTERNAS


Las vinculaciones entre tablas se realizan mediante la clusula INNER que combina registros de dos tablas siempre que haya concordancia de valores en un campo comn. Su sintaxis es: SELECT CAMPOS FROM TB1 INNER JOIN TB2 ON TB1.CAMPO1 OPERADOR TB2.CAMPO2 En donde: tb1, tb2: Son los nombres de las tablas desde las que se combinan los registros. campo1, campo2: Son los nombres de los campos que se combinan. Si no son numricos, los campos deben ser del mismo tipo de datos y contener el mismo tipo de datos, pero no tienen que tener el mismo nombre. OPERADOR: Es cualquier operador de comparacin relacional: =, <, >, <=, >=, o <>. Se puede utilizar una operacin INNER JOIN en cualquier clusula FROM. Esto crea una combinacin por equivalencia, conocida tambin como unin interna. Las combinaciones de equivalencia son las ms comunes; stas combinan los registros de dos tablas siempre que haya concordancia de valores en un campo comn a ambas tablas. Se puede utilizar INNER JOIN con las tablas Clientes y Pedidos (ver ilustracin ms abajo) para seleccionar todos los pedidos de los clientes o los pedidos de un cliente en particular. Ms formalmente INNER JOIN especfica que el resultado de la consulta contenga slo filas para una tabla con la que coincidan una o varias filas en otra tabla. Ejemplo Mostrar una consulta para determinar la fecha y el monto de los pedidos de un cliente X identificado por su nmero de cedula.

SELECT FECHA, MONTO FROM PEDIDOS INNER JOIN CLIENTES ; ON CLIENTES.CEDULA = 2 AND PEDIDOS.CEDULA = 2

Suponga que complementamos esta consulta aadiendo los campos nombre y telfono de la tabla clientes, el resultado por pantalla sera:

La lnea de cdigo SQL ser: SELECT clientes.nombre, clientes.telefono, fecha, monto FROM PEDIDOS INNER JOIN clientes; ON clientes.cedula = 2 AND pedidos.cedula = 2 Observe la sintaxis con que se escriben los campos de la tabla que no est activa (clientes). Se antecede el nombre del campo con el identificador de la tabla y un punto. Existen rdenes agregadas que cambiaran el resultado de la consulta dependiendo como las use. Estas son: LEFT [OUTER] JOIN: especifica que el resultado de la consulta contenga todas las filas de la tabla a la izquierda de la palabra clave JOIN y slo las filas que concuerden procedentes de la tabla a la derecha de la palabra clave JOIN. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinacin externa. RIGHT [OUTER] JOIN especifica que el resultado de la consulta contenga todas las filas desde la tabla hasta la derecha de la palabra clave JOIN y slo las filas que concuerden desde la tabla hasta la izquierda de la palabra clave JOIN. La palabra clave OUTER es opcional; puede incluirse para resaltar la creacin de una combinacin externa. FULL [OUTER] JOIN: especifica que el resultado de la consulta contenga todas las filas, concuerden o no, de ambas tablas. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinacin externa. Ejemplo: Observe como cambia el resultado de la consulta anterior agregando las rdenes LEFT, RIGHT, FULL. LEFT SELECT clientes.nombre, clientes.telefono, fecha, monto FROM PEDIDOS LEFT JOIN clientes; ON clientes.cedula = 2 AND pedidos.cedula = 2

En este caso la condicin del ON es especfica el campo cedula en ambas tablas debe ser igual a 2; pero LEFT indica a SQL que ingrese los campos a la izquierda de la palabra JOIN los cuales se muestran como .NULL., en vista que no cumplen con la condicin cedula = 2. RIGHT

SELECT clientes.nombre, clientes.telefono, fecha, monto FROM PEDIDOS RIGHT JOIN; clientes ON clientes.cedula = 2 AND pedidos.cedula = 2 El resultado ser

Los campos a la derecha de JOIN se mostrarn como .NULL. en vista que no cumplen con la condicin cedula = 2. FULL

SELECT CLIENTES.NOMBRE, CLIENTES.TELEFONO, FECHA, MONTO FROM PEDIDOS FULL JOIN CLIENTES; ON CLIENTES.CEDULA = 2 AND PEDIDOS.CEDULA = 2 En este caso se muestran los campos de ambas tablas coincidan o no con la condicin establecida.

Consultas De Unin Externas


Se utiliza la operacin UNION para crear una consulta de unin, combinando los resultados de dos o ms consultas o tablas independientes. Su sintaxis es: SELECT campos separados por comas FROM nombre tabla WHERE condicin UNION; SELECT campos separados por comas FROM nombre tabla WHERE condicin Los campos de ambos SELECT deben estar en igual nmero en ambas instrucciones y deben ser del mismo tipo.

EJEMPLO:
Suponga que tenemos una tabla VENDEDORES junto con la ya conocida tabla CLIENTES con la que hemos trabajado anteriormente.

Se le solicita que presente una vista por pantalla de todos los vendedores y clientes que se encuentran geogrficamente ubicados en la zona 5101. La lnea SQL ser: SELECT CEDULA, NOMBRE, TELEFONO AS CLIENTES_Y_VENDEDORES FROM CLIENTES WHERE COD_POSTAL = '5101'; UNION SELECT CEDULA, NOMBRE, TELEFONO FROM VENDEDORES WHERE ZONA = '5101'

Observe que el nico vendedor que cumple con la condicin aparece en la consulta en el ltimo lugar. Ejemplo Suponga ahora que desea ver a todos los vendedores y clientes en una sola vista la lnea de comando SQL ser ms sencilla como se puede apreciar: SELECT CEDULA, NOMBRE, TELEFONO AS CLIENTES_Y_VENDEDORES FROM CLIENTES UNION; SELECT CEDULA, NOMBRE, TELEFONO FROM VENDEDORES Como podr observar (en la siguiente pgina) la vista de la consulta incluye a todos los registros de la tabla clientes y a los dos nicos vendedores registrados.

Vista de la consulta de todos los clientes y vendedores usando UNION.

Unir Tablas con SQL


Explicacin Visual de los SQL JOIN
Supongamos que tenemos las dos siguientes tablas. La tabla A est a la izquierda, y la tabla B est a la derecha. Las rellenaremos con cuatro registros cada una.

Ahora unamos estas dos tablas por el campo nombre de algunas formas distintas, y veamos si podemos obtener una representaciones conceptuales con los ingeniosos diagramas de VENN. INNER JOIN slo produce los registros que coinciden en las dos tablas A y B. 1. SELECT * FROM TABLAA 2. INNER JOIN TABLAB 3. ON TABLAA.NOMBRE = TABLAB.NOMBRE

FULL OUTER JOIN produce el conjunto de todos los registros en las tablas A y B, con registros coincidentes en ambos lados cuando sea posible. Si no hay coincidencia, el lado que falta contendr NULL. 1. SELECT * FROM TABLAA 2. FULL OUTER JOIN TABLAB 3. ON TABLAA.NOMBRE = TABLAB.NOMBRE

LEFT OUTER JOIN produce el conjunto completo de registros de la tabla A, con los registros coincidentes (si estn disponibles) en la tabla B. Si no hay coincidencia, el lado derecho contendr NULL. 1. SELECT * FROM TABLAA 2. LEFT OUTER JOIN TABLAB 3. ON TABLAA.NOMBRE = TABLAB.NOMBRE

Para producir el conjunto de registros en la tabla A, pero no en la tabla B, usamos el mismo LEFT OUTER JOIN, y luego excluimos los registros que no queremos del lado derecho mediante una clusula WHERE. 1. 2. 3. 4. 5. SELECT * FROM TABLAA LEFT OUTER JOIN TABLAB ON TABLAA.NOMBRE = TABLAB.NOMBRE WHERE TABLAB.ID IS NULL

Para producir el conjunto de registros nicos de la tabla A y la tabla B, usamos el mismo FULL OUTER JOIN, y luego excluimos los registros que no queremos de los dos lados mediante una clusula WHERE. 1. 2. 3. 4. 5. SELECT * FROM TABLAA FULL OUTER JOIN TABLAB ON TABLAA.NOMBRE = TABLAB.NOMBRE WHERE TABLAA.ID IS NULL OR TABLAB.ID IS NULL

Tambin hay un CROSS JOIN, el cul no puede ser expresado con un diagrama de VENN: 1. 2. SELECT * FROM TABLAA CROSS JOIN TABLAB

Esto une todo con todo, dando como resultado 4 x 4 = 16 filas, muchas ms de las que tenamos en los conjuntos originales. Si haces unos simples clculos, puedes ver por qu es un JOIN muy peligroso de ejecutar en tablas grandes.

EJEMPLO DE SENTENCIA APLICADA A BASES DE DATOS DE ADMINPAQ


REPLACE COLUMNAB WITH COLUMNAA REPLACE COLUMNAB WITH COLUMNAA FOR RECNO()>1 REPLACE CRFC WITH XAXX010101000 FOR RECNO()>1 REPLACE CRAZONSO01 WITH STRTRAN(CRAZONSO01, "", "") FOR RECNO()>1 SELECT * FROM MGW10005.DBF WHERE MGW10005.CCODIGOP01 ; IN (TA003) UPDATE MGW10008 SET CFECHAEX01 = (SELECT CFECHA FROM MGW10008 WHERE CIDDOCUM01 = 5) REPLACE CTEXTOEX02 WITH ALLTRIM(CTEXTOEX02) FOR RECNO()>1 REPLACE CIMPORTE04 WITH VAL(CTEXTOEX03) FOR RECNO()>1 SELECT * FROM MGW10008.DBF WHERE CIDDOCUM01=34646 LOCATE NEXT 1 FOR MGW10008.CIDDOCUM01=1890 SELECT CIDDOCUM01, CIDDOCUM01=1290 RECNO() AS REGISTRO FROM MGW10008.DBF WHERE

SELECT * FROM WHERE CIDDOCUM01 NOT IN (SELECT CIDDOCUM01 FROM ERR.DBF) SELECT * FROM MGW10008.DBF WHERE CIDCONCE01 = 3030 SELECT * FROM MGW10010.DBF WHERE CTEXTOEX03 = MATRIZ COPY TO "C:\USERS\JORGE\DESKTOP\DOCUMENTOS DE COLONIAL.XLS" TYPE XL5 GO 1036 REINDEX SELECT * FROM MGW10008.DBF WHERE CIDDOCUM02 = 4 OR CIDDOCUM02 = 5 UPDATE MGW10005 SET CFECCOSEX1 = (SELECT CFECCOSEX1 FROM MGW10005 WHERE CIDPRODU01 = 0) REPLACE CIDUNIVEN WITH 2 FOR RECNO()>2 SELECT MGW10008 SET ORDER TO CFOLIO ASCENDING UPDATE MGW10002 SET CFECHAALTA = (SELECT CFECHAALTA FROM MGW10002 WHERE CIDCLIEN01 = 743) UPDATE MGW10002 SET CTEXTOEX01 = (SELECT CTEXTOEX01 FROM MGW10002 WHERE CIDCLIEN01 = 1) REPLACE CIDMONEDA,CIDLISTAPR01 WITH 2 FOR RECNO()>2

Remplaza el dato seleccionado de ColumnaA en la ColumnaB Remplaza todos los datos de la ColumnaA, con los de la ColumnaB en la misma tabla. Remplaza toda la columna Crfc con el texto XAXX010101000 Busca en todas las cadenas de la columna Crazonso01 el carcter y lo remplaza por . Busca TA003 en la columna ccodigop01 de la tabla mgw10005 Copia en toda la columna CFechaEx01 el valor que se encuentra en la columna Cfecha en el rengln que corresponde a Ciddocum01 igual a 5. Quita los espacios en blanco del principio y fin de los datos en toda la columna Ctextoex02 Copia lo que existe en la columna Ctextoex03 en la columna Cimporte04 convierto el texto en nmero. Busca en la Tabla MGW10008 los registros que tengan en el campo Ciddocum01 el valor 1290 Busca el siguiente registro en donde Ciddocum01 es igual a 1290 Devuelve el nmero de registro que tienen los campos con Ciddocum01 igual a 1290 Compara la tabla abierta Bien.dbf con la tabla existente en el mismo directorio Err.dbf y devuelvo los registros contenidos en Bien.dbf que no estn presentes en Error.dbf Realiza un filtro en la tabla mgw10008 y despliega los registros que tengan en el campo cidconce01 el valor 3030 Exporta a un archivo en Excel la Tabla Va al registro 1036 Re indexa la tabla Copia en toda la columna CFechaEx01 el valor que se encuentra en la columna Cfecha en el rengln que corresponde a Ciddocum01 igual a 5.

SELECT * FROM mgw10008.dbf WHERE ciddocum01=34646 Replace MGW10008.cFechaul01 WITH 12311899 FOR CIDDOCUM01 = ThisForm.Text1.value Pone en el campo CRFC la cadena XAXX=010101000 Bsqueda de 2 Referencias Pone un 5 en el campo CPORCENT06 para todos los registros que donde el campo CIDOCUM04 sea igual a 4 Selecciona en la tabla MGW10045 los registros en donde el valor de la columna CUUID no est vaco. Cambia el Campo Fecha del Documento de AdminPAQ por el Default (12/30/1899) Busca en toda la tabla MGW1000.DBF si existen valores duplicados en CIDDOCUM01 25262

UPDATE MGW10002 SET CDIASPRO01 = (SELECT CDIASPRO01 FROM MGW10002 WHERE CIDCLIEN01 = 743) SET FILTER TO CRFC="" REPLACE ALL CRFC WITH "XAXX000000000" FOR EMPTY(CRFC) SELECT CFECHA FROM MGW10008.DBF WHERE CSERIEDO01=MFKF AND CFOLIO=719 REPLACE ALL CIDUNIDA01 WITH 5 FOR CIDDOCUM02=4 REPLACE ALL CINTERES01 WITH 5 FOR CTIPOCLI01=1 SELECT * FROM MGW10045 WHERE NOT EMPTY(CUUID) REPLACE MGW10008.CFECHA WITH DATE(1899,12,30)

SELECT CIDDOCUM01 FROM MGW10008.DBF GROUP BY CIDDOCUM01 HAVING COUNT(CIDDOCUM01)> 1 SELECT * FROM MGW10008.DBF WHERE CSERIEDO01=MABF AND CFOLIO=2684 REPLACE CCANCELADO WITH 1 FOR CIDDOCUM01 = 32368 REPLACE CMETODOPAG,CNUMCTAPAG WITH NO IDENTIFICADO FOR RECNO()>1 UPDATE MGW10002 SET CEMAIL2 = (SELECT CEMAIL2 FROM MGW10002 WHERE CIDCLIEN01 = 20) SELECT TOP 25 NOMBRE, APELLIDO FROM ESTUDIANTES ORDER BY NOTA DESC; SELECT CODIGO,VALOR FROM VENTAS ORDER BY VALOR DESC GO BOTT BROWSE CALC MAX(CFECHA) TO MVALOR FOR CONDICIONES A CUMPLIR

* EJEMPLO CALC MAX(FECHA) TO MFECHA FOR !ACTUALIZA AND MONTH(FECHA) = GMES

SELECT TOP 1 * FROM MGW10008.DBF WHERE Ccodigoc01 = 0001 (SELECT Cidclien01 FROM mgw10008.dbf) AND Ciddocum01 > 0

SELECT * FROM mgw10010.dbf WHERE Ciddocum01 NOT IN (SELECT Ciddocum01 FROM mgw10008.dbf) AND Ciddocum01 > 0
SELECT * FROM MGW10008.DBF WHERE MGW10002.Ccodigoc01

SELECT * FROM mgw10002.dbf Where Ciddocum01 FROM mgw10008.dbf

SELECT MAX(CFECHA), CTOTAL , FROM MGW10008.DBF WHERE CIDCLIEN01 = 2 AND CIDDOCUM02 = 35 SELECT TOP 1 CIDDOCUM01 FROM MGW10008.DBF WHERE CIDCLIEN01 = 2 AND CIDDOCUM02 = 35 ORDER BY CFECHA DESC

SELECT MGW10008.CIDCLIEN01, MGW10008.CFECHA, CIDPRODU01, MGW10010.CTOTAL, MGW10010.CIMPORTE04, MGW10010.CTEXTOEX01 FROM MGW10010 INNER JOIN MGW10008 ON MGW10010.CIDDOCUM01 = MGW10008.CIDDOCUM01 WHERE MGW10010.CTEXTOEX01 = "ACTIVO" ORDER BY MGW10008.CIDCLIEN01 DESC INTO CURSOR DATOS
SELECT tabla1.*,tabla2.*,tabla3.* , ; FROM tabla1,tabla2,tabla3 ; WHERE tabla1.codigo = tabla2.codigo ; AND tabla1.codigo = tabla3.codigo ; AND tabla2.codigo = tabla3.codigo

SELECT * FROM TABLA WHERE RECNO()=1 INTO CURSOR CCURSOR1 READWRITE && PRIMER REGISTRO SELECT * FROM TABLA WHERE RECNO()=RECCOUNT() INTO CURSOR CCURSOR2 && ULTIMO REGISTRO SELECT CCURSOR1 APPEND FROM DBF("CCURSOR2")
SELECT RECNO(1) AS INICIO, COUNT(1) AS FINAL; FROM MUNICIPIOS; INTO CURSOR SHA

SELECT TOP 1 ID FROM TABLA ORDER BY ID DESC

EJEMPLO 1 . PROGRAMA
CLOSE TABLES ALL SET EXCLUSIVE OFF HIDE WINDOWS SCREEN && Para ocultar las ventanas que generan las consultas _SCREEN.WindowState = 1 && Para ocultar las ventanas que generan las consultas _SCREEN.VISIBLE = .F. && Para ocultar las ventanas que generan las consultas LOCAL VDIASMES, VDIASANO, VANO AS INTEGER VDIASMES = DAY(GOMONTH(DATE()-DAY(DATE()),1)) + 1 && Calcula Das del Mes VANO = (YEAR(DATE())) IF MOD(VANO,4)=0 AND (MOD(VANO,100)#0 OR MOD(VANO,400)=0) && Calcula si el ao es bisiesto VDIASANO = 366 ELSE

VDIASANO = 365 ENDIF USE MGW10010.DBF SHARED IN 0 SCAN REPLACE MGW10010.CIMPORTE04 WITH 0 && Reinicia el campo CIMPORTE04 en la tabla MGW10010.DBF que es la de Movimientos REPLACE MGW10010.CTEXTOEX01 WITH "" && Reinicia el campo CTEXTOEX01 en la tabla MGW10010.DBF que es la de Movimientos REPLACE MGW10010.CFECHAEX01 WITH DATE(1899,12,30) && Reinicia el campo CFECHAEX01 en la tabla MGW10010.DBF que es la de Movimientos ENDSCAN SCAN REPLACE CIMPORTE04 WITH 1 FOR CIDPRODU01 = 34 && El Producto 34 es 1 da pagado REPLACE CIMPORTE04 WITH 7 FOR CIDPRODU01 = 35 && El Producto 35 es Una Semana REPLACE CIMPORTE04 WITH 15 FOR CIDPRODU01 = 36 && El Producto 36 es Una Quincena REPLACE CIMPORTE04 WITH VDIASMES FOR CIDPRODU01 = 37 && El Producto 37 es 1 Mes, VDiaMes calcula los das del mes REPLACE CIMPORTE04 WITH 183 FOR CIDPRODU01 = 38 && El Producto 38 es 1 Semestre REPLACE CIMPORTE04 WITH VDIASANO FOR CIDPRODU01 = 39 && El Producto 39 es 1 Ao, VDIASANO calcula los das del ao REPLACE CFECHAEX01 WITH (DATE(YEAR(CFECHA), MONTH(CFECHA), DAY(CFECHA)) + CIMPORTE04) FOR BETWEEN (CIDPRODU01,34,37) && Remplaza el Campo CFechaex01 con la fecha del pago ms los das pagados REPLACE CTEXTOEX01 WITH "VENCIDO" FOR CFECHAEX01 < DATE() &&Si la fecha calculada es menor a la actual pone VENCIDO en el campo CTEXTOEX01 REPLACE CTEXTOEX01 WITH "ACTIVO" FOR CFECHAEX01 >= DATE() &&Si la fecha calculada es mayor a la actual pone ACTIVO en el campo CTEXTOEX01 ENDSCAN USE MGW10002.DBF SHARED IN 0 USE MGW10008.DBF SHARED IN 0 UPDATE MGW10002 SET CIMPORTE04 = (SELECT CIMPORTE04 FROM MGW10002 WHERE CIDCLIEN01 = 0) && Reinicia el campo CIMPORTE04 en la tabla MGW10002.DBF que es la de Clientes UPDATE MGW10002 SET CTEXTOEX01 = (SELECT CTEXTOEX01 FROM MGW10002 WHERE CIDCLIEN01 = 0) && Reinicia el campo CTEXTOEX01 en la tabla MGW10002.DBF que es la de Clientes UPDATE MGW10002 SET CFECHAEX01 = (SELECT CFECHAEX01 FROM MGW10002 WHERE CIDCLIEN01 = 0) && Reinicia el campo CFECHAEX01 en la tabla MGW10002.DBF que es la de Clientes SELECT COUNT(CIDCLIEN01) AS FINAL FROM MGW10002.DBF INTO CURSOR POSICION && Cuenta cuantos clientes estn dados de alta SELECT MGW10008.CIDCLIEN01, MGW10010.CTEXTOEX01, MGW10010.CIMPORTE04, MGW10010.CFECHAEX01 FROM MGW10010 INNER JOIN MGW10008 ON MGW10010.CIDDOCUM01 = MGW10008.CIDDOCUM01 WHERE MGW10010.CTEXTOEX01 = "ACTIVO" AND MGW10008.CCANCELADO = 0 ORDER BY MGW10008.CIDCLIEN01 DESC INTO CURSOR DATOS READWRITE &&Crea una tabla temporal con los datos de clientes que estn activos X = POSICION.FINAL A=1 FOR X = 1 TO POSICION.FINAL && Inicia el Ciclo donde actualiza datos de clientes SELECT CIDCLIEN01, CTEXTOEX01, CIMPORTE04, CFECHAEX01 FROM DATOS WHERE DATOS.CIDCLIEN01 = A INTO CURSOR ACTUALES &&Se usan cursores para que la consulta SELECT MGW10002 SCAN IF MGW10002.CIDCLIEN01 = ACTUALES.CIDCLIEN01 REPLACE MGW10002.CTEXTOEX01 WITH ACTUALES.CTEXTOEX01 REPLACE MGW10002.CIMPORTE04 WITH ACTUALES.CIMPORTE04 REPLACE MGW10002.CFECHAEX01 WITH ACTUALES.CFECHAEX01 ENDIF ENDSCAN

A=A+1 ENDFOR CLOSE TABLES ALL WAIT "Los registros se han actualizado..." WINDOW AT 22,80 TIMEOUT 5

CLOSE TABLES ALL SET EXCLUSIVE OFF LOCAL VDIASMES, VDIASANO, VANO AS INTEGER VDIASMES = DAY(GOMONTH(DATE()-DAY(DATE()),1)) + 1 VANO = (YEAR(DATE())) IF MOD(VANO,4)=0 AND (MOD(VANO,100)#0 OR MOD(VANO,400)=0) VDIASANO = 366 ELSE VDIASANO = 365 ENDIF USE MGW10010.DBF SHARED IN 0 SCAN REPLACE CIMPORTE04 WITH 1 FOR CIDPRODU01 = 34 REPLACE CIMPORTE04 WITH 7 FOR CIDPRODU01 = 35 REPLACE CIMPORTE04 WITH 15 FOR CIDPRODU01 = 36 REPLACE CIMPORTE04 WITH VDIASMES FOR CIDPRODU01 = 37 REPLACE CIMPORTE04 WITH 183 FOR CIDPRODU01 = 38 REPLACE CIMPORTE04 WITH VDIASANO FOR CIDPRODU01 = 39 REPLACE CFECHAEX01 WITH (DATE(YEAR(CFECHA), MONTH(CFECHA), DAY(CFECHA)) + CIMPORTE04) FOR BETWEEN (CIDPRODU01,34,37) REPLACE CTEXTOEX01 WITH "VENCIDO" FOR CFECHAEX01 < DATE() REPLACE CTEXTOEX01 WITH "ACTIVO" FOR CFECHAEX01 >= DATE() ENDSCAN CLOSE TABLES ALL USE MGW10010.DBF SHARED IN 0 USE MGW10002.DBF SHARED IN 0 USE MGW10008.DBF SHARED IN 0 LOCAL VTECTOEX01 AS STRING LOCAL VCLIENTE AS INTEGER

SELECT MGW10008.CIDCLIEN01, MGW10010.CTEXTOEX01 FROM MGW10010 INNER JOIN MGW10008 ON MGW10010.CIDDOCUM01 = MGW10008.CIDDOCUM01 WHERE MGW10010.CTEXTOEX01 = "ACTIVO" ORDER BY MGW10008.CIDCLIEN01 DESC INTO CURSOR DATOS READWRITE SELECT COUNT(CIDCLIEN01) AS FINAL FROM DATOS INTO CURSOR POSICION X = POSICION.FINAL I = 1 FOR I = 1 TO X SELECT DATOS GO I SELECT CTEXTOEX01 FROM DATOS VTEXTOEX01 = CTEXTOEX01 SELECT CIDCLIEN01 FROM DATOS VCLIENTE = CIDCLIEN01 REPLACE MGW10002.CTEXTOEX01 WITH VTEXTOEX01 FOR CIDCLIEN01 = VCLIENTE ENDFOR CLOSE TABLES ALL USE MGW10002.DBF SHARED IN 0 USE MGW10008.DBF SHARED IN 0 USE MGW10010.DBF SHARED IN 0 SELECT MGW10008.CIDCLIEN01, MGW10008.CFECHA, CIDPRODU01, MGW10010.CTOTAL, MGW10010.CIMPORTE04 FROM MGW10010 INNER JOIN MGW10008 ON MGW10010.CIDDOCUM01 = MGW10008.CIDDOCUM01 WHERE MGW10010.CTEXTOEX01 = "ACTIVO" ORDER BY MGW10008.CIDCLIEN01 DESC INTO CURSOR DATOS SELECT * FROM MGW10010.DBF WHERE CTEXTOEX01 = "ACTIVO" ORDER BY CIDDOCUM01 ASC INTO CURSOR ACTIVOS DO WHILE !EOF(ACTIVOS) && Begins loop IF EOF( ) EXIT ENDIF VDOCUMENTO = ACTIVOS.CIDDOCUM01 VTEXTOEX01 = ACTIVOS.CTEXTOEX01

SELECT CIDCLIENT01 FROM MGW10002.DBF WHERE CIDDOCUM01 = VDOCUMENTO VCLIENTE = CIDCLIENT01 REPLACE MGW10002.CTEXTOEX01 WITH VTEXTOEX01 FOR CIDCLIEN01 = VCLIENTE SKIP LOOP ENDDO && Ends loop CLOSE TABLES ALL

CLOSE TABLES ALL SET EXCLUSIVE OFF LOCAL VDIASMES, VDIASANO, VANO AS INTEGER VDIASMES = DAY(GOMONTH(DATE()-DAY(DATE()),1)) VANO = (YEAR(DATE())) IF MOD(VANO,4)=0 AND (MOD(VANO,100)#0 OR MOD(VANO,400)=0) VDIASANO = 366 ELSE VDIASANO = 365 ENDIF USE MGW10010.DBF SHARED IN 0 SCAN REPLACE CIMPORTE04 WITH REPLACE CIMPORTE04 WITH REPLACE CIMPORTE04 WITH REPLACE CIMPORTE04 WITH REPLACE CIMPORTE04 WITH REPLACE CIMPORTE04 WITH ENDSCAN CLOSE TABLES ALL

1 FOR CIDPRODU01 = 34 7 FOR CIDPRODU01 = 35 14 FOR CIDPRODU01 = 36 VDIASMES FOR CIDPRODU01 = 37 183 FOR CIDPRODU01 = 38 VDIASANO FOR CIDPRODU01 = 39

USE MGW10002.DBF SHARED IN 0 LOCAL VIDCLIENMIN, VIDCLIENMAX AS INTEGER SELECT TOP 1 CCODIGOC01 FROM MGW10002.DBF ORDER BY CIDCLIEN01 DESC VIDCLIENMIN = CCODIGOC01 SYSTEM.OUT.PRINTLN(VIDCLIENMIN); SELECT MAX(CFECHA), CTOTAL , FROM MGW10008.DBF WHERE CIDCLIEN01 = 2 AND CIDDOCUM02 = 35 VIDCLIENMAX = CCODIGOC01 SYSTEM.OUT.PRINTLN(VIDCLIENMAX);

CLOSE TABLES ALL EXIT SELECT CIMPORTE04 FROM MGW10010.DBF WHERE CIDDOCUM01 = NDOC1 USE MGW10008.DBF SHARED IN 0 LOCAL LDFECHA, LDANNO, LDMES, LDDIA, LDFECHAFINAL, LDANNOFINAL, LDMESFINAL, LDDIAFINAL, LDFECFINAL LOCAL NDIAS1, NDOC1 AS INTEGER SELECT TOP 1 CIDDOCUM01 FROM MGW10008.DBF WHERE CIDCLIEN01 = 2 AND CIDDOCUM02 = 35 AND CCANCELADO = 0 ORDER BY CFECHA DESC NDOC1 = CIDDOCUM01 SELECT TOP 1 CFECHA FROM MGW10008.DBF WHERE CIDCLIEN01 = 2 AND CIDDOCUM02 = 35 AND CCANCELADO = 0 ORDER BY CFECHA DESC LDFECHA = CFECHA LDANNO = YEAR(LDFECHA) LDMES = MONTH(LDFECHA) LDDIA = DAY(LDFECHA) SELECT CIMPORTE04 FROM MGW10010.DBF WHERE CIDDOCUM01 = NDOC1 NDIAS1 = CIMPORTE04 LDFECFINAL = DATE(LDANNO, LDMES, LDDIA) + NDIAS1 LDANNOFINAL = YEAR(LDFECFINAL) LDMESFINAL = MONTH(LDFECFINAL) LDDIAFINAL = DAY(LDFECFINAL) CLOSE TABLES ALL USE MGW10002.DBF SHARED IN 0 SCAN REPLACE CFECHAEX01 WITH DATE(LDANNOFINAL, LDMESFINAL, LDDIAFINAL) ENDSCAN CLOSE ALL

FOR CIDCLIEN01 = 2

SELECT CIDDOCUM01, CIDPRODU01, CTOTAL, CIMPORTE04 FROM MGW10010 WHERE CIDPRODU01 BETWEEN 34 AND 37 SELECT CIDDOCUM01, CIDPRODU01, CTOTAL, CIMPORTE04 FROM MGW10010 WHERE CIDPRODU01 BETWEEN 34 AND 37; UNION SELECT CIDDOCUM01, CIDCLIEN01, CFECHA FROM MGW10008 WHERE CCANCELADO = 0 SELECT MGW10008.CIDCLIEN01, MGW10008.CFECHA, CIDPRODU01, MGW10010.CTOTAL, MGW10010.CIMPORTE04 FROM MGW10010 INNER JOIN MGW10008 ON MGW10010.CIDDOCUM01 = MGW10008.CIDDOCUM01 WHERE MGW10008.CCANCELADO = 0 AND MGW10010.CIDPRODU01 >= 34 MGW10010.CIDPRODU01 <= 37

SELECT MGW10008.CIDCLIEN01, MGW10008.CFECHA, CIDPRODU01, MGW10010.CTOTAL, MGW10010.CIMPORTE04 FROM MGW10010 INNER JOIN MGW10008 ON MGW10010.CIDDOCUM01 = MGW10008.CIDDOCUM01 WHERE MGW10008.CCANCELADO = 0 AND BETWEEN (MGW10010.CIDPRODU01,34,37) ORDER BY MGW10008.CIDCLIEN01 DESC INTO CURSOR DATOS SELECT MGW10010.CIDDOCUM01 AS IDENTIFICADOR MGW10008.CIDCLIEN01, MGW10008.CFECHA, CIDPRODU01, MGW10010.CTOTAL, MGW10010.CIMPORTE04 FROM MGW10010 INNER JOIN MGW10008 ON MGW10010.CIDDOCUM01 = MGW10008.CIDDOCUM01 WHERE MGW10008.CCANCELADO = 0 AND BETWEEN (MGW10010.CIDPRODU01,34,36) ORDER BY MGW10008.CIDCLIEN01 SELECT * FROM mgw10010.dbf WHERE Ciddocum01 IN (SELECT Ciddocum01 FROM mgw10008.dbf) AND Ciddocum01 > 0

LOCAL viFolio AS Double SET DECIMALS TO 0 &&SET DEFAULT TO (THISFORM.edTabla.Value) SET EXCLUSIVE OFF USE MGW10008.DBF IN 0 LOCATE FOR MGW10008.CIDDOCUM01=129 THISFORM.vSentinel.ControlSource = 'mgw10008.cFechaul01' GO TOP STORE VAL(THISFORM.edtFolio.Value) TO viFolio LOCATE FOR MGW10008.cfolio = viFolio AND TRIM(UPPER(MGW10008.cseriedo01)) = TRIM(UPPER(THIS.Parent.edtSerie.Value)) IF FOUND() = .F. MESSAGEBOX('No Encontrado') ELSE THISFORM.aiddocum01.ControlSource = 'mgw10008.ciddocum01' THISFORM.aidclien01.ControlSource = 'mgw10008.cidclien01' THISFORM.aFecha.ControlSource = 'mgw10008.cFecha' THISFORM.aSeriedo01.ControlSource = 'mgw10008.cSeriedo01' THISFORM.aFolio.ControlSource = 'mgw10008.cFolio' THISFORM.aRazonso01.ControlSource = 'mgw10008.cRazonso01' THISFORM.aTotal.ControlSource = 'mgw10008.cTotal' THISFORM.aFechave01.ControlSource = 'mgw10008.cFechave01' THISFORM.edFechaIntereses.ControlSource = 'mgw10008.cFechaul01' THISFORM.aTextoex03.ControlSource = 'mgw10008.cTextoex03' THISFORM.aImporte03.ControlSource = 'mgw10008.cImporte03' THISFORM.aImporte04.ControlSource = 'mgw10008.cImporte04'

ENDIF USE MGW10002.DBF SHARED IN 1 LOCATE FOR MGW10002.cidclien01 = THISFORM.aidclien01.Value THISFORM.acodigoc01.ControlSource = 'mgw10002.ccodigoc01'

USE <FoxPro_directory>\tutorial\invoices SELECT * FROM invoices WHERE cno IN ; (SELECT cno FROM invoices GROUP BY cno HAVING COUNT(cno) > 1) ; ORDER BY cno ; INTO CURSOR xxx

UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 1) UPDATE MGW10005 CIDPRODU01 = 15)

SET SET SET

CIDFOTOP01 CIDUNIDA01 CIDVALOR01

= = =

(SELECT (SELECT (SELECT

CIDFOTOP01 CIDUNIDA01 CIDVALOR01

FROM FROM FROM

MGW10005 MGW10005 MGW10005

WHERE WHERE WHERE

UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 1) UPDATE MGW10005 CIDPRODU01 = 1) UPDATE MGW10005 CIDPRODU01 = 1) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 1) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15)

SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET

CIDVALOR02 CIDVALOR03 CIDVALOR04 CIDVALOR05 CIDVALOR06 CFECHAEX01 CTIMESTAMP CFECHAER01 CFECCOSEX1 CFECCOSEX2 CFECCOSEX3 CFECCOSEX4 CFECCOSEX5 CBANCOSEX CESCUOTAI2 CESCUOTAI3 CDESGLOSAI

= = = = = = = = = = = = = = = = =

(SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT

CIDVALOR02 CIDVALOR03 CIDVALOR04 CIDVALOR05 CIDVALOR06 CFECHAEX01 CTIMESTAMP CFECHAER01 CFECCOSEX1 CFECCOSEX2 CFECCOSEX3 CFECCOSEX4 CFECCOSEX5 CBANCOSEX CESCUOTAI2 CESCUOTAI3 CDESGLOSAI

FROM FROM FROM FROM FROM FROM FROM FROM FROM FROM FROM FROM FROM FROM FROM FROM FROM

MGW10005 MGW10005 MGW10005 MGW10005 MGW10005 MGW10005 MGW10005 MGW10005 MGW10005 MGW10005 MGW10005 MGW10005 MGW10005 MGW10005 MGW10005 MGW10005 MGW10005

WHERE WHERE WHERE WHERE WHERE WHERE WHERE WHERE WHERE WHERE WHERE WHERE WHERE WHERE WHERE WHERE WHERE

UPDATE MGW10005 CIDPRODU01 = 1)

SET

CIDUNICOM

(SELECT

CIDUNICOM

FROM

MGW10005

WHERE

UPDATE MGW10005 CIDPRODU01 = 1)

SET

CIDUNIVEN

(SELECT

CIDUNIVEN

FROM

MGW10005

WHERE

UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15) UPDATE MGW10005 CIDPRODU01 = 15)

SET SET SET SET

CIDUNIVEN CIDUNIVEN CIDUNIVEN CIDUNICOM

= = = =

(SELECT (SELECT (SELECT (SELECT

CIDUNIVEN CIDUNIVEN CIDUNIVEN CIDUNICOM

FROM FROM FROM FROM

MGW10005 MGW10005 MGW10005 MGW10005

WHERE WHERE WHERE WHERE

SET

CIDUNIVEN

(SELECT

CIDUNIVEN

FROM

MGW10005

WHERE

CLOSE TABLES ALL USE "NOMBRE_DE_TABLA" EXCLUSIVE FOR A=1150 TO 1207 GO RECORD A&& DELETE ENDFOR PACK CLOSE TABLES ALL

CASO PRACTICO 1.

Reinicio de Inters Moratorio en la empresa Mueblera 2012


Replace cFechapr01 with cFecha for CIDDOCUM02 = 4 or CIDDOCUM02 = 5 and cPendiente > 0 and cCancelado = 0 Replace cFechaen01 with cFecha for CIDDOCUM02 = 4 or CIDDOCUM02 = 5 and cPendiente > 0 and cCancelado = 0

Replace cFechaul01 with cFechave01 for CIDDOCUM02 = 4 or CIDDOCUM02 = 5 and cPendiente > 0 and cCancelado = 0 Replace cPorcent06 with 5 for CIDDOCUM02 = 4 or CIDDOCUM02 = 5 and cPendiente > 0 and cCancelado = 0

Esta ltima instruccin es solo para filtrar los documentos que afectamos o afectaremos
SELECT * FROM mgw10008.dbf WHERE ciddocum02 = 4 or ciddocum02 = 5 and cPendiente > 0 and cCancelado = 0

CASO PRACTICO 2.

Bsqueda de un Movimiento Especifico en las tablas de AdminPAQ Contexto: Encontrar el Movimiento de Inventario para el producto con cdigo D24071014 de la fecha 11 de Agosto de 2012

En la tabla MGW10010.DBF que es la de movimientos filtramos el movimiento con la siguiente instruccin

SELECT * FROM mgw10010.dbf WHERE cFecha = DATE(2012,08,11) AND cIdProdu01 = 1642

En la tabla MGW1008.DBF que es la de documentos filtramos el ID del documento con la siguiente instruccin

SELECT * FROM mgw10008.dbf WHERE cIddocum01 = 2578

Si lo encontr podemos ver el folio del documento para ir a AdminPAQ y analizarlo, pero si no es porque se borr el documento manualmente y no los movimientos, con esta instruccin los ubicamos

SELECT * FROM mgw10010.dbf WHERE Ciddocum01 NOT IN (SELECT Ciddocum01 FROM mgw10008.dbf) AND Ciddocum01 > 0

Esto desplegar los movimientos que no tienen documento, para marcarlos para eliminacin lo hacemos con la siguiente instruccin

DELETE FROM mgw10010.dbf WHERE mgw10008.dbf) AND Ciddocum01 > 0

Ciddocum01

NOT

IN

(SELECT

Ciddocum01

FROM

Para buscar los registros marcados para eliminacin en una tabla utilizamos

SELECT * FROM mgw10010.dbf WHERE DELETED()

Y en la Tabla sin filtros activados ponemos esta para borrarlos fsicamente PACK

CASO PRACTICO 3. Reinicio de Campos Adicionales de Datos capturados por el usuario

UPDATE MGW10008.DBF SET CTEXTOEX01 = (SELECT CTEXTOEX01 FROM MGW10008.DBF WHERE CIDDOCUM01 = 1) UPDATE MGW10008.DBF SET CTEXTOEX02 = (SELECT CTEXTOEX02 FROM MGW10008.DBF WHERE CIDDOCUM01 = 1) UPDATE MGW10008.DBF SET CTEXTOEX03 = (SELECT CTEXTOEX03 FROM MGW10008.DBF WHERE CIDDOCUM01 = 1) UPDATE MGW10008.DBF SET CFECHAEX01 = (SELECT CFECHAEX01 FROM MGW10008.DBF WHERE CIDDOCUM01 = 73489) UPDATE MGW10008.DBF SET CIMPORTE01 = (SELECT CIMPORTE01 FROM MGW10008.DBF WHERE CIDDOCUM01 = 1) UPDATE MGW10008.DBF SET CIMPORTE02 = (SELECT CIMPORTE02 FROM MGW10008.DBF WHERE CIDDOCUM01 = 1) UPDATE MGW10008.DBF SET CNUMEROG01 = (SELECT CNUMEROG01 FROM MGW10008.DBF WHERE CIDDOCUM01 = 1) UPDATE MGW10008.DBF SET CMENSAJE01 = (SELECT CMENSAJE01 FROM MGW10008.DBF WHERE CIDDOCUM01 = 1) UPDATE MGW10008.DBF SET CCUENTAM01 = (SELECT CCUENTAM01 FROM MGW10008.DBF WHERE CIDDOCUM01 = 1) UPDATE MGW10008.DBF SET CNUMEROC01 = (SELECT CNUMEROC01 FROM MGW10008.DBF WHERE CIDDOCUM01 = 1) UPDATE MGW10008.DBF CIDDOCUM01 = 1) SET CPESO = (SELECT CPESO FROM MGW10008.DBF WHERE

UPDATE MGW10008.DBF SET CREFEREN01 = (SELECT CREFEREN01 FROM MGW10008.DBF WHERE CIDDOCUM01 = 1) UPDATE MGW10008.DBF SET COBSERVA01 = (SELECT COBSERVA01 FROM MGW10008.DBF WHERE CIDDOCUM01 = 1) UPDATE MGW10008.DBF SET CDESTINA01 = (SELECT COBSERVA01 FROM MGW10008.DBF WHERE CIDDOCUM01 = 1)

1.- Funciones de Ejemplo

=caracteresEspeciales('string

enviar')

procedure caracteresEspeciales lparameters lstring for i = 1 to len(lstring) if !betw(asc(substr(lstring,i,1)),65, 90) and ; !betw(asc(substr(lstring,i,1)),97,122) and ; !betw(asc(substr(lstring,i,1)),48, 57) and ; asc(substr(lstring,i,1))<>32 lstring = stuff(lstring,at(substr(lstring,i,1),lstring),1,'') endif endfor return lString

2.- Ciclos. Aplicaciones y Ejemplos


Local i as integer For i=1 to 10 (ACCION) Endfor 2.Do While x > 1 (ACCION) EndDo

Do Case Case X = 1 (ACCION1) Case X = 2 (ACCION2) Otherwise (OTRA ACCION) EndCase

SENTENCIA CASE

DO CASE CASE lExpression1 [Commands] CASE lExpression2 [Commands]] ... CASE lExpressionN [Commands]] OTHERWISE [Commands]] ENDCASE

PROGRAMA 1. Este cambia las datos de Ctextoex03 dejando limpias las anteriores

CPESO

Ctextoex03

Cnumeroc01

Replace Ctextoex03 with ALLtrim(Peso) for recno()>1 Replace Ctextoex02 with Alltrim(CNUMEROC01) for recno()>1 UPDATE MGW10008 SET CPeso = (SELECT Cnumeroc01 FROM MGW10008 WHERE CIDDOCUM01 = 1) UPDATE MGW10008 SET Cnumeroc01 = (SELECT CPeso FROM MGW10008 WHERE CIDDOCUM01 = 1) UPDATE MGW10008 SET Cimporte02 = (SELECT Cimporte03 FROM MGW10008 WHERE CIDDOCUM01 = 1) UPDATE MGW10008 SET Cimporte03 = (SELECT Cimporte02 FROM MGW10008 WHERE CIDDOCUM01 = 1) UPDATE MGW10008 SET Cmensaje01 = (SELECT Cmensaje01 FROM MGW10008 WHERE CIDDOCUM01 = 1) Replace Cmensaje01 with Ctextoex03 for recno()>1 Replace Ctextoex03 with Ctextoex02 for recno()>1 Replace Ctextoex02 with Cmensaje01 for recno()>1

PROGRAMA 2. Este programa limpia los abonos ControlFact.exe para que los vuelva a calcular. SCAN IF Ciddocum02 = 1 REPLACE Creferen01 IF Ciddocum02 = 2 REPLACE Creferen01 IF Ciddocum02 = 3 REPLACE Creferen01 IF Ciddocum02 = 4 REPLACE Creferen01 ENDSCAN WITH WITH WITH WITH

calculados

por

el

programa

2.- Programas
Ejemplo 1. CLOSE TABLE ALL USE mgw10008 REPLACE Crazonso01 with STRTRAN(Crazonso01, "", "") for recno()>1 SCAN IF Cidclien01 = 9644 REPLACE Cidclien01 WITH 9641 ENDIF IF Cidclien01 = 9641 REPLACE Cidclien01 WITH 9641

ENDIF IF Cidclien01 = 9597 REPLACE Cidclien01 WITH 9641 ENDIF IF Cidclien01 = 9632 REPLACE Cidclien01 WITH 9641 ENDIF IF Cidclien01 = 9589 REPLACE Cidclien01 WITH 9641 ENDIF ENDSCAN

Ejemplo 2. CLOSE TABLE ALL USE mgw10008 REPLACE Crazonso01 with STRTRAN(Crazonso01, "", "") for recno()>1 SCAN IF Cidclien01 = 9644 REPLACE Cidclien01 WITH 9647 REPLACE CTEXTOEX03 WITH Crazonso01 ENDIF IF Cidclien01 = 9641 REPLACE Cidclien01 WITH 9647 REPLACE CTEXTOEX03 WITH Crazonso01 ENDIF IF Cidclien01 = 9597 REPLACE Cidclien01 WITH 9647 REPLACE CTEXTOEX03 WITH Crazonso01 ENDIF IF Cidclien01 = 9632 REPLACE Cidclien01 WITH 9647 REPLACE CTEXTOEX03 WITH Crazonso01 ENDIF IF Cidclien01 = 9647 REPLACE Crazonso01 WITH "VENTA AL PUBLICO" ENDIF ENDSCAN Ejemplo 3.
CLOSE TABLE ALL USE mgw10008 SCAN IF Ciddocum02 = 1 REPLACE Creferen01 IF Ciddocum02 = 2 REPLACE Creferen01 IF Ciddocum02 = 3 REPLACE Creferen01 IF Ciddocum02 = 4 REPLACE Creferen01

WITH WITH WITH WITH

ENDSCAN

Ejemplo 4. Cambia series de los documentos factura


CLOSE TABLE ALL USE mgw10008 SCAN IF Cidconce01 REPLACE ENDIF IF Cidconce01 REPLACE ENDIF IF Cidconce01 REPLACE ENDIF IF Cidconce01 REPLACE ENDIF IF Cidconce01 REPLACE ENDIF IF Cidconce01 REPLACE ENDIF IF Cidconce01 REPLACE ENDIF IF Cidconce01 REPLACE ENDIF IF Cidconce01 REPLACE ENDIF IF Cidconce01 REPLACE ENDIF IF Cidconce01 REPLACE ENDIF IF Cidconce01 REPLACE ENDIF ENDSCAN

= 3035 Cseriedo01 WITH CFCO = 3002 Cseriedo01 WITH CFCR = 3039 Cseriedo01 WITH CRCO = 3006 Cseriedo01 WITH CRCR = 3036 Cseriedo01 WITH DFCO = 5 Cseriedo01 WITH DFCR = 3038 Cseriedo01 WITH DRCO = 3035 Cseriedo01 WITH DRCR = 3034 Cseriedo01 WITH MFCO = 4 Cseriedo01 WITH MFCR = 3037 Cseriedo01 WITH MRCO = 3004 Cseriedo01 WITH MRCR

Ejemplo 3. Reiniciado de Clculos


CLOSE TABLE ALL USE mgw10008 SCAN

IF Ciddocum02 = 1 REPLACE Creferen01 IF Ciddocum02 = 2 REPLACE Creferen01 IF Ciddocum02 = 3 REPLACE Creferen01 IF Ciddocum02 = 4 REPLACE Creferen01

WITH WITH WITH WITH

ENDSCAN

Apndice A . Normas de codificacin en Visual FoxPro


Resumen
Aplicar buenas normas de codificacin es importante para el desarrollo de cualquier proyecto; pero es particularmente importante cuando muchos desarrolladores estn trabajando en el mismo proyecto. Tener establecido pautas de codificacin contribuye a garantizar que el cdigo es de alta calidad, con pocos errores y de fcil mantenimiento. Estas normas o pautas se basan en aos de desarrollo de aplicaciones con Visual FoxPro y de aprendizaje de cules tcnicas de codificacin trabajan mejor. Adems, muchos conceptos han sido adaptados a partir de Code Complete (Microsoft Press, ISBN 1-55615-484-4) escrito por Steve McConnell. Este libro, es considerado una de las guas ms importantes en prcticas de codificacin. Puede que usted no est de acuerdo con stas normas, no hay problemas. Para m, estas normas han funcionado bien.

Normas de codificacin
Convenciones de variables. No utilice guiones bajos en nombres de variables. Mezclar maysculas y minsculas mejora la legibilidad. La primera letra de la variable debe indicar su alcance y debe ser siempre minscula. Trate de evitar el uso de variables pblicas (PUBLIC) y privadas. En su lugar utilice propiedades de los objetos de su aplicacin, propiedades de formularios y variables locales.

l - Local g - Global p - Private

t - Parameter La segunda letra indica el tipo de dato.

c - Character n - Numeric d - Date t - DateTime l - Logical m - Memo a - Array o - Object x - Indeterminate Ejemplos de nombres de variables vlidos:

lcFirstName tdBeginDate

Tenga en mente el alcance de la variable. Preferiblemente deben utilizarse variables locales (LOCAL). Las variables pblicas (PUBLIC) deben evitarse tanto como sea posible. Las declaraciones de variables, tales como: LOCAL lcMyVar se deben colocar todas al inicio de la rutina a ejecutar, en lugar de dispersarlas por el cdigo. Declare todas las variables al inicio de la rutina, en lugar de entremezclarlas por todo el cdigo y asigne su valor predeterminado.
Forma incorrecta:

LOCAL lnMyNum lnMyNum = 12

LOCAL lcMyString lcMyString = "ABCD"

LOCAL lnCounter lnCounter = 0

Forma correcta:

LOCAL lnMyNum, lcMyString, lnCounter lnMyNum = 12 lcMyString = "ABCD" lnCounter = 0

Convenciones para nombrar objetos. Las primeras tres letras del nombre de un objeto deben ser utilizadas para indicar el tipo del objeto.

chk - Check box cbo - Combo box cmd - Command button cmg - Command Group cnt - Container ctl - Control cus - Custom edt - Edit box frm - Form frs - Form set grd - Grid grc - Grid Column grh - Grid Column Header img - Image lbl - Label lin - Line lst - List box olb - OLE Bound Control ole - OLE Object como un ActiveX Control opg - Option Group pag - Page pgf - Pageframe sep - Separator shp - Shape spn - Spinner txt - Text box tmr - Timer tbr - Toolbar

Normas para el cdigo fuente:


1. Utilice abundantes espacios en blanco. Har ms legible su cdigo. 2. Utilice tabuladores, en lugar de espacios para indentar.

3. Los comandos y funciones de Visual FoxPro deben escribirse en maysculas y con la totalidad de sus letras, el resto del cdigo debe estar escrito con combinacin de maysculas y minsculas. Mantenga lneas cortas, tanto como sea posible, para evitar desorden (line wrap) durante la impresin. Si una lnea de cdigo, ocupa fsicamente ms de una lnea, utilice las expresiones de unin como primer carcter de la lnea siguiente. Las expresiones de unin son del tipo +, AND, OR, NOT, etc. Recuerde adems, que la lnea debe ser tan vlida como si fuera una sola lnea. Coloque un espacio antes del punto y coma. Ejemplos de malas separaciones de lneas:

lcCommand = "Hoy es Mircoles, 16 de Octubre de 2003" + ; "Son las 2:00 PM"

IF ldBeginDate >= DATE() OR ; ldEndDate >= DATE()

Ejemplos de buenas separaciones de lneas:

lcCommand = " Hoy es Mircoles, 16 de Octubre de 2003" ; + "Son las 2:00 PM"

IF ldBeginDate >= DATE() ; OR ldEndDate >= DATE()

<li value="4">Por lo visto, cada uno combina las maysculas y minsculas de forma diferente. Aunque no existe va correcta o incorrecta en este aspecto, si hay algunas normas que ayudan a la legibilidad. Adems, utilice expresiones CASE en lugar de IF, cuando parezca que se pueden agregar posteriormente ms opciones, incluso si existen slo dos opciones en el momento en que es escrito el cdigo o, para liberarse de las instrucciones IF, ELSE, IF. Separe cada CASE por una lnea en blanco. El comentario para el CASE debe ir por debajo del mismo.

Forma incorrecta:

DO CASE

* Este es el comentario para el caso 1 CASE lnCount = 1 lcRetVal = "Uno" * Este es el comentario para el caso 2 CASE lnCount = 2 lcRetVal = "Dos" * Este es el comentario para otherwise OTHERWISE lcRetVal = "Otro" ENDCASE

Forma correcta:

DO CASE CASE lnCount = 1 * Este es el comentario para el caso 1 lcRetVal = "Uno" CASE lnCount = 2 * Este es el comentario para el caso 2 lcRetVal = "Dos" OTHERWISE * Este es el comentario para otherwise lcRetVal = "Otro" ENDCASE <ol start="5">

Trate de evitar macro sustitucin. A veces la macrosutitucin es la nica va para lograr algo. Asegrese de documentar, por qu utiliza macrosustitucin y cul es el propsito del cdigo. En la mayora de los casos, la macrosustitucin hace que el cdigo sea menos legible. Utilice la funcin EVALUATE(). Si es posible, pero nuevamente los comentarios son importantes para ayudar a leer el cdigo. Evite utilizar STORE. Utilice "[]" en lugar de parntesis en los arreglos. As, el cdigo es ms legible. Coloque espacios entre los operadores matemticos. Esto mejora la legibilidad. Utilice parntesis cuando llame mtodos o funciones, incluso, si no pasa ningn parmetro. Evite el uso de m. a la izquierda del signo igual. Esto mejorar el rendimiento. Al concatenar cadenas, coloque la variable a la izquierda del signo +. Esto mejorar el rendimiento.

Normas para comentar cdigo


Los comentarios son parte importante de cualquier aplicacin. Utilcelos abundantemente. Los comentarios deben explicar por qu se han hecho algunas cosas e indicar cules son las lneas de cdigo que estn afectadas. Debe explicar solamente cmo se hizo algo, en caso de estar utilizando complejos algoritmos o clculos. No emplee comentarios al final de las lneas con &&. Cada comentario debe ocupar una lnea propia. Encabezados de programa, mtodo y procedimiento. Los encabezados de programa, mtodo y procedimiento deben indicar el nombre de la rutina, la fecha en que fue creada originalmente, el autor y una descripcin del objetivo del procedimiento o mtodo. En caso de existir parmetros y valores devueltos, incluya una descripcin de los mismos. Para los mtodos, incluya la jerarqua de objetos. Ejemplo 1:

********************************************************* * Mtodo........: frmQueue.cmdNext.Click * Descripcin...: Displays the next item in the selected queue * Fecha.........: 01-Oct-2001 * Autor.... ....: Fred Flintstone ********************************************************* * Modification Summary * *********************************************************
Ejemplo 2:

*********************************************************

* Funcin......: CalcIntrest * Descripcin...: Calculate the interest in dollars on the loan * Parmetros....: tnBalance: Required: The balance amount * : tnRate: Required: The interest rate to apply * Devuelve......: Numeric: The dollar amount of the interest * Fecha.........: 01-Oct-2001 * Autor.........: Bullwinkle J. Moose ********************************************************* * Modification Summary (Resumen de modificaciones) * *********************************************************

Comentar modificaciones Es importante poner comentarios al hacer modificaciones para saber cules fueron las modificaciones realizadas, y por qu las realiz. La seccin Modification Summary (Resumen de modificaciones) en el encabezado explicar por qu, cundo y por quin fueron realizadas las modificaciones. En cada lugar del cdigo, donde fue realizada una modificacin, debe comentar el cdigo viejo e indicar cul es el cdigo nuevo que fue aadido. Cada modificacin debe ser numerada. Los cambios pueden ser borrados despus de un ao; pero el Resumen de modificaciones debe permanecer.

Ejemplo:

********************************************************* * Modification Summary * * /01 05-Oct-2001 George Jetson * Changed interest calculation to include a date range factor. * /02 10-Oct-2001 Tennessee Tuxedo * 1. Added code to handle interest on widgets. The calculation is different.

* 2. Changed the return value from numeric to character. ********************************************************* */01 lcNote = "This is the old line commented out " */01 lcNote = "This is the new line of code. " */02-1 lnInterest = a * b */02-1 lnInterest = lnInterest / 43 */02-1 - Begin - Multiple lines are being added, so indicate they start here IF UPPER(tcIntType) = "WIDGETS " lnInterest = a * c ELSE lnInterest = a * b lnInterest = lnInterest / 43 ENDIF */02-1 End

Las lneas de comentario deben indentarse al mismo nivel del cdigo. Este ejemplo es incorrecto:

IF lnTotalInterest = 0 */01 Begin FOR lnCount = 1 TO lnTotal lnTotalInterest = lnTotalInterest + laLoans[lnCount, 2] ENDFOR */02 End

ENDIF

Este ejemplo es correcto:

IF lnTotalInterest = 0 */01 Begin FOR lnCount = 1 TO lnTotal lnTotalInterest = lnTotalInterest + laLoans[lnCount, 2] ENDFOR */02 End ENDIF

Al comentar lneas que continan, hay que comentar cada lnea fsica. Incorrecto:

*/01 lcString = "Esta cadena contiene mucho texto porque es un " ; + "ejemplo de una lnea verdaderamente larga "

Correcto:

*/01 lcString = "Esta cadena contiene mucho texto porque es un " ; */01 + "ejemplo de una lnea verdaderamente larga "

Normas para interfaz de usuario Normas generales para interfaz de usuario (UI) Cuando sea posible, la interfaz de usuario debe cumplir con las directivas de Windows Standards descritas en el libro "Microsoft Windows User Experience ", Microsoft Press, ISBN 0-7356-0566-1. Este libro se encuentra disponible en: http://msdn.microsoft.com/library/en-us/dnwue/html/welcome.asp. Tenga en mente todo el tiempo al usuario. Mientras ms sencilla sea la funcionalidad para el usuario, mejor ser la aplicacin. Esto puede significar que el cdigo que est detrs de esta funcionalidad es ms complejo.

Formularios de entrada de datos 1. Todos los campos aptos para entrada deben utilizar Select On Entry. 2. Los campos numricos deben ser formateados con comas y signos negativos cuando sea necesario. 3. Si un campo es de slo lectura, establezca la propiedad TabStop en .F., Establezca la propiedad ReadOnly a .T. o la propiedad Enabled a .F., segn sea el caso. La propiedad ReadOnly se utiliza cuando el campo nunca es modificable. La propiedad Enabled se utiliza cuando el campo es modificable cuando se cumple una determinada condicin (es evaluada a .F.) 4. Utilice la barra de estado para mostrar un mensaje al usuario que indique el propsito del campo. 5. Muestre siempre los valores predeterminados, en los casos en que se aplique. 6. Inhabilite (Enabled = .F.) los objetos cuando sea necesario. Esto proporciona indicacin visual al usuario de que el objeto no puede ser modificado en ese momento. Mensajes 1. No utilice WAIT WINDOW para mostrar mensajes importantes al usuario. Es muy fcil que el usuario no note el mensaje. En su lugar utilice MESSAGEBOX. Incluya siempre el icono apropiado en el cuadro de mensaje (message box). Evite la utilizacin del parmetro TIMEOUT, ya que el usuario puede perder informacin importante. 2. Utilice la barra de estado para mostrar ayuda en lnea para el objeto actual, ya sea en un formulario o un men. Objetos de formulario 1. Text box. (cuadros de texto) El cuadro de texto es el control ms comnmente utilizado. Puede contener valores de caracteres, numricos o fecha. 2. Check box. (casilla de verificacin) La casilla de verificacin es un control sencillo que est establecido en ON u OFF. Son utilizadas tpicamente para indicar un estado de S o No. 3. Command button. (Botn de comando) El botn de comandos es utilizado para iniciar una accin. Los botones ms comnmente utilizados son OK (Aceptar) y Cancel (Cancelar). Algunas veces los botones de comandos son agrupados en los command group (grupos de comandos). Intente evitar los grupos de comandos, los botones individuales son ms fciles de mantener. 4. Option button. (Botn de opcin) En ocasiones se les llama radio button. Se utiliza para indicar que el usuario puede seleccionar una opcin de un grupo de opciones. Los botones de opciones son frecuentemente agrupados en Option group (grupo de opciones). Esto simplifica el cdigo para el proceso de seleccin. Se recomienda que los grupos de opciones se utilicen en lugar de los botones de opciones. Los grupos de opciones deben ser preferiblemente ordenados verticalmente antes que horizontalmente. 5. Drop-down list. (Lista desplegable) Una lista desplegable permite al usuario hacer una seleccin de una lista de varios objetos, como con un botn de opcin. Sin embargo, la lista desplegable requiere de menos espacio en pantalla. 6. Combo box. (Cuadro combinado) Los cuadros combinados se identifican como un textbox en una flecha hacia abajo. Se llama cuadro combinado, porque es una combinacin de un cuadro de texto y una lista desplegable. El usuario puede escribir un nuevo valor o seleccionarlo de la lista. 7. List box. (Cuadro de lista) Un cuadro de lista puede ser utilizado uno o varios objetos de una lista. 8. Spinner. Un control spinner es una especie de textbox con flechas hacia arriba y hacia abajo. Es utilizado normalmente para datos numricos. El nmero aumenta o disminuye al hacer clic en las flechas o el usuario puede introducir un valor especfico. 9. Edit box. (Cuadro de edicin) Un cuadro de edicin se comporta de forma parecida al textbox; pero normalmente es utilizado para campos memo. Un editbox puede tener barras de desplazamiento y deslizamiento de filas (word wrap)

Copyright 2012-2013, Jorge Palomino. All Rights Reserved.

APENDICE A. Tipos de Datos


Tipo de datos Character Currency Date Descripcin Cualquier texto Importes monetarios Datos cronolgicos formados por mes, ao y da Datos cronolgicos formados por mes, ao, da y hora En AdminPAQ Intervalo Cualquier carcter 922337203685477,5807 922337203685477,5807 a

Al usar formatos de fecha estrictos, {^0001-01-01}, 1 de enero, 1 d.C. a {^999912-31}, 31 de diciembre, 9999 d.C. Al usar formatos de fecha estrictos, {^0001-01-01}, 1 de enero, 1 d.C. a {^999912-31}, 31 de diciembre, 9999 d.C., ms 00:00:00 a.m. a 11:59:59 p.m. Verdadero (.T.) o Falso (.F.) 0,9999999999E+19 0,9999999999E+20 Vea el tipo de datos permitidos. a

DateTime

Logical Numeric Variant

Valor booleano verdadero o falso Enteros o fracciones Una variable de tipo Variant puede contener cualquier tipo de datos de Visual FoxPro y el valor Null. Una vez que se almacena un valor en una variable del tipo Variant, sta asume el tipo de los datos que contiene. Las variables tipo Variant se designan con el prefijo e en la sintaxis del lenguaje.

Adems, Visual FoxPro proporciona tipos de datos que se aplican nicamente a campos de tablas.
TIPOS DE CAMPOS DE VISUAL FOXPRO

Tipo de campo Double

Descripcin

En AdminPAQ

Intervalo +/-4,94065645841247E-324 8,9884656743115E307 a +/-

Nmero de signo flotante Doble de precisin doble

Float General Integer Memo

Igual que Numeric Referencia a un objeto OLE Valores enteros Referencia a un bloque de datos

- 0,9999999999E+19 a 0,9999999999E+20 Limitado por la memoria disponible -2147483647 a 2147483647 Limitado por la memoria disponible Cualquier carcter

Character (Binario) Datos de tipo Character que desea mantener sin modificacin en las pginas de cdigos Memo (Binario) Datos de campo Memo que desea mantener sin modificacin en las pginas de cdigos

Limitado por la memoria disponible

*Cada tipo de datos tiene sus propias caractersticas, incluido el tamao de almacenamiento:

Sugerencia Puede utilizar la funcin TYPE( ) para determinar el tipo de datos almacenado en una variable, un elemento de matriz o un campo.

APENDICE B. Funciones tiles en Visual Fox Pro


FUNCIONES GENERALES
? ?? (Comando) Sirve para imprimir valores en la screen de VFP, en una ventana activa o a una impresora. ? <Valor> imprime en una nueva lnea los resultados. ? ? <Valor> imprime en la misma lnea los resultados. & (Comando) Acta como un macrosustitutor, remplaza la variable por lo contenido en ella, que puede ser otra variable, un campo y de esa forma mostrara el valor de la otra variable o campo. Tambin puede usarse para ejecutar comandos de vfp armados como una cadena. Funciones de Fecha CDOW() Devuelve el da de la semana. CTOD() Convierte fecha escrita en caracteres a tipo de dato fecha. DATE() Devuelve la fecha actual del sistema.

DAY() Devuelve el da del mes de una determinada fecha. DOW() Devuelve el nmero de da en la semana (1 a 7). DTOS() Convierte un tipo de dato fecha en una cadena de texto. FTIME() Devuelve la hora de la ltima modificacin de un archivo. HOUR() Devuelve la hora de una cadena datetime. MINUTE() Devuelve los minutos de una cadena datetime. SEC() Devuelve los segundos de una cadena datetime. SET HOURS <Comando> Define como se utiliza la hora en 12 o 24. SET SECONDS <Comando> Define si aparecen en la cadena datetime, el componente segundos. SYS(2) Devuelve los segundos que pasaron desde la medianoche. SYS(11) Convierte el valor fecha en un nmero juliano. TTOC() Convierte la cadena datetime en un formato string determinado. WEEK() Devuelve la semana del ao en la que se encuentra una determinada fecha. CMOUNTH() Devuelve el nombre del mes. CTOT() Es la inversa de la funcin TTOC. DATETIME() Devuelve la fecha y hora en formato datetime.

DMY() Devuelve la cadena da + nombre mes + del + ao, a partir de un date o datetime. DTOC() Devuelve la fecha en formato carcter. DTOT() Devuelve un formato datetime a partir de una date. FDATE() Devuelve la ultima modificacin de un archivo en date o datetime. GOMONTH() Devuelve la fecha a partir de un date e indicndole cuantos mesas mas o menos. MDY() Devuelve lo mismo que DMY, pero comienza con el mes. MONTH() Devuelve el nmero del mes. SECONDS() Idntico que SYS(2), pero esta funcin devuelve formato numrico. SET MARK TO <Comando> Determina el separador para mostrar la fecha. SYS(1) Devuelve la fecha actual en formato juliano. SYS(10) Inversa a la funciones SYS(1) y SYS(11). TIME() Devuelve la hora del sistema. TTOD() Convierte de datetime a date. YEAR() Devuelve el ao a partir de una fecha. Funciones Numricas % <Operador> Devuelve el resto de una divisin. BITCLEAR() Devuelve un nmero con un bit puesto en cero, ese bit se indica por parmetro.

BITNOT() Devuelve el nmero negado a nivel de bit. CALCULATE() Devuelve clculo de tipo estadsticos o financieros sobre campos, los clculos son los siguientes: AVG() Calcula la media aritmtica. CNT() Cuanta la cantidad de registros de una tabla. MAX() Valor mayor encontrado. MIN() Valor menor encontrado. STD() Desvo estndar de la media. SUM() Suma los datos de un campo. VAR() varianza del promedio. EMPTY() Determina si un valor es 0. FLOOR() Devuelve el entero ms prximo menor que uno determinado. INLIST() Determina si un valor esta incluido dentro de un conjunto de valores. LOG() Devuelve el logaritmo natural de un nmero. MAX() Devuelve el nmero mayor de un conjunto de valores. MOD() Divide dos nmeros y devuelve el resto. PI() Devuelve el numero constante pi. RAND() Devuelve un nmero aleatorio entre 0 y 1. SQRT() Devuelve la raz cuadrada de un nmero. VAL() Convierte una cadena a nmero. ABS() Devuelve el valor absoluto.

BITAND() Devuelve la expresin de un and a nivel de bit de ms de un nmero. BITOR() Devuelve la expresin de un or a nivel de bit de ms de un nmero. BITSET() Lo contrario a BITCLEAR, lo reemplaza por 1. BITXOR() Devuelve la expresin de un xor a nivel de bit de ms de un nmero. CEILING() Devuelve el entero ms prximo mayor a un nmero ingresado. INT() Devuelve la parte entera de un nmero. LOG10() Devuelve el logaritmo en base 10. MIN() Devuelve el nmero menor de un conjunto de valores. ROUND() Redondea un nmero en la cantidad de decimales indicados. SET DECIMALS <COMANDO> Define la cantidad de decimales que se van a visualizar. FUNCIONES LGICAS $ <Operador> Determina si una cadena de caracteres esta contenida dentro de otra. EMPTY() Determina si una variable se encuentra vaca, depende del tipo de dato. IIF() Devuelve un resultado dependiendo del valor de una determinada evaluacin. ISALPHA() Determina si el primer carcter de la izquierda es alfabtico. ISUPPER() Determina si el primer carcter de la izquierda es alfabtico y maysculo. LIKEC()

Determina si una expresin de caracteres es igual a otra. BETWEEN() Determina si un valor se encuentra dentro de un rango. DELETED() Determina si el registro actual esta marcado lgicamente como eliminado. FOUND() Devuelve verdadero si LOCATE o SEEK tienen xito. INLIST() Devuelve verdadero si una expresin esta incluida en un conjunto. ISDIGIT() Determina si el primer carcter de la izquierda es numrico. ISLOWER() Determina si el primer carcter de la izquierda es alfabtico y minsculo. LIKE() Determina si una expresin de caracteres concuerda con otra. FUNCIONES DE CADENA ALLTRIM() Borra los espacios iniciales y finales de una cadena. EJEMPLO REPLACE Ctextoex03 with Alltrim(Ctextoex03) for recno()>1
DE INICIO Y FIN EN TODA LA COLUMNA.

QUITA ESPACIOS

AT() Devuelve la posicin inicial de la aparicin de una cadena de caracteres dentro de otra. EJEMPLO AT(ca, maracas) DEVUELVE 5. ATC() Hace los mismo que la anterior pero no distingue entre maysculas y minsculas. ATCLINE() Devuelve la lnea en la que encuentra la cadena, sin importar maysculas y minsculas. CHR() Devuelve el carcter asociado al cdigo ANSI. LEFT() Devuelve una cantidad de caracteres de una cadena de caracteres comenzando por izquierda como punto inicial. EJEMPLO LEFT(cada, 3) DEVUELVE CAD

LEN() Devuelve el largo de una cadena. ASC() Inversa a la funcin CHR. CHRTRAN() Los caracteres de una cadena, que coinciden con una segunda cadena son remplazados por una tercera cadena. EJEMPLO CHRTRANC(cada, ad, ol) CAMBIA EL TEXTO CADA POR COLA CPCONVERT() Convierte una cadena de caracteres a otra pgina de cdigos. EVALUATE() Se utiliza parecido al sustituto de macro &. EJEMPLO Cad = int(10.002), EVALUATE (Cad) = 10. LOWER() Devuelve las minsculas de una expresin de caracteres. PADC() Rellena una expresin de caracteres por ambos lados con un carcter dado. PADR() Rellena una expresin de caracteres por derecha con un carcter dado. PADL() Rellena una expresin de caracteres por izquierda con un carcter dado. RAT() Devuelve la ltima posicin donde se encuentra un determinado valor. EJEMPLO RAT(a, cada) DEVUELVE 4 YA QUE LA ULTIMA
POSICIN

LETRA

A EN EL TEXTO CADA ESTA EN LA

RIGHT() Devuelve una cantidad de caracteres de una cadena de caracteres comenzando por derecha como punto inicial. EJEMPLO RIGHT(cada, 3) DEVUELVE ADA RTRIM() Saca los espacios de la derecha. LTRIM() Saca los espacios de la izquierda. OCCURS() Devuelve la cantidad de apariciones de un determinado carcter. REPLICATE()

Repite una cantidad de veces una determinada cadena. SPACE() Devuelve una cadena de caracteres con una cantidad de espacios determinados. STR() Devuelve una expresin numrica en texto, pudiendo definir los espacios para los enteros y decimales. STRCONV() Convierte una cadena de caracteres a otro formato, por ejemplo Unicode, base64, etc. STRTOFILE() Escribe una cadena de caracteres en un archivo. STRTRAN() Cambia una expresin de caracteres que se encuentran en una segunda expresin de caracteres por una tercera expresin de caracteres. STUFF() Cambia de una cadena de caracteres un nmero determinado de ellos por otros caracteres. SUBSTR() Devuelve un nmero especfico de caracteres de una cadena. UPPER() Devuelve una expresin de caracteres con todos ellos convertidos en maysculas. PROPER() Devuelve una expresin de caracteres con la letra inicial de cada palabra en maysculas. TRIM() Funciona de la misma forma que RTRIM(). TYPE() Evala una cadena de caracteres y determina que tipo de dato es. VARTYPE() Evala el tipo de datos de una expresin.

S-ar putea să vă placă și