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. DURACIN: 16 HORAS. CONTENIDO 1.- Conceptos Bsicos 1.1. Archivo. 1.2. Base de Datos 1.3. Operaciones con archivos 2.- Generalidades del Clipper 2.1. Que es Clipper 2.2. Caractersticas de Clipper 2.3. Requerimientos de Clipper 3.- Programando con Clipper 3.1. Variables y Operadores 3.2. Estructuras de Decisin 3.3. Estructuras de Repeticin 3.4. Edicin de un programa 3.5. Entrada y salida de datos 4.- Compilacin y prueba de un Programa 5.- Manejo de Archivos 5.1- Creacin de archivos 5.2- Apertura y cierre de archivos 5.3- reas de trabajo 5.4- Adicin 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 eliminacin 5.6.2- Funcin delete( ) 5.6.3- Comando set delete 5.6.4- Recuperacin de los registros 5.6.7- Eliminacin fsica de los registros 5.7- Bsqueda secuencial en un archivo 5.7.1- Comando locate 5.7.2- Comando continue 5.8- Creacin y apertura de archivos indexados 5.8.1- Orden Index on ( ) to 5.8.2- Orden Set index to 5.9- Bsqueda 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.- Presentacin de datos en Pantalla 9.- Diseo, elaboracin y prueba de un sistema sencillo. 10.- Compilacin y Encadenamiento - Libreras Pre-encadenadas - Compilacin por Mdulos - Encadenamiento con Archivos ( .LNK ) - Creacin de Archivos Overlay ( .OVL ) - Encadenamiento de Libreras Externas. 11.- Macro-Sustitucin y Bloques de Cdigo. 12.- La Funcin Achoice() 13.- La Funcin Dbedit() 14.- Manejo de Mouse - Funcin MouseMenu() - Funcin ChoiceMenu() 15.- Introduccin a la Programacin Orientada a Objetos ( POO ) - La Clase Get() - La Clase Tbrowse() 16.- Manejo de Ayudas - La Funcin Memoedit(). - Creacin de un Editor de Texto. 17.- Manejo del Clipper en una Red de rea Local ( L.A.N. ) - Introduccin - Funciones y Comandos - Limitaciones y Recomendaciones - Creacin de Funciones para la Apertura de Archivos. - Creacin de Funciones para el Bloqueo de Archivos y Registro
1 de 30
CONCEPTOS BSICOS
1.- Dato Del Latn data que significa hecho, entidades independientes sin evaluar. Los datos pueden ser numricos o no numricos. Un conjunto de datos se convierten en informacin cuando son evaluados y procesados. Para que este conjunto de datos se procese eficientemente debe estar organizado lgicamente 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 relacin entre s, y un campo es la unidad ms pequea a la que se puede referir un dato. La figura siguiente nos muestra de una forma grfica lo que sera un archivo, un registro y un campo.
REGISTRO 1 CAMPO 1 DEL REGISTRO 1 CAMPO 1 DEL REGISTRO 3 CAMPO 2 DEL REGISTRO 1 CAMPO 2 DEL REGISTRO 3
REGISTRO 2 REGISTRO 3
ARCHIVO 2.- Base de Datos Es una coleccin 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 relacin 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, guardndolos, cambindolos o borrndolos segn 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 aplicacin que se desarrolle para manejar archivos, debe llenar como primer requisito la conservacin y proteccin de los datos.
PROGRAMACIN 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 nmeros, cadenas de caracteres, una fecha o un valor lgico. 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 asignacin; ejemplo Identificador = valor Ejemplos segn tipo: NUMRICAS: store 0 to cdigo cdigo = 0 TIPO FECHA Clipper dispone de la funcin 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 declaracin es como sigue: DECLARE VAR [] Donde var corresponde al identificador del arreglo y dentro de los corchetes se coloca un nmero que le indica a Clipper cuantas variables con ese nombre va a manejar, ejemplo: Declare cliente[3] as: cliente[1] podra ser el nombre cliente[2] la direccin y cliente[3] el telfono del cliente Los arreglos en Clipper puede ser tambin multidimensionales, veamos el ejemplo de creacin 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 numricos, de cadena, de relacin y lgicos; su descripcin se enumera a continuacin: 3 de 30 LGICAS store .t. to ciclo ciclo = .t.
Numricos: + ---------------> Suma ---------------> Substraccin * ---------------> Producto / ---------------> Divisin ** o ^ ---------------> Exponenciacin % ---------------> Modulo Relacionales > ---------------> Mayor que .and. < ---------------> Menor que .or. = ---------------> Igual que == o ++ --------------> Exactamente igual que <= ---------------> Menor o igual que >= ---------------> Mayor o igual que != o <> ---------------> Diferente + $
lgico
Clipper maneja los siguientes operadores de asignacin: = := =+ -= *= /= ---------------> Asignacin simple ---------------> Asignacin en lnea ---------------> Adicin y asignacin en la lnea ---------------> Substraccin y adicin en la lnea ---------------> Producto y asignacin ---------------> Divisin y asignacin en lnea
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 tambin 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 especficamente automticamente se considera de tipo PRIVATE. 2.- Estructuras de Decisin En Clipper se encuentra la estructura de decisin simple si entonces, la compuesta si entonces .... de lo contrario (si no) y la de decisin mltiple caso; sus sintaxis se enumeran a continuacin: if <condicin> instruccin o instrucciones endif if <condicin> instruccin o instrucciones else instruccin o instrucciones endif La condicin para efectuar la toma de decisiones debe ser una condicin lgica o relacional, ejemplo: 4 de 30
if conta = 3 v=4 else v = v+1 endif if conta > conta1 v=4 else v = v+1
endif DO CASE CASE <variable> = <valor1> instruccin o instrucciones CASE <variable> = <valor2> instruccin o instrucciones CASE <variable> = <valorn> instruccin o instrucciones ENDCASE 3.- ESTRUCTURAS DE REPETICIN Clipper trabaja con dos estructuras repetitivas, el DO WHILE y el FOR... NEXT, la sintaxis de esta son: DO WHILE <condicin> instruccin o instrucciones ENDDO Esta estructura es la principal y la ms utilizada para controlar la ejecucin global de un programa en Clipper. Su funcionamiento depende de la evaluacin que se hace inicialmente de la condicin, 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 condicin, si esta deja de cumplirse el ENDDO entrega el control del programa a la lnea 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 condicin. De igual forma que el ciclo puede interrumpirse, es posible ordenarle que se repita, para ello Clipper provee de la instruccin LOOP. FOR <variable> = <valor inicial> TO <valor final> [STEP <incremento>] Instruccin 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 lnea siguiente al NEXT.
EDICIN 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 transcripcin debemos pulsar las teclas Ctrl-W y el editor sale al dos y salva el programa con la extensin prg.
5 de 30
Si usamos otro editor debemos tener presente al salvarlo agregar la extensin prg, as si usamos el Edit del DOS podramos seguir el siguiente procedimiento: Edit <nombre.prg> para estar seguros de colocar la extensin correcta, ya que sin ella Clipper no lo compila. Clipper tiene como nica exigencia que cada orden debe estar en una lnea diferente ya que no posee un separador de rdenes, por lo tanto al momento de transcribir el programa debemos pulsar enter despus de cada instruccin para separarla de la siguiente. Cuando se desarrolla una aplicacin siempre es conveniente documentarla brevemente para ello Clipper posee cuatro formas de colocar comentarios en los programas. * Usado para una sola lnea de comentario y puede ir en cualquier parte del programa. /* .... */ Usado cuando el comentario ocupa ms de una lnea && o // se emplea cuando el comentario se coloca en la misma lnea que un comando.
X.......................................... Visualiza DB despus de un nmero negativo. D........................................... Muestra la fecha en formato especificado. E............................................ Muestra la fecha en formato europeo. Z............................................ Muestra los valores cero como blancos.
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 operacin 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 visualizacin 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 ningn argumento. 7 de 30
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 nmero de 1 a 250. Se puede identificar por el nombre del archivo que est abierto en cada uno. Cualquier archivo abierto sin una seleccin previa ser abierto en el rea A. El comando que selecciona un rea es: SELECT rea donde rea es la letra nmero correspondiente al rea por abrirse. EJEMPLO: SELECT 1 USE cliente SELECT 2 USE factura
FUNCION SELECT( ):
Retorna el nmero 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 inclusin Su sintaxis es: APPEND BLANK Despus de la inclusin del registro en blanco, los campos vacos deben llenarse mediante el comando REPLACE, el cul sustituye el contenido de los campos especificados por los resultados o el valor de las expresiones. Su sintaxis es: REPLACE campo WITH expresin [ FOR condicin ] [ WHILE condicin ] Con el comando APPEND FROM copia registros del archivo especificado hacia el archivo en uso. Su sintaxis es: APPEND FROM nomb_arch [ FOR WHILE condicin ]
SKIP sin argumento avanza el puntero al siguiente registro. Si se indica un nmero positivo, el puntero se mover la cantidad de registros hacia el final del archivo. Si por el contrario, el nmero es negativo se mover en direccin hacia el inicio del archivo.
FUNCION DELETE( ) :
Retorna el valor lgico .T. si el registro actual est marcado para la eliminacin o .F. en caso contrario. Su sintaxis es: DELETE( )
COMANDO CONTINUE: Despus del comando LOCATE se utiliza el comando CONTINUE si existe otro registro que satisfaga la condicin, en caso contrario el puntero se mover hasta el final del archivo. Su sintaxis es: CONTINUE
EJERCICIOS
1.- A continuacin encontrar un grupo de programas, edite con PE, salve, compile y pruebe cada uno de ellos segn lo expuesto anteriormente. a.-* programa primero clea store 0 to edad nombre = space(10) 10 de 30
accept "entre su edad " to edad accept "entre su nombre " to nombre ? "hola " ?? nombre ? "tienes " ?? edad ?? " aos" 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 " aos" 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 " aos" 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 acompaada 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 decisin */ @ 01,01 to 24,79 double // dibuja un marco en la pantalla @ 03,03,07,77 box recuadro @ 04,18 say "instituto universitario de tecnologa" @ 05,25 say "curso de clipper bsico" @ 06,29 say "Fundainformatica" @ 10,08 say "entre su nombre " get nombre pict "@!" /* la funcin VALID permite validar la entrada, se usa acompaando 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 nio " endif if edad>11 if edad<17 @ 14,08 say "eres un adolescente " 11 de 30
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 repeticin do while */ @ 01,01 to 24,79 double @ 03,03,07,77 box recuadro @ 04,18 say "instituto universitario de tecnologa" @ 05,25 say "curso de clipper bsico" @ 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 nio " 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 12 de 30
store spac(25) to nombre @ 01,01 to 24,79 double @ 03,03,07,77 box recuadro @ 04,18 say "instituto universitario de tecnologa" @ 05,25 say "curso de clipper bsico" @ 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 nio " 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 sptimo clea do while .t. store 0 to resultado, num1,num2, op @ 02,08 say "entre el primer nmero" get num1 pict @# @ 03,08 say "entre el segundo nmero" get num2 pict @# read @ 05,08 say "1.- SUMAR " @ 06,08 say "2.- MULTIPLICAR" @ 07,08 say "3.- SALIR" @ 08,10 say "ESCOJA SU OPCIN" 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 13 de 30
endcase enddo 2.- Elabore un programa en clipper que: a.- Pida dos nmeros 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 nmeros enteros y que a travs de un men se escoja una de las cuatro operaciones bsicas 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 OPCIN
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.
14 de 30
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 cdigo basta con asignarle a sta una expresin 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 cdigo tiene como finalidad Crear rutinas genricas, Crear opciones Alternativas en programacin, Reducir el tamao del cdigo fuente utilizado. Es por ello que se puede afirmar que los bloques de cdigo son ms importantes que las Funciones Definidas por el Usuario. Un bloque de cdigo por s solo no tiene ninguna aplicacin; 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 expresin X > Z y se desea evaluar la expresin, veamos como queda con macros y cmo con un bloque de cdigo: * 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 cdigo son parecidos, sin embargo la diferencia estriba en su compilacin; mientras que una macro se compila cada vez que el programa la necesita, el bloque de cdigo lo hace una sola vez; dems 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 cdigo se hace en tiempo de compilacin. 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 expresin usada hace llamada a una funcin, tiene que tener la certeza que el compilador referenciar la funcin, o utilizar la orden EXTERNAL para que el enlazador la agregue al ejecutable. En un bloque de cdigo son referenciadas automticamente 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 16 de 30
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 cdigo presenta como caracterstica la permitibilidad de los parmetros, cosa que no es posible con las macros. El requerimiento para su uso es la declaracin entre las barras en la definicin del bloque, caso de haber ms 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 parmetros, su sintaxis es: Eval(<bloque>,<lista de parmetros>) * 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 parmetros son pasados por valor, si se desea pasar un prmetro por referencia debe ir precedido de @. El siguiente ejemplo muestra el uso de los bloques de cdigo. Los blques de cdigo son muy tiles a la hora de procesar matrices o registros de una base de datos. * PROGRAMA c11.prg local menu:= { {Aadir , Agrega Registros, {|| funinc()}},; {Modificar , Modifica registros, {|| funmod()}},; {F I N , Sale de la Aplicacin, {|| 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 aplicacin endif eval (menu[op,3])) enddo function funinc @ 23,10 say Usted entro en la rutina de aadir inkey(3) return nil function funmod @ 23,10 say Usted entro en la rutina de modificacin inkey(3) return nil function fin 17 de 30
Mensaje Es la forma mediante la cual se le solicita a un objeto la ejecucin de una determinada Tarea. El envco de un mensaje a un objeto devuelve un valor (al igual que la llamada a una funcin). 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 mtodo a ser ejecutado. Selector Es el elemento que accionar el mtodo a ser ejecutado. El nombre del mtodo 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). Funcin de Es la funcin que crea el objeto de una determinada clase. Creacin Un Objeto se crea mediante la funcin de creacin y su sintaxis es: objeto:=<funcin de creacin> 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>[(<parmetros>)] Clase GET Esta clase proporciona objetos para la edicin interactiva de campos de archivos de datos y variables de memoria. Estos objetos proporcionan recursos para el formateo y comprobacin de los datos(mediante los bloques de cdigo). Un Objeto GET se asocia, en la mayora de los casos, a una variable (llamada variable GET) que tiene su contenido modificado mediante la valoracin de un bloque de cdigo. El sistema GET puede dividirse en varios niveles o capas como sigue: read 18 de 30
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 nmeros (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 opcin es muy til ya que nos permite la edicin del campo si el resultado de la comprobacin previa, que realiza when, es verdadera, o saltar la edicin del mismo si es falsa. Adems esta opcin permite el envo de un mensaje a la pantalla cada vez que el campo es editado; activando when invocando una funcin que visualiza el mensaje, o combinandola con otra expresin que evale la edicin del campo.
NIVEL READMODAL()
Un objeto GET puede ser creado de dos formas: con la orden @..GET o con la funcin de creacin de la clase GET, que es GETNEW(). Cuando se ejecuta una aplicacin Clipper, se crea automticamente una matrz PUBLICA llamada GETLIST, sin ningn contenido. Cada vez que una rden get es ejecutada, se aade un elemento a la matrz. 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 cdigo en: scroll(); SetPos(0,0); _KillRead(); GetList:={} Nombre=SanJuan salario=0 DevPos(1,5); DevOut( Introduzca su Nombre....); 19 de 30
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 cdigo se deduce que la funcin AADD incrementa en un elemento la matriz GETLIST mediante la funcin interna _GET_, la cual crea un objeto GET. Se advierte adems que read ha sido sustituido por READMODAL, y que despues de su ejecucin la Matriz GETLIST queda vaca. Otra forma de crear objetos GET es mediante GETNEW() cuya sintaxis es:
? 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 matrz para acceder a sus variables modelo, as: ? GETLIST[3]:NAME
LA CLASE TBROWSE
La clase TBROWSE facilita la manipulacin de tablas al estilo de DBEDIT(), pero con ms posibilidades ya que cuenta con objetos. Permite la presentacin de datos en forma tabular, la edicin de los mismos, la visualizacin y seleccin de datos diferenciados. La recuperacin de los datos es efectuada mediante la evaluacin de los bloques de cdigo. 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 funcin TBROWSEDB() y la funcin TBROWSENEW(). TBROWSEDB(<LinSup>,<ColSup>,<LinInf>,<ColInf>) La funcin Tbrowsedb crea un objeto dentro de las coordenadas especificadas en su invocacin; establece adems unas variables modelo especficas para el manejo de los archivos de datos. TBROWSENEW(<LinSup>,<ColSup>,<LinInf>,<ColInf>) La funcin Tbrowsenew crea un objeto dentro de las coordenadas especificadas en su invocacin. este Objeto no contiene bloque de cdigo, por lo tanto debe ser aadida por el usuario. dentro de la clase Tbrowse estan disponibles las siguientes Variables Modelo Exportables(VME): autolite Contiene un valor lgico, que permite destacar la celda actual. cargo Es una variable definida por el usuario, que puede ser recuperada posteriormente. colcount Contiene un nmero que indica la cantidad de columnas TBROWSE. Cada columna Tbrowse debe tener un objeto TBCOLUMN asociado a ella. colorespc Permite manejar los colores de visualizacin del Tbrowse a travz de una cadena de caracteres. colpos Contiene la indicacin 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 nmero 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 cdigo que es ejecutado en respuesta al mensaje gobottom(). gotopblock Contiene un bloque de cdigo que es ejecutado en respuesta al mensaje gotop(). El bloque de cdigo debe tener rdenes que siten 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 lgico true (.T.) que indica que se intent pasar del ltimo registro disponible. leftvisible Indica el nmero de columna no congelada ms a la izquierda de TBROWSE. nbottom Contiene un valor que indica la ltima lnea usada para la visualizacin de TBROWSE.
8 . - CLIPPER EN LA RED
21 de 30
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 funcin del DOS ya que Clipper usa Exclusivamente llamadas al DOS para todas sus operaciones relacionadas con la Red. Dicho de otra forma una aplicacin desarrollada en Clipper corre en cualquier LAN diseada 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 lgico, que evita que dos o mas usuarios actualicen el mismo archivo simultneamente. ( FLOCK() ) * Comprobacin del bloqueo Lgico 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. * Comprobacin de errores de la red, para determinar si se ejecut exitosamente una orden.
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.
NETERR()
Devuelve el valor lgico verdadero cuando fracasa una operacin de la red, segn la tabla siguiente: COMANDO Use Use ... Exclusive Append Blank NETERR() .T. .T. .T. CAUSA Uso exclusivo de otro usuario Archivo abierto por otro usuario Archivo bloqueado por otro usuario o ha ordenado un Append Blank simultneamente.
NETNAME()
Devuelve la identificacin de la estacin de trabajo en curso. 22 de 30
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 segn el uso que se le valla a dar; es aqu donde radica el xito de la programacin, ya que como programador usted no tiene control sobre el comportamiento de los comandos y funciones, pero si puede tomar la desicin adecuada en el momento de programar. Al ejemplo anterior se le agrega una funcin para que intente la apertura de un archivo y contine intentandolo por un tiempo lmite o hasta que tenga xito. La funcin aqu usada es una funcin del usuario a la cual se le pasa como argumentos el nombre del archivo, la modalidad de apertura y el nmero de segundos que debe reintentar la operacin. #define archcom .F. #define archiexc .F. if libre(nomarch,archcom,7) set index to nomind else @06,24 say Archivo en uso 23 de 30
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(): Aade 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 expresin en un arreglo, si la consigue devuelve la posicin donde se encuentra, si no devuelve 0. Sintaxis: ASCAN(arreglo,expresin,comienzo,cantidad) ASIZE() : Modifica el tamao de un arreglo, aumentndolo o disminuyndolo. Sintaxis: ASIZE(arreglo,longitud) ASORT() : Ordena un arreglo. Sintaxis: ASORT(arreglo,exp1,exp2) LEN() : Retorna el nmero de elementos contenidos en un arreglo. Sintaxis: LEN(arreglo) SETCOLOR() : Permite cambiar el color del video. Entrega adems los valores actuales de los colores antes de cambiarlos. Sintaxis: SETCOLOR(valores) SETCURSOR() : Permite visualizar o no el cursor, pudiendo adems cambiar la forma del mismo, devuelve la forma actual antes de cambiarla. Sintaxis: SETCURSOR(valor) CHR() : Se utiliza para representar un cdigo ASCII como un smbolo asociado a la pantalla. 24 de 30
Sintaxis: CHR(cdigo). 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 numrico correspondiente a la cantidad de Bytes libres en el disco. Sintaxis: var=DISKSPACE() SETKEY() : Asocia un bloque de cdigo a una tecla asignada. VAL() : Evala una cadena hasta obtener un caracter no numrico o un segundo separador decimal, devolviendo el valor numrico correspondiente. Sintaxis: VAL(expresin) 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 numrico en una cadena de caracteres. Sintaxis: STR(cadena,longitud,decimales) SUBSTR() : Se utiliza para obtener una subcadena de una cadena especfica. Sintaxis: SUBSTR(cadena,inicio,longitud) ISALPHA() : Devuelve .T. si el caracter ms a la izquierda de una cadena es Alfabtico. Sintaxis: ISALPHA(cadena) ISDIGIT() : Devuelve .T. si el caracter ms a la izquierda de una cadena es un dgito. Sintaxis: ISDIGIT(cadena) ISLOWER() : Devuelve .T. si el primer caracter de una cadena es una letra minscula. Sintaxis:ISLOWER(cadena) ISUPPER() : Devuelve .T. si el primer caracter de una cadena es una letra mayscula. 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 funcin muy verstil usada con propsitos tales como: Eliminar caracteres de una cadena, Reemplazar caracteres de una cadena o Insertar caracteres en la cadena. 25 de 30
Sintaxis: STUFF(cadena,posicininicial,longitud,cadenanueva)
26 de 30