Manual Clipper

Embed Size (px)

Citation preview

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)

DescripcinDirectorio 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:; //F:; //X:; //BADCACHE; //CGACURS; //DYNF:; //INFO; //NOIDLE; //SWAPK:; //SWAPPATH:; //TEMPPATH: E: Siendo nnn los Kb. de memoria expandida a usar. F: 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: 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: 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: 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: Indica el disco y el directorio del fichero de intercambio de memoria virtual. TEMPPATH: Indica el disco y directorio de ubicacin de los ficheros temporales.

SET CLIPPERCMD= Especifica una lista de opciones del compilador que se utilizarn por defecto, si no indicamos lo contrario. Ver compilador, Clipper. SET INCLUDE= Indica el disco y directorios, separados por punto y coma (;), donde buscar los ficheros de cabecera (#include). SET LIB= Indica el disco y directorios, separados por punto y coma (;), donde buscar los ficheros de librera (.LIB). SET OBJ= Indica el disco y directorios, separados por punto y coma (;), donde buscar los ficheros objeto (.OBJ). SET PLL= 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= 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= Indica una lista de opciones a utilizar por defecto por el enlazador, si no indicamos lo contrario. Ver enlazador, RTLINK. SET TMP= 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 [ | @ []] Argumentos de lnea: ------------------- Es el nombre del programa a compilar, (.PRG). 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[=] Define un identificador al preprocesador con asignado al , 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 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 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[] 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 Indica un directorio distinto para los ficheros temporales generados durante la compilacin. /U[] 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 /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 [OUTPUT [LIBRARY [lista ficheros librera>] []] | [@] 2) De forma posicional, si lo indicamos en el AUTOEXEC.BAT -> SET RTLINKCMD=/POSITIONAL : RTLINK [, [], [], [] []] | [@][;] Argumentos de lnea de mandato

Es la lista de los ficheros (.OBJ) a enlazar. 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. Es el nombre de un fichero MAP a generar. Contiene informacin sobre direcciones de segmentos y smbolos en la memoria. Es la lista de los ficheros de librera (.LIB) a enlazar con los (.OBJ). Son algunas de las especificaciones que puede recibir el enlazador. 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 . . 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[:] DYNAMIC [INTO ] Hace que los mdulos se siten en un overlay dinmico. /EXCLUDE: EXCLUDE 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[:] | /NOINCREMENTAL Con INCREMENTAL hace que se enlazen solo los mdulos que han sufrido cambios. NOINCREMENTAL es la opcin por defecto.

/MAP[:] MAP[=][] Genera un fichero MAP con uno o varios informes sobre la sesin de enlace. MODULE Desplaza los segmentos de los mdulos especificados a la seccin de overlays estticos actual. /PLL: 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: REFER 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 [= ] [INTO ] Crea una seccin de overlays estticos. /SILENT Suprime las indicaciones y respuestas del enlazador si invocamos un fichero script. /STACK: Especificamos una pila de programa. El tamao mximo es hasta 65535 bytes. /VERBOSE[:] 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][@ 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 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: && 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: -> FIELD -> MEMVAR -> 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 = 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: &. El punto (.), es el terminador de la macro. Ejemplo: cFichero := "CLIENTES.DBF" USE &cFichero. Uso como macroexpansin: &() 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 #define #define () 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 "" #include ""

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 => #translate => 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( ) => (valtype( ) == "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 => #xtranslate => Ejemplo: Suponga que utilizamos el preprocesador para evitar la complejidad de la sintaxis OOPS: #xcommand ACTIVATE WINDOW => :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 [#else] [#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 [#else] [#endif] Ejemplo: #ifndef DEMO // Instrucciones #else // Instrucciones #endif

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

Directivas #error y #stdout --------------------------Indicarn el mensaje que aparecer cuando se produzca un error de compilacin. Sintaxis: #error [] #stdout [] 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:[ [ , , ... ] ] [ ] ...

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

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

2) Procedimientos:[STATIC] PROCEDURE [()] [] . . . [RETURN]

Llamadas a funciones y procedimientos 1) Funciones: ( [] ) 2) Procedimientos: ( [] ) DO [WITH] [] 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 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 ELSE ENDIF

IIF( , , ) 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 -> 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 CASE [ELSEIF [CASE ] ] [ELSE [OTHERWISE ] ] 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] NEXT o tambin:FOR nContador := nFinal TO nInicial [STEP nDecremento]

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 [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 CLIENTESDO 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( ), para mostrar el resultado de las expresiones, aunque tambin podramos haber utilizado el antiguo formato: ? 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

>=

= 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

=

= 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 ao 94" ) ENDIF

!=, o #

=

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( , ) Ejemplo: aAdd( acClientes, "Pepe" )

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

Descripcin ------------------------Selecciona uno de los elementos de un array. Sintaxis: aChoice( , , , , ; [, ; [, [, ; [, ]]]] ) Ejemplo: nOpcion := aChoice( 05, 05, 07, 10, { "S", "No" } )

aClone()

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

aCopy()

Copia elementos de un array a otro. Sintaxis: aCopy( , ; [, [, ; [, ]]] ) 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( , ) 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( [, [, ; [, [, [, ]]]]]] ) Ejemplo: acFicheros := Array( aDir( "*.PRG" ) ) aDir( "*.PRG", acFicheros ) Notas: Se aconseja utilizar Directory()

aEval()

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

aFields()

Rellena arrays con la informacin de los campos. Sintaxis:aFields( [, [,; [, ]]] )

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( , [, ; [, ]] ) Ejemplo: LOCAL anNumero[ 3 ] aFill( anNumero, 0 )

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

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

Array()

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

aScan()

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

aSize()

Modifica el tamao de un array. Sintaxis: aSize( , ) 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( [, [, ; [, ]]] ) 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( , ) 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( [, ]] ) 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( ) 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( , , ; [, ], [] ) 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( [, ; [, [,;[,[,;

]]]]] )

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( , [ ] ) 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 [] TO INPUT [] TO 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:

@ , ; [SAY ; [PICTURE ] ; [COLOR ] ] ; GET ; [PICTURE ] ; [COLOR ] ; [WHEN ] ; [RANGE , ] | ; [VALID ] 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. SC 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( [] )

ReadInsert()

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

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

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

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

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: ? / ?? [ {, }] QOut/QQOut([ {,}] 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 -------------------------------