EMPTY()
Determina si el resultado de una expresión es un valor vac.o ------------------------------------------------------------------------------ Sintaxis EMPTY(<exp>) --> lVac.o Argumentos <exp> es una expresión de cualquier tipo de datos. Devuelve EMPTY() devuelve verdadero (.T.) si la expresión es un valor vac.o; de lo contrario, devuelve falso (.F.). Los criterios para determinar si un valor se considera vac.o dependen del tipo de datos de <exp> de acuerdo con las reglas siguientes: Lista de Valores Vac.os ------------------------------------------------------------------------ Tipo de datos Contenido ------------------------------------------------------------------------ Matriz Longitud cero Car.cter Espacios, tabuladores, CR/LF, o ("") numérico 0 Fecha CTOD(" ") L.gico Falso (.F.) Memo Igual que carácter NIL NIL ------------------------------------------------------------------------ Descripción La función EMPTY() cuenta con diferentes útilizaciones. Puede utilizarla para determinar si un usuario ha introducido un valor en un objeto GET antes de realizar cambios en un fichero de base de datos. También puede determinar si un parámetro formal es NIL o no se ha pasado. Además, puede comprobar una matriz para localizar una longitud cero. Ejemplos . Estos ejemplos ilustran la utilización de EMPTY() frente a varios tipos de datos diferentes: ? EMPTY(SPACE(5)), EMPTY("") // Resultado: .T. .T. ? EMPTY(0), EMPTY(CTOD("")) // Resultado: .T. .T. ? EMPTY(.F.), EMPTY(NIL) // Resultado: .T. .T. . Este ejemplo utiliza EMPTY() para determinar si el usuario ha introducido un valor en el primer objeto Get antes de escribir el nuevo valor en el fichero de base de datos: LOCAL cCliente := SPACE(15), nCantidad := 0 USE Ventas NEW @ 10, 10 GET cCliente @ 11, 10 GET nCantidad PICTURE "999.99" READ // IF !EMPTY(cCliente) APPEND BLANK REPLACE Ventas->Cliente WITH cCliente; Ventas->Cantidad WITH nCantidad ENDIF . Este ejemplo utiliza EMPTY() como parte de la cláusula VALID para forzar al usuario a introducir datos en el objeto Get actual: LOCAL cCodigo := SPACE(5) @ 2, 5 SAY "Introduzca código" GET cCodigo VALID; !EMPTY(cCodigo) READ Ficheros: La biblioteca asociada es CLIPPER.LIB.


EOF()
 Determina cu.ndo se detecta el final del fichero
------------------------------------------------------------------------------
 Sintaxis

     EOF() --> lL.mite

 Devuelve

     EOF() devuelve verdadero (.T.) cuando se efect.a un intento de desplazar
     el puntero de registros sobrepasando el último registro l.gico de un
     fichero de base de datos; de lo contrario, devuelve falso (.F.). Si no
     hay fichero de base de datos abierto en el área de trabajo actual, EOF()
     devuelve falso (.F.). Si el fichero de base de datos actual no contiene
     registros, EOF() devuelve verdadero (.T.).

 Descripción

     EOF() es una función de base de datos utilizada para comprobar una
     condición l.mite de fin de fichero cuando el puntero del registro avanza
     por un fichero de base de datos. Cualquier mandato que pueda desplazar
     el puntero del registro puede establecer EOF().

     La aplicación m.s habitual es como una parte del argumento <lCondici.n>
     de una construcci.n DO WHILE que procesa secuencialmente registros en un
     fichero de base de datos. Aqu. <lCondici.n> incluir.a una comprobaci.n
     de .NOT. EOF(), forzando al bucle DO WHILE a terminar cuando EOF()
     devuelve verdadero (.T.).

     EOF() y FOUND() se utilizan, frecuentemente, de manera intercambiable
     para comprobar si un mandato SEEK, FIND, o LOCATE ha resultado fallido.
     Sin embargo, con estos mandatos es preferible FOUND().

     Cuando EOF() devuelve verdadero (.T.), el puntero del registro se sit.a
     en LASTREC() + 1 con independencia de si existe un filtro activo o si se
     ha establecido SET DELETED ON. Otros intentos de avanzar el puntero del
     registro devuelven el mismo resultado sin error. Una vez que EOF() est.
     establecido en verdadero (.T.), retiene su valor hasta que se produce
     otro intento de desplazar el puntero del registro.

     Por defecto, EOF() opera en el área de trabajo seleccionada actualmente.
     Se puede hacer que act.e en un área de trabajo no seleccionada
     especific.ndola dentro de una expresión con alias (consulte el ejemplo a
     continúa.ión).

 Ejemplos

     .  En este ejemplo se muestra el uso de EOF() desplazando
        deliberadamente el puntero del registro m.s all. del último registro:

        USE Ventas
        GO BOTTOM
        ? EOF()            // Resultado: .F.
        SKIP
        ? EOF()            // Resultado: .T.

     .  En este ejemplo se utilizan expresiónes con alias para
        consultar el valor de EOF() en .reas de trabajo no seleccionadas:

        USE Ventas NEW
        USE Cliente NEW
        ? Ventas->(EOF())
        ? Cliente->(EOF())

     .  En este ejemplo se ilustra c.mo EOF() puede utilizarse como
        parte de una condición para operación.s de ficheros de bases de datos
        secuenciales:

        USE Sales INDEX NumClie NEW
        DO WHILE !EOF()
           nClieAnt := Ventas->NumClie
           nCantTotal := 0
           DO WHILE nClieAnt = Ventas->NumClie .AND. (!EOF())
              ? Ventas->NumClie, Ventas->Descripción,
                    Ventas->CantVentas
              nCantTotal += Ventas->CantVentas
              SKIP
           ENDDO
           ? "Cantidad total: ", nCantTotal
        ENDDO

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


ERRORBLOCK()
 Establece un bloque de código para que se ejecute cuando surja un error de
 tiempo de ejecución
------------------------------------------------------------------------------
 Sintaxis

     ERRORBLOCK([<bManejadorError>]) --> bManejadorErrorActual

 Argumentos

     <bManejadorError> es el bloque de código que debe ejecutarse siempre
     que se produzca un error de tiempo de ejecución. Cuando se eval.a, el
     sistema pasa un objeto de error a <bManejadorError> como argumento.

 Devuelve

     ERRORBLOCK() devuelve el bloque de código de manejo de errores. Si no se
     ha fijado ningún bloque de manejo de errores desde que se llam. al
     programa, ERRORBLOCK() devuelve el bloque de manejo de errores por
     defecto.

 Descripción

     ERRORBLOCK() es una función de error que define la ejecución de un
     manejador de errores siempre que se produzca un error. Especifique el
     manejador de errores como un bloque de código con la forma siguiente:

     { |<objError>| <lista de expresiónes>,... }

     donde <objError> es un objeto error que contiene información sobre el
     error. Dentro del bloque de código, pueden envíarse mensajes al objeto
     con el fin de obtener información sobre el error. Si el bloque de manejo
     de errores devuelve verdadero (.T.) se reintenta la operación.fallida y
     si devuelve falso (.F.) se reanuda el proceso.

     El bloque de código de manejo de errores puede especificarse como una
     lista de expresiónes o como una llamada a una función definida por el
     usuario. La segunda opción es m.s .til puesto que pueden utilizarse las
     sentencias de control de CA-Clipper en lugar de expresiónes. Este es
     especialmente el caso si existe BEGIN SEQUENCE pendiente y desea
     efectuar BREAK a la sentencia RECOVER m.s pr.xima.

     Como esto implica, los bloques de manejo de errores pueden utilizarse en
     combinación con estructuras de control BEGIN SEQUENCE...END. En un
     bloque puede manejar errores de dispositivo, de bajo nivel y comunes que
     cuentan con un mecanismo de recuperaci.n general. Si la operación.     requiere un manejo espec.fico de errores, defina BEGIN SEQUENCE y
     después, BREAK a la sentencia RECOVER, devolviendo el objeto de error
     para el procesamiento local. Consulte el ejemplo que se muestra m.s
     adelante.

     Si no se ha especificado <bManejadorError> utilizando ERRORBLOCK() y se
     ha producido un error de tiempo de ejecución, se eval.a el bloque de
     manejo de errores por defecto. Este manejador de errores muestra un
     mensaje descriptivo en la pantalla, establece ERRORLEVEL() en 1 y
     después sale mediante QUIT del programa.

     Puesto que ERRORBLOCK() devuelve el bloque de manejo de errores actual,
     es posible especificar un bloque de manejo de errores para una operación.     guardando el bloque actual y restableci.ndolo después de que se haya
     completado la operación. Del mismo modo, los gestores de errores
     especificados como bloques de códigos, pueden pasarse a los
     procedimientos y funciónes definidas por el usuario y devolverse
     mediante RETURN como valores.

     Para obtener más información sobre la estructura y operación.s de
     objetos de error, consulte la entrada Clase de Error dentro de este
     capítulo y el capítulo Estrategias de Manejo de Errores en la gu.a
     Programaci.n y Utilidades.

 Ejemplos

     .  El fragmento de código de la p.gina siguiente establece un
        bloque de manejo de errores, que se llamar. cuando se produzca un
        error dentro de una construcci.n BEGIN SEQUENCE:

        LOCAL bManejadorError, búltimoManejador, objErr
        bManejadorError := { |objError| ;
              MiManejadorError(objError) }
        //
        // Guardar el manejador actual
        búltimoManejador := ERRORBLOCK(bManejadorError)
        //
        BEGIN SEQUENCE
           .
           . <sentencias de operación.gt;
           .
        // Recibir el objeto de error desde BREAK
        RECOVER USING objError
           .
           . <sentencias de recuperaci.n>
           .
        END
        ERRORBLOCK(búltimoManejador)         // Restaurar el
                                             // manejador
        RETURN

        FUNCTION MiManejadorError( objError )
           //
           BREAK objError                    // Devolver el objeto de
                                             // error a RECOVER
           RETURN NIL

 Ficheros: La biblioteca asociada es CLIPPER.LIB.


ERRORLEVEL()
 Establece el código de retorno de CA-Clipper
------------------------------------------------------------------------------
 Sintaxis

     ERRORLEVEL([<nNuevoC.digoRetorno>]) --> nC.digoRetornoActual

 Argumentos

     <nNuevoC.digoRetorno> es la nueva selecci.n de código de retorno.
     Esta puede tener un valor entre cero y 255. El valor por defecto al
     inicio es cero. Si no se especifica, ERRORLEVEL() informa sobre la
     selecci.n actual sin asignar un nuevo valor.

 Devuelve

     ERRORLEVEL() devuelve el código de salida de CA-Clipper actual como un
     valor numérico, si se ha seleccionado uno utilizando ERRORLEVEL() con un
     argumento; de lo contrario, devuelve cero.

 Descripción

     ERRORLEVEL() es una función de entorno que tiene una doble finalidad.
     Devuelve el código de retorno de CA-Clipper actual y establece,
     opciónalmente, un nuevo código de retorno. El código de retorno es un
     valor establecido por un proceso hijo de forma que el proceso padre
     pueda comprobar su estado de finalizaci.n. Normalmente, el proceso padre
     es el DOS y el hijo es un programa de aplicación. Puede comprobar el
     valor de retorno mediante la variable ERRORLEVEL del DOS o bien mediante
     la función 4Dh de la INT 21h.

     Cuando finaliza un programa de CA-Clipper, el código de retorno se
     establece en 1 si el proceso finaliza con un error grave. Si el proceso
     finaliza normalmente, el código de retorno se establece en cero o en el
     último valor de ERRORLEVEL() definido en el programa.

     Normalmente, puede fijar un código de retorno con ERRORLEVEL() para
     indicar un estado de error al programa que ha llamado al programa de
     CA-Clipper actual. En la mayor.a de casos, se trata del fichero de
     proceso por lotes de la aplicación. Aqu. puede comprobar el código de
     retorno utilizando la variable del DOS ERRORLEVEL. Consulte el manual de
     DOS para obtener más información.

 Notas

     .  ERRORLEVEL() no se actualiza después de que finalice un
        mandato RUN. Para obtener el código de retorno del programa llamado,
        debe crear una rutina en ensamblador o C que consulte el código de
        retorno del proceso secundario utilizando la función 4Dh de la INT
        21. Consulte el manual de Referencia T.cnica del DOS para obtener m.s
        información.

 Ejemplos

     .  Este ejemplo guarda el código de retorno actual de CA-Clipper,
        seguidamente, establece un nuevo valor:

        nAntCodigo := ERRORLEVEL()         // Obtiene el nivel
                                           // de error actual
        ERRORLEVEL(1)                      // Establece el nuevo
                                           // nivel de error

     .  Este ejemplo utiliza ERRORLEVEL() para establecer un código de
        retorno que puede comprobar el proceso padre:

        #define ERR_FICH_PERDIDO      255
        #define ERR_EST_INCOMPLETO    254
        //
        IF !FILE("Sisfich.dbf")
           @ 0, 0
           @ 1, 0
           @ 0, 0 SAY "Error fatal: Fichero de sistema perdido...saliendo"
           ERRORLEVEL(ERR_FICH_PERDIDO)
           QUIT
        ENDIF

 Ficheros: La biblioteca asociada es CLIPPER.LIB.


EVAL()
 Eval.a un bloque de código
------------------------------------------------------------------------------
 Sintaxis

     EVAL(<bBloque>, [<ListaArgBloque>]) --> últimoValorBloque

 Argumentos

     <bBloque> es el bloque de código que se debe evaluar.

     <ListaArgBloque> es una lista de argumentos para envíar al bloque de
     código antes de que se eval.e.

 Devuelve

     EVAL() devuelve el valor de la .ltima expresión dentro del bloque. Un
     bloque de código puede devolver un valor de cualquier tipo.

 Descripción

     EVAL() es una función de bloque de código. Es la función m.s b.sica de
     evaluaci.n de bloque de código del sistema CA-Clipper. Un bloque de
     código es un valor de datos especial que hace referencia a un fragmento
     de código de programa compilado. Para obtener más información sobre
     bloques de código, consulte el capítulo Conceptos Básicos de la gu.a
     Programaci.n y Utilidades.

     Para ejecutar o evaluar un bloque de código, llame a EVAL() con el valor
     de bloque y cualquier parámetro. Cuando se ejecuta el bloque se le
     suministran los parámetros. Los bloques de código pueden ser una serie
     de expresiónes separadas por comas. Cuando se eval.a un bloque de
     código, el valor de retorno es el valor de la .ltima expresión del
     bloque.

     Normalmente, el compilador de CA-Clipper compila un bloque de código en
     el tiempo de compilación. Sin embargo, existen ocasiones en las que es
     necesario compilar un bloque de código desde una cadena de carácteres en
     tiempo de ejecución. Este proceso puede realizarse utilizando el
     operador de macroexpresiónes (&).

     EVAL() se utiliza, con frecuencia, para crear funciónes de iteraci.n.
     Estas son funciónes que aplican un bloque a cada miembro de una
     estructura de datos. AEVAL(), ASORT(), ASCAN() y DBEVAL() son funciónes
     de iteraci.n (por ejemplo, AEVAL() eval.a un bloque para cada elemento
     de una matriz).

 Ejemplos

     .  En este ejemplo se crea un bloque de código que incrementa un
        número y despuésólo eval.a:

        bBloque := { |nArg| nArg + 1 }
        ? EVAL(bBloque, 1)                     // Resultado: 2

     .  En este ejemplo se muestra la compilación de un bloque de
        código en el tiempo de ejecución utilizando el operador de
        macroexpresiónes (&):

        // Compilar una cadena en un bloque
        bBloque := &("{ |nArg| nArg + 1 }")

        // Evaluar el bloque
        ? EVAL(bBloque, 1)

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


EXP()
 Calcula e**x
------------------------------------------------------------------------------
 Sintaxis

     EXP(<nExponente>) --> nAntilogaritmo

 Argumentos

     <nExponente> es el logaritmo natural para el que debe calcularse un
     valor numérico.

 Devuelve

     EXP() devuelve un valor numérico que es equivalente al valor e elevado a
     la potencia especificada.

 Descripción

     EXP() es una función matem.tica que calcula el valor de 'y' en la
     ecuaci.n siguiente:

     e**x = y

     Donde e es la base de logaritmos naturales (2,71828...) y x es
     <nExponente>. El valor máximo de <nExponente> es 45 antes de que se
     produzca un desbordamiento numérico. EXP() y LOG() son funciónes
     inversas.

     El número de posiciónes decimales que se muestra est. determinado
     .nicamente por SET DECIMALS con independencia del valor SET FIXED
     actual.

 Ejemplos

     .  En este ejemplo se muestran diversas llamadas a EXP():

        ? EXP(1)                  // Resultado: 2.72
        SET DECIMALS TO 10
        ? EXP(1)                  // Resultado: 2.7182818285
        ? LOG(EXP(1))             // Resultado: 1.0000000000

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


FCLOSE()
 Cierra un fichero binario abierto y escribe memorias intermedias del DOS en
 disco
------------------------------------------------------------------------------
 Sintaxis

     FCLOSE(<nManejador>) --> lError

 Argumentos

     <nManejador> es el manejador de fichero obtenido prevíamente de
     FOPEN() o FCREATE().

 Devuelve

     FCLOSE() devuelve falso (.F.) si se ha producido un error mientras
     estaba escribiendo; de lo contrario, devuelve verdadero (.T.).

 Descripción

     FCLOSE() es una función de fichero de bajo nivel que cierra ficheros
     binarios y fuerza a que las memorias intermedias asociadas del DOS se
     graben en disco. Si la operación.falla, FCLOSE() devuelve falso (.F.).
     FERROR() puede utilizarse para determinar el motivo del fallo. Por
     ejemplo, si intenta utilizar FCLOSE() con un manejador no víaacute;lido
     devuelve falso (.F.) y FERROR() devuelve el error 6 de DOS, manejador no
     víaacute;lido. Consulte FERROR() para obtener una lista completa de números de
     errores.

     .Advertencia! Esta función permite el acceso de bajo nivel a los
     ficheros y dispositivos del DOS. Debe utilizarse con gran precauci.n y
     requiere un conocimiento profundo del sistema operativo.

 Ejemplos

     .  Este ejemplo utiliza FCLOSE() para cerrar un fichero binario
        que se ha creado recientemente y muestra un mensaje de error si falla
        el proceso de cierre:

        #include "Fileio.ch"
        //
        nManejador := FCREATE("Fichprueba", FC_NORMAL)
        IF !FCLOSE(nManejador)

           ? "Error cerrando el fichero, error número: ", FERROR()
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


FCOUNT()
 Devuelve el número de campos del fichero (.dbf) actual
------------------------------------------------------------------------------
 Sintaxis

     FCOUNT() --> nCampos

 Devuelve

     FCOUNT() devuelve el número de campos del fichero de base de datos en el
     área de trabajo actual como un valor numérico entero. Si no hay ningún
     fichero de base de datos abierto, FCOUNT() devuelve cero.

 Descripción

     FCOUNT() es una función de base de datos. Es .til en aplicaciónes que
     contienen programas independientes de los datos que pueden funciónar con
     cualquier fichero de base de datos. Estos incluyen programas
     generalizados de importaci.n/exportaci.n y de informes. Normalmente,
     debe utilizarse FCOUNT() para establecer el l.mite superior de un bucle
     FOR...NEXT o DO WHILE que procesa un campo cada vez.

     Por defecto, FCOUNT() funcióna en el área de trabajo seleccionada
     actualmente.

 Ejemplos

     .  Este ejemplo ilustra FCOUNT(), devolviendo el número de campos
        del área de trabajo actual y de una no seleccionada:

        USE Ventas NEW
        USE Cliente NEW
        ? FCOUNT()                      // Resultado: 5
        ? Ventas->(FCOUNT())            // Resultado: 8

     .  Este ejemplo utiliza FCOUNT() para declarar una matriz con
        información de campo:

        LOCAL aCampos := ARRAY(FCOUNT())
        AFIELDS(aCampos)

     .  Este ejemplo utiliza FCOUNT() como l.mite superior de un bucle
        FOR que procesa la lista de los campos del área de trabajo actual:

        LOCAL nCampo
        USE Ventas NEW
        FOR nCampo := 1 TO FCOUNT()
           ? FIELD(nCampo)
        NEXT

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.



FCREATE()
 Crea y/o trunca un fichero binario a longitud cero
------------------------------------------------------------------------------
 Sintaxis

     FCREATE(<cFichero>, [<nAtributo>]) --> nManejador

 Argumentos

     <cFichero> es el nombre del fichero que va a crearse. Si el fichero
     ya existe, su longitud se trunca a cero sin aviso previo.

     <nAtributo> es uno de los atributos de fichero binario que se
     muestran en la tabla siguiente. Si se omite este argumento, el valor por
     defecto es cero.

     Atributos de Fichero Binario
     ------------------------------------------------------------------------
     Valor   Fileio.ch Atributo   Descripción
     ------------------------------------------------------------------------
     0       FC_NORMAL Normal     Crea un fichero de lectura/escritura normal
                                  (por defecto)
     1       FC_READONLY          S.lo lectura   Crea un fichero de sólo
                                  lectura
     2       FC_HIDDEN Oculto     Crea un fichero oculto
     4       FC_SYSTEM Sistema    Crea un fichero de sistema
     ------------------------------------------------------------------------

 Devuelve

     FCREATE() devuelve el número de manejador de fichero de DOS del nuevo
     fichero binario en el rango 0-65.535. Si se produce un error, FCREATE()
     devuelve -1 y FERROR() se establece de forma que indique un código de
     error.

 Descripción

     FCREATE() es una función de fichero de bajo nivel que crea un nuevo
     fichero o abre y trunca uno existente. Si <cFichero> no existe, se crea
     y se abre para escritura. Si existe y puede abrirse para escritura, se
     trunca a una longitud de cero. Si no puede abrirse para escritura,
     FCREATE() devuelve -1 y FERROR() devuelve el valor de error apropiado.

     Cuando FCREATE() crea un nuevo fichero de forma satisfactoria, .ste se
     deja abierto en modo compartido compatible y en el de acceso de
     lectura/escritura. El atributo de fichero especificado por el argumento
     <nAtributo> se aplica al nuevo fichero cuando se cierra, permitiendo la
     escritura en un fichero reci.n creado de sólo lectura. Si desea obtener
     una lista de modos de acceso, consulte FOPEN().

     Puesto que se requiere un manejador de ficheros para identificar un
     fichero abierto para otras funciónes de fichero, el valor de retorno de
     FCREATE() se asigna siempre a una variable para su utilización
     posterior.

     Al igual que otras funciónes de fichero, FCREATE() no utiliza los
     valores SET DEFAULT o SET PATH para su operación. En su lugar, escribe
     en el directorio actual del DOS a menos que se establezca una vía de
     forma expl.cita.

     .Advertencia!  Esta función permite el acceso de bajo nivel a los
     ficheros y dispositivos del DOS. Debe utilizarse con gran precauci.n y
     requiere un conocimiento profundo del sistema operativo.

 Ejemplos

     .  En este ejemplo se crea un fichero llamado Fichprueba y lo
        abre para lectura y escritura:

        #include "Fileio.ch"
        //
        IF (nManejador := FCREATE("Fichprueba", FC_NORMAL)) == -1
           ? "No se puede crear el fichero:", FERROR()
           BREAK
        ELSE
           FWRITE(nManejador, "Hola a todos")
           FCLOSE(nManejador)
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB,
            el fichero de cabecera asociado es Fileio.ch.



FERASE()
 Borra un fichero del disco
------------------------------------------------------------------------------
 Sintaxis

     FERASE(<cFichero>) --> nExito

 Argumentos

     <cFichero> es el nombre del fichero que debe borrarse del disco
     incluyendo la extensión, opciónalmente precedido por una especificación
     de unidad y/o vía.

 Devuelve

     FERASE() devuelve -1 si la operación.falla y cero si es satisfactoria.
     En el caso de que se produzca un fallo, puede utilizarse FERROR() para
     determinar la naturaleza del error.

 Descripción

     FERASE() es una función de fichero que borra un fichero especificado del
     disco. FERASE() es igual que el mandato ERASE, pero devuelve un valor y
     puede especificarse dentro de una expresión. Cuando se llama a FERASE(),
     <cFichero> se borra del disco .nicamente si se encuentra en el
     directorio del DOS actual o en el directorio especificado, de forma
     expl.cita, como parte del nombre del fichero. Al igual que otras
     funciónes de fichero y mandatos, FERASE() no utiliza los valores de SET
     DEFAULT ni SET PATH para localizar <cFichero>.

     .Advertencia! Los ficheros deben cerrarse antes de borrarlos con
     FERASE().

 Ejemplos

     .  En este ejemplo se borra un conjunto de ficheros que coinciden
        con un patr.n comod.n:

        #include "Directry.ch"
        AEVAL(DIRECTORY("*.BAK"), { |aFichero| ;
           FERASE(aFichero[F_NAME]) })

     .  En este ejemplo se borra un fichero y se muestra un mensaje si
        falla la operación.

        IF FERASE("Fichero.txt") == -1
           ? "Error de borrado de archivo:", FERROR()
           BREAK
        ENDIF

 Ficheros: La biblioteca asociada es CLIPPER.LIB.


FERROR()
 Comprueba si existen errores después de una operación.de fichero binario
------------------------------------------------------------------------------
 Sintaxis

     FERROR() --> nC.digoError

 Devuelve

     FERROR() devuelve el error del DOS de la .ltima operación.de fichero
     como un valor numérico entero. Si no hay ningún error, FERROR() devuelve
     cero.

     Valores de Retorno de FERROR() 
     ------------------------------------------------------------------------
     Error     Significado
     ------------------------------------------------------------------------
     0         Satisfactorio
     2         Fichero no encontrado
     3         V.a no encontrada
     4         Demasiados ficheros abiertos
     5         Acceso denegado
     6         Manejador no víaacute;lido
     8         Memoria insuficiente
     15        Unidad especificada no víaacute;lida
     19        Ha intentado escribir en un disco protegido contra escritura
     21        Unidad no preparada
     23        Error CRC de datos
     29        Fallo de escritura
     30        Fallo de lectura
     32        Violaci.n de compartici.n
     33        Violaci.n de bloqueo
     ------------------------------------------------------------------------

 Descripción

     FERROR() es una función de fichero de bajo nivel que indica un error del
     DOS después de que se haya utilizado una función de fichero. Estas
     funciónes incluyen FCLOSE(), FCREATE(), FERASE(), FOPEN(), FREAD(),
     FREADSTR() y FRENAME(). FERROR() retiene su valor hasta la siguiente
     ejecución de una función de fichero.

     .Advertencia! Esta función permite el acceso de bajo nivel a los
     ficheros y dispositivos del DOS. Debe utilizarse con gran precauci.n y
     requiere un conocimiento profundo del sistema operativo

 Ejemplos

     .  Este ejemplo comprueba FERROR() después de crear un fichero
        binario y muestra un mensaje de error si falla la creaci.n:

        #include "Fileio.ch"
        //
        nManejador := FCREATE("Temp.txt", FC_NORMAL)
        IF FERROR() != 0
           ? "No se puede crear el fichero, error DOS ", FERROR()
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


FIELDBLOCK()
 Devuelve un bloque de código de asignación/lectura de un campo determinado
------------------------------------------------------------------------------
 Sintaxis

     FIELDBLOCK(<cNombreCampo>) --> bBloqueCampo

 Argumentos

     <cNombreCampo> es el nombre del campo al que har. referencia el
     bloque de asignación/lectura.

 Devuelve

     FIELDBLOCK() devuelve un bloque de código que, cuando se eval.a, asigna
     o lee el valor del campo determinado. Si <cNombreCampo> no existe en el
     .rea de directorio actual, FIELDBLOCK() devuelve NIL.

 Descripción

     FIELDBLOCK() es una función de base de datos que crea un bloque de
     código. Cuando se ejecuta con un argumento, el bloque de código creado
     mediante esta función asigna el valor del argumento a <cNombreCampo>.
     Cuando se ejecuta sin un argumento, el bloque de código recupera el
     valor de <cNombreCampo>.

     Observe que es posible que la variable de campo especificada no exista
     cuando se cree el bloque de código, pero debe existir antes de que .ste
     se ejecute.

 Notas

     .  área de trabajo: El bloque de código devuelto por
        FIELDBLOCK() asigna o recupera el valor del campo especificado en
        cualquier área de trabajo en la que est. actualmente cuando se
        ejecute el bloque. Por ejemplo, las .reas de trabajo 1 y 2
        determinadas, contienen ambas el campo NomC:

        SELECT 1
        NomC := "Maribel"
        SELECT 2
        NomC := "Sonia"
        bNomC := FIELDBLOCK("NomC")
        SELECT 1
        ? EVAL(bNomC)          // Resultado: "Maribel"
        SELECT 2
        ? EVAL(bNomC)          // Resultado: "Sonia"

        La función FIELDWBLOCK() proporciona un bloque de asignación/lectura
        para un campo en un área de trabajo espec.fica.

 Ejemplos

     .  Este ejemplo compara FIELDBLOCK() con un bloque de código
        creado utilizando el operador de macroexpresiónes. Observe que
        utilizando FIELDBLOCK() evita los problemas de velocidad y tama.o
        asociados con el citado operador:

        // Bloque de asignación/lectura definido por medio del
        // operador de macroexpresiónes
        bAsilec := &( "{ |ValorAsig| IF( ValorAsig == NIL,;
                        NomC, NomC := ValorAsig ) }" )
        // Bloque de asignación/lectura definido por medio de
        // FIELDBLOCK()

        // bAsilec creado aqu. es el equivalente
        // funciónal del bAsilec anterior
        bAsilec := FIELDBLOCK("NomC")

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.



FIELDGET()
 Obtiene el valor de un campo a partir de su posición en la estructura de
 la base de datos
------------------------------------------------------------------------------
 Sintaxis

     FIELDGET(<nCampo>) --> ValorCampo

 Argumentos

     <nCampo> es la posición ordinal del campo en la estructura de
     registro para el área de trabajo actual.

 Devuelve

     FIELDGET() devuelve el valor del campo especificado. Si <nCampo> no
     corresponde a la posición de ningún campo del fichero de base de datos
     actual, FIELDGET() devuelve NIL.

 Descripción

     FIELDGET() es una función de base de datos que obtiene el valor de un
     campo utilizando su posición dentro de la estructura del fichero de la
     base de datos en lugar de su nombre de campo. Dentro de las funciónes
     gen.ricas de servicio de base de datos esto permite, entre otras cosas,
     recuperar los valores de campos sin utilizar el operador de
     macroexpresiónes.

 Ejemplos

     .  Este ejemplo compara FIELDGET() con el código funciónalmente
        equivalente que utiliza el operador de macroexpresiónes para obtener
        el valor de un campo:

        LOCAL nCampo := 1, NomC, ValC
        USE Cliente NEW
        //
        // Usando el operador de macroexpresiónes
        NomC := FIELD( nCampo )           // Obtener el nombre
                                          // del campo
        ValC := &NomC                     // Obtener el valor
                                          // del campo
        // Usando FIELDGET()
        ValC := FIELDGET( nCampo )        // Obtener el valor
                                          // del campo

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


FIELDNAME()/FIELD()
 Devuelve un nombre de campo del fichero (.dbf) actual
------------------------------------------------------------------------------
 Sintaxis

     FIELDNAME/FIELD(<nPosici.n>) --> cNombreCampo

 Argumentos

     <nPosici.n> es la posición de un campo en la estructura del fichero
     de base de datos.

 Devuelve

     FIELDNAME() devuelve el nombre del campo especificado como una cadena de
     carácteres. Si <nPosici.n> no corresponde con un campo existente en el
     fichero de base de datos actual o si no se abre ningún fichero de base
     de datos en el área de trabajo actual, FIELDNAME() devuelve una cadena
     nula ("").

 Descripción

     FIELDNAME() es una función de base de datos que devuelve un nombre de
     campo utilizando un ííndice en la posición del nombre de campo en la
     estructura de base de datos. Util.celo en aplicaciónes independientes de
     los datos donde el nombre de campo es desconocido. Si requiere
     información de m.s de un campo, utilice AFIELDS() para crear una matriz
     de información de campos o COPY STRUCTURE EXTENDED para crear una base
     de datos de información de campos.

     Si necesita información adicional sobre estructuras de ficheros de base
     de datos, utilice TYPE() y LEN(). Para obtener el número de posiciónes
     decimales de un campo numérico, utilice la expresión siguiente:

     LEN(SUBSTR(STR(<idCampo>), RAT(".", ;
                 STR(<idCampo>)) + 1))

     Por defecto, FIELDNAME() funcióna en el área de trabajo seleccionada
     actualmente, tal como se muestra en el ejemplo siguiente.

 Ejemplos

     .  En estos ejemplos se ilutra FIELDNAME() utilizado con otras
        funciónes:

           USE Ventas
           ? FIELDNAME(1)                // Resultado: SUCURSAL
           ? FCOUNT()                    // Resultado: 5
           ? LEN(FIELDNAME(0))           // Resultado: 0
           ? LEN(FIELDNAME(40))          // Resultado: 0

     .  En este ejemplo se utiliza FIELDNAME() para listar el nombre y
        tipo de cada campo de Cliente.dbf:

           USE Cliente NEW

              FOR nCampo := 1 TO FCOUNT()
                 ? PADR(FIELDNAME(nCampo), 10),;
                        VALTYPE(&(FIELDNAME(nCampo)))
              NEXT

     .  En este ejemplo se accede a campos en .reas de trabajo no
        seleccionadas, utilizando expresiónes de alias:

              USE Ventas NEW
              USE Cliente NEW
              USE Facturas NEW
              //
              ? Ventas->(FIELDNAME(1))   // Resultado: NUMVENTA
              ? Cliente->(FIELDNAME(1))  // Resultado: NUMCLIE

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


FIELDPOS()
 Devuelve la posición de un campo en un área de trabajo
------------------------------------------------------------------------------
 Sintaxis

     FIELDPOS(<cNombreCampo>) --> nPosCampo

 Argumentos

     <cNombreCampo> es el nombre de un campo en el área de trabajo actual
     o especificada.

 Devuelve

     FIELDPOS() devuelve la posición del campo especificado dentro de la
     lista de campos asociados con el área de trabajo actual o especificada.
     Si el área de trabajo actual no tiene ningún campo con el nombre
     especificado, FIELDPOS() devuelve cero.

 Descripción

     FIELDPOS() es una función de base de datos que realiza el proceso
     inverso de la función FIELDNAME(). FIELDPOS() se utiliza frecuentemente
     junto con las funciónes FIELDPUT() y FIELDGET().

     FIELDPOS() devuelve los nombres de campos en cualquier área de trabajo
     no seleccionada, haciendo referencia a la función por medio de una
     expresión con alias. Consulte el ejemplo que se muestra m.s adelante.

 Ejemplos

     .  En este ejemplo se muestra una especificación t.pica de la
        función FIELDPOS():

     USE Cliente NEW

        ? FIELDPOS("Nombre")                   // Resultado: 1
        ? FIELDGET(FIELDPOS("Nombre"))         // Resultado: Sonia

     .  En este ejemplo se utiliza FIELDPOS() para devolver la
        posición de un campo especificado en un área de trabajo no
        seleccionada:

        USE Cliente NEW
        USE Facturas NEW
        ? Cliente->(FIELDPOS("Nombre"))        // Resultado: 1
        ? Cliente->(FIELDGET(FIELDPOS("Nombre")))
                                               // Resultado: Sonia

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


FIELDPUT()
 Establece el valor de una variable de campo a partir de su posición en
 la estructura de la base de datos
------------------------------------------------------------------------------
 Sintaxis

     FIELDPUT(<nCampo>, <expAsignar>) --> ValorAsignado

 Argumentos

     <nCampo> es la posición ordinal del campo en el fichero de base de
     datos actual.

     <expAsignar> es el valor que debe asignarse al campo dado. El tipo
     de datos de esta expresión debe coincidir con el tipo de datos de la
     variable de campo designada.

 Devuelve

     FIELDPUT() devuelve el valor asignado al campo designado. Si <nCampo> no
     corresponde con la posición de ningún campo del fichero de base de datos
     actual, FIELDPUT() devuelve NIL.

 Descripción

     FIELDPUT() es una función de base de datos que asigna <expAsignar> al
     campo en la posición ordinal <nCampo> en el área de trabajo actual. Esta
     función le permite establecer el valor de un campo utilizando su
     posición dentro de la estructura del fichero de base de datos en lugar
     de su nombre de campo. Dentro de las funciónes gen.ricas de servicio de
     base de datos esto permite, entre otras cosas, seleccionar valores de
     campo sin tener que utilizar el operador de macroexpresiónes.

 Ejemplos

     .  En este ejemplo se compara FIELDPUT() con el código
        funciónalmente equivalente, que utiliza el operador de
        macroexpresiónes para establecer el valor de un campo:

        // Usando el operador de macroexpresiónes
        NomC := FIELD(nCampo)            // Obtener nombre de campo
        FIELD->&NomC := ValC             // Establecer valor de campo
        // Usando FIELDPUT()
        FIELDPUT(nCampo, ValC)           // Establecer valor de campo

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


FIELDWBLOCK()
 Devuelve un bloque de código de asignación/lectura de un campo en un .rea
 de trabajo determinada
------------------------------------------------------------------------------
 Sintaxis

     FIELDWBLOCK(<cNombreCampo>, <nAreaTrabajo>) --> bBloqueCampoT

 Argumentos

     <cNombreCampo> es el nombre del campo especificado como una cadena
     de carácteres.

     <nAreaTrabajo> es el número de área de trabajo donde reside el campo
     especificado.

 Devuelve

     FIELDWBLOCK() devuelve un bloque de código que, cuando se eval.a, asigna
     u obtiene el valor de <cNombreCampo> en el área de trabajo designada por
     <nAreaTrabajo>. Si <cNombreCampo> no existe en el área de trabajo
     especificada, FIELDWBLOCK() devuelve NIL.

 Descripción

     FIELDWBLOCK() es una función de base de datos que crea un bloque de
     código. Cuando se eval.a el bloque de código con la función EVAL(), en
     primer lugar, selecciona el <nAreaTrabajo> designada. Si se ha pasado un
     argumento, el bloque de código asigna el valor del argumento a
     <cNombreCampo>. Si no se ha pasado ningún argumento, el bloque de código
     obtiene el valor de <cNombreCampo>. El área de trabajo original se
     vuelve a seleccionar antes de que el bloque de código devuelva el
     control.

     Observe que es posible que no exista la variable de campo especificada
     cuando se cree el bloque de código, pero debe existir antes de que se
     ejecute.

 Notas

     .  FIELDWBLOCK() es similar a FIELDBLOCK(), con la excepci.n de
        que FIELDWBLOCK() incorpora un área de trabajo fija en el bloque de
        asignación/lectura.

 Ejemplos

     .  Este ejemplo compara FIELDWBLOCK() con un bloque de código
        creado utilizando el operador de macro. Observe que utilizando
        FIELDWBLOCK() se evitan los problemas de velocidad y tama.o asociados
        con el operador de macroexpresiónes:

        // Bloque de asignación/lectura para el área de trabajo 1
        // definido con el operador de macroexpresiónes
        bAsilec := &( "{ |ValorAsig| IF( ValorAsig == NIL, ;
           1->NomC, 1->NomC := ValorAsig ) }" )
        // Bloque de asignación/lectura definido por medio de
        // FIELDWBLOCK()

        // bAsilec creado aqu. es el equivalente
        // funciónal del bAsilec anterior
        bAsilec := FIELDWBLOCK("NomC", 1)

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


FILE()
 Determina si existen ficheros en el directorio o vía por defecto de
 CA-Clipper
------------------------------------------------------------------------------
 Sintaxis

     FILE(<cEspecFichero>) --> lExiste

 Argumentos

     <cEspecFichero> determina una especificación de fichero estándar que
     puede incluir carácteres comod.n * y ?, as. como una referencia de
     unidad y de vía. Las referencias expl.citas a un fichero deben incluir
     también una extensión.

 Devuelve

     FILE() devuelve verdadero (.T.) si alg.n fichero coincide con el patr.n
     <cEspecFichero>; de lo contrario, devuelve falso (.F.).

 Descripción

     FILE() es una función de entorno que determina si se ha localizado alg.n
     fichero que coincida con un patr.n de especificación de fichero. FILE()
     busca el directorio especificado si se ha especificado una vía de forma
     expl.cita.

     Si no se ha especificado una vía, FILE() busca en el directorio por
     defecto de CA-Clipper y posteriormente, la vía de CA-Clipper. En ningún
     caso se busca en la vía del DOS. Observe también que FILE() no reconoce
     los ficheros ocultos o de sistema en su b.squeda.

 Ejemplos

     .  En este ejemplo FILE() intenta localizar Ventas.dbf en otro
        directorio de CA-Clipper, que no sea el utilizado por defecto:

        ? FILE("Ventas.dbf")                   // Resultado: .F.
        ? FILE("\APPS\DBF\Ventas.dbf")         // Resultado: .T.
        //
        SET PATH TO \APPS\DBF
        ? FILE("Ventas.dbf")                   // Resultado: .T.
        //
        SET PATH TO
        SET DEFAULT TO \APPS\DBF\
        ? FILE("Ventas.dbf")                   // Resultado: .T.
        ? FILE("*.dbf")                        // Resultado: .T.

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.



FKLABEL()*
 Devuelve un nombre de tecla de función
------------------------------------------------------------------------------
 Sintaxis

     FKLABEL(<nTeclafunción>) --> cEtiqTecla

 Devuelve

     FKLABEL() devuelve una cadena de carácteres que representa el nombre de
     la tecla de función especificada por el argumento numérico,
     <nTeclafunción>. Si el argumento es menor que uno o mayor que 40, la
     función devuelve una cadena ("") nula.

 Descripción

     FKLABEL() es una función de compatibilidad que se utiliza para duplicar
     la función FKLABEL() en dBASE III PLUS. Como principio general, la
     utilización de esta función no es recomendable ni necesaria en
     CA-Clipper. Las teclas de función se etiquetan con Fn, donde n abarca de
     uno a 40 y corresponde directamente con el argumento FKLABEL().

 Ficheros:  La biblioteca asociada es EXTEND.LIB,
            el módulo fuente es SOURCE\SAMPLE\FKLABEL.PRG.



FKMAX()*
 Devuelve el número de teclas de función como una constante
------------------------------------------------------------------------------
 Sintaxis

     FKMAX() --> nTeclasfunción

 Descripción

     FKMAX() es una función de compatibilidad que se utiliza para duplicar la
     función FKMAX() en dBASE III PLUS. Como principio general, la
     utilización de esta función no es recomendable ni necesaria en
     CA-Clipper. Simplemente, devuelve un valor constante igual a 40.

 Ficheros:  La biblioteca asociada es EXTEND.LIB,
            el módulo fuente es SOURCE\SAMPLE\FKMAX.PRG.


FLOCK()
 Bloquea un fichero de base de datos abierto en modo compartido
------------------------------------------------------------------------------
 Sintaxis

     FLOCK() --> lExito

 Devuelve

     FLOCK() devuelve verdadero (.T.) si el intento de bloquear un fichero de
     base de datos en uso en el área de trabajo actual es satisfactorio; de
     lo contrario, devuelve falso (.F.). Si desea obtener más información
     sobre el bloqueo de ficheros, consulte el capítulo Programaci.n en Red
     en la gu.a Programaci.n y Utilidades.

 Descripción

     FLOCK() es una función de base de datos que se utiliza en entornos de
     red para bloquear un fichero de base de datos abierto en modo
     compartido, evitando as. que otros usuarios actualicen el fichero hasta
     que se libere el bloqueo. Los registros en el fichero bloqueado sólo
     están accesibles para operación.s de lectura.

     FLOCK() se relaciona con USE...EXCLUSIVE y RLOCK(). USE...EXCLUSIVE abre
     un fichero de base de datos, de forma que ningún otro usuario pueda
     abrir el mismo fichero al mismo tiempo y se trata del mecanismo de
     bloqueo m.s restrictivo de CA-Clipper. RLOCK() es el menos restrictivo e
     intenta situar un bloqueo de actualizaci.n en un registro compartido,
     impidiendo que otros usuarios actualicen el registro actual. FLOCK()
     representa un nivel de restricci.n medio.

     FLOCK() se utiliza en operación.s que acceden a la totalidad del fichero
     de base de datos. Normalmente, estos son mandatos que actualizan el
     fichero con un ámbito o una condición, como por ejemplo, DELETE o
     REPLACE ALL. A continúa.ión, se muestra una lista de estos mandatos:

     Mandatos que requieren FLOCK()
     ------------------------------------------------------------------------
     Mandato                       Modo
     ------------------------------------------------------------------------
     APPEND FROM                   FLOCK() o USE...EXCLUSIVE
     DELETE (varios registros)     FLOCK() o USE...EXCLUSIVE
     RECALL (varios registros)     FLOCK() o USE...EXCLUSIVE
     REPLACE (varios registros)    FLOCK() o USE...EXCLUSIVE
     UPDATE ON                     FLOCK() o USE...EXCLUSIVE
     ------------------------------------------------------------------------

     Por cada llamada de FLOCK(), existe un intento de bloquear el fichero de
     base de datos y el resultado se devuelve como un valor l.gico. Un
     bloqueo de fichero falla si otro usuario tiene actualmente un bloqueo de
     fichero o de registro para el mismo fichero de base de datos o bien, si
     otro usuario est. usando la base de datos en modo exclusivo. Si FLOCK()
     es satisfactorio, el bloqueo de fichero permanece hasta que efect.e
     UNLOCK, CLOSE DATABASE o RLOCK().

     Por defecto, FLOCK() funcióna en el área de trabajo seleccionada, tal
     como se muestra en el ejemplo siguiente.

 Notas

     .  SET RELATION: CA-Clipper no bloquea autom.ticamente todas
        las .reas de trabajo en la cadena de relaci.n cuando bloquea el .rea
        de trabajo actual y el uso de la función UNLOCK no es efectivo en
        .reas de trabajo relacionadas.

 Ejemplos

     .  Este ejemplo utiliza FLOCK() para una actualizaci.n por lotes
        de los precios de Inventar.dbf:

        USE Inventar NEW
        IF FLOCK()
           REPLACE ALL Inventar->Precio WITH ;
                 Inventar->Precio * 1.1
        ELSE
           ? "Fichero no disponible"
        ENDIF

     .  Este ejemplo utiliza una expresión con alias para intentar un
        bloqueo de fichero en un área de trabajo no seleccionada:

        USE Ventas NEW
        USE Cliente NEW
        //
        IF !Ventas->(FLOCK())
           ? "Ventas est. siendo usado por otro usuario"
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.



FOPEN()
 Abre un fichero binario
------------------------------------------------------------------------------
 Sintaxis

     FOPEN(<cFichero>, [<nModo>]) --> nManejador

 Argumentos

     <cFichero> es el nombre del fichero que se va a abrir incluyendo la
     vía, si existe.

     <nModo> es el modo de apertura del DOS solicitado, que indica c.mo
     puede accederse al fichero abierto. El modo de apertura se compone de
     elementos de los dos tipos de modos que se describen en las tablas que
     aparecen m.s adelante. Si .nicamente se utiliza el Modo de Acceso, el
     fichero se abre como no compartido. El modo de apertura por defecto es
     cero, lo que indica no compartido y sólo de lectura.

     Modos de Acceso FOPEN() 
     ------------------------------------------------------------------------
     Modo    Fileio.ch            Operaci.n
     ------------------------------------------------------------------------
     0       FO_READ              Abierto para lectura (por defecto)
     1       FO_WRITE             Abierto para escritura
     2       FO_READWRITE         Abierto para lectura o escritura
     ------------------------------------------------------------------------


     Los Modos de Utilizaci.n Compartida determinan c.mo pueden acceder otros
     procesos al fichero.

     Los Modos de Acceso en combinación (+) con los modos Compartidos
     determinan la accesibilidad del fichero en un entorno de red.

     Modos de Utilizaci.n Compartida FOPEN() 
     ------------------------------------------------------------------------
     Modo    Fileio.ch           Operaci.n
     ------------------------------------------------------------------------
     0       FO_COMPAT           Modo de compatibilidad (por defecto)
     16      FO_EXCLUSIVE        Uso exclusivo
     32      FO_DENYWRITE        Evita que otros escriban
     48      FO_DENYREAD         Evita que otros lean
     64      FO_DENYNONE         Permite que otros lean o escriban
     64      FO_SHARED           Igual que FO_DENYNONE
     ------------------------------------------------------------------------

 Devuelve

     FOPEN() devuelve el manejador del fichero abierto en el rango 0-65.535.
     Si se produce un error, FOPEN() devuelve -1.

 Descripción

     FOPEN() es una función de fichero de bajo nivel, que abre un fichero
     binario existente para lectura y escritura, según el argumento <nModo>.
     Siempre que exista un error de apertura, FERROR() devuelve el número de
     error del DOS. Por ejemplo, si el fichero no existe, FOPEN() devuelve -1
     y FERROR() devuelve 2 para indicar que no se ha localizado el fichero.
     Consulte FERROR() para obtener una lista completa de números de error.

     Si el fichero especificado se abre de forma satisfactoria, el valor
     devuelto es el manejador del DOS para el fichero. Este valor es similar
     a un alias en el sistema de base de datos y es necesario para
     identificar el fichero abierto para otras funciónes de fichero. Por lo
     tanto, es importante asignar el valor de retorno a una variable para su
     utilización posterior, tal como se muestra en el ejemplo que aparece m.s
     adelante.

     .Advertencia! Esta función permite el acceso de bajo nivel a los
     ficheros y dispositivos del DOS. Debe utilizarse con gran precauci.n y
     requiere un conocimiento profundo del sistema operativo.

 Notas

     .  Acceso a ficheros en otros directorios: FOPEN() no act.a
        seg.n los valores de SET DEFAULT ni SET PATH. En su lugar, busca en
        el directorio y vía actual del DOS, a menos que se establezca una
        vía, de forma expl.cita, como parte del argumento <cFichero>.

 Ejemplos

     .  Este ejemplo utiliza FOPEN() para abrir un fichero con estado
        compartible de lectura/escritura y muestra un mensaje de error si
        falla la apertura:

        #include "Fileio.ch"
        //
        nManejador := FOPEN("Temp.txt", FO_READWRITE + FO_SHARED)
        IF FERROR() != 0
           ? "No se puede abrir el fichero, error DOS", FERROR()
           BREAK
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB,
            el fichero de cabecera asociado es Fileio.ch.


FOUND()
 Determina si se encontr. el registro buscado en la anterior operación. de b.squeda
------------------------------------------------------------------------------
 Sintaxis

     FOUND() --> lExito

 Devuelve

     FOUND() devuelve verdadero (.T.) si el último mandato de b.squeda ha
     sido satisfactorio; de lo contrario, devuelve falso (.F.).

 Descripción

     FOUND() es una función de base de datos que determina si una operación.     de b.squeda (es decir, FIND, LOCATE, CONTINUE, SEEK o SET RELATION) ha
     sido satisfactoria. Cuando se ejecuta uno de estos mandatos, FOUND()
     devuelve verdadero (.T.) si encuentra una coincidencia; de lo contrario,
     devuelve falso (.F.).

     Si el mandato de b.squeda es LOCATE o CONTINUE, una coincidencia es el
     siguiente registro que cumpla con el ámbito y la condición. Si el
     mandato de b.squeda es FIND, SEEK o SET RELATION, una coincidencia es la
     primera clave del índice de control que es igual al argumento de
     b.squeda. Si el valor clave es igual al argumento de b.squeda, FOUND()
     devuelve verdadero (.T.); de lo contrario, es falso (.F.).

     El valor de FOUND() se retiene hasta que se ejecuta otro mandato de
     movimiento de registro. A menos que sea otro mandato de b.squeda,
     FOUND() se establece autom.ticamente en falso (.F.).

     Cada área de trabajo tiene un valor FOUND(). Esto significa que si un
     área de trabajo tiene una relaci.n establecida con un área de trabajo
     secundaria, la consulta de FOUND() en el .rea secundaria devuelve
     verdadero (.T.) si encuentra una coincidencia.

     Por defecto, FOUND() act.a en el área de trabajo seleccionada
     actualmente. Puede hacer que funcióne en un área de trabajo no
     seleccionada especific.ndola dentro de una expresión de alias (consulte
     el ejemplo siguiente).

     FOUND() devuelve falso (.F.) si no hay ningúna base de datos abierta en
     el área de trabajo actual.

 Ejemplos

     .  En este ejemplo se ilustra el comportamiento de FOUND()
        después de un mandato de movimiento de registro:

        USE Ventas INDEX Ventas
        ? INDEXKEY(0)              // Resultado: VENDEDOR
        SEEK "1000"
        ? FOUND()                  // Resultado: .F.
        SEEK "100"
        ? FOUND()                  // Resultado: .T.
        SKIP
        ? FOUND()                  // Resultado: .F.

     .  En este ejemplo se comprueba un valor FOUND() en un .rea de
        trabajo no seleccionada utilizando una expresión de alias:

     USE Ventas INDEX Ventas NEW
        USE Cliente INDEX Cliente NEW
        SET RELATION TO Numclien INTO Ventas

        //
        SEEK "Casanova"
        ? FOUND(), Ventas->(FOUND())

     .  Este fragmento de código procesa todos los registros de
        Cliente con el valor clave "Casanova" utilizando FOUND() para
        determinar cu.ndo cambian los valores clave:

        USE Cliente INDEX Cliente NEW
        SEEK "Casanova"
        DO WHILE FOUND()
           .
           . <sentencias>
           .
           SKIP
           LOCATE REST WHILE Nombre == "Casanova"
        ENDDO

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


FREAD()
 Lee carácteres de un fichero binario en una variable de memoria intermedia
------------------------------------------------------------------------------
 Sintaxis

     FREAD(<nManejador>, @<cVarMemInter>, <nBytes>) --> nBytes

 Argumentos

     <nManejador> es el manejador de fichero que se obtiene de FOPEN(),
     FCREATE() o predefinido por el DOS.

     <cVarMemInter> es el nombre de una variable de carácter inicializada
     y existente que se utiliza para almacenar datos le.dos de un fichero
     especificado. La longitud de esta variable debe ser mayor que o igual a
     <nBytes>. <cVarMemInter> debe pasarse por referencia y, por lo tanto,
     debe ir precedida por el operador pasar por referencia (@).

     <nBytes> es el número de bytes que deben leerse en la memoria
     intermedia.

 Devuelve

     FREAD() devuelve el número de bytes le.dos satisfactoriamente como un
     valor numérico entero. Un valor de retorno menor que <nBytes> o cero
     indica el final del fichero o cualquier otro error de lectura.

 Descripción

     FREAD() es una función de fichero de bajo nivel que lee carácteres de un
     fichero binario en una variable de carácteres existente. Lee el fichero
     comenzando en la posición del puntero de fichero del DOS, avanzando
     dicho puntero el número de bytes le.dos. Se leen todos los carácteres
     incluyendo los de control, nulos y los de código ASCII superior a 127.

     FREAD() es similar en ciertos aspectos a FREADSTR() y FSEEK().
     FREADSTR() lee un número especificado de bytes de un fichero hasta el
     carácter nulo siguiente (CHR(0)). FSEEK() desplaza el puntero del
     fichero sin leer.

     Si surge un error durante la lectura del fichero, FERROR() devuelve el
     número de error del DOS. Consulte FERROR() para obtener una lista de
     números de error.

     .Advertencia! Esta función permite el acceso de bajo nivel a los
     ficheros y dispositivos del DOS. Debe utilizarse con gran precauci.n y
     requiere un conocimiento profundo del sistema operativo.

 Ejemplos

     .  Este ejemplo utiliza FREAD() después de abrir un fichero, de
        forma satisfactoria, para leer 128 bytes en un .rea de memoria
        intermedia:

        #define BLOQUE_F      128
        //
        cMemInter := SPACE(BLOQUE_F)
        nManejador := FOPEN("Temp.txt")
        //
        IF FERROR() != 0
           ? "Error de apertura de fichero:", FERROR()
        ELSE
           IF FREAD(nManejador, @cMemInter, BLOQUE_F) <> BLOQUE_F
              ? "Error de lectura en Temp.txt"
           ENDIF
           FCLOSE(nManejador)
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.



FREADSTR()
 Lee carácteres de un fichero binario
------------------------------------------------------------------------------
 Sintaxis

     FREADSTR(<nManejador>, <nBytes>) --> cCadena

 Argumentos

     <nManejador> es el manejador de ficheros obtenido de FOPEN(),
     FCREATE() o predefinido por el DOS.

     <nBytes> es el número de bytes que deben leerse, comenzando en la
     posición del puntero del fichero del DOS actual.

 Devuelve

     FREADSTR() devuelve una cadena de carácteres de un máximo de 65.535
     (64K) bytes. Un valor de retorno nulo ("") indica un error o el final
     del fichero.

 Descripción

     FREADSTR() es una función de fichero de bajo nivel que lee carácteres de
     un fichero binario abierto que comienza en la posición de puntero del
     fichero del DOS actual. Los carácteres se leen hasta <nBytes> o hasta
     que se encuentra un carácter nulo (CHR(0)). Se leen todos los carácteres
     incluyendo los de control, con la excepci.n de CHR(0). El puntero del
     fichero avanza <nBytes>. Si este número es mayor que el número de bytes
     desde la posición del puntero hasta el final del fichero, el puntero se
     sit.a en el último byte del fichero.

     .Advertencia! Esta función permite el acceso de bajo nivel a los
     ficheros y dispositivos del DOS. Debe utilizarse con gran precauci.n y
     requiere un conocimiento profundo del sistema operativo.

 Ejemplos

     .  El ejemplo de la p.gina siguiente muestra los valores ASCII de
        los primeros 16 bytes de un fichero de texto:

        #include "Fileio.ch"
        //
        nManejador := FOPEN("Nuevo.txt", FC_NORMAL)
        IF FERROR() != 0
           ? "Error de apertura de fichero:", FERROR()
        ELSE
           cCadena := FREADSTR(nManejador, 16)
           ? cCadena
           FCLOSE(nManejador)
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.



FRENAME()
 Cambia el nombre de un fichero
------------------------------------------------------------------------------
 Sintaxis

     FRENAME(<cFicheroAntiguo>, <cNuevoFichero>) --> nExito

 Argumentos

     <cFicheroAntiguo> es el nombre del fichero que debe renombrarse,
     incluyendo su extensión. También puede incluirse la letra de la unidad
     y/o nombre de vía, como parte del nombre del fichero.

     <cNuevoFichero> es el nuevo nombre del fichero, incluyendo su
     extensión. También puede incluirse la letra de la unidad y/o nombre de
     vía como parte del nombre.

 Devuelve

     FRENAME() devuelve -1 si la operación.falla y cero si es satisfactoria.
     En el caso de que se produzca un fallo, puede utilizarse FERROR() para
     determinar la naturaleza del error.

 Descripción

     FRENAME() es una función de fichero que cambia el nombre de un fichero
     especificado por uno nuevo y act.a de forma id.ntica al mandato RENAME.

     Cuando se llama FRENAME(), el <cFicheroAntiguo> sólo se renombra si est.
     situado en el directorio del DOS actual o en la vía especificada.
     FRENAME() no utiliza los valores de SET DEFAULT o SET PATH para
     localizar <cFicheroAntiguo>.

     Si el directorio fuente es diferente del directorio destáno, el fichero
     se desplaza al directorio destáno. En el caso de que exista
     <cNuevoFichero> o est. abierto actualmente, FRENAME() falla y devuelve -
     1, indicando que no ha realizado la acci.n designada. Con FERROR() puede
     determinarse la naturaleza del error.

     .Advertencia! Los ficheros deben cerrarse antes de renombrarlos. Si
     se intenta renombrar un fichero abierto pueden producirse resultados
     impredecibles. Cuando se renombra un fichero de base de datos, el
     fichero memo asociado (.dbt) también debe renombrarse. Si no lo hace de
     este modo, puede poner en peligro la integridad de sus bases de datos.

 Ejemplos

     .  En este ejemplo se muestra c.mo se renombra un fichero:

        IF FRENAME("FichAnt.txt", "NuevFich.txt") == -1
           ? "Error de fichero:", FERROR()
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


FSEEK()
 Sitúa el puntero de fichero binario en una nueva posición
------------------------------------------------------------------------------
 Sintaxis

     FSEEK(<nManejador>, <nDesplazamiento>, [<nOrigen>]) --> nPosici.n

 Argumentos

     <nManejador> es el manejador de ficheros obtenido de FOPEN(),
     FCREATE() o predefinido por el DOS.

     <nDesplazamiento> es el número de bytes que se va a desplazar el
     puntero del fichero desde la posición definida por <nOrigen>. Puede ser
     un número positivo o negativo. Un número positivo desplaza el puntero
     hacia adelante y uno negativo lo desplaza hacia atr.s en el fichero.

     <nOrigen> define la situaci.n inicial del puntero del fichero antes
     de que se ejecute FSEEK(). El valor por defecto es cero, representando
     el inicio del fichero. Si <nOrigen> es el final del fichero,
     <nDesplazamiento> debe ser cero o negativo.

     M.todos para Desplazar el Puntero del Fichero
     ------------------------------------------------------------------------
     Origen   Fileio.ch      Descripción
     ------------------------------------------------------------------------
     0        FS_SET         Busca desde el principio del fichero
     1        FS_RELATIVE    Busca desde la posición actual del puntero
     2        FS_END         Busca desde el final del fichero
     ------------------------------------------------------------------------

 Devuelve

     FSEEK() devuelve la nueva posición del puntero del fichero relativa al
     inicio del fichero (posición 0) como un valor numérico entero. Este
     valor es independiente de la posición original del puntero del fichero.

 Descripción

     FSEEK() es una función de fichero de bajo nivel que desplaza el puntero
     del fichero hacia adelante o hacia atr.s en un fichero binario abierto
     sin leer realmente el contenido del fichero especificado. La posición
     inicial y desplazamiento se especifican como argumentos de función y se
     devuelve la nueva posición en el fichero. Independientemente de los
     argumentos de función especificados, el puntero del fichero no puede
     desplazarse de forma que exceda los l.mites del inicio o final del
     fichero.

     .Advertencia! Esta función permite el acceso de bajo nivel a
     ficheros y dispositivos del DOS. Debe utilizarse con gran precauci.n y
     requiere un conocimiento profundo del sistema operativo.

 Ejemplos

     .  En este ejemplo se utiliza FSEEK() para determinar la longitud
        de un fichero buscando desde el final del mismo. Seguidamente, el
        puntero se restablece al inicio del fichero:

     #include "Fileio.ch"

        //
        // Abrir el fichero en modo de sólo lectura
        IF (nManejador := FOPEN("Temp.txt")) >= 0
           //
           // Obtener la longitud del fichero
           nLongitud := FSEEK(nManejador, 0, FS_END)
           //
           // Restablecer la posición al comienzo del
           // fichero
           FSEEK(nManejador, 0)
           FCLOSE(nManejador)
        ELSE
           ? "Error de apertura de fichero:", FERROR()
        ENDIF

     .  Esta pseudofunción sit.a el puntero del fichero en el último
        byte de un fichero binario:

        #define FinalFichero(nManejador);
              (FSEEK(nManejador, 0, FS_END))

     .  Esta pseudofunción sit.a el puntero del fichero en el primer
        byte de un fichero binario:

        #define InicioFichero(nManejador);
              (FSEEK(nManejador, 0))

     .  Esta pseudofunción informa de la posición actual del puntero
        del fichero en un fichero binario especificado:

        #define PosFichero(nManejador);
              (FSEEK(nManejador, 0, FS_RELATIVE))

 Ficheros:  La biblioteca asociada es CLIPPER.LIB,
            el fichero de cabecera asociado es Fileio.ch.


FWRITE()
 Escribe en un fichero binario abierto
------------------------------------------------------------------------------
 Sintaxis

     FWRITE(<nManejador>, <cMemInter>, [<nBytes>]) --> nBytesEscritos

 Argumentos

     <nManejador> es el manejador de ficheros obtenido de FOPEN(),
     FCREATE() o predefinido por el DOS.

     <cMemInter> es la cadena de carácteres que debe escribirse en el
     fichero especificado.

     <nBytes> indica el número de bytes que debe escribirse, comenzando
     en la posición del puntero de fichero actual. Si se omite, se escribe
     todo el contenido de <cMemInter>.

 Devuelve

     FWRITE() devuelve el número de bytes escritos como un valor numérico
     entero. Si el valor devuelto es igual a <nBytes>, la operación.ha
     resultado satisfactoria. Si el valor de retorno es menor que <nBytes> o
     es cero, es debido a que el disco est. lleno o se ha producido otro
     error.

 Descripción

     FWRITE() es una función de fichero de bajo nivel que escribe datos en un
     fichero binario abierto desde una memoria intermedia de cadena de
     carácteres. Puede escribir todo el contenido de la memoria intermedia o
     tan sólo una parte. La escritura comienza en la posición actual del
     fichero y la función devuelve el número real de bytes escritos.

     Si FWRITE() produce una condición de error, puede utilizar FERROR() para
     determinar el error espec.fico.

     .Advertencia! Esta función permite el acceso de bajo nivel a los
     ficheros y dispositivos del DOS. Debe utilizarse con gran precauci.n y
     requiere un profundo conocimiento del sistema operativo

 Ejemplos

     .  En este ejemplo se copia el contenido de un fichero en otro:

        #include "Fileio.ch"
        #define BLOQUE_F      512
        //
        cMemInter := SPACE(BLOQUE_F)
        nFichEnt := FOPEN("Temp.txt", FO_READ)
        nFichSal := FCREATE("NuevFich.txt", FC_NORMAL)
        lHecho := .F.
        //
        DO WHILE !lHecho
           nBytesLec := FREAD(nFichEnt, @cMemInter, BLOQUE_F)
           IF FWRITE(nFichSal, cMemInter, nBytesLec) < ;
                       nBytesLec
              ? "Fallo de escritura: ", FERROR()
              lHecho := .T.
           ELSE
              lHecho := (nBytesLec == 0)
           ENDIF
        ENDDO
        //
        FCLOSE(nFichEnt)
        FCLOSE(nFichSal)

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


GETENV()
 Obtiene el contenido de una variable de entorno DOS
------------------------------------------------------------------------------
 Sintaxis

     GETENV(<cVariableEntorno>) --> cCadena

 Argumentos

     <cVariableEntorno> es el nombre de la variable de entorno del DOS.
     Cuando se especifica este argumento, puede utilizarse cualquier
     combinación de letras mayúsculas y minúsculas; GETENV() no es sensible a
     las mayúsculas y minúsculas.

 Devuelve

     GETENV() devuelve el contenido de la variable de entorno del DOS
     especificada como una cadena de carácteres. Si no se puede localizar la
     variable, GETENV() devuelve una cadena nula ("").

 Descripción

     GETENV() es una función de entorno que le permite obtener información
     del entorno DOS en un programa de aplicación. Normalmente, .sta es la
     información de la configuración, incluyendo los nombres de vía que
     proporcionan la situaci.n de los ficheros (base de datos, índice,
     etiqueta o informes). Esta función es particularmente .til en entornos
     de red.

 Notas

     .  Valor de retorno vac.o: Si est. seguro de que existe una
        variable de entorno y GETENV() devuelve siempre una cadena nula (""),
        aseg.rese de que no existen espacios entre el nombre de variable de
        entorno y el primer carácter de la cadena que se le ha asignado en el
        mandato SET del DOS.

     .  Compatibilidad: En las versiones anteriores de CA-Clipper,
        la función se llamaba GETE(). Esta forma abrevíada de GETENV() es
        todavía operativa.

 Ejemplos

     .  Este ejemplo obtiene el valor actual de PATH del DOS,
        convirti.ndola en la vía actual de CA-Clipper:

        cVia := GETENV("PATH")
        SET PATH TO (cVia)

     .  Este ejemplo utiliza variables de entorno para configurar las
        posiciónes espec.ficas de ficheros. Cuando se configura un sistema,
        se definen variables de entorno que contienen la posición de varios
        tipos de fichero as. como la variable de entorno CLIPPER (consulte el
        capítulo Entorno de Ejecuci.n en la gu.a Programaci.n y Utilidades),
        de forma an.loga a lo siguiente:

        C>SET LOC_DBF=<vía de fichero de base de datos>
        C>SET LOC_NTX=<vía de fichero de índice>
        C>SET LOC_RPT=<vía de fichero de informe>

        En la secci.n de configuración del programa de aplicación, asigne el
        contenido de las variables de entorno a variables. Posteriormente,
        cuando acceda a un fichero, haga preceder la referencia con la
        variable de vía, del modo siguiente:

        cDdfDirectorio := GETENV("LOC_DBF")
        USE (cDdfDirectorio + "Facturas")

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.



HARDCR()
 Sustituye los retornos de carro autom.ticos de una cadena de carácteres por
 retornos de carro forzados.
------------------------------------------------------------------------------
 Sintaxis

     HARDCR(<cCadena>) --> cCadenaConvertida

 Argumentos

     <cCadena> es la cadena de carácteres o campo memo que se va a
     convertir.

 Devuelve

     HARDCR() devuelve una cadena de carácteres de hasta 65.535 (64K)
     carácteres de longitud.

 Descripción

     HARDCR() es una función memo que sustituye todos los retornos de carro
     autom.ticos (CHR(141)) por retornos de carro forzados (CHR(13)). Se
     utiliza para mostrar con mandatos de consola cadenas de carácteres
     largas y campos memo que contienen retornos de carro autom.tico. En
     CA-Clipper los mandatos de consola (incluyendo REPORT y LABEL FORM) no
     convierten autom.ticamente los retornos de carro autom.ticos en retornos
     permanentes, por lo que es necesario hacer explícitamente la conversión.
     MEMOEDIT() a.ade retornos de carro autom.ticos en los saltos de línea.

 Notas

     .  HARDCR() en REPORT y LABEL FORM: Si se utiliza HARDCR() en
        una expresión de contenido de REPORT FORM o LABEL FORM y no se
        utiliza en otra parte, debe declararse EXTERNAL para asegurarse de
        que est. enlazada.

 Ejemplos

     .  Para mostrar un campo memo formateado con los saltos de línea
        autom.ticos de MEMOEDIT():

        USE Ventas NEW
        ? HARDCR(Ventas->Notas)

 Ficheros:  La biblioteca asociada es EXTEND.LIB.


HEADER()
 Devuelve la longitud de la cabecera del fichero de base de datos actual
------------------------------------------------------------------------------
 Sintaxis

     HEADER() --> nBytes

 Devuelve

     HEADER() devuelve el número de bytes de la cabecera del fichero de base
     de datos actual, en forma de número entero. Si no se est. utilizando
     ningún fichero de base de datos, HEADER() devuelve cero.

 Descripción

     HEADER() es una función de base de datos que se utiliza con LASTREC(),
     RECSIZE() y DISKSPACE() para crear procedimientos de copia de seguridad
     de ficheros.

     Por defecto, HEADER() act.a en el área de trabajo actualmente
     seleccionada. Para que act.e en un área de trabajo no seleccionada debe
     especificarse como parte de una expresión de alias (consulte el ejemplo
     siguiente).

 Ejemplos

     .  Este ejemplo determina el tama.o de la cabecera de Ventas.dbf:

        USE Ventas NEW
        ? HEADER()            // Resultado: 258

     .  Este ejemplo define una pseudofunción, TamaFich(), que utiliza
        HEADER() con RECSIZE() y LASTREC() para calcular el tama.o en bytes
        del fichero en base de datos actual:

        #define TamaFich()      ((RECSIZE() * LASTREC()) + ;
              HEADER() + 1)

        En adelante, puede utilizar TamaFich() igual que cualquier otra
        función:

        USE Ventas NEW
        USE Cliente NEW
        ? TamaFich()
        ? Ventas->(TamaFich())

 Ficheros:  La biblioteca asociada es EXTEND.LIB.


I2BIN()
 Convierte un valor numérico de CA-Clipper en un entero binario de 16 bits.
------------------------------------------------------------------------------
 Sintaxis

     I2BIN(<nEntero>) --> cEnteroBinario

 Argumentos

     <nEntero> es el número entero que se va a convertir. Los números
     decimales se truncan.

 Devuelve

     I2BIN() devuelve una cadena de carácteres de 2 bytes que contiene un
     entero binario de 16 bits.

 Descripción

     I2BIN() es una función de bajo nivel que convierte un número entero en
     una cadena de carácteres formateada como un entero binario (byte menos
     significativo primero). I2BIN() se utiliza con FWRITE() para convertir
     un número de CA-Clipper a la forma binaria estándar. La inversa de
     I2BIN() es BIN2I().

 Ejemplos

     .  Este ejemplo abre un fichero de base de datos utilizando
        funciónes de fichero de bajo nivel y escribe la fecha de la .ltima
        actualizaci.n en los bytes 1-3:

        #include "Fileio.ch"
        //
        nManejador = FOPEN("Ventas.dbf", FO_READWRITE)
        //
        // Convierte en un entero la fecha de la .ltima actualizaci.n
        nAnno = I2BIN(90)
        nMes = I2BIN(12)
        nDia = I2BIN(15)
        //
        // Se.ala la fecha de la .ltima actualizaci.n
        FSEEK(nManejador, 1, FS_SET)
        //
        // Escribe la fecha de la nueva actualizaci.n
        // utilizando sólo el primer byte
        FWRITE(nManejador, nAnno, 1)
        FWRITE(nManejador, nMes, 1)
        FWRITE(nManejador, nDia, 1)
        FCLOSE(nManejador)

 Ficheros:  La biblioteca asociada es EXTEND.LIB,
            el módulo fuente es SOURCE\SAMPLE\EXAMPLEA.ASM.


IF()
 Retorna el resultado de una expresión en base a una condición.
------------------------------------------------------------------------------
 Sintaxis

     [I]IF(<lCondici.n>, <expVerdadera>, <expFalsa>) --> Valor

 Argumentos

     <lCondici.n> es la expresión l.gica que se va a evaluar.

     <expVerdadera> es el valor de cualquier tipo de datos que se
     devuelve si <lCondici.n> es verdadera (.T.).

     <expFalsa> es el valor, de cualquier tipo de datos, que se devuelve
     si <lCondici.n> es falsa (.F.). No es necesario que este argumento sea
     del mismo tipo de datos que <expVerdadera>.

 Devuelve

     IF() devuelve el resultado de <expVerdadera> si <lCondici.n> resulta
     verdadera (.T.) y de <expFalsa> si resulta falsa (.F.). El valor
     devuelto es del tipo de datos de la expresión víaacute;lida.

 Descripción

     IF() es una función de conversión l.gica. Es una de las funciónes m.s
     potentes y vers.tiles de CA-Clipper. Ofrece un mecanismo para evaluar
     una condición dentro de una expresión. Con esta función puede convertir
     una expresión l.gica en otro tipo de datos.

 Ejemplos

     .  Este ejemplo convierte un valor de datos l.gico en un valor
        numérico:

        lPagado =.T.
        ? IF(lPagado, 1, 0)               // Resultado: 1

     .  En este ejemplo se da formato a un campo l.gico dependiendo de
        si ha vencido o no el per.odo de pago del cliente.

        @ ROW() + 1, 25 SAY IF(lPagado, SPACE(10), ".A por ellos!")

     .  Si imprime formularios, puede imprimir un s.mbolo indicativo
        en diferentes columnas dependiendo del valor de un campo l.gico:

        @ ROW(), IF(EnHospital, 10, 12) SAY "X"

     .  Puede utilizar también la función IF() para obligar a LABEL
        FORM a imprimir líneas en blanco. Introduzca la siguiente expresión
        cuando cree la etiqueta con RL.EXE:

        IF(EMPTY(Empresa), CHR(255), Empresa)

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


INDEXEXT()
 Devuelve la extensión por defecto de los ficheros ííndice basada en el
 controlador de base de datos actualmente enlazado
------------------------------------------------------------------------------
 Sintaxis

     INDEXEXT() --> cExtensi.n

 Devuelve

     A menos que se haya enlazado otro controlador de base de datos,
     INDEXEXT() devuelve ".NTX", lo que indica que est. activo el controlador
     por defecto de CA-Clipper. Si est. enlazado el controlador compatible
     con dBASE III PLUS, la función devuelve "NDX".

 Descripción

     INDEXEXT() devuelve la extensión por defecto del fichero ííndice, en
     función del controlador de base de datos actualmente enlazado.

 Ejemplos

     .  En este ejemplo, INDEXEXT() crea una prueba de existencia del
        fichero ííndice Cliente independiente del controlador de base de datos
        enlazado al programa actual:

        USE Cliente NEW
        //
        IF.NOT. FILE("Cliente" + INDEXEXT())
           INDEX ON NombreCliente TO Cliente
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


INDEXKEY()
 Devuelve la expresión clave del índice especificado
------------------------------------------------------------------------------
 Sintaxis

     INDEXKEY(<nOrden>) --> cExpClave

 Argumentos

     <nOrden> es la posición original del índice en la lista de ficheros
     índice abierta por el último mandato USE...INDEX o SET INDEX TO en el
     área de trabajo actual. Un valor cero expecifica el índice activo,
     independientemente de su posición real en la lista.

 Devuelve

     INDEXKEY() devuelve la expresión clave del índice especificado como una
     cadena de carácteres. Si no hay índice correspondiente o no se ha
     abierto ningún fichero de base de datos, INDEXKEY() devuelve una cadena
     nula.("").

 Descripción

     INDEXKEY() es una función de base de datos que determina la expresión
     clave de un ííndice especificado en el área de trabajo actual y la
     devuelve como una cadena de carácteres. Para evaluar la expresión clave,
     especifique INDEXKEY() como una macroexpresión similar a la siguiente:
     &(INDEXKEY(<nOrden>)).

     INDEXKEY() tiene cierto número de aplicaciónes, pero dos en concreto son
     importantes. Con esta función puede totalizar la base de datos a trav.s
     de la expresión clave en el código fuente. El otro caso tiene lugar en
     la función de usuario de DBEDIT(). Aqu. puede ser necesario decidir si
     actualizar o no la pantalla después de que el usuario haya editado un
     registro. Normalmente, sólo es necesario actualizar la pantalla si ha
     cambiado la expresión clave del índice activo en el registro actual.
     Ambos ejemplos se describen m.s abajo.

     Por defecto, INDEXKEY() act.a en el área de trabajo actualmente
     seleccionada. Puede hacer que act.e en un área de trabajo no
     seleccionada especific.ndola con una expresión de alias (consulte el
     ejemplo siguiente).

 Ejemplos

     .  Este ejemplo accede a la expresión clave de los ííndices
        abiertos en el área de trabajo actual:

        #define ORD_NATURAL      0
        #define ORD_NOMBRE      1
        #define ORD_SERIE         2
        //
        USE Cliente INDEX Nombre, Serie NEW
        SET ORDER TO ORD_SERIE
        ? INDEXKEY(ORD_NOMBRE)      // Resultado: exp índice de nombres
        ? INDEXKEY(ORD_SERIE)       // Resultado: exp índice en serie
        ? INDEXKEY(ORD_NATURAL)     // Resultado: exp índice en serie

     .  Este ejemplo accede a la expresión clave del índice activo en
        un área de trabajo no seleccionada:

        USE Cliente INDEX Nombre, Serie NEW
        USE Ventas INDEX Vendedor NEW
        ? INDEXKEY(0), Cliente->(INDEXKEY(0))

     .  Este ejemplo utiliza INDEXKEY() como parte de una expresión
        TOTAL ON de clave. Observe que INDEXKEY() se especifica con una
        macroexpresión para obligar a evaluar la expresión:

        USE Ventas INDEX Vendedor NEW
        TOTAL ON &(INDEXKEY(0)) FIELDS CantidadVentas;
                                      TO ResumenVentas

     .  Este ejemplo utiliza INDEXKEY() para determinar si debe
        actualizarse la pantalla de DBEDIT() después de que el usuario haya
        editado el valor de campo actual. Normalmente, es necesario
        actualizar la pantalla DBEDIT() si el usuario cambia un campo que es
        parte de la clave del índice activo. EditarFichero() es una función
        definida por el usuario llamada desde una función DBEDIT() de usuario
        para editar el campo actual si el usuario ha pulsado una tecla de
        edici.n.

        #include "Dbedit.ch"
        #define ORD_NATURAL   0
        FUNCTION EditarFichero()
           LOCAL Valíndice
           // Guarda el valor y expresión clave actual
           Valíndice = &(INDEXKEY(ORD_NATURAL))
           .
           . <código para obtener (GET) el valor de campo actual>
           .
           // Actualizar la pantalla si ha cambiado el
           //valor clave
           IF Valíndice != &(INDEXKEY(ORD_NATURAL))
              nPeticion = DE_REFRESH
           ELSE
              nPeticion = DE_CONT
           ENDIF
           RETURN nPeticion

 Ficheros: La biblioteca asociada es CLIPPER.LIB.


INDEXORD()
 Devuelve la posición de orden del índice activo.
------------------------------------------------------------------------------
 Sintaxis

     INDEXORD() --> nOrden

 Devuelve

     INDEXORD() devuelve un valor numérico entero. El valor devuelto es igual
     a la posición del índice activo en la lista de ficheros ííndice abiertos
     del área de trabajo actual. Un valor cero indica que no hay índice
     activo y que se est. accediendo a los registros en su orden natural. Si
     no hay abierto ningún fichero de base de datos, INDEXORD() devuelve
     también el valor cero.

 Descripción

     INDEXORD() es una función de base de datos que determina la posición del
     índice activo en la lista de ficheros ííndice abiertos por el último
     mandato USE...INDEX o SET INDEX TO en el área de trabajo actual. Suele
     ser conveniente guardar el último índice de control para poder
     restablecerlo m.s tarde.

     Por defecto, INDEXORD() act.a en el área de trabajo actualmente abierta.
     Para que opere en un área de trabajo no seleccionada, debe especificarla
     como parte de una expresión de alias (consulte el ejemplo siguiente).

 Ejemplos

     .  Este ejemplo utiliza INDEXORD() para guardar el orden actual.
        Despu.s de cambiar a un nuevo orden, utiliza el valor guardado para
        restablecer el orden original:

        USE Cliente INDEX Nombre, Serie NEW
        nOrden := INDEXORD()               // Resultado: 1
        SET ORDER TO 2
        ? INDEXORD()                       // Resultado: 2
        SET ORDER TO nOrden
        ? INDEXORD()                       // Resultado: 1

     .  Este ejemplo utiliza una expresión de alias para determinar el
        número de orden del índice activo en un área de trabajo no
        seleccionada:

        USE Ventas INDEX Vendedor, NumCliente NEW
        USE Cliente INDEX Nombre, Serie NEW
        ? Ventas->(INDEXORD())             // Resultado: 1

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.



INKEY()
 Lee un carácter de la memoria intermedia del teclado
------------------------------------------------------------------------------
 Sintaxis

     INKEY([<nSegundos>]) --> nC.digoInkey

 Argumentos

     <nSegundos> Especifica el número de segundos que INKEY() espera a
     que se pulse una tecla. Puede especificar valores en incrementos de
     hasta una d.cima de segundo. Si se especifica cero, el programa se
     detiene hasta que se pulse una tecla. Si se omite <nSegundos> INKEY() no
     espera a que se pulse una tecla.

 Devuelve

     INKEY() devuelve un valor numérico comprendido entre -39 y 386, que
     identifica la tecla le.da de la memoria intermedia del teclado. Si la
     memoria intermedia est. vac.a INKEY() devuelve cero. INKEY() devuelve
     valores para todas las combinaciónes de carácteres ASCII, funciónes,
     Alt-función, Ctrl-función, Alt-letra y Ctrl-letra.

 Descripción

     INKEY() es una función de teclado que lee la tecla siguiente contenida
     en la memoria intermedia del teclado y devuelve un valor que representa
     esa tecla. Este valor se guarda también internamente y puede recuperarse
     por medio de LASTKEY(). Si se especifica el argumento <nSegundos> y no
     hay teclas pendientes en la memoria intermedia, la ejecución del
     programa se detiene hasta que aparezca una tecla en la memoria del
     teclado o haya transcurrido <nSegundos>. El tiempo que espera la función
     INKEY() se basa en el reloj del sistema operativo y no en la velocidad
     del microprocesador. Si <nSegundos> es cero, la ejecución del programa
     se detiene hasta que haya alguna tecla en la memoria intermedia.
     Recuerde que INKEY() no es un estado de espera, por lo que las teclas
     establecidas mediante SET KEY no están activas.

     INKEY() es similar a la función NEXTKEY(). A diferencia de INKEY(),
     NEXTKEY() lee sin extraer la tecla de la memoria intermedia del teclado.
     Esto es útil para comprobar la existencia de una tecla sin procesarla.

     INKEY() es la primitiva principal del sistema de CA-Clipper para extraer
     teclas de la memoria intermedia del teclado. Se utiliza para sondear el
     teclado o hacer una pausa en la ejecución del programa hasta que se
     pulse una tecla. Como ejemplo, puede utilizar INKEY() para terminar
     mandatos con un ámbito de lectura como LIST, LABEL FORM y REPORT FORM
     incluyendo una condición WHILE. Consulte el ejemplo siguiente.

     Si desea una lista completa de los códigos INKEY() y constantes de
     Inkey.ch, consulte la gu.a de Mensajes de Error y Apííndices.

 Ejemplos

     .  Este ejemplo recoge una tecla del teclado y muestra el valor
        de su carácter seguido por el valor de INKEY():

        #include "Inkey.ch"
        //
        LOCAL nCodigoInkey := 0
        DO WHILE LASTKEY() != K_ESC
           ? "Pulse una tecla: "
           nCodigoInkey := INKEY(0)
           ?? "Car.cter:", CHR(nCodigoInkey),;
              "C.digo INKEY():", LTRIM(STR(nCodigoInkey))
        ENDDO
        RETURN

     .  Este ejemplo utiliza INKEY() para sondear la pulsaci.n de una
        tecla de interrupci.n durante un REPORT FORM. Si el usuario pulsa Esc
        durante el proceso de impresión, el proceso REPORT FORM termina:

        #include "Inkey.ch"
        //
        USE Ventas INDEX Vendedor NEW
        REPORT FORM MONTHLY FOR MONTH(FechaVentas) = ;
              MONTH(DATE());
           WHILE INKEY() != K_ESC

 Ficheros:  La biblioteca asociada es CLIPPER.LIB,
            el fichero de cabecera asociado es Inkey.ch.


INT()
 Convierte un valor numérico en un número entero
------------------------------------------------------------------------------
 Sintaxis

     INT(<nExp>) --> nEntero

 Argumentos

     <nExp> es la expresión numérica que se va a convertir en entero.

 Devuelve

     INT() devuelve un valor numérico entero.

 Descripción

     INT() es una función numérica que convierte un valor numérico en un
     entero truncando (sin redondear) todos los dígitos situados a la derecha
     de la coma decimal. INT() es útil en operación.s en las que no es
     necesaria la parte decimal de un número.

 Ejemplos

     .  Estos ejemplos muestran los resultados de varias llamadas a la
        función INT():

        ? INT(100.00)                // Resultado: 100
        ? INT(.5)                    // Resultado: 0
        ? INT(-100.75)               // Resultado: -100

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


ISALPHA()
 Determina si el carácter inicial de una cadena de carácteres es alfabético
------------------------------------------------------------------------------
 Sintaxis

     ISALPHA(<cCadena>) --> lBooleano

 Argumentos

     <cCadena> es la cadena de carácteres que se va a examinar.

 Devuelve

     ISALPHA() devuelve verdadero (.T.) si el primer carácter de <cCadena> es
     alfabético; en caso contrario devuelve falso (.F.).

 Descripción

     ISALPHA() es una función de carácteres que determina si la cadena
     especificada comienza con un carácter alfabético. Se consideran
     carácteres alfabéticos todas las letras mayúsculas o minúsculas de la A
     a la Z. ISALPHA() devuelve falso (.F.) si la cadena comienza con un
     dígito o con cualquier otro carácter.

 Ejemplos

     .  Estos ejemplos muestran varios resultados de ISALPHA():

        ? ISALPHA("AbcDe")               // Resultado:.T.
        ? ISALPHA("aBcDE")               // Resultado:.T.
        ? ISALPHA("1BCde")               // Resultado:.F.
        ? ISALPHA(".FRED")               // Resultado:.F.

 Ficheros:  La biblioteca asociada es EXTEND.LIB.


ISCOLOR()
 Determina si el ordenador actual soporta color
------------------------------------------------------------------------------
 Sintaxis

     ISCOLOR() | ISCOLOUR() --> lBooleano

 Devuelve

     ISCOLOR() devuelve verdadero (.T.) si hay una tarjeta gr.fica de color
     instalada; en caso contrario devuelve falso (.F.).

 Descripción

     ISCOLOR() es una función de pantalla que se puede utilizar para decidir
     el tipo de atributos de pantalla (color o monocromo). Recuerde que
     algunos adaptadores monocromos con capacidades gr.ficas devuelven
     verdadero (.T.).

 Ejemplos

     .  Este ejemplo instala variables de atributo de color durante la
        ejecución:

     IF ISCOLOR()

           cBox = "BG+/B, W/N"
           cSays = "BG/B, W/N"
           cGets = "W/N, N/W"
        ELSE
           cBox = "W+"
           cSays = "W/N, N+/W"
           cGets = "W/N, N/W"
        ENDIF
        .
        . <sentencias>
        .
        SETCOLOR(cSays)

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


ISDIGIT()
 Determina si el carácter inicial de una cadena de carácteres es un dígito
------------------------------------------------------------------------------
 Sintaxis

     ISDIGIT(<cCadena>) --> lBooleano

 Argumentos

     <cCadena> es la cadena de carácteres que se va a examinar.

 Devuelve

     ISDIGIT() devuelve verdadero (.T.) si el primer carácter de una cadena
     es un dígito comprendido entre cero y nueve; en caso contrario devuelve
     falso (.F.).

 Descripción

     ISDIGIT() es una función de carácteres que determina si el primer
     carácter de una cadena es un dígito del cero al nueve. Si el primer
     carácter de <cCadena> es de cualquier otro tipo, ISDIGIT() devuelve
     falso (.F.).

     ISDIGIT() es útil para determinar si la cadena actual es un número antes
     de convertirla en un valor numérico por medio de la función VAL().

 Ejemplos

     .  Estos ejemplos muestra diferentes resultados de ISDIGIT():

        ? ISDIGIT("AbcDe")          // Resultado:.F.
        ? ISDIGIT("1abcd")          // Resultado:.T.
        ? ISDIGIT(".12345")         // Resultado:.F.

 Ficheros:  La biblioteca asociada es EXTEND.LIB.


ISLOWER()
 Determina si el carácter inicial de una cadena de carácteres es una letra
 minúscula
------------------------------------------------------------------------------
 Sintaxis

     ISLOWER(<cCadena>) --> lBooleano

 Argumentos

     <cCadena> es la cadena de carácteres que se va a examinar.

 Devuelve

     ISLOWER() devuelve verdadero (.T.) si el primer carácter de una cadena
     es una letra minúscula; es caso contrario devuelve falso (.F.).

 Descripción

     ISLOWER() es una función de carácteres que determina si el primer
     carácter de una cadena de carácteres es una letra minúscula. Es la
     función inversa de ISUPPER(), que determina si el primer carácter es una
     letra mayúscula.

     ISLOWER() y ISUPPER() están relacionadas con las funciónes LOWER() y
     UPPER(), que convierten las letras mayúsculas en minúsculas y viceversa.

 Ejemplos

     .  Estos ejemplos muestran diferentes resultados de ISLOWER():

        ? ISLOWER("aBcDe")         // Resultado:.T.
        ? ISLOWER("AbcDe")         // Resultado:.F.
        ? ISLOWER("1abcd")         // Resultado:.F.
        ? ISLOWER("abcd")          // Resultado:.T.

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.



ISPRINTER()
 Determina si el puerto LPT1 est. preparado.
------------------------------------------------------------------------------
 Sintaxis

     ISPRINTER() --> lPreparado

 Devuelve

     ISPRINTER() devuelve verdadero (.T.) si el puerto LPT1 est. preparado;
     en caso contrario devuelve falso (.F.).

 Descripción

     ISPRINTER() es una función de impresora que determina si el puerto
     paralelo LPT1 est. en línea y preparado para imprimir. ISPRINTER() es
     una función dependiente del hardware, por lo que sólo act.a en sistemas
     cuyo BIOS es compatible con IBM.

     Puede comprobar ISPRINTER() para asegurarse de que la impresora est.
     lista antes de empezar a imprimir. No obstante, si se produce un error
     durante la impresi.n, se genera un error de ejecución.

 Ejemplos

     .  Este ejemplo comprueba si est. preparado el puerto paralelo,
        realizando hasta 25 reintentos. Si el puerto paralelo est. preparado,
        se inicia la operación.de impresión:

        LOCAL nCuenta := 0, nVeces := 25, lPrep
        //
        DO WHILE nCuenta++ <= nVeces.AND. !(lPrep := ;
              ISPRINTER())
        ENDDO
        //
        IF lPrep
           REPORT FORM Ventas TO PRINTER
        ELSE
           ? "La impresora no est. preparada..."
           BREAK
        ENDIF

 Ficheros:  La biblioteca asociada es EXTEND.LIB,
            el módulo fuente es SOURCE\SAMPLE\EXAMPLEA.ASM.



ISUPPER()
 Determina si el carácter inicial de una cadena de carácteres es una letra
 mayúscula
------------------------------------------------------------------------------
 Sintaxis

     ISUPPER(<cCadena>) --> lBooleano

 Argumentos

     <cCadena> es la cadena de carácteres que se examina.

 Devuelve

     ISUPPER() devuelve verdadero (.T.) si el primer carácter es una letra
     mayúscula; en caso contrario devuelve falso (.F.).

 Descripción

     ISUPPER() es una función de carácteres que determina si el primer
     carácter de una cadena es una letra mayúscula. Es la función inversa de
     ISLOWER(). ISUPPER() e ISLOWER() están relacionadas con las funciónes
     UPPER() y LOWER() que convierten letras minúsculas en mayúsculas y
     viceversa.

 Ejemplos

     .  Este ejemplo ilustra ISUPPER() aplicada a diferentes valores:

        ? ISUPPER("AbCdE")         // Resultado:.T.
        ? ISUPPER("aBCdE")         // Resultado:.F.
        ? ISUPPER("$abcd")         // Resultado:.F.
        ? ISUPPER("8ABCD")         // Resultado:.F.

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.



L2BIN()
 Convierte un valor numérico de CA-Clipper en un valor entero binario de 32
 bits
------------------------------------------------------------------------------
 Sintaxis

     L2BIN(<nExp>) --> cEnteroBinario

 Argumentos

     <nExp>es el valor numérico que se va a convertir. Los números
     decimales se truncan.

 Devuelve

     L2BIN() devuelve una cadena de carácteres de 4 bytes formateada como un
     entero binario de 32 bits.

 Descripción

     L2BIN() es una función de bajo nivel que se utiliza con FWRITE() para
     escribir valores numéricos de CA-Clipper en un fichero binario. Esta
     función es similar a I2BIN(), que formatea un valor numérico de
     CA-Clipper en un valor binario de 16 bits.

     L2BIN() es la función inversa de BIN2L().

 Ejemplos

     .  Este ejemplo crea un nuevo fichero binario y escribe una serie
        de números en los ficheros utilizando L2BIN() para convertir el valor
        numérico en un número binario de 32 bits:

        #include "Fileio.ch"
        //
        LOCAL nNúmero, nManejador
        nManejador := FCREATE("Fichero", FC_NORMAL)
        FOR nNúmero := 1 TO 100
           FWRITE(nManejador, L2BIN(nNúmero) + CHR(0))
        NEXT
        FCLOSE(nManejador)

 Ficheros:  La biblioteca asociada es EXTEND.LIB,
            el módulo fuente es SOURCE\SAMPLE\EXAMPLEA.ASM.



LASTKEY()
 Devuelve el valor INKEY() de la .ltima tecla extra.da de la memoria
 intermedia del teclado
------------------------------------------------------------------------------
 Sintaxis

     LASTKEY() --> nC.digoInkey

 Devuelve

     LASTKEY() devuelve un número entre -39 y 386, que identifica el valor
     INKEY() de la .ltima tecla extra.da de la memoria intermedia del
     teclado.

 Descripción

     LASTKEY() es una función de teclado que informa del valor INKEY() de la
     .ltima tecla recogida de la memoria intermedia del teclado por la
     función INKEY() o por un estado de espera como ACCEPT, INPUT, READ,
     WAIT, ACHOICE(), DBEDIT() o MEMOEDIT(). LASTKEY() conserva su valor
     actual hasta que se recoge otra tecla de la memoria intermedia del
     teclado.

     LASTKEY() permite:

     .  Determinar la tecla que termina un READ.

     .  Determinar la tecla que provoca la salida del objeto GET
        actual en una función definida por el usuario, invocada por una
        cláusula VALID.

     .  Identificar una tecla de excepci.n en la función de usuario de
        ACHOICE(), DBEDIT() o MEMOEDIT().

     LASTKEY() se utiliza también con la función UPDATED() para determinar si
     se ha modificado la memoria intermedia de alg.n objeto Get durante un
     READ.

     LASTKEY() se relaciona con NEXTKEY() y READKEY(). NEXTKEY() lee la tecla
     actual pendiente en la memoria intermedia del teclado sin eliminarla de
     la misma. Utilice NEXTKEY() en vez de INKEY() cuando desee consultar una
     tecla.

     Si desea una lista completa de los códigos de INKEY() y constantes de
     INKEY.CH para cada tecla, consulte la gu.a Mensajes de Error y
     Apííndices.

 Ejemplos

     .  Este ejemplo muestra una aplicación t.pica de LASTKEY() para
        comprobar la tecla con la que se sale de un READ. Si el usuario sale
        con una tecla distinta de Esc y se ha modificado el objeto Get, se
        actualiza el fichero especificado de base de datos.

     #include "Inkey.ch"
        //
        USE Cliente NEW
        MEMVAR->balance = Cliente->Balance

        @ 10, 10 SAY "Balance Actual" GET MEMVAR->balance
        READ
        //
        IF (LASTKEY() != K_ESC).AND. UPDATED()
           REPLACE Cliente->Balance WITH MEMVAR->balance
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB,
            el fichero de cabecera asociado es Inkey.ch.


LASTREC()
 Determina el número de registros del fichero actual (.dbf)
------------------------------------------------------------------------------
 Sintaxis

     LASTREC() | RECCOUNT()* --> nRegistros

 Devuelve

     LASTREC() devuelve el número de registros f.sicos en el fichero actual
     de base de datos, en forma de valor numérico entero. Los mandatos de
     filtrado como SET FILTER o SET DELETED no tienen efecto sobre el valor
     devuelto. LASTREC() devuelve cero si no hay ningún fichero de base de
     datos utilizado en el área de trabajo actual.

 Descripción

     LASTREC() es una función de base de datos que determina el número de
     registros f.sicos existentes en el fichero actual de base de datos.
     LASTREC() es id.ntica a RECCOUNT(), que se incluye por razones de
     compatibilidad.

     Por defecto, LASTREC() act.a en el área de trabajo actualmente
     seleccionada. Para que opere sobre un área de trabajo no seleccionada,
     debe especificarse como parte de una expresión de alias (consulte el
     ejemplo siguiente).

 Ejemplos

     .  Este ejemplo muestra la relaci.n entre LASTREC(), RECCOUNT() y
        COUNT:

        USE Ventas NEW
        ? LASTREC(), RECCOUNT()            // Resultado: 84 84
        //
        SET FILTER TO Vendedor = "1001"
        COUNT TO nRegistros
        ? nRegistros, LASTREC()            // Resultado: 14 84

     .  Este ejemplo utiliza una expresión de alias para acceder al
        número de registros de un fichero de base de datos abierto en un .rea
        de trabajo no seleccionada.

        USE Ventas NEW
        USE Cliente NEW
        ? LASTREC(), Ventas->(LASTREC())

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.



LEFT()
 Extrae una subcadena comenzando en el primer carácter de una cadena
------------------------------------------------------------------------------
 Sintaxis

     LEFT(<cCadena>, <nPosiciones>) --> cSubCadena

 Argumentos

     <cCadena> es la cadena de la que se extraen los carácteres. El
     tama.o máximo de <cCadena> es de 65.553 (64K) bytes.

     <nPosiciones> es el número de carácteres que se van a extraer.

 Devuelve

     LEFT() devuelve los <nPosiciones> carácteres m.s a la izquierda de
     <cCadena>, como una cadena de carácteres. Si <nPosiciones> es cero o
     negativo, LEFT() devuelve una cadena nula (""). Si <nPosiciones> es
     mayor que la longitud de la cadena de carácteres, LEFT() devuelve toda
     la cadena.

 Descripción

     LEFT() es una función de carácteres que devuelve una subcadena de la
     cadena de carácteres especificada. Es id.ntica a
     SUBSTR(<cCadena>,1,<nPosiciones>). LEFT() es similar a RIGHT(), que
     devuelve una subcadena comenzando por el último carácter de la misma.

     LEFT(), RIGHT() y SUBSTR() se utilizan con frecuencia con las funciónes
     AT() y RAT() para localizar la primera y/o .ltima posición de una
     subcadena antes de extraerla.

 Ejemplos

     .  Este mandato extrae los tres primeros carácteres empezando por
        la izquierda de la cadena:

        ? LEFT("ABCDEF", 3)                        // Resultado: ABC

     .  Este ejemplo extrae una subcadena comenzando por el principio
        de otra cadena, hasta la primera coma:

        LOCAL cNombre := "Jorge, Luis"
        ? LEFT(cNombre, AT(",", cNombre) - 1)      // Resultado:
                                                   // Jorge

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


LEN()
 Devuelve la longitud de una cadena de carácteres o el número de elementos de
 una matriz
------------------------------------------------------------------------------
 Sintaxis

     LEN(<cCadena> | <aDestáno>) --> nPosiciones

 Argumentos

     <cCadena> es la cadena de carácteres que se va a contar.

     <aDestáno> es la matriz que se va a contar.

 Devuelve

     LEN() devuelve la longitud de una cadena de carácteres o el número de
     elementos en una matriz, como un número entero. Si la cadena de
     carácteres es una cadena nula ("") o la matriz est. vac.a, LEN()
     devuelve cero.

 Descripción

     LEN() es una función de carácteres y matrices que devuelve la longitud
     de una cadena de carácteres o el número de elementos en una matriz. Con
     una cadena de carácteres, cada byte se cuenta como uno, incluyendo un
     byte nulo (CHR (0)). Por contra, una cadena nula ("") se cuenta como
     cero.

     Para una matriz, LEN() devuelve el número de elementos. Si la matriz es
     multidimensiónal, las submatrices se cuentan como un elemento. Esto
     quiere decir que el valor devuelto por LEN() para una matriz anidada o
     multidimensiónal es simplemente la longitud de la primera dimensión.
     Para determinar el número de elementos en otras dimensiónes, utilice
     LEN() en las submatrices como se muestra en el ejemplo siguiente.
     Recuerde que las matrices anidadas en CA-Clipper no necesitan tener
     dimensiónes uniformes.

 Ejemplos

     .  Estos ejemplos muestran la utilización de LEN() con varios
        argumentos:

        ? LEN("cadena de carácteres")          // Resultado: 20
        ? LEN("")                              // Resultado: 0
        ? LEN(CHR(0))                          // Resultado: 1
        //
        LOCAL aPrueba[10]
        ? LEN(aPrueba)                         // Resultado: 10

     .  Este ejemplo crea una matriz bidimensiónal de forma literal y
        devuelve el número de elementos en la submatriz contenida en el
        primer elemento de la matriz original:

        LOCAL aMatriz := { {1, 2}, {1, 2}, {1, 2} }
        ? LEN(aMatriz)                         // Resultado: 3
        ? LEN(aMatriz[1])                      // Resultado: 2

     .  Este ejemplo se desplaza por una matriz multidimensiónal
        utilizando LEN():

        LOCAL aMatriz := { {1, 2}, {1, 2}, {1, 2} }
        LOCAL nFilas, nCols, nPosFilas, nPosCols
        //
        nPosFilas = LEN(aMatriz)
        FOR nFilas = 1 TO nPosFilas
           nPosCols = LEN(aMatriz[nFilas])
           FOR nCols = 1 TO nPosCols
              ? nFilas, nCols, aMatriz[nFilas][nCols]
           NEXT
        NEXT

     .  En este ejemplo, una función devuelve una matriz de valores
        numéricos que describe las dimensiónes de una matriz multidimensiónal
        anidada. La función supone que la matriz tiene dimensiónes uniformes:

        FUNCTION Dimensiones( aMatriz )
           LOCAL aDims := {}
           DO WHILE ( VALTYPE(aMatriz) == "A" )
              AADD( aDims, LEN(aMatriz) )
              aMatriz := aMatriz[1]
           ENDDO
           RETURN (aDims)

 Ficheros: La biblioteca asociada es CLIPPER.LIB.



LOG()
 Calcula el logaritmo natural de un valor numérico
------------------------------------------------------------------------------
 Sintaxis

     LOG(<nExp>) --> nLogNatural

 Argumentos

     <nExp> es el valor numérico mayor que cero que desea convertir en su
     logaritmo natural.

 Devuelve

     LOG() devuelve el logaritmo natural como un valor numérico. Si <nExp> es
     menor o igual a cero, LOG() devuelve un error de desbordamiento numérico
     (mostrado como una fila de asteriscos).

 Descripción

     LOG() es una función numérica que calcula el logaritmo natural de un
     número. Es la inversa de EXP(). Losólogaritmos naturales tienen como
     base el número e, que es igual a 2.7183 aproximadamente. La función
     LOG() devuelve x en la siguiente ecuaci.n:

     e**x = y

     donde y es la expresión numérica utilizada como argumento de LOG() (es
     decir, LOG(y) = x). Debido al redondeo matem.tico, los valores devueltos
     por LOG() y EXP() pueden no corresponderse exactamente (es decir,
     EXP(LOG(x)) puede no ser siempre igual a x).

 Ejemplos

     .  Estos ejemplos muestran los resultados de diversos usos de
        LOG():

        ? LOG(10)                      // Resultado: 2.30
        ? LOG(10 * 2)                  // Resultado: 3.00
        ? EXP(LOG(1))                  // Resultado: 1.00
        ? LOG(2.71)                    // Resultado: 1.00

     .  Este ejemplo es una función definida por el usuario que
        devuelve el logaritmo en base 10:

        FUNCTION Log10( nNúmero )
        IF nNúmero > 0
           RETURN LOG(nNúmero)/LOG(10)
        ELSE
           RETURN NIL
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.



LOWER()
 Convierte en minúsculasólos carácteres en mayúsculas
------------------------------------------------------------------------------
 Sintaxis

     LOWER(<cCadena>) --> cCadenaMin.sc

 Argumentos

     <cCadena> es la cadena de carácteres que desea convertir en
     minúsculas.

 Devuelve

     LOWER() devuelve una copia de <cCadena> con todos los carácteres
     alfabéticos en letras minúsculas. Los restántes carácteres permanecen
     inalterados en la cadena original.

 Descripción

     LOWER() es una función de carácteres que convierte cadenas en mayúsculas
     y mixtas en cadenas en minúsculas. Está relacionada con UPPER() que
     convierte cadenas en minúsculas y mixtas en cadenas en mayúsculas.
     LOWER() está relacionada con las funciónes ISLOWER() e ISUPPER() que
     determinan si una cadena comienza con un carácter en minúscula o
     mayúscula.

     LOWER() se utiliza normalmente para formatear una cadena de carácteres
     para su visualización en pantalla. Puede utilizarse también para
     normalizar cadenas en comparaciones que no diferencian mayúsculas y
     minúsculas o para la indexación con INDEX.

 Ejemplos

     .  Estos ejemplos muestran los resultados de diferentes usos de
        LOWER():

        ? LOWER("CADENA")                // Resultado: cadena
        ? LOWER("1234 CARACTERES = ")    // Resultado: 1234 carácteres =

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


LTRIM()
 Elimina los espacios en blanco iniciales de una cadena de carácteres
------------------------------------------------------------------------------
 Sintaxis

     LTRIM(<cCadena>) --> cCadenaRecortada

 Argumentos

     <cCadena> es la cadena de carácteres de la que desea eliminar los
     espacios iniciales en blanco.

 Devuelve

     LTRIM() devuelve una copia de <cCadena> sin los espacios iniciales en
     blanco. Si <cCadena> es una cadena nula ("") o est. formada por
     espacios, LTRIM() devuelve una cadena nula ("").

 Descripción

     LTRIM() es una función de carácteres que formatea cadenas de carácteres
     con espacios iniciales en blanco. Estas pueden ser, por ejemplo, números
     que se convierten en una cadena de carácteres útilizando STR().

     LTRIM() está relacionada con RTRIM(), que elimina los espacios en blanco
     finales, y con ALLTRIM(), que elimina los espacios en blanco tanto
     iniciales como finales. Las funciónes inversas de ALLTRIM(), LTRIM() y
     RTRIM() son PADC(), PADR() y PADL() que centran, justifican a la derecha
     o a la izquierda, respectivamente, la cadena de carácteres a.adiendo
     carácteres de relleno.

 Ejemplos

     .  Estos ejemplos muestran los resultados de diferentes usos de
        la función LTRIM():

        nNúmero = 18
        ? STR(nNúmero)                   // Resultado: 18
        ? LEN(STR(nNúmero))              // Resultado: 10
        ? LTRIM(STR(nNúmero))            // Resultado: 18
        ? LEN(LTRIM(STR(nNúmero)))       // Resultado:  2

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


LUPDATE()
 Devuelve la fecha de la .ltima modificaci.n de un fichero (.dbf)
------------------------------------------------------------------------------
 Sintaxis

     LUPDATE() --> fModificaci.n

 Devuelve

     LUPDATE() devuelve la fecha del último cambio realizado en el fichero de
     base de datos abierto en al área de trabajo actual. Si no se est.
     utilizando ningún fichero de base de datos, LUPDATE() devuelve una fecha
     en blanco.

 Descripción

     LUPDATE() es una función de base de datos que determina la fecha en la
     que modific. y cerr. mediante CLOSE por .ltima vez el fichero de base de
     datos del área de trabajo actual. Por defecto, LUPDATE() act.a en el
     área de trabajo actualmente seleccionada. Para que opere en un .rea de
     trabajo no seleccionada, debe especificarse en una expresión de alias,
     como se muestra en un ejemplo posterior.

 Ejemplos

     .  Este ejemplo muestra que la fecha de modificaci.n de un
        fichero de base de datos no cambia hasta que se cierra el fichero:

     ? DATE()                     // Resultado: 09/01/90
        USE Ventas NEW
        ? LUPDATE()               // Resultado: 08/31/90
        //
        APPEND BLANK

        ? LUPDATE()               // Resultado: 08/31/90
        CLOSE DATABASES
        //
        USE Ventas NEW
        ? LUPDATE()               // Resultado: 09/01/90

     .  Este ejemplo utiliza una expresión de alias para acceder a un
        fichero de base de datos abierto en un área de trabajo no
        seleccionada:

        USE Ventas NEW
        USE Cliente NEW
        ? LUPDATE(), Ventas->(LUPDATE())

 Ficheros:  La biblioteca asociada es EXTEND.LIB.