You are on page 1of 595

CAP N 1: PROGRAMACION ESTRUCTURADA CLIPPER 5.

2 El siguiente curso surge como necesidad de preparar una serie de clases sobre dicho lenguaje, para impartir en una academia. Pero un buen curso no se ha de limitar solo ha explicar los conceptos bsicos, y ver cuatro ejemplos inconexos, que puede que sirvan a nvel terico, pero no en la prctica, sino que ha de transmitir a los alumnos la experiencia profesional del profesor, y lo que es ms importante prepararlos para la resolucin de problemas. Lamentablemente esto no suele ocurrir, mucho y llegado a cierto punto, el alumno solo ante un problema de programacin se bloquea, y lo se porque he pasado por ellos. No solo hay que ensear la sintaxis del lenguaje, sino que hay que ensear programacin y resolucin de problemas, pensad que para cada problema hay ms de una solucin, y que aunque exponga varios mtodos, podis encontrar ms, y tambin me puedo equivocar. Por ello el curso se divide en varios apartados: una parte terica (puede que la ms pesada, lo siento) y otra prctica, una serie de ejercicios (solo para recordar aspectos claves), una serie de programas con su cdigo fuente, la lista de comandos y funciones de CA-Clipper y un diccionario de terminos informaticos

QUE ES CLIPPER ? Una definicin de Clipper, en sus inicios, podras ser: "Compilador del lenguaje dBase" Sin embargo, en la actualidad dicha definicin ya no es vlida Clipper va ms alla de ser un mero compilador de dBase, e incorpor un lenguaje propio, con una sintaxis y potencia cercanas al C, y una serie de elementos que desde el punto de dialectos xBase, existentes en el mercado. Historia de Clipper Clipper supongo que toma su nombre de uno de los veleros ms rpidos del siglo XIX. Esto es una suposicin ya que en sus inicios fue comercializado por Nantucket, y actualmente es propiedad de Computer Associates. Aparece en 1985 para cubrir una de las necesidades de un esplendido producto, el dBase, que por aquel entonces era de AsthonTate (ahora lo es de Borland), cuyo lenguaje, aunque potente era interpretado. Y como es lgico los programadores necesitaban de un producto que les permitiera distribuir sus aplicaciones libremente, sin el costo adicional que supona para el usuario la adquisicin obligatoria del dBase, y ms en aquellos tiempos con el precio que tena el software.

Por lo que en sucesivas versiones, Clipper Autumn'86 y Clipper Summer'87, fue manteniendo la compatibilidad con dBase pero incorporando nuevas mejoras: conexin con el lenguaje C y ensamblador, uso de tablas, etc. En Abril-90, al aparecer el Clipper 5, se rompe dicha compa tibilidad con dBase, y se acerca ms al lenguaje C++, el lenguaje de programacin por excelencia. INSTALACION Y CONFIGURACION DEL ENTORNO DE TRABAJO Requisitos del sistema La instalacin de CA-Clipper requiere unos requisitos mnimos que son: * Ordenador IBM-PC o 100% compatible * Versin 3.3 o superior de MS-DOS * 640 Kb. de memoria RAM * Entre 3 Mb. y 6 Mb. de disco duro, segn se realize la ins talacin mnima o completa. Instalacin El sistema de instalacin es sencillo, y el nmero de disquets es reducido al estar CA-Clipper comprimido. Para empezar la instalacin situese en la correspondientes unidad de disquet A: o B:, y teclee: INSTALL. A continuacin tendr que indicar o confirmar, el directorio principal de la instalacin, y los modulos a instalar.

Estructura de Directorios Una vez instalado CA-Clipper, dependiendo del tipo de ficheros,estos se encuentran en directorios concretos: Subdirectorio \CLIPPER5
(o el nombre indicado)

Descripcin
Directorio principal de CA-Clipper

\BIN

Ficheros ejecutables: (.EXE y .BAT) (aqu se encuentran: clipper, rtlink, cld, cl.bat, rmake, etc. ) Ficheros de cabecera (.CH y .H) Ficheros de librera (.LIB) Ficheros de preenlace (.PLL) Ficheros con cdigo fuente (.PRG) Utilidad de Base de Datos Editor de programas Utilidad de informes y etiquetas

\INCLUDE \LIB \PLL \SOURCE \DBU \PE \RL

\SAMPLE Programas fuente de ejemplo \SYS \NG Programas fuentes del subsistema Documentacin en lnea (NORTON GUIDES)

Configuracin Para poder trabajar eficientemente con CA-Clipper, tenemos que especificar los directorios de bsqueda de ficheros (PATH), e incluir una serie de variables de entorno en el AUTOEXEC.BAT y en el CONFIG.SYS Si queremos al instalar CA-Clipper, podemos realizar los cambios automticamente o que estos queden guardados en los ficheros AUTOEXEC.CHG y CONFIG.CHG para que luego podamos aadirlos manualmente (los deseados) a los ficheros oportunos. Si tenemos que trabajar con distintas versiones de Clipper, necesitaremos una configuracin para cada versin, entonces es mejor guardar estas en ficheros BATCH, y activarlos segn las necesidades. Una configuracin mnima para poder trabajar sera: REM Aadir al AUTOEXEC.BAT lo siguiente: REM -----------------------------------REM En el PATH .....;C:\CLIPPER5\BIN;C:\NG REM No dejar espacios en blanco, antes o despues de los "=" SET CLIPPER=F35 SET INCLUDE=C:\CLIPPER5\INCLUDE SET LIB=C:\CLIPPER5\LIB SET OBJ=C:\CLIPPER5\OBJ

El comando PATH establece la ruta de bsqueda para los ficheros ejecutables. VARIABLES DE ENTORNO La variable de entorno SET CLIPPER, determina la configuracin que tendr un programa realizado con CAClipper, y puede tener los siguientes parmetros: SET CLIPPER=//E:<nnn>; //F:<nnn>; //X:<nn>; //BADCACHE; //CGACURS; //DYNF:<n>; //INFO; //NOIDLE; //SWAPK:<nnnnn>; //SWAPPATH:<va>; //TEMPPATH:<va> E:<nnn> Siendo nnn los Kb. de memoria expandida a usar. F:<nnn> Siendo nnn el n mximo de ficheros abiertos simultaneamente. Trabaja en conjuncin con los FILES del CONFIG.SYS, y se toma el valor ms bajo de los dos. X:<nn> Siendo nn la memoria a excluir de CA-Clipper. BADCACHE Salva/recupera el estado de la memoria expandida (EMS), cuando accedemos a ella.

CGACURS Impide la utilizacin de ciertos modos de cursor en algunos adaptadores EGA/VGA. DINF:<n> Siendo n el n de manejadores de ficheros a utilizar en la gestin de los overlays dinmicos. Por defecto es 2, y los lmites de 1 a 8. NOIDLE Impide que CA-Clipper realice sus gestiones de memoria y disco, en los tiempos muertos (InKey(), prompt, read, get,etc.). INFO Muestra en pantalla la informacin de configuracin de la memoria durante el arranque. SWAPK:<nnnnn> Especifica los Kb. de disco que se usarn para el manejo de la memoria virtual. Por defecto son 16 Mb., y los lmites 256 Kb.y 65 Mb. SWAPPATH:<va> Indica el disco y el directorio del fichero de intercambio de memoria virtual. TEMPPATH:<va> Indica el disco y directorio de ubicacin de los ficheros temporales.

SET CLIPPERCMD=<lista opciones compilador> Especifica una lista de opciones del compilador que se utilizarn por defecto, si no indicamos lo contrario. Ver compilador, Clipper. SET INCLUDE=<va> Indica el disco y directorios, separados por punto y coma (;), donde buscar los ficheros de cabecera (#include). SET LIB=<va> Indica el disco y directorios, separados por punto y coma (;), donde buscar los ficheros de librera (.LIB). SET OBJ=<va> Indica el disco y directorios, separados por punto y coma (;), donde buscar los ficheros objeto (.OBJ). SET PLL=<va> Indica el disco y directorios, separados por punto y coma (;), donde buscar los ficheros de transferencia preenlazados (.PLT) y los ficheros de biblioteca preenlazados (.PLL). SET RMAKE=<lista opciones rMake> Indica una lista de opciones para la utilidad de mantenimiento de programas rMake, que utilizaremos por defecto si no indicamos lo contrario. Ver mantenimiento de programas con RMAKE.

SET RTLINKCMD=<lista opciones enlace> Indica una lista de opciones a utilizar por defecto por el enlazador, si no indicamos lo contrario. Ver enlazador, RTLINK. SET TMP=<va> Indica el disco y directorio donde el compilador y enlazador escribirn sus ficheros temporales. REM Aadir o modificar en el CONFIG.SYS lo siguiente: REM ------------------------------------------------FILES=35 BUFFERS=35 El comando FILES indica el nmero de ficheros abiertos a la vez que podamos tener, el mximo es de 255. Pero tenga en cuenta que se consume memoria. El comando BUFFERS aumenta la memoria que el MS-DOS reserva para la transferencia de ficheros.

EL COMPILADOR DE CA-CLIPPER: CLIPPER.EXE Compila uno o ms fuentes (.PRG) que contienen los procedimientos y funciones definidos por el programador para formar un fichero (.OBJ). Luego, una vez enlazado por RTLINK con las libreras necesarias se formar el (.EXE). Sintaxis: --------CLIPPER [<fichero fuente> | @<fichero Script> [<lista opciones>]] Argumentos de lnea: -------------------<fichero fuente> Es el nombre del programa a compilar, (.PRG). <fichero script> Es el nombre de un fichero de texto ASCII que contiene una lista de ficheros fuentes a compilar en un solo fichero objeto. Por defecto, tienen la extensin (.CLP). Por ejemplo, suponga que tenemos los siguientes fuentes: * FTR.PRG, programa de facturacin que ser el (.EXE). * FUNCION.PRG, funciones de usuario. * ARTICULO.PRG, mantenimiento de artculos. * CLIENTES.PRG, mantenimiento de clientes. * FACTURA.PRG, proceso de facturacin.

Si creamos el siguiente fichero ASCII: FTR.CLP FTR FUNCION ARTICULO CLIENTES FACTURA Al compilarlo con: CLIPPER @FTR, se gener un nico fichero Al compilarlo con: CLIPPER @FTR, se gener un nico fichero objeto que es el FTR.OBJ Opciones del compilador /A Declara variables privadas (PRIVATE), pblicas (PUBLIC) o parmetros (PARAMETERS) como MEMVAR, es decir, que sean accesibles por los procedimientos y funciones que se utilizen desde el procedimiento donde se han declarado. /B Incluye informacin de depuracin en el fichero objeto. /CREDIT Muestra los crditos de CA-Clipper en la pantalla. /D<identificador>[=<texto>] Define un identificador al preprocesador con <texto> asignado al <identificador>, si est es especificado.

/ES Nvel de error por defecto, si se produce salimos al DOS. /ES0 Similar al anterior. /ES1 Si se detectan advertencias (warnings) durante la compilacin, salimos al DOS. /ES2 Si se detectan advertencias, no se genera el (.OBJ), y salimos al DOS. /l<va> Aade al principio de la variable de entorno, un nuevo directorio donde buscar los ficheros INCLUDE. /L Excluye de los ficheros objeto los nmeros de lnea del cdigo fuente del programa. Si este ocupa mucho, podemos reducir con esta opcin algunas Kb. /M Compila solamente el programa actual, sin hacer caso de las llamadas a otros programas mediante: DO, SET FORMAT y SET PROCEDURE. /N Permite que las funciones y procedimientos puedan tener el mismo nombre que los programas fuente.

/O<fichero obj> Define el nombre y/o ubicacin del fichero objeto de salida. /P Preprocesa el mdulo fuente y copia el resultado en un fichero de salida con extensin (.PPO). Posteriormente y en captulo aparte explicaremos el funcionamiento del preprocesador. /Q Suprime la visualizacin de los nmeros de lnea durante la compilacin. /R[<fichero lib>] Indica al enlazador donde en que librera buscar las funciones y procedimientos no encontrados al compilar. Si slo se especifica /R, las libreras por defecto son: CLIPPER.LIB, EXTEND.LIB y DBFNTX.LIB. /S Comprueba la sintaxis del programa fuente, sin generar el fichero objeto. /T<va> Indica un directorio distinto para los ficheros temporales generados durante la compilacin. /U[<fichero cabecera standard de usuario>] Indica el preprocesamiento de otro fichero de cabecera estndard, en lugar del STD.CH

/V Indica al compilador que asuma todas las referencias a nombres de variables declaradas o sin declarar como variables pblicas y privadas. /W Genera mensajes de advertencia para variables sin declarar o ambiguas. /Z Elimina la evaluacin abreviada para operadores lgicos, para aislar el cdigo de versiones anteriores de CA-Clipper. Resumiendo: ----------Como mnimo en la compilacin es recomendable utilizar las siguientes opciones: CLIPPER <programa> /N /W De esta forma podemos tener funciones con el mismo nombre del fichero fuente, y tener controladas todas las variables. Si tuviesemos que reducir el tamao del (.OBJ), entonces aplicar la opcin /L, y /S en la fase de depuracin, para encon trar errores de sintaxis.

EL ENLAZADOR RTLINK Enlaza los ficheros (.OBJ), con los de librera (.LIB) para crear ficheros ejecutables (.EXE) o preenlazados (.PLL). Sintaxis: --------Se puede llamar de dos formas: 1) Formato libre (por defecto): RTLINK [FILE <lista ficheros OBJ> [OUTPUT <fichero salida> [LIBRARY [lista ficheros librera>] [<lista opciones de enlace>]] | [@<fichero Script>] 2) De forma posicional, si lo indicamos en el AUTOEXEC.BAT -> SET RTLINKCMD=/POSITIONAL : RTLINK [<lista ficheros OBJ>, [<fichero salida>], [<fichero map>], [<lista ficheros librera>] [<lista opciones de enlace>]] | [@<fichero Script>][;] Argumentos de lnea de mandato

<lista ficheros OBJ> Es la lista de los ficheros (.OBJ) a enlazar. <fichero salida> Es el nombre del fichero .EXE a generar, sino se indica se toma por defecto, el nombre del primer fichero (.OBJ) de la lnea de mandato. <fichero map> Es el nombre de un fichero MAP a generar. Contiene informacin sobre direcciones de segmentos y smbolos en la memoria. <lista ficheros librera> Es la lista de los ficheros de librera (.LIB) a enlazar con los (.OBJ). <lista opciones de enlace> Son algunas de las especificaciones que puede recibir el enlazador. <fichero Script> Es el nombre de un fichero de texto ASCII que contiene la lista de los ficheros (.OBJ) a enlazar. Por ejemplo, en el anterior captulo tenamos los siguientes fuentes que convertimos en (.OBJ) : FTR, FUNCION, ARTICULO, CLIENTES y FACTURA, para enlazarlos podramos crear un fichero FTR.LNK, con lo siguiente:

FILE FTR FILE FUNCION FILE ARTICULO FILE CLIENTES FILE FACTURA Y ejecutar luego: rtlink @ftr Opciones del enlazador /BATCH | NOBATCH Con BATCH impide que el enlazador le avise cuando no encuentre los ficheros. La opcin por defecto es NOBATCH. BEGINAREA . <sentencias> . ENDAREA Indica una area de overlays estticos, permite anidacin. (Ms adelante veremos ejemplos). /DEBUG Muestra un mensaje de identificacin de overlays a medida que estos se cargan en la memoria durante la ejecucin del programa. /DEFAULTLIBRARYSEARCH/NODEFAULTLIBRARYS EARCH Con NODEFAULTLIBRARYSEARCH ignoramos los nombres de biblioteca incorporados por el compilador

. La opcin por defecto es DEFAULTLIBRARYSEARCH. /DYNAMIC[:<fichero OVL>] DYNAMIC [INTO <fichero OVL>] Hace que los mdulos se siten en un overlay dinmico. /EXCLUDE:<smbolo> EXCLUDE <lista smbolos> Excluye una serie de mdulos en el modo de preenlace (.PLL). /EXTDICTIONARY | /NOEXTDICTIONARY Con NOEXTDICTIONARY el enlazador no realiza bsquedas en el diccionario extendido (lista de localizaciones de smbolos y dependencias). La opcin por defecto es EXTDICTIONARY. /FREEFORMAT Es el modo de entrada libre, y es el utilizado por defecto. /HELP Muestra la lista de opciones del enlazador. /IGNORECASE | /NOIGNORECASE Con NOIGNORECASE se hace distincin entre maysculas y mins- culas en los nombres de smbolos y segmentos. IGNORECASE es a opcin por defecto. /INCREMENTAL[:<espacio perdido>] | /NOINCREMENTAL Con INCREMENTAL hace que se enlazen solo los mdulos que han sufrido cambios. NOINCREMENTAL es la opcin por defecto.

/MAP[:<lista opciones MAP>] MAP[=<fichero MAP>][<lista opciones MAP>] Genera un fichero MAP con uno o varios informes sobre la sesin de enlace. MODULE <lista nombres mdulo> Desplaza los segmentos de los mdulos especificados a la seccin de overlays estticos actual. /PLL:<librera de preenlace> Se utiliza en modo de preenlace para especificar la librera preenlazada de la cal depende el ejecutable. /POSITIONAL Cambia el formato de entrada. Por defecto utilizamos el FREEFORMAT. /PRELINK Cambia al modo de preenlazado generando un fichero (.PLL). PRELOAD Hace que los overlays estticos se carguen en memoria antes de comenzar la ejecucin del programa. Normalmente solo se cargan las secciones residentes. /REFER:<smbolo> REFER <lista smbolos> Se utiliza en el modo de preenlace, para que busque en todas las libreras especificadas el cdigo asociado con los smbolos especificados.

/RESIDENT Carga todo el programa en memoria ignorando la creacin automtica de overlays dinmicos. SECTION [= <nombre seccin>] [INTO <fichero OVL>] Crea una seccin de overlays estticos. /SILENT Suprime las indicaciones y respuestas del enlazador si invocamos un fichero script. /STACK:<tamao bytes> Especificamos una pila de programa. El tamao mximo es hasta 65535 bytes. /VERBOSE[:<nivel>] Muestra mensajes de estado durante el enlace, a distintos nveles.

EL DEPURADOR DE CA-CLIPPER (CLD.EXE) Permite la depuracin del cdigo fuente mientras se est ejecutando el fichero (.EXE). Tiene que tener los fuentes del programa a depurar, y haberlo compilado con la opcin /B. Sintaxis: --------CLD [[/43 | /50 | /S][@<fichero Script<] <fichero EXE> [<lista argumentos>]] Argumentos de la lnea de mandato --------------------------------/43 Especifica el modo de 43 lneas para monitores EGA y VGA. /50 Especifica el modo de 50 lneas para monitores VGA. /S Divide la pantalla entre la aplicacin y el depurador solo en monitores EGA y VGA. <fichero Script> Es el nombre del fichero script, que contiene una serie de mandatos del depurador, en lneas separadas. La extensin por defecto es (.CLD).

<fichero EXE> Es el nombre del fichero ejecutable a depurar. Previamente se tendr que haber compilado con la opcin /B <lista argumentos> Es la lista de argumentos para el fichero ejecutable. Mandatos del Men del Depurador Al ser su funcionamiento dirigido por mens, su uso es fcil y no requiere muchas explicaciones, cabe recordar lo siguiente: - El mandato ? o ?? le muestra el valor de una expresin (variable, operacin aritmtica, etc.) - Puede ejcutar el programa de distintos modos: automtico, normal, paso a paso, por nveles, etc. - Puede establecer puntos de ruptura para evaluar resultados,y acciones <tecla F9>. - Puede visualizar ficheros <F6>, y el contenido de las variables. Para desplazarse entre las ventanas de variables, fuentes, y comandos, utilice la tecla del tabulador.

MANTENIMIENTO DE PROGRAMAS CON RMAKE Automatiza la compilacin y enlazado de programas, comparando las fechas y horas de los ficheros relacionados entre s, para ejecutar una serie de acciones segn sea el caso. Sintaxis: --------RMAKE [<lista ficheros MAKE>] [lista def macro>] [<lista opciones>] Argumentos de la lnea de mandato --------------------------------<lista ficheros MAKE> Es la lista de los ficheros MAKE a procesar. La extensin por defecto es (.RMK). Por ejemplo, siguiendo con los ejemplos anteriores de los ficheros: FTR, FUNCION, ARTICULO, CLIENTES y FACTURA, el fichero MAKE resultante, FTR.RMK, quedara as: FTR.OBJ: FUNCION.OBJ: ARTICULO.OBJ: FTR.PRG CLIPPER FTR FUNCION.PRG CLIPPER FUNCION ARTICULO.PRG CLIPPER ARTICULO

CLIENTES.OBJ: FACTURA.OBJ: FTR.EXE:

CLIENTES.PRG CLIPPER CLIENTES FACTURA.PRG CLIPPER FACTURA

FTR.OBJ FUNCION.OBJ ARTICULO.OBJ\ CLIENTES.OBJ FACTURA.OBJ

<lista def macro> Es una lista de una o ms definiciones de macro con el formato <nombre macro>=<valor> <lista opciones> Lista de opciones de control de RMAKE. Opciones de RMAKE /B Muestra en pantalla informacin sobre la depuracin. /D<nombre macro>[:<valor>] Define una macro y un valor opcional. Si no se indica valor se toma un valor nulo. /I Ignora los errores de ejecucin. /N Simula la ejecucin del make.

/S Busca en los subdirectorios los ficheros make. /U Activa el carcter # como indicador de comentarios y suprime su utilizacin como indicador de directivas. /W Muestra en pantalla mensajes de advertencia. /XS<n smbolos> Establece el tamao de la tabla interna de smbolos. El tamao por defecto es de 500. /XW<n bytes> Establece el tamao del espacio de trabajo interno. El tamao por defecto es de 2048 bytes. Comentarios indicar al estilo del C: /* ...*/ o //, o al estilo del make de UNIX con (#), este ltimo teniendo activada la opcin /U. Macros Se definen de las siguientes formas:

<nombre macro>=<valor> $(<nombre macro>) <nombre macro> := $(<nombre macro>) Existen tambin las macros MakePath que indican donde buscar y crear ficheros, su sintaxis es la siguiente: makepath[.<extensin> = <va> Macros predefinidas $* Se expande al nombre del fichero destino sin va o extensin. $@ Se expande al nombre del fichero destino con va y extensin. $** Se expande a toda la lista de nombres de ficheros de dependencia completos. $< Se expande al nombre completo del primer fichero de la lista de ficheros de dependencia. $? Se expande a una lista de dependencias que tienen una fecha y hora ms recientes que el fichero destino.

Directivas de control del Make #! <accin> Ejecuta un mandato del DOS. #if #else #end[if] Ejecuta las sentencias existentes entre las directivas segn sea verdad o falto el resultado de las condiciones. #ifdef <nombre macro> Comprueba la existncia de un nombre de macro. #ifndef <nombre macro> Comprueba que el nombre de la macro no exista. #ifeq <palabra1> <palabra2> Comprueba que las palabras sean idnticas. #iffile <fichero> Comprueba la existncia de un fichero. #include "<nombre fichero>"inserta y procesa el contenido del fichero antes de continuar con el fichero make actual. #stderr "<texto>" Escribe el texto en el fichero o dispositivo de error estndard. #stdout "<texto>"Escribe el texto en el fichero o dispositivo de salida estndard.

#undef <nombre macro> Suprime cualquier definicin anterior del <nombre macro> especificado. EL EDITOR DE PROGRAMAS: PE Se trata de un editor bsico, se incluyen los fuentes C:\CLIPPER5\SOURCE\PE, y en el proceso de instalacin podemos indicar su compilacin. Sintaxis: --------PE [<nombre fichero>] Si se encuentra el fichero se carga para su edicin, y sino crea uno de nuevo. La extensin por defecto es (.PRG). Teclas -----Accin ------

Flecha arriba, Ctrl-E Lnea arriba Flecha abajo, Ctrl-X Lnea abajo Flecha Izda., Ctrl-S Carcter a la izquierda Flecha dcha., Ctrl-D Carcter a la derecha Ctrl-Flecha izda., Ctrl-A Palabra a la izquierda Ctrl-Flecha dcha., Ctrl-F Palabra a la derecha Inicio Inicio de lnea Fin Fin de lnea Ctrl-Inicio Parte superior de la ventana Ctrl-Fin Fin de la ventana

tecla RePg AvPg Ctrl-RePg Ctrl-AvPg Intro Borrar Retroceso Tabulador Ctrl-Y Ctrl-T Alt-H, F1 Ctrl-W Alt-W Alt-O Alt-X, Esc Alt-F Alt-S Alt-A Alt-I, Ins

accion Ventana anterior Ventana siguiente Inicio texto Final texto Nueva lnea Borrar carcter Borrar carcter a la izda. Inserta tabuladores/espacios Borrar lnea Borrar palabra a la derecha Ayuda Grabar y salir Grabar y continuar Nuevo nombre de fichero salida Salir Mostrar nombre fichero Buscar Buscar de nuevo Activa/desactiva modo insercin

Dado que no permite realizar operaciones con bloques, es mejor utilizar un editor profesional, sin embargo, puede ser til para incroporarlo en nuestros programas.

UTILIDAD DE BASE DE DATOS: DBU Se trata de una sencilla base de datos controlada por mens, utilizada para la creacin y manipulacin de bases de datos. Se incluyen los fuentes: C:\CLIPPER5\SOURCE\DBU Sintaxis: --------DBU [/<cadena color>][<nombre fichero>] /e Argumentos de lnea de mandato -----------------------------<cadena color> Permite indicar si queremos la visualizacin en color (/C) o en monocromo (/M). Si no lo indicamos se utiliza la funcin ISCOLOR() para comprobar el modo color. <nombre fichero> Es el nombre de un fichero de vista (.WEW), estos son de uso nexclusivo de la DBU, o de un fichero de base de datos (.DBF). /e Abre el fichero en modo exclusivo (solo puede utilizarlo un usuario, en red local). Opciones de DBU F1 - Ayuda

F2 - Abrir Permite la apertura de ficheros de base de datos (.DBF), ndice (.NTX) y de vista (.WEW). F3 - Crear Permite la creacin y modificacin de ficheros de base de datos e ndices. Estructura de las bases de datos -------------------------------Nombre de Campo Esta formado por 10 caracteres de longitud, debe de empezar con una letra y puede contener nicamente: letras, nmeros y el carcter de subrayado (_). Tipos de Campos Los tipos de campos permitidos son: C - Carcter D - Fecha L - Lgico (.T. o .F.) M - Memo (texto) N - Numrico

Ancho Campos La longitud para los tipos de campo anteriores es: C - Carcter, entre 1 y 1024, por defecto son 10. D - Fecha, el ancho es fijo, 8. L - Lgico, el ancho es fijo, 1. M - Memo, el ancho es fijo, 10. N - Numrico, entre 1 y 19, por defecto es 10. Decimales Solo se utilizan en los campos numricos e indican el n de decimales que admiten estos. Por ejemplo, un campo que permita esto: 99.99, tendra un ancho de 5 (se contabiliza el punto decimal), y 2 decimales. Para crear los ficheros ndice, hemos de indicar el nombre de este y su clave de indexacin. F4 - Grabar Permite la grabacin de una estructura de base de datos o de un fichero de vista. F5 - Ver Permite visualizar una base de datos o un fichero de vista.

F6 - Utilidad Se incluyen diversas utilidades para manipular registros. - Copiar, copia un fichero de base de datos en otro o en uno de texto. - Aadir, aade registros al fichero activo desde otra base de datos o un fichero de texto. - Cambiar, efecta sustituciones en campos condicionales o globales. Solo un campo cada vez. - Purgar, elimina de forma permanente, registros marcados para borrado. - Vaciar, elimina todos los registros de la base de datos, pero manteniendo su estructura. - Ejecutar, ejecuta un comando del DOS u otro programa en caso de disponer de suficiente memoria. F7 - Mover Es un mtodo rpido de desplazamiento dentro de una ventana de visualizacin. Podemos realizar bsquedas por los valores clave de los ndices, ir a un determinado registro, localizar por un campo concreto y saltar determinado nmero de registros. F8 - Establecer Permite establecer relaciones entre bases de datos y configu- rar una lista de ficheros y condiciones para definir una vista.

Esc - Salir Notas: En lecciones posteriores construiremos un sistema de utilidad de base de datos parecido, con algunas de las opciones anteriores. UTILIDAD DE INFORMES Y ETIQUETAS: RL Para mantener la compatibilidad con dBase III+, CAClipper incorpora una utilidad de informes y etiquetas RL.EXE, que crean ficheros binarios de informes (.FRM) y de etiquetas (.LBL). Se incluyen los fuentes: C:\CLIPPER5\SOURCE\RL Sintaxis: RL

Y desde un programa: Para imprimir informes: USE <base de datos> INDEX <ficheros ndice> NEW REPORT FROM <informe> TO PRINTER Para imprimir etiquetas: USE <base de datos> INDEX <ficheros ndice> NEW LABEL FORM <etiqueta> TO PRINTER

Informes: --------Adems del nombre, un informe tiene una serie de columnas, y cada columna tiene: Contenido Es una expresin referida a un campo o variable. Cabecera Es el ttulo de la columna. Formato Permite especificar la anchura a visualizar, si el campo es numrico los decimales a mostrar y si se ha de totalizar. Tambin se pueden indicar una serie de opciones en el informe,como: Cabecera de Pgina Es el ttulo de la pgina. Anchura de Pgina Determina el ancho total de la pgina. El valor por defecto es 80. Margen izquierdo Su valor se suma al de SET MARGIN. El valor por defecto es 8. El valor por defecto es 0.

Margen derecho No tiene utilidad, solo es para compatibilizarlo con dBase. El valor por defecto es 0. Lneas por pgina Determina el total de lneas a imprimir. El valor por defecto es 58. Doble espacio Determina si las lneas de detalle se imprimirn a doble espacio. El valor por defecto es N. Salto de Pgina antes de imprimir El valor por defecto es S. Se puede anular indicando en el comando REPORT FROM, la clusula NOEJECT. Salto de Pgina despus de imprimir El valor por defecto es N. Pgina normal El valor por defecto es N. Si indicamos S, la cabecera de la pgina, el nmero y la fecha no se imprimem. Tambin pueden definirse grupos, dentro del informe, como por ejemplo, grupos de ventas por meses, y su composicin es la siguiente: Expresin de Grupo Indica la expresin clave de la agrupacin.

Cabecera de Grupo Es el ttulo del grupo. Informe resumido El valor por defecto es N, informe detallado y S, para resumido. Etiquetas --------Los ficheros de etiqueta tienen la extensin (.LBL), y las siguientes caractersticas: Dimensiones: Anchura horizontal de la etiqueta De 1 a 255 caracteres. El valor por defecto es 35. Altura (lneas verticales) De 1 a 16 lneas. El valor por defecto es 5. Transversal Indica las columnas de etiquetas por pgina, que puede ser de 1 a 255. El valor por defecto es 1. Margen Izquierdo Su valor se aade al de SET MARGIN, y puede oscilar entre 0 a 255. El valor por defecto es 0.

Lneas entre etiquetas Determina el n de lneas de separacin entre etiquetas, dicho valor va de 0 a 255. El valor por defecto es una lnea en blanco. Espacio entre etiquetas (vertical) El valor por defecto es 0, en caso de que haya ms de una etiqueta por columna, puede llegar hasta 255. Observaciones Sirve para anotar una serie de comentarios como las medidas, la referencia del fabricante, etc. Se incluyen una serie de formatos predefinidos que pueden escogerse con F3. Contenido de la etiqueta: Una vez indicadas las dimensiones, hemos de especificar el contenido de las lneas de la etiqueta. Podemos utilizar expresiones simples y compuestas, y dejar lneas en blanco: NOMBRE DIRECCION CPOSTAL + " - " + alltrim( POBLACION ) Una vez, creado o modificado el formato podemos grabarlo con F10.

DOCUMENTACION INTERACTIVA: NG. La Gua de CA-Clipper esta compuesta por una serie de guas Norton, accesibles mediante el Instant Access de Norton (NG.EXE), que queda residente en memoria y que podemos utilizar desde nuestro editor mismo o cualquier otro programa. Se encuentra en: C:\NG Sintaxis: NG [<lnea de mandatos>] Argumentos de NG <lnea de mandato> Indica que cargemos NG en modo temporal, es decir, que permenezca en memoria hasta que termine la ejecucin del programa que lo utiliza. Por ejemplo: ng edit programa.prg Si no indicamos nada, acta de modo residente (TSR). Teclas de desplazamiento Al estar dirigido por mens su funcionamiento es sencillo, aunque cabe recordar que se compone de varios nveles de ayuda y que desde el men Options podemos cambiar de base de datos, de tecla clave de acceso, desintalarlo, etc.

Tecla
--------Shift-F1 F1 F9 F10, Esc Intro - (Bloq. Num) + (Bloq. Num) Ctrl-S Flecha arriba Flecha abajo Flecha izda. Flecha dcha. RePg AvPg Inicio Fin

Accin
----------------------------------------Activar NG. Ayuda. Intercambio media pantalla/pantalla completa. Shift-F1 Salir. Subir de nvel o salir, depende de la situacin. Bajar de nvel, seleccionar elemento o ir a un elemento relacionado (See Also). Muestra elemento anterior. Muestra siguiente elemento. Contina la bsqueda indicada. Va al elemento anterior o desplaza ventana arriba Va al elemento siguiente o desplaza ventana abajo Va al elemento anterior. Va al siguiente elemento. Vamos a la pantalla anterior. Vamos a la pantalla siguiente. Va al primer elemento. Va al ltimo elemento .

NOTA Tenga presenta que en la parte derecha de la lista de comandos y funciones aparecen los siguientes caracteres que indican: - Elemento nuevo - Cambiado o actualizado * - Obsoletos Por lo tanto los que estn marcados como obsoletos procure no utilizarlos, ya que en versiones posteriores pueden desaparecer. NOTACION HUNGARA Notas: Adaptaciones realizadas a partir de las indicaciones y explicaciones efectuadas por los compaeros de GRUPO EIDOS, y en especial de Antonio Linares. Muchas gracias ! Una definicin de notacin sera la representacin de alguna cosa mediante seales, caracteres, etc. Cuando uno escribe un programa utiliza su propia notacin, ya que mintras uno se entienda ya es suficiente, pero y si se trabaja en grupo o se intercambian funciones con otros pro- gramadores, entonces sucede lo de la Torre de Babel.

Como los programadores de Microsoft Corporation se encontraban en este caso, uno de ellos, de origen hngaro (de ah viene el apodo de la notacin), especific una serie de tcnicas para la programacin en C. Como la idea es genial, se traslad a Clipper, para unificar la sintaxis utilizada programacin, y as poder entender el cdigo de otros programadores. Normas adaptadas de la Notacin Hngara para Clipper ---------------------------------------------------1) Los nombres de las variables han de ir precedidas por un identificador en minsculas de su tipo. Es decir, a partir de la letra o letras iniciales de una variables podemos saber el tipo al cual pertenece (carcter, nmero, fecha, etc.) c n l d o b x a ac a... Carcter o memo Numrico Lgico Fecha (date, en ingls) Objeto Bloque de cdigo (codeblock) Indeterminado (no conocemos su tipo) Array Array de cadenas Array de ... (otros elementos: an, al, ...)

En la programacin orientada al objeto (OOPS), para diferenciar a que clases pertenecen los objetos, utilizaremos identificadores de 3 letras consonantes. Por ejemplo: Objeto de la clase Window -> wndMain 2) Utilizacin de la tcnica WordMixing (mezcla de palabras) para diferenciar las distintas partes de un nombre. Por ejemplo: cEstoEsUnEjemplo No utilizar subguiones "_" como separadores. 3) Es recomendable aplicar las reglas anteriores para los nombres de las funciones: SetColor, FuncionUsuario, cFuncionUsuario, etc. 4) Aplicar tambin, las reglas anteriores para los nombres de los campos. Aunque, yo particularmente utiliz aqui, el subguin como separador de campo, y los nombres de los ficheros y los campos los pongo en maysculas para que destaquen dentro del cdigo y poderlos localizar fcilmente. 5) Todas las palabras que cambie el preprocesador se escribirn en maysculas. Para saber que palabras cambia o no el preprocesador, eche un vistazo al fichero de cabecera: std.ch (directorio \include).

Por ejemplo: SAY y GET, se pasan a maysculas. En cambio: if y endif, no porque no sufren variacin. 6) Al declarar las directivas con el preprocesador (#define),utilizar un identificador de 2 a 3 letras, un subguin como separador, el identificador de tipo, y a continuacin el nombre del identificador. Por ejemplo: #define KEY_nESC 27

7) A partir de las reglas anteriores, y para clasificar las funciones podemos aplicar los siguientes varemos: - Tipo, categoria y Accin. Ejemplo:

cScrShadow()
Tipo Accin (sombrea area pantalla) Categora (Funcin de pantalla->Screen) Devuelve un valor de tipo c

INTRODUCCION A LA PROGRAMACION Que es la programacin ? Es la accin de definir una serie de procesos (diseo, escritura y pruebas de programas) para resolver un problema. Un programa es el conjunto de instrucciones que se le dan al ordenador para resolver un problema o tarea determinada. Algoritmo --------Un algoritmo es un procedimiento paso a paso para resolver un problema. Los algoritmos han de ser independientes tanto del lenguaje de programacin como del ordenador en que sern ejecutados, han de ser precisos y finitos (han de finalizar). Pasos para la resolucin de un problema: 1) Anlisis del problema y diseo del algoritmo. 2) Fase de codificacin: expresar el algoritmo mediante un lenguaje de programacin. 3) Ejecucin, validacin y depuracin del programa. Lenguajes de Programacin ------------------------Es el lenguaje utilizado para la escritura de los programas.

Clasificacin de los lenguajes: A) Lenguajes de bajo nivel y alto nivel Los lenguajes de bajo nivel tienen una forma de operar ms cercana a la mquina, mediante instrucciones nemotcnicas, quedando muchas veces su uso limitado a mquinas y modelos concretos, en cambio los de alto nivel tienen una sintaxis ms cercana a la lengua humana, y son transportables entre entornos. B) Interpretes y compiladores Una vez escrito el programa (cdigo fuente) este ha de ser comprendido por la mquina, para eso podemos utilizar un interprete que traduce y ejecuta lnea a lnea un programa fuente, o un compilador que genera un programa objeto ejecutable directamente por el ordenador, siendo este un mtodo mucho ms rpido. Fases de la compilacin ----------------------Con un editor escribimos el o los programas fuentes (.PRG), con el compilador CLIPPER, generamos un programa objeto (.OBJ) que linkado con las correspondientes libreras (.LIB), obtenemos el programa ejecutable (.EXE).

PROGRAMA FUENTE (*.PRG)

COMPILADOR CLIPPER (traductor)

PROGRAMA OBJE (*.OBJ)

LINKADOR RTLINK (*.OBJ + *.LIB)

PROG.EJECUTABLE (*.EXE)

Anlisis y resolucin de problemas ---------------------------------La resolucin de problemas mediante el ordenador se resuelve mediante 3 pasos:

RESOLUCION DE PROBLEMAS

ANALISIS DEL PROBLEMA

DISEO DEL ALGORITMO

RESOLUCION DEL PROBLEMA CON EL ORDENADOR

Anlisis del problema --------------------Para una solucin eficaz del problema, este ha de estar bien definido, y las especificaciones de entrada/salida han de estar bien detalladas. ANALISIS DEL PROBLEMA

DEFINICION DEL PROBLEMA

ESPECIFICACIONES ESPECIFICACIONES DE ENTRADA DE SALIDA

DISEO DE ALGORITMOS ==================== El ordenador por si solo no es capaz de resolver un problema, se le ha de especificar los sucesivos pasos a realizar, es lo que denominamos como algoritmo. Un algoritmo recibe unos datos de entrada y devuelve unos datos de salida. Los problemas complejos se han de dividir en otros de ms simples y as sucesivamente, es lo que se denomina diseo descendente (top-down design). Una vez realizado un primer acercamiento al problema, este se ha de ampliar, lo que denominamos como refinamiento del algoritmo (stepwise refinement). DISEO DE UN ALGORITMO

DISEO DESCENDENTE

REFINAMIENTO POR PASOS

HTAS. PROG.: - DIAGRAMA FLUJO - DIAGRAMA N-S - PSEUDOCODIGO

Supongamos que tengamos que crear un algoritmo para aadir registros a un fichero de clientes. Haramos lo siguiente: 1) Abrir fichero de clientes. 2) Aadir ficha (registro) en blanco. 3) Rellenar datos. 4) Cerrar fichero de clientes. Esto sera una primera aproximacin, pero se tendra que refinar el algoritmo y tener en cuenta lo siguiente: A) Si no existe el fichero, crearlo. B) Si queremos grabar o no el registro. Podemos representar el algoritmo anterior de las siguientes formas - DIAGRAMA DE FLUJO (FLOWCHART) - DIAGRAMA DE NASSI-SCHNEIDERMAN (N-S) - PSEUDOCODIGO Normalmente, y ms en los lenguajes estructurados como Clipper,su uso no es necesario, salvo en algoritmos muy complicados. Yo particularmente uso el pseudocdigo, pero cada uno puede utilizar el que le sea ms prctico. Diagrama de flujo (flowchart) El diagrama de flujo o flowchart es una de las tcnica de re presentacin de algoritmos ms antigua, y consiste en representar mediante smbolos las operaciones a realizar.

Por ejemplo: el inicio y el fin del algoritmo se representan con un smbolo elptico, las entradas y salidas con un paralelogramo, las decisiones con un rombo, los procesos con un rectangulo, etc. Notas: En las libreras o tiendas especializadas podr encontrar, si es de su inters, plantillas con dichos smbolos. Diagrama de Nassi-Schneiderman (N-S) El diagrama de Nassi-Schneiderman es como un diagrama de flujo pero con la omisin de las flechas de conexin, quedando las cajas de las acciones, pegadas unas a otras. Ejemplo: El algoritmo anterior quedara as: Algoritmo de Altas de Clientes _______________________________________ Si no existe el fichero de Clientes lo creamos ________________________________________ Abrir el fichero de clientes _______________________________________ Aadir ficha vaca ________________________________________ Rellenar datos _______________________________________ Al llegar al final grabar ficha ________________________________________ Si pulsamos la tecla <Esc> borrar ficha ________________________________________ Cerrar fichero

Pseudocdigo -----------El pseudocdigo es un lenguaje de especificacin de algoritmos,de uso fcil y sintaxis similar al lenguaje de programacin a utilizar, que permite al programador concentrarse en las estructuras de control, y olvidarse de la sintaxis del lenguaje a utilizar. Ejemplo: El algoritmo anterior quedara as: inicio {Algoritmo de Altas de Clientes} SI no existe el fichero CLIENTES CREAR fichero CLIENTES FIN-SI USAR CLIENTES.DBF AADIR ENTRAR NOMBRE ... LERE NOMBRE ... SI pulsamos la tecla ESC BORRAR registro actual FIN-SI CERRAR fichero CLIENTES fin

RESOLUCION DE PROBLEMAS Una vez diseado y representado el algoritmo, se han de realizar los siguientes pasos: Codificacin -----------La codificacin consiste en convertir el algoritmo a un lenguaje de programacin mediante un editor de textos, es decir,escribir un programa fuente. Compilacin, ejecucin y comprobacin ------------------------------------Una vez escrito los fuentes, los hemos de compilar, linkarlos con las libreras que utilicemos, y comprobar su funcionamiento. Depuracin La depuracin es el proceso de localizar, corregir y eliminar los errores (bugs) que podamos encontrar. Los errores pueden ser de tres tipos: 1) Errores de sintaxis: que el propio compilador detecta. Para solventarlos hemos de recurrir a los manuales para comprobar la sintaxis correcta del comando o funcin. 2) Errores de ejecucin: se producen cuando el ordenador comprende una instruccin pero no la puede ejecutar. Puede ser

debido a que nos hemos olvidado de indicar algn parmetro de una funcin, o concatemos variables incompatibles entre ellas (cadena + nmero, tendra que ser: cadena + str( nmero) ), o realicemos asignaciones incorrectas, etc. 3) Errores lgicos: estos son debidos al programador, y pueden resultar dificiles de localizar. Verificacin La verificacin consiste en examinar lo que hace un programa,como lo hace y las causas por las que falla. Optimizacin La optimizacin consiste en que una vez el programa funcione correctamente, se perfeccione para que funcione mejor. Documentacin La documentacin del programa, es una de las tareas ms tediosas, y puede que ms importante, ya que despues nos ser de utilidad para el desarrollo, mejora y modificacin del programa en cuestin. Hemos de especificar el cometido de cada funcin, los parmetros que recibe y lo que devuelve, as como las variables utilizadas, y los puntos claves de cada funcin o proceso. Mantenimiento El mantenimiento del programa consiste en la actualizacin continua del programa.

TECNICAS DE PROGRAMACION Antes la programacin se limitaba a programas de pequea y mediana complejidad, pero como cada vez eran ms complejos surgieron las tnicas de programacin modular y estructurada,y no hace muchos aos la programacin orientada al objeto. Programacin modular -------------------Los programas complejos se descomponen en mdulos (partes independientes), que estos a su vez se analizan, codifican y se verifican por separado. Su codificacin se realiza mediante programacin estructurada u orientada al objeto. Normalmente se disean en equipo, unos programadores se dedican al diseo de funciones, y otros al desarrollo de la aplicacin, bajo la supervisin de un coordinador, para que todos los modulos tengan el mismo interface de usuario. Programacin estructurada ------------------------La programacin estructurada consiste en descomponer un determinado problema en una serie de niveles o pasos (diseo descendente o top-down), y se compone de una serie de estruc- turas bsicas: Estructuras secuenciales Estructuras selectivas Estructuras repetitvas

Como habris podido observar un programa, funcin y procedimiento tiene un inicio y un fin, estas compuestos por unas estructuras selectivas (DO CASE, IF...) y por unas estructuras repetitivas (FOR...NEXT, WHILE, etc.) Programacin Orientada al Objeto (OOPS) La programacin orientada al objeto, es un tipo de programacin ms cercana al razonamiento humano; el mundo esta formado por objetos, y estos tienen unas caractersticas o propiedades, y sobre ellos podemos ejecutar acciones determinadas. La OOPS surge como una solucin a la programacin de grandes programas, y para solventar el mantenimiento de dichas aplicaciones, ya que en la programacin estructura el ms mnimo cambio supone la modificacin de muchas funciones relacionadas, en cambio con la OOPS solo es cuestin de aadir/modificar mtodos de una clase o mejor, crear una nueva clase a partir de otra. Para que sea ms fcil comprender lo anterior, lo compararemos con el siguiente caso real: "Un fabricante de coches a tardado 5 aos en disear y fabricar el modelo XYZ, pero dadas las exigencias y evolucin del mercado se ve con la obligacin de incorporar nuevas caracteristicas, pero no puede estar 5 aos ms en disear nuevamente un nuevo modelo, por lo que coge todos los objetos que puede del modelo XYZ, y aade otros, teniendo un nuevo modelo, el XYZ+, en un tiempo record." Esta sera la sintsis de la OOPS.

COMPONENTES DEL LENGUAJE: COMENTARIOS En Clipper Summer'87 utilizabamos para los comentarios de una lnea el asterisco (*), y para situar un comentario al final de la lnea utilizabamos el smbolo &&. Ahora en CA-Clipper 5,podemos utilizar adems los smbolos de comentario del lenguaje C, es decir: - Para comentarios de varias lneas o bloques: /* Comentarios ....... ................... ................... */ - Para los comentarios de una lnea: * Comentario // Comentario - Para los comentarios a final de lnea: <sentencia> <sentencia> && Comentario // Comentario

-------------------------------------------------------------COMPONENTES DEL LENGUAJE: VARIABLES Las variables sirven para almacenar valores, y tienen un tiempo de vida y mbito de visibilidad determinados, y un nombre. Cuando llamamos a dicho nombre se nos devuelve el valor que contiene. Declaracin de variables Declarar una variable es darle un nombre a esta, y podemos hacerlo de las siguientes formas: A) Anteponiendo las sentencias: STATIC, LOCAL, MEMVAR,PUBLIC, PRIVATE, y/o FIELD. B) Como parmetros de una sentencia FUNCTION y/o PROCEDURE. Aunque la declaracin es opcional en las privadas, Notas: Con la opcin /W del compilador podemos comprobar si nos hemos olvidado de declarar alguna variable. Y con /V forzamos a que las variables no declaradas o ambiguas sean precedidas por el calificador MEMVAR.

Ambito de una declaracin El mbito de una declaracin se determina segn la parte del programa donde aplicamos dicha declaracin. Un programa se divide en bloques de cdigo, normalmente estos bloques son PROCEDIMIENTOS o FUNCIONES, y las variables declaradas en ellos, quedan limitadas a estos a excepcin de STATIC,FIELD y MEMVAR, si se declaran antes de las sentencias PROCEDURE o FUNCTION. Referencias a Variables Las variables se referencian por su nombre. En el caso de que tenga variables distintas con el mismo nombre puede utilizar el operador alias (->) para distinguirlas: <alias> -> <nombre> FIELD -> <nombre> MEMVAR -> <nombre> Variables Locales - Se declaran anteponiendo la sentencia LOCAL. - Pueden crearse e inicializarse a la vez. - Se crean automticamente cada vez que se ejecuta el bloque de cdigo donde estn. - Su tiempo de vida es el tiempo de duracin del procedimiento o funcin, y su visibilidad se cie al procedimiento o funcin en cuestin. Ejemplo: LOCAL nContador := 0

Variables Estticas ------------------- Se declaran anteponiendo la sentencia STATIC. - Es necesario inicializarlas (asignarles un valor) al crearlas, ya que por defecto toman el valor NIL, y puede provocar errores, sobretodo si lo utilizamos como contador. - Se crean automticamente antes de la ejecucin del bloque de cdigo donde estn. - Su mbito de visibilidad depende de donde fueron creadas, si lo fueron en el programa principal (MAIN) su mbito es general, y si se crearn dentro de un procedimiento o funcin, su mbito se limita a dicho procedimiento o funcin. - Su tiempo de vida es todo el programa, existe y mantiene sus valores mientras dure el programa. Ejemplo: STATIC nContador := 0 Variables Privadas - Se declaran anteponiendo la sentencia PRIVATE o PARAMETER (en los procedimientos), o durante la compilacin con MEMVAR. - Pueden crearse e inicializarse a la vez. - Pueden liberarse con la sentencia RELEASE (elimina variables de memoria). - Su mbito de visibilidad se cie al procedimiento donde se invoca y a los llamados por este. - Su tiempo de vida es todo el programa, hasta que no la liberemos con RELEASE. Ejemplo: PRIVATE nContador := 0

Variables Pblicas ------------------ Se declaran anteponiendo la sentencia PUBLIC, o durante la compilacin con MEMVAR. - Pueden crearse e inicializarse a la vez. - Pueden liberarse con la sentencia RELEASE. - Su mbito de visibilidad y tiempo de vida es todo el programa, a no ser que la liberemos con RELEASE. Ejemplo: PUBLIC nContador := 0 Variables de Campo ------------------ Se declaran anteponiendo la sentencia FIELD, en realidad son sinnimos de campos de bases de datos, y su uso va ligado con el manejo de los ficheros. - Su valor depende del valor del registro activo en dicho momento. - Su mbito de visibilidad y tiempo de vida, van desde l la apertura del fichero a la duracin del programa. Ejemplo: FIELD->NOMBRE Notas: Entre las variables PUBLICAS y PRIVADAS, unas pueden ocultar a las otras, o auto-ocultarse declarandose con el mismo nombre en un procedimiento inferior. Aconsejo no utilizar este sistema, a no ser que sea estrictamente necesario, ya que puede dar lugar a confusiones. Es mejor que todas las variables tengan nombres distintos.

COMPONENTES DEL LENGUAJE: EXPRESIONES Una expresin en un lenguaje humano equivaldra a una palabra o frase, y en un lenguaje de programacin una expresin esta equivale a un elemento o combinacin de estos (variables, campos, etc.) con operadores, etc. Y los elementos que componen el lenguaje de programacin CA-Clipper son: * Variables * Operadores * Arrays o matrices * CodeBlocks o bloques de cdigo * Objetos y mensajes * Funciones y procedimientos * Comandos xBase (en realidad son funciones, pero ocultas con la ayuda del preprocesador. Ver ficheros.CH)

COMPONENTES DEL LENGUAJE: TIPOS DE DATOS En el tema anterior vimos que las expresiones estan formadas por una serie de elementos, estos pueden constituir por si solos un tipo de datos (arrays y CodeBlocks), o un elemento puede ser de distintos tipos (como las variables). Tipos de Datos -------------* Arrays o matrices * Caracteres * CodeBlocks o bloques de cdigo * Numricos * Fechas * Lgicos * Memo * NIL Arrays o matrices ----------------Un array es un conjunto de variables de memoria, con un nombre comn, y con uno o unos subndices que los identifican. Los arrays pueden ser monodimensionales o multidimensionales (varias dimensiones o arrays anidados). Cualquiera de ellos puede tener los elementos de varios tipos (carcter, numrico, fecha, etc.), y tener distintos anchos.

Para comprender mejor lo que es un array de varias dimensiones, maginarlo como una tabla, es decir, como un TBrowse, donde cada FILA es un REGISTRO, y cada COLUMNA es un CAMPO o DIMENSION. Caracteres ---------Los datos de tipo carcter son los que se manipulan como cadenas de longitud fija, y comprenden los caracteres ASCII imprimibles, es decir, desde el Chr( 32 ) al Chr( 126 ), y los caracteres grficos del ASCII extendido, del Chr( 128 ) al Chr( 255 ) , y el carcter nulo Chr( 0 ). Las cadenas vlidas pueden estar formadas por 0 o ms caracteres, hasta un mximo de 65535, y han de ir entre un par de delimitadores ( 'cadena', "cadena" ). Para indicar una cadena nula, se indica con solo un par de limitadores ( "" o [] ). Notas: El delimitador ms usado es "" . CodeBlocks o bloques de cdigo -----------------------------Un CodeBlock, como su nombre indica es un bloque de cdigo, es decir, forma un conjunto de cdigo, y su comportamiento es parecido al de una funcin, y se puede asignar tanto a variables como a arrays. Resumiendo este tipo de dato es una mezcla de funciones y variables.

Su funcionamiento es similar al de las macros (&), pero a diferencia de estas que se compilan durante la ejecucin, los CodeBlocks lo hacen durante la compilacin junto al resto del programa, por lo que son ms rpidas. Numricos --------Los tipos de datos numricos son los que se utilizan para manipularse matemticamente ( +, -, *, /, etc.), y estan formados por los dgitos ( 0 al 9 ), la coma como separador de decimales y los caracteres + y - para indicar el signo del nmero. Fechas -----Los datos de tipo fecha identifican las fechas del calendario. Sus caracteres vlidos son los dgitos del 0 al 9, y el carcter separador indicado por SET DATE. Lgicos ------El tipo de datos lgico identifica elementos de naturaleza Booleana, es decir, identifica valores como verdadero/falso, s/no, etc., y comprende los siguientes caracteres vlidos: Y, T, t, N, n, F y f.

Memo --Los tipos de datos memo, representan caracteres de longitud variable, slo pueden existir como campos de bases de datos, y se almacenan en ficheros aparte de extensin (.dbt). Se manejan en bloques de 512 bytes, y su limitacin es idntica a la de las cadenas, 65535 bytes. NIL --NIL es un nuevo tipo de dato que permite manipular variables no inicializadas sin generar errores de ejecucin. COMPONENTES DEL LENGUAJE: OPERADORES Los operadores son las unidades bsicas de construccin de bloques. Clasificacin segn los argumentos que necesita Dentro los distintos tipos de operadores cabe distinguir los que reciben un argumento, unarios ( ! lSalir, nCuenta++, etc.), o los que reciben dos, binarios (2 + 2, cVar1 + cVar2,etc.).

Operadores de Cadenas Smbolo Operacin + Concatenar (deja espacios intermedios intactos) - Concatenar (elimina espacios intermedios) Operadores de Fecha Smbolo Operacin + Suma un nmero de das a una fecha - Resta un n de das de una fecha, o resta dos fechas Operadores Matemticos Smbolo Operacin + Suma o unario positivo - Resta o unario negativo * Multiplicacin / Divisin % Resto de una divisin ** o ASCII(94) Exponenciacin Operadores Relacionales Smbolo Operacin < Menor que > Mayor que = Igual que == Exactamente igual para cadenas. Igual para el resto.

<> # != Desigual <= Menor o igual que >= Mayor o igual que $ Esta contenido en (por ejemplo en cadenas) Operadores Lgicos Smbolo Operacin .AND. Conjuncin lgica (y) .OR. Disyuncin inclusiva lgica (o) .NOT. ! Negacin lgica (no ) Tabla de verdad de los operadores .AND., .OR. y .NOT.
Operando 1 Operando 1 .AND. .OR. .NOT. Operando 2 Operando 2 Operando 1

Operando 1 Operando 2

---------------------------- ---------.t. .t. .t. .t. .t. .f. .f. .t. .f. .t. .f. .t. .f. .f. .f. .f. Operadores de Asignacin de Variables

---------.f. .f. .t. .t.

Smbolo Operacin = Asignacin (todos los tipos de datos) := Asignacin en lnea (todos los tipos de datos) += Suma (o concatenacin) y asignacin en lnea(C,D,M,N) -= Resta (o concatenacin) y asignacin en lnea (idem) *= Multiplicacin y asignacin en lnea (numricos)

/= Divisin y asignacin en lnea (numricos) **= ASCII(94)= Exponenciacin y asignacin en lnea (ns) %= Resto y asignacin en lnea (numricos) La asignacin en lnea permite declarar e inicializar variables a la vez: LOCAL nNumero := 10 As mismo, podemos indicar un mismo valor para distintas variables de la siguiente forma: LOCAL nVar1 := nVar2 := 10 La asignacin compuesta de los operadores se resuelve as: Operador Ejemplo ------------------+= a += b -= a -= b *= a *= b /= a /= b %= a %= b **= ASCII(94)= a **= b Definicin --------------a := ( a + b ) a := ( a - b ) a := ( a * b ) a := ( a / b ) a := ( a % b ) a := ( a ** b )

Operadores de Incremento y Decremento Smbolo -----------++ -Operacin ---------------------------------------------Incremento como prefijo o sufijo (pre/postincremento) Decremento como prefijo o sufijo (pre/postdecremento)

Ambos son operadores unarios y puede indicador como prefijo ( ++nValor ) o como sufijo ( nValor++ ), la diferencia estriba en que cuando actua como prefijo, la variable primero se incrementa/decrementa y luego se asigna, y como sufijo, primero se asigna y luego se incrementa/decrementa su valor. Ejemplo: nValorInicial := 1 nValorFinal := --nValorInicial ? nValorInicial // 0 ? nValorFinal // 0 nValorInicial := 1 nValorFinal := nValorInicial? nValorInicial ? nValorFinal // 1 // 0

Smbolo ------() [] {} -> & @

Operadores Especiales Operacin -------------------------------------------Funcin o agrupamiento de operaciones (a+b) Elemento de un array o matriz Definicin de array Identificador de alias campos, variables Compilar y evaluar (macros) Pasar por referencia(argumentos de funciones y proc.)

PRIORIDAD DE LOS OPERADORES Al evaluar expresiones con operaciones existen una serie de reglas para evaluarlas correctamente. Una de ellas es la evaluacin de izquierda a derecha para el mismo nivel de prioridad, que es el siguiente: Prioridad entre categorias 1. Parntesis ( ) - Modifica el orden de evaluacin. 2. Preincremento y Predecremento (++nValor, --nValor) 3. Operadores Matemticos 3.1. Unarios positivos y negativos ( +, - ) 3.2. Exponenciacin ( **, ASCII(94) ) 3.3. Multiplicacin, divisin y resto ( *, /, % ) 3.4. Suma y resta ( +, - ) 4. Operadores Relacionales (todos tienen el mismo nivel) 5. Operadores Lgicos 5.1. Negacin Lgica (.NOT., ! ) 5.2. Conjuncin Lgica ( .AND. ) 5.3. Disyuncin inclusiva lgica ( .OR. ) 6. Asignacin (todas tienen el mismo nivel) 7. Postincremento y Postdecremento (nValor++, nValor-

COMPONENTES DEL LENGUAJE: OPERADOR & El operador de macro (&), es un operador especial que permite compilar expresiones, y sustituir identificadores por cadenas. Sintaxis -------Uso como variable de macro: &<varMacro>. El punto (.), es el terminador de la macro. Ejemplo: cFichero := "CLIENTES.DBF" USE &cFichero. Uso como macroexpansin: &(<macroExp>) Ejemplo: ? &(INDEXKEY(0)) Notas: Ms adelante en el desarrollo de funciones, sobre todo de propsito general, veremos su funcionamiento.

COMPONENTES DEL LENGUAJE:PREPROCESADOR El preprocesador, realiza una opcin de preproceso antes de procesar el cdigo Clipper. El preprocesador examina el cdigo fuente en busca de directivas (identificadores o directrices del preprocesador), que despus traduce a cdigo fuente normal, antes de compilar. Directivas #command #define #error #ifdef #ifndef #include #stdout #translate #undef #xcommand #xtranslate Directiva #define ----------------Define un identificador, una constante declarada o pseudofuncin.

Sintaxis: #define <identificador> #define <constante> <salida> #define <funcion>(<parmetros>) <expresin> Ejemplos: A)
#define DEMO

B)
#define ESCAPE 27

C)
#define SUMA(a,b) a+b

...
if DEMO

...
if nTecla = ESCAPE

...
? SUMA(5,3)

.... endif Notas:

.... endif

- Las asignaciones hechas con #define slo son vlidas para el fichero que las contiene. - Al utilizarlas hemos de hacerlo de forma idntica a la de la definicin. Directiva #include -----------------Incluye un fichero en el mdulo fuente actual, que puede ser un fichero de cabecera (.ch) u otro fichero fuente (.prg). Sintaxis: #include "<Fichero.prg>" #include "<Fichero.ch>"

Notas: Los ficheros (.ch) se han de incluir al principio del programa y los ficheros (.prg) al final. Directivas #command y #translate -------------------------------Definen mandatos y pseudofunciones creados por el usuario o una directiva de traduccin. La diferencia entre #command y #translate esa, en que esta ltima sirve para los casos en que dichos mandatos y pseudofunciones formen parte de otras expresiones. Sintaxis: #command <patrn entrada> => <patrn salida> #translate <patrn entrada> => <patrn salida> Ejemplos: A) #command DELETE => dbdelete() El comando DELETE, siempre va aparte y no forma parte de ninguna expresin, por lo que se utiliza #command para su traduccin. B) #translate ISDATE( <v1> ) => (valtype( <v1> ) == "D" ) En este caso utilizamos la directiva #translate ya que ISDATE() tambien puede formar parte de una expresin, como por ejemplo:if IsDate( dFecha )

Notas: Estas directivas se reemplazan con slo coincidir las cuatro primeros caracteres. Directivas #xcommand y #xtranslate Realizan las mismas funciones que #command y #translate, pero no admiten abreviaturas. #xcommand <patrn entrada> => <patrn salida> #xtranslate <patrn entrada> => <patrn salida> Ejemplo: Suponga que utilizamos el preprocesador para evitar la complejidad de la sintaxis OOPS: #xcommand ACTIVATE WINDOW <oWnd> => <oWnd>:Display() Si utilizamos adems un ACTIVATE MENU, ACTIVATE MOUSE, etc., tendramos problemas al utilizar #command que reconoce las abreviaciones. Directiva #ifdef ---------------Compila un bloque de cdigo, si se ha definido un identificador. Es de utilidad para la realizacin de versiones DEMO.

Sintaxis: #ifdef <identificador> <instrucciones> [#else] <instrucciones> [#endif]

Ejemplo: #ifdef DEMO // Instrucciones #else // Instrucciones #endif

Directiva #ifndef ----------------Tiene la misma aplicacin y sintaxis que #ifdef, pero para cuando el identificador no esta definido. Sintaxis: #ifndef <identificador> <instrucciones> [#else] <instrucciones> [#endif] Ejemplo: #ifndef DEMO // Instrucciones #else // Instrucciones #endif

Directiva #undef --------------Elimina una definicin realizada con #define. Sintaxis: #undef <identificador> Ejemplo: #undef ESCAPE

Directivas #error y #stdout --------------------------Indicarn el mensaje que aparecer cuando se produzca un error de compilacin. Sintaxis: #error [<mensaje>] #stdout [<mensaje>] COMPONENTES DEL LENGUAJE: ARRAYS Un array es un conjunto de variables de memoria, con un nombre comn, y con uno o unos subndices que los identifican. Cada valor del array se denomina elemento, y el nmero mximo de elementos de un array es de 4096. Los arrays pueden ser monodimensionales o multidimensionales (varias dimensiones o arrays anidados). Cualquiera de ellos puede tener los elementos de varios tipos (carcter, numrico, etc.), incluso puede tener otros arrays o CodeBlocks, excepto los de tipo Memo, que slo pueden aplicarse a campos. Declaracin de arrays --------------------Al crear las matrices podemos indicar su mbito anteponiendo al identificador las sentecnias: PRIVATE, PUBLIC, LOCAL y STATIC.

Sintaxis:
<identificador>[ <identificador>[ <nElementos1>, <nElementos2>, ... ] <nElementos1> ] [ <nElementos2> ] ...

Notas: Excepto la primera dimensin, todas las dems son opcionales.Tambin podemos utilizar la funcin ARRAY() para declarar matrices. Ejemplos: LOCAL acMatriz[12][4] es lo mismo que, LOCAL acMatriz := Array( 12, 4 ) Declaracin y asignacin: * Arrays monodimensionales LOCAL anArray := { 1, 2, 3, 4 } * Arrays multidimensionales LOCAL axArray := { 1, 2, { "A", "B", "C" } } Direccionamiento de los Elementos de un Array Una vez creado el array, se accede a sus elementos medianet el subndice (empieza a partir de 1).

Por ejemplo: * Arrays monodimensionales Para acceder al primer elemento: anArray[ 1 ] * Arrays multidimensionales Para acceder al elemento de la primera fila, segunda columna. anArray[ 1 ][ 2 ] o tambin anArray[ 1, 2 ] Funcin ----------aAdd() aChoice() aClone() aCopy() aDel() aDir() aEval() aFields() aFill() aIns() array() aScan() aSize() aSort() aTail() dbCreate() dbStruct() Directory() len()

Descripcin --------------------------------------------Aade un nuevo elemento al final de un array Realiza un scroll a travs de los elem. del array Duplica un array Copia elementos de un array a otro Borra un elemento de un array Rellena un array con los ficheros encontrados Evala un CodeBlock para cada elemento del array Rellena arrays con la informacin de los campos Rellena los elementos del array con un valor dado Inserta un elemento en un array Crea/inicializa un array con los elem. y dimens. Busca secuencialmente un elemento en un array Modifica el tamao de un array Ordena el contenido total o parcial de un array Devuelve el ltimo elemento de un array Crea una base de datos desde un array Crea un array que contiene la estructura de .DBF Crea un array con informacin sobre ficheros Aplicado a un array, devuelve el tamao de este

COMPONENTES DEL LENGUAJE: CODEBLOCKS Un CodeBlock o bloque de cdigo, es un nuevo tipo de dato,que mezcla los conceptos de funciones y variables, recibe y devuelve parmetros, y se puede asignar tanto a variables como arrays. Sintaxis: { |Parmetros| Expresiones } Notas: Si hay varios parmetros y/o expresiones estas irn separadas por comas. Declaracin ----------En la declaracin almacenamos el cdigo, pero no lo ejecutamos (evaluamos). Ejemplos:
bBloque := { || "cadena" } bBloque := { |x| x + 1 } bBloque := { |x,y| SQRT( x ) + SQRT( y ) } bBloque := { |a,b,c| Func( a ), Func( b ), Func( c ) }

Evaluacin En la evaluacin, ejecutamos el CodeBlock almacenado anteriormente. Eval( bBloque ) Aunque tambin podemos realizar lo mismo pasando un parmetro: Eval( bBloque, "cadena" ) Operaciones con CodeBlocks -------------------------Operacin Descripcin --------- ------------------------------------------------= := AEval() DbEval() Eval() Asignacin Asignacin en lnea Evaluacin en cada elemento de un array Evaluacin en cada registro de un rea de trabajo Evaluacin de un bloque

COMPONENTES DEL LENGUAJE: FUNCIONES Y PROCEDIMIENTOS Las funciones y los procedimientos son los elementos principales de la programacin en CA-Clipper, y constan de un grupo de sentencias que realizan una tarea o accin determinada. Su funcionamiento es como el de "caja negra", recibe unos parmetros y devuelve otros, sin necesidad de conocer a fondo la rutina invocada.

Ambito de visibilidad 1) Ambito PUBLIC Se declaran con las sentencias FUNCTION y PROCEDURE. 2) Ambito del mdulo fuente actual (.PRG) Se declaran con STATIC FUNCTION y STATIC PROCEDURE, cuando su aplicacin procede reducen el tamao del (.EXE), ya que su localizacin se resuelve en tiempo de compilacin y no se almacenan en la tabla de smbolos. Declaracin de funciones y procedimientos 1) Funciones:
[STATIC] FUNCTION <identificador>[(<lista parmetros locales>) [<declaracin de variables>] . .<sentencias ejecutables>

. RETURN <expresin de retorno> Notas: Los valores devueltos por RETURN, pueden ser cualquier tipo de datos( arrays, objetos, CodeBlocks, NIL, etc.)

2) Procedimientos:
[STATIC] PROCEDURE <identificador>[(<lista parmetr. locales>)] [<declaracin de variables>] . .<sentencias ejecutables> . [RETURN]

Llamadas a funciones y procedimientos 1) Funciones: <funcin>( [<lista parmetros>] ) 2) Procedimientos: <procedimiento>( [<lista parmetros>] ) DO <procedimiento> [WITH] [<lista parmetros>] Notas: No se recomienda el uso de DO..WITH, ya que pasan los argumentos por referencia. Paso de parmetros -----------------Cuando invocamos a una funcin o a un procedimiento, los va lores pasados se denominan argumentos o parmetros reales, y cuando la funcin los recibe se denominan argumentos o parmetros formales.

Ejemplo: Invocacin -> Suma( nNum1, nNum2 ) Recepcin -> FUNCTION Suma( n1, n2 ) RETURN( n1 + n2 ) Al invocar podemos omitir parmetros que sern inicializados desde la funcin receptora con un valor NIL, tambin podemos comprobar los parmetros pasados con la funcin PCOUNT(). Paso por Valor Pasar un parmetro por valor significa que la funcin o procedimiento receptor opera con una copia del parmetro recibido, por lo tanto, no altera el valor inicial. Paso por Referencia En cambio, el paso por referencia, significa todo lo contrario, ya que no pasamos ninguna copia sino que hacemos referencia al valor del parmetro (misma posicin de memoria), por lo que podemos alterar el valor del parmetro pasado. Para ello utilizamos el signo (@). Ejemplo: Invocacin -> Suma( @nNum1, nNum2 ) Recepcin -> FUNCTION Suma( n1, n2 ) n1 := n1 + n2 RETURN Notas: Este sistema puede ser util, por ejemplo, al trabajar con arrays, cuyos elementos hemos de actualizar.

Paso de parmetros desde MAIN() Tambin es posible pasar parmetros desde el programa (.EXE), si lo hemos especificado en la rutina principal con PARAMETERS, o desde MAIN(). Ejemplo: Desde el DOS : PROGRAMA COLOR En el programa: FUNCTION MAIN( cMonitor) Recursividad Un procedimiento o funcin es recursiva si contiene una llamada a si misma, ya sea de forma directa o indirecta, cuando se llame a otra funcin y esta invoca a la funcin primera. Un ejemplo tpico es el del factorial (extrada del manual): FUNCTION Factorial( nFactorial ) IF nFactorial = 0 RETURN( 1 ) ELSE RETURN(nFactorial * Factorial(nFactorial - 1)) ENDIF

CONTROL DEL FLUJO DEL PROGRAMA Anteriormente vimos que la programacin estructurada segua un flujo secuencial, que podamos alterar mediante estructuras de control selectivas y repetitivas para la resolucin de problemas. REGLAS DE FUNCIONAMIENTO DE ESTRUC. SELECTIVAS Y REPETITIVAS 1) Han de tener una sentencia inicial y una de final. 2) Pueden anidarse estructuras dentro de otras. ESTRUCTURAS SELECTIVAS ---------------------El flujo de control del programa, es secuencial, es decir, va de sentencia en sentencia, de forma correlativa, sin embargo,muchas veces hemos de tomar una decisin, entre varias. Este tipo de estructura la denominaremos SELECTIVA. Dependiendo del nmero de alternativas de seleccin podemos dividir las estructuras de control selectivas en: - Bifurcaciones SIMPLES - Bifurcaciones DOBLES - Bifurcaciones MULTIPLES

BIFURCACIONES SIMPLES --------------------En las bifurcaciones simples la seleccin depende de si se cumple o no una condicin. Ejecutandose la accin o acciones solo si se cumple la condicin. VERDAD Condicin F A L S O Sintaxis: * Si la condicin se cumple se ejecuta la accin u acciones

Accin/es

IF <condicin> <instruccin/es> ENDIF

Ejemplo: Suponga un contador del nmero de filas para impresin. //... nFila++ if nFila = 55 @ nFila, 0 say "* FIN PAGINA *" EJECT nFila := 0 endif // ...

Mientrs nFila no sea igual a 55, no se producir el SALTO DE PAGINA. BIFURCACIONES DOBLES -------------------En las bifurcaciones dobles, siempre se ejecuta una accin, tanto si se cumple o no la condicin.

VERDAD Condicin FALSO Accin A Accin B

* Si la condicin se cumple, se ejecuta la Accin B * Si la condicin no se cumple, se ejecuta la Accin A

Sintaxis:

IF <condicin> <instruccin/es> ELSE <instruccin/es> ENDIF

IIF( <condicin>, <expresin 1>, <expresin 2> ) Si se cumple No se cumple Dependiendo del nmero de instrucciones, puede utilizar uno u otro formato.

Ejemplo: Suponga una entrada de datos. // ... @ 0,0 GET cNombre READ dbAppend() // Aadimos registro vaco

IF LASTKEY() = 27 // Pulsamos tecla <Esc> -> ACCION A dbDelete() // Borramos registro ELSE // Reemplazamos datos FieldPut( 1, cNombre ) // -> ACCION B ENDIF // ...

Tambin podramos expresar la estructura anterior de igual forma con IIF:


-------------------------------------------------------------

IIF( LASTKEY() = 27, dbDelete(), FieldPut( 1, cNombre ) )


BIFURCACIONES MULTIPLES

En las bifurcaciones multiples la condicin evaluada, puede tener ms de dos acciones a elegir, es decir, no se limita a VERDAD (.T.) o a FALSO (.F.).

Condicin

Accin A Accin B Accin C

Accin N Accin D Estructura IF ... ENDIF

Sintaxis: Estructura DO CASE

DO CASE IF <condicin 1> CASE <condicin 1> <instruccin/es> <instruccin/es> [ELSEIF <condicin n> [CASE <condicin n> <instruccin/es> ] <instruccin/es>] [ELSE [OTHERWISE <instruccin/es> ] <instruccin/es>] ENDIF ENDCASE Ejemplo: Suponga el siguiente men. FUNCTION MAIN() LOCAL nOpcion := 0 CLS @ 05,35 PROMPT " Altas " @ 07,35 PROMPT " Bajas " @ 09,35 PROMPT " Modificar " @ 11,35 PROMPT " Visualizar " @ 13,35 PROMPT " Imprimir " @ 15,35 PROMPT " Salir "

MENU TO nOpcion // Utilizando DO CASE y utilizando IF ... ENDIF

DO CASE IF nOpcion = 1 CASE nOpcion = 1 Altas() Altas() ELSEIF nOpcion = 2 CASE nOpcion = 2 Bajas() Bajas() ELSEIF nOpcion = 3 CASE nOpcion = 3 Modificar() Modificar() ELSEIF nOpcion = 4 CASE nOpcion = 4 Visualizar() Visualizar() ELSEIF nOpcion = 5 CASE nOpcion = 5 Imprimir() Imprimir() ELSEIF nOpcion = 6 CASE nOpcion = 6 QUIT QUIT ELSE OTHERWISE Alert( "CASO NO PREVISTO") Alert("NO PREVISTO") ENDCASE ENDIF RETURN NIL ESTRUCTURAS REPETITIVAS o BUCLES ITERATIVOS Las estructuras repetitivas son una alteracin del control del flujo secuencial del programa, pero a diferencia de las selectivas, las repetitivas se utilizan, como su nombre indica, para la resolucin de problemas que requieren de la repeticin de una serie de instrucciones hasta que se cumpla una condicin,

ya sea verdadera o falsa, que provoque la salida del bucle

Iteracin

Condicin

Verdad

Cuerpo del bucle

Partes de un bucle: * Cuerpo del bucle, es el conjunto de instrucciones que se repiten. * Iteracin, es cada vez que se repite el cuerpo del bucle. * Salida del bucle, es el punto donde se termina la ejecucin del bucle y pasamos el control a la instruccin siguiente a este. * Control de terminacin, es la condicin de salida del bucle. MANDATO FOR ... NEXT La estructura FOR ... NEXT, repite una serie de instrucciones un determinado nmero de veces. Este tipo de bucle es de los denominados, controlados por una variable contador, que se incrementa o disminuye cada vez

Falso

que se ejecuta el cuerpo del bucle, hasta que se cumpla la condicin de salida del bucle, es decir, hasta que la variable contador sea mayor que su valor final. Sintaxis: FOR nContador := nInicial TO nFinal [STEP nIncremento] <instrucciones> NEXT o tambin:
FOR nContador := nFinal TO nInicial [STEP nDecremento]

<instrucciones>
NEXT

Ejemplo: Realice la siguiente prueba. FUNCTION MAIN() LOCAL i := 0 CLS // Bucle con incremento, ira de 1 a 99, de 2 en 2 FOR i := 1 TO 100 STEP 2 QQOut( i ) NEXT InKey( 0 ) // Bucle con decremento, ira de 100 a 2, de 2 en 2 FOR i:= 100 TO STEP -2 QQOut( i ) NEXT

RETURN NIL MANDATO DO WHILE ... ENDDO La estructura repetitiva DO WHILE ... ENDDO, repite el cuerpo del bucle, hasta que se cumpla la condicin de salida del bucle. Sintaxis: [DO] WHILE <condicin> <instrucciones> [EXIT] [LOOP] END[DO]

Notas: La sentencia EXIT, provoca la salida forzosa del bucle, sin que se cumpla la condicin de salida de dicho bucle. La sentencia LOOP, provoca el comienzo de otra iteracin sin que lleguemos a completar todo el cuerpo de bucle. Ejemplo: Mostrar por pantalla el contenido de un fichero (sin parada de pantalla). FUNCTION MAIN() USE CLIENTES
DO WHILE !EOF() QOut( NOMBRE ) dbSkip() ENDDO dbCloseArea() RETURN NIL //Mientras no sea final de fichero //Muestra NOMBRE cliente //Siguiente registro

Notas: Observe los fuentes de algunos de los programas y funciones, para encontrar ejemplos del uso de EXIT y LOOP, que suelen emplearse en algoritmos complejos de programacin donde se concurre el anidamiento de bucles. IMPORTANTE: Existe an otra estructura de control, se trata de: BEGIN SEQUENCE ... END SEQUENCE, que al estar muy ligada al tratamiento de errores, se estudiar junto al OBJETO ERROR. OPERACIONES CON DATOS DE TIPO CARACTER Los datos de tipo carcter son los que se manipulan como cadenas de longitud fija, y comprenden los caracteres ASCII del 32 al 126, y del 128 al 255, y el 0. Notas: En las siguientes explicaciones utilizaremos la funcin QOut( <expresin> ), para mostrar el resultado de las expresiones, aunque tambin podramos haber utilizado el antiguo formato: ? <Expresin> Tambin podra haber simplificado algunos IF, por IIF() pero as se comprende mejor el cdigo.

Operacin -------+

Descripcin ------------------------------------Concatenar cadenas. Ejemplos: cCadena1 + cCadena2 "Nombre: " + cCadena "Nombre: " + Field->NOMBRE Concatenar sin espacios intermedios. Ejemplo: QOut( "Nombre " - "Pepe" ) // Resultado: NombrePepe Comprobar si son iguales. Comprobar si son exactamente iguales. Ejemplo: LOCAL cClave := "XYZ " LOCAL cEntrada := "XYZ" IF cClave = cEntrada // La condicin se cumple, aunque a cEntrada le // falte un espacio. ... ENDIF IF cClave == cEntrada // La condicin no se cumple, ya que a cEntrada // le falta un espacio ... ENDIF

= ==

!=, <> o #

Comprobar si son desiguales. Ejemplo: IF cClave != cEntrada Alert( "CLAVE INCORRECTA" ) ENDIF Comprobar si se clasifica antes. Ejemplo: IF "A" < "B" // .T. QOut( "SI" ) ENDIF

<

Operacin -------------<=

Descripcin -------------------------omprobar si se clasifica antes o en la misma posicin. Ejemplo: IF "a" <= "A" // .F. QOut( "SI" ) ENDIF Comprobar si se clasifica despus. Ejemplo: IF "Z" > "1" // .T. QOut( "Si" ) ELSE QOut( "No" ) ENDIF Comprobar si se clasifica despus o en la misma posicin. Ejemplo: IF "1" >= "A" // .F. QOut( "Si" ) ELSE QOut( "No" ) ENDIF Asignacin. (STORE en desuso). Ejemplo: cCadena = "Hola" Asignacin en lnea. Ejemplo: cCadena := "Hola" Concatenacin y asignacin en lnea. Ejemplo: LOCAL cVar := "Hola, " cVar += "que tal" QOut( cVar ) // Hola, que tal Concatenacin sin espacios intermedios, y asignacin en lnea. Ejemplo: LOCAL cVar := "Hola, " cVar -= "que tal"

>

>=

= o STORE := +=

-=

QOut( cVar ) // Hola,que tal

Operacin -------------$ REPLACE

Descripcin ------------------------Comprueba la existencia de una subcadena. Ejemplo: QOut( "Hola"$"Hola, que tal" ) // .T. Sustituye el valor de un campo. Ejemplo: LOCAL cNombre := SPACE( 30 ) @ 0,0 SAY "Nombre: " GET cNombre READ USE CLIENTES INDEX CLIENTES dbAppend() REPLACE Field->NOMBRE with cNombre dbCloseArea() Elimina espacios iniciales y finales. Ejemplo: cVar := " XYZ " cVar := AllTrim( cVar ) // "XYZ" Convierte un carcter en su nmero ASCII equivalente. Ejemplo: QOut( ASC( "A" ) ) // 65 Determina la posicin de una subcadena. Ejemplo: cVar := "*HOLA*" QOut( AT( "HOLA", cVar ) ) // 2 Convierte una cadena a fecha. Ejemplo: CtoD( "01-04-94" )

ALLTRIM()

ASC()

AT()

CTOD()

DESCEND() Convertir en forma complementada. Se utiliza para crear ficheros ndice en orden descendente (de mayor a menor). Ejemplo: USE CLIENTES INDEX ON DESCEND( NOMBRE ) TO CLIENTES // Zacarias // Ursula // Manuel ...

Operacin --------------EMPTY()

Descripcin .-----------------------Comprueba valor nulo (cadena vaca). Ejemplo: IF Empty( cVar ) QOut( "CADENA VACIA" ) ENDIF Comprueba que el primer carcter sea una letra. Ejemplo: QOut( IsAlpha( "XYZ" ) ) // .T. Comprueba que el primer carcter sea un dgito. Ejemplo: QOut( IsDigit( "XYZ" ) ) // .F. Comprueba que el primer carcter este en minscula. Ejemplo: QOut( IsLower( "XYZ" ) ) // .F. Comprueba que el primer carcter este en mayscula. Ejemplo: QOut( IsUpper( "XYZ" ) ) // .T. Extrae una subcadena por la izquierda. Ejemplo: QOut( Left( "XYZ", 2 ) ) // XY Devuelve la longitud de una cadena. Ejemplo: QOut( Len( "XYZ" ) ) // 3 Convierte una cadena a minsculas. Ejemplo: QOut( Lower( "XYZ" ) ) // xyz Elimina espacios por la izquierda. Ejemplo: QOut( LTrim( " XYZ" ) ) // XYZ Centra una cadena por pantalla, rellenando con espacios u otro carcter, tanto el inicio como el final de la cadena, segn una longitud determinada. Ejemplo: PadC( "XYZ", 80 )

ISALPHA() ISDIGIT() ISLOWER()

ISUPPER()

LEFT() LEN() LOWER() LTRIM() PADC()

Operacin ----------------PADL()

Descripcin -----------------------Rellena con espacios u otro carcter, el inicio de una cadena, segn una longitud determinada. Ejemplo: PadL( "XYZ", 80, "*" ) Rellena con espacios u otro carcter, el final de una cadena, segn una longitud determinada. Ejemplo: PadR( "XYZ", 40 ) Devuelve la posicin de una subcadena, empezando la bsqueda por la derecha. Sin embargo, el valor devuelto se cuenta por la izquierda. Ejemplo: QOut( "HOLA", "*HOLA*" ) // 2 Repite una serie de caracteres, un determinado nmero de veces. Ejemplo: QOut( Replicate( "*", 5 ) ) // ***** Extrae una subcadena por la derecha. Ejemplo: QOut( Right( "XYZ", 2 ) ) // YZ Elimina los espacios finales de una cadena. Ejemplo: QOut( RTrim( "XYZ " ) ) // XYZ Convierte una cadena en su equivalente fontico. Ejemplo: QOut( Soundex( "Pez" ) ) // P200 QOut( Soundex( "Peso" ) ) // P200 Crea una cadena de espacios. Ejemplo: cVar := SPACE( 10 ) QOut( Len( cVar ) )

PADR()

RAT()

REPLICATE

RIGHT() RTRIM() SOUNDEX()

SPACE()

// 10

Operacin ----------------STRTRAN()

Descripcin ------------------------Busca y reemplaza una serie de caracteres en una cadena. Ejemplo: QOut( StrTran( "999.99", ".", "," ) ) // Resultado: 999,99 // Sustituimos el punto decimal por // una coma. Elimina, inserta y/o reemplaza caracteres en una cadena. Ejemplo: cVar := "**1**" nPos := AT( "1", cVar ) QOut( Stuff( cVar, nPos, 1, "0" ) ) // Resultado: **0** Extrae una subcadena. Ejemplo: QOut( "XYZ", 2, 1 ) Formatea una cadena. QOut( Transform( "xyz", "@!" ) ) // Y // XYZ

STUFF()

SUBSTR() TRANSFORM() TYPE() UPPER()

Evala el tipo de datos de una expresin. QOut( 'Left( "XYZ", 1 )' ) // C = cadena Convierte las letras de una cadena a maysculas. QOut( Upper( "xyz" ) ) // XYZ Convierte una cadena a valor numrico. Ejemplo: QOut( Val( "123Z" ) ) // 123 QOut( Val( "Z123" ) ) // 0 Evala una expresin o variable directamente. Ejemplo: cVar := "XYZ" QOut( ValType( cVar ) ) // C

VAL()

VALTYPE()

Notas: La principal diferencia entre TYPE y VALTYPE, es en que este ltimo se puede utilizar directamente sobre variables. OPERACIONES CON DATOS DE TIPO NUMERICO Los tipos de datos numricos son los que se utilizan para manipularse matemticamente, y estan formados por los dgitos ( 0 al 9 ), el punto como separador de decimales y los caracteres + y - para indicar el signo del nmero. Podemos realizar las siguientes operaciones con ellos: (Suponga para los ejemplos lo siguiente: LOCAL nNumero := 5) Operacin --------+ * Descripcin ---------------------------------------Suma. Ejemplo: QOut( nNumero + 1 ) Resta. Ejemplo: QOut( nNumero - 1 ) Multiplicacin. Ejemplo: QOut( nNumero * 2 ) // 6 // 5 // 10

Operacin ---------------/ % 5 2 1 ** o chr(94) ++ 2

Descripcin ------------------------Divisin. Ejemplo: QOut( nNumero / 2 ) Resto. Ejemplo: QOut( nNumero % 2 ) // 2.5 // 1

Exponenciacin. Ejemplo: QOut( nNumero ** 2 ) Incremento. Ejemplo: nNumero++ QOut( nNumero ) Decremento. Ejemplo: nNumero-QOut( nNumero ) Comprobacin igualdad. Ejemplo: IF nNumero = 5 QOut( "IGUAL A 5" ) ENDIF

// 25

// 6

--

// 4

= o ==

!=, <> o #

Comprobacin desigualdad. Ejemplo: IF nNumero != 5 QOut( "DESIGUAL A 5" ) ENDIF Comprobar si es menor que ... Ejemplo: IF nNumero < 5 QOut( "MENOR QUE 5" ) ENDIF

<

Operacin

Descripcin

--------------<

--------------------Comprobar si es menor que ... Ejemplo: IF nNumero < 5 QOut( "MENOR QUE 5" ) ENDIF Comprobar si es menor que o igual ... Ejemplo: IF nNumero <= 5 QOut( "MENOR O IGUAL A 5" ) ENDIF Comprobar si es mayor que ... Ejemplo: IF nNumero > 5 QOut( "MAYOR QUE 5" ) ENDIF Comprobar si es mayor o igual que ... Ejemplo: IF nNumero >= 5 QOut( "MAYOR O IGUAL A 5" ) ENDIF Asignacin. (STORE en desuso). Ejemplo: nNumero = 10 Asignacin en lnea. Ejemplo: LOCAL nNumero := 10 Suma y asignacin en lnea. Ejemplo: QOut( nNumero += 5 ) Resta y asignacin en lnea. Ejemplo: QOut( nNumero -= 5 ) // 10 // 0

<=

>

>=

= o STORE := += -= *=

Multiplicacin y asignacin en lnea. Ejemplo: QOut( nNumero *= 5 ) // 25

Operacin ---------------/= ^= %= REPLACE ABS()

Descripcin --------------------------Divisin y asignacin en lnea. Ejemplo: QOut( nNumero /= 5 )

// 1

Exponenciacin y asignacin en lnea. Ejemplo: QOut( nNumero 2 ) // 2 Resto y asignacin en lnea. Ejemplo: QOut( nNumero %= 5 ) // 0

Sustituir el valor de un campo. Ejemplo: REPLACE CODIGO WITH nNumero Calcula el valor absoluto (positivo). Ejemplo: QOut( ABS( -3.25 * 5.5 ) // 17.875 QOut( -3.25 * 5.5 ) // -17.875 Convierte un nmero a su equivalente ASCII. Ejemplo: QOut( CHR( 65 ) ) // A

CHR()

DESCEND() Crea indexados en orden ascendente. Ejemplo: USE CLIENTES INDEX ON DESCEND( CODIGO ) TO CLIENTES EMPTY() Comprueba valor cero. Ejemplo: IF Empty( nNumero ) QOut( "VALOR CERO" ) ENDIF Exponenciacin en base e. Ejemplo: QOut( EXP( 5 ) ) // 148.41

EXP() INT()

Convierte un nmero a entero. Ejemplo: QOut( INT( 3.25 ) ) // 3

Operacin ---------------LOG() MAX()

Descripcin --------------------------Calcula el logaritmo natural. Ejemplo: QOut( LOG( 5 ) )

// 1.61

Calcula el valor mximo. Ejemplo: LOCAL nNum1 := 8, nNum2 := 5 QOut( MAX( nNum1, nNum2 ) ) // 8 Calcula el valor mnimo. Ejemplo: LOCAL nNum1 := 8, nNum2 := 5 QOut( MIN( nNum1, nNum2 ) ) // 5 Calcula el resto (equivalencia con dBase III+). Ejemplo: LOCAL nNum1 := 8, nNum2 := 5 QOut( MOD( nNum1, nNum2 ) ) // 3 Redondeo. Ejemplo: LOCAL nNumero := 9.60 QOut( Round( nNumero ) ) Raiz cuadrada. Ejemplo: QOut( SQRT( 25 ) ) // 5

MIN()

MOD()

ROUND()

// 10

SQRT() STR()

Convierte un nmero a cadena. Ejemplo: LOCAL nNumero := 5 LOCAL cNumero := Str( nNumero ) + A QOut( cNumero ) // 5A

TRANSFORM() Convertir en cadena formateada. Ej: LOCAL nNumero := 5.999 QOut( Transform( nNumero, "999.99" ) ) // Resultado = 6.00, se efecta // redondeo al comernos un dgito.

Operacin ---------------TYPE() VALTYPE()

Descripcin ------------------Evala el tipo de dato de una expresin. Ejemplo: QOut( Type( "5 * 2" ) ) // N Evala el tipo de dato de una expresin, o de una variable de forma directa. Ejemplo: QOut( ValType( nNumero ) ) // N

OPERACIONES CON DATOS DE TIPO FECHA Los datos de tipo fecha, identifican como su nombre indica, las fechas del calendario, estan formados por los dgitos del 0 al 9, y por un carcter separador, especificado por el mandato SET DATE. Podemos realizar las siguientes operaciones: - para los siguientes ejemplos, suponga que: La fecha del ordenador es 01-04-94 SET DATE ITALIAN dFecha := date() // 01-04-94 Operacin --------+ -

Descripcin ------------------------------------------Sumar das a una fecha. Ejemplo: QOut( dFecha + 10 ) Restar das de una fecha. Ejemplo: QOut( dFecha - 10 ) // 11-04-94 // 22-03-94

Operacin --------------++

Descripcin ------------------Incrementar fecha en uno. Ejemplo: dFecha++ QOut( dFecha ) Decrementar fecha en uno. Ejemplo: dFecha-QOut( dFecha ) // 02-04-94

--

// 31-03-94

= o ==

Comprobar si son iguales dos fechas. Ejemplo: IF dFecha == CTOD( "01-04-94" ) QOut( "Fecha idnticas" ) ENDIF Comprobar si son desiguales. Ejemplo: IF dFecha != CTOD( "01-01-94" ) QOut( "Fecha desigual a 01-01-94" ) ENDIF Comprobar si es anterior. Ejemplo: IF dFecha < CTOD( "01-01-94" ) QOut( "Fecha ao 93" ) ENDIF Comprobar si es anterior o igual. Ejemplo: IF dFecha <= CTOD( "31-12-93" ) QOut( "Fecha anterior al 94" ) ENDIF Comprobar si es posterior. Ejemplo: IF dFecha > CTOD( "31-12-93" ) QOut( "Fecha ao 94" ) ENDIF

!=, <> o #

<

<=

>

Operacin -------------->=

Descripcin ------------------Comprobar si es mayor o igual. Ejemplo: IF dFecha >= CTOD( "01-01-94" ) QOut( "Fecha ao 94" ) ENDIF Asignacin. (STORE esta en desuso). Ejemplo: dFecha = date() Asignacin en lnea. Ejemplo: LOCAL dFecha := date() Suma y asignacin en lnea. Ejemplo: QOut( dFecha += 1 ) Resta y asignacin en lnea. Ejemplo: QOut( dFecha -= 1 ) // 02-04-94 // 31-03-94

= o STORE := += -= REPLACE CDOW() CMONTH() DAY() DESCEND()

Sustituir valor de un campo. Ejemplo: REPLACE FECHA WITH date() Devuelve el nombre del da de la semana. Ejemplo: QOut( cDow( date() ) ) // Viernes Devuelve el nombre del mes. Ejemplo: QOut( cMonth( date() ) ) // Abril Extrae el da de una fecha. Ejemplo: QOut( day( date() ) ) // 1 ->01-04-94 Crea indexados en orden descendente. Ejemplo: USE CLIENTES INDEX ON DESCEND( DTOS( FECHA ) ) TO FECHAS

Operacin --------------DOW()

Descripcin ------------------Devuelve el nmero del da de la semana. (Domingo = 1, Lunes = 2, ..., Sabado = 7) Ejemplo: QOut( dow( date() ) ) // 6 Convierte fecha en cadena de caracteres. Ejemplo: QOut( "Fecha: " + DtoC( date() ) ) // Resultado: Fecha: 01-04-94 Convierte fecha en cadena con formato de ordenacin. Es de mucha utilidad para los ficheros indexados por un campo de tipo fecha. Ejemplo: QOut( "Fecha: " + DtoS( date() ) ) // Resultado: Fecha: 19940401 Comprobar valor nulo. Ejemplo: LOCAL dFecha IF Empty( dFecha ) QOut( "Fecha vaca" ) ENDIF Devuelve el nmero del mes. Ejemplo: QOut( Month( date() ) ) // 4 ->01-04-94

DTOC()

DTOS()

EMPTY()

MONTH()

TRANSFORM() Convertir en cadena formateada. Ejemplo: QOut( Transform( "01-04-94", "@D" ) TYPE() Evala el tipo de datos de una expresin. Ejemplo: QOut( Type( 'CtoD( "01-04-92" )' ) ) // Resultado: D -> tipo de dato fecha Evala directamente el tipo de datos de una variable. Ejemplo: QOut( ValType( dFecha ) ) // D Devuelve el nmero de ao completo, incluyendo el siglo. Ejemplo: QOut( Year( date() ) ) // 1994

VALTYPE()

YEAR()

OPERACIONES CON DATOS DE TIPO LOGICO Los tipos de datos lgicos identifican elementos de naturaleza booleana, es decir, elementos como verdad/mentira, si/no, etc. Y sobre ellos podemos realizar las siguientes operaciones: Operacin Descripcin ---------------------------------------------------.AND. Conjuncin lgica. Ejemplo: LOCAL nNumero := 99 IF nNumero >= 1 .AND. nNumero < 100 QOut( "N positivo menor que 100" ) ENDIF
.OR.

Disyuncin inclusiva lgica. Ejemp: LOCAL cConfirma := SPACE( 1 ) // ... @ 0,0 SAY "Borrar (S/N)" GET cConfirma READ IF cConfirma == "S" .OR. cConfirma == "s" dbDelete() PACK ENDIF // ...

// La condicin anterior se podra reducir a: IF Upper( cConfirma ) == "S"

Operacin ---------------.NOT. o !

Descripcin --------------------Negacin. Eje : USE CLIENTES DO WHILE !EOF() //Mientras no ltimo QOut( STR( CODIGO ) + NOMBRE ) dbSkip() ENDDO dbCloseArea() Comprobar si son iguales. Ejemplo: LOCAL lSN := .T. @ 0,0 SAY "(T/F) " GET lSN picture "L" READ IF lSN == .T. QOut( "VERDAD" ) ELSE QOut( "FALSO" ) ENDIF Comprobar si son desiguales. Ejemplo: LOCAL lSN := .T. @ 0,0 SAY "(T/F) " GET lSN picture "L" READ IF lSN != .T. QOut( "FALSO" ) ELSE QOut( "VERDAD" ) ENDIF

= o ==

!=, <> o #

Notas: Para mayor informacin sobre los operadores lgicos (.AND., .OR., .NOT.), consulte la leccin n 21.

OPERACIONES CON DATOS DE TIPO MEMO Los datos de tipo MEMO, son campos de una base de datos, y estan representados por caracteres de longitud Pudiendo realizar sobre ellos las siguientes operaciones: Operacin Descripcin ----------------------------------------------------HARDCR() Sustituye los retornos de carro blandos->CHR(141) (o automticos) por retornos de carro forzados-> CHR(13) Edita el contenido de un campo MEMO. Extrae una lnea de texto de un campo MEMO o de una cadena.

MEMOEDIT() MEMOLINE()

MEMOREAD() Lee un fichero ASCII. MEMOTRAN() Sustituye los retornos de carro forzados por los blandos o automticos. MEMOWRIT() Escribe en un fichero ASCII. MLCOUNT() MLPOS() Cuenta las lneas de un campo MEMO o de un cadena. Calcula la posicin que tendra una lnea determinada, en caso de variar el ancho del campo MEMO o de una cadena.

Ejemplo: Para comprender mejor dicho funcionamiento, ejecute el siguiente programa.


// ----------------------------------------------------------// Compilacin: CLIPPER PROG /N // RTLINK FILE PROG FUNCTION MAIN() LOCAL nNumero := 0 LOCAL i := 0 // Creamos fichero con un campo MEMO dbCreate( "TEXTO", { { "NUMERO", "N", 02, 00 }, ; { "NOTAS", "M", 10, 00 } } ) // Borramos pantalla, y creamos marco para la edicin CLS @ 05,10 TO 10,70 @ 10,15 SAY " Ctrl + W = Grabar " // Abrimos fichero y aadimos un registro USE TEXTO dbAppend() nNumero++ REPLACE NUMERO WITH nNumero REPLACE NOTAS WITH MemoEdit( NOTAS, 06, 11, 09, 69, .T. ) READ DevPos( 11, 00 ) QOut("Escribimos en un fichero ASCII el contenido de NOTAS") MemoWrit( "TEXTO.TXT", Field->NOTAS )

QOut( "Leemos y editamos dicho fichero ASCII" ) MemoEdit( MemoRead( "TEXTO.TXT" ), 06, 11, 09, 69, .T. ) Inkey( 0 ) LS QOut("Mostrar NOTAS, con sustitucin retorno carro autom.") QOut("Contamos lneas-> MLCOUNT(), y extraemos->MEMOLINE()") FOR i := 1 TO MlCount( Field->NOTAS, 59 ) QOut( HardCR( MemoLine( Field->NOTAS, 59, i ) ) ) NEXT InKey( 0 ) CLS QOut("Mostrar campo NOTAS, con sustitucin retornos carro:") QOut("Forzado, chr(13) = * y automtico, chr(141) = **") OR i := 1 TO MlCount( Field->NOTAS, 59 ) QOut( MemoTran( MemoLine(Field->NOTAS,59,i) ),"*","**" ) NEXT dbCloseArea() RETURN NIL // ------------------------------------------------------------

OPERACIONES CON DATOS DE TIPO NIL El dato de tipo NIL, es un nuevo tipo de datos que nos permite manipular variables no inicializadas sin generar errores. Un valor NIL, es siempre menor que cualquier otro tipo de dato, por lo que en cuanto a los operadores relacionales, solo usaremos los de igualdad o desigualdad. Es decir, si una variable es igual a NIL, se trata de un dato NIL, y si es desigual se trata de otro dato que tiene un valor superior a NIL. Operacin --------= o ==

Descripcin -----------------------------------------------Comprobar si son iguales. Ejemplo: LOCAL nNumero if nNumero == NIL QOut( "Variable no inicializada" ) endif Comprobar si son desiguales. Ejemplo: LOCAL nNumero := 5 if nNumero != NIL QOut( "Variable inicializada" ) endif Asignar a una variable de memoria, LOCAL o ESTATICA. (STORE esta en desuso). Ejemplo: LOCAL nNumero := 5 nNumero := 5 // o nNumero = 5 Comprueba el valor NIL. Ejemplo: LOCAL xVariable

!=, <> o #

= o := STORE

EMPTY()

Operacin --------EMPTY()

Descripcin -----------------------------------------------Comprueba el valor NIL. Ejemplo: LOCAL xVariable if Empty( xVariable ) QOut( "Variable VACIA" ) endif Evala el tipo de datos de una expresin. Ejemplo: QOut( TYPE( 'NIL' ) ) // Resultado: U = NIL Evala el tipo de datos de una expresin. Suele aplicarse directamente a variables. Ejemplo: LOCAL xVariable QOut( VALTYPE( xVariable ) ) // Resultado: U = NIL

TYPE()

VALTYPE()

OPERACIONES CON ARRAYS Los arrays nos permiten almacenar un conjunto de variables en memoria de distintos tipos, realizar operaciones entre ellos, y al estar en memoria su manejo es mucho ms rpido que la manipulacin de registros de disco. Operacin
--------aAdd()

Descripcin
----------------------------------------Aade un nuevo elemento al final de un array.

Sintaxis: aAdd( <axArray>, <xExpresion> ) Ejemplo: aAdd( acClientes, "Pepe" )

Operacin -------------aChoice()

Descripcin ------------------------Selecciona uno de los elementos de un array. Sintaxis: aChoice( <nTop>, <nLeft>, <nBottom>, <nRight>, ; <axArray> [, <alArray> ; [, <funcin usuario> [, ; <nElemInicial> [, <nFilaRelativa> ]]]] ) Ejemplo: nOpcion := aChoice( 05, 05, 07, 10, { "S", "No" } )

aClone()

Duplica un array. Sintaxis: aClone( <axArray> ) Ejemplo: anArray1 := { 1, 2, 3 } anArray2 := aClone( anArray1 )

aCopy()

Copia elementos de un array a otro. Sintaxis: aCopy( <axArrayOrigen>, <axArrayDestino> ; [, <nElemInicioCopia> [, <nElemACopiar> ; [, <nElemInicioDestino> ]]] ) Ejemplo: anArray1 := { 4, 5, 6 } anArray2 := { 1, 2, 3 } aCopy( anArray1, anArray2, 1, 3, 4 )

aDel()

Borrar un elemento de un array.

Operacin --------------

Descripcin ------------------------Sintaxis: aDel( <axArray>, <nElemento> ) Ejemplo: anArray := { 1, 2, 3 } aDel( anArray, 2 )

aDir()

Rellena un array con los ficheros encontrados. Tambin devuelve el n de ficheros encontrados. Sintaxis: aDir( <mscara> [, <acFicheros> [, <anTamao> ; [, <adFechas> [, <acHoras> [, <acAtributos> ]]]]]] ) Ejemplo: acFicheros := Array( aDir( "*.PRG" ) ) aDir( "*.PRG", acFicheros ) Notas: Se aconseja utilizar Directory()

aEval()

Evala un CodeBlock para cada elemento del array. Sintaxis: aEval(<axArray>,<CodeBlock>, [<nElemInicial>], ; [<nElemAProcesar>] ) Ej: anNumeros := { 1, 2, 3 } aEval( { |anNumeros| nSuma += anNumeros } )

aFields()

Rellena arrays con la informacin de los campos. Sintaxis:


aFields(<acNombres> [,<acTipos> [,<anAnchoCampo>; [, <anDecimales> ]]] )

Operacin --------------

Descripcin ------------------------Ejemplo: USE CLIENTES // fCount = N campos

acNombres := Array( fCount() ) acTipos := Array( fCount() ) anAnchos := Array( fCount() ) anDecimal := Array( fCount() ) acEstruct := Array( fCount() ) aFields(acNombres, acTipos, anAnchos, anDecimal) FOR i := 1 TO fCount() acStruct[ i ] := Padr( acNombres[ i ], 10 ) + ; " " + acTipos[ i ] + " " + ; StrZero( anAnchos[ i ], 2 ) + ; " "+StrZero( anDecimal[ i ], 2) NEXT aChoice( 05, 20, 15, 60, acStruct ) Notas: Se aconseja utilizar dbStruct() aFill() Rellena los elementos de un array con un valor dado. Sintaxis: aFill( <axArray>, <axExpresin> [, <nInicio> ; [, <nElementos> ]] ) Ejemplo: LOCAL anNumero[ 3 ] aFill( anNumero, 0 )

Operacin -------------aIns()

Descripcin ------------------------Inserta un elemento en un array. Sintaxis: aIns( <axArray>, <nPosicin> ) Ejemplo: anNumero := { 1, 3, 4 } aIns( anNumero, 2 ) anNumero[ 2 ] := 2

Array()

Crea/inicializa un array con los elem. y dimens. Sintaxis: Array( <nElemDimensin1> ; { [, <nElemDimensinN> ] } ) Ejemplo: LOCAL anNumero := Array( 5 )

aScan()

Busca secuencialmente un elemento en un array. Sintaxis: aScan( <axArray>, <axExpresin> [, <nInicio> ; [, <nElementos> ]] ) Ejemplo: anNumero := { 1, 2, 3 } QOut( aScan( anNumero, 2 ) ) // 2

aSize()

Modifica el tamao de un array. Sintaxis: aSize( <axArray>, <nNuevoTamao> ) Ejemplo: LOCAL anNumero := { 1, 2, 3 } QOut( Len( anNumero ) ) // 3 aSize( anNumero, 2 ) QOut( Len( anNumero ) ) // 2

Operacin -------------aSort()

Descripcin ------------------------Ordena el contenido total o parcial de un array. Sintaxis: aSort(<axArray> [,<nElemInicio> [,<nElementos> ; [, <bOrdenacin> ]]] ) Ejemplo: anNumero := { 3, 1, 2 } aSort( anNumero ) FOR i := 1 TO Len( anNumero ) QOut( anNumero[ i ] ) NEXT

aTail()

Devuelve el ltimo elemento de un array. Sintaxis: aTail( axArray ) Ejemplo: acLetras := { "A", "B", "C", "D" } QOut( aTail( acLetras ) ) // = "D"

dbCreate()

Crea una base de datos, desde un array. Sintaxis: dbCreate( <cFichero>, <axArray> ) Ejemplo: dbCreate( "CLIENTES", ; { { "CODIGO", "N", 02, 0 } , ; { "NOMBRE", "C", 30, 0 } } )

dbStruct()

Crea un array, con la estructura de la base datos. Sintaxis: dbStruct()

Operacin --------------

Descripcin ------------------------Ejemplo: acEstruct := {} USE CLIENTES axEstruct := dbStruct() FOR i := 1 TO Len( axEstruct ) aAdd( acEstruct, PadR( axEstruct[ i, 1 ], 10 )+; " " + axEstruct[ i, 2 ] + " " + ; StrZero( axEstruct[ i, 3 ], 2 ) + " " + ; StrZero( axEstruct[ i, 4 ], 2 ) ) NEXT aChoice( 05, 20, 15, 60, acEstruct )

Directory() Crea un array con informacin sobre ficheros. Sintaxis: Directory( <cPath> [, <cAtributo> ]] ) Ejemplo: acDir := {} axDir := Directory( "*.*" ) FOR i := 1 TO Len( axDir ) aAdd( acDir, Padr( axDir[ i, 1 ], 12 ) + " " + ; Str( axDir[ i, 2 ] ) + " " + ; dTOc( axDir[ i, 3 ] ) + " " + ; axDir[ i, 4 ] +" "+ axDir[ i, 5 ] ) Len() Aplicado a un array, devuelve el tamao de este. Sintaxis: Len( <axArray> ) Ejemplo: anArray := Array( 2, 3 ) QOut( Len( anArray ) ) // = 2 QOut( Len( anArray[ 1 ] ) ) // = 3

Programa de Ejemplo
-------------------------// -----------------------------------------------------------// Compilacin: clipper matrices /n /w // rtlink file matrices // -----------------------------------------------------------FUNCTION Main() LOCAL acDir := {} // Array para ver direct. LOCAL axDir := Directory( "*.*" ) // Array con datos direct. LOCAL acEstruct := {} LOCAL axEstruct := {} LOCAL i, j := 0 LOCAL nFila := 7 SetColor( "W+/W,W+/N,,,N/W" ) CLS // Mostrar los ficheros del directorio actual -------------SAVE SCREEN FOR i := 1 TO Len( axDir ) aAdd( acDir, Space( 5 ) + PadR( axDir[ i, 1 ], 12 ) + ; " " + Str( axDir[ i, 2 ] ) + " " + ; dTOc( axDir[ i, 3 ] ) + " " + ; axDir[ i, 4 ] + " " + axDir[ i, 5 ] ) NEXT @ 07,14 TO 13,66 aChoice( 08, 15, 12, 65, acDir ) RESTORE SCREEN // --------------------------------------------------------// Array para ver estruct. // Array para la estruct. // Contadores bucle // Contador filas

Programa de Ejemplo
-------------------------// Creamos Base de Datos ----------------------------------dbCreate( "CLIENTES", { { "CODIGO", "N", 02, 0 }, ; { "NOMBRE", "C", 30, 0 } } ) // --------------------------------------------------------// Visualizamos Estructura de la Base de Datos creada -----SAVE SCREEN USE CLIENTES axEstruct := dbStruct() FOR i := 1 TO Len( axEstruct ) aAdd( acEstruct, Space( 7 ) + ; PadR( axEstruct[ i, 1 ], 10 ) + " " + ; axEstruct[ i, 2 ] + " " + ; StrZero( axEstruct[ i, 3 ], 2 ) + ; " " + StrZero( axEstruct[ i, 4 ], 2 ) ) NEXT @ 07,24 TO 13,56 aChoice( 08, 25, 12, 55, acEstruct ) RESTORE SCREEN // -------------------------------------------------------// Algunas operaciones con Arrays ------------------------@ 01,05 SAY "Inspector de Arrays" COLOR "N/W" @ 03,05 SAY "Nombre .................: axDir" @ 04,05 SAY "N Filas ...............: " + ; AllTrim( Str( Len( axDir ) ) ) @ 05,05 SAY "N Columnas ............: " + ; AllTrim( Str( Len( axDir[ 1 ] ) ) ) FOR i := 1 TO Len( axDir[ 1 ] )

Programa de Ejemplo
-------------------------FOR i := 1 TO Len( axDir[ 1 ] ) @ nFila,05 SAY "Tipo Data Columna n " + ; AllTrim( StrZero( i, 2 ) ) + " : " + ; ValType( axDir[ 1, i ] ) nFila++ NEXT @ ++nFila, 05 SAY "" FOR i := 1 TO Len( axDir ) FOR j := 1 TO Len( axDir[ 1 ] ) QQOut( axDir[ i, j ] ) QQOut( axDir[ i, j ] ) QQOut( " - " ) NEXT QOut() DevPos( Row(), 05 ) NEXT @ 23,00 SAY "" // --------------------------------------------------------RETURN NIL // ------------------------------------------------------------

OPERACIONES CON CODEBLOCKS Un CodeBlock o bloque de cdigo, como vimos antes es un nuevo tipo de dato, con una sintaxis particular, y una gran potncia, y que se recomienda utilizar en sustitucin de las macros (&), ya que a diferencia de estas los CodeBlocks se compilan en tiempo de compilacin, y no en tiempo de ejecucin como las macros. Por lo tanto, los CodeBlocks son ms rpidos. Operacin ---------------aEval()

Descripcin ---------------------Evaluacin en cada elemento de un array. Sintaxis: aEval( <axArray>, <bCodeBlock>, ; [, <nElemInicio>], [<nElemProceso>] ) Ejemplo: anArray := { 1, 2, 3 } // Sumamos los elementos del array aEval( anArray, { |anArray| nSuma += anArray } )

dbEval()

Evaluacin en cada registro de una base datos. Sintaxis: dbEval( <bBlock> [, <lCondicinFOR> ; [,<lCondicinWHILE> [,<nRegistrosNEX>;
[,<nRegistroRECORD>[,<lAmbitoREST | ALL>;

]]]]] )

Operacin ----------------

Descripcin ---------------------Ejemplo: USE PEDIDOS // Cuenta en el fichero de Pedidos, los que haya // realizado el cliente cuyo cdigo = 1 dbEval( { || nPedidos++ }, { || Field->CODIGO = 1 }) CLOSE Alert( "Pedidos realizados: " + Str( nPedidos ) )

Eval()

Evaluacin de un CodeBlock genrico. Sintaxis: Eval( <bCodeBlock>, [ <operaciones> ] ) Ejemplo: nTecla := 0 DevPos( 1, 70 ) // Posicin cursor // Mientrs no pulsemos ninguna tecla, visualizar // hora DO WHILE nTecla = 0 nTecla := Inkey( 0.1 ) Eval( { || Time() } ) ENDDO

Programa de ejemplo ------------------// -----------------------------------------------------------// Compilacin: clipper blocks /n /w // rtlink file blocks // ------------------------------------------------------------

Programa de ejemplo ------------------FUNCTION Main() LOCAL anArray LOCAL nSuma LOCAL nPepe LOCAL nTecla CLS // Evaluacin Array ---------------------------------------aEval( anArray, { |anArray| nSuma += anArray } ) Alert( "La suma es igual a ;" + AllTrim( Str( nSuma ) ) // --------------------------------------------------------// Creamos un fichero para pruebas ------------------------dbCreate( "CLIENTES", { { "CODIGO", "N", 02, 0 }, ; { "NOMBRE", "C", 30, 0 } } ) USE CLIENTES dbAppend() REPLACE Field->CODIGO WITH 1 REPLACE Field->NOMBRE WITH "PEPE1" READ dbAppend() REPLACE Field->CODIGO WITH 2 REPLACE Field->NOMBRE WITH "PEPE2" READ dbAppend() REPLACE Field->CODIGO WITH 3 REPLACE Field->NOMBRE WITH "PEPITO" READ := { 1, 2, 3 } := 0 // Acumulador array := 0 // Contador Clientes="PEPE" := 0 // Control teclado

Programa de ejemplo ------------------dbAppend() REPLACE Field->CODIGO WITH 2 REPLACE Field->NOMBRE WITH "PEPE2" READ dbAppend() REPLACE Field->CODIGO WITH 3 REPLACE Field->NOMBRE WITH "PEPITO" READ // --------------------------------------------------------// Evaluacin de Registros en Bases de Datos --------------dbEval( { || npepe++ }, { || Field->NOMBRE = "PEPE" } ) CLOSE Alert( "Se han encontrado ...;" + AllTrim( Str( nPepe ) ) ) // --------------------------------------------------------// Evaluacin de un bloque de cdigo ----------------------// Mientrs no pulsemos ninguna tecla, se evaluar ... DO WHILE nTecla = 0 nTecla := InKey( 0.1 ) // Con InKey(0) no avanzaramos Eval( { || Crono( 1, 70 ) } ) ENDDO // --------------------------------------------------------RETURN NIL // -----------------------------------------------------------// -----------------------------------------------------------// Funcin ...: Crono() // Descripcin: Muestra la hora en las coordenadas indicadas. // -----------------------------------------------------------FUNCTION Crono( nFila, nCol ) @ nFila, nCol SAY Time() RETURN NIL // ------------------------------------------------------------

ENTRADA DATOS Y SALIDA POR PANTALLA Otra, de entre, las muchas cualidades de CA-Clipper, es la potncia y sencillez con la que nos permite la entrada de datos y la salida de estos por pantalla, y que podramos clasificar de la siguiente forma: ENTRADA DE DATOS La entrada o captura de datos, permite dos nveles: Sin formatear ------------Donde no podemos ejercer un control estricto sobre los datos entrados. Son comandos similares a los de otros lenguajes como el Basic.
Comando/Funcin ---------------------ACCEPT | INPUT

Descripcin ---------------------------------------------Entrada de datos que se almacenan en una variable de memoria. ACCEPT solo acepta datos alfanumricos.

Sintaxis: ACCEPT [<cExpresin>] TO <cVariable> INPUT [<cExpresin>] TO <xVariable> Formateada ---------Donde podemos ejercer un estricto control sobre los datos entrados: tipo de dato, mscara, rango, condiciones y validaciones.

Comando/Funcin --------------@ ... SAY/GET

Descripcin ---------------------------------------------Es el sistema de entrada de datos, que luego son capturados con READ. Sintaxis:

@ <nFila>, <nColumna> ; [SAY <cExpresin> ; [PICTURE <cMscarSAY>] ; [COLOR <cColor>] ] ; GET <xVariable> ; [PICTURE <cMscaraGET>] ; [COLOR <cColor>] ; [WHEN <lCondicin>] ; [RANGE <nMnimo>, <nMximo>] | ; [VALID <lCondicin>] Las condiciones de WHEN y VALID pueden ser tambin fucniones de usuario. Mscaras de GETs: Smbolos de plantilla: Se utilizan tantos segn el ancho a entrar (para 5 nmeros -> PICTURE "99999") A -> Slo letras. L -> Slo valores lgicos (T/F/Y/N). N -> Slo letras y caracteres. X -> Cualquier carcter. Y -> Slo Y o N. 9 -> Slo nmeros. # -> Slo letras, espacios y signos. ! -> Slo letras maysculas. . -> Posicin punto decimal. , -> Indica los miles en los datos numricos $ -> Rellena con $ las cifras por la izda. * -> Rellena con * las cifras por la izda.

Comando/Funcin ---------------

Descripcin ----------------------------------------------

Smbolos de funcin ( PICTURE "@!" ): Tipo Accin ---- ------------------------------------A C Slo letras. B N Justifica los nmeros por la izda. C N Indica CR despus de un n positivo. D D,N Fechas, segn formato de SET DATE. E D,N N segn formato europeo: 1.000,50 K Todos Borra contenido variable. R C Los caracteres no se almacenan. S<n>C Scroll horizontal. X N Indica DB despus de un n negativo. Z N Los ceros se representan como blancos ( N Encierra con parntesis los n negativos con espacios a la izda. ) N Idem anterior, pero sin espacios. ! C Slo letras maysculas. WHEN ---Impide o no la edicin de un GET si se cumple o no una condicin anterior. Ejemplo: @ 05,05 SAY "Edad: " GET nEdad PICTURE "99" @ 06,05 SAY "Titular Cta.: " GET cTitular ; WHEN nEdad > 17 RANGE ----Permite la validacin de datos numricos, indicando los lmites inferior y superior.

Comando/Funcin ---------------

Descripcin ---------------------------------------------@ 07,05 SAY "Puntuacin: " GET nPuntos; PICTURE "99" RANGE 0,10 VALID ----Condicin de validacin. @ 08,05 SAY "Pagado (S/N): " GET cSalir ; PICTURE "!" VALID( cSalir $ "SN" ) Anula todos los GETs pendientes de la lectura con READ. Sintaxis: CLEAR GETS

CLEAR GETS

READ

Captura los datos de los GETs pendientes de leer. Los cuales se borran, que suele ser lo ms normal, en caso de interesar conservar su valor utilice SAVE. READ es solo una orden de preprocesador, que se reemplaza por la funcin ReadModal(). Sintaxis: READ [SAVE]

ReadExit()

Permite la salida de un READ al pulsar las teclas de flecha arriba y flecha abajo. Su valor por defecto es .F. Sintaxis: ReadExit( [<lTrueFalse>] )

ReadInsert()

Activa o desactiva el modo insercin en un READ o en un MEMOEDIT(). El valor por defecto es .F. Sintaxis: ReadInsert( [<lTrueFalse>] )

Comando/Funcin --------------ReadModal()

Descripcin ----------------------------------------------

Activa la edicin de objetos GET, desde un array. (Lo veremos al estudiar el objeto GET). Sintaxis: ReadModal( <axArrayDeGets> )

SALIDA DE DATOS Consola ------Entrada/Salida de datos por pantalla sin formatear, es decir, aparecern donde se encuentre el cursor, y no podremos ejercer un control estricto sobre ellos. Varios de los siguientes comandos y/o funciones, dependiendo del estado de SET DEVICE pueden enviar los datos a la impresora (lo estudiaremos ms adelante, en el apartado de la impresin). Comando/Funcin Descripcin ? / ?? QOut() / QQOut() Muestran el contenido de las expresiones que se indiquen. ? y QOut() provocan un avance de lnea, en cambio, ?? y QQOut() no. Sintaxis: ? / ?? [<xExpresin 1> {, <xExpresin N> }] QOut/QQOut([<xExpesin1> {,<xExpresin N>}] DISPLAY | LIST Muestran los registros de una base de datos, pueden ser todos o solo los que cumplan una condicin indicada. Adems de por pantalla, se pueden enviar a la impresora o a un fichero de texto.

Comando/Funcin --------------ReadModal()

Descripcin ---------------------------------------------Activa la edicin de objetos GET, desde un array. (Lo veremos al estudiar el objeto GET).

Sintaxis: DISPLAY | LIST [<mbito>] [<cListaCampos>] ; [FOR <lCondicin>] ; [WHILE <lCondicin>] ; [TO PRINT/TO FILE <cFichero>][OFF] LABEL FORM Muestra las etiquetas segn un formato indicado. Adems de por pantalla, se pueden enviar a la impresora o a un fichero de texto. Sintaxis: LABEL FORM <cFichero.LBL> [<mbito>] ; [FOR <lCondicin>] ; [WHILE <lCondicin>] ; [SAMPLE] ; [TO PRINT/TO FILE <cFichero>]
REPORT FROM Igual que el anterior, se puedem enviar a

distintos dispositivos, pero en vez de etiquetas son informes (listados).


REPORT FROM <cFichero.FRM> ;

[TO PRINTER/TO FILE <cFichero>] ; [<mbito>] ; [FOR <lCondicin>] ; [WHILE <lCondicin>] ; [PLAIN] [HEADING <cCabecera>] ; [NOEJECT] [SUMMARY]

Comando/Funcin Descripcin -----------------------------------------------------------TEXT...ENDTEXT Muestra, imprime o vuelca a un fichero ASCII el texto contenido entre TEXT/ENDTEXT. Sintaxis: TEXT [TO PRINT/TO FILE <cFichero>] <cTexto> ENDTEXT TYPE Muestra por pantalla, impresora o vuelca a un fichero de disco el contenido de un fichero de texto. Sintaxis: TYPE <cFile1> [TO PRINT/TO FILE <cFile2>]

Pantalla completa Las siguientes funciones nos permitirn ejercer un completo control sobre la pantalla. Como ver hay funciones y comandos que realizan la misma tarea, ya que gracias al preprocesador se han implementado como comandos para facilitar su uso, y mantener la compatibilidad con dBASE y versiones anteriores de Clipper. Aunque tambin encontrar funciones con distinto nombre pero que realizan la misma tarea aunque su filosofa de uso es distinta, ya que mientrs unas envian los datos al monitor, otros o hacen a un dispositivo denominado estndard (monitor u otro) pero que por ejemplo, permite rederigir la salida a otro disposito al estilo del MS-DOS (> PRN).

Comando/Funcin Descripcin -----------------------------------------------------------@ .. BOX Dibuja una caja segn las coordenadas DispBox() indicadas y el marco especificado. @ .. TO Sintaxis: @ <nTop>, <nLeft>, <nBottom>, <nRight> ; BOX <cMarco> DispBox( <nTop>, <nLeft>, <nBottom>, ; <nRight>, [<cnMarco>], [<cColor>] ) @ <nTop>, <nLeft> TO <nBottom>, <nRight> ; [DOUBLE] @ .. CLEAR Borrar pantalla. CLEAR SCREEN | CLS Sintaxis: @ <nTop>, <nLeft> CLEAR ; [TO <nBottom>, <nRigt>] CLEAR [SCREEN] CLS Muestra una expresin en las coordenadas indicadas y con un formato deseado. Sintaxis: @ <nFila>, <nCol>[SAY <cExpresin> ; [PICTURE <cMscaraSAY>] ; [COLOR <cColor>]]

@ .. SAY

Comando/Funcin --------------------------

Descripcin ---------------------Se utilizan los mismos cdigos de plantilla que en los GETs a excepcin de: A - Slo letras. K - Borra contenido variable (slo GETs). S<n> - Scroll (slo GETs). ) - Parentsis para n negativos, sin espacios

Alert()

Muestra por pantalla una sencilla caja de dilogo, con un men de hasta 4 opciones. Sintaxis: Alert( <cMensaje>, [<acMen>] )

Col()

Devuelve el nmero de la columna donde esta el cursor. Sintaxis: Col()

DevOut()

Muestra una expresin por el dispositivo actual de salida. Sintaxis: DevOut( <xExpresin> [, <cColor>] )

DevOutPict()

Muestra una expresin formateada por el dispositivo actual de salida. Sintaxis: DevOutPict( <xExpresin>, <cMscaraSay> ; [, <cColor>] )

Comando/Funcin -------------------------DevPos()

Descripcin ----------------------

Desplaza el cursor a las coordenadas indicadas Sintaxis: DevPos( <nFila>, <nCol> )

DispBegin()

Inicia el almacenamiento en la memoria intermedia de la salida por pantalla. Sintaxis: DispBegin()

DispEnd()

Vuelca a la pantalla lo almacenado anteriormente en la memoria intermedia. Sintaxis: DispEnd()

DispOut()

Muestra una expresin por pantalla. Sintaxis: DispOut( xExpresin> )

MaxCol()

Devuelve la columna mxima de visualizacin de la pantalla. Sintaxis: MaxCol()

MaxRow()

Devuelve la fila mxima de visualizacin de la pantalla. Sintaxis: MaxRow()

OutStd()

Muestra una lista de expresiones en el dispositivo estndar de salida. Sintaxis: OutStd( <xExpresin1> [, <xExpresinN>] )

Comando/Funcin Descripcin --------------------------------------------OutErr() Muestra una lista de expresiones en el dispositivo estndard de error. Sintaxis: OutErr( <xExpresin1> [, <xExpresinN<] )
RESTORE SCREEN Restaura la pantalla o un rea de est, pre-

RestScreen()

viamente salvada. Sintaxis: RESTORE SCREEN [FROM <cVariable>] RestScren( <nTop>, <nLeft>, <nBottom>, ; <nRight>, <cVariable> )

Row()

Devuelve la fila en la que se encuentra el cursor. Sintaxis: Row()

SAVE SCREEN SaveScreen()

Salva la pantalla o un rea de est. Sintaxis: SAVE SCREEN [TO <cVariable>] <cVariable> = SaveScreen( <nTop>, <nLeft>, ; <nBottom>, nRight> )

Scroll()

Realiza scroll en una parte de la pantalla.

Comando/Funcin -------------------------

Descripcin ---------------------

Sintaxis: Scroll( <nTop>, <nLeft>, <nBottom>, ; <nRight>, <nLineasMover> ) SetMode() Cambia el modo de visualizacin al nmero de filas y columnas indicadas (si el monitor lo permite). Sintaxis: SetMode( <nFilas>, <nColumnas> ) SetPos() Desplaza el cursor a las coordenadas indicadas. Sintaxis: SetPos( <nFila>, <nCol> )

Notas: Otras funciones ms o menos relacionadas con la pantalla y que veremos aparte son: aChoice(), Browse() y dbEdit(). Color ----Para el tratamiento de color, disponemos, adems de la opcin COLOR en los SAYs y GETs, los siguientes comandos y funciones:
Comando/Funcin Descripcion ------------------------------------------------------SetBlink() Activa o desactiva el atributo de parpadeo. Su valor por defecto es .T. Si lo desactivamos .F., obtenemos una gama ms amplia de colores. Sintaxis: SetBlink( <lTrueFalse> )

Comando/Funcin ------------------------SetColor() SET COLOR TO

Descripcin ---------------------

Cambian el color y atributos de la pantalla, y devuelven los colores actuales. El primer atributo de color de cada uno de los 5 tipos, es para los caracteres y el otro para el fondo: W/N = Carcter/Fondo La cadena de color por defecto es: "W/N,N/W,,,N/W" Sintaxis:

SetColor( <cnColor> )
SET COLOR/COLOUR TO [<cnNormal> ;

[, <cnResaltado>] ; [, <cnBorde>] ; [,<cnNoImplementado>]; [, <cnResalteGET>]] / [<cColor>] ColorSelect() Activa un atributo de la lista de los 5 tipos de color de SetColor(). Sintaxis: ColorSelect( <nIndiceColor> ) // De 0 a 4, siendo 0 el cnNormal.

Tabla Colores

-------------Color -----Cdigo Numrico ------Cadena -----N B G BG R RB GR W N+ B+ G+ BG+ R+ RB+ GR+ W+ U I

Negro 0 Azul 1 Verde 2 Cian 3 Rojo 4 Magenta 5 Marrn 6 Blanco 7 Gris 8 Azul Resaltado 9 Verde Resaltado 10 Cian Resaltado 11 Rojo Resaltado 12 Magenta Resalt. 13 Amarillo 14 Blanco Resalt. 15 Subrayado Inverso

Parpadeo Cursor ------

Con SetCursor() o SET CURSOR, podemos activar, desactivar o cambiar el tamao del cursor. Sintaxis: SetCursor( [<nValor>] )

Puede tomar los siguientes valores: 0 -> Desactivar. 1 -> Activar. 2 -> Modo insercin. _ 3 -> Bloque. _ 4 -> Parte superior bloque. _

Programas de ejemplo -------------------// ----------------------------------------------------------// Programa ..: Color.prg // Descripcin: Ejemplo colores. // Compilacin: Clipper color /n /W // rtlink file color // --------------------------------------------------------FUNCTION Main() // Arrays con los colores del primer plano y fondo LOCAL acColorPlano := { "N", "B", "G", "BG", "R", "RB", ; "GR", "W", "N*", "B*", "G*", ; "BG*", "R*", "RB*", "GR*", "W*" } LOCAL acColorFondo := { "N", "B", "G", "BG", "R", "RB", ; "GR", "W", "N+", "B+", "G+", ; "BG+", "R+", "RB+", "GR+", "W+" } LOCAL cColor := "" LOCAL i, j := 0 SAVE SCREEN SetBlink( .F. ) // Combinacin colores // Contadores bucle // Salvamos pantalla // Desactivamos parpadeo

// Combinaciones colores FOR i := 1 TO 16 FOR j := 1 TO 16 cColor := acColorPlano[ i ] + "/" + ; acColorFondo[ j ] SetColor( cColor ) @ 4 + i, 10 + j * 3 SAY " X " NEXT NEXT @ 24,00 SAY PadC( " Pulse tecla ", 80, "*" ) COLOR "W+/R" InKey( 0 ) RESTORE SCREEN SetBlink( .T. ) // Restauramos pantalla // Activamos parpadeo

RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Programa .. : Gets.prg // Descripcin : Ejemplo entrada de datos. // Compilacin: Clipper gets /n /W // rtlink file gets // ----------------------------------------------------#include "Box.ch" FUNCTION Main() LOCAL cAlumno := Space( 35 ) LOCAL dFecha := Date() LOCAL nNota := 0 LOCAL cPagada := "N"

CLS SetColor( "W+/B,N/W,,,W+/R" ) @ 05,10 CLEAR TO 15,70 DispBox( 05, 10, 15, 70, B_DOUBLE ) // Box.ch
@ 07,12 SAY "Nombre Alumno ..: " GET cAlumno PICTURE "@!" @ 08,12 SAY "Fecha Examen ... : " GET dFecha PICTURE "@D" @ 09,12 SAY "Puntuacin ..... : " GET nNota PICTURE "99" ;

RANGE 0,10
@ 12,12 SAY "Matrcula Pagada: " GET cPagada PICTURE "!" ;

VALID( cPagada $ "SN") READ RETURN NIL // ------------------------------------------------------------

CONTROL DEL TECLADO CA-Clipper almacena los caracteres de las teclas pulsadas en una memoria denominada memoria intermedia de teclado. Cuando dichos caracteres son solicitados por un comando o funcin de estado de espera ( ACCEPT, INPUT, READ, WAIT, ACHOICE(), DBEDIT(), MEMOEDIT() o INKEY() ) salen segn el orden de entrada.

Redimensionar tamao de la memoria intermedia de teclado. El mandato SET TYPEAHEAD o su funcin equivalente, permiten alterar el nmero de caracteres que puede almacenar la memoria intermedia, que puede estar entre 0 y 4096, el tamao por defecto depende del ordenador. Notas: Si redimensiona el buffer de teclado, se pierde el contenido actual. Sintaxis: SET TYPEAHEAD TO <nTamao> Set( _SET_TYPEAHEAD, <nTamao> ) Para limpiar el buffer de teclado: CLEAR TYPEAHEAD Entrada de caracteres en la memoria intermedia de teclado Para la introduccin automtica de caracteres en la memoria intermedia se utiliza el comando KEYBOARD (antes de introducir los caracteres borra la memoria intermedia). Para introducir caracteres no imprimibles se utiliza la funcin Chr(). Sintaxis: KEYBOARD <cExpresin> Un uso prctico sera para crear un men PullDown, es decir,que desde un men de lnea, al pulsar las teclas de flecha izquierda y/o derecha, se active el correspondiente men Popup,para ello haramos lo siguiente (ms adelante lo estudiaremos):

KEYBOARD Chr( 13 ) + Chr( 24 ) // Return + Flecha Abajo para desplegar men Lectura de caracteres de la memoria intermedia de teclado Para acceder a la memoria intermedia de teclado utilizamos las funciones InKey(), LastKey() y NextKey(), que devuelven un valor numrico comprendido entre 39 y 386, aunque tambin podemos utilizar las definiciones de teclado. Por ejemplo: KEY_ESC = 27 (tecla <ESC>). Para mayor informacin ver el fichero include -> INKEY.CH
Funcin/Comando Descripcin InKey() Extrae un carcter de la memoria intermedia, devuelve su valor ASCII. Sintaxis: InKey( [<nSegundos>] ) LastKey() Devuelve el valor ASCII de la ltima tecla pulsada. Eliminandolo del buffer. Sintaxis: LastKey() NextKey() Devuelve el valor ASCII, de la siguiente tecla pulsada. Sin eliminarlo del buffer. Normalmente se usa LastKey(). Sintaxis: NextKey() WAIT Detiene la ejecucin del programa y espera la pulsacin de una tecla. Se recomienda evitar su empleo, y la utilizacin de InKey(). Sintaxis: WAIT [<cExpresin>] [TO <xVariable>]

Ejecucin de tareas desde estados de espera ------------------------------------------Una de las muchas ventajas de CA-Clipper, es que nos permite arrancar tareas desde los estados de espera (INPUT, READ, etc.) mediante la asignacin de funciones o procedimientos a deter minadas teclas o combinaciones de estas con SET KEY ... o SetKey(). De esta forma y desde cualquier estado de espera, en que se detecte que hemos pulsado dicha tecla o combinacin de teclas, activa la tarea asociada, que una vez acabada volvemos al lugar donde la invocamos. Un caso tpico, es el de la ayuda que normalmente activamos al pulsar la tecla <F1>. Sintaxis: SET KEY <nTecla> TO [<funcin | procedimiento>] SetKey( <nTecla>, [<bCodeBlock>] ) Tambin se pueden asignar cadenas de caracteres a teclas de funcin mediante: SET FUNCTION <nTeclaFuncin> TO <cCadena>,siendo nTeclaFuncin => 1 a 10 => F1 a F10. Sin embargo, no es de mucha utilidad.

Otras funciones de teclado -------------------------AltD() Habilita o inhabilita la llamada al depurador (debugger) de CA-Clipper, siempre y cuando hayamos compilado con la opcin /B y linkado la librera CLD.LIB. Sintaxis: AltD( [<nNumero>] ) Sin nmero, se activa el depurador. Con 0, inhabilitamos depurador. Con 1, habilitamos depurador al pulsar ALT+D ReadExit() Permite o no que con las teclas de flecha arriba y flecha abajo salgamos de un READ. Su valor por defecto .F. Sintaxis: ReadExit( [<lTrueFalse>] ) ReadInsert() Activa o desactiva el modo insercin en un READ o en un MEMOEDIT(). Su valor por defecto es .F. Sintaxis: ReadInsert( [<lTrueFalse>] ) ReadKey() Devuelve el valor de la tecla pulsada en un READ. Su cometido es el de mantener la compatibilidad con los cdigos de teclado de dBASE que son distintos a los utilizados por CA-Clipper. Se recomienda utilizar LastKey() que realiza la misma funcin. Sintaxis: ReadKey() SetCancel() Activa o desactiva la posibilidad de abortar programas con la pulsacin de Alt+C. El valor por defecto es .T.

Sintaxis: SetCancel( [<lTrueFalse>] ) Es lo mismo que SET ESCAPE ON/off/<lTrueFalse>

Programa de Ejemplo ------------------// -----------------------------------------------------------// Programa ..: Teclas.prg // Descripcin: Ejemplo de control de teclado. // Compilacin: Clipper teclas /n /W // rtlink file teclas // -----------------------------------------------------#include "InKey.ch" FUNCTION Main() LOCAL nTecla := 0 // Para control teclas LOCAL cDatos := Space( 10 ) // Variable para GET LOCAL GetList := {} // Para el get (/W) SetCancel( .F. ) SetKey( K_F1, { || Ayuda() } ) // Impedimos salir con Alt+C // F1 = Ayuda

CLS @ 05,05 SAY "Entre dato, pero antes de salir, pulse F1: "; GET cDatos READ // Estado espera @ 18,20 SAY "* Pulse una tecla *" @ 20,10 SAY " Cdigo InKey() :" @ 21,10 SAY " Cdigo LastKey() :" nTecla := InKey( 0 ) @ 20,29 SAY nTecla @ 21,29 SAY LastKey() // Esperar pulsacin tecla // Muestra cdigo tecla // Idem anterior

RETURN NIL //------------------------------------------------------------// -----------------------------------------------------------// Funcin ... : Ayuda() // Descripcin: Ejemplo ayuda. // -----------------------------------------------------------FUNCTION Ayuda() Alert( "Ayuda" ) RETURN NIL // -----------------------------------------------------------MENUS En las primeras versiones de Clipper, otra de las mejoras que tena respecto al dBASE, era la posibilidad de crear facilmente mens. De esta forma no tenamos que recurrir al tpico: A - Opcin 1 B - Opcin 2 ... Elija opcin ?

Sintaxis:
@ <nFila1>,<nCol1> PROMPT <cTexto1> ;
MESSAGE <cLneaMensaje1 | bLneaMensaje1>

@ <nFilaN>,<nColN>PROMPT <cTextoN> ;
MESSAGE <cLneaMensajeN | bLneaMensajeN>

MENU TO <nOpcin> Internamente las coordenadas, las opciones del men y los mensaje se deben almacenar en arrays (ver en STD.CH las funciones que realmente se utilizan), y se devuelve la opcin seleccionada (nOpcin) o 0 si hemos pulsado la tecla <Escape>. Entorno ------Existen un par de comandos SET que afectan al funcionamiento del men que son: SET WRAP on | OFF | <lTrueFalse> Que activa o desactiva la circularidad de las opciones del men. Por defecto, esta en OFF, por lo que al llegar al final o al principo de un men, no rotara, sino que tendramos que retroceder. SET MESSAGE TO [ <nFila> [CENTER | CENTRE] ] Indica la fila donde aparecern los mensajes del men, y si estos irn centrados o no. Si indicamos SET MESSAGE TO 0 o slo SET MESSAGE TO, desactivamos visualizacin mensajes.

Funciones Relacionadas ---------------------Otra funcin, ya vista anteriormente y que podemos utilizar para la confeccin de mens es aChoice, que nos permite seleccionar uno de los elementos de un array. Sintaxis: aChoice( <nTop>, <nLeft>, <nBottom>, <nRight>, ; <axArray> [, <alArray> ; [, <funcin usuario> ; [, <nElemInicial> [, <nFila Relativa> ]]]] ) Ejemplo: nOpcion := aChoice( 05, 05, 07, 10, { "S", "No" } ) Tipos de Mens -------------En MS-DOS, adems de los arcaicos mens de Escoja opcin ?, podemos utilizar los siguientes tipos: Mens de lnea o 1-2-3, al estilo del LOTUS 1-2-3, es decir, cada opcin una al lado de la otra y todas en la misma lnea: Opcin1 Opcin2 Opcin3 Opcin4

Mens Popup o descendentes, como en los aChoice, es decir, las opciones en las mismas columnas pero en distintas filas.

Opcin1 Opcin2 Opcin3 Opcin4 Mens PullDown, es el resultado de la combinacin de los mens de lnea con mens popup. Opcin1 Opcin2 Opcin3 Opcin4

Opcin2-1 Opcin2-2 Adems, cuando pasemos a Windows, tendremos la posibilidad de utilizar las barras de botones (iconos o bitmaps), que son otro tipo de men. Programa de ejemplo: -------------------// ----------------------------------------------------------// Programa .. : MENUS.PRG // Descripcin : Ejemplo confeccin mens. // Compilacin : clipper menus /n /W // rtlink file menus // ----------------------------------------------------------#include "InKey.ch" // -----------------------------------------------------------

FUNCTION Main()
LOCAL nOpLinea := 0 LOCAL nOpPopup1 := 0 LOCAL nOpPopup2 := 0 LOCAL nOpPopup3 := 0 LOCAL nOpPopup4 := 0 SET WRAP ON
SET MESSAGE TO 24 CENTER

// Opcin men de lnea // Men Popup 1 // Men Popup 2 // Men Popup 3 // Men Popup 4 // Circularidad mens // Mensajes en lnea 24 y // centrados // Fondo Pantalla

SetColor( "W+/BG" ) CLS SetColor( "W+/W,W+/G" ) // Colores men @ 00,00 SAY PadC( "Ejemplo confeccin mens", 80 ) ; COLOR "W+/B" @ 01,00 SAY Space( 80 ) // Lnea men @ 24,00 SAY Space( 80 ) // Lnea mensajes

// Cada vez que pulsemos las teclas de flecha izda. o dcha. // ejecutaremos una funcin que nos despliegue el correspon// diente men popup SET KEY K_RIGHT TO KeyDcha() SET KEY K_LEFT TO KeyIzda() DO WHILE .T. // Men de Lnea --------------------------------------@ 01,00 PROMPT " " @ 01,20 PROMPT " Artculos " @ 01,40 PROMPT " Clientes " @ 01,60 PROMPT " Facturar "

MENU TO nOpLinea
DO CASE CASE nOpLinea = 1 // Salir SAVE SCREEN Window( 02, 00, 05, 05 ) // Podemos utilizar un CodeBlock, o una cadena // para la lnea mensaje @ 03,01 PROMPT " S " MESSAGE ; { || PadC( "Salir del programa", 80 ) } @ 04,01 PROMPT " No " MESSAGE " Continuar ... " MENU TO nOpPopup1 RESTORE SCREEN DO CASE CASE nOpPopup1 = 1 EXIT ENDCASE CASE nOpLinea = 2 SAVE SCREEN Window( 02, 19, 08, 30 ) @ 03,20 PROMPT " Aadir " MESSAGE ; "Dar de alta un nuevo artculo " @ 04,20 PROMPT " Borrar " MESSAGE ; "Eliminar un artculo existente " @ 05,20 PROMPT " Editar " MESSAGE ; "Modificar un artculo existente" @ 06,20 PROMPT " Ver " MESSAGE ; "Visualizar fichero de artculos" @ 07,20 PROMPT " Listar " MESSAGE ; "Imprimir fichero de artculos "

MENU TO nOpPopup2 RESTORE SCREEN DO CASE CASE nOpPopup2 = 1 Alert( "Aadir" ) CASE nOpPopup2 = 2 Alert( "Eliminar" ) CASE nOpPopup2 = 3 Alert( "Modificar" ) CASE nOpPopup2 = 4 Alert( "Visualizar" ) CASE nOpPopup2 = 5 Alert( "Imprimir" ) ENDCASE CASE nOpLinea = 3 SAVE SCREEN Window( 02, 39, 08, 50 )
@ 03,40 PROMPT " Aadir " MESSAGE ; " Dar de alta un nuevo cliente " @ 04,40 PROMPT " Borrar " MESSAGE ; " Eliminar datos cliente " @ 05,40 PROMPT " Editar " MESSAGE ; " Modificar datos cliente " @ 06,40 PROMPT " Ver " MESSAGE ; " Visualizar fichero de clientes" @ 07,40 PROMPT " Listar " MESSAGE ; " Imprimir fichero de clientes "

MENU TO nOpPopup3 RESTORE SCREEN DO CASE CASE nOpPopup3 = 1 Alert( "Aadir" ) CASE nOpPopup3 = 2 Alert( "Eliminar" ) CASE nOpPopup3 = 3 Alert( "Modificar" ) CASE nOpPopup3 = 4 Alert( "Visualizar" ) CASE nOpPopup3 = 5 Alert( "Imprimir" ) ENDCASE CASE nOpLinea = 4 SAVE SCREEN Window( 02, 59, 08, 70 )
@ 03,60 PROMPT " Aadir " MESSAGE ; "Dar de alta una nueva factura" @ 04,60 PROMPT " Borrar " MESSAGE ; " Eliminar una factura " @ 05,60 PROMPT " Editar " MESSAGE ; " Modificar factura " @ 06,60 PROMPT " Ver " MESSAGE ; " Visualizar facturas " @ 07,60 PROMPT " Listar " MESSAGE ; " Imprimir facturas "

MENU TO nOpPopup4 RESTORE SCREEN DO CASE CASE nOpPopup4 = 1 Alert( "Aadir" ) CASE nOpPopup4 = 2 Alert( "Eliminar" ) CASE nOpPopup4 = 3 Alert( "Modificar" ) CASE nOpPopup4 = 4 Alert( "Visualizar" ) CASE nOpPopup4 = 5 Alert( "Imprimir" ) ENDCASE ENDCASE ENDDO // Desactivamos las funciones asociadas a las teclas // de flecha izda. y dcha. SET KEY K_RIGHT TO SET KEY K_LEFT TO CLS RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Function .. : KeyDcha() // Descripcin: Para cuando pulsemos la flecha a la derecha. // -----------------------------------------------------------

FUNCTION KeyDcha() KEYBOARD Chr( K_ESC ) + Chr( K_DOWN ) + Chr( K_RETURN) RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// ----------------------------------------------------------// Function .. : KeyIzda() // Descripcin: Para cuando pulsemos la flecha a la izquierda. // ----------------------------------------------------------FUNCTION KeyIzda() KEYBOARD Chr( K_ESC ) + Chr( K_UP ) + Chr( K_RETURN ) RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Funcin ... : Window // Descripcin : Muestra una ventana con sombreado. // Parmetros : nFila1, nCol1, nFila2, nCol2 -> Coordenadas. // cColor -> Color de la ventana. // cTitulo -> Titulo de la ventana, centrado. // Notas ..... : Para simple sombreado, 1 fila + 1 columna // ScrShadow( nFila1 + 1, nCol1 + 2, nFila2 + 1,; // nCol2 + 1 ) // ----------------------------------------------------------FUNCTION Window( nFila1, nCol1, nFila2, nCol2, cColor, ; cTitulo ) LOCAL cOldColor := SetColor() LOCAL nColCentrar := 0 // Para doble sombreado, es decir, sombra = 1 // fila + 2 columnas ScrShadow( nFila1 + 1, nCol1 + 2, nFila2 + 1, nCol2 + 2 )

IF cColor != Nil SetColor( cColor ) ENDIF @ nFila1, nCol1 CLEAR TO nFila2, nCol2 @ nFila1, nCol1 TO nFila2, nCol2 IF cTitulo != Nil IIF( !iscolor(), SetColor( "W+/N" ), SetColor( "W+/R" ) ) nColCentrar := int( ( nCol2 - nCol1 ) / 2 ; - len( cTitulo ) / 2 ) @ nFila1, nCol1 + nColCentrar say " " + cTitulo + " " ENDIF SetColor( cOldColor ) RETURN Nil // ----------------------------------------------------------// ----------------------------------------------------------// Funcin ... : ScrShadow // Descripcin: Funcin de sombreado, utilizada por la funcin // Window. // Notas ..... : Autor: Antonio Linares // ----------------------------------------------------------FUNCTION ScrShadow( nTop, nLeft, nBottom, nRight ) return RestScreen( nTop, nLeft, nBottom, nRight,; Transform( SaveScreen( nTop, nLeft, nBottom, nRight ),; Replicate( "X" + Chr( 7 ), ( nBottom - nTop + 1 ) * ; ( nRight - nLeft + 1 ) ) ) ) // -----------------------------------------------------------

BASES DE DATOS (I) Introduccin -----------El manejo de datos por parte de CA-Clipper, es su ncleo principal, pero antes de empezar con la prctica es mejor conocer una serie de trminos sobre Bases de Datos que veremos a lo largo de estas lecciones: Base de Datos Una Base de Datos es un conjunto de informacin almacenada normalmente en disco, que se identifica mediante un nombre, cuya extensin por defecto es (.DBF) y est formado por una cabecera de longitud variable que define la estructura de los campos, y cero o varios registros que contienen los datos reales de los campos que no sean de tipo memo e informacin de punteros a los campos memo. Cada registro tiene un byte adicional para el indicador de estado de borrado. Tambin suelen denominarse tablas, ya que cada campo es una columna y cada registro una fila.
CAMPO_1 CAMPO_2 CAMPO_3 CAMPO_N

REGISTRO 1

DATOS DATOS DATOS DATOS __________________________________________ DATOS DATOS DATOS

REGISTRO N DATOS

SGBD / DBMS ----------Sistema para la Gestin de Bases de Datos (SGBD) o Data Base Management System (DBMS), es el sistema (programa) utilizado para manejar y actualizar la informacin contenida en las Bases de Datos. Area de Trabajo --------------Una Area de Trabajo es una zona de memoria donde podemos operar con una Base de Datos, un fichero memo opcional y hasta 15 ficheros ndice. Disponemos de hasta 255 reas de trabajo, aunque 5 son de uso interno de CA-Clipper. Podemos desplazarnos por dichas reas para acceder a la informacin, relacionar bases de Datos, etc. Fichero ------Conjunto de informacin almacenada normalmente en disco, que puede contener datos, textos (.TXT/.DOC) o programas (.PRG). Fichero Memo Tienen extensin (.DBT), estan asociados a una Base de Datos y almacenan una serie de textos. Su manejo va ligado a la Base de Datos, por lo que no requieren ningn tratamiento especial para las operaciones comunes sobre Bases de Datos.

Fichero Indice -------------Las Bases de Datos se ordenan fsicamente segn el orden de entrada de los datos, y el fichero ndice (.NTX) ordena lgicamente la Base de Datos, segn una clave de indexacin. Campo ----Esta formado por uno o un conjunto de caracteres que representan una porcin de informacin que forma parte o esta relacionada con otra. Registro -------Esta formado por un conjunto de campos relacionados entre s. Para comprender ms las definiciones anteriores, suponga que tiene ante s la FICHA impresa de los datos de un cliente,pues dichos datos (Nombre, Direccin, etc.) son los CAMPOS, y la FICHA es el REGISTRO, y el conjunto de fichas que almacenar en un FICHERO ya sea metlico o de cartn ser la BASE DE DATOS de clientes, y si utiliza un ndice (A-Z) para tenerlos ordenados sera el FICHERO INDICE, y si utilizase algn sistema para bsquedas y amntenimiento sera el SGBD.

Operaciones bsicas sobre Bases de Datos y Ficheros Indice CREAR BASE DE DATOS ------------------Cada Base de Datos tiene una estructura donde se especifica lo siguiente: Nombre de Campo De como mximo 10 caracteres, ha de empezar con una letra y puede tener letras, nmeros y el carcter especial "_" utilizado con separador. Tipo de Campo Pueden ser de tipo: C - Carcter Pueden contener todo tipo de caracteres (nmeros, letras, espacios, signos especiales, etc.) N - Numrico Pueden contener slo nmeros, el punto decimal y el signo menos (-). Para el clculo del ancho con decimales, hay que sumar los enteros + decimales + punto, es decir, por ejemplo para indicar 99.99, el ancho es de 5 y el n de decimales 2. D - Fecha Pueden contener slo valores de fecha. Su formato depende de SET DATE.

L - Lgico Puede tomar dos valores, verdadero o falso, que se especifica con: T (True) o Y, y F (False) o N. M - Memo (Texto) Almacena textos de longitud variable, que se guardan en un fichero de extensin (.DBT). Ancho de Campo Puede ser variable o fija, dependiendo del tipo de dato.
Tipo --------Carcter Numrico Fecha Lgico Memo Variable/Fijo ------------Variable Variable Fijo Fijo Fijo Ancho ----------De 1 hasta 64000 bytes De 1 hasta 19 dgitos 8 bytes 1 byte 10 bytes

Decimal de Campo Slo lo podemos utilizar para indicar los decimales de los campos de tipo numrico.
Comandos:
COPY STRUCTURE [FIELDS <ListaCampos>] TO <cNuevaDBF>

Copia la estructura de la Base activa en otra vaca. COPY STRUCTURE EXTENDED TO <cNuevaDBF> Crea un fichero de estructura extendida de la Base activa. Es decir, cada registro del nuevo fichero describe los campos de la Base de origen, para que desde un BROWSE() o DBEDIT() podamos modificarla.

COPY TO <cNuevaDBF> [<mbito>] ; [FIELDS <ListaCampos>] ; [FOR <lCondicin>] [WHILE <lCondicin>] ; [SDF] | [DELIMITED [WITH <delimitador>]] Copia la Base de Datos activa en otra segn una serie de condiciones. CREATE <cNuevaDBF> APPEND BLANK REPLACE Field_name WITH "CLIENTE", ; Field_type WITH "C", ; Field_len WITH 30 ... Crea una Base de Datos, mediante una estructura extendida. CREATE <cNuevaDBF> FROM <cFicheroEstructura> Crea una Base de Datos, desde un fichero de estructura extendida. dbCreate( <cNuevaDBF>, <aEstructura>, ; [<cDriverDBF>] ) Crea una Base de Datos a partir de un array de estructuras, si se desea se puede especificar el controlador de Bases de Datos (DBFNTX,DBFCDX,etc.) JOIN WITH <cDBFOrigen> TO <cDBFDestino> ; FOR <lCondicin> [FIELDS <ListaCampos>] Une dos Bases de Datos creando una de nueva, a trves de un campo clave.

CREAR FICHERO INDICE


-------------------Comandos: dbCreateIndex( <cNTX>, <cClave>, <bClave>,[<lUnico>]) (-- clave indexacin--) INDEX ON <Campo1> { + <Campo2> } TO <FicheroNTX> ; [UNIQUE] [<mbito>] [FOR <lCondicin>] ; [WHILE <lCondicin>] ; [[EVAL <lCondicin>] [EVERY <nRegistros>]] ; [ASCENDING | DESCENDING]

Indexa una base de Datos, previamiente en uso, por la expresin clave indicada. En caso de utilizar ms de un campo, estos si no son de tipo carcter se han de convertir ya que los concatenamos (+). La clave de indexacin no puede exceder de los 250 caracteres. Con UNIQUE, si hay varios registros con el mismo valor slo tomamos el primero de ellos. Podemos crear indices condicionales, o mientrs procesamos ejecutar un CodeBlock, que indique el porcentaje actual de registros indexados, o que esto se haga cada x registros [EVERY], e indicar el orden de indexacin ascendente (A-Z) o descendente (Z-A).

ABRIR BASE DE DATOS ------------------Comandos: dbUseArea( [<lNuevaArea>], [<DriverDBF>], ; <cNuevaDBF>, [<cAlias>], ; [<lCompartido>], [<lSoloLectura>] ) USE [<cDBF> [INDEX <cNTX1> {,<cNTX15>}] ; [EXCLUSIVE | SHARED] [ALIAS <cAlias>] ; [NEW] [READONLY] [VIA DriverDBF]] Abre una Base de Datos, su fichero memo asociado (en caso de tenerlo), activa sus ndices (hasta 15), podemos indicarle un alias (referencia), indicarle si trabajamos en modo compartido o exclusivo (en caso de estar en Red Local) o que lo abra todo en la siguiente rea de trabajo (NEW) y que lo haga en modo lectura (READONLY). ABRIR FICHERO INDICE -------------------Cpmandos: dbSetIndex( <cFicheroNTX> ) Abre un slo fichero ndice. SET INDEX TO [<cListaIndices>] Abre uno o varios ficheros ndice en el rea de trabajo actual. AADIR INFORMACION -----------------Comandos: dbAppend() APPEND BLANK Aade un nuevo registro vaco a la Base de Datos actual.
APPEND FROM <cFicheroFuente> [FIELDS <cListaCampos>];

[<mbito>] [WHILE <lCondicin>] [FOR <lCondicin>] ; [SDF | DELIMITED [WITH BLANK | <cDelimitador>]] Importa registros de un fichero ASCII o .DBF, y los aade a la Base de Datos en uso.

BORRAR INFORMACION -----------------Comandos: dbDelete() Marca el registro actual para borrar. DELETE [<mbito>] [WHILE <lCondicin>] ; [FOR <lCondicin>] Marca registros para su borrado. Si el mandato SET DELETED esta a ON se pueden ver dichos registros, pero si esta a OFF no. Deleted() Indica si el registro actual esta marcado para borrar o no. dbReCall() Recupera un registro marcado para borrar. Se utiliza en combinacin con Deleted(). RECALL [<mbito>] [WHILE <lCondicin>] ; [FOR <lCondicin>] Recupera los registros marcados para borrar. PACK Borra fsicamente los registros de la Base de Datos marcados para borrar. ZAP Borra fsicamente todos los registros de la Base de Datos.

MODIFICAR INFORMACION
--------------------Comandos: @ <nFila>, <nColumna> [SAY <xExpresin> ; -----------------------------------------------------------[PICTURE <cFormatoSAY>] [COLOR <cColor>]] ; GET <xVariable> [PICTURE <cFormatoGET>] ; [COLOR <cColor>] [WHEN lPreCondicin>] ; [RANGE <nMnimo>, <nMximo>] | ; [VALID <lPostCondicin>] Sistema de entrada/modificacin de datos. READ [SAVE] Captura los datos introducidos en los GETs. REPLACE <xCampo1> WITH <xExpresin1> ;
[, <xCampoN> WITH <xExpresinN>] [<mbito>] ;

[WHILE <lCondicin>] [FOR <lCondicin>] Asigna valores a campos de Bases de Datos. Updated() Indica en un READ si ha habido cambios en los GETs.

MOSTRAR INFORMACION
------------------Comandos: DISPLAY <cListaCampos> [TO PRINTER] ; [TO FILE <cFicheroTXT>] [<mbito>] ;
[WHILE <lCondicin>] [FOR <lCondicin>] [OFF]

Muestra registros por el dispositivo de salida indicado. LABEL FORM <cFicheroLBL> [TO PRINTER] ; [TO FILE <cFicheroTXT>] [NOCONSOLE] ; [<mbito>] [WHILE <lCondicin>] ; [FOR <lCondicin>] [SAMPLE] Muestra etiquetas por el dispositivo de salida indicado.

LIST <cListaCampos> [TO PRINTER] ; [TO FILE <cFicheroTXT>] [<mbito>] ; [WHILE <lCondicin>] [FOR <lCondicin>] [OFF] Lista registros por el dispositivo de salida indicado. REPORT FORM <cFicheroFRM> [TO PRINTER] ; [TO FILE <cFicheroTXT>] [NOCONSOLE] ; [<mbito>] [WHILE <lCondicin>] ; [FOR <lCondicin>] [PLAIN | ;
READING <cCabecera>] [NOEJECT] [SUMMARY]

Muestra un informe por el dispositivo de salida indicado. BROWSE( [<nTop>], [<nLeft>], [<nBottom>], ; [<nRight>] ) Visualiza registros en forma de tabla. DBEDIT( [<nTop>], [<nLeft>], [<nBottom>], ; [<nRight>], [<acColumnas>], [<cFuncinUsuario>], ; [<acFormatosSAYColumnas>|<FormatoSAYColumna>], ; [<acCabecerasColumna> | <cCabeceraColumna>], ; [<acSeparadoresColumna> | <cSeparadorColumna>] ; [<acSeparadoresPie> | <cSeparadorPie>], ; [<acPiesColumna> | <cPieColumna>] ) Visualiza registros en forma de tabla. BUSCAR INFORMACION -----------------Comandos: LOCATE [<mbito>] FOR <lCondicin> ; [WHILE <lCondicin>] Busca secuencialmente un registro que cumpla una condicin. CONTINUE Contina la bsqueda emprendida con LOCATE. SEEK <xExpresinBsqueda> Busca en un fichero ndice un valor clave especificado.

dbSeek( <xExpresinClave, [<lBsquedaAprximada>] ) Busca en un fichero ndice un valor clave especificado o el ms aprximado. FIND <cBsqueda> Busca en una clave ndice, slo sirve para cadenas. Found() Indica si la bsqueda realizada con LOCATE, FIND, o SEEK / dbSeek(), ha tenido xito. . MOVIMIENTO PUNTERO REGISTROS ---------------------------Comandos: GO[TO] <nNmeroRegistro> | BOTTOM | TOP Desplaza el puntero de registro. dbGoBottom() Desplaza el puntero al ltimo registro lgico. dbGoTop() Desplaza el puntero al primer registro lgico. dbGoTo( <nNmeroRegistro> ) Desplaza el puntero al nmero de registro indicado. dbSkip() Desplaza el puntero al siguiente registro. SKIP [<nNmeroRegistro>] [ALIAS <cAlias>] | ; <nAreaTrabajo>] Desplaza el puntero de registro a una nueva posicin.

CERRAR BASE DE DATOS Comandos: CLOSE [<cAlias> | ALL | ALTERNATE | DATABASES | ; FORMAT | INDEXES] Cierra el grupo de ficheros indicado. dbCloseArea() Cierra una rea de trabajo. dbCloseAll() Cierra todas las reas de trabajo ocupadas. USE Cierra la Base de Datos activa.

CERRAR FICHERO INDICE


--------------------Comandos: dbClearIndex() Cierra todos los ficheros ndice del rea de trabajo actual. Notas:

Quedan operaciones ms avanzadas como FILTROS, RELACIONES, ATRIBUTOS, AREAS DE TRABAJO, etc. que veremos en la prxima leccin. As mismo, cuando estudiemos la impresin veremos la presentacin de datos en forma impresa y con el objeto TBrowse veremos otra forma de mostrar los datos por pantalla.

Programas de ejemplo:
// -----------------------------------------------------------// Programa ..: DBDEMO1.PRG // Descripcin: Ejemplo de mantenimiento de Bases de Datos. // Compilacin: clipper dbdemo1 /n /W // rtlink file dbdemo1 // -----------------------------------------------------------#include "InKey.ch" // -----------------------------------------------------------FUNCTION Main() LOCAL nOpLinea := 0 // Opcin men de lnea LOCAL cBusca := Space( 40 ) // Para las bsquedas LOCAL GetList := {} // Para los GETs SET SCOREBOARD OFF SET WRAP ON SET MESSAGE TO 24 CENTER SET DATE TO ITALIAN // Eliminamos lnea mensajes // Circularidad mens // Mensajes en lnea 24 // centrados // Formato Fecha: dd-mm-aa

SetColor( "W+/W,W+/N,,,N/W+" ) // Colores men CLS @ 00,00 SAY PadC( "Ejemplo: Mantenimiento Bases de Datos", ; 80 ) COLOR "W+/B" // Si no existe la Base de Datos la creamos ---------------IF !File( "OPERARIO.DBF" ) CrearOperarios() ENDIF // --------------------------------------------------------USE OPERARIO INDEX OPERARI1, OPERARI2

DO WHILE .T. ScrOperarios( 1 ) // Visualizamos Registro

// Men de Lnea ---------------------------------------@ 21,03 PROMPT " Aadir " MESSAGE ; " Aadir un nuevo registro" @ 21,20 PROMPT " Borrar " MESSAGE ; " Eliminar el registro actual" @ 21,37 PROMPT " Editar " MESSAGE ; " Modificar el registro actual" @ 21,54 PROMPT " Ver " MESSAGE ; "Visualizar Base de Datos" @ 21,71 PROMPT " Buscar " MESSAGE ; "Buscar un registro" @ 23,03 PROMPT " Primero "MESSAGE ; "Ir al primer registro" @ 23,20 PROMPT " < < "MESSAGE ; "Retroceder un registro @ 23,37 PROMPT " > > " MESSAGE ; "Avanzar un registro" @ 23,54 PROMPT " Ultimo" MESSAGE ; "Ir al ltimo registro" @ 23,71 PROMPT " Salir " MESSAGE ; "Salir del Programa" MENU TO nOpLinea DO CASE CASE nOpLinea = 1 AddOperarios( .T. ) CASE nOpLinea = 2 DelOperarios() CASE nOpLinea = 3 AddOperarios( .F. ) // Aadir // Bajas // Modificar

CASE nOpLinea = 3 AddOperarios( .F. )

// Modificar

CASE nOpLinea = 4 // Ver // Indice principal = OPERARI2 dbSetOrder( 2 ) dbEdit( 03, 06, 19, 74, ; { "CODIGO", "NOMBRE", "DNI", "CATEGORIA", ;
"PUESTO", "FECHA_ANT", "MATRICULA", "SS_SS" }; ,,, ; { "Cdigo", "Nombre Operario", "Categoria", ; "Puesto de Trabajo", "Fecha;Antiguedad", ; "N Afiliacin;Seg. Social" } ) // Indice principal = OPERARI1 dbSetOrder( 1 ) CASE nOpLinea = 5 // Buscar // Indice principal = OPERARI2 dbSetOrder( 2 ) SAVE SCREEN @ 10,15 CLEAR TO 14,65 @ 10,15 TO 14,65 @ 11,35 SAY "Nombre" @ 12,20 GET cBusca READ dbSeek( cBusca ) IF Found() dbGoTo( Recno() ) ELSE Alert( " ATENCION !;;" + ; "NO SE HA ENCONTRADO DICHO OPERARIO" ) ENDIF RESTORE SCREEN // Indice principal = OPERARI1 dbSetOrder( 1 ) CASE nOpLinea = 6 dbGoTop() // Primero

CASE nOpLinea = 7 // Retroceder IF Bof() // Si no hay ms ... Tone( 262, 3 ) Alert( " ATENCION !;;" + ; "ESTE ES EL PRIMER REGISTRO" ) ELSE dbSkip( -1 ) ENDIF CASE nOpLinea = 8 // Avanzar IF Eof() // Si no hay ms ... Tone( 262, 4 ) Alert( " ATENCION !;;" + "ESTE ES EL ULTIMO REGISTRO" ) ELSE dbSkip() ENDIF CASE nOpLinea = 9 dbGoBottom() CASE nOpLinea = 10 EXIT ENDCASE ENDDO dbCloseArea() CLS RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Funcin ...: CrearOperarios() // Descripcin: Creamos Base de Datos y fichero ndice. // ----------------------------------------------------------// Ultimo // Salir

FUNCTION CrearOperarios() // Creamos Base de Datos de operarios --------------------dbCreate( "OPERARIO", { { "CODIGO" , "N" , 06 , 0 }, ; { "NOMBRE" , "C" , 40 , 0 }, ; { "DNI" , "C" , 10 , 0 }, ; { "CATEGORIA", "C" , 30 , 0 }, ; { "PUESTO" , "C" , 30 , 0 }, ; { "FECHA_ANT" "D" , 08 , 0 }, ; { "MATRICULA", "N" , 02 , 0 }, ; { "SS_SS" , "C" , 15 , 0 }, ; { "MENSUAL" , "C" , 01 , 0 }, ; { "SUELDO" , "N" , 09 , 2 }, ; { "ANTIGUO" , "N" , 09 , 2 }, ; { "PLUS" , "N" , 09 , 2 }, ; { "INCENTIVO", "N" , 09 , 2 }, ; { "ACTIVIDAD" , "N" , 09 , 2 }, ; { "ASISTENCIA","N" , 09 , 2 }, ; { "ATRASOS" , "N" , 09 , 2 }, ; { "PRORRATAS","N" , 09 , 2 }, ; { "ACUENTA" , "N" , 09 , 2 }, ; { "PRESTAMOS", "N" , 09 , 2 }, ; { "BAJA_INI" , "D" , 08 , 0 }, ; { "BAJA_FIN" , "D" , 08 , 0 } } ) USE OPERARIO // Creamos ficheros ndices ------------------------------dbCreateIndex( "OPERARI1", "CODIGO", { || "CODIGO" } ) dbCreateIndex( "OPERARI2", "NOMBRE", { || "NOMBRE" } ) dbCloseArea() RETURN NIL --------------------------------------------------------------// ----------------------------------------------------------// ----------------------------------------------------------// Funcin ...: AddOperarios() // Descripcin: Aadir/Modificar un registro a la Base de Datos // -----------------------------------------------------------

FUNCTION AddOperarios( lAppend ) LOCAL nCodigo := 0 LOCAL GetList := {} // Array para los GETs IF lAppend @ 04,28 GET nCodigo PICTURE "99" VALID IsValido(nCodigo) READ IF LastKey() == K_ESC RETURN NIL ENDIF dbAppend() REPLACE Field->CODIGO WITH nCodigo ENDIF
@ 06,28 GET Field->NOMBRE @ 08,28 GET Field->DNI @ 10,28 GET Field->CATEGORIA @ 12,28 GET Field->PUESTO @ 14,28 GET Field->FECHA_ANT PICTURE "@D" @ 16,28 GET Field->MATRICULA PICTURE "99" @ 18,28 GET Field->SS_SS READ ScrOperarios( 2 ) @ 04,28 SAY Field->CODIGO PICTURE "99" @ 05,28 SAY Field->NOMBRE @ 06,28 GET Field->MENSUAL PICTURE "!" ; Valid( Field->MENSUAL $ "SN" ) @ 07,28 GET Field->SUELDO PICTURE "999999.99" @ 08,28 GET Field->ANTIGUO PICTURE "999999.99" @ 09,28 GET Field->PLUS PICTURE "999999.99" @ 10,28 GET Field->INCENTIVO PICTURE "999999.99" @ 11,28 GET Field->ACTIVIDAD PICTURE "999999.99" @ 12,28 GET Field->ASISTENCIA PICTURE "999999.99" @ 13,28 GET Field->ATRASOS PICTURE "999999.99" @ 14,28 GET Field->PRORRATAS PICTURE "999999.99" @ 15,28 GET Field->ACUENTA PICTURE "999999.99" @ 16,28 GET Field->PRESTAMOS PICTURE "999999.99" @ 17,28 GET Field->BAJA_INI PICTURE "@D" @ 17,38 GET Field->BAJA_FIN PICTURE "@D"

READ

RETURN NIL // -----------------------------------------------------------// -----------------------------------------------------------// Funcin ... : BajasOperarios() // Descripcin: Marcamos un registro de la Base de Datos para // borrar. // -----------------------------------------------------------FUNCTION DelOperarios() ScrOperarios( 1 ) // Visualizamos registro actual @ 20,30 SAY "<< Pulse una Tecla >>" InKey( 60 ) ScrOperarios( 2 ) @ 20,30 SAY "<< Pulse una Tecla >>" InKey( 60 ) IF Deleted() IF Alert( " ATENCION !;;" + ;
"ESTE REGISTRO YA ESTA MARCADO PARA BORRAR;; " + ;

" QUIERE RECUPERARLO ?", { " S ", " No " } ) = 1 dbReCall() ENDIF ENDIF RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Funcin ... : ScrOperarios() // Descripcin: Pantalla de visualizacin de Registros de la // Base de Datos. // -----------------------------------------------------------

FUNCTION ScrOperarios( nPagina ) IF nPagina = 1 @ 02,05 CLEAR TO 20,75 @ 02,05 TO 20,75 @ 04,07 SAY "Cdigo ..................: " @ 06,07 SAY "Nombre ..................:" @ 08,07 SAY "D.N.I. ......................:" @ 10,07 SAY "Categoria ................:" @ 12,07 SAY "Puesto Trabajo .......:" @ 14,07 SAY "Fecha Antigedad ..:" @ 16,07 SAY "Matrcula ................:" @ 18,07 SAY "Afiliacin a SS.SS...:" // Comprobamos que exista un registro a mostrar IF LastRec() != 0 @ 04,28 SAY Field->CODIGO PICTURE "99" @ 06,28 SAY Field->NOMBRE @ 08,28 SAY Field->DNI @ 10,28 SAY Field->CATEGORIA @ 12,28 SAY Field->PUESTO @ 14,28 SAY Field->FECHA_ANT PICTURE "@D" @ 16,28 SAY Field->MATRICULA PICTURE "99" @ 18,28 SAY Field->SS_SS ENDIF ELSEIF nPagina = 2 @ 02,05 CLEAR TO 20,75 @ 02,05 TO 20,75 @ 04,07 SAY "Cdigo ................:" @ 05,07 SAY "Nombre ...............:" @ 06,07 SAY "Mensual (S/N) .....:" @ 07,07 SAY "Sueldo Base ........: @ 08,07 SAY "Antigedad ..........: @ 09,07 SAY "Plus Convenio ......:

(P.mes/da) " (Pts. da) " (P.mes/da) "

@ 08,07 SAY "Antigedad .............: @ 09,07 SAY "Plus Convenio ........: @ 10,07 SAY "Incentivos ...............: @ 11,07 SAY "Actividad .................: @ 12,07 SAY "Asistncia ...............: @ 13,07 SAY "Atrasos ...................: @ 14,07 SAY "Prorratas Pagas Ex.: @ 15,07 SAY "A cuenta .................: @ 16,07 SAY "Prestamos ..............: @ 17,07 SAY "Periodo Baja ...........:"

(Pts. da) " (P.mes/da)" (Pts. mes) " (Pts. mes) " (Pts. mes) " (Pts. mes) " (Pts. da) " (Pts. mes) " (Pts. mes) "

// Comprobamos que exista un registro a mostrar IF LastRec() != 0 @ 04,28 SAY Field->CODIGO PICTURE "99" @ 05,28 SAY Field->NOMBRE @ 06,28 SAY Field->MENSUAL PICTURE "!" @ 07,28 SAY Field->SUELDO PICTURE "999999.99" @ 08,28 SAY Field->ANTIGUO PICTURE "999999.99" @ 09,28 SAY Field->PLUS PICTURE "999999.99" @ 10,28 SAY Field->INCENTIVO PICTURE "999999.99" @ 11,28 SAY Field->ACTIVIDAD PICTURE "999999.99" @ 12,28 SAY Field->ASISTENCIA PICTURE "999999.99" @ 14,28 SAY Field->PRORRATAS PICTURE "999999.99" @ 15,28 SAY Field->ACUENTA PICTURE "999999.99" @ 16,28 SAY Field->PRESTAMOS PICTURE "999999.99" @ 17,28 SAY Field->BAJA_INI PICTURE "@D" @ 17,38 SAY Field->BAJA_FIN PICTURE "@D" ENDIF ENDIF RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Funcin ...: IsValido() // Descripcin: Comprueba que no exista el cdigo de operario. // -----------------------------------------------------------

FUNCTION IsValido( nCodigo ) LOCAL lDevuelve := .T. dbSeek( nCodigo ) IF Found()


Alert(" ATENCION !;;ESTE CODIGO DE OPERARIO YA EXISTE")

lDevuelve := .F. ENDIF RETURN( lDevuelve ) // ----------------------------------------------------------*************************************************************** // ----------------------------------------------------------// Programa .. : DBDEMO2.PRG // Descripcin : Ejemplo de mantenimiento de Bases de Datos. // Compilacin: clipper dbdemo2 /n /W // rtlink file dbdemo2 // ----------------------------------------------------------#include "InKey.ch" // ----------------------------------------------------------FUNCTION Main() LOCAL nOpLinea := 0 LOCAL nBusca := 0 LOCAL GetList := {} // Opcin men de lnea // Para las bsquedas // Para los GETs

SET SCOREBOARD OFF // Eliminamos lnea mensajes SET WRAP ON // Circularidad mens SET MESSAGE TO 24 CENTER // Mensajes en lnea 24 // centrados SET DATE TO ITALIAN // Formato Fecha: dd-mm-aa SetColor( "W+/W,W+/N,,,N/W+" ) // Colores men CLS @ 00,00 SAY PadC( "Ejemplo: Mantenimiento Bases de Datos", ; 80 ) COLOR "W+/B"

// Si no existe la Base de Datos la creamos --------------IF !File( "DATOSMES.DBF" ) CrearDatosMes() ENDIF // -------------------------------------------------------USE DATOSMES INDEX DATOSMES DO WHILE .T. ScrDatosMes() // Visualizamos Registro

// Men de Lnea ---------------------------------------@ 21,03 PROMPT " Aadir " MESSAGE ; "Aadir un nuevo registro" @ 21,20 PROMPT " Borrar " MESSAGE ; "Eliminar el registro actual" @ 21,37 PROMPT " Editar " MESSAGE ; "Modificar el registro actual" @ 21,54 PROMPT " Ver " MESSAGE ; "Visualizar Base de Datos" @ 21,71 PROMPT " Buscar " MESSAGE ; "Buscar un registro" @ 23,03 PROMPT " Primero " MESSAGE ; "Ir al primer registro" @ 23,20 PROMPT " < < " MESSAGE ; "Retroceder un registro" @ 23,37 PROMPT " > > " MESSAGE ; "Avanzar un registro" @ 23,54 PROMPT " Ultimo " MESSAGE ; "Ir al ltimo registro" @ 23,71 PROMPT " Salir " MESSAGE ; "Salir del Programa"

MENU TO nOpLinea DO CASE CASE nOpLinea = 1 AddDatosMes( .T. ) CASE nOpLinea = 2 DelDatosMes() CASE nOpLinea = 3 AddDatosMes( .F. ) // Aadir // Bajas // Modificar

CASE nOpLinea = 4 // Ver dbEdit( 03, 06, 19, 74, ; { "MES", "ANY", "PERIODOINI", ; "PERIODOFIN", "DIAS_MES", ; "OTROS_DIAS", "FECHA_NOM" },,, ; { "Mes", "Ao", "Periodo Liq.;Inicial", ; "Periodo Liq.;Final", "Das mes", ; "Otros das", "Fecha Nmina" } ) CASE nOpLinea = 5 // Buscar SAVE SCREEN @ 10,15 CLEAR TO 14,65 @ 10,15 TO 14,65
@ 12,30 SAY "Mes del ao en curso: " GET nBusca ;

PICTURE "99" READ dbSeek( StrZero( nBusca, 2 ) + ; StrZero( Year( DaTe() ), 4 ) ) IF Found() dbGoTo( Recno() ) ELSE Alert( " ATENCION !;;" + ;
"NO SE HA ENCONTRADO DICHO MES" )

ENDIF RESTORE SCREEN CASE nOpLinea = 6 dbGoTop() // Primero

CASE nOpLinea = 7 // Retroceder IF Bof() // Si no hay ms ... Tone( 262, 3 ) Alert( " ATENCION !;;" + ;
"ESTE ES EL PRIMER REGISTRO" ) ELSE dbSkip( -1 ) ENDIF CASE nOpLinea = 8 // Avanzar IF Eof() // Si no hay ms ... Tone( 262, 4 ) A lert( " ATENCION !;;" + ;
"ESTE ES EL ULTIMO REGISTRO" )

ELSE dbSkip() ENDIF CASE nOpLinea = 9 dbGoBottom() CASE nOpLinea = 10 EXIT ENDCASE ENDDO dbCloseArea() CLS RETURN NIL // -----------------------------------------------------------// -----------------------------------------------------------// Ultimo // Salir

// Funcin ...: CrearDatosMes() // Descripcin: Creamos Base de Datos y fichero ndice. // -----------------------------------------------------------FUNCTION CrearDatosMes() // Creamos Base de Datos de DatosMes ----------------------dbCreate( "DATOSMES", { { "MES" , "N", 02, 0 }, ; { "ANY" , "N", 04, 0 }, ; { "PERIODOINI" , "D", 08, 0 }, ; { "PERIODOFIN" , "D", 08, 0 }, ; { "DIAS_MES" , "N", 02, 0 }, ; { "OTROS_DIAS", "N", 02, 0 }, ; { "FECHA_NOM" , "D", 08, 0 } } ) USE DATOSMES // Creamos fichero ndice ---------------------------------dbCreateIndex( "DATOSMES", "StrZero( MES, 2 ) + ; StrZero( ANY, 4 )", ; { || "StrZero( MES, 2 ) + StrZero( ANY, 4 )" } ) // INDEX ON MES + ANY TO DATOSMES dbCloseArea() RETURN NIL // -----------------------------------------------------------// -----------------------------------------------------------// Funcin .....: AddDatosMes() // Descripcin: Aadir/Modificar un registro a la Base de Datos // -----------------------------------------------------------FUNCTION AddDatosMes( lAppend ) LOCAL nCodigo := 0 LOCAL GetList := {} LOCAL dFechaIni := Date() LOCAL dFechaFin := Date() LOCAL nDiasMes := 0 // Array para los GETs // Periodo Inicial // Periodo Final // N de das del mes

IF lAppend
@ 04,28 GET nCodigo PICTURE "99" VALID IsValido(nCodigo)

READ IF LastKey() == K_ESC RETURN NIL ENDIF dFechaIni := CtoD( "01-" + StrZero( nCodigo, 2 ) +"-"+ ; Right( Str( Year( Date() ) ), 2 ) ) dbAppend() REPLACE Field->MES WITH nCodigo REPLACE Field->ANY WITH Year( Date() ) REPLACE Field->PERIODOINI WITH dFechaIni nDiasMes := NumDias( dFechaIni ) dFechaFin := CtoD( StrZero( nDiasMes ) + "-" + ; StrZero( nCodigo, 2 ) + "-" + ; Right( Str( Year( Date() ) ), 2 ) ) REPLACE Field->PERIODOFIN WITH dFechaFin
REPLACE Field->DIAS_MES WITH NumDias( dFechaIni )

REPLACE Field->FECHA_NOM WITH dFechaFin + 1 ENDIF @ 06,28 GET Field->ANY PICTURE "9999" @ 08,28 GET Field->PERIODOINI PICTURE "@D" @ 10,28 GET Field->PERIODOFIN PICTURE "@D" @ 12,28 GET Field->DIAS_MES PICTURE "99" @ 14,28 GET Field->OTROS_DIAS PICTURE "99" @ 16,28 GET Field->FECHA_NOM PICTURE "@D" READ RETURN NIL // -----------------------------------------------------------// -----------------------------------------------------------// Funcin ...: BajasDatosMes() // Descripcin: Marcamos un registro de la Base de Datos para // borrar. // ------------------------------------------------------------

FUNCTION DelDatosMes() ScrDatosMes( 1 ) // Visualizamos registro actual @ 20,30 SAY "<< Pulse una Tecla >>" InKey( 60 ) IF Deleted() IF Alert( " ATENCION !;;" + ;
"ESTE REGISTRO YA ESTA MARCADO PARA BORRAR;;" + ;

" QUIERE RECUPERARLO ?",{ " S ", " No " } ) = 1 dbReCall() ENDIF ELSE IF Alert( " ATENCION !;;" + ;
" QUIERE MARCAR ESTE REGISTRO PARA BORRAR ?", ;

{ " S ", " No " } ) = 1 dbDelete() ENDIF ENDIF RETURN NIL // -----------------------------------------------------------// -----------------------------------------------------------// Funcin ...: ScrDatosMes() // Descripcin: Pantalla de visualizacin de Registros de la // Base de Datos. // -----------------------------------------------------------FUNCTION ScrDatosMes() @ 02,05 CLEAR TO 20,75 @ 02,05 TO 20,75 @ 04,07 SAY "Mes ...............:" @ 06,07 SAY "Ao ...............:" @ 08,07 SAY "Periodo Liq.Inicial:" @ 10,07 SAY "Periodo Liq. Final.:" @ 12,07 SAY "Das mes ..........:" @ 14,07 SAY "Otros das ........:" @ 16,07 SAY "Fecha Nmina ......:"

// Comprobamos que exista un registro a mostrar IF LastRec() != 0 @ 04,28 SAY Field->MES PICTURE "99" @ 06,28 SAY Field->ANY PICTURE "9999" @ 08,28 SAY Field->PERIODOINI PICTURE "@D" @ 10,28 SAY Field->PERIODOFIN PICTURE "@D" @ 12,28 SAY Field->DIAS_MES PICTURE "99" @ 14,28 SAY Field->OTROS_DIAS PICTURE "99" @ 16,28 SAY Field->FECHA_NOM PICTURE "@D" ENDIF RETURN NIL // -----------------------------------------------------------// -----------------------------------------------------------// Funcin .....: IsValido() // Descripcin: Comprueba que no exista el cdigo de mes. // -----------------------------------------------------------FUNCTION IsValido( nCodigo ) LOCAL lDevuelve := .T. dbSeek( StrZero( nCodigo, 2 )+StrZero( Year( Date() ), 4 ) ) IF Found() Alert( " ATENCION !;;ESTE MES YA EXISTE" ) lDevuelve := .F. ELSE IF nCodigo < 0 .OR. nCodigo > 12 Alert( " ATENCION !;;ESTO NO ES NINGUN MES" ) lDevuelve := .F. ENDIF ENDIF RETURN( lDevuelve ) // ----------------------------------------------------------// ----------------------------------------------------------// Funcin .. : NumDias

// Funcin .. ...: NumDias // Parmetros : Una variable de tipo fecha. // Devuelve .... : El nmero de das del mes de la variable pasada // Descripcin : Calcula el nmero de das de la fecha que le // hemos pasado como parmetro, incluso los meses // de aos bisiestos. // -----------------------------------------------------------FUNCTION NumDias( dFecha ) LOCAL nMes, nAny, nDias, dBisiesto // Variables locales nMes := month( dFecha ) nAny := year( dFecha ) // Mes de la fecha // Obtenemos el ao

// Como solo usaremos la varible bisiesto, cuando el mes // sea Febrero, podemos poner un condicional dBisiesto := ctod( "29-02-" + str( nAny ) ) // Seleccin segn el nmero del mes // Meses con 31 das : Enero, Marzo, Mayo, Julio, Agosto, // Octubre, y Diciembre // Meses con 30 das : Abril, Junio, Setiembre, y Noviembre. // En el caso de Febrero, al hacer la variable dBisiesto con // el da 29, si nos devuelve un cero al pedirle el da de la // semana (1 a 7), el mes es de 28 das, en caso contrario, // el ao es bisiesto. DO CASE
CASE nMes = 4 .OR. nMes = 6 .OR. nMes = 9 .OR. nMes = 11

nDias := 30 CASE nMes = 2 IF dow( dBisiesto ) == 0 nDias := 28

// S el 29, no es // ningn da de la // semana ...

ELSE nDias := 29 ENDIF OTHERWISE nDias := 31 ENDCASE

// En caso contario // Si no es ninguno // de los casos // anteriores

RETURN nDias // Nmero de das // ------------------------------------------------------------

BASES DE DATOS (II) Operaciones avanzadas sobre Bases de Datos y Ficheros Indice Sobre las Bases de Datos y ficheros ndice, podemos realizar adems de las operaciones bsicas de mantenimiento, las siguientes, y algunas las emplearemos de forma asidua: Areas Comandos: Alias( [<nAreaTrabajo<] )
Devuelve el alias del rea de trabajo indicada. dbSelectArea( <nAreaTrabajo> | <cAlias> ) Cambia el rea de trabajo actual. SELECT <nAreaTrabajo> | <cAlias> Cambia el rea de trabajo actual. Select( [<cAlias>] ) Determina el nmero de rea de trabajo de un alias especificado.

Atributos
--------Comandos: aFields( [<acNombresCampos>], [acTipos>], ; [<anAnchos>], [<anDecimales>] ) Rellena las matrices con la estructura de la Base de Datos actual. dbStruct() Crea una matriz que contiene la estructura de la la Base de Datos actual. dbStruct() Crea una matriz que contiene la estructura de la la Base de Datos actual. Header() Devuelve la longitud (en bytes) de la cabecera de la Base de Datos actual. RecSize() indica el tamao (en bytes) de un registro de la Base de Datos actual. fCount() Devuelve el nmero de campos de la Base de Datos actual. COUNT TO <nVariable> [<mbito>] ; [WHILE <lCondicin>] [FOR <lCondicin>] Cuenta el nmero de registros de una Base de Datos y almacena el resultado en una variable.

Clculos
-------Comandos: AVERAGE <nListaExpresiones> TO <nListaVariables> ; [<mbito>] [WHILE <lCondicin>] ; [FOR <lCondicin>] Calcula la media de las expresiones numricas contenidas en el rea de trabajo actual. SUM <nListaExpresiones> TO <nListaVariables> ; [<mbito>] [WHILE <lCondicin>] ; [FOR <lCondicin>] Suma expresiones numricas a variables. TOTAL ON <cExpresinclave> ; FIELDS <ListaCamposNmericos> ; TO <cFicheroDBF> [<mbito>] ; [WHILE <lCondicin>] [FOR <lCondicin>] Resume y acumula registros por un valor clave determinado en una Base de Datos.

Indices
------Comandos: dbReIndex() REINDEX [Eval <lCondicin>] [Every <nRegistros>] Vuelve a crear los ndices abiertos en el rea de trabajo actual. dbSetOrder( <nNumeroOrden> ) SET ORDER TO [<nNmeroOrden>] Establece otro fichero ndice como principal. Descend( <xExpresin> ) Crea un valor clave para un ndice descendente. IndexExt() Devuelve la extensin del fichero ndice activo, segn el controlador de Base de Datos en uso.

IndexKey( <nOrden> ) Devuelve la clave de indexacin del fichero ndice indicado. IndexOrd() Devuelve la posicin de orden del fichero ndice activo. SET UNIQUE on | OFF | <lTrueFalse> Activa (ON) o desactiva (OFF) la inclusin de claves nicas en un fichero ndice.

Fichero
------Comandos: Bof() Indica si estamos o no al principio de la Base de Datos. Eof() Indica si estamos o no al final de la Base de Datos. COMMIT Escribe en el disco duro las modificaciones de todas las reas de trabajo que se encuentran en la memoria intermedia dbCommit() Escribe en el disco duro las modificaciones de la rea de trabajo actual situada en la memoria intermedia. dbCommitAll() Escribe en el disco duro las actualizaciones pendientes de todas las reas de trabajo. File( <cFichero> ) Comprueba la existncia de un fichero en el directorio o va por defecto.

Used() Indica si se est utilizando una Base de Datos.

Filtros
------Comandos: dbClearFilter() Elimina una condicin de filtro. dbSetFilter( <bCondicin>, [<cCondicin>] ) Establece una condicin de filtro. SET FILTER TO [<lCondicin>] Establece una condicin de filtro.

Registros
--------Comandos: FIELD <Lista NombresdeCampos> [IN <cAlias>] Declara nombres de campo de Bases de Datos. FieldBlock( <cNombreCampo> ) Devuelve un bloque de cdigo de asignacin/lectura para un campo determinado. FieldGet( <nCampo> ) Obtiene el contenido de un campo utilizando su posicin ordinal en la estructura de la Base de Datos. FieldName | Field( <nCampo> ) Devuelve el nombre del campo de la Base de Datos, que ocupe dicha posicin. FieldPos( <cNombreCampo> ) Devuelve la posicin de un campo en una rea de trabajo.

FieldPut( <nCampo>, <xExpresin> ) Graba el contenido de la expresin en el campo que ocupa dicha posicin. FieldWBlock( <cNombreCampo>, <nAreaTrabajo> ) Devuelve un bloque de cdigo de asignacin/lectura para un campo en una rea de trabajo determinada. RecNo() Devuelve el nmero del registro actual de una rea de trabajo.

Relaciones
---------Comandos: dbClearRelation() Borra las relaciones activas. dbRelation( <nRelacin> ) Devuelve la expresin de enlace de un nmero de relacin especificada. dbRSelect( <nRelacin> ) Devuelve el nmero del rea de trabajo destino de la relacin especificada. dbSetRelation( <nAreas> | <cAlias>, ; <bExpresinRelacin>, ; [<cExpresinRelacin>] ) Relaciona dos reas de trabajo.
SET RELATION TO [<cExpresinClave1> | <nRegistro> ;

INTO <cAlias1>] [, [TO] ; <cExpresinClave2> | <nRegistro2> ; INTO <cAlias2> ...] [ADDITIVE]

Relaciona dos reas de trabajo por un valor clave o nmero de registro. Con ADDITIVE aadimos a las relaciones existentes las relaciones hija especificadas.

SET
--Comandos: SET DELETED on | OFF | <lTrueFalse> Ignora registros marcados para borrar (ON) o procesa los registros marcados para borrar (OFF). SET EXCLUSIVE ON | off | <lTrueFalse> Establece el uso compartido o exclusivo de las Bases de Datos. SET FILTER TO [<lCondicin>] Establece una condicin de filtro. SET INDEX TO [<cListaIndices>] Abre uno o varios ficheros ndice en el rea de trabajo actual. SET ORDER TO [<nIndice>] Estable un nuevo fichero ndice activo.
SET RELATION TO [<cExpresinClave1> | <nRegistro1> ;

INTO <cAlias1>] [, [TO] <cExpresinClave2>; | <nRegistro2> INTO <cAlias2> ...] ; [ADDITIVE] Relaciona dos reas de trabajo por un valor clave o nmero de registro. SET SOFTSEEK on | OFF | <lTrueFalse> Activa (ON) o desactiva (OFF) la bsqueda aprximada SET UNIQUE on | OFF | <lTrueFalse> Activa (ON) o desactiva (OFF) la inclusin de claves nicas en un ndice.

Programas de ejemplo:
// ------------------------------------------------------// Programa ....: DBDEMO3.PRG // Descripcin : Ejemplo de relaciones y filtros. // Compilacin : Clipper dbdemo3 /n // RTlink file dbdemo3 // ------------------------------------------------------FUNCTION Main() LOCAL cFiltro := Space( 30 ) LOCAL GetList := {} IF !File( "ALUMNOS.DBF" ) CrearAlumnos() ENDIF IF !File( "NOTAS.DBF" ) CrearNotas() ENDIF // Para el filtrado // Para los GETs // Si no existe la B.D., // la creamos // Si no existe la B.D., // la creamos

SELECT 1 // Area n 1 USE ALUMNOS INDEX ALUMNOS ALIAS ALUM SELECT 2 // Area n 2 USE NOTAS INDEX NOTAS ALIAS NOTA CLS SELECT ALUM Browse() // Seleccionamos rea n 1 // Entrar algunos datos

CLS @ 01,05 SAY "Indique un Nombre a buscar: " GET cFiltro READ

// Visualizamos los registros segn una condicin de filtro


// Tambin con -> SET FILTER TO ALUM->NOMBRE = cFiltro

dbSetFilter( { || ALUM->NOMBRE = cFiltro } ) // Filtro dbGoTop() // Puntero al principio Browse() // Ver // Desactivamos condicin de filtro // Tambin con -> SET FILTER TO dbClearFilter() // Entrar datos cuyo cdigo se corresponda con el // de ALUMNOS.DBF SELECT NOTA Browse() CLS // Seleccionamos dos reas de trabajo por el campo CODIGO // comn a ambos SELECT ALUM
// Tambin con -> SET RELATION TO ALUM->CODIGO INTO NOTA

dbSetRelation("NOTA", { || ALUM->CODIGO }, "ALUM->CODIGO") dbGoTop()


dbEdit( 00, 00, 24, 79, { "ALUM->CODIGO", "ALUM->NOMBRE", ;

"NOTA->FECHA", "NOTA->NOTAS"} ,,,; { "Cdigo", "Nombre", "Fecha", "Puntuacin" } ) dbClearRelation() // Desactivamos relacin

CLS // Mostramos informacin sobre las reas en uso -----------dbSelectArea( 1 ) // Vamos a la rea de trabajo n 1

dbSelectArea( 1 ) // Vamos a la rea de trabajo n 1 QOut( "Area de Trabajo n 2" ) QOut( "" ) QOut( "Alias ............................ : " + Alias( 2 ) ) QOut( "Tamao Cabecera B.D.: " + Str( Header()) + " bytes") QOut( "Tamao Registro B.D.: " + Str( RecSize()) + " bytes") QOut( "N de Campos de B.D.: " + Str( fCount() ) ) QOut( "Extensin ndice ......... : " + IndexExt() ) QOut( "Clave Indexacin ........ : " + IndexKey( 1 ) ) InKey( 60 ) dbCloseAll() CLS // Cerramos todo

RETURN NIL // -----------------------------------------------------------// -----------------------------------------------------------// Funcin .....: CrearAlumnos() // Descripcin: Creamos el fichero de alumnos. // -----------------------------------------------------------FUNCTION CrearAlumnos() // Descripcin: Creamos el fichero de alumnos. // ------------------------------------------------------FUNCTION CrearAlumnos() dbCreate( "ALUMNOS", { { "CODIGO", "N", 06, 0 }, ; { "NOMBRE", "C", 30, 0 }, ; { "DIRECCION", "C", 30, 0 }, ; { "POBLACION", "C", 90, 0 } } ) USE ALUMNOS dbCreateIndex( "ALUMNOS", "CODIGO", { || "CODIGO" } ) dbCloseArea() RETURN NIL // ---------------------------------------------------------// ----------------------------------------------------------

// Funcin ...: CrearNotas() // Descripcin: Creamos el fichero de notas acadmicas. // ---------------------------------------------------------FUNCTION CrearNotas() dbCreate( "NOTAS", { { "CODIGO", "N", 06, 0 }, ; { "FECHA" , "D", 08, 0 }, ; { "NOTAS", "N", 05, 2 } } ) USE NOTAS dbCreateIndex( "NOTAS", "CODIGO", { || "CODIGO" } ) dbCloseArea() RETURN NIL // ------------------------------------------------------------

*****************************************************
// ----------------------------------------------------------// Programa ..: DBDEMO4.PRG // Descripcin: A partir de las Bases de Datos creadas en los // ejemplos: DBDEMO1.PRG y DBDEMO2.PRG, creamos // una de nueva para una Base de Nominas, cuyo // tamao se puede optimizar, pero que como // ejemplo es vlido. // Compilacin: Clipper dbdemo4 /n /W // RTlink dbdemo4 // ----------------------------------------------------------FUNCTION Main() LOCAL nMes := 0 LOCAL nAny := Year( Date() ) LOCAL GetList:= {} // Mes de la nmina // Ao de la nmina // Array para los GEt

// Si no existe el fichero de nminas lo creamos IF !File( "NOMINAS.DBF" ) CrearNominas() ENDIF

CLS // Solicitud de datos


@ 10,20 SAY "Mes Nmina: " GET nMes PICTURE "99" RANGE 1,12

@ 12,20 SAY "Ao Nmina: " GET nAny PICTURE "9999" READ IF LastKey() != 27
// Generamos y visualizamos la Base de Datos de Nminas

GenerarNomina( nMes, nAny ) USE NOMINAS INDEX NOMINAS Browse() dbCloseArea() ENDIF RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Funcin .. : GenerarNomina() // Descripcin: Aade a la Base de Datos de Nminas, los datos // de los operarios y datos del mes, segn el mes // y ao indicados. // -----------------------------------------------------------FUNCTION GenerarNomina( nMes, nAny ) LOCAL GetList := {} // Array para los GETs

SELECT 1 // Area Trabajo n 1 USE OPERARIO INDEX OPERARI1 ALIAS OPR SELECT 2 // Area Trabajo n 2 USE DATOSMES INDEX DATOSMES ALIAS MES SELECT 3 // Area Trabajo n 3 USE NOMINAS INDEX NOMINAS ALIAS NOM

// 1) El puntero de los registros del rea de trabajo n 2, // se sita en el registro que contiene los datos segn // el mes y ao indicados // 2) Procesamos todos los operarios // 3) Aadimos un nuevo registro a la Base de Datos de // Nminas, que es igual a Registro Operario + Registro // Datos Mes SELECT MES // Si existen datos dbSeek( StrZero( nMes, 2 ) + StrZero( nAny, 4 ) ) IF Found() SELECT OPR DO WHILE !Eof() SELECT NOM dbAppend() REPLACE NOM->MES
WITH nMes, ; NOM->ANY WITH nAny, ; NOM->CODIGO WITH OPR->CODIGO, ; NOM->NOMBRE WITH OPR->NOMBRE, ; NOM->DNI WITH OPR->DNI, ; NOM->CATEGORIA WITH OPR->CATEGORIA, ; NOM->PUESTO WITH OPR->PUESTO, ; NOM->FECHA_ANT WITH OPR->FECHA_ANT, ; NOM->MATRICULA WITH OPR->MATRICULA, ; NOM->SS_SS WITH OPR->SS_SS, ; NOM->MENSUAL WITH OPR->MENSUAL, ; NOM->SUELDO WITH OPR->SUELDO, ; NOM->ANTIGUO WITH OPR->ANTIGUO, ; NOM->PLUS WITH OPR->PLUS, ; NOM->INCENTIVO WITH OPR->INCENTIVO, ; NOM->ACTIVIDAD WITH OPR->ACTIVIDAD, ;

NOM->ASISTENCIA NOM->ATRASOS NOM->PRORRATAS NOM->ACUENTA NOM->PRESTAMOS NOM->BAJA_INI NOM->BAJA_FIN NOM->PERIODOINI NOM->PERIODOFIN NOM->DIAS_MES NOM->OTROS_DIAS NOM->FECHA_NOM

WITH OPR->ASISTENCIA, ; WITH OPR->ATRASOS, ; WITH OPR->PRORRATAS, ; WITH OPR->ACUENTA, ; WITH OPR->PRESTAMOS, ; WITH OPR->BAJA_INI, ; WITH OPR->BAJA_FIN, ; WITH MES->PERIODOINI, ; WITH MES->PERIODOFIN, ; WITH MES->DIAS_MES, ; WITH MES->OTROS_DIAS, ; WITH MES->FECHA_NOM

READ SELECT OPR dbSkip() ENDDO ELSE Alert( " ATENCION !;;NO EXISTEN DICHOS MES Y AO" ) ENDIF dbCloseAll() RETURN NIL // -----------------------------------------------------------// -----------------------------------------------------------// -----------------------------------------------------------// Funcin ...: CrearNominas() // Descripcin: Creamos Base de Datos de Nminas y fichero // ndice. // -----------------------------------------------------------FUNCTION CrearNominas()

dbCreate( "NOMINAS", { { "MES" , "N", 02, 0 }, ; { "ANY" , "N", 04, 0 }, ; { "CODIGO" , "N", 06, 0 }, ; { "NOMBRE" , "C", 40, 0 }, ; { "DNI" , "C", 10, 0 }, ; { "CATEGORIA" , "C", 30, 0 }, ; { "PUESTO" , "C", 30, 0 }, ; { "FECHA_ANT" , "D", 08, 0 }, ; { "MATRICULA" , "N", 02, 0 }, ; { "SS_SS" , "C", 15, 0 }, ; { "MENSUAL" , "C", 01, 0 }, ; { "SUELDO" , "N", 09, 2 }, ; { "ANTIGUO" , "N", 09, 2 }, ; { "PLUS" , "N", 09, 2 }, ; { "INCENTIVO" , "N", 09, 2 }, ; { "ACTIVIDAD" , "N", 09, 2 }, ; { "ASISTENCIA" , "N", 09, 2 }, ; { "ATRASOS" , "N", 09, 2 }, ; { "PRORRATAS" , "N", 09, 2 }, ; { "ACUENTA" , "N", 09, 2 }, ; { "PRESTAMOS" , "N", 09, 2 }, ; { "BAJA_INI" , "D", 08, 0 }, ; { "BAJA_FIN" , "D", 08, 0 }, ; { "PERIODOINI" , "D", 08, 0 }, ; { "PERIODOFIN" , "D", 08, 0 }, ; { "DIAS_MES" , "N", 02, 0 }, ; { "OTROS_DIAS" , "N", 02, 0 }, ; { "FECHA_NOM" , "D", 08, 0 } } )

USE NOMINAS // Creamos fichero ndice ---------------------------------dbCreateIndex( "NOMINAS", "StrZero( MES, 2 ) + ; StrZero( ANY, 4 ) + StrZero( CODIGO, 6 )", ; { || "StrZero( MES, 2 ) + StrZero( ANY, 4 )+; StrZero( CODIGO, 6 )" } ) dbCloseArea() RETURN NIL // ------------------------------------------------------------

DRIVERS REEMPLAZABLES (RDDs) Introduccin RDD es la abreviatura de Replaceable Database Driver, es decir, Controladores de Bases de Datos Sustituibles, y permiten acceder a Bases de Datos, ficheros memo e ndice de otros productos xBASE como:
Producto Base Datos Fichero Memo Fichero Indice

---------------- ----------- ------------CA-Clipper .dbf .dbt dBASE III y III+ .dbf .dbt dBASE IV .dbf .dbt FoxPro .dbf .fpt Paradox .db

-------------.ntx .ndx .mdx .cdx .idx .px .x?? .y??

Enlazado -------Dichos controladores se encuentran en ficheros de librera (.lib), en el directorio \CLIPPER5\LIB, y segn el controlador o controladores ha utilizar lo habremos de linkar con los objetos (.obj) de nuestro programa (.prg). RTLINK FILE <ListaObjetos> LIB <Controladores> Controladores:
CA-Clipper dBASE III y III+ dBASE IV FoxPro Paradox -> DBFNTX.LIB -> DBFNDX.LIB -> DBFMDX.LIB -> DBFCDX.LIB -> DBPX.LIB (Controlador por defecto

Utilizacin ----------Podemos aplicar los controladores de distintas formas, dependiendo de si hemos de utilizar un slo controlador o varios. 1) Un slo controlador:
REQUEST <Controlador> RDDSetDefault( <cControlador> ) . . USE <FicheroDBF> INDEX <ListaIndices> NEW

2) Varios controladores:
REQUEST <Controlador> USE <FicheroDBF> INDEX <ListaIndices> NEW VIA <cControlador> . o . dbUseArea( [<lAreaNueva>], [<cControlador>], <FicheroDBF>, ; [<cAlias>], [<lCompartido>], [<lSoloLectura>] )

Programa de Ejemplo
// ----------------------------------------------------------// Programa ..: DBDEMO5.PRG // Descripcin : Ejemplo del uso de controladores. // Compilacin: Clipper dbdemo5 /n /W // RTlink file dbdemo5 LIB DBFCDX // ----------------------------------------------------------FUNCTION Main()

REQUEST DBFCDX RDDSetDefault( "DBFCDX" ) IF !File( "DEMO.DBF" ) CrearDemo() ENDIF USE DEMO INDEX DEMO Browse() dbCloseArea()

// Solicitamos controlador // Controlador por defecto // Si no esta la B.D. la // creamos // Abrimos fichero e ndice // Ver/Entrar datos // Cerrar rea trabajo

RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Funcin ...: CrearDemo // Descripcin: Creamos una Base de Datos de ejemplo, y un // fichero ndice simple (.idx). // ----------------------------------------------------------FUNCTION CrearDemo() dbCreate( "DEMO", { { "CODIGO", "N", 06, 0 }, ; { "NOMBRE", "C", 30, 0 } } ) USE DEMO INDEX ON Field->CODIGO TO DEMO dbCloseArea() RETURN NIL // -----------------------------------------------------------

LA IMPRESION EN CLIPPER Aunque podiamos haber hecho una clasificacin como en la salida por pantalla, es decir, formateada y sin formatear, dado el nmero limitado de comandos y funciones, explicaremos su descripcin y sintaxis en bloque, y en los ejemplos, veremos los dos casos tpicos que nos encontraremos a la hora de realizar programas: - Listado con un determinado nmero de lneas y saltos de hoja. - Impresin de un nmero de lneas sin determinar y sin salto (recibos).
Comando/Funcin Descripcin ----------------------------------------------------------?/?? Imprimen una lista de valores. ? y QOut() proQOut()/QQOut() vocan un salto de lnea, mientrs que ?? y
QQOut() no. Sintaxis: ?/?? [<ListaExpresiones>] QOut/QQOut([<ListaExpresiones>]) @ ... SAY Imprime una expresin, con formato. Sintaxis: @ <nFila>, <nColumna> SAY <xExpresin> ; [PICTURE <FormatoSay>] DevPos() Desplaza el cabezal de impresin a una nueva posicin.

Comando/Funcin ---------------

Descripcin --------------------------------------------Sintaxis: DevPos( <nFila>, <nCol> )

DISPLAY

Imprime una serie de registros. Sintaxis: DISPLAY <ListaExpresiones> [TO PRINTER] ; [<mbito>] [WHILE <lCondicin>] ; [FOR <lCondicion>] [OFF]

EJECT

Provoca un salto de pgina. Sintaxis: EJECT

IsPrinter()

Determina si el puerto LPT1 est preparado para imprimir. Sintaxis: IsPrinter()

LABEL FORM

Imprime etiquetas. Sintaxis: LABEL FORM <cFicheroLBL> [TO PRINTER] ; [<mbito>] [WHILE <lCondicin>] ; [FOR <lCondicin>] [SAMPLE]

LIST

Imprime registros. Sintaxis: LIST <ListaExpresiones> [TO PRINTER] ; [<mbito>] [WHILE <lCondicin>] ; [FOR <lCondicin>] [OFF]

Comando/Funcin --------------OutStd()

Descripcin --------------------------------------------Imprime una lista de valores. Sintaxis: OutStd( <ListaExpresiones> )

PCol()

Devuelve la posicin de columna actual del cabezal de la impresora. Sintaxis: PCol()

PRow()

Devuelve la posicin de fila actual del cabezal de la impresora. Sintaxis: PRow()

REPORT FORM

Imprime un informe. Sintaxis:


REPORT FORM <cFicheroFRM> [TO PRINTER] ;

[<mbito>] [WHILE <lCondicin>] ; [FOR <lCondicion>] ; [PLAIN | HEADING <cCabecera>] ; [NOEJECT] [SUMMARY] SET DEVICE Redirecciona los resultados de @...SAY a la pantalla o a la impresora. Sintaxis: SET DEVICE TO SCREEN | printer SET MARGIN Establece el margen izquierdo de pgina para toda la salida impresa. Sintaxis: SET MARGIN TO [<nMargenIzquierdo>] SET PRINTER Activa/desactiva el redireccionamiento de

Comando/Funcin --------------SET PRINTER

Descripcin ---------------------------------------------

Activa/desactiva el redireccionamiento de salida a la pantalla o a la impresora, o establece el destino de la salida impresa. Podemos indicar los siguientes dispositivos: - Puertos paralelos: LPT1, LPT2 y LPT3. - Puertos serie: COM1 y COM2. - Otros: CON (consola) y PRN (opcin por defecto que suele ser igual a LPT1). Sintaxis: SET PRINTER on | OFF | <lActivar/lDesactivar> SET PRINTER TO [<cDispositivo> | ; <cFicheroPRN> [ADDITIVE]]

SetPrc()

Establece los valores de PRow() y PCol(). Sintaxis: SetPrc( <nFila>, <nCol> )

TYPE

Imprime el contenido de un fichero de texto. Sintaxis: TYPE <cFichero> [TO PRINTER]

Programa de ejemplo:
// -----------------------------------------------------------// Programa ..: DBDEMO6.PRG // Descripcin: Ejemplo impresin. // Compilacin: Clipper dbdemo6 /n /W // RTlink dbdemo6 // --------------------------------------------------------FUNCTION Main()

// Si no existe el fichero de recibos los creamos IF !File( "RECIBOS.DBF" ) CrearRecibos() ENDIF USE RECIBOS INDEX RECIBOS Browse() // Para entrada datos IF Alert( " ATENCION !;;" + ; "IMPRIMIR", { "Remesa", "Recibos" } ) == 1 ImpRemesa() ELSE ImpRecibos() ENDIF dbCloseArea() RETURN NIL // -----------------------------------------------------------// -----------------------------------------------------------// Funcin ...: CrearRecibos() // Descripcin: Creamos Base de Datos para recibos. // -----------------------------------------------------------FUNCTION CrearRecibos() dbCreate( "RECIBOS", { { "NUMERO" , "N", 06, 0 }, ; { "LOCALIDAD" , "C", 30, 0 }, ; { "IMPORTE" , "N", 06, 0 }, ; { "FECHA" , "D", 08, 0 }, ; { "VTO" , "C", 30, 0 }, ; { "VTO" , "C", 30, 0 }, ; { "CONCEPTO" , "C", 30, 0 }, ; { "BANCO" , "C", 30, 0 }, ; { "CUENTA" , "C", 30, 0 }, ; { "NOMBRE" , "C", 30, 0 }, ; { "DIRECCION" , "C", 30, 0 }, ; { "POBLACION" , "C", 30, 0 } } )

USE RECIBOS INDEX ON Field->NUMERO TO RECIBOS dbCloseArea() RETURN NIL // -----------------------------------------------------------// -----------------------------------------------------------// Funcin ...: ImpRemesa() // Descripcin: Imprimimos un listado normal. // Notas .....: Es importante utilizar el EJECT final, para // forzar la impresin de la ltima lnea. // -----------------------------------------------------------FUNCTION ImpRemesa() LOCAL nFila := 6 LOCAL nTotal := 0 // Contador filas // Acumulador importe

// Si la impresora no esta en lnea IF !IsPrinter() IF Alert( " ATENCION !;;CONECTE LA IMPRESORA", ; { "O.K.", "Cancelar" } ) = 2 RETURN NIL ENDIF ENDIF SET DEVICE TO PRINT dbGoTop() DO WHILE !Eof() // Salida a la impresora

IF nFila = 6 // Imprimimos cabecera @ 00,00 SAY Replicate( "-", 80 ) @ 01,00 SAY "Listado Remesa Recibos" @ 03,00 SAY Replicate( "-", 80 ) @ 05,00 SAY PadR( "N", 8 ) + PadR( "Nombre", 32 ) + ; PadR( "Banco", 32 ) + "Importe" @ 06,00 SAY Replicate( "-", 80 ) ENDIF // Cuerpo listado nFila++ @ nFila, 00 SAY Field->NUMERO PICTURE "999999" @ nFila, 08 SAY Field->NOMBRE @ nFila, 40 SAY Field->BANCO @ nFila, 72 SAY Field->IMPORTE PICTURE "999999" nTotal := nTotal + Field->IMPORTE IF nFila = 55 // Final de pgina nFila++ @ nFila,00 SAY Replicate( "-", 80 ) nFila++ @ nFila,71 SAY nTotal PICTURE "9999999" EJECT nFila := 6 ENDIF dbSkip() ENDDO // Final Listado nFila++ @ nFila,00 SAY Replicate( "-", 80 ) nFila++ @ nFila,71 SAY nTotal PICTURE "9999999" EJECT

SET DEVICE TO SCREEN RETURN NIL // -----------------------------------------------------------// -----------------------------------------------------------// Funcin ...: ImpRecibos() // Descripcin: Imprimimos recibos. // -----------------------------------------------------------FUNCTION ImpRecibos() // Si la impresora no esta en lnea IF !IsPrinter() IF Alert( " ATENCION !;;CONECTE LA IMPRESORA", ; { "O.K.", "Cancelar" } ) = 2 RETURN NIL ENDIF ENDIF SET DEVICE TO PRINT dbGoTop() DO WHILE !Eof() // Cuerpo recibo @ PRow(), 05 SAY Field->NUMERO PICTURE "999999" @ PRow(), 20 SAY Field->LOCALIDAD @ PRow(), 50 SAY Field->IMPORTE PICTURE "999999" @ PRow() + 2, 10 SAY Field->FECHA PICTURE "@D"//+ 2 filas @ PRow(), 35 SAY Field->VTO @ PRow() + 4, 05 SAY Field->CONCEPTO //+ 4 filas @ PRow() + 2, 05 SAY Field->BANCO //+ 2 filas @ PRow() + 1, 05 SAY Field->CUENTA //+ 1 fila @ PRow() + 3, 05 SAY Field->NOMBRE //+ 3 filas @ PRow() + 1, 05 SAY Field->DIRECCION //+ 1 fila @ PRow() + 1, 05 SAY Field->POBLACION //+ 1 fila @ PRow() + 5, PCol() SAY "" // Salto entre recibos // Salida a la impresora

dbSkip() ENDDO EJECT SET DEVICE TO SCREEN RETURN NIL // ------------------------------------------------------------

INTERFAZ CON C y ENSAMBLADOR La potente arquitectura abierta de CA-Clipper, nos permite la construccin de libreras que no necesariamente han de ser en cdigo Clipper, sino en otros lenguajes como Ensmablador y C, que son mucho ms rpidos, y nos permiten llegar a reas poco desarrolladas por Clipper, como los grficos, comunicaciones, etc. Sistema Extendido El Sistema Extendido de CA-Clipper esta formado por un conjunto de funciones encargadas de controlar el paso y la devolucin de parmetros, dada la incompatibilidad de tipos de datos entre lenguajes. Paso de Parmetros: de CA-Clipper a C/Ensamblador

Notas: <nPosicionElementoArray>, solo cuando el elemento esta contenido en un array.


_parc( <nNumeroParametro> [, <nPosicionElementoArray> ] ) Para el paso de cadenas entre lenguajes. _parni( <nNumeroParametro> [, <nPosicionElementoArray>] ) Pasa un parmetro numrico de CA-Clipper a tipo int. _parnl( <nNumeroParametro> [, <nPosicionElementoArray ] ) Pasa un parmetro numrico de CA-Clipper a tipo long. _parnd( <nNumeroParametro>[, <nPosicionElementoArray>] ) Pasa un parmetro numrico de CA-Clipper a tipo double. _parl( <nNumeroParametro> [, <nPosicionElementoArray> ] ) Pasa un parmetro lgico de CA-Clipper y lo convierte a int (0 /1). _pards( <nNumeroParametro>[, <nPosicionElementoArray>] ) Pasa un parmetro de tipo fecha de CA-Clipper a cadena de formato "YYYYMMDD".

Funciones que informan sobre los parmetros


_parclen( <nNumeroParametro> [, <nPosicionElementoArray> ] )

Devuelve la longitud de la cadena pasada como parmetro.


_parinfo( <nNumeroParametro> [, <nPosicionElemntoArray> ] )

Devuelve un entero (int) que representa el tipo de dato pasado. UNDEF CHARACTER NUMERIC LOGICAL DATE ALIAS 0 1 2 4 8 16 MPTR MEMO WORD ARRAY BLOCK DOUBLE 32 64 128 512 1024 1048

_parinfa( <nNumeroParametro> [, <nPosicionElementoArray> ] )

Idem funcin anterior, pero el entero devuelto esta en un array

Devolucin de Valores: de C/Ensamblador a CA-Clipper


_retc( <cCadena> ) Devuelve una cadena. _retclen( <cCadena>, <nElementos> ) Devuelve una cadena de longitud determinada. _retni( <nNumero> ) Devuelve un nmero entero (int). _retnl( <nNumero> ) Devuelve un nmero long. _retnd( <nNumero> ) Devuelve un nmero double. retl( <nNumero> ) Devuelve un 0 / 1, correspondiente a CA-Clipper como .F./.T. _retds( <cCadena> ) Devuelve una cadena de formato "YYYYMMDD". _ret() Devuelve un NIL.

Modificacin de Parmetros
Notas: Al pasarse lso parmetros desde CA-Clipper, se les ha de anteponer el carcter: @

Cambio desde C/Ensamblador de parmetros pasados ( por referencia ).


_storc(<cCadena>,<nNumeroParametro>[,<nPosicionElementoArray>])

Devuelve 0 o 1, si el parmtero fue modificado con xito.


_storclen( <cCadena>, <nLongitudCadena>, <nNumeroParametro>

[, <nPosicionElementoArray>] ) Devuelve 0 o 1, si se ha podido modificar la longitud de la cadena pasada como parmetro. _storni( <nNumero>, <nNumeroParametro> [,<nPosicionElementoArray>] ) Devuelve 0 o 1, si el valor de tipo entero pasado por referencia fue modificado con xito. _stornl( <nNumero>, <nNumeroParametro> [, <nPosicionElementoArray> ] ) Devuelve 0 o 1, si el valor de tipo long pasado por referencia fue modificado con xito. _stornd( <nNumero>, <nNumeroParametro> [, <nPosicionElementoArray> ] ) Devuelve 0 o 1, si el valor de tipo double pasado por referencia fue modificado con xito. _storl( <nNumero>, <nNumeroParametro> [, <nPosicionElementoArray> ] ) Devuelve 0 o 1, si el valor de tipo entero pasado por referencia fue modificado con xito. Solo admite 0 = .F., y 1 = .T. _stords( <cCadena>, <nNumeroParametro> [, <nPosicionElemntoArray> ] ) Devuelve 0 o 1, si la cadena pasada por referencia fue modificada con xito. El formato de la cadena ha de ser "YYYYMMDD".

EJEMPLO EN C #include "c:\clipper5\include\extend.api" #include "c:\bc4\include\dos.h" // Compilacin con Borland C++: BCC -c -ml Mouse_c.c // Compilacin con Turbo C++ : TCC -c -ml Mouse_c.c // Autor: Angela Can Reyes * Apdo. , 572 * 03840 - Manresa // Notas: // -----// Los nombres de las funciones en C no deben de exceder de 10 // caracteres para no tener problemas al enlazar con CA-Clipper, // aunque desde Clipper, demos nombres de ms de 10 caracteres. // // Las funciones msClickLef() y msClickRig() son redundantes ya // que mediante msStatus tambin podemos saberlo. // ------------------------------------------------------------// Funcin ...: msIsMouse() // Descripcin: Comprueba si el ratn esta instalado. // Devuelve ..: .F. -> 0 = no est instalado // .T. -> -1 = est instalado // ------------------------------------------------------------CLIPPER msIsMouse() { _AX = 0; // Funcin 0 geninterrupt( 0x33 ); // Interrupcin 33 _retl( _AX ); // Devuelve .T. o .F. } // ------------------------------------------------------------// ------------------------------------------------------------// Funcin ...: msButtons() // Descripcin: Devuelve el n de botones del mouse. // Devuelve ..: El n de botones // -------------------------------------------------------------

CLIPPER msButtons() { _AX = 0; // Funcin 0 geninterrupt( 0x33 ); // Interrupcin 33 _retni( _BX ); // Devuelve n botones } // ---------------------------------------------------------// ---------------------------------------------------------// Funcin ...: msMouseOn() // Descripcin: Activa el cursor del ratn. // Devuelve ..: NIL (nada) // ----------------------------------------------------------CLIPPER msMouseOn() { _AX = 1; // Funcin 1 geninterrupt( 0x33 ); // Interrupcin 33 _ret(); // NIL } // ----------------------------------------------------------// --------------------------------------------------------// Funcin ...: msMouseOff() // Descripcin: Desactiva el cursor del ratn. // Devuelve ..: NIL (nada) // --------------------------------------------------------CLIPPER msMouseOff() { _AX = 2; // Funcin 2 geninterrupt( 0x33 ); // Interrupcin 33 _ret(); // NIL } // ----------------------------------------------------------// ----------------------------------------------------------// Funcin ...: msRow() // Descripcin: Devuelve la fila en la que se encuentra el

// cursor del ratn. // Devuelve ..: El n de la fila // ----------------------------------------------------------CLIPPER msRow() { _AX = 3; // Funcin 3 geninterrupt( 0x33 ); // Interrupcin 33 _retni( _DX / 8 ); // El n de fila } // ----------------------------------------------------------// ----------------------------------------------------------// Funcin ...: msCol() // Descripcin: Devuelve la columna en la que se encuentra el // cursor del ratn. // Devuelve ..: El n de la columna // -----------------------------------------------------------CLIPPER msCol() { _AX = 3; // Funcin 3 geninterrupt( 0x33 ); // Interrupcin 33 _retni( _CX / 8 ); // El n de columna } // -----------------------------------------------------------// -----------------------------------------------------------// Funcin ...: msStatus() // Descripcin: Devuelve el estado de los pulsadores. // Devuelve ..: El n de estado: // 0, sin pulsacin // 1, pulsado botn izquierdo // 2, pulsado botn derecho // 3, pulsados botones derecho e izquierdo // 4, pulsado botn central // 5, pulsados botones izquierdo y central // 6, pulsados botones derecho y central // 7, se han pulsado los tres botones // -----------------------------------------------------------

CLIPPER msStatus() { _AX = 3; // Funcin 3 geninterrupt( 0x33 ); // Interrupcin 33 _retni( _BX ); // El n de estado } // ----------------------------------------------------------// ----------------------------------------------------------// Funcin ...: msSay() // Descripcin: Posiciona el cursor del mouse en una fila y // columnas determinadas. // Devuelve ..: NIL (nada) // ----------------------------------------------------CLIPPER msSay() { _AX = 4; // Funcin 4 _CX = _parni( 2 ) * 8; // Coordenada Columna _DX = _parni( 1 ) * 8; // Coordenada Fila geninterrupt( 0x33 ); // Interrupcin 33 _ret(); // NIL } // -----------------------------------------------------------// -----------------------------------------------------------// Funcin ...: msClickLeft() // Descripcin : Indica si se ha pulsado o no el botn izquierdo // del mouse. // Devuelve ..: .T. o .F. // ------------ ------------------------------------------------CLIPPER msClickLef() { _AX = 5; // Funcin 5 _BX = 0; // Comprobar botn izquierdo geninterrupt( 0x33 ); // Interrupcin 33 _retl( _BX ); // .T./.F. = 1/0 }

// ----------------------------------------------------------// ----------------------------------------------------------// Funcin ...: msClickRight() // Descripcin: Indica si se ha pulsado o no el botn derecho // del mouse. // Devuelve ..: .T. o .F. // ----------------------------------------------------------CLIPPER msClickRig() { _AX = 5; // Funcin 5 _BX = 1; // Comprobar botn derecho geninterrupt( 0x33 ); // Interrupcin 33 _retl( _BX ); // .T./.F. = 1/0 } // -----------------------------------------------------------// -----------------------------------------------------------// Funcin ...: msArea() // Descripcin: Limitamos el movimiento del cursor del mouse a // una rea determinada. // Devuelve ..: NIL (nada) // -----------------------------------------------------------CLIPPER msArea() { unsigned int uiTop = _parni( 1 ) * 8; unsigned int uiLeft = _parni( 2 ) * 8; unsigned int uiBottom = _parni( 3 ) * 8; unsigned int uiRight = _parni( 4 ) * 8; _AX = 8; _CX = uiTop; _DX = uiBottom; geninterrupt( 0x33 ); // Funcin 8 // Fila superior // Fila inferior // Interrupcin 33

_AX = 7; _CX = uiLeft; _DX = uiRight; geninterrupt( 0x33 );

// Funcin 7 // Columna izquierda // Columna derecha // Interrupcin 33

} // -----------------------------------------------------------

EJEMPLO EN ENSAMBLADOR
; ------------------------------------------------------------; Programa ..: MOUSE_A.ASM ; Descripcin : Funciones de ratn para Clipper en ensamblador. ; Autor .....: Angel Caas Job * Apdo., 572 * 08500 - Manresa ; Compilacin: TASM MOUSE_A ; Notas .....: En la librera CLIPVISION he incluido las ; funciones en C, ya que prcticamente al ser ; pequeas, no hay mucha diferencia con las ; presentes en ensamblador. ; ------------------------------------------------------------.MODEL LARGE INCLUDE EXTASM.INC
PUBLIC MSISMOUSE, MSBUTTONS, MSMOUSEON, MSMOUSEOFF

PUBLIC _MSROW, _MSCOL, MSSTATUS, _MSSAY, MSCLICKLEF PUBLIC MSCLICKRIG, _MSAREAX, _MSAREAY .CODE ; ------------------------------------------------------------; Funcin ...: msIsMouse() ; Descripcin: Comprueba si el ratn esta instalado. ; Devuelve ..: .F. -> 0 = no est instalado ; .T. -> -1 = est instalado ; --------------------------------------------------------------

MSISMOUSE PROC FAR mov ax, 0h int 33h push ax call __retl add sp, 2 RET MSISMOUSE ENDP ; -----------------------------------------------------------; Funcin ...: msButtons() ; Descripcin: Devuelve el n de botones del mouse. ; Devuelve ..: El n de botones ; -----------------------------------------------------------MSBUTTONS PROC FAR mov ax, 0h int 33h push bx call __retni add sp, 2 RET MSBUTTONS ENDP ; -----------------------------------------------------------; Funcin ...: msMouseOn() ; Descripcin: Activa el cursor del ratn. ; Devuelve ..: NIL (nada) ; -------------------------------------------------------; Funcin 0 ; Interrupcin 33 ; Almacena contenido reg. AX en pila ; Devolver valor lgico(AX) a Clipper ; Reset stack ; Retorno de un procedimiento

MSMOUSEON PROC FAR mov ax, 1h int 33h push ax call __ret add sp, 2 RET MSMOUSEON ENDP ; --------------------------------------------------------; --------------------------------------------------------; Funcin ...: msMouseOff() ; Descripcin: Desactiva el cursor del ratn. ; Devuelve ..: NIL (nada) ; --------------------------------------------------------MSMOUSEOFF PROC FAR mov ax, 2h int 33h push ax call __ret add sp, 2 RET MSMOUSEOFF ENDP ; ------------------------------------------------------------; ------------------------------------------------------------; Funcin ...: _msRow() ; Descripcin: Devuelve la fila en la que se encuentra el cursor ; del ratn. ; Devuelve ..: El n de la fila ; --------------------------------------------------------------

_MSROW

PROC FAR mov ax, 3h int 33h push dx call __retni add sp, 2 RET

_MSROW ENDP ; ------------------------------------------------------------; ------------------------------------------------------------; Funcin ...: _msCol() ; Descripcin: Devuelve la columna en la que se encuentra el ; cursor del ratn. ; Devuelve ..: El n de la columna ; ------------------------------------------------------------_MSCOL PROC FAR mov ax, 3h int 33h push cx call __retni add sp, 2 RET _MSCOL ENDP ; -------------------------------------------------------------

; -----------------------------------------------------------; Funcin ...: msStatus() ; Descripcin : Devuelve el estado de los pulsadores. ; Devuelve ..: El n de estado: ; 0, sin pulsacin ; 1, pulsado botn izquierdo ; 2, pulsado botn derecho ; 3, pulsados botones derecho e izquierdo ; 4, pulsado botn central ; 5, pulsados botones izquierdo y central ; 6, pulsados botones derecho y central ; 7, se han pulsado los tres botones ; -----------------------------------------------------------MSSTATUS PROC FAR mov ax, 3h int 33h push bx call __retni add sp, 2 RET MSSTATUS ENDP ; ------------------------------------------------------------; ------------------------------------------------------------; Funcin ...: _msSay() ; Descripcin : Posiciona el cursor del mouse en una fila y ; columnas determinadas. ; Devuelve ..: NIL (nada) ; -----------------------------------------------------------

_MSSAY

PROC FAR mov ax, 4h mov dx, 1 push dx call __parni add sp, 2 mov cx, 2 push cx call __parni add sp, 2 mov cx, 2 push cx call __parni add sp, 2 int 33h call __ret RET

_MSSAY ENDP ; ------------------------------------------------------------; ------------------------------------------------------------; Funcin ...: msClickLef() ; Descripcin: Indica si se ha pulsado o no el botn izquierdo ; del mouse. ; Devuelve ..: .T. o .F. ; ------------------------------------------------------------MSCLICKLEF PROC FAR mov ax, 5h mov bx, 0h int 33h

MSCLICKLEF PROC FAR push bx call __retl add sp, 2 RET MSCLICKLEF ENDP ; -------------------------------------------------------------; -------------------------------------------------------------; Funcin ...: msClickRig() ; Descripcin: Indica si se ha pulsado o no el botn izquierdo ; del mouse. ; Devuelve ..: .T. o .F. ; -------------------------------------------------------------MSCLICKRIG PROC FAR mov ax, 5h mov bx, 1h int 33h push bx call __retl add sp, 2 RET MSCLICKRIG ENDP ; -------------------------------------------------------------; ------------------------------------------------------------; Funcin ...: msArea() ; Descripcin: Limitamos el movimiento del cursor del mouse a ; una rea determinada. ; Devuelve ..: NIL (nada) ; -------------------------------------------------------------

_MSAREAX PROC FAR mov ax, 7 mov cx, 1 push cx call __parni add sp, 2 mov dx, 2 push ax call __parni add sp, 2 int 33h call __ret RET _MSAREAX ENDP ; -----------------------------------------------------------; -----------------------------------------------------------_MSAREAY PROC FAR mov ax, 8 mov cx, 1 push cx call __parni add sp, 2 mov dx, 2 push ax call __parni add sp, 2

int 33h call __ret RET _MSAREAY ENDP ; -----------------------------------------------------------END ; ------------------------------------------------------------

Notas: Para mayor informacin ved los fuentes de la librera CLIPVISION (Vision.lib)

CAP N2 PROGRAMACION OOPS PROGRAMACION ORIENTADA AL OBJETO - OOPS La Programacin Orientada al Objeto, que denominaremos a partir de ahora como OOPS (Object Oriented Programming System), surge como una evolucin lgica de la programacin estructurada, para cubrir una serie de necesidades de los programadores: - Simplificar el cdigo de los programas. - Agilizar el mantenimiento de los programas. - Resolver problemas cada vez ms complejos. Todo lo anterior se puede resumir en una palabra: PRODUCTIVIDAD HISTORIA DE LA OOPS Aunque con el Simula67, se empez con la OOPS, podramos decir que esta obtiene su reconocimiento con el inicio del desarrollo del lenguaje Smalltalk como un proyecto de la Universidad de Utah, dirigido por Alan Kay en los aos 70. Posteriormente, en el Centro de Investigacin de Palo Alto de Xerox se enmarcaron las ideas originales del Smalltalk dentro de un interfaz grfico. Despus de varias revisiones apareci la versin ms conocida, la Smalltalk-80.

El Simula67 y el Smalltalk dieron origen a que otros lenguajes tambin incorporarn la OOPS, como hiz Bjarne Stroustrup, en 1980, que diseo un "C con clases", que en 1983 se llamara C++. Con Pascal pas lo mismo gracias al impulso de Borland. Actualmente todos los compiladores incorporan toda la potencia de la programacin orientada al objeto, aunque sea en parte como el CA-Clipper de Computer Associates. Clasificacin De entre los lenguajes anteriores cabe distinguir, lo que podramos denominar un cierto grado de pureza respecto a la progrmacin OOPS: - Lenguajes puros, son los que como Smalltalk, HyperTalk o Actor, la programacin es 100% en OOPS. - Lenguajes hbridos, son los que incorporan potencia OOPS, pero pueden programarse tambin de forma estructurada mediante llamadas a funciones, como el C++, Borland Pascal o porque no, el mismo CA-Clipper.

CARACTERISTICAS DE LA OOPS Las propiedades o caractersticas fundamentales de la programacin orientada a objetos se podran enumerar as: 1) Encapsulacin ---------------Toda la informacin referente a un objeto esta agrupada, pero el objeto es como una caja negra cuya estructura permanece oculta, para el usuario y los otros objetos. La informacin que contiene el objeto slo sera accesible a travs de la ejecucin de los mtodos adecuados. 2) Polimorfismo --------------Permite la construccin de mtodos que tengan el mismo nombre pero que realicen acciones distintas dependiendo del objeto al cual se asignen.Por poner un ejemplo de fcil comprensin, suponga el siguiente mtodo: Patada(), su misin consiste, como su nombre indica, en dar una patada a un objeto. Objetos sobre los que lo aplicaremos: oBalon, el resultado ser mandar al objeto baln muy lejos. oBolaHierro100Kg, el resultado ser pasar por el Hospital.

Forma de aplicarlos: oBalon:Patada() oBolaHierro100Kg:Patada() 3) Herencia ----------La herencia consiste igual como ocurre con nosotros, que heredamos caractersticas o propiedades de nuestros antecesores, los objetos pueden heredar caractersticas o propiedades, y mtodos de otros objetos. Por poner un caso prctico, los modelos de coches. Como habr podido observar al cabo de cierto tiempo de salir un determinado modelo de coche al mercado, el mismo fabricante saca el mismo modelo con alguna variante (modelo Plus, ...). De esta forma, un coche hereda la mayoria de caractersticas de su antecesor y los toques son mnimos en la cadena de produccin. Este es uno de los objetivos de la OOPS reducir el tiempo de las versiones, que en la informtica es fcil de comprobar. Antes para que una nueva versin viera la luz pasaban aos, ya que se tena que empezar prcticamente desde 0, actualmente hay una avalancha de versiones gracias a la facilidad de mantenimiento y potencia de la OOPS.

ELEMENTOS DE LA OOPS Antes hemos visto las caractersticas de la OOPS, pero cuales son los elementos que la componen: OBJETOS ------Un objeto es una estructura fundamental de la programacin orientada a objetos, contiene un conjunto de datos (caractersticas o propiedades) y mtodos u acciones (funciones),posee una estructura y se relaciona con otros objetos para formar una organizacin jerrquica, es lo que se denomina clase. Por ejemplo, escojamos el objeto Ventana: - Tiene unas caractersticas determinadas: color, tamao, forma, etc. - Sobre dicho objeto podemos realizar varias acciones: abrirla, cerrarla, ocultarla, etc. CLASES -----Una clase es el conjunto de reglas que rigen la creacin y el comportamiento de los objetos de dicha clase. Mientrs un objeto es tangible (coche, moto, etc.), una clase no lo s, es intangible, por ejemplo: la clase vehculos.

METODOS ------Un mtodo es una funcin asociada a un objeto y a los descendientes de estos, cuya ejecucin se realiza a travs de un mensaje recibido por el objeto o sus descendientes. Por ejemplo, en la clase anterior: vehculos, los mtodos de dicha clase son comunes a todos sus objetos, ya que con los objetos coche, moto, etc., podemos arrancar, parar, frenar, etc. MENSAJES -------Un mensaje es una peticin enviada a un objeto para que active un mtodo, si dicho mtodo no se encuentra en la clase a la cual pertenece el objeto, se interroga a la Clase Padre. Los mensajes relacionan unos objetos con otros y con el mundo exterior, incluso un mismo objeto puede enviarse mensajes.
Para enviar los mensajes se utiliza el operador de envio (:).

por ejemplo: oTB:colSep := " "

SINTAXIS OOPS CA-Clipper 5.x incorpora 4 clases predefinidas: Error, Get, TBrowse y TBColumn, y no se nos indica como crear nuevas clases, sin embargo, si existen y podemos trabajar con clases es por que hay implementado un sistema OOPS, que no han credo conveniente ofrecer a los usuarios. Es por eso que excelentes programadores como Antonio Linares, del cual usaremos su magnfica librera Objects, han localizado la gestin de clases de Clipper y la han hecho accesible a los usuarios. De esta forma mediante el uso de Objects, y otras libreras como SuperClass, Class(y), etc. podemos empezar a crear nuestras propias clases y as cuando llegue el tan esperado Visual Objects for Clipper, el cambio no ser tan brusco. Creacin de Clases La creacin de una clase consta de dos etapas: 1) Declaracin de la clase. 2) Codificacin de sus mtodos. Notas: Se recomienda almacenar cada clase en un fichero .PRG
Utilizaremos la sintaxis propuesta en Objects.

Declaracin de la clase Al declarar la clase especificamos todos sus componentes: 1) Nombre de la clase. - Slo se toman como vlidos los 10 primeros caracteres, es una de las limitaciones de Clipper. - Si esta deriva de otras. - Suele empezar con T para evitar confusiones con nombre de funciones, como por ejemplo, TWindow (clase) y Window (funcin). 2) Los datos o variables que contendrn sus objetos. - En uno o ms lneas, separados por comas podemos indicarsus nombres en Notacin Hngara (cCaracter, nNumero,dFecha, lLogico), siempre precedidos por la clasula DATA. Ejemplo: DATA cColor, nMarco - Podemos utilizar la clasula READONLY (slo lectura), para impedir la manipulacin de datos, desde otras clases,o usuarios, pero esto enlentece la ejecucin del programa. - Para operar con los datos de los objetos utilizamos el operador ::, que es lo mismo que Self: - Podemos inicializar datos por defecto con la clasula DEFAULT. Ejemplo: DEFAULT cTitle := "Ventana"

3) Los mtodos que actuarn sobre los objetos. - El primer mtodo o mtodos ha de ser el CONSTRUCTOR, y suele llamarse New, por tradicin de C++. Es imprescindible indicar los parmetros que recibir. Devuelve una referencia al propio objeto (Self). - Mtodos (normales), reciben parmetros o no, realizan acciones, y devuelve o no valores. - Mtodos BLOCK, permiten indicar un bloque de cdigo a ejecutar. Son de utilidad para pequeos mtodos al reducir cdigo. El primer parmetro del CodeBlock ha de ser Self. Ejemplo:
METHOD Nombre( Parms, .. ) BLOCK { |Self, Parms, .. | .. }

- Mtodos SETGET, son mtodos que simulan ser datos, es decir, realizan acciones y reciben y devuelven valores. - Mtodos VIRTUAL, no realizan nada en la clase en la que se definen, sino que en las Clases Derivadas de esta, ser redefinido y realizar alguna accin. - Para acceder a los mtodos de las Clases Ascendentes hay que utilizar ::Parent (Padre de la Clase del Objeto).

Resumiendo un esquema bsico de clase podra ser este:


CLASS TNombre DATA cDato1, ... DATA nDato1, ... METHOD New( x1, y1, ... ) CLASS TNombre METHOD Nombre() ENDCLASS METHOD New( x1, y1, ... ) CLASS TNombre .... .... RETURN Self METHOD Nombre() CLASS TNombre .... .... RETURN NIL

Notas: Ms adelante veremos con detalle y con ejemplos cada uno de los mtodos y clasulas anteriores.

EJEMPLO DE CLASE - Clase TWindow Este sencillo ejemplo de clase realizado con Objects nos servir para comprender mejor la sintaxis OOPS, y el modo de empleo de dicha librera (incluir el Objects.ch y linkar con Objects.lib). Observe como operamos con los datos (operador ::), y que los mtodos son tratados como funciones.
// ************************ EJEMPLO ************************** #include "Objects.ch" #include "Box.ch" // ----------------------------------------------------------// Clase ......: TWindow // Descripcin : Implementacin de un sistema sencillo de // ventanas en OOPS. // // Datos ......: nTop -> Coordenada fila superior izda. // nLeft -> " columna sup. izda. // nBottom -> " fila inferior dcha. // nRight -> " columna inf. dcha. // cBackImage -> Almacena/Restaura la pantalla // cFrame -> Marco de la ventana (simple) // cTitle -> Ttulo de la ventana // cClrNormal -> Color normal de la ventana // cClrTitle -> Color del ttulo de la ventana // // Mtodos....: New() -> Mtodo contructor, crea ventana // Display() -> Muestra la ventana // Hide() -> Oculta la ventana // Say() -> Escribe en la ventana // -----------------------------------------------------------

CLASS TWindow
DATA nTop, nLeft, nBottom, nRight DATA cBackImage, cFrame, cTitle, cClrNormal, cClrTitle METHOD New( nTop, nLeft, nBottom, nRight, cTitle, ; cClrNormal ) CONSTRUCTOR METHOD Display() METHOD Hide() METHOD Say( nRow, nCol, cText, cColor ) ENDCLASS // ---------------------------------------------------------// ---------------------------------------------------------// Mtodo .....: New() // Descripcin : Constructor de la ventana. // Parmetros .: nTop -> Coordenada fila superior izda. // nLeft -> " columna sup. izda. // nBottom -> " fila inferior dcha. // nRight -> " columna inf. dcha. // cTitle -> Ttulo de la ventana // cClrNormal -> Color normal de la ventana // Devuelve ...: Self (a s mismo) // ----------------------------------------------------------METHOD New( nTop, nLeft, nBottom, nRight, cTitle, cClrNormal ); CLASS TWindow DEFAULT cClrNormal := "W+/B, W+/N" DEFAULT cTitle := "" ::nTop := nTop ::nLeft := nLeft ::nBottom := nBottom ::nRight := nRight ::cTitle := cTitle ::cClrNormal := cClrNormal ::cClrTitle := "W+/R" ::cBackImage := "" ::cFrame := B_SINGLE + " "

RETURN Self // ----------------------------------------------------------// ----------------------------------------------------------// Mtodo .....: Display() // Descripcin : Muestra la ventana. // Parmetros .: Ninguno // Devuelve ...: Nada // ----------------------------------------------------------METHOD Display() CLASS TWindow LOCAL nCenter := 0 // Salvamos pantalla ----------------------------------::cBackImage := SaveScreen( ::nTop, ::nLeft, ::nBottom+1, ; ::nRight + 2 ) // Sombreado ------------------------------------------ScrShadow( ::nTop + 1, ::nLeft + 2, ::nBottom + 1, ; ::nRight + 2 ) // Dibujamos marco ------------------------------------@ ::nTop, ::nLeft, ::nBottom, ::nRight BOX ::cFrame ; COLOR ::cClrNormal // En caso de tener ttulo la ventana -----------------If len( ::cTitle ) != 0 nCenter := int( ( ::nRight - ::nLeft ) / 2 - ; len( ::cTitle ) / 2 ) @ ::nTop, ::nLeft + nCenter SAY " " + ::cTitle + " " ; COLOR ::cClrTitle endif RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Mtodo .....: Hide() // Descripcin : Oculta la ventana. // Parmetros .: Ninguno // Devuelve ...: Nada // -----------------------------------------------------------

METHOD Hide() CLASS TWindow RestScreen( ::nTop, ::nLeft, ::nBottom + 1, ::nRight + 2, ::cBackImage ) ::cBackImage := "" RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Mtodo .....: Say() // Descripcin : Escribe un texto en la ventana. // Parmetros .: nRow -> Coordenada de la fila // nCol -> Coordenada de la columna // cText -> Texto // cColor -> Color del texto // Devuelve ...: Nada // ----------------------------------------------------------METHOD Say( nRow, nCol, cText, cColor ) CLASS TWindow @ ::nTop + nRow, ::nLeft + nCol SAY cText ; COLOR If( cColor == NIL, ::cClrNormal, cColor ) RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Funcin ...: ScrShadow // Descripcin : Funcin de sombreado, utilizada por la clase // TWindow. // Notas .....: (c) Antonio Linares // ----------------------------------------------------------function ScrShadow( nTop, nLeft, nBottom, nRight ) return RestScreen( nTop, nLeft, nBottom, nRight,; Transform( SaveScreen( nTop, nLeft, nBottom, nRight ),; Replicate( "X" + Chr( 7 ), ( nBottom - nTop + 1 ) * ; ( nRight - nLeft + 1 ) ) ) ) // -----------------------------------------------------------

EJEMPLO DE USO DE CLASES (Sintaxis OOPS) En este ejemplo utilizamos la clase TWindow, en el ms puro estilo OOPS. En el siguiente tema vera como podemos ocultar a complejidad de la sintaxis OOPS, mediante comandos xBase.
// ************************** EJEMPLO ************************ // ----------------------------------------------------------// Programa ..: DEMO1.PRG // Descripcin : Ejemplo de uso de la clase TWindow. // Compilar ..: clipper demo1 /n /w // rtlink file demo1 lib objects // ----------------------------------------------------------#include "Objects.ch" set procedure to Window // Clase TWindow

// ----------------------------------------------------------FUNCTION MAIN() // Construccin ventanas


LOCAL oWin1 := TWindow():New( 03, 03, 21, 74, "Ventana" ) LOCAL oWin2 := TWindow():New( 09, 25, 13, 55, "Aviso", ; "W+/BG" )

SetColor( "N/W" ) CLS // Visualizamos ventanas oWin1:Display() oWin2:Display() oWin2:Say( 02, 05, "* Pulse una tecla *" ) Inkey( 0 ) oWin2:Hide()

// Escribimos // Ocultamos

oWin1:Say( 03, 05, "Nombre ..:", "GR+/B" ) oWin1:Say( 08, 05, "Direccin:", "R+/B" ) oWin1:Say( 13, 05, "Poblacin:", "W+/B" ) Inkey( 0 ) oWin1:Hide() RETURN NIL // -----------------------------------------------------------

EJEMPLO DE USO DE CLASES (Sintaxis xBase) Dado que la sintaxis OOPS puede resultar un poco complicada, podemos ocultar dicha complejidad con la ayuda del preprocesador, y crearnos nuestros nuevos comandos xBase.
// ************************ EJEMPLO ************************** // ----------------------------------------------------------// Programa ..: DEMO2.PRG
// Descripcin: Ejemplo de uso de la clase TWindow, pero ocul-

// tando la sintaxis OOPS, con la ayuda del pre// procesador. // Compilar ..: clipper demo2 /n /w // rtlink file demo2 lib objects // -----------------------------------------------------------

// Estas directivas tendran que ir aparte en un fichero .ch #xcommand DEFINE WINDOW <oWnd> ;
[ FROM <nTop>, <nLeft> TO <nBottom>, <nRight> ] ;

[ TITLE <cTitle> ] ; [ COLOR <cClrNormal> ] ; => ; <oWnd> := TWindow():New( <nTop>, <nLeft>, ; <nBottom>, <nRight>, <cTitle>, <cClrNormal> ) #xcommand ACTIVATE WINDOW <oWnd> ; => ; <oWnd>:Display() #xcommand WINDOW <oWnd> ; [ <nRow>, <nCol> SAY <cText> ] ; [ COLOR <cColor> ] ; => ; <oWnd>:Say( <nRow>, <nCol>, <cText>, <cColor> ) #xcommand DEACTIVATE WINDOW <oWnd> ; => ; <oWnd>:Hide() // ----------------------------------------------------------#include "Objects.ch" set procedure to Window // Clase TWindow

// ----------------------------------------------------------FUNCTION MAIN() // Declaracin de objetos -------------------------------LOCAL oWin1, oWin2

// Definimos ventanas -----------------------------------DEFINE WINDOW oWin1 FROM 03,03 TO 21,74 TITLE "Ventana" DEFINE WINDOW oWin2 FROM 09,25 TO 13,55 TITLE "Aviso" ; COLOR "W+/BG" SetColor( "N/W" ) CLS // Mostramos ventanas -----------------------------------ACTIVATE WINDOW oWin1 ACTIVATE WINDOW oWin2 WINDOW oWin2 02,05 SAY "* Pulse una tecla *" // Escribimos InKey( 0 ) DEACTIVATE WINDOW oWin2 // Desactiva

// Escribimos en la ventana n 1 ------------------------WINDOW oWin1 03,05 SAY "Nombre ..:" COLOR "GR+/B" WINDOW oWin1 08,05 SAY "Direccin:" COLOR "BG/B" WINDOW oWin1 13,05 SAY "Poblacin:" COLOR "W+/B" InKey( 0 ) // Desactivamos ventana n 1 ----------------------------DEACTIVATE WINDOW oWin1 RETURN NIL // -----------------------------------------------------------

CAP N3 : LA CLASE GET La clase GET define el formato asociado a los objetos GET de CA-Clipper, que son los que utilizamos para la edicin de campos y variables. Es un sistema muy flexible y abierto para permitir modificaciones que aumenten la potencia del sistema. MENSAJES DE LA CLASE GET Las variables de instancia (mensajes) utilizadas son: badDate Valor lgico que indica si el buffer contiene una fecha no vlida. block Bloque de cdigo que asocia el objeto Get con una variable. buffer Cadena de caracteres que define el buffer de edicin. cargo Variable de cualquier tipo definible por el usuario. changed Valor lgico que indica si Get:buffer ha cambiado. clear Indica si debe borrarse la memoria intermedia de edicin.

col Nmero de la columna del Get. colorSpec Cadena de colores para la visualizacin. decPos Valor numrico que indica la posicin del punto decimal dentro del buffer de edicin. exitState Anota como el usuario sali del objeto Get. hasFocus Valor lgico que indica si el objeto get tiene enfoque de entrada. minus Indica si se ha introducido o no un signo menos. name Nombre de la variable Get. original Cadena que contiene el valor original de Get:name picture Cadena con el patrn de formato de edicin. pos Valor numrico que indica la posicin del cursor dentro del buffer de edicin.

postBlock Bloque de cdigo usado para validar el valor de entrada. Equivale a la clusula VALID. preBlock Bloque de cdigo para determinadar si se permite la edicin. Equivale a la clusula WHEN. reader Contiene un bloque que afecta a la conducta del objeto Get. rejected Valor lgico que indica el estado de Get:insert y Get:overStrike. row Nmero de fila del Get. subscript Informacin del subndice sobre objetos de matrices Get. type Tipo de datos de la variable Get. typeOut Valor lgico que indica el movimiento del cursor afuera del buffer de edicin.

METODOS DE LA CLASE GET Los mtodos a aplicar sobre un objeto Get, se pueden clasificar de la siguiente forma: Mtodos de Cambio de Estado assign()
Asigna el contenido del buffer de edicin a la variable Get.

colorDisp() Cambia el color del objeto Get y lo visuliza de nuevo. display() Visualiza el Get en la pantalla. killFocus() Suprime el enfoque de entrada del objeto Get. reset() Reinicializa la informacin de estado interno del Get. setFocus() Suministra enfoque de entrada al objeto Get. undo() Reinicializa la variable Get a Get:original. unTransform() Convierte un valor en su tipo de datos original.

updateBuffer()
Actualiza el buffer de edicin y visualiza de nuevo el Get.

varGet() Devuelve el valor en curso de la variable Get. varPut() Asigan el valor pasado a la variable Get. Mtodos de Movimiento del Cursor end() Mueve el cursor a la posicin ms a la derecha. home() Mueve el cursor a la posicin ms a la izquierda. left() Mueve el cursor un carcter hacia la izquierda. right() Mueve el cursor un carcter hacia la derecha. toDecPos() Mueve el cursor hacia la derecha de Get:decPos wordLeft() Mueve el cursor una palabra hacia la izquierda. wordRight() Mueve el cursor una palabra hacia la derecha.

Mtodos de Edicin backspace() Mueve el cursor hacia la izquierda y borra un carcter. delete() Borra el carcter que hay debajo del cursor. delEnd() Borra desde la posicin del cursor hasta el final del Get. delLeft() Borra el carcter a la izquierda del cursor. delRight() Borra el carcter a la derecha del cursor. delWordLeft() Borra la palabra a la izquierda del cursor. delWordRight() Borra la palabra a la derecha del cursor. Mtodos de Entrada de Texto insert() Inserta caracteres en el buffer de edicin. overStrike() Sobreescribe caracteres en el buffer de edicin.

CONSTRUCCION DE OBJETOS GET


#include "InKey.ch" // ---------------------------------------------------------// Programa ..: GetSpin.prg // Descripcin : Creacin objetos Get con incremento/decremento, // mediante la pulsacin de las teclas de flecha // arriba/abajo. // Programador: Angela Can Reyes, 1995 // ---------------------------------------------------------FUNCTION Main() LOCAL nValor := 1000 LOCAL dFecha := Date() SET DATE TO ITALIAN CLS nValor := GetSpin( 10, 5, nValor, "9999999999" ) dFecha := GetSpin( 12, 5, dFecha, "@D" ) @ 20,00 say "nValor := " + Str( nValor ) @ 21,00 say "dFecha := " + DTOC( dFecha ) RETURN NIL // ---------------------------------------------------------// ---------------------------------------------------------// Funcin ...: GetSpin // Descripcin: Edicin normal, hasta que pulsamos la flecha // abajo y/o arriba que decrementa/incrementa el // valor del objeto GET. // Parmetros : nFila -> Fila // nCol -> Columna // xValor -> Variable a modificar, nmero/fecha. // cPicture -> Formato mscara edicin. // cMsg -> Mensaje a mostrar. // ----------------------------------------------------------

FUNCTION GetSpin( nFila, nCol, xValor, cPicture, cMsg ) LOCAL lSalida := .F. LOCAL i := 0 LOCAL cTecla := "" LOCAL nTecla := 0 LOCAL cBuffer := "" LOCAL cOldColor := SetColor() LOCAL acAuxiliar := {} LOCAL cAuxiliar := "" LOCAL cValor := "" LOCAL nPosCursor := 0 // Salida bucle // Contador Bucle // Valor Tecla // Control Teclado // Salva pantalla // Color viejo // Array auxiliar // Variable auxiliar // Valor a cadena // Posicin cursor

// CREACION OBJETO GET========================= LOCAL oGet := GetNew( nFila, nCol, ; { |p| If( pCount() == 0, xValor, ; xValor := p ) }, xValor ) // ============================================ SetCursor( 1 ) IF ReadInsert() ReadInsert( .T. ) ENDIF oGet:SetFocus() oGet:display() IF oGet:TypeOut lSalida := .T. ELSE lSalida := .F. ENDIF // Activamos cursor // Fuerza sobreescritura

// Da el foco del objeto // Mostramos objeto GET

// Mostrar mensaje @ 24,00 SAY PadC( cMsg, 80 ) // Dependiendo del tipo de dato, Inicializamos arrays. IF ValType( xValor ) = "D" @ nFila, nCol + 8 SAY Chr( 18 ) acAuxiliar := Array( 8 ) cValor := DTOC( xValor ) acAuxiliar[ 1 ] := SubStr( cValor, 1, 1 ) acAuxiliar[ 2 ] := SubStr( cValor, 2, 1 ) acAuxiliar[ 3 ] := "-" acAuxiliar[ 4 ] := SubStr( cValor, 4, 1 ) acAuxiliar[ 5 ] := SubStr( cValor, 5, 1 ) acAuxiliar[ 6 ] := "-" acAuxiliar[ 7 ] := SubStr( cValor, 7, 1 ) acAuxiliar[ 8 ] := SubStr( cValor, 8, 1 ) ELSE @ nFila, nCol + Len( cPicture ) SAY Chr( 18 ) acAuxiliar := Array( Len( cPicture ) ) cValor := Str( xValor, Len( cPicture ) ) FOR i := 1 TO Len( acAuxiliar ) acAuxiliar[ i ] := SubStr( cValor, i, 1 ) NEXT ENDIF WHILE !lSalida oGet:picture := cPicture IF oGet:TypeOut EXIT ENDIF nTecla := InKey( 0 ) // Forzamos la salida al // completar el Get

DO CASE CASE nTecla = K_ESC oGet:Undo() EXIT CASE nTecla = K_RETURN EXIT CASE nTecla = K_CTRL_U oGet:Undo() CASE nTecla = K_RIGHT oGet:Right() CASE nTecla = K_LEFT oGet:Left() CASE nTecla = K_HOME oGet:home() CASE nTecla = K_END oGet:end() CASE nTecla = K_DEL oGet:right() oGet:backspace() oGet:OverStrike( " " ) CASE nTecla = K_INS IF !ReadInsert() ReadInsert( .T. ) SetCursor( 2 ) ELSE ReadInsert( .F. ) SetCursor( 1 ) ENDIF // Tecla ESCAPE // Deshacemos // Salimos // Tecla INTRO // Salimos // Tecla CTRL + U // Deshacemos // Flecha a la derecha // Flecha a la izquierda // Inicio // Fin // Suprimir

// Insertar // Cursor insercin // Cursor normal

CASE nTecla = K_BS oGet:backSpace() CASE nTecla = K_UP xValor += 1 oGet:varPut( xValor ) oGet:updateBuffer() xValor -= 1 oGet:varPut( xValor ) oGet:updateBuffer()

// Retroceso // Flecha arriba

CASE nTecla = K_DOWN .OR. nTecla = 0 // Flecha abajo

OTHERWISE // Cualquier valor IF nTecla >= 32 .AND. nTecla <= 255 cTecla := Chr( nTecla ) IF ReadInsert() // Modo insercin aIns( acAuxiliar, oGet:pos ) oGet:insert( cTecla ) oGet:left() ENDIF acAuxiliar[ oGet:pos ] := cTecla oGet:overStrike( cTecla ) FOR i := 1 TO Len( acAuxiliar ) cAuxiliar += acAuxiliar[ i ] NEXT IF oGet:type = "N" xValor := Val( cAuxiliar ) ELSEIF oGet:type = "D" xValor := CTOD( cAuxiliar ) ENDIF

// Asignamos nuevo valor oGet:varPut( xValor ) cAuxiliar := "" ENDIF ENDCASE ENDDO oGet:Assign() oGet:Reset() oGet:KillFocus() SetColor( cOldColor ) SetCursor( 0 ) // Asignamos buffer a variable // Vacamos buffer // Eliminamos foco // Restauramos color inicial // Desactivamos cursor

RETURN( xValor ) // ----------------------------------------------------------

CAP N : 4 LA CLASE ERROR El sistema de gestin de errores por defecto es ErrorSys(), cuyo cdigo fuentes tenemos en el directorio: C:\CLIPPER5\SOURCE\SYS\ERRORSYS.PRG Y que podemos adaptar a nuestras necesidades, y recompilarlo junto a nuestros programas. Pero tambin existe la posibilidad de crearnos un sofisticado sistema de gestin de errores, mediante la indicacin a la funcin ErrorBlock(), de quien controlar los errores. Por ejemplo: ErrorBlock( { |oError| CtrlError( oError ) } ) Tambin es de vital importancia el uso de la estructura: BEGIN...SEQUENCE y de sus clusulas BREAK y RECOVER, para el control de errores. Por ejemplo, utilizar para los listados impresos: BEGIN SEQUENCE SET DEVICE TO PRINT // Imprimir ... SET DEVICE TO SCREEN RECOVER SET DEVICE TO SCREEN Alert( "Error Impresin" ) END SEQUENCE

MENSAJES DE LA CLASE ERROR Todo son variables de instancia (mensajes), la nica funcin es la constructora: ErrorNew().
args Es una matriz de funciones o argumentos de operadores. canDefault Valor lgico indicando si el subsistema puede recuperarse del error. canRetry Valor lgico indicando si el subsistema puede volver a intentar la operacin. canSubstitute Valor lgico indicando si se puede sustituir un nuevo resultado. cargo Variable definible por el usuario. description Cadena de caracteres que describe el error. filename Cadena que contiene el nombre del archivo que produjo el error. genCode Nmero entero que representa un cdigo de error genrico. operation Cadena de caracteres que describe la operacin que fall. osCode Nmero entero del cdigo de error del sistema operativo.

severity Indica la severidad del error. subCode Cdigo de error del subsistema que fall. subSystem Nombre del subsistema que gener el error. tries N de veces que ha sido intentada la operacin.

CONSTRUCCION DE OBJETOS ERROR


// -------------------------------------------------------// Programa ..: Error.prg // Descripcin: Ejemplo Gestor de Errores, que guarda en // una Base de datos los errores producidos. // Autor .....: Angela Can Reyes, 1995 // -------------------------------------------------------// -------------------------------------------------------// -------------------------------------------------------FUNCTION MAIN() IF !File( "ERRORES.DBF" ) CrearFileError() ENDIF CLS ErrorBlock( { | oError | CtrlError( oError ) } ) USE X // Provocamos error, no existe X.DBF

RETURN NIL // -------------------------------------------------------// -------------------------------------------------------// Funcin ...: CrearFileError() // Descripcin: Creamos B.D. donde almacenaremos los datos // del error. // -------------------------------------------------------FUNCTION CrearFileError() dbCreate( "ERRORES", { { "DIA" { "HORA" { "LINEA" { "PROCEDIM" { "CODIGO" { "DESCRIPCIO" { "FICHERO" { "OPERACION" { "SUBCODIGO" { "SUBSISTEMA" { "DOS" { "DEFECTO" { "REINTENTAR" { "SEVERIDAD" { "INTENTOS" { "RAM_LIBRE" { "DISCOLIBRE" { "DIRECTORIO" , "D", 08, 0 }, ; , "C", 08, 0 }, ; , "N", 04, 0 }, ; , "C", 20, 0 }, ; , "N", 03, 0 }, ; , "C", 60, 0 }, ; , "C", 12, 0 }, ; , "C", 60, 0 }, ; , "N", 10, 0 }, ; , "C", 20, 0 }, ; , "N", 10, 0 }, ; , "L" , 01,0 }, ; , "L" , 01, 0 }, ; , "N", 10, 0 }, ; , "N", 10, 0 }, ; , "N", 10, 0 }, ; , "N", 15, 2 }, ; , "C", 60,0 } } )

USE ERRORES INDEX ON DTOS( Field->DIA ) + Field->HORA TO ERRORES dbCloseArea()

RETURN NIL // --------------------------------------------------------// --------------------------------------------------------// Funcin ...: CtrlError() // Descripcin: Sistema de Control de Errores, que graba // todos los errores no recuperables, as como // algn dato del equipo, que nos sern de // utilidad ms tarde. // --------------------------------------------------------STATIC FUNCTION CtrlError( oError ) LOCAL lDevuelve := .F. LOCAL nOpcion := 0 LOCAL acOpciones := {} LOCAL GetList := {} LOCAL nLinea := ProcLine( 1 ) // N Cod. fuente LOCAL cProcedimiento := ProcName( 1 ) // Nombre Procedure LOCAL nCodigo := oError:genCode LOCAL cDescripcion := oError:description LOCAL cFichero := oError:filename LOCAL cOperacion := oError:operation LOCAL nSubCodigo := oError:subCode LOCAL cSubSistema := oError:subSystem LOCAL nDos := oError:osCode LOCAL lDefecto := oError:candefault LOCAL lReintentar := oError:canRetry LOCAL nSeveridad := oError:severity LOCAL nIntentos := oError:tries LOCAL nRamLibre := Memory() // Memoria libre (Kb.) LOCAL nDiscoLibre := diskSpace() // Disco libre (Mb.) LOCAL cDirectorio := CurDir() // Directorio actual

nDiscoLibre := nDiscoLibre / ( 1024 * 1024 ) IF oError:canRetry aAdd( acOpciones, "Reintentar" ) ENDIF IF oError:canDefault aAdd( acOpciones, "por Defecto" ) ENDIF aAdd( acOpciones, "Cancelar" ) IF oError:tries < 5 .AND. oError:canRetry nOpcion := Alert( "Error n " + ; AllTrim( Str( oError:genCode ) ) + ; ";" + oError:description + ";;" + ; "Lnea n " + ; AllTrim( Str( ProcLine(1) ) ) + ";" + ; "Procedimiento: " + ; ProcName(1), acOpciones ) IF acOpciones[ nOpcion ] = "Reintentar" lDevuelve = .T. ENDIF ENDIF IF lDevuelve = .F. // Abrimos Base Datos e indice de errores USE ERRORES NEW SET INDEX TO ERRORES

// Aadimos registro y grabamos datos dbAppend() FieldPut( 01, Date() ) FieldPut( 02, Time() ) FieldPut( 03, nLinea ) FieldPut( 04, cProcedimiento ) FieldPut( 05, nCodigo ) FieldPut( 06, cDescripcion ) FieldPut( 07, cFichero ) FieldPut( 08, cOperacion ) FieldPut( 09, nSubCodigo ) FieldPut( 10, cSubSistema ) FieldPut( 11, nDos ) FieldPut( 12, lDefecto ) FieldPut( 13, lReintentar ) FieldPut( 14, nSeveridad ) FieldPut( 15, nIntentos ) FieldPut( 16, nRamLibre ) FieldPut( 17, nDiscoLibre ) FieldPut( 18, cDirectorio ) Browse() // Mostrar errores

dbCommitAll() // Forzamos grabacin datos dbCloseAll() // Cerramos B.D. QUIT ENDIF RETURN lDevuelve // Si podemos recuperar error // --------------------------------------------------------// Salir

CAP N:5 LA CLASE T BROWSE / TBCOLUMN LA CLASE TBROWSE Un objeto permite la visualizacin general de datos en forma de tabla o modo browse, y sustituye a la funcin dbEdit() del Clipper S'87. Permite una flexibilidad y un control total mediante el uso de abundantes mensajes y mtodos. El uso del objeto TBrowse no esta limitado a mostrar bases de datos, sino que tambin podemos mostrar arrays, ficheros ASCII, directorios, colores, etc.

MENSAJES DE LA CLASE TBROWSE Aunque Computer Associates utilice el trmino de variables de instncia, particularmente utilizar el de mensaje que es el ms utilizado en OOPS. Los mensajes que se envian al objeto TBrowse y a los cuales se les puede asignar un valor, tienen al lado y entre parntesis la palabra (Asignable).

MENSAJES -------autolife (Asignable) Es una variable lgica, si su valor es verdadero .T. (valor por defecto), en la estabilizacin se resalta la celda actual. cargo (Asignable) Es una variable de cualquier tipo que esta a disposicin del usuario. colCount Es una variable numrica que indica el nmero total de columnas del objeto TBrowse. colorSpec (Asignable) Es una variable de tipo carcter que define los colores para el TBrowse. El valor por defecto es el color actual de SetColor(). colPos (Asignable) Es una variable numrica que indica la columna actual donde est situado el cursor. colSep (Asignable) Es una variable de tipo carcter que contiene una cadena que utilizaremos como separador de columnas de los objetos TBColumn. footSep (Asignable) Es una variable de tipo carcter que contiene una cadena que utilizaremos como separador de pie para los objetos TBColumn. freeze (Asignable) Es una variable numrica que indica el nmero de columnas a bloquear en la parte izquierda de la pantalla.

goBottomBlock (Asignable) Es un CodeBlock que se ejecuta al llamar al mtodo goBottom() o a una funcin definida por el usuario, para indicar cual es el ltimo registro visualizable. goTopBlock (Asignable) Es un CodeBlock que se ejecuta al llamar al mtodo goTop() o a una funcin definida por el usuario, para indicar el primer registro visualizable. headSep (Asignable) Es una variable de tipo carcter que contiene una cadena que define un separador de cabecera para los objetos TBColumn. hitBottom (Asignable) Es una variable lgica que devuelve verdadero (.T.) si hemos intentado pasar del final de los datos o devuelve falso (.F.), en caso contrario. hitTop (Asignable) Es una variable lgica que devuelve verdadero (.T.) si hemos intentado pasar del principio de los datos o falso (.F.), en caso contrario. leftVisible Es una variable numrica que devuelve el nmero de la columna visible sin bloquear situada ms a la izquierda en la pantalla de visualizacin. nBottom (Asignable) Es una variable numrica que devuelve la fila inferior de la pantalla utilizada para la visualizacin del objeto Tbrowse. nLeft (Asignable) Es una variable numrica que indica el nmero de la columna de pantalla situada a la izquierda utilizada para la visualizacin de datos del objeto Tbrowse.

nRight (Asignable) Es una variable numrica que devuelve el nmero de la columna de pantalla ms a la derecha utilizada para la visualizacin de los datos del objeto Tbrowse. nTop (Asignable) Es una variable numrica que devuelve el nmero de la fila superior de la pantalla utilizada para la visualizacin de los datos del objeto TBrowse. rightVisible Es una variable numrica que devuelve el nmero de la columna visible sin bloqueo situada ms a la derecha en la pantalla de visualizacin. rowCount Es una variable numrica que devuelve el nmero total de filas de datos que se pueden mostrar sin incluir cabeceras, pies ni separadores. rowPos (Asignable) Es una variable numrica que devuelve el nmero de la fila de datos en la que se encuentra situado el cursor. Su numeracin empieza desde 1, para la primera fila de datos. skipBlock (Asignable) Es un CodeBlock que se utiliza en la estabilizacin para indicar el nmero de registros que saltar (SKIP) el puntero de datos, hacia adelante o hacia atrs. stable (Asignable) Es una variable lgica que devuelve verdadero (.T.) si el objeto TBrowse esta estable o falso (.F.) en caso contrario. La estabilizacin se realiza con el comando stabilize().

METODOS DE LA CLASE TBROWSE Notas: Con ( -> ) indico el valor que devuelve el mtodo. Los que se devuelven a s mismo, no se han asignar a ninguna variable. METODO CONSTRUCTOR -----------------TBrowseNew( <nSup>, <nIzd>, <nInf>, <nDer> ) -> oTBrowse

Devuelve un nuevo objeto TBrowse con los valores de las coordenadas especificados, pero sin columnas ni CodeBlocks para la ubicacin de los datos.
TBrowseDB( <nSup>, <nIzd>, <nInf>, <nDer> ) -> oTBrowse

Devuelve un nuevo objeto Tbrowse con los valores de las coordenadas especificados y los CodeBlocks de salto por defecto para los datos, pero sin objetos de columna. METODOS ASOCIADOS ----------------addColumn( <oColumna> ) -> s mismo Aade un nuevo objeto TBColumn al objeto TBrowse y aumenta en uno la variable colCount. colorRect( <anRect>, <acColores> ) -> s mismo Altera el color de un grupo rectangular de celdas. <anRect> es un array numrico que contiene las coordenadas del rea de las celdas (superior, inferior, izquierda y derecha).

<acColores> es un array numrico, se corresponden con el ndice de colores actual, y el primero indicar el color normal y el segundo el color resaltado de las celdas. colWidth( <nColumna> ) -> nAncho
Devuelve el ancho de pantalla del nmero de columna indicado

<nColumna>. configure() -> s mismo Hace que el objeto TBrowse vuelva a examinar todos los mensajes y objetos TBColumn, y que reconfigure sus valores internos, si es necesario. deHilite() -> s mismo Hace que la celda actual no se resalte. Tomando la variable autolite el valor de falso (.F.). delColumn( <nPos> ) -> oColumna Borra una columna del objeto TBrowse. El valor devuelto es el que se ha borrado. down() -> s mismo Desplaza el cursor una fila abajo. En caso de estar al final, se nos impide el paso (a no ser que utilizemos nuestras propias funciones de salto), y la variable hitBottom toma el valor de verdadero (.T.). end() -> s mismo Desplaza el cursor a la columna de datos ms a la derecha de la pantalla actual.

getColumn( <nColumna> ) -> oColumna


Devuelve el objeto TBcolumn especificado por <nColumna>.

goBottom() -> s mismo Vamos al final del fichero. Esto se consigue al evaluar el CodeBlock, goBottomBlock. goTop() -> s mismo Vamos al principio del fichero, al evaluar el CodeBlock, goTopBlock. hilite() -> s mismo Resalta la celda actual. Quedando la variable autoLite como falsa (.F.). home() -> s mismo Desplaza el cursor a la columna sin bloquear situada ms a la izquierda de la pantalla. insColumn( <nPos>, <oColumna> ) -> oColumna Inserta un objeto columna en la posicin indicada de la tabla de visualizacin. Devuelve el objeto columna insertado. invalidate() -> s mismo Hace que en la siguiente estabilizacin se dibuje toda la pantalla del TBrowse, incluyendo cabeceras, pies y todos los datos, estos ltimos se renuevan con el mtodo refreshAll(). left() -> s mismo
Mueve el cursor una columna de datos ms a la izquierda.

pageDown() -> s mismo Desplaza el cursor una pantalla de datos hacia abajo. Si llegamos al final, la variable hitBottom, se establece como verdadera (.T.). pageUp() -> s mismo Desplaza el cursor una pantalla de datos hacia arriba. Si no situamos al principio, la variable hitTop, se establece como verdadera (.T.). panEnd() -> s mismo Mueve el cursor a la ltima columna ms a la derecha de la tabla. panHome() -> s mismo Mueve el cursor a la primera columna ms a la izquierda de la tabla. panLeft() -> s mismo Desplaza la pantalla hacia la izquierda sin cambiar la columna del cursor, si es posible. panRight() -> s mismo Desplaza la pantalla hacia la derecha sin cambiar la columna del cursor, si es posible. refreshAll() -> s mismo Hace que en la prxima estabilizacin se vuelvan a cargar y a mostrar todas las filas de datos.

refreshCurrent() -> s mismo Hace que en la prxima estabilizacin se vuelva a cargar y a mostrar la fila de datos actual. right() -> s mismo Mueve el cursor una columna de datos a la derecha. setColumn( <nColumna>, <oNuevaColumna> ) -> oColumnaActual Sustituye el objeto TBColumn indicado por <nColumna> por el objeto TBColumn especificado por <oNuevaColumna>. Devolviendo el objeto TBColumn actual. stabilize() -> lEstable Fuerza la estabilizacin del objeto TBrowse. Si el objeto TBrowse esta estable devuelve un valor verdadero (.T.) o falso (.F.), en caso contrario. up() -> s mismo Desplaza el cursor una fila hacia arriba. Si el cursor se encuentra al principio, la variable hitTop, toma el valor de verdadero (.T.).

LA CLASE TBCOLUMN La clase TBColumn es una clase auxiliar de la clase TBrowse, y se encarga de la creacin de las columnas. Solo tiene mensajes (variables de instancia), a excepcin del mtodo constructor de la clase. METODO CONSTRUCTOR TBColumnNew( <cCabecera>, <bBloque> ) -> oTBColumn Devuelve un nuevo objeto TBColumn con la cabecera y el bloque para la columna. MENSAJES DE LA CLASE TBCOLUMN ================================ block (Asignable)
Es un CodeBlock utilizado para leer los datos de la columna.

cargo (Asignable) Es una variable de cualquier tipo que esta a disposicin del usuario. colorBlock (Asignable) Es un CodeBlock que devuelve un array que contiene un par de valores numricos de color, utilizados como ndices de la tabla (array) de colores.

colSep (Asignable) Es una variable de tipo carcter utilizada para dibujar un separador vertical a la izquierda de esta columna. Por defecto se utiliza el valor de colSep, del objeto TBrowse. defColor (Asignable) Es un array numrico que contiene dos valores utilizados como ndices en la tabla de colores del objeto TBrowse para indicar los colores de la pantalla del TBrowse (el primero) y el de la celda actual (el segundo). Estos valores son anulados por los de la variable colorBlock del objeto TBColumn. footing (Asignable) Es una variable de tipo carcter que define el pie para esta columna de datos. footSep (Asignable) Es una varible de tipo carcter que se utiliza para el diseo de lneas horizontales entre los datos y el pie de la columna. Si no tiene valor, se utiliza el valor de footSep del objeto TBrowse. heading (Asignable) Es un valor de tipo carcter que define la cabecera para la columna.

headSep (Asignable) Es una variable de tipo carcter que contiene una cadena de caracteres opcional, utilizada como separador horizontal entre la cabecera y los datos. En caso de no tener valor, se utiliza el de headSep del objeto TBrowse. width (Asignable) Es un valor de tipo numrico que define el ancho de la pantalla para la columna. Si no se indica ningn valor se escoge el mayor valor de entre: 1) La longitud de la cabecera 2) La longitud del pie 3) La longitud de los datos de la primera evalucin de: TBColumn:block. CONSTRUCCION DE TBROWSE Aunque la sintaxis al ser OOPS pueda parecer complicada, para su funcionamiento se requieren una serie de pasos precisos: 1) Creacin el TBrowse y definicin de sus variables. Hemos de indicar las coordenadas del Tbrowse, sus colores, separadores, etc. 2) Aadir las columnas al objeto TBrowse. Mediante el uso de la clase TBColumn.

3) Determinar los lmites del objeto y su movimiento (salto). De esta forma podemos realizar TBrowse con filtrado de datos, sin usar ficheros temporales, y otros efectos especiales. Para ello y mediante el uso de CodeBlocks podemos variar los lmites del objeto Tbrowse, enviando mensajes a las variables goBottomBlock, goTopBlock y skipBlock. 4) Estabilizacin. Se produce cuando el objeto TBrowse ha mostrado los datos y el objeto est dispuesto a recibir ms mensajes. 5) Bucle de toma de decisiones. Donde leemos el teclado y evaluamos si procede o no mandar al objeto la realizacin de una accin. Como lo mejor para comprobar lo anterior, es con la prctica, comprobar y observar el funcionamiento de los siguientes TBrowse sencillos (en el disquet tenis aparte dichos .PRG):
// ----------------------------------------------------------// Programa ..: DEMOTB01.PRG // Descripcin : Demostracin de un TBrowse sencillo. // Notas .....: Podemos utilizar tambin para la construccin // TBrowseNew(), que es de uso general, pero // tendremos que indicar los lmites del objeto // TBrowse (skipBlock, goTopBlock, ...) // Compilacin: clipper demotb01 /n /w // rtlink file demotb01 // -----------------------------------------------------------

#include "InKey.ch" FUNCTION MAIN() LOCAL oTB LOCAL i LOCAL nKey save screen CLS use DIRECCIO index DIRECCIO // Base de datos // Objeto TBrowse // Contador bucle // Control teclado

// Construimos objeto TBrowse ----------------oTB := TBrowseDB( 00, 00, 24, 79 ) // Construimos columnas ----------------------for i := 1 to fCount() oTB:addColumn( TBColumnNew( FieldName( i ), ; FieldBlock( FieldName( i ) ) ) ) next // Bucle principal ---------------------------while .t. // oTB:forceStable() while !oTB:stabilize() end while // Control teclado y mtodos a usar -------nKey := InKey( 0 ) // Estabilizacin total // en CA-Clipper 5.2 // Estabilizacin // = oTB:forceStable()

do case case nKey == K_UP // Arriba oTB:up() case nKey == K_DOWN // Abajo oTB:down() case nKey == K_LEFT // Izquierda oTB:left() case nKey == K_RIGHT // Derecha oTB:right() case nKey == K_PGUP // Pgina adelante oTB:pageUp() case nKey == K_PGDN // Pgina atrs oTB:pageDown() case nKey == K_CTRL_PGUP // Principio fichero oTB:goTop() case nKey == K_CTRL_PGDN // Final fichero oTB:goBottom() case nKey == K_ESC // Salir EXIT end case end while // Fin Bucle principal -----------------------dbCloseArea() restore screen RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Programa ..: DEMOTB02.PRG // Descripcin: Demostracin de un TBrowse sencillo, ms com// pleto. // Con indicacin de colores, separadores, etc. // Compilacin: clipper demotb02 // rtlink file demotb02 // -----------------------------------------------------------

#include "InKey.ch" FUNCTION MAIN() LOCAL oTB LOCAL i LOCAL nKey // Objeto TBrowse // Contador bucle // Control teclado

save screen CLS DispBox( 00, 00, 24, 79, 1, "W+/B,W+/R" ) use DIRECCIO index DIRECCIO // Base de datos // Construimos objeto TBrowse ----------------oTB := TBrowseDB( 01, 01, 23, 78 ) // Colores y separadores ---------------------oTB:colorSpec( "W+/B,W+/R" ) // Colores objeto TBrowse oTB:colSep := " " // Separador de columnas oTB:headSep := "---" // Separador de cabeceras // Construimos columnas ----------------------for i := 1 to fCount() oTB:addColumn( TBColumnNew( FieldName( i ), ; FieldBlock( FieldName( i ) ) ) ) next // Bucle principal ---------------------------while .t. // oTB:forceStable() while !oTB:stabilize() end while // Estabilizacin total // en CA-Clipper 5.2 // Estabilizacin // = oTB:forceStable()

// Control teclado y mtodos a usar -------nKey := InKey( 0 ) do case case nKey == K_UP // Arriba oTB:up() case nKey == K_DOWN // Abajo oTB:down() case nKey == K_LEFT // Izquierda oTB:left() case nKey == K_RIGHT // Derecha oTB:right() case nKey == K_HOME // Primera columna pant. oTB:home() case nKey == K_END // Ultima columna pant. oTB:end() case nKey == K_CTRL_HOME // Primera columna DB oTB:panHome() case nKey == K_CTRL_END // Ultima columna DB oTB:panEnd() case nKey == K_PGUP // Pgina adelante oTB:pageUp() case nKey == K_PGDN // Pgina atrs oTB:pageDown() case nKey == K_CTRL_PGUP // Principio fichero oTB:goTop() case nKey == K_CTRL_PGDN // Final fichero oTB:goBottom() case nKey == K_ESC // Salir EXIT end case end while // Fin Bucle principal -----------------------dbCloseArea() restore screen

RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Programa ..: DEMOTB03.PRG // Descripcin: Demostracin de un TBrowse sencillo, ms com// pleto. Pero de uso general. // Compilacin: clipper demotb03 // rtlink file demotb03 // ----------------------------------------------------------#include "InKey.ch" FUNCTION MAIN() // Arrays con los ttulos y los nombres de campos LOCAL acTitulos := { "Nombre", "Direccin", "Poblacin", ; "Telfono", "FAX" }
LOCAL acCampos := { "NOMBRE", "DIRECCION", "POBLACION", ;

"TELEFONO", "FAX" } use DIRECCIO index DIRECCIO // Base de datos dbBrowse( 00, 00, 24, 79, acTitulos, acCampos ) dbCloseArea() RETURN NIL // ----------------------------------------------------------// ----------------------------------------------------------// Funcin ...: dbBrowse // Descripcin: Funcin genrica de visualizacin bases datos. // Parmetros : nTop => Coordenada fila superior derecha // nLeft => Coordenada columna superior izda. // nBottom => Coordenada fila inferior derecha // nRight => Coordenada columna inferior derecha // acTitles => Array con los ttulos de columnas // acFields => Array con los campos para columnas

// Devuelve ..: NIL // ---------------------------------------------------------FUNCTION dbBrowse( nTop, nLeft, nBottom, nRight, acTitles, ; acFields ) LOCAL oTB LOCAL i LOCAL nKey save screen // Ventana -----------------------------------DispBox( nTop, nLeft, nBottom, nRight, 1, "W+/B,W+/R" ) // Construimos objeto TBrowse ----------------oTB := TBrowseDB( nTop + 1, nLeft + 1, nBottom - 1, ; nRight - 1 ) // Colores y separadores ---------------------oTB:colorSpec( "W+/B,W+/R" ) // Colores objeto TBrowse oTB:colSep := " " // Separador de columnas oTB:headSep := "---" // Separador de cabeceras // Construimos columnas ----------------------for i := 1 to len( acFields ) oTB:addColumn( TBColumnNew( acTitles[ i ], ; FieldBlock( acFields[ i ] ) ) ) next // Bucle principal ---------------------------while .t. // oTB:forceStable() while !oTB:stabilize() // Estabilizacin total // en CA-Clipper 5.2 // Estabilizacin // = oTB:forceStable() // Objeto TBrowse // Contador bucle // Control teclado

end while // Control teclado y mtodos a usar -------nKey := InKey( 0 ) do case case nKey == K_UP // Arriba oTB:up() case nKey == K_DOWN // Abajo oTB:down() case nKey == K_LEFT // Izquierda oTB:left() case nKey == K_RIGHT // Derecha oTB:right() case nKey == K_HOME // Primera columna pant. oTB:home() case nKey == K_END // Ultima columna pant. oTB:end() case nKey == K_CTRL_HOME // Primera columna DB oTB:panHome() case nKey == K_CTRL_END // Ultima columna DB oTB:panEnd() case nKey == K_PGUP // Pgina adelante oTB:pageUp() case nKey == K_PGDN // Pgina atrs oTB:pageDown() case nKey == K_CTRL_PGUP // Principio fichero oTB:goTop() case nKey == K_CTRL_PGDN // Final fichero oTB:goBottom() case nKey == K_ESC // Salir EXIT end case end while // Fin Bucle principal -----------------------restore screen

RETURN NIL // -----------------------------------------------------------

CAP N6 : PROGRAMACION EN RED LOCAL Introduccin Una Red Local o LAN (Local Area Network), es un sistema de transmisin de datos que permite compartir recursos e informacin por medio de ordenadores o redes de ordenadores. Dependiendo del dispositivo de transmisin (par trenzado, cable coaxial de banda base, coaxial de banda ancha y/o fibra ptica) pueden sobrepasar una distancia de 3 Km., y cuentan con una elevada velocidad de transmisin. Las redes locales son sistemas fiables, y flexibles, ya que es el usuario quien administra y controla el sistema, y conllevan un aumento de productividad (trabajo en equipo) y reduccin de los costes de hardware (al compartir recursos). En una Red hay distinguir dos entidades fundamentales: - SERVIDOR, es el equipo que se encarga del control de los ficheros compartidos de la red, y de la correcta circulacin de la informacin a travs de ella. - CLIENTE, es el/los equipos que acceden a la informacin anterior.

Tipologa de Redes Locales La Topologa es la forma geomtrica de colocar las estaciones y los cables que las conectan. Formas posibles de conexin --------------------------- Punto a punto: se unen dos estaciones o nodos contiguos (peer to peer) de forma directa. - Multipunto : - Lgica : dos o ms estaciones comparten un mismo cable. las estaciones se comunican entre s, tanto si hay o no conexin fsica entre ellas.

Tipos de Topologa ------------------ En bus o rbol (conexin multipunto): Las estaciones comparten un mismo canal de comunicacin.

- En anillo

(conexin punto a punto):

Las estaciones se conectan formando un anillo, y ninguna controla la red.

- En estrella

(conexin punto a punto):

Donde todas las estaciones estan conectadas a un nodo central, pero no estan conectadas entre s.

CENTRAL

Utilizacin -----------

BUS
APLICACION

ANILLO

ESTRELLA
Servicios de voz y datos

Redes pequeas Redes pequeas, o con poco trfico elevado, trfico distancias cortas Sencilla Hard complicado

COMPLEJIDAD

Complicada

RESPUESTA

Aceptable, trfico bajo

Aceptable, trfico alto

Segn potencia NODO CENTRAL Si falla un NODO no afecta, si no es el NODO CENTRAL

FIABILIDAD

Si falla un NODO no afecta a la red

Si falla un NODO no afecta, si no es el NODO CENTRAL

EXPANSION

Segn potencia NODO CENTRAL

Montaje de Redes Locales El montaje que he realizado es el ms simple posible, es la conexin de dos ordenadores en red mediante tipologa tipo BUS. Para ello se requiere: - 2 Paquetes de software de NetWare Lite de Novell, y la documentacin. Uno para cada mquina. ideal para conectar de 2 a 25 mquinas. Existe otra versin econmica la Novell Personal NetWare que admite hasta 50 mquinas, y que es compatible con versiones superiores. - 2 Tarjetas de Red (16 bits - 10 Mb./s.), compatibles con la especificacin de Novell, NE-2000. - 1 Cable coaxial banda base de los metros necesarios, para grandes distancias utilizar los coaxiales de banda ancha. - 2 Conectores en T. - 2 Terminadores, para cerrar el canal de comunicacin, uno si puede ser con toma de tierra.

Tarjeta

Tarjeta

Terminador

Cable

Conector

Instalacin Software de Red La instalacin del software es relativamente sencilla. 1) Insertar disquet en A:, y arrancar el INSTALL.EXE 2) Determinar si utilizaremos el ordenador como servidor, cliente o servidor/cliente. 3) Asignarle un nombre. 4) Confirmar cambios que se harn en el AUTOEXEC.BAT y CONFIG.SYS (path, lastdrive, buffers, etc.) 5) Seleccionar driver de tarjeta (compatible), hay varias. 6) Indicar interrupcin y puerto tarjeta, por defecto: INT 3 y PORT 300. Notas: Pueden surgir problemas, si teneis algn otro dispositivo que utilice el mismo puerto, direccin, etc. que la tarjeta de red, por lo que habr que cambiar los JUMPERS de alguno. JUMPERS Segn la posicin en que esten indican : ON/OFF

Arranque y Configuracin Arranque Si se han realizado cambios en el AUTOEXEC.BAT, automticamente seactiva el software de red, en caso contrario proceder as: CD NWLITE STARTNET NET LOGIN SUPERVISOR Notas: Para que los usuarios CLIENTE puedan trabajar, lgicamente el SERVIDOR tiene que estar activo. Configuracin ------------Una vez completada la informacin, se ha de especificar los recursos de la red, los usuarios que aceeden a ella, donde esta la informacin, etc. El proceso es relativamente fcil, y solo tendremos que variarlo cada vez que haya cambios de equipos, usuarios, etc., en la red. Para ello escriba NET, le aparecer lo siguiente: - Asignar unidades lgicas Cada directorio de red tendr asignada una unidad lgica, cuyo nmero depende de lo indicado con el mandato LASTDRIVE en el CONFIG.SYS, tendr adems un servidor y unos privilegios.

Los directorios de red se crean desde la opcin "Supervisar la red", y constan de:
Ejemplo ---------------------* Un nombre (mximo 15 caracteres) : FACTURACION * Una va de acceso (mximo 40) : C:\GESTION\FACTURA * Derechos de acceso (por defecto ) : TODOS * Lista de usuarios con derecho : <pulsar return> De esta forma indicando la unidad lgica (f:, g:, h:, etc.), accederemos a los datos y programas que se encuentren en l, olvidandonos de recordar las dichosas vas de acceso. - Comunicacin con usuarios Para el envo y recepcin de mensajes. - Imprimir Capturar puertos de impresin, creados desde la opcin "Supervisar la red". - Presentar su cuenta de usuario Informa sobre la cuenta (nombre, contrasea, privilegios, etc.). - Supervisar la red Muestra informacin sobre el estado del servidor, registros de auditora, registros de error, etc., y permite crear directorios de red, usuarios, e impresoras de red.

Notas: Si la configuracin es correcta, y el sistema funciona, podemos grabarlo mediante el comando net save, que crea un fichero BAT de nombre NLLOGIN.BAT que utilizaremos en lugar del NET LOGIN. Software de Red - NetWare Lite Bsicamente esta compuesto por tres programas: - SERVER.EXE Convierte a la estacin de trabajo en servidor. - CLIENT.EXE Convierte a la estacin de trabajo en cliente, pudiendo acceder a datos y dispositivos de las estaciones servidoras. - NET.EXE Es el programa que permite interactuar con la red. Mandatos
-------net audit -> Escribe una anotacin en el registro de auditora de la red (entradas, salidas, comentarios, etc.) net capture -> Enva las tareas de impresin a una impresora de la red.

net help net info

-> Ayuda en lnea de los mandatos de red. -> Presenta informacin sobre el Servidor, el Cliente y su nombre.

net login -> Registra la entrada en la red. net logout -> Registra la salida de la red. net map net ndlist net nplist net print -> Ejecuta tareas relativas a la asignacin de unidades lgicas. -> Muestra los directorios de red. -> Muestra las impresoras de red. -> Imprime un archivo.

net receive -> Controla la recepcin de mensajes en nuestra estacin (ON/OFF). net save net send -> Graba la configuracin actual en el fichero NLLOGIN.BAT -> Enva mensajes a los usuarios de la red.

net setpass -> Establece nuestra contrasea. net time net ulist -> Sincroniza el reloj del cliente con l del servidor. -> Presenta la lista de usuarios conectados a la red.

Arranque Programas Propios


Para el arranque de programas: 1) Indicar el comando SHARE (compartir y bloquear ficheros) en el AUTOEXEC.BAT del SERVIDOR, como mnimo. 2) Poner todos los programas (*.BAT, *.COM, *.EXE y *.OVL) a utilizar como READONLY (slo lectura), mediante el comando ATTRIB. Por lo que para compilar y enlazar tendremos que tener un .BAT, ms o menos as: REM Desactivar atributo READONLY para que al compilar se borre REM el ejecutable anterior ATTRIB -R programa.exe REM Compilar y linkar CLIPPER programa /n /w IF NOT ERRORLEVEL 1 RTLINK FILE programa REM Poner el atributo a READONLY, para su ejecucin en Red IF NOT ERRORLEVEL ATTRIB +R programa.exe

Funciones y Comandos de Red CA-Clipper nos proporciona las siguientes funciones para la programacin en Red: * Acceso Compartido. Dos o ms usuarios pueden abrir simultneamente el mismo fichero. USE [ <xcBasedeDatos> [ INDEX <xcListaIndices> ] [ ALIAS <xcAlias> ] [ EXCLUSIVE | SHARED ] [ NEW ] [ READONLY ] [ VIA <cControladorBasedeDatos> ] ] Los ficheros ndice no se han de abrir junto con el USE, sino que hay que esperar a poder abrir la Base de Datos, para luego que los ndices se abrn en el mismo modo, mediante el comando: SET INDEX TO [ <xcListaIndices> ] * Acceso Exclusivo. Impide que otros usuarios puedan abrir al mismo tiempo el mismo fichero. USE [ <xcBasedeDatos> [ INDEX <xcListaIndices> ] [ ALIAS <xcAlias> ] [ EXCLUSIVE | SHARED ] [ NEW ] [ READONLY ] [ VIA <cControladorBasedeDatos> ] ] * Bloqueo Lgico de Ficheros. Impide que otros usuarios actualizen el mismo fichero a la vez.

rLock() <alias>->( rLock() )


* Verificacin del Estado de Bloqueo de Fichero y Registro. Tanto fLock(), como rLock(), devuelven un valor lgico sobre el xito (.T.) o no (.F.) del bloqueo. * Liberacin de los Bloqueos de Fichero y Registro. Devolviendolos al estado de compartidos.

dbUnLock() -> Liberacin de la rea actual. dbUnLockAll() -> Liberacin de todas las reas. UNLOCK [ALL] * Redireccin de Impresora. Para la comparticin de impresoras. SET PRINTER TO <xcDispositivo | xcFichero> * Verificacin de Errores de Red. Mediante NetErr(), que devuelve (.T.) s se produce un error, y (.F.) en caso contrario. * Nombre Estacin Trabajo. La funcin NetName(), devuelve el nombre de la estacin de trabajo o una cadena nula, si no estamos en red. NetName()

Comandos que podemos utilizar en modo Compartido

-----------------------------------------------APPEND FROM CREATE FROM LABEL FROM REPORT FROM RESTORE FROM TYPE UPDATE FROM MemoRead()

Comandos a utilizar en modo Exclusivo


------------------------------------COPY STRUCTURE TO COPY TO CREATE INDEX JOIN TO PACK REINDEX SAVE TO SET ALTERNATE TO SORT TO TOTAL TO ZAP MemoWrit()

Notas: Para forzar las actualizaciones de registros y ficheros, hemos de utilizar las funciones dbCommit(), y dbCommitAll().

Reglas de Programacin en Red Jerarqua de Bloqueo -------------------* Modo Exclusivo * Bloqueo Fichero * Bloqueo Registro Dependiendo de la tarea a realizar, puede que tenga que abrir los ficheros en modo exclusivo ( PACK, REINDEX, etc. ), pero en la mayora de operaciones normales bastar con el bloqueo momentneo del fichero y/o del registro. Apertura de Ficheros -------------------1) Abrir fichero en modo compartido. 2) Si no se produce error, abrir los ficheros ndice. USE fichero NEW SHARED
IF !NetErr() SET INDEX TO indices ELSE QOut( "Error: Apertura Fichero en modo Compartido" ) ENDIF

Aadir Registros ---------------Por defecto la funcin dbAppend() o el mandato APPEND BLANK, bloquean automticamente el registro en red. 1) Aadir registro vaco. 2) Si no se produce error, grabar datos. dbAppend() IF !NetErr() // Grabar Datos ENDIF En las altas de registros hemos de tener en cuenta la posibilidad de que otros usuarios esten asignando el mismo nmero de cdigo, y que mientrs este en memoria, no se grabar al disco duro, para evitar duplicidades hemos de crear un fichero contador al que aadiremos los cdigos de altas que se producen, y cuando se grabe el registro, lo borraremos del contador, as para cada nueva alta haremos un SEEK, de la Base de Datos principal, y de la de CONTADORES para asegurarnos que estamnos ante un nuevo y nico cdigo. Borrar Registros ---------------1) Bloquear registro (o fichero). 2) Borrar. 3) Desbloquear.

Para el borrado de registros con dbDelete() o DELETE, y/o su recuperacin con dbRecall() o RECALL, es necesario bloquear el registro si slo operamos con uno o el fichero si tenemos que borrar y/o recuperar varios.
// Un registro IF rLock() dbDelete() dbUnLock() ENDIF // Varios Registros IF fLock() DELETE FOR PAGADO = "S" dbUnLock() ENDIF

Modificar Registros ------------------En la modificacin tambin hemos de tener en cuenta si operaremos con un registro (bloqueo con rLock()) o con varios (bloqueo con fLock()). 1) Bloquear registro (o fichero). 2) Cargar registro en variables. 3) Modificar variables. 4) Grabar datos. 5) Desbloquear. IF rLock() cNombre := Field->NOMBRE @ 05,10 SAY "Nombre: " GET cNombre READ REPLACE Field->NOMBRE WITH cNombre READ dbUnLock() ENDIF

El nico inconveniente es que tendremos bloqueado el registro hasta que realicemos los cambios oportunos. Una solucin sera la siguiente: 1) Bloquear registro. 2) Cargar registro en variables. 3) Desbloquear. 4) Modificar variables. 5) Bloquear registro. 6) Grabar datos. 7) Desbloquear. Pero tiene el inconveniente de que cas simultaneamente se pueden modificar los datos por varios usuarios. Otro grave problema en programas de gestin en red es la necesidad de actualizar datos desde una factura a stocks, artculos, etc., con la probabilidad de que estos esten bloqueados, y no se actualizen o quede el programa en bucle intentando la actualizacin, por lo que problemas no nos faltarn. Una solucin sera bloquear todos los registros necesarios al facturar, pero y si la factura es nueva o aadimos ms artculos. Otra solucin ms drstica pero menos problemtica es bloquear los ficheros a utilizar, con el inconveniente de que el resto de usuarios slo podrn leer los registros.

Otro punto muerto a eliminar, es impedir que los usuarios bloqueen registros y ficheros, y dejen el trabajo en pantalla sin terminar, por lo tanto, no poner nunca InKey( 0 ), sino que indicar los segundos de espera, y en los GETs variar la funcin GetReader(), ver GETSYS.PRG, por la siguiente, donde controlamos el tiempo:
/*** * * GetReader() * * Standard modal read of a single GET * */ PROCEDURE GetReader( oGet ) LOCAL nTecla := 0 // NUEVO

// Read the GET if the WHEN condition is satisfied IF ( GetPreValidate( oGet ) ) // Activate the GET for reading oGet:setFocus() WHILE ( oGet:exitState == GE_NOEXIT )

// Check for initial typeout (no editable positions) IF ( oGet:typeOut ) oGet:exitState := GE_ENTER ENDIF

// Apply keystrokes until exit WHILE ( oGet:exitState == GE_NOEXIT )


// Modificado, si pasado el tiempo no pulsamos // forzamos un ESCape para salir. // Antes haba un InKey( 0 ) GetApplyKey( oGet, nTecla := InKey( 120 ) ) IF nTecla = 0 KEYBOARD Chr( K_ESC ) ENDIF ENDDO

// Disallow exit if the VALID condition is not satisfied IF ( !GetPostValidate( oGet ) )


oGet:exitState := GE_NOEXIT ENDIF ENDDO // De-activate the GET oGet:killFocus() ENDIF RETURN

TBrowse y compaa -----------------Dada la posibilidad de que desde TBrowse, Browse() y/o dbEdit(), podemos modificar registros, es recomendable bloquear la Base de Datos con fLock(), o tomar nosotros el control y bloquear si podemos el registro que se quiere modificar.

Impresin --------Para imprimir hay que dirigir la impresin al puerto capturado que utiliza la red.
SET PRINTER TO LPT1 SET PRINTER ON SET DEVICE TO PRINT

@ 00,00 SAY "Estacin: " + NetName() SELECT PRUEBAS dbGoTop() DO WHILE !Eof() @ nFila,00 SAY PRUEBAS->NOMBRE + " - " + PRUEBAS->POBLACION nFila++ dbSkip() ENDDO EJECT SET DEVICE TO SCREEN SET PRINTER OFF SET PRINTER TO ReIndexar --------Para ReIndexar hay que proceder con de la siguiente forma:

1) Bloquear y cerrar Bases de datos. 2) Abrir en modo exclusivo. 3) Crear ficheros ndice. 4) Cerrar. 5) Abrir en modo compartido. // Ejemplo: SELECT PRUEBAS IF fLock() CLOSE SELECT( "PRUEBAS.DBF" ) USE PRUEBAS EXCLUSIVE NEW IF !NetErr() IF File( "PRUEBAS.NTX" ) fErase( "PRUEBAS.NTX" ) ENDIF INDEX ON Field->NUMERO TO PRUEBAS IF NetErr() @ 24,00 SAY "Error Creacin Fichero Indice" ENDIF CLOSE SELECT( "PRUEBAS" ) USE PRUEBAS SHARED NEW dbSetIndex( "PRUEBAS" ) ENDIF ENDIF

Cerrar Bases de Datos --------------------Para cerrar las Bases de Datos en una sesin de trabajo en red, he tenido problemas con las funciones dbCloseArea() / dbCloseAll() (puede que por culpa del ordenador utilizado como servidor), por lo que he seguido el de los ejemplos propuestos en los manuales de CAClipper y no he tenido ningn problema. CLOSE SELECT( "PRUEBAS" ) Control Transacciones (TTS) --------------------------Las transacciones son una serie de mandatos tratados como una sola unidad y que implican cambios en las Bases de Datos. Normalmente se utilizan en aplicaciones en red, pero tambin puede aplicarse a programas monousuario, ya que si se interrumpe un programa a medio actualizar los stocks, los datos que contendr sern erroneos. Lamentablemente CA-Clipper no incorpora un control de transacciones, por lo que tendremos de apoyarnos en libreras de terceros (NovLib, etc.). Sin embargo, dBase, s que incorpora un completo sistema de transacciones compuesto por:

* BEGIN/END TRANSACTION Crea un fichero de trabajo TRANSLOG.LOG donde se acumulan los mandatos de actualizacin, los datos a actualizar quedan marcados de forma especial, pero sin actualizarse an, hasta que no terminemos con END TRANSACCION, momento en que se borra el fichero de trabajo TRANSLOG.LOG. BEGIN TRANSACTION <va> <mandatos> " " END TRANSACTION * ROLLBACK <fichero> Si durante las transacciones se produce un error, la Base de Datos a actualizar queda marcada con prdida de integridad y mediante el comando ROLLBACK, podemos deshacer los cambios realizados antes de producirse el fallo. * Completed() Determina si una transaccin ha terminado. * IsMarked() Detecta marcas de prdidas de integridad en las Bases de Datos.

* RESET [ IN <alias> ] Fuerza el cambio de marca de prdida de integridad. Antes de aplicarlo hay que estar muy seguro. * RollBack() Devuelve .T. cuando el mandato ROLLBACK ms reciente ha terminado de efectuarse, y .F. en caso contrario. Para emular dichos comandos desde CA-Clipper, nos tendramos que apoyar en Base de Datos de Trabajo para almacenar los cambios en registros, para indicar los ficheros bloqueados, los que tienen prdidas de integridad, etc. O incluir opciones de autochequeo que bloqueen las Bases de Datos y realicen inventarios, etc.

PROGAMA EJEMPLO
// --------------------------------------------------------// Programa ..: REDLIB.PRG // Descripcin: Ejemplo de programa para Red Local. // Autor .....: Angel Canudas, 1995 // --------------------------------------------------------Set Procedure to GetSys // GetSys modificado

// --------------------------------------------------------FUNCTION Main() LOCAL nOpcion := 0 LOCAL nNumero := 0 LOCAL GetList := {} // Opcin men // N de Ficha // Para los GETs

// BASE DE DATOS PRINCIPAL, si no existe, la creamos ==== IF !File( "PRUEBAS.DBF" ) dbCreate( "PRUEBAS", { { "NUMERO" , "N", 03, 0 }, ; { "NOMBRE" , "C", 40, 0 }, ; { "DIRECCION" , "C", 40, 0 }, ; { "POBLACION", "C", 40, 0 } } ) USE PRUEBAS EXCLUSIVE INDEX ON Field->NUMERO TO PRUEBAS dbCloseArea() ENDIF // ============================================ // BASE DE DATOS, CONTADOR======================= // Almacenar el ltimo n de ficha que se esta aadiendo, // para evitar duplicaciones IF !File( "CONTADOR.DBF" ) dbCreate( "CONTADOR", { { "NUMERO", "N", 03, 0 } } )

USE CONTADOR EXCLUSIVE INDEX ON Field->NUMERO TO CONTADOR dbCloseArea() ENDIF // ============================================ // Abrimos Bases de Datos en modo compartido ========= IF NetUse( "PRUEBAS", .T., 5 ) dbSetIndex( "PRUEBAS" ) NetUse( "CONTADOR", .T., 5 ) dbSetIndex( "CONTADOR" ) ELSE QOut( "Error: Base de Datos, abierta en modo exclusivo" ) RETURN NIL ENDIF // ============================================== SET DELETED ON // Impedir ver Borrados

CLS @ 01,00 TO 20,79 @ 24,00 SAY Space( 80 ) @ 19,05 SAY "Nombre Estacin Red: " + NetName() // Bucle Principal ================================= DO WHILE .T. @ 22,02 PROMPT " Aadir " @ 22,13 PROMPT " Borrar " @ 22,24 PROMPT " Modif. " @ 22,35 PROMPT " Ver " @ 22,46 PROMPT " Print " @ 22,57 PROMPT " ReIndx." @ 22,68 PROMPT " Salir " MENU TO nOpcion

DO CASE CASE nOpcion = 1 Altas() CASE nOpcion = 2 Bajas() CASE nOpcion = 3 Editar() CASE nOpcion = 4 SELECT PRUEBAS IF NetFileLock( 30 ) Browse() dbUnLock() ENDIF CASE nOpcion = 5 Imprimir() CASE nOpcion = 6 ReIndexar() CASE nOpcion = 7 EXIT ENDCASE ENDDO // ============================================= // SALIDA DEL SISTEMA =========================== dbUnLockAll() // Por si acaso CLOSE SELECT( "PRUEBAS" ) CLOSE SELECT( "CONTADOR" ) // =============================================== CLS QUIT

RETURN NIL // --------------------------------------------------------// --------------------------------------------------------// Funcin ...: Altas // Descripcin : Ejemplo propuesto para las Altas de registros. // Notas .....: El algoritmo propuesto es: // 1) Indicar N de Ficha o Cdigo // 2) Comprobar que ya no este grabado, o que se // este grabando en este momento(SaveContador) // 3) Si no esta grabado,lo grabamos al contador, // y editamoslos datos en variables. // 4) Cuando acabamos aadimos unregistro en // blanco, lo bloqueamos y grabamos el // contenido de las variables. // 5) Desbloqueamos. // 6) Borramos cdigo del contador. // --------------------------------------------------------FUNCTION Altas() LOCAL nNumero := 0 LOCAL cNombre := Space( 40 ) LOCAL cDireccion := Space( 40 ) LOCAL cPoblacion := Space( 40 ) LOCAL GetList := {} // Para los GETs @ 05,05 SAY "Nmero ..: " GET nNumero PICTURE "999" READ SELECT PRUEBAS dbSeek( nNumero ) IF !Found() IF SaveContador( nNumero ) @ 07,05 SAY "Nombre ..: " GET cNombre @ 09,05 SAY "Direccin: " GET cDireccion @ 11,05 SAY "Poblacin: " GET cPoblacion READ

SELECT PRUEBAS IF NetAppend( 5 ) REPLACE PRUEBAS->NUMERO WITH nNumero REPLACE PRUEBAS->NOMBRE WITH cNombre REPLACE PRUEBAS->DIRECCION WITH cDireccion REPLACE PRUEBAS->POBLACION WITH cPoblacion READ dbCommit() dbUnLock() ENDIF DelContador( nNumero ) ENDIF ELSE Alert( " ATENCION !;;ESTE NUMERO YA EXISTE" ) ENDIF RETURN NIL // --------------------------------------------------------// --------------------------------------------------------// Funcin ...: Bajas // Descripcin: Ejemplo propuesto para el Borrado de Registros. // Notas .....: El algoritmo propuesto es: // 1) Indicar N de Ficha o Cdigo // 2) Comprobar de que exista. // 3) Comprobar de que no este bloqueado. // 4) Bloquear. // 5) Borrar. // 6) Desbloquear. // --------------------------------------------------------FUNCTION Bajas() LOCAL nNumero := 0 LOCAL GetList := {} // Para los GETs

@ 05,05 SAY "Nmero ..: " GET nNumero PICTURE "999" READ SELECT PRUEBAS dbSeek( nNumero ) IF Found() IF NetRecLock( 5 ) @ 07,05 SAY "Nombre ..: " + Field->NOMBRE @ 09,05 SAY "Direccin: " + Field->DIRECCION @ 11,05 SAY "Poblacin: " + Field->POBLACION dbDelete() dbUnLock() ENDIF ELSE Alert( " ATENCION !;;ESTE NUMERO NO EXISTE" ) ENDIF RETURN NIL // --------------------------------------------------------// --------------------------------------------------------// Funcin ...: Editar // Descripcin: Ejemplo propuesto para Modificar Registros. // Notas ....: El algoritmo propuesto es: // 1) Indicar N de Ficha o Cdigo // 2) Comprobar de que exista. // 3) Comprobar de que no este bloqueado. // 4) Bloquear. // 5) Modificar. // 6) Desbloquear. // Se podran hacer las modificaciones sobre // variables. // --------------------------------------------------------FUNCTION Editar() LOCAL nNumero := 0 LOCAL GetList := {} // Para los GETs

@ 05,05 SAY "Nmero ..: " GET nNumero PICTURE "999" READ SELECT PRUEBAS dbSeek( nNumero ) IF Found() IF NetRecLock( 5 ) @ 07,05 SAY "Nombre ..: " GET Field->NOMBRE @ 09,05 SAY "Direccin: " GET Field->DIRECCION @ 11,05 SAY "Poblacin: " GET Field->POBLACION READ dbCommit() dbUnLock() ENDIF ELSE Alert( " ATENCION !;;ESTE NUMERO NO EXISTE" ) ENDIF RETURN NIL // --------------------------------------------------------// --------------------------------------------------------// Funcin ...: Imprimir // Descripcin: Enviamos impresin a la impresora de red. // --------------------------------------------------------FUNCTION Imprimir() LOCAL nFila := 2 IF !IsPrinter() IF Alert( " ATENCION !;;CONECTAR IMPRESORA", ; { "No", "S" } ) = 1 RETURN NIL ENDIF ENDIF

SELECT PRUEBAS dbGoTop() SET PRINTER TO LPT1 SET PRINTER ON SET DEVICE TO PRINT @ 00,00 SAY "Estacin: " + NetName() DO WHILE !Eof() @ nFila,00 SAY PRUEBAS->NOMBRE + " - " + ; PRUEBAS->POBLACION nFila++ dbSkip() ENDDO EJECT SET DEVICE TO SCREEN SET PRINTER OFF SET PRINTER TO RETURN NIL // --------------------------------------------------------// --------------------------------------------------------// Funcin ...: SaveContador // Descripcin : Comprueba y graba un nmero al contador. // Parmetros : nNumero -> N a grabar // Devuelve ..: .T. -> Si no existe // .F. -> Si ya existe, entonces error. // Notas .....: Esta funcin es especfica para el ejemplo. // ---------------------------------------------------------

FUNCTION SaveContador( nNumero ) LOCAL GetList := {} SELECT CONTADOR dbSeek( nNumero ) IF !Found() IF NetAppend( 5 ) REPLACE CONTADOR->NUMERO WITH nNumero READ dbUnLock() dbCommit() ENDIF ELSE @ 24,00 SAY PadC( "ESTE NUMERO YA EXISTE", 80 ) ; COLOR "W+/R" RETURN( .F. ) ENDIF RETURN( .T. ) // --------------------------------------------------------// --------------------------------------------------------// Funcin ...: DelContador // Descripcin: Comprueba y borra un nmero del contador. // Parmetros : nNumero -> N a borrar // Devuelve ..: .F. -> Si no existe // .T. -> Si ya existe, entonces error. // Notas .....: Esta funcin es especfica para el ejemplo. // --------------------------------------------------------FUNCTION DelContador( nNumero ) SELECT CONTADOR dbSeek( nNumero ) IF Found() IF NetRecLock( 5 ) dbDelete() dbUnLock()

RETURN( .T. ) ENDIF ENDIF RETURN( .F. ) // --------------------------------------------------------// --------------------------------------------------------// Funcin ...: ReIndexar() // Descripcin: Vuelve a crear los ficheros ndice. // Notas .....: 1) Bloquear y cerrar Bases de datos. // 2) Abrir en modo exclusivo. // 3) Crear ficheros ndice. // 4) Cerrar. // 5) Abrir en modo compartido. // --------------------------------------------------------FUNCTION ReIndexar()
@ 24,00 SAY PadC( " Espere por favor, ReIndexando ", 80 )

SELECT PRUEBAS IF NetFileLock( 30 ) CLOSE SELECT( "PRUEBAS.DBF" ) USE PRUEBAS EXCLUSIVE NEW PACK IF !NetErr() IF File( "PRUEBAS.NTX" ) fErase( "PRUEBAS.NTX" ) ENDIF INDEX ON Field->NUMERO TO PRUEBAS IF NetErr() @ 24,00 SAY "Error Creacin Fichero Indice"

ENDIF CLOSE SELECT( "PRUEBAS" ) USE PRUEBAS SHARED NEW dbSetIndex( "PRUEBAS" ) ENDIF ENDIF SELECT CONTADOR IF NetFileLock( 30 ) CLOSE SELECT( "CONTADOR" ) USE CONTADOR EXCLUSIVE NEW PACK IF !NetErr() IF File( "CONTADOR.NTX" ) fErase( "CONTADOR.NTX" ) ENDIF INDEX ON Field->NUMERO TO CONTADOR IF NetErr() @ 24,00 SAY "Error Creacin Fichero Indice" ENDIF CLOSE SELECT( "CONTADOR" ) USE CONTADOR SHARED NEW dbSetIndex( "CONTADOR" ) ENDIF ENDIF @ 24,00 SAY Space( 80 )

RETURN NIL // --------------------------------------------------------// ********************************************************* // F U N C I O N E S D E P R O P O S I T O G E N E R A L // // Todas muestran en la lnea 24, un tiempo de espera para que // el usuario no piense que el sistema se ha colgado, y si // pasado este tiempo no se ha podido bloquear, se muestra una // caja de dilogo por si se quiere repetir otra vez, o salir. // ********************************************************* // --------------------------------------------------------// Funcin ...: NetUse // Descripcin : Abre una Base de Datos,en modo EXCLUSIVE (.F.), // o SHARED (.T.), y con un determinado tiempo // para intentar abrirlo (se produce en el caso // de ser SHARED) // Parmetros : cDbf -> Nombre Base de Datos // lShared -> SHARED (.T.), EXCLUSIVE (.F.) // nSegundos -> N de Segundos // Devuelve ..: .T. -> Si se ha podido abrir. // .F. -> Si no se ha podido abrir. // --------------------------------------------------------FUNCTION NetUse( cDbf, lShared, nSegundos ) LOCAL nTimeIni := Seconds() LOCAL nTimeFin := Seconds() // Tiempo Inicial // Tiempo Final

// CONTROL DE PARAMETROS DE ENTRADA ========== If cDbf = NIL .OR. !File( cDbf + ".DBF" )
Alert( "NOMBRE INCORRECTO;o;BASE DE DATOS NO HALLADA" )

RETURN( .F. ) ENDIF IIf( lShared = NIL, lShared := .F., lShared ) IIf( nSegundos = NIL, nSegundos := 0, nSegundos ) // ============================================

DO WHILE ( ( nTimeFin - nTimeIni ) < nSegundos ) IF lShared = .T. USE ( cDbf ) SHARED NEW ELSE USE ( cDbf ) EXCLUSIVE NEW ENDIF IF !NetErr() RETURN( .T. ) ENDIF InKey( 0.5 ) nTimeFin := Seconds() TimeBar( nSegundos, Int( nTimeFin - nTimeIni ) ) // Si no podemos abrir, solicitar repeticin IF ( nTimeFin - nTimeIni ) >= nSegundos IF Alert( "IMPOSIBLE ABRIR;;REPETIR", ; { "No", "S" } ) = 2 nTimeIni := Seconds() ENDIF ENDIF ENDDO RETURN( .F. ) // --------------------------------------------------------// --------------------------------------------------------// Funci n ...: NetAppend // Descripcin: Adicin de registros en red local. // Funcin ...: NetAppend // Descripcin : Adicin de registros en red local. // Parmetros : nSegundos -> N de Segundos

// Devuelve ..: .T. -> Si se ha podido aadir. // .F. -> Si no se ha podido aadir. // --------------------------------------------------------FUNCTION NetAppend( nSegundos ) LOCAL nTimeIni := Seconds() LOCAL nTimeFin := Seconds() // Tiempo Inicial // Tiempo Final

// CONTROL DE PARAMETROS DE ENTRADA ========= IIf( nSegundos = NIL, nSegundos := 0, nSegundos ) // ============================================= DO WHILE ( ( nTimeFin - nTimeIni ) < nSegundos ) dbAppend() IF !NetErr() rLock() RETURN( .T. ) ENDIF InKey( 0.5 ) nTimeFin := Seconds() TimeBar( nSegundos, Int( nTimeFin - nTimeIni ) ) // Si no podemos aadir, solicitar repeticin IF ( nTimeFin - nTimeIni ) >= nSegundos
IF Alert( "IMPOSIBLE AADIR REGISTRO;;REPETIR", ;

{ "No", "S" } ) = 2 nTimeIni := Seconds() ENDIF ENDIF ENDDO

RETURN( .F. ) // --------------------------------------------------------// --------------------------------------------------------// Funcin ...: NetFileLock // Descripcin: Bloquea una Base de Datos abierta y compartida. // Parmetros: nSegundos -> N de Segundos // Devuelve ..: .T. -> Si se ha podido bloquear. // .F. -> Si no se ha podido bloquear. // --------------------------------------------------------FUNCTION NetFileLock( nSegundos ) LOCAL nTimeIni := Seconds() LOCAL nTimeFin := Seconds() // Tiempo Inicial // Tiempo Final

// CONTROL DE PARAMETROS DE ENTRADA =========== IIf( nSegundos = NIL, nSegundos := 0, nSegundos ) // ============================================= DO WHILE ( ( nTimeFin - nTimeIni ) < nSegundos ) IF fLock() RETURN( .T. ) ENDIF InKey( 0.5 ) nTimeFin := Seconds() TimeBar( nSegundos, Int( nTimeFin - nTimeIni ) ) // Si no podemos bloquear fichero, solicitar repeticin IF ( nTimeFin - nTimeIni ) >= nSegundos
IF Alert( "IMPOSIBLE BLOQUEAR FICHERO " + Alias() + ; ";;REPETIR", { "No", "S" } ) = 2 nTimeIni := Seconds()

ENDIF ENDIF ENDDO RETURN( .F. ) // --------------------------------------------------------// --------------------------------------------------------// Funcin ...: NetRecLock // Descripcin: Bloquea un registro de una Base de Datos // abierta en modo compartido. // Parmetros : nSegundos -> N de Segundos // Devuelve ..: .T. -> Si se ha podido bloquear. // .F. -> Si no se ha podido bloquear. // --------------------------------------------------------FUNCTION NetRecLock( nSegundos ) LOCAL nTimeIni := Seconds() LOCAL nTimeFin := Seconds() // Tiempo Inicial // Tiempo Final

// CONTROL DE PARAMETROS DE ENTRADA========== IIf( nSegundos = NIL, nSegundos := 0, nSegundos ) // ========================================== DO WHILE ( ( nTimeFin - nTimeIni ) < nSegundos ) IF rLock() RETURN( .T. ) ENDIF InKey( 0.5 ) nTimeFin := Seconds() TimeBar( nSegundos, Int( nTimeFin - nTimeIni ) )

// Si no podemos bloquear registro, solicitar repeticin IF ( nTimeFin - nTimeIni ) >= nSegundos


IF Alert( "IMPOSIBLE BLOQUEAR REGISTRO;;REPETIR", ;

{ "No", "S" } ) = 2 nTimeIni := Seconds() ENDIF ENDIF ENDDO RETURN( .F. ) // --------------------------------------------------------// --------------------------------------------------------// Funcin ....: TimeBar // Descripcin : Visualiza una barra horizontal para control de // tiempo de procesos. // Parmetros .: nMax -> El valor mximo (100%) del proceso. // nActual-> El valor actual. // Devuelve ...: NIL (nada) // Notas ......:Si lo aplica en las opciones de impresin de // sus programas acuerdese de conmutar entre // los modos 'screen' y 'print', es decir: // SET DEVICE TO PRINT // //... imprimir // SET DEVICE TO SCREEN // TimeBar( .... ) // SET DEVICE TO PRINT // --------------------------------------------------------FUNCTION TimeBar( nMax, nActual ) LOCAL nPos := 0 // % Proceso

// nPos -> El % de nActual con respecto a nMax nPos := Int( ( nActual * 100 ) / nMax ) @ 24,00 SAY Replicate( Chr( 176 ), 80 )

IF nPos > 0 @ 24,00 SAY Replicate( "_" , Int( nPos / 1.25 ) ) ; COLOR "W+/W" @ 24,39 SAY AllTrim( Str( nPos ) ) + "%" COLOR "N/W" ENDIF RETURN Nil // ---------------------------------------------------------

CAP N7 : PROGAMACION WINDOWS CON FIREWIN Introduccin a WINDOWS Windows es un entorno grfico desarrollado y comercializado por Microsoft, que se ha convertido en un estandard (como era de preveer), aunque necesita del MS-DOS para funcionar, pero con a llegada de la nueva versin Windows 95, ser un completo sistema operativo. Este GUI (Interface Grfico de usuario) naci con una filosofa muy clara, facilitar el aprendizaje de los programas a los usuarios al establecer una serie de elementos intuitivos y comunes a todos las aplicaciones para agilizar el dilogo del usuario con los programas. De paso tambin nos facilita el trabajo a los programadores al proveernos de los elementos del interface ya definidos, y no nos tenemos de preocupar de las resoluciones grficas o de los dichosos interface de impresora, adems de conseguir que nuestros programas adquieran aspectos espectaculares.

Introduccin a FiveWin FiveWin es una librera propiedad de Antonio Linares y Francisco Pulpn, que apareci en su versin primera en 1993, y que es el resultado de una evolucin lgica seguida por Antonio Linares con sus productos FivePro, Objects, Dialog, etc. Adems FiveWin, es el camino ms corto y menos traumtico para llegar a Visual Objects for Clipper u otros entornos de programacin similares, tambin es la opcin ms econmica y productiva. Lo que han hecho Antonio Linares y Francisco Pulpn es realmente genial, ya que convierten a nuestro querido Clipper en un compilador Windows, aunque ellos han tenido su trabajo para remodelar o reescribir el sistema de iniciacin, y la gestin de memoria, consiguiendo una perfecta combinacin de Clipper, OOPS y sintaxis xBASE. Arquitectura FiveWin La tecnologia de FiveWin se base en 4 puntos:
- Comandos xBase - Clases y Objetos - Funciones - API Windows <- Mayor productividad. <- Beneficio de la reusabilidad. <- Beneficio de la modularidad. <- El mayor control a bajo nvel.

Caractersticas ms importantes de FiveWin (Extrada de las ayudas de FiveWin) * Comandos xBase para producir facilmente poderosas aplicaciones Microsoft Windows. No necesitamos saber el API de Windows para desarrollar rapidamente aplicaciones profesionales. * Reales producciones de EXEs Windows. No llevasiempre-DLLs No pagar 'royalties' por producir y distribuir EXEs. * Plena Orientacin a Objeto: FiveWin incluye OBJECTS para producir nuevas Clases compatibles con Clipper, y FiveWin ofrece ya cerca de 40 nuevas Clases. Podemos crear nuestras propias clases, incluso heredar las de FiveWin. Podemos utilizar OBJECTS tanto para Windows como para MS-DOS. * Arquitectura enteramente abierta: Antonio Linares y Francisco Pulpn, incluyen todo el cdigo fuente de las CLASES y muchos ejemplos. * Soporta Recursos Windows Standard: RC, RES y DLLs. Los desarrolladores recomiendan el editor de Recursos Borland para programar visual, fcil y rpidamente con FiveWin. Programacin Data Driven. Cambiar de interface sin cambiar el cdigo.

* Soporta el nuevo estilo 3D de Microsoft y tambin el Estilo de las Cajas de Dilogo Borland. * Bitmaps de 256 colores y, carga dinamica de bitmaps desde disco! * Soporta Multimedia: Sonido (ficheros WAV) y Video (ficheros AVI). * Soporta DLL: en tiempo de ejecucin (con sintaxis xBase) y enlace dinmico. * Soporta DDE (Enlace Dinmico de Datos) con sintaxis xBase. Lo que nos permite, por ejemplo, disear los listados con un generador de informes (la mayora disponen de un runtime distribuible). * Soporta MDI usando sintaxis xBase. * Obtener ese aspecto Profesional con Barras de Botones, Barras de Mensajes, y mejora de brochas Windows. * Nueva mejora de la clase TWBrowse con aspecto 3D, y soporte de bitmaps! Los Browses pueden ser usados como controles en las Cajas de Dilogos. Incluir varios de ellos al mismo tiempo. * Usar Cajas de Dilogo standard Windows (Dilogos comunes).Soporte para toda clase de controles Windows con una sencilla sintaxis xBase.

* Soporta ejecucin no Modal: Puede tener varias Cajas de Dilogo ejecutandose al mismo tiempo! * El VMM de Clipper ha sido reemplazado completamente. Ahora solo usaremos los servicios standard de manejo de memoria Windows. FiveWin corre ms rpido que Clipper en DOS. Toda la memoria de su ordenador esta disponible para su programa. * FiveWin ha sido reconocido y galardonado por prestigiosas revistas de programacin e informtica. Compilacin y Enlazado Ante todo, y para evitar errores de compilacin incluya al principio de todos sus fuentes el fichero de cabecera de FiveWin: #include "FiveWin.ch" Y puede que algn otro, como por ejemplo: Report.ch, para los informes. Para mayor informacin observe la ayuda de FiveWin. Compilacin ----------1) Si FiveWin.ch y .ch asociados estan indicado en SET INCLUDE: CLIPPER Test /n/w

2) Si FiveWin esta en el directorio INCLUDE desde donde compilamos: CLIPPER Test /n/w/i..\INCLUDE Enlazado -------FiveWin proporciona las tres siguientes LIBRERIAS: FiveWin.LIB, WinApi.LIB, 501_520.LIB 501_502 es necesaria si usamos el LINK de Microsoft. Para producir EXEs con Fivewin, necesitamos un enlazador Windows, el RtLink y Tlink de Borland no nos sirven. FiveWin es completamente compatible con: Microsoft LINK.EXE versin 5.3 y superiores. Si usa la versin 5.1 tiene que usar una herramienta que se proporciona con FiveWin, llamada ExeType.exe para cambiar la versin de Windows en el interior de la cabecera del EXE. Esta utilidad puede encontrarse en el directorio: \source\tools

Microsoft Link Sintaxis: Link /se:700 /NOE <Programa>,,nul, FiveWin WinApi Clipper 501_520, ..\include\FiveWin.def S usa LINK 5.1, despus de linkar ejecutar:: ExeType SuAplicacion.exe 3.1 Blinker 3.x: Blinker fi Programa @FiveWin.lnk Ejemplo Prctico // PROGRAMA: DEMO.PRG #include "FiveWin.ch" FUNCTION Main() LOCAL oWnd // Objeto Ventana // Primera linea

DEFINE WINDOW oWnd FROM 1, 1 TO 20, 60 TITLE "DEMO"

ACTIVATE WINDOW oWnd // Activa Ventana

RETURN NIL Compilacin: BUILD DEMO ---> producir DEMO.EXE NO especificar la extensin .PRG en la llamada a BUILD.BAT: BUILD DEMO (Correcto) BUILD DEMO.prg (Incorrecto) Notas: Compruebe siempre que indicamos el camino correcto de las libreras y ficheros de cabecera.

Distribucin FiveWin es una librera shareware que se va actualizando, y que puede conseguir a travs de una serie de distribuidores autorizados, en BBS y recopilaciones de shareware en CD-ROM. Puede empezar a trabajar con ella desde el primer momento, siendo el coste inicial mnimo, aunque al tratarse de una versin no registrada, constantemente le aparecer una ventana de registro, con un cdigo de registro. Si FiveWin le es de utilidad, previ pago, podr solicitar la clave que anula la ventana de registro, y que le permitir distribuir sus aplicaciones. Una vez tenga el .EXE definitivo para entregar al cliente, deber de desprotegerlo con el programa EXEREG (compilar el EXEREG.PRG), indicando su nombre, el camino y nombre del ejecutable, y la clave de registro, ya que no funcionara en el ordenador del cliente. Este sistema de distribucin de nuestros EXEs es un poco engorroso, pero hemos de tener en cuenta que necesario por o siguiente: 1) Siempre estaremos trabajando con la versin completa. 2) Se elimina envos y se agilizan los trmites. 3) Los autores de FiveWin se asegurn de que no circulen copia ilegales.

Componentes CA-Clipper no utilizados Dado que Clipper no estaba pensado para crear aplicaciones Windows, los desarrolladores han tenido que cambiar o inutilizar lo siguiente: * El 'GetSys', sistema de captura de datos, que funciona en modo 'modal' y que no permite el uso del ratn. * Las funciones de teclado: READ --> ReadModal(), I nKey(), KEYBOARD, SET KEY, etc... Notas: Es mejor utilizar el driver de Clipper por defecto (DBFNTX), ya que he tenido problemas con los otros.

Comandos Window / DIALOG Las ventanas son la esencia de Windows, y FiveWin nos permite tener abierta varias a la vez (MDI). Las Cajas de Dilogo no son ms que ventanas especializadas para la recogida de datos y acciones del suuario. Siempre tendr que haber una ventana principal.

Sintaxis: Creando un nueva ventana


DEFINE WINDOW <oWnd> ; [ FROM <nTop>, <nLeft> TO <nBottom>, <nRight> ] ; [ TITLE <cTitle> ] ; [ STYLE <nStyle> ] ; [ MENU <oMenu> ] ; [ BRUSH <oBrush> ] ; [ ICON <oIcon> ] ; [ MDI ] <oWnd> <nTop> <nLeft> <nBottom> <nRight> <cTitle> <nStyle> <oMenu> Referencia a un Objeto Ventana. Coordenadas de la Ventana en la pantalla. Simulan coordenadas de texto.

Ttulo de la Ventana. Valor numrico que indica un estilo especial del API. Avance para usuarios de Fivewin. Objeto Men creado previamente. Use MENU ... ENDMENU dentro de una funcin como ejemplo. Este parmetro es opcional. Objeto Brocha creado previamente usada como fondo de una ventana. Use DEFINE BRUSH ... para crearla. Este parmetro es opcional. Objeto Icono creado previamente usado por la ventana. Use DEFINE ICON ... para crearlo. Este parmetro es opcional.

<oBrush>

<oIcon>

Activando Ventana

ACTIVATE WINDOW <oWnd> ; [ ICONIZED | NORMAL | MAXIMIZED ] ; [ ON LEFT CLICK <uLClick> ] ; [ ON RIGHT CLICK <uRClick> ] ; [ ON MOVE <uMove> ] ; [ ON RESIZE <uResize> ] ; [ ON PAINT <uPaint> ] ; [ ON KEYDOWN <uKeyDown> ] ; [ ON INIT <uInit> ]

<oWnd> <uLClick> <uRClick> <uMove> <uResize> <uPaint>

Referencia a un Objeto Ventana. Accin a realizar cuando el botn izq. del ratn es pulsado sobre la ventana. Accin a realizar cuando el botn dcho. del ratn es pulsado sobre la ventana. Accin a realizar al tiempo que se mueve la ventana. Accin a realizar al tiempo que se redimensiona la ventana. Accin, accin general de pintar, a realizar al tiempo que se pinta la Ventana.

<uKeyDown> Accin a realizar al tiempo que se pulsa una tecla con la ventana enfocada. <uInit> Accin a realizar, una inicializacin general, cuando la ventana es inicializada.

Ejemplo: ------// ... Ejemplo Window DEFINE WINDOW oWndMain FROM 01, 01 TO 28, 75 ; TITLE "wBanks - Control Cuentas Bancarias" ; MENU MenuMain() ; COLOR "W+/W" // ... ACTIVATE WINDOW oWndMain MAXIMIZED // ... Ejemplo Dialog DEFINE DIALOG oDlg FROM 03, 03 TO 26, 79 ; TITLE OemToAnsi( "Gestin Bancos" ) // ... ACTIVATE DIALOG oDlg

Notas: Utilizar la funcin OemToAnsi(), para que Windows interprete los acentos. Funciones y API de Windows Resumen de funciones de utilidad que se han implementado como en el API de Windows o con alguna que otra modificacin. Para mayor informacin (parmetros, etc.) consultar la ayuda de FiveWin, las hay a cientos.

WinExec() cGetFile() MessageBeep() MessageBox() MsgBeep() nMsgBox() MsgInfo() MsgAlert() MsgStop() LZCopyFile() WinHelp() AnsiToOem() OemToAnsi() xPadR() xPadL() xPadC()

Correr la aplicacin especificada. Caja seleccin fichero. Generar un pitido. Crear y presentar una caja de mensaje. Igual a MessageBeep. Igual a MessageBox. Igual a MessageBox, pero con parmetros por defecto. Igual a MessageBox, pero con parmetros por defecto. Igual a MessageBox, pero con parmetros por defecto. Descompresin de ficheros. Activar la ayuda de Windows. Conversin de cadenas Windows a MsDos. Conversin de cadenas MsDos a Windows. Funciona igual que PadL(), PadC() y PadR() en Clipper, pero usando pixels en lugar de caracteres.

RECURSOS de Windows
Usando DLLs como Recursos SET RESOURCES TO <cDllName> [,<cDllName>... ] Seleccionar uno de los recursos abiertos Finalizare el uso de un Recurso <cDllName> SET RESOURCES TO <cDllName> SET RESOURCES TO

Nombre de la DLL cuyos recursos van a ser utilizados. Es posible especificar varias DLLs de recursos. Despues de abrir varias DLLs con recursos es necesario seleccionar el que se va a usar
SET RESOURCES TO <TheSameResourceName>

Es similar a seleccionar un rea de trabajo.

Notas: Si utilizamos un editor de recursos para disear las cajas de dilogo, nos ahorraremos mucho trabajo, pero tendremos que ser muy cuidados en la redefinicin de sus controles (botones, say, get, etc.) ya que si nos olvidamos alguno, nos equivocamos de nmero identificador o de control (por ejemplo: utilizar un LISTBOX para un campo MEMO, hay que utilizar un GET y activaral propiedad, multilnea) nos dar error. En cambio, no nos hemos de preocupar de las cajas o efectos que son de adorno.

Ejemplo de redefinicin de controles:


// -----------------------------------------------------// Funcin ...: Acerca() // Descripcin: Muestra informacin sobre el autor. // -----------------------------------------------------FUNCTION Acerca() LOCAL oDlg LOCAL oSay LOCAL oBtn // Redefinimos caja de Dilogo y sus componentes -------DEFINE DIALOG oDlg NAME "ACERCA" REDEFINE BUTTON oBtn ID 1 OF oDlg ACTION( oDlg:End() ) REDEFINE SAY oSay ID 10 OF oDlg ACTIVATE DIALOG oDlg CENTERED // Activamos Caja Dilogo RETURN NIL // ---------------------------------------------------------

Comandos BAR (Barra Botones) Creando una Barra de Botones desde cdigo fuente:
DEFINE BUTTONBAR [ <oBar> ] ;
[ BUTTONSIZE | SIZEBUTTON <nWidth>, <nHeight> ] ;

[ OF | WINDOW | DIALOG <oWnd> ] DEFINE BUTTON [<oBtn>] ; [ OF <oBar> ] ;


[ FILE | FILENAME | DISK <cBmpFile1> [,<cBmpFile2> ] ] ;

[ RESOURCE | RESNAME | NAME <cResName1> [,<cResName2>]]; [ ACTION <uAction> ] ; [ MESSAGE <cMsg> ] ; [ ADJUST ] <oBar> <nWidth> <nHeight> <oWnd> <oBtn> <cBmpFile1> <cBmpFile2> <cResName1> <cResName2> Referencia a un Objeto Barra. Anchura y altura de los botones de la barra. Por defecto es 28x28 pixels. Referencia a la ventana que contine la barra. Referencia a un objeto BitmatButton.
Nombre del Bitmap presentado. Opcionalmente puede especificar un segundo bitmap para animacin.

Nombre del recurso del Bitmap presentado. Opcionalmente puede especificar un segundo bitmap para animacin.

<uAction> <cMsg>

Accin a realizar cuando se pinch el Boton. Mensaje a presentar en la barra de mensajes de la Ventana que contiene al Objeto Barra que contiene el BitmapButton.

CLAUSULAS ADJUST Automticamente rehace el bitmap en todo el area del BitmapButton.

Ejemplo: ------// ... DEFINE BUTTONBAR oBarMain OF oWndMain DEFINE BUTTON OF oBarMain RESOURCE "CUENTA" ; ACTION Bancos() ; MESSAGE "Mantenimiento de Bancos" // ... DEFINE BUTTON OF oBarMain RESOURCE "EXIT" GROUP ; ACTION Terminar() ; MESSAGE "Salir del programa" // ...

Comando BITMAP Creando un bitmap desde cdigo fuente:


@ <nRow>, <nCol> BITMAP [ <oBmp> ] ;
[ NAME | RESNAME | RESOURCE <cResName> ] ;

[ FILE | FILENAME | DISK <cBmpFile> ] ; [ NOBORDER | NO BORDER ] ; [ SCROLL ] ; [ ADJUST ] ; [ ON CLICK | ON LEFT CLICK <uLClick> ] ; [ ON RIGHT CLICK <uRClick> ] ; [ SIZE <nWidth>, <nHeight> ] ; [ OF | WINDOW | DIALOG <oWnd> ]

Creando un bitmap desde recursos:


REDEFINE BITMAP[ <oBmp> ] ;
[ ID <nId> OF | WINDOW | DIALOG <oWnd> ] ;

[ SCROLL ] [ ADJUST ]
[ RESOURCE | NAME | RESNAME <cResName> ] ;

[ FILE | FILENAME | DISK <cBmpFile> ] <nRow>, <nCol> Coordenadas de pantalla. Igual que coordenadas de texto. <oBmp> <cResName> Referencia a un Objeto Bitmap. Nombre de un recurso bitmap, si el bitmap proviene de un fichero RC o RES, o si proviene de una DLL. Nombre de un fichero BMP en el caso de haberse cargado el bitmap directamente desde un fichero BMP.

<cBmpFile>

<nWidth>, <nHeight> <oWnd> <nId>

La anchura y altura deseada del bitmap. La ventana que contiene y controla el bitmap. Nmero del identificador del recurso que controla el bitmap. Tiene que asignarse en el editor de recursos.

<cResName> Nombre de un recurso bitmap, si el bitmap proviene de un fichero RC o RES, o si proviene de una DLL. <uLClick> <uRClick> Accin a realizar cuando se pulsa el botn izquierdo sobre el Bitmap. Accin a realizar cuando se pulsa el botn derecho sobre el Bitmap.

CLAUSULAS SCROLL Usar una barra de scroll para hacer scroll en el area visible del bitmap. Deja al usuario revisar los bitmaps ms grandes que el tamao del control. Ajusta automticamente el tamao del bitmap a su superficie.

ADJUST Ejemplo: // ...

@ 07,14 BITMAP oBitMap RESOURCE "WBANKS" OF oWndMain // ...

Comando LISTBOX (Browse) Definiendo un objeto Browse desde cdigo fuente:


@ <nRow>, <nCol> LISTBOX [ <oBrw> ] ; FIELDS <cFields,...> ; [ FIELDSIZES <aColSizes,...> ] ;
[ HEAD | HEADER | HEADERS <aHeaders,...> ] ;

[ ID <nId> ] ; [ SIZE <nWidth>, <nHeigth> ] ; [ ON CHANGE | ON CLICK <uChange> ] ; [ ON RIGHT CLICK <uRClick> ] ; [ ON LEFT DLBCLICK <uLDblClick> ] ; [ OF | DIALOG <oDlg> ] Redefiniendo un Browse desde recursos: REDEFINE LISTBOX [ <oBrw> ] ; FIELDS [ <cFields,...>] ; [ FIELDSIZES <aColSizes,...> ] ;
[ HEAD| HEADER | HEADERS<aHeaders,...>] ;

[ ID <nId> ] ; [ ON CHANGE | ON CLICK <uChange> ] ; [ ON RIGHT CLICK <uRClick> ] ; [ ON DLBCLICK <uDblClick> ] ; [ OF | WINDOW | DIALOG <oDlg> ] <oBrw> <nRow> <nCol> <cFields> Referencia a un Objeto TWBrowse. Posicin en la ventana que lo contiene. Similar a las coordenadas de texto. Una lista de expresiones de texto a presentar como columnas. Si la expresin es de tipo numrico TWBrowse lo maneja como manipulador de un bitmap a presentar.

<aColSizes> <aHeaders> <nId> <nWidth> <nHeigth> <uChange> <uRClick> <uLDblClick> <oDlg> Ejemplo: ------// ...

Lista del tamao de cada columna en pixels. Lista de expresiones de texto para cabeceras. Identificador numrico del control del TWBrowse. Tamao deseado del TWbrowse controlado en pixels. Accin a realizar cuando se selecciona una nueva fila. Accin a realizar cuando se pulsa a la derecha. Accin a realizar cuando se hace doble pulsacin a la izquierda. Objeto que contiene el control del TWBrowse.

@ 01,01 LISTBOX oLbkx FIELDS CONCEPTO->CODIGO, ; CONCEPTO->DESCRIPCION ; FIELDSIZES 48, 168 ;


HEADERS OemToAnsi( "Cdigo" ), ;

OemToAnsi( "Descripcin"); SIZE 284,138 OF oDlg // ... Notas: Los campos que numricos y de fecha, se han de pasar a tipo carcter.

Comando BRUSH Definiendo una brocha desde cdigo fuente:


DEFINE BRUSH <oBrush> ; [ STYLE <Style> ] ; [ COLOR <nRGBColor> ] ; [ FILE | FILENAME | DISK <cBmpFile> ]

Asignando una brocha a una ventana:


SET BRUSH ; [ OF <oWnd> ] ; [ TO <oBrush> ] <oBrush> <Style> <nRGBColor> <cBmpFile> <oWnd> Referenciaa a un Objeto Brocha. Uno de los estilos de abajo. Un color en formato RGB(rojo, verde, azul). Usar la funcin nRGB(). El nombre de un fichero BMP usado en la construccin de la Brocha. Referencia a la Ventana duea de la Brocha.

DIFERENTES ESTILOS:
Nuevos estilos : BORLAND, TILED, BRICKS Estilos estandard: DIAGONAL, HORIZONTAL, VERTICAL, FDIAGONAL, BDIAGONAL, CROSS, DIAGCROSS

Comando CHECKBOX ================ Creando un Checkbox desde cdigo fuente:


@ <nRow>, <nCol> CHECKBOX [ <oCbx> VAR ] <lVar>

[ PROMPT <cCaption> ] ;
[ OF | WINDOW | DIALOG <oWnd> ] ;

[ SIZE <nWidth>, <nHeight> ] ; [ HELPID | HELP ID <nHelpId> ] ; [ FONT <oFont> ] ; [ ON CLICK <uClick> ]; [ VALID <ValidFunc> ]

Usando un Checkbox desde un recurso de Caja de Dilogo:


REDEFINE CHECKBOX [ <oCbx> VAR ] <lVar> ; [ ID <nId> ] ; [ OF | WINDOW | DIALOG <oWnd> ] ; [ HELPID | HELP ID <nHelpId> ] ; [ ON CLICK <uClick> ]; [ VALID <ValidFunc> ] <nRow>, <nCol> <oCbx> <lVar> <cCaption> <oWnd> Coordenadas de la CheckBox. Simula coordenadas de texto. Referencia a un Objeto CheckBox. Variable lgica gestionada por la CheckBox. Etiqueta de la CheckBox. Referencia a la Ventana contenedora de la CheckBox.

<nWidth>, <nHeight> <nHelpId> <oFont> <uClick> <ValidFunc> <nId>

Dimensiones de la CheckBox en pixels. Tema de ayuda del valor de la CheckBox. Referencia al Objeto Font usado con la CheckBox. Accin a realizar cuando se cambia de CheckBox. Expresin o funcin validada cuando la CheckBox suelta su foco. Identificador numrico del recurso CheckBox.

Ejemplo:
------// ...
@ 01,06 CHECKBOX oCbx VAR lDireccion PROMPT ;

OemToAnsi( "Direccin Banco" ) OF oDlg


@ 02,06 CHECKBOX oCbx VAR lTelefono PROMPT ;

OemToAnsi( "Telfono - FAX" ) OF oDlg


@ 03,06 CHECKBOX oCbx VAR lSaldo PROMPT "Saldos" OF oDlg

// ...

Comando CLIPBOARD ================= Creando un objeto ClipBoard:


DEFINE CLIPBOARD <oClp> ;

[ FORMAT TEXT | OEMTEXT | BITMAP | DIF ] ;

[ OF <oWnd> ] ACTIVATE CLIPBOARD <oClp> SET TEXT OF CLIPBOARD <oClp> ; TO <cText> DEACTIVATE CLIPBOARD <oClp> RELEASE CLIPBOARD <oClp> <oClp> <oWnd> <cText> CLAUSES TEXT OEMTEXT BITMAP DIF Texto normal. No realizado todava. No realizado todava. Una referencia a un Objeto Clipboard. Ventana que es dirigida al Clipboard. Texto a colocar en el Clipboard.

Comando COMBOBOX Creando una ComboBox desde cdigo fuente:


@ <nRow>, <nCol> COMBOBOX [ <oCbx> VAR ] <cVar>

[ ITEMS <aItems> ] ; [ SIZE <nWidth>, <nHeight> ] ;


[ OF | WINDOW | DIALOG <oWnd> ] ;

[ HELPID | HELP ID <nHelpId> ] ; [ ON CHANGE <uChange> ] ; [ VALID <ValidFunc> ]

Creando una ComboBox desde recursos:


REDEFINE COMBOBOX [ <oCbx> VAR ] <cVar> ; [ ITEMS <aItems> ] ; [ ID <nId> ] ; [ OF | WINDOW | DIALOG <oWnd> ] ; [ HELPID | HELP ID <nHelpId> ] ; [ ON CHANGE <uChange> ] ; [ VALID <ValidFunc> ] <nRow>, <nCol> <oCbx> <cVar> <aItems> <nWidth>, <nHeight> Coordenadas de pantalla. Simulan a las coordenadas de texto. Referencia a un Objeto ComboBox. Variable de carcter que mantiene el item seleccionado en la ComboBox. Item mostrado en la ComboBox. Dimensiones de la ComboBox en pixels.

<oWnd> <nHelpId> <uChange> <ValidFunc> <nId>

Referencia al Objeto contenedor de la ComboBox. Identificador numrico control del tema de ayuda. Accin a realizar cuando el item seleccionado cambia cada cierto tiempo. Expresin a validar cuando el control que est funcionando desconecta el foco. Identificador numrico del control del recurso.

Ejemplo:
------// ... @ 02,08 COMBOBOX cConcepto ; ITEMS acConceptos ; SIZE 134, 70 ; OF oDlg // ...

Comando DDE (Dynamic Data Exchange = Cambio Dinmico de Datos)


Definiendo una DEFINE [ DDE | LINK ] <oDde> ; nueva conexin DDE [ SERVICE <cService> ] ; [ TOPIC <cTopic> ] ; [ ITEM <cItem> ] ; [ ACTION <uAction> ] <oDde> <cService> Referencia al Objeto DDE. Nombre del fichero ejecutable con el que se va a establecer la aplicacin. P.e: EXCEL, 123W(para LOTUS), etc. Nombre del archivo con el que se establece la conexin. P.e: si queremos conectar con fichero CUENTAS.WK4 de LOTUS que se
encuentra en el directorio BALANCE pondramos;

<cTopic>

C:\BALANCE\CUENTAS.WK4. <cItem> Un rango del archivo con el que se establece la conexin. P.e: para la hoja de clculo de
LOTUS CUENTAS.WK4, anterior, pondramos A1..B5

para definir el rango con el que establecemos la conexin. Activando la DDE ACTIVATE [ DDE | LINK ] <oDde> <oDde> Referencia al Objeto DDE.

Desactivando la DDE DEACTIVATE [ DDE | LINK ] <oDde>

<oDde>

Referencia al Objeto DDE.

Finalizando la conexin <oDde>

RELEASE [ DDE | LINK ] <oDde> Referencia al Objeto DDE.

Ejemplo:
STATIC oDDE // ---------------------------------------------------------FUNCTION PrnCuestion() LOCAL nStatus IF oDDE != NIL .AND. ! oDDE:lActive oDDE:End() oDDE := NIL ENDIF IF oDDE = NIL oWndMain:SetMsg( "CA-Ret. Espere, por favor ..." ) nStatus := WinExec( "CaRetRun", SW_MINNOACTIVE ) IF nStatus < 32 .AND. nStatus != 16 MsgAlert( " CaRetRun no disponible !" ) ENDIF oWndMain:SetMsg( " CA-Ret conexion disponible !" ) DEFINE DDE oDDE SERVICE "CARETRUN" TOPIC "SYSTEM" ENDIF IF oDDE != NIL IF oDDE:lActive // Podemos utilizar tambin: App.Maximize o // App.Minimize

oDDE:Execute( "[App.Hide]" ) oDDE:Execute( "[File.Open( CUESTION.RET ) ]" ) oDDE:Execute( "[File.Print( 0, 0 )]" ) oDDE:Execute( "[File.Exit]" ) ENDIF ENDIF IF( oDDE != NIL, oDDE:End(), oDDE := NIL ) RETURN NIL // ----------------------------------------------------------

Comando GET Creando un GET desde cdigo fuente:


@ <nRow>, <nCol> GET [ <oGet> VAR ] <uVar> ; [ OF | WINDOW | DIALOG <oWnd> ] ; [ PICTURE <cPict> ] ; [ VALID <ValidFunc> ] ; [ WHEN <WhenFunc> ] ; [ COLOR <cColor> ] ; [ SIZE <nWidth>, <nHeight> ]

Para editar campos memo:


@ <nRow>, <nCol> GET [ <oGet> VAR <uVar> ] ; [ OF | WINDOW | DIALOG <oWnd> ] ; [ MULTILINE | MEMO | TEXT ] ; [ COLOR <cColor> ] ; [ SIZE <nWidth>, <nHeight> ] ;

Usando un GET desde un recursos de Caja de Dilogo:


REDEFINE GET [ <oGet> VAR ] <uVar> ; [ ID <nId> ] ; [ OF | WINDOW | DIALOG <oWnd> ] ; [ HELPID | HELP ID <nHelpId> ] ; [ VALID <ValidFunc> ] ; [ PICTURE <cPict> ] ;

Para editar campos memo:


REDEFINE GET [ <oGet> VAR ] <uVar> ; [ MULTILINE | MEMO | TEXT ] ; [ ID <nId> ] ; [ OF | WINDOW | DIALOG <oWnd> ] ; [ HELPID | HELP ID <nHelpId> ] ; <nRow>, <nCol> <oGet> <uVar> <oWnd> <cPict> <ValidFunc> <WhenFunc> <cColor> <nWidth>, <nHeight> Coordenadas del GET. Simulan coordenada de texto. Referencia a un Objeto GET. Variable que el Objeto GET est manipulando. Ventana que contiene al GET. Tpica clausula PICTURE de xBase. Validacin de la expresin o funcin. Igual que en MsDos. Clausula cuando. No disponible todava! Color del GET. No disponible todava! Dimensiones en pixels del GET.

<nHelpId>

Identificador del tema de ayuda de un GET desde recursos.

CLAUSULAS MULTILINE MEMO TEXT Controla un GET de mltiples lineas para permitir editar un memo.

Ejemplo:
------// ... @ 03,01 SAY OemToAnsi( "&De la fecha" ) OF oDlg @ 03,08 GET dFecha1 PICTURE "@D" OF oDlg SIZE 35,11 // ...

Comando ICON Creando un control de Icono desde cdigo fuente:


@ <nRow>, <nCol> ICON [ <oIcon> ] ;
[NAME| RESOURCE | RESNAME <cResName>];

[ FILE | FILENAME | DISK <cIcoFile> ] ; [ BORDER ] ; [ ON CLICK <uClick> ] ; [ OF | WINDOW | DIALOG <oWnd> ] <nRow>, <nCol> Son las coordenadas en la pantalla. Simula coordenadas de texto.

<oIcon> <cResName> <cIcoFile> <uClick> <oWnd>

Es una referencia a un Objeto Icon. Es el nombre de un recurso Icono si ha cargado el icono desde un fichero RC, RES, o una DLL. Nombre del fichero ICO si se ha cargado directamente desde disco. Accin a realizar cuando se ha hecho clicks en el ratn alrededor del icono. Objeto contenedor del Icono.

Definir un Icono sin mostrarlo:


DEFINE ICON <oIcon> ;
[ NAME | RESOURCE | RESNAME <cResName> ] ;

[ FILE | FILENAME | DISK <cIcoFile> ] <oIcon> Referencia a un Objeto Icono.

<cResName> Es el nombre de un recurso Icono si el icono es cargado desde un fichero RC, RES o una DLL. <cIcoFile> Es el nombre de un fichero ICO si es cargado directamente desde disco.

Comando INI Gestionando un fichero INI:


INI <oIni> ; [ FILE | FILENAME | DISK <cIniFile> ]

GET <uVar> ; [ SECTION <cSection> ] ; [ ENTRY <cEntry> ] ; [ DEFAULT <uDefault> ] ; [ OF | INI <oIni> ] SET ; [ SECTION <cSection> ] ; [ ENTRY <cEntry> ] ; [ TO <uVal> ] ; [ OF | INI <oIni> ] ENDINI <oIni> <cIniFile> <uVar> Referencia a un Objecto INI. Nombre de un fichero INI. Es una variable cuyo valor es cargado desde el fichero INI. Este valor obtenido es convertido automticamente al tipo de la variable. Por tanto es importante hacer bien la inicializacin de la variable antes de cargar el valor. <cSection> <cEntry> <uDefault> <uVal> [SECTION] Entry=Value -Formato interno tpico .INI-

Valor por defecto usado cuando esta Entrada no se encuentra. Nuevo valor establecido cuando se est haciendo.

Comando MENU Creando un menu PullDown desde cdigo fuente:


MENU [ <oMenu> ] [POPUP] MENUITEM [ <oMenuItem> ] ;

[ CHECK | CHECKED | MARK ] ; [ ENABLED | DISABLED ] ;


[ FILE | FILENAME | DISK <cBmpFile>];

[ ACTION <uAction> ] ;
[ OF | MENU | SYSMENU <oMenu> ]

SEPARATOR MENUITEM... ENDMENU

Creando un men PullDown desde recursos:


DEFINE MENU <oMenu> ;

[ RESOURCE | NAME | RESNAME <cResName> ]


REDEFINE MENUITEM [ <oMenuItem> PROMPT<cPrompt> ];

[ ID <nId> OF | MENU <oMenu> ] ; [ ACTION <uAction> ] ; [ BLOCK <bAction> ] ; [ MESSAGE <cMsg> ] ; [ CHECK | CHECKED | MARK ] ; [ ENABLED | DISABLED ] ; [ FILE | FILENAME | DISK <cBmpFile> ]

Activando un men PopUp:


ACTIVATE POPUP <oMenu> ; [ AT <nRow>, <nCol> ] ; [ OF | WINDOW | DIALOG <oWnd> ]

Redefiniendo un sistema Men desde Ventana:


REDEFINE SYSMENU <oMenu> ; [ OF | WINDOW | DIALOG <oWnd> ] -MenuItems lo mismo que los de arriba...ENDSYSMENU <oMenu> Referencia a un Objeto men.

<oMenuItem> Referencia a uno de los menuitems del men. Cada menuitem de un Objeto men es tambin un Objeto. <cBmpFile> <uAction> <oMenu> Nombre de un fichero BMP usado como etiqueta de un menuitem del men. Accin a realizar para un menuitem especfico. Referencia a un Objeto men el cual ataca a un menuitem especfico. Por defecto este men es el men que est siendo construido. Este parmetro es opcional.

<nRow>, <nCol>Coordenadas del Popup Men. <oWnd> <cResName> Ventana contenedora del Men. Nombre del recurso men.

Ejemplo:
------// -------------------------------------------------------FUNCTION MenuMain() LOCAL oMenu MENU oMenu MENUITEM "&Control de Cuentas" MENU MENUITEM "&Bancos " ACTION Bancos() ;
MESSAGE "Mantenimiento de Bancos"

MENUITEM "&Conceptos " ACTION Conceptos() ;


MESSAGE "Mantenimiento de Conceptos" MENUITEM "&Movimientos " ACTION Movimientos() ; MESSAGE "Mantenimeinto de Movimientos"

SEPARATOR MENUITEM "&Salir " ACTION Terminar() ; MESSAGE "Salir del programa" ENDMENU ENDMENU RETURN oMenu // ---------------------------------------------------------

Comando PUSHBUTTON Creando Botones desde cdigo fuente:


@ <nRow>, <nCol> BUTTON [ <oBtn> PROMPT ] <cCaption>

[ DEFAULT ] ;
[ HELP | HELPID | HELP ID <nHelpId> ] ;

[ OF | WINDOW | DIALOG <oWnd> ] ; [ ACTION <uAction> ] ; [ FONT <oFont> ] ; [ SIZE <nWidth>, <nHeight> ]

Usando Botones desde Recursos:


REDEFINE BUTTON [ <oBtn> ] ;

[ ID <nId> OF | WINDOW | DIALOG <oDlg> ] ;

[ ACTION <uAction> ] ; [ HELP | HELPID | HELP ID <nHelpId> ] <nRow>, <nCol> Coordenadas del botn. Similares a las de texto. <oBtn> <cCaption> <nHelpId> <oWnd> <uAction> <oFont> <nWidth>, <nHeigth> Referencia a un Objeto Botn. Etiqueta del Botn. Identificador de ayuda del tema del Botn. Referencia a la ventana que lo controla. Accin a realizar cuando se presiona el Botn. Referencia al Objeto Font que se usa con el Botn. Dimensiones del Botn.

CLAUSULAS DEFAULT Por defecto PushButtons: se ejecuta automticamente cuando el usuario presiona, Enter adems de otros controles. Use esta clusula slo cuando construya el Botn desde cdigo fuente. Cuando se usen recursos, esta clusula deber especificarse desde el editor de recursos.

Ejemplo:
// ... @ 11,10 BUTTON "&Aceptar " OF oDlg ; ACTION( lSalir := .T., oDlg:End() ) SIZE 40,12
@ 11,18 BUTTON "&Cancelar" OF oDlg ACTION oDlg:End() SIZE 40,12

// ...

Comando PRINT
Usando la Impresora PRINT [ <oPrint> ] ; [ NAME | DOC <cDocument> ] PAGE <oPrint>:Say( ... ) ... ENDPAGE ENDPRINT <oPrint> Referencia al Objeto Impresora. El nombre del documento generado. Es el nombre que aparecer en el Spooler(cola de impresin).

<cDocument>

CLAUSULAS PAGE ENDPAGE ENDPRINT Comenzar nueva pgina Fin de impresin de la pgina en curso. Fin de impresin.

Ejemplo:
------// --------------------------------------------------------FUNCTION MakesList( oLbx ) // oLbx es un TWBrowse el cual // repintaremos despues de listar LOCAL oPrn, fntArial LOCAL nRow := 1, nRec := Recno() GO TOP DEFINE FONT fntArial NAME "Arial" SIZE 40, 60 PRINT oPrn NAME "Clientes" // Nombre del Listado Generado PAGE while ! EoF() oPrn:Say( nRow, 1, Clients->Name, fntArial ) nRow += fntArial:nHeight // N de lneas por Altura de carcter. if nRow > 50 * fntArial:nHeight nRow = 1 PAGE endif SKIP

end ENDPAGE ENDPRINT GOTO nRec RELEASE FONT fntArial RETURN NIL // --------------------------------------------------------// Otro sistema es mediante encolumnados: STATIC oReport // --------------------------------------------------------FUNCTION ListarConceptos( oLbx ) dbGoTop()
REPORT oReport TITLE "Listado Conceptos" ; FOOTER OemToAnsi( "Pgina n " + ; Str( oReport:nPage, 3 ) ) CENTER ;

TO PRINTER
COLUMN TITLE OemToAnsi( "Cd." ) DATA CONCEPTO->CODIGO COLUMN TITLE "Concepto" DATA CONCEPTO>DESCRIPCION

END REPORT ACTIVATE REPORT oReport dbGoTop() oLbx:Refresh() oLbx:SetFocus( .T. ) RETURN NIL // ---------------------------------------------------------

Comando RADIOBUTTON Creando un Men RadioButton desde cdigo fuente:


@ <nRow>, <nCol> RADIO [ <oRadMenu> VAR ] <nVar>

[ PROMPT <cItems,...> ] ; [ OF | WINDOW | DIALOG <oWnd> ] ; [ HELPID | HELP ID <nHelpId> ] ;


[ ON CLICK | ON CHANGE <uChange> ]

Creando un Men RadioButton desde recursos:


REDEFINE RADIO [ <oRadMenu> VAR ] <nVar> ; [ ID <nId,...> ] ; [ OF | WINDOW | DIALOG <oWnd> ] ; [ HELPID | HELP ID <nHelpId> ] ; [ ON CLICK | ON CHANGE <uChange> ] <nRow>, <nCol> <oRadMenu> <nVar> <cItems> <oWnd> <nHelpId> <uChange> Coordenadas del Men de RadioButton. Simula las coordenadas de texto. Referencia a un Objeto RadMenu. Variable numrica para control del Men de RadioButton. Lista de cadenas definiendo los prompts usados como elementos Radio. Referencia a la ventana que contiene el Men de RadioButton. Identificador de la ayuda para este control. Accin a realizar cuando un nuevo Radio es seleccionado en el Men de RadioButton.

Ejemplo:
// ... @ 01,03 RADIO oRad VAR nRadio PROMPT "Uno", "Dos" OF oDlg // ...

Comando SAY Definiendo un objeto SAY desde cdigo fuente:


@ <nRow>, <nCol> SAY [ <oSay> PROMPT ] <cText> ; [ OF | WINDOW | DIALOG <oWnd> ] ; [ PICTURE <cPicture> ] ; [ COLOR <cColor> ] ; [ FONT <oFont> ] ; [ CENTERED ] ; [ BORDER ] ; [ PIXEL ] <nRow>, <nCol> <oSay> <cText> <oWnd> <cPicture> <cColor> <oFont> Coordenadas del Objeto Say. Simula coordenadas de texto. Referencia al Objeto Say. Etiqueta del Objeto Say. Ventana contenedora del control Say. Tpica clusula PICTURE de un SAY.
Cadena de COLOR del SAY. No disponible todava!

Objeto Font que se usa con el SAY. El Font deber crearse previamente usando DEFINE FONT... .

Redefiniendo un objeto SAY desde recursos:


REDEFINE SAY <oSay> ; [ PROMPT <cText> ] ; [ ID <nId> OF | WINDOW | DIALOG <oDlg> ] ; [ CENTERED ] <oSay> <cText> Referencia al Objeto Say. Es el subtitulo asignado al Objeto Say. Especificando previamente el texto en el recurso. El el n del identificador del recurso del Objeto Say. Tiene que ser asignado desde el editor de recursos. Ventana contenedora del Objeto Say.

<nId>

<oWnd>

Ejemplo:
// ... @ 01,02 SAY OemToAnsi( "Cdigo Concepto" ) OF oDlg // ...

Comando SCROLLBAR Creando una ScrollBar desde cdigo fuente:


@ <nRow>, <nCol> SCROLLBAR [<oSbr>] ;

[ HORIZONTAL | VERTICAL ] ; [ RANGE <nMin>, <nMax> ] ; [ PAGESTEP <nPgStep> ] ; [ SIZE <nWidth>, <nHeight> ] ; [ UP | ON UP <uUpAction> ] ;
[ DOWN | ON DOWN <uDownAction> ] ; [ PAGEUP | ON PAGEUP <uPgUpAction> ] ;
[PAGEDOWN| ON PAGEDOWN<uPgDownAction>];

[ ON THUMBPOS <uPos> ] ; [ PIXEL ] ; [ OF | WINDOW | DIALOG <oDlg> ]

Creando una ScrollBar desde recursos:


REDEFINE SCROLLBAR [ <oSbr> ] ;

[ ID <nID> ] ; [ RANGE <nMin>, <nMax> ] ; [ PAGESTEP <nPgStep> ] ; [ UP | ON UP <uUpAction> ] ; [ DOWN | ON DOWN <uDownAction> ] ; [ PAGEUP | ON PAGEUP <uPgUpAction>] ;
[PAGEDOWN| ON PAGEDOWN<uPgDownAction>];

[ ON THUMBPOS <uPos> ] ; [ OF | WINDOW | DIALOG <oDlg> ] <nRow>, <nCol> Coordenadas del ScrollBar. Simulan a la coordenadas de texto. <oSbr> <oDlg> Referencia a un Objeto ScrollBar. Ventana Contenedora de la ScrollBar.

<nWidth> <nHeight>

Dimensiones en pixels de la ScrollBar.

<nMin>, <nMax> Rango de valores representados por la scrollbar. <nPgStep> <uUpAction> Incremento de valor cuando PageUp o PageDown es seleccionada en la ScrollBar. Accin a realizar cuando se selecciona hacia arriba en la scrollbar. Esto es, cuando se hace click en flecha hacia arriba o se presiona flecha arriba en el teclado.

<uDownAction> Accin a realizar cuando se selecciona hacia abajo en la scrollbar. Esto es, cuando se hac click en la flecha hacia abajo o se presiona flecha hacia abajo en el teclado. <uPgUpAction> Accin a realizar cuando se selecciona pgina arriba en la scrollbar. <uPgDownAction> Accin a realizar cuando se selecciona pgina abajo en la scrollbar. <uPos> Accin a realizar cuando la hoja es movida por el usuario y dejada en una posicin diferente. La nueva posicin es automticamente proveida como un valor nPos. Usar una scrollbar horizontal o vertical. Slo es til cuando la creamos desde cdigo fuente. Para usar coordenadas pixel en vez de coordenadas de texto.

CLAUSULAS HORIZONTAL VERTICAL PIXEL

Comando TIMER
Definiendo un nuevo Timer DEFINE TIMER <oTimer> ; [ INTERVAL <nInterval> ] ; [ ACTION <uAction> ] ;
[ OF | WINDOW | DIALOG <oWnd> ]

ACTIVATE TIMER <oTimer> DEACTIVATE TIMER <oTimer> RELEASE TIMER <oTimer> <oTimer> <nInterval> <uAction> <oWnd> Referencia a un Objeto Timer. Definir el tiempo de intervalo en milisegunsos. Accin a ejecutar cuando se ha pasado en intervalo. Referencia a la ventana contenedora del Objeto.

Comando VIDEO Definiendo un control de video desde cdigo fuente:


@ <nRow>, <nCol> VIDEO <oVideo> ; [ SIZE <nWidth>, <nHeigth> ] ;
[ FILE | FILENAME | DISK <cAviFile> ] ;

[ OF | WINDOW | DIALOG <oWnd> ]

Redefiniendo un control de video desde recursos:


DEFINE VIDEO <oVideo> ; [ FILE | FILENAME | DISK <cAviFile> ] ; [ OF | WINDOW | DIALOG <oWnd> ] Activando el Video <nRow>, <nCol> <oVideo> <nWidth>, <nHeight> <cAviFile> <oWnd> ACTIVATE VIDEO <oVideo> Coordenadas de Control. Simulan coordenadas de texto. Referencia a un Objeto Video. Control de dimensiones. Nombre del fichero AVI mostrado. Referencia a la ventana contenedora del Control.

COMANDOS ?/??
---Muestra por pantalla o impresora (dependiendo de SET DEVICE) el contenido de una o ms expresiones separadas por un espacio. Sintaxis : ?/?? <lista de expresiones> Las expresiones pueden ser cualquier tipo de datos,incluso memo ? -> realiza un avance de lnea ?? -> no realiza dicho avance Librera : CLIPPER.LIB Ejemplo : cCadena1 := "Esto es" cCadena2 := "un ejemplo" ? cCadena1, cCadena2

@...BOX ------Dibuja una caja en la posicin indicada, con los caracteres especificados. Sintaxis ...:
@ <nArriba>,<nIzquierda>,<nAbajo>,<nDerecha> BOX <cCadenaCuadro>

[ COLOR <cCadenaColor> ] Librera ...: CLIPPER.LIB Fichero .ch: BOX.CH Ejempl o....: @ 5,10,15,70 BOX B_DOUBLE_SINGLE

@...CLEAR
--------Borra la porcin de pantalla indicada. Si no se especifica la clusula TO, se toman las corrdenadas de MaxRow() y MaxCol()9. Sintaxis..: @ <nArriba>,<nIzquierda> CLEAR [TO <nAbajo>,<nDerecha>] Librera..: CLIPPER.LIB Ejemplo...: 1) 2) ------Ver: - Comando @...SAY...GET - Objeto Get - Mscaras PICTURE @ 5,5 CLEAR TO 15,20 @ 5,5 CLEAR

@...GET

@...PROMPT
---------Dibuja una opcin de men, y opcionalmente le asocia un mensaje. Sintaxis..:
@ <nFila>,<nColumna> PROMPT <cOpcion> [MESSAGE <cMensaje>]

Librera..: CLIPPER.LIB

Ejemplo...: SET MESSAGE TO 24 CENTER // Mensajes centrados lnea 24 SET WRAP ON // Circularidad men CLEAR @ 5,3 TO 11,15 @ 6,4 PROMPT " Altas.... " MESSAGE "Altas clientes" @ 7,4 PROMPT " Bajas.... " MESSAGE "Bajas clientes" @ 8,4 PROMPT " Modificar " MESSAGE "Modificar ...." @ 9,4 PROMPT " Consulta. " MESSAGE "Consulta clientes" @10,4 PROMPT " Listado.. " MESSAGE "Listado clientes" MENU TO nOpcion DO CASE CASE nOpcion = 0 QUIT CASE nOpcion = 1 AltasClientes() CASE nOpcion = 2 BajasClientes() CASE nOpcion = 3 ModifClientes() CASE nOpcion = 4 ConsuClientes() CASE nOpcion = 5 ListaClientes() ENDCASE

@...SAY...GET
Permite visualizar e introducir datos en las coordenadas indicadas Sintaxis..: @ <nFila>,<nColumna> [SAY <cTexto> [ PICTURE <cMascara>] ] [ COLOR <cCadenaColor> ] [ GET <xVariable/xCampo> [ PICTURE <cMascara> ] ] [ COLOR <cCadenaColor> ] [ WHEN <lPreCondicion> ]

[ RANGE <nRangoInferior>,<nRangoSuperior> ] [ VALID <lPostCondicion> ] Notas.....: Dependiendo de SET DEVICE TO SCREEN/PRINT, puede enviar las cadenas de SAY a pantalla o a impresora; los GETs no. La clusula GET edita el contenido de una variable o un campo, en las coordenadas especificadas de pantalla, despus tendr que capturar todos los GET's con READ. La clusula PICTURE define una mscara para la entrada de datos: - Funciones PICTURE : De aplicacin completa empiezan con el carcter @. - Plantillas .......: Formatean los caracteres posicin a posicin. FUNCIONES PICTURE ----------------@A -> Visualiza slo caracteres alfabticos. @B -> " nmeros justificados por la izquierda. @C -> " CR despus de ns positivos. @D -> " fechas, segn formato SET DATE. @E -> " fechas en formato britnico, y nmeros en formato europeo. @K -> Borra GET's si la primera tecla no es tecla de cursor. @R -> Inserta caracteres que no son de plantilla. @Sn->Scroll horizontal de un GET. @X -> Visualiza DB despus de nmeros negativos. @Z -> " cero en forma de espacios. @( -> Encierra entre parntesis nmeros negativos con espacios a la izquierda. @) -> Idem pero sin espacios a la izquierda. @! -> Convierte caracteres alfabticos a maysculas.

PLANTILLAS PICTURE -----------------A -> Visualiza slo caracteres alfabticos. N -> " " " " y nmeros. X -> " cualquier carcter. 9 -> " dgitos. # -> " dgitos, signos y espacios para cualquier dato. L -> Visualiza caracteres lgicos. Y -> Slo permite Y o N (YES/NO). ! -> Visualiza un caracter alfabtico a maysculas. $ -> " el signo dlar a la izquierda de un nmero en lugar de un espacio. * -> Idem anterior pero con el asterisco. . -> Especifica la posicin de un punto decimal. , -> " " de una coma. Librera..: CLIPPER.LIB @ 08,07 SAY "Cdigo curso " GET CODCURSO PICTURE "99" @ 09,07 SAY "Nombre curso " GET NOMCURSO @ 10,07 SAY "Fecha inicio " GET INICURSO PICTURE "@D" @ 11,07 SAY "Fecha fin .. " GET FINCURSO PICTURE "@D" READ

@...TO
-----Dibuja una caja con lnea simple o doble. Sintaxis..: @ <nArriba>,<nIzquierda> TO <nAbajo>,<nDerecha> [ DOUBLE ] [ COLOR <cCadenaColor> ] Librera..: CLIPPER.LIB Ejemplo...: @ 10,10 TO 20,20 @ 15,05 TO 22,50 DOUBLE // Lnea simple // Lnea doble

ACCEPT
-----Acepta la entrada de teclado para una variable de memoria. Si la nica tecla pulsada es RETURN la variable tendr el valor nulo (""). Sintaxis..: ACCEPT [<cTexto>] TO <cVariable> Librera..: CLIPPER.LIB Ejemplo...: ACCEPT "Indique su nombre: " TO cNombre

APPEND BLANK
-----------Aade un nuevo registro a la Base de Datos en uso. Sintaxis..: APPEND BLANK Librera..: CLIPPER.LIB Ejemplo...: // -------------------------------------------------Procedimiento : AltasCursos // -------------------------------------------------FUNCTION AltasCursos() USE Cursos INDEX Cursos CLS dbGoTop() DO WHILE LastKey() != 27 APPEND BLANK @ 4,5 TO 11,73 @ 7,7 SAY "Nmero " + lTrim( Str( RecNo() ) ) @ 8,7 SAY "Cdigo " GET CODCURSO PICTURE "99" @ 9,7 SAY "Curso " GET NOMCURSO READ

IF LastKey() = 27 DELETE Record RecNo() // = dbDelete() PACK ENDIF ENDDO dbCloseArea() RETURN NIL // --------------------------------------------------

APPEND FROM
----------Importa registros desde Ficheros (.DBF) y ASCII. Sintaxis..: APPEND FROM <xcFichero> [ FIELDS <cListaCampos> ] [<ambito>] [ WHILE <lCondicin> ] [ FOR <lCondicion> ]
[ SDF | DELIMITED [ WITH BLANK | <xcDelimitador> ] ]

<xcFichero> - Nombre del fichero. Puede una variable o macro, sin &, pero encerrada entre parentsis, que es lo mismo. <cListaCampos> - Lista de campos a agregar. Por defecto son todos. FOR/WHILE <condicin> - Indican las condiciones que han de cumplir los registros para ser agregados. SDF - Identifca ficheros ASCII con registros y campos de longitud fija.

DELIMITED - Ficheros ASCII con separacin de campos con comas, y entre comillas. Los campos y registros tienen longitud variable.

DELIMITED WITH BLANK - Campos separados por un espacio DELIMITED WITH <xcDelimitador> - Podemos especificar delimitador Librera..: CLIPPER.LIB Ejemplos..: USE Clientes APPEND FROM Ventas FOR Field->PEDIDO > 500000 // Aade a Clientes.dbf todos los campos de // Ventas.dbf en los que PEDIDO (campo comn) // sea mayor que 500000 pts.

AVERAGE ------Calcula la media de las expresiones numricas contenidas en el rea de trabajo actual. Sintaxis..: AVERAGE [<nListaValores>] TO <nVariables> [ <ambito> ] [ WHILE[ <lCondicion> ] [ FOR <lCondicion> ] <nListaValores> - Lista de campos cuya media se va a calcular. <nVariables> <ambito> FOR/WHILE - Lista de variables que almacenarn los resultados. - Restriccin de lso registros a procesar. - Condiciones a cumplir.

Librera..: CLIPPER.LIB Ejemplo...: USE Facturas AVERAGE Field->IMPORTE TO nImporte FOR "A.S.A." // Promedio de las facturas emitidas a la // la empresa A.S.A.

BEGIN SEQUENCE...END
-------------------Define una estructura de control. Una de sus funciones es el manejo de errores. Sintaxis..: BEGIN SEQUENCE <sentencias> [BREAK] <sentencias> END [SEQUENCE] BREAK - Permite salir de la secuencia, yendo a la instruccin posterior a END. Librera..: CLIPPER.LIB

CALL ---Ejecuta un procedimiento en lenguaje C o Ensamblador. Sintaxis..: CALL <cProcedimiento> [ WITH <Lista Parametros> ] Librera..: CLIPPER.LIB

CANCEL
-----Cancela la ejecucin de un programa, cierra todos los archivos abiertos y devuelve el control al sistema operativo. Realiza la misma funcin que QUIT, o que el RETURN del programa principal. Sintaxis..: CANCEL Librera ..: CLIPPER.LIB

CLEAR ALL --------Cierra todos los ficheros de Bases de Datos abiertas, los ficheros ndice, los de formato y los memo relacionados, y anula los GET's pendientes de leer. Sintaxis..: CLEAR ALL Librera..: CLIPPER.LIB

CLEAR GETS
---------Anula todos los GET's pendientes de lectura. Sintaxis..: CLEAR GETS Librera..: CLIPPER.LIB

CLEAR MEMORY
-----------Libera todas las variables de memoria, tanto pblicas como privadas. Si realizamos un TYPE() para averiguar el valor de las variables despus de un CLEAR MEMORY, estas son no definidas. Sintaxis..: CLEAR MEMORY Librera..: CLIPPER.LIB

CLEAR SCREEN
Borra la pantalla y sita el cursor en la posicin inicial. Sintaxis..: CLEAR [ SCREEN ] | CLS Librera..: CLIPPER.LIB

CLEAR TYPEAHEAD
--------------Limpia la memoria intermedia del teclado. Sintaxis..: CLEAR TYPEAHEAD Librera..: CLIPPER.LIB

CLOSE
----Cierra todos los archivos de Bases de Datos e ndice del rea de trabajo, el archivo alternativo, el de formato abierto y los de procedimientos. Sintaxis..: CLOSE [ALL/ALTERNATE/DATABASES/FORMAT/INDEX] CLOSE ALL : Cierra todos CLOSE ALTERNATE : Cierra el alternativo, sealado con SET ALTERNATE TO <fichero>. CLOSE DATABASES : Cierra bases de datos e ndices. CLOSE FORMAT : Cierra los de formato. CLOSE INDEX : Cierra ndices. Hay otros comandos que tambin cierran archivos que son: QUIT CANCEL RETURN (del procedimeinto general) CLEAR ALL USE (sin argumento) Librera..: CLIPPER.LIB

COMMIT
-----Graba en disco todas las memorias intermedias del Clipper. Es de vital importncia para evitar las perdidas de informacin por cortes de fludo elctrico. Sintaxis..: COMMIT Librera..: CLIPPER.LIB

CONTINUE -------Reanuda la bsqueda emprendida con LOCATE. Sintaxis..: CONTINUE Librera..: CLIPPER.LIB Ejemplo...: USE Help dbGoTop() LOCATE FOR Field->COMANDO = "CONTINUE" DO WHILE .NOT. Eof() QOut( Field->DESCRIPCIO ) CONTINUE ENDDO dbCloseArea()

COPY TO
------Copia toda las Base de Datos en curso o solo una parte a un nuevo fichero. Sintaxis..:

COPY TO <archivo> [<mbito> [FIELDS <lista campos>] [FOR <condicin>] [WHILE <condicin>] [SDF/DELIMITED/ DELIMITED WITH <delimitador>] <archivo> - Es el nombre del nuevo archivo. <mbito> - Determina la porcin del archivo a copiar, por defecto es ALL (todo). FIELDS <lista campos> - Son los campos a copiar a la nueva base de datos. FOR/WHILE <condicin> - Especifican la condicin a cumplir. SDF - Especifica que el archivo de salida ser con formato ASCII, con campos de longitud fija. DELIMITED - Formato para el archivo de salida ASCII, con campos de longitud varible y separados por comas. Si se desea pueden separase con espacios (BLANK), o con cualquier otro delimitador. Librera..: CLIPPER.LIB Ejemplo...: USE Help COPY TO Help.txt SDF dbCloseArea()

COPY FILE
--------Duplica un archivo de cualquier tipo. Sintaxis..: COPY FILE <archivo1> TO <archivo2> <archivo1> - Es el nombre y la extensin del archivo

<archivo1> - Es el nombre y la extensin del archivo origen. <archivo2> - Es el nombre y la extensin del archivo destino. Librera..: CLIPPER.LIB Ejemplo...: COPY Help.prg TO Ayuda.prg

COPY STRUCTURE
-------------Copia la estructura de la Base de Datos en curso en otra de vaca. Sintaxis..: COPY STRUCTURE [FIELDS <lista de campos>] TO <archivo> FIELDS <lista de campos> - Son los campos a copiar, por defecto son todos. <archivo> - Es la base de datos de destino, la extensin por defecto es DBF. Librera..: CLIPPER.LIB Ejemplo...: USE Clientes COPY STRUCTURE FIELDS NOMBRE, DIR, POB TO Etiqueta dbCloseArea()

COPY STRUCTURE EXTENDED


Copia definiciones de campo en una Base de Datos. Sintaxis..: COPY STRUCTURE EXTENDED TO <cDbf>

Puede ser en forma de cadena o variable. Librera..: CLIPPER.LIB Ejemplo...: USE Ventas NEW COPY STRUCTURE EXTENDED TO Vacio USE Vacio NEW LIST Field_name, Field_type, Field_len, Field_dec dbCloseAll()

COUNT
----Cuenta el nmero de registros del rea de trabajo activa que cumplen una determianda condicin. Sintaxis..: COUNT [<mbito>] [FOR <condicin>] [WHILE <condicin>] TO <variable> <mbito> - Es el porcin del archivo de Base de Datos que se va a contar, por defecto es ALL (todo). FOR/WHILE <condicin> - Especifican las condiciones a cumplir. <variable> - Es la que recibe el resultado de COUNT. Librera..: CLIPPER.LIB Ejemplo...: USE Clientes COUNT FOR Field->CODIGO = "08240" TO nCuenta dbCloseArea()

CREATE
-----Crea un archivo de Base de Datos de Estructura ampliada vaca. Sintaxis..: CREATE <archivo> La estructura ampliada esta compuesta por los campos: * Field_name = nombre del campo * Field_type = tipo de campo * Field_len = longitud del campo * Field_dec = n de decimales Se usa junto con CREATE FROM para crear nuevas Bases de Datos. Librera..: CLIPPER.LIB Ejemplo...: // -------------------------------------------------// Fucnin: CreaCursos // Ejemplo completo de creacin de Bases de Datos // CREATE y CREATE FROM // -------------------------------------------------FUNCTION CreaCursos() LOCAL GetList := {} CLS @ 24,0 SAY "* Creando fichero cursos *" // Creando estructura ampliada vaca CREATE Cursos USE Cursos dbAppend() REPLACE Field_name WITH "CODCURSO" REPLACE Field_type WITH "N"

REPLACE Field_len WITH 2 READ dbAppend() REPLACE Field_name WITH "CURSO" REPLACE Field_type WITH "C" REPLACE Field_len WITH 30 READ // Creando nueva Base de Datos e Indexado CREATE Cursos FROM Cursos INDEX ON CODCURSO TO Cursos dbCloseArea() RETURN NIL // --------------------------------------------------

CREATE FROM
----------Crea una nueva Base de Datos a partir de otro de estructura ampliada vaca. Sintaxis..: CREATE <archivo1> FROM <archivo2> <archivo1> - Es el nuevo archivo. <archivo2> - Es el de estructura ampliada. Librera..: CLIPPER.LIB Ejemplo ..: Ver CREATE.

DECLARE
------Crea uno o ms arrays de variables de memoria. Sintaxis..: DECLARE <array1> [<n elem1>] [,<array2> [<n elem2>]] .... [,<arrayn> [<n elemn>]] <array> - Nombre de los arrays a crear. <n elementos> - De 1 a 4096 elementos, si sobrepasamos de los lmites ( < 1 o > 4096), entonces toman los valores por defecto, 1 o 4096, segn el caso. Para asignar valores a un elemento, podemos hacerlo con el signo =, pero si es a un array completo use AFILL(). Pueden declararse como pblicas o privadas. Librera..: CLIPPER.LIB Ejemplo...: DECLARE acPuntos[ 4 ] acPuntos[ 1 ] = "NORTE" acPuntos [ 2 ] = "SUR" acPuntos [ 3 ] = "ESTE" acPuntos [ 4 ] = "OESTE"

DELETE -----Marca registros para borrarlos de la Base de datos en uso. Sintaxis..: DELETE [< mbito>] [RECORD <Nregistro>] [FOR <condicin>] [WHILE <condicin>] < mbito> - Porcion de archivo a manipular, por defecto es todo (ALL). RECORD <N registro> - Indica el registro a marcar. FOR/WHILE <condicin>- Indican las condiciones a cumplir para el marcado. Para borrarlos definitivamente y reorganizar el archivo hemos de utilizar el comando PACK. Si desea borrar todo el archivo y conservar la estructura use ZAP, en lugar de: DELETE ALL y PACK. Libreria..: CLIPPER.LIB Ejemplo...: // Uso de DELETE y PACK en bajas de registros // Si confirmamos marca y elimina el registro actual @ 20,7 SAY " Quiere borrar (S/N) ? " GET cConfirma READ IF cConfirma = "S" .OR. cConfirma = "s" Delete Record RecNo() PACK ENDIF

DELETE FILE
=========== Borra un fichero del disco. Sintaxis..: DELETE FILE | ERASE <cFichero> <cFichero> - Es el nombre del fichero a borrar. Puede ser una cadena o una variable. Librera..: CLIPPER.LIB Ejemplo...: Ver comando ERASE

DIR
--Visualiza una lista de archivos desde la lista indicada. Funcionamiento idntico al DIR del DOS. Sintaxis..: DIR [<unidad>:] [<ruta>\] [<estructura>]/(<expC>) <estructura> - permite el uso de comodines (* y ?). Librera..: CLIPPER.LIB Ejemplo...: Dir *.dbf

DISPLAY
------Visualiza el contenido de los registros que cumplan una serie de condiciones, por pantalla por impresora (TO PRINT), o a un archivo de texto (TO FILE). Sintaxis..: DISPLAY [OFF] [<mbito>] <lista campos> [FOR <condicin>] [WHILE <condicin>] [TO PRINT] [TO FILE <archivo>] OFF - Suprime la visualizacin del nmero de registro.

<mbito> - Porcin de archivo a visualizar. Por defecto es todo. <lista campos> - Son los campos del archivo de Base de Datos a visualizar. FOR/WHILE <condicin> - Especifican las condiciones a cumplir. TO PRINT - Enva la salida a la impresora. TO FILE - Enva la salida a un Fichero de Texto, si no se especifica la extensin, por defecto agrega (.TXT).

Librera..: CLIPPER.LIB Ejemplo...: // Envamos a un fichero de texto, todos // los campos memo de este programa USE Help DISPLAY ALL Ejemplo TO FILE Help.txt dbCloseArea()

DO
-Ejecuta un procedimiento escrito en Clipper, C o ensamblador, pasndole parmetros (hasta 128) con WITH. Sintaxis..: DO <procedimiento> [WITH <lista de parmetros>] Librera..: CLIPPER.LIB Ejemplo...: PROCEDURE ListaCursos IF !IsPrinter() do MsgImpresora ENDIF // rdenes ... RETURN .T. // -------------------------------------------------// Procedimiento: MsgImpresora // Descripcin ..: Muestra un mensaje de conexin de // impresora. // -------------------------------------------------PROCEDURE MsgImpresora CLS @ 9, 28 TO 12, 51 @ 10,30 SAY "Conecte la impresora" @ 11,32 SAY "y pulse una tecla" InKey(0) RETURN .T. // --------------------------------------------------

DO CASE
------Estructura selectiva de bifurcacin condicional. Sintaxis..: DO CASE CASE <condicin> <rdenes>... [CASE <condicin>] <rdenes>... [OTHERWISE] <rdenes>... ENDCASE La estructura DO CASE bifurca la ejecucin a las rdenes que siguen a una condicin verdadera de C la ejecucin contina hasta encontrar la prxima clusula CASE, OTHERWISE o ENDCASE. Librera..: CLIPPER.LIB Ejemplo...: (Ver @...PROMPT, hay un ejemplo completo)

DO WHILE
-------Bucle que se realiza mientrs no se cumpla una condicin verdadera (.T.). Sintaxis..: DO WHILE <condicin> <rdenes> [EXIT] <rdenes> [LOOP] <rdenes> ENDDO <condicin> - Es la condicin evaluada por DO WHILE. EXIT LOOP - Provoca la salida del bucle. - Bifurca al comienzo del bucle, sin acabar de completar la secuencia de instrucciones.

Librera..: CLIPPER.LIB Ejemplo...: SET DEVICE TO PRINT USE Help INDEX Help DO WHILE !Eof() QOut( Field->COMANDO ) dbSkip() ENDDO dbCloseArea() EJECT SET DEVICE TO SCREEN

EJECT
----Realiza un salto de pgina en la impresora, y pone a cero los valores de la fila y la columna de la impresora. Use SETPRC() si necesita poner a cero los valores internos de fila y columna de la impresora sin enviar un salto de pgina. Sintaxis..: EJECT Librera..: CLIPPER.LIB Ejemplo...: (Ver SET DEVICE, se incluye un ejemplo completo)

ERASE
----Borra un fichero del disco. Sintaxis ..: ERASE | DELETE FILE <archivo.ext> Librera ..: CLIPPER.LIB

Summer'87 : Disponible Ejemplo ...: IF File( "TEMP.DBF" ) ERASE TEMP.DBF ENDIF

EXIT
==== Provoca la salida de un bucle. Sintaxis..: EXIT Ejemplo...: LOCAL nTecla := 0 DO WHILE .T. // ... nTecla := InKey( 0 ) IF nTecla = K_ESC EXIT ENDIF ENDDO

EXTERNAL
-------Define como externos procedimientos o funciones para el linkador. Tambin se ha de usar para las funciones y procedimientos definidos por el usuario y SET KEY, si estos se llaman con una macro o se colocan en segmentaciones. Se utiliza sobre todo para funciones en C y/o ensamblador. Sintaxis..:

EXTERNAL <lista funciones y/o procedimientos> Librera..: CLIPPER.LIB Ejemplo...: /* ------------------------------------------------------------------ */ /* DetectVideo() : Detecta el modo de video. */ /* Ejemplo de funcin en C (Turbo C++) para Clipper.*/ /* Compilacin...: tcc -c -ml programa.c */ /* -c = crea el objeto .OBJ / ml = modelo largo mem. */ /* ------------------------------------------------------------------ */ #include "nandef.h" #include "extend.h" #include <dos.h> /* Include Clipper */ /* " " */ /* " Turbo C++ */

CLIPPER DetectVideo() { union REGS inregs, outregs; inregs.h.ah = 0xF; /* Func.:OFH - Int 10 BIOS*/ int86( 0x10, &inregs, &outregs ); _retni(outregs.h.al); } // Ejemplo de su uso desde Clipper // Hay que compilar las libreras Clipper con la // CL.LIB de Turbo C++ (Borland) EXTERNAL DetectVideo nVideo := DetectVideo() IF nVideo = 7 // Modo monocromo

SET COLOR TO "N/W" ELSE SET COLOR TO "GR+/B" ENDIF

FIND
---Busca una cadena en una clave ndice. La cadena se ha de indicar entre comillas, y si utilizamos variables se ha de especificar con una macro. Sintaxis..: FIND <cadena> Librera..: CLIPPER.LIB Ejemplo...: USE Help INDEX Help FIND "CLOSE" IF Found() QOut( Help->DESCRIPCIO ) ENDIF dbCloseArea()

FOR ... NEXT


-----------Ejecuta un bucle un determinado nmero de veces. Sintaxis..: FOR <variable> = <n 1> TO <n 2> [STEP <n 3>] <rdenes> [EXIT] <rdenes> [LOOP] NEXT <variable> - Controla el bucle <n 1> <n 2> STEP - Es el lmite inferior del intervalo. - Es el lmite superior del intervalo. - Fija incremento de la variable, si no se especifica es uno.

EXIT LOOP

- Provoca la salida del bucle. - Devuelve el control a FOR...NEXT.

Librera ..: CLIPPER.LIB Ejemplo...: // ------------------------------------------------// Procedimiento : Fondo // Descripci n...: Llena la pantalla con _. // ------------------------------------------------PROCEDURE Fondo LOCAL i := 0 SET COLOR TO "BG/N" FOR i = 0 TO 24 @ i, 0 SAY Replicate( Chr( 178 ), 80 ) NEXT SET COLRO TO "GR+/B,N/G" RETURN .T. // -------------------------------------------------

FUNCTION
-------Declara una funcin definida por el usuario escrita en Clipper. Sintaxis..: FUNCTION <nombre funcin> <instrucciones> RETURN <valor de respuesta> <nombre de funcin> - Solo acepta los diez primeros caracteres. <valor de respuesta>- Es obligatorio la devolucin de un valor. Para llamar a una funcin de usuario, proceda de la siguiente forma: FUNCTION( <lista de parmetros> ) Los parmteros se pasan por valor, exceptuando los arrays, o si el parmetro es precedido por una arroba (@), entonces es pasado por referencia. Librera..: CLIPPER.LIB Ejemplo...: CLS @ 24,0 SAY IsBisiesto( Date() ) // ...

// -------------------------------------------------// Funcin .....: ISBISIESTO // Descripcin : Comprueba si un ao es bisiesto o no. // Parmetros..: Una fecha. // Devuelve ....: Un valor lgico (.T./.F.=TRUE/FALSE) // Explicacin .: Hallamos ao y comprobamos si el da // 29-02, se corresponde con un n de // da de la semana, si es cero no es // bisiesto. // -------------------------------------------------FUNCTION IsBisiesto( dFecha ) LOCAL lDevuelve := .F. LOCAL nAny := Year( dFecha ) LOCAL cCadena := CtoD( "29-02-" + Str( nAny ) ) IF Dow( cCadena ) = 0 lDevuelve = .F. ELSE lDevuelve = .T. ENDIF RETURN( lDevuelve ) // --------------------------------------------------

GO/GOTO ------Mueve el puntero de registros a un regsitro dentro del rea de trabajo activa. Sintaxis..: GO/GOTO <n de registro>/BOTTOM/TOP <n de registro> - Movemos el puntero a dicho registro incluso si esta marcado para eliminarlo. BOTTOM TOP - Movemos el puntero al ltimo registro. - Movemos el puntero al primer registro.

Librera..: CLIPPER.LIB Ejemplo...: LOCAL i := 0 LOCAL nUltimo := 0 LOCAL acComandos := {} USE Help GO BOTTOM nUltimo := RecNo() acComandos := Array( nUltimo ) GO TOP FOR i = 1 TO nUltimo acComandos[ i ] := Help->COMANDO dbSkip NEXT // ...

IF
-Bifurcacin condicional segn la evaluacin de condiciones. Sintaxis..: IF <condicin> <declaraciones>... [ELSEIF <condicin>] <declaraciones>... [ELSE] <declaraciones>... ENDIF Si la condicin se evala como verdadera (.T.), se ejecutan todas las rdenes siguientes hasta que se encuentra un ELSEIF, ELSE o ENDIF. ELSEIF, ejecuta las rdenes cuando se cumpla la condicin, en cambio, ELSE ejecuta sus rdenes cuando no se cumpla ninguna de las condiciones anteriores. Librera..: CLIPPER.LIB Ejemplo ..: nNumero := 10 IF nNumero > 10 QOut( "Nmero mayor que 10" ) ELSEIF nNumero = 10 QOut( "Numero igual a 10" ) ELSE QOut( "Nmero menor que 10" ) ENDIF

INDEX ----Indexa una Base de Datos por el campo indicado. Sintaxis..: INDEX ON <campo1> [, <campo2>...] TO <archivo> <campo> - Es el campo clave para indexar. <archivo> - Es el nombre del archivo ndice a crear. La extensin es (.NTX), excepto si linkamos con NDX.OBJ para conseguir ndices compatibles con Dbase III+, de extensin (.NDX). Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX ON Field->Nombre TO Nombre // ... dbCloseArea()

INPUT ----Acepta la entrada de datos por teclado, evaluando el tipo de datos, y colocandolo en una variable de memoria. Si slo oprimimos RETURN, terminamos la entrada pero no creamos la variable de memoria. Sintaxis..: INPUT [<mensaje>] TO [<variable de memoria>] Librera..: CLIPPER.LIB Ejemplo...: Input " Como te llamas ?" TO cNombre

JOIN ---Une dos Bases de Datos en otra a travs de un campo clave. Sintaxis..: JOIN WITH <alias> TO <archivo> FOR <condicin> [FIELDS <lista de campos>] <alias> - Es el seudonimo del rea de trabajo que uniremos a la rea en curso.

<archivo> - Es el nombre del archivo de destino. FOR - Especifica la condicin que han de cumplir los registros.

FIELDS <lista campos> - Indica los campos de ambas reas de trabajo que se incluran en el nuevo archivo de Base de Datos. Librera..: CLIPPER.LIB Ejemplo...: SELECT 1 USE Clientes INDEX Clientes ALIAS CLI SELECT 2 USE Pedidos INDEX Pedidos ALIAS PED
JOIN WITH CLI TO Nuevo FOR CLI->NUMPEDIDO = PED->NUMPEDIDO

USE Nuevo NEW Browse() dbCloseAll()

KEYBOARD
-------Enva al buffer de teclado los caracteres especificados. Sintaxis..: KEYBOARD <caracteres> Librera..: CLIPPER.LIB Ejemplo...: // Enva dos retornos de carro KEYBOARD Chr(13) + Chr(13)

LABEL FORM
---------Visualiza, imprime o desva hacia un fichero de texto el formato de etiquetas elegido. Sintaxis..: LABEL FORM <archivo1> [<mbito>] [FOR <condicin>] [WHILE <condicin>] [SAMPLE] [TO PRINT] [TO FILE <archivo2>] <archivo1> <mbito> FOR/WHILE SAMPLE - Es el archivo que contiene el formato de etiqueta, su extensin es (.LBL). - Es la porcin del archivo a manipular. Por defecto es todo (ALL). - Especifican las condiciones a cumplir. - Visualiza o imprime una etiqueta de muestra (con asteriscos) para su comprobacin o posicionamiento del papel de la impresora.

TO PRINT - Imprime.

TO FILE

- Desva la informacin de salida a un fichero de texto, de extensin (.TXT), por defecto.

Librera..: CLIPPER.LIB Ejemplo...: USE Clientes LABEL FORM Clientes.lbl TO PRINT CODIGO = "08080" dbCloseArea()

LIST
---Visualiza, imprime o desva hacia un fichero de texto uno o varios registros segn las condiciones especificadas. Sintaxis..: LIST [OFF] [<mbito>] <lista de campos> [FOR <condicin>] [ WHILE <condicin>] [TO PRINT][TO FILE <archivo>] OFF - Suprime la visualizacin de los nmeros de registro.

<lista de campos> - Son los campos a visualizar. FOR/WHILE TO PRINT - Especifican las condiciones. - Imprime.

TO FILE <archivo> - Desva a un fichero de texto, cuya extensin por defecto es (.TXT).

Librera..: CLIPPER.LIB Ejemplo...: USE Clientes LIST nombre, direccion, poblacion TO PRINT dbCloseArea()

LOCAL =====
Declara e inicializa variables y matrices locales. Sintaxis..: LOCAL <identificador> [[ := <inicializador>,...] <identificador>, es el nombre de la variable o matriz que se declara como LOCAL. <inicializador>, es la asignacin opcional de un valor. Ejemplo...: LOCAL nTecla := 0

LOCATE
-----Bsqueda secuencial de registros que cumplan una condicin determinada. Funciona en combinacin con CONTINUE. Sintaxis..: LOCATE [<mbito>] FOR <condicin> [WHILE <condicin>] <mbito> - Es la porcin de archivo a manipular. Por defecto es todo (ALL).

Librera..: CLIPPER.LIB Ejemplo...: USE Clientes LOCATE FOR Field->POBLACION = "MADRID" IF Found() DO WHILE .NOT. Eof() QOut( nombre, direccion, poblacion ) CONTINUE ENDDO ELSE QOut( "No existe ninguno" ) ENDIF dbCloseArea()

MEMVAR
====== Declara nombres de variables privadas o pblicas, dependiendo del lugar del programa en que se declaran, si es en el mdulo principal, sern Pblicas o sino sern Privadas, es decir, visibles slo por la funcin o procedimiento en que se declara y todos los inferiores a este. Sintaxis..: MEMVAR <lista variables> Ejemplo...: MEMVAR pPRINTER, pPRNLEN

MENU TO
------Ejecuta un men de lnea y/o popup. Pueden anidarse entre ellos, y pueden modificarse las teclas activas. Sintaxis..: MENU TO <variable> <variable> - Es donde se almacenara el resultado de la seleccin del men. Teclas activas de MENU TO: Flecha arriba, flecha izquierda Flecha abajo, flecha derecha Inicio Fin Pgina arriba/abajo, Return Escape Primera letra Librera..: CLIPPER.LIB Ejemplo...: (Ver @...PROMPT) -> PROMPT anterior -> PROMPT siguiente -> Primer PROMPT -> Ultimo PROMPT -> Seleccin = n -> Salir = 0 -> Seleccin = n

NOTE | * | && | /* ... */ | // -----------------------------Indica las lneas o las partes de ella que son comentarios. No se admite (;) como carcter de continuacin. Sintaxis..: NOTE/* [<texto>]/&& [<texto>]

Librera..: CLIPPER.LIB Ejemplo...: NOTE Esto es un comentario * Esto tambin CLS && Y esto // Otro comentario /* Varias lneas de comentarios */

PACK
Elimina los registros marcados para borrar de la Base de Datos, borra los ndices en uso, y vuelve a reindexar, eliminando el espacio fsico ocupado por los registros eliminados. Sintaxis..: PACK Librera..: CLIPPER.LIB Ejemplo...: USE clientes QOut( LastRec() ) Delete Record 80 PACK QOut( LastRec() ) dbCloseArea() // = 100 // = 99

PARAMETERS
---------Identifica las variables de memoria de un procedimiento que recibirn valores. Sintaxis..: PARAMETERS <lista de variables> Los parmetros se pueden pasar: - Por valor: Pasamos directamente el valor a la variable. - Por referencia: No pasamos el valor sino un puntero a la posicin del parmetro en curso. Reglas: * Las variables y arrays se pasan por referencia. A los procedimientos. Los elementos de los arrays, variables entre parntesis y campos se pasan por valor. * Los parmetros se pasan por valor a las funciones, pero podemos forzar su paso por referencia anteponiendo el signo arroba (@). Los arrays tambin se pasan por referencia, y sus elementos por valor. Librera..: CLIPPER.LIB Ejemplo...: CLS DO Window WITH 5,23,11,35 @ 10,24 SAY "Pulse tecla" InKey(0) RETURN NIL // ------------------------------------------------// Procedimiento : Window

// Descripcin...: Dibuja y rellena una ventana. // Parmetros....: Coordenadas esquinas superior izda. // e inferior derecha. // -------------------------------------------------PROCEDURE Window PARAMETERS nFila1, nCol1, Nfila2, nCol2 LOCAL i := 0 FOR i = nFila1 TO nFila2 @ i, nCol1 SAY Space( nCol2 - nCol1 ) NEXT @ nFila1, nCol1 TO nFila2, nCol2 RETURN NIL // --------------------------------------------------

PRIVATE
------Declara variables de tipologa LOCAL, aunque con matizaciones, ya que son visibles por el procedimiento o funcin actual, y por los inferiores a estos. Sintaxis..: PRIVATE <lista de variables> <lista de variables> - Pueden ser de cualquier tipo, y han de separase con comas. Librera..: CLIPPER.LIB Ejemplo...: PRIVATE aCadena[10], cCadena1 -----------------------------------------------

PROCEDURE
Indica el principio de un procedimiento. Sintaxis..: PROCEDURE <nombre procedimiento> <rdenes> [RETURN] <nombre procedimiento> - Debe de empezar con una letra <nombre procedimiento> - Debe de empezar con una letra y solo evalan los 10 primeros caracteres. RETURN - Es aconsejable su uso para determinar el fin de un procedimiento, aunque no necesario, ya que detecta el fin al encontrar otro procedure o una marca de fin de archivo. Librera..: CLIPPER.LIB Ejemplo...: CLS DO Fondo InKey(0) RETURN NIL // -------------------------------------------------// Procedimiento : Fondo // Descripcin ...: Llena la pantalla con _ // -------------------------------------------------PROCEDURE Fondo LOCAL i := 0 FOR i = 0 TO 24 @ i, 0 SAY Replicate( Chr( 178), 80 ) NEXT RETURN NIL // --------------------------------------------------

PUBLIC -----Declara variables como globales, es decir, que pueden utilizarse en todo el programa. Sintaxis..: PUBLIC <lista de variables> <lista de variables> - Pueden ser de cualquier tipo, han de separase con comas. Librera..: CLIPPER.LIB Ejemplo...: PUBLIC COL_MENU // Variable pblica COL_MENU = "W+/B" // Colores iniciales SET COLOR TO &COL_MENU // Indicamos colores * <rdenes> COL_MENU = "W/G" // Nuevo color SET COLOR TO &COL_MENU

QUIT
---Salida del programa y devolucin del control al Sistema Operativo. Sintaxis..: QUIT Librera..: CLIPPER.LIB Ejemplo...: cConfirma := "N"
@ 24,0 SAY " Quiere salir (S/N) ?" GET cConfirma PICTURE "!" ;

VALID( cConfirma $ "SN" ) READ IF cConfirma = "S" .OR. cConfirma = "s" CLS QUIT ENDIF

READ
---Lee las variables de los GET's pendientes de leer. Sintaxis..: READ [SAVE] La clusula SAVE permite volver a editar y leer los GET's, si no se especifica una vez ledos se borran. Teclas de direccin de pantalla completa: Tecla Accin ------------------------- ---------------------------Flecha izda./Ctrl-S Carcter izquierdo. Flecha dcha./Ctrl-D Carcter derecho. Ctrl-Flecha izda. Palabra izquierda. Ctrl-A Ctrl-Flecha dcha. Palabra derecha. Ctrl-F Flecha arriba/Ctrl-E GET anterior. Flecha abajo/Ctrl-X Prximo GET. Retorno/Ctrl-M Principio Principio del GET. Fin Ultimo carcter del GET. Ctrl-Principio Principio del primer GET. Ctrl-Fin Principio del ltimo GET. Teclas de edicin de pantalla completa: Tecla Accin ------------------------- ---------------------------Del/Ctrl-G Elimina el carcter sobre el que esta el cursor. Espacio retroceso/Ctrl-H Borra carcter a la izda. Ctrl-T Elimina palabra a la dcha. Ctrl-Y Borra desde el cursor al final del GET. Ctrl-U Restaura el GET en curso a su valor original. Ins/Ctrl-V Modo de insercin/no inser.

Teclas de escape de pantalla completa: Tecla Accin ------------------------- ---------------------------Ctrl-W/Ctrl-C Termina READ guardando GET en curso. Pgina arriba/abajo Termina READ del ltimo GET. Return Ctrl-M/Esc Termina READ sin guardar el GET en curso. Librera..: CLIPPER.LIB Ejemplo...: // Instrucciones cConfirma := "N"
@ 24,0 SAY " Quiere borrar (S/N) ? " GET cConfirma PICTURE "!"

VALID( cConfirma $ "SN" ) READ IF cConfirma = "S" .OR. cConfirma = "s" Delete Record RecNo() PACK ENDIF

RECALL
-----Elimina las marcas de borrado de registros puestas por el comando DELETE. Sintaxis..: RECALL [<mbito>] [FOR <condicin>] [WHILE<condicin>] <mbito> - Porcin del archivo a manipular, por defecto es todo (ALL). FOR/WHILE - Especifican las condiciones a cumplir. Librera..: CLIPPER.LIB

Ejemplo...: USE Help DELETE RECORD 10 RECALL dbCloseArea()

REINDEX
------Reindexa la Base de Datos en uso, segn el ndice activo. Sintaxis..: REINDEX Librera..: CLIPPER.LIB

RELEASE ------Elimina las variables de memoria. Sintaxis..: RELEASE <lista de variables>/[ALL [LIKE/EXCEPT<estructura>]] <lista de variables> - Son las que hay que eliminar. <estructura> - Es una mscara de comodn para incluir o excluir de la eliminacin.

ALL - Solo eliminamos las variables del procedimiento en curso, pero no de los superiores. Librera..: CLIPPER.LIB

RENAME
-----Renombra (cambia el nombre) ficheros. Antes de renombrar un fichero en uso habr que cerrarlo. Tambin hay que incluir la extensin (si tiene), y si una Base de Datos a renombrar tienen un fichero (.DBT) asociado tambin se deber de cambiar el nombre. Sintaxis..: RENAME <archivo1> TO <archivo2> <archivo1> - Contiene el nombre que se ha de cambiar. <archivo2> - Contiene el nuevo nombre. Librera..: CLIPPER.LIB Ejemplo...: RENAME Help.dbf TO Comandos.dbf

REPLACE
------Cambia el contenido de los campos por el de las expresiones especificadas. Sintaxis..: REPLACE [<mbito>] [<alias>->] <campo1> WITH <expr1> [,<campo2> WITH <expr2> ...] [FOR <condicin>] [WHILE<condicin>] <mbito> -Porcin de archivo a manipular, por defecto es todo (ALL). <alias> - Reemplaza campos de otras reas de trabajo precedidos por su alias. alias -> campo <expr> - Expresin por la cual reemplazaremos el campo. FOR/WHILE- Especifican las condiciones a cumplir por los registros.

Librera..: CLIPPER.LIB Ejemplo...: SELECT 1 USE Alumnos ALIAS ALUM SELECT 0 USE Recibo ALIAS REC dbAppend() REPLACE REC->REBALUM WITH ALUM->NOMALUM READ // ---dbCloseArea()

REPORT FROM
----------Muestra un informe por pantalla o impresora. Sintaxis..: REPORT FROM <archivo1> [<mbito>] [FOR <condicin>] [WHILE <condicin>] [TO PRINT] [TO FILE <archivo2>] [SUMMARY] [PLAIN] [HEADING<encabezado>] [NO EJECT] <archivo1> - Es el nombre del archivo de formato, de extensin (.frm), si no se especifica. <mbito> FOR/WHILE TO PRINT - Porcin de archivo a manipular, por defecto es todo (ALL). - Condiciones a cumplir por los registros. - Reenva la salida a la impresora.

TO FILE <archivo2> - Reenva la salida a un archivo de texto (.txt).

SUMMARY PLAIN

- Visualiza un grupo, subgrupo y nmero total de lneas. - Suprime la visualizacin de la fecha, el nmero y la paginacin.

HEADING <encabezado> - Visualiza un encabezado en la primera lnea de cada pgina. Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX Clientes REPORT FROM Clientes.frm TO PRINT dbCloseArea()

RESTORE
------Restaura las varibles de memoria de un archivo (.MEM) en disco. Sintaxis..: RESTORE FROM <archivo> [ADDITIVE] <archivo> - Es el archivo (.MEM) que cargamos desde disco. ADDITIVE - Agrega las variables cargadas al grupo de variables existentes. Si los nombres son iguales se sobreescriben a no ser que esten ocultas. Librera..: CLIPPER.LIB Ejemplo...: SAVE ALL LIKE COL* TO Config // <instrucciones> RESTORE FROM Config

RESTORE SCREEN -------------Restaura una pantalla previamente salvada. Sintaxis..: RESTORE SCREEN [FROM <variable>] Librera..: CLIPPER.LIB Ejemplo...: SAVE SCREEN TO cBuffer // <instrucciones> RESTORE SCREEN FROM cBuffer

RETURN -----Termina un programa o procedimiento devolviendo el control al procedimiento de llamada o al sistema operativo. Sintaxis..: RETURN [<valor de respuesta de una funcin>] Ejemplo...: PROCEDURE <nombre procedimiento> /* <instrucciones> */ RETURN FUNCTION <nombre funcin> /* <instrucciones> */ RETURN <valor de respuesta> Librera..: CLIPPER.LIB

RUN/!
----Ejecuta un comando o programa DOS dentro de un programa compilado. Sintaxis..: RUN/! <orden/programa DOS> Librera..: CLIPPER.LIB Ejemplo...: CLS ? "Escriba EXIT para volver al programa" RUN COMMAND

SAVE ---Graba las variables de memoria indicadas en un archivo de memoria (.MEM). Sintaxis..: SAVE <archivo> [ALL [LIKE/EXCEPT <estructura> ]] <archivo> - Es el nombre del archivo donde se almacenarn. La extensin por defecto es (.MEM). <estructura> - Es la mscara de comodn para especificar las variables de memoria a grabar. Librera..: CLIPPER.LIB Ejemplos..: COL_MENU = "W+/B" COL_FONDO = "BG/N" SAVE ALL LIKE COL* TO Config

SAVE SCREEN
----------Guarda en una variable de memoria la pantalla actual. La variable ha de ser de tipo carcter y ocupa 4000 bytes. Sintaxis..: SAVE SCREEN [ TO <variable> ] Librera..: CLIPPER.LIB Ejemplo...: SAVE SCREEN TO cBuffer

SEEK
---Busca un dato en una clave ndice. Sintaxis..: SEEK <cualquier tipo de dato> Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX Nombres cBusca := Space( 30 ) @ 24,00 SAY "Indique nombre a buscar: " GET cBusca READ Seek Trim( cBusca ) IF Found() QOut( Clientes->NOMBRE ) ENDIF dbCloseArea()

SELECT
-----Selecciona una rea de trabajo para nuestros archivos Sintaxis..: SELECT <rea de trabajo>/<alias> <rea de trabajo> - Es un nmero entre 0 y 254. La primera rea de trabajo es cero. <alias> - Es el seudnimo del rea de trabajo. Librera..: CLIPPER.LIB Ejemplo...: SELECT 0 USE Clientes INDEX Clientes ALIAS CLI SELECT 1 USE Facturas ALIAS FACT SELECT CLI // ... dbCloseAll()

SET ALTERNATE
------------Dirige las rdenes que no sean @...SAY...GET a un fichero de texto. Por defecto esta en OFF. Sintaxis..: SET ALTERNATE TO [<fichero>] SET ALTERNATE ON/OFF Librera..: CLIPPER.LIB Ejemplo...: SET ALTERNATE TO document SET ALTERNATE ON // ... SET ALTERNATE OFF CLOSE ALTERNATE

SET BELL
-------Activa/desactiva el sonido del timbre cuando llegamos al final de un campo. Por defecto esta en OFF. Tambin podemos utilizar: ?? Chr(7) Sintaxis..: SET BELL ON/OFF/<expr> Librera..: CLIPPER.LIB

SET CENTURY
----------Activa/desactiva el uso de cuatro dgitos para los aos. Por defecto esta en OFF. La nica ventaja de ponerlo en ON estriba en poder manejar fechas que no sean del siglo XX. Sintaxis..: SET CENTURY ON/OFF/<expr> Librera..: CLIPPER.LIB Ejemplo...: SET CENTURY OFF QOut( Date() ) // 15-03-92 SET CENTURY ON QOut( Date() ) // 15-03-1992

SET COLOR
--------Define los colores de pantalla. Sintaxis..: SET COLOR/COLOUR TO [<normal> [,<realzada>] [,<borde>] [,<fondo>] [,<sin escoger>]]/(<cadena>)

<normal> : Color texto y fondo para los @...SAY. <realzada> : Color texto y fondo para los get's. <borde> : Determina el color de los bordes. <fondo> : No compatible. <sin escoger> : Permite que el GET en curso se vea realzado. <cadena> : Podemos pasar los colores en forma de cadena utilizando (&). cCadena = "N/G" set color to &cCadena SET COLOR TO Restablece los valores por defecto que son: W/N,N/W,,,N/W TABLA DE COLORES Color Nmero Letra ---------------- ------------------ ---------------NEGRO 0 N AZUL 1 B VERDE 2 G CIAN 3 BG ROJO 4 R MAGENTA 5 RB CASTAO 6 GR BLANCO 7 W Adems pueden tener los siguientes atributos: + -> color alta densidad * -> parpadeo (BLINK) Librera ..: CLIPPER.LIB Ejemplo...: SET COLOR TO "W+/B,N/G" // O tambin: cColor := "W+/B,N/G" SET COLOR TO &cColor

SET CONFIRM
----------Activa/desactiva la confirmacin de una tecla para los GET's cuando estan llenos. Por defecto esta en OFF. Sintaxis..: SET CONFIRM ON/OFF Las siguientes teclas terminan las clusulas GET's: * Ctrl-Inicio * Ctrl-Fin * Flecha arriba * Flecha abajo * Ctrl-C, pgina arriba * Ctrl-W, pgina abajo * Esc * Return Librera..: CLIPPER.LIB

SET CONSOLE ----------Visualiza las rdenes por pantalla o no. Por defecto esta en ON. Sintaxis..: SET CONSOLE ON/OFF Librera..: CLIPPER.LIB Ejemplo...: USE Clientes SET CONSOLE OFF LIST nombre, dir, pob TO PRINT SET CONSOLE ON dbCloseArea()

SET CURSOR
---------Activa/desactiva el cursor de la pantalla. No afecta a la entrada de datos ya que lo nico que hacemos es ocultarlo. Por defecto esta en ON.

Sintaxis..: SET CURSOR ON/OFF Librera..: CLIPPER.LIB Ejemplo...: SET CURSOR OFF do Pantalla // Pantalla logotipo InKey(0) SET CURSOR ON

SET DATE
-------Determina el formato de la fecha a visualizar y a utilizar. Sintaxis..: SET DATE TO AMERICAN | ANSI | BRITISH | FRENCH GERMAN | ITALIAN El parmetro por defecto es AMERICAN, yo utiliz el ITALIAN. Formatos de SET DATE: Parmetro ------------------AMERICAN ANSI BRITISH FRENCH GERMAN ITALIAN Formato -------------------mm/dd/yy yy.mm.dd dd/mm/yy dd/mm/yy dd.mm.yy dd-mm-yy

Librera..: CLIPPER.LIB Ejemplo...: SET DATE TO ITALIAN QOut( Date() ) // dd-mm-aa

SET DECIMALS
-----------Configura el nmero de decimales de funciones y clculos numricos. Sintaxis..: SET DECIMALS <n de decimales> Librera..: CLIPPER.LIB Ejemplo...: SET DECIMALS TO 2 QOut( 3/2 ) // = 1.50

SET DEFAULT
----------Determina la unidad y directorio de trabajo del programa. Sintaxis..: SET DEFAULT TO <unidad> [:<ruta>]/[<cadena>] Para establecer una ruta de bsqueda para acceso de archivos use SET PATH. Ya que SET DEFAULT se usa para los archivos de nueva creacin. SET DEFAULT TO, sin argumento, pasa al ltimo directorio usado por la unidad designada. Librera..: CLIPPER.LIB Ejemplo...: SET DEFAULT TO c:\clipper\programs ? File( "Clientes.dbf" ) // = .T.

SET DELETED
----------Activa/desactiva la visualizacin de los registros marcados para borrar. Por defecto esta en OFF. Cuando esta en ON se ignoran los registros marcados, aunque podemos verlos si hacemos un GOTO.

Sintaxis..: SET DELETED ON/OFF Librera..: CLIPPER.LIB

SET DELIMITERS
-------------Define los caracteres de limitacin de los GET's. Sintaxis..: SET DELIMITERS ON/OFF SET DELIMITERS TO [<cadena con los delimitadores>/DEFAULT] Librera..: CLIPPER.LIB Ejemplo...: SET DELIMITERS TO "[]" SET DELIMITERS ON cNombre := Space( 20 ) @ 5,5 SAY "Nombre : " GET cNombre READ // Resultado = Nombre: [ ]

SET DEVICE
---------Redirecciona las salidas por pantalla o por impresora. Por defecto es por pantalla. Sintaxis..: SET DEVICE TO SCREEN/PRINTER Librera..: CLIPPER.LIB Ejemplo...: // -------------------------------------------------// Procedimiento: ListaCursos // Descripcin..: Ejemplo completo de impresin // --------------------------------------------------

PROCEDURE ListaCursos LOCAL nPagina := 1 LOCAL nFila := 5 IF !IsPrinter() // Impresora no conectada do MsgImpresora // Mensaje que conecte InKey(0) ENDIF SET DEVICE TO PRINT USE Cursos INDEX Cursos dbGoTop() @ 0,0 SAY Chr(15) // Impresin comprimida // Cabecera @ 1,0 SAY "LISTADO CURSOS" @ 1,115 SAY "Pgina : " + lTrim(Str(nPagina)) @ 2,115 SAY "Fecha..: " + DtoC(Date()) @ 3,0 SAY "N" @ 3,10 SAY "Nombre Curso" @ 3,90 SAY "Precio" @ 4,0 SAY Replicate( Chr(196), 132 ) // Fin cabecera // Ancho 132 es el mximo para impresoras de // 80 columnas en modo comprimido DO WHILE !Eof() @ nFila, 0 SAY RecNo() PICTURE "9999" @ nFila,10 SAY Cursos->NOMCURSO @ nfila,90 say Cursos->PRECIO nFila++

IF nFila >= 50 EJECT // Salto de pgina nPagina++ // Repeticin de la cabecera // etc. nFila := 5 ENDIF dbSkip() // Incrementamos registro ENDDO dbCloseArea() EJECT @ 0,0 SAY Chr(18) // Desactivamos comprimido SET DEVICE TO SCREEN RETURN // --------------------------------------------------

SET EPOCH
========= Controla la interpretacin de fechas que no tienen dgitos para el siglo. Sintaxis..: SET EPOCH TO <nAo> Librera..: CLIPPER.LIB Ejemplo...: SET EPOCH TO 1995 ? CTOD( "01/01/05" ) // = 01/01/2005

SET ESCAPE
---------Permite interrumpir un programa con ALT-C o con READ-Esc. Si lo interrumpimos nos muestra un mensaje de confirmacin. Por defecto esta en ON. Sintaxis..: SET ESCAPE ON/OFF Librera..: CLIPPER.LIB

SET EXACT
--------Determina como se compararn dos series de caracteres. Por defecto esta en OFF. Sintaxis..: SET EXACT ON/OFF Cuando esta en OFF se siguen las siguientes reglas: 1) Las cadenas primero se consideran equivalentes (.T.). 2) Luego se comparan las cadenas de acuerdo con la posicin de los caracteres, hasta que la longitud de la serie situada a la derecha del operador se agota o la comparacin da (.F.). Librera..: CLIPPER.LIB Ejemplo...: SET EXACT OFF ? "123" = "12345" ? "12345" = "123" ? "123" = "" ? "" = "123" SET EXACT ON ? "123" = "123 " ? " 123" = "123" // = .F. // = .T. // = .T. // = .F. // = .T. // = .F.

SET EXCLUSIVE
------------Permite el uso exclusivo o no Bases de Datos, ndices y campos memos, en redes locales. Por defecto esta en ON. Sintaxis..: SET EXCLUSIVE ON/OFF Librera..: CLIPPER.LIB

SET FILTER
---------Posibilita el filtrado de Bases de Datos mediante la correspondiente condicin. Sintaxis..: SET FILTER TO [ <condicin> ] Librera..: CLIPPER.LIB Ejemplo...: USE Clientes SET FILTER TO Clientes->CPOSTAL = "08240" dbGotop() LIST NOMBRE, DIRECCION, CPOSTAL SET FILTER TO // Desactiva filtro dbCloseArea()

SET FIXED
--------Determina si las salidas decimales sern segn SET DECIMALS. Por defecto esta en OFF. Sintaxis..: SET FIXED ON/OFF Cuando SET FIXED esta en OFF, los decimales se determinan segn la operacin a realizar:

Operacin Decimales visualizados ------------------- ---------------------------------Suma/resta Opera con el mayor n de decimales Multiplicacin Suma de operandos decimales Divisin SET DECIMALS Exponenciacin SET DECIMALS EXP(),LOG(),SQRT() SET DECIMALS VAL() El mismo como operando Librera..: CLIPPER.LIB Ejemplo...: SET DECIMALS TO 2 SET FIXED OFF ? 12.3456 + 10.12 // = 22.4656 ? 10.1234 / 10.12 // = 1.00

SET FORMAT TO
------------Abre un fichero de formato para entradas/salidas. Sintaxis..: SET FORMAT TO <procedimiento> <procedimiento> - Puede ser un fichero (.PRG) o(.FMT). Librera..: CLIPPER.LIB Ejemplo...: USE Cursos INDEX Cursos SET FORMAT TO PantCursos DO WHILE LastKey() != 27 dbAppend() ENDDO dbCloseArea() RETURN // -------------------------------------------------// Procedimiento : PantCursos // --------------------------------------------------

PROCEDURE PantCursos CLS @ 8,7 SAY "Cdigo Curso....." GET Field ->CODCURSO @10,7 SAY "Nombre curso....." GET Field->NOMCURSO RETURN // --------------------------------------------------

SET FUNCTION
-----------Asigna cadenas de caracteres a teclas de funcin. Sintaxis..: SET FUNCTION <n tecla funcin> TO <cadena> Nmero tecla -------------------1 - 10 11 - 20 21 - 30 31 - 40 funcin Tecla funcin --------------------------F1 a F10 Shift-F1 a Shift-F10 Ctrl-F1 a Ctrl-F10 Alt-F1 a Alt-F10

Librera..: CLIPPER.LIB Ejemplo...: SET FUNCTION 10 TO "Pulse tecla para..."

SET INDEX --------Abre los archivos de ndices especificados y activa el primero de la lista. Sintaxis..: SET INDEX TO <lista de archivos> <lista de archivos> - Puede ser hasta 15 archivos (.NTX o .NDX), separados por comas. Se puede incluir la letra de unidad y ruta, e incluso utilizar macros (&).

CLOSE INDEX o SET INDEX TO, cierran todos los archivos ndice. Librera..: CLIPPER.LIB Ejemplo...: USE Clientes SET INDEX TO Nombre, Poblacion // ... dbCloseArea()

SET INTENSITY
Activa/desactiva la sobreiluminacin de las clusulas GET's. Por defecto esta en ON, si esta en OFF, los GET's y los SAY's son del mismo color. Sintaxis..: SET INTENSITY ON/OFF

SET KEY
Asigna a una tecla la ejecucin de un procedimiento. Sintaxis..: SET KEY <valor INKEY() de la tecla> TO[<procedimiento>] Librera..: CLIPPER.LIB Ejemplo...: SET KEY 28 TO Ayuda // F1=Ayuda

SET MARGIN
Determina el margen izquierdo para las salidas impresas, incluyendo REPORT y LABEL FORM. Por defecto el margen es cero. Sintaxis..: SET MARGIN TO <posicin columna margen izquierdo> Librera..: CLIPPER.LIB Ejemplo...: SET MARGIN TO 5

SET MESSAGE
----------Indica la fila en que aparecern los mensajes y si estos estarn centrados. Sintaxis..: SET MESSAGE TO [<n fila> [CENTER/CENTRE]] SET MESSAGE TO, suprime la visualizacin de los mensajes. Librera..: CLIPPER.LIB Ejemplo...: (ver @...PROMPT, se muestra un men completo)

SET ORDER --------Determina el ndice que permanecer activo. Sintaxis..: SET ORDER TO [ <n ndice> ] <n ndice> - Puede estar comprendido entre 0 y 15. SET ORDER TO 0 - Desactiva todos los ficheros ndices. Librera..: CLIPPER.LIB Ejemplo...: USE Clientes SET INDEX TO Nombre, Poblacion // ... SET ORDER TO 0 // Lista segn archivo .DBF SET ORDER TO 1 // Lista segn NOMBRE.NTX dbCloseArea()

SET PATH
-------Especifica la ruta de bsqueda de archivos de Clipper. Sintaxis..: SET PATH TO [ <lista de rutas> ] <lista de rutas> - Identifica las rutas donde Clipper buscar los archivos si no se encuentran en el directorio en curso. Se han de incluir todas las secuencias de rutas a buscar separadas por comas o por puntos y comas. SET PATH TO - Deja la lista de rutas, y Clipper solo busca en el directorio actual. Librera..: CLIPPER.LIB Ejemplo...: SET PATH TO c:\clipper\programs,; c:\clipper\ficheros

SET PRINT
--------Activa/desactiva la salida hacia la impresora. Por defecto esta en OFF. Sintaxis..: SET PRINT ON/OFF Librera..: CLIPPER.LIB

Ejemplo...: USE Help INDEX Help SET PRINT ON // Salida impresa SET CONSOLE OFF // Suprime salida por pantalla DO WHILE !Eof() QOut( Help->COMANDO ) dbSkip() ENDDO EJECT SET PRINT OFF // Desactiva salida impresora SET CONSOLE ON // Activa salida por pantalla dbCloseArea()

SET PRINTER
----------Determina la impresora de la red local que utilizaremos. Sintaxis..: SET PRINTER TO [ <impresora>/<archivo> ] <archivo> - Enva todas las salidas de la impresora incluyendo las instrucciones @...SAY al archivo especificado, si no se especifica extensin, se aade (.PRN). SET PRINTER TO - Cierra el spool del archivo de impresin. Librera..: CLIPPER.LIB

SET PROCEDURE
------------Compila los archivos y procedimientos especificados. Sintaxis..: SET PROCEDURE TO [ <archivo> ] <archivo> - Si se omite la extensin, se asume que es (.PRG). Librera..: CLIPPER.LIB Ejemplo...: SET PROCEDURE TO Clientes.PRG SET PROCEDURE TO Proveed SET PROCEDURE TO Material

SET RELATION
-----------Relaciona dos reas de trabajo a travs de un campo clave. Muy til para la realizacin de programas de facturacin. Sintaxis..: SET RELATION [ADDITIVE] TO [ <campo1> | RECNO() | n registro1 INTO <alias1>] [,TO <campo2> | RECNO() | n registro2 INTO <alias2>] ... ADDITIVE - Aumenta las relaciones a las relaciones ya activas en el rea de trabajo actual. <campo> - Es el campo clave comn a los archivos. RECNO() - Relacin por el nmero de registro actual. <n registro> - Relacin por el n de registro especificado.

<alias> - Identificador del rea de trabajo. Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX Nombre ALIAS FACT1 NEW USE Facturas ALIAS FACT2 NEW SET RELATION TO Nombre INTO Fact1 //... dbCloseAll()

SET SCOREBOARD
-------------Desactiva la visualizacin de mensajes por parte de Clipper en los READ's y en MEMOEDIT(). Por defecto esta en ON. Sintaxis..: SET SCOREBOARD ON/OFF Librera..: CLIPPER.LIB

SET SOFTSEEK
-----------Al fallar la bsqueda con SEEK, busca el siguiente valor clave ms alto. Por defecto esta en OFF. Sintaxis..: SET SOFTSEEK ON/OFF Librera..: CLIPPER.LIB

SET TYPEAHEAD
------------Fija el tamao de la memoria intermedia del teclado. Sintaxis..: SET TYPEAHEAD TO <nmero> <nmero> - Puede estar comprendido entre 0 y 32768. Librera..: CLIPPER.LIB

SET UNIQUE
---------Evita la duplicacin de claves al crear un nuevo ndice, si esta en ON. por defecto esta en OFF. Sintaxis..: SET UNIQUE ON/OFF Librera..: CLIPPER.LIB

SET WRAP
-------Activa/desactiva la circularidad de un men, es decir, que cuando llegamos a la opcin final, volvemos a la opcin inicial o no. Por defecto esta en OFF. Sintaxis..: SET WRAP ON/OFF Librera..: CLIPPER.LIB Ejemplo...: (ver @...PROMPT, donde se muestra un men completo)

SKIP
---Mueve el puntero de registros del rea activa. Sintaxis..: SKIP <n de registros a saltar> [ALIAS <rea activa>] ALIAS - Mueve el puntero de registro en el rea de trabajo designada en vez de la que esta en curso. Librera..: CLIPPER.LIB Ejemplo...: USE Help DO WHILE .NOT. Eof() QOut( Field->COMANDO ) dbSkip() ENDDO dbCloseArea()

SORT
---Ordena una Base de Datos por uno o varios campos. Sintaxis..: SORT [<mbito>] ON <campo1> [/A][/C][/D] [, <campo n> [/A][/C][/D] TO <archivo> [FOR <condicin>] [WHILE <condicin>] <mbito> - Porcin de archivo a ordenar, por defecto es todo (ALL). <campo1>...<campo n> - Son los campos clave para la ordenacin.

/A /D /C

- Clasificacin en orden ascendente. - Clasificacin en orden descendente. - No hace distincin entre maysculas o minsculas.

<archivo>- Es el nombre del archivo destino, la extensin por defecto es (.DBF). FOR/WHILE <condicin> - Especifican las condiciones de los registros a ordenar. Los caracteres se clasifican por su valor ASCII, los nmeros se clasifican en orden numrico, las fechas en orden cronolgico y los campos lgicos no se pueden ordenar. Librera..: CLIPPER.LIB Ejemplo...: USE Help SORT TO Help87 ON COMANDO /A dbCloseArea()

STATIC
====== Declara e inicializa variables y matrices estticas. Una variable esttica, es aquella que tiene un tiempo de vida igual al del programa, pero que solo es visible desde el procedimiento o funcin en que se declara. Una vez inicializada, va conservando su valor.

Sintaxis..: STATIC <identificador> [[ := <inicializador> ], ... ] Ejemplo...: // De esta forma podemos saber el n de veces // que utilizamos una funcin de usuario. FUNCTION Main() ? x() ? x() RETURN NIL FUNCTION x() STATIC nVeces := 0 nVeces++ RETURN( nVeces ) // 1 // 2

STORE ----Inicializa variables y asigna valores (en desuso). Sintaxis..: STORE <valor> TO <lista de variables> Librera..: CLIPPER.LIB Ejemplo...: STORE 0 TO nNumero1, nNumero2

SUM
--Suma los campos numricos de una serie de registros. Sintaxis..: SUM [<mbito>] <lista de valores numricos a sumar> TO <lista de variables> [FOR <condicin>] [WHILE <condicin>] <mbito> - Porcin de archivo a sumar, por defecto es todo (ALL). <lista de variables> - Son las que recibirn los valores de SUM. FOR/WHILE <condicin> - Especifican las condiciones que han de cumplir los registros. Librera..: CLIPPER.LIB Ejemplo...: USE Ventas SUM Ventas->IMPORTE TO nSuma dbCloseArea()

TEXT
---Muestra un texto por pantalla, por impresora o lo graba en disco. Sintaxis..: TEXT [TO PRINT] [TO FILE <archivo>] <texto>... ENDTEXT

TO PRINT - Dirige la salida a impresora. TO FILE - Dirige la salida a un archivo, la extensin por defecto es (.TXT). Librera..: CLIPPER.LIB Ejemplo...: TEXT Para obtener ms informacin, consulte su manual tcnico. ENDTEXT

TOTAL
----Halla los totales de campos numricos de una Base de Datos. Sintaxis..:
TOTAL ON [<mbito>] [FIELDS <lista campos>] TO <archivo> [FOR

<condicin>] [WHILE <condicin>] <mbito> - Es la porcin del archivo a totalizar, por defecto es todo (ALL). FIELDS <lista campos> - Especifica la lista de campos a totalizar. TO <archivo> - Es el archivo destino, donde se copiarn los resultados, por defecto la extensin es (.DBF). FOR/WHILE <condicin> - Especifican las condiciones a cumplir. Librera..: CLIPPER.LIB Ejemplo...: USE Clientes TOTAL ON Fields IMPORTE TO Ventas dbCloseArea()

TYPE
---Visualiza, imprime o graba un Fichero de texto. Sintaxis..: TYPE <archivo1> [TO PRINT] [TO FILE <archivo2>] <archivo1> - Es el nombre y extensin del archivo a visualizar. TO PRINT - Imprime el archivo. TO FILE <archivo2> - Nuevo nombre que le daremos al grabarlo en disco, la extensin por defecto es (.TXT). Librera..: CLIPPER.LIB Ejemplo...: TYPE Help.prg TO PRINT

UNLOCK
-----Desactiva el bloqueo de los ficheros o registros bloqueados por el ltimo usuario. Sintaxis..: UNLOCK [ALL] ALL - Quita todos los bloqueos en curso de todas las reas de trabajo. Librera..: CLIPPER.LIB

UPDATE
-----Actualiza la Base de Datos activa con datos de otra Base de Datos. Sintaxis..: UPDATE ON <campo> FROM <nombre alias> REPLACE <campo1> WITH <dato1> [,<campo2> WITH <dato2>] ... [RANDOM] <campo> - Es el campo clave del rea de origen, el otro archivo tambin ha de estar ordenado por el mismo campo. <nombre alias> - Alias dado al rea de trabajo de origen. REPLACE <campo1> WITH <dato1> ... - Reemplaza los campos del rea de en curso con nuevos valores. RANDOM - Lee completamente la Base de Datos de origen sin importar su orden. Librera..: CLIPPER.LIB

USE
--Abre una Base de Datos, activa sus ndices y adjudica su alias. Sintaxis..: USE [<cDbf> [INDEX <cNtx> [,<cNtx n>] [EXCLUSIVE] [ALIAS <cAlias>] <cDbf> - Es el archivo de base de datos.

INDEX <cNtx> ... <cNtx n> - Son los archivos ndices. EXCLUSIVE - Abre los archivos para uso exclusivo del usuario en redes locales. ALIAS <nombre alias> - Es el nombre con el que nos referimos a los archivos. Librera..: CLIPPER.LIB Ejemplo...: USE Help INDEX Help ALIAS Ayuda // ... dbCloseArea()

WAIT
---Detiene la ejecucin del programa y espera la pulsacin de una tecla, que se guarda en una variable. Sintaxis..: WAIT [<cadena>][TO <variable>] Librera..: CLIPPER.LIB Ejemplo...: 1) WAIT TO cOpcion IF cOpcion = "S" .OR. cOpcion = "s" QUIT ENDIF WAIT " Quiere salir (S/N) ?" TO cOpcion IF cOpcion = "S" .OR. cOpcion = "s" QUIT ENDIF

2)

ZAP --Borra todos los registros de una Base de Datos. Hace lo mismo que DELETE ALL ms PACK, pero es mucho ms rpida. Sintaxis..: ZAP Librera..: CLIPPER.LIB Ejemplo...: USE Help ZAP dbCloseArea()

FUNCIONES AADD() -------Aade un nuevo elemento al final de una matriz. Sintaxis..: aAdd( <aMatriz>, >xElemento> ) Librera..: CLIPPER.LIB Ejemplo...: aAdd( anNumero, 10 )

ABS()
----Devuelve el valor absoluto de una expresin numrica. Sintaxis..: ABS(<nmero>) Librera..: CLIPPER.LIB Ejemplo...: nNumero := -150 ? Abs( nNumero )

ACHOICE() --------Ejecuta un men de seleccin mediante un array de cadenas. Sintaxis..: ACHOICE(<fila sup>,<col izda>,<fila inf>,<col dcha>, <array1>[,<array2>[,<func usu>[,<num1>[,<num2>]]]])

Notas.....: <fila..col> son las coordenadas de la ventana. <array1> contiene las cadenas a visualizar. <array2> contiene elementos lgicos, se corresponden con el array1, e indica si son seleccionables. <fun usu> funcin de usuario, recibe tres parmetros: el estado actual de ACHOICE, el elemento seleccionado, y la posicin relativa dentro de la ventana. <num1> elemento de opcin inicial, por defecto es el primero del array1 <num2> es la fila de la ventana, por defceto la posicin inicial es la cero. Librera..: EXTEND.LIB Ejemplo...: acDias := { " Lunes ", " Martes " , " Mircoles ", " Jueves ", ; " Viernes ", " Sbado ", " Domingo " } nSeleccion = aChoice( 10, 10, 17, 21,acDias )

ACLONE()
-------Duplica una matriz multidimensional. Sintaxis..: aClone( <aMatriz> ) Librera..: CLIPPER.LIB Ejemplo...: LOCAL an1 := { 1, 2, 3 } LOCAL an2 := aClone( an1 )

ACOPY() ------Copia elementos de un array a otro. Sintaxis..: ACOPY( <array1>, <array2> [,<pos ini orig> [,<n elem> [,<pos ini dest>] ] ] ) <array1> - tabla de origen <array2> - tabla destino <pos ini orig> - posicin de comienzo del elemento a copiar en el array de origen <n elem>- nmero de elementos a copiar a partir de <pos ini orig> <pos ini dest> - posicin de comienzo del elemento en el array destino para empezar a copiar Librera..: EXTEND.LIB Ejemplo...: LOCAL acDia1 := Array( 4 ) LOCAL acDia2 := Array( 3 ) LOCAL i := 0 acDia2[ 1 ] := "Lunes" acDia2[ 2 ] := "Martes" acDia2[ 3 ] := "Mircoles" acDia1[ 1 ] := "Jueves" acDia1[ 2 ] := "Viernes" acDia1[ 3 ] := "Sbado" acDia1[ 4 ] := "Domingo" aCopy( acDia1, acDia2, 1, 4 ) FOR i = 1 TO 7 QOut( acDia2[ i ] ) NEXT

ADEL()
-----Borra un elemento de un array. Sintaxis..: ADEL( <array>, <n elem> ) <array> - nombre array del que eliminaremos un elemento. <n elem> - nmero del elemento a borrar Librera..: EXTEND.LIB Ejemplo...: LOCAL anNumeros := Array( 3 ) anNumeros[ 1 ] := 1 anNumeros[ 2 ] := 2 anNumeros[ 3 ] := 3 aDel( anNumeros, 1 )

ADIR() -----Llena una serie de arrays con informacin del directorio: nombre de los archivos, tamao, fecha, hora de grabacin y atributos. Sintaxis..: ADIR( <mascara> [,<array1> [,<array2] [,<array3> [,<array4> [,<array5>]]]]]) <mascara> - Es una cadena para la bsqueda de ficheros, puede utilizar carcteres comodines (*,?). Por ejemplo: "*.dbf" <array1> - Contendr los nombres de los archivos <array2> - Contendr el tamao de los archivos

<array3> - Contendr las fechas <array4> - Contendr la hora de creacin <array5> - Contendr los atributos de los archivos: R - Slo lectura H - Oculto S - Sistema D - Directorio A - Archivador Librera..: EXTEND.LIB Ejemplo...: aDir( "*.dbf", axFicheros ) Para obtener el mximo rendimiento proceda del siguiente modo: 1) Llene los arrays con toda la informacin de los ficheros que desee. 2) Concatenelos para mostrarlos por pantalla, para la fecha no olvide utilizar la funcin DTOC(). 3) Muestrelos con ACHOICE() para escoger uno.

AEVAL()
------Ejecuta un bloque de cdigo en cada elemento de una matriz. Sintaxis..: aEval( <aMatriz>, <bBloque>, <nInicio>, <nPosiciones> ) <aMatriz> - Es la matriz a recorrer. <bBloque> - Es el bloque de cdigo a ejecutar. <nInicio> - Es el elemento inicial. Por defecto, 1. <nPosiciones> - Es el n de elementos a procesar. Por defecto, todos. Librera..: CLIPPER.LIB

AFIELDS() --------Llena una serie de arrays con los nombres de los campos, clases de campos, longitudes de campo y decimales de campo. Sintaxis..: AFIELDS([<array1> [,<array2> [,<array3>[,<array4>]]]]) <array1> - Contiene los nombres de los campos. <array2> - Contiene los tipos de los campos. <array3> - Contiene las longitudes. <array4> - Contiene el nmero de decimales. <array1> y <array2> - contienen cadenas <array3> y <array4> - contienen nmeros

Sin parmetros AFIELDS() da cero. Librera..: EXTEND.LIB Ejemplo...: USE Help nNumCampos = fCount() acNombre := Array( nNumCampos ) acTipo := Array( nNumCampos ) anLong := Array( nNumCampos ) anDec := Array( nNumCampos ) aFields( acNombre, acTipo, anLong, anDec ) // ... dbCloseArea()

AFILL()
------Rellena los elementos de un array con un valor determinado. Sintaxis..: aFill( <array>, <valor> [,<1er. elem> [,<n elem>]]) <array> - Tabla a rellenar. <valor> - Depende del tipo de datos, es el valor que tendrn los elementos del array. <1er. elem> - Posicin del primer elemento a llenar. <n elem> - Nmero de elementos a llenar a partir de la posicin del primer elemento. Librera..: EXTEND.LIB

Ejemplo...: LOCAL anNumeros := Array( 10 ) LOCAL acCadenas := Array( 5 ) aFill( anNumeros, 0 ) aFill( acCadenas, Space( 10 ) )

AINS() -----Inserta un elemento sin definir en un array. Sintaxis..: AINS( <array>, <pos elem> ) <array> - Es la tabla en la cual insertaremos un nuevo elemento.

<pos elem> - Posicin en la cual se insertar un nuevo elemento. Librera..: EXTEND.LIB Ejemplo...: LOCAL anNumeros := Array( 3 ) anNumeros[1] = 1 anNumeros[2] = 2 anNumeros[3] = 3 ? anNumeros[2] // = 2 aIns( anNumeros, 2 ) ? anNumeros[3] // = 2

ALERT() ------Muestra una sencilla caja de dilogo. Devuelve el valor de la opcin seleccioanda, o 0, si pulsamos <Esc>. Sintaxis..: Alert( <cMensaje>, [ <acOpciones> ] ) Librera..: CLIPPER.LIB Ejemplo...: IF !IsPrinter() IF Alert( "CONECTAR IMPRESORA", { "No", "S" } ) = 1 RETURN NIL ENDIF ENDIF // Imprimir ...

ALIAS()
------Devuelve el seudnimo del rea de trabajo especificada. Sin argumento da una cadena nula (""). Sintaxis..: ALIAS( [<nmero rea>] ) Librera..: CLIPPER.LIB Ejemplo...: SELECT 1 USE Help INDEX Help ALIAS Ayuda ? Alias( 1 ) // = Ayuda

ALLTRIM()
--------Elimina los espacios a derecha y a izquierda de una cadena de caracteres. Sintaxis..: ALLTRIM ( <cadena> ) Librera..: EXTEND.LIB Ejemplo...: nNumero := 50 cNumero := Str( nNumero ) // La expresin anterior dejar 8 // espacios a la izquierda. // Para eliminarlos podemos utilizar // ALLTRIM() o LTRIM() ? AllTrim( cNumero )

ALTD()
-----Ejecuta Debugger o activa/desactiva su uso con ALT-D. Sintaxis..: ALTD( [<nmero>] ) Segn el argumento: Ninguno - Invoca Debugger 0 - Desactiva ALT-D 1 - Activa ALT-D 2 - Invoca Debugger Librera..: CLIPPER.LIB

ARRAY()
------Crea una matriz de una longitud especificada, sin inicializar. Sintaxis..: Array( <nElementos> [, <nElementos> ...] ) Librera..: CLIPEPR.LIB Ejemplo...: axMatriz := Array( 2, 3 )

ASC() ----Devuelve un valor numrico ASCII correspondiente a un carcter. Sintaxis..: ASC( <cadena> ) Si la cadena contiene ms de un carcter solo indica el valor ASCII del primer carcter. Librera..: CLIPPER.LIB Ejemplo...: ? Asc( "A" ) // = 65

ASCAN() ------Busca un elemento en un array, y devuelve su posicin. Si no lo encuentra devuelve un cero. Sintaxis..: ASCAN( <array>, <dato>, [,<pos ini> [,<n elem>]] ) <array> - Es la tabla a explorar.

<dato>

- El valor a busca, puede ser cualquier dato

<pos ini> - Elemento de comienzo. <n elem> - Nmero de elementos a explorar. Librera..: EXTEND.LIB Ejemplo...: adir( "*.*", axFicheros ) nBusca = aScan( axFicheros, "HELP.DBF" ) IF nBusca = 0 ? "No existe el fichero: HELP.DBF" ENDIF

ASIZE() ------Amplia o reduce una matriz. Sintaxis..: aSize( <aDestino>, <nLongitud> ) <aDestino> - Matriz a ampliar o reducir. <nLongitud> - Nuevo tamao de la matriz. Librera..: CLIPPER.LIB Ejemplo...: anNumero := Array( 3 ) aFill( anNumero, 0 ) aSize( anNumero, 5 ) // = 0, 0, 0, NIL, NIL

ASORT()
------Ordena un array de forma ascendente. Sintaxis..: ASORT( <array> [,<1er. elem> [,<n elem>]]) <array> - Es la tabla a clasificar.

<1er. elem> - Primer elemento de la clasificacin, por defecto es el primero. <n elem> - Nmero de elementos a clasificar, por defecto son todos. Librera..: EXTEND.LIB Ejemplo...: LOCAL acPuntos := ; { "NORTE", "SUR", "ESTE", "OESTE" } aSort( acPuntos ) FOR i = 1 TO 4 ? acPuntos[ i ] NEXT //Resultado: ESTE // NORTE // OESTE // SUR

AT() ---Busca series de caracteres dentro de una cadena y devuelve su posicin de comienzo numrica que ocupan. Sintaxis ..: AT( <subcadena>, <cadena> ) Librera ..: CLIPPER.LIB Ejemplo...: ? At( "n", "Angel" ) // = 2 ? At( "ng","Angel" ) // = 2

ATAIL() ------Devuelve el valor del ltimo elemento de una matriz. Sintaxis..: aTail( <aMatriz> ) Librera..: CLIPPER.LIB Ejemplo...: anNumero := { 1, 2, 3 } ? aTail( anNumero ) // = 3

BDGOTOP() --------Desplaza el puntero de la Base de Datos al primer registro lgico. Equivale al comando GO TOP. Sintaxis..: dbGoTop() Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX Clientes NEW dbGoTop() ? "Primer Registro: " + Clientes->NOMBRE dbCloseArea()

BIN2I() ------Convierte formas numricas de 16 bits a un valor numrico de Clipper. Se utiliza para la conservacin de valores numricos cuando manejamos ficheros a bajo nvel del DOS. Muy til si tenemos que manejar ficheros creados con el lenguaje Basic. Sintaxis..: BIN2I( <serie de 2-bytes en forma de n de 16-bits> ) Librera..: EXTEND.LIB Ejemplo...: Ver funcin FREADSTR()

BIN2L() ------Convierte una serie de caracteres en forma de nmero de 32-bits a un valor numrico Clipper. Sintaxis..: BIN2L( <serie de 4-bytes en forma de n de 32-bits> ) Librera..: EXTEND.LIB Ejemplo...: Ver funcin FREAD()

BIN2W()
------Convierte una serie de caracteres en forma de 16-bits a un valor numrico Clipper. Sintaxis..: BIN2W( <serie de 2-bytes en forma de n de 16-bits> ) Librera..: EXTEND.LIB Ejemplo...: Ver funcin FREAD()

BOF() ----Determina si tenemos el puntero al principio del fichero. Devuelve un valor lgico (.T. / .F.). Sintaxis..: BOF() Librera..: CLIPPER.LIB Ejemplo...: USE Help dbGotop() ? RecNo() // = 1 ? Bof() // = .F. dbSkip( -1 ) ? RecNo() // = 1 ? Bof() // = .T. dbCloseArea()

BREAK() ------Interrumpe la ejecucin de una estructura: BEGIN SEQUENCE ... END Sintaxis..: Break( <expresin> ) <expresin> - Es el valor pasado a la clusula RECOVER. Librera..: CLIPEPR.LIB Ejemplo...: bGuardar := ErrorBlock( { |x| Break( x ) } ) BEGIN SEUQENCE // ... RECOVER USING oError // ... END ErrorBlock( bGuardar )

BROWSE() -------Visualiza registros en una ventana. Sintaxis..: BROWSE( [ <nSuperior> ], [ <nIzquierda> ], [ <nInferior> ], [ <nDerecha> ] ) Si no se especifican las coordenadas, los valores por defecto son: 1, 0, MaxRow(), MaxCol(). Librera..: EXTEND.LIB Ejemplo...: USE Clientes Browse() dbCloseArea()

CDOW() -----Devuelve el nombre del da de la semana de una fecha. Sintaxis..: CDOW( <fecha> ) Librera..: CLIPPER.LIB Ejemplo...: ? Date() ? cDow( Date() ) // = 07-03-92 // = Sbado

CHR() ----Devuelve el carcter ascociado a un cdigo ASCII. Puede utilizarse para emitir ptidos, o enviar cdigos de control a la impresora. Sintaxis..: CHR( <nmero> ) Librera..: CLIPPER.LIB Ejemplo...: cMsg = "Esto es una prueba" ? Chr( 7 ) ? Chr( 65 ) // Emite ptido // = A // Salida impresa // Impresin comprimida // Salto pgina // Desactivamos comprimida

SET DEVICE TO PRINT ? Chr(15) ? cMsg EJECT ? Chr(18)

SET DEVICE TO SCREEN // Salida por pantalla

CMONTH()
-------Devuelve el nombre del mes de una fecha. Sintaxis..: CMONTH( <fecha> ) Librera..: CLIPPER.LIB Ejemplo...: ? Date() ? cMonth( Date() ) // = 06-03-95 // Marzo

COL()
----Devuelve el nmero de la columna donde se encuentra el cursor. Utilicelo junto con ROW() para crear procedimientos independientes de la posicin de la pantalla. Sintaxis..: COL() Librera..: CLIPPER.LIB Ejemplo...: 1) 2) ? Col() @ 5, Col() + 5 SAY "ABC" nColumna = Col()

COLORSELECT()
------------Activa un atributo de la lista de atributos de color. Sintaxis..: ColorSelect( <nIndiceColor> ) <nIndiceColor>, se corresponde con el orden de colores de SetColor(), y que se definen en Color.ch: Constante Valor -----------------------------------CLR_STANDARD (Primer plano) 0 CLR_ENHANCED (Gets activos) 1 CLR_BORDER (Borde, slo EGA y VGA) 2 CLR_BACKGROUND (No utilizado) 3 CLR_UNSELECTED (Gets no activos) 4 Librera..: CLIPPER.LIB Ejemplo...: cColor := SetColor() ColorSelect( CLR_ENHANCED )

CTOD()
-----Convierte una cadena de caracteres en un valor de fecha. Sintaxis..: CTOD( <cadena> ) <cadena> - Ha de ser una serie de nmeros separados por un carcter delimitador. Podemos especificar una fecha nula con SPACE(8) o como (" - - ").

Librera..: CLIPPER.LIB Ejemplo...: ? CtoD("01-01-95") // = 01-01-95 ? CtoD(" - - ") // = - ? CtoD( space(8) ) // = - ? CtoD("") // = - -

CURDIR()
-------Determina la ruta del directorio de DOS actual en la unidad de disco especificada. Sintaxis..: CURDIR([ <letra unidad disco> ]) Librera..: EXTEND.LIB Ejemplo...: ? CurDir( c ) ? CurDir( c: ) // = CLIPPER\HELP // = CLIPPER\HELP

DATE() -----Devuelve la fecha del sistema en un formato determinado con SET DATE y SET CENTURY. Por defecto es formato fecha americano y century off. Tambin puede utilizarse para la declaracin de variables de fecha. Sintaxis..: DATE() Librera..: CLIPPER.LIB Ejemplo...: SET DATE TO ITALIAN // Formato: dd-mm-aa ? Date() @ 0,70 SAY Date() PICTURE "@D" dFecha := Date()

DAY
--Devuelve el nmero del da del mes de la fecha especificada. Tiene en cuenta los aos bisiestos. Sintaxis..: DAY( <fecha> ) Librera..: CLIPPER.LIB Ejemplo...: SET DATE TO ITALIAN @ 0,70 SAY Day( Date() )

DBAPPEND() ---------Aade un nuevo registro. Es el equivalente en funcin al comando APPEND BLANK. Sintaxis..: dbAppend() Librera..: CLIPPER.LIB Ejemplo...: USE Clientes @ 05,10 SAY "Nombre...:" GET cNombre //... READ dbAppend() FieldPut( 1, cNombre ) //... dbCloseArea()

DBCLEARFILTER() --------------Borra una condicin de filtro. Es el equivalente a SET FILTER TO (sin parmetros). Sintaxis..: dbClearFilter() Librera..: CLIPPER.LIB Ejemplo...: USE Clientes dbSetFilter( { || TOTAL >= 500000 }, "TOTAL >= 500000" ) Browse() dbClearFilter() dbCloseArea()

DBCLEARINDEX() -------------Cierra todos los ndices del rea de trabajo actual. Sintaxis..: dbClearIndex() Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX Clientes //... dbClearIndex() dbCloseArea()

DBCLEARRELATION() ----------------Borra las relaciones activas. Sintaxis..: dbClearRelation() Librera..: CLIPPER.LIB Ejemplo...: USE Clientes USE Facturas SELECT Clientes dbSetRelation( "Facturas", { || Clientes->CodCli }, ; "Clientes->CodCli" ) Browse() dbClearRelation() dbCloseAll()

DBCLOSEALL()
-----------Cierra todas las reas de trabajo activas. Sintaxis..: dbCloseAll() Librera..: CLIPPER.LIB Ejemplo...: SELECT 1 USE Clientes INDEX Clientes ALIAS CLI SELECT 2 USE Pedidos INDEX Pedidos ALIAS PED //... dbCloseAll()

DBCLOSEAREA() ------------Cierra una rea de trabajo. Sintaxis..: dbCloseArea() Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX Clientes Browse() dbCloseArea()

DBCOMMIT() ---------Escribe en disco las actualizaciones pendientes del rea de trabajo actual. Habitualmente se utiliza en red. Sintaxis..: dbCommit() Librera..: CLIPPER.LIB Ejemplo...: USE Clientes EXCLUSIVE @ 05,10 SAY "Nombre: " GET cNombre READ //... IF Updated() dbAppend() FieldPut( 1, cNombre ) dbCommit() // Si hubiese varias reas de trabajo -> dbCommitAll() ENDIF dbUnLock() dbCloseArea()

DBCOMMITALL() ------------Escribe en disco las actualizaciones pendientes de todas las reas de trabajo. Sintaxis..: dbCommitAll() Librera..: CLIPPER.LIB Ejemplo...: Ver funcin dbCommit()

DBCREATE() ---------Crea una Base de Datos a partir de una matriz que contiene su estructura. Sintaxis..: dbCreate( <cBaseDatos>, <aEstructura>, [ <cControlador> ] ) <cBaseDatos> - Nombre de la Base de Datos. Puede ser una cadena o estar en una variable. <aEstructura> - Matriz con la estructura de la Base de Datos. Consta de 4 columnas: 1) Para el Nombre del Campo. 2) Contiene el tipo del campo: C = Carcter, N = Numrico, D = Fecha, L = Lgicos, M = Memo 3) Contiene el ancho del campo. Los fijos son: D = 8, L = 1, M = 10. 4) Contiene el n de decimales. Solo para los campos numricos.

<cControlador> - Especifica el nombre del controlador de Base de Datos sustituible (RDD). Librera..: CLIPPER.LIB Ejemplo...: dbCreate( "CLIENTES", ; { { "NOMBRE" , "C", 40, 0 }, ; { "DIRECCION", "C", 40, 0 }, ; { "POBLACION", "C", 40, 0 }, ; { "DNI" , "N", 08, 0 } } )

DBCREATEINDEX() --------------Crea un fichero ndice. Equivale al comando INDEX. Sintaxis..: dbCreateIndex( <cNombreIndice>, <cExpresionClave>, [ <lUnico>] ) <cNombreIndice> - Nombre del fichero ndice a crear. <cExpresionClave> - Expresin clave del fichero ndice. <lUnico> - Indica si se ha de crear un ndice nico (SET UNIQUE). Es decir, que permita o no operar con claves duplicadas.

Librera..: CLIPPER.LIB Ejemplo...: USE Clientes dbCreateIndex( "Incide1", "Nombre" ) //.. dbCloseArea()

DBDELETE() ---------Marca un registro para borrar. Equivale al comando DELETE RECORD. Sintaxis..: dbDelete() Librera..: CLIPPER.LIB Ejemplo...: USE CLientes INDEX Clientes dbSeek( "Pepe" ) IF Found() IF Alert( "Borra", { "No", "Si" } ) = 2 dbDelete() ENDIF ENDIF dbCloseArea()

DBEDIT() -------Visualiza y edita registros de una o ms reas de trabajo, en una rea de ventana definida. Emula al BROWSE de Dbase. Sintaxis..: DBEDIT( [ <fila sup> [, <col sup> [, <fila inf> [, <col inf>]]]] [, <array1>] [, <funcin usuario>] [, <array2>] [, <array3>] [, <array4>] [,<array5> ] [, <array6>] [, <array7>] )

<fila sup>, <col sup>, <fila inf>, <col inf> - Son las coordenadas de la esquina superior izquierda y de la esquina inferior izquierda de la ventana. <array1> - Array que contiene los nombres de los campos u otras expresiones de cualquier tipo. <funcin usuario> - Es una funcin definida por el usuario, para el control de las teclas en DBEDIT(), de esta forma podemos permitir la modificacin de campos o la insercin de nuevos registros. Se ha de especificar el nombre de la funcin sin los parntesis y entre comillas. <array2> - Es un array de caracteres para usar como formato de columna y es igual a TRANSFORM(). <array3> - Es un array para los encabezados o ttulos de las columnas. <array4> - Es un array de caracteres para el trazado de lneas de separacin entre los encabezados y la visualizacin de los campos. <array5> - Es un array de caracteres para el trazado de lneas de separacin de columnas. <array6> - Es un array de caracteres para el trazado de lneas de separacin entre pies de pgina y los campos. <array7> - Es un array de caracteres para visualizarse como pies de pgina de columna.

Teclas activas de DBEDIT() -------------------------Tecla Accin ----------------- -----------------------------------Flecha arriba Fila anterior Flecha abajo Fila posterior Flecha izquierda Columna a la izquierda Flecha derecha Columna a la derecha Ctrl-flecha izda. Columna a la izquierda Ctrl-flecha dcha. Columna a la derecha Inicio Primera columna de la pantalla Fin Ultima columna de la pantalla Ctrl-Inicio Primera columna de DBEDIT() Ctrl-Fin Ultima columna de DBEDIT() Pgina anterior Pantalla anterior Pgina siguiente Pantalla siguiente Ctrl-pag. ant. Primera fila Ctrl-pag. sig. Ultima fila Return Salida de DBEDIT() Esc Salida de DBEDIT() Si usamos una funcin de usuario DBEDIT() le pasa los valores de su estado que sn: Modalidad Descripcin ----------------- -----------------------------------0 Inactivo. 1 Intento de ir ms all del principio del archivo. 2 Intento de ir ms all del final del archivo. 3 Archivo de base de datos vaco. 4 Pulsar una tecla especfica.

Despus de ser llamada la funcin de usuario devuelve un valor a DBEDIT() para ejecutar una accin. Valor Descripcin ----------------- -----------------------------------0 Salida de DBEDIT(). 1 Continuar DBEDIT(). 2 Rellena pantalla con los datos, y continuamos con DBEDIT(). 3 Activa la posibilidad de adicin. Librera..: EXTEND.LIB Ejemplo...: // -------------------------------------------------// Funcin ......: ConsuCursos // Descripcin...: Consulta de cursos //-------------------------------------------------FUNCTION ConsuCursos() LOCAL acCampos := { "RecNo()", "CODIGO", ; "CURSO", "PRECIO" } LOCAL acTitulo := { "N Reg.", "Cdigo", ; "Curso", "Precio" } CLS USE Cursos INDEX Cursos dbEdit( 0, 0, 24, 79, acCampos,"", "", acTitulo ) dbCloseArea() RETURN NIL // --------------------------------------------------

DBEVAL() -------Evala un bloque de cdigo en cada registro dentro de un mbito que cumpla una condicin. Sintaxis..: dbEval( <bBloque>, [ <bCondicionFor> ], [ <bCondicionWhile> ], [ <nRegistrosSiguientes> ], [ <nRegistros> ], [ <lResto> ] ) <bBloque> <bCondicionFor> - Bloque de cdigo a ejecutar en cada registro. - Condicin opcional que se evala en cada registro del mbito. Equivale a la clusula FOR. - Condicin opcional que se evala en cada registro del mbito. Equivale a la clusula WHILE.

<bCondicionWhile>

<nRegistrosSiguientes> - N opcional de registros a procesar. Equivale a la clusula NEXT. <nRegistros> <lResto> - N opcional de registros a procesar. Equivale a la clusula RECORD. - Indica el mbito de los registros. Si es .F. (opcin por defecto) se procesan todos los registros. En caso contrario, desde el actual.

Librera..: CLIPPER.LIB Ejemplo...: USE Ventas NEW nTotal := 0 dbEval( { || nTotal += Ventas->TOTAL }, ; { || Ventas->VENDEDOR = 1 } ) ? nTotal dbCloseArea()

DBF() ----Devuelve el nombre del alias actual. Funcionamiento idntico a Alias(), solo utilizar para compatibilizar con dBase III+. Sintaxis..: Dbf() Librera..: EXTEND.LIB

DBFILTER() ---------Determina el filtro activo en el rea de trabajo actual. Sintaxis..: DBFILTER() Librera..: CLIPPER.LIB

DBGOBOTTOM() -----------Desplaza el puntero de la Base de Datos al ltimo registro lgico. Equivale al comando: GO BOTTOM. Sintaxis..: dbGoBottom() Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX Clientes NEW dbGoBottom() ? "Ultimo Cliente: " + Clientes->NOMBRE dbCloseArea()

DBGOTO() -------Desplaza el puntero de la Base de Datos al nmero de registro indicado. Equivale al comando: GO/GOTO. Sintaxis..: dbGoTo( <nNumeroRegistro> ) Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX Clientes NEW dbGoTo( 10 ) ? "Registro n 10 " + Clientes->Nombre dbCloseArea()

DBRECALL() ---------Recupera un registro marcado para borrar. Equivale al comando RECALL. Sintaxis..: dbRecall()

Librera..: CLIPPER.LIB Ejemplo...: // Recuperamos todos los registros marcados para // borrar que encontremos. USE Clientes INDEX Clientes NEW DO WHILE !Eof() IF Deleted() dbRecall() ENDIF dbSkip() ENDDO dbCloseArea()

DBREINDEX() ----------Vuelve a crear todos los ndices activos en el rea de trabajo actual. Equivale al comando REINDEX. Sintaxis..: dbReIndex() Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX Clientes dbReIndex() dbCloseArea()

DBRELATION() -----------Determina la expresin de conexin de la relacin especificada en el rea de trabajo actual. Sintaxis..: DBRELATION( <n en la lista de relaciones> ) Librera..: CLIPPER.LIB

DBRSELECT() ----------Determina el nmero de la rea de trabajo de la relacin sealada. Sintaxis..: DBRSELECT( <n en la lista de relaciones definidas> ) Librera..: CLIPPER.LIB

DBSEEK()
-------Si encuentra un valor clave especificado desplaza el puntero de la Base de Datos a dicha posicin. Sintaxis..: dbSeek( <ExpresionClave>, [ <lBusquedaAproximada>] ) En las bsquedas aproximadas, si no encuentra el valor clave indicado, el puntero se sita en el primer registro cuyo valor clave sea mayor que el indicado.

Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX Clientes NEW dbSeek( "Pepe", .T. ) ? Clientes->NOMBRE dbCloseArea()

DBSELECTAREA() -------------Cambia el rea de trabajo actual. Equivale al comando: SELECT. Sintaxis..: dbSelectArea( <nArea> | <cAlias> ) <nArea> - Nmero de rea (de 0 a 250). <cAlias> - Nombre del alias de un rea de trabajo. Librera..: CLIPPER.LIB Ejemplo...: SELECT 1 USE Clientes INDEX Clientes SELECT 2 USE Ventas dbSelectArea( 1 ) // ... dbCloseAll()

DBSETDRIVER() ------------Devuelve el controlador de Base de Datos por defecto, y opcionalmente selecciona uno. Sintaxis..: dbSetDriver( [ <cControlador> ] ) Librera..: CLIPPER.LIB Ejemplo...: dbSetDriver( "DBBFNDX" ) IF dbSetDriver() != "DBFNDX" Alert("Controlador DBFNDX no disponible") ENDIF

DBSETFILTER() ------------Establece una condicin de filtro. Equivale al comando: SET FILTER. Sintaxis..: dbSetFilter( <bCondicion>, [ <cCondicion> ] ) <bCondicion> - Bloque de cdigo que expresa la condicin de filtro de forma ejecutable. <cCondicion> - Expresa la condicin de filtro en forma de texto. Librera..: CLIPPER.LIB Ejemplo...: USE Clientes NEW dbSetFilter( { || Cliente->EDAD > 18 } ) dbGoTop() Browse() dbClearFilter() dbCloseArea()

DBSETINDEX() -----------Abre un fichero ndice. Equivale al comando: SET INDEX. Sintaxis..: dbSetIndex( <cNombreIndice> ) Librera..: CLIPPER.LIB Ejemplo...: USE Clientes NEW dbSetIndex( "Clientes" ) Browse() dbCloseArea()

DBSETORDER() -----------Establece el orden de control de los ficheros ndice. Ya que puede que por necesidades de programa tengamos que variar el orden inicial de lso ficheros ndice activos. Equivale al comando: SET ORDER. Sintaxis..: dbSetOrder( <nNumeroOrden> ) Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX Cli1, Cli2 NEW // Indice primario -> Cli1 Browse() // Indice primario -> Cli2 dbSetOrder( 2 ) Browse() dbCloseArea()

DBSETRELATION()
--------------Relaciona dos reas de trabajo. Equivale al comando: SET RELATION. Sintaxis..: dbSetRelation( <nArea> | <cAlias>, <bExpresion>, [ <cExpresion> ] ) <nArea> <cAlias> - Nmero del rea de trabajo hija. - Alias del rea de trabajo hija.

<bExpresion> - Bloque de cdigo que contiene la expresin de la relacin en forma ejecutable. <cExpresion> - Expresin de relacin en forma de texto. Librera..: CLIPPER.LIB Ejemplo...: USE Empleado NEW USE Departamento NEW INDEX Dept SELECT Empleado dbSetRelation( "Departamento", { || Empleado->Dept }, ; "Empleado->Dept" ) Browse() dbClearRelation() dbCloseAll()

DBSKIP() -------Desplaza el puntero de la Base de Datos. Equivale al comando SKIP. Sintaxis..: dbSkip( <nSalto> ) <nSalto> - Es el n de registros lgicos a desplazar. Librera..: CLIPEPR.LIB Ejemplo...: USE Clientes DO WHILE !Eof() ? Clientes->Nombre dbSkip() ENDDO dbCloseArea()

DBSTRUCT()
---------Crea una matriz, que contiene la estructura de una Base de Datos. Sintaxis..: dbStruct() Librera..: CLIPPER.LIB

DBUNLOCK() ---------Libera todos los bloqueos del rea de trabajo actual. Equivale al comando UNLOCK. Sintaxis..: dbUnLock() Librera..: CLIPPER.LIB Ejemplo...: USE Clientes SHARED NEW dbSetIndex( "Cli1" ) dbSeek( "Pepe" ) IF Found() // Bloqueamos registro IF Clientes->( rLock() ) Clientes->( dbDelete() ) Clientes->( dbUnLock() ) ENDIF ENDIF

//... DBUNLOCKALL()
------------Libera todos los bloqueos de todas las reas de trabajo. Equivale al comando: UNLOCK ALL. Sintaxis..: dbUnLockAll() Librera..: CLIPPER.LIB Ejemplo...: Ver funcin dbUnLock(), y el tema sobre "Programacin en Red Local".

DBUSEAREA() ----------Abre una Base de Datos en una rea de trabajo. Equivale al comando: USE. Sintaxis..: dbuseArea( [ <lAreaNueva>], [ <cControlador>], <cNombre>, [<xcAlias>], [ <lCompartido>], [ <lSoloLectura> ] ) <lAreaNueva> - Si indicamos .T., seleccionamos una nueva rea de trabajo. Por defecto, es .F., y utilizamos el rea de trabajo actual.

<cControlador> - Es el nombre del controlador a utilizar. <cNombre> <xcAlias> - Es el nombre de la Base de Datos a abrir. - Indica el alias a asociar a la Base de Datos.

<lCompartido> - Indica si la Base de datos es compartida, es decir, accesible por otros usuarios de la red, o exclusiva, solo un usuario la puede utilizar. <lSoloLectura> - Indica si se prohiben actualizaciones (.T.), o (.F.) que las permite. Librera..: CLIPPER.LIB Ejemplo...: dbUseArea( .T. ,, Clientes" ) Browse() dbCloseArea()

DELETED() --------Determina si el registro actual est marcado para borrado. Devuelve un valor lgico (.T. o .F.). Sintaxis..: DELETED() Librera..: CLIPPER.LIB Ejemplo...: USE Help ? RecNo() ? Deleted() dbCloseArea() // = 1 // = .F.

DESCEND()
--------Para crear y buscar (SEEK) ndices de orden descendiente. Sintaxis..: DESCEND( <cualquier tipo de datos> ) Librera..: EXTEND.LIB Ejemplo...: // Para su uso con INDEX INDEX ON Descend( FECHAVENTA ) TO Fecha // Para usar con SEEK SEEK Descend( FECHAVENTA )

DEVOUT()
-------Escribe un valor en el dispositivo de salida actual. Equivale al @..SAY. Sintaxis..: DevOut( <expresion>, [ <cCadenaColor> ] ) Librera..: CLIPPER.LIB Ejemplo...: DevPos( 05, 10 ) DevOut( " Hola Mundo ! )

DEVOUTPICT() -----------Escribe un valor formateado en el dispositivo de salida actual. Equivale a @ SAY..PICTURE. Sintaxis..: DevOutPict( <expresion>, <cPatrnFormato>, [ <cCadenaColor> ] ) Librera..: CLIPPER.LIB Ejemplo...: DevPos( 05,10 ) DevOutPict( Date(), "@!" )

DEVPOS()
-------Desplaza el cursor o cabezal de impresin dependiendo del dispositovo actual, a una nueva posicin. Sintaxis..: DevPos( <nFila>, <nColumna> ) Librera..: CLIPPER.LIB

DIRECTORY() ----------Crea una matriz de informacin de directorios y ficheros. Sintaxis..: Directory( <cDirectorio>, [ <cAtributos> ] ) Librera..: CLIPPER.LIB

Ejemplo...: #include "Directry.ch" //... axDirectorio := Directory( "*.DBF" ) aEval( axDirectorio, ; { |aFichero| QOut( aFichero[ F_NAME ] } )

DISKSPACE() ----------Devuelve el nmero de bytes disponibles del disco especificado. Esta funcin es muy til si tenemos que pasar informacin de un disco a otro, hacer copias de seguridad, etc., ya que antes de efectuar la operacin podemos comprobar el espacio disponible. Sintaxis..: DISKSPACE([ <nmero de disco> ]) <nmero de disco> - (a: = 1, b: = 2 y c: = 3) La opcin implcita es el disco actual. Librera..: EXTEND.LIB Ejemplo...: ? "N de registros del fichero actual: " ?? Diskspace() / RecSize()

DISPBEGIN() ----------Inicia el almacenamiento en memoria intermedia de la salida por pantalla. Solo se utiliza en operaciones complejas en las que se desea aumentar la rapidez de salida por pantalla. Sintaxis..: DispBegin()

Librera..: CLIPPER.LIB Ejemplo...: DispBegin() // ... SetPos( 05, 10 ) DispOut( " Hola mundo !" ) //... DispEnd()

DISPBOX() --------Muestra un cuadro por pantalla. Equivale a los comandos: @..BOX, @..TO Sintaxis..: DispBox( <nSuperior>, <nIzquierda>, <nInferior>, <nDerecha>, [ <cnCadenaCuadro>], [ <cCadenaColor>] ) <cnCadenaCuadro> - Es una expresin numrica o de caracteres que especifica el marco. Librera..: CLIPPER.LIB Ejemplo...: // Marco Simple DispBox( 00, 00, 24, 79, 1, "W+/B" ) // Marco Doble DispBox( 00, 00, 24, 79, 2, "W+/B" )

DISPCOUNT() ----------Devuelve el nmero de llamadas DISPEND() pendientes. Sintaxis..: DispCount() Librera..: CLIPPER.LIB

DISPEND() --------Muestra en pantalla las actualizaciones almacenadas en memoria intermedia. Sintaxis..: DispEnd() Librera..: CLIPEPR.LIB Ejemplo...: Ver funcin: DispBegin()

DISPOUT() --------Escribe un valor en la pantalla. Sintaxis..: DispOut( <expresion>, [<cCadenaColor>] Librera..: CLIPPER.LIB Ejemplo...: SetPos( 05, 10 ) DispOut( " Hola mundo !" )

DOSERROR() ---------Determina el error producido por el DOS. Devuelve un valor numrico correspondiente a un error. Para la lista de errores consulte el manual de CA-Clipper. Sintaxis..: DOSERROR() Librera..: CLIPPER.LIB

DOW()
----Devuelve el nmero del da de la semana. Siendo el domingo = 1, y sbado = 7. Sin parmetros DOW() da cero. Sintaxis..: DOW( <fecha> ) Librera..: CLIPPER.LIB Ejemplo...: ? Date() // = 07-03-92 ? Dow( Date() ) // = 7 (sbado)

DTOC()
-----Convierte una fecha en una cadena de caracteres. Dependiendo el formato de SET DATE. Sintaxis..: DTOC( <fecha> ) Librera..: CLIPPER.LIB Ejemplo...: SET DATE TO ITALIAN // dd-mm-aa ? "Fecha : " + DtoC( Date() )

DTOS()
-----Convierte una fecha en una serie de carcteres adecuada para indexar una clave compuesta. Es independiente del estado de SET DATE o de SET CENTURY. El formato es siempre: aaaammdd (aomesda). Sintaxis..: DTOS( <fecha> ) Librera..: CLIPPER.LIB Ejemplo...: ? DtoS( Date() )

ELAPTIME()
---------Devuelve la diferencia en segundos entre dos cadenas de tiempo. Sintaxis..: ELAPTIME( <hora1>, <hora2> ) Librera..: CLIPPER.LIB Ejemplo...: cTiempo1 := Time() InKey( 60 ) cTiempo2 := Time() ? ElapTime( cTiempo1, cTiempo2 )

EMPTY()
------Comprueba si un dato vale cero o es cadena vaca. Sintaxis..: EMPTY( <cualquier tipo de dato> ) Lista de valores vacos, para los que devuelve .T. : Para caracteres Para nmeros Para fechas Valores lgicos - nulo o espacios -0 - nula - .F.

Librera..: CLIPPER.LIB Ejemplo...: ? EmpTy( Space( 10 ) ) // = .T. nNumero := 0 ? EmpTy( nNumero ) // = .T.

EOF()
----Comprueba si estamos al final del fichero. Sintaxis..: EOF() Librera..: CLIPPER.LIB Ejemplo...: // Un ejemplo caracterstico del uso de EOF() es // la salida de registros por pantalla o impresora LOCAL nFila := 0 // Fila de impresin

SET DEVICE TO PRINT USE Help INDEX Help

// Mientrs no llegamos al final del fichero DO WHILE !Eof() @ nFila, 00 SAY Help->COMANDO @ nFila, 20 SAY Help->DESCRIPCIO nFila++ dbSkip() ENDDO EJECT dbCloseArea() SET DEVICE TO SCREEN

ERRORBLOCK()
-----------Establece un bloque de cdigo para que se ejecute cuando surja un error de tiempo de ejecucin. Sintaxis..: ErrorBlock( [ <bManejadorError> ] ) Librera..: CLIPEPR.LIB Ejemplo...: bError := { |oError| CtrlError( oError ) } // ... ErrorBlock( oError ) Notas.....: Para mayor informacin, ver el tema: Objeto ERROR

ERRORLEVEL()
-----------Da el ambiente de nvel de EROR DOS actual. Se usa junto SWITCH.EXE para ajustar el nvel de error antes de salir de DOS al ejecutar otros programas (.EXE). Sintaxis..: ERRORLEVEL([ <nuevo entorno de nvel de error DOS> ]) Dicho nuevo entorno es un nmero comprendido entre 0 y 255. Librera..: CLIPPER.LIB

EVAL() -----Evala un bloque de cdigo. Sintaxis..: eVal( <bBloque>, [ <ListaArgumentos> ] ) <bBloque> - Es el bloque de cdigo a evaluar.

<ListaArgumentos> - Es una lista de argumentos que se envan al bloque antes de que se evale. Librera..: CLIPEPR.LIB Ejemplo...: bBloque := { |nArg| nArg + 1 } ? eVal( bBloque, 1 ) // = 2

EXP()
----Calcula e elevado a x, siendo e la base del logaritmo natural y x la potencia a que lo elevamos. Sintaxis..: EXP( <nmero> ) Librera..: CLIPPER.LIB Ejemplo...: Exp( 1 ) // = 2.72

FCLOSE()
-------Cierra un archivo abierto. Sintaxis..: FCLOSE( <n handle> ) <n handle> - es el nmero de identificacin del fichero, se obtiene al crear el fichero FCREATE() o al abrirlo FOPEN. Librera..: EXTEND.LIB Ejemplo...: // Creacin de un fichero de texto nHandle := fCreate( "Manual.doc" ) cLinea1 := "Demostracin del uso ..." + ; Chr( 13 ) + Chr( 10 ) fWrite( nHandle, @cLinea1) // etc... fClose( nHandle )

FCOUNT()
-------Devuelve el nmero de campos que tiene un registro. Sintaxis..: FCOUNT() Librera..: CLIPPER.LIB Ejemplo...: USE Help FOR i = 1 TO fCount() ? FieldName( i ) // Muestra los nombres de campos NEXT dbCloseArea()

FCREATE() --------Crea y abre un archivo del DOS. si ya existe volvemos a escribir encima de l, perdiendo lo que tenamos. Devuelve un nmero llamado handle por el que identificaremos al fichero en posteriores procesamientos. Si el nmero devuelto es -1, es que se ha producido un error. Sintaxis..: FCREATE( <nombre archivo> [,<n atributo del DOS>] ) Si se omite el n de atributo del DOS, por defecto es el cero. Atributos de archivos DOS:

Valor ----0 1 2 4

Atributo Descripcin ----------------------------------Normal Leer/grabar Slo lectura Slo podemos leerlo Oculto Excludo de bsquedas Sistema Excludo de bsquedas

Librera..: EXTEND.LIB Ejemplo...: // Hallamos nmero de identificacin del fichero // lo creamos y abrimos nHandle := fCreate( "Manual.doc" )

FERASE()
-------Borra un fichero del disco. Sintaxis..: fErase( <cFichero> ) Librera..: CLIPPER.LIB Ejemplo...: IF File( "TEMPORAL.DBF" ) fErase( "TEMPORAL.DBF" ) ENDIF

FERROR() -------Comprueba los errores producidos en el manejo de funciones de archivos de DOS. Si no hay error, devuelve un cero. Sintaxis..: FERROR() Librera..: EXTEND.LIB Ejemplo...: nHandle = fCreate( "Manual.doc" ) IF fError() <> 0 ? "Error nmero: ", fError() ENDIF

FIELDBLOCK() -----------Devuelve un bloque de cdigo de asignacin / lectura para un campo determinado. Sintaxis..: FieldBlock( <cNombreCampo> ) Librera..: CLIPPER.LIB Ejemplo...: cCliente := Field->NOMBRE bCliente := FieldBlock( "cCliente" ) ? Eval( bCliente )

FIELDGET() ---------Obtiene el valor de un campo utilizando su posicin ordinal en la estructura de la Base de Datos. Sintaxis..: FieldGet( <nCampo> ) Librera..: CLIPPER.LIB Ejemplo...: USE Clientes INDEX Nombres // Campo n 1 -> NOMBRE // Campo n 2 -> DIRECCION // Campo n 3 -> POBLACION dbSeek( "Pepe" ) FOR i := 1 TO fCount() ? FieldGet( i ) NEXT dbCloseArea()

FIELDNAME() / FIELD()
--------------------Devuelve un nombre de campo de la Base de Datos actual. Sintaxis..: FieldName( <nPosicion> ) Field( <nPosicion> ) <nPosicion> - Es la posicin que ocupa el campo dentro de la estructura de la Base de Datos. Librera..: CLIPPER.LIB Ejemplo...: USE Clientes FOR i := 1 to fCount() ? "N Campo " + Str( i ) + " " + ; FieldName( i ) NEXT dbCloseArea()

FIELDPOS()
---------Devuelve la posicin de un campo de una rea de trabajo. Si no lo encuentra devuelve 0. Sintaxis..: FieldPos( <cNombreCampo> ) Librera..: CLIPPER.LIB Ejemplo...: USE Clientes // Campo n 1 -> NOMBRE ? FieldPos( "NOMBRE" ) // = 1 dbCloseArea()

FIELDPUT() ---------Reemplaza el valor de un campo, segn su posicin dentro de la estructura de la Base de Datos. Sintaxis..: FieldPut( <nCampo>, <xExpresion> ) <nCampo> - Es la posicin ordinal del campo dentro de la estructura de la Base de Datos.

<xExpresion> - Es el valor ha asignar al campo, sus tipos de datos deben de coincidir. Librera..: CLIPPER.LIB Ejemplo...: USE Clientes CLS @ 05,10 SAY "Nombre...: " GET cNombre @ 07,10 SAY "Direccin: " GET cDireccion

@ 09,10 SAY "Poblacin: " GET cPoblacion READ dbAppend() FieldPut( 1, cNombre ) FieldPut( 2, cDireccion ) FieldPut( 3, cPoblacion ) dbCloseArea()

FIELDWBLOCK() ------------Devuelve un bloque de cdigo de asignacin / lectura para un campo en un rea determinada. Sintaxis..: FieldWBlock( <cNombreCampo>, ; <nAreaTrabajo> ) Librera..: CLIPPER.LIB Ejemplo...: Ver objeto TBrowse().

FILE() -----Comprueba la existncia del archivo indicado. Devuelve un valor lgico (.T. o .F.). Sintaxis..: FILE <cadena> <cadena> - puede contener la unidad, la ruta y el nombre y extensin del archivo. Librera..: CLIPPER.LIB Ejemplo...: IF !File( "CLIENTES.DBF" ) // Crear fichero ... ENDIF

FKLABEL() --------Devuelve un nombre de tecla de funcin. Se usa para compatibilizar con dBase III+. Sintaxis..: FkLabel( <nTeclaFuncion> ) Librera..: EXTEND.LIB

FKMAX() ------Devuelve un nmero de teclas de funcin, siempre es constante = 40. No se recomienda su uso, solo para efectos de compatibilidad con dBase III+. Sintaxis..: FkMax() Librera..: EXTEND.LIB

FLOCK() ------Bloquea/desbloquea un archivo abierto de Base de Datos dependiendo de su estado anterior. Slo se utiliza en redes locales. Sintaxis..: FLOCK() Librera..: CLIPPER.LIB

FOPEN()
------Abre un archivo del DOS. Sintaxis..: FOPEN( <ruta\nombre archivo> [,<modalidad archivo>] ) La modalidad de apertura del archivo por defecto es 0.

Modalidad Operacin --------------------------0 Slo lectura 1 Slo grabacin 2 Leer/grabar Librera..: CLIPPER.LIB Ejemplo...: nHandle := fOpen( "Manual.doc" )

FOUND() ------Indica si las bsquedas emprendidas con LOCATE, FIND o SEEK han tenido xito. Devuelve valores lgicos (.T. o .F.). Sintaxis..: FOUND() Librera ..: CLIPPER.LIB Ejemplo...: USE Help INDEX Help dbSeek( "CLEAR" ) IF Found() ? Help->DESCRIPCIO ENDIF dbCloseArea()

FREAD() ------Lee bytes de un archivo de bajo nvel del DOS. Sintaxis..: FREAD( <n handle>, @<cCadena>, <n bytes a leer> ) <n handle> - Es el nmero de identificacin del fichero obtenido de FOPEN() o FCREATE().

@<cCadena> - Variable intermedia que contendr los bytes ledos, se ha de pasar por referencia, anteponiendo el smbolo @. Librera..: EXTEND.LIB Ejemplo...: // Leemos una lnea de un fichero secuencial creado // por un interprete Basic cBuffer := Space( 210 ) // Longitud registro nHandle := fOpen( "clim.dat ") // Abrir y hallar handle cLinea := fRead( nHandle, @cBuffer, Len(cBuffer) ) fClose( "clim.dat" )

FREADSTR() ---------Lee una cadena de un archivo de bajo nvel del DOS. Sintaxis..: FREADSTR( <n handle>, <n de bytes a leer> ) <n handle> - Es el identificador del archivo. Librera..: EXTEND.LIB Ejemplo...: nHandle := fOpen( "clientes.dat" ) cBuffer := fReadStr( nHandle, 16 ) fClose( nHandle )

FRENAME() --------Cambia el nombre de un fichero. Sintaxis..: fRename( <cNombreAntiguo>, ; <cNombreNuevo> ) Librera..: CLIPPER.LIB Ejemplo...: fRename( "CLIENTES.DBF", "CLIENTES.BAK" )

FSEEK()
------Mueve un puntero en un archivo de bajo nvel del DOS. Sintaxis..: FSEEK( <n handle>, <n bytes a mover> [, <n mtodo>] ) <n handle> - Es el identificador del fichero se obtiene con FOPEN() o FCREATE(). <n bytes a mover> - Es el nmero de bytes que hay que mover el puntero a partir de la posicin definida por el n de mtodo. <n metodo> - Define el mtodo a mover. Mtodo Descripcin ------------- ---------------------------------------0 Principio de archivo 1 Posicin en curso del puntero 2 Fin de archivo

Librera..: EXTEND.LIB Ejemplo...: nHandle := fOpen( "Clientes.dat" ) // Longitud del archivo nLongitud = fSeek( nHandle, 0, 2 ) // Vuelve a fijar posicin fSeek( nHandle, 0 )

FWRITE() -------Escribe bytes en un fichero de bajo nvel del DOS. Sintaxis..: FWRITE( <n handle>,@<cadena>,[,<n bytes a grabar>]) <n handle> - Es el identificador del fichero, se obtiene con FOPEN() o FCREATE(). @<cadena> - Es la cadena a grabar. Se pasa como referencia a la funcin. <n de bytes a grabar> - Si se omite se graba el contenido completo de la cadena. Librera..: EXTEND.LIB Ejemplo...: // Escritura en un fichero de texto, hemos de aadir // al final de cada lnea, un retorno de carro y un // avance de lnea: + chr(13) + chr(10)

cLinea0 := "*--------------------*" + chr(13) + chr(10) cLinea1 := "Fecha: " + dtoc(date()) + chr(13) + chr(10) cLinea2 := "Programa realizado...." + chr(13) + chr(10) nHandle = fCreate( "Programa.prg" ) fWrite( nHandle, @cLinea0 ) fWrite( nHandle, @cLinea1 ) fWrite( nHandle, @cLinea2 ) fWrite( nHandle, @cLinea0 ) fClose( nHandle )

GETENV() -----Obtiene el contenido de una variable del entorno del DOS. Sintaxis..: GetEnv( <nombre variable DOS> ) Librera..: EXTEND.LIB Ejemplo...: // Devuelve el path vigente del DOS ? GetEnv( "path" )

HARDCR() -------Sustituye los retornos de carro temporales Chr(141), por retornos de carro permanentes Chr(13), en los campos memo. Sintaxis..: HARDCR( <campo memo> ) Librera..: EXTEND.LIB Ejemplo...: ? HardCR( Field->EJEMPLO )

HEADER() -------Determina la longitud de la cabecera del archivo de Base de Datos actual. Devuelve el nmero de bytes. Sintaxis..: HEADER() Librera..: EXTEND.LIB Ejemplo...: USE Help //- N de bytes de la cabecera ? Header() *-- N bytes del archivo ? ( RecSize() * LastRec() ) + Header() + 1 dbCloseArea()

I2BIN() ------Convierte un valor numrico a caracteres de 2 bytes. Utilizar en la conversin de archivos. Sintaxis..: I2BIN( <nmero> ) Librera..: EXTEND.LIB Ejemplo...: nHandle = fOpen( "Ventas.dbf" ) dia := i2Bin( 15 ) fSeek( nHandle, 1, 0 ) fWrite( nHandle, dia, 1 ) fClose( nHandle )

IF()/IIF()
---------Devuelve distintos valores segn las condiciones de la expresin lgica a evaluar. Sintaxis..: IF/IFF( <expresin lgica>, <exp1>, <exp2> ) <expresin lgica> - Es la que se evala. <exp1> - Es el valor que se da como respuesta si la expresin lgica es verdadera (.T.). <exp2> - Es el valor de respuesta si la expresin lgica es falsa (.F.). Librera..: CLIPPER.LIB Ejemplo...: nNumero := 100 ? IIf( nNumero > 50, "Mayor", "Menor" )

INDEXEXT() ---------Devuelve la extensin del ndice activo, segn el RDD (Driver Reemplazable) que estemos usando. Devuelve : NDX => Indices compatibles DBASE III+. NTX => Inidces Clipper. Sintaxis..: INDEXEXT() Librera..: CLIPPER.LIB

INDEXKEY() ---------Indica la expresin clave de un ndice especificado. Sintaxis..: INDEXKEY() Librera..: CLIPPER.LIB Ejemplo...: USE Help INDEX Help ? IndexKey( 1 ) dbCloseArea()

INDEXORD() ---------Devuelve la posicin del ndice de control. Si el valor es igual a cero, no hay ndice de control. Sintaxis..: INDEXORD() Librera..: CLIPPER.LIB Ejemplo...: USE Alumno INDEX Nombre, Curso nIndex = IndexOrd() // = 1 dbSetOrder( 2 ) ? IndexOrd() // = 2 dbSetOrder( nIndex ) ? IndexOrd() // = 1 dbCloseArea()

INKEY()
------Lee una pulsacin desde teclado devolviendo su valor. Sintaxis..: INKEY([ <n de segundos> ])

<n de segundo> - Es el tiempo de espera para que pulsemos una tecla. Si le indicamos cero, la espera es indefinida hasta que pulsemos una tecla. Librera..: CLIPPER.LIB Ejemplo...: @ 24,30 SAY "* Pulse una tecla *" InKey( 0 )

INT() ----Devuelve el valor entero de un nmero. Sintaxis..: INT( <expresin numrica> ) Librera..: CLIPPER.LIB Ejemplo...: nNumero := Int( 80 / nLongitud )

ISALPHA()
Determina si el primer carcter de una cadena es alfabtico. Devuelve un valor lgico. Sintaxis..: ISALPHA( <cadena> ) Librera..: EXTEND.LIB Ejemplo...: ? IsAlpha( "Help" )

ISCOLOR()
--------Comprueba si hay tarjeta de video para trabajar en color. Devuelve un valor lgico. Sintaxis..: ISCOLOR() / ISCOLOUR() Librera..: CLIPPER.LIB Ejemplo...: IF IsColor() COL_FONDO = "W+/B" ELSE COL_FONDO = "W/N" ENDI

ISDIGIT()
--------Determina si el primer carcter de una cadena es un dgito. Sintaxis..: IsDigit( <cCadena> ) Librera..: CLIPPER.LIB Ejemplo...: ? IsDigit( "1ABCDS" ) // .T.

ISLOWER() --------Comprueba si el primer carcter de una cadena esta en minsculas. Devuelve valores lgicos. Sintaxis..: ISLOWER( <cadena> ) Librera..: EXTEND.LIB Ejemplo...: ? IsLower( "help" ) ? IsLower( "Help" ) // = .T. // = .F.

ISPRINTER() ----------Comprueba si la impresora esta lista para imprimir. Devuelve un valor lgico. Sintaxis..: ISPRINTER() Librera..: EXTEND.LIB Ejemplo...: IF !IsPrinter() // Impresora no conectada @ 24,0 SAY "* Conecte la impresora, pulse tecla *" InKey( 0 ) ENDIF

ISUPPER()
Comprueba si el primer carcter de una cadena es una letra mayscula. Devuelve valores lgicos. Sintaxis..: ISUPPER( <cadena> ) Librera..: EXTEND.LIB Ejemplo...: ? IsUpper( "help" ) // = .F. ? IsUuper( "Help" ) // = .T.

L2BIN() ------Convierte un valor numrico a formato de nmero de 32 bits. Se utiliza en combinacin con FWRITE() para la escritura de datos binarios. Sintaxis..: L2BIN( <nmero> ) Librera..: EXTEND.LIB

LASTKEY() --------Devuelve el valor de la ltima tecla pulsada en un estado de espera, que puede provenir de ACCEPT, INPUT, MENU TO, READ, WAIT e INKEY(). Sintaxis..: LASTKEY() Librera..: CLIPPER.LIB Ejemplo...: // -------------------------------------------------// Funcin: AltasCodigos // -------------------------------------------------FUCNTION AltasCodigos() CLS USE Codigos INDEX Codigos DO WHILE LastKey() != 27 dbAppend() @ 10,10 SAY "<Esc> = Salir" @ 12,10 SAY "Cdigo Postal : " GET CODIGO @ 14,10 SAY "Poblacin.....: " GET POBLACION READ IF LastKey() = 27 // <Esc> = 27 dbDelete() PACK EXIT ENDIF ENDDO dbCloseArea() RETURN NIL // --------------------------------------------------

LASTREC() --------Determina el nmero de registros del fichero activo. Realiza la misma funcin que RECCOUNT(). Sintaxis..: LASTREC() Librera..: CLIPPER.LIB Ejemplo...: USE Help ? LastRec() dbCloseArea()

LEFT() -----Extrae carcteres de una cadena por la izquierda. Sintaxis..: LEFT( <cadena>,<n caracteres a extraer> ) Librera..: EXTEND.LIB Ejemplo...: ? Left( "Lunes", 1 ) // = L

LEN() ----Devuelve la longitud de una cadena, un array, y empleado con MEMOREAD() devuelve la dimensin en bytes de un fichero de texto. Sintaxis..: LEN ( <cadena | array | fichero texto> ) Librera..: CLIPPER.LIB Ejemplo...:

1)

cPrograma := "clientes" ? Len( cPrograma ) cCadena := AllTrim( Space( 10 ) ) ? Len( cCadena ) // = 0 acMes := Array( 12 ) acMes[ 1 ] = "Enero" acMes[ 2 ] = "Febrero" // etc. ? Len( acMes ) cFichero = "Help.prg" ? Len( MemoRead( cFichero ) )

2)

3)

LENNUM() -------Cuenta el nmero de caracteres de una expresin numrica. Sintaxis..: LENNUM( <nmero> ) Librera..: CLIPPER.LIB Ejemplo...: nNumero := 523 ? LenNum( nNumero ) // = 3

LOG() ----Calcula el logaritmo natural de una expresin numrica. LOG() es la inversa de EXP(). Sintaxis..: LOG( <n mayor que cero> ) Librera..: CLIPPER.LIB Ejemplo...: ? Log( 10 ) // = 2.30

LOWER() ------Convierte los caracteres de una cadena a minsculas. Sintaxis..: LOWER( <cadena> ) Librera..: CLIPPER.LIB Ejemplo...: ? Lower( "Help" ) // = help

LTRIM() ------Elimina los espacios en blanco a la izquierda de una cadena. Sintaxis..: LTRIM( <cadena> ) Librera..: CLIPPER.LIB Ejemplo...: nNumero := 1992 ? Str( nNumero ) ? Len( Str( nNumero ) ) ? lTrim( Str( nNumero ) ) ? Len( lTrim( Str( nNumero ) ) ) // = 1992 // = 10 // = 1992 // = 4

LUPDATE()
--------Devuelve la fecha de la ltima modificacin del archivo de Base de Datos. Sintaxis..: LUPDATE() Librera..: EXTEND.LIB Ejemplo...: USE Help Qout( lUpdate() ) dbCloseArea()

MAX() ----Determina el valor mximo de dos expresiones numricas. Puede devolver un nmero o una fecha. Los dos argumentos han de ser del mismo tipo. Sintaxis..: MAX( <nmero1/fecha1>, <nmero2/fecha2> ) Librera..: CLIPPER.LIB Ejemplo...: ? Max( 5, 3 ) // = 5 ? Max( Date(), Date() + 5 )

MAXCOL() -------Devuelve el nmero mximo de columnas visibles de la pantalla. Sintaxis..: MaxCol() Librera..: CLIPEPR.LIB Ejemplo...: @ 0, 0 TO MaxRow(), MaxCol() DOUBLE

MAXROW() -------Devuelve el nmero mximo de filas visibles en la pantalla. Sintaxis..: MaxRow() Librera..: CLIPPER.LIB Ejemplo...: @ 00,00 TO MaxRow(), MaxCol() DOUBLE

MEMOEDIT -------Visualiza y/o edita cadenas y campos memo. Sintaxis..: MEMOEDIT( [<campo memo>] [, <fila sup>] [, <col sup>] [, <fila inf>] [, <col inf>] [, <.T./.F.>] [, <funcin usuario>] [, <ventana>] [, <medida marco>] [,<linea inicial memo>] [, <columna inicial memo>] [,<fila inicial ventana>] [,<columna inicial ventana>] ) <campo memo> - Es el que se editar. <fila sup>,<col sup>,<fila inf>,<col inf> - Son las coordenadas de la ventana de edicin. <.T./.F.> - Determina si podemos modificar el campo memo o solo visualizarlo.

<funcin usuario> - Se ejecuta segn la pulsacin de determinadas teclas. <ventana> - Determina el tendido de la lnea. La ventana corre en sentido horizontal. <medida marco> - Determina la medida del marco. por defecto es cuatro. <linea/columna memo/ventana> - Indican las lneas y columnas iniciales de posicionamiento del cursor en el campo memo y en la ventana.

Teclas de direccin: Teclas ----------------------Flecha arriba o Ctrl-E Flecha abajo o Ctrl-X Flecha izda. o Ctrl-S Flecha dcha. o Ctrl-D Ctrl-Flecha izda. o Ctrl-A Ctrl-Flecha dcha. o Ctrl-F Inicio Fin Ctrl-Inicio Ctrl-Fin Pgina arriba Pgina abajo Ctrl-Pgina anterior Ctrl-Pgina siguiente Finalidad --------------------------Mueve una lnea arriba Mueve una lnea abajo Mueve un carcter a la izda. Mueve un carcter a la dcha. Mueve una palabra a la izda. Mueve una palabra a la dcha. Comienzo de lnea Final de lnea Comienzo del campo Final del campo Ventana de edicin arriba Ventana de edicin abajo Comienzo ventana en curso Final ventana en curso

Teclas de edicin de MEMOEDIT(): Tecla Finalidad ----------------------- -----------------------------Ctrl-Y Borra la lnea en curso Ctrl-T Borra la palabra a la dcha. Ctrl-B Restablece formato campo memo Teclas de salida de MEMOEDIT(): Tecla Finalidad ----------------------- ----------------------------Ctrl-W Acaba edicin con grabacin Esc Salida sin grabacin Si utilizamos una funcin de usuario MEMOEDIT le pasael estado, lnea y la columna del cursor en laventana.

Mensajes de estado de MEMOEDIT(): Estado Descripcin ---------------------------------------------0 Inactivo 1 Memo sin alterar 2 Memo alterado 3 Estado de comienzo
Valores de regreso de la funcin a MEMOEDIT(), si losestados son 1,2 o 3.

Valor -----0 1-31 32 33 34 35 100 101

Accin --------------------------------------------Ejecuta opcin implicita Ejecuta acciones de edicin segn valor clave Deshabilita clave habitual Aade clave de control Ajuste automtico de palabras Establece movimiento Siguiente palabra abajo-derecha de la ventana

Librera..: EXTEND.LIB Ejemplo...: USE ALUMNOS INDEX NUMERO dbSeek( 112 ) IF Found() REPLACE NOTAS WITH MemoEdit( NOTAS,9,1,23,79,.T.,"" ) READ ENDIF dbCloseArea()

MEMOLINE()
Extrae una lnea de texto de una cadena o campo memo. Sintaxis..: MEMOLINE( <campo memo> [, <n caracteres por lnea> ] [, <n de lnea a extraer>] [, <medida del marco>] [, <ajuste automtico>] ) <campo memo> - Donde extraeremos la lnea. <n caracteres por lnea> - Puede estar comprendido entre 4 y 254, la opcin por defecto es 79. <n de lnea a extraer> - La opcin por defecto es 1. <medida del marco> - Por defecto es cuatro. <ajuste automtico> - Puede ser verdadero o falso, la opcin por defecto es .T. (activo). Librera..: EXTEND.LIB

MEMOREAD() ---------Lee la informacin contenida en un fichero de texto. El tamao mximo a leer es de 64 Kb. Sintaxis..: MEMOREAD ( <archivo> ) Librera..: EXTEND.LIB Ejemplo...: // Muestra un fichero de texto con posibilidad de // modificacin. MemoEdit( MemoRead( "Menu.prg" ), 0, 0, 24, 79, .T.) )

MEMORY()
-------Devuelve la memoria en Kbytes que tenemos disponible. Sintaxis..: MEMORY( <nNumero > ) Si nNumero = 0, devuelve la memoria disponible. Si nNumero = 1, devuelve el tamao del bloque de memoria contiguo para valores de tipo carcter. Si nNumero = 2, devuelve el tamao de memoria disponible para llamadas RUN. Librera..: CLIPPER.LIB Ejemplo...: QOut( Memory( 0 ) )

MEMOTRAN() ---------Reemplaza retornos de carro y avances de lnea de campos memo, de esta forma podemos mostrar texto con cdigos y sin cdigos. Sintaxis..: MEMOTRAN( <campo memo> [, <carcter1 de reemplazo> [, <carcter2 de reemplazo>]] ) <campo memo> - Es el que manipularemos. <carcter1> - Es el carcter por el que reemplazaremos el retorno de carro permanente y el avance de lnea. <carcter2> - Es el carcter por el que reemplazare mos el retorno de carro temporal y el avance de lnea.

Librera..: EXTEND.LIB Ejemplo...: USE ALUMNOS INDEX NUEMROS dbSeek( 112 ) IF Found()
REPLACE Field->NOTAS WITH MemoTran( Field->NOTAS, " ", " " )

READ ENDIF dbCloseArea()

MEMOWRIT() ---------Escribe en un fichero de texto una serie de caracteres. Devuelve un valor lgico, segn el resultado de la grabacin. Sintaxis..: MEMOWRIT( <archivo>, <caracteres> ) Librera..: EXTEND.LIB

MEMVARBLOCK
----------Devuelve un bloque de cdigo de asignacin / lectura para una variable de memoria dada. Sintaxis..: MemvarBlock( cNombreVariable> ) Librera..: CLIPPER.LIB

MIN() ----Devuelve el valor mnimos de dos expresiones numricas o de fecha. Las dos han de ser del mismo tipo.

Sintaxis..: MIN( <nmero1/fecha1>, <nmero2/fecha2> ) Librera..: CLIPPER.LIB Ejemplo...: ? Min( 10, 5 ) // = 5 ? Min( Date(), Date() + 31 )

MLCOUNT() --------Cuenta las lneas ajustadas automticamente en campos memo. Se usa junto con MEMOLINE() para dar formato a campos memo o cadenas largas a imprimir. Sintaxis..:
MLCOUNT( <campo memo a contar> [, <n caracteres porlnea>] [,

<medida marco>] [, <ajuste automtico>] ) <n caracteres por lnea> - La opcin por defecto es 79, la mnima 4 y la mxima 254. <medida marco> - Por defecto es cuatro. <ajuste automtico de palabras> - La opcin por defecto es .T., ajuste activo, use .F. para desactivarlo. Librera..: EXTEND.LIB Ejemplo...: nCuenta := mlCount( Memo, 60 ) ? nCuenta

MLCTOPOS() ---------Devuelve la posicin absoluta del carcter en una cadena formateada en filas y columnas. Sintaxis..: MlCtoPos( <cTexto>, <nAncho>, nLnea>, <nCol>, [<nTamaoTabula], [<lSaltoLnea>] ) <cTexto> <nAncho> <nLnea> <nCol> - Es la cadena de texto a tratar. - Es el ancho del formato de lnea. - Es el n de lnea, empezando desde 1. - Es el nmero de columna, empezandod esde 0.

<nTamaoTabula> - Es el n de columnas que hay entre las posiciones de tabulacin. Por defecto es 4. <lSaltoLnea> - Indicador de salto automtico de lnea. Librera..: CLIPPER.LIB Ejemplo...: cTexto := "Esto es un ejemplo" ? mlCtoPos( cTexto, 5, 2 )

MLPOS()
------Determina la posicin de nmero de lnea de una serie de caracteres o campos memo. Sintaxis..: MLPOS( <campo memo>, <n caracteres por lnea>, <n lnea> ) Librera..: EXTEND.LIB

Ejemplo...: cCadena := MemoRead( "Fichero.txt" ) nLocaliza := mlPos( cCadena, 50, 5 )

MOD() ----Devuelve el resto de 2 nmeros en formato dBaseIII+. Sintaxis..: Mod( <nDividendo>, <nDivisor> ) Librera..: EXTEND.LIB

MONTH() ------Devuelve el nmero del mes de la fecha indicada. Intervalo de 0 a 12. Si la fecha es nula devuelve un cero. Sintaxis..: MONTH( <fecha> ) Librera..: CLIPPER.LIB Ejemplo...: SET DATE TO ITALIAN // dd-mm-aa ? Date() // = 06-03-95 ? Month( Date() ) // = 3

MPOSTOLC() ---------Devuelve una matriz segn el formato de filas y columnas indicado. Sintaxis..: mPostoLc( <cTexto>, <nAncho>, <nPos>, <nTamaoTabulador>, [<lSaltoLnea>] ) <cTexto> - Cadena de texto.

<nAncho> <nPos>

- Ancho de la lnea formateada. - Posicin del byte dentro del texto.

<nTamaoTabulador> - N de columnas entre las posiciones de tabulacin. <lSaltoLnea> - Indicador de salto automtico de lneas. Por defecto: .T.

Librera..: CLIPPER.LIB Ejemplo...: cTexto := "Esto es un ejemplo ..." acMatriz := mPostoLc( cTexto, 5, 2 )

NETERR() -------Comprueba los errores de USE, USE...EXCLUSIVE, o APPEND BLANK en redes locales. Devuelve valores lgicos. Sintaxis..: NETERR() Librera..: CLIPPER.LIB

NETNAME() --------Identifica la estacin de trabajo actual dentro de una red local. Devuelve una cadena de longitud 15 caracteres o una cadena nula si no tiene identificacin o no estamos en una red local. Sintaxis..: NETNAME() Librera..: CLIPPER.LIB

Ejemplo...: IF Len( AllTrim( NetName() ) ) = 0 QOut( "No estamos en Red" ) ELSE QOut( "Estamos en Red" ) ENDIF

NEXTKEY() --------Lee otra pulsacin del teclado sin eliminarla del buffer. Devuelve el valor numrico de la tecla pulsada. Sintaxis..: NEXTKEY() Librera..: EXTEND.LIB Ejemplo...: KeyBoard Chr(27) ? NextKey(), LastKey() // = 27 0

NOSNOW() -------Activa / desactiva la supresin del eefcto nieve en la pantalla. Solo para monitores CGA. Sintaxis..: NosNow( <lActivar | lDesactivar> ) Librera..: CLIPPER.LIB

OS() ---Devuelve el nombre y versin del sistema operativo. Sintaxis..: OS() Librera..: CLIPPER.LIB

OUTERR() -------Escribe una lista de valores en el dispositivo de errores estndar. Sintaxis..: OutErr( <lista expresiones> ) Librera..: CLIPEPR.LIB Ejemplo...: OutErr( "Fichero no existe", cFichero )

OUTSTD() -------Escribe una lista de valores en el dispositivo de salida estndard. Sintaxis..: OutStd( <lista expresiones> ) Librera..: CLIPPER.LIB Ejemplo...: OutStd( cNombre, cDireccion, cPoblacion )

PADC(), PADL(), PADR() ---------------------Rellena valores de caracteres, fechas y nmeros. El valor devuelto es una cadena. Sintaxis..: PadC( <exp>, <nLen>, [<cRelleno>] ) PadL( <exp>, <nLen>, [<cRelleno>] ) PadR( <exp>, <nLen>, [<cRelleno>] ) <exp> - Es el valor a rellenar. <nLen> - Es la longitud a devolver rellena. <cRelleno> - Es el carcter de relleno.

Librera..: EXTEND.LIB Ejemplo...: @ 24,00 SAY ; PadC( " Pulse una tecla para continuar ", 80 ) ; COLOR "W+/B"

PCOL()
-----Devuelve la columna en que se halla el cabezal de impresin. Retorna un nmero entero. Un EJECT (salto de pgina) coloca PCOL() a cero. Utilzelo para la confeccin de facturas y recibos. Sintaxis..: PCOL() Librera..: CLIPPER.LIB Ejemplo...: SET DEVICE TO PRINT @ 10, pCol() + 10 SAY "Banco : " + Field->BANCO // ... EJECT SET DEVICE TO SCREEN

PCOUNT() -------Determina el nmero de parmetros pasados a un procedimiento o funcin definida por el usuario. Sintaxis..: PCOUNT() Librera..: CLIPPER.LIB

Ejemplo...: FUNCTION Editor( cFichero ) IF pCount() = 0 @ 24,0 SAY "Indique el fichero: " GET cFichero ENDIF // Etc... RETURN NIL

PROCLINE() ---------Devuelve el nmero de la lnea del cdigo fuente en curso del programa. Siempre que no le hayamos indicado al compilador que no numere las lneas. Sintaxis..: PROCLINE() Librera..: CLIPPER.LIB Ejemplo...: ? ProcLine(), "Linea ", cLinea

PROCNAME() ---------Indica el nombre del procedimiento o programa que estamos ejecutando. Sintaxis..: PROCNAME() Librera..: CLIPPER.LIB Ejemplo...: ? "Procedimiento en uso : ", ProcName()

PROW() -----Devuelve la fila en que se halla el cabezal de impresin. Es muy til junto con PCOL(), para la realizacin de recibos y facturas. Un salto de pgina, EJECT, coloca PROW() a cero. Sintaxis..: PROW() Librera..: CLIPPER.LIB Ejemplo...: SET DEVICE TO PRINT @ pRow() + 1, 5 SAY "Nombre...: " + NOMBRE @ pRow() + 2, 5 SAY "Direccin: " + DIRECCION @ pRow() + 3, 5 SAY "Poblacin: " + POBLACION //.. EJECT SET DEVICE TO SCREEN

QOUT() / QQOUT() ---------------Muestra una lista de expresiones en la salida estandard. Estas funciones se utilizan en sustitucin de los commandos ? y ??. QOut() provoca un retorno de carro y salto de lnea, y QQOut() no, se mantiene en la misma lnea. Sintaxis..: QOut( [ <lista expresiones> ] ) QQOut( [ <lista expresiones> ] ) Librera..: CLIPEPR.LIB Ejemplo...: QOut( "Hola mundo" )

RAT()
Busca en una cadena la ltima vez que aparezca en ella una subcadena, indicando como valor numrico la posicin de comienzo de la subcadena dentro de la cadena. La exploracin empieza por la derecha, a diferencia de AT(). Si no se encuentra la subcadena devuelve un cero. Sintaxis..: RAT( <subcadena>, <cadena> ) Librera..: EXTEND.LIB Ejemplo...: ? Rat( "a", "Navidad" ) // = 6

READEXIT()
Activa las teclas de flecha (verticales) como teclas para la salida de READ. Hemos de indicar un valor lgico (.T./.F.), por defecto es .F. Sintaxis..: READEXIT( <.T./.F.> ) Librera..: CLIPPER.LIB

READINSERT()
Activa/desactiva el estado de insercin de READ y MEMOEDIT(). Por defecto el valor es .F. Sintaxis..: READINSERT ( [.T. | .F.] ) Librera..: CLIPPER.LIB Ejemplo...: lModoIns := ReadInsert(.T.) ReadInsert( lModoIns ) // Reponemos modo

READKEY()
--------Determina qu tecla ha finalizado un mandato READ. Devuelve un valor de tipo numrico. Sintaxis..: ReadKey() Librera..: EXTEND.LIB

READMODAL() ----------Activa el modo de edicin de pantalla completa del array GetList(). Su funcionamiento es similar al comando READ. Sintaxis..: ReadModal( <aGetList> ) Librera..: CLIPPER.LIB

READVAR() --------Devuelve el nombre de la variable de GET/MENU que espera ser leda. Si no hay ninguna para leer devuelve una cadena nula. Se usa READVAR() en programas que utilizan SET KEY, con fines de depuracin. Sintaxis..: READVAR() Librera..: CLIPPER.LIB Ejemplo...: @ 5,10 SAY "Nombre Cliente: " GET cCliente ? ReadVar() // = cCliente

RECCOUNT() ---------Cuenta el nmero de registros del fichero activo. Sintaxis..: RECCOUNT() Librera..: CLIPPER.LIB Ejemplo...: USE Help INDEX Help ? RecCount() dbCloseArea()

RECNO() ------Devuelve el nmero de registro sobre el que esta situado el puntero del archivo activo. Sintaxis..: RECNO() Librera..: CLIPPER.LIB Ejemplo...: 1) USE Help dbGoTo( 5 ) ? RecNo() // = 5 dbCloseArea() USE Clientes INDEX Clientes dbAppend() ? "N registro :", RecNo() dbCloseArea()

2)

RECSIZE() --------Indica la longitud del registro de la Base de Datos en uso. Sintaxis..: RECSIZE() Librera..: EXTEND.LIB Ejemplo...: // Para determinar la longitud entera de un archivo USE Help ? ( RecSize() * LastRec() ) + Header() dbCloseArea()

REPLICATE()
----------Repite una serie de caracteres un determinado nmero de veces. Sintaxis..: REPLICATE( <cadena>, <n repeticiones> ) Librera..: CLIPPER.LIB Ejemplo...: // Llena toda la pantalla de "*" FOR i = 0 TO 24 @ i,0 SAY Replicate( "*", 80 ) NEXT

RESTSCREEN() -----------Restaura una porcin de la pantalla previamente salvada con SAVESCREEN(). Sintaxis..: RESTSCREEN( <fila sup>,<col sup>,<fila inf>, <col inf>, <cadena> ) Hemos de especificar las coordenadas de la fila y columnas de la esquina superior izquierda, y los de la esquina inferior derecha para delimitar la porcin de pantalla a salvar, y luego la cadena donde se almacenara. Librera..: EXTEND.LIB Ejemplo...: cBuffer := SaveScreen( 5, 10, 20, 40 ) // ... Instrucciones RestScreen( 5, 10, 20, 40, cBuffer )

RIGHT() ------Extrae caracteres de una cadena por la derecha. Sintaxis..: RIGHT( <cadena>, <n de caracteres a extraer> ) Librera..: EXTEND.LIB Ejemplo...: ? Right( "help", 2 ) // = lp

RLOCK() / LOCK() ---------------Bloquea/desbloquea el registro actual del rea de trabajo en curso. Para utilizar en redes locales. Sintaxis..: RLOCK() / LOCK() Librera..: CLIPPER.LIB

ROUND()
------Redondea un nmero conservando la cantidad de decimales indicada. Sintaxis..: ROUND( <n a redondear>, <n de decimales> ) Librera..: CLIPPER.LIB Ejemplo...: SET DECIMALS TO 2 ? Round( 20.99999, 0 ) // = 21.00

ROW() ----Devuelve el nmero de la fila en que est el cursor. Despus de un CLS como es lgico da cero (cursor en 0,0), pero despus de un READ da 23. Utilizar con COL() para crear procedimientos independientes de la posicin de la pantalla. Sintaxis..: ROW()

Librera..: CLIPPER.LIB Ejemplo...: 1) 2) ? Row() @ Row(), Col() SAY "Mensaje" nFila := Row()

RTRIM() ------Elimina los espacios fianles de una cadena. Sintaxis..: [R]TRIM( <cCadena> ) Librera..: CLIPEPR.LIB Ejemplo...: Ver funcin Trim().

SAVESCREEN() -----------Salva una porcin de la pantalla en una variable de memoria. Sintaxis..: SAVESCREEN( <fila sup>, <col sup>, <fila inf>, <colinf> ) Tenemos que indicar las coordenadas de la fila y la columna de la esquina superior izquierda, y de la esquina inferior derecha. Librera..: EXTEND.LIB Ejemplo...: cBuffer := SaveScreen( 10, 10, 20, 50 ) // Instrucciones RestScreen( 10, 10, 20, 50, cBuffer )

SCROLL() -------Desplaza hacia arriba o hacia abajo una porcin de la pantalla. Sintaxis..: SCROLL( <fila sup>, <col sup>, <fila inf>, <col inf>, <n de lneas a desplazar> ) Hemos de especificar las coordenadas de las esquinas superior e inferior, y el nmero de lneas a desplazar. Si el nmero de lneas es positivo, el desplazamiento es hacia arriba, si es negativo es hacia abajo, y si es cero deja la ventana en blanco. Librera..: EXTEND.LIB Ejemplo...: Scroll( 5, 10, 19, 70, 3 ) InKey(0) Scroll( 5, 10, 19, 70, -3 ) InKey(0) Scroll( 5, 10, 19, 70, 0 )

SECONDS()
--------Devuelve el nmero de segundos transcurridos desde las 12:00 AM. Sintaxis..: SECONDS() Librera..: CLIPPER.LIB Ejemplo...: ? Time() // = 0:05 ? Seconds() // = 300

SECS() -----Devuelve el nmero de segundos de una cadena de tiempo. Realiza la misma funcin que SECONDS(), pero SECS() permite recibir el tiempo desde una variable. Sintaxis..: SECS( <cadena> ) Librera..: CLIPPER.LIB Ejemplo...: cTiempo := Time() ? cTiempo // = 0:05 ? Secs( cTiempo ) // = 300

SELECT() -------Devuelve el nmero del rea de trabajo activa. Sintaxis..: SELECT( [ <nombre alias> ] ) Librera..: CLIPPER.LIB Ejemplo...: 1) ? Select() SELECT 4 ? Select() // = 1 // = 4

2)

SELECT 1 USE Clientes ? Select( "Clientes" ) // = 1

SET() ----Comprueba o modifica un valor de configuracin del sistema. Es el equivalente a los comandos SET. Sintaxis..: Set( <nEspecificador>, [<expNuevoValor>], [ <lModoAperura> ] ) <nEspecificador> - Es un valor numrico que identifica al valor a comprobar o modificar. Ver fichero cabecera: Set.ch <expNuevoValor> - Indica un nuevo valor. Es opcional. <lModoAperura> - Indica si los ficheros que se abren son para aadir o son nuevos. Solo se utiliza en los casos de volcado a ficheros en disco o impresora. Librera..: CLIPPER.LIB Ejemplo...: Set( _SET_DECIMALS, 2 )

SETBLINK() ---------Activa o desactiva el parpadeo de colores, o si no indicamos nada nos devuelve su estado actual. Si se desactiva conseguimos que los colores que tendran que aprpadear aumenten de intensidad consiguiendo una nueva gama de colores. Sintaxis..: SetBlink( [ <lActivar | lDesactivar> ] ) Librera..: CLIPPER.LIB

SETCANCEL()
----------Activa/desactiva la interrupcin de un programa con la pulsacin de las teclas ALT - C. Sintaxis..: SETCANCEL( [ <.T. | .F.> ] ) SetCancel(.T.) // Activa interrupcin SetCancel(.F.) // Desactiva interrupcin SetCancel() // Informa del estado actual Librera..: CLIPPER.LIB

SETCOLOR()
---------Devuelve o determina el estado del color actual. Sin parmetros devuelve los colores actuales. Sintaxis..: SETCOLOR( <cadena que contiene los colores> ) Librera..: EXTEND.LIB Notas.....: Para mayor informacin consulte SET COLOR TO

SETCURSOR()
----------Establece la forma del cursor o nos devuelve su estado actual. SetCursor( 0 ) => SET CURSOR OFF SetCursor( 1 ) => SET CURSOR ON Sintaxis..: SetCursor( [ <nFormaCursor> ] )

<nFormaCursor> - Es un nmero que indica la forma del cursor. Dichas formas se definen en el fichero cabecera: SetCurs.ch Formas Valor SetCurs.ch ----------------------------------- ----------------Ninguna 0 SC_NONE Subrayado 1 SC_NORMAL Bloque medio inferior 2 SC_INSERT Bloque completo 3 SC_SPECIAL1 Bloque medio superior 4 SC_SPECIAL2 Librera..: CLIPPER.LIB

SETKEY() -------Asigna un bloque de accin a una tecla. Sintaxis..: SetKey( <nCdigoInKey>, [ <bAccin> ] ) <nCdigoInKey> - Es valor InKey() de la tecla asociada a la accin. <bAccin> - Bloque de cdigo a ejecutar cuando se pulse la tecla indicada. Librera..: CLIPPER.LIB Ejemplo...: SetKey( K_F1, { ||Ayuda() } )

SETMODE() --------Cambia el modo de visualizacin a un nmero especificado de filas y columnas. Una vez, realizada la accin devuelve .T. o .F., si ha conseguido cambiar de modo o no. Sintaxis..: SetMode( <nFilas>, <nColumnas> ) Librera..: CLIPPER.LIB

SETPOS() -------Desplaza el cursor a una nueva posicin. Sintaxis..: SetPos( <nFila>, <nColumna> ) Librera..: CLIPPER.LIB

SETPRC()
-------Posiciona el cabezal de la impresora en la fila y la columna indicadas. Sintaxis..: SETPRC( <fila impresora>, <columna impresora> ) Librera..: CLIPPER.LIB Ejemplo...: SET DEVICE TO PRINT SetPrc( 5, 0 ) // ... SET DEVICE TO SCREEN

SOUNDEX()
--------Devuelve el cdigo de sonido correspondientes a una palabra, til para indexar y bsquedas. El cdigo de sonido se devuelve en forma de cadena. Sintaxis..: SOUNDEX( <cadena a convertir> ) Librera..: CLIPPER.LIB

SPACE() ------Crea una cadena con una serie de espacios. Tambin puede utilizarse para justificar cadenas con espacios. Sintaxis..: SPACE( <nmero de espacios> ) Librera..: CLIPPER.LIB Ejemplo...: 1) cCadena := Space( 10 ) 2) cNombre := "help" cCadena := cNombre + Space( 10 - Len( cNombre ) )

SQRT() -----Devuelve la raz cuadrada de un nmero. Sintaxis..: SQRT( <nmero> ) Librera..: CLIPPER.LIB Ejemplo...: ? Sqrt( 25 ) // = 5

STR() ----Convierte un nmero a una serie de caracteres. Sintaxis..: STR( <nmero> [,<longitud cadena> [,<n decimales>]] ) <nmero> - Es el que hay que convertir a cadena. <longitud cadena> - Es la longitud de la cadena a de-

volver incluyendo dgitos decimales, punto decimal y signo menos. <n decimales> - Que se devolvern. Si no se especifica la longitud y los decimales, da cadenas de longitud 10 caracteres incluyendo espacios a la izquierda. Puede utilizarse con funciones de fecha, devolviendo cadenas de longitud tres para MONTH() y DAY(), y de longitud cinco para YEAR(). Librera..: CLIPPER.LIB Ejemplo...: nNumero := 1000.50 ? Str( nNumero ) // = 1000.50 ? Str( nNumero, 4 ) // = 1000

STRTRAN() --------Busca y reemplaza una serie de caracteres. Sintaxis..: STRTRAN( <cadena donde se realizar la bsqueda>, <cadena a buscar>, [,<reemplazar por>] [,<primer caso a reemplazar>] [,<n de veces a reemplazar>] ) <reemplazar por> - Es la cadena de reemplazo, si no se especifica todas las cadenas encontradas se reemplazan por "". <primer caso a reemplazar> - Por defecto es uno. <n de veces a reemplazar> - Por defecto son todas.

Librera..: EXTEND.LIB Ejemplo...: cCadena := "Lunes, 9 de Marzo" ? StrTran( cCadena, "Lunes", "Martes" ) // = Martes, 9 de Marzo"

STRZERO() --------Convierte un nmero a cadena como STR(), pero dejando ceros en lugar de espacios. Sintaxis..: STRZERO( <nmero>, [<longitud> [, <decimales>]] ) Librera..: CLIPPER.LIB Ejemplo...: nNumero := 12345.99 ? StrZero( nNumero, 8, 1 ) // = 012345.9

STUFF() ------Elimina, inserta y/o reemplaza caracteres de una cadena. Sintaxis..: STUFF( <cadena1 a tratar>, <posicin desde cadena1>, <n de caracteres a sustituir de cadena2>, <cadena2 de reemplazo> ) Librera..: EXTEND.LIB Ejemplo...: cDia1 := "Lunes" cDia2 := "Martes" ? sTuff( cDia1, 2, 6, cDia2 ) // = LMartes

SUBSTR()
-------Extrae una serie de caracteres de una cadena. Sintaxis..: SUBSTR( <cadena>, <posicin inicio de extraccin>, <n de caracteres a extraer> ) Librera..: CLIPPER.LIB Ejemplo...: cCadena = "Lunes Martes Mircoles ..." ? SubStr( cCadena, 7, 6 ) // = Martes

TIME() -----Devuelve la hora del sistema. Teniendo el siguiente formato: hh:mm:ss Sintaxis..: TIME() Librera..: CLIPPER.LIB Ejemplo...: ? Time() TONE() -----Hace sonar el altavoz una frecuencia y duracin indicada. Sintaxis..: TONE( <n frecuencia> <n duracin> ) Tabla de notas musicales ------------------------

Tabla de notas musicales -----------------------Tono Frecuencia Tono Frecuencia ------------------------C 130.80 mid C 261.70 C# 138.60 C# 277.20 D 146.80 D 293.70 D# 155.60 D# 311.10 E 164.80 E 329.60 F 174.60 F 349.20 F# 185.00 F# 370.00 G 196.00 G 392.00 G# 207.70 G# 415.30 A 220.00 A 440.00 A# 233.10 A# 466.20 B 246.90 B 493.90 C 523.30 Librera..: EXTEND.LIB Ejemplo...: Tone( 150, 8 )

TRANSFORM()
----------Transforma una expresin segn el formato indicado. Sintaxis..: TRANSFORM( <cualquier tipo de datos>, <formato> ) <formato> - Son las mismas funciones y plantillas que usamos para picture. Para ms informacin consulte @...SAY...GET Librera..: CLIPPER.LIB Ejemplo...: cCadena = "lunes" ? TransForm( cCadena, "@!" ) // = LUNES

TRIM() ---------------Elimina los espacios a la derecha de una cadena. Sintaxis..: TRIM( <cadena> ) Librera..: CLIPPER.LIB Ejemplo...: cCadena = "Lunes " ? Len( Trim( cCadena ) ) // = 5

TSTRING()
--------Devuelve una cantidad de segundos a formato de hora. Sintaxis..: TSTRING( <n de segundos> ) Librera..: CLIPPER.LIB Ejemplo...: nSegundos := Seconds() ? nSegundos // = 300 ? TString( nSegundos ) // = 00:05

TYPE()
-----Devuelve el tipo de dato de la expresin indicada. Sintaxis..: TYPE( <expresin> ) Tabla de valores de respuesta:

Respuesta --------C D L N M A U UE UI

Significado -------------------------------------Carcter Fecha Lgico Numrico Campo memo Array Indefinido Error sintctico Error indeterminado

Librera..: CLIPPER.LIB Ejemplo...: cCadena := "Lunes" ? Type( cCadena ) nNumero := 2 ? Type( nNumero )

// = A // = N

UPDATED() --------Determina si hubo cambios en las clusulas GET'S pendientes. Devuelve valores lgicos (.T./.F.). Sintaxis..: UPDATED() Librera..: CLIPPER.LIB Ejemplo...: USE Clientes dbGoTo( 2 ) dFecha := Field->FECHA
@ 5,10 SAY "Nueva fecha : " GET dFecha PICTURE "@D"

READ IF UpDated() REPLACE Field->FECHA WITH dFecha READ ENDIF dbCloseArea()

UPPER() ------Convierte una cadena a maysculas. Sintaxis..: UPPER( <cadena> ) Librera..: CLIPPER.LIB Ejemplo...: cCadena := "lunes" ? Upper( cCadena ) // = LUNES

USED() -----Determina si el archivo de Base de Datos esta en el rea de trabajo actual. Devuelve valores lgicos. Sintaxis..: USED() Librera..: CLIPPER.LIB Ejemplo...: USE Clientes IF Used() SET INDEX TO Nombre ELSE QOut( "No lo puedo abrir" ) ENDIF // ... dbCloseArea()

VAL() ----Convierte una cadena a nmeros. Devuelve un valor numrico, siempre y cuando el primer carcter no sea un nmero. Solo admite dos decimales. Y no tiene en cuenta los nmeros que van despus de un carcter. Sintaxis..: VAL( <cadena> ) Librera..: CLIPPER.LIB Ejemplo...: ? Val( "12.345" ) // = 12.34 ? Val( "12A345" ) // = 12.00 ? Val( "A12345" ) // = 0.00

VALTYPE() --------Determina el tipo de datos devuelto por una expresin. Los valores devueltos son: Devuelve Significado -------------------------------------------------A Array B Bloque de Cdigo C Carcter D Fecha L Lgico M Memo N Numrico O Objeto U NIL Sintaxis..: ValType( <expresin> ) Librera..: CLIPPER.LIB Ejemplo...: ? ValType( 2+ 3 ) // N

VERSION() --------Devuelve la versin de CA-Clipper. Sintaxis..: Version() Librera..: EXTEND.LIB

WORD() -----Pasa los parmetros numricos de la orden CALL del tipo DOUBLE al tipo INT. Sintaxis..: WORD( <nmero> ) <nmero> - no debe de sobrepasar de 32767. Librera..: CLIPPER.LIB Ejemplo...: CALL C_proc WITH Word( 15000 )

YEAR() -----Devuelve el nmero del ao de una fecha, incluyendo los dgitos del siglo. Sintaxis..: YEAR( <fecha> ) Librera..: CLIPPER.LIB Ejemplo...: ? Year( Date() ) // = 1995

Tecla ---------Alt-0 Alt-1 Alt-2 Alt-3 Alt-4 Alt-5 Alt-6 Alt-7 Alt-8 Alt-9 Alt-A Alt-B Alt-Backspace Alt-C Alt-D Alt-Del Alt-Down arrow Alt-E Alt-End Alt-Enter Alt-Equals Alt-Esc Alt-F Alt-F1 Alt-F10 Alt-F11 Alt-F12 Alt-F2 Alt-F3 Alt-F4 Alt-F5 Alt-F6 Alt-F7 Alt-F8 Alt-F9 Alt-G

Definicin ---------K_ALT_0 K_ALT_1 K_ALT_2 K_ALT_3 K_ALT_4 K_ALT_5 K_ALT_6 K_ALT_7 K_ALT_8 K_ALT_9 K_ALT_A K_ALT_B K_ALT_BS K_ALT_C K_ALT_D K_ALT_DEL K_ALT_DOWN K_ALT_E K_ALT_END K_ALT_ENTER K_ALT_EQUALS K_ALT_ESC K_ALT_F K_ALT_F1 K_ALT_F10 K_ALT_F11 K_ALT_F12 K_ALT_F2 K_ALT_F3 K_ALT_F4 K_ALT_F5 K_ALT_F6 K_ALT_F7 K_ALT_F8 K_ALT_F9 K_ALT_G

Cdigo -----385 376 377 378 379 380 381 382 383 384 286 304 270 302 288 419 416 274 415 284 387 257 289 -30 -39 -46 -47 -31 -32 -33 -34 -35 -36 -37 -38 290

Tecla ---------Alt-H Alt-Home Alt-I Alt-Ins Alt-J Alt-K Alt-L Alt-Left arrow Alt-M Alt-N Alt-O Alt-P Alt-PgDn Alt-PgUp Alt-Q Alt-R Alt-Return Alt-Right arrow Alt-S Alt-T Alt-Tab Alt-U Alt-Up arrow Alt-V Alt-W Alt-X Alt-Y Alt-Z Backspace, Ctrl-H Ctrl-? Ctrl-A, Home Ctrl-B, Ctrl-Right arrow Ctrl-Backspace Ctrl-C, PgDn, Ctrl-ScrollLo Ctrl-D, Right arrow

Definicin ---------K_ALT_H K_ALT_HOME K_ALT_I K_ALT_INS K_ALT_J K_ALT_K K_ALT_L K_ALT_LEFT K_ALT_M K_ALT_N K_ALT_O K_ALT_P K_ALT_PGDN K_ALT_PGUP K_ALT_Q K_ALT_R K_ALT_RETURN K_ALT_RIGHT K_ALT_S K_ALT_T K_ALT_TAB K_ALT_U K_ALT_UP K_ALT_V K_ALT_W K_ALT_X K_ALT_Y K_ALT_Z K_BS K_CTRL_QUESTION K_CTRL_A K_CTRL_B K_CTRL_BS K_CTRL_C K_CTRL_D K_CTRL_DEL

Cdigo -----291 407 279 418 292 293 294 411 306 305 280 281 417 409 272 275 284 413 287 276 421 278 408 303 273 301 277 300 8 0 1 2 127 3 4 403

Tecla ---------Ctrl-Down arrow Ctrl-E, Up arrow Ctrl-End, Ctrl-W Ctrl-Enter Ctrl-F, End Ctrl-F1 Ctrl-F10 Ctrl-F11 Ctrl-F12 Ctrl-F2 Ctrl-F3 Ctrl-F4 Ctrl-F5 Ctrl-F6 Ctrl-F7 Ctrl-F8 Ctrl-F9 Ctrl-G, Del Ctrl-H, Backspace Ctrl-Home, Ctrl-] Ctrl-I, Tab Ctrl-Ins Ctrl-J Ctrl-K Ctrl-L Ctrl-Left arrow, Ctrl-Z Ctrl-M, Return Ctrl-N Ctrl-O Ctrl-P Ctrl-PgDn, Ctrl-^ Ctrl-PgUp, Ctrl-Hyphen Ctrl-Print Screen Ctrl-Q Ctrl-R, PgUp Ctrl-Return

Definicin ---------K_CTRL_DOWN K_CTRL_E K_CTRL_END K_CTRL_ENTER K_CTRL_F K_CTRL_F1 K_CTRL_F10 K_CTRL_F11 K_CTRL_F12 K_CTRL_F2 K_CTRL_F4 K_CTRL_F3 K_CTRL_F5 K_CTRL_F6 K_CTRL_F7 K_CTRL_F8 K_CTRL_F9 K_CTRL_G K_CTRL_H K_CTRL_HOME K_CTRL_I K_CTRL_INS K_CTRL_J K_CTRL_K K_CTRL_L K_CTRL_LEFT K_CTRL_M K_CTRL_N K_CTRL_O K_CTRL_P K_CTRL_PGDN K_CTRL_PGUP K_CTRL_PRTSCR K_CTRL_Q K_CTRL_R K_CTRL_RETURN

Cdigo -----401 5 23 10 6 -20 -29 -44 -45 -21 -23 -22 -24 -25 -26 -27 -28 7 8 29 9 402 10 11 12 26 13 14 15 16 30 31 379 17 18 10

Tecla ---------Ctrl-Return (Compat.) Ctrl-Right arrow, Ctrl-B Ctrl-S, Left arrow Ctrl-T Ctrl-Tab Ctrl-U Ctrl-Up arrow Ctrl-V, Ins Ctrl-W, Ctrl-End Ctrl-X, Down arrow Ctrl-Y Ctrl-Z, Ctrl-Left arrow Del, Ctrl-G Enter, Ctrl-M Esc, Ctrl-[ F1, Ctrl-Backslash F10 F11 F12 F2 F3 F4 F5 F6 F7 F8 F9 Fin, Ctrl-F Flecha Abajo, Ctrl-X Flecha Arriba, Ctrl-E Flecha Dcha., Ctrl-D Flecha Izda., Ctrl-S Inicio, Ctrl-A Ins, Ctrl-V Keypad Alt-* Keypad Alt-+

Definicin ---------K_CTRL_RET K_CTRL_RIGHT K_CTRL_S K_CTRL_T K_CTRL_TAB K_CTRL_U K_CTRL_UP K_CTRL_V K_CTRL_W K_CTRL_X K_CTRL_Y K_CTRL_Z K_DEL K_ENTER K_ESC K_F1 K_F10 K_F11 K_F12 K_F2 K_F3 K_F4 K_F5 K_F6 K_F7 K_F8 K_F9 K_END K_DOWN K_UP K_RIGHT K_LEFT K_HOME K_INS KP_ALT_ASTERISK KP_ALT_PLUS

Cdigo -----10 2 19 20 404 21 397 22 23 24 25 26 7 13 27 28 -9 -40 -41 -1 -2 -3 -4 -5 -6 -7 -8 6 24 5 4 19 1 22 0 334

Tecla ---------Keypad Alt-Keypad Alt-/ Keypad Alt-5 Keypad Alt-Enter Keypad Ctrl-* Keypad Ctrl-+ Keypad Ctrl-Keypad Ctrl-/ Keypad Ctrl-5 PgDn, Ctrl-C PgUp, Ctrl-R Return, Ctrl-M Shift-F1 Shift-F10 Shift-F11 Shift-F12 Shift-F2 Shift-F3 Shift-F4 Shift-F5 Shift-F6 Shift-F7 Shift-F8 Shift-F9 Shift-Tab Space bar Tab, Ctrl-I

Definicin Cdigo --------------KP_ALT_MINUS 330 KP_ALT_SLASH 420 KP_ALT_5 5 KP_ALT_ENTER 422 KP_CTRL_ASTERISK 0 KP_CTRL_PLUS 400 KP_CTRL_MINUS 398 KP_CTRL_SLASH 405 KP_CTRL_5 399 K_PGDN 3 K_PGUP 18 K_RETURN 13 K_SH_F1 -10 K_SH_F10 -19 K_SH_F11 -42 K_SH_F12 -43 K_SH_F2 -11 K_SH_F3 -12 K_SH_F4 -13 K_SH_F5 -14 K_SH_F6 -15 K_SH_F7 -16 K_SH_F8 -17 K_SH_F9 -18 K_SH_TAB 271 K_SPACE 32 K_TAB 9 0

Mscaras de GETs ( PICTURE "9999" ): A -> Slo letras. L -> Slo valores lgicos (T/F/Y/N). N -> Slo letras y caracteres. X -> Cualquier carcter. Y -> Slo Y o N. 9 -> Slo nmeros. # -> Slo letras, espacios y signos. ! -> Slo letras maysculas. . -> Posicin punto decimal. , -> Indica los miles en los datos numricos. $ -> Rellena con $ las cifras por la izda. * -> Rellena con * las cifras por la izda. Tipo Accin ---- --------------------------------------------------------A C -> Slo letras. B N -> Justifica los nmeros por la izda. C N -> Indica CR despus de un n positivo. D D,N -> Fechas, segn formato SET DATE. E D,N -> N segn formato europeo: 1000,50 K Todos -> Borra contenido variable. R C -> Los caracteres no se almacenan. S<n> C -> Scroll horizontal. X N -> Indica DB despus de un n negativo. Z N -> Los ceros se representan como blancos. ( N -> Entre parntesis n negativos con espacios izda. ) N -> Idem anterior, pero sin espacios. -------! C -> Slo letras maysculas. Para los SAYs se utilizan los mismo cdigos de plantilla y PICTURE que en lso GETs, a excepcin de: A -> Slo letras. K -> Borra contenido variable (slo GETs). S<n> -> Scroll (slo GETs). ) -> Parntesis para n negativos, sin espacios.

TABLA DE COLORES 1

TABLA DE COLORES 2

Pulsar la flecha para desplazarce y elejir el color luego la tecla Enter