RAT()
 Devuelve la posición de la .ltima aparici.n de una subcadena en una cadena
 dada
------------------------------------------------------------------------------
 Sintaxis

     RAT(<cB.squeda>, <cDestáno>) --> nPosici.n

 Argumentos

     <cB.squeda> es la cadena de carácteres que se desea buscar.

     <cDestáno> es la cadena de carácteres en la que se busca.

 Devuelve

     RAT() devuelve la posición de <cB.squeda> en <cDestáno>, en forma de
     valor numérico entero. Si <cB.squeda> no se encuentra, RAT() devuelve
     cero.

 Descripción

     RAT() es una función que devuelve la posición de la .ltima aparici.n de
     una subcadena de carácteres en otra cadena . Para ello, examina la
     cadena de destáno empezando por la derecha. RAT() es similar a la
     función AT(), que devuelve la posición de la primera aparici.n de una
     subcadena dentro de otra cadena. También es similar al operador $, que
     determina si una subcadena est. contenida en una cadena.

     Tanto la función RAT() como la función AT() se utilizan con SUBSTR(),
     LEFT() y RIGHT() para extraer subcadenas.

 Ejemplos

     .  Este ejemplo utiliza RAT() para crear una función,
        ViaFichero(), que extrae la vía de una especificación de fichero. Si
        no se especifica una vía, devuelve una cadena nula (""):

        ? ViaFichero("C:\DBF\Sales.dbf")      // Resultado: C:\DBF\

        FUNCTION ViaFichero(cFichero)
           LOCAL nPos, cViaFichero
           IF (nPos := RAT("\", cFichero)) != 0
              cViaFichero = SUBSTR(cFichero, 1, nPos)
           ELSE
              cViaFichero = ""
           ENDIF
           RETURN cViaFichero

 Ficheros: La biblioteca asociada es EXTEND.LIB.


 
READEXIT()
 Activa o desactiva las flechas Arriba y Abajo como teclas de salida del READ
------------------------------------------------------------------------------
 Sintaxis

     READEXIT([<lActivar/desactivar>]) --> lEstadoActual

 Argumentos

     <lActivar/desactivar> activa o desactiva la utilización de las
     flechas Arriba y Abajo como teclas de salida de un mandato READ. Si se
     especifica verdadero (.T.), se activan como teclas de salida y, si se
     especifica falso (.F.), se desactivan.

 Devuelve

     READEXIT() devuelve la selecci.n actual, en forma de valor l.gico.

 Descripción

     READEXIT() es una función de entorno que informa del estado actual de
     las flechas Arriba y Abajo como teclas de salida del mandato READ desde
     el primer o último objeto Get de una GetList. Si se especifica el
     argumento opciónal <lActivar/desactivar>, estas teclas se activan o
     desactivan como teclas de salida. Cuando se arranca el programa, Arriba
     y Abajo no están activadas como teclas de salida de READ. Normalmente,
     las teclas de salida de READ incluyen .nicamente ReP.g, AvP.g, Esc o
     Intro desde el último objeto GET.

 Ejemplos

     .  Este ejemplo muestra c.mo READEXIT() activa Arriba y Abajo
        como teclas de salida antes de un mandato READ y las desactiva al
        finalizar el mismo:

        cMiVar = SPACE(10)
        lUltimaSalida = READEXIT(.T.)      // Resultado:
                                           // Activa las teclas de salida
        @ 10, 10 SAY "Intro: " GET cMiVar
        READ
        READEXIT(lUltimaSalida)            // Resultado:
                                           // Restablece la selecci.n anterior

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.

READINSERT()
 Activa o desactiva el modo de inserci.n para los mandatos READ y MEMOEDIT()
------------------------------------------------------------------------------
 Sintaxis

     READINSERT([<lActivar/desactivar>]) --> lModoActual

 Argumentos

     <lActivar/desactivar> activa o desactiva el modo de inserci.n.
     Verdadero (.T.) lo activa y falso (.F.) lo desactiva. El valor por
     defecto es falso (.F.) o el último modo seleccionado por el usuario con
     un mandato READ o MEMOEDIT().

 Devuelve

     READINSERT() devuelve el estado actual del modo de inserci.n, en forma
     de valor l.gico.

 Descripción

     READINSERT() es una función de entorno que informa del estado actual del
     modo de inserci.n de los mandatos READ y MEMOEDIT() y, opciónalmente, lo
     activa o desactiva, dependiendo del valor de <lActivar/desactivar>. Si
     READINSERT() devuelve falso (.F.), los carácteres se sobreescriben al
     introducir el usuario carácteres en la memoria intermedia de un objeto
     mediante un mandato READ o MEMOEDIT(). Si READINSERT() devuelve
     verdadero (.T.), los carácteres introducidos se insertan. El modo de
     inserci.n pertenece a la configuración global del sistema y no a un
     objeto determinado.

     READINSERT() puede ejecutarse antes o durante un mandato READ o
     MEMOEDIT(). Si se utiliza con READ, READINSERT() puede invocarse en una
     cláusula WHEN o VALID de @...GET o en un procedimiento SET KEY. Si se
     utiliza con MEMOEDIT(), puede invocarse con la función de usuario, as.
     como con un procedimiento SET KEY.

 Ejemplos

     .  Este ejemplo fija el modo de inserci.n antes de entrar en
        MEMOEDIT() y reinicializa el modo cuando MEMOEDIT() finaliza:

        USE Ventas NEW

        // Activar el modo de inserci.n
        lModoIns = READINSERT(.T.)
        Ventas->Notas := MEMOEDIT(Ventas->Notas)
        // Restablecer el modo de inserci.n anterior
        READINSERT(lModoIns)

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.

READKEY()*
 Determina qu. tecla ha finalizado un mandato READ
------------------------------------------------------------------------------
 Sintaxis

     READKEY() --> nC.digoTeclaRead

 Devuelve

     READKEY() devuelve un código que representa la tecla que se ha pulsado
     para salir de un READ. En CA-Clipper, las siguientes son las teclas de
     salida estándar de READ y sus códigos de retorno READKEY():

     C.digos de Retorno de READKEY()
     ------------------------------------------------------------------------
     Tecla de Salida              C.digo de Retorno
     ------------------------------------------------------------------------
     Arriba                        5
     Abajo                         2
     ReP.g                         6
     AvP.g                         7
     Ctrl-ReP.g                   31
     Ctrl-AvP.g                   30
     Esc                          12
     Ctrl-Fin, Ctrl-W             14
     Escribir m.s all. del fin    15
     Intro                        15
     ------------------------------------------------------------------------

 Descripción

     READKEY() es una función de teclado que emula a la función READKEY() de
     dBASE III PLUS. Su finalidad es determinar qu. tecla ha pulsado el
     usuario para finalizar un READ. Si UPDATED() es verdadero (.T.),
     READKEY() devuelve el código m.s 256. S.lo pueden utilizarse Arriba y
     Abajo para salir de un mandato READ si READEXIT() vale verdadero (.T.).
     El valor por defecto es falso (.F.). Para permitir una completa
     compatibilidad de estas teclas, ejecute READEXIT (.T.) al principio de
     su procedimiento principal.

     READKEY() se incluye como función de compatibilidad, por lo que su
     utilización no es recomendable. Puede sustituirse completamente por
     LASTKEY(), que determina la .ltima pulsaci.n obtenida de la memoria
     intermedia del teclado. Si la pulsaci.n fue una tecla de salida de READ,
     LASTKEY() devuelve el código de INKEY() de esta tecla. Para determinar
     si se ha modificado la memoria intermedia de un objeto Get durante un
     READ, puede sustituirse por la función UPDATED().

 Ficheros:  La biblioteca asociada es EXTEND.LIB,
            el fichero fuente es SOURCE\SAMPLE\READKEY.PRG

READMODAL()
 Activa el modo de edici.n de pantalla completa de la GetList
------------------------------------------------------------------------------
 Sintaxis

     READMODAL(<aGetList>) --> NIL

 Argumentos

     <aGetList> es una matriz que contiene la lista de objetos Get que se
     van a editar.

 Devuelve

     READMODAL() devuelve siempre NIL.

 Descripción

     READMODAL() es una función de interfaz de usuario que activa el modo de
     pantalla completa para objetos GET. Forma parte del sistema Get de
     arquitectura abierta de CA-Clipper. READMODAL() es similar al mandato
     READ, excepto en que toma una matriz GetList como argumento y no
     reinicializa la matriz cuando finaliza. Debido a esto, es posible
     utilizar m.ltiples listas de objetos Get y activarlas en cualquier
     momento de la ejecución de un programa, siempre que la matriz que se va
     a utilizar est. visible.

     Por compatibilidad con las versiones anteriores de CA-Clipper, el
     sistema GET utiliza una matriz pública llamada GetList. Cada vez que se
     ejecuta un mandato @...GET, .ste crea un objeto Get y lo a.ade a la
     matriz GetList actualmente visible. El mandato READ estándar se
     preprocesa mediante una llamada a READMODAL(), que utiliza la matriz
     GetList como argumento. Si no se especifica la cláusula SAVE, se asigna
     a la variable GetList una matriz vac.a cuando finaliza READMODAL().

     Algunas de las funciónes de Getsys.prg se han hecho públicas para que
     puedan utilizarse con otros sistemas Get personalizados. En la siguiente
     tabla se listan estas funciónes.

     funciónes del Sistema Get
     ------------------------------------------------------------------------
     función             Descripción
     ------------------------------------------------------------------------
     GETACTIVE()         Devuelve el objeto Get actualmente activo
     GETAPPLYKEY()       Aplica una tecla a un objeto Get desde una rutina de
                         lectura del Get
     GETDOSETKEY()       Procesa SET KEY durante la edici.n del objeto GET
     GETPOSTVALIDATE()   Eval.a la postcondición del objeto Get actual
     GETPREVALIDATE()    Eval.a la precondición del objeto Get actual
     GETREADER()         Ejecuta las acciones READ estándares para un objeto
                         Get
     READFORMAT()        Devuelve, y opciónalmente establece, el bloque de
                         código que define un fichero de formato (.fmt)
     READKILL()          Devuelve, y opciónalmente establece, si debe salirse
                         del Read actual
     READUPDATED()       Devuelve, y opciónamente establece, si un objeto Get
                         se ha modificado durante un Read
     ------------------------------------------------------------------------

     Si desea información sobre los objetos Get y las funciónes antes
     listadas, consulte el capítulo El Sistema Get de la guía de Programación
     y Utilidades.

     Si desea más información sobre las teclas que pueden utilizarse por
     defecto con la función READMODAL(), consulte la referencia del mandato
     READ de este capítulo.

 Ficheros:  La biblioteca asociada es CLIPPER.LIB,
            el fichero fuente es SOURCE\SYS\GETSYS.PRG


READVAR()
 Devuelve el nombre de la variable del Get o del Men. actual
------------------------------------------------------------------------------
 Sintaxis

     READVAR() --> cNombreVar

 Devuelve

     READVAR() devuelve el nombre de la variable asociada con el objeto Get
     actual o el de la variable asignada mediante el mandato MENU TO, como
     una cadena de carácteres en mayúsculas.

 Descripción

     READVAR() es una función de entorno que se utiliza, fundamentalmente,
     para generaráayudas sensibles al contexto para objetos Get y men.s de
     barra. READVAR() sólo puede utilizarse con los mandatos READ o MENU TO.
     Si se utiliza durante cualquier otro estado de espera, como ACCEPT,
     INPUT, WAIT, ACHOICE(), DBEDIT() o MEMOEDIT(), devuelve una cadena nula
     (""). Es habitual acceder a ella desde un procedimiento SET KEY o
     función invocada con una cláusula WHEN o VALID de un objeto Get.

 Ejemplos

     .  Este ejemplo crea un sistema sencillo de ayuda para objetos
        Get, utilizando un fichero de base de datos para almacenar el texto
        de ayuda. Cuando el usuario pulsa F1, se busca en el fichero
        utilizando READVAR() como valor clave y, si existe texto de ayuda, se
        muestra en una ventana:

        #include "Inkey.ch"
        //
        SET KEY K_F1 TO ConsultaAyuda
        cCadena = SPACE(10)
        @ 5, 5 SAY "Intro:" GET cCadena
        READ
        RETURN

        FUNCTION ConsultaAyuda
           USE Ayuda INDEX Ayuda NEW
           SEEK READVAR()
           IF FOUND()
              MostrarAyuda(Ayuda->Tema)
           ELSE
              MostrarAyuda("No hay ayuda sobre " + READVAR())
           ENDIF
           CLOSE Ayuda
           RETURN NIL

        FUNCTION MostrarAyuda(cTema)
           LOCAL cPantalla := SAVESCREEN(5,5,15,70),;
                  cColor := SETCOLOR("BG+/B")
           //
           SET CURSOR OFF
           @ 5, 5 CLEAR TO 15, 70
           @ 5, 5 TO 15, 70 DOUBLE
           @ 5, 30 SAY " Ayuda para " + READVAR() + " "
           MEMOEDIT(cTema, 6, 7, 14, 68, .F.)
           //
           RESTSCREEN(5, 5, 15, 70, cPantalla)
           SETCOLOR(cColor)
           SET CURSOR ON
           //
           RETURN NIL

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


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

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

 Devuelve

     RECCOUNT() devuelve el número de registros f.sicos existentes en el
     fichero actual de base de datos, en forma de valor numérico entero. Los
     mandatos de filtro como SET FILTER o SET DELETED no afectan al valor
     devuelto. RECCOUNT() devuelve cero si no hay ningún fichero de base de
     datos abierto en el área de trabajo actual.

 Descripción

     RECCOUNT() es una función de base de datos similar a LASTREC(). Por
     defecto, RECCOUNT() opera en el área de trabajo actual. Si desea
     utilizarla en otra área de trabajo, debe especificarla mediante una
     expresión de alias (consulte el ejemplo siguiente).

 Ejemplos

     .  Este ejemplo ilustra la relaci.n que existe entre COUNT y
        RECCOUNT():

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

     .  Este ejemplo utiliza una expresión de alias para acceder al
        número de registros de un área de trabajo no seleccionada:

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

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.

RECNO()
 Devuelve el número del registro actual de un área de trabajo
------------------------------------------------------------------------------
 Sintaxis

     RECNO() --> nRegistro

 Devuelve

     RECNO() devuelve el número del registro actual, en forma de valor
     numérico entero. Si el área de trabajo contiene un fichero con cero
     registros, RECNO() devuelve uno, BOF() y EOF() devuelven verdadero (.T.)
     y LASTREC() devuelve cero.

     Si el puntero se desplaza m.s all. del último registro, RECNO() devuelve
     LASTREC() + 1 y EOF() devuelve verdadero (.T.). Si se intenta desplazar
     antes del primer registro, RECNO() devuelve el número del primer
     registro l.gico del fichero de base de datos y BOF() devuelve verdadero
     (.T.). Si no hay un fichero de base de datos abierto, RECNO() devuelve
     cero.

 Descripción

     RECNO() es una función de base de datos que devuelve el número del
     registro actual de un área de trabajo. En el esquema de ficheros de base
     de datos de CA-Clipper, todos los ficheros se ordenan f.sicamente por
     los números de registro. A su vez, todas las áreas de trabajo tienen un
     puntero en el registro actual de su fichero abierto. RECNO() informa de
     este número de registro. La numeraci.n permite accerder directamente a
     un registro sin tener que examinar todo el fichero para llegar al
     registro especificado.

     RECNO() se utiliza normalmente con rutinas que procesan los registros
     por su número. Estas incluyen SET RELATION...TO RECNO(), que enlaza
     ficheros de base de datos por números de registro. GO RECNO() actualiza
     también los datos del registro actual del disco.

     Por defecto, RECNO() opera en el área de trabajo actual. Si desea
     utilizarla en un área de trabajo no seleccionada, debe especificarla en
     una expresión de alias (consulte el ejemplo siguiente).

 Ejemplos

     .  Este ejemplo consulta RECNO() tras desplazar intencionadamente
        el puntero de registro:

        USE Clientes NEW
        GO 3
        ? RECNO()                        // Resultado: 3
        GO TOP
        ? RECNO()                        // Resultado: 1
        nRegistro := 3
        GO nRegistro
        ? RECNO()                        // Resultado: 3
        GO BOTTOM
        SKIP
        ? RECNO(), LASTREC()             // Resultado: 11 10

     .  Este ejemplo utiliza expresiónes de alias para obtener el
        valor de RECNO() en .reas de trabajo no seleccionadas:

        USE Ventas NEW
        USE Cliente NEW
        //
        ? Ventas->(RECNO())
        ? Cliente->(RECNO())

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


RECSIZE()
 Determina el tama.o de un registro de un fichero de base de datos (.dbf)
------------------------------------------------------------------------------
 Sintaxis

     RECSIZE() --> nBytes

 Devuelve

     RECSIZE() devuelve, como valor numérico entero, la longitud en bytes de
     un registro del fichero de base de datos abierto en el área de trabajo
     actual. Si no hay un fichero de base de datos abierto, RECSIZE()
     devuelve cero.



 Descripción

     RECSIZE() es una función de base de datos que determina la longitud de
     un registro, sumando lasólongitudes de cada campo y, a continúa.ión, uno
     para el indicador de estado DELETED(). Si este valor se multiplica por
     LASTREC(), el resultado es el espacio ocupado por todos los registros
     del fichero.

     RECSIZE() es útil en programas que realicen autom.ticamente copias de
     seguridad del fichero. Si se utiliza con DISKSPACE(), la función
     RECSIZE() permite comprobar la existencia de espacio libre suficiente en
     el disco antes de guardar un fichero.

     Por defecto, RECSIZE() opera en el área de trabajo actual. Si desea
     utilizarla en un área de trabajo no seleccionada, debe especificarla en
     una expresión de alias (consulte el ejemplo siguiente).

 Ejemplos

     .  La siguiente función, TamanoDbf(), utiliza RECSIZE() para
        calcular el tama.o del fichero actual de base de datos:

        FUNCTION TamanoDbf
           RETURN ((RECSIZE() * LASTREC()) + HEADER() + 1)

     .  Este ejemplo muestra la forma de utilización de RECSIZE() para
        determinar la longitud de registro de un fichero abierto en un .rea
        de trabajo no seleccionada.

        USE Cliente NEW
        USE Ventas NEW
        //
        ? RECSIZE(), Cliente->(RECSIZE())
        ? TamanoDbf(), Cliente->(TamanoDbf())

 Ficheros:  La biblioteca asociada es EXTEND.LIB.


REPLICATE()
 Devuelve una cadena, repetida el número de veces especificado
------------------------------------------------------------------------------
 Sintaxis

     REPLICATE(<cCadena>, <nVeces>) --> cCadenaRepetida

 Argumentos

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

     <nVeces> es el número de veces que se va a repetir <cCadena>.

 Devuelve

     REPLICATE() devuelve una cadena de carácteres de una longitud máxima de
     65.535 (64K) bytes. Si se especifica cero como argumento <nVeces>,
     devuelve una cadena nula ("").

 Descripción

     REPLICATE() es una función de carácteres que muestra, imprime o llena la
     memoria del teclado con uno o m.s carácteres repetidos. REPLICATE() es
     similar a la función SPACE(), que devuelve el número especificado de
     carácteres de espacio.

 Ejemplos

     .  Estos ejemplos muestran la repetición de cadenas por medio de
        REPLICATE():

        ? REPLICATE("*", 5)            // Resultado: *****
        ? REPLICATE("Hola", 2)         // Resultado: Hola Hola
        ? REPLICATE(CHR(42), 5)        // Resultado: *****

     .  Este ejemplo utiliza REPLICATE() para llenar la mamoria del
        teclado con varias flechas Abajo:

        #include "Inkey.ch"
        KEYBOARD REPLICATE(CHR(K_DN), 25)

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.

RESTSCREEN()
 Muestra una zona de pantalla prevíamente guardada, en la posición
 especificada
------------------------------------------------------------------------------
 Sintaxis

     RESTSCREEN([<nSuperior>], [<nIzquierda>], [<nInferior>],
                [<nDerecha>], <cPantalla>) --> NIL

 Argumentos

     <nSuperior>, <nIzquierda>, <nInferior> y <nDerecha>
     definen las coordenadas de la información de pantalla contenida en
     <cPantalla>. Si no se especificaron coordenadas con <cPantalla> para que
     se guardara toda la pantalla, tampoco son necesarias con RESTSCREEN().

     <cPantalla> es una cadena de carácteres que contiene la zona de
     pantalla guardada.

 Devuelve

     RESTSCREEN() devuelve siempre NIL.

 Descripción

     RESTSCREEN() es una función que vuelve a mostrar una zona de pantalla
     guardada con SAVESCREEN(). La posición de destáno puede ser la posición
     de pantalla original u otra diferente. Si se especifica una nueva
     posición, la nueva zona debe tener el mismo tama.o que la antigua o se
     obtendr.n resultados ambiguos. Al utilizar RESTSCREEN() para recuperar
     secciones de pantalla guardadas con SAVE SCREEN, pueden especificarse
     coordenadas comprendidas entre 0, 0,y MAXROW(), MAXCOL().

     .Advertencia! SAVE SCREEN, RESTORE SCREEN, SAVESCREEN() y
     RESTSCREEN() sólo pueden utilizarse con el controlador de pantalla por
     defecto. Otros controladores pueden no permitir guardar y recuperar las
     pantallas.

 Ejemplos

     .  Este ejemplo muestra RESTSCREEN() como parte de una función de
        men. emergente de uso general, MenuEmerg():

        ? MenuEmerg({1, 1, 3, 10, {"ElementoUno", "ElementoDos"}, ;
              "BG+/B"})

        FUNCTION MenuEmerg(aLista)
           LOCAL cPantalla, nSeleccion, cAntiguoColor := ;
                    SETCOLOR(aLista[6])
           cPantalla := SAVESCREEN(aLista[1], aLista[2],;
               aLista[3], aLista[4])
           @ aLista[1], aLista[2] TO aLista[3], aLista[4] DOUBLE
           nSeleccion := ACHOICE(++aLista[1], ++aLista[2],;
              --aLista[3], --aLista[4], aLista[5])
           SETCOLOR(cAntiguoColor)
           RESTSCREEN(--aLista[1], --aLista[2], ++aLista[3],;
               ++aLista[4], cPantalla)
           RETURN nSeleccion

 Ficheros: La biblioteca asociada es EXTEND.LIB.

RIGHT()
 Devuelve una subcadena, comenzando por el carácter situado m.s a la derecha
------------------------------------------------------------------------------
 Sintaxis

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

 Argumentos

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

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

 Devuelve

     RIGHT() devuelve <nPosiciones> carácteres, contados desde el extremo
     derecho de <cCadena>. Si <nPosiciones> es cero, RIGHT() devuelve una
     cadena nula (""). Si <nPosiciones> es un número negativo o mayor que la
     longitud de la cadena de carácteres, RIGHT() devuelve <cCadena>. El
     máximo tama.o de una cadena es de 65.535 (64K) bytes.

 Descripción

     RIGHT() es una función de carácteres que extrae una subcadena comenzando
     por el carácter situado m.s a la derecha de <cCadena>. Es id.ntica a la
     expresión de carácteres SUBSTR(<cCadena>, -<nPosiciones>). Por ejemplo,
     RIGHT("ABC", 1) esólo mismo que SUBSTR("ABC", -1). RIGHT() est.
     relacionada con LEFT(), que extrae una subcadena comenzando por el
     carácter m.s a la izquierda de <cCadena>.

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

 Ejemplos

     .  Este ejemplo muestra la relaci.n que existe entre RIGHT() y
        SUBSTR():

        ? RIGHT("ABCDEF", 3)                       // Resultado: DEF
        ? SUBSTR("ABCDEF", -3)                     // Resultado: DEF

     .  Este ejemplo extrae una subcadena, desde el final de otra
        cadena hasta la .ltima aparici.n de una coma:

        LOCAL cNombre := "Jaime,Guillermo"
        ? RIGHT(cNombre,;
        LEN(cNombre) - RAT(",", cNombre) - 1)      // Resultado: Guillermo

 Ficheros:  La biblioteca asociada es EXTEND.LIB.

RLOCK()
 Bloquea el registro actual del área de trabajo activa
------------------------------------------------------------------------------
 Sintaxis

     RLOCK() --> lExito

 Devuelve

     RLOCK() devuelve verdadero (.T.) si se bloquea el registro; y falso
     (.F.) en caso contrario.

 Descripción

     RLOCK() es una función de red que bloquea el registro actual, impidiendo
     que otros usuarios puedan actualizar ese registro hasta que se libere.
     RLOCK() permite un bloqueo compartido y los otros usuarios tienen acceso
     de sólo lectura al registro bloqueado. S.lo se permite modificarlo al
     usuario actual. El bloqueo de registro se mantiene hasta que se bloquee
     otro registro, se ejecute un mandato UNLOCK, se cierre el fichero de
     base de datos o se ejecute un FLOCK() en el fichero actual.

     Por cada invocaci.n de RLOCK(), se realiza un intento de bloquear el
     registro actual y el resultado se devuelve como valor l.gico. Los
     intentos de bloqueo de un registro fallan cuando otro usuario ha
     bloqueado o est. utilizando en modo exclusivo el fichero actual. Si se
     intenta ejecutar RLOCK() en una base de datos vac.a, se devuelve
     verdadero (.T.).

     Por defecto, RLOCK() opera en el área de trabajo actual. Si desea
     utilizarla en un área de trabajo no seleccionada, debe especificarla en
     una expresión de alias (consulte el ejemplo siguiente). Esto puede ser
     muy .til porque RLOCK() no intenta autom.ticamente bloquear los
     registros de ficheros relacionados.

     Normalmente, RLOCK() opera .nicamente en el registro actual. Esto
     incluye los siguientes mandatos:

     .  @...GET

     .  DELETE (un registro)

     .  RECALL (un registro)

     .  REPLACE (un registro)

     Si desea más información, consulte el capítulo Programaci.n en Red de la
     guía de Programación y Utilidades.

 Notas

     .  SET RELATION: CA-Clipper no bloquea autom.ticamente todos
        los registros de la cadena de relaci.n cuando el usuario bloquea el
        registro del área de trabajo actual. Asimismo, un mandato UNLOCK no
        afecta a las .reas de trabajo relacionadas.

 Ejemplos

     .  Este ejemplo borra un registro en un entorno de red utilizando
        RLOCK():

        USE Clientes INDEX NombreCli SHARED NEW
        SEEK "Martinez"
        IF FOUND()
           IF RLOCK()
              DELETE
              ? "Martinez ha sido borrado"
           ELSE
              ? "Otro usuario est. utilizando el registro"
           ENDIF
        ELSE
           ? "Martinez no se encuentra en el fichero Clientes"
        ENDIF
        CLOSE

     .  Este ejemplo especifica RLOCK() en una expresión de alias para
        bloquear un registro en un área de trabajo no seleccionada:

        USE Ventas SHARED NEW
        USE Clientes SHARED NEW
        //
        IF !Ventas->(RLOCK())
           ? "Otro usuario est. utilizando el registro Ventas actual"
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


ROUND()
 Devuelve un valor numérico, redondeado con el número de cifras especificado
------------------------------------------------------------------------------
 Sintaxis

     ROUND(<nNúmero>, <nDecimales>) --> nRedondeado

 Argumentos

     <nNúmero> es el valor numérico que se va a redondear.

     <nDecimales> define el número de decimales que se mantienen. Si se
     especifica un valor negativo, se redondean números enteros.

 Devuelve

     ROUND() devuelve un valor numérico.

 Descripción

     ROUND() es una función numérica que redondea <nNúmero> con el número de
     decimales especificado con <nDecimales>. Si se especifica cero o un
     valor negativo en <nDecimales> se redondea el número entero. Un valor
     negativo de <nDecimales> indica el número de cifras a la izquierda de la
     coma decimal que se van a redondear. Las cifras entre cinco y nueve,
     ambos inclusive, se redondean por encima y las cifras inferiores a cinco
     se redondean por debajo.

     La visualización del valor devuelto no obedece el valor de DECIMALS, a
     menos que se haya establecido SET FIXED ON. Si se ha establecido SET
     FIXED OFF, la visualización del valor devuelto contiene tantas cifras
     decimales como las especificadas en <nDecimales> o cero, si <nDecimales>
     es menor de uno.

 Ejemplos

     .  Estos ejemplos redondean valores con cifras decimales:

     SET DECIMALS TO 2
        SET FIXED ON
        //
        ? ROUND(10.4, 0)                 // Resultado: 10.00
        ? ROUND(10.5, 0)                 // Resultado: 11.00
        ? ROUND(10.51, 0)                // Resultado: 11.00
        ? ROUND(10.49999999999999, 2)    // Resultado: 10.50

     .  Estos ejemplos utilizan un argumento <nDecimales> negativo y
        redondean valores numéricos en números enteros:

        ? ROUND(101.99, -1)              // Resultado: 100.00
        ? ROUND(109.99, -1)              // Resultado: 110.00
        ? ROUND(109.99, -2)              // Resultado: 100.00

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


ROW()
 Devuelve la fila actual del cursor
------------------------------------------------------------------------------
 Sintaxis

     ROW() --> nFila

 Devuelve

     ROW() devuelve la posición de fila del cursor, en forma de valor
     numérico entero. El rango del valor devuelto es de cero a MAXROW().

 Descripción

     ROW() es una función de pantalla que devuelve la posición de fila o
     línea actual del cursor en la pantalla. El valor de ROW() se actualiza
     por los mandatos y funciónes, tanto de consola como de pantalla
     completa. @...SAY sólo actualiza ROW() cuando se ha establecido SET
     DEVICE TO SCREEN.

     ROW() se utiliza con COL() y todas las variantes del mandato @ para
     colocar el cursor en una nueva línea respecto a la línea actual. En
     concreto, ROW() y COL() pueden utilizarse para crear procedimientos y
     funciónes de posición independiente, en los que la fila y columna
     superior izquierda se pasan como parámetros.

     ROW() está relacionada con PROW() y PCOL(), que controla la posición
     actual del cabezal de la impresora en vez de la posición del cursor.

 Ejemplos

     .  En este ejemplo, ROW() simula el mandato LIST, mostrando el
        texto en la misma línea, pero en diferentes columnas:

        LOCAL nFila
        USE Cliente INDEX NombreCli NEW
        DO WHILE .NOT. EOF()
           CLS
           @ 1, 1 SAY PADR("Nombre" LEN(CNombreCli))
           @ ROW(), COL() + 2 SAY PADR("Direccion", ;
                 LEN(Direccion))
           @ ROW(), COL() + 2 SAY PADR("Tel.fono", LEN(Telefono))
           nFila = 0
           DO WHILE nFila++ <= 15 .AND. (!EOF())
              @ ROW() + 1, 1 SAY NombreCli
              @ ROW(), COL() + 2 SAY Direccion
              @ ROW(), COL() + 2 SAY Telefono
              SKIP
           ENDDO
           WAIT
        ENDDO
        CLOSE Cliente

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.

RTRIM()
 Suprime los espacios finales de una cadena de carácteres
------------------------------------------------------------------------------
 Sintaxis

     [R]TRIM(<cCadena>) --> cCadenaSuprim

 Argumentos

     <cCadena> es la cadena de carácteres que se va a copiar sin espacios
     finales.

 Devuelve

     RTRIM() devuelve una copia de <cCadena> sin espacios finales. Si
     <cCadena> es una cadena nula ("") o todo espacios, RTRIM() devuelve una
     cadena nula ("").

 Descripción

     RTRIM() es una función que formatea cadenas de carácteres. Sirve para
     borrar espacios finales al concatenar cadenas, lo que ocurre con mucha
     frecuencia en los campos de base de datos que se almacenan con un
     formato de anchura fija. Por ejemplo, RTRIM() puede utilizarse para
     concatenar los campos que contienen el nombre y el apellido para formar
     una cadena con el nombre completo.

     RTRIM() está relacionada con LTRIM(), que suprime los espacios
     iniciales, y con ALLTRIM(), que suprime tanto los espacios iniciales
     como los finales. Las funciónes inversas de ALLTRIM(), LTRIM() y RTRIM()
     son PADC(), PADR() y PADL(), que centra, justifica a la derecha o
     justifica a la izquierda, respectivamente, las cadenas de carácteres,
     rellen.ndolas con carácteres de relleno.

 Ejemplos

     .  Esta es una función en la que RTRIM() formatea los campos
        Ciudad, Provincia y C.digo postal para etiquetas y circulares:

        FUNCTION Direccion(cCiudad, cProvincia, cCodigoPostal)
           RETURN RTRIM(cCiudad) + ", " ;
            + RTRIM(cProvincia) + " " + cCodigoPostal

     .  En este ejemplo, la función, Direccion(), muestra un registro
        de Clientes.dbf:

        USE Clientes INDEX NombreCli NEW
        SEEK "Rosa"
        ? Direccion(Ciudad, Provincia, CodigoPostal)
        // Resultado: Oviedo, Asturias 43066

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.

SAVESCREEN()
 Guarda una parte de la pantalla para su posterior visualización
------------------------------------------------------------------------------
 Sintaxis

     SAVESCREEN([<nSup>], [<nIzq>], [<nInf>], [<nDer>]) --> cPantalla

 Argumentos

     <nSup>, <nIzq>, <nInf>, y <nDer> definen las coordenadas
     de la parte de la pantalla que va a guardarse. Si <nInf> o <nDer> son
     mayores que MAXROW() o MAXCOL(), la pantalla se recorta. Si no
     especifican coordenadas, se guarda toda la pantalla (es decir, desde 0,0
     hasta MAXROW(), MAXCOL()).

 Devuelve

     SAVESCREEN() devuelve la zona especificada de la pantalla, como cadena
     de carácteres.

 Descripción

     SAVESCREEN() es una función de pantalla que guarda una zona de la
     pantalla en una variable de cualquier clase de almacenamiento,
     incluyendo variables de campo. M.s adelante, puede volver a mostrar la
     imagen de pantalla guardada, en la misma posición o en otra nueva,
     utilizando RESTSCREEN( ). Normalmente, las zonas de pantalla se
     alamacenan y recuperan cuando se utiliza una rutina de men. desplegable
     o se arrastra un objeto de pantalla.

     Advertencia  SAVE SCREEN, RESTORE SCREEN, SAVESCREEN(), y
     RESTSCREEN() se admiten cuando se utiliza el controlador de pantalla por
     defecto. Es posible que otros controladores de pantalla no admitan las
     operación.s de archivo y recuperaci.n de pantallas.

 Ejemplos

     .  La siguiente función definida por el usuario crea un men. que
        aparece en pantalla utilizando ACHOICE() con SAVESCREEN(),
        devolviendo la selecci.n en la matriz de opciónes:

        FUNCTION Menu( nSup, nIzq, nInf, nDer, ;
                             aElementos, cColor )
           LOCAL cPantalla, nOpcion, cUltColor := ;
                 SETCOLOR(cColor)
           //
           cPantalla:= SAVESCREEN(nSup, nIzq, nInf, nDer)
           @ nSup, nIzq TO nInf, nDer DOUBLE
           //
           nOpcion:= ACHOICE(++nSup, ++nIzq, ;
                        --nInf, --nDer, aElementos)
           //
           RESTSCREEN(--nSup, --nIzq, ++nInf, ++nDer, ;
                          cPantalla)
           SETCOLOR(cUltColor)
           RETURN nOpcion

 Ficheros: La biblioteca asociada es EXTEND.LIB.

SCROLL()
 Desplaza una zona de la pantalla hacia arriba o hacia abajo, a la derecha o a
 la izquierda
------------------------------------------------------------------------------
 Sintaxis

     SCROLL([<nSup>], [<nIzq>],[<nInf>],[<nDer>],
            [<nVert>] [<nHoriz>]) --> NIL

 Argumentos

     <nSup>, <nIzq>, <nInf>, y <nDer> definen las coordenadas
     de la zona de desplazamiento. Los valores de filas y columnas pueden ir
     desde 0, 0 hasta MAXROW(), MAXCOL(). Si no especifica argumentos de
     coordenadas, se utilizan las dimensiónes de la pantalla visible.

     <nVert> define el número de filas de desplazamiento vertical. Un
     valor positivo desplaza hacia arriba la pantalla el número especificado
     de filas. Un valor negativo desplaza hacia abajo la pantalla el número
     especificado de filas. Un valor cero desactiva el desplazamiento
     vertical. Si no se especifica <nVert> se asume un valor cero.

     <nHoriz> define el número de filas de desplazamiento horizontal. Un
     valor positivo hace que la pantalla se desplace hacia la izquierda el
     número de columnas especificado. Un valor negativo hace que la pantalla
     se desplace hacia la derecha el número de columnas especificado. Un
     valor cero desactiva el desplazamiento horizontal. Si no se especifica
     <nHoriz>, se asume un valor cero.

     Si no introduce los parámetros <nVert> ni <nHoriz> en SCROLL(), el .rea
     especificada por los cuatro primero parámetros queda en blanco.

     .Advertencia!  El desplazamiento horizontal no se puede utilizar en
     ningúno de los controladores de terminal alternativos (ANSITERM,
     NOVTERM, PCBIOS).

 Devuelve

     SCROLL() siempre devuelve NIL.

 Descripción

     SCROLL() es una función de pantalla que desplaza una zona de .sta hacia
     arriba o hacia abajo un número especificado de filas. Cuando una
     pantalla se desplaza hacia arriba, la primera línea de la zona se borra;
     las líneas restántes se desplazan hacia arriba y se muestra una línea en
     blanco en el color estándar actual en la .ltima línea de la zona
     especificada. Si la zona se desplaza hacia abajo, la operación.se
     invierte. Si la zona de pantalla se desplaza m.s de una línea, se repite
     este proceso.

     SCROLL() se utiliza principalmente para mostrar información de estado en
     una zona definida de la pantalla. Cada vez que se muestra un mensaje
     nuevo, la zona de la pantalla se desplaza una línea hacia arriba y se
     muestra una nueva línea en la parte inferior.

 Ejemplos

     .  Esta función definida por el usuario muestra una cadena de
        mensaje al final de una zona de pantalla después de desplazarla una
        línea hacia arriba:

        FUNCTION DespArr( nSup, nIzq, nInf, nDer, ;
                             expVisual )
           //
           SCROLL(nSup, nIzq, nInf, nDer, 1)
           @ nInf, nIzq SAY expVisual
           //
           RETURN NIL

 Ficheros: La biblioteca asociada es CLIPPER.LIB.

SECONDS()
 Devuelve el número de segundos transcurridos desde la medianoche
------------------------------------------------------------------------------
 Sintaxis

     SECONDS() --> nSegundos

 Devuelve

     SECONDS() devuelve la hora del sistema como valor numérico en forma de
     segundos.cent.simas. El valor numérico devuelto es el número de segundos
     transcurridos desde medianoche y se basa en un reloj de veinticuatro
     horas con un rango de cero a 86399.

 Descripción

     SECONDS() es una función de tiempo que ofrece un m.todo simple para
     calcular el tiempo transcurrido durante la ejecución de un programa
     bas.ndose en el reloj del sistema. Esta función está relacionada con la
     función TIME() que devuelve la hora del sistema como una cadena con el
     formato hh:mm:ss.

 Ejemplos

     .  Este ejemplo contrasta el valor de TIME() con SECONDS():

        ? TIME()               // Resultado: 10:00:00
        ? SECONDS()            // Resultado: 36000.00

     .  Este ejemplo utiliza SECONDS() para controlar el tiempo
        transcurrido en segundos:

        LOCAL nInicio, nTranscurrido
        nInicio:= SECONDS()
        .
        . <sentencias>
        .
        nTranscurrido:= SECONDS() - nInicio
        ? "Transcurrido: " + LTRIM(STR(nTranscurrido)) + " segundos"

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


SELECT()
 Determina el número de área de trabajo de un alias especificado
------------------------------------------------------------------------------
 Sintaxis

     SELECT([<cAlias>]) --> nAreadeTrabajo

 Argumentos

     <cAlias> es el nombre alias del área de trabajo destáno.

 Devuelve

     SELECT() devuelve el área de trabajo del alias especificado como valor
     numérico entero.

 Descripción

     SELECT() es una función de base de datos que determina el número de .rea
     de trabajo de un alias. El número devuelto puede estar comprendido entre
     cero y 250. Si no se especifica <cAlias>, se devuelve el número del .rea
     de trabajo actual. Si se especifica y el alias no existe, SELECT()
     devuelve cero.

     Nota:  La función SELECT() y el mandato SELECT especificados con un
     argumento de expresión ampliado tienen un aspecto muy similar. Esto no
     debe constituir un problema ya que la función SELECT() no es muy .til en
     s. misma si figura aislada en una línea.

 Ejemplos

     .  Este ejemplo utiliza SELECT() para determinar qu. .rea de
        trabajo ha seleccionado USE...NEW:

        USE Ventas NEW
        SELECT 1
        ? SELECT("Ventas")            // Resultado: 4

     .  Para volver a seleccionar el valor devuelto por la función
        SELECT(), utilice el mandato SELECT con la sintaxis
        SELECT(<idVarmem>), del modo siguiente:

        USE Ventas NEW
        nAreadeTrabajo:= SELECT()
        USE Cliente NEW
        SELECT (nAreadeTrabajo)

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.

SET()
 Comprueba o modifica un valor de configuración del sistema
------------------------------------------------------------------------------
 Sintaxis

     SET(<nEspecificador>, [<expNuevoValor>],
         [<lModoApertura>]) --> ValorActual

 Argumentos

          <nEspecificador> es un valor numérico que identifica al valor que
          debe comprobarse o modificarse. <nEspecificador> debe proporcionarse
          como una constante declarada (ver a continúa.ión).
          <expNuevoAjuste> es un argumento opciónal que indica un valor
          nuevo para <nEspecificador>. El tipo de este argumento depende de
          <nEspecificador>.
          <lModoApertura> es un valor l.gico que indica si los ficheros que
          se abren para los siguientes pr.positos:
          _SET_ALTFILE, _SET_PRINTFILE, _SET_EXTRAFILE
          deber.an truncarse o abrirse en modo de adici.n. Un valor de falso
          (.F.) signfica que el fichero debe truncarse. Un valor de verdadero
          significa que el fichero debe abrirse en modo de adici.n. En
          cualquier caso, si el fichero no existe se crea.
          Si no se especifica este argumento, el valor por defecto es modo de
          adici.n.
 Devuelve

          SET() devuelve el valor de configuración actual de la carácter.stica
          especificada.
 Descripción

          SET() es una función del sistema que le permite comprobar o modificar
          los valores de sistema de CA-Clipper. Para obtener más información
          sobre el significado y valores correctos para un ajuste en concreto,
          consulte el mandato o función asociados.
          Use una constante declarada para especificar el ajuste que deba ser
          comprobado o modificado. Estas constantes se definen en un fichero
          de cabecera llamado Set.ch. Este fichero debe incluirse al principio
          de cualquier módulo fuente que utilice SET().
     Set.ch también define una constante llamada _SET _COUNT. Esta constante
     es igual al número de ajustes que pueden cambiarse o inspeccionarse con
     SET(), permitiendo la construcci.n de una función gen.rica que conserva
     todos los ajustes (consulte el ejemplo que aparece m.s adelante).

          Nota:  Los valores numéricos de las constantes declaradas en
          Set.ch dependen de la versi.n y nunca deben utilizarse directamente,
          siempre deben utilizarse las constantes declaradas.
          Si <nEspecificador> o <expNuevoAjuste> no son víaacute;lidos, se ignora la
          llamada a SET().
     Valores de Set Definidos en Set.ch
     ------------------------------------------------------------------------
     Constante           Tipo de Valor        Mandato o función Asociados
     ------------------------------------------------------------------------
     _SET_EXACT          L.gico               SET EXACT
     _SET_FIXED          L.gico               SET FIXED
     _SET_DECIMALS       numérico             SET DECIMALS
     _SET_DATEFORMAT     C.racter             SET DATE
     _SET_EPOCH          numérico             SET EPOCH
     _SET_PATH           C.racter             SET PATH
     _SET_DEFAULT        C.racter             SET DEFAULT
     _SET_EXCLUSIVE      L.gico               SET EXCLUSIVE
     _SET_SOFTSEEK       L.gico               SET SOFTSEEK
     _SET_UNIQUE         L.gico               SET UNIQUE
     _SET_DELETED        L.gico               SET DELETED
     _SET_CANCEL         L.gico               SETCANCEL()
     _SET_DEBUG          L.gico               ALTD()
     _SET_COLOR          C.racter             SETCOLOR()
     _SET_CURSOR         numérico             SETCURSOR()
     _SET_CONSOLE        L.gico               SET CONSOLE
     _SET_ALTERNATE      L.gico               SET ALTERNATE
     _SET_ALTFILE        C.racter             SET ALTERNATE TO
     _SET_DEVICE         C.racter             SET DEVICE
     _SET_PRINTER        L.gico               SET PRINTER
     _SET_PRINTFILE      C.racter             SET PRINTER TO
     _SET_MARGIN         numérico             SET MARGIN
     _SET_BELL           L.gico               SET BELL
     _SET_CONFIRM        L.gico               SET CONFIRM
     _SET_ESCAPE         L.gico               SET ESCAPE
     _SET_INSERT         L.gico               READINSERT()
     _SET_EXIT           L.gico               READEXIT()
     _SET_INTENSITY      L.gico               SET INTENSITY
     _SET_SCOREBOARD     L.gico               SET SCOREBOARD
     _SET_DELIMITERS     L.gico               SET DELIMITERS
     _SET_DELIMCHARS     C.racter             SET DELIMITERS TO
     _SET_WRAP           L.gico               SET WRAP
     _SET_MESSAGE        numérico             SET MESSAGE
     _SET_MCENTER        L.gico               SET MESSAGE
     ------------------------------------------------------------------------

     Nota:  _SET_EXTRAFILE y _SET_SCROLLBREAK no tienen mandatos
     correspondientes. _SET_EXTRAFILE le permite especificar un fichero
     alternativo adicional y _SET_SCROLLBREAK activar o desactivar la
     interpretaci.n de Ctrl-S.

 Ejemplos

     .  Este ejemplo muestra una función definida por el usuario que
        conserva o restaura toda la configuración. Esta función podr.a
        utilizarse al entrar en un subsistema para garantizar que .ste no
        afecta al estado del programa que lo ha llamado:

        #include "Set.ch"
        //

        FUNCTION EstablecerTodo( aNuevosValores )
           LOCAL aValoresActuales[_SET_COUNT], nActuales
           IF ( aNuevosValores != NIL )   // Establecer los nuevos y  devolver los
        actuales
              FOR nActuales := 1 TO _SET_COUNT
                 aValoresActuales[nActuales] := ;
                    SET(nActuales, aNuevosValores[nActuales])
              NEXT
           ELSE         // Devolver sólo actuales
              FOR nActuales := 1 TO _SET_COUNT
                 aValoresActuales[nActuales] := SET(nActuales)
              NEXT
           ENDIF
           RETURN (aValoresActuales)

 Ficheros:  La biblioteca asociada es CLIPPER.LIB
            y el fichero de cabecera Set.ch.

SETBLINK()
 Activa o desactiva la interpretaci.n del asterisco (*) en la cadena
 SETCOLOR() entre parpadeo e intensidad de fondo
------------------------------------------------------------------------------
 Sintaxis

     SETBLINK([<lActivar/Desactivar>]) --> lValorActual

 Argumentos

     <lActivar/Desactivar> modifica el significado del carácter asterisco
     (*) cuando se encuentra en una cadena SETCOLOR(). Especificando
     verdadero, se establece el parpadeo de los carácteres; falso (.F.)
     establece la intensidad del fondo. El valor por defecto es verdadero
     (.T.).

 Devuelve

     SETBLINK() devuelve el valor de la configuración actual como valor
     l.gico.

 Descripción

     SETBLINK() es una función de entorno que activa o desactiva el atributo
     de parpadeo/intensidad de fondo e informa sobre el estado actual de
     SETBLINK(). Cuando la función est. activada, los carácteres escritos en
     la pantalla parpadean mediante la inclusi.n de un asterisco (*) en una
     cadena de color pasada a SETCOLOR(). Cuando SETBLINK() est. desactivado,
     el asterisco hace que el color del fondo se intensifique. As. pues, los
     atributos de parpadeo e intensidad de fondo no están disponibles a la
     vez.

     Nota:  Esta función sólo tiene sentido en PCs de IBM u ordenadores
     compatibles con dispositivos de visualización CGA, EGA, o VGA.

 Ejemplos

     .  Este ejemplo guarda el estado actual SETBLINK() antes de pasar
        el control a una función definida por el usuario. Tras la devoluci.n
        SETBLINK() se restaura a su valor original:

        lParpAnti := SETBLINK()
        MiFunc()
        SETBLINK(lParpAnti)

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


SETCANCEL()
 Activa o desactiva Alt-C y Ctrl-Intro como teclas de finalizaci.n de programa
------------------------------------------------------------------------------
 Sintaxis

     SETCANCEL([<lActivar/Desactivar>]) --> lAjusteActual

 Argumentos

     <lActivar/Desactivar> modifica la disponibilidad de Alt-C y
     Ctrl-Intro como teclas de finalizaci.n. Un valor de verdadero (.T.)
     permite la utilización de ambas combinaciónes de teclas para finalizar
     una aplicación y un valor de falso (.F.) las desactiva. El valor por
     defecto es verdadero (.T.).

 Devuelve

     SETCANCEL() devuelve el ajuste actual como valor l.gico.

 Descripción

     SETCANCEL() es una función de teclado que activa o desactiva el estado
     de las teclas de finalizaci.n Alt-C y Ctrl-Inter, e informa sobre el
     estado actual de SETCANCEL().

     Tenga en cuenta que si Alt-C o Ctrl-Enter se redefinen con SET KEY, esta
     nueva definición tiene precedencia aunque SETCANCEL() devuelva verdadero
     (.T.).

     .Advertencia!  Cuando se establece SETCANCEL() como falso (.F.), el
     usuario no puede finalizar un programa fuera de control a menos que se
     le proporcione un mecanismo de escape alternativo.

 Ejemplos

     .  Este ejemplo ofrece una vía de escape a partir de un estado de
        espera con la función SET CANCEL() desactivada:

        #define K_ALTC   302
        //
        SETCANCEL(.F.)               // Desactivar teclas de finalizaci.n
        SET KEY K_ALTC TO AltC       // Redefinir Alt-C
        .
        . <sentencias>
        .
        RETURN
        FUNCTION AltC
           LOCAL cPantalla, nOpcion, cúltimoColor := ;
                 SETCOLOR("W/B, N/G")
           //
           SAVE SCREEN TO cPantalla
           @ 6, 20 CLEAR TO 9, 58
           @ 6, 20 TO 9, 58 DOUBLE
           @ 7, 26 SAY "Alt-C: .Desea salir?"
           @ 8, 35 PROMPT " S. "
           @ 8, 41 PROMPT " No "
           MENU TO nOpcion
           SETCOLOR(cúltimoColor)
           RESTORE SCREEN FROM cPantalla
           //
           IF nOpcion = 1
              QUIT
           ENDIF
           //
           RETURN NIL

 Ficheros: La biblioteca asociada es CLIPPER.LIB.


SETCOLOR()
Devuelve los colores actuales y, opciónalmente, establece algunos nuevos
------------------------------------------------------------------------------

Sintaxis

     SETCOLOR([<cCadenaColor>])  cCadenaColor

Argumentos

     <cCadenaColor> es una cadena de carácteres que contiene una lista
     de atributos de color para la posterior salida por pantalla. La
     siguiente es una lista de ajustes y ámbitos relacionados:

     configuraciónes de Color
     ------------------------------------------------------------------------
     configuración      ámbito
     ------------------------------------------------------------------------
     Est.ndar           Todosólos mandatos y funciónes de salida por pantalla
     Resaltado          GET y zonas resaltadas de opciónes
     Borde              Borde alrededor de la pantalla; no se usa en EGA y VGA
     Fondo              No est. admitido
     Sin Selec.         GET sin seleccionar u opción de men. no accesible
     ------------------------------------------------------------------------

     Cada configuración es un par de colores de primer plano y fondo
     separados por un carácter de barra (/) y seguidos por una coma. Todas
     las configuraciónes son opciónales. Si se ignora una configuración,
     se conserva su valor previo estableci.ndose sólo valores nuevos.

Devuelve

     SETCOLOR() devuelve el ajuste de color actual como una cadena de
     carácteres.

Descripción

     SETCOLOR() es una función de pantalla que guarda la configuración de
     color actual o establece nuevos colores para el posterior coloreado
     de la pantalla. Una cadena de color est. formada por varias
     configuraciónes de color, correspondiendo cada color a diferentes
     zonas de la pantalla. Tal y como se ha dicho anteriormente, cada
     configuración consta de un color de primer plano y otro de fondo. El
     primer plano define el color de los carácteres que se muestran en la
     pantalla. El fondo define el color que se muestra detrás del
     carácter. Los espacios y carácteres que no se visualización se
     muestran como fondo.
     En CA-Clipper, las configuraciónes que definen el comportamiento de
     los colores son:

     Est.ndar: La configuración estándar controla todos los mandatos y
     funciónes de consola, pantalla completa e interfaz cuando se muestran
     en la pantalla. Esto incluye mandatos como @...PROMPT, @...SAY y ? y
     funciónes como ACHOICE(), DBEDIT() y MEMOEDIT().

     Resaltado: La configuración resaltada controla la visualización
     de las zonas resaltadas. Esto incluye GET si se ha establecido SET
     INTENSITY ON y las zonas resaltadas de selecci.n de MENU TO, DBEDIT()
     y ACHOICE().

     Borde: El borde es un .rea situada alrededor de la pantalla en la
      cual no puede escribirse.

     Fondo: El fondo no se utiliza.

     Sin selecionar: Esta configuración se usa para visualizar los GET
     no seleccionados y las opciónes de men. no disponibles.  Además de los
     colores, los ajustes de primer plano pueden tener atributos de
     intensidad alta y/o parpadeo. Con una pantalla monocroma, la intensidad
     alta aumenta el brillo del texto. Con una pantalla en color, la
     intensidad cambia la tonalidad del color especificado. Por ejemplo, "N"
     muestra el texto de primer plano en negro mientras que "N+" lo muestra
     en gris. La intensidad alta viene indicada mediante "+". El atributo de
     parpadeo hace que el texto de primer plano aparezca y desaparezca a
     intervalos r.pidos. Este atributo se indica mediante "*". El carácter
     de atributo puede estar en cualquier punto de la cadena de configuración,
     pero siempre afecta al color de primer plano con independencia del lugar
     en que se introduzca.

     Se admiten los siguientes colores:

     Lista de Colores
     ------------------------------------------------------------------------
     Color           Letra           Monocromo
     ------------------------------------------------------------------------
     Negro           N, Espacio      Negro
     Azul            B               Subrayado
     Verde           G               Blanco
     Cian            BG              Blanco
     Rojo            R               Blanco
     Magenta         RB              Blanco
     Marr.n          GR              Blanco
     Blanco          W               Blanco
     Gris            N+              Blanco
     Azul Intenso    B+              Subr. Intenso
     Verde Intenso   G+              Blanco Intenso
     Cian Intenso    BG+             Blanco Intenso
     Rojo Intenso    R+              Blanco Intenso
     Magenta Int.    RB+             Blanco Intenso
     Amarillo        GR+             Blanco Intenso
     Blanco Intenso  W+              Blanco Intenso
     Negro           U               Subrayado
     V.deo Inverso   I               V.deo Inverso
     En Blanco       X               En Blanco
     ------------------------------------------------------------------------

 Notas

     .  Argumentos no especificados: Al contrario que SET COLOR
        TO, SETCOLOR() sin argumentos no restaura los colores a sus valores
        por defecto.

     .  números de colores: SETCOLOR() admite combinaciónes de
        letras de colores pero no de números de colores.

 Ejemplos

     .  Este ejemplo asigna la configuración de color actual a la
        variable cColor:

        cColor:= SETCOLOR()

     .  Este ejemplo utiliza SETCOLOR() para guardar la configuración
        de color actual y establecer una nueva.

        cColorNuevo:= "BR+/N, R+/N"
        cColorAntiguo:= SETCOLOR(cColorNuevo)

     .  Este ejemplo utiliza SET COLOR TO para volver a establecer los
        colores por defecto:

        SET COLOR TO
        ? SETCOLOR()            // Resultado: W/N, N/W, N, N, N/W

     .  Estos dos ejemplos especifican SETCOLOR() sin algunas
        configuraciónes:

        // configuraciónes omitidas
        SETCOLOR("W/N, BG+/B")
        //
        // configuraciónes ignoradas dentro de la lista
        SETCOLOR("W/N, BG+/B,,,W/N")

     .  Este ejemplo utiliza SETCOLOR() con ISCOLOR() para establecer
        los colores, dependiendo del tipo de pantalla:

        FUNCTION ColoresDefecto
           IF ISCOLOR()
              cFormulario := "W+/N, BG+/B,,,W/N"
              cDialogo := "N/N+, BG+/B,,,N/N+"
              cAviso := "W+/R, BG+/B,,,W+/R"
           ELSE
              cFormulario := "W+/N, N/W,,,W/N"
              cDialogo := "W+/N, N/W,,,W/N"
              cAviso := "W+/N, N/W,,,W/N"
           ENDIF
           RETURN NIL

 Ficheros: La biblioteca asociada es CLIPPER.LIB.

SETCURSOR()
 Establece la forma del cursor
------------------------------------------------------------------------------
 Sintaxis

     SETCURSOR([<nFormaCursor>]) --> nFormaActual

 Argumentos

     <nFormaCursor> es un número que indica la forma del cursor. Para
     códigos sencillos, el fichero de cabecera Setcurs.ch ofrece nombres
     descriptivos para las diversas formas del cursor tal y como se muestra
     en la siguiente tabla:

     Formas del Cursor
     ------------------------------------------------------------------------
     Formas                   Valor    Setcurs.ch
     ------------------------------------------------------------------------
     Ninguna                  0        SC_NONE
     Subrayado                1        SC_NORMAL
     Bloque medio inferior    2        SC_INSERT
     Bloque completo          3        SC_SPECIAL1
     Bloque medio superior    4        SC_SPECIAL2
     ------------------------------------------------------------------------

 Devuelve

     SETCURSOR() devuelve la forma actual del cursor como valor numérico.

 Descripción

     SETCURSOR() es una función de entorno que controla la forma del cursor
     de pantalla. La forma real depende del controlador actual de la
     pantalla. Las formas especificadas aparecen en PC de IBM y ordenadores
     compatibles. En otros ordenadores, el aspecto puede diferir para cada
     valor especificado.

     SETCURSOR(0) equivale a SET CURSOR OFF y cualquier valor entero positivo
     de <nFormaCursor> menor que 5 equivale a SET CURSOR ON. El cursor se
     muestra con la forma seleccionada.

 Ejemplos

     .  Este ejemplo utiliza SETCURSOR() para que el cursor adopte la
        forma de bloque completo para el READ posterior. Una vez finalizado
        el READ, SETCURSOR() desactiva el cursor:

        #include "Setcurs.ch"
        //
        USE Cliente NEW
        @ 10, 10 GET Cliente->Nombre
        @ 11, 10 GET Cliente->Telefono
        //
        SETCURSOR(SC_SPECIAL1)         // Cambiar el cursor a bloque
        READ
        SETCURSOR(SC_NONE)             // Desactivar cursor

 Ficheros: La biblioteca asociada es CLIPPER.LIB
            y el fichero de cabecera Setcurs.ch.

SETKEY()
 Asigna un bloque de acci.n a una tecla
------------------------------------------------------------------------------
 Sintaxis

     SETKEY(<nC.digoInkey>, [<bAcción>]) --> bAcciónActual

 Argumentos

     <nC.digoInkey> es el valor INKEY() de la tecla a la que va a
     asociarse la acci.n o que va a consultarse.

     <bAcción> especifica un bloque de código que se ejecuta
     autom.ticamente siempre que se pulsa la tecla especificada durante un
     estado de espera.

 Devuelve

     SETKEY() devuelve el bloque de acci.n asociado actualmente a la tecla
     especificada o NIL si dicha tecla no est. asociada a ningún bloque.

 Descripción

     SETKEY() es una función de teclado que establece o consulta la acci.n
     autom.tica asociada a una tecla determinada durante un estado de espera.
     Un estado de espera es cualquier modo que lee del teclado a excepci.n de
     INKEY(), pero incluyendo ACHOICE(), DBEDIT(), MEMOEDIT(), ACCEPT, INPUT,
     READ y WAIT. Pueden asignarse hasta 32 teclas a la vez. Al arrancar, el
     sistema asigna autom.ticamente la tecla F1 para ejecutar u procedimiento
     o función definida por el usuario denominado Help.

     Cuando se pulsa una tecla asignada durante un estado de espera, la
     función EVAL() eval.a la <bAcción> asociada y los parámetros PROCNAME(),
     PROCLINE() y READVAR(). Sin embargo, no es necesario listar los
     argumentos al especificar <bAcción> si no se van a utilizar dentro del
     bloque de acci.n.

     SETKEY() es como el mandato SET KEY que asocia una llamada a un
     procedimiento a una tecla.

 Ejemplos

     .  Este fragmento de código asocia un bloque de acci.n a una
        tecla, después, tras obtener una tecla con INKEY(), la ejecuta con la
        función EVAL():

        #include "Inkey.ch"
        SETKEY(K_DN, {|cProc, nLinea, cVar| MiProc(cProc, ;
                          nLinea, cVar)})
        .
        . <sentencias>
        .
        DO WHILE .T.
           nTecla := INKEY(0)
           DO CASE
           CASE (bAcción := SETKEY(nTecla)) != NIL
              EVAL(bAcción, PROCNAME(), PROCLINE(), READVAR())
           CASE nTecla = K_PGUP
              Previous()
           CASE nTecla = K_PGDN
              Next()
           CASE nTecla = K_ESC
              EXIT
           ENDCASE
        ENDDO

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


SETMODE()
 Cambia el modo de visualización a un número especificado de filas y columnas
------------------------------------------------------------------------------
 Sintaxis

     SETMODE(<nFilas>, <nCols>) --> lCorrecto

 Argumentos

     <nFilas> es el número de filas en el modo de visualización deseado.

     <nCols> es el número de columnas en el modo de visualización
     deseado.

 Devuelve

     SETMODE() devuelve verdadero (.T.) si el cambio de modo ha sido
     satisfactorio; en caso contrario, devuelve falso (.F.).

 Descripción

     SETMODE() es una función de entorno que intenta cambiar el modo del
     dispositivo de visualización para que coincida con el número de filas y
     columnas especificado. El cambio en el tama.o de la pantalla se refleja
     en los valores devueltos por MAXROW() y MAXCOL().

 Ejemplos

     .  Este ejemplo cambia a un modo de visualización de 43 líneas:

        IF SETMODE(43, 80)
           ? "modo de 43 líneas establecido con .xito"
        ELSE
           ? "modo de 43 líneas no disponible"
        ENDIF

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.

SETPOS()
 Desplaza el cursor a una nueva posición
------------------------------------------------------------------------------
 Sintaxis

     SETPOS(<nFila>, <nCol>) --> NIL

 Argumentos

     <nFila> y <nCol> definen la nueva posición de pantalla del
     cursor. Estos valores pueden estar comprendidos entre 0,0 y MAXROW(),
     MAXCOL().

 Devuelve

     SETPOS() siempre devuelve NIL.

 Descripción

     SETPOS() es una función de entorno que desplaza el cursor a una nueva
     posición en la pantalla. Una vez situado el cursor, ROW() y COL() se
     actualizan en consecuencia. Para controlar la forma y visibilidad del
     cursor, utilice la función SETCURSOR().

 Ejemplos

     .  Este ejemplo desplaza el cursor a una nueva posición, después
        muestra una cadena en la pantalla utilizando un mandato de consola,
        ??:

        SETPOS(1, 1)
        ?? "Hola a todos"

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.

SETPRC()
 Establece los valores PROW() y PCOL()
------------------------------------------------------------------------------
 Sintaxis

     SETPRC(<nFila>, <nCol>) --> NIL

 Argumentos

     <nFila> es el nuevo valor de PROW().

     <nCol> es el nuevo valor de PCOL().

 Devuelve

     SETPRC() siempre devuelve NIL.

 Descripción

     SETPRC() es una función de impresora que envía códigos de control a la
     impresora sin cambiar la posición de la cabeza de impresión. Cuando CA-
     Clipper imprime, actualiza el valor de PCOL() con el número de
     carácteres envíado a la impresora. No existe diferencia entre carácteres
     que pueden imprimirse y aqu.llos que no pueden hacerlo. Si, por ejemplo,
     se envía a la impresora una cadena de diez carácteres que contiene dos
     carácteres interpretados como código de control por la impresora, el
     valor de PCOL() de CA-Clipper se incrementa en diez mientras que la
     posición real de la cabeza de impresión sólo se desplaza ocho. Esto
     puede llevar a problemas de alíneaci.n. Mediante el uso de SETPRC()
     puede compensar estos códigos de control volviendo a establecer PCOL()
     tal y como se muestra en el ejemplo que aparece m.s adelante.

     SETPRC() también suprime los saltos de p.gina al imprimir con @...SAY.
     Esto es importante cuando la siguiente posición de fila es menor que la
     fila actual y no se ha ejecutado un EJECT. En esta situaci.n, CA-Clipper
     ejecuta un salto de p.gina autom.tico si la siguiente posición de
     impresi.n de fila es menor que el valor actual de PROW(). Con SETPRC(),
     puede establecer PROW() a un número inferior a la fila actual,
     eliminando as. el EJECT autom.tico.

 Ejemplos

     .  Esta función definida por el usuario, ImprimirCodigos(),
        utiliza SETPRC() para envíar códigos de control a la impresora sin
        afectar a los valores de PROW() y PCOL():

           #include "Set.ch"
           #define ITALICS_ON CHR(27) + "I"
           #define ITALICS_OFFCHR(27) + "E"
           //
           SET DEVICE TO PRINTER
           @ 12, 10 SAY "Se trata de una"
           @ PROW(), PCOL() + 2 SAY ImprimirCodigos(ITALICS_ON) + ;
                 "importante"
           @ PROW(), PCOL() + 2 SAY ImprimirCodigos(ITALICS_OFF) + ;
                 "reuni.n"
           SET DEVICE TO SCREEN
           RETURN

           FUNCTION ImprimirCodigos( cCodigoCtrl )
             LOCAL nFila, nCol, lImpresora
             lImpresora := SET(_SET_PRINTER, .T.)  // SET PRINTER ON
             nFila:= PROW()                        // Guardar posición cabeza
                                                   // de impresión
             nCol:= PCOL()
             //
             ?? cCodigoCtrl                        // Envíar código de control
             //
             SETPRC(nFila, nCol)
             SET(_SET_PRINTER, lImpresora)         // Recuperar parámetros
                                                   // de impresora
             RETURN ""                             // Devolver una cadena nula

 Ficheros:   La biblioteca asociada es CLIPPER.LIB.

SOUNDEX()
 Convierte una cadena de carácteres en su cadena de similitud fon.tica
------------------------------------------------------------------------------
 Sintaxis

     SOUNDEX(<cCadena>) --> cCadenaSimilFon

 Argumentos

     <cCadena> es la cadena de carácteres que debe convertirse.

 Devuelve

     SOUNDEX() devuelve una cadena de carácteres de cuatro dígitos en la
     forma A999.

 Descripción

     SOUNDEX() es una función de carácteres que indexa y busca coincidencias
     fon.ticas o sonidos similares. Se utiliza en aplicaciónes en las que no
     se conoce la ortograf.a precisa de las claves de carácteres o en las que
     existe una probabilidad alta de nombres mal escritos. Los errores
     ortogr.ficos son muy normales en sistemas de transacci.n en tiempo real
     en los que el operador de entrada de datos recibe la información a
     trav.s del tel.fono. SOUNDEX() funcióna reuniendo los sonidos semejantes
     bajo el mismo valor clave. Sin embargo, tenga en cuenta que el m.todo de
     similitud fon.tica no es absoluto. Claves que son bastante diferentes
     pueden dar como resultado el mismo valor de similitud fon.tica.

 Ejemplos

     .  Este ejemplo genera un ííndice utilizando SOUNDEX() para crear
        los valores claves. Despu.s, busca un valor encontrado en el campo
        Vendedor:

        USE Ventas
        INDEX ON SOUNDEX(Vendedor) TO Vendedor
        SEEK SOUNDEX("Pedrol")
        ? FOUND(), Vendedor            // Resultado: .T. Pedrol

     .  Aqu., se busca la misma clave que en el ejemplo anterior pero
        con una ortograf.a diferente:

        SEEK SOUNDEX("Pedroll")
        ? FOUND(), Vendedor            // Resultado: .T. Pedrol

 Ficheros:  La biblioteca asociada es EXTEND.LIB
            y el fichero fuente SOURCE\SAMPLE\SOUNDEX.C

SPACE()
 Devuelve una cadena de espacios
------------------------------------------------------------------------------
 Sintaxis

     SPACE(<nEspacios>) --> cEspacios

 Argumentos

     <nEspacios> es el número de espacios que va a devolverse hasta un
     máximo de 65.535 (64K).

 Devuelve

     SPACE() devuelve una cadena de carácteres. Si <nEspacios> es cero,
     SPACE() devuelve una cadena nula ("").

 Descripción

     SPACE() es una función de carácteres que devuelve un número especificado
     de espacios. Equivale a REPLICATE(" ", <nVeces>). SPACE() puede
     inicializar una variable de carácteres antes de asociarla a un GET.
     SPACE() puede también rellenar cadenas con espacios iniciales o finales.
     Sin embargo, tenga en cuenta que para este prop.sito son m.s eficaces
     las funciónes PAD(), PADL() y PADR().

 Ejemplos

     .  Este ejemplo utiliza SPACE() para inicializar una variable
        para entrada de datos:

        USE Cliente NEW
        MEMVAR->Nombre = SPACE(LEN(Cliente->Nombre))
        @ 10,10 SAY "Nombre Cliente" GET MEMVAR->Nombre
        READ

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.


SQRT()
 Devuelve la ra.z cuadrada de un número positivo
------------------------------------------------------------------------------
 Sintaxis

     SQRT(<nNúmero>) --> nRa.z

 Argumentos

     <nNúmero> es un número positivo del cual va a extraerse la ra.z
     cuadrada.

 Devuelve

     SQRT() devuelve un valor numérico calculado con doble precisión. El
     número de lugares decimales mostrado se determina mediante SET DECIMALS
     sin tener en cuenta SET FIXED. Si <nNúmero> es negativo, SQRT devuelve
     cero.

 Descripción

     SQRT() es una función numérica utilizada en cualquier parte de un
     c.lculo numérico para hallar una ra.z cuadrada (por ejemplo, en una
     expresión que calcule la desvíaci.n estándar).

 Ejemplos

     .  Estos ejemplos muestran varios resultados de SQRT():

        SET DECIMALS TO 5
        //
        ? SQRT(2)                  // Resultado: 1,41421
        ? SQRT(4)                  // Resultado: 2,00000
        ? SQRT(4) ** 2             // Resultado: 4,00000
        ? SQRT(2) ** 2             // Resultado: 2,00000

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.

STR()
 Convierte una expresión numérica en una cadena de carácteres
------------------------------------------------------------------------------
 Sintaxis

     STR(<nNúmero>, [<nLongitud>], [<nDecimales>]) --> cnúmero

 Argumentos

     <nNúmero> es la expresión numérica que va a convertirse en una
     cadena de carácteres.

     <nLongitud> es la longitud de la cadena de carácteres que debe
     devolverse, incluyendo dígitos decimales, coma decimal y signo.

     <nDecimales> es el número de posiciónes decimales que hay que
     devolver.

 Devuelve

     STR() devuelve <nNúmero> con formato de cadena de carácteres. Si no se
     especifican los argumentos opciónales de longitud y decimales, STR()
     devuelve la cadena de carácteres de acuerdo con las siguientes reglas:

     Resultados de STR() sin Argumentos Opcionales
     ------------------------------------------------------------------------
     Expresi.n            Longitud de Retorno
     ------------------------------------------------------------------------
     Variable de campo    Longitud del campo m.s decimales
     Expr./constantes     M.nimo de 10 dígitos m.s decimales
     VAL()                M.nimo de 3 dígitos
     MONTH()/DAY()        3 dígitos
     YEAR()               5 dígitos
     RECNO()              7 dígitos
     ------------------------------------------------------------------------

 Descripción

     STR() es una función de conversión numérica que convierte valores
     numéricos en cadenas de carácteres. Se utiliza con frecuencia para
     concatenar valores numéricos a cadenas de carácteres. STR() tiene
     aplicaciónes mostrando números, creando códigos a partir de valores
     numéricos como, por ejemplo, números de referencia y creando claves de
     índice que combinan datos numéricos y de tipo carácter.

     STR() es similar a TRANSFORM(), que da formato a valores numéricos como
     cadenas de carácteres útilizando una m.scara en lugar de
     especificaciónes de longitud y decimales.

     La función inversa de STR() es VAL() que convierte valores de tipo
     carácter en números.

 Notas

     .  Si <nLongitud> es menor que el número de dígitos de número
        entero de <nNúmero>, STR() devuelve asteriscos en vez del número.

     .  Si <nLongitud> es menor que el número de dígitos decimales
        necesarios para la parte decimal de la cadena de retorno, CA-Clipper
        redondea el número al número disponible de posiciónes decimales.

     .  Si se especifica <nLongitud>, pero se omite <nDecimales> (sin
        lugares decimales), el valor de retorno se redondea a un entero.

 Ejemplos

     .  Estos ejemplos demuestran el rango de valores devueltos por
        STR(), dependiendo de los argumentos especificados:

        nNúmero:= 123.45
        ? STR(nNúmero)                     // Resultado: 123.45
        ? STR(nNúmero, 4)                  // Resultado: 123
        ? STR(nNúmero, 2)                  // Resultado: **
        ? STR(nNúmero * 10, 7, 2)          // Resultado: 1234.50
        ? STR(nNúmero * 10, 12, 4)         // Resultado: 1234.5000
        ? STR(nNúmero, 10, 1)              // Resultado: 1234.5

     .  Este ejemplo utiliza STR() para crear un ííndice con una clave
        compuesta de números de pedido y nombres de cliente:

        USE Cliente NEW
        INDEX ON STR(NumPedido, 9) + NomClien TO PedClien

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.

STRTRAN()
 Busca y sustituye carácteres dentro de una cadena de carácteres o campo memo
------------------------------------------------------------------------------
 Sintaxis

     STRTRAN(<cCadena>, <cB.squeda>, [<cSustituir>], [<nInicio>],
             [<nNúmero>]) --> cNuevaCadena

 Argumentos

     <cCadena> es la cadena de carácteres o campo memo en los que debe
     realizarse la b.squeda.

     <cB.squeda> es la secuencia de carácteres que hay que encontrar.

     <cSustituir> es la secuencia de carácteres que va a sustituir a
     <cB.squeda>. Si no se especifica este argumento,  las apariciones
     especificadas del argumento de b.squeda se sustituyen por una cadena
     vac.a ("").

     <nInicio> es la primera aparici.n que debe sustituirse. Si se ignora
     este argumento, el valor por defecto es uno.

     <nNúmero> es el número de apariciones que deben sustituirse. Si no
     se especifica, el valor por defecto es todas.

 Devuelve

     STRTRAN() devuelve una nueva cadena de carácteres con los casos
     especificados de <cB.squeda> reemplazados por <cSustituir>.

 Descripción

     STRTRAN() es una función de carácteres que lleva a cabo la b.squeda
     estándar de una subcadena dentro de una cadena de carácteres. Cuando
     localiza una coincidencia, sustituye la cadena buscada por la cadena de
     sustituci.n especificada. Se sustituyen todas las apariciones de
     <cB.squeda> a menos que se especifique <nInicio> o <nNúmero>. Tenga en
     cuenta que STRTRAN() sustituye subcadenas y, por lo tanto, no tiene en
     cuenta palabras enteras.

 Ejemplos

     .  Este ejemplo utiliza STRTRAN() para establecer un an.logo
        postmoderno a una famosa cita:

        cCadena:= "Calcular o no calcular?"
        ? STRTRAN(cCadena, "calcular", "ser")
        // Resultado:  Ser o no ser?

 Ficheros:  La biblioteca asociada es CLIPPER.LIB.

STUFF()
 Borra e inserta carácteres en una cadena
------------------------------------------------------------------------------
 Sintaxis

     STUFF(<cCadena>, <nInicio>, <nBorrar>, <cInsertar>) --> cNuevaCadena

 Argumentos

     <cCadena> es la cadena de carácteres destáno en la que se insertan y
     borran carácteres.

     <nInicio> es la posición inicial en la que se produce la
     inserci.n/borrado.

     <nBorrar> es el número de carácteres que hay que borrar.

     <cInsertar> es la cadena que debe insertarse.

 Devuelve

     STUFF() devuelve una copia de <cCadena> con los carácteres especificados
     borrados y con <cInsertar> insertada.

 Descripción

     STUFF() es una función de carácteres que borra <nBorrar> carácteres de
     <cCadena> empezando en la posición <nInicio>. A continúa.ión, inserta
     <cInsertar> en la cadena resultante empezando en la posición <nInicio>
     para formar la cadena de retorno. De esta forma, STUFF() puede realizar
     las seis operación.s siguientes:

     .  Insertar: Si <nBorrar> es cero, no se suprimen carácteres
        de <cCadena>. <cInsertar> se inserta en <nInicio> y se devuelve toda
        la cadena. Por ejemplo STUFF("Mi perro tiene pulgas." 16, 0, "no ")
        devuelve "Mi perro no tiene pulgas".

     .  Sustituir: Si <cInsertar> tiene la misma longitud que
        <nBorrar>, <cInsertar> sustituye los carácteres empezando en
        <nInicio> y la cadena resultante tiene la misma longitud que la
        original. Por ejemplo, STUFF("Mi perro tiene pulgas.", 16, 6,
        "huesos") devuelve "Mi perro tiene huesos".

     .  Borrar: Si <cInsertar> es una cadena nula (""), se borra
        de <cCadena> el número de carácteres especificado por <nBorrar> y la
        cadena se devuelve sin ningún carácter a.adido. Por ejemplo,
        STUFF("Mi perro tiene pulgas.", 1, 3, "") devuelve "perro tiene
        pulgas".

     .  Sustituir e insertar: Si <cInsertar> es m.s largo que
        <nBorrar>, se sustituyen todos los carácteres desde <nInicio> hasta
        <nBorrar> y se inserta el resto de <cInsertar>. Puesto que se
        insertan m.s carácteres de los que se borran, la cadena resultante
        siempre es m.s larga que la original. Por ejemplo, STUFF("Mi perro
        tiene pulgas.", 10, 5, "nunca ha tenido") devuelve "Mi perro nunca ha
        tenido pulgas".

     .  Sustituir y borrar: Si la longitud de <cInsertar> es menor
        que <nBorrar>, se borran m.s carácteres de los que se insertan. Por
        lo tanto, la cadena resultante es m.s corta que la original. Por
        ejemplo, STUFF("Mi perro tiene pulgas.", 10, 5, "es") devuelve "Mi
        perro es pulgas".

     .  Sustituir y borrar el resto: Si <nBorrar> es mayor o igual
        que el número de carácteres restántes de <cCadena> empezando por
        <nInicio>, los carácteres restántes se borran antes de insertar
        <cInsertar>. Por ejemplo, STUFF("Mi perro tiene pulgas.", 10, 13,
        "es") devuelve "Mi perro es".

 Ejemplos

     .  Estos ejemplos demuestran las seis operación.s b.sicas de
        STUFF():

        // InsertAR
        ? STUFF("ABCDEF", 2, 0, "xyz")         // Resultado: AxyzBCDEF
        // Sustituir
        ? STUFF("ABCDEF", 2, 3, "xyz")         // Resultado: AxyzEF
        // Borrar
        ? STUFF("ABCDEF", 2, 2, "")            // Resultado: ADEF
        // Sustituir e insertar
        ? STUFF("ABCDEF", 2, 1, "xyz")         // Resultado: AxyzCDEF
        // Sustituir y borrar
        ? STUFF("ABCDEF", 2, 4, "xyz")         // Resultado: AxyzF
        // Sustituir y borrar resto
        ? STUFF("ABCDEF", 2, 10, "xyz")        // Resultado: Axyz

Ficheros: La biblioteca asociada es EXTEND.LIB,
           el módulo fuente asociado: SOURCE\SAMPLE\STUFF.C.


SUBSTR()
 Extrae una subcadena de una cadena de carácteres
------------------------------------------------------------------------------
 Sintaxis

     SUBSTR(<cCadena>, <nInicio>, [<nCaracteres>]) --> cSubcadena

 Argumentos

     <cCadena> es la cadena de carácteres de la que va a extraerse una
     subcadena. Puede tener hasta 65.535 (64K) bytes, el tama.o máximo de
     cadena en CA-Clipper.

     <nInicio> es la posición inicial en <cCadena>. Si <nInicio> es
     positivo, es relativo al carácter situado en el extremo izquierdo de
     <cCadena>. Si es negativo, es relativo al carácter situado en el extremo
     derecho de <cCadena>.

     <nCaracteres> es el número de carácteres que hay que extraer. Si se
     omite, la subcadena empieza en <nInicio> y continúa.hasta el final de la
     cadena. Si <nCaracteres> es mayor que el número de carácteres desde
     <nInicio> hasta el final de <cCadena>, los carácteres adicionales se
     ignoran.

 Devuelve

     SUBSTR() devuelve una cadena de carácteres.

 Descripción

     SUBSTR() es una función de carácteres que extrae una subcadena de otra
     cadena de carácteres o campo memo. SUBSTR() está relacionada con las
     funciónes LEFT() y RIGHT() que extraen subcadenas empezando por los
     carácteres situados m.s a la izquierda y a la derecha de <cCadena>,
     respectivamente.

     Las funciónes SUBSTR(), RIGHT() y LEFT() se utilizan muy a menudo con
     AT() y RAT() para localizar la primera y/o .ltima posición de una
     subcadena antes de extraerla. También se utilizan para mostrar o
     imprimir sólo una parte de una cadena de carácteres.

 Ejemplos

     .  Estos ejemplos extraen el nombre y apellido de una variable:

        cNombre:= "Juan Pedralbes"
        ? SUBSTR(cNombre, 1, 4)                      // Resultado: Juan
        ? SUBSTR(cNombre, 6)                         // Resultado: Pedralbes
        ? SUBSTR(cNombre, LEN(cNombre) + 2)          // Resultado:
                                                     // cadena nula
        ? SUBSTR(cNombre, -9)                        // Resultado: Pedralbes
        ? SUBSTR(cNombre, -9, 3)                     // Resultado: Ped

     .  Este ejemplo utiliza SUBSTR() con AT() y RAT() para crear una
        función que extrae un nombre de fichero de una especificación de
        fichero:

        ? FichBase("C:\PRG\MIFICHE.OBJ")             // Resultado: MIFICHE.OBJ

        FUNCTION FichBase( cFichero )
           LOCAL nPos
           IF (nPos := RAT("\", cFichero)) != 0
              RETURN SUBSTR(cFichero, nPos + 1)
           ELSEIF (nPos := AT(":", cFichero)) != 0
              RETURN SUBSTR(cFichero, nPos + 1)
           ELSE
              RETURN cFichero
           ENDIF

 Ficheros: La biblioteca asociada es CLIPPER.LIB.