Por Antonio Suárez Jiménez

Introducción.

A principio de los años ochenta, DBASE II hizo su aparición de la mano de George Tate (1943-1984) y su empresa Ashton-Tate. Esta nueva herramienta se presentaba en el emergente mundo de los microordenadores con la intención de facilitar la gestión de las bases de datos.

Evidentemente, los sistemas de gestión de bases de datos existían desde mucho antes, sobre todo, desarrollados para grandes sistemas, pero la cuestión estaba en cubrir una carencia que más tarde o más temprano debía ser atendida por los ingenieros de software y que era esperada ansiosamente por el creciente número de usuarios de los ordenadores personales.

El sistema de gestión de bases de datos había que diseñarse no exclusivamente como un entorno de programación, semejante a otros entornos o lenguajes con capacidad de tratamiento de grandes masas de datos. Este debía posibilitar la ejecución interactiva de instrucciones, ser amigable, accesible por usuarios no programadores, y debía estar formado por unas instrucciones potentes y fáciles de memorizar.

(LA PRIMERA DE LAS VERSIONES DE DBASE II SE UTILIZÓ CON EL SISTEMA OPERATIVO CP/M, SIGUIÉNDOLE OTRAS COMO LA 2.4 DE SEPTIEMBRE DE 1983 BAJO DOS 1.1 Y 2.0).

También, a principio de los ochenta se comienza a utilizar entre los usuarios de micros una nueva terminología informática de bases de datos, ésta era más familiar en otros ambientes informáticos y definía con precisión los conceptos más básicos:

  • Una base de datos puede definirse como la agrupación útil y organizada de información.
  • Bases de datos relacionales. Este tipo de estructura define relaciones entre los datos en una base de datos. Un modelo simple organiza la base de datos de igual forma que podemos definir una tabla de dos dimensiones (filas y columnas). Los datos de una fila (registro) se subdividen en columnas (campos). A cada fila se la asigna un número (nº de registro) que representa el orden en que será almacenado el registro en la base de datos. A las distintas columnas se le asignará un nombre de campo. Con esta estructura básica de base de datos era fácil manipular y actualizar gran cantidad de información.

Es fácil distinguir los componentes básicos de una base de datos:

Su estructura es descrita por un conjunto de nombres de campos, estos campos pueden ser de varios tipos en función del dato a almacenar (números, fechas, etc) y de longitud definible.

Otro componente son los datos propiamente dichos.

  • Los gestores de bases de datos permiten la organizacíón y el tratamiento eficaz de grandes masas de datos proporcionándonos gran variedad de herramientas.

DBASE II proporciona un gestor de base de datos de tipo relacional con capacidad para gestionar las bases de datos, interpretar interactivamente instrucciones y ejecutar bloques de sentencias (programas).

DBASE II también contribuyó a la filosofía de la programación estructurada, mejoró sus prestaciones y evolucionó en varias versiones (DBASE III, DBASE III+ y DBASE IV).

George Tate fallecido tempranamente nunca pudo comprobar la revolución que ocasionaría este producto, aún en constante evolución.

El éxito obtenido entre los usuarios de micros, principalmente atraídos por su versatilidad y potencia, y los grandes beneficios producidos en su comercialización, hizo que muchas empresas de software se adherieran a la idea de desarrollar nuevos productos análogos, una gama de dialectos que hoy se les agrupa con el sobrenombre de entorno xBase (Clipper, Quicksilver, Foxbase, etc).

La difusión de estos productos han desbancado a muchos lenguajes de programación, como al Cobol que aunque propicia una fácil lectura de sus fuentes, la programación resulta lenta y laboriosa.

En los ochenta, en pleno boom informático DBASE sustituye a muchos lenguajes por la potencia de sus órdenes y facilidad de uso. Por entonces, hubo que estar muy despierto a la hora de seleccionar una herramienta de trabajo con futuro.

CLIPPER es un dialecto creado como otros tantos con la intención de mejorar las prestaciones de DBASE. Su primera versión se creó en 1985 en los laboratorios de Natuncket. CLIPPER está escrito en lenguaje C y Ensamblador y se presentó como un lenguaje atrevido que ha dado muchos quebraderos de cabeza en Ashthon-Tate. En el primer contacto que se tiene con él es dificil encontrar muchas diferencias con respecto a DBASE, ya que CLIPPER es un lenguaje formado por un conjunto de comandos y funciones similares a las usadas con DBASE, incluso la mayoría con igual formato sintáctico.

Pero no tardaremos demasiado tiempo en percartarnos de las diferencias. La principal de ellas, está en que todos los programas escritos en Clipper pueden compilarse y enlazarse. El resultado obtenido es un fichero ejecutable que puede utilizarse de forma independiente al gestor de base de datos y sin necesidad de incluir módulo runtime. Esto repercute en la velocidad de ejecución de los programas.

Muchos programadores recordarán que cuando entregaban un proyecto a un cliente desarrollado en DBASE II o III se veían con la fatalidad de entregar los ficheros fuentes, ya que DBASE lo que hacía era interpretarlos. CLIPPER salvaguardó estos intereses. CLIPPER aportó más comandos y funciones y prescindió de muchos de DBASE.

CLIPPER es ahora sin duda el compilador más utilizado en aplicaciones de gestión de datos para microordenadores. La última versión aparecida en el mercado es la CLIPPER 5.01 versión reparada de la CLIPPER 5.0. Hasta el momento, la versión más utilizada quizás por su largo tiempo de vigencia es la CLIPPER SUMMER '87. Anteriores a ésta eran la CLIPPER AUTUMN '86 y la versión de 1985.

De todas la versiones detalladas la SUMMER '87 ha sido la más difundida. Muchas aplicaciones se han desarrollado con esta versión, por ello, aún, muchos programadores se resisten al cambio a versiones más actuales.

Otras 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 indexació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.

Ordenador : IBM PC, XT, AT, 386 o compatible
Memoria RAM : 256 kb
Disco duro : 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 .

La instalación de CLIPPER es muy fácil, basta con copiar el contenido de todos los disquetes a un directorio o ejecutar el fichero CLIPCOPY.BAT que se encuentra en el disco de 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).

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 relación de 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 <Fprg> [-<opción> {-<opción>}]

<Fprg> Programa fuente que se compila
-<opción> 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 <Fprg> 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 <Fobj> {,<Fobj>} [OUTPUT <Fexe>] LIB <Flib>
{,<Flib>} | [@<Flnk>]

* LINK (Microsoft)

Sintaxis:

LINK <Fobj> {<Fobj>},<Fexe>,<mapa>,<Flib> {<Flib>}

* TLINK (Borland)

Sintaxis:

TLINK <Fobj> {<Fobj>},<Fexe>,<mapa|/x>,<Flib> {<Flib>}

* RTLINK (Pocket Soft. Clipper 5)

Sintaxis:

RTLINK [FI <Fobj> [OUTPUT <Fexe>] [LIB [<Flib>] [<opciones>]] | [@<Flnk>]

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 @<via><Flnk>

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 <Fobj> {,<Fobj>}

por

SECTION INTO <Fovl> FILE <Fobj> {,<Fobj>}

(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=<Fmap>. 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 <Fstr>

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 <Fdbf> FROM <Fstr>

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 <Fdbf> [INDEX <Fntx1> {,<Fntx2>}] [EXCLUSIVE] [ALIAS] <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 [<ambito>] [<alias1>] <campo1> WITH <expr1> {,[<alias2>]<campo2> WITH <expr2>} [FOR <expL>][WHILE <exprL>]

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>] [<Lcam>] [FOR <expL>] [WHILE <expL>] [TO PRINT/TO FILE <ftxt>]

DISPLAY [OFF] [<ámbito>] [<Lcam>] [FOR <expL>] [WHILE <expL>] [TO PRINT/TO FILE <ftxt>]

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 <Reg> (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.

@ <Fila>,<Col> [SAY <ExpC> [PICTURE <másc> ]] [GET <Vmen> [PICTURE <masc>] [RANGE <expN1>, <expN2>] [VALID <expL>]]

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. <expL> 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 <ExpL>] [WHILE <ExpL>]

[ámbito] RECORD <núm> 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 <ExpL>] [WHILE <ExpL>]

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 <expL>] [WHILE <expL>]
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 <expL>] [WHILE <expL>] TO <vmen>

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 <vmen>

SUM suma uno o más campos depositando el resultado en una variable.

AVERAGE [<ámbito>} TO <vmen>

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 <archivo> [<ámbito> [FIELDS <lista campos>]
[FOR <condición>] [WHILE <condición>] [SDF/DELIMITED/DELIMITED WITH <delimitador>]

<archivo> - Es el nombre del nuevo archivo.

<ámbito> - Determina la porción del archivo a copiar, por defecto es ALL (todo).

FIELDS <lista campos> - Son los campos a copiar a la nueva base de datos.

FOR/WHILE <condición> - 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 [<registros> [FIELDS <campos>] FROM <fichero>
[FOR <condición>] [WHILE <condición>] [SDF/DELIMITED
[WITH BLANK/<delimitador>]]

<registros> - Registros a agregar por defecto son todos.

<campos> - Lista de campos a agregar.

<fichero> - Nombre del archivo origen. Por defecto, (.DBF),

FOR/WHILE <condición> - 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 <delimitador> - Podemos especificarlo.

Ejemplo_1:

USE CLIENTES
APPEND FROM VENTAS FOR PEDIDO > 5000

IV. Indices.

1. Crear ficheros índices.

INDEX indexa 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 <campo1> {+<campo2>} TO <Fntx>

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 <expN>

<expN> 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 <expr>

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>/<alias>

<área> es un número comprendido entre 0 y 254.

<alias> 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 <dato> TO <var>
<var> = <dato>

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:

? <expr>
?? <expr>

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 <Lvar>

PRIVATE declara de uso privado la variables de memoria especificadas. Estás pueden modificar su valor en partes de un programa.

PRIVATE <Lvar>

7. Salvar y restaurar variables de memoria.

SAVE TO salva en un fichero variables de memoria.

SAVE TO <fmem> [ALL [LIKE <masc>/EXCEPT <masc>]]

<fmem> 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 <masc> salva en el fichero todas las variables cuya estructura sea semejante a la especificada en <masc>. Recuerde que puede hacer uso de los símbolos comodines: * y ?.

EXCEPT <masc> salva todas las variables que no tengan una estructura semejante a <masc>.

RESTORE FROM restaura desde disco el fichero de variables de memoria <Fmem>. Si se usa ADDITIVE no se borra el entorno de variables activo al restaurar.

RESTORE FROM <Fmem> [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 [<vmem1> {,<vmem2>}] [ALL [LIKE<masc>] EXCEPT <masc>]]

<vmem1>..<vmem2> es la lista de variables que se desean eliminar.

ALL indica que sean eliminadas todas las variables existentes.

ALL LIKE <masc> indica que sean eliminadas todas las variables cuya estructura sea semejante a la expresada en <masc>. Se pueden usar los comodines: * y ?.

ALL EXCEPT <masc> indica que sean borradas todas las variables que no concuerden con la estructura expresada en <masc>.

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 (.).

&<vmem>

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.

@ <fila>.<col> [SAY <expC> [PICTURE <masc>]]
[GET <expC> [PICTURE <masc>]
[RANGE <expN1>,<expN2>]
[VALID <expL>]]

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. <expL> 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 <"@<símbolo>")

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 <mven>. No es necesario haber declarado previamente <Vmen>.

ACCEPT [<expC>] TO <vmen>

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 [<expC>] TO <vmen>

Ejemplo_1:

INPUT " Edad " TO edad

WAIT detiene la ejecución del programa y espera la pulsación de una tecla.

WAIT [<expC>] [TO <vmen>]

<expC> 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...

<vmen> 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([<expN>])

<expN> 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.

@ <fila sup>,<col izq> TO <fila inf>,<col dcha> [DOUBLE]

7. Dibujar una caja.

@..BOX construye una caja entre las coordenadas indicadas y con los códigos ASCII especificados en <expC>. 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

@ <fila sup>,<col izq>,<fila inf>,<col dcha> BOX <expC>

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.

@ <fila>,<col> PROMPT <expC> [MESSAGE <expC>]

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 [<fila> [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 <vmem>]

TO <vmem> indica que la pantalla será almacenada en la variable de memoria <vmem>. Esta variable será de tipo carácter.

RESTORE SCREEN restaura una pantalla almacenada previamente

RESTORE SCREEN [FROM <vmem>]

SAVESCREEN() almacena una parte de la pantalla en una variable de memoria

<vmen> = SAVESCREEN(<fil sup>,<col izq>,<fil inf>,<col dcha>)

RESTSCREEN() restaura una área de una pantalla salvada previamente.

RESTSCREEN(<fil sup>,<col izq>,<fil inf>,<col dcha>,<vmem>)

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 <expL>
<instrucciones>
[ELSEIF <expL>]
<instrucciones>
[ELSE
<instrucciones>]
ENDIF

Función:

IIF/IF(<expL>,<.T.>,<.F.>)

<expL> 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 <expL>
<instrucciones>
CASE <expL>
<instrucciones>
OTHERWISE
<instrucciones>
ENDCASE

<expL> 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 <expN1> TO <expN2> [STEP <expN3>]
<instrucciones>
[EXIT]
<instrucciones>
[LOOP]
NEXT

<expN1> es el valor inicial. Este valor se asignará a una variable de control.

<expN2> es el valor final del bucle.

STEP <expN3> 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 <expL>
<instrucciones>
[EXIT]
[LOOP]
ENDDO

<expL> 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 <fich1> TO <fich2>

<fich1> es el nombre inicial del fichero y <fich2> es el nuevo nuevo. Tanto <fich1> como <fich2> 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 <fich1> en <fich2>. 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 <fich1> TO <fich2>

<fich1> es el fichero origen y <fich2> 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 <fich>

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 <sent>
! <sent>

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(<fich>)

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 <nombre procedimiento>
<órdenes>
[RETURN]

<nombre procedimiento> - 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 <procedimiento> [WITH <lista de parmetros>]

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 [ <archivo> ]

<archivo> - 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 <nombre función>
<instrucciones>
RETURN <valor de respuesta>

<nombre de función> - Solo acepta los diez primeros caracteres.

<valor de respuesta>- Es obligatorio la devolución de un valor.

Para llamar a una función de usuario, proceda del siguiente modo:

función( <lista de parámetros> )

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 <array>[<expN>]{,<array>[<expN>]...}

<array> es el nombre de la tabla
<expN> 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(<array>)

<array> - 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(<array>,<expN>)

<array> - Nombre de la tabla
<expN> - 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(<array>,<expN>)

<array> - Nombre de la tabla
<expN> - 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(<array1>,<array2>[,<expN1> [,<expN2>[,<expN3>]]])

<array1> - Nombre de la tabla origen
<array2> - Nombre de la tabla destino
<expN1> - Posición origen en tabla origen a copiar
<expN2> - Número de elementos a copiar desde <expN1>
<expN3> - 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(<array1>,<expr>[,<expN1>[,<expN2>]])

<array1> - Nombre de la tabla
<expr> - Expresión con la que se rellenar la tabla
<expN1> - Posición donde comenzar a rellenar
<expN2> - Número de elementos a rellenar desde <expN1>
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(<masc> [,<array1> [,<array2> [,<array3> [,<array4> [,<array5>]]]]])
<masc> - máscaras posibles en DOS (*/?) o nombre fichero.
<array1> - Es la tabla que se rellenar con los nombres de ficheros reseñados en <masc>. Tipo C. <array2> - Idem. para tamaño en bytes de fichero. Tipo N.
<array3> - Idem. para fechas. Tipo D
<array4> - Idem. para horas. Tipo C
<array5> - 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(<array1> [,<array2> [,<array3> [,<array4> ]]]])

<array1> - Tabla que contendrá nombre de campos.
<array2> - Tabla que contendrá tipo de campos.
<array3> - Tabla que contendrá longitud de campos.
<array4> - 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(<fila sup>,<colizq>,<fila inf>,<col dcha>,<array1> [,<array2>[,<func>[,<expN1>[,<expN2>]]]])

<fila sup>- Coordenada X1 de pantalla
<col izq> - Coordenada Y1 de pantalla <fila inf>- Coordenada X2 de pantalla
<col dcha>- Coordenada Y2 de pantalla
<array1> - tabla que contendrá elementos
<array2> - tabla que contendrá valores lógicos
<func> - 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([<fila sup>[,<colizq>,[<fila inf>,[<col dcha>]]]] [,<array1>],[,<func>][,<array2]/<expC>] [,<array3]/<expC>][,<array4]/<expC>] [,<array5]/<expC>][,<array6]/<expC>] [,<array7]/<expC>])

<fila sup> <col izq> <fila inf> <col dcha> posiciones.
<array1> - Tabla de nombres de los campos.
<func> - Función de usuario.
<array2> - Tabla de modelos de visualización.
<array3> - Tabla de encabezados de columnas.
<array4> - Tabla de separación de encabezados. <array5> - Tabla de separación de columnas.
<array6> - Tabla de separación de pies.
<array7> - 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 <fichero> Crea un fichero de protocolo.

SET COLOR TO <expresión> Fija los colores de pantalla.

SET DECIMALS TO <expN> Fija el número de los decimales a mostrar en los resultados de las funciones numéricas y cálculos.

SET DEFAULT TO <unidad>[:<rutra>] 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 <expr> Especifica los caracteres empleados como delimitadores.

SET DEVICE TO SCREEN/PRINTER Dirige el resultado de la instrucción @ al dispositivo elegido.

SET FILTER TO <condición> Hace que la base de datos se vea como si sólo contuviese los registros que cumplen la condición.

SET INDEX TO <lista ficheros> Abre el índice indicado y cierra los anteriores abiertos con la misma base de datos.

SET KEY <expN> TO <procedimiento> Asigna a una tecla un procedimiento.

SET MARGIN TO <expN> Fija el margen izquierdo de la impresora.

SET MESSAGE TO <expN>/CENTER Establece la línea donde se muestran los mensajes asociados a PROMPT.

SET ORDER TO [<expN>] Establece que fichero índice es el principal.

SET PATH TO [<lista de rutas>] Especifica la ruta de búsqueda que Clippersigue en el acceso a ficheros.

SET PRINTER TO [<dispositivo>/<fichero>] Determina la salida de la impresora.

SET PROCEDURE TO [<fichero>] 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