Manual de Clipper (LEMUR) summer 87. Introducción. Las prestaciones de CLIPPER SUMMER '87 a destacar son las siguientes: * Provee un conjunto de funciones para el tratamiento de ficheros en redes de area local. * Permite manejar ficheros de bajo nivel. * Posibilita la creación de funciones de usuarios y agruparlas en librerías. * Permite el uso de arrays unidimensionales. * Proporciona un depurador avanzado. La presente guía está dividida en doce capítulos. Cada capítulo describe comandos y/o funciones de Clipper referentes a temas concretos. El primero de ellos describe aspectos técnicos iniciales que es preciso conocer de este producto. I. Características técnicas. 1. Capacidades. Nº. máximo de registros por base de datos, 1000.000.000 Nº. máximo de caracteres por registro, RAM disponible Nº. máximo de campos por registro, RAM disponible Nº. máximo de caracteres por campo, 32 kb Nº. de dígitos de precisión en operaciones de cálculo, 18 Nº. máximo de caracteres en una clave de indización, 250 Nº. máximo de variables de memoria, 2048 Tamaño máximo de una variable de memoria, 64 kb Nº. máximo de dígitos en una variable numérica, 19 Nº. máximo de tablas, 2048 2. Requerimiento hardware. Computadora : IBM PC, XT, AT, 386 o compatible Memoria RAM : 256 kb Disco rígido : Necesario para funcionamiento óptimo Coprocesador: Si existe se aprovecha automáticamente 3. Requerimiento software. Sistema Operativo : DOS 2.0 o superior (monousuario) DOS 3.1 o superior (multiusuario) LAN : Bajo DOS. No requiere LAN Pack. Bloqueo manual. 4. Instalación . Instalación de CLIPPER: copiar el contenido de todos los diskettes a un directorio o ejecutar el fichero CLIPCOPY.BAT que se encuentra en el disco "Clipper Sistema". 5. Config.sys. Para el funcionamiento óptimo de CLIPPER conviene incluir las siguientes líneas en el fichero de configuración CONFIG.SYS. FILES = 20 BUFFERS = 8 Si se posee DOS 3.3 o superior es posible trabajar hasta con 255 ficheros abiertos simultáneamente. Para ello se debe indicar, en lugar de FILES = 20: FILES = 255 (Es importante ajustar el número de ficheros para aprovechar al máximo la memoria, cada file ocupa 4K, no se necesitan tantos, 20 suele ser lo normal). 6. Autoexec.bat. En el fichero AUTOEXEC.BAT resulta de gran utilidad incluir una línea de PATH. Esto permitirá ejecutar el compilador desde otros directorios de trabajo. PATH C:\CLIPPER 7. Ficheros. A los distintos ficheros que maneja CLIPPER podremos diferenciarlos por su extensión. Si hemos utilizado anteriormente DBASE, la mayoría nos resultarán familiares. Bases de datos (.DBF) Datos memo (.DBT) Indices (.NTX) en DBASEIII (.NDX) Etiquetas (.LBL) Informes (.FRM) Texto (.TXT) Variables de memoria (.MEM) Fuentes (.PRG) Objetos (.OBJ) Compilación (.CLP) Enlace (.LNK) Overlays (.OVL) Ejecutables (.EXE) 8. Compatibilidad con DBASE. La posibilidad de compilar DBASE con el compilador de CLIPPER está limitada por un grupo de comandos y funciones de DBASE. A continuación se muestra una equivalencia entre estos comandos y funciones: ¦ APPEND LIST FILES SET CATALOG ¦ ¦ ASSIST LIST HISTORY SET COLOR ON/OFF ¦ ¦ BROWSE LIST STRUCTURE SET DEBUG ¦ ¦ CHANGE LOAD SET DOHISTORY ¦ ¦ CLEAR FIELDS LOGOUT SET ECHO ¦ ¦ CREATE LABEL MESSAGE() SET ENCRYPTION ¦ ¦ CREATE REPORT MODIFY COMMAND SET FIELDS ¦ ¦ CREATE QUERY MODIFY LABEL SET HEADING ¦ ¦ CREATE SCREEN MODIFY QUERY SET HELP ¦ ¦ CREATE VIEW MODIFY REPORT SET HISTORY ¦ ¦ DISPLAY FILES MODIFY SCREEN SET MEMOWIDTH ¦ ¦ DISPLAY MEMORY MODIFY STRUCTURE SET MENUS ¦ ¦ DISPLAY STATUS MODIFY VIEW SET SAFETY ¦ ¦ DISPLAY STRUCTUR ON ERROR SET STATUS ¦ ¦ DISPLAY USERS ON ESCAPE SET STEP ¦ ¦ EDIT ON KEY SET TALK ¦ ¦ ERROR() RESUME SET TITLE ¦ ¦ EXPORT TO RETRY SET TYPEHEAD ¦ ¦ HELP RETURN TO MASTER SET VIEW ¦ ¦ IMPORT TO SET ¦ ¦ INSERT SET CARRY ¦ Comandos y funciones no compatibles. Otras distinciones a considerar son las referentes a las macros (en Clipper no pueden usarse para sustituir a una palabra del sistema) y los ficheros índices (en Clipper están optimizados). Clipper proporciona un manejador de bases de datos (DBU), un emulador del punto de petición de orden de Dbase (DOT), un generador de informes y etiquetas (RL) y un generador de ficheros índices. Todo estas opciones son semejantes a las proporcionadas por Dbase. II. Entorno de desarrollo. 1. Entorno. Para desarrollar con CLIPPER tendremos que disponer de las siguientes herramientas básicas: - Un editor que genere código ASCII standard. - El compilador CLIPPER.EXE. - Las librerías CLIPPER.LIB, EXTEND.LIB, OVERLAY.LIB, etc. - Un enlazador PLINK86.EXE ,LINK.EXE ,TLINK.EXE. - Un depurador de programas DEBUG.OBJ. 2. Escritura de programas. Los requisitos básicos a cumplir para la correcta escritura de los fuentes son: a) Los ficheros fuentes se nombrarán especificando la extensión .PRG. b) La longitud de una línea es de 256 caracteres. c) Una línea sólo admitirá una instrucción. d) Las instrucciones pueden escribirse desde la primera línea en el editor. e) Cuando sea necesario escribir líneas de instrucciones muy largas, podemos hacerlo en líneas independiente escribiendo un punto y coma al final de la línea. f) Puede escribirse en minúsculas o mayúsculas, indistintamente. g) El asterisco '*' se utilizará para hacer comentarios. h) El doble '&' se utilizará para comentar líneas con instrucciones. 3. Compilación. La compilación es una traducción del fichero fuente (.PRG) para obtener un fichero objeto (.OBJ). Consiste en transcribir cada instrucción desde el lenguaje simbólico en que está escrito el código (CLIPPER) a código comprensible por el enlazador del sistema operativo (DOS). El fichero del compilador que proporciona CLIPPER se llama CLIPPER.EXE. Sintaxis: CLIPPER [- {-}] Programa fuente que se compila - Opciones de compilación -l El módulo objeto no almacena el nº de línea del fuente. -m Hace que las llamadas DO o SET PROCEDURE no se compi- len. -o Especificar el directorio donde se depositará el fichero objeto. -p La compilación no comienza hasta que no se pulsa una tecla. -q Suprime la visión en pantalla de los números de líneas. -s Hace que no se genere módulo objeto. Verifica sólo sintaxis. -t Especificar la unidad donde se creará el fichero temporal .$$$ Es imprescindible que haya al menos un espacio en blanco entre y la primera opción así como entre cada una de ellas. Es obligatorio que la opción se exprese en minúsculas. Nuestro programa puede contener asimismo diversas llamadas DO a otros módulos .PRG o a procedimientos del mismo programa. Si no le especificamos lo contrario, CLIPPER compila de forma automática los ficheros llamados por DO. 4. Enlace. El fin de un enlazador es el de asociar los módulos objeto obtenidos mediante el compilador con las librerías donde se contienen las traducciones máquina de cada una de las sentencias,llamadas,etc. que aparecen en el módulo objeto. a) Enlazadores * PLINK86 (Phoenix Tec. Clipper Summer '87) Sintaxis: PLINK86 FI {,} [OUTPUT ] LIB {,} | [@] * LINK (Microsoft) Sintaxis: LINK {},,, {} * TLINK (Borland) Sintaxis: TLINK {},,, {} * RTLINK (Pocket Soft. Clipper 5) Sintaxis: RTLINK [FI [OUTPUT ] [LIB [] []] | [@] b) Overlay * Ficheros de enlace .LNK Todas las claúsulas que deban indicarse al enlazador pueden situarse en un fichero de enlace .LNK. El enlazador usa uno de estos ficheros conforme a la siguiente sintaxis: PLINK86 @ Ejemplo_1: PRUEBA.LNK FILE prueba LIB clipper,extend ; (';'Indica el final del fichero .LNK) * Librerias CLIPPER.LIB EXTEND.LIB OVERLAY.LIB * Overlays El mayor problema con el que nos podemos encontrar, cuando estamos realizando una aplicación en Clipper, es que ésta no nos quepa físicamente en la memoria de trabajo de nuestro ordenador. El único modo que tenemos de solucionar este problema es proceder a lo que denominamos segmentación, programación por capas, solapas u overlays. Cuando programamos usando esta técnica, lo que hacemos es dividir la memoria RAM en dos o más áreas de trabajo. En la primera de ellas (área principal) se carga el módulo ejecutable, y en las áreas de solape se cargan y descargan, conforme se van usando, los diferentes módulos overlay que hayamos definido. Ejemplo_1: PRUEBA.LNK (2 áreas) FILE prgprin LIB clipper,extend OVERLAY CODE, $CONSTANTS BEGINAREA SECTION FILE modulo1 SECTION FILE modulo2 SECTION FILE modulo3 ENDAREA Mandatos para compilar y linkar CLIPPER prgprin -m CLIPPER modulo1 CLIPPER modulo2 CLIPPER modulo3 PLINK86 @prueba Ejemplo_2: PRUEBA.LNK (3 áreas) FILE prgprin LIB clipper,extend OVERLAY CODE, $CONSTANTS BEGINAREA SECTION FILE modulo1 SECTION FILE modulo2 ENDAREA BEGINAREA SECTION FILE modulo3 ENDAREA Mandatos para compilar y linkar CLIPPER prgprin -m CLIPPER modulo1 CLIPPER modulo2 CLIPPER modulo3 PLINK86 @prueba (Para que Clipper produzca un fichero .EXE y tantos ficheros .OVL como módulos para overlays tengamos definidos, sólo hay que cambiar la instrucción: SECTION FILE {,} por SECTION INTO FILE {,} (Esto último es útil para trabajar con disquetes) * Mandatos del enlazador PLINK86 #. Sirve para poner un comentario en un fichero de enlace. BATCH. Por defecto, cuando PLINK86 no encuentra un fichero .OBJ o .LIB de los especificados, la operación de enlace continúa adelante. BEGINAREA. Determina el comienzo de un área. ENDAREA. Determina el final de un área. DEBUG. Proporciona información adicional para ayudar a la depuración de una aplicación en el caso de overlay. FILE. Especificar los módulos objetos separados por coma (,). HEIGHT. Nº líneas/página del informe (MAP). LIBRARY. Especificar las librerías que serán enlazadas con los .OBJ. LOWERCASE. Convierte en minúsculas todos los identificadores y símbolos. MAP=. Especificar fichero .MAP. NOBELL. Elimina el sonido que aparece con los mensajes del PLINK86. OUTPUT. Especificar fichero .EXE. SEARCH. Hace una segunda pasada por las librerías si tras terminar el enlace alguno de los símbolos ha quedado sin definir. SECTION. Determina que los módulos objeto que se relacionan tras la palabra FILE estarán en el área de overlay abierta, pero no en un fichero independiente en disco. SECTION INTO. Igual que el anterior, pero en un fichero en disco. UPPERCASE. Convierte a mayúsculas todos los identificadores y símbolos. VERBOSE. Nos da información en pantalla de lo que está haciendo PLINK86. WIDTH. Determina el ancho en columnas del informe (MAP). WORKFILE. Sirve para direccionar el archivo temporal que usa el enlazador. III. Bases de datos. 1. Creación de una base de datos. Para crear un fichero de estructura vacia se usará el mandato CREATE. Para definir los distintos campos de la futura base de datos emplearemos APPEND BLANK (para añadir un registro en blanco) y REPLACE (para almacenar el contenido). CREATE Ejemplo_1: CREATE clientes USE clientes APPEND BLANK REPLACE FIELD_NAME WITH "CODIGO" REPLACE FIELD_TYPE WITH "C" REPLACE FIELD_LEN WITH 5 APPEND BLANK REPLACE FIELD_NAME WITH "NOMBRE" REPLACE FIELD_TYPE WITH "C" REPLACE FIELD_LEN WITH 30 CLOSE RETURN Las variables de entorno FIELD_NAME, FIELD_TYPE, FIELD_LEN y FIELD_DECIMALS tomarán el nombre de campo, el tipo de campo, la longitud de campo y las posiciones decimales, respectivamente. Una vez creada la estructura pasaremos a generar la base de datos propiamente dicha con CREATE FROM. CREATE FROM Ejemplo_2: CREATE CLIENTES FROM CLIENTES Tanto en la utilidad DOT porporcionada por Clipper como en el entorno Dbase podemos crear bases de datos sin necesidad de escribir programas. 2. Tipos y longitud de campos. Los distintos tipos de campos que podemos definir en una base de datos son: C - Caracter (1-254 caracteres alfanuméricos) N - Numérico (1-19 dígitos de entero.) (0-15 dígitos decimal y dos dígitos menor que entero) D - Fecha (8 dd-mm-aa) L - Lógico (1 carácter para valores lógicos: T,F,Y,N) M - Memo (10) Almacena dirección para acceder a fichero .DBT. 3. Usar una base de datos. Para usar una base de datos emplearemos la sentencia USE especificando el fichero de base de datos. Si existe un fichero memo asociado se abrirá, y si se indicó uno o más ficheros .NTX se activarán los índices correspondientes. También proporciona el alias adecuado. USE [INDEX {,}] [EXCLUSIVE] [ALIAS] El número máximo de ficheros índices asociados es 15. EXCLUSIVE se emplea para redes y posibilita la apertura de ficheros con uso exclusivo a un usuario. USE sin más, cierra el fichero del área activa. Ejemplo_1: USE CLIENTES 4. Modificar estructura. Para modificar la estructura de una base de datos se recomienda el uso de la sentencia MODIFY STRUCTURE propia de Dbase. Posibilita renombrar, suprimir y añadir campos, así como modificar el tipo y la longitud de los mismos. Con LIST STRUCTURE de Dbase listaremos la estructura de una base de datos. MODIFY STRUCTURE Ejemplo_1: USE CLIENTES MODIFY STRUCTURE Hay que tener precaución si existen registros en la base de datos ya que algunas modificaciones pueden vaciarnos el contenido de uno o más campos. 5. Añadir registros. APPEND BLANK añade un registro vacio a nuestro fichero en uso. El puntero de la base de datos se sitúa en el registro añadido. La sentencia REPLACE nos servirá para reemplazar el contenido de los campos. REPLACE [] [] WITH {,[] WITH } [FOR ][WHILE ] Ejemplo_1: USE CLIENTES APPEND BLANK REPLACE CODIGO WITH "00001" REPLACE NOMBRE WITH "Federico Torres" 6. Listar registros. LIST y DISPLAY sirven para visualizar, imprimir o enviar a un fichero de texto, un registro o conjuto de registros. LIST [OFF] [<ámbito>] [] [FOR ] [WHILE ] [TO PRINT/TO FILE ] DISPLAY [OFF] [<ámbito>] [] [FOR ] [WHILE ] [TO PRINT/TO FILE ] Ejemplo_1: USE CLIENTES LIST Ejemplo_2: USE CLIENTES LIST CODIGO Ejemplo_3: USE CLIENTES DISPLAY FOR CODIGO > "50000" TO PRINT 7. Puntero de registro. Clipper mantiene un puntero que indica el registro activo en cada momento. Tanto en Clipper con en Dbase podemos conocer la posición del puntero con la función RECNO(). En el ejemplo anterior al añadir el registro vacio el puntero se desplaza a la posición que ocupa este registro dentro de la base de datos. Podemos deducir que las sustituciones se efectuarán ahí. Existen mandatos que afectan únicamente al registro activo. El puntero se puede desplazar usando la sentencias GO y SKIP en sus distintas modalidades: GO (ir al registo indicado) GO TOP (ir al registro número 1) GO BOTTOM (ir último registro) SKIP (ir al siguiente registro) SKIP -1 (ir al anterior) etc. 8. Editar un registro. La edición de registros es posible realizarla con varias sentencias. No es posible usar EDIT de Dbase III. En Clipper la edición de un registro puede realizarse con un grupo de GET's, aunque existen otras sentencias más avanzada como DBEDIT, MEMOEDIT, etc. @ , [SAY [PICTURE ]] [GET [PICTURE ] [RANGE , ] [VALID ]] PICTURE expresa un formato para la entrada/salida de información. RANGE sirve para validar datos numéricos entre los dos límites especificados. VALID se emplea para expresiones genéricas de validación. será la condición de validación. Ejemplo_1: USE CLIENTES GO 3 @ 1,1 SAY " Modifique codigo: " GET CODIGO @ 2,1 SAY " Modifique nombre: " GET NOMBRE READ Ejemplo_2: USE ALUMNOS GO TOP @ 1,1 SAY NOMBRE @ 2,1 SAY " Modifique edad: " GET EDAD RANGE 1,7 @ 3,1 SAY " Modifique sexo: " GET SEXO PICTURE "!"; VALID(SEXO$"VH") READ READ lee las variables GET's 9. Marcar un registro. Clipper igual que Dbase permite marcar registros para posteriormente, si procede, borrarlos definitivamente. Esto se hará con la sentencia DELETE que marca con un asterisco el registro activo. Puede marcarse más de un registro usando la claúsulas FOR o WHILE. DELETE [ámbito] [FOR ] [WHILE ] [ámbito] RECORD Marcar el registro especificado. ALL Marcar todos los registros Ejemplo_1: USE CLIENTES GO 1 DELETE Ejemplo_2: USE CLIENTES DELETE ALL Ejemplo_3: USE CLIENTES DELETE RECORD 10 Ejemplo_4: USE CLIENTES DELETE FOR NOMBRE = "María" 10. Borrar registros. Una vez marcado un registro es posible borrarlo con PACK PACK Ejemplo_1: USE CLIENTES DELETE RECORD 10 PACK 11. Desmarcar registros. La sentencia RECALL suprime las marcas puestas con DELETE RECALL [<ámbito>] [FOR ] [WHILE ] Ejemplo_1: USE CLIENTES RECALL RECORD 10 12. Borrar todos los registros. ZAP borra todos los registros marcados o no de una base de datos manteniendo su estructura. 13. Localizar registros. LOCATE permite localizar uno o más registros. En el momento que encuentra un registro el puntero de registro se coloca en él, esperando a un CONTINUE para continuar con la búsqueda. La búsqueda es secuencial por lo que si el tamaño de la base de datos es considerable puede resultar lento este proceso. LOCATE [<ámbito>] [FOR ] [WHILE ] CONTINUE Ejemplo_1: USE CLIENTES LOCATE FOR CODIGO > "10000" .AND. NOMBRE = "JOSE" 14. Operaciones con bases de datos. En una base de datos es posible contar registros, y realizar operaciones de suma y media aritmética. COUNT nos servirá para contar, SUM para sumar el contenido de campos numéricos y AVERAGE para calcular la media aritmética. COUNT [<ámbito>] [FOR ] [WHILE ] TO COUNT cuenta el número de registros que cumplen una determinada condición especificada. Dicha información ha de depositarse obligatoriamente en una variable numérica de memoria. <ámbito> es por defecto ALL SUM [<ámbito>] TO SUM suma uno o más campos depositando el resultado en una variable. AVERAGE [<ámbito>} TO AVERAGE calcula la media aritmética de uno o más campos. 15. Exportar. COPY TO Copia toda la base de datos en curso o sólo una parte a un nuevo archivo. COPY TO [<ámbito> [FIELDS ] [FOR ] [WHILE ] [SDF/DELIMITED/DELIMITED WITH ] - Es el nombre del nuevo archivo. <ámbito> - Determina la porción del archivo a copiar, por defecto es ALL (todo). FIELDS - Son los campos a copiar a la nueva base de datos. FOR/WHILE - Especifican la condición a cumplir. SDF - Especifica que el archivo de salida será con formato ASCII, con campos de longitud fija. DELIMITED - Formato para el archivo de salida ASCII, con campos de longitud variable y separados por comas. Si se desea pueden separase con espacios (BLANK), o con cualquier otro delimitador. Ejemplo_1: USE HELP COPY TO HELP.TXT SDF 16. Importar. APPEND FROM añade datos a la base en uso a partir de otro archivo que puede ser que no sea (.DBF). Podemos seleccionar loa datos a añadir mediante cualificadores. APPEND [ [FIELDS ] FROM [FOR ] [WHILE ] [SDF/DELIMITED [WITH BLANK/]] - Registros a agregar por defecto son todos. - Lista de campos a agregar. - Nombre del archivo origen. Por defecto, (.DBF), FOR/WHILE - Indican las condiciones que han de cumplir los registros para ser agregados. SDF - Identifca archivos ASCII. DELIMITED - Archivos ASCII con separación de campos con comas. DELIMITED WITH BLANK - Campos separados por un espacio DELIMITED WITH - Podemos especificarlo. Ejemplo_1: USE CLIENTES APPEND FROM VENTAS FOR PEDIDO > 5000 IV. Indices. 1. Crear ficheros índices. INDEX indiza un fichero de datos por el campo que le indiquemos. Crea en disco un fichero con la extensión .NTX. Pueden usarse también claves múltiples formada por la suma de varios campos, de partes de campos, expresiones y campos, etc, pero recuerde que el máximo número de caracteres de una clave será de 250. Para sumar campos hemos de tener siempre la precaución de convertirlos previamente a cadena. Los ficheros índices no son compatibles con los de Dbase III. Cuando un índice está abierto con su correspondiente base de datos se actualiza de forma automática. Una base de datos puede tener asociados como máximo 15 ficheros índices. Los registros que se encuentran marcados para ser borrados también forman parte del índice. INDEX ON {+} TO Ejemplo_1: USE CLIENTE INDEX ON NOMBRE TO NOMCLI Ejemplo_2: USE CLIENTE INDEX ON NOMBRE+DTOS(FECHA) TO FECCLI 2. Activar fichero índice. Como vimos anteriormente en el capítulo I, la activación de índices se realiza con USE. Se pueden especificar uno o más ficheros índices. Con SET ORDER TO se establecerá el índice activo. Esta sentencia altera el ordenamiento de la declaración inicial de índices hecha con USE...INDEX. Si indicamos SET ORDER TO 0 se desactivan todos los ficheros índices. No obstante, la importancia de este mandato estriba en que no tenemos necesidad de abrirlos de nuevo para activarlos. SER ORDER TO es el número de índice activo. Puede valer de 0 a 15. Ejemplo_1: NOMBRE = SPACE(20) FECHA = CTOD(SPACE(8)) USE CLIENTES INDEX NOMCLI,FECCLI,DOMCLI SET ORDER TO 2 LIST NOMBRE,FECHA TO PRINT 3. Búsqueda por índice. SEEK busca una expresión en una clave índice. SEEK Ejemplo_1: USE CLIENTES INDEX NOMCLI SEEK "LUIS MARIN" IF FOUND() @ 4,4 SAY FECHA @ 5,4 SAY VENTAS ELSE @ 10,1 SAY "No existe CLIENTE" ENDIF 4. Area de trabajo. SELECT selecciona las diferentes áreas de trabajo en que vamos a situar nuestros ficheros de datos. El último SELECT que enunciemos es aquel que contendrá el fichero activo. SELECT <área>/ <área> es un número comprendido entre 0 y 254. es el nombre de un área de trabajo existente si hay un fichero abierto en ese área. Se puede hacer referencia a las 10 primeras áreas de trabajo con las letras A a J. En Clipper se pueden utilizar 255 áreas de trabajo. En cada área de trabajo se pueden abrir un fichero de base de datos y 15 ficheros índices como máximo asociados a él. Ejemplo_1: SELECT 1 USE CLIENTES SELECT 2 USE DIARIOVTAS Ejemplo_2: SELECT 1 USE CLIENTES INDEX NOMCLI ALIAS CLI SELECT 2 USE DIARIOVTAS INDEX TOTALVTAS ALIAS DIA ... ... SELECT CLI SEEK "LUIS PEREZ" IF FOUND() CODCLI = CODIGO SELECT DIA SEEK CODCLI IF FOUND() @ 10,10 SAY PTASVENTAS ENDIF ENDIF 5. Cierre de ficheros. CLOSE cierra el fichero de base de datos abierto en el área activa así como sus índices asociados. CLOSE DATABASES cierra todos los ficheros de todas las áreas de trabajo, así como sus correspondientes índices. CLOSE INDEX cierra todos los índices del área de trabajo activa. CLOSE ALL cierra todos los ficheros abiertos. V. Variables de memoria. 1. Tipos de variables. Variable es un nombre asignado a una posición de memoria que se puede utilizar para almacenar un dato concreto. Los tipos de variables por el tipo de dato que contienen son: -numéricas -alfanuméricas -lógicas -fechas 2. Nombrar una variable de memoria. Independientemente del tipo a que pertenezca una variable, debe asignársele un nombre, que puede ser de uno a diez caracteres pueden ser una combinación de letras, dígitos o signo de subrayado. El primer carácter de una variable de memoria debe ser una letra. Los siguientes nombres son nombres de variables de memoria permitidos. COMPRAS Precio I_V_A MES_1_A_6 No debe utilizarse el mismo nombre para una variable y para un campo en la misma aplicación. 3. Introducción de datos en una variable. Las instrucciones STORE y el signo igual (=) pueden emplearse indistintamente para la asignación de datos a variables de memoria. STORE TO = Ejemplo_1: PTAS = 0 FECHA_ALTA = CTOD(SPACE(8)) STORE "enero" TO MES 4. Visualización de variables. Para visualizar el contenido de una variable puede usarse la interrogación (?) con los siguientes formatos: ? ?? Ejemplo_1: ? MES ?? "HOLA" 5. Expresiones. Además de servir como depósito temporal, las variables de memoria pueden utilizarse en procesosde operaciones. Una variable de memoria puede ser incluida en una expresión para definir un procedimiento, para describir una condición en una instrucción o para servir como elemento de salida (resultado de una operación). Pueden utilizarse diferentes tipos de expresión. Una expresión puede incluir un campo de datos, una variable de memoria, una constante o una combinación de todo ello. Sin embargo, todos los elementos de una expresión deben ser del mismo tipo. La expresión más corriente es la expresión aritmética, que puede contener un valor, una variable de memoria, un campo numérico y una combinación de éstos unidos por uno o más operadores aritméticos. Las expresiones son útiles para realizar cálculos matemáticos. Puede utilizarse una expresión para asignar un valor a una variable de memoria o para reemplazar el contenido de un campo numérico con un nuevo valor. Cuando se incluye más de un operador aritmético en una expresión, ésta se valora de izquierda a derecha de acuerdo con siguiente sistema de prioridades: Prioridad máxima : ** ^ Prioridad secundaria: * / Baja prioridad : + - Se pueden utilizar paréntesis en una expresión para definir la secuencia de evaluación y suprimir el sistema normal de prioridades. El material dentro de los paréntesis siempre es evaluado previamente. Cuando haya paréntesis anidados es una expresión aritmética, la expresión del paréntesis interno es evaluado en primer lugar, luego se evalúa el paréntesis externo. Dentro de un paréntesis, los operadores se evalúan según el sistema de prioridades, de izquierda a derecha. 6. Declaración pública y privada. PUBLIC declara variables de memoria como globales o públicas. Estas pueden modificar su valor en cualquier parte del programa. PUBLIC PRIVATE declara de uso privado la variables de memoria especificadas. Estás pueden modificar su valor en partes de un programa. PRIVATE 7. Salvar y restaurar variables de memoria. SAVE TO salva en un fichero variables de memoria. SAVE TO [ALL [LIKE /EXCEPT ]] es el nombre del fichero donde se almacenarán las variables. Si no se especifica la extensión por defecto es .MEM. ALL salva en el fichero todas las variables existentes. LIKE salva en el fichero todas las variables cuya estructura sea semejante a la especificada en . Recuerde que puede hacer uso de los símbolos comodines: * y ?. EXCEPT salva todas las variables que no tengan una estructura semejante a . RESTORE FROM restaura desde disco el fichero de variables de memoria . Si se usa ADDITIVE no se borra el entorno de variables activo al restaurar. RESTORE FROM [ADDITIVE] Al restaurar las variables de memoria, éstas son privadas, a no ser que se especifiquen como públicas antes de restaurarlas y se utilice la claúsula ADDITIVE. Ejemplo_1: conf_cla = "1234" conf_dis = "A" conf_dir = "C:\GESTION\" conf_mar = 20 conf_col = "S" SAVE TO CONFIG ALL LIKE conf_* Ejemplo_2: RESTORE FROM CONFIG ADDITIVE clave = SPACE(4) @ 1,1 SAY "Teclear Clave: " GET clave READ IF clave = conf_cla ... ... ENDIF 8. Eliminar variables de memoria. RELEASE elemina de la vemoria las variables especificadas. RELEASE [ {,}] [ALL [LIKE] EXCEPT ]] .. es la lista de variables que se desean eliminar. ALL indica que sean eliminadas todas las variables existentes. ALL LIKE indica que sean eliminadas todas las variables cuya estructura sea semejante a la expresada en . Se pueden usar los comodines: * y ?. ALL EXCEPT indica que sean borradas todas las variables que no concuerden con la estructura expresada en . Ejemplo_1: conf_cla = "1234" conf_dis = "A" conf_dir = "C:\GESTION\" conf_mar = 20 conf_col = "S" RELEASE ALL 9. Macros. Las macros sirven en CLIPPER para forzar la sustitución de una variable por su valor en aquellos puntos de programa donde por si misma la variable no se traduciría. Cuando tras una macro se sigue algún tipo de expresión hemos de indicar al sistema que la macro termina con un punto (.). & Ejemplo_1: nombre = "lápiz" ? "Artículo: &nombre" Ejemplo_2: base = "CLIENTES" USE &base Ejemplo_3: filtro = "EDAD > 18 .AND. SEXO = 'V'" USE CLIENTES LIST NOMBRE FOR &filtro 10. Operadores y valores lógicos. a) Operadores lógicos. .AND. (Y además) .OR. (O además) .NOT. (Negación) ! (Negación) Ejemplo_1: IF EDAD > 18 .AND. EDAD < 65 PAGAR = 10000 ENDIF Ejemplo_2: IF !FILE("CLIENTES.DBF") @ 1,1 SAY " Error no encuentra base de datos " ENDIF b) Valores lógicos. Representan pares de valores. .T. (Verdadero) .F. (Valso) .Y. (Si) .N. (No) Ejemplo_1: JUBILADO = .Y. IF JUBILADO .. ENDIF 11. Operadores relacionales. = (Igual que) == (Exactamente igual que) > (Mayor que) < (Menor que) >= (Mayor igual que) <= (Menor igual que) <> # (Distinto) Ejemplo_1: DO CASE CASE MES = 1 .... .... CASE MES >= 2 .... .... ENDIF VI. Operaciones de entrada y salida. 1. Entrada, máscara, validación y rango. @...SAY/GET muestra en las coordenadas reseñadas el contenido de la expresión que sigue a SAY, carga valores a los campos o las variables de memoria que siguen a GET (hasta ser leídos por READ.) Las variables usadas han de ser declaradas previamente. @ . [SAY [PICTURE ]] [GET [PICTURE ] [RANGE ,] [VALID ]] PICTURE expresa un formato para la entrada/salida de información. Este formato puede estar controlado por plantillas o funciones. Las primeras se aplican carácter a carácter y las segundas afectan a toda la claúsula. Las funciones irán precedidas del símbolo @. RANGE sirve para validar datos numéricos, indicando un límite inferior y un superior. Entre estos límites deberá estar comprendido en dato numérico para que sea válido. VALID se emplea para expresiones genéricas de validación. será la condición de validación. Ejemplo_1: nombre = SPACE(20) @ 2,1 SAY "Teclear nombre: " GET nombre PICTURE "@!" READ Ejemplo_2: edad = 0 @ 3,3 SAY "Teclear edad: " GET edad PICTURE "999" RANGE 19,125 READ Ejemplo_3: resp = SPACE(1) @ 5,5 say "¿ GRABAR ? " GET resp "!" VALID(resp$"SN") READ Ejemplo_4: importe = 0 @ 5,5 SAY " TECLEAR IMPORTE: " GET importe PICTURE "@E9,999.99" READ Símbolos usados por PICTURE A Hace que un GET sólo admita letras L Idem sólo para valores lógicos. Y Permite sólo "Y" o "N" N Idem sólo letras y caracteres X Idem cualquier carácter 9 Permite que sólo se visualicen dígitos # Idem sólo letras, espacios y signos ! Idem sólo letras mayúsculas , Representa los miles en los datos numéricos $ Hace que se muestren $ para rellenar una cifra por la izquierda. * Idem con * Símbolos utilizados como funciones <"@") C Indica CR después de un número positivo X Indica DB después de un número negativo ( Encierra con paréntesis números negativos con espacios a la izquierda. ) Idem sin espacios a la izquierda B Justifica los números por la izquierda A Hacen que sólo se puedan captar caracteres alfabéticos ! Hace que sólo se permitan letras mayúsculas R Permite insertar caracteres que aparecerán solamente en pantalla, no almacenándose en la variable E Convierte los números al formato europeo D Visualiza las fechas en el formato especificado con SET DATE K Borra el contenido de la variable si no se pulsa primero un carácter de control del cursor S Hace scroll horizontal con la variable Z Hace que los valores cero en un campo numérico se representen como blancos. ACCEPT acepta datos alfanuméricos por pantalla y los carga en . No es necesario haber declarado previamente . ACCEPT [] TO Ejemplo_1: ACCEPT "Escribe tu nombre" TO nombre INPUT Acepta datos por pantalla. Los datos han de ser identificados con sus correspondientes indicadores, así, por ejemplo, una cadena de carácteres deberá escribirse entrecomillada, mientras que esto no será preciso con un número. INPUT [] TO Ejemplo_1: INPUT " Edad " TO edad WAIT detiene la ejecución del programa y espera la pulsación de una tecla. WAIT [] [TO ] es una cadena de caracteres que se visualizarán a modo de información. Si se omite, aparecerá en pantalla: Press any key to continue... es una variable que contendrá el carácter qu se ha pulsado 2. Pausa. INKEY() detiene por un tiempo el flujo del programa y devuelve el valor de la tecla que se está pulsando. INKEY([]) indica el número de segundos de espera. Si es igual a cero detiene el programa y espera que pulsemos una tecla cuyo valor ASCII toma. Ejemplo_1: tecla = INKEY(0) Pulsando [enter], tecla = 13 3. Conocer la última tecla pulsada. LASTKEY() devuelve el valor de la última tecla pulsada. Dicho valor es un número que se corresponde con el valor ASCII del carácter. Ejemplo_1: INKEY(0) DO CASE CASE LASTKEY() = 27 RETURN CASE CHR(LASTKEY()) = "+" ..... CASE LASTKEY() = 13 ..... ENDCASE 4. Salida. ?, ??, @ SAY, TEXT/ENDTEXT se emplean generalmente como instrucciones de salida (pantalla/impresora) para expresiones, cadenas, bloques de texto, etc. Ejemplo_1: TEXT ********************* ERROR ********************* ENDTEXT Ejemplo_2: a=4 b=5 c=3 ? (a*b)**c 5. Borrar pantalla. CLEAR borra la pantalla, manteniendo los atributos de color vigente, y libera todos los GET pendientes. Asimismo, posiciona el cursor en la posición 0,0 (posiciones verticales 0 a 24 / posiciones horizontales 0 a 79). @..CLEAR TO borra un área de pantalla. Ejemplo_1: @ 3,3 CLEAR TO 9,9 6. Dibujar un marco. @..TO dibuja un marco de línea sencilla en las coordenadas especificadas. Si se emplea la opción DOUBLE, el marco dibujado será de línea doble. @ , TO , [DOUBLE] 7. Dibujar una caja. @..BOX construye una caja entre las coordenadas indicadas y con los códigos ASCII especificados en . El orden de los caracteres es: 1. Esquina superior izquierda 2. Línea horizontal superior 3. Esquina superior derecha 4. Línea vertical derecha 5. Esquina inferior derecha 6. Línea horizontal inferior 7. Esquina inferior izquierda 8. Línea vertical izquierda 9. Carácter de relleno @ ,,, BOX Ejemplo_1: cadena = "+-+¦+-+¦¦" @ 1,1,10,10 BOX cadena 8. Hacer un menú. @..PROMPT facilita la creación de menús en nuestros programas. Cada opción se muestra con un PROMPT en una posición especifica de la pantalla y se le acompaña opcionalmente de un mensaje aclaratorio. @ , PROMPT [MESSAGE ] SET WRAP ON/OFF posibilita la rotación al alcanzar la primera o última opción. SET MESSAGE determina el número de fila donde aparecerán los mensajes de las distintas opciones. SET MESSAGE TO [ [CENTER/CENTRE]] CENTER/CENTRE muestra el mensaje en la fila especificada centrándolo. MENU TO sirve para leer el valor numérico que representa a la opción seleccionada. Dicho valor se asigna automáticamente y representa el número de orden de cada PROMPT. Ejemplo_1: SET WRAP ON SET MESSAGE TO 23 CENTER @ 1,1 PROMPT "ALTA " MESSAGE "Alta de usuarios " @ 2,1 PROMPT "BAJA " MESSAGE "Baja de usuarios " @ 3,1 PROMPT "LISTADO " MESSAGE "Listado DESDE/HASTA" MENU TO opcion DO CASE CASE opcion = 1 ..... CASE opcion = 2 ..... CASE opcion = 3 ..... ENDCASE 9. Salvar/Restaurar pantallas. SAVE SCREEN salva la pantalla actual así como su estructura de variables leídas y pendientes de leer. SAVE SCREEN [TO ] TO indica que la pantalla será almacenada en la variable de memoria . Esta variable será de tipo carácter. RESTORE SCREEN restaura una pantalla almacenada previamente RESTORE SCREEN [FROM ] SAVESCREEN() almacena una parte de la pantalla en una variable de memoria = SAVESCREEN(,,,) RESTSCREEN() restaura una área de una pantalla salvada previamente. RESTSCREEN(,,,,) Ejemplo_1: @ 2,3 SAY " -------- " @ 3,3 SAY " CLIENTES " @ 4,3 SAY " -------- " SAVE SCREEN TO panta CLEAR INKEY(0) RESTORE FROM panta RETURN Ejemplo_2: @ 2,3 SAY " -------- " @ 3,3 SAY " CLIENTES " @ 4,3 SAY " -------- " panta = SAVESCREEN(3,3,4,12) CLEAR INKEY(0) RESTSCREEN(5,5,6,14,panta) VII. Bifurcación y bucles. 1. IF (Si cumple condición...). Bifurca un programa entre una condición y su opuesta. Puede usarse como mandato o como función. En el primer caso, lo que hace es ejecutar alternativamente unas instrucciones u otras y en el segundo devolver alternativamente un valor u otro. La sintáxis de la función puede ser IF() o IIF(). Mandato: IF [ELSEIF ] [ELSE ] ENDIF Función: IIF/IF(,<.T.>,<.F.>) es la condición que se desea establecer ELSEIF reconoce órdenes cuando se cumple la que condición expresada. ELSE realiza las distintas órdenes que se indican cuando la condición es falsa. <.T.> Indica la expresión a evaluar para el valor verdadero de la condición. <.F.> Indica la expresión a evaluar para el valor falso de la condición. Ejemplo_1: IF sexo = "V" peso = 20 ELSE peso = 12 ENDIF Ejemplo_2: IF porcentaje > 10 porcentaje = porcentaje - 2 ENDIF Ejemplo_3: salario = salario + IIF(ho>80,80000+1500*(ho-80),80000) 2. DO CASE (En caso de cumplir condición...). Bifurca la ejecución de un programa según las diferentes condiciones especificadas. OTHERWISE representa todos los casos que no cumplen ninguna condición. DO CASE CASE CASE OTHERWISE ENDCASE son las diferentes condiciones. Ejemplo_1: DO CASE CASE velocidad > 180 consumo = 4 CASE velocidad > 120 consumo = 3 CASE velocidad > 80 consumo = 2 OTHERWISE consumo = 1 ENDCASE 3. FOR..NEXT (Desde un valor hasta alcanzar otro). Permite la creación de una estructura de bucle que se ejecuta para un rango de valores determinados de forma ascendente o descendente. FOR TO [STEP ] [EXIT] [LOOP] NEXT es el valor inicial. Este valor se asignará a una variable de control. es el valor final del bucle. STEP indica el incremento o decremento de la variable. Por defecto incrementa en 1. EXIT detiene el bucle pasando el control a la sentencia posterior a NEXT. LOOP pasa de nuevo el control al comienzo del bucle, sin necesidad de que se llegue a NEXT. Ejemplo_1: FOR N=1 TO 10 CUADRADO = N**N ? CUADRADO NEXT 4. DO WHILE (Hacer mientras que cumpla condición...). DO WHILE realiza una estructura de bucle mientras se cumpla la condición especificada. DO WHILE comienza y continúa el bucle si se cumple la condición. ENDDO devuelve el control al principio. DO WHILE [EXIT] [LOOP] ENDDO es la condición que se debe cumplir para que se ejecute el bucle. LOOP manda todo el proceso de nuevo al comienzo del bucle, sin necesidad de que se llegue al final, es decir a ENDDO. EXIT fuerza a que se pare el proceso y sale del bucle aunque la condición no haya cesado de darse. Ejemplo_1: DO WHILE .T. @ 2,2 PROMPT "CLIENTES" @ 3,2 PROMPT "PROVEEDORES" MENU TO opcion DO CASE CASE opcion = 1 DO CLI CASE opcion = 2 DO PRO CASE LASTKEY() = 27 CLEAR RETURN ENDCASE ENDDO Ejemplo_2: C=0 DO WHILE C<100 C=C+1 ? C ENDDO VIII. Fin. 1. Retornar. RETURN termina un procedimiento, programa, o función, devolviendo el control al procedimiento de llamada o al DOS. Ejemplo_1: DO BORRAR WITH 2,2,20,20 .. .. .. QUIT PROCEDURE BORRAR PARAMETERS X1,Y1,X2,Y2 @ X1,Y1 CLEAR TO X2,Y2 RETURN 2. Terminar. QUIT termina la ejecución de un programa devolviendo el control al DOS. Este mandato realiza la misma función que CANCEL o que RETURN en el procedimiento de más alto nivel. Ejemplo_1: USE FICHERO INDEX INDICE SEEK CLAVE IF FOUND() DO PROCESO ELSE QUIT ENDIF 3. Cancelar. CANCEL cancela la ejecución de un programa o procedimiento, devolviendo el control al sistema operativo. Ejemplo_1: clave = SPACE(4) @ 4,4 SAY "Clave: " GET clave PICTURE "@!" READ IF clave # "9876" CANCEL ELSE ENDIF IX. Mantenimiento de ficheros. 1. Renombrar fichero. RENAME renombra ficheros. Es el equivalente al RENAME del DOS ,aunque su sintaxis es algo distinta. RENAME TO es el nombre inicial del fichero y es el nuevo nuevo. Tanto como deben incluir la extesión del fichero. Ejemplo_1: RENAME CLIENTES.DBF TO CLIENTES.DAT USE CLIENTES.DAT 2. Copiar ficheros. COPY FILE copia el contenido de en . No sirven con este mandato los comodines para copiar varios ficheros en bloque. Salvo esta excepción funciona igual que el COPY del DOS. Es importante recordar que siempre hemos de proporcionarle las vías donde buscar los ficheros a copiar y donde queremos copiarlos. Si no se le especifica esta última el fichero se deposita en el directorio de trabajo. COPY FILE TO es el fichero origen y el fichero destino. Ejemplo_1: COPY FILE CLIENTES.DAT TO CLIENTES.DBF 3. Borrar ficheros. DELETE FILE y ERASE borran ficheros. Al especificar el nombre del fichero a borrar debe figurar también su extensión. Antes de usar este comando es necesario cerrar el fichero a borrar con el comando CLOSE. ERASE/DELETE FILE Ejemplo_1: USE CLIENTES .. .. CLOSE DATABASES DELETE FILE CLIENTES.DBF 4. LLamada al Dos. Además de las órdenes elementales de mantenimiento de ficheros vistas anteriormente, existe la posibilidad de invocar cualquiera del DOS con RUN o !. Por ejemplo, para salir temporalmente de un programa podemos incluir un RUN COMMAND.COM y regresar con EXIT. RUN ! Ejemplo_1: RUN CHKDSK > CHEQDIS.TXT 5. Comprobar la existencia de un fichero. Antes de realizar cualquier operación con un fichero podemos comprobar su existencia con la función FILE() que nos retornará un verdadero (.T.) o un falso (.F.). FILE() Ejemplo_1: IF FILE("CLIENTES.DBF") SORT ON NOMBRE TO CLISORT DELETE FILE CLIENTES.DBF ENDIF X. Procedimientos y funciones. 1. Procedimiento. PROCEDURE indica el principio de un procedimiento. PROCEDURE <órdenes> [RETURN] - Debe de empezar con una letra y sólo evalúa los 10 primeros caracteres. RETURN - Es aconsejable su uso para determinar el fin de un procedimiento, aunque no necesario, ya que detecta el fin al encontrar otro procedure o una marca de fin de archivo. Ejemplo_1: CLEAR DO FONDO INKEY(0) RETURN PROCEDURE Fondo FOR I=0 TO 24 @ I, 0 SAY REPLICATE("¦", 80 ) NEXT RETURN 2. LLamada a un procedimiento. DO ejecuta un procedimiento escrito en Clipper, C o ensamblador, pasándole parámetros (hasta 128) con WITH. DO [WITH ] Ejemplo_1: PROCEDURE LISTACURSOS IF !ISPRINTER() DO MSGIMPRESORA ENDIF * órdenes ... RETURN PROCEDURE MSGIMPRESORA CLEAR @ 9, 28 TO 12, 51 @ 10,30 SAY "CONECTE LA IMPRESORA" @ 11,32 SAY "Y PULSE UNA TECLA" INKEY(0) RETURN 3. Creación de un fichero de procedimientos. SET PROCEDURE Activa los archivos de procedimientos especificados. SET PROCEDURE TO [ ] - Si se omite la extensión, se asume que es (.PRG). Ejemplo_1: SET PROCEDURE TO CLIENTES SET PROCEDURE TO PROVEED SET PROCEDURE TO MATERIAL 4. Nombre del procedimiento y número de línea. PROCNAME() indica el nombre del procedimiento o programa que estamos ejecutando. PROCNAME() Ejemplo_1: ? "Procedimiento en uso : ", procname() PROCLINE() Devuelve el número de la línea del código fuente en curso del programa. Siempre que no le hayamos indicado al compilador que no numere las líneas. PROCLINE() Ejemplo_1: ? procline(), "Linea ", cLinea 5. Creación de una función. FUNCTION Declara una función definida por el usuario escrita en Clipper. FUNCTION RETURN - Solo acepta los diez primeros caracteres. - Es obligatorio la devolución de un valor. Para llamar a una función de usuario, proceda del siguiente modo: función( ) Los parámetros se pasan por valor, exceptuando los arrays, o si el parámetros es precedido por una arroba (@), entonces es pasado por referencia. Ejemplo_1: CLEAR @ 24,0 SAY ISBISIESTO( DATE() ) RETURN FUNCTION ISBISIESTO PARAMETERS DFECHA PRIVATE DANY, CCADENA, LDEVUELVE DANY = YEAR( DFECHA ) CCADENA = CTOD( "29-02-" + STR(DANY)) IF DOW(CCADENA)=0 LDEVUELVE = .F. ELSE LDEVUELVE = .T. ENDIF RETURN LDEVUELVE 6. Conocer el número de parámetros. PCOUNT() Determina el número de parámetros pasados a un procedimiento o función definida por el usuario. PCOUNT() Ejemplo_1: PROCEDURE EDITOR PARAMETERS CFICHERO IF PCOUNT() = 0 @ 24,0 SAY "INDIQUE EL FICHERO: " GET CFICHERO READ ENDIF XI. Tablas. 1 Declaración tablas. Una tabla es un área de memoria que puede reservarse para contener un grupo de datos. Una tabla consta de un identificativo o nombre y un número definible de posiciones (de 1 a 1024 en Clipper '87). Estas posiciones pueden contener datos numéricos, alfabéticos, fechas, etc. Para acceder a uno de los datos contenido en una tabla se hará indicando el número de posición que ocupa. Existen varias funciones que posibilitan realizar operaciones en una tabla tales como añadir nuevos datos, eliminar datos, rellenar, etc. Este tipo de estructuras de memoria se utilizan como soporte temporal de los datos. DECLARE declara una o más áreas de memoria (arrays) con una longitud específica. Antes de poder realizar cualquier operación con una tabla debemos declararla. DECLARE []{,[]...} es el nombre de la tabla es la longitud de la tabla (1-1024) Ejemplo_1: DECLARE PROVINCIA[8] PROVINCIA[1] = "ALMERIA" PROVINCIA[2] = "CADIZ " PROVINCIA[3] = "CORDOBA" .... Ejemplo_2: numero = 8 DECLARE PROVINCIA[numero] Ejemplo_3: tipo = "FICHA" numero = "01" tabla = tipo+numero DECLARE &tabla[4] &tabla[1] = "ANDALUCIA" &tabla[2] = 8 &tabla[3] = .T. &tabla[4] = CTOD("01/01/92") 2 Longitud. LEN es una función que devuelve el número de elementos que tiene una tabla, o lo que es lo mismo la longitud de la tabla indicada. LEN() - Nombre de la tabla Ejemplo_1: DECLARE PROVINCIA[8] ? LEN(PROVINCIA) 3 Insertar. La inserción de nuevos elementos en una tabla es posible mediante la función AINS indicándose el nombre de la tabla y la posición donde se desea insertar el nuevo elemento. Automáticamente, el elemento insertado desplazará a los posteriores en una posición y el último se perderá. AINS(,) - Nombre de la tabla - Posición elemento Ejemplo_1: DECLARE NOMBRE[3] NOMBRE[1] = "LUIS" NOMBRE[2] = "MARIA" NOMBRE[3] = "CARLOS" AINS(NOMBRE,2) NOMBRE[2] = "MANUEL" ? NOMBRE[1] ? NOMBRE[2] ? NOMBRE[3] 4 Suprimir. ADEL suprime elementos en una tabla redimensionándola. ADEL(,) - Nombre de la tabla - Posición elemento Ejemplo_1: DECLARE NOMBRE[3] NOMBRE[1] = "LUIS" NOMBRE[2] = "MARIA" NOMBRE[3] = "CARLOS" ADEL(NOMBRE,2) ? NOMBRE[1] ? NOMBRE[2] 5 Copiar. La copia de un elemento o grupo de elementos de una tabla a otra tabla la realiza la función ACOPY, debiendo indicarse la tabla origen, la tabla destino, la posición inicial de la tabla origen, el nº de elementos a copiar y el elemento de la tabla destino donde ha de comenzarse la copia. ACOPY(,[, [,[,]]]) - Nombre de la tabla origen - Nombre de la tabla destino - Posición origen en tabla origen a copiar - Número de elementos a copiar desde - Elemento destino a comenzar copia Ejemplo_1: DECLARE TABLA_A[2],TABLA_B[2] TABLA_A[1] = "LUIS" TABLA_A[2] = "MARIA" ACOPY(TABLA_A,TABLA_B) ? TABLA_B[1] ? TABLA_B[2] Ejemplo_2: DECLARE TABLA_A[2],TABLA_B[3] TABLA_A[1] = "A" TABLA_A[2] = "B" ACOPY(TABLA_A,TABLA_B,1,1,3) ? TABLA_B[3] 6 Rellenar. AFILL rellena uno o más elementos con la expresión indicada. AFILL(,[,[,]]) - Nombre de la tabla - Expresión con la que se rellenar la tabla - Posición donde comenzar a rellenar - Número de elementos a rellenar desde Ejemplo_1: DECLARE TLF[2] TLF[1] = "433-23-23" TLF[2] = "433-23-24" AFILL(TLF,"000-00-00",2,1) ? TLF[1] ? TLF[2] 7 Directorio. ADIR accede al directorio del disco almacenado en tablas información relativa a los ficheros y directorios. ADIR( [, [, [, [, [,]]]]]) - máscaras posibles en DOS (*/?) o nombre fichero. - Es la tabla que se rellenar con los nombres de ficheros reseñados en . Tipo C. - Idem. para tamaño en bytes de fichero. Tipo N. - Idem. para fechas. Tipo D - Idem. para horas. Tipo C - Idem. para atributos. Tipo C Atributos: A - Fichero archivo D - Directorio H - Oculto R - Sólo Lectura S - Sistema Ejemplo_1: fil_prg = ADIR("*.PRG") Ejemplo_2: DECLARE TABLA[ADIR("*.PRG")] Ejemplo_3: fil_sec = ADIR("*.sec") DECLARE NOMBRE[fil_sec],FECHA[fil_sec] ADIR("*.sec",NOMBRE,"",FECHA) FOR n=1 TO fil_sec fil_del = NOMBRE[n] IF FECHA[n] < CTOD("01/01/92") DELETE FILE &fil_del ENDIF NEXT 8 Estructura. La estructura de una base de datos puede conocerse mediante la función AFIELDS. Los nombres de campos, tipo, longitud, etc. pueden almacenarse en tablas para el posterior tratamiento. AFIELDS( [, [, [, ]]]]) - Tabla que contendrá nombre de campos. - Tabla que contendrá tipo de campos. - Tabla que contendrá longitud de campos. - Tabla que contendrá número posiciones decima les. Ejemplo_1: USE base num_cam = FCOUNT() DECLARE NOMBRE[num_cam],TIPO[num_cam] AFIELDS(NOMBRE,TIPO) FOR n=1 TO num_cam ? NOMBRE[n] ? TIPO[n] NEXT 9 Menú. ACHOICE es una función que permite generar un menú de persiana con los elementos de una tabla en las posiciones de pantalla que se indiquen. Devuelve un valor de tipo numérico que se corresponde con el número de posición del elemento seleccionado. Si el valor es 0 no se seleccionó ningún elemento. ACHOICE(,,,, [,[,[,[,]]]]) - Coordenada X1 de pantalla - Coordenada Y1 de pantalla - Coordenada X2 de pantalla - Coordenada Y2 de pantalla - tabla que contendrá elementos - tabla que contendrá valores lógicos - Función de usuario. Pasa 3 parámetros: 1-modalidad: 0 Período de inactividad 1 Se intenta sobrepasar el principio 2 Se intenta sobrepasar el final 3 Espera de tecla específica 4 No se puede escoger una opción 2-elemento actual de la tabla 3-posición que ocupa el elemento en la ventana Valores retorno: 0 Suspende selección 1 Devuelve elemento cursor 2 Continúa proceso selección 3 Va al elemento cuyo primer carácter corresponde a la última tecla oprimida. Ejemplo_1: CLEAR SET SCOREBOARD OFF SET COLOR TO W+/N,,,,BG/N DECLARE MEN[3],LOG[3] MEN[1] = "ALTA " MEN[2] = "BAJA " MEN[3] = "MODIFICACION" LOG[1] = .T. LOG[2] = .T. LOG[3] = .T. clave = SPACE(2) @ 1,01 SAY "Clave: " GET clave PICTURE "XX" READ DO CASE CASE clave = "11" LOG[3] = .F. CASE clave = "22" LOG[2] = .F. OTHERWISE RETURN ENDCASE @ 4,1 TO 8,19 opcion = ACHOICE(5,2,7,18,MEN,LOG) 10 Base Datos DBEDIT visualiza el contenido de una base de datos en pantalla. Es una potente función que permite la edición de los datos sobre una ventana definida en pantalla. DBEDIT([[,,[,[]]]] [,],[,][,] [,][,] [,][,] [,]) posiciones. - Tabla de nombres de los campos. - Función de usuario. - Tabla de modelos de visualización. - Tabla de encabezados de columnas. - Tabla de separación de encabezados. - Tabla de separación de columnas. - Tabla de separación de pies. - Tabla de pies. Cuando se utiliza una función de usuario, DBEDIT() pasa de forma automática dos parámetros: 1-Estado actual de DBEDIT() dependiendo de la última tecla pulsada antes de llamar a la función. Las diferentes modalidades del estado son: 0 Inactividad 1 Se ha intentado sobrepasar el primer 2 Se ha intentado sobrepasar el último registro 3 El fichero de datos se encuentra vacio 4 Se ha pulsado una tecla específica 2-Posición que ocupa en la tabla el campo sobre el que nos encontramos posicionados. Valores de retorno: 0 Para salir de DBEDIT() 1 Para continuar la ejecución de DBEDIT() 2 Se vuelven a leer los datos nuevamente y se continúa DBEDIT() 3 Se activa la posibilidad de añadir nuevos registros Ejemplo_1: DECLARE TAB1[3],TAB2[3],TAB3[3],TAB4[3],TAB5[3],TAB6[3],TAB7[3] * Nombre campos TAB1[1]= "BAS_LOC" TAB1[2]= "BAS_PRO" TAB1[3]= "BAS_HAB" * Máscaras de visualización TAB2[1]= "XXXXXXX" TAB2[2]= "XXXXXXX" TAB2[3]= "999,999,999" * Encabezados de columna TAB3[1]= "LOCALIDAD" TAB3[2]= "PROVINCIA" TAB3[3]= "HABITANTES" * Separadores de encabezados TAB4[1]= "D" TAB4[2]= "D" TAB4[3]= "D" * Separadores de columnas TAB5[1]= "3" TAB5[2]= "3" TAB5[3]= "3" * Separadores de pies de página TAB6[1]= "D" TAB6[2]= "D" TAB6[3]= "D" * Pies de página TAB7[1]= "DPIE_1D" TAB7[2]= "DPIE_2D" TAB7[3]= "DPIE_3D" CLEAR USE BASE DBEDIT(1,1,7,40,TAB1,"",TAB2,TAB3,TAB4,TAB5,TAB6,TAB7) XII. Impresora. 1. Salida. SET DEVICE redirecciona las salidas por pantalla o por impresora. Por defecto es por pantalla. SET DEVICE TO SCREEN/PRINTER Ejemplo_1: PROCEDURE LISTACURSOS IF !ISPRINTER() && Impresora no conectada DO MSGIMPRESORA && Mensaje que conecte INKEY(0) ENDIF SET DEVICE TO PRINT USE CURSOS INDEX CURSOS GO TOP NPAGINA = 1 && Contador de páginas NFILA = 5 && Contador de filas @ 0,0 SAY CHR(15) && Impresión comprimida * CABECERA @ 1,0 SAY "LISTADO CURSOS" @ 1,115 SAY "PAGINA.: " + LTRIM(STR(NPAGINA)) @ 2,115 SAY "FECHA..: " + DTOC(DATE()) @ 3,0 SAY "Nº" @ 3,10 SAY "NOMBRE CURSO" @ 3,90 SAY "PRECIO" @ 4,0 SAY REPLICATE(CHR(196),132) * FIN CABECERA DO WHILE .NOT. EOF() @ NFILA, 0 SAY RECNO() PICTURE "9999" @ NFILA,10 SAY NOMCURSO @ NFILA,90 SAY PRECIO NFILA = NFILA + 1 IF NFILA = 50 EJECT && Salto de página NPAGINA = NPAGINA + 1 * REPETICION DE LA CABECERA NFILA = 5 ENDIF SKIP && Incrementamos registro ENDDO CLOSE EJECT @ 0,0 SAY CHR(18) && Desactivamos comprimido SET DEVICE TO SCREEN RETURN 2. Salto de página. EJECT realiza un salto de página en la impresora, y pone a cero los valores de la fila y la columna de la impresora. Use SETPRC() si necesita poner a cero los valores internos de fila y columna de la impresora sin enviar un salto de página. EJECT (Ver SET DEVICE, se incluye un ejemplo completo) 3. Conocer la situación del cabezal de impresión. PCOL() devuelve la columna en que se halla el cabezal de impresión. Retorna un número entero. Un EJECT (salto de página) coloca PCOL() a cero. PCOL() Ejemplo_1: SET DEVICE TO PRINTER @ 10, PCOL() + 10 SAY "BANCO : " + BANCO PROW() Devuelve la fila en que se haya el cabezal de impresión. Un salto de página, EJECT, coloca PROW() a cero. PROW() Ejemplo_1: SET DEVICE TO PRINTER @ PROW() + 1, 5 SAY "NOMBRE...: " + NOMBRE @ PROW() + 2, 5 SAY "DIRECCION: " + DIRECCION @ PROW() + 3, 5 SAY "POBLACION: " + POBLACION 4. Conocer si está preparada la impresora. ISPRINTER() Comprueba si la impresora esta lista para imprimir. Devuelve un valor lógico. ISPRINTER() Ejemplo_1: IF !ISPRINTER() && impresora no conectada @ 24,0 SAY "* CONECTE LA IMPRESORA, PULSE TECLA *" INKEY(0) ENDIF 5. Conocer si tiene papel. DOSERROR() determina el error producido por el DOS. Devuelve un valor numérico correspondiente a un error. Para la lista de errores consulte el manual de Nantucket. El error que genera la impresora por falta de papel es el número 28. DOSERROR() Ejemplo_1: IF DOSERROR() = 28 ? "Falta papel" ENDIF XIII. Funciones predefinidas. 1. De bases de datos. ALIAS() Devuelve el alias del área de trabajo. DELETED() Devuelve el estado de borrado del registro actual. EOF() Indica si se alcanza el final de un archivo. BOF() Indica si se alcanza el principio de un archivo. DBFILTER() Determina la expresión del filtro. FIELDNAME() Devuelve el nombre del campo especificado. HEADER() Determina la longitud de cabecera. RECSIZE() Determina la longitud del registro. FCOUNT() Devuelve el número de campos de la base. USED() Determina la base de datos en uso. FOUND() Devuelve verdadero si se encontró registro. RECNO() Devuelve el número de registro actual. LASTREC() Devuelve el número total de registros. 2. Numéricas. ABS() Devuelve el valor absoluto de una expresión. EXP() Calcula la exponencial. INT() Convierte cualquier expresión numérica en entero. LOG() Devuelve el logaritmo natural de un número. MIN() Devuelve el valor mínimo de dos números o dos fechas. MAX() Devuelve el valor máximo de dos números o dos fechas. SQRT() Devuelve la raiz cuadrada de un número positivo. ROUND() Devuelve el número redondeando con la cantidad de decimales especificados. VAL() Convierte una tira de caracteres a un valor numérico. 3. Cadenas. ASC() Devuelve el código ASCII del carácter izquierdo. AT() Devuelve un número que indica la posición de comienzo de una cadena de caracteres dentro de otra. CHR() Devuelve el carácter del código ASCII especificado. EMPTY() Devuelve verdad si la expresión está vacia. ISALPHA() Devuelve verdadero si el primer carácter es alfabético. ISLOWER() Determina si el carácter más a la izquierda de la cadena está en minúsculas. ISUPPER() Determina si el carácter más a la derecha de la cadena está en mayúsculas. LEN() Devuelve el número de caracteres que hay en una cadena LEFT() Devuelve el número de caracteres especificados desde la izquierda RIGHT() Devuelve el número de caracteres especificados desde la derecha. LTRIM() Elimina los espacios de la izquierda de una cadena. REPLICATE() Repite una expresión de caracteres. SPACE() Crea una cadena de espacios. STR() Convierte un valor numérico en cadena. STRTRAN() Busca y reemplaza dentro de una cadena de caracteres. SUBSTR() Extrae una parte específica de una cadena. TRANSFORM() Devuelve la tira de caracteres con el formato especificado. TRIM() Elimina los espacios de una cadena. 4. Fechas. CDOW() Devuelve el nombre de día de la semana de una fecha. CMONTH() Devuelve el nombre del mes de una fecha. CTOD() Convierte a fecha una cadena DATE() Devuelve la fecha del sistema DAY() Devuelve el número de día del mes de una fecha. DOW() Devuelve el número que representa el día de la semana de un valor fecha. DTOC() Convierte una fecha a cadena DTOS() Convierte una fecha a cadena tipo índice. MONTH() Devuelve un número que representa el mes. YEAR() Devuelve el valor número completo del año dada una fecha. 5. Hora. SECONDS() Devuelve la hora del sistema como segundos y centésimas. TIME() Devuelve la hora del sistema. SECS() Devuelve hora como segundos y centésimas. TSTGRING() Dada una cantidad de segundos nos devuelve dicha cantidad en formato hora. 6. Otras funciones de interés. FILE() Devuelve verdadero si existe el fichero especificado. GETE() Recupera el contenido de una variable de entorno DOS. TYPE() Devuelve el tipo de dato de la variable, expresión o campo. COL() Devuelve la columna actual del cursor. ROW() Devuelve la fila actual del cursor. CURDIR() Determina el directorio actual. DISKSPACE() Determina el número de bytes disponible en una unidad. MEMORY() Devuelve el espacio de memoria libre. READVAR() Devuelve el nombre de la variable de un GET/MENU. XIV. Ordenes SET. 1. Ordenes SET TO... SET ALTERNATE TO Crea un fichero de protocolo. SET COLOR TO Fija los colores de pantalla. SET DECIMALS TO Fija el número de los decimales a mostrar en los resultados de las funciones numéricas y cálculos. SET DEFAULT TO [:] Especifica la unidad y directorio por defecto para la creación de ficheros. SET DATE AMERICAN/ANSI/BRITISH/ITALIAN/FRENCH/GERMAN Fija el formato de los campos de fecha. AMERICAN mm/dd/aa ANSI aa.mm.dd BRITISH dd/mm/aa ITALIAN dd-mm-aa FREMCH dd/mm/aa GERMAN dd.mm.aa. SET DELIMITERS TO Especifica los caracteres empleados como delimitadores. SET DEVICE TO SCREEN/PRINTER Dirige el resultado de la instrucción @ al dispositivo elegido. SET FILTER TO Hace que la base de datos se vea como si sólo contuviese los registros que cumplen la condición. SET INDEX TO Abre el índice indicado y cierra los anteriores abiertos con la misma base de datos. SET KEY TO Asigna a una tecla un procedimiento. SET MARGIN TO Fija el margen izquierdo de la impresora. SET MESSAGE TO /CENTER Establece la línea donde se muestran los mensajes asociados a PROMPT. SET ORDER TO [] Establece que fichero índice es el principal. SET PATH TO [] Especifica la ruta de búsqueda que Clipper sigue en el acceso a ficheros. SET PRINTER TO [/] Determina la salida de la impresora. SET PROCEDURE TO [] Activa fichero de procedimientos. 2. Ordenes SET ON/OFF. SET ALTERNATE on/OFF Determina cuando la salida se envía al fichero. SET BELL on/OFF Determina cuándo suena la alarma durante la entradade datos. SET CENTURY on/OFF Determina si una fecha debe mostrar los dígitos del siglo o no. SET CONFIRM on/OFF Determina si se requiere pulsar return para cada GET. SET CONSOLE on/off Determina si la ejecución de los comandos utilizarán la pantalla como salida.. SET CURSOR on/off Muestra u oculta el cursor en la pantalla. SET DELETED on/OFF Oculta/procesa los registros marcados para borrar. SET DELIMITERS on/OFF Determina si se muestran los delimitadores SET ESCAPE ON/off Activa/Desactiva el desvío producido al pulsar la tecla ESC. SET INTENSITY ON/off Muestra los campos de entrada durante los GETs en color o en vídeo inverso. SET PRINT on/OFF Determina si la salida de los comandos @...SAY se mandarán a la impresora. SET SCOREBOARD ON/off Determinan si los mensajes de clipper aparecen en la línea 0. SET SOFTSEEK on/OFF Permite acceder al registro más próximo si el buscado no se encuentra. SET UNIQUE on/OFF Determina si sólo los registros con clave no repetida aparecerán en el índice. SET WRAP on/OFF Permite el movimiento circular entre opciones de menús. XV. Redes locales. 1. Bloqueo de registro. RLOCK() Bloquea/desbloquea el registro actual del área de trabajo en curso. Para utilizar en redes locales. RLOCK() / LOCK() 2. Bloqueo de ficheros. FLOCK() Bloquea/desbloquea un archivo abierto de base de datos dependiendo de su estado anterior. Sólo se utiliza en redes locales. FLOCK() 3. Desbloqueo. UNLOCK Desactiva el bloqueo de los archivos o registros bloqueados por el #ltimo usuario. UNLOCK [ALL] ALL - Quita todos los bloqueos en curso de todas las áreas de trabajo. 4. Uso exclusivo de ficheros. SET EXCLUSIVE Permite el uso exclusivo o no de archivos de base de datos, índices y campos memos, en redes locales. Por defecto esta en ON. SET EXCLUSIVE ON/off