Site hosted by Angelfire.com: Build your free website today!

CLIPPER BÁSICO

 

OBJETIVO TERMINAL:

                Al finalizar el curso el alumno estará en condiciones de elaborar programas en Clipper que le permitan manejar archivos de datos en aplicaciones varias.

 

DURACIÓN: 16 HORAS.

 

CONTENIDO

 

1.- Conceptos Básicos

                1.1. Archivo.

                1.2. Base de Datos

                1.3. Operaciones con archivos

 

2.- Generalidades del Clipper

                2.1. Que es Clipper

                2.2. Características de Clipper

                2.3. Requerimientos de Clipper

 

3.- Programando con Clipper

                3.1. Variables y Operadores

                3.2. Estructuras de Decisión

                3.3. Estructuras de Repetición

                3.4. Edición de un programa

                3.5. Entrada y salida de datos

 

4.- Compilación y prueba de un Programa

               

5.- Manejo de Archivos

                5.1- Creación de archivos

                5.2- Apertura y cierre de archivos

                5.3- Áreas de trabajo

                5.4- Adición de registros

                               5.4.1- Comando append

                               5.4.2- Comando replace

                5.5- Movimiento dentro del archivo

                               5.5.1- Comando goto  :  bottom / top

                               5.5.2- Comando skip

                5.6- Borrado de registros

                               5.6.1- Marcar registros para eliminación

                               5.6.2- Función delete( )

                               5.6.3- Comando  set delete

                               5.6.4- Recuperación de los registros

                               5.6.7- Eliminación física de los registros

 

                5.7- Búsqueda secuencial en un archivo

                               5.7.1- Comando locate

                               5.7.2- Comando continue

                5.8- Creación y apertura de archivos indexados

                               5.8.1- Orden Index on ( ) to

                               5.8.2- Orden Set index to

                5.9- Búsqueda indexada en un archivo

                               5.9.1- Comando find           

                               5.9.2- Comando seek

 

6.- Procedimientos y Funciones en Clipper

 

7.- Manejo de arreglos en Clipper

 

8.- Presentación de datos en Pantalla

 

9.- Diseño, elaboración y prueba de un sistema sencillo.

 

10.- Compilación y Encadenamiento

 

            - Librerías  Pre-encadenadas

            - Compilación por Módulos

            - Encadenamiento con Archivos  ( .LNK )

            - Creación de Archivos Overlay   ( .OVL )

            - Encadenamiento de Librerías Externas.

 

 11.-  Macro-Sustitución y Bloques de Código.

 

 12.- La Función Achoice()  

 

 13.- La Función Dbedit()

 

 14.- Manejo de Mouse

 

            - Función  MouseMenu()

            - Función  ChoiceMenu()

 

 15.- Introducción a la Programación Orientada a Objetos ( POO )

 

                - La Clase Get()

 

                - La Clase Tbrowse()

 

16.- Manejo de Ayudas

 

             - La Función Memoedit().

             - Creación de un Editor de Texto.

 

17.- Manejo del Clipper en una Red de Área Local ( L.A.N. )

 

             - Introducción

             - Funciones y Comandos

             - Limitaciones y Recomendaciones

             - Creación de Funciones para la Apertura de Archivos.

             - Creación de Funciones para el Bloqueo de Archivos y Registros.

 

 


CONCEPTOS BÁSICOS

 

1.- Dato

                Del Latín data que significa ¨hecho¨, entidades independientes sin evaluar. Los datos pueden ser numéricos o no numéricos. Un conjunto de datos se convierten en información cuando son evaluados y procesados. Para que este conjunto de datos se procese eficientemente debe estar organizado lógicamente en archivos.

 

1.-  Archivo

                Un conjunto de registros del mismo tipo recibe el nombre de Archivo. Un registro, a su vez es un conjunto de campos con relación entre sí, y un campo es la unidad más pequeña a la que se puede referir un dato. La figura siguiente nos muestra de una forma gráfica lo que sería un archivo, un registro y un campo.

 

 

REGISTRO 1   

CAMPO 1 DEL

 REGISTRO 1

CAMPO 2  DEL

REGISTRO 1

                                REGISTRO 2

 

 

 

                                    REGISTRO 3 

CAMPO 1 DEL

REGISTRO 3

CAMPO 2  DEL

REGISTRO 3

 

ARCHIVO

 

 

2.- Base de Datos

                Es una colección de archivos interrelacionados creados con un Sistema de Manejo de Bases de datos, y que pueden ligarse de diferentes maneras.

 

3.- Operaciones con Archivos

                Los datos que tienen relación entre sí se almacenan u ordenan como se dijo en los campos de un registro, estos campos pueden ser manipulados de forma tal que el usuario que los necesita pueda utilizarlos, guardándolos, cambiándolos o borrándolos según sea el caso; si esto se hace con los campos es valedero decir que lo mismo se puede hacer con los registros y por ende se hace con los archivos. Es oportuno acotar aquí que la data debe protegerse y que por lo tanto cualquier aplicación que se desarrolle para manejar archivos, debe llenar como primer requisito la conservación y protección de los datos.

 

 

 

GENERALIDADES  SOBRE CLIPPER

 

                Clipper es un manejador de archivos con ciertas características de un manejador de Base de Datos y surge como la necesidad de suplir algunas deficiencias del DBASE, siendo la mas resaltante la de ser un Compilador, motivo éste por el cual se acelera la ejecución de un programa escrito en DBASE. Provee además un conjunto de órdenes y funciones propias que han sido desarrolladas con el paso de los años convirtiéndolo en el Manejador de Archivos más popular.

 

                Sin  Compararlo con DBASE podríamos decir qué sus características son:

 

- Compilador Profesional.

- Un conjunto de órdenes y Funciones que permiten un mejor y más fácil manejo de la programación.

- Permite programación por capas, no existiendo por lo tanto límite para la dimensión de un programa.

- Permite la definición de funciones por parte del usuario.

- Puede conectarse con rutinas externas de otros lenguajes.

 

                En cuanto a los requerimientos de Hardware Clipper es poco exigente, sin embargo se recomienda que el equipo tenga Disco Duro y por lo menos un Mega de memoria Ram. Sin embargo no es lo mismo cuando se desarrollan aplicaciones ya que los requerimientos dependen en sí más de la aplicación que de Clipper.

                De la misma forma en entorno de Software necesario es mínimo, Sistema operativo DOS, y un config.sys con Buffers no menores a 20 y Files no menores de 40.

 

 

PROGRAMACIÓN EN CLIPPER

 

 

1.- Variables y Operadores

 

                Una variable de memoria es un pedazo de memoria del computador que recibe un nombre o identificador y almacena temporalmente un dato. Una variable de memoria puede almacenar números, cadenas de caracteres,  una fecha o un valor lógico.

 

                Los identificadores de variables en Clipper pueden tener hasta diez (10) caracteres y deben empezar por una letra, no puede tener espacios, no pueden ser palabras de uso propio de Clipper (palabras reservadas).

 

                Se pueden crear de dos formas diferentes:

                Con el uso del comando STORE, ejemplo STORE  <valor>  TO  <Identificador> o por medio de la asignación; ejemplo   Identificador = valor

 

 

Ejemplos según tipo:

 

NUMÉRICAS:                                                                                    LÓGICAS

                store 0 to código                                                store .t. to ciclo

                código = 0                                                                           ciclo = .t.

 

 

TIPO FECHA

               

                Clipper dispone de la función  CTOD() para crear e inicializar variables del tipo fecha.

 

                store CTOD(“28/04/96”) to hoy

               

                Cuando se desea inicializar mas de una variable del mismo tipo se puede emplear cualquiera de la siguientes formas:

 

                               - STORE <VALOR> TO  VAR1, VAR2, VAR3

                               - VAR1=VAR2=VAR3= <VALOR>

 

TIPO ARRAY

                Clipper maneja los arreglos como un conjunto de datos o variables con el mismo nombre y su declaración es como sigue:

 

DECLARE VAR []

 

                Donde var corresponde al identificador del arreglo y dentro de los corchetes se coloca un número que le indica a Clipper cuantas variables con ese nombre va a manejar, ejemplo:

 

Declare cliente[3] así:

                cliente[1] podría ser el nombre

                cliente[2] la dirección y

                cliente[3] el teléfono del cliente

                Los arreglos en Clipper puede ser también multidimensionales, veamos el ejemplo de creación de un arreglo multidimensional

 

Declare clientes[3] [3]

                En este caso se trata de una matriz  de 3 columnas y 3 filas

 

Operadores

 

                Clipper maneja operadores numéricos, de cadena, de relación y lógicos; su descripción se enumera a continuación:

 

                               Numéricos:                                                                                                         Cadena

 

                +             ---------------> Suma                                             +             ---------------> Concatenación

                -              ---------------> Substracción                                                              

                *             ---------------> Producto                                       $          -----------> Comparación de subcadenas.           

                /              ---------------> División                                                                      

                **  o  ^   ---------------> Exponenciación                                                         

                %            ---------------> Modulo                                                                       

 

 

                               Relacionales                                                                                                       Lógicos

               

                >             ---------------> Mayor que                    .and.       ---------------> “Y” lógico

                <             ---------------> Menor que                    .or.          ---------------> “O” lógico

                =             ---------------> Igual que                                      .not.        ---------------> “NO”              lógico

                == o  ++ --------------> Exactamente igual que

                <=           ---------------> Menor o igual que                     

                >=           ---------------> Mayor o igual que                     

                 != o <>  ---------------> Diferente                                      

               

                              

                Clipper maneja los siguientes operadores de asignación:

 

                               =             ---------------> Asignación simple

                               :=            ---------------> Asignación en línea

                               =+           ---------------> Adición y asignación en la línea

                               -=            ---------------> Substracción y adición en la línea

                               *=           ---------------> Producto y asignación

                               /=            ---------------> División y asignación en línea

               

Clipper clasifica las variables de memoria en cuatro clases: PUBLIC, PRIVATE, LOCAL Y STATIC.

 

                - Una variable declarada como PUBLIC es visible para cualquier programa del sistema. Son denominadas también GLOBALES.

 

                - Una variable declarada como LOCAL solo existe mientras se esté ejecutando el programa en el que fue declarada. El valor se pierde al retornar al programa principal.

 

                - Las variables declaradas como STATIC funcionan de forma parecida a las locales, solo que su valor no se pierde y sigue disponible cuando se llama por segunda vez al programa donde se encuentra.

 

                - Cuando una variable se declara PRIVATE, ésta es visible desde todos los programas que llame el programa en el cual fue declarada. Si una variable no es declarada específicamente automáticamente se considera de tipo PRIVATE.

 

 

2.- Estructuras de Decisión

 

                En Clipper se encuentra la estructura  de decisión simple si entonces, la compuesta si entonces .... de lo contrario (si no) y la de decisión múltiple caso; sus sintaxis se enumeran a continuación:

 

                if <condición>

                               instrucción o instrucciones

                endif

 

                if <condición>

                               instrucción o instrucciones

                else

                               instrucción o instrucciones

                endif

 

                La condición para efectuar la toma de decisiones debe ser una condición lógica o relacional, ejemplo:

                if conta = 3                                                           if conta = 3

                               v = 4                                                                      v = 4

                endif                                                                     else

                                                                                                              v = v+1

                                                                                              endif

 

 

                if conta = .t.                                                         if conta > conta1

                               v = 4                                                                      v = 4

                endif                                                                     else

                                                                                                              v = v+1

 

                                                                                              endif

                DO CASE

                               CASE <variable> = <valor1>

                                               instrucción o instrucciones

                               CASE <variable> = <valor2>

                                               instrucción o instrucciones

                               CASE <variable> = <valorn>

                                               instrucción o instrucciones

                ENDCASE

 

 

3.- ESTRUCTURAS DE REPETICIÓN

 

                Clipper trabaja con dos estructuras repetitivas, el DO WHILE y el FOR... NEXT, la sintaxis de esta son:

 

                DO WHILE <condición>

                               instrucción o instrucciones

                ENDDO

 

                Esta estructura es la principal y la más utilizada para controlar la ejecución global de un programa en Clipper. Su funcionamiento depende de la evaluación que se hace inicialmente de la condición, si es verdadera se ejecutan los comandos (instrucciones) que se encuentran entre el DO WHILE y el ENDDO, al llegar al enddo el programa testea nuevamente la condición, si esta deja de cumplirse el ENDDO entrega el control del programa a la línea siguiente del  ENDDO.

                El ciclo DO WHILE  puede ser interrumpido usando el comando EXIT, esto es muy usado por los programadores cuando se desea interrumpir el ciclo al cumplirse un hecho o condición.

 

                De igual forma que el ciclo puede interrumpirse, es posible ordenarle que se repita, para ello Clipper provee de la instrucción LOOP.

                FOR <variable> = <valor inicial> TO <valor final> [STEP <incremento>]

                               Instrucción o instrucciones

                NEXT

 

                El ciclo se ejecuta de la siguiente forma: para la variable comenzando con valor inicial y variando hasta valor final se ejecutan las instrucciones entre el FOR y el NEXT el cual incrementa el valor de la variable hasta superar el valor final, momento en el cual el control del programa es transferido a la línea siguiente al NEXT.  

 

 

EDICIÓN DE UN PROGRAMA

 

                Clipper trae un editor de programas llamado PE, sin embargo permite que las aplicaciones puedan ser escritas en procesadores de texto como WordStar o el Edit del Sistema operativo.

                Si  deseamos  usar el  PE debemos  escribir a nivel del punto indicativo del DOS: PE <nombre> y pulsar ENTER, una vez dentro del editor podemos transcribir nuestro programa; finalizada la tarea de transcripción debemos pulsar las teclas Ctrl-W y el editor sale al dos y salva el programa con la extensión prg.

 

                Si usamos otro editor debemos tener presente al salvarlo agregar la extensión prg, así si usamos el Edit del DOS podríamos seguir el siguiente procedimiento: Edit <nombre.prg> para estar seguros de colocar la extensión correcta, ya que sin ella Clipper no lo compila.

 

                Clipper tiene como única exigencia que cada orden debe estar en una línea diferente ya que no posee un separador de órdenes, por lo tanto al momento de transcribir el programa debemos pulsar enter después de cada instrucción para separarla de la siguiente.

 

                Cuando se desarrolla una aplicación siempre es conveniente documentarla brevemente para ello Clipper posee  cuatro formas de colocar comentarios en los programas.

 

* Usado para una sola línea de comentario y puede ir en cualquier parte del programa.

/* .... */ Usado cuando el comentario ocupa más de una línea

&& o // se emplea cuando el comentario se coloca en la misma línea que un comando.

 

 

ENTRADA Y SALIDA DE DATOS

 

                Para la captura de datos y presentación de estos y mensajes Clipper provee de las instrucciones: ACCEPT,  ? y ??, Así por ejemplo se desea capturar un numero con la variable número_1, la sintaxis sería:

 

                ACCEPT  <mensaje> número_1

               

                Para escribir el valor de la variable número_1, se debe escribir la siguiente orden:

                               ? número_1

 

                Y si lo que se desea es acompañar la escritura de la variable con un mensaje entonces debemos escribir la orden así:

                ? “El valor de la variables es: “, número_1

 

                La orden ? es interpretada por Clipper como que debe escribir lo que está entre comillas(si lo hay) y/o el valor de la variable, saltando a la línea siguiente una vez ejecutada la orden. La orden ??, se ejecuta de igual forma pero no salta a la otra línea sino que permanece en la misma línea en la que acaba de escribir.

 

                Es deseable que la entrada y salida de datos no esté en forma desordenada, sino que por lo contrario muestre un aspecto agradable al usuario, para ello Clipper usa las instrucciones  @ SAY, @GET y PICTURE.

 

                La primera de ellas   permite colocar el cursor en cualquier punto de la pantalla, tomando como base que Clipper divide la pantalla en 25 filas y 80 columnas siendo 0,0 la primera posición y 25,79 la última; la sintaxis de la orden es:

                @  fila,columna SAY “mensaje”

 

                La orden @ Get funciona de forma similar solo que en lugar de escribir un valor o mensaje, se coloca en la posición indicada para leer un dato.

                @ fila,columna GET  variable

                La orden PICTURE tiene como función dar forma al dato que se va a visualizar, ello se logra colocando después de orden y entre comilla cualquiera de los siguientes modificadores:

                9 o #                                       para indicar que visualizará un dígito.

                A o N                                    para indicar que se visualizará una letra

                Y                                            para indicar que se visualizará un dato lógico

                !                                              indica que la visualización de letras se hará en Mayúsculas.

 

ejemplo:

                @  2,4 say “Nombre del Usuario”  get Nombre picture “!x”

                @  2,4 say “Nombre del Usuario” Nombre picture “!x”

 

                Como complemento de la orden picture Clipper provee de funciones de plantilla

                !........................................... Transforma los caracteres mostrándolos en Mayúsculas.

                (...........................................  Coloca los números negativos entre paréntesis.

                B..........................................  Justifica un texto a la izquierda dentro del campo.

                C..........................................  Muestra CR después de un valor positivo.

                X..........................................  Visualiza DB después de un número negativo.

                D...........................................  Muestra la fecha en formato especificado.

                E............................................  Muestra la fecha en formato europeo.

                Z............................................  Muestra los valores cero como blancos.

 

COMPILACIÓN Y PRUEBA DE UN PROGRAMA

 

                Aquí es bueno puntualizar la diferencia existente entre un Compilador y un interpretador. Clipper es un compilador que proporciona gran velocidad a una aplicación por cuanto traduce el lenguaje Clipper al Lenguaje de máquina una sola vez, mientras que un interpretador como DBASE, tiene que convertir en lenguaje de máquina todas las instrucciones cada vez que esta son usadas.

 

                Si Ud. posee Clipper instalado en su computador por medio de una versión instaladora solo tiene que escribir desde el punto indicativo del DOS la siguiente orden:

                               cl <nombrearch>  <enter>

 

                Si no tiene a Clipper instalado de esa forma debe indicarle las vías de acceso, bien sea a través de un archivo bach o editando nuevamente el autoexec.bat y el config.sys con las instrucciones siguientes:

 

PATH C:\CLIPPER5\BIN;C:\NG;%PATH%

SET INCLUDE=D:\CLIPPER5\INCLUDE

SET LIB=D:\CLIPPER5\LIB

SET OBJ=D:\CLIPPER5\OBJ

SET PLL=D:\CLIPPER5\PLL

 

QUE HACE CLIPPER AL COMPILAR?

                Clipper convierte el programa fuente en lenguaje de máquina produciendo un archivo en código objeto llamado programa objeto; esto lo realiza Clipper.exe.

 

                Una vez que Clipper ha creado el archivo objeto entra a funcionar Rtlink.exe que enlaza los archivos objetos creados por Clipper con las rutinas de librería, construyendo finalmente con la unión de ellos un archivo ejecutable.

                - Realice ahora los ejercicios del numeral 1 del anexo titulado EJERCICIOS.

                - Concluido los ejercicios elabore los programas del numeral 2

 

 

MANEJO DE ARCHIVOS

 

CREACION DE UN ARCHIVO:

 

                En Clipper se utiliza el programa DBU para crear una estructura de un archivo.

                El programa de servicios DBU.EXE permite la operación de una serie de comandos interactivos de Dbase.

                El programa DBU permite la apertura de hasta 6 archivos.

                Posee la siguiente sintaxis:

                              

                               DBU arch.dbf

                Si se especifica el nombre de un archivo, se mostrará una pantalla de visualización BROWSE.

 

 

APERTURA DE UN ARCHIVO:

 

                Con el comando USE se puede abrir o cerrar un archivo .DBF.

                Su sintaxis es:

                               USE nom_arch  [ INDEX lista_indices ]

 

                El Clipper permite hasta 250 archivos abiertos en 250 áreas de trabajo.

 

                Para abrir el archivo, el comando USE se utiliza seguido del nombre del archivo :

                               USE nom_arch.

 

                Para cerrar el archivo, use el comando USE sin especificar ningún argumento.

                               USE

                Para cerrar todas las bases de datos abiertas, use el comando:

                               CLOSE ALL

                               CLOSE DATABASES

 

AREAS DE TRABAJO:

 

                Se identifican por las letras de la A hasta la Z o por un número de 1 a 250. Se puede identificar por el nombre del archivo que está abierto en cada uno. Cualquier archivo abierto sin una selección previa será abierto en el área A.

 

                El comando que selecciona un área es:

                               SELECT área

 

                donde área es la letra ò número correspondiente al área por abrirse.

 

EJEMPLO:

                               SELECT 1

                               USE cliente

                               SELECT 2

                               USE factura

 

FUNCION SELECT( ):

 

                Retorna el número del área donde el archivo dado como argumento se encuentra abierto.

                Su sintaxis es:

                               SELECT ( alias )

ADICION DE REGISTROS:

 

                El comando APPEND BLANK adiciona un registro en blanco a la base de datos en uso. la inclusión            Su sintaxis es:

                               APPEND BLANK

 

                Después de la inclusión del registro en blanco, los campos vacíos deben llenarse mediante el comando REPLACE, el cuál sustituye el contenido de los campos especificados por los resultados o el valor de las expresiones.

 

                Su sintaxis es:

                                REPLACE  campo WITH expresión  [ FOR condición ] [ WHILE condición ]

 

 

                Con  el comando APPEND FROM copia registros del archivo especificado hacia el archivo en uso.

                Su sintaxis es:

                               APPEND FROM nomb_arch  [ FOR WHILE condición ]

 

 

MOVIMIENTO DENTRO DEL ARCHIVO:

 

                El comando GOTO mueve el puntero de registros al registro indicado por el comando.

                Tiene la siguiente sintaxis:

                               GOTO num_reg  / TOP  /  BOTTOM

 

                GOTO TOP coloca el puntero en el primer registro del archivo y si está indexado en el primer registro del índice.

                GOTO BOTTOM coloca el puntero en el último registro del archivo o en el último registro del índice.

 

                El comando SKIP mueve el puntero de registros a lo largo del archivo en uso o a lo largo de un archivo abierto en otra área.

                La sintaxis es:

                               SKIP num_reg

 

                SKIP sin argumento avanza el puntero al siguiente registro.

 

                Si se indica un número positivo, el puntero se moverá la cantidad de registros hacia el final del archivo. Si por el contrario, el número es negativo se moverá en dirección hacia el inicio del archivo.

 

 

BORRADO Y RECUPERACION DE REGISTROS:

 

                Para borrar un registro de un archivo .DBF, primero marcarlo para eliminarlo y en seguida eliminarlo físicamente del archivo.

 

                Para marcarlo se utiliza el comando DELETE.

                Su sintaxis es:

                               DELETE    [ WHILE condición ]  [ FOR  condición ]

 

                Si se especifica DELETE sin ningún parámetro, el registro actual se marcará para su eliminación.

 

FUNCION DELETE( ) :

 

                Retorna el valor lógico .T. si el registro actual está marcado para la eliminación  o .F. en caso contrario.

                Su sintaxis es:

                               DELETE( )

COMANDO   SET DELETE:

 

                Determina si los registros marcados para eliminación sean transparentes para comandos que hagan búsqueda o intenten acceder al archivo.

                Su sintaxis es:

                               SET DELETE ON / OFF

 

 

RECUPERACION DE LOS REGISTROS ELIMINADOS:

 

                Recupera los registros que habían sido marcados para eliminación por el comando DELETE. Este comando debe  utilizarse con el comando SET DELETE OFF.

 

                Tiene la siguiente sintaxis:

                               RECALL  [ WHILE condición ] [ FOR  condición ]

 

 

ELIMINACION FISICA DE LOS REGISTROS:

 

                Se utiliza el comando PACK para eliminar físicamente los registros que fueron marcados con el comando DELETE. Después que se ejecuta éste comando, no será posible recuperar los registros eliminados.

                Su sintaxis es:

                               PACK

 

 

BUSQUEDA SECUENCIAL EN UN ARCHIVO:

 

                Un archivo en Clipper puede abrirse de modo secuencial o indexado.

 

COMANDO LOCATE:

 

                Mediante el comando LOCATE se busca entro del conjunto de registros suministrados, el primer registro que satisfaga una condición especificada.

                La sintaxis de ese comando es:

                               LOCATE FOR condición  [ WHILE condición ]

 

COMANDO CONTINUE:

 

                Después del comando LOCATE  se utiliza el comando CONTINUE si existe otro registro que satisfaga la condición, en caso contrario el puntero se moverá hasta el final del archivo.

 

                Su sintaxis es:

                               CONTINUE

 

 

CREACION Y APERTURA DE ARCHIVOS INDEXADOS:

 

                El comando que genera un índice es el  INDEX ON. Para crear cualquier archivo índice, debe estar abierto el archivo .DBF.

                Su sintaxis es:

                               INDEX ON clave TO nomb_arch

 

                La extensión del archivo automáticamente será .NTX.

                Los índices creados arreglan siempre los archivos en orden creciente del valor, no importa si la clave, es numérica, de fecha o alfabética. Los campos MEMO o LOGICOS no pueden utilizarse para la construcción de índices.

 

COMANDO SET INDEX TO:

 

                Abre el índice que está relacionado  con el archivo en uso. Pueden abrirse hasta 15 índices simultáneamente.

                Su sintaxis es:

                               SET INDEX TO índices

                Si se utiliza este comando sin especificar ningún índice, todos los índices abiertos en el área actual quedan cerrados.

 

BUSQUEDA EN ARCHIVOS INDEXADOS:

 

                Los comandos que ejecutan ésta búsqueda son FIND y SEEK. Estos comandos funcionan si existe un índice abierto.

 

                El comando FIND localiza claves compuestas por números o cadenas literales. Si la clave es una cadena de caracteres, deberá estar entre comillas sin comenzar con caracteres en blanco.

                Su sintaxis es:

                               FIND cadena

 

                Después de una búsqueda se pueden utilizar funciones como FOUND( ), EOF( ), BOF( ) y   RECNO( ) para saber si la búsqueda tuvo éxito.

 

                El comando SEEK  busca por el primer registro del archivo indexado que esté en uso o que posea la clave suministrada.

                Al usar el comando SEEK con una clave alfanumérica, ésta puede ser colocada o no entre comillas. El comando SEEK evalúa una expresión y busca su resultado, lo que permite la composición de claves basadas en más de un campo.

                 Su sintaxis es:

                               SEEK  clave

 

                A continuación realice los ejercicios del numeral 3 del anexo de ejercicios.


EJERCICIOS

 

1.- A continuación encontrará un grupo de programas, edite con PE, salve, compile y pruebe cada uno de ellos según lo expuesto anteriormente.

 

a.-* programa primero

clea 

store 0 to edad

nombre = space(10)

accept "entre su edad " to edad

accept "entre su nombre " to nombre

? "hola "

?? nombre

? "tienes  "

?? edad

?? " años"

return

 

b.-* programa segundo

clea  && limpia la pantalla

store 0 to edad

nombre = space(10)

/* A CONTINUACION USAREMOS EL @ GET Y EL @ SAY PARA POSICIONAR EL CURSOR EN LA FILA 2 COLUMNA 2 Y ASÍ SUCESIVAMENTE */

@ 02,02 say "entre su edad " get edad

@ 03,02 say "entre su nombre " get nombre

read

@ 05,02 say "hola "+ nombre

@ 06,02 say "tienes "

@ 06,10 say edad

@ 06,20 say " años"

return

 

c.-* programa tercero

clea 

store 0 to edad

nombre = space(25)

@ 02,02 say "entre su edad " get edad pict "##"    // picture da formato de entrada

@ 03,02 say "entre su nombre " get nombre pict "@!"

read

@ 05,02 say "hola "+ nombre

@ 06,02 say "tienes "

@ 06,09 say edad Pict "##"  // pict da formato de salida

@ 06,12 say " años"

return

 

d.-*programa cuarto

#define recuadro chr(213)+chr(205)+chr(184)+chr(179)+;

            chr(190)+chr(205)+chr(212)+chr(179)+chr(32)

/* usamos define para declarar la variable recuadro la cual va acompañada de 9 valores, correspondientes al caracter ascii que da forma a la caja que se usara */

clea

store 0 to edad

store spac(25) to nombre

/* vamos a utilizar ahora las sentencias de decisión */

@ 01,01 to 24,79 double // dibuja un marco en la pantalla

@ 03,03,07,77 box recuadro

@ 04,18 say "instituto universitario de tecnología"

@ 05,25 say "curso de clipper básico"

@ 06,29 say "Fundainformatica"

@ 10,08 say "entre su nombre " get nombre pict "@!"

/* la función VALID permite validar la entrada, se usa acompañando al get */

@ 11,08 say "entre su edad "  get edad pict "##" valid(edad>0)

read

@ 13,08 say "hola " + nombre

if (edad<11)

  @ 14,08 say "eres un niño "

endif

if edad>11

   if edad<17

     @ 14,08 say "eres un adolescente "

   else

     if edad<= 30

        @ 14,08 say "eres un joven"

     endif

     if edad<= 50

        @ 14,08 say "eres adulto"

     else

        @ 14,08 say "estas cruzando la esquina"

     endif

   endif    

endif  

wait"" $$  hace una pausa hasta que se pulse una tecla

return

 

e.- *programa quinto

#define recuadro chr(213)+chr(205)+chr(184)+chr(179)+;

            chr(190)+chr(205)+chr(212)+chr(179)+chr(32)

clea

store 0 to edad

store spac(25) to nombre

conta=1

/* vamos a utilizar ahora la sentencia de repetición do while */

@ 01,01 to 24,79 double

@ 03,03,07,77 box recuadro

@ 04,18 say "instituto universitario de tecnología"

@ 05,25 say "curso de clipper básico"

@ 06,29 say "Fundainformatica"

do while conta<3

  store 0 to edad

  nombre=spac(25)

  @ 10,06 say "entre su nombre " get nombre pict "@!"

  @ 11,58 say "entre su edad "  get edad pict "##" valid(edad>0)

  read

  @ 13,08 say "hola " + nombre

  if (edad<11)

    @ 14,08 say "eres un niño "

  endif

  if edad>11

    if edad<17

       @ 14,08 say "eres un adolescente "

    else

      if edad<= 30

         @ 14,08 say "eres un joven"

      endif

      if edad<= 50

         @ 14,08 say "eres adulto"

      else

         @ 14,08 say "estas cruzando la esquina"

      endif

    endif    

  endif  

  conta=conta+1

enddo 

wait""

clea

return

 

f.-*programa sexto

#define recuadro chr(213)+chr(205)+chr(184)+chr(179)+;

            chr(190)+chr(205)+chr(212)+chr(179)+chr(32)

clea

store 0 to edad

store spac(25) to nombre

@ 01,01 to 24,79 double

@ 03,03,07,77 box recuadro

@ 04,18 say "instituto universitario de tecnología"

@ 05,25 say "curso de clipper básico"

@ 06,29 say "Fundainformatica"

do while .t.

  store 0 to edad

  nombre=spac(25)

  @ 14,08 say "                                "

  @ 10,06 say "entre su nombre [/ para salir]" get nombre pict "@k"

   read

  if nombre $"/"

    EXIT

  endif

  @ 11,50 say "entre su edad "  get edad pict "##" valid(edad>0)

  @ 13,08 say "hola " + nombre

  if (edad<11)

    @ 14,08 say "eres un niño "

  endif

   if edad>11

    if edad<17

       @ 14,08 say "eres un adolescente "

    else

      if edad<= 30

         @ 14,08 say "eres un joven"

      endif

      if edad<= 50

         @ 14,08 say "eres adulto"

      else

         @ 14,08 say "estas cruzando la esquina"

      endif

    endif    

  endif  

enddo 

wait""

clea

return

 

g.-* programa séptimo

clea

do while .t.

      store 0 to resultado, num1,num2, op

     @ 02,08 say "entre el primer número" get num1 pict ¨@# ¨

     @ 03,08 say "entre el segundo número" get num2 pict ¨@# ¨

     read

     @ 05,08 say "1.- SUMAR "

     @ 06,08 say "2.- MULTIPLICAR"

     @ 07,08 say "3.- SALIR"

     @ 08,10 say "ESCOJA SU OPCIÓN" get op ¨# ¨ VALID (op $¨123¨)

     if op=3

         exit

     endif

     do case

         case op=1

                   resultado = num1 + num2

               @ 10,08 say "el resultado es"

                   @ 10,25 resultado

         case op = 2

                   resultado = num1*num2

               @ 10,08 say "el resultado es"

                   @ 10,25 resultado

     endcase

enddo

 

2.-  Elabore un programa en clipper que:

 

                a.- Pida dos números los sume y guarde su contenido en una variable temporal, posteriormente muestre el valor de la suma. Debe usar en este ejercicio las sentencias CLEA, GET, SAY y PICTURE, así como los comentarios para documentar el programa.

 

 

                b.- Elabore un programa que pida dos números enteros y que a través de un menú se escoja una de las cuatro operaciones básicas o salir del programa. Para ello use los recursos vistos hasta ahora, el menú debe ser como el del ejemplo:

 

                                               1.- SUMAR

                                               2.- RESTAR

                                               3.- MULTIPLICAR

                                               4.- DIVIDIR

                                               5.- SALIR

                                               ESCOJA UNA OPCIÓN

 

 

            En su diskette encontrará un grupo de programas ejemplo de cada una de las aplicaciones  de los comandos e instrucciones  contenidas en el presente curso.

 


2.- MACRO SUSTITUCIÓN Y BLOQUES DE CODIGO

 

MACROS

 

                Recibe el nombre de macro un símbolo que informa al compilador/intérprete para que asuma el contenido de una variable como si fuera un literal. Son usadas generalmente en rutinas genéricas o reutilizables.

 

                Una macro puede especificarse de dos formas: utilizando una variable o usando una expresión que genere (devuelva) una cadena. Por lo tanto los dos principales objetivos de una macro son: la sustitución de un texto y la compilación de una expresión durante la ejecución del programa.

 

                Una macro se identifica con el operdor & delante del nombre de la variable que debe ser abierta. Un caso típico de su uso es con las órdenes use y find como se muestra a continuación:

* programa c09.prg

clea

use cliente

 

con una macro sería:

*programa c09.prg

clea

archi=“cliente”

use &archi

 

                En el ejemplo anterior se  ha utilizado una variable para la macro sustitución, otro ejemplo puede ser:

 

* programa c09.prg

clea

archi=spac(12)

@ 2,2 say “Nombre del archivo a ser usado....” get archi

read

if .not. file(“&archi”)

                @ 23,10 say “archivo no existe”

else

                use &archi

endif

 

                Sin embargo las versiones 5.0 en adelante permiten usar expresiones extendidas, en lugar del operador &, una expresión extendida se caracteriza por estar el nombre de la variable entre paréntesis.

 

* programa c09.prg

clea

archi=spac(12)

@ 2,2 say “Nombre del archivo a ser usado....” get archi

read

use (archi)

 

BLOQUE DE CODIGO

 

                “Se entiende como tal a un tipo de dato que contiene una expresión compilada que puede ser compilada oportunamente.”

 

                Como cualquier otro tipo de dato un bloque de código puede ser:

1. - Asignado a una variable

2. - Pasado como parámetro

3. - Devuelto por una función

4. - Especificado como un literal

 

                Un bloque de código puede estar formado por una o más expresiones que son evaluadas (cuando haya mas de una) de izquierda a derecha. Las expresiones deben estar separadas por comas, de forma tal que el bloque de código devuelve el resultado de la última expresión.

 

                De igual forma que una variable caracter es creada al asignarle una cadena de caracteres, o una variable de tipo fecha es creada con CTOD(), para crear una variable de tipo bloque de código basta con asignarle a ésta una expresión entre llaves como si se tratara de una matriz, con la diferencia que en este caso inmediatamente despues de la primera llave se debe colocar dos barras verticales, para diferenciarla de la matriz.

 

Ejemplos

a=“Albani”

b=ctod(“01/01/96”)

c:={\\ x>y}

 

                Entre otras cosas un bloque de código tiene como finalidad Crear rutinas genéricas, Crear opciones Alternativas en programación, Reducir el tamaño del código fuente utilizado. Es por ello que se puede afirmar que los bloques de código son más importantes que las Funciones Definidas por el Usuario.

 

                Un bloque de código por sí solo no tiene ninguna aplicación; por lo tanto debe ser evaluado, para ello Clipper provee de la funciones EVAL(), AEVAL(), DBEVAL().

 

                Supongamos que se tienen dos variables X , Z y la expresión X > Z  y se desea evaluar la expresión, veamos como queda con macros y cómo con un bloque de código:

 

* programa expre.prg

clea

exp=“x > z”

x=15; z= 10;

? &exp    ** devolverá .t.

 

*programa expre.prg

clea

x=15; z= 10;

b:={\\ x > z}

? eval(b)    ** devolverá .t.

 

 

                Del ejemplo anterior se deduce que una macro y un bloque de código son parecidos, sin embargo la diferencia estriba en su compilación; mientras que una macro se compila cada vez que el programa la necesita, el bloque de código lo hace una sola vez; demás está decir que los errores de una Macro se detectan por lo tanto en tiempo de corridad (run-time) mientras que en el bloque de código se hace en tiempo de compilación. Los ejemplos que siguen dan muestra de lo dicho:

 

* programa c10.prg

* usando una Macro

exp = “a >< b”

? &esp

 

* usando CODE BLOCK

c:={\\a >< b}

? eval(c)

 

                Otra diferencia importante es que si la expresión usada hace llamada a una función, tiene que tener la certeza que el compilador referenciará la función, o utilizar la orden EXTERNAL para que el enlazador la agregue al ejecutable. En un bloque de código son referenciadas automáticamente por el compilador y por lo tanto por el enlazador. Los siguientes programas muestran lo que sucede en cada caso:

 

*programa c11.prg

ac:=“funinc()”

nada=&ac

aca:={\\modfun()}

EVAL (aca)

 

function modfun

@ 23,10 say “se activo la funcion de modificar”

inkey(3)

return nil

 

*programa c12.prg

ac:=“funinc()”

nada=&ac

aca:={\\modfun()}

EVAL (aca)

 

function funinc

@ 23,10 say “se activo la funcion de incluir”

inkey(3)

return nil

 

                El bloque de código presenta como característica la permitibilidad de los parámetros, cosa que no es posible con las macros. El requerimiento para su uso es la declaración entre las barras en la definición del bloque, caso de haber más de uno deben ir separados por comas. Ejemplo:

                              

                               b:{\a,b,c\ (200 + a)/(b + c)}

 

                Es conveniente en este momento precisar el funcionamiento de EVAL(), en caso de existir parámetros, su sintaxis es:

                               Eval(<bloque>,<lista de parámetros>)

 

* programa c10par.prg

clea

x1:={\i,g\ i > g}

f:=20; a:=10

? EVAL(x1,f,a)        ** devuelve .t.

k:= 5; m:=6

? EVAL(x1,k,m)      ** devuelve .f.

                Los parámetros son pasados por valor, si se desea pasar un prámetro por referencia debe ir precedido de @. El siguiente ejemplo muestra el uso de los bloques de código. Los blóques de código son muy útiles a la hora de procesar matrices o registros de una base de datos.

 

* PROGRAMA c11.prg

local menu:=         { {“Añadir      “, “Agrega Registros”, {|| funinc()}},;

                                   {“Modificar “, “Modifica registros”, {|| funmod()}},;

                                   {“F I N       “, “Sale de la Aplicación”, {|| fin()} } }

do while .t.

  clea

  for i = to len(menu)

                @ 2,i+15 prompt menu(i,1) message menu(i,2)

  next

  menu to op

  if op = 0

     op = 3     * forza la salida de la aplicación

  endif

  eval (menu[op,3]))

enddo

 

function funinc

                @ 23,10 say “Usted entro en la rutina de añadir”

                inkey(3)

return nil

 

function funmod

                @ 23,10 say “Usted entro en la rutina de modificación”

                inkey(3)

return nil

 

function fin

                @ 23,10 say “Usted finalizó la aplicación”

                inkey(3)

                quit

return nil

 

 

6.- CLIPPER ORIENTADO A OBJETOS

 

                Si bien Clipper no es un lenguaje para programación orientada a objetos, introduce algunos conceptos utilizados en este tipo de lenguajes.

                Clipper 5.xx maneja solo 5 clases, no pudiendo crear más clases ni elementos para las clases ya existentes, las clases manejadas por Clipper son: Error, Get, Tbrowse y Tbcolumn.

 

                Veamos a continuación algunos conceptos básicos:

 

Clase        Una clase es un  modelo  para  la  creación  de  objetos, definiendo  las  operaciones  y

                   variables asociadas a dicho objeto.

 

Objeto       Es  un  modelo  de  una  clase.  Cada  objeto  posee  uno  o  más  parámetros  llamados

                   variables  modelos. Un  modelo  puede  recibir mensajes  y ejecutar  ciertas operaciones

                   (métodos). Las  variables  modelo  solo  pueden  recuperarse  o modificar  su contenido

                   mediante  el  envío  de mensajes  al objeto. Un objeto  se crea  mediante  la  llamada  a

                   una  función  especial  que depende de la clase de objeto a crear.

 

Mensaje  Es  la forma  mediante la  cual se le  solicita a un objeto la ejecución de una determinada

                   Tarea. El envcío de un mensaje a un objeto  devuelve un valor (al igual que la llamada a

                   una función). Para  enviar un mensaje  hay que especificar el nombre del objeto seguido

                   de dos puntos  y el nombre del  selector. El  selector  debe  tener el mismo  nombre  del

                   método a ser ejecutado.

 

Selector   Es el elemento que accionará el método a ser ejecutado. El nombre del método debe ser

                    igual al del selector.

 

Variables  Son  los atributos  o datos  que forman un objeto. Cada objeto tiene supropio conjunto

Modelo     de  variables  modelo,  con  sus valores  iniciales. Las varaibles  modelo  que tienen su

                     contenido accesible se llaman VME (Variables Modelo Exportables).

 

Función de    Es la función que crea el objeto de una determinada clase.

Creación

 

                Un Objeto se crea mediante la función de creación y su sintaxis es:

                               objeto:=<función de creación>

 

                Para acceder al contenido de una VME se usa la sintaxisis:

                               <objeto>:<VME>

 

                Para modificar el valor de una VME la sintaxis usada es:

                               <objeto>:<VME>:= <Valor>

 

                Para enviar un mensaje se debe usar la sintaxis siguiente:

                               <objeto>:<mensaje>[(<parámetros>)]

 

 

Clase GET

                Esta clase proporciona objetos para la edición interactiva de campos de archivos de datos y variables de memoria. Estos objetos proporcionan recursos para el formateo y comprobación de los datos(mediante los bloques de código).

                Un Objeto GET se asocia, en la mayoría de los casos, a una variable (llamada variable GET) que tiene su contenido modificado mediante la valoración de un bloque de código.

                El sistema GET puede dividirse en varios niveles o capas como sigue:

               

                read

                getreader

                getapplykey()

                getdoskey()

                getprevalidate()

                getpostvalidate()

                El siguiente ejemplo nos muestra como trabaja el nivel Read, el cual ha sido trabajado anteriormente pero sin las opciones color y When

 

* programa readcol.prg

clea

COD=spac(3);NOMBRE=spac(30); valor3:= valor2:=valor1:=0

@ 10,10 say “Codigo....” get COD pict “999” color “r/w,w/r”

@ 12,10 say “Nombre..” get NOMBRE pict “@!” color “,w/r”

@ 14,10 say “Valor1....” get valor1

@ 16,10 say “Valor2....” get valor2 color “w/b”

@ 18,10 say “Valor3....” get valor3 color “w/w”

read

 

 

* programa readwhen.prg

clea

COD=spac(3);NOMBRE=spac(30); valor3:= valor2:=valor1:=0

@ 10,10 say “Codigo....” get COD pict “999” color “r/w,w/r”

                when mensget (“solo se pueden introducir números (000 salir)”)

@ 12,10 say “Nombre..” get NOMBRE pict “@!” color “,w/r”

                when mensget (“teclee el nombre del empleado”)

@ 14,10 say “Valor1....” get valor1 when mensget (“”)

@ 16,10 say “Valor2....” get valor2 color “w/b”

                when mensget “valor1>1000 .and. mensget (“descuentos sobre el valor 1”))

@ 18,10 say “Valor3....” get valor3 color “w/w”

read

 

function mensget(texto)

@ 23,10 say spac(60)

@ 23,10 texto

return .t.

 

                Esta opción es muy útil ya que nos permite la edición del campo si el resultado de la comprobación previa, que realiza when, es verdadera, o saltar la edición del mismo si es falsa. Además esta opción permite el envío de un mensaje a la pantalla cada vez que el campo es editado; activando when invocando una función que visualiza el mensaje, o combinandola con otra expresión que evalúe la edición del campo.

 

NIVEL READMODAL()

                Un objeto GET puede ser creado de dos formas: con la orden @..GET o con la función de creación de la clase GET, que es GETNEW().

                Cuando se ejecuta una aplicación Clipper, se crea automáticamente una matríz PUBLICA llamada GETLIST, sin ningún contenido. Cada vez que una órden get es ejecutada, se añade un elemento a la matríz.

Ejemplo explicativo:

 

* programa gets.prg

clea

Nombre=“SanJuan”

salario=0

@ 1,5 say “Introduzca su Nombre....” get Nombre

@ 2,5 say “Introduzca el salario.......”get salario

read

                El procesador traduce ester código en:

 

scroll(); SetPos(0,0); _KillRead(); GetList:={}

Nombre=“SanJuan”

salario=0

DevPos(1,5); DevOut( “Introduzca su Nombre....”);

SetPos(Row(),Col()+1);

AAdd(GetList,_Get_(Nombre,”Nombre”,,,))

DevPos(2,5); DevOut(“Introduzca el salario.......”);

SetPos(Row(),Col()+1);

AAdd(GetList,_Get_(salario,”salario”,,,))

ReadModal(GetList); GetList:={}

 

                Del anterior bloque de código se deduce que la función AADD incrementa en un elemento la matriz GETLIST mediante la función interna _GET_, la cual crea un objeto GET. Se advierte además que read ha sido sustituido por READMODAL, y que despues de su ejecución la Matriz GETLIST queda vacía.

 

                Otra forma de crear objetos GET es mediante GETNEW() cuya sintaxis es:

 

GETNEW([<lin>,<col>],[<codeblock>],[<variable.]

                 [<picture>],[<atrib_color>])

 

CREACION DE GETS ANIDADOS

                Antes de aparecer las versiones 5.xx de Clipper, era una verdadera azaña anidar varios gets con diferentes read, de forma tal que se pudieran procesar un grupo primero, luego un segundo grupo y posteriormente regresar al primero,puesto que el segundo read liberaría al primer grupo de gets.

 

                En la versón 5 se soluciona este problema ya que permite la creación de una matriz GETLIST de tipo LOCAL. Como es sabido todo get se convierte en un elemento de la matriz PUBLICA GETLIST, la cual se reinicializa despues de un Read; en nuestro caso la matríz PUBLICA se usará para el primer grupo de gets, y la LOCAL para el segundo, evitando de esta manera que se pierdan los primeros gets.

 

* programa ejemplo.prg

clea

set key -1 to calculo

cod=spac(3)

Nom=spac(20)

desc:=valor:=0

@ 1,1 say “codigo.......” get cod

@ 2,1 say “nombre.....” get nom

@ 3,1 say “valor.........” get valor pict “@E 999,999.99”;

                valid if(valor=0 calculo(@valor),.t.)

@ 4,1 say “descuento..”get desc pict “99”

read

 

function calculo(varia)

local GETLIST:={}, v1:= v2:= v3:= v4:= v5:=0

pantcalc:=saveScreeen(1,50,7,61)

@ 1,50 to 7,61

@ 2,51 get v1 pict “@E 999,999.99”

@ 2,51 get v2 pict “@E 999,999.99”

@ 2,51 get v3 pict “@E 999,999.99”

@ 2,51 get v4 pict “@E 999,999.99”

@ 2,51 get v5 pict “@E 999,999.99”

read

varia=v1+v2+v3+v4+v5

keyboard varia

restorescreen (1,50,7,61, pantclac)

return .t.

 

MODIFICACION DEL GET MEDIANTE LAS VARAIBLES MODELO

 

                Para modificar el valor de un get activo es necesario crear un objeto correspondiente al get actual mediante la función GETACTIVE(), así:

                               oG:=GETACTIVE()

 

                Para saber el nombre de la variable correspondiente a ese GET  debe usar la varaible modelo NAME, como se muestra:

                               ? oG:NAME

 

                Si lo que desea saber es el contenido, entonces usará:

                               ? oG:VARGET()

 

                Si está editando GETS contenidos en GETLIST, puede usar directamente el elemento de la matríz para acceder a sus variables modelo, así:

                               ? GETLIST[3]:NAME

 

 

LA CLASE TBROWSE

 

                La clase TBROWSE facilita la manipulación de tablas al estilo de DBEDIT(), pero con más posibilidades ya que cuenta con objetos.

                Permite la presentación de datos en forma tabular, la edición de los mismos, la visualización y selección de datos diferenciados. La recuperación de los datos es efectuada mediante la evaluación de los bloques de código. Cada objeto TBROWSE depende de los objetos creados por la clase TBCOLUMN.

 

                Para trabajar con el Tbrowse se utilizan dos funciones, una para datos de tableas y otra para datos diversos: la función TBROWSEDB() y la función TBROWSENEW().

                               TBROWSEDB(<LinSup>,<ColSup>,<LinInf>,<ColInf>)

 

                La función Tbrowsedb crea un objeto dentro de las coordenadas especificadas en su invocación; establece además unas variables modelo específicas para el manejo de los archivos de datos.

 

                               TBROWSENEW(<LinSup>,<ColSup>,<LinInf>,<ColInf>)

 

                La función Tbrowsenew crea un objeto dentro de las coordenadas especificadas en su invocación. este Objeto no contiene bloque de código,  por lo tanto debe ser añadida por el usuario.

 

                dentro de la clase Tbrowse estan disponibles las siguientes Variables Modelo Exportables(VME):

 

autolite                 Contiene un valor lógico, que permite destacar la celda actual.

cargo                     Es una variable definida por el usuario, que puede ser recuperada posteriormente.

colcount               Contiene un número que indica la cantidad de columnas TBROWSE. Cada columna Tbrowse

                               debe tener un objeto TBCOLUMN asociado a ella.

colorespc              Permite manejar los colores de visualización del Tbrowse a travéz de una cadena de

                               caracteres.

colpos                   Contiene la indicación de la columna sobre la cual Tbrowse está situado.

colsep                    Contiene una cadena de caracteres que define el separador de columnas, para aquellas

                               columnas que no tienen separador propio.

footsep                  Contiene una cadena de caracteres que define el separador final, para aquellas columnas que

                               no tienen separador propio.

freeze                     Contiene un número que indica la cantidad de columnas a ser congeladas a partir de la primera

                               a la izquierda y que permaneceran fijas en le pantalla.

gobottomblock  Contiene un bloque de código que es ejecutado en respuesta al mensaje gobottom().

gotopblock          Contiene un bloque de código que es ejecutado en respuesta al mensaje gotop(). El bloque de

                               código debe tener órdenes que sitúen el cursor en el primer registro del archivo. Tanto ésta

                               como la anterior VME deben ser usadas al visualizar una base de datos.

headsep Contiene una cadena de caracteres que define el separador de encabezamientol, para aquellas

                               columnas que no tienen separador propio.

hitbottom              Contiene el valor lógico true (.T.) que indica que se intentó pasar del último registro disponible.

leftvisible              Indica el número de columna no congelada más a la izquierda de TBROWSE.

nbottom Contiene un valor que indica la última línea usada para la visualización de TBROWSE.

 

 

8 . - CLIPPER EN LA RED

 

            Se puede decir que el único requerimiento de Clipper para trabajar en una Red de Área Local (LAN), es que ésta debe respaldar la llamada de Clipper a la función del DOS ya que Clipper usa Exclusivamente llamadas al DOS para todas sus operaciones relacionadas con la Red.

                Dicho de otra forma una aplicación desarrollada en Clipper corre en cualquier LAN diseñada en el Standard del DOS.

 

CARACTERISTICAS

 

                * Modalidad compartida, para permitir el uso a dos o mas usuarios  de un mismo archivo.

                   ( SET EXCLUSIVE OFF )

                * Modalidad exclusiva, que anula la capacidad de compartir archivos.

                   ( SET EXCLUSIVE ON, USE <NOMARCH> EXCLUSIVE )

                * Bloqueo  lógico,  que  evita  que  dos  o  mas  usuarios  actualicen  el  mismo  archivo

                   simultáneamente. ( FLOCK() )

                * Comprobación del bloqueo Lógico de archivos, por medio de dos funciones.

                   ( FLOCK() Y RLOCK() )

                * Desbloqueo de archivos, regresando a la modalidad compartida.

 

                * Uso de la impresora compartida de la red.

                * Comprobación  de  errores  de  la  red,  para determinar  si se ejecutó exitosamente una

                   orden.

 

COMANDOS Y FUNCIONES DE CLIPPER PARA RED

 

SET PRINTER TO

                Comando que permite redirigir la impresión hacia la impresora compartida de la red.

 

FLOCK()

                Intenta el bloqueo del archivo en uso, si tiene éxito devuelve el valor lógico verdadero (.T.), de  lo contrario devuelve falso (.F.). Cuando tiene éxito se deshace cualquier bloqueo anterior.

 

RLOCK()

                Bloquea un registro del archivo en uso, si el intento tiene éxito regresa .T. , si no el valor regresado es .F. . Cuando el bloqueo tiene éxito se deshace cualquier bloqueo anterior.

 

UNLOCK

                Este comando es usado para deshacer el bloqueo de archivos y registros fijados previamente por funciones de bloqueo.

 

USE <NOMARCH> EXCLUSIVE/SHARED

                Exclusive abre los archivos y sus índices asociados en la modalidad exclusiva. Por defecto Clipper abre los archivos en modalidad exclusiva.

                Shared abre los archivos y sus índices asociados en la modalidad compartida.

Ambas cláusulas operan sin tener en cuenta la orden SET EXCLUSIVE.

 

NETERR()

                Devuelve el valor lógico verdadero cuando fracasa una operación de la red, según la tabla siguiente:

 

COMANDO

NETERR()

CAUSA

 Use

.T.

Uso exclusivo de otro usuario

Use ... Exclusive

.T.

Archivo abierto por otro usuario

Append Blank

.T.

Archivo bloqueado por otro usuario o ha ordenado un Append Blank simultáneamente.

 

NETNAME()

            Devuelve la identificación de la estación de trabajo en curso.

 

 

            PROGRAMANDO PARA LA RED

 

                Cuando se desarrolla una aplicación para la red se debe tener en cuenta:

 

                * Apertura de Archivos para compartir.

                * Apertura exclusiva de Archivos.

                * Cuando bloquear Archivos y/o Registros

                * Bloqueo y su técnica

                               - Como intentarlo

                               - Como superar un bloqueo fracasado.

 

                Recuerde que Ud. abrirá los archivos en modalidad compartida, luego el fracaso en la apertura ( use <nomarch> ) es una posibilidad real, por lo tanto es recomendable el uso de NETERR() para detectar que la apertura de un archivo fué exitosa; a causa de esto no se deben abrir al mismo tiempo los archivos índices al mismo tiempo, si no que una vez comprobada la apertura exitosa del archivo se debe colocar la orden SET INDEX, la cual los abre en la misma modalidad en que se abrió el archivo.

 

                El siguiente ejemplo muestra como abrir archivos e índices en un programa para redes:

 

* programa demo

use <nomarch> shared

if neterr()

                @ 06,24 say “Archivo en uso, no puede compartirse”

                break

endif

set index to <nomind>

@ 06,15 say “Apertura exitosa”

return

 

                Es oportuno acotar aquí unas reglas sencillas a tener en cuenta en el momento de abrir archivos para red:

                * Si el comando o función escribe (modifica) el archivo la modalidad debe ser exclusiva.

                * Si el comando o función lee el archivo la modalidad debe ser compartida.

               

Así: 

            APPEND FROM, COPY FILE LABEL FORM .. TO FILE, REPORT FORM ... TO FILE, RESTORE, TYPE ... TO FILE, UP DATE Y MEMOREAD(), usan los archivos en modo  de uso compartido ( SHARED ).

 

            COPY STRUCTURE, COPY STRUCTURE STEND, COPY TO, CREATE, CREATE FROM, DISPLAY ... TO FILE, INDEX, JOIN, LIST .. TO FILE, SAVE, SET ALTERNATE, SET PRINTER, SORT, TEXT ... TO FILE, TOTAL Y MEMOWRITE(), necesitan el archivo de uso exclusivo.

 

                Una vez determinado el modo de apertura de un archivo, es necesario bloquear el archivo o registro según el uso que se le valla a dar; es aquí donde radica el éxito de la programación, ya que como programador usted no tiene control sobre el comportamiento de los comandos y funciones, pero si puede tomar la desición adecuada en el momento de programar.

 

                Al ejemplo anterior se le agrega una función para que intente la apertura de un archivo y continúe intentandolo por un tiempo límite o hasta que tenga éxito. La función aquí usada es una función del usuario a la cual se le pasa como argumentos el nombre del archivo, la modalidad de apertura y el número de segundos que debe reintentar la operación.

 

#define archcom .F.

#define archiexc  .F.

if libre(nomarch,archcom,7)

                set index to nomind

else

                @06,24 say “Archivo en uso “

                break

endif

Function Libre(parchivo,pmodo,ptiempo)

local hasta

hasta = ptiempo

do while

   if pmodo

      use parchivo exclusive

   else

      use parchivo shared

endif

if .not. NETERR()

                return (.T.)

endif

inkey(1)

ptiempo = ptiempo - 1

enddo

return (.F.)

 

 

ANEXOS

 

ORDENES, FUNCIONES Y PROCEDIMIENTOS ÚTILES EN CLIPPER

 

AADD(): Añade un nuevo elemento al final de un arreglo.

                               Sintaxis:  AADD(nombre arreglo,valor)

 

ACLONE() : Duplica un arreglo.

                               Sintaxis: ACLONE(arreglo)

 

ACOPY() : Copia todo o parte de un arreglo en otro.

                               Sintaxis: ACOPY(arreglo1,arreglo2,num1,num2,num3)

 

ADEL() : Borra un elemento de un arreglo.

                               Sintaxis: ADEL(arreglo,num)

 

AFILL() : Llena con un valor determinado el arreglo.

                               Sintaxis: AFILL(arreglo,valor-esxp,comienzo,cantidad)

 

ASCAN() : Busca una expresión en un arreglo, si la consigue devuelve la  posición  donde

                       se encuentra, si no devuelve 0.

                               Sintaxis: ASCAN(arreglo,expresión,comienzo,cantidad)

 

ASIZE() : Modifica el tamaño de un arreglo, aumentándolo o disminuyéndolo.

                               Sintaxis: ASIZE(arreglo,longitud)

 

ASORT() : Ordena un arreglo.

                               Sintaxis: ASORT(arreglo,exp1,exp2)

 

LEN() : Retorna el número de elementos contenidos en un arreglo.

                               Sintaxis: LEN(arreglo)

 

SETCOLOR() : Permite cambiar el color del video. Entrega además los valores actuales de

                                 los colores antes de cambiarlos.

                                               Sintaxis: SETCOLOR(valores)

 

SETCURSOR() : Permite visualizar o no el cursor, pudiendo además cambiar la forma del

                                    mismo, devuelve la forma actual antes de cambiarla.

                                               Sintaxis: SETCURSOR(valor)

 

CHR() : Se utiliza para representar un código ASCII como un símbolo asociado a la

                  pantalla.

                               Sintaxis: CHR(código).

 

INKEY() : Espera cierto tiempo, en segundos, a que el usuario pulse una tecla. Si no se le dá

                      el argumento INKEY devuelve el control inmediatamente.

                               Sintaxis: INKEY(valor)

 

DISKSPACE() : Devuelve un valor numérico correspondiente a la cantidad de Bytes libres

                                  en el disco.

                                               Sintaxis: var=DISKSPACE()

 

SETKEY() : Asocia un bloque de código a una tecla asignada.

 

VAL() : Evalúa una cadena hasta obtener un caracter no numérico o un segundo separador

                  decimal, devolviendo el valor numérico correspondiente.

                               Sintaxis: VAL(expresión)

 

CTOD() : Convierte una cadena de caracteres en un valor tipo fecha.

                               Sintaxis: CTOD (¨12/01/96¨)

 

DTOC() : Convierte un valor tipo fecha, en una cadena de caracteres.

                               Sintaxis: DTOC (01-12-96)

 

SPACE() : Devuelve una cadena de espacios de longitud determinada.

                               Sintaxis: SPACE(valor)

 

REPLICATE() : Devuelve una cadena de caracteres iguales de una longitud determinada.

                                               Sintaxis: REPLICATE(caracter,longitud)

 

LTRIM() : Elimina los espacios en blanco al final de una cadena.

                               Sintaxis: LTRIM(cadena)

 

RTRIM() : Elimina los espacios en blanco al principio de una cadena.

                               Sintaxis: RTRIM(cadena)

 

ALLTRIM() : Elimina los espacios en blanco al principio y al final de una cadena.

                               Sintaxis: ALLTRIM(cadena)

 

STR() : Convierte un dato numérico en una cadena de caracteres.

                               Sintaxis: STR(cadena,longitud,decimales)

 

SUBSTR() : Se utiliza para obtener una subcadena de una cadena específica.

                               Sintaxis: SUBSTR(cadena,inicio,longitud)

 

ISALPHA() : Devuelve .T. si el caracter más a la izquierda de una cadena es Alfabético.

                               Sintaxis: ISALPHA(cadena)

 

ISDIGIT() : Devuelve .T. si el caracter más a la izquierda de una cadena es un dígito.

                               Sintaxis: ISDIGIT(cadena)

 

 

ISLOWER() : Devuelve .T. si el primer caracter de una cadena es una letra minúscula.

                               Sintaxis:ISLOWER(cadena)

 

ISUPPER() : Devuelve .T. si el primer caracter de una cadena es una letra  mayúscula.

                               Sintaxis:ISUPPER(cadena)

 

STRTRAN() : Usada para buscar y reemplazar caracteres dentro de una cadena de

                               caracteres o un campo memo.

                                               Sintaxis: STRTRAN(cadena,cadenabuscada,cadenanueva)

 

STUFF() : Es una función muy versátil usada con propósitos tales como: Eliminar caracteres de una cadena, Reemplazar caracteres de una cadena o Insertar caracteres en la cadena.

                               Sintaxis: STUFF(cadena,posicióninicial,longitud,cadenanueva)