Eurowin 8.0 SQL Manual de
GENLIS
Documento: Edición: Nombre: Fecha:
me_genlis 03 Manual de Genlis 22-12-2010
Manual de Genlis
Tabla de contenidos 1. Introducción ........................................................................................................................... 8 1.1. Ver gráficos, informes y etiquetas ...................................................................................................... 8 1.2. Generar, modificar y borrar gráficas .................................................................................................. 9 1.2.1. Borrar gráfica ................................................................................................................................ 9 1.2.2. Ver gráfica .................................................................................................................................... 9 1.2.3. Crear una nueva gráfica ................................................................................................................ 9 1.2.4. Modificar informe y restablecer ..................................................................................................... 9 1.2.5. Asistente para crear nuevas gráficas ........................................................................................... 10 1.3. Generar nuevos informes ................................................................................................................. 10 1.3.1. Borrar listado .............................................................................................................................. 10 1.3.2. Ver listado ................................................................................................................................... 10 1.3.3. Crear un nuevo listado ................................................................................................................ 11 1.3.4. Modificar y restablecer informe ................................................................................................... 11 1.3.5. Asistente para crear nuevos listados ........................................................................................... 11 1.4. Generar nuevas etiquetas ................................................................................................................ 12 1.4.1. Borrar etiqueta ............................................................................................................................ 12 1.4.2. Ver etiqueta ................................................................................................................................ 12 1.4.3. Crear una nueva etiqueta ............................................................................................................ 12 1.4.4. Modificar report asociado y restablecerlo .................................................................................... 12 1.4.5. Asistente para crear nuevas etiquetas......................................................................................... 13 1.5. Generar nuevas consultas ................................................................................................................ 13
2. Editor de informes ................................................................................................................ 16 2.1. Planificar la distribución del informe ................................................................................................ 17 2.1.1. Determinar la distribución general ............................................................................................... 17 2.1.2. Descripción de los archivos de distribución de informes ............................................................. 18 2.1.3. Modificar la distribución .............................................................................................................. 19 2.1.4. Planificar la ubicación de los datos ............................................................................................. 20 2.1.5. Agregar controles de informe ...................................................................................................... 21 2.1.6. Agregar controles de campo ...................................................................................................... 22 2.1.7. Agregar controles de etiquetas ................................................................................................... 22 2.1.8. Agregar un campo de tipo general .............................................................................................. 23 2.1.9. Seleccionar, mover y ajustar el tamaño de informe ..................................................................... 24 2.1.10. Copiar y eliminar controles de informe ...................................................................................... 25 2.1.11. Alinear controles ....................................................................................................................... 25 2.1.12. Ajustar la posición del control ................................................................................................... 27 2.1.13. Agrupar datos en la distribución ............................................................................................... 27
1
Manual de Genlis
2.1.14. Agregar un único grupo ............................................................................................................ 28 2.1.15. Agrupar múltiples grupos de datos ........................................................................................... 29 2.1.16. Cambiar una banda de grupos ................................................................................................. 30 2.1.17. Alinear una banda de grupo ...................................................................................................... 30 2.1.18. Cambiar el orden de agrupamiento ........................................................................................... 31 2.1.19. Personalizar la distribución ........................................................................................................ 31 2.1.20. Definir la página del informe ...................................................................................................... 32 2.1.21. Dar formato a los controles de campo ...................................................................................... 33 2.1.22. Agregar líneas, rectángulos y círculos ....................................................................................... 35 2.1.23. Agregar una imagen ................................................................................................................. 37 2.1.24. Cambiar el color de los controles .............................................................................................. 38 2.1.25. Agregar un comentario a un control .......................................................................................... 39 2.1.26. Vista e impresión de su informe o etiqueta ................................................................................ 39 2.1.27. Vista de los resultados .............................................................................................................. 39 2.1.28. Imprimir informes ...................................................................................................................... 40
3. SQL (SELECT) ...................................................................................................................... 42 3.1. Sintaxis ............................................................................................................................................. 42 3.2. Argumentos ...................................................................................................................................... 42 3.2.1. Comentarios ............................................................................................................................... 49
4. Instrucciones avanzadas ...................................................................................................... 52 4.1. Conceptos básicos de programación .............................................................................................. 52 4.1.1. Almacenar datos: Tipos de datos y campos, contenedores ........................................................ 52 4.1.2. Manipular datos: Operadores, funciones y comandos ................................................................ 54 4.1.2.1. Usar Operadores.................................................................................................................................. 54 4.1.2.2. Usar funciones ..................................................................................................................................... 57 4.1.2.3. Usar comandos ................................................................................................................................... 58
4.1.3. Control del flujo del programa ..................................................................................................... 58
5. Lista de funciones agrupadas por tipo ................................................................................. 62 5.1. Funciones de tipo Character ............................................................................................................ 62 5.2. Funciones de conversión de datos .................................................................................................. 63 5.3. Funciones de fecha y hora ............................................................................................................... 64 5.4. Funciones numéricas ....................................................................................................................... 65 5.5. Funciones y comandos ordenados alfabéticamente ....................................................................... 66 5.5.1. $ (Operador) ............................................................................................................................... 66 5.5.2. % (Operador) .............................................................................................................................. 67 5.5.3. & (Comando)............................................................................................................................... 67 5.5.4. && (Comando) ............................................................................................................................ 68 5.5.5. * (Comando) ............................................................................................................................... 69 5.5.6. = (Comando)............................................................................................................................... 69 5.5.7. ABS( ) (Función) .......................................................................................................................... 70
2
Manual de Genlis
5.5.8. ACOPY( ) (Función) ..................................................................................................................... 70 5.5.9. ACOS( ) (Función) ....................................................................................................................... 71 5.5.10. ADEL( ) (Función) ...................................................................................................................... 72 5.5.11. AELEMENT( ) (Función) ............................................................................................................. 72 5.5.12. AINS( ) (Función) ....................................................................................................................... 73 5.5.13. ALEN( ) (Función) ...................................................................................................................... 74 5.5.14. ALLTRIM( ) (Función) ................................................................................................................. 75 5.5.15. APPEND (Comando) ................................................................................................................. 75 5.5.16. APPEND FROM (Comando) ...................................................................................................... 76 5.5.17. APPEND FROM ARRAY (Comando) ......................................................................................... 81 5.5.18. ASC( ) (Función) ........................................................................................................................ 83 5.5.19. ASCAN( ) (Función) ................................................................................................................... 84 5.5.20. ASIN( ) (Función) ....................................................................................................................... 85 5.5.21. ASORT( ) (Función) ................................................................................................................... 85 5.5.22. ASSERT (Comando) ................................................................................................................. 87 5.5.23. ASUBSCRIPT( ) (Función) ......................................................................................................... 88 5.5.24. AT( ) (Función) ........................................................................................................................... 89 5.5.25. AT_C( ) (Función) ...................................................................................................................... 90 5.5.26. ATAN( ) (Función) ...................................................................................................................... 91 5.5.27. ATC( ) (Función) ........................................................................................................................ 91 5.5.28. ATCC( ) (Función) ...................................................................................................................... 92 5.5.29. ATCLINE( ) (Función) ................................................................................................................. 93 5.5.30. ATLINE( ) (Función) ................................................................................................................... 94 5.5.31. ATN2( ) (Función) ...................................................................................................................... 95 5.5.32. AUSED( ) (Función) ................................................................................................................... 95 5.5.33. AVERAGE (Comando) ............................................................................................................... 96 5.5.34. BETWEEN( ) (Función) .............................................................................................................. 97 5.5.35. BINTOC( ) (Función) .................................................................................................................. 98 5.5.36. BITAND( ) (Función) ................................................................................................................... 99 5.5.37. BITCLEAR( ) (Función)............................................................................................................. 100 5.5.38. BITLSHIFT( ) (Función) ............................................................................................................ 100 5.5.39. BITNOT( ) (Función) ................................................................................................................. 101 5.5.40. BITOR( ) (Función) ................................................................................................................... 101 5.5.41. BITRSHIFT( ) (Función) ............................................................................................................ 102 5.5.42. BITSET( ) (Función) ................................................................................................................. 102 5.5.43. BITTEST( ) (Función) ............................................................................................................... 103 5.5.44. BITXOR( ) (Función) ................................................................................................................. 103 5.5.45. BLANK (Comando) ................................................................................................................. 104 5.5.46. BOF( ) (Función) ...................................................................................................................... 105 5.5.47. BROWSE (Comando).............................................................................................................. 106 5.5.48. CD | CHDIR (Comando) .......................................................................................................... 118
3
Manual de Genlis
5.5.49. CDOW( ) (Función) .................................................................................................................. 119 5.5.50. CEILING( ) (Función) ................................................................................................................ 119 5.5.51. CHR( ) (Función) ...................................................................................................................... 120 5.5.52. CHRSAW( ) (Función) .............................................................................................................. 120 5.5.53. CHRTRAN( ) (Función) ............................................................................................................ 121 5.5.54. CHRTRANC( ) (Función) .......................................................................................................... 122 5.5.55. CMONTH( ) (Función) .............................................................................................................. 122 5.5.56. COPY FILE (Comando) ........................................................................................................... 123 5.5.57. COPY TO ARRAY (Comando) ................................................................................................. 123 5.5.58. COS( ) (Función) ...................................................................................................................... 125 5.5.59. COUNT (Comando) ................................................................................................................ 126 5.5.60. CREATE TABLE - SQL (Comando) ......................................................................................... 127 5.5.61. CTOD( ) (Función) ................................................................................................................... 131 5.5.62. CTOBIN( ) (Función) ................................................................................................................ 131 5.5.63. CTOT( ) (Función) .................................................................................................................... 132 5.5.64. CURDIR( ) (Función) ................................................................................................................ 132 5.5.65. DATE( ) (Función) .................................................................................................................... 133 5.5.66. DATETIME( ) (Función) ............................................................................................................ 133 5.5.67. DAY( ) (Función) ...................................................................................................................... 134 5.5.68. DELETE - SQL (Comando) ...................................................................................................... 135 5.5.69. DELETE FILE (Comando) ........................................................................................................ 136 5.5.70. DIRECTORY( ) (Función) ......................................................................................................... 136 5.5.71. DO WHILE ... ENDDO (Comando) .......................................................................................... 137 5.5.72. DOW( ) (Función) ..................................................................................................................... 138 5.5.73. DTOC( ) (Función) ................................................................................................................... 138 5.5.74. DTOR( ) (Función).................................................................................................................... 139 5.5.75. DTOS( ) (Función) .................................................................................................................... 140 5.5.76. DTOT( ) (Función) .................................................................................................................... 140 5.5.77. EMPTY( ) (Función) ................................................................................................................. 141 5.5.78. EOF( ) (Función) ...................................................................................................................... 142 5.5.79. ERASE (Comando) ................................................................................................................. 143 5.5.80. EVALUATE( ) (Función) ............................................................................................................ 143 5.5.81. EXP( ) (Función) ....................................................................................................................... 144 5.5.82. EXPORT (Comando) ............................................................................................................... 144 5.5.83. FCHSIZE( ) (Función) ............................................................................................................... 147 5.5.84. FCLOSE( ) (Función) ................................................................................................................ 148 5.5.85. FCOUNT( ) (Función) ............................................................................................................... 148 5.5.86. FCREATE( ) (Función) .............................................................................................................. 149 5.5.87. FDATE( ) (Función) .................................................................................................................. 150 5.5.88. FEOF( ) (Función) .................................................................................................................... 151 5.5.89. FERROR( ) (Función) ............................................................................................................... 151
4
Manual de Genlis
5.5.90. FFLUSH( ) (Función) ................................................................................................................ 152 5.5.91. FGETS( ) (Función) .................................................................................................................. 153 5.5.92. FILE( ) (Función) ...................................................................................................................... 153 5.5.93. FLOOR( ) (Función) ................................................................................................................. 154 5.5.94. FOPEN( ) (Función).................................................................................................................. 154 5.5.95. FOR ... ENDFOR (Comando) .................................................................................................. 155 5.5.96. FOUND( ) (Función) ................................................................................................................. 157 5.5.97. FPUTS( ) (Función) .................................................................................................................. 157 5.5.98. FREAD( ) (Función) .................................................................................................................. 158 5.5.99. FULLPATH( ) (Función) ............................................................................................................ 159 5.5.100. GATHER (Comando) ............................................................................................................. 159 5.5.101. GETDIR( ) (Función)............................................................................................................... 161 5.5.102. GETFILE( ) (Función) ............................................................................................................. 161 5.5.103. GETEXPR (Comando) ........................................................................................................... 163 5.5.104. GETPICT( ) (Función) ............................................................................................................. 164 5.5.105. GETPRINTER( ) (Función) ...................................................................................................... 165 5.5.106. GO | GOTO (Comando) ........................................................................................................ 165 5.5.107. GOMONTH( ) (Función) ......................................................................................................... 166 5.5.108. HOUR( ) (Función) ................................................................................................................. 167 5.5.109. IF ... ENDIF (Comando) ......................................................................................................... 167 5.5.110. IIF( ) (Función)........................................................................................................................ 168 5.5.111. INDEXSEEK( ) (Función) ........................................................................................................ 169 5.5.112. INKEY( ) (Función) ................................................................................................................. 170 5.5.113. INLIST( ) (Función) ................................................................................................................. 173 5.5.114. INSERT - SQL (Comando) .................................................................................................... 173 5.5.115. INT( ) (Función) ...................................................................................................................... 174 5.5.116. ISALPHA( ) (Función) ............................................................................................................. 175 5.5.117. ISBLANK( ) (Función) ............................................................................................................ 175 5.5.118. ISDIGIT( ) (Función) ............................................................................................................... 176 5.5.119. ISEXCLUSIVE( ) (Función) ..................................................................................................... 177 5.5.120. ISLOWER( ) (Función)............................................................................................................ 178 5.5.121. ISNULL( ) (Función) ............................................................................................................... 178 5.5.122. ISUPPER( ) (Función) ............................................................................................................ 179 5.5.123. KEYBOARD (Comando) ........................................................................................................ 179 5.5.124. LABEL (Comando) ................................................................................................................ 180 5.5.125. LEFT( ) (Función) ................................................................................................................... 183 5.5.126. LEFTC( ) (Función)................................................................................................................. 183 5.5.127. LEN( ) (Función) .................................................................................................................... 184 5.5.128. LENC( ) (Función) .................................................................................................................. 184 5.5.129. LIKE( ) (Función) .................................................................................................................... 185 5.5.130. LIKEC( ) (Función) ................................................................................................................. 186
5
Manual de Genlis
5.5.131. LOWER( ) (Función) ............................................................................................................... 187 5.5.132. LTRIM( ) (Función) ................................................................................................................. 187 5.5.133. MD | MKDIR (Comando) ....................................................................................................... 188 5.5.134. MEMLINES( ) (Función) ......................................................................................................... 188 5.5.135. MESSAGEBOX( ) (Función) ................................................................................................... 188 5.5.136. MIN( ) (Función) ..................................................................................................................... 190 5.5.137. MINUTE( ) (Función) .............................................................................................................. 191 5.5.138. MLINE( ) (Función) ................................................................................................................. 191 5.5.139. MOD( ) (Función) ................................................................................................................... 192 5.5.140. MONTH( ) Function ............................................................................................................... 192 5.5.141. MTON( ) (Función) ................................................................................................................. 193 5.5.142. NTOM( ) (Función) ................................................................................................................. 194 5.5.143. PACK (Comando) ................................................................................................................. 194 5.5.144. PADL( ) | PADR( ) | PADC( ) (Funciones) ................................................................................ 195 5.5.145. _PAGENO (Variable del sistema) ........................................................................................... 196 5.5.146. PAYMENT( ) (Función) ........................................................................................................... 196 5.5.147. PRIVATE (Comando) ............................................................................................................. 197 5.5.148. PROPER( ) (Función) ............................................................................................................. 198 5.5.149. PUBLIC (Comando) .............................................................................................................. 198 5.5.150. RAND( ) (Función) ................................................................................................................. 199 5.5.151. RAT( ) (Función) .................................................................................................................... 199 5.5.152. RATC( ) (Función) .................................................................................................................. 200 5.5.153. RATLINE( ) (Función) ............................................................................................................. 201 5.5.154. RD | RMDIR (Comando) ........................................................................................................ 202 5.5.155. RECCOUNT( ) (Función) ........................................................................................................ 202 5.5.156. RECNO( ) (Función) ............................................................................................................... 203 5.5.157. RENAME (Comando) ............................................................................................................ 204 5.5.158. REPLACE (Comando) ........................................................................................................... 204 5.5.159. REPLACE FROM ARRAY (Comando) ................................................................................... 206 5.5.160. REPORT (Comando) ............................................................................................................. 207 5.5.161. RIGHT( ) (Función) ................................................................................................................. 210 5.5.162. RIGHTC( ) (Función) .............................................................................................................. 211 5.5.163. RLOCK( ) (Función) ............................................................................................................... 212 5.5.164. ROUND( ) (Función)............................................................................................................... 213 5.5.165. RTOD( ) (Función).................................................................................................................. 214 5.5.166. RTRIM( ) (Función) ................................................................................................................ 214 5.5.167. SCAN ... ENDSCAN (Comando) ........................................................................................... 215 5.5.168. SCATTER (Comando) ........................................................................................................... 215 5.5.169. SEC( ) Función ...................................................................................................................... 217 5.5.170. SECONDS( ) (Función) .......................................................................................................... 217 5.5.171. SEEK (Comando) .................................................................................................................. 218
6
Manual de Genlis
5.5.172. SEEK( ) (Función) .................................................................................................................. 219 5.5.173. SELECT - SQL (Comando) ................................................................................................... 221 5.5.174. SELECT (Comando) .............................................................................................................. 230 5.5.175. SELECT( ) (Función) .............................................................................................................. 231 5.5.176. SIGN( ) (Función) ................................................................................................................... 232 5.5.177. SIN( ) (Función) ..................................................................................................................... 232 5.5.178. SKIP (Comando) ................................................................................................................... 233 5.5.179. SORT (Comando) ................................................................................................................. 233 5.5.180. SOUNDEX( ) (Función) .......................................................................................................... 236 5.5.181. SPACE( ) (Función) ................................................................................................................ 237 5.5.182. SQRT( ) (Función) .................................................................................................................. 237 5.5.183. STR( ) (Función) .................................................................................................................... 238 5.5.184. STRCONV( ) (Función) .......................................................................................................... 238 5.5.185. STRTRAN( ) (Función) ........................................................................................................... 239 5.5.186. STUFF( ) (Función) ................................................................................................................ 240 5.5.187. STUFFC( ) (Función) .............................................................................................................. 241 5.5.188. SUBSTR( ) (Función) ............................................................................................................. 242 5.5.189. SUBSTRC( ) (Función) ........................................................................................................... 243 5.5.190. SUM (Comando) ................................................................................................................... 244 5.5.191. TAN( ) (Función) .................................................................................................................... 245 5.5.192. TIME( ) (Función) ................................................................................................................... 245 5.5.193. TOTAL (Comando) ................................................................................................................ 246 5.5.194. TRANSFORM( ) (Función) ..................................................................................................... 247 5.5.195. TRIM( ) (Función) ................................................................................................................... 249 5.5.196. TTOC( ) (Función) .................................................................................................................. 249 5.5.197. TTOD( ) (Función) .................................................................................................................. 250 5.5.198. TYPE( ) (Función) .................................................................................................................. 250 5.5.199. UPPER( ) (Función)................................................................................................................ 251 5.5.200. USED( ) (Función) .................................................................................................................. 252 5.5.201. VAL( ) (Función) ..................................................................................................................... 252 5.5.202. WAIT (Comando) .................................................................................................................. 253 5.5.203. WEEK( ) (Función) ................................................................................................................. 254 5.5.204. YEAR( ) (Función) .................................................................................................................. 256
6. Limitaciones y observaciones sobre la codificación de instrucciones ................................ 257
7
Manual de Genlis
1. Introducción El generador de listados de Eurowin Genlis proporciona una forma fácil de crear nuevos listados, gráficos y etiquetas en Eurowin. A los documentos podrá agregar formularios que permitirán al usuario final limitar y parametrizar los resultados (por ejemplo si crea un nuevo modelo de carta para los clientes podrá agregar un formulario que pregunte la población donde deben vivir para que se imprima su carta). Algunos ejemplos de documentos que se pueden crear son: 1) 2) 3) 4) 5) 6)
Un listado de artículos. Cartas para clientes filtrados por actividad. Etiqueta de artículos con código de barras. Carnets para los clientes. Gráfica de una evolución de ventas para un determinado artículo. Y muchos más.
1.1. Ver gráficos, informes y etiquetas Para saber que gráficos, informes, y etiquetas han sido creados y ejecutarlos pulse sobre el icono ver que aparece en la pantalla principal. Seguidamente le aparecerá un árbol donde cada nodo representa uno de los tres tipos de documentos que se pueden generar desde Genlis:
Listados. (Por ejemplo: Una lista de los clientes de una cierta población) Máilings. (Por ejemplo: Cartas a los clientes o proveedores) Presupuestos. (Por ejemplo: Un presupuesto personalizado)
Etiquetas. (Por ejemplo: Etiquetas para los artículos) Carnets. (Por ejemplo: Carnets para los clientes)
Gráficas. (Por ejemplo: Evolución de las ventas para un determinado ejercicio)
Las carpetas
agrupan informes, etiquetas, listados u otras carpetas.
Para ver un documento haga clic sobre el nodo hasta que aparezca resaltado con azul, y seguidamente pulse el botón “Ver” de la parte inferior derecha. Automáticamente le aparecerán los datos por pantalla.
8
Manual de Genlis
1.2. Generar, modificar y borrar gráficas Si desea crear, borrar o modificar un gráfico pulse sobre el botón “Gráficos” de la pantalla principal, o sobre la opción “Generador de gráficas” del menú “Opciones”. Seguidamente le aparecerá una nueva patilla con un árbol con los diferentes documentos que ja han sido creados. Desde esta patilla podrá realizar las mismas acciones que la patilla “Ver”, más las opciones ya indicadas.
1.2.1. Borrar gráfica Seleccione la gráfica que desee borrar pulsando sobre ella con el ratón hasta que aparezca resaltada y pulse sobre el botón borrar.
1.2.2. Ver gráfica Seleccione la gráfica haciendo clic sobre ella y pulse el botón “Ejecutar” de la parte inferior. Seguidamente le aparecerá la gráfica por pantalla, que podrá imprimir, personalizar o exportar a otro programa.
1.2.3. Crear una nueva gráfica Pulsando sobre el botón nueva gráfica le aparecerá un asistente que le guiará en su construcción. El botón “leer gráfica” le permitirá generar una de nueva basándose en una ya existente. Para crear una gráfica basada en otra, seleccione la que debe hacer de base haciendo clic sobre ella y pulse sobre el botón “leer gráfica”. Le aparecerá el mismo asistente que al crear una de nueva pero con las opciones ya establecidas.
1.2.4. Modificar informe y restablecer Los botones “Modificar” y “Restablecer” se utilizan en los nodos de tipo listados y etiquetas para realizar los últimos retoques a la forma de presentar los datos por impresora o por pantalla. Si pulsa el botón modificar le aparecerá el editor de informes donde podrá cambiar los colores, los tipos de letras, mover elementos, etc. (Para más información consulté el apartado de editor de informes). El botón restablecer le permitirá deshacer todos los cambios realizados en un informe desde el momento en que se creó.
9
Manual de Genlis
1.2.5. Asistente para crear nuevas gráficas El asistente para crear una gráfica se divide en 6 pasos. En el primer paso (Inicio) decidiremos si deseamos que cada vez que visualizamos la gráfica aparezca un formulario que nos permita personalizar los datos que se utilizaran (Por ejemplo si creamos una gráfica del beneficio puede hacerse que nos pregunte el ejercicio). El segundo paso (Consulta Sql) sirve para indicar que datos deben ir a la gráfica Aquí escribiremos una orden SQL o incluso un pequeño programa que extraerá la información de la base de datos. En el tercer paso (Editar diseño) decidiremos que campos numéricos van al eje Y y cual va al eje X. El paso cuarto (Seleccionar estilo) podremos indicar que tipo de gráfica deseamos de una variada colección (Barras verticales, Tarta, Líneas,..). En el paso quinto (Personalizar) terminaremos de realizar los últimos retoques. Indicaremos si la gráfica es en tres dimensiones o en dos, y que barras de herramientas dispondrá el usuario final para realizar los últimos retoques. Pulsando sobre el botón personalizar podremos indicar los colores, el tipo de letra y otros parámetros. En el último paso (Generar gráfica) indicaremos el nombre y la carpeta donde queramos que se genere.
1.3. Generar nuevos informes Para ver que informes ya han sido creados, modificarlos, borrarlos o para crear de nuevos seleccione la opción “Generador de listados” del menú Opciones o bien pulse sobre el botón “Listados” de la pantalla principal. A continuación le aparecerán todos los documentos organizados en forma de árbol.
1.3.1. Borrar listado Sitúese sobre el listado que desea borrar haciendo clic con el ratón y pulse sobre el botón borrar. Esta opción borrará el listado o informe pero no el report asociado. Si desea eliminarlo deberá ir al directorio donde se guardan los reports y borrarlo manualmente. Recuerde que el directorio donde se guardan los reports viene indicado en el Config.Ini debajo de la entrada [informes].
1.3.2. Ver listado Seleccione el listado haciendo clic en él y pulse el botón ejecutar. A continuación le aparecerá el resultado del listado que podrá imprimir o visualizar por la pantalla.
10
Manual de Genlis
1.3.3. Crear un nuevo listado Para generar un listado o documento pulse sobre el botón Nuevo listado que abrirá un asistente para la construcción de nuevos informes. Si lo que desea es crearlo partiendo de uno ja echo seleccione el listado base y pulse el botón “leer gráfica” para acceder al asistente con las opciones establecidas como el listado base.
1.3.4. Modificar y restablecer informe Una vez ha generado un informe podrá modificar el report asociado para realizar ajustes, eliminar campos, moverlos, cambiar los colores o tipo de letra, etc. (Para más información consulte el apartado del editor de informes). Para editarlo seleccione el informe y pulse sobre el botón “Modificar”. En caso que desea deshacer los cambios que se han realizado en un informe desde su creación pulse el botón restablecer.
1.3.5. Asistente para crear nuevos listados Para crear un listado desde el asistente deberá recorrer 7 pasos. El primero y el segundo son comunes en los tres asistentes básicos. Para empezar (Inicio) indicaremos si cada vez que ejecutamos el informe deseamos que aparezca un formulario que nos pregunte una serie de parámetros para personalizar los datos del listado. El segundo paso (consulta SQL) sirve para indicar que datos deben ir al listado. Aquí escribiremos una orden SQL o incluso un pequeño programa que extraerá la información de la base de datos. En el tercer paso (Cabecera) indicaremos que elementos deseamos añadir en la cabecera (el título, numero de página, etc.). En el cuarto paso (Pie) eligiéremos como deseamos que sea el pie de página. En el quinto (Modelo) indicaremos que formato deseamos utilizar para generar el report: Estándar para generar listados parecidos a los del Eurowin, Ejecutivo para un estiló mas severo, etc.. En el sexto (Personalizar listado) indicaremos que fichero de report se generará y terminaremos de especificar las características principales, el numero de columnas o filas, los colores o el tipo de letra,… El último servirá para finalizar la creación del listado y indicar en que lugar del árbol de documentos creados queremos colocarlo.
11
Manual de Genlis
1.4. Generar nuevas etiquetas Pulsando sobre el botón “Etiquetas” de la pantalla principal o sobre la opción “Generar nuevas etiquetas” del menú “Opciones” le aparecerá una patilla con sus etiquetas y documentos. Desde aquí podrá crear etiquetas, modificar sus reports asociados, borrarlas,… de forma similar que con los listados o gráficos.
1.4.1. Borrar etiqueta Para borrar una etiqueta selecciónela haciendo clic sobre su nombre y a continuación pulse sobre el botón borrar. Igual que en el caso de los listados el report asociado no se borrará. Para eliminarlo deberá ir al directorio donde se guardaran los reports y eliminarlo manualmente. Si no se acuerda cuál es el directorio donde se guardan los reports recuerde que lo puede leer en el fichero “Config.Ini” debajo de la línea [informes].
1.4.2. Ver etiqueta Sitúese sobre la etiqueta que desea visualizar haciendo clic sobre ella con el ratón y pulse el botón ejecutar. A continuación le aparecerá una lista de etiquetas por pantalla que podrá imprimir.
1.4.3. Crear una nueva etiqueta Para activar el asistente de etiquetas pulse sobre el botón “nueva etiqueta”. El asistente le irá guiando paso a paso en la generación de la etiqueta. Para hacer que se base en una ja existente selecciónala y pulse sobre el botón “leer etiqueta”. A continuación dispondrá del asistente inicializado con los valores de la etiqueta.
1.4.4. Modificar report asociado y restablecerlo Para las etiquetas, igual que con los informes, también dispondrá de la posibilidad de modificar el report asociado para eliminar campos, agregar otros, moverlos, cambiar los colores, tipos de letra, etc. (Para más información consulte el apartado del editor de informes). Para deshacer los cambios que se han realizado en un informe desde su creación pulse el botón restablecer.
12
Manual de Genlis
1.4.5. Asistente para crear nuevas etiquetas El proceso de creación de una etiqueta se realiza en seis pasos. En el primer paso (Inicio), si desea que sus etiquetas puedan ser personalizadas en el momento en que se ejecuten deberá generar un formulario que le pregunte los diferentes valores que condicionan el resultado. El segundo paso (consulta SQL) sirve para obtener la información que aparecerá en la etiqueta. Aquí escribimos una orden SQL o incluso un pequeño programa que extraerá la información de la base de datos. Para más información consulte el apartado Generar consulta SQL. En el siguiente (seleccionar medida) deberemos elegir el alto y ancho de la etiqueta y el numero de etiquetas que hay en una misma fila. En el cuarto paso indicaremos la forma como deseamos organizar los campos dentro de la etiqueta. Existen 3 posibilidades, colocados uno al lado de otro, alineados en línea, o situarlos más tarde manualmente. Pulsando sobre el botón “Indicar campos y formato” podremos tener más control de la situación de los campos, además de añadir códigos de barras. En el quinto (Personalizar etiqueta) indicaremos que fichero de report se generará y podremos detallar las características de la etiqueta, colores, tipos de letras, tamaño,… El último paso servirá para finalizar la creación de la etiqueta y indicar en que lugar del árbol de documentos creados queremos colocarlo.
1.5. Generar nuevas consultas Lo más importante y difícil en la creación de un listado, etiqueta o gráfico, es decidir que datos queremos presentar y como poder obtenerlos. En Genlis debemos escribir ordenes SQL o pequeños programas en fox para poder leer los datos del servidor. Si no conoce fox o SQL, Genlis proporciona un asistente para construir el código por usted. Puede activar el asistente desde cualquiera de los generadores. El asistente se compone de 9 pasos: En el primero se debe decidir el ejercicio o año sobre el que se desea obtener los datos. Sí selecciona el ejercicio predeterminado el listado afectará a el año que haya indicado al entrar al entrar al Eurowin o el que esté marcado como preferente. Si indica “Seleccionar ejercicio” aparecerá una lista con todos los años, haga clic sobre el deseado para seleccionarlo. En el segundo paso (seleccionar tablas), deberá indicar de que tablas desea extraer los datos. Por ejemplo, para realizar un listado de clientes con sus teléfonos deberá buscar en la lista de tablas seleccionables la de clientes y la de sus teléfonos (telf_cli), seleccionarlas haciendo clic sobre sus
13
Manual de Genlis
nombres y pulsar sobre el botón agregar tabla (
).
En caso de haber seleccionado varias tablas, deberá indicar como se relacionan entre si (tercer paso). Por ejemplo deberá indicar que cada teléfono pertenece a un cliente, o sea el campo código del cliente es igual al campo cliente de la tabla teléfonos. Una vez relacionadas las tablas deberá indicar que hacer con los registros que no tienen una correspondencia con la otra tabla.
Marque “Solo filas coincidentes” para que aparezcan las filas con relación. (Por ejemplo solo los clientes que tienen teléfono y viceversa). Seleccione “Todas las filas de la tabla izquierda” para que aparezcan todos los registros de la tabla izquierda indistintamente de que tengan correspondencia a la otra tabla. (Por ejemplo todos los clientes indiferentemente de que tengan o no teléfono). La opción “Todas las filas de la tabla derecha” es similar a la anterior, pero al revés. En el caso del ejemplo no tiene sentido porque se estaría pidiendo de que aparezcan todos los teléfonos ni que no pertenezcan a ningún cliente. La opción “Todas las filas de ambas tablas” sirve para indicar que aparezcan todos los registros indiferentemente de que tengan o no correspondencia a la otra tabla. En el paso 4 deberá indicar que campos desea utilizar en el informe. En caso de que desea obtener subtotales o totales deberá añadir una expresión que lo calcule. El generador de expresiones le ayudará a crearla por usted. Para agregar un campo selecciónelo haciendo clic sobre su nombre y pulse sobre el botón agregar 1 campo ( ). Fíjese que en la lista de los campos seleccionables aparece solo los campos de las tablas especificadas en el paso dos. En la parte izquierda del nombre se indica de que tabla se trata, a la derecha aparece el nombre del campo. Si desea añadir una expresión calculada deberá escribirla en el textbox situado a la parte inferior izquierda y pulsar el botón añadir expresión ( generación de la expresión.
). El botón con puntos (
) activará un asistente que le guiará en la
El paso 5 sirve para indicar qué condiciones deben cumplir los registros que quiera que aparezcan en el documento. Para introducir una condición debe indicar el campo a comparar, la operación con que se compara y la expresión como se indica a la imagen siguiente.
14
Manual de Genlis
Si desea indicar que la condición no debe ser cierta pulse sobre el botón con la marca de verificación. Una vez pulsado la imagen desaparecerá indicando que la condición debe evaluar falso. A continuación, pulse sobre el botón “Añadir” para que la condición se agregue a la lista de las que deben evaluarse. Puede terminar de adaptar el comportamiento de las condiciones seleccionando una de las opciones de la parte superior: Los que cumplen todas las condiciones Los que cumplen alguna condición Los que no cumplen ninguna condición Los que no cumplen alguna condición El paso 6 sirve para indicar con que orden desea que aparezcan los registros. Seleccione el campo con que desea ordenar y pulse sobre el botón agregar campo. Puede añadir tantos campos como desee, pero no se recomiendan más de tres. El paso 7 sirve para agrupar líneas. Por ejemplo si desea un listado de las unidades que se han vendido de un artículo un determinado mes deberá consultar la tabla de las líneas de albaranes, filtrarla con el mes y agrupar las líneas por código de artículo. En el caso de haber seleccionado un orden para los registros, en el penúltimo paso (limitar registros) podrá indicar si desea obtener un subconjunto del resultado de la consulta, o obtener todo el conjunto. Por ejemplo si construye un listado para ver los diez artículos con mas benefició podría indicar que solo desea los diez primeros registros del resultado. Por defecto se recogen todos los registros, para cambiarlo pulse sobre la opción “tamaño del subconjunto” y indique el numero o porcentaje de registros.
Si el tamaño del conjunto quiera que sea en % pulse sobre “porcentaje de registros” sino sobre “numero de registros”. El último paso (generar consulta) sirve para que Genlis cree el código para obtener la información. En este paso puede indicar los últimos detalles, como es omitir registros repetidos para no incluir los registros que tienen la misma información. En caso de que no haya escrito otras consultas SQL o otro código recuerde marcar la casilla “Generar como grupo de consultas” para no perderlo.
15
Manual de Genlis
2. Editor de informes Los informes y etiquetas proporcionan un modo flexible de mostrar y resumir datos en un documento impreso. Los informes tienen dos componentes básicos: un origen de los datos y una distribución. El origen de los datos suele ser el resultado de una consulta (una serie de cursores). Las consultas filtran, ordenan y agrupan datos de la base de datos y la distribución del informe define el formato impreso de los informes. Una vez definida una consulta, podrá crear informes o etiquetas. En este capítulo se trata lo siguiente:
16
Planificar la distribución del informe Crear la distribución de un informe Modificar la distribución Agregar controles a informes Agrupar datos en la distribución Personalizar la distribución Presentación preliminar e impresión del informe o etiqueta
Manual de Genlis
2.1. Planificar la distribución del informe Puede diseñar un informe de forma que muestre sus datos de varias formas en la página impresa. Utilizando el Editor de informes puede diseñar listas completas, resúmenes o subconjuntos especiales de datos. El diseño de un informe tiene cuatro etapas principales:
1. 2. 3. 4.
Determinar el tipo de informe que va a crear. Crear el archivo que contenga la distribución del informe. Modificar y personalizar el archivo de distribución. Efectuar la presentación preliminar e impresión del informe.
El proceso de creación de un informe
2.1.1. Determinar la distribución general Antes de crear un informe, decida el formato general que desea que éste tenga. Su informe puede ser tan simple como una lista de teléfonos basada en una sola tabla, o tan complejo como una factura basada en múltiples tablas. Puede crear también tipos especiales de informes. Por ejemplo, una etiqueta postal es un informe especial con una distribución específica y para un tipo de papel especial.
Distribuciones generales para informes
17
Manual de Genlis
Para ayudarle a elegir una distribución, a continuación se presentan algunas descripciones de distribuciones generales de informes, sus usos comunes y ejemplos.
Tipo de distribución. Descripción. Ejemplos Columna. Un registro por fila con campos dispuestos horizontalmente a lo ancho de la página. Ejemplos: Informe de grupos/totales, Informes financieros, Inventario, Resumen de ventas. Fila. Una columna de registros con campos dispuestos verticalmente uno bajo el otro. Ejemplos: Listas uno a varios, Un registro o una relación uno a varios, Facturas, Estado de cuentas. Multi-columna. Más de una columna de registros con campos dispuestos verticalmente hacia abajo en margen izquierdo. Ejemplos: Listín telefónico, Tarjetas de visita. Etiqueta. Más de una columna de registros con campos dispuestos verticalmente hacia abajo en el margen izquierdo; impreso en papel especial. Ejemplos: Etiquetas postales, Etiquetas de nombres. Después de seleccionar la distribución general del informe que convenga a sus necesidades, puede crear el archivo de distribución del informe con el Editor de informes.
2.1.2. Descripción de los archivos de distribución de informes El archivo de distribución de informes, que tiene una extensión .FRX, almacena las especificaciones del informe. Cada archivo de informe tiene también asociado un archivo con extensión .FRT. El archivo de informe especifica los campos que usted quiere incluir, el texto que desea imprimir y la colocación de la información en la página. Para obtener la información desde su base de datos hasta la página impresa, imprima el archivo de informe. El archivo no almacena los valores de cada uno de los campos de datos, sino sólo la información de colocación y formato correspondiente a ese informe. Los valores pueden cambiar cada vez que se ejecuta el informe, dependiendo de los cambios que hayan ocurrido en los campos del origen de datos usado por el archivo de informe.
18
Manual de Genlis
2.1.3. Modificar la distribución Una vez se ha indicado el origen de datos (la consulta) para un listado o etiqueta pulsando el botón “personalizar” de la patilla personalizar podrá adaptar la distribución propuesta automáticamente con el editor de informes. En las bandas del Editor de informes, puede insertar ciertos tipos de controles que contienen las etiquetas, campos, variables y expresiones que desea incluir en el informe impreso. Por ejemplo, en un listín telefónico podría colocar controles de campo para los nombres y números de teléfono, así como controles de etiqueta y encabezados de columna al principio de la lista. Para mejorar la apariencia visual del informe y hacerlo más legible, puede agregar otros controles como líneas, rectángulos y rectángulos redondeados. Puede incluir también controles dependientes de una imagen u objeto OLE. Cada uno de estos controles se muestra en la siguiente ilustración.
Archivo de distribución del informe e informe resultante
Puede abrir su informe o etiqueta en el Editor de informes para modificar y personalizar su distribución.
Para modificar una etiqueta o un informe generado 1) Pulse sobre uno de los iconos, Generar etiqueta, Generar listado. 2) 3)
Elija el informe o etiqueta que desea modificar pulsando sobre el. Pulse el botón modificar
Utilice las bandas del informe para determinar cómo desea que sea cada página, grupo y el comienzo y fin de su informe. Las bandas del informe se pueden cambiar de tamaño. En estas bandas, agregue controles
19
Manual de Genlis
de informe y luego muévalos, cópielos, cámbielos de tamaño, alinéelos y ajústelos para organizar el texto y los campos de su informe.
2.1.4. Planificar la ubicación de los datos Una vez que tenga una distribución de informe, puede modificar la ubicación de los datos en la página del informe. Utilizando las bandas del Editor de informes, puede controlar en qué posición de la página se imprimirán los datos. Su distribución de informe puede tener varias bandas. La ilustración siguiente muestra algunas de las bandas que un informe puede incluir, así como el contenido típico para cada una de ellas. Fíjese que la barra situada debajo de cada banda identifica la banda.
Bandas de informe en el Editor de informes
Un informe puede tener también múltiples bandas de grupo o bandas para encabezados y pies de columna. Puede agregar esas bandas usando los procedimientos descritos en las secciones Definir la página de informe y Agrupar datos en su distribución, más adelante en este mismo capítulo. Puede utilizar la tabla siguiente para determinar qué bandas quiere utilizar.
20
Manual de Genlis
Bandas de informe en el editor de informes Use esta banda
Para imprimir
Use este comando
Título Encabezado de página
Una vez por informe Una vez por página
Encabezado de columna
Una vez por columna
Encabezado de grupo Banda Detalle Pie de grupo
Una vez por grupo Una vez por registro Una vez por grupo
Pie de columna
Una vez por columna
Pie de página Resumen
Una vez por página Una vez por informe
En el menú Informe, elija Título/Resumen Disponible de forma predeterminada En el menú Archivo, elija Preparar página e introduzca un número de columna mayor que uno En el menú Informe, elija Agrupar datos Disponible de forma predeterminada En el menú Informe, elija Agrupar datos Elija Preparar página en el menú Archivo e introduzca un número de columna mayor que uno Disponible de forma predeterminada En el menú Informe, elija Título/Resumen
Puede situar cualquiera de los controles de informe en cualquiera de las bandas.
Cambiar el tamaño de las bandas Puede modificar el tamaño y las características de cada banda. Para cambiar el tamaño de una banda 1) Arrastre la barra de la banda hasta la altura apropiada. 2) Utilice la regla de la izquierda como guía. La medida de la regla le indica la altura de esa banda sin incluir los márgenes de la página. Sugerencia. No puede hacer una banda menor que la altura ocupada por los controles en la distribución. Puede mover los controles dentro de la banda y si lo desea, reducir su altura.
2.1.5. Agregar controles de informe Puede insertar los siguientes tipos de controles de informe en las presentaciones de informe y etiqueta.
Agregar controles de informe Para mostrar
Elija este control
Campos de tabla, variables y otras expresiones Texto Líneas rectas Círculos, ovales, cuadros con bordes redondeados Bitmaps o campos generales
Campo Etiqueta Rectángulo Rectángulo redondeado Imagen / OLE dependiente
21
Manual de Genlis
Después de situar estos controles, puede cambiar las opciones de formato, tamaño, color, posición e impresión. También puede agregar un comentario a cada control para referencia únicamente; no se imprime en el informe.
2.1.6. Agregar controles de campo Su informe o etiqueta puede incluir controles de campo que representen valores de campos de tabla, variables y cálculos. Para agregar campos de tabla desde la barra de herramientas
1) 2) 3)
4) 5)
Desde la barra de herramientas Controles de informe, inserte un control Campo. En el cuadro de diálogo Expresión de informe, elija el botón con tres puntos que hay después del cuadro Expresión. En el cuadro Campos, haga doble clic en el nombre del campo deseado. Los nombres de la tabla y del campo aparecerán en el cuadro Expresión para campo del informe. Nota. Si el cuadro Campos está vacío, agregue una tabla o vista al entorno de datos. No tiene que mantener el alias de nombre de la tabla en la expresión. Puede eliminarlo o puede desactivar las opciones del Generador de expresiones. Elija Aceptar. En el cuadro de diálogo Expresión de informe, elija Aceptar.
Para obtener más información, consulte Agregar un comentario a un control más adelante en este capítulo.
2.1.7. Agregar controles de etiquetas Los controles de etiqueta son los caracteres de texto literal que quiere que aparezcan en el informe. Por ejemplo, la etiqueta “Total general” identifica el contenido de un control de campo que contiene una expresión de total. Para agregar un control de etiqueta
1) 2) 3)
22
En la barra de herramientas Controles de informes, elija el botón Etiqueta. En el Editor de informes, haga clic para situar el control. Escriba los caracteres para la etiqueta. Puede modificar el control como si estuviera en un editor de textos. Use la tecla ENTRAR para agregar líneas o el menú Edición para cortar, copiar y pegar texto.
Manual de Genlis
Para modificar un control de etiqueta
1) 2)
En el Editor de informes, elija el botón Etiqueta y haga clic en la etiqueta que quiere modificar. Escriba los cambios.
Después de colocar el texto, puede cambiar la fuente y los colores. Para obtener más información al respecto, consulte las secciones Cambiar fuentes y Cambiar los colores del control más adelante en este capítulo.
2.1.8. Agregar un campo de tipo general Puede insertar en su informe un campo general que contenga objetos OLE. Para insertar un campo general 1) 2)
En el Editor de informes, agregue un control Imagen/Control OLE dependiente. En el área Origen de la imagen, seleccione Campo. Cuadro de diálogo Imagen para informe
3)
En el cuadro Campo, escriba un nombre de campo.
23
Manual de Genlis
O bien, Elija el botón con tres puntos para seleccionar un campo o una variable. 4)
Elija Aceptar. El marcador de posición para el campo de tipo General aparecerá en el marco definido. De forma predeterminada, la imagen conserva su tamaño original.
2.1.9. Seleccionar, mover y ajustar el tamaño de informe Si creó una distribución de informe que ya tiene controles, puede cambiar la colocación y el tamaño de los mismos. Puede cambiar cada control individualmente o puede seleccionar un grupo de ellos y tratarlos como una unidad. Para mover un control Seleccione el control y arrástrelo hasta la nueva posición en una banda de informe. El control se mueve en incrementos hasta su posición en la distribución. Los incrementos están basados en la configuración de la cuadrícula. Para anular la cuadrícula, presione la tecla CTRL mientras arrastra el control. Para seleccionar varios controles Arrastre para dibujar un cuadro de selección alrededor de los controles deseados. Aparecerán los controladores de selección alrededor de cada control. Mientras estén seleccionados puede moverlos, copiarlos o eliminarlos como un grupo. Puede asociar un grupo de controles para realizar varias tareas identificándolos como un grupo. Por ejemplo, puede querer asociar un control de etiqueta y un control de campo con cualquier otro de forma que pueda moverlos sin seleccionarlos por separado. Esta característica también es útil después de haber dado formato y alineado los controles, porque conserva sus posiciones con respecto a los demás. Para agrupar controles adyacentes 1) Seleccione los controles que quiera tratar como un grupo. 2) En el menú Formato, elija Agrupar. Los controladores de selección se trasladarán al nuevo contorno que engloba al grupo entero. Puede tratar el grupo de controles como una unidad. Para desagrupar un grupo de controles 1) Seleccione el grupo de controles. 2) En el menú Formato, elija Desagrupar. Aparecerán controladores de selección alrededor de cada uno de los controles que estaban en el grupo.
24
Manual de Genlis
Una vez que un control está en la presentación, puede cambiar su tamaño individualmente o puede ajustar el tamaño de un grupo de controles para que coincida en todos. Puede ajustar el tamaño de cualquier control de informe excepto las etiquetas; su tamaño lo determinan el texto, la fuente y su tamaño en puntos. Para cambiar el tamaño de un control Seleccione el control y, a continuación, arrastre uno de los controladores de selección hasta conseguir el tamaño deseado. Para cambiar el tamaño de varios controles 1) Seleccione los controles que quiere que tengan el mismo tamaño. 2) En el menú Formato, elija Tamaño. 3) Elija la opción adecuada para ajustar el ancho, la altura o el tamaño. Los controles ajustan el tamaño de acuerdo con la opción seleccionada.
2.1.10. Copiar y eliminar controles de informe Puede copiar y eliminar cualquiera de los controles de la distribución de forma individual o como un grupo. Para copiar controles 1) Seleccione los controles. 2) En el menú Edición, elija Copiar y, a continuación, Pegar. Una copia de los controles seleccionados aparecerá debajo del conjunto original. 3) Arrastre la copia hacia su posición en la distribución. Para eliminar controles 1) Seleccione los controles. 2) En el menú Edición, elija Cortar o presione la tecla SUPR.
2.1.11. Alinear controles Puede alinear controles unos con respecto a otros o bien puede situarlos tomando como referencia la cuadrícula que proporciona el Editor de informes. Puede alinear los controles por un extremo o por el centro. Para alinear controles entre sí 1) Seleccione los controles que desea alinear. 2) En el menú Formato, elija Alinear.
25
Manual de Genlis
3)
En el submenú, elija la opción de alineación apropiada. Genlis utiliza como control de referencia el control cuyo borde es el más cercano a la dirección que eligió; los demás controles se alinearán respecto a éste.
Puede utilizar también la barra de herramientas Distribución. Usando esta barra de herramientas, puede alinear con respecto al control más alejado del lado que ha seleccionado si mantiene presionada la tecla CTRL mientras hace clic en el botón de alineación que desee. Herramienta de alineación a la izquierda
Debe alinear los controles por un lado que todos los controles seleccionados tengan disponible y alejado de los demás. Los controles que están en una fila y se seleccionan para alinearse por su lado derecho, o el izquierdo, se apilarán unos encima de otros. De igual modo, los controles que están en una línea vertical, y seleccionados para alinearse con respecto a la parte superior o inferior, se solaparán. Para centrar controles dentro de una banda 1) Seleccione los controles que desee alinear. 2) En el menú Formato, elija Alinear. 3) En el submenú, elija Centrar verticalmente o Centrar horizontalmente. Los controles se mueven hacia el centro horizontal o vertical de su respectiva banda.
26
Manual de Genlis
2.1.12. Ajustar la posición del control Puede colocar un control en una posición especifica de la página del informe utilizando la barra de estado o la cuadrícula. De forma predeterminada, los controles se ajustan automáticamente a la posición más cercana de la cuadrícula. Puede elegir desactivar la característica de ajuste automático y mostrar u ocultar las líneas de cuadrícula. Las líneas de cuadrícula pueden ayudarle a colocar los controles en la distribución. Para colocar un control en una posición específica 1) En el menú Ver, elija Mostrar posición. 2) Seleccione el control y mueva el control al lugar deseado usando la información sobre su posición que aparece en la barra de estado.
Para alinear controles manualmente 1) En el menú Formato, desactive Forzar a la cuadrícula. Para mostrar las líneas de cuadrícula 1) En el menú Ver, elija Líneas de cuadrícula. Aparecerá una cuadrícula en las bandas del informe. Para cambiar la medida de la cuadrícula 1) En el menú Formato, elija Configurar cuadrícula. 2) En el cuadro de diálogo Configurar cuadrícula, introduzca el número de pixeles para el ancho (horizontal) y la altura (vertical) de cada cuadrado de la cuadrícula.
2.1.13. Agrupar datos en la distribución Después de diseñar la distribución básica, podría decidir que agrupar los registros por ciertos campos u otros criterios haría el informe más fácil de leer. Puede agregar uno o varios grupos, cambiar el orden de los grupos, repetir encabezados de grupo, o cambiar o eliminar bandas de grupos. La agrupación le permite separar grupos de registros visualmente y mostrar datos introductorios y de resumen para cada grupo. El cambio de grupo se basa en una expresión de agrupamiento. Esta expresión suele estar basada en uno o más campos de tabla, pero puede ser tan compleja como quiera. Cuando tiene grupos, su distribución de informe tiene bandas Encabezado de grupo y Pie de grupo, a las cuales puede luego agregar controles. Normalmente, las bandas Encabezado de grupo contienen el control de campo para el campo utilizado para el grupo. Es posible agregar líneas, rectángulos, rectángulos redondeados o cualquier etiqueta que quiera que aparezca delante del primer registro en un grupo. Los pies de grupo suelen contener totales de grupo y otra información de resumen para el grupo. También puede especificar otras opciones para los grupos:
27
Manual de Genlis
-
Imprimir texto en los encabezados y pies de página para identificar grupos específicos Imprimir cada grupo en una página nueva Restablecer los números de página cuando los grupos se impriman en una nueva página
Si el origen de datos es una tabla, probablemente los registros no estén en el orden de agrupación adecuado. Sin embargo, puede ordenar los datos correctamente estableciendo un índice en la tabla, usando una presentación del entorno de datos o usando una consulta como origen de datos para mostrar los registros en grupos. La distribución del informe no actualiza el orden ni ordena los datos, sino que procesa los registros en el mismo orden en el que están en el origen de datos. El orden y la ordenación deben realizarse con una vista, un índice u otra forma de manipulación de datos fuera de la distribución. Por ejemplo, si se produce un cambio de grupo en el campo Región, cada vez que el informe procese un valor de una región diferente se producirá un grupo. Sin embargo, eso no significa que un país al comienzo de la tabla debería ordenarse junto con el grupo del mismo país en el final de la tabla.
2.1.14. Agregar un único grupo Un informe de un único grupo tiene un nivel de datos agrupados en base a una expresión que usted introduce. Por ejemplo, puede basar un grupo en el campo País para imprimir juntos todos los registros del mismo país. El origen de datos se debe ordenar con respecto a ese campo. Para agregar un grupo 1) En el menú Informe, elija Agrupar datos.
2) 3)
28
En el primer cuadro Grupo, escriba la expresión de grupo. O bien, Elija el botón con tres puntos para crear una expresión en el Generador de expresiones. En el área Propiedades de grupo, seleccione las propiedades que desee.
Manual de Genlis
4)
Elija Aceptar.
Después de agregar la expresión, puede colocar los controles que desee en las bandas. Normalmente, el control de campo utilizado para los agrupamientos se traslada desde la banda Detalle hasta la banda Encabezado de grupo.
2.1.15. Agrupar múltiples grupos de datos Puede definir un máximo de 20 niveles de agrupación de datos en un informe. Los grupos anidados son muy útiles para organizar datos y totalizar expresiones en diferentes niveles. Para elegir en qué nivel colocar una agrupación, estime con qué frecuencia podría cambiar el valor. Luego defina como el primero el grupo que cambiará más a menudo. Por ejemplo, su informe podría necesitar una agrupación por regiones y otra agrupación por ciudades. Los valores de un campo Ciudad cambian más que los valores de un campo Región; por lo tanto, la ciudad debería ser la primera de los dos grupos y la región debería ser la segunda. En este informe de múltiples grupos, la tabla se debe ordenar o indexar sobre una expresión clave, como Región+Ciudad. Para agregar múltiples grupos 1) En el menú Informe, elija Agrupar datos.
2) 3) 4) 5)
En el primer cuadro Grupo, escriba la expresión de grupo. O bien, Elija el botón con tres puntos para crear una expresión en el Generador de expresiones. En el área Propiedades de grupo, elija las propiedades que desee. Elija Insertar y repita los pasos 2 y 3 para cada expresión de agrupamiento. Elija Aceptar.
29
Manual de Genlis
Los grupos están numerados, en la lista Agrupar datos, en el orden en el que se crearon. En el Editor de informes, los nombres de las bandas de grupo contienen los números de grupo y una expresión de grupo truncada. Los encabezados y pies de grupo con el número más bajo se muestran más cerca de la banda Detalle.
2.1.16. Cambiar una banda de grupos Es posible cambiar la expresión de grupo y las opciones de impresión de grupo. Para modificar una banda de grupo 1) En el menú Informe, elija Agrupar datos. 2) En el cuadro de diálogo Agrupar datos, seleccione la expresión de grupo que desea cambiar. 3) Introduzca la nueva expresión. O bien, elija el botón con tres puntos para cambiar la expresión en el Generador de expresiones. 4) Cambie las opciones de agrupamiento como sea necesario.
5) 6)
Elija Aceptar. En el cuadro de diálogo Agrupar datos, elija Aceptar.
2.1.17. Alinear una banda de grupo Si ya no necesita un determinado grupo en su distribución de informe, puede quitarlo. Para eliminar una banda de grupo 1) En el menú Informe, elija Agrupar datos. 2) Seleccione el grupo que quiera eliminar. 3) Elija Eliminar. La banda de grupo desaparece de la distribución. Si la banda de grupo contiene controles, se le preguntará si desea eliminar también los controles.
30
Manual de Genlis
2.1.18. Cambiar el orden de agrupamiento Puede cambiar el orden de los grupos en un informe una vez definidos. Cuando los grupos se reordenan, todos los controles definidos en una banda de grupo se mueven a la nueva posición. Reordenar los grupos no cambia ningún control definido previamente. Si los cuadros o las líneas se han situado respecto a la parte superior o inferior de una banda de grupo, permanecerán acoplados a esa banda. Para cambiar el orden de los grupos 1) En el menú Informe, elija Agrupar datos. 2) Elija el botón de movimiento situado a la izquierda del grupo que quiera mover y arrástrelo hasta su nueva posición.
2.1.19. Personalizar la distribución Cuando cree una distribución de informe, puede personalizarla. Las distribuciones creadas con el Asistente para informes e Informe rápido ya se han personalizado en base a las elecciones que hizo mientras creaba la distribución. Por ejemplo, el Asistente para etiquetas postales personaliza la configuración de la página agregando columnas y estableciendo el tamaño del papel. Puede además personalizar la distribución y cambiar la configuración actual con el Editor de informes. Herramientas para personalizar la distribución del informe
Puede cambiar el entorno de datos, la configuración de la página o los controles de informe. El entorno de datos define el origen de los datos a incluir en el informe, la configuración de la página define la apariencia
31
Manual de Genlis
general de la página y de las bandas del informe, y los controles de informe definen los elementos que aparecerán en la página.
2.1.20. Definir la página del informe Cuando planifica un informe, normalmente tiene una idea sobre cuál será la apariencia de la página. Por ejemplo, conoce los márgenes, el tipo de papel y la distribución que desea. Esta sección describe la configuración de los márgenes, la orientación de la página y la altura de las bandas de la página del informe.
Establecer el margen, el tamaño del papel y la orientación Puede establecer el margen izquierdo, el tamaño del papel y la orientación para el informe, así como la anchura de columnas y el espacio entre columnas para un informe con varias columnas. En este contexto, la palabra “columnas” se refiere al número de registros que se imprimen a lo ancho de la página, no al número de campos de un único registro. El Editor de informes no muestra esa configuración. Sólo muestra el área comprendida entre los márgenes que contienen un registro en una columna de la página. Además, si su informe tiene columnas y cambia el margen izquierdo, el ancho de la columna cambiará de forma automática para acomodarse al nuevo margen. Si cambia la configuración del tamaño del papel y la orientación, asegúrese de que la orientación es correcta para el tamaño de papel seleccionado. Por ejemplo, si selecciona un sobre, la orientación debería establecerse como Horizontal. Para establecer el margen izquierdo 1) En el menú Archivo, elija Especificar impresora.
32
Manual de Genlis
2) 3) 4) 5) 6)
En el cuadro Margen izquierdo, introduzca un valor para el margen. La imagen de la página cambiará para mostrar el nuevo margen. Para seleccionar un tamaño de papel, elija Preparar página. En el cuadro de diálogo Preparar página, seleccione un tamaño de página en la lista Tamaño. Para seleccionar la orientación del papel, elija una orientación en el área Orientación y, a continuación, elija Aceptar. En el cuadro de diálogo Preparar página, elija Aceptar.
Definir el encabezado y el pie de página Los controles ubicados en las bandas Encabezado o Pie de página aparecen una vez en cada página del informe. Un informe que tenga muchas páginas debería incluir el nombre del informe, el número de página, la fecha y las etiquetas (si es apropiado) en un encabezado o pie.
Definir la banda Detalle Típicamente, los controles situados en banda Detalle se imprimen una vez para cada registro.
Agregar las bandas Título y Resumen La banda Título contiene información que se imprime una sola vez al principio del informe y la banda Resumen contiene información que se imprime una sola vez al final del informe. Tanto el título como el resumen pueden estar en su propia página. Campos con expresiones de totalización se convertirán en totales generales cuando se ubiquen en la banda Resumen. Para agregar una banda Título o Resumen 1) En el menú Informe, elija Título/Resumen. 2) Elija las bandas que desee. 3) Si quiere que la banda aparezca en su propia página, elija Nueva página. 4) Elija Aceptar. El Editor de informes mostrará las nuevas bandas.
2.1.21. Dar formato a los controles de campo Después de insertar un control de campo, puede cambiar el tipo de datos y el formato de impresión del control. Los tipos de datos pueden ser Carácter, Numérico, o Fecha. Cada uno de estos tipos tiene sus propias opciones de formato, incluyendo la opción de crear sus propias plantillas de formato. El formato determina cómo se muestra el campo cuando se imprime el informe o la etiqueta.
33
Manual de Genlis
Normalmente, podría convertir todo el resultado alfabético a mayúsculas, insertar comas o puntos decimales en el resultado numérico, mostrar el resultado numérico en formato de moneda, o convertir un formato de fecha a otro.
Definir formatos de control de campo Puede elegir entre diversas opciones de formato para cada tipo de datos. Para dar formato a un control de campo 1) Haga doble clic en el control Campo. 2) En el cuadro de diálogo Expresión de informe, elija el botón con tres puntos que hay después del cuadro Formato. 3) En el cuadro de diálogo Formato, seleccione el tipo de dato para el campo: Carácter, Numérico o Fecha. El área Opciones de edición muestra las opciones de formato disponibles para ese tipo de datos. Nota. Este tipo de datos se aplica sólo al control de informe. En él se refleja el tipo de datos de la expresión y no cambia el tipo de datos del campo en la tabla. 4)
Seleccione las opciones de justificación y formato que desee.
El cuadro de diálogo Formato muestra diferentes opciones dependiendo del tipo de datos elegido. Puede crear también una plantilla de formato mediante la introducción de ciertos caracteres en el cuadro de diálogo Formato. Justificar texto en un campo Puede justificar el contenido de un campo dentro del control. Esto no cambia la posición del control en el informe, sólo el contenido del control. Para justificar texto en un control de campo 1) Seleccione los controles que quiere cambiar. 2) En el menú Formato, elija Alinear texto. 3) En el submenú, elija el comando adecuado. Para justificar texto en un campo 1) Haga doble clic en el control Campo. 2) En el cuadro de diálogo Expresión de informe, elija el botón con tres puntos que hay después del cuadro Formato.
34
Manual de Genlis
3) 4)
En el cuadro de diálogo Formato, seleccione el tipo de datos para el campo: Carácter, Numérico o Fecha. Seleccione las opciones de justificación y formato que desee.
Cambiar fuentes Puede cambiar la fuente y el tamaño del texto para cada campo o control de etiqueta, o bien puede cambiar la fuente predeterminada para el informe. Para cambiar las fuentes y su tamaño en un informe 1) 2) 3)
Seleccione el control. En el menú Formato, elija Fuente. Aparecerá el cuadro de diálogo Fuente. Seleccione la fuente apropiada y su tamaño en puntos. A continuación, elija Aceptar.
Para cambiar la fuente predeterminada 1) En el menú Informe, elija Fuente predeterminada. 2) En el cuadro de diálogo Fuente, seleccione la fuente apropiada y el tamaño en puntos que quiera usar como predeterminado. Luego elija Aceptar. Los controles que inserte reflejarán la nueva configuración de fuente.
2.1.22. Agregar líneas, rectángulos y círculos Las líneas, rectángulos y círculos, añaden un interés visual a la distribución de su diseño. Puede usarlos para separar o destacar partes del informe.
Dibujar líneas
35
Manual de Genlis
Puede agregar líneas verticales y horizontales a su informe con el control Línea. A menudo, es posible que quiera líneas entre los detalles contenidos en el cuerpo del informe y la información del encabezado y el pie. Para dibujar una línea
1) 2)
En la barra de herramientas Controles de informe, elija el botón Línea. En el Editor de informes, arrastre el mouse para ajustar el tamaño de línea.
Después de dibujar la línea, puede moverla, ajustar su tamaño, o cambiar su grosor y color. Para ver más información al respecto, consulte la sección Cambiar el estilo o el grosor de línea de este capítulo.
Dibujar rectángulos Puede dibujar rectángulos en su distribución para organizar visualmente la información que se imprime en la página. Puede utilizarlos como bordes alrededor de los controles y bandas del informe, o también como bordes para toda la página. Para dibujar un rectángulo 1) 2)
En la barra de herramientas Controles de informe, elija el botón Rectángulo. En el Editor de informes arrastre el mouse para ajustar el tamaño del rectángulo.
Dibujar rectángulos redondeados y círculos Puede dibujar círculos o rectángulos con varios tipos de esquinas redondeadas. Para dibujar un rectángulo o un círculo 1) 2) 3)
36
En la barra de herramientas Controles de informe, elija el botón Rectángulo redondeado. En el Editor de informes, arrastre para ajustar el tamaño del control. Haga doble clic en el control.
Manual de Genlis
4) 5) 6)
En el área Estilo, elija el estilo de esquina que desee. Si es apropiado, establezca las opciones de posición. Elija Aceptar.
Cambiar el estilo o el grosor de línea Puede cambiar el grosor de las líneas usadas para trazar líneas horizontales y verticales, rectángulos y rectángulos redondeados hasta un ancho de 6 puntos. También puede cambiar el estilo de la línea, desde una línea de puntos hasta una combinación de líneas y puntos. Para cambiar el tamaño o el estilo de la línea 1) Seleccione el control de línea, rectángulo o rectángulo redondeado que quiere cambiar. 2) En el menú Formato, elija Borde. 3) En el submenú, seleccione el tamaño o el estilo apropiado.
2.1.23. Agregar una imagen Puede insertar una imagen como parte de un informe. Por ejemplo, el logotipo de una compañía puede aparecer en el encabezado de página de una factura. Las imágenes procedentes de un archivo son estáticas, es decir, no cambian con cada registro o grupo de registros. Si quiere cambiar la presentación dependiendo del registro, inserte un campo general en su lugar. Para agregar una imagen
37
Manual de Genlis
1) 2)
En la barra de herramientas Controles de informe, elija el botón Imagen/Control OLE dependiente. En el Editor de informes, arrastre para ajustar el tamaño de la imagen.
3) 4)
En el área Origen de la imagen, elija Archivo. En el cuadro Archivo, escriba la ubicación del archivo. O bien, Elija el botón con tres puntos para seleccionar un archivo del tipo .BMP o .ICO. Si es apropiado, ajuste el tamaño, la posición o las opciones de impresión. Elija Aceptar.
5) 6)
2.1.24. Cambiar el color de los controles Puede cambiar el color de un campo, etiqueta, línea o rectángulo.
Para cambiar colores 1) Seleccione los controles cuyo color desea cambiar. 2) En la barra de herramientas Paleta de colores, elija Color de primer plano o Color de fondo. 3) Elija el color que desee.
38
Manual de Genlis
2.1.25. Agregar un comentario a un control Mientras crea o cambia un control, puede querer incluir una descripción. El cuadro de diálogo de cada control ofrece un cuadro de comentario. Esos comentarios se guardan con el archivo de distribución, pero no aparecen en el informe o la etiqueta impresos. Para agregar un comentario a un control 1) Haga doble clic en el control. 2) Introduzca el comentario en el cuadro Comentario del cuadro de diálogo del control. 3) Elija Aceptar.
2.1.26. Vista e impresión de su informe o etiqueta Después de comenzar la distribución de su informe o etiqueta, puede hacer una presentación preliminar de su trabajo o bien imprimir un informe o etiqueta. Puede hacer una presentación preliminar en cualquier momento mientras está personalizando la distribución.
2.1.27. Vista de los resultados Haciendo una vista previa de un informe podrá ver cómo queda en la página sin necesidad de imprimirlo antes. Por ejemplo, puede comprobar la alineación y el espaciado de las columnas de datos o ver si el informe está devolviendo los datos que desea. Tiene dos opciones: ver una página entera o hacer zoom para acercar una parte de una página del informe. La ventana Vista previa tiene su propia barra de herramientas, con botones que pueden llevarle de una página a otra del informe. Precaución Si aparece la pregunta “¿Desea guardar los cambios en su archivo?”, es que ha seleccionado no sólo cerrar la ventana Vista previa, sino también el archivo de distribución. Puede seleccionar el botón Cancelar para regresar a la presentación preliminar o el botón Guardar para guardar sus cambios y cerrar el archivo. Si selecciona No, los cambios realizados en la distribución no se guardarán. Para hacer una vista previa de su distribución 1) En el menú Ver, elija Vista previa.
39
Manual de Genlis
2) 3) 4) 5)
En la barra de herramientas Vista preliminar, elija Página anterior o Página siguiente para cambiar de página. Para cambiar el tamaño de la imagen del informe, elija Zoom. Para imprimir el informe, elija Imprimir. Para volver al modo de diseño, elija Cerrar presentación preliminar.
2.1.28. Imprimir informes El archivo de distribución de informe o de etiquetas creado mediante el Editor de informes es un entorno que da formato a los datos en una agradable presentación para imprimir. Procesa los registros en el orden en que aparecen en el origen de datos. Si usa directamente los datos desde una tabla, los datos no se ordenarán para los grupos que puede haber en la distribución. Antes de imprimir un archivo de informe, deberá asegurarse de que el origen de datos se ordenará y que dicho orden es el apropiado. Si la tabla forma parte de una base de datos, cree una vista y agréguela al entorno de datos del informe. La vista ordenará los datos por usted. Si el origen de datos es una tabla libre, puede crear y ejecutar una consulta que use el informe como su destino. Para imprimir un informe 1) En el menú Archivo, elija Imprimir.
40
Manual de Genlis
2)
Elija Aceptar.
Nota. Si el entorno de datos no está establecido, el cuadro de diálogo Abrir aparecerá con una lista de tablas entre las cuales puede elegir. Genlis enviará el informe a la impresora.
41
Manual de Genlis
3. SQL (SELECT) Esta instrucción sirve para recupera datos de una o más tablas.
3.1. Sintaxis SELECT [ALL | DISTINCT] [TOP nExpresión [PERCENT]] [Alias.] Elemento_Selección [AS Nombre_Columna] [, [Alias.] Elemento_Selección [AS Nombre_Columna] ...] FROM [FORCE] [NombreBaseDatos!]Tabla [Local_Alias] [[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN NombreBaseDatos!]Tabla [Alias_Local] [ON CondiciónCombinación …] [PREFERENCE NombrePreferencia] [WHERE CondiciónCombinación [AND CondiciónCombinación ...] [AND | OR CondiciónFiltro [AND | OR CondiciónFiltro ...]]] [GROUP BY ColumnaGrupo [, ColumnaGrupo ...]] [HAVING CondiciónFiltro] [UNION [ALL] SELECTCommand] [ORDER BY Elemento_Orden [ASC | DESC] [, Elemento_Orden [ASC | DESC] ...] [INTO CURSOR Cur_Destino]]
3.2. Argumentos SELECT Especifica los campos, constantes y expresiones que se mostrarán en el resultado de la consulta. ALL De forma predeterminada, se muestran todas las filas del resultado de la consulta. DISTINCT Excluye duplicados de cualquier fila del resultado de la consulta. Nota. Puede utilizar DISTINCT únicamente una vez por cláusula SELECT. TOP nExpresión [PERCENT]. Especifica que el resultado de la consulta contenga un número determinado de filas o un porcentaje de filas en el resultado de la consulta. Es necesario incluir una cláusula ORDER BY si incluye la cláusula TOP. La cláusula ORDER BY especifica las columnas en las que la cláusula TOP determinará el número de filas que se va a incluir en el resultado de la consulta.
42
Manual de Genlis
Puede especificar desde 1 a 32,767 filas. Las filas de valores idénticos para las columnas especificadas en la cláusula ORDER BY se incluyen en el resultado de la consulta. A partir de entonces, si especifica 10 para nExpr, el resultado de la consulta podrá obtener más de 10 filas si hay más de 10 filas con valores idénticos para las columnas especificadas en la cláusula ORDER BY. Si se incluye la palabra clave PERCENT, se redondeará al número entero más alto el número de columnas devuelto en el resultado. Los valores permitidos para nExpr cuando se incluye la palabra clave PERCENT son 0.01 a 99.99. ALIAS. Califica nombres de elementos coincidentes. Cada elemento que especifique con Elemento_Selección genera una columna de los resultados de la consulta. Si dos o más elementos tienen el mismo nombre, incluya el alias de la tabla y un punto antes del nombre del elemento para impedir la duplicación de las columnas. ELEMENTO_SELECCIÓN especifica un elemento a incluir en el resultado de la consulta. Un elemento puede ser uno de los siguientes: · ·
El nombre de un campo de una tabla de la cláusula FROM. Una constante especificando que el mismo valor constante ha de aparecer en cada fila del resultado de la consulta.
AS Nombre_Columna Especifica el título de una columna en el resultado de la consulta. Esta opción resulta muy útil cuando Elemento_Selección es una expresión o contiene una función de campo y desea dar un nombre significativo a la columna. Nombre_Columna puede ser una expresión pero no puede contener caracteres (por ejemplo, espacios) que no estén permitidos para nombres de campos de tablas. FROM Enumera las tablas que contienen los datos que obtuvo la consulta. Si no hay ninguna tabla abierta, Genlis mostrará el cuadro de diálogo Abrir para permitirle especificar la ubicación del archivo. Una vez abierta, la tabla permanecerá abierta cuando la consulta se haya terminado. FORCE Especifica que las tablas se combinarán en el orden de aparición en la cláusula FROM. Si se omite FORCE, Genlis intentará optimizar la consulta. Sin embargo, es posible que la consulta se ejecute más rápido si se incluye la palabra clave FORCE para desactivar la optimización de consultas de Genlis. NombreBaseDatos! Especifica el nombre de una base de datos inactiva que contiene la tabla. Es necesario incluir el nombre de la base de datos que contiene la tabla en caso de que no sea la base de datos activa. Incluya el delimitador de signo de exclamación (!) después del nombre de la base de datos y antes del nombre de la tabla. Alias_Local Especifica un nombre temporal para la tabla indicada en Tabla. Si especifica un alias local, debe utilizar el alias local en lugar de la tabla a través de todo el SELECT. INNER JOIN Especifica que el resultado de la consulta contenga sólo filas para una tabla con la que coincidan una o varias filas en otra tabla.
43
Manual de Genlis
LEFT [OUTER] JOIN Especifica que el resultado de la consulta contenga todas las filas de la tabla a la izquierda de la palabra clave JOIN y sólo las filas que concuerden procedentes de la tabla a la derecha de la palabra clave JOIN. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinación externa. RIGHT [OUTER] JOIN Especifica que el resultado de la consulta contenga todas las filas desde la tabla hasta la derecha de la palabra clave JOIN y sólo las filas que concuerden desde la tabla hasta la izquierda de la palabra clave JOIN. La palabra clave OUTER es opcional; puede incluirse para resaltar la creación de una combinación externa. FULL [OUTER] JOIN Especifica que el resultado de la consulta contenga todas las filas, concuerden o no, de ambas tablas. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinación externa. ON CondiciónCombinación Especifica las columnas según las cuales se combinan las tablas. INTO Destino Determina donde se almacenan los resultados de la consulta. Si incluye una cláusula INTO y una cláusula TO en la misma consulta, la cláusula TO se pasará por alto. Los resultados de la consulta pueden dirigirse también a la impresora o a un archivo mediante la cláusula TO. CURSOR NombreCursor [NOFILTER], que almacena los resultados de la consulta en un cursor. Si especifica el nombre de una tabla abierta, Genlis generará un mensaje de error. Después de que se ejecute SELECT, el cursor temporal permanecerá abierto y estará activo pero solamente para lectura. Una vez que cierre este cursor temporal, se borrará. Los cursores pueden existir como un archivo temporal en la unidad SORTWORK. WHERE Indica a Genlis que incluya únicamente ciertos registros en el resultado de la consulta. WHERE es necesario para recuperar datos de varias tablas. CondiciónCombinación especifica los campos que vinculan las tablas de la cláusula FROM. Si incluye más de una tabla en una consulta, deberá especificar una condición de combinación para cada tabla después de la primera. Las condiciones de combinación múltiple deben conectarse mediante el operador AND. Cada condición de combinación tiene la forma siguiente: NombreCampo1 Comparación NombreCampo2 NombreCampo1 es el nombre de un campo de una tabla, NombreCampo2 es el nombre de un campo de otra tabla y Comparación es uno de los operadores siguientes:
Operador =
44
Comparación Igual
Manual de Genlis
== LIKE , !=, # > >= < = 1000 Ejemplo 3 En el Ejemplo 3 se muestra CondiciónFiltro de NombreCampo Comparación ALL (Subconsulta) Cuando la condición de filtro incluye ALL, el campo debe cumplir la condición de comparación para todos los valores generados por la subconsulta antes de que se incluya el registro en el resultado de la consulta. company < ALL ; (SELECT company FROM customer WHERE country = "Reino Unido")
45
Manual de Genlis
Ejemplo 4 En el Ejemplo 4 se muestra CondiciónFiltro de NombreCampo Comparación ANY | SOME (Subconsulta) Cuando la condición de filtro incluye ANY o SOME, el campo debe cumplir la condición de comparación en al menos uno de los valores generados por la subconsulta. company < ANY ; (SELECT company FROM customer WHERE country = "Reino Unido") Ejemplo 5 En el Ejemplo 5 se muestra CondiciónFiltro de NombreCampo [NOT] BETWEEN Inicio_Rango AND Fin_Rango Este ejemplo comprueba si los valores del campo están dentro de un intervalo de valores especificado. customer.postalcode BETWEEN 90000 AND 99999 Ejemplo 6 En el Ejemplo 6 se muestra CondiciónFiltro de [NOT] EXISTS (Subconsulta) Este ejemplo comprueba si al menos una línea cumple los criterios de la subconsulta. Cuando la condición de filtro incluye EXISTS, la condición de filtro se evalúa como verdadera (.T.) a no ser que la subconsulta sea un conjunto vacío. EXISTS ; (SELECT * FROM orders WHERE customer.postalcode = orders.postalcode) Ejemplo 7 En el Ejemplo 7 se muestra CondiciónFiltro de NombreCampo [NOT] IN Conjunto_Valor Cuando una condición de filtro incluye IN, el campo debe contener uno de los valores antes de que el registro se incluya en los resultados de la consulta. customer.postalcode NOT IN ("98052","98072","98034") Ejemplo 8
46
Manual de Genlis
En el Ejemplo 8 se muestra CondiciónFiltro de NombreCampo [NOT] IN (Subconsulta) Aquí, el campo debe contener uno de los valores devueltos por la subconsulta antes de que su registro se incluya en los resultados de la consulta. customer.cust_id IN ; (SELECT orders.cust_id FROM orders WHERE orders.city="Seattle") Ejemplo 9 En el Ejemplo 9 se muestra CondiciónFiltro de NombreCampo [NOT] LIKE cExpresión customer.country NOT LIKE "Reino Unido" Esta condición de filtro busca cada uno de los campos que coinciden con cExpresión. Puede utilizar el signo de porcentaje (%) y subrayado ( _ ) como parte de cExpresión. El signo de porcentaje representa a cualquier secuencia de caracteres desconocidos en la cadena. El subrayado representa un solo carácter desconocido en la cadena. GROUP BY ColumnaGrupo [, ColumnaGrupo ...] Agrupa las filas de la consulta basándose en los valores de una o más columnas. ColumnaGrupo puede ser el nombre de un campo normal de una tabla, o un campo que incluya una función de campo SQL, o una expresión numérica indicando la posición de la columna en la tabla resultado (la columna más a la izquierda tiene el número 1). HAVING CondiciónFiltro Especifica una condición de filtro que los grupos deben satisfacer para quedar incluidos en el resultado de la consulta. HAVING debe utilizarse con GROUP BY. Puede incluir tantas condiciones de filtro como se deseen, conectadas con el operador AND u OR. También puede utilizar NOT para invertir el valor de una expresión lógica. CondiciónFiltro no puede contener una subconsulta. Una cláusula HAVING sin una cláusula GROUP BY actúa como una cláusula WHERE. Puede utilizar alias locales y funciones de campo en la cláusula HAVING. Utilice una cláusula WHERE para acelerar el rendimiento si su cláusula HAVING no contiene funciones de campo. No olvide que la cláusula HAVING debería de aparecer antes de una cláusula INTO porque, de lo contrario, se producirá un error de sintaxis. [UNION [ALL] ComandoSELECT] Combina el resultado final de una SELECT con el resultado final de otra SELECT. De forma predeterminada, UNION comprueba el resultado combinado y elimina las filas duplicadas. Puede utilizar paréntesis para combinar múltiples cláusulas UNION. Utilice la palabra clave opcional ALL para impedir que UNION elimine filas duplicadas de los resultados combinados.
47
Manual de Genlis
Las cláusulas UNION siguen las reglas siguientes: · No puede utilizar UNION para combinar subconsultas. · La salida de ambos SELECT debe tener el mismo número de columnas. · Cada columna de los resultados de la consulta de un SELECT debe tener el mismo tipo de dato y anchura que su columna correspondiente en el otro SELECT. · Únicamente el SELECT final puede tener una cláusula ORDER BY, que debe referirse a las columnas de salida por su número. Si se incluye otra cláusula ORDER BY, afectará al resultado completo. También puede usar la cláusula UNION para simular una combinación externa. Cuando combina dos tablas en una consulta, solamente se incluyen en la salida los registros que tengan valores coincidentes en los campos de combinación. Si un registro de la tabla primaria no tiene un registro correspondiente en la tabla secundaria, el registro de la tabla primaria no se incluye en la salida. Una combinación externa le permite incluir todos los registros de la tabla primaria en la salida, junto con los registros coincidentes de la tabla secundaria. Para crear una combinación externa en Genlis, necesita utilizar un comando SELECT anidado, como en el siguiente ejemplo: SELECT customer.company, orders.order_id, orders.emp_id ; FROM customer, orders ; WHERE customer.cust_id = orders.cust_id ; UNION ; SELECT customer.company, " ", " " ; FROM customer ; WHERE customer.cust_id NOT IN ; (SELECT orders.cust_id FROM orders) Nota. Asegúrese de incluir el espacio que aparece justo delante de cada punto y coma. De lo contrario, recibirá un error. La sección del comando situada antes de la cláusula UNION selecciona los registros de ambas tablas que contienen valores coincidentes. Las empresas cliente que no tengan facturas asociadas no se incluyen. La sección del comando situada tras la cláusula UNION selecciona los registros de la tabla customer que no tienen registros coincidentes en la tabla orders. En lo que respecta a la segunda sección del comando, observe lo siguiente: · ·
48
La instrucción SELECT incluida entre paréntesis se procesa en primer lugar. Esta instrucción da como resultado una selección de todos los números de clientes de la tabla orders. La cláusula WHERE busca todos los números de cliente de la tabla customer que no están en la tabla orders. Puesto que la primera sección del comando proporcionó todas las empresas que tenían un número de cliente en la tabla orders, todas las empresas de la tabla customer están incluidas en los resultados de la consulta.
Manual de Genlis
·
Puesto que las estructuras de las tablas incluidas en UNION deben ser idénticas, hay dos marcadores de posición en la segunda instrucción SELECT para representar orders.order_id y orders.emp_id de la primera instrucción SELECT.
Nota. Los marcadores de posición deben ser del mismo tipo que los campos que representan. Si el campo es de tipo Date, el marcador de posición deberá ser { / / }. Si el campo es de tipo Character, el marcador de posición deberá ser la cadena vacía (""). ORDER BY Elemento_Orden Ordena el resultado de la consulta basándose en los datos de una o varias columnas. Cada Elemento_Orden debe corresponder a una columna del resultado de la consulta, y puede ser uno de los siguientes: · ·
Un campo de una tabla FROM que también es un elemento de selección en la cláusula principal SELECT (no en una subconsulta). Una expresión numérica que indica la ubicación de la columna en la tabla resultante. (La columna de la izquierda es la número 1.)
ASC Especifica un orden ascendente para los resultados de la consulta, de acuerdo con el elemento o los elementos de orden, y es el valor predeterminado para ORDER BY. DESC Especifica un orden descendente para los resultados de la consulta. Los resultados de la consulta aparecerán desordenados si no especifica un orden con ORDER BY.
3.2.1. Comentarios Una subconsulta, a la que se hace referencia en los argumentos siguientes, es un comando SELECT dentro de otro SELECT y debe incluirse entre paréntesis. Puede tener múltiples subconsultas al mismo nivel (no anidadas) en la cláusula WHERE (consulte esta sección de los argumentos). Las subconsultas pueden contener múltiples condiciones de combinación. Cuando se obtiene el resultado de una consulta, las columnas se denominarán según las siguientes reglas: -
Si un elemento seleccionado es un campo con un nombre único, el nombre de la columna de resultado es el nombre del campo.
-
Si hay más de un elemento seleccionado con el mismo nombre, se añadirán un signo de subrayado y una letra al nombre de la columna. Por ejemplo, si una tabla llamada Cliente tiene un campo llamado CALLE, y una tabla llamada Empleados también tiene un campo llamado CALLE, las columnas de resultado se llamarán Extensión_A y Extensión_B (CALLE _A y CALLE _B). En el caso de un elemento seleccionado con un nombre de 10 caracteres, se truncará el nombre para añadir el símbolo de subrayado y la letra. Por ejemplo, DEPARTMENT se convertiría en DEPARTME_A.
49
Manual de Genlis
-
Si un elemento seleccionado es una expresión, su columna de resultado se llamará EXP_A. Cualquier otra expresión recibirá el nombre de EXP_B, EXP_C, y así sucesivamente.
-
Si un elemento seleccionado contiene una función de campo como, por ejemplo, COUNT( ), la columna de resultado se llamará CNT_A. Si otro elemento seleccionado contiene SUM( ), su columna de resultado se llamará SUM_B.
Funciones definidas por el usuario con SELECT aunque la utilización de funciones definidas por el usuario en la cláusula SELECT ofrece unas ventajas evidentes, también debería tener en cuenta las siguientes limitaciones: Las siguientes funciones de campo están disponibles para ser utilizadas con un elemento seleccionado que sea un campo o una expresión que implique a un campo: - AVG(Elemento_Selección), que realiza una media de una columna de datos numéricos. - COUNT(Elemento_Selección), que cuenta el número de elementos seleccionados en una columna. COUNT(*) cuenta el número de filas en el resultado de la consulta. - MIN(Elemento_Selección) determina el menor valor de Elemento_Selección en una columna. - MAX(Elemento_Selección) determina el mayor valor de Elemento_Selección en una columna. - SUM(Elemento_Selección) que proporciona el total de la suma de una columna de datos numéricos. No se pueden probar las funciones de campo. Combinaciones Genlis acepta sintaxis de combinación de 1992 SQL ANSI, lo que le permite crear consultas que vinculen las filas en dos o más tablas mediante la comparación de los valores de campos especificados. Por ejemplo, una combinación interna selecciona filas procedentes de dos tablas sólo cuando los valores de los campos combinados son iguales. Genlis admite combinaciones anidadas. Dado que SQL se basa en la teoría de conjuntos matemática, se puede representar a cada tabla con un círculo. La cláusula ON que especifica las condiciones de la combinación determina el punto de intersección, el cual representa el conjunto de filas que coinciden. En el caso de una combinación interna, la intersección tendrá lugar en el interior o en una parte “interna” de los dos círculos. Una combinación externa incluye tanto las filas coincidentes que se han encontrado en la sección de intersección interna de las tablas, como las filas de la parte externa del círculo a la izquierda, o a la derecha, de la intersección. Importante. Tenga presente la siguiente información a la hora de crear condiciones de combinación:
50
-
Si incluye dos tablas en una consulta y no especifica una condición de combinación, cada registro de la primera tabla se combinará con cada registro de la segunda tabla hasta que surtan efecto las condiciones del filtro. Una consulta tal puede producir unos resultados interminables.
-
Sea prudente al utilizar, en condiciones de combinación, funciones tales como DELETED( ), EOF( ), FOUND( ), RECCOUNT( ), y RECNO( ), que aceptan un área de trabajo o un alias opcional. La inclusión de un alias o de un área de trabajo en dichas funciones puede producir resultados
Manual de Genlis
inesperados. SELECT no utiliza sus áreas de trabajo; realiza lo equivalente a USE ... AGAIN. Las consultas de una única tabla que utilizan estas funciones sin un área de trabajo o un alias opcional, tendrán resultados correctos. De todas formas, las consultas de varias tablas que utilicen dichas funciones (incluso sin un área de trabajo o un alias opcional) pueden tener resultados inesperados. -
Sea prudente al combinar tablas que contengan campos vacíos porque Genlis concuerda campos vacíos. Por ejemplo, si combina CUSTOMER.ZIP e INVOICE.ZIP, y CUSTOMER contiene 100 códigos postales vacíos e INVOICE contiene 400 códigos postales vacíos, el resultado de la consulta contendrá 40.000 registros más, como resultado de los campos vacíos. Use la función EMPTY( ) para eliminar los registros vacíos del resultado de la consulta.
51
Manual de Genlis
4. Instrucciones avanzadas En esta sección se describe brevemente el tipo de programas que se puede realizar para recuperar los datos (Recuerde que además de las instrucciones SQL puede escribir programas realizados con la sintaxis de Visual Foxpro con ciertas limitaciones).
Conceptos básicos de programación o Almacenar datos: Tipos de datos y campos, contenedores o Manipular datos: Operadores, funciones y comandos o Control de flujo o Lista de funciones agrupadas por tipo Funciones ordenadas alfabéticamente de la A-Z Limitaciones y observaciones sobre la codificación de instrucciones
4.1. Conceptos básicos de programación Cuando se programa, se almacenan datos y se manipulan mediante una serie de instrucciones. Los datos y los contenedores en los que se almacenan los datos constituyen la materia prima de la programación. Las herramientas utilizadas para manipular esta materia prima son comandos, funciones y operadores.
4.1.1. Almacenar datos: Tipos de datos y campos, contenedores Los datos con los que trabaja probablemente incluyan períodos de tiempo, dinero y elementos contables, así como fechas, nombres, descripciones, etc. Cada dato corresponde a un determinado tipo, es decir, pertenece a una categoría de datos que se manipula de maneras similares. Podría trabajar directamente con estos datos sin almacenarlos, si bien perdería la mayor parte de la flexibilidad y potencia que ofrece Genlis. Genlis aporta numerosos contenedores de almacenamiento con el fin de ampliar su capacidad para manipular fácilmente los datos. Los tipos de datos determinan la manera en que se almacenan los datos y la forma en que se pueden utilizar tales datos. Puede multiplicar dos números, pero no puede multiplicar caracteres. Puede imprimir caracteres en mayúsculas, pero no puede imprimir números en mayúsculas. En la tabla siguiente se muestran algunos de los principales tipos de datos de Genlis. Todos los datos de Genlis tienen un tipo, como una descripción de los valores permitidos, y el intervalo y tamaño de los valores. Cuando haya especificado el tipo de datos que está usando, Genlis puede almacenar y manipular los datos de forma eficaz.
52
Manual de Genlis
Las variables y las matrices contienen un subconjunto de los tipos de datos disponibles de Genlis. Los tipos de datos adicionales sólo están disponibles para campos de la tabla. Para agregar un campo de un tipo específico a una tabla mediante programación, especifique el tipo de campo con una letra. Puede especificar el tipo de datos que se almacena en cada campo de una tabla cuando crea la tabla. El tipo de datos de una variable o un elemento de matriz está determinado por el valor almacenado en la variable o elemento de matriz. La tabla siguiente muestra los tipos de datos de Genlis.
Tipos de datos de Genlis Tipo de dato
Descripción
Tamaño
Intervalo
Character
Cualquier texto
1 byte por carácter hasta 254
Cualquier carácter
Currency
Cantidades monetarias
8 bytes
Date
Datos cronológicos formados por mes, año y día
8 bytes
DateTime
Datos cronológicos formados por mes, año, día y hora
8 bytes
Logical
Valor booleano verdadero o falso
1 byte
Numeric
Variant
922337203685477,5807 a 922337203685477,5807 Al usar formatos de fecha estrictos, {^000101-01}, 1 de enero, 1 d.C. a {^9999-12-31}, 31 de diciembre, 9999 d.C. Al usar formatos de fecha estrictos, {^000101-01}, 1 de enero, 1 d.C. a {^9999-12-31}, 31 de diciembre, 9999 d.C., más 00:00:00 a.m. a 11:59:59 p.m. Verdadero (.T.) o Falso (.F.)
8 bytes en la memoria. Enteros o fracciones 9999999999E+19 a .9999999999E+20 1 a 20 bytes en una tabla Una variable de tipo Variant puede contener cualquier tipo de datos de Genlis y el valor Null. Una vez que se almacena un valor en una variable del tipo Variant, ésta asume el tipo de los datos que contiene. Las variables tipo Variant se designan con el prefijo e en la sintaxis del lenguaje.
Además, Genlis proporciona tipos de datos que se aplican únicamente a campos de tablas.
Tipos de campos de Genlis Tipo de campo
Descripción
Tamaño
Double
Número de signo flotante de precisión doble
8 bytes
Float
Igual que Numeric
General Integer
Referencia a un objeto OLE Valores enteros Referencia a un bloque de datos Datos de tipo Character que quiere mantener sin modificación en páginas de
Memo Character (Binario)
Intervalo
8 bytes en memoria; 1 a 20 bytes en una tabla 4 bytes en una tabla 4 bytes
+/-4,94065645841247E-324 a +/8,9884656743115E307 - .9999999999E+19 a .9999999999E+20 Limitado por la memoria disponible -2147483647 a 2147483647
4 bytes en una tabla
Limitado por la memoria disponible
1 byte por carácter hasta 254
Cualquier carácter
53
Manual de Genlis
Memo (Binario)
códigos Datos de campo Memo que quiere mantener sin modificación en páginas de códigos
4 bytes en una tabla
Limitado por la memoria disponible
Sugerencia Puede usar la función TYPE( ) para determinar el tipo de datos almacenado en una variable, un elemento de matriz o un campo.
Contenedores de datos Los contenedores de datos le permiten realizar las mismas operaciones con varios datos. Por ejemplo, sumar las horas que ha trabajado un empleado, multiplicarlas por el salario por hora y restar los impuestos para determinar el sueldo que ha percibido el empleado. Deberá realizar estas operaciones para cada empleado y para cada período de pago. Si almacena esta información en contenedores y realiza las operaciones sobre éstos, bastará con sustituir los datos antiguos por los nuevos datos y volver a ejecutar el mismo programa. En la siguiente tabla se enumeran algunos de los principales contenedores de datos disponibles en Genlis:
Contenedores de datos Tipo Variables Registros de tabla Matrices
Descripción Elementos individuales de datos almacenados en la memoria RAM (memoria de acceso aleatorio) del PC. Varias filas de campos predeterminados, cada uno de los cuales puede contener un dato definido previamente. Las tablas se guardan en disco. Varios elementos de datos almacenados en la memoria RAM.
4.1.2. Manipular datos: Operadores, funciones y comandos Los contenedores y los tipos de datos le ofrecen los módulos que necesita para manipular los datos. Los elementos finales son los operadores, las funciones y los comandos.
4.1.2.1. Usar Operadores Los operadores permiten manipular datos del mismo tipo. En las siguientes secciones, los operadores de Genlis se agrupan según los siguientes tipos de datos y funciones: Operadores para caracteres Operadores para tipos Date y DateTime
54
Manual de Genlis
Operadores para el tipo Logical Operadores relacionales Operadores para el tipo Numeric
Operadores para caracteres Puede agrupar y comparar datos de caracteres mediante los operadores para caracteres +, -, y $. En la siguiente tabla se muestran los operadores de expresión de caracteres en orden de preferencia.
Operadores para caracteres Operador
Acción
Código
+
Concatenación
-
Concatenación
$
Comparación
Combina dos cadenas, una cadena y un campo, o una cadena y una variable. 'Buenos ' + 'días' Quita los espacios finales del elemento anterior al operador y luego combina dos elementos: customer.first - customer.last Busca una expresión de caracteres dentro de otra: 'padre' $ 'padres'
Operadores para los tipos Date y DateTime Los siguientes operadores actúan en fechas y en horas.
Operadores para los tipos Date y DateTime Operador
Acción
Código
+
Suma
-
Resta
NewTime = tTime1 + nSeconds dNewDate = dDate1 + nDays nSeconds = tTime1 - tTime2 tNewTime = tTime1 - nSeconds dNewDate dDate1 - nDays
=
Comparación
Operadores para el tipo Logical Los operadores para el tipo Logical funcionan con todos los tipos de datos y devuelven un valor Logical. En la siguiente tabla se muestran los operadores para el tipo Logical en orden de preferencia.
Operadores para el tipo Logical Operador () NOT, ! AND OR
Acción
Código
Grupos de expresiones Lógico negativo AND lógico OR lógico inclusivo
cVar AND (cVar2 AND cVAR3) IF NOT cVarA = cVarB IF ! nVar1 = nVar2 lVar0 AND lVar9 lVarX OR lVarY
55
Manual de Genlis
Operadores relacionales Los operadores relacionales funcionan con todos los tipos de datos y devuelven un valor Logical. En la siguiente tabla se muestran los operadores relacionales.
Operadores relacionales Operador < > = , #, != = ==
Acción
Código
Menor que Mayor que Igual que Distinto d Menor o igual que Mayor o igual que Comparación de cadenas de caracteres
23 < 54 1>2 cVar1 = cVar2 .T. .F. {^1998/02/16} = nSuedad Status == "Abrir"
Se puede usar el operador == para comparar cadenas de caracteres de forma exacta. Al comparar dos expresiones de caracteres mediante el operador ==, las expresiones a ambos lados de dicho operador se consideran iguales si contienen exactamente los mismos caracteres, incluidos los espacios en blanco. La configuración de SET EXACT se pasa por alto al comparar cadenas de caracteres con el operador ==.
Operadores para el tipo Numeric Los operadores para el tipo Numeric trabajan con todos los valores del tipo Numeric. En la siguiente tabla se muestran los operadores para el tipo Numeric en orden de preferencia.
Operadores para el tipo Numeric Operador () **, ^ *, / % +, -
Acción
Código
Subexpresiones de grupo Exponenciación Multiplicación y división Módulo (resto( Suma y resta
(4 – 3) * (12 / nVar2) 3 ** 2 ; 3^2 2 * 7 ; 14 / 7 15 % 4 4 + 15
Recuerde que debe utilizar el mismo tipo de datos con cada operador. Las siguientes instrucciones almacenan dos datos numéricos en dos variables. Los nombres de variable empiezan con la letra n, por lo que se puede determinar de inmediato que contienen datos numéricos, pero puede nombrarlas con cualquier combinación de caracteres alfanuméricos y caracteres de subrayado. nPrimero = 123 nSegundo = 45 Las instrucciones siguientes almacenan dos datos de caracteres en dos variables. Los nombres de variable empiezan con la letra c para indicar que contienen datos de tipo character. cPrimero = "123"
56
Manual de Genlis
cSegundo = "45" Las dos operaciones siguientes, suma y concatenación, producen resultados distintos, ya que el tipo de datos es diferente en cada una de ellas. nPrimero + nSegundo cPrimero + cSegundo Resultado 168 12345 Puesto que cPrimero contiene caracteres y nSegundo contiene datos numéricos, se producirá un error de tipo de datos incorrecto si se intenta ejecutar el siguiente comando: cPrimero + nSegundo Puede evitar este problema si utiliza funciones de conversión. Por ejemplo, STR( ) devuelve el valor de tipo Character equivalente de un valor de tipo Numeric, mientras que VAL( ) devuelve el equivalente numérico de una cadena de caracteres formada por números. Estas funciones y LTRIM( ), que elimina los espacios iniciales, le permiten realizar las operaciones siguientes: cPrimero + LTRIM(STR(nSegundo)) VAL(cPrimero) + nSegundo Resultado 12345 168
4.1.2.2. Usar funciones Las funciones devuelven un tipo específico de datos. Por ejemplo, las funciones STR( ) y VAL( ) utilizadas en la sección anterior devuelven valores de tipo Character y Numeric, respectivamente. Al igual que ocurre con todas las funciones, estos tipos devueltos están documentados con las funciones. Hay cinco maneras de llamar a una función de Genlis: Asignar a una variable el valor que devuelve la función. La siguiente línea de código almacena la fecha actual del sistema en una variable denominada dHoy: dHoy = DATE( ) Incluir la llamada a la función en un comando de Genlis. El siguiente comando establece el directorio predeterminado como el valor devuelto por la función GETDIR( ): CD GETDIR( ) Incluir la función dentro de otra función. La siguiente línea de código devuelve el día de la semana: ? DOW(DATE( )) A continuación se enumeran otros ejemplos de funciones utilizados en este capítulo: Función: Descripción.
57
Manual de Genlis
ISDIGIT( ): Devuelve el valor verdadero (.T.) si el carácter situado al comienzo de una cadena es un número; de lo contrario, devuelve el valor falso (.F.). LEN( ): Devuelve el número de caracteres de una expresión de caracteres. RECCOUNT( ): Devuelve el número de registros de la tabla que está activa en este momento. SUBSTR( ): Devuelve el número especificado de caracteres a partir de una cadena de caracteres, empezando en una posición especificada de la cadena.
4.1.2.3. Usar comandos Un comando hace que se realice una determinada acción. Cada comando dispone de una sintaxis específica que indica lo que se debe incluir con el fin de que se ejecute correctamente el comando. Hay también cláusulas opcionales asociadas a los comandos que permiten especificar de forma más detallada la acción que se desea realizar. A continuación se muestran algunos ejemplos de comandos utilizados en este capítulo:
4.1.3. Control del flujo del programa Genlis incluye una categoría especial de comandos que "envuelven" a otros comandos y funciones, y determinan cuándo y con qué frecuencia se ejecutan. Estos comandos permiten realizar bifurcaciones condicionales y bucles, dos herramientas de programación muy eficaces. El siguiente programa muestra el uso de las bifurcaciones y los bucles condicionales. Estos conceptos se describen de forma más detallada después del ejemplo. Suponga que su empresa cuenta con 10.000 empleados y desea conceder a todos aquéllos que ganan 3.000.000 de pesetas o más un aumento salarial del 3%, y a todos los que ganan menos de 3.000.000 de pesetas un aumento del 6%. El siguiente ejemplo de programa le permite hacerlo. Este programa presupone que en el área de trabajo actual está abierta una tabla que contiene un campo numérico denominado salario.
Programa de ejemplo para aumentar el salario de los empleados Código &&
Observaciones
SCAN && El código comprendido entre SCAN y ENDSCAN se ejecuta tantas veces como registros haya en la tabla. Cada vez que se ejecuta el código, el puntero de registro se desplaza al siguiente registro de la tabla. IF salario >= 3000000
58
Manual de Genlis
REPLACE salary WITH salario * 1,03 && Para cada registro, si el salario es mayor o igual que 3.000.000, este valor se sustituye por un nuevo salario que es un 3% superior. ELSE REPLACE salario WITH salario * 1,06 && Para cada registro, si el salario no es mayor o igual que 3.000.000, se sustituye este valor por un nuevo salario que es un 6% superior. ENDIF ENDSCAN && Final de la instrucción condicional IF. Final del código que se ejecuta para cada registro de la tabla. Este ejemplo utiliza comandos de bifurcación y bucle condicional para controlar el desarrollo del programa.
Bifurcación condicional La bifurcación condicional permite someter a prueba condiciones y, a continuación, en función del resultado de la prueba, realizar distintas operaciones. Genlis ofrece un comandos que permiten realizar una bifurcación condicional: IF ... ELSE ... ENDIF El código comprendido entre la instrucción inicial y la instrucción ENDIF o ENDCASE sólo se ejecuta si una condición lógica se evalúa como verdadera (.T.). En el programa de ejemplo, el comando IF se utiliza para distinguir entre dos estados: o el salario es de 3.000.000 pesetas o más, o no lo es. Se adoptan diferentes medidas, dependiendo del estado. En el siguiente ejemplo, si el valor almacenado en la variable nTempAgua es menor que 100, no se realizará ninguna acción: * definir una variable lógica como Verdadera si se cumple una condición. IF nTempAgua >= 100 lEbullición = .T. ENDIF Nota Un asterisco al principio de una línea de un programa indica que la línea es un comentario. Los comentarios ayudan al programador a recordar la función que debe realizar cada segmento de código, si bien Genlis los pasa por alto.
Bucles Un bucle le permite ejecutar una o más líneas de código tantas veces como sea necesario. En Genlis hay tres comandos que permiten realizar bucles: SCAN ... ENDSCAN FOR ... ENDFOR DO WHILE ... ENDDO Utilice SCAN cuando realice una serie de acciones para cada uno de los registros de una tabla, como en el ejemplo de programa descrito anteriormente. El bucle SCAN permite escribir el código una vez y ejecutarlo para cada registro a medida que el puntero de registro se desplaza por la tabla.
59
Manual de Genlis
Utilice FOR cuando sepa cuántas veces debe ejecutarse la sección de código. Por ejemplo, sabe que una tabla contiene un número específico de campos. Puesto que la función FCOUNT( ) de Genlis devuelve este número, puede utilizar un bucle FOR para imprimir los nombres de todos los campos de la tabla: FOR nRecuento = 1 TO FCOUNT( ) FIELD(nRecuento) ENDFOR Utilice DO WHILE cuando desee ejecutar una sección de código mientras cumpla una determinada condición. Tal vez no sepa cuántas veces debe ejecutarse el código, pero sí sabe cuándo debe detenerse la ejecución. Por ejemplo, supongamos que dispone de una tabla en la que figuran los nombres y las iniciales de una serie de personas y desea utilizar las iniciales para consultar los nombres de las personas. Surgiría un problema la primera vez que intentase agregar una persona cuyas iniciales fuesen las mismas que las de otra persona contenida en la tabla. Para resolver este problema, podría agregar un número a las iniciales. Por ejemplo, el código de identificación de Miguel Suárez podría ser MS. La siguiente persona cuyas iniciales fuesen las mismas, Margarita Sánchez, sería MS1. Si a continuación anexase María Sanz a la tabla, su código de identificación sería MS2. Un bucle DO WHILE permite localizar el número correcto que se debe adjuntar a las iniciales.
Programa de ejemplo que utiliza DO WHILE para generar un número de identificación único Código && Comentarios nAquí = RECNO() && Guardar la posición del registro. cIniciales = LEFT(nombre,1) + LEFT(apellido,1) nSufijo = 0 && Obtener las iniciales de la persona a partir de las primeras letras de los campos nombre y apellido. Si es necesario, establecer una variable que contenga el número que se debe agregar al final de las iniciales de una persona. LOCATE FOR id_persona = cIniciales && Comprobar si hay otra persona en la tabla cuyas iniciales son las mismas. DO WHILE FOUND( ) && Si en otro registro de la tabla hay un valor id_persona que coincide con cIniciales, la función FOUND( ) devolverá el valor verdadero (.T.) y se ejecutará el código contenido en el bucle DO WHILE. Si no se encuentra ninguna coincidencia, la siguiente línea de código que se ejecute será la línea que figura a continuación de ENDDO. nSufijo = nSufijo + 1 cIniciales = LEFT(cIniciales,2) + ALLTRIM(STR(nSufijo)) && Preparar un sufijo nuevo y anexarlo al final de las iniciales. CONTINUE && CONTINUE hace que se vuelva a evaluar el último comando LOCATE. El programa comprueba si el nuevo valor contenido en cIniciales ya existe en el campo id_persona de otro registro. Si es así, FOUND( ) seguirá devolviendo el valor .T. y se volverá a ejecutar el código contenido en el bucle DO WHILE. Si el nuevo valor contenido en cIniciales es efectivamente único, FOUND( ) devolverá el valor .F. y la ejecución del programa continuará con la línea de código que figura a continuación de ENDDO. ENDDO && Final del bucle DO WHILE. GOTO nAquí
60
Manual de Genlis
REPLACE id_persona WITH cIniciales && Volver al registro y almacenar el código de identificación único en el campo id_persona. Puesto que no hay manera de saber de antemano cuántas veces se encontrarán los códigos de identificación coincidentes que ya se están utilizando, se utiliza el bucle DO WHILE.
61
Manual de Genlis
5. Lista de funciones agrupadas por tipo 5.1. Funciones de tipo Character Las siguientes funciones operan sobre datos de tipo Character. $ (Operador) ALLTRIM( ) (Función) ASC( ) (Función) AT( ) (Función) AT_C( ) (Función) ATC( ) (Función) ATCC( ) (Función) ATCLINE( ) (Función) ATLINE( ) (Función) BETWEEN( ) (Función) CHR( ) (Función) CHRTRAN( ) (Función) CHRTRANC( ) (Función) CPCONVERT( ) (Función) CTOD( ) (Función) DIFFERENCE( ) (Función) DTOC( ) (Función) EMPTY( ) (Función) EVALUATE( ) (Función) INLIST( ) (Función) ISALPHA( ) (Función) ISDIGIT( ) (Función) ISLEADBYTE( ) ISLOWER( ) (Función) ISUPPER( ) (Función) LEFT( ) (Función) LEFTC( ) (Función) LEN( ) (Función) LENC( ) (Función) LIKE( ) (Función) LIKEC( ) (Función) LOWER( ) (Función) LTRIM( ) (Función) MAX( ) (Función) MIN( ) (Función) NORMALIZE( ) (Función)
62
Manual de Genlis
OCCURS( ) (Función) PADC( ) (Función) PADL( ) (Función) PADR( ) (Función) PROPER( ) (Función) RAT( ) (Función) RATC( ) (Función) RATLINE( ) (Función) REPLICATE( ) (Función) RIGHT( ) (Función) RIGHTC( ) (Función) RTRIM( ) (Función) SOUNDEX( ) (Función) SPACE( ) (Función) STR( ) (Función) STRCONV( ) (Función) STRTOFILE( ) Function STRTRAN( ) (Función) STUFF( ) (Función) STUFFC( ) (Función) SUBSTR( ) (Función) SUBSTRC( ) (Función) TRANSFORM( ) (Función) TRIM( ) (Función) TXTWIDTH( ) (Función) TYPE( ) (Función) UPPER( ) (Función)
5.2. Funciones de conversión de datos Estos datos convierten datos de un tipo de datos a otro. CHR( ) (Función) CTOD( ) (Función) CURVAL( ) (Función) DTOC( ) MTON( ) (Función) NTOM( ) (Función) NVL( ) (Función) STR( ) TRANSFORM( ) (Función) TTOC( ) (Función)
63
Manual de Genlis
TTOD( ) (Función) VAL( ) (Función)
5.3. Funciones de fecha y hora Las siguientes funciones generan y manipulan datos de fecha y hora. BETWEEN( ) (Función) CDOW( ) (Función) CMONTH( ) (Función) CTOD( ) (Función) CTOT( ) (Función) DATE( ) (Función) DATETIME( ) (Función) DAY( ) (Función) DMY( ) (Función) DOW( ) (Función) DTOC( ) (Función) DTOS( ) (Función) DTOT( ) (Función) EMPTY( ) (Función) FDATE( ) (Función) FTIME( ) (Función) GOMONTH( ) (Función) HOUR( ) (Función) INLIST( ) (Función) MAX( ) (Función) MDY( ) (Función) MIN( ) (Función) MINUTE( ) (Función) MONTH( ) (Función) SEC( ) (Función) SECONDS( ) (Función) SET HOURS (Comando) SET MARK TO (Comando) SET SECONDS (Comando) SYS(1) (Función) - Fecha de sistema Juliano SYS(2) (Función) - Segundos transcurridos desde media noche SYS(10) (Función) - Cadena de número de día SYS(11) (Función) - Número de día Juliano TIME( ) (Función) TTOC( ) (Función)
64
Manual de Genlis
TTOD( ) (Función) WEEK( ) (Función) YEAR( ) (Función)
5.4. Funciones numéricas Las siguientes funciones operan sobre datos numéricos o devuelven datos numéricos. % (Operador) ABS( ) (Función) ACOS( ) (Función) ASIN( ) (Función) ATAN( ) (Función) ATN2( ) (Función) BETWEEN( ) (Función) BITAND( ) (Función) BITCLEAR( ) (Función) BITLSHIFT( ) (Función) BITNOT( ) (Función) BITOR( ) (Función) BITRSHIFT( ) (Función) BITSET( ) (Función) BITTEST( ) (Función) BITXOR( ) (Función) CALCULATE (Comando) CEILING( ) (Función) COS( ) (Función) DTOR( ) (Función) EMPTY( ) (Función) EXP( ) (Función) FLOOR( ) (Función) FV( ) (Función) INLIST( ) (Función) INT( ) (Función) LOG( ) (Función) LOG10( ) (Función) MAX( ) (Función) MIN( ) (Función) MOD( ) (Función) PAYMENT( ) (Función) PI( ) (Función)
65
Manual de Genlis
PV( ) (Función) RAND( ) (Función) ROUND( ) (Función) RTOD( ) (Función) SET DECIMALS (Comando) SIGN( ) (Función) SIN( ) (Función) SQRT( ) (Función) TAN( ) (Función) VAL( ) (Función)
5.5. Funciones y comandos ordenados alfabéticamente 5.5.1. $ (Operador) Devuelve verdadero (.T.) si una expresión de caracteres está contenida dentro de otra expresión de caracteres; de lo contrario, devuelve falso (.F.).
Sintaxis cBuscar $ cBuscarEn
Tipos devueltos Logical
Argumentos cBuscar Especifica la expresión buscada en cBuscarEn. cBuscarEn Especifica la expresión en que se busca para comprobar si contiene cBuscar. Si en cBuscarEn se encuentra cBuscarEn, $ devolverá verdadero (.T.); de lo contrario, devolverá falso (.F.). cBuscar y cBuscarEn pueden ser variables de memoria o elementos de matriz de tipo carácter, campos de tipo carácter, literales de cadena de caracteres o campos memo de cualquier longitud. Los campos memo pueden manipularse de la misma forma que las expresiones de caracteres, los campos de tablas, las variables de memoria o los elementos de matriz.
Comentarios Si no se encuentra la expresión de caracteres, se devolverá falso (.F.). El operador $ distingue mayúsculas de minúsculas y no es optimizable mediante Rushmore.
66
Manual de Genlis
5.5.2. % (Operador) Devuelve el resto que se obtiene de dividir una expresión numérica por otra expresión numérica.
Sintaxis nDividendo % nDivisor
Argumentos nDividendo Especifica el dividendo (la expresión numérica que se divide). El número de decimales de nDividendo determina el número de decimales del resultado. nDivisor Especifica el divisor (la expresión numérica que divide al dividendo nDividendo). Se devolverá un número positivo si nDivisor es positivo y un número negativo si nDivisor es negativo. nDivisor no puede ser cero.
Comentario El operador módulo % y MOD( ) devuelven el mismo resultado. El operador módulo (%) es un operador aritmético. + (suma), - (resta), * (multiplicación), / (división) y ^ (exponenciación) son otros operadores aritméticos. Cuando estos operadores se combinan en una expresión numérica, % tiene la misma prioridad que * y /.
5.5.3. & (Comando) Realiza una sustitución de macro.
Sintaxis & NombreVariableMemoria[.cExpresión]
Argumentos & NombreVariableMemoria Especifica el nombre de la variable de memoria o del elemento de matriz al que se hace referencia en la sustitución de macro. No incluya el prefijo M., que distingue las variables de memoria de los campos. Esto causaría un error de sintaxis. La macro no debe superar la longitud máxima de instrucción permitida en Genlis. Una variable no puede hacer referencia a sí misma de forma recursiva en una sustitución de macro. Por ejemplo, lo siguiente genera un mensaje de error: STORE '&gcX' TO gcX
67
Manual de Genlis
? &gcX Las instrucciones de sustitución de macro que aparecen en DO WHILE, FOR y SCAN se evalúan únicamente al inicio del bucle y no se vuelven a evaluar en los bucles posteriores. No se reconocen los cambios efectuados en la variable de memoria o en el elemento de matriz que ocurran dentro del bucle. cExpresión El delimitador opcional punto (.) y .cExpresión se utilizan para anexar caracteres adicionales a una macro. cExpresión anexada a la macro con cExpresión también puede ser una macro. Si cExpresión es un nombre de propiedad, incluya un punto adicional (cExpresión..NombrePropiedad).
Comentarios La sustitución de macro trata el contenido de una variable de memoria o un elemento de matriz como un literal de cadena de caracteres. Cuando un signo (&) precede a una variable de memoria o un elemento de matriz de tipo carácter, el contenido de la variable o el elemento sustituye a la referencia de la macro. Puede utilizar la sustitución de macro en cualquier comando o función que acepte un literal de cadena de caracteres. Sugerencia. Siempre que sea posible, utilice una expresión de nombre en lugar de una sustitución de macro. Una expresión de nombre actúa de forma similar a una sustitución de macro. Sin embargo, una expresión de nombre está limitada a transferir cadenas de caracteres como nombres. Utilice una expresión de nombre para acelerar el proceso de forma significativa si un comando o una función acepta un nombre (un nombre de archivo, un nombre de ventana, un nombre de menú, etc.)
5.5.4. && (Comando) Indica el principio de un comentario en línea no ejecutable en un archivo de programa.
Sintaxis && [Comentarios]
Argumentos Comentarios Indica que a continuación aparece un comentario en línea. Por ejemplo: STORE (20*12) TO gnPagos && 20 años de pagos mensuales. La inserción de comentarios en línea para indicar el final de los comandos de programación estructurados IF ... ENDIF, DO y FOR ... ENDFOR mejora significativamente la legibilidad de los programas.
Comentarios Escriba punto y coma (;) al final de cada línea de comentario que continúe en la línea siguiente. No se permite incluir && y un comentario tras el signo de punto y coma empleado para continuar una línea de comandos en la línea siguiente.
68
Manual de Genlis
5.5.5. * (Comando) Indica el principio de una línea de comentarios no ejecutable en un archivo de programa.
Sintaxis * [Comentarios]
Argumentos Comentarios Especifica el comentario en la línea de comentarios. Por ejemplo: * Esto es un comentario. Comentarios Escriba punto y coma (;) al final de cada línea de comentario que continúe en la línea siguiente.
5.5.6. = (Comando) Evalúa una o más expresiones.
Sintaxis = Expresión1 [, Expresión2 ...]
Argumentos Expresión1 [, Expresión2 ...] Especifica la expresión o las expresiones que evalúa el comando =.
Comentarios El comando = evalúa una o más expresiones, Expresión1, Expresión2 ...y descarta los valores devueltos. Esto es especialmente útil cuando una función de Genlis o una función definida por el usuario tiene el efecto deseado pero no es necesario asignar el valor devuelto por la función a una variable de memoria, un elemento de matriz o un campo. Por ejemplo, para activar el modo de inserción, puede utilizar el siguiente comando: = INSMODE(.T.) INSMODE devuelve normalmente un valor verdadero (.T.) o falso (.F.). En el ejemplo anterior se ejecuta la función, pero se descarta el valor devuelto. Si sólo se incluye una expresión (Expresión1), el signo igual es opcional.
69
Manual de Genlis
Nota. Hay otros dos usos no relacionados para el signo igual (=). Puede utilizarse como operador en expresiones lógicas para realizar una comparación o para asignar valores a variables de memoria y elementos de matrices. En estos dos casos, el signo igual (=) es un operador, no un comando.
5.5.7. ABS( ) (Función) Devuelve el valor absoluto de la expresión numérica especificada.
Sintaxis ABS(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica la expresión numérica cuyo valor absoluto devuelve ABS( ).
5.5.8. ACOPY( ) (Función) Copia elementos de una matriz a otra.
Sintaxis ACOPY(NombreMatrizOrigen, NombreMatrizDestino [, nPrimerElementoOrigen [, nNúmeroElementos [, nPrimerElementoDestino ]]])
Tipos devueltos Numeric
Argumentos NombreMatrizOrigen, NombreMatrizDestino Especifica la matriz de origen NombreMatrizOrigen cuyos elementos se copian uno a uno a la matriz de destino NombreMatrizDestino. Los elementos de la matriz de origen sustituyen a los elementos de la matriz de destino. Las matrices pueden ser unidimensionales o bidimensionales. Si la matriz de destino no existe, Genlis la creará automáticamente. En tal caso, el tamaño de la matriz de destino será el mismo que el de la matriz de origen.
70
Manual de Genlis
Nota Puede hacer referencia a un elemento de una matriz bidimensional de variables de memoria de dos formas. La primera utiliza dos subíndices para especificar la posición de fila y columna del elemento de la matriz; la otra utiliza un número de elemento único. Esta función y otras que manipulan matrices bidimensionales precisan números de elemento único (aquí, nPrimerElementoOrigen y nPrimerElementoDestino). Utilice AELEMENT( ) para devolver el número de elemento apropiado para una matriz bidimensional a partir de sus subíndices de fila y columna. nPrimerElementoOrigen Especifica el número del primer elemento de la matriz de origen que se va a copiar, inclusive (el elemento número nPrimerElementoOrigen se incluye en la copia). Si no se incluye nPrimerElementoOrigen, la operación de copia comenzará con el primer elemento de la matriz de origen. nNúmeroElementos Especifica el número de elementos copiados de la matriz de origen. Si nNúmeroElemento es –1, se copiarán todos los elementos de la matriz de origen a partir del elemento nPrimerElementoOrigen. nPrimerElementoDestino Especifica el primer elemento de la matriz de destino que se va a sustituir.
Comentarios ACOPY( ) devuelve el número de elementos copiados a la matriz de destino.
5.5.9. ACOS( ) (Función) Devuelve el arco coseno de una expresión numérica especificada.
Sintaxis ACOS(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica la expresión numérica cuyo arco coseno devuelve ACOS( ). El valor de nExpresión puede estar comprendido entre –1 y +1. El valor que devuelve ACOS( ) está comprendido entre 0 y pi (3,141592). El número de decimales que devuelve ACOS( ) está determinado por SET DECIMALS. Utilice RTOD( ) para convertir radianes a grados.
Comentarios El arco coseno se devuelve en radianes.
71
Manual de Genlis
5.5.10. ADEL( ) (Función) Elimina un elemento de una matriz de una dimensión, o una fila o columna de una matriz de dos dimensiones.
Sintaxis ADEL(NombreMatriz, nNúmeroElemento [, 2])
Tipos devueltos Numeric
Argumentos NombreMatriz Especifica la matriz de la que se elimina el elemento, la fila o la columna. nNúmeroElemento Especifica el número del elemento, fila o columna que se desea eliminar de la matriz. Debe incluir el argumento opcional 2 para eliminar una columna de la matriz. 2 Elimina una columna de la matriz.
Comentarios Al eliminar un elemento, una fila o una columna de una matriz, no cambia el tamaño de la matriz; en cambio, los elementos, las filas o las columnas finales se mueven hacia el inicio de la matriz y el último elemento, fila o columna de la matriz se establece como falso (.F.). Si el elemento, fila o columna se elimina satisfactoriamente, se devuelve el valor 1.
5.5.11. AELEMENT( ) (Función) Devuelve el número de un elemento de la matriz a partir de los subíndices del elemento.
Sintaxis AELEMENT(NombreMatriz, nSubíndiceFila [, nSubíndiceColumna])
Tipos devueltos
72
Manual de Genlis
Numeric
Argumentos NombreMatriz Especifica el nombre de la matriz cuyo número de elemento se desea devolver. nSubíndiceFila Especifica el subíndice de fila. Si la matriz es unidimensional, AELEMENT( ) devolverá nSubíndiceFila. Si sólo incluye nSubíndiceFila y es mayor que el número de filas de la matriz, Genlis generará un mensaje de error. nSubíndiceColumna Especifica el subíndice de columna. Si la matriz es bidimensional, incluya nSubíndiceFila y nSubíndiceColumna.
Comentarios Puede hacer referencia a un elemento de una matriz bidimensional de dos maneras. El primer método utiliza dos subíndices para especificar la posición de fila y columna del elemento en la matriz y el segundo método utiliza un número de elemento único. AELEMENT( ) devuelve el número de elemento cuando se facilitan los subíndices de fila y columna de un elemento. Las funciones ADEL( ), ADIR( ), AFIELDS( ), AINS( ), ALEN( ), ASCAN( ), ASORT( ) y ASUBSCRIPT( ) de Genlis pueden manipular matrices de dos dimensiones y precisan que se haga referencia a los elementos por su número de elemento. AELEMENT( ) facilita la conversión de subíndices a un número de elemento para utilizarlo en estas funciones. Los subíndices correspondientes de fila y columna se pueden devolver a partir del número de elemento mediante ASUBSCRIPT( ). Se puede hacer referencia a un elemento mediante sus subíndices o su número de elemento. Los comandos STORE 'FACTURA' TO gaMatriz(2, 1) y STORE 'FACTURA' TO gaMatriz(4) almacenan la cadena de caracteres FACTURA en el mismo elemento de la matriz. En las matrices de una dimensión, un número de elemento coincide con su subíndice de fila único. No es necesario utilizar AELEMENT( ) con las matrices de una dimensión.
5.5.12. AINS( ) (Función) Inserta un elemento en una matriz de una dimensión, o una fila o columna en una matriz de dos dimensiones.
Sintaxis AINS(NombreMatriz, nNúmeroElemento [, 2])
Tipo devuelto Numeric
73
Manual de Genlis
Argumentos NombreMatriz Especifica el nombre de la matriz en que se inserta el elemento. nNúmeroElemento Especifica el lugar de la matriz en que se inserta el nuevo elemento, la nueva fila o la nueva columna. Para insertar un elemento en una matriz de una dimensión, incluya NombreMatriz y el elemento nNúmeroElemento donde se produzca la inserción. El nuevo elemento se inserta justo antes del elemento nNúmeroElemento. Para insertar una fila en una matriz de dos dimensiones, incluya NombreMatriz y el número de la fila nNúmeroElemento donde se produzca la inserción. La nueva fila se insertará justo antes de la fila nNúmeroElemento. 2 Inserta una columna en una matriz de dos dimensiones. La nueva columna se insertará justo antes de la columna especificada con nNúmeroElemento.
Comentarios Al insertar un elemento, una fila o una columna en una matriz, no cambia el tamaño de la matriz. Los elementos, las filas o las columnas finales se desplazan hacia el final de la matriz y el último elemento, la última fila o la última columna queda fuera de la matriz. El elemento, la fila o la columna recién insertada se inicializa con falso (.F.). AINS( ) devuelve 1 si el elemento, la fila o la columna se inserta correctamente.
5.5.13. ALEN( ) (Función) Devuelve el número de elementos, filas o columnas de una matriz.
Sintaxis ALEN(NombreMatriz [, nAtributoMatriz])
Tipo devuelto Numeric
Argumentos NombreMatriz Especifica el nombre de la matriz. Si incluye únicamente el nombre de la matriz, ALEN( ) devolverá el número de elementos de la matriz. nAtributoMatriz
74
Manual de Genlis
Determina si ALEN( ) devuelve el número de elementos, filas o columnas de la matriz según los siguientes valores de nAtributoMatriz: 0 Especifica que se devuelve el número de elementos de la matriz. Omitir nAtributoMatriz es idéntico a especificar 0. 1 Especifica que se devuelve el número de filas de la matriz. 2 Especifica que se devuelve el número de columnas de la matriz. Si la matriz es de una dimensión, ALEN( ) devolverá 0 (ninguna columna).
5.5.14. ALLTRIM( ) (Función) Elimina los espacios en blanco iniciales y finales de la expresión de caracteres especificada y devuelve la expresión recortada como una cadena de caracteres.
Sintaxis ALLTRIM(cExpresión)
Tipo devuelto Character
Argumentos cExpresión Especifica la expresión de caracteres de la que se eliminan los espacios en blanco iniciales y finales.
Comentarios ALLTRIM( ) se puede utilizar para asegurar que los espacios en blanco se eliminan de los datos escritos por un usuario.
5.5.15. APPEND (Comando) Agrega uno o más registros nuevos al final de una tabla.
Sintaxis APPEND [BLANK] [IN nÁreaTrabajo | cAliasTabla] [NOMENU]
Argumentos BLANK
75
Manual de Genlis
Agrega un registro en blanco al final de la tabla activa. Genlis no abre ninguna ventana de edición cuando usted ejecuta APPEND BLANK. Es posible modificar los nuevos registros con BROWSE, CHANGE o EDIT. IN nÁreaTrabajo Especifica el área de trabajo de la tabla a la que se agrega el nuevo registro. IN cAliasTabla Especifica el alias de la tabla a la que se agrega el nuevo registro. Si omite nÁreaTrabajo y cAliasTabla, se agregará un nuevo registro a la tabla en el área de trabajo seleccionada actualmente. Si ejecuta APPEND, se agregará un registro en blanco a la tabla especificada mediante nÁreaTrabajo o cAliasTabla, y la tabla se seleccionará automáticamente. Si ejecuta APPEND BLANK, se agregará un registro en blanco a la tabla especificada con nÁreaTrabajo o cAliasTabla, y la tabla no se seleccionará. NOMENU Especifica que se eliminará el título de menú Tabla de la barra de menús del sistema, lo que impide efectuar cambios en el formato de la ventana de edición.
Comentarios El cuadro de diálogo Abrir aparece cuando ejecuta APPEND o APPEND BLANK y no hay una tabla abierta en el área de trabajo activa. Elija una tabla para agregar registros. APPEND abre una ventana de edición para que pueda escribir datos en uno o varios registros nuevos. Cuando agregue un nuevo registro, Genlis actualizará cualquier índice que haya abierto.
5.5.16. APPEND FROM (Comando) Agrega registros, desde otro archivo, al final de la tabla seleccionada actualmente.
Sintaxis APPEND FROM NombreArchivo | ? [FIELDS ListaCampos] [FOR lExpresión] [[TYPE] [DELIMITED [WITH Delimitador | WITH BLANK | WITH TAB | WITH CHARACTER Delimitador] | DIF | FW2 | MOD | PDOX | RPD | SDF | SYLK | WK1 | WK3 | WKS | WR1 | WRK | CVS | | XLS | XL5 [SHEET cNombreHoja] | XL8 [SHEET cNombreHoja]]] [AS nPáginaCódigos]
Argumentos
76
Manual de Genlis
NombreArchivo Especifica el nombre del archivo desde el que desea agregar registros. Si no incluye ninguna extensión de archivo, se asumirá una tabla de Genlis y la extensión predeterminada .dbf. Si desea agregar desde una tabla de Genlis, se agregarán los registros de la tabla que estén marcados para su eliminación, independientemente de la configuración de SET DELETED. ? Muestra el cuadro de diálogo Abrir, en el que puede elegir una tabla desde la que agregar registros. FIELDS ListaCampos Especifica a qué campos se van a agregar datos. FOR lExpresión Agrega un nuevo registro por cada registro de la tabla actualmente seleccionada para la que lExpresión dé como resultado verdadero (.T.). Los registros se agregan hasta alcanzar el final de la tabla seleccionada. Si omite FOR, todo el archivo de origen se agrega a la tabla seleccionada actualmente. TYPE Especifica el tipo del archivo de origen desde el que se van a agregar datos. Aunque debe especificar un tipo de archivo si el archivo desde el que va a agregar no es una tabla de Genlis, no necesita incluir la palabra clave TYPE. Puede agregar desde varios tipos de archivos diferentes, incluidos archivos de texto ASCII delimitados, en los que puede especificar un delimitador de campos. Si el archivo de origen desde el que va a agregar datos no tiene la extensión predeterminada habitual para ese tipo de archivo, el nombre del archivo de origen deberá incluir la extensión del archivo. Por ejemplo, las hojas de cálculo de Microsoft Excel normalmente tienen una extensión .xls. Si la hoja de cálculo de Microsoft Excel desde la que va a agregar datos tiene una extensión distinta de la esperada, .xls, asegúrese de especificar la extensión. Nota Cuando agregue datos desde una hoja de cálculo, los datos de esa hoja deben estar almacenados en un orden principal de fila, no de columna. Esto permite que los datos agregados de la hoja de cálculo coincidan con la estructura de la tabla. DELIMITED Especifica que el archivo de origen desde el que se agregan los datos a la tabla actual de Genlis es un archivo delimitado. Un archivo delimitado es un archivo de texto ASCII en el que cada registro termina con un retorno de carro y un avance de línea. De forma predeterminada, se supone que el contenido de los campos está separado entre sí mediante comas y que los valores de los campos de caracteres están delimitados además por dobles comillas. Por ejemplo: "Smith",9999999,"TELÉFONO" Para todos los archivos delimitados, se supone que la extensión de archivo es .txt. Puede importar fechas de archivos delimitados si las fechas tienen el formato de fecha adecuado. El formato de fecha predeterminado es dd/mm/aa. Es opcional incluir la parte de siglo de una fecha. Genlis importará una fecha, como 25/12/94, que no incluye el siglo y supondrá que la fecha corresponde al siglo XX. Los
77
Manual de Genlis
delimitadores de fecha pueden ser cualquier carácter no numérico, excepto el delimitador que separa los campos en el archivo delimitado. Es posible importar fechas en otros formatos si su formato coincide con un formato de fecha disponible en SET DATE. Para importar fechas que no tienen el formato predeterminado, ejecute SET DATE con el formato de fecha apropiado antes de utilizar APPEND FROM. Para comprobar si un formato de fecha se puede importar correctamente, utilícelo con CTOD( ). Si la fecha es aceptable para CTOD( ), la fecha se importará correctamente. DELIMITED WITH Delimitador Indica que los campos de caracteres están delimitados entre sí por un carácter distinto de la comilla. DELIMITED WITH BLANK Especifica archivos que contienen campos separados por espacios en blanco en vez de comas. DELIMITED WITH TAB Especifica archivos que contienen campos separados por tabulaciones en vez de comas. DELIMITED WITH CHARACTER Delimitador Especifica archivos que contienen campos separados por el carácter especificado en Delimitador. Si Delimitador es un punto y coma (el carácter utilizado en Genlis para indicar continuación de línea de comandos), escriba el punto y coma entre comillas. También puede especificar las palabras clave BLANK y TAB para Delimitador. La cláusula WITH Delimitador se puede combinar con la cláusula WITH CHARACTER. Por ejemplo, el siguiente comando agrega registros de un archivo de texto con campos de caracteres delimitados con caracteres subrayados y todos los campos delimitados unos de otros por asteriscos: APPEND FROM mitxt.txt DELIMITED WITH WITH CHARACTER * DIF Incluya DIF para importar datos de un archivo .dif (Formato de intercambio de datos) de VisiCalc. Los vectores (columnas) se convierten en campos en la tabla seleccionada actualmente y las filas se transforman en registros. Se presupone que los nombres de archivos DIF tienen una extensión .dif. FW2 Incluya FW2 para importar datos de un archivo creado por Framework II™. Se asume que los nombres de archivo FW2 tienen una extensión .fw2. MOD Incluya MOD para importar datos de un archivo Microsoft Multiplan versión 4.01. Microsoft Multiplan versión 4.01 crea archivos MOD, que se supone deben tener una extensión .mod. PDOX Incluya PDOX para importar datos de un archivo de base de datos Paradox versión 3.5 ó 4.0. Se supone que los nombres de archivo Paradox deben tener una extensión .db.
78
Manual de Genlis
RPD Incluya RPD para importar datos de un archivo creado por RapidFile versión 1.2. Se supone que los nombres de archivo RapidFile deben tener una extensión .rpd. SDF Incluya SDF para importar datos de un archivo de Formato de datos del sistema. Un archivo SDF es un archivo de texto ASCII en el que los registros tienen una longitud fija y terminan con un retorno de carro y un avance de línea. Los campos no están delimitados. Se supone que la extensión del archivo SDF debe ser .txt. SYLK Incluya SYLK para importar datos desde un formato de intercambio SYLK (Vínculo simbólico). Los archivos SYLK se utilizan con Microsoft MultiPlan. Las columnas del archivo SYLK se transforman en campos en la tabla de Genlis y las filas se transforman en registros. Los nombres de archivo SYLK no tienen ninguna extensión. WK1 Incluya WK1 para importar datos de una hoja de cálculo Lotus 1-2-3 versión 2.x. Cada columna de la hoja de cálculo se transforma en un campo de la tabla y cada fila de la hoja de cálculo se transforma en un registro de la tabla. Se asigna una extensión .WK1 al nombre de archivo de la hoja de cálculo creada en Lotus 1-2-3 versión 2.x. WK3 Incluya WK3 para importar datos de una hoja de cálculo Lotus 1-2-3. Las columnas de la hoja de cálculo se transforman en campos de la tabla y las filas se transforman en registros de la tabla. Se asigna una extensión .wk3 al nombre de archivo de hoja de cálculo creada en Lotus 1-2-3 versión 3.x. WKS Incluya WKS para importar datos de una hoja de cálculo Lotus 1-2-3 revisión 1-A. Las columnas de la hoja de cálculo se convierten en campos de la tabla y las filas se transforman en registros de la tabla. Se asigna una extensión .wks al nombre de archivo de la hoja de cálculo creada en Lotus 1-2-3 revisión 1-A. WR1 Incluya WR1 para importar datos de una hoja de cálculo Lotus Symphony versión 1.1 ó 1.2. Las columnas de la hoja de cálculo se convierten en campos de la tabla y las filas se transforman en registros de la tabla. Se asigna la extensión .wr1 al nombre de archivo de hoja de cálculo creada en Symphony versiones 1.1 ó 1.2. WRK Incluya WRK para importar datos de una hoja de cálculo Lotus Symphony versión 1.0. Las columnas de la hoja de cálculo se transforman en campos de la tabla y las filas de la hoja de cálculo se convierten en registros de la tabla. Se asigna una extensión .wrk al nombre de archivo de hoja de cálculo creado en Symphony versión 1.0.
79
Manual de Genlis
CSV Incluya CSV para importar datos de un archivo de valores separados por comas. Un archivo CSV contiene los nombres de campos en la primera línea del archivo; los nombres de campos se pasarán por alto cuando se importe el archivo. XLS Incluya XLS para importar datos de una hoja de cálculo Microsoft Excel. Las columnas de la hoja de cálculo se transforman en campos de la tabla y las filas se convierten en registros de la tabla. Los nombres de archivos de hoja de cálculo creados en Microsoft Excel reciben la extensión .xls. XL5 Incluya XL5 si desea importar datos de Microsoft Excel versión 5.0. Las columnas de la hoja de cálculo se convierten en campos de la tabla y las filas de la hoja de cálculo se convierten en registros de la tabla. Los archivos de hoja de cálculo creados en Microsoft Excel tienen una extensión .xls.omite la cláusula SHEET, se importan los datos de la Hoja1. Para importar datos de una hoja específica, incluya la palabra clave SHEET y especifique el nombre de la hoja mediante cNombreHoja. XL8 Incluya XL8 para importar datos de Microsoft Excel 97. Las columnas de la hoja de cálculo se convierten en campos de la tabla; las filas de la hoja de cálculo se convierten en registros de la tabla. Los archivos de hoja de cálculo creados en Microsoft Excel tiene la extensión .xls. Si omite la cláusula SHEET, se importan los datos de la Hoja1. Para importar datos de una hoja específica, incluya la palabra clave SHEET y especifique el nombre de la hoja mediante cNombreHoja. AS nPáginaCódigos Especifica la página de códigos de la tabla o el archivo de origen. Genlis copia el contenido de la tabla o el archivo de origen y, a medida que copia los datos, los convierte automáticamente a la página de códigos de la tabla actual. Si especifica un valor no permitido para nPáginaCódigos, Genlis generará un mensaje de error. Puede utilizar GETCP( ) para que nPáginaCódigos muestre el cuadro de diálogo Página de códigos, lo que permite especificar una página de códigos para la tabla o el archivo anexado. Si omite AS nPáginaCódigos y Genlis no puede determinar la página de códigos de la tabla o el archivo de origen, Genlis copiará el contenido de la tabla o el archivo de origen y, a medida que copia los datos, los convierte automáticamente a la página de códigos actual de Genlis. Si SET CPDIALOG tiene el valor ON, la tabla del área de trabajo seleccionada actualmente se marcará con una página de códigos. Si va a anexar datos de una tabla que no está marcada con una página de códigos, aparecerá el cuadro de diálogo Página de códigos, de forma que pueda elegir la página de códigos de la tabla desde la que está anexando datos. La página de códigos actual de Genlis puede determinarse mediante CPCURRENT( ). Si omite AS nPáginaCódigos y Genlis puede determinar la página de códigos de la tabla o el archivo que se está anexando, Genlis copiará el contenido de la tabla o el archivo anexado y, a medida que copia los datos, los convertirá automáticamente a la página de códigos de la tabla seleccionada actualmente. Si nPáginaCódigos es 0, Genlis supondrá que la página de códigos de la tabla o el archivo que se está anexando es la misma que la página de códigos de la tabla seleccionada actualmente y no realizará ninguna conversión a la página de códigos actual de Genlis.
80
Manual de Genlis
Comentarios Si el archivo desde el que va a anexar datos es una tabla de Genlis o una tabla creada en una versión anterior de FoxPro, se supone que tiene una extensión .dbf. Si la tabla de Genlis o la tabla creada en una versión anterior de FoxPro no tiene una extensión .DBF, deberá especificar su extensión. Si el archivo no es una tabla de Genlis ni una tabla creada en una versión anterior de FoxPro, deberá especificar el tipo de archivo desde el que va a anexar datos. Antes de poder anexar datos de una tabla creada en dBASE IV o dBASE V que contenga un campo memo, debe abrir primero la tabla en Genlis mediant_e USE. Cuando se le pregunte si desea convertir el archivo, responda afirmativamente. Si anexa datos de una tabla de Genlis o de una tabla creada en una versión anterior de FoxPro, la tabla desde la que anexa datos puede estar abierta en otra área de trabajo. Los registros marcados para eliminación en la tabla cuyos datos está anexando se desmarcan una vez anexados los registros. Utilice la función DBF( ) para anexar desde un cursor temporal de sólo lectura creado por un comando SELECT - SQL. Incluya el nombre del cursor en la función DBF( ) como en el ejemplo siguiente: APPEND FROM DBF('')
5.5.17. APPEND FROM ARRAY (Comando) Agrega a la tabla seleccionada actualmente un registro por cada fila de una matriz y llena cada registro con datos de la fila correspondiente de la matriz.
Sintaxis APPEND FROM ARRAY NombreMatriz [FOR lExpresión] [FIELDS ListaCampos] | FIELDS LIKE Estructura | FIELDS EXCEPT Estructura
Argumentos NombreMatriz Especifica el nombre de la matriz que contiene los datos que se van a copiar a los nuevos registros. Se agregan nuevos registros a la tabla hasta que se hayan anexado todas las filas de la matriz. FOR lExpresión Especifica una condición para anexar registros desde la matriz. lExpresión debe contener el nombre de un campo de destino en su expresión condicional. Antes de que una fila de la matriz se anexe a un registro de la tabla, se comprueba el elemento de matriz correspondiente al campo de destino especificado en lExpresión para determinar si cumple la condición de lExpresión. Si el elemento de matriz satisface la condición, se anexa un registro.
81
Manual de Genlis
Si el elemento de matriz no satisface la condición, la fila de matriz no se anexa y se comprueba la fila siguiente de la matriz para determinar si cumple la condición. FIELDS ListaCampos Especifica que sólo los campos de ListaCampos se actualizan a partir de la matriz. El primer campo de la lista se actualiza con el contenido del primer elemento de la matriz, el segundo campo se actualiza con el segundo elemento, etcétera. FIELDS LIKE Estructura Especifica que los campos que coincidan con la estructura de campos Estructura se actualizan a partir de la matriz. FIELDS EXCEPT Estructura Especifica que todos los campos excepto los que coincidan con la estructura de campos Estructura se actualizan a partir de la matriz. La estructura de campos Estructura admite caracteres comodín. Por ejemplo, para especificar que todos los campos que comiencen con las letras A y P se actualizan de la matriz, utilice lo siguiente: APPEND FROM ARRAY aMiMatriz FIELDS LIKE A*,P* Puede combinar la cláusula LIKE con la cláusula EXCEPT: APPEND FROM ARRAY aMiMatriz FIELDS LIKE A*,P* EXCEPT PARTNO*
Comentarios Los campos memo y general se pasan por alto en APPEND FROM ARRAY. Cuando se abre una tabla para uso compartido, APPEND FROM ARRAY bloquea el encabezado de la tabla mientras se agregan los registros. Si la matriz es de una dimensión, APPEND FROM ARRAY agregará un registro a la tabla. El contenido del primer elemento de la matriz llena el primer campo del nuevo registro agregado, el contenido del segundo elemento de la matriz llena el segundo campo del registro y así sucesivamente. Si la matriz de una dimensión tiene más elementos que campos tenga la tabla, los elementos adicionales se pasarán por alto. Si la tabla tiene más campos que elementos la matriz, los campos adicionales se inicializarán con el valor vacío predeterminado. Éstos son los valores vacíos predeterminados para cada tipo de campo:
Valores predeterminados de cada tipo de campo
82
Tipo de campo
Valor predeterminado
Carácter Numérico Moneda Flotante Entero Doble Fecha FechaHora
Espacios 0 0 0 0 0 Fecha vacía (p. ej. CTOD("")) FechaHora vacía (p. ej. CTOT(""))
Manual de Genlis
Lógico Memo
Falso .F. Vacío, sin contenido
Si la matriz es de dos dimensiones, APPEND FROM ARRAY agregará un nuevo registro a la tabla por cada fila de la matriz. Por ejemplo, si la matriz tiene cuatro filas, se anexarán cuatro nuevos registros a la tabla. El contenido de la primera columna de la matriz llena el primer campo de los nuevos registros anexados, la segunda columna de la matriz llena el segundo campo de los nuevos registros, etc. Por ejemplo, si la matriz tiene cuatro filas y tres columnas, los elementos de la primera columna de la matriz llenarán el primer campo de cada uno de los cuatro nuevos registros anexados a la tabla. Si la matriz de dos dimensiones tiene más columnas que campos hay en la tabla, las columnas adicionales se pasarán por alto. Si la tabla tiene más campos que columnas hay en la matriz, los campos adicionales se inicializarán con valores vacíos. APPEND FROM ARRAY puede llenar un campo incluso si el tipo de datos del elemento de matriz correspondiente no coincide con el tipo de datos del campo, siempre y cuando los datos del elemento de matriz sean compatibles con el tipo de datos del campo correspondiente. Si los datos no son compatibles, el campo se inicializa con un valor vacío.
5.5.18. ASC( ) (Función) Devuelve el código ANSI del carácter situado más a la izquierda en una expresión de caracteres.
Sintaxis ASC(cExpresión)
Tipo devuelto Numeric
Argumentos cExpresión Especifica la expresión de caracteres que contiene el carácter cuyo valor ANSI devuelve ASC(°). ASC( ) pasa por alto los caracteres que aparezcan después del primer carácter de cExpresión.
Comentarios ASC( ) devuelve la posición del carácter en la tabla de caracteres de la página de códigos actual. Cada carácter tiene un valor ANSI único entre 0 y 255.
83
Manual de Genlis
5.5.19. ASCAN( ) (Función) Busca en una matriz un elemento que contenga los mismos datos y el mismo tipo de datos que una expresión.
Sintaxis ASCAN(NombreMatriz, eExpresión [, nElementoInicial [, nElementosBuscados]])
Tipo devuelto Numeric
Argumentos NombreMatriz Especifica el nombre de la matriz en la que se va a buscar. eExpresión Especifica la expresión general que se va a buscar. nElementoInicial Especifica el número de elemento en el que empieza la búsqueda. El número de elemento que especifique se incluirá en la búsqueda. Si omite nElementoInicial, se buscará en toda la matriz de forma predeterminada. nElementosBuscados Especifica el número de elementos que se van a buscar. Si omite nElementoInicial y nElementosBuscados, la búsqueda empezará por el primer elemento y continuará hasta el último elemento de la matriz. Nota. Puede hacer referencia de dos formas a un elemento de una matriz bidimensional de variables. El primer método utiliza dos subíndices para especificar la posición de fila y columna del elemento de la matriz; el otro método utiliza un número de elemento. Esta función y otras que manipulan matrices de dos dimensiones requieren números de elemento(nElementoInicial y nElementosBuscados). Utilice AELEMENT( ) para devolver el número de elemento a partir de los subíndices de fila y columna de una matriz de dos dimensiones.
Comentarios Si se encuentra alguna coincidencia, ASCAN( ) devolverá el número del elemento que contiene la expresión. Si no se encuentra ninguna coincidencia, devolverá 0. El criterio para considerar válida una coincidencia de datos de caracteres viene determinado por la configuración de SET EXACT. Si SET EXACT está establecido en ON, el elemento deberá coincidir con la expresión de búsqueda carácter a carácter y tener la misma longitud. Si SET EXACT está establecido en OFF y el elemento y la expresión de búsqueda coinciden hasta el final de la expresión, la coincidencia será válida.
84
Manual de Genlis
5.5.20. ASIN( ) (Función) Devuelve en radianes el arco seno de una expresión numérica.
Sintaxis ASIN(nExpresión)
Tipo devuelto Numeric
Argumentos nExpresión Especifica la expresión numérica cuyo arco seno devuelve ASIN( ). El valor de nExpresión puede oscilar entre +1 y –1, y el valor que ASIN( ) devuelve puede ir desde –pi/2 hasta +pi/2 ( –1,57079 hasta 1,57079). El número de decimales que se presentan en el resultado puede especificarse mediante SET DECIMALS.
Comentarios Utilice RTOD( ) para convertir radianes en grados.
5.5.21. ASORT( ) (Función) Ordena los elementos de una matriz en sentido ascendente o descendente.
Sintaxis ASORT(NombreMatriz [, nElementoInicial [, nNúmeroOrdenado [, nOrden]]])
Tipo devuelto Numeric
Argumentos NombreMatriz Especifica el nombre de la matriz que va a ordenar. nElementoInicial Especifica el elemento inicial de la ordenación. Si omite nElementoInicial, de forma predeterminada la matriz se ordenará a partir de su primer elemento. Si la matriz es de una dimensión, la ordenación incluirá nElementoInicial. Si la matriz es de dos dimensiones, el elemento inicial nElementoInicial determinará tanto la fila donde comienza el orden como la columna que determina el sentido en que se ordenan las filas.
85
Manual de Genlis
Nota Puede hacer referencia de dos formas a un elemento de una matriz de dos dimensiones. En el primer método se utilizan dos subíndices para especificar la posición de fila y columna
del elemento de la
matriz; en el otro método se utiliza un número de elemento. Esta función y otras que manipulan matrices de dos dimensiones requieren números de elemento (en ASORT( ) las expresiones numéricas nElementoInicial y nNúmeroOrdenado). Puede utilizar AELEMENT( ) para devolver el número de elemento de los subíndices de fila y columna de una matriz de dos dimensiones. El ejemplo siguiente muestra que el elemento inicial nElementoInicial determina cómo se ordenan las filas en una matriz de dos dimensiones. Se crea una pequeña matriz denominada gaMatriz y se ordena dos veces. La primera ordenación comienza por el primer elemento de gaMatriz y las filas se ordenan según los valores contenidos en la primera columna de la matriz. La segunda ordenación comienza por el cuarto elemento de gaMatriz y las filas se ordenan según los valores contenidos en la segunda columna. La primera vez se ordena a partir de la primera fila. La segunda ordenación comienza por la segunda fila. Puede utilizar DISPLAY MEMORY para mostrar el contenido de la matriz; en estos ejemplos se utilizan tablas para mostrar gráficamente el resultado del orden. Estos comandos crean la matriz denominada gaMatriz: DIMENSION gaMatriz(3,2) gaMatriz(1) = 'G' gaMatriz(2) = 'A' gaMatriz(3) = 'C' gaMatriz(4) = 'Z' gaMatriz(5) = 'B' gaMatriz(6) = 'N' gaMatriz tiene la apariencia siguiente:
Fila 1 Fila 2 Fila 3
Columna 1 G C B
Columna 2 A Z N
Luego se ordena la matriz con ASORT( ) a partir del primer elemento (1,1) de la matriz. Los elementos de la primera columna se ordenan en sentido ascendente al reorganizar las filas de la matriz. =ASORT(gaMatriz,1) Observe el nuevo orden de las filas:
Fila 1 Fila 2 Fila 3
Columna 1 B C G
Columna 2 N Z A
Luego se ordena la matriz a partir del cuarto elemento (2,2) de la matriz. Los elementos de la segunda columna se ordenan al reorganizar las filas de la matriz. =ASORT(gaMatriz,4)
86
Manual de Genlis
Observe la diferencia en el orden de las filas:
Fila 1 Fila 2 Fila 3
Columna 1 B G C
Columna 2 N A Z
nNúmeroOrdenado Especifica el número de elementos que se ordenan en una matriz de una dimensión o el número de filas que se ordenan en una matriz de dos dimensiones. Por ejemplo, si la matriz es de una dimensión y nElementoInicial es 2, que indica que la ordenación comenzará por el segundo elemento de la matriz, y nNúmeroOrdenado es 3, que indica que el orden debe incluir tres elementos, se ordenarán los elementos segundo, tercero y cuarto de la matriz. Si nNúmeroOrdenado es –1 o se omite, se ordenarán todos los elementos de la matriz, desde el elemento inicial nElementoInicial hasta el último elemento. Si la matriz es de dos dimensiones, nNúmeroOrdenado designará el número de filas que se van a ordenar, a partir de la fila que contiene el elemento inicial nElementoInicial. Por ejemplo, si nElementoInicial es 2 y nNúmeroOrdenado es 3, se ordenarán la fila que contiene el segundo elemento de la matriz y las dos filas siguientes. Si nNúmeroOrdenado es –1 o se omite, se ordenarán todas las filas de la matriz, desde la fila que contiene nElementoInicial hasta la última fila de la matriz. nOrden Especifica el sentido de ordenación (ascendente o descendente) para los elementos de la matriz. De forma predeterminada, los elementos de la matriz se ordenan en sentido ascendente. Si nOrden es 0 o se omite, los elementos de la matriz se ordenarán en sentido ascendente. Si nOrden es 1 o cualquier valor distinto de cero, los elementos de la matriz se ordenarán en sentido descendente.
Comentarios Todos los elementos incluidos en la ordenación deben ser del mismo tipo de datos. Las matrices de una dimensión se ordenan por elementos, mientras que las matrices de dos dimensiones se ordenan por filas. Cuando se ordena una matriz de dos dimensiones, el orden de las filas de la matriz se cambia para que los elementos de una columna de la matriz estén en orden ascendente o descendente. Si el orden se ha realizado satisfactoriamente, se devolverá 1; de lo contrario se devolverá –1.
5.5.22. ASSERT (Comando) Muestra un cuadro de mensaje cuando una expresión lógica da como resultado falso (.F.).
Sintaxis ASSERT lExpresión [MESSAGE cTextoMensaje]
Argumentos
87
Manual de Genlis
lExpresión Especifica la expresión lógica evaluada. Si lExpresión da como resultado un valor lógico falso (.F.), se mostrará un cuadro de diálogo. Si lExpresión da como resultado un valor lógico verdadero (.T.), no se mostrará el cuadro de diálogo. cTextoMensaje Especifica el texto mostrado en el cuadro de diálogo de depuración. Si omite cTextoMensaje, se mostrará el texto predeterminado, que indica el número de la línea en que ha fallado la aserción y el procedimiento que contiene la aserción.
Comentarios Este comando se pasa por alto si el comando SET ASSERTS tiene el valor OFF. El cuadro de mensajes contiene los botones Depurar, Pasar por alto y Pasar por alto todos. En la siguiente tabla se describe la acción que se realiza al elegir cada botón.
Cuadro de mensajes Botón Depurar Cancelar Pasar por alto Pasar por alto todos
Acción Se suspende la ejecución del programa y se muestra la ventana Depurador con la ventana Seguimiento activa. Se termina la ejecución del programa. La ejecución del programa continúa con la línea que esté a continuación del comando ASSERT. Continúa la ejecución del programa con la línea que esté a continuación del comando ASSERT y se asigna a ASSERTS el valor OFF. Los subsiguientes comandos ASSERT se pasarán por alto hasta que ASSERTS tenga el valor ON.
5.5.23. ASUBSCRIPT( ) (Función) Devuelve el subíndice de fila o columna de un elemento a partir del número de elemento.
Sintaxis ASUBSCRIPT(NombreMatriz, nNúmeroElemento, nSubíndice)
Tipo devuelto Numeric
Argumentos NombreMatriz Especifica el nombre de la matriz. nNúmeroElemento Especifica el número de elemento.
88
Manual de Genlis
nSubíndice Determina si se devuelve el subíndice de fila o el de columna. Si la matriz es de una dimensión, incluya el número de elemento en nNúmeroElemento y 1 en nSubíndice. ASUBSCRIPT( ) devolverá nNúmeroElemento. Si la matriz es de dos dimensiones, deberá incluir el número de elemento nNúmeroElemento y un valor de 1 ó 2 en nSubíndice. Si especifica 1 en nSubíndice, se devolverá el subíndice de fila del elemento; si especifica 2, se devolverá el subíndice de columna.
Comentarios Puede hacerse referencia de dos formas a los elementos de las matrices bidimensionales de variables. El primer método utiliza dos subíndices para especificar la posición de fila y columna del elemento de la matriz. El segundo método utiliza un número de elemento. Utilice ASUBSCRIPT( ) para obtener el subíndice de fila o columna de un elemento a partir del número de elemento. Estos dos comandos almacenan la cadena de caracteres FACTURA en el mismo elemento de la matriz: STORE 'FACTURA' TO gaMatriz(2, 1) STORE 'FACTURA' TO gaMatriz(4) En las matrices de una dimensión, un número de elemento es igual que su subíndice de fila único. No es necesario utilizar ASUBSCRIPT( ) con las matrices de una dimensión.
5.5.24. AT( ) (Función) Devuelve la posición numérica inicial de la primera aparición de una expresión de caracteres o de un campo memo en otra expresión de caracteres o campo memo; se cuenta desde el carácter situado más a la izquierda.
Sintaxis AT(cExpresiónBúsqueda, cExpresiónBuscada [, nAparición])
Tipos devueltos Numeric
Argumentos cExpresiónBúsqueda Especifica la expresión de caracteres que AT( ) busca en cExpresiónBuscada. cExpresiónBuscada Especifica la expresión de caracteres que cExpresiónBúsqueda busca. Tanto cExpresiónBúsqueda como cExpresiónBuscada pueden ser campos memo de cualquier tamaño. nAparición
89
Manual de Genlis
Especifica qué aparición (primera, segunda, tercera, etc.) de cExpresiónBúsqueda se busca en cExpresiónBuscada. De forma predeterminada, AT( ) busca la primera aparición de cExpresiónBúsqueda (nAparición = 1). Si incluye nAparición, podrá buscar otras apariciones adicionales de cExpresiónBúsqueda en cExpresiónBuscada. AT( ) devolverá 0 si nAparición es mayor que el número de veces que cExpresiónBúsqueda aparece en cExpresiónBuscada.
Comentarios AT( ) busca en la segunda expresión de caracteres la primera aparición de la primera expresión de caracteres. Luego devuelve un valor entero que indica la posición del primer carácter de la expresión de caracteres encontrada. Si la expresión de caracteres no se encuentra, AT( ) devolverá 0. La búsqueda realizada por AT( ) distingue mayúsculas de minúsculas. Para realizar una búsqueda que no distinga entre ambas, utilice ATC( ).
5.5.25. AT_C( ) (Función) Devuelve la posición numérica inicial de la primera aparición de una expresión de caracteres o un campo memo en otra expresión de caracteres o campo memo; se cuenta a partir del carácter situado más a la izquierda.
Sintaxis AT_C(cExpresiónBúsqueda, cExpresiónBuscada [, nAparición])
Tipos devueltos Numeric
Argumentos cExpresiónBúsqueda Especifica la expresión de caracteres que AT_C( ) intenta encontrar en cExpresiónBuscada. cExpresiónBuscada Especifica la expresión de caracteres que busca cExpresiónBúsqueda. Tanto cExpresiónBúsqueda como cExpresiónBuscada pueden ser campos memo de cualquier tamaño. nAparición Especifica qué aparición (primera, segunda, tercera, etc.) de cExpresiónBúsqueda se intenta encontrar en cExpresiónBuscada. De forma predeterminada, AT_C( ) busca la primera aparición de cExpresiónBúsqueda (nAparición = 1). Si incluye nAparición, podrá buscar otras apariciones adicionales de cExpresiónBúsqueda en cExpresiónBuscada. AT_C( ) devuelve 0 si nAparición es mayor que el número de veces que aparece cExpresiónBúsqueda en cExpresiónBuscada.
Comentarios
90
Manual de Genlis
AT_C( ) examina la segunda expresión de caracteres en busca de la primera aparición de la primera expresión de caracteres. Después devuelve un entero que indica la posición del primer carácter en la expresión de caracteres que ha encontrado. Si no se encuentra la expresión de caracteres, AT_C( ) devuelve 0. AT_C( ) se diseñó para expresiones que contengan caracteres de dos bytes. Si la expresión contiene sólo caracteres de un byte, AT_C( ) equivale a AT( ). En la búsqueda que realiza AT_C( ) se distingue entre mayúsculas y minúsculas. Para realizar una búsqueda que no distinga entre mayúsculas y minúsculas, utilice ATCC( ). Esta función es útil para manipular juegos de caracteres de doble byte para idiomas como Hiragana y Hatakana.
5.5.26. ATAN( ) (Función) Devuelve el arcotangente en radianes de una expresión numérica.
Sintaxis ATAN(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica una expresión numérica cuyo arcotangente devuelve ATAN( ). nExpresión puede ser cualquier valor. El valor devuelto por ATAN( ) puede oscilar entre –pi/2 y +pi/2 (–1,57079 y 1,57079). El número de decimales que se muestran del valor devuelto por ATAN( ) está determinado por SET DECIMALS.
Comentarios Utilice RTOD( ) para convertir radianes en grados.
5.5.27. ATC( ) (Función) Devuelve la posición numérica inicial de la primera aparición de una expresión de caracteres o un campo memo en otra expresión de caracteres o campo memo, sin distinguir entre mayúsculas y minúsculas en dichas dos expresiones.
Sintaxis ATC(cExpresiónBúsqueda, cExpresiónBuscada [, nAparición])
91
Manual de Genlis
Tipos devueltos Numeric
Argumentos cExpresiónBúsqueda Especifica la expresión de caracteres que ATC( ) busca en cExpresiónBuscada. cExpresiónBuscada Especifica la expresión de caracteres que busca cExpresiónBúsqueda. Tanto cExpresiónBúsqueda como cExpresiónBuscada pueden ser campos memo de cualquier tamaño. nAparición Especifica qué aparición (primera, segunda, tercera, etc.) de cExpresiónBúsqueda se busca en cExpresiónBuscada. De forma predeterminada, ATC( ) busca la primera aparición de cExpresiónBúsqueda (nAparición = 1). Si incluye nAparición, podrá buscar otras apariciones adicionales de cExpresiónBúsqueda en cExpresiónBuscada.
Comentarios ATC( ) busca en la segunda expresión de caracteres la aparición de la primera expresión de caracteres, sin importar si las letras son mayúsculas o minúsculas en ninguna de las expresiones. Utilice AT( ) para realizar una búsqueda que sí distinga mayúsculas y minúsculas. ATC( ) devuelve un valor entero correspondiente a la posición en que se encuentra el primer carácter de la expresión de caracteres. Si no se encuentra la expresión de caracteres, se devolverá 0.
5.5.28. ATCC( ) (Función) Devuelve la posición numérica inicial de la primera aparición de una expresión de caracteres o de un campo memo en otra expresión de caracteres o campo memo, sin tener en cuenta las mayúsculas o minúsculas en ninguna de las dos expresiones.
Sintaxis ATCC(cExpresiónBúsqueda, cExpresiónBuscada [, nAparición])
Tipos devueltos Numeric
Argumentos ExpresiónBúsqueda Especifica la expresión de caracteres que ATCC( ) intentará encontrar en cExpresiónBuscada.
92
Manual de Genlis
cExpresiónBuscada Especifica la expresión de caracteres que ExpresiónBúsqueda intenta encontrar. Tanto ExpresiónBúsqueda como cExpresiónBuscada pueden ser campos memo de cualquier tamaño. nAparición Especifica qué aparición (primera, segunda, tercera, etc.) de ExpresiónBúsqueda se intentará encontrar en cExpresiónBuscada. De forma predeterminada, ATCC( ) buscará la primera aparición de ExpresiónBúsqueda (nAparición = 1). Si incluye nAparición podrá buscar más apariciones de ExpresiónBúsqueda en cExpresiónBuscada.
Comentarios ATCC( ) está diseñada para expresiones que contienen caracteres de dos bytes. Si la expresión sólo contiene bytes de un carácter, ATCC( ) equivaldrá a ATC( ). ATCC( ) examina la segunda expresión de caracteres en busca de la aparición de la primera expresión de caracteres, sin fijarse en si los caracteres están en mayúsculas o en minúsculas en las expresiones. Utilice AT_C( ) para realizar una búsqueda en la que se distinga entre mayúsculas y minúsculas. ATCC( ) devuelve un entero que corresponde a la posición en que se ha encontrado el primer carácter de la expresión de caracteres. Si no se encuentra la expresión de caracteres, ATCC( ) devolverá 0. Esta función es útil para manipular juegos de caracteres de doble byte en idiomas como Hiragana y Hatakana.
5.5.29. ATCLINE( ) (Función) Devuelve el número de línea de la primera aparición de una expresión de caracteres o campo memo en otra expresión de caracteres o campo memo, sin importar que los caracteres estén en mayúsculas o en minúsculas.
Sintaxis ATCLINE(cExpresiónBúsqueda, cExpresiónBuscada)
Tipos devueltos Numeric
Argumentos cExpresiónBúsqueda Especifica la expresión de caracteres que ATCLINE( ) busca en cExpresiónBuscada. cExpresiónBuscada Especifica la expresión de caracteres que busca cExpresiónBúsqueda.
93
Manual de Genlis
Los argumentos cExpresiónBúsqueda y cExpresiónBuscada pueden ser campos memo de cualquier tamaño. Utilice MLINE( ) para devolver la línea que contiene la expresión de caracteres coincidente. Sugerencia. ATCLINE( ) ofrece una forma cómoda de buscar en campos memo.
Comentarios Si la búsqueda se realiza con éxito, ATCLINE( ) devolverá el número de la línea que contiene la primera expresión de caracteres. Si la búsqueda no se realiza con éxito, ATCLINE( ) devolverá 0.
5.5.30. ATLINE( ) (Función) Devuelve el número de línea de la primera aparición de una expresión de caracteres o campo memo dentro de otra expresión de caracteres o campo memo, a partir de la primera línea.
Sintaxis ATLINE(cExpresiónBúsqueda, cExpresiónBuscada)
Tipos devueltos Numeric
Argumentos cExpresiónBúsqueda Especifica la expresión de caracteres que Genlis busca en cExpresiónBuscada. cExpresiónBuscada Especifica la expresión de caracteres que busca cExpresiónBúsqueda. Los argumentos cExpresiónBúsqueda y cExpresiónBuscada pueden ser campos memo de cualquier tamaño. Utilice MLINE( ) para devolver como una cadena de caracteres la línea que contiene la expresión de caracteres coincidente. Sugerencia. ATLINE( ) ofrece una forma muy útil de buscar en los campos memo.
Comentarios ATLINE( ) busca en la segunda expresión de caracteres la aparición de la primera expresión de caracteres. Al examinar las expresiones, ATLINE( ) tiene en cuenta si los caracteres están en mayúsculas o en minúsculas. Utilice ATCLINE( ) para realizar una búsqueda que no distinga mayúsculas y minúsculas. Si la búsqueda se realiza con éxito, ATLINE( ) devolverá el número de la línea donde se produce la coincidencia. Si la búsqueda no se realiza con éxito, ATLINE( ) devolverá 0.
94
Manual de Genlis
5.5.31. ATN2( ) (Función) Devuelve el arcotangente en los cuatro cuadrantes de los valores especificados.
Sintaxis ATN2(nCoordenadaY, nCoordenadaX)
Tipos devueltos Numeric
Argumentos nCoordenadaY Especifica la coordenada y. nCoordenadaX Especifica la coordenada x.
Comentarios ATN2( ) devuelve el ángulo (en radianes) existente entre la línea y = 0 y la línea que conecta las coordenadas especificadas y el origen (0, 0) del sistema de coordenadas. El valor de ATN2( ) debe estar entre - pi/2 y + pi/2.
5.5.32. AUSED( ) (Función) Incluye en una matriz de variables los alias de tabla y las áreas de trabajo para una sesión de datos.
Sintaxis AUSED(NombreMatriz [, nNúmeroSesiónDatos])
Tipo devuelto Numeric
Argumentos NombreMatriz Especifica el nombre de la matriz que contiene los alias de tabla y las áreas de trabajo para una sesión de datos. Si la matriz especificada no existe, Genlis la creará automáticamente. Si la matriz existe y no es suficientemente grande para contener todos los alias de tabla y las áreas de trabajo, Genlis aumentará automáticamente su tamaño. Si la matriz es demasiado grande, Genlis reducirá su tamaño. Si la matriz
95
Manual de Genlis
existe y AUSED( ) devuelve 0 porque no hay ninguna tabla abierta en la sesión de datos, la matriz permanecerá inalterada. Si la matriz no existe y AUSED( ) devuelve 0, no se creará la matriz. nNúmeroSesiónDatos Especifica el número de sesión de datos cuyos alias de tabla y áreas de trabajo devuelve AUSED( ). Si omite nNúmeroSesiónDatos, AUSED( ) devolverá información acerca de la sesión de datos actual. Utilice SET SESSION para especificar la sesión de datos actual.
Comentarios AUSED( ) devuelve el número de filas de la matriz, que es igual al número de tablas abiertas en la sesión de datos. AUSED( ) crea una matriz de dos dimensiones y coloca los alias de las tablas abiertas para la sesión de datos en la primera columna de la matriz. La segunda columna de la matriz contiene los números de área de trabajo correspondientes a las tablas.
5.5.33. AVERAGE (Comando) Calcula la media aritmética de expresiones o de campos numéricos.
Sintaxis AVERAGE [ListaExpresiones] [Alcance] [FOR lExpresión1] [WHILE lExpresión2] [TO ListaVariablesMemoria | TO ARRAY NombreMatriz] [NOOPTIMIZE]
Argumentos ListaExpresiones Especifica las expresiones cuya media se calcula. ListaExpresiones puede ser una lista de campos de la tabla separados por comas o expresiones numéricas que utilicen campos de la tabla. Alcance Especifica el registro o el intervalo de registros que se desea incluir en el promedio. Sólo se calcula el promedio de aquellos registros que estén dentro del intervalo especificado por el alcance. Las cláusulas de alcance son: ALL, NEXT nRegistros, RECORD nNúmeroRegistro y REST. El alcance predeterminado para AVERAGE es ALL. Los comandos que incluyen Alcance sólo actúan sobre la tabla del área de trabajo activa. FOR lExpresión1 Especifica una condición por la que sólo se incluyen aquellos registros que satisfagan la condición lógica lExpresión. Este argumento permite filtrar los registros no deseados.
96
Manual de Genlis
Rushmore optimiza una consulta AVERAGE FOR si lExpresión es una expresión optimizable. Para conseguir el máximo rendimiento, utilice una expresión optimizable en la cláusula FOR. WHILE lExpresión2 Especifica que, siempre y cuando la expresión lógica lExpresión2 se evalúe como verdadera(.T.), los registros se incluirán en el promedio. TO ListaVariablesMemoria Especifica la lista de variables o elementos de matriz donde se almacena el resultado del promedio. TO ARRAY NombreMatriz Especifica la matriz de una dimensión donde se almacena el resultado del promedio. La matriz de una dimensión puede crearse antes de ejecutar AVERAGE. Si la matriz que se incluye en AVERAGE no existe, Genlis la creará automáticamente. Si la matriz existe pero no es suficientemente grande para contener todos los resultados, Genlis aumenta su tamaño automáticamente para dar cabida a la información. NOOPTIMIZE
Comentarios Se calcula el promedio de todos los campos numéricos de la tabla seleccionada, a menos que incluya una lista opcional de expresiones. El resultado aparecerá en la pantalla si SET TALK está establecido en ON. Si SET HEADINGS está establecido en ON, los nombres de campo o la expresión en que se utilicen los nombres de campo aparecerán encima del resultado.
5.5.34. BETWEEN( ) (Función) Determina si el valor de una expresión queda dentro de los valores de otras dos expresiones del mismo tipo de datos.
Sintaxis BETWEEN(eValorPrueba, eValorInferior, eValorSuperior)
Tipos devueltos Logical o valor nulo
Argumentos eValorPrueba Especifica la expresión cuyo valor comprueba BETWEEN( ). Si el valor de eValorPrueba es mayor o igual que el valor de eValorInferior, y menor o igual que el valor de eValorSuperior, BETWEEN( ) devolverá verdadero
97
Manual de Genlis
(.T.). De lo contrario, BETWEEN( ) devolverá falso (.F.). BETWEEN( ) devuelve el valor nulo si eValorInferior o eValorSuperior son el valor nulo. eValorInferior Especifica el valor inferior del intervalo que evalúa BETWEEN( ). eValorSuperior Especifica el valor superior del intervalo que evalúa BETWEEN( ).
Comentarios BETWEEN( ) devuelve el valor verdadero (.T.) si el valor de una expresión de tipo Character, Date, DateTime, Numeric, Float, Integer, Double o Currency está dentro de los valores de otras dos expresiones del mismo tipo de datos. Si el valor de la expresión no queda dentro de los valores de las otras dos expresiones, BETWEEN( ) devolverá falso (.F.). BETWEEN( ) devuelve el valor nulo si eValorInferior o eValorSuperior son el valor nulo.
5.5.35. BINTOC( ) (Función) Convierte un valor entero a una representación del mismo en caracteres binarios.
Sintaxis BINTOC(nExpresión [, nTamaño])
Tipos devueltos Character
Argumentos nExpresión Especifica el valor entero que hay que convertir. nTamaño Especificar la longitud en caracteres de la cadena de caracteres devuelta. nTamaño también determina el valor que puede especificar para nExpresión. La tabla siguiente presenta los valores permitidos para nTamaño y el intervalo de valores correspondiente para nExpresión: nTamaño Intervalo de nExpresión 1 -128 a 127 2 -32.768 a 32.767 4 (predeterminado) -2.147.483.648 a 2.147.483.647 Si se omite nTamaño, BINTOC( ) devuelve una cadena de caracteres formada por cuatro caracteres.
98
Manual de Genlis
Comentarios BINTOC( ) se puede utilizar para reducir el tamaño de índices para campos numéricos que contienen datos de tipo Integer. Por ejemplo, un campo numérico llamado iPartCode contiene un valor entero que varía entre 1 y 127 que corresponde a un código de clasificación de partes. BINTOC( ) permite convertir el valor del campo numérico en una representación de carácter. Por ejemplo, el siguiente comando crea un índice con una clave de índice de un carácter: INDEX ON BINTOC(nPartCode,1) TAG PartCode
5.5.36. BITAND( ) (Función) Devuelve el resultado de una operación AND a nivel de bits realizada en dos valores numéricos.
Sintaxis BITAND(nExpresión1, nExpresión2)
Tipos devueltos Numeric
Argumentos nExpresión1, nExpresión2 Especifica los valores numéricos en que se realiza la operación AND a nivel de bits. Si nExpresión1 y nExpresión2 no son enteros, se convertirán en enteros antes de que se realice la operación AND a nivel de bits.
Comentarios BITAND( ) compara cada bit de nExpresión1 con el bit correspondiente de nExpresión2. Si los bits de nExpresión1 y nExpresión2 son 1, el bit de resultado correspondiente se establecerá como 1; de lo contrario, el bit de resultado correspondiente se establecerá como 0. La tabla siguiente muestra el resultado de una operación AND a nivel de bits de los bits nExpresión1 y nExpresión2 correspondientes: Bit nExpresión1 0 0 1 1
Bit nExpresión2 0 1 1 0
Bit resultante 0 0 1 0
99
Manual de Genlis
5.5.37. BITCLEAR( ) (Función) Borra un bit especificado (establece el bit como 0) en un valor numérico y devuelve el valor resultante.
Sintaxis BITCLEAR(nExpresión1, nExpresión2)
Tipos devueltos Numeric
Argumentos nExpresión1 Especifica el valor numérico en el que se desactiva un bit. Si nExpresión1 no es un entero, se convertirá en entero antes de que se establezca su bit. nExpresión2 Especifica la posición de bit de nExpresión1 que se desactiva. nExpresión2 puede ir de 0 a 31; 0 es el bit de la derecha.
5.5.38. BITLSHIFT( ) (Función) Devuelve el resultado de desplazar un número específico de posiciones hacia la izquierda los bits de un valor numérico.
Sintaxis BITLSHIFT(nExpresión1, nExpresión2)
Tipos devueltos Numeric
Argumentos nExpresión1 Especifica el valor numérico cuyos bits se desplazan a la izquierda. Si nExpresión1 no es un entero, se convertirá en un entero antes de desplazar sus bits. nExpresión2 Especifica el número de posiciones de bit que se van a desplazar. Si nExpresión2 no es un entero, se convertirá en un entero.
100
Manual de Genlis
5.5.39. BITNOT( ) (Función) Devuelve el resultado de una operación NOT a nivel de bits realizada sobre un valor numérico.
Sintaxis BITNOT(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica el valor numérico en que se lleva a cabo la operación NOT a nivel de bits. Si nExpresión no es un entero, se convertirá en un entero antes de que se desplacen sus bits.
Comentarios BITNOT( ) devuelve el complemento a nivel de bits de nExpresión. El valor numérico devuelto por BITNOT( ) representa nExpresión con cada bit con el valor 0 desplazado a 1 y cada bit con valor 1 desplazado a 0. La tabla siguiente muestra el resultado de una operación NOT a nivel de bits sobre nExpresión: Bit de nExpresión Bit resultante 0 1 1 0
5.5.40. BITOR( ) (Función) Devuelve el resultado de una operación OR inclusiva a nivel de bits realizada sobre dos valores numéricos.
Sintaxis BITOR(nExpresión1, nExpresión2)
Tipos devueltos Numeric
Argumentos nExpresión1, nExpresión2 Especifica los valores numéricos en los que se lleva a cabo la operación OR inclusiva a nivel de bits. Si nExpresión1 y nExpresión2 no son enteros, se convertirán en enteros antes de que se realice la operación OR inclusiva a nivel de bits.
Comentarios
101
Manual de Genlis
BITOR( ) compara cada bit de nExpresión1 con el bit correspondiente de nExpresión2. Si algún bit de nExpresión1 o de nExpresión2 es 1, el bit de resultado correspondiente se establecerá como 1; de lo contrario, el bit de resultado correspondiente se establecerá como 0. La tabla siguiente muestra el resultado de una operación OR inclusiva sobre los correspondientes bits de nExpresión1 y nExpresión2: Bit de nExpresión1 0 0 1 1
Bit de nExpresión2 0 1 0 1
Bit resultante 0 1 1 1
5.5.41. BITRSHIFT( ) (Función) Devuelve el resultado de desplazar un número específico de posiciones hacia la derecha los bits de un valor numérico.
Sintaxis BITRSHIFT(nExpresión1, nExpresión2)
Tipos devueltos Numeric
Argumentos nExpresión1 Especifica el valor numérico cuyos bits se desplazan hacia la derecha. Si nExpresión1 no es un entero, se convertirá en un entero antes de que se desplacen sus bits. nExpresión2 Especifica el número de posiciones de bit que se van a desplazar. Si nExpresión2 no es un entero, se convertirá en un entero.
5.5.42. BITSET( ) (Función) Establece como 1 el bit de un valor numérico y devuelve el valor resultante.
Sintaxis BITSET(nExpresión1, nExpresión2)
102
Manual de Genlis
Tipos devueltos Numeric
Argumentos nExpresión1 Especifica el valor numérico en el que se establece un bit. Si nExpresión1 no es un entero, se convertirá en un entero antes de que se establezca su bit. nExpresión2 Especifica la posición de bit de nExpresión1 que se establece como 1. nExpresión2 puede ir de 0 a 31; 0 es el bit más a la derecha.
5.5.43. BITTEST( ) (Función) Devuelve verdadero (.T.) si un bit especificado en un valor numérico se establece como 1; de lo contrario, devuelve falso (.F.).
Sintaxis BITTEST(nExpresión1, nExpresión2)
Tipos devueltos Logical
Argumentos nExpresión1 Especifica el valor numérico en el que se comprueba un bit. Si nExpresión1 no es un entero, se convertirá en un entero antes de comprobar su bit. nExpresión2 Especifica la posición de bit de nExpresión1 que se comprueba. nExpresión2 puede ir de 0 a 31; 0 es el bit situado más a la derecha.
5.5.44. BITXOR( ) (Función) Devuelve el resultado de una operación OR exclusiva a nivel de bits realizada sobre dos valores numéricos.
Sintaxis
103
Manual de Genlis
BITXOR(nExpresión1, nExpresión2)
Tipos devueltos Numeric
Argumentos nExpresión1, nExpresión2 Especifica los valores numéricos sobre los que se lleva a cabo la operación OR exclusiva a nivel de bits. Si nExpresión1 y nExpresión2 no son enteros, se convertirán en enteros antes de que se realice la operación OR exclusiva a nivel de bits.
Comentarios BITXOR( ) compara cada bit de nExpresión1 con el bit correspondiente de nExpresión2. Si un bit es 0 y el otro 1, el bit de resultado correspondiente se establecerá como 1. De lo contrario, el bit de resultado correspondiente se establecerá como 0. La tabla siguiente muestra el resultado de una operación OR exclusiva sobre los bits correspondientes de nExpresión1 y nExpresión2: Bit de nExpresión1 0 0 1 1
Bit de nExpresión2 0 1 0 1
Bit de resultado 0 1 1 0
5.5.45. BLANK (Comando) Borra datos de todos los campos del registro activo cuando se ejecuta sin argumentos.
Sintaxis BLANK [FIELDS ListaCampos] [Alcance] [FOR lExpresión1] [WHILE lExpresión2] [NOOPTIMIZE]
Argumentos FIELDS ListaCampos Sólo borra a los campos especificados mediante ListaCampos. Si omite la cláusula FIELDS, todos los campos de un registro se borrarán de forma predeterminada. Cualquier campo que especifique de un área de trabajo no seleccionada deberá ir precedido del alias del área de trabajo.
104
Manual de Genlis
Importante. BLANK no borrará datos de campo de un registro situado en otra área de trabajo relacionada si el puntero de registro se encuentra al final del archivo del área de trabajo actual. El puntero de registro debe estar situado en un registro del área de trabajo actual para que BLANK actúe sobre los campos del registro relacionado. Alcance Especifica un intervalo de registros que se va a borrar. Sólo se borrarán aquellos registros comprendidos dentro de ese intervalo. Las cláusulas de alcance son: ALL, NEXT nRegistros, RECORD nNúmeroRegistro y REST. El alcance predeterminado para BLANK es el registro actual (NEXT 1). FOR lExpresión1 Borra los datos de campos de aquellos registros para los que lExpresión1 dé como resultado verdadera (.T.). Rushmore optimizará BLANK FOR si lExpresión1 es una expresión optimizable. WHILE lExpresión2 Especifica una condición según la cual los datos de campo de los registros se borrarán siempre y cuando la expresión lógica lExpresión2 dé como resultado verdadera (.T.). NOOPTIMIZE Impide la optimización Rushmore de BLANK.
Comentarios Utilice APPEND BLANK para agregar un nuevo registro en blanco al final de una tabla. Utilice ISBLANK( ) para determinar si un campo de un registro está en blanco.
5.5.46. BOF( ) (Función) Determina si el puntero de registro está situado al principio de una tabla.
Sintaxis BOF([nÁreaTrabajo | cAliasTabla])
Tipo devuelto Logical
Argumentos nÁreaTrabajo Especifica el número del área de trabajo para una tabla abierta en otra área de trabajo.
105
Manual de Genlis
cAliasTabla Especifica el alias para una tabla abierta en otra área de trabajo. Si la tabla cuya condición de principio de archivo desea probar está abierta en un área de trabajo distinta de la seleccionada actualmente, utilice estos argumentos opcionales para especificar el número del área de trabajo o el alias para la tabla. Si no hay ninguna tabla abierta en el área de trabajo especificada, BOF( ) devolverá falso (.F.).
Comentarios Utilice BOF( ) para probar la condición de principio de archivo de una tabla. BOF( ) devuelve verdadero (.T.) si ha intentado mover el puntero de registro a una posición anterior al primer registro de la tabla.
5.5.47. BROWSE (Comando) Abre la ventana Examinar y muestra los registros de la tabla en uso o seleccionada.
Sintaxis BROWSE [FIELDS ListaCampos] [FONT cNombreFuente [, nTamañoFuente]] [STYLE cEstiloFuente] [FOR lExpresión1 [REST]] [FORMAT] [FREEZE NombreCampo] [KEY eExpresión1 [, eExpresión2]] [LAST | NOINIT] [LOCK nNúmeroCampos] [LPARTITION] [NAME NombreObjeto] [NOAPPEND] [NODELETE] [NOEDIT | NOMODIFY] [NOLGRID] [NORGRID] [NOLINK] [NOMENU] [NOOPTIMIZE] [NOREFRESH] [NORMAL] [NOWAIT] [PARTITION nNúmeroColumna [LEDIT] [REDIT]] [PREFERENCE NombrePreferencia] [SAVE]
106
Manual de Genlis
[TIMEOUT nSegundos] [TITLE cTextoTítulo] [VALID [:F] lExpresión2 [ERROR cTextoMensaje]] [WHEN lExpresión3] [WIDTH nAnchoCampo] [WINDOW NombreVentana1] [IN [WINDOW] NombreVentana2 | IN SCREEN] [COLOR SCHEME nNúmeroEsquema]
Argumentos FIELDS ListaCampos Especifica los campos que aparecerán en la ventana Examinar. Los campos se muestran en el orden especificado en ListaCampos. En la lista de campos puede incluir campos de otras tablas relacionadas. Cuando incluya un campo de una tabla relacionada, incluya delante del nombre de campo su alias de tabla y un punto. Si omite FIELDS, se mostrarán todos los campos de la tabla en el orden en que aparecen en la estructura de la tabla. FONT cNombreFuente [, nTamañoFuente] Especifica la fuente y el tamaño de fuente de la ventana Examinar. La expresión de caracteres cNombreFuente es el nombre de la fuente y la expresión numérica nTamañoFuente es el tamaño de la fuente. Por ejemplo, la cláusula siguiente especifica la fuente Courier de 16 puntos para los campos que se muestran en la ventana Examinar: FONT 'Courier',16 Si incluye la cláusula FONT pero omite el tamaño de fuente nTamañoFuente, se usará una fuente de 10 puntos en la ventana Examinar. En Genlis, si omite la cláusula FONT se usará MS Sans Serif de 8 puntos. Si la fuente especificada no está disponible, se sustituirá por una fuente de características similares. STYLE cEstiloFuente Especifica el estilo de fuente de la ventana Examinar. Si omite la cláusula STYLE, se usará el estilo de fuente normal Si el estilo de fuente especificado no está disponible, se usará un estilo con características similares. Carácter B I N O Q S T U
Estilo de fuente Negrita Cursiva Normal Contorno Opaco Sombra Tachado Transparente Subrayado
Puede incluir más de un carácter para especificar una combinación de estilos de fuente.
107
Manual de Genlis
Rushmore optimiza una consulta especificada con BROWSE FOR si lExpresión1 es una expresión optimizable. Incluya FOR si desea mover el puntero de registro hasta el primer registro que cumpla la condición. Incluya REST si desea dejar el puntero de registro en su posición actual. REST Impide que el puntero de registro se desplace desde su posición actual hasta la parte superior de la tabla cuando se abra una ventana Examinar con la cláusula FOR. De lo contrario, BROWSE situará el puntero de registro al principio de la tabla de forma predeterminada. FORMAT Especifica el uso de un archivo de formato para controlar la presentación y el formato de entrada de datos en una ventana Examinar. Es necesario abrir primero el archivo de formato con SET FORMAT. La información siguiente se extrae del archivo de formato y se aplica a la ventana Examinar: La lista de campos que se van a examinar Todas las cláusulas VALID Todas las cláusulas WHEN Todas las cláusulas RANGE Tamaños de campo (especificados en cláusulas PICTURE) Todas las expresiones SAY (que se incluyen como campos BROWSE calculados) El ejemplo siguiente utiliza un archivo de formato para validar los datos escritos en una ventana Examinar. Las posiciones especificadas mediante @ ... GET se pasan por alto. La primera línea crea un campo BROWSE (cust_id) que tiene 5 caracteres de ancho y que permite sólo la entrada de letras y dígitos. La segunda línea crea un campo BROWSE (company) que no puede quedar en blanco y puede contener un máximo de 20 caracteres alfabéticos. La tercera línea crea un campo BROWSE (contact) en el que sólo se pueden escribir datos cuando está en blanco. Éste es el contenido del archivo de formato Custentr.fmt, que se usa para validar los datos que se escriben en la tabla customer: @ 3,0 GET cust_id PICTURE 'NNNNN' @ 3,0 GET company VALID company != SPACE(40) ; PICTURE 'AAAAAAAAAAAAAAAAAAAA' @ 3,0 GET contact WHEN contact = SPACE(40) * Éste es el programa que utiliza el archivo de formato. CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE customer && Abre la tabla customer. SET FORMAT TO custentr.fmt BROWSE FORMAT FREEZE NombreCampo
108
Manual de Genlis
Permite realizar cambios en un único campo de la ventana Examinar. Debe especificar este campo mediante NombreCampo. Los demás campos se muestran pero no se pueden modificar. CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE customer && Abre la tabla customer. BROWSE FIELDS phone :H = 'Número de teléfono:' , ; company :H = 'Compañía:' ; FREEZE phone KEY eExpresión1 [, eExpresión2] Limita el alcance de los registros que se presentarán en la ventana Examinar. Con KEY puede especificar un valor de clave de índice (eExpresión1) o un intervalo de valores de clave (eExpresión1, eExpresión2) para los registros que se mostrarán en la ventana Examinar. La tabla que se va a examinar debe estar indexada y el valor o los valores de clave de índice incluidos en la cláusula KEY deben ser del mismo tipo de datos que la expresión de índice del archivo de índice o de la etiqueta principal. Por ejemplo, la tabla customer incluye un campo de caracteres que contiene códigos postales. Si la tabla se indexa mediante el campo de código postal, en la cláusula KEY podrá especificar un intervalo de códigos postales. En el ejemplo siguiente, sólo se presentarán en la ventana Examinar aquellos registros cuyos códigos postales estén dentro del intervalo de 10.000 a 30.000: CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE customer && Abre la tabla customer. SET ORDER TO postalcode BROWSE KEY '10000', '30000' LAST | NOINIT Guarda cualquier cambio de configuración realizado en la apariencia de una ventana Examinar. Los cambios se guardan en el archivo FOXUSER y pueden incluir cambios a la lista de archivos, al tamaño de cada campo, y a la ubicación y el tamaño de la ventana Examinar. Si ejecuta BROWSE con la cláusula LAST o NOINIT, la ventana Examinar se abrirá con la misma configuración que tenía la última vez que se guardó en el archivo FOXUSER si SET RESOURCE está establecido en ON. Esto restaurará la configuración anterior de la ventana Examinar creada con el último comando BROWSE. Si el último comando BROWSE ejecutado en la ventana Comandos incluía una lista larga de cláusulas, ejecute BROWSE con la opción LAST o NOINIT para no tener que volver a escribir el comando. Para obtener más información acerca del archivo FOXUSER, vea SET RESOURCE. Si la última ventana Examinar se abrió con un comando BROWSE que incluía una cláusula PREFERENCE, BROWSE LAST no restaurará la preferencia. Los cambios que se hagan en la configuración de la ventana Examinar durante la sesión actual no se guardarán si sale de la ventana al presionar CTRL+Q. Las cláusulas LAST y NOINIT son idénticas; NOINIT ofrece compatibilidad con dBASE. LOCK nNúmeroCampos
109
Manual de Genlis
Especifica el número de campos que puede ver en la partición izquierda de la ventana Examinar sin necesidad de desplazarse o de usar la tecla tab. El tamaño de la partición izquierda se ajustaría automáticamente para mostrar el número de campos especificado mediante nNúmeroCampos. LPARTITION Especifica que el cursor está situado en el primer campo de la partición izquierda de la ventana Examinar. De forma predeterminada, el cursor se sitúa en el primer campo de la partición derecha al abrirse la ventana. NAME NombreObjeto Crea una referencia de objeto para la ventana Examinar, lo que permite manipular dicha ventana mediante las propiedades orientadas a objetos disponibles para el control Grid. NOAPPEND Impide que el usuario agregue registros a la tabla al presionar CTRL+Y o al elegir la opción Anexar registro del menú Tabla. Importante. La inclusión de NOAPPEND no impide que se anexen registros desde una rutina (creada con VALID, WHEN u ON KEY LABEL) mientras se está en la ventana Examinar. NODELETE Impide marcar registros para su eliminación desde una ventana Examinar. De forma predeterminada, un registro se puede marcar para su eliminación al presionar CTRL+T, al elegir la opción Alternar eliminación del menú Tabla de Genlis , o al hacer clic en la columna situada más a la izquierda del registro que se va a eliminar. NOEDIT | NOMODIFY Impide a un usuario modificar la tabla. NOEDIT y NOMODIFY son idénticas. Si incluye cualquiera de las dos cláusulas, podrá examinar o buscar en la tabla, pero no modificarla. Sin embargo, sí es posible anexar y eliminar registros. NOLGRID Quita las líneas de cuadrícula del campo en la partición izquierda de la ventana Examinar. NORGRID Quita las líneas de cuadrícula del campo en la partición derecha de la ventana Examinar. NOLINK Desvincula las particiones de una ventana Examinar. De forma predeterminada, las particiones izquierda y derecha de la ventana Examinar están vinculadas para que cuando usted se desplace por una partición también se desplace la otra. NOMENU Quita de la barra de menús del sistema el título del menú Tabla, lo que impide el acceso al menú Examinar.
110
Manual de Genlis
NOOPTIMIZE Desactiva la optimización Rushmore de BROWSE. NOREFRESH Impide actualizar la ventana Examinar. Las ventanas Examinar se actualizan según la frecuencia determinada mediante SET REFRESH. NOREFRESH es útil con los archivos de sólo lectura y mejora el rendimiento. NORMAL Abre la ventana Examinar con su configuración normal predeterminada, como colores, tamaño, posición, título y opciones de controles (GROW, FLOAT, ZOOM, etc.). Si omite NORMAL y la ventana actual de resultado es una ventana definida por el usuario con su propia configuración, la ventana Examinar utilizará también la configuración definida por el usuario. NOWAIT Continúa la ejecución del programa inmediatamente después de que se abra la ventana Examinar. El programa no espera a que se cierre la ventana Examinar, sino que sigue ejecutando la línea de programa que sigue inmediatamente a la línea que contiene BROWSE NOWAIT. Si omite NOWAIT cuando ejecuta BROWSE en un programa, se abrirá una ventana Examinar y la ejecución del programa se interrumpirá hasta que se cierre la ventana Examinar. NOWAIT sólo está disponible desde dentro de un programa. Incluir NOWAIT en BROWSE no tiene efecto cuando el comando se ejecuta en la ventana Comandos. PARTITION nNúmeroColumna Divide una ventana Examinar en las particiones izquierda y derecha; nNúmeroColumna especifica el número de columnas de la barra de división. Por ejemplo, si nNúmeroColumna es 20, la barra de división se situará en la columna 20 de la ventana Examinar. LEDIT Especifica que la partición izquierda de la ventana Examinar aparecerá en modo de edición. REDIT Especifica que la partición derecha de la ventana Examinar aparecerá en modo de edición. El ejemplo siguiente abre una ventana Examinar con la barra de división situada en la columna 20 y la partición derecha abierta en modo de edición. Incluya ambas palabras clave si desea abrir ambas particiones en modo de edición. CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE customer && Abre la tabla customer. BROWSE PARTITION 20 REDIT PREFERENCE NombrePreferencia Guarda los atributos y las opciones de una ventana Examinar para su uso posterior. A diferencia de LAST, que restaura la ventana Examinar tal como aparecía en la sesión anterior, PREFERENCE guarda indefinidamente en el archivo de recursos FOXUSER los atributos de una ventana Examinar. Las preferencias se pueden recuperar en cualquier momento.
111
Manual de Genlis
Al ejecutar BROWSE con el nombre de preferencia especificado por primera vez se crea una entrada en el archivo FOXUSER que almacena la configuración de la ventana Examinar. Si más tarde ejecuta BROWSE con el mismo nombre de preferencia, se restaurará la ventana Examinar con el estado de dicha preferencia. Cuando se cierra la ventana Examinar, las preferencias se actualizan. Los nombres de preferencia pueden tener hasta 10 caracteres de longitud, deben empezar con una letra o un signo de subrayado, y pueden contener cualquier combinación de letras, números y signos de subrayado. Una vez que tenga las preferencias configuradas de la manera deseada, podrá impedir que cambien. Cierre la ventana Examinar, ejecute SET RESOURCE OFF, abra el archivo FOXUSER como tabla y cambie a sólo lectura el registro que contiene la preferencia; para ello, cambie el valor del campo lógico READONLY a verdadero (.T.). Si sale de la ventana Examinar al presionar CTRL+Q, los cambios de la ventana Examinar no se guardarán en el archivo de recursos. SAVE Mantiene activas y visibles (abiertas) la ventana Examinar y cualquiera de sus ventanas de edición de texto para campos memo. Puede volver a la ventana Examinar después de recorrer las demás ventanas abiertas con el teclado o con el mouse. SAVE sólo está disponible desde dentro de un programa. SAVE no tiene ningún efecto cuando se incluye con BROWSE en la ventana Comandos porque BROWSE SAVE es siempre la opción predeterminada en el modo interactivo. TIMEOUT nSegundos Especifica el tiempo que una ventana Examinar espera recibir una entrada. La expresión numérica nSegundos especifica cuántos segundos pueden transcurrir sin que se produzca ninguna entrada antes de que la ventana Examinar se cierre automáticamente. TIMEOUT sólo está disponible desde dentro de un programa; no tiene efecto cuando BROWSE se ejecuta en la ventana Comandos. En el ejemplo siguiente, la ventana Examinar se cerrará si no se recibe ninguna entrada en 10 segundos. DEFINE WINDOW wExaminar FROM 1,1 TO 24,40 ; CLOSE ; GROW ; COLOR SCHEME 10 CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE customer && Abre la tabla customer. BROWSE WINDOW wExaminar ; FIELDS phone :H = 'Número de teléfono:' , ; company :H = 'Compañía:' ; TIMEOUT 10 RELEASE WINDOW wExaminar TITLE cTextoTítulo Invalida el nombre o el alias predeterminado de tabla que aparece en la barra de título de la ventana
112
Manual de Genlis
Examinar y muestra en su lugar el título especificado mediante cTextoTítulo. De lo contrario, el nombre o el alias de la tabla que se está examinando aparecerá en la barra de título. Si ejecuta BROWSE WINDOW para situar la ventana Examinar en una ventana definida por el usuario, el título de la ventana Examinar reemplazará al de la ventana definida por el usuario. CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE customer && Abre la tabla customer. BROWSE; TITLE 'Mi ventana examinar' ; FIELDS phone :H = 'Número de teléfono' , ; company :H = 'Compañía:' VALID lExpresión2 Realiza una validación a nivel de registros en una ventana Examinar. La cláusula VALID sólo se ejecutará si hace algún cambio en el registro e intenta desplazar el cursor a otro registro. La cláusula VALID no se ejecutará si sólo se hacen cambios en campos memo. Si VALID devuelve un valor verdadero (.T.), el usuario podrá desplazar el cursor a otro registro. Si VALID devuelve un valor falso (.F.), el cursor permanecerá en el campo actual y Genlis mostrará un mensaje de error. Si VALID devuelve 0, el cursor permanecerá en el campo actual y no se mostrará ningún mensaje de error. No debe confundirse la cláusula VALID con la opción de verificación (:V), que activa la validación a nivel de campo. :F Fuerza la ejecución de la cláusula VALID antes de que el usuario desplace el cursor hasta el siguiente registro. En este caso, VALID se ejecutará aunque no se hagan cambios en el registro. ERROR cTextoMensaje Especifica un mensaje de error que aparecerá en lugar del mensaje de error predeterminado del sistema. Genlis mostrará cTextoMensaje cuando VALID devuelva falso (.F.). WHEN lExpresión3 Evalúa una condición cuando el usuario desplaza el cursor a otro registro. Si lExpresión3 se da como resultado verdadero (.T.), el usuario podrá modificar el registro al que se ha desplazado. Si lExpresión3 da como resultado falso (.F.) o 0, el registro al que se desplace el usuario se convertirá en un registro de sólo lectura y no podrá modificarse. La cláusula WHEN no se ejecuta cuando está activada otra ventana. WIDTH nAnchoCampo Limita a nAnchoCampo el número de caracteres mostrados para todos los campos de una ventana Examinar. El contenido de un campo se podrá desplazar horizontalmente mediante las teclas FLECHA IZQUIERDA y FLECHA DERECHA, o la barra de desplazamiento horizontal. La inclusión de la cláusula WIDTH no cambia el tamaño de los campos de la tabla; sólo altera la forma en que se muestran los campos en la ventana Examinar. Si se ha especificado un ancho para un campo individual con la cláusula FIELDS, éste suplantará al ancho especificado con la cláusula WIDTH para ese campo.
113
Manual de Genlis
WINDOW NombreVentana1 Especifica una ventana definida por el usuario cuyas características asumirá la ventana Examinar. Por ejemplo, si la ventana se ha definido con la cláusula FLOAT, la ventana Examinar podrá desplazarse. La ventana especificada no tiene que estar activa o visible necesariamente, pero debe estar definida. IN [WINDOW] NombreVentana2 Especifica la ventana primaria dentro de la cual se abrirá la ventana Examinar. La ventana Examinar no asume las características de la ventana primaria. Una ventana Examinar activada dentro de una ventana primaria no podrá desplazarse fuera de ella. Si la ventana primaria se mueve, la ventana Examinar se moverá con ella. Para tener acceso a la ventana Examinar, la ventana primaria debe definirse primero con DEFINE WINDOW y debe estar activa y visible. IN SCREEN Coloca explícitamente una ventana Examinar en la ventana principal de Genlis cuando está activa una ventana definida por el usuario. COLOR SCHEME nNúmeroEsquema Especifica el número de un esquema de colores empleado para los colores de la ventana Examinar. La ventana Examinar asume el esquema de colores establecido mediante Color del Panel de control.
Comentarios Una ventana Examinar permite ver y modificar registros de una tabla, y anexar registros adicionales. Genlis permite tener varias ventanas Examinar abiertas al mismo tiempo. Si presiona esc para salir de la ventana Examinar, se descartarán los cambios realizados en el último campo que haya modificado. Sin embargo, si pasa a otro registro después de modificar un campo, se guardarán los cambios realizados al campo. La lista de campos puede especificar cualquier combinación de campos o campos calculados. La sintaxis de la lista de campos es la siguiente: NombreCampo1 [:R] [:nAnchoColumna] [:V = lExpresión1 [:F] [:E = cTextoMensaje]] [:P = cCódigosFormato] [:B = eLímiteInferior, eLímiteSuperior [:F]] [:H = cTextoEncabezado] [:W = lExpresión2] [, NombreCampo2 [:R]...] Campos calculados. La lista de campos puede contener instrucciones para crear campos calculados. Un campo calculado contiene datos de sólo lectura creados con una expresión. Esta expresión puede tomar cualquier forma, pero debe ser una expresión válida de Genlis. El formato de la instrucción que se utiliza para crear un campo calculado es la siguiente: NombreCampoCalculado = eExpresión
114
Manual de Genlis
En este ejemplo se crea un campo calculado llamado location: CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE customer && Abre la tabla customer. BROWSE FIELDS location = ALLTRIM(city) + ', ' + country city y country son nombres de campos de la tabla seleccionada actualmente. La lista de campos de la cláusula FIELDS incluye opciones que permiten el tratamiento especial de los campos que se muestran en la ventana Examinar: :R Especifica que el campo es de sólo lectura. Los datos que contiene pueden verse pero no modificarse. En el ejemplo siguiente se abre una ventana Examinar con los campos cust_id y company. El campo cust_id es de sólo lectura y no puede cambiarse. CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE customer && Abre la tabla customer. BROWSE FIELDS cust_id:R, company :nAnchoColumna Especifica el tamaño de presentación de un campo en columnas. El valor de:nAnchoColumna no afecta al tamaño del campo en la tabla; sólo altera la forma en que se muestra el campo en la ventana Examinar. :V = lExpresión1 [:F] [:E = cTextoMensaje] Permite realizar la validación de datos a nivel de campo dentro de la ventana Examinar. Si lExpresión1 da como resultado verdadero (.T.) cuando se desplaza el cursor desde un campo, la entrada de datos en el campo se considerará correcta y el cursor se desplazará al campo siguiente. Si lExpresión1 da como resultado falso (.F.), la entrada de datos se considerará incorrecta, el cursor permanecerá en el campo y se mostrará un mensaje. Si lExpresión1 da como resultado 0, la entrada de datos se considerará incorrecta y el cursor permanecerá en el campo, pero no se mostrará ningún mensaje de error. La opción de verificación no se ejecuta para los campos memo. De forma predeterminada, lExpresión1 sólo se evalúa cuando se modifica el campo. Para forzar la comprobación, incluya la opción :F. Puede mostrar su propio mensaje de error si incluye la opción :E que se describe más adelante. :F Determina si la expresión especificada en la opción de verificación se evaluará cuando mueva el cursor fuera de un campo o cuando se active otra ventana. Si no se incluye :F, lExpresión1 sólo se evaluará si se hace algún cambio en el campo. Si se incluye :F, lExpresión1 se evaluará aunque el campo no se haya modificado. :E = cTextoMensaje
115
Manual de Genlis
Si la expresión de validación:V = lExpresión1 da como resultado verdadero (.T), el cursor abandonará el campo normalmente. Si la expresión da como resultado falso (.F.), el cursor permanecerá en el campo y Genlis mostrará un mensaje de error. Si se incluye la opción de error (:E), se mostrará, cTextoMensaje en lugar del mensaje de error del sistema. cTextoMensaje sólo se muestra si SET NOTIFY es ON. Si SET BELL está establecido en ON, sonará un aviso acústico. Si :V = lExpresión1 da como resultado 0, no se mostrará ningún mensaje y el cursor permanecerá en el campo que se esté validando. Esto permite mostrar sus propios mensajes de error en rutinas de validación. El ejemplo siguiente abre la tabla products y muestra los campos product_id y prod_name. El campo product_id es un campo numérico que aceptará hasta cinco números. Para este ejemplo consideraremos como no válido un product_id mayor que 100. :V especifica el criterio de validación. :F fuerza que se ejecute la validación tanto si se cambian los datos como si no. :E reemplaza el mensaje de error del sistema de Genlis por un mensaje de error definido por el usuario. Presione esc para cerrar la ventana Examinar. CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE products && Abre la tabla products. IF _WINDOWS OR _MAC SET STATUS BAR ON ENDIF USE products BROWSE FIELDS in_stock :V = in_stock < 100 ; :F ; :E = 'La cantidad en existencias debe ser menor que 100' :P = cCódigosFormato Si incluye una cláusula FIELDS, también podrá especificar una opción de imagen (:P) para cada campo de la lista. La opción de imagen permite crear una lista de códigos que controle la presentación y entrada de datos para cada campo de la ventana Examinar. cCódigosFormato es la lista de códigos. El ejemplo siguiente utiliza la opción de imagen para permitir únicamente datos numéricos con un determinado formato en el campo unit_price: CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE products && Abre la tabla products. BROWSE FIELDS unit_price :P = '99.999,99' :B = eLímiteInferior, eLímiteSuperior [:F] Especifica un conjunto de límites entre los cuales deben estar comprendidos los datos de un campo. Las expresiones de límite eLímiteInferior y eLímiteSuperior deben coincidir con el tipo de datos del campo y no pueden ser funciones definidas por el usuario. Si los datos escritos no quedan dentro de eLímiteInferior y eLímiteSuperior, aparecerá un mensaje de error del sistema que indica el intervalo entre el que deben estar comprendidos los datos.
116
Manual de Genlis
De forma predeterminada, se comprueba que los datos escritos quedan dentro de los límites sólo si se hacen cambios en el contenido del campo. Para forzar la comprobación, incluya la opción de forzar validación (:F). El ejemplo siguiente garantiza que el valor del campo in_stock están entre 1 y 100. Presione esc para cerrar la ventana Examinar. CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE products && Abre la tabla products. BROWSE FIELDS in_stock :B = 1, 100 :F :H = cTextoEncabezado Reemplaza los nombres predeterminados de campo por sus propios encabezados, que usted especifica mediante cTextoEncabezado. De forma predeterminada, los nombres de campo se utilizan como encabezados de columna en la ventana Examinar. El ejemplo siguiente proporciona encabezados definidos por el usuario para los campos mostrados. CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE products && Abre la tabla products. BROWSE FIELDS prod_name :H = 'Nombre del producto:', ; unit_price :H = 'Precio por unidad:' :W = lExpresión2 Determina si se puede desplazar el cursor a un campo. Si lExpresión2 da como resultado falso (.F.), se prohibirá que el cursor se desplace al campo. Si lExpresión2 da como resultado verdadero (.T.), el cursor podrá desplazarse al campo. lExpresión2 acepta funciones definidas por el usuario. Si se prohibe desplazar el cursor a todos los campos, el registro actual se marcará como de sólo lectura. Esto ocurre sólo cuando todos los campos contienen una cláusula WHEN que da como resultado falso. Soporte de SET SKIP. SET SKIP permite establecer una relación uno a varios entre dos tablas. Por cada registro de la tabla primaria puede haber múltiples registros relacionados en la tabla secundaria. Si crea una relación uno a varios, podrá utilizar BROWSE para ver registros tanto de la tabla primaria como de la tabla secundaria. El registro primario se muestra una vez, junto con el primer registro coincidente de la tabla secundaria. Los demás registros coincidentes se mostrarán en las filas que siguen al registro primario y al primer registro coincidente secundario. El carácter de relleno para la información primaria repetida depende de la fuente actual de la ventana Examinar. Si se sitúa el puntero de registro en un registro primario, podrá desplazarlo entre los registros primarios de la ventana Examinar si presiona ctrl+flecha abajo para ir al siguiente registro primario o ctrl+flecha arriba para ir al registro primario anterior. La lista de campos de la cláusula FIELDS contiene los registros de la tabla primaria y de la secundaria. Los nombres de los campos están precedidos por el alias de su tabla (orders o customer) y un punto. CLEAR CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata')
117
Manual de Genlis
USE customer ORDER cust_id IN 0 && Tabla primaria. USE orders ORDER cust_id IN 0 && Tabla secundaria. SELECT customer && Vuelve al área de trabajo primaria. SET RELATION TO cust_id INTO orders && Establece la relación. SET SKIP TO orders && Relación uno a varios. WAIT WINDOW 'Desplácese para ver flechas de envío para cada cliente' NOWAIT BROWSE FIELDS customer.cust_id :H='Número de cliente', ; customer.city :H='Ciudad del cliente', orders.shipped_on Funciones útiles… Algunas funciones de Genlis devuelven información útil acerca de la ventana Examinar. Función VARREAD( ) activa. RECNO( )
Descripción Devuelve el nombre del campo donde está situado el cursor para la ventana Examinar Devuelve el número del registro seleccionado en la ventana Examinar activa.
5.5.48. CD | CHDIR (Comando) Cambia el directorio predeterminado de Genlis por el directorio que usted especifique.
Sintaxis CD cRuta | CHDIR cRuta
Argumentos cRuta Especifica uno de los elementos siguientes: Un designador de unidad. Un designador de unidad con un directorio. Un directorio secundario. Cualquiera de los anteriores que utilicen notación abreviada de MS-DOS ( \ o ..). Cuando se incluya .. para modificar el directorio primario, será necesario incluir un espacio entre CD o CHDIR y los dos puntos.
Comentarios Utilice CD o CHDIR para especificar el directorio predeterminado de Genlis. Genlis busca archivos en el directorio predeterminado de Genlis. Si Genlis no encuentra un archivo en el directorio predeterminado, buscará en la ruta de acceso de Genlis si se ha especificado una. Utilice SET PATH para especificar la ruta de acceso de Genlis. Si crea un archivo y no especifica dónde situarlo, el archivo se colocará en el directorio predeterminado de Genlis.
118
Manual de Genlis
5.5.49. CDOW( ) (Función) Devuelve el día de la semana a partir de una expresión de Date o de DateTime dada.
Sintaxis CDOW(dExpresión | tExpresión)
Valor devuelto Character
Argumentos dExpresión Especifica la fecha para la que CDOW( ) devuelve el día. tExpresión Especifica la DateTime para la que CDOW( ) devuelve el día.
Comentarios CDOW( ) la función de caracteres del día de la semana, devuelve el nombre del día de la semana a partir de una expresión de Date.
5.5.50. CEILING( ) (Función) Devuelve el entero más próximo que sea mayor o igual que la expresión numérica especificada.
Sintaxis CEILING(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica el número cuyo próximo entero mayor devuelve CEILING( ).
Comentarios CEILING redondea un número con parte fraccional hasta el próximo entero mayor.
119
Manual de Genlis
5.5.51. CHR( ) (Función) Devuelve el carácter asociado al código ANSI numérico especificado.
Sintaxis CHR(nCódigoANSI)
Tipos devueltos Character
Argumentos nCódigoANSI Especifica un número entre 0 y 255 cuyo carácter ANSI equivalente devuelve CHR( ). Utilice ASC( ) para devolver el valor ANSI de un carácter especificado.
Comentarios CHR( ) devuelve un único carácter correspondiente a la posición numérica del carácter en la tabla de caracteres de la página de códigos actual. CHR( ) puede utilizarse para enviar códigos de control a una impresora.
5.5.52. CHRSAW( ) (Función) Determina si un carácter está presente o no en el búfer de teclado.
Sintaxis CHRSAW([nSegundos])
Tipos devueltos Logical
Argumentos nSegundos Especifica el tiempo, en segundos, que CHRSAW( ) espera antes de comprobar el búfer de teclado. Si omite nSegundos, el búfer de teclado se comprobará inmediatamente. La inclusión de nSegundos permite utilizar CHRSAW( ) en diversas actividades cronometradas. Por ejemplo, el programa puede cerrar una aplicación si no se ha presionado ninguna tecla después de transcurrir un cierto número de segundos.
120
Manual de Genlis
Comentarios CHRSAW( ) devuelve verdadero (.T.) si hay un carácter en el búfer de teclado y devuelve falso (.F.) si no lo hay. CHRSAW( ) no afecta al contenido del búfer de teclado.
5.5.53. CHRTRAN( ) (Función) Cada carácter de una expresión de caracteres que coincida con un carácter de una segunda expresión de caracteres se reemplaza con el carácter correspondiente de una tercera expresión de caracteres.
Sintaxis CHRTRAN(cExpresiónBuscada, cExpresiónBúsqueda, cExpresiónReemplazo)
Tipos devueltos Character
Argumentos cExpresiónBuscada Especifica la expresión donde CHRTRAN( ) reemplaza caracteres. cExpresiónBúsqueda Especifica la expresión que contiene los caracteres buscados por CHRTRAN( ) en cExpresiónBuscada. cExpresiónReemplazo Especifica la expresión que contiene los caracteres de reemplazo. Si se encuentra en cExpresiónBúsqueda un carácter de cExpresiónBúsqueda, el carácter de cExpresiónBuscada se sustituirá por el carácter de cExpresiónReemplazada que esté en la misma posición en cExpresiónReemplazada que el carácter correspondiente en cExpresiónBúsqueda. Si cExpresiónReemplazo tiene menos caracteres que cExpresiónBúsqueda, los caracteres adicionales de cExpresiónBúsqueda se eliminan de cExpresiónBuscada. Si cExpresiónReemplazo tiene más caracteres que cExpresiónBúsqueda, los caracteres adicionales de cExpresiónReemplazo se pasarán por alto.
Comentarios CHRTRAN( ) convierte la expresión de caracteres cExpresiónBuscada mediante las expresiones de conversión cExpresiónBúsqueda y cExpresiónReemplazo, y devuelve la cadena de caracteres resultante.
121
Manual de Genlis
5.5.54. CHRTRANC( ) (Función) Cada carácter de una expresión de caracteres que concuerde con un carácter en una segunda expresión de caracteres se reemplaza con el carácter correspondiente de una tercera expresión de caracteres.
Sintaxis CHRTRANC(cBuscada, cBuscar, cReemplazo)
Tipos devueltos Character
Argumentos cBuscada Especifica la expresión en la que CHRTRANC( ) reemplaza caracteres. cBuscar Especifica la expresión que contiene los caracteres que CHRTRANC( ) busca cBuscada. cReemplazo Especifica la expresión que contiene los caracteres de reemplazo. Si un carácter de cBuscar se encuentra en cBuscada, se reemplazará el carácter de cBuscada por un carácter de cReemplazo que esté en la misma posición en cReemplazo que el carácter correspondiente en cBuscar. Si cReemplazo tiene menos caracteres que cBuscar, se eliminarán los caracteres adicionales de cBuscar en cBuscada. Si cReemplazo tiene más caracteres que cBuscar, se pasarán por alto los caracteres adicionales de cReemplazo.
Comentarios CHRTRANC( ) está diseñado para facilitar el trabajo con expresiones que contienen caracteres de dos bytes. Utilice CHRTRANC( ) para reemplazar caracteres de un byte por caracteres de dos bytes o viceversa. Si las expresiones contienen sólo caracteres de un byte, CHRTRANC( ) es equivalente a CHRTRAN( ). Esta función es útil para tratar juegos de caracteres del doble byte para idiomas como Hiragana y Katakana.
5.5.55. CMONTH( ) (Función) Devuelve el nombre del mes a partir de una expresión de fecha o de una propiedad DateTime dada.
Sintaxis CMONTH(dExpresión | tExpresión)
122
Manual de Genlis
Tipos devueltos Character
Argumentos dExpresión Especifica la expresión de fecha a partir de la cual CMONTH( ) devuelve el nombre del mes. tExpresión Especifica la expresión de DateTime de la cual CMONTH( ) devuelve el nombre del mes.
Comentarios CMONTH( ) devuelve el nombre del mes como una cadena en el formato de nombre apropiado.
5.5.56. COPY FILE (Comando) Duplica cualquier tipo de archivo.
Sintaxis COPY FILE NombreArchivo1 TO NombreArchivo2
Comentarios COPY FILE crea un duplicado del archivo cuyo nombre se especifica en NombreArchivo1. COPY FILE puede utilizarse para copiar todo tipo de archivos. El archivo que se va a copiar no puede estar abierto. Es necesario incluir las extensiones tanto del nombre del archivo de origen NombreArchivo1 como del nombre del archivo de destino NombreArchivo2. NombreArchivo1 y NombreArchivo2 pueden contener caracteres comodín como * y ?. Por ejemplo, para crear copias de seguridad de todos los archivos de programa con la extensión .prg en el directorio o carpeta actual, ejecute COPY FILE *.PRG TO *.BAK. Si utiliza COPY FILE para crear una copia de seguridad de una tabla que tiene un campo memo, un índice estructural o ambos, asegúrese de copiar también los archivos .fpt y .cdx.
5.5.57. COPY TO ARRAY (Comando) Copia a una matriz los datos de la tabla seleccionada actualmente.
Sintaxis COPY TO ARRAY NombreMatriz [FIELDS ListaCampos]
123
Manual de Genlis
| FIELDS LIKE Estructura | FIELDS EXCEPT Estructura] [Alcance] [FOR lExpresión1] [WHILE lExpresión2] [NOOPTIMIZE]
Argumentos NombreMatriz Especifica la matriz a la que se deben copiar los datos de la tabla. FIELDS ListaCampos Especifica que solamente se copian a la matriz los campos especificados en ListaCampos. Si se omite la cláusula FIELDS ListaCampos, todos los campos se copiarán a la matriz si ésta tiene suficientes columnas. FIELDS LIKE Estructura Especifica que los campos que coinciden con la estructura de campos Estructura se copian a la matriz. FIELDS EXCEPT Estructura Especifica que todos los campos excepto los que no coinciden con la estructura de campos Estructura se copian a la matriz. La estructura de campos Estructura admite comodines. Por ejemplo, para especificar que todos los campos que comiencen con las letras A y P se copien a la matriz, utilice la instrucción siguiente: COPY TO ARRAY aMiMatriz FIELDS LIKE A*,P* La cláusula LIKE se puede combinar con la cláusula EXCEPT: COPY TO ARRAY aMiMatriz FIELDS LIKE A*,P* EXCEPT PARTNO* Alcance Especifica el intervalo de registros que se copian a la matriz. Solamente se copian los registros incluidos en el intervalo. Las cláusulas de alcance son: ALL, NEXT nRegistros, RECORD nNúmeroRegistros y REST. El alcance predeterminado para COPY TO ARRAY es ALL (todos los registros). FOR lExpresión1 Especifica que solamente se copian a la matriz los registros que satisfacen la condición lógica lExpresión1. Incluir FOR permite copiar condicionalmente diversos registros a la matriz para desechar los registros no deseados. Rushmore optimizará una consulta COPY TO ARRAY que incluya FOR lExpresión1 si lExpresión1 es una expresión optimizable. Para obtener un mejor rendimiento, utilice una expresión optimizable en la cláusula FOR. WHILE lExpresión2 Especifica una condición por la cual los registros se copian a la matriz siempre y cuando la expresión lógica lExpresión2 dé como resultado verdadero (.T.). NOOPTIMIZE
124
Manual de Genlis
Desactiva la optimización Rushmore de COPY TO ARRAY.
Comentarios COPY TO ARRAY y SCATTER son similares. COPY TO ARRAY copia múltiples registros a una matriz, mientras que SCATTER copia un solo registro a una matriz o a un conjunto de variables de memoria. Tanto COPY TO ARRAY como SCATTER crean una nueva matriz si no existe una matriz con el nombre especificado. Para copiar un solo registro a una matriz, puede especificar una matriz de una dimensión. La matriz de una dimensión debe tener el mismo número de elementos que el número de campos de la tabla, sin contar los campos memo. Los campos memo se pasan por alto en COPY TO ARRAY. Si especifica una matriz de una dimensión, el primer campo de un registro se almacenará en el primer elemento de la matriz, el segundo campo se almacenará en el segundo elemento y así sucesivamente. Si la matriz de una dimensión tiene más elementos que campos hay en la tabla, los elementos sobrantes permanecerán sin cambios. Si la matriz tiene menos elementos que campos hay en la tabla, los campos sobrantes se pasarán por alto. Para copiar múltiples registros o una tabla entera a una matriz, utilice una matriz de dos dimensiones. El número de filas de la matriz es el número de registros que puede contener y su número de columnas es igual al número de campos que se pueden incluir en ella. Cada registro se almacena en una fila de la matriz y cada campo del registro se almacena en una columna. Para cada registro, el primer campo se almacena en la primera columna de la matriz, el segundo campo se almacena en la segunda columna y así sucesivamente. Si el número de columnas de la matriz es mayor que el de campos de la tabla, las columnas restantes permanecerán sin cambios. Si el número de columnas de la matriz es menor que el número de campos de la tabla, los campos restantes no se almacenarán en la matriz. Cada fila sucesiva de la matriz se llena con el contenido del siguiente registro de la tabla. Si la matriz tiene más filas que registros tiene la tabla, las filas restantes permanecerán sin cambios. Si la matriz tiene menos filas que registros tiene la tabla, los registros restantes no se almacenarán en la matriz. Es posible copiar datos desde matrices a nuevos registros de tablas con APPEND FROM ARRAY. También es posible copiar datos de una matriz o un conjunto de variables de memoria a registros de una tabla mediante GATHER.
5.5.58. COS( ) (Función) Devuelve el coseno de una expresión numérica.
Sintaxis COS(nExpresión)
Tipos devueltos Numeric
125
Manual de Genlis
Argumentos nExpresión Especifica la expresión numérica cuyo coseno devuelve COS( ). nExpresión puede ser cualquier valor.
Comentarios COS( ) devuelve el coseno de nExpresión en radianes. Utilice DTOR( ) para convertir un ángulo de grados a radianes. El número de posiciones decimales que devuelve COS( ) se puede especificar mediante SET DECIMALS. El valor devuelto por COS( ) varía entre –1 y 1.
5.5.59. COUNT (Comando) Cuenta los registros de una tabla.
Sintaxis COUNT [Alcance] [FOR lExpresión1] [WHILE lExpresión2] [TO NombreVariableMemoria] [NOOPTIMIZE]
Argumentos Alcance Especifica el intervalo de registros que se va a incluir en la cuenta. Las cláusulas de alcance son: ALL, NEXT nRegistro, RECORD nNúmeroRegistros y REST. Los comandos que incluyen Alcance solamente actúan sobre la tabla del área de trabajo activa. El alcance predeterminado de COUNT es ALL (todos los registros). FOR lExpresión1 Especifica que solamente se cuentan los registros que satisfacen la condición lógica lExpresión1. Incluir FOR le permite contar registros condicionalmente y desechar los registros no deseados. Rushmore optimizará una consulta COUNT FOR si lExpresión1 es una expresión optimizable. Para conseguir un mejor rendimiento, utilice una expresión optimizable en la cláusula FOR. WHILE lExpresión2 Especifica una condición por la cual los registros se cuentan siempre y cuando la expresión lógica lExpresión2 dé como resultado verdadero (.T.). TO NombreVariableMemoria Especifica la variable de memoria o la matriz en que se almacena la cuenta de registros. Si la variable de memoria especificada no existe, Genlis la creará. NOOPTIMIZE
126
Manual de Genlis
Desactiva la optimización Rushmore de COUNT.
Comentarios COUNT cuenta los registros que estén en el alcance de registros para los que se cumplen las condiciones FOR o WHILE. Si SET TALK está establecido en ON, se mostrará la cuenta de registros. Si SET DELETE está establecido en OFF, los registros marcados para su eliminación se incluirán en la cuenta. Para ver una explicación de cómo los valores nulos influyen en COUNT
5.5.60. CREATE TABLE - SQL (Comando) Crea una tabla que tiene los campos especificados.
Sintaxis CREATE TABLE | DBF NombreTabla1 [NAME NombreLargoTabla] [FREE] (NombreCampo1 TipoCampo [(nAnchoCampo [, nPrecisión])] [NULL | NOT NULL] [CHECK lExpresión1 [ERROR cTextoMensaje1]] [DEFAULT eExpresión1] [PRIMARY KEY | UNIQUE] [REFERENCES NombreTabla2 [TAG NombreEtiqueta1]] [NOCPTRANS] [, NombreCampo2 ...] [, PRIMARY KEY eExpresión2 TAG NombreEtiqueta2 |, UNIQUE eExpresión3 TAG NombreEtiqueta3] [, FOREIGN KEY eExpresión4 TAG NombreEtiqueta4 [NODUP] REFERENCES NombreTabla3 [TAG NombreEtiqueta5]] [, CHECK lExpresión2 [ERROR cTextoMensaje2]]) | FROM ARRAY NombreMatriz
Argumentos NombreTabla1 Especifica el nombre de la tabla que desea crear. Las opciones TABLE y DBF son idénticas. NAME NombreLargoTabla Especifica un nombre largo para la tabla. Este nombre largo solamente se puede especificar cuando hay una base de datos abierta, porque los nombres largos de tabla se almacenan en bases de datos. Los nombres largos pueden contener 128 caracteres como máximo y se pueden usar en la base de datos en lugar de los nombres cortos de archivo. FREE
127
Manual de Genlis
Especifica que la tabla no se agregará a ninguna base de datos abierta. No es necesario incluir FREE si no hay ninguna base de datos abierta. (NombreCampo1 TipoCampo [(nAnchoCampo [, nPrecisión])] Especifica el nombre, el tipo, el ancho y la precisión del campo (el número de lugares decimales), respectivamente. Una tabla puede contener hasta 255 campos. Si hay uno o más campos que permiten valores nulos, el límite se reduce a 254 campos. TipoCampo es una sola letra que indica el tipo de datos del campo. Algunos tipos de datos de campo necesitan que especifique nAnchoCampo o nPrecisión, o ambos. La siguiente tabla enumera los valores para TipoCampo y si se necesita indicar nAnchoCampo y nPrecisión. TipoCampo C D T N F I B Y L M G
nAnchoCampo n – – n n – – – – – –
nPrecisión – – – d d – d – – – –
Descripción Campo de caracteres de ancho n Date DateTime Campo numérico de ancho n con d decimales Campo numérico flotante de ancho n con d decimales Integer Double Currency Logical Memo General
nAnchoCampo y nPrecisión se pasan por alto para los tipos D, T, I, Y, L, M, G y P. nPrecisión tiene como valor predeterminado cero (ningún lugar para decimales) si no se incluye nPrecisión para los tipos N o F. nPrecisión tiene, de forma predeterminada, el número de lugares para decimales especificado por el valor SET DECIMAL si no está incluida nPrecisión para el tipo B. NULL Admite valores nulos en el campo. Si uno o más campos pueden contener valores nulos, el número máximo de campos que puede contener la tabla disminuye en uno, de 255 a 254. NOT NULL Impide valores nulos en el campo. Si omite NULL y NOT NULL, la configuración actual de SET NULL determinará si se admiten valores nulos en el campo. No obstante, si omite NULL y NOT NULL, pero incluye la cláusula PRIMARY KEY o UNIQUE, se pasará por alto la configuración actual de SET NULL y el campo tomará el valor predeterminado de NOT NULL. CHECK lExpresión1
128
Manual de Genlis
Especifica una regla de validación para el campo. lExpresión1 puede ser una función definida por el usuario. Observe que cuando se agrega un registro en blanco, se comprueba la regla de validación. Se genera un error en caso de que la regla de validación no admita un valor de campo en blanco en un registro agregado. ERROR cTextoMensaje1 Especifica el mensaje de error que Genlis mostrará cuando la regla del campo genere un error. El mensaje sólo se muestra cuando los datos se modifican desde una ventana Examinar o Editar. DEFAULT eExpresión1 Especifica un valor predeterminado para el campo. El tipo de datos de eExpresión1 debe ser el mismo que el del campo. PRIMARY KEY Crea un índice principal para el campo. La etiqueta de índice principal tiene el mismo nombre que el campo. UNIQUE Crea un índice candidato para el campo. La etiqueta de índice candidato tiene el mismo nombre que el campo. Nota. Los índices candidatos (que se crean al incluir la opción UNIQUE en CREATE TABLE o ALTER TABLE-SQL) no son iguales que los índices creados con la opción UNIQUE del comando INDEX. Un índice creado con la opción UNIQUE del comando INDEX admite claves de índice duplicadas, mientras que los índices candidatos no las admiten. Los valores nulos y los registros duplicados no se admiten en campos empleados para índices principales ni candidatos. No obstante, Genlis no generará ningún error si crea un índice principal o candidato para un campo que admita valores nulos. Genlis generará un error si intenta introducir un valor nulo o duplicado en un campo utilizado para un índice principal o candidato. REFERENCES NombreTabla2 [TAG NombreEtiqueta1] Especifica la tabla primaria con la que se establece una relación definitiva. Si omite TAG NombreEtiqueta1, la relación se establecerá mediante la clave de índice principal de la tabla primaria. Si la tabla primaria no tiene ningún índice principal, Genlis generará un error. Incluya TAG NombreEtiqueta1 para establecer una relación basada en una etiqueta de índice existente para la tabla primaria. Los nombres de índice de etiqueta pueden contener hasta 10 caracteres. La tabla primaria no puede ser una tabla libre. NOCPTRANS Impide la conversión de campos memo y de caracteres a una página de códigos diferente. Si se convierte la tabla a otra página de códigos, los campos para los que se haya especificado NOCPTRANS no se convertirán. NOCPTRANS solamente se puede especificar para campos de caracteres y memo. El ejemplo siguiente crea una tabla llamada MITABLA que contiene dos campos de caracteres y dos campos memo. El segundo campo de caracteres, CAR2, y el segundo campo memo, MEMO2, incluyen NOCPTRANS para impedir la conversión. CREATE TABLE mitabla (car1 C(10), car2 C(10) NOCPTRANS, memo1 M, memo2 M NOCPTRANS)
129
Manual de Genlis
PRIMARY KEY eExpresión2 TAG NombreEtiqueta2 Especifica un índice principal que se desea crear. eExpresión2 especifica cualquier campo o combinación de campos de la tabla. TAG NombreEtiqueta2 especifica el nombre de la etiqueta de índice principal que se desea crear. Los nombres de índice de etiqueta pueden contener hasta 10 caracteres. Puesto que una tabla solamente puede tener un índice principal, no es posible incluir esta cláusula si ya ha creado un índice principal para un campo. Genlis generará un error si incluye dos o más cláusulas PRIMARY KEY en CREATE TABLE. UNIQUE eExpresión3 TAG NombreEtiqueta3 Crea un índice candidato. eExpresión3 especifica cualquier campo o combinación de campos de la tabla. No obstante, si ha creado un índice principal con una de las opciones de PRIMARY KEY, no podrá incluir el campo especificado para el índice principal. TAG NombreEtiqueta3 especifica un nombre de etiqueta para la etiqueta de índice candidato que se desea crear. Los nombres de índice de etiqueta pueden contener hasta 10 caracteres. Una tabla puede tener múltiples índices candidatos. FOREIGN KEY eExpresión4 TAG NombreEtiqueta4 [NODUP] Crea un índice externo (no principal) y establece una relación con una tabla primaria. eExpresión4 especifica la expresión de clave de índice externo y NombreEtiqueta4 especifica el nombre de la etiqueta de clave de índice externo que se desea crear. Los nombres de índice de etiqueta pueden contener hasta 10 caracteres. Incluya NODUP para crear un índice externo candidato. Puede crear múltiples índices externos para la tabla, pero sus expresiones deben especificar campos distintos de la tabla. REFERENCES NombreTabla3 [TAG NombreEtiqueta5] Especifica la tabla primaria con la cual se establece una relación definitiva. Incluya TAG NombreEtiqueta5 para establecer una relación basada en una etiqueta de índice para la tabla primaria. Los nombres de índice de etiqueta pueden contener hasta 10 caracteres. Si omite TAG NombreEtiqueta5, la relación se establecerá, de forma predeterminada, mediante la clave de índice principal de la tabla primaria. CHECK eExpresión2 [ERROR cTextoMensaje2] Especifica la regla de validación de tabla. ERROR cTextoMensaje2 especifica el mensaje de error que Genlis mostrará cuando se ejecute la regla de validación de tabla. El mensaje solamente se muestra cuando se modifican los datos desde una ventana Examinar o Editar. FROM ARRAY NombreMatriz Especifica el nombre de una matriz existente cuyo contenido es el nombre, el tipo, la precisión y la escala para cada campo de la tabla. El contenido de la matriz se puede definir con la función AFIELDS( ).
Comentarios La nueva tabla se abre en la menor área de trabajo disponible y se puede tener acceso a ella por su alias. La nueva tabla se abre de forma exclusiva, cualquiera que sea la configuración actual de SET EXCLUSIVE. Si hay una base de datos abierta y no incluye la cláusula FREE, la nueva tabla se agregará a la base de datos. No puede crear una tabla nueva con el mismo nombre que otra ya existente en la base de datos.
130
Manual de Genlis
Si no hay ninguna base de datos abierta al crear la nueva tabla, se generará un error si se incluyen las cláusulas NAME, CHECK, DEFAULT, FOREIGN KEY, PRIMARY KEY o REFERENCES. Observe que la sintaxis de CREATE TABLE utiliza comas para separar determinadas opciones de CREATE TABLE. Además, las cláusulas NULL, NOT NULL, CHECK, DEFAULT, PRIMARY KEY y UNIQUE deben estar incluidas entre los paréntesis que contienen las definiciones de columnas.
5.5.61. CTOD( ) (Función) Convierte una expresión de caracteres en una expresión de fecha.
Sintaxis CTOD(cExpresión)
Tipos devueltos Date
Argumentos cExpresión Especifica una expresión de caracteres para la cual CTOD( ) devuelve un valor de tipo Date.
5.5.62. CTOBIN( ) (Función) Convierte una representación de caracteres binarios en un valor entero.
Sintaxis CTOBIN(cExpresión)
Tipo devuelto Numeric
Argumentos cExpresión Especifica la representación de caracteres binarios que se va a convertir.
Comentarios Utilice CTOBIN( ) para volver a convertir una representación de caracteres binarios creada con BINTOC( ) en un valor entero.
131
Manual de Genlis
5.5.63. CTOT( ) (Función) Devuelve un valor DateTime a partir de una expresión de caracteres.
Sintaxis CTOT(cExpresiónCarácter)
Tipo devuelto DateTime
Argumentos cExpresiónCarácter Especifica la expresión de caracteres a partir de la cual se devuelve un valor DateTime.
5.5.64. CURDIR( ) (Función) Devuelve el directorio actual.
Sintaxis CURDIR([cExpresión])
Tipos devueltos Character
Argumentos cExpresión Especifica la unidad o el volumen para el cual CURDIR( ) devuelve el directorio actual. Si omite cExpresión, se asumirá la unidad o el volumen predeterminados actuales. Devuelve una cadena vacía si la unidad o el volumen especificado en cExpresión no existen.
Comentarios CURDIR( ) devuelve en forma de cadena de caracteres el directorio MS-DOS actual de una unidad especificada.
132
Manual de Genlis
5.5.65. DATE( ) (Función) Devuelve la fecha actual del sistema, que está controlada por el sistema operativo, o crea un valor Date compatible con el milenio.
Sintaxis DATE([nAño, nMes, nDía])
Tipos devueltos Date
Argumentos nAño Especifica el año devuelto en el valor Date compatible con el milenio. nAño puede tener un valor entre 100 y 9999. nMes Especifica el mes devuelto en el valor Date compatible con el milenio. nMes puede tener un valor entre 1 y 12. nDía Especifica el día devuelto en el valor Date compatible con el milenio. nDía puede ser un valor entre 1 y 31.
Comentarios DATE( ) devuelve la actual fecha del sistema si se ejecuta sin argumentos opcionales. Incluya los argumentos opcionales para que devuelva un valor Date compatible con el milenio.
5.5.66. DATETIME( ) (Función) Devuelve la fecha y la hora actuales como un valor DateTime o crea un valor DateTime compatible preparado para el milenio.
Sintaxis DATETIME([nAño, nMes, nDía [, nHoras [, nMinutos [, nSegundos]]]])
Tipos devueltos DateTime
Argumentos nAño
133
Manual de Genlis
Especifica el año devuelto en un valor DateTime compatible con el milenio. nAño puede tener un valor entre 100 y 9999. nMes Especifica el mes devuelto en un valor DateTime compatible con el milenio. nMes puede tener un valor entre 1 y 12. nDía Especifica el día devuelto en un valor DateTime compatible con el milenio. nDía puede tener un valor entre 1 y 31. nHoras Especifica las horas devueltas en un valor DateTime compatible con el milenio. nHoras puede tener un valor entre 0 (medianoche) y 23 (11 p.m.). Toma el valor predeterminado 0 si se omite. nMinutos Especifica los minutos devueltos en un valor DateTime compatible con el milenio. nMinutos puede tener un valor entre 0 y 59. Toma el valor predeterminado 0 si se omite. nSegundos Especifica los segundos devueltos en un valor DateTime compatible con el milenio. nSegundos puede tomar un valor entre 0 y 59. Toma el valor predeterminado 0 si se omite.
Comentarios DATETIME( ) devuelve la fecha actual del sistema si se ejecuta sin ningún argumento opcional.
5.5.67. DAY( ) (Función) Devuelve el número del día del mes correspondiente a una expresión de Date o de DateTime dada.
Sintaxis DAY(dExpresión | tExpresión)
Tipos devueltos Numeric
Argumentos dExpresión Especifica una fecha a partir de la cual DAY( ) devuelve un día del mes. dExpresión puede ser un literal de fecha, una variable de memoria de tipo Date, un elemento de matriz o un campo de fecha.
134
Manual de Genlis
tExpresión Especifica una fecha a partir de la cual DAY( ) devuelve un día del mes. dExpresión puede ser un literal de fecha, una variable de memoria de tipo Date, un elemento de matriz o un campo de fecha.
Comentarios DAY( ) devuelve un número entre 1 y 31.
5.5.68. DELETE - SQL (Comando) Marca registros para eliminarlos.
Sintaxis DELETE FROM [NombreBaseDatos!]NombreTabla [WHERE CondiciónFiltro1 [AND | OR CondiciónFiltro2 ...]]
Argumentos FROM [NombreBaseDatos!]NombreTabla Especifica la tabla en la que se marcan registros para eliminar. NombreBaseDatos! especifica el nombre de una base de datos no actual que contiene la tabla. Incluya el nombre de una base de datos que contenga la tabla si no es la base de datos actual. Incluya el delimitador signo de exclamación (!) después del nombre de base de datos y antes del nombre de tabla. WHERE CondiciónFiltro1 [AND | OR CondiciónFiltro2 ...] Especifica que Genlis sólo marca algunos registros para eliminar. CondiciónFiltro especifica los criterios que deben satisfacer los registros para marcarlos para eliminación. Puede incluir tantas condiciones como desee si las conecta con el operador AND u OR. También puede emplear el operador NOT para invertir el valor de una expresión lógica o utilizar EMPTY( ) para comprobar si hay campos vacíos.
Comentarios Los registros marcados para eliminación no se eliminan físicamente de la tabla hasta que se ejecute PACK. Los registros marcados para eliminación pueden recuperarse (quitarles la marca) con RECALL. Si se establece SET DELETED como ON, todos los comandos que incluyan un alcance pasarán por alto los registros marcados para eliminación. A diferencia de DELETE, DELETE - SQL utiliza el bloqueo de registros cuando marca varios registros para eliminarlos de las tablas abiertas para acceso compartido. Este hecho disminuye la contención de registros en situaciones de varios usuarios, pero puede ralentizar el rendimiento. Para conseguir el máximo rendimiento, abra la tabla para uso exclusivo o utilice FLOCK( ) para bloquear la tabla.
135
Manual de Genlis
5.5.69. DELETE FILE (Comando) Elimina un archivo del disco.
Sintaxis DELETE FILE [NombreArchivo | ?] [RECYCLE]
Argumentos NombreArchivo Especifica el archivo que desea eliminar. NombreArchivo puede contener caracteres comodín tales como * y ?. Por ejemplo, para eliminar archivos de copia de seguridad con la extensión .bak en el directorio actual, ejecute DELETE FILE *.BAK. ? Muestra el cuadro de diálogo Eliminar, en el que puede elegir un archivo para eliminarlo. RECYCLE Especifica que el archivo no se eliminará del disco inmediatamente y que se colocará en la Papelera de reciclaje de Windows 95. Precaución. Cualquier archivo eliminado con este comando no podrá recuperarse. Incluso si especifica SET SAFETY ON, no se le avisará antes de eliminar el archivo.
Comentarios Cuando ejecute DELETE FILE, el archivo que pretenda eliminar no podrá estar abierto. El nombre del archivo debe incluir la ruta de acceso si está en una unidad o en un directorio distinto de los predeterminados y debe incluir la extensión del nombre del archivo. El nombre del archivo no puede contener caracteres comodín. Antes de eliminar una tabla de una base de datos, ejecute REMOVE TABLE con el nombre de la tabla para quitar de la base de datos la referencia a dicha tabla. Si elimina una tabla que tiene asociado un archivo memo .FPT, asegúrese de eliminar el archivo memo.
5.5.70. DIRECTORY( ) (Función) Devuelve verdadero (.T.) si no se encuentra en disco el directorio especificado.
Sintaxis DIRECTORY(cNombreDirectorio)
136
Manual de Genlis
Tipos devueltos Logical
Argumentos cNombreDirectorio Especifica el nombre del directorio que se va a ubicar. Si no incluye una ruta de acceso absoluta para el directorio que especifique, Genlis buscará el directorio relacionado con el directorio predeterminado de Genlis.
Comentarios El directorio predeterminado de Genlis se especifica con SET DEFAULT.
5.5.71. DO WHILE ... ENDDO (Comando) Ejecuta un conjunto de comandos dentro de un bucle condicional.
Sintaxis DO WHILE lExpresión Comandos ENDDO
Argumentos lExpresión Especifica una expresión lógica cuyo valor determina si se debe ejecutar el conjunto de comandos incluido entre DO WHILE y ENDDO. Siempre que lExpresión dé como resultado verdadero (.T.), el conjunto de comandos se ejecutará. Comandos Especifica el conjunto de comandos de Genlis que se ejecutan siempre y cuando lExpresión dé como resultado verdadero (.T.).
Comentarios Un conjunto de comandos situados entre DO WHILE y ENDDO se ejecuta siempre y cuando la expresión lógica sea verdadera (.T.). Una instrucción DO WHILE debe tener su correspondiente instrucción ENDDO.
137
Manual de Genlis
5.5.72. DOW( ) (Función) Devuelve el número del día de la semana a partir de una expresión Date o DateTime dada.
Sintaxis DOW(dExpresión | tExpresión [, nPrimerDíaSemana])
Tipos devueltos Numeric
Argumentos dExpresión Especifica la expresión Date a partir de la cual DOW( ) devuelve el número del día. tExpresión Especifica la expresión DateTime a partir de la cual DOW( ) devuelve el número de día. nPrimerDíaSemana Especifica el primer día de la semana. nPrimerDíaSemana puede ser uno de los valores siguientes. nPrimerDíaSemana Descripción 0 DOW( ) usa el día que está seleccionado actualmente en el cuadro de lista "La semana comienza en", que aparece en la ficha Regional del cuadro de diálogo Opciones. 1 Domingo. Es el valor predeterminado cuando se omite nPrimerDíaSemana y es el primer día de la semana usado en versiones anteriores de FoxPro. 2 Lunes 3 Martes 4 Miércoles 5 Jueves 6 Viernes 7 Sábado
5.5.73. DTOC( ) (Función) Devuelve una fecha de tipo Character a partir de una expresión de tipo Date o DateTime.
Sintaxis DTOC(dExpresión | tExpresión [, 1])
138
Manual de Genlis
Tipos devueltos Character
Argumentos dExpresión Especifica una variable de memoria, un elemento de matriz o un campo de tipo Date para los que DTOC( ) devuelve una fecha de tipo Character. tExpresión Especifica una variable de memoria, un elemento de matriz o un campo de tipo DateTime para los cuales DTOC( ) devuelve una fecha de tipo Character. 1 Devuelve la fecha en un formato adecuado para la indexación. Esto es particularmente útil para mantener los registros de la tabla en secuencia cronológica. Por ejemplo, para ordenar los registros de la tabla por orden de entrada, podrá utilizar este comando: INDEX ON DTOC(gdFechaFact, 1) + gnHoraFact TAG IndHora gdFechaFact y gnIndHora son los campos que contienen la fecha y la hora en que se escribieron los datos en el registro.
Comentarios DTOC( ) devuelve una cadena de caracteres correspondiente a la expresión de Date o de DateTime. El formato de fecha viene determinado por SET CENTURY y SET DATE.
5.5.74. DTOR( ) (Función) Convierte grados en radianes.
Sintaxis DTOR(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica la expresión numérica cuyo valor se desea convertir en radianes. Un ángulo expresado en formato grados:minutos:segundos se debe convertir a su equivalente decimal.
139
Manual de Genlis
Comentarios DTOR( ) convierte el valor de una expresión numérica dada en grados en su valor equivalente en radianes. DTOR( ) es útil para trabajar con las funciones trigonométricas de Genlis: ACOS( ), ASIN( ), COS( ), SIN( ), TAN( ). Utilice RTOD( ) para convertir radianes en grados.
5.5.75. DTOS( ) (Función) Devuelve una cadena de caracteres de fecha con el formato AAAAMMDD a partir de una expresión de Date o de DateTime especificada.
Sintaxis DTOS(dExpresión | tExpresión)
Tipos devueltos Character
Argumentos dExpresión Especifica la expresión de Date que DTOS( ) convierte a una cadena de caracteres de ocho dígitos. tExpresión Especifica la expresión de DateTime que DTOS( ) convierte a una cadena de caracteres de ocho dígitos.
Comentarios Esta función es útil para indexar tablas por un campo de Date o de DateTime. Es equivalente a DTOC( ) cuando se incluye su argumento opcional 1. La cadena de caracteres devuelta por DTOS( ) no se ve afectada por SET DATE o SET CENTURY.
5.5.76. DTOT( ) (Función) Devuelve un valor de DateTime a partir de una expresión de Date.
Sintaxis DTOT(dExpresiónFecha)
Tipos devueltos DateTime
140
Manual de Genlis
Argumentos dExpresiónFecha Especifica la expresión de Date a partir de la cual se devuelve un valor de DateTime.
Comentarios El formato del valor DateTime que DTOT( ) devuelve depende del valor actual de SET DATE y SET MARK. Si no se suministra un siglo, se adopta el siglo XX. DTOT( ) agrega una hora predeterminada de medianoche (12:00:00 a.m.) a la fecha para producir un valor válido de DateTime.
5.5.77. EMPTY( ) (Función) Determina si una expresión está vacía o no.
Sintaxis EMPTY(eExpresión)
Tipo devuelto Logical
Argumentos eExpresión Especifica la expresión evaluada por EMPTY( ). La expresión que incluya puede ser una expresión de caracteres, numérica, de fecha o lógica, o el nombre de un campo memo o general de una tabla abierta. EMPTY( ) devuelve verdadero (.T.) cuando las expresiones de los tipos de datos siguientes contienen los datos indicados: Tipo de expresión Se evalúa como Character La cadena vacía, espacios en blanco, tabulaciones, retornos de carro o avances de línea o cualquier combinación de éstos. Numeric 0 Currency 0 Float 0 Integer 0 Double 0 Date Vacío (p.e., CTOD('')) DateTime Vacío (p.e., CTOD('')) Logical Falso (.F.) Memo Vacío (sin contenido) General Vacío (sin objeto OLE)
141
Manual de Genlis
Picture
Vacío (sin imagen)
EMPTY( ) no puede utilizarse para determinar si una referencia de objeto de variable de memoria está vacía. Por ejemplo, una variable de memoria puede contener una referencia de objeto para un Form. Si el Form se cierra haciendo clic en Cerrar desde el menú contextual del Form o con CLEAR WINDOWS, la variable de memoria contendrá el valor nulo. El programa de ejemplo siguiente demuestra cómo usar TYPE( ) y ISNULL( ) para determinar si una referencia de objeto de variable de memoria es válida. goMyForm = CREATEOBJECT('Form') WAIT WINDOW IIF(TYPE('goMyForm') = 'O' AND !ISNULL(goMyForm), ; 'goMyForm tiene una referencia de objeto válida',; 'goMyForm no tiene una referencia de objeto válida')
Comentarios EMPTY( ) devuelve verdadero (.T.) si la expresión eExpresión está vacía. Si la expresión no está vacía, EMPTY(°) devolverá falso (.F.).
5.5.78. EOF( ) (Función) Determina si el puntero de registro está situado o no más allá del último registro de la tabla actual o especificada.
Sintaxis EOF([nÁreaTrabajo | cAliasTabla])
Tipo devuelto Logical
Argumentos nÁreaTrabajo Especifica el número de área de trabajo de la tabla. cAliasTabla Especifica el alias de la tabla. EOF( ) devuelve falso (.F.) si no está abierta una tabla en un área de trabajo que especifique. Si no especifica un alias de área de trabajo, se probará la condición de final de archivo en la tabla abierta en el área de trabajo seleccionada.
Comentarios EOF( ) devuelve verdadero (.T.) si el puntero de registro alcanza el final del archivo de tabla (EOF). El final de la tabla se alcanza cuando el puntero del registro transfiere el último registro de la tabla. Por ejemplo,
142
Manual de Genlis
cuando se ejecuta FIND, LOCATE o SEEK sin éxito, Genlis mueve el puntero de registro hasta después del último registro, y EOF( ) devuelve verdadero (.T.). EOF( ) devuelve falso (.F.) si el puntero del registro no está al final de la tabla.
5.5.79. ERASE (Comando) Borra un archivo del disco.
Sintaxis ERASE NombreArchivo | ? [RECYCLE]
Argumentos NombreArchivo Especifica el archivo que se va a borrar. Incluya la ruta de acceso con el nombre del archivo si el archivo está en una unidad o en un directorio de los actuales unidad o directorio NombreArchivo puede contener caracteres comodín como * y ?. Por ejemplo, para borrar archivos de copia de seguridad con ERASE *.BAK. ? Muestra el cuadro de diálogo Eliminar, donde puede elegir un archivo que desee borrar. RECYCLE Especifica que el archivo no se elimine inmediatamente del disco y lo coloca en la Papelera de reciclaje de Windows 95. Precaución. Tenga precaución al utilizar ERASE. Cualquier archivo borrado con este comando no podrá recuperarse. No se le avisará antes de borrar el archivo, incluso si SET SAFETY está ON
5.5.80. EVALUATE( ) (Función) Evalúa una expresión de caracteres y devuelve el resultado.
Sintaxis EVALUATE(cExpresión)
Tipos devueltos Character, Numeric, Currency, Date, DateTime, Logical o Memo
143
Manual de Genlis
Argumentos cExpresión Especifica la expresión a evaluar. cExpresión puede ser una cadena de caracteres literales, o una expresión válida de Genlis, una variable de memoria, un elemento de matriz o un campo de cualquier tipo de datos, incluidos entre comillas. cExpresiónn no puede ser mayor de 255 caracteres. Siempre que sea posible, utilice EVALUATE( ) o una expresión de nombre para reemplazar la sustitución de macro utilizando &. EVALUATE y las expresiones de nombre se ejecutan más rápido que las sustituciones de macro.
Comentarios EVALUATE( ) es similar a TYPE( ) pero devuelve el resultado de una expresión en lugar del tipo de expresión. Una expresión que contiene EVALUATE( ) no puede optimizarse mediante Rushmore.
5.5.81. EXP( ) (Función) Devuelve el valor de ex donde x es una expresión numérica especificada.
Sintaxis EXP(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica el exponente, x, en la expresión exponencial ex
Comentarios El valor de e, la base de los logaritmos naturales, es aproximadamente 2,71828. El número de lugares decimales que se muestran con EXP( ) se especifica con SET DECIMALS.
5.5.82. EXPORT (Comando) Copia datos desde una tabla de Genlis hasta un archivo de otro formato diferente.
Sintaxis EXPORT TO NombreArchivo
144
Manual de Genlis
[TYPE] DIF | MOD | SYLK | WK1 | WKS | WR1 | WRK | XLS | XL5 [FIELDS ListaCampos] [Alcance] [FOR lExpresión1] [WHILE lExpresión2] [NOOPTIMIZE] [AS nPáginaCódigos]
Argumentos NombreArchivo Especifica el nombre del archivo al que Genlis exporta datos. Si no incluye ninguna extensión con el nombre de archivo, se asignará la extensión predeterminada para el tipo de archivo especificado. TYPE Especifica el tipo de archivo que se va a crear. La palabra clave TYPE es opcional, pero es necesario especificar uno de los siguientes tipos de archivo. Tipo de archivo Descripción DIF Cada campo de una tabla de Genlis se convierte en un vector (columna) y cada registro se convierte en un tupla (fila) en un archivo DIF (formato de intercambio de datos, Data Interchange Format), utilizado por VisiCalc. Se asigna el nuevo nombre de archivo a una extensión.DIF si no se incluye ninguna extensión en NombreArchivo. MOD Utilice la cláusula MOD para exportar a un archivo en un formato Microsoft Multiplan versión 4.01 MOD. Se asignará el nuevo nombre de archivo a una extensión .MOD si no incluye una extensión en NombreArchivo. SYLK Un formato de intercambio de vínculos simbólico (utilizado por Microsoft Multiplan) en el cual cada campo de una tabla de Genlis se transforma en una columna en la hoja de cálculo y cada registro se convierte en una fila. De forma predeterminada, los nombres de archivo SYLK no tienen extensión. WK1 Incluya esta opción para crear una hoja de cálculo de Lotus 1-2-3 a partir de una tabla de Genlis. Se asigna una extensión .WK1 al nombre del archivo de hoja de cálculo para usarlo en Lotus 1-2-3 revisión 2.x. Cada campo de la tabla se convierte en una columna en la nueva hoja de cálculo, y cada registro de la tabla se convierte en una fila de la hoja de cálculo. WKS Incluya esta opción para crear una hoja de cálculo de Lotus 1-2-3 a partir de una tabla de Genlis. Se asigna una extensión .WKS al nombre de archivo de la hoja de cálculo para la utilización con Lotus 1-2-3 revisión 1-A. Cada campo de la tabla se convierte en una columna en la nueva hoja de cálculo, y cada registro se convierte en una fila de la hoja de cálculo. WR1 Incluya esta opción para crear una hoja de cálculo de Lotus Symphony a partir de una tabla de Genlis. Se asigna una extensión .WR1 a la hoja de cálculo para usarla con Symphony versión 1.01. Cada
145
Manual de Genlis
campo de la tabla se transforma en una columna en la nueva hoja de cálculo, y cada registro en la tabla se convierte una fila en la hoja de cálculo. WRK Incluya esta opción para crear una hoja de cálculo de Lotus Symphony a partir de una tabla de Genlis. Se asigna una extensión .WRK al nombre de archivo de la hoja de cálculo para utilizarla con Symphony versión 1.10. Cada campo de la tabla se transforma en una columna en la nueva hoja de cálculo, y cada registro en la tabla se transforma en una fila en la hoja de cálculo. XLS Incluya esta opción para crear una hoja de cálculo de Microsoft Excel a partir de una tabla Genlis. Cada campo de la tabla seleccionada se convierte en una columna en la hoja de cálculo, y cada registro de la tabla se transforma en una fila. Se asigna una extensión de nombre de archivo .XLS al archivo de hoja de cálculo recién creada a no ser que haya especificado una extensión distinta. XL5 Incluya esta opción para crear un archivo de hoja de cálculo de Microsoft Excel versión 5.0 a partir de una tabla de Genlis. Cada campo de la tabla actualmente seleccionada se convierte en una columna en la hoja de cálculo y cada registro se transforma en una fila. Se asigna una extensión de nombre de archivo .XLS a la nueva hoja de cálculo a no ser que haya especificado una extensión distinta. FIELDS ListaCampos Especifica qué campos se van a copiar al nuevo archivo. Si omite la cláusula FIELDS, se copiarán todos los campos al nuevo archivo. Los campos de tipo Memo y General no se copian al nuevo archivo aunque sus nombres estén incluidos en la lista de campos. Alcance Especifica un intervalo de registros que se va a copiar al nuevo archivo. Alcance Especifica un intervalo de registros que se va a copiar al nuevo archivo. Sólo se copiarán al nuevo archivo aquellos registros que queden dentro del intervalo. Las cláusulas de alcance son: ALL, NEXT nRegistros, RECORD nNúmeroRegistros, y REST. El alcance predeterminado para EXPORT es todos los registros. FOR lExpresión1 Especifica que sólo aquellos registros que satisfagan la condición lógica lExpresión1 se copiarán al nuevo archivo. Esto le permite eliminar los registros no deseados. Rushmore optimizará un comando EXPORT ... FOR lExpresión1 si lExpresión1 es una expresión o optimizable. Para conseguir el máximo rendimiento, use una expresión optimizable en la cláusula FOR. WHILE lExpresión2 Especifica una condición por la cual los registros se copiarán al nuevo archivo siempre y cuando la expresión lógica lExpresión2 se evalúe como verdadera (.T.). NOOPTIMIZE Desactiva la optimización Rushmore de EXPORT. AS nPáginaCódigos
146
Manual de Genlis
Especifica la página de códigos para el archivo que crea EXPORT. Genlis copia el contenido de la tabla seleccionada actualmente y, a medida que copia los datos, los convierte automáticamente a la página de códigos que usted especifique para el nuevo archivo. Si es posible, Genlis marcará el archivo recién creado con la página de códigos que usted especifique. Si especifica un valor no aceptado para nPáginaCódigos, Genlis generará un mensaje de error. Puede usar GETCP( ) para nPáginaCódigos de manera que aparezca el cuadro de diálogo Página de códigos, permitiéndole especificar una página de códigos para el archivo que cree Genlis. Si omite AS nPáginaCódigos, no se producirá ninguna conversión de páginas de códigos. Si es posible, Genlis marcará el archivo recién creado con la página de códigos de la página desde la que se copiaron los datos. Si nPáginaCódigos es 0, no se producirá ninguna conversión de página de códigos y el archivo recién creado no se marcará con ninguna página de códigos.
Comentarios Use EXPORT para utilizar datos de Genlis en otros paquetes de software. Si la tabla desde la que está exportando está indizada, el nuevo archivo se creará en el orden indizado.
5.5.83. FCHSIZE( ) (Función) Cambia el tamaño de un archivo abierto con una función de archivo de bajo nivel.
Sintaxis FCHSIZE(nControladorArchivo, nNuevoTamañoArchivo)
Tipos devueltos Numeric
Argumentos nControladorArchivo Especifica el controlador del archivo cuyo tamaño desea cambiar. El controlador de archivo lo devuelve FOPEN( ) al abrir el archivo o FCREATE( ) al crear el archivo. Si abre un archivo con FOPEN( ), deberá volver a abrirlo con privilegios de escritura o de lectura y escritura para poder cambiar su tamaño. nNuevoTamañoArchivo Especifica el nuevo tamaño del archivo, en bytes. Si nNuevoTamañoArchivo es menor que el tamaño original del archivo, se truncará el archivo. Si nNuevoTamañoArchivo es mayor que el tamaño original del archivo, se aumentará el tamaño del archivo.
Comentarios Utilice FCHSIZE( ) para aumentar el tamaño del archivo o truncar el archivo a partir de un byte especificado.
147
Manual de Genlis
Cuando se aumenta el tamaño de un archivo, Genlis asigna sectores para el archivo en la unidad en la que está abierto el archivo. Como FCHSIZE( ) no inicializa el espacio del archivo nuevo, el espacio podrá contener los datos antiguos. Asegúrese de administrar el espacio del archivo nuevo. Devuelve el tamaño final del archivo en bytes. Genlis devuelve –1 si FCHSIZE( ) no es capaz de cambiar el tamaño del archivo si, por ejemplo, se ha especificado un control de archivo no válido, debido a que no hay espacio de disco suficiente o a que el archivo es de sólo lectura. Sugerencia. Esta función puede utilizarse para truncar un archivo a longitud 0.
5.5.84. FCLOSE( ) (Función) Vacía y cierra un archivo o puerto de comunicación abierto con una función de archivo de bajo nivel.
Sintaxis FCLOSE(nControladorArchivo)
Tipos devueltos Logical
Argumentos nControladorArchivo Especifica el controlador del archivo de bajo nivel que desea cerrar. El controlador numérico de archivo se devuelve al crear el archivo con FCREATE( ) o al abrirlo con FOPEN( ).
Comentarios Si el archivo logra cerrarse, FCLOSE( ) devolverá verdadero (.T.) y liberará el control del archivo, FCLOSE( ) devolverá falso (.F.) si el archivo no puede cerrarse. CLOSE ALL cierra también los archivos de bajo nivel.
5.5.85. FCOUNT( ) (Función) Devuelve el número de campos de una tabla.
Sintaxis FCOUNT([nÁreaTrabajo | cAliasTabla])
Tipos devueltos Numeric
148
Manual de Genlis
Argumentos nÁreaTrabajo Especifica el área de trabajo de la tabla cuyo número de campos devuelve FCOUNT( ). FCOUNT( ) devuelve 0 si no hay una tabla abierta en el área de trabajo que especifique. cAliasTabla Especifica el alias de la tabla cuyo número de campos devuelve FCOUNT( ). Genlis genera un mensaje de error si especifica un alias de tabla que no existe.
Comentarios Si omite los argumentos opcionales, FCOUNT( ) devuelve el número de campos de la tabla abierta en el área de trabajo seleccionada en este momento.
5.5.86. FCREATE( ) (Función) Crea y abre un archivo de bajo nivel.
Sintaxis FCREATE(cNombreArchivo [, nAtributoArchivo])
Tipos devueltos Numeric
Argumentos cNombreArchivo Puede incluir un designador de unidad y una ruta de acceso con el nombre del archivo. Si no se incluye un designador de unidad o una ruta de acceso, el archivo se creará en el directorio predeterminado. Nota. Genlis no reconocerá correctamente un nombre de ruta de acceso si un nombre de disco o de directorio contiene un signo de exclamación (!). nAtributoArchivo Especifique los atributos del archivo creado. La siguiente tabla enumera los atributos de archivo que puede especificar. nAtributoArchivo Atributos de archivo 0 (Predeterminado) Lectura y escritura 1 Sólo lectura 2 Oculto 3 Sólo lectura/Oculto 4 Sistema
149
Manual de Genlis
5 6 7
Sólo lectura/Sistema Sistema/Oculto Sólo lectura/Oculto/Sistema
Observe que un archivo creado con un valor de nArchivoAtributo distinto de 0 no se puede escribir con FPUTS( ) o FWRITE( ) hasta que se cierre y se vuelva a abrir el archivo. Utilice DISPLAY STATUS o LIST STATUS para mostrar o imprimir información sobre los archivos creados y abiertos con FCREATE( ). DISPLAY STATUS y LIST STATUS le dan la información siguiente sobre cada archivo abierto o creado con una función de archivo de bajo nivel: La unidad, directorio y nombre de archivo El numero de controlador de archivo La posición del puntero del archivo Los atributos de lectura y escritura
Comentarios Si ya existe un archivo con el mismo nombre que especifique, se sobrescribirá sin avisar. FCREATE( ) asigna un número de control de archivo al archivo, que puede utilizar para identificar el archivo en otras funciones de archivos de bajo nivel de Genlis FCREATE( ) devuelve el número de control de archivo cuando se crea un archivo, o devuelve –1 si el archivo no puede crearse. Sugerencia. Asigne el número de control de archivo a una variable de memoria para que pueda utilizarlo en otras funciones de archivos de bajo nivel. No puede abrir un puerto de comunicaciones con FCREATE( ). Utilice FOPEN( ) para abrir un puerto de comunicaciones.
5.5.87. FDATE( ) (Función) Devuelve la última modificación DATE o DATETIME de un archivo.
Sintaxis FDATE(cNombreArchivo [, nTipo])
Tipos devueltos Date
Argumentos cNombreArchivo Especifica el nombre del archivo cuya última fecha de modificación devuelve FDATE( ). cNombreArchivo puede incluir una ruta de acceso con el nombre del archivo. Si no se incluye una ruta de acceso con el nombre de archivo, Genlis busca el archivo en el directorio predeterminado y en los directorios especificados con SET PATH.
150
Manual de Genlis
nTipo Especifica que FDATE( ) devuelva la última modificación de fecha o fecha y hora del archivo especificado con cNombreArchivo. Si nTipo es 0, se devuelve la última modificación de fecha. Incluir 0 es lo mismo que omitir nTipo. Si nTipo es 1, se devuelve la última modificación de fecha y hora.
Comentarios El sistema operativo asigna al archivo el valor de fecha o de fecha y hora que devuelve FDATE( ). Utilice LUPDATE( ) para determinar la última fecha de modificación de una tabla abierta.
5.5.88. FEOF( ) (Función) Determina si el puntero de archivo se encuentra o no al final de un archivo.
Sintaxis FEOF(nControladorArchivo)
Tipos devueltos Logical
Argumentos nControladorArchivo Especifique el número del controlador de archivo del archivo para comprobar la condición de fin de archivo. FEOF( ) siempre devolverá verdadero (.T.) si especifica un número de controlador de archivo de un puerto de comunicaciones abierto con FOPEN( ).
Comentarios Esta función de archivo de bajo nivel devuelve verdadero (.T.) si el puntero de archivo está situado al final de un archivo abierto con una función de archivo de bajo nivel. FEOF( ) devuelve falso (.F.) si el puntero del archivo no está al final del archivo.
5.5.89. FERROR( ) (Función) Devuelve un número correspondiente al error de función de archivo de bajo nivel más reciente.
Sintaxis FERROR( )
151
Manual de Genlis
Tipos devueltos Numeric
Comentarios FERROR( ) devuelve 0 si una función de archivo de bajo nivel se ejecuta correctamente. Si la función no termina con éxito se devuelve un valor positivo. La tabla siguiente muestra cada número de error devuelto por FERROR( ) y la causa del error. Número de error 2 4 5 6 8 25 29 31
Causa del error Archivo no encontrado Demasiados archivos abiertos (no hay controladores de archivo) Acceso denegado Controlador de archivo no válido No hay memoria Error de búsqueda (no puede buscar antes del comienzo de un archivo) Disco lleno Error al abrir archivo
5.5.90. FFLUSH( ) (Función) Vacía en disco un archivo abierto con una función de bajo nivel.
Sintaxis FFLUSH(nControladorArchivo)
Tipos devueltos Logical
Argumentos nControladorArchivo Especifica el controlador del archivo que se va a vaciar en disco.
Comentarios FFLUSH( ) libera también la memoria utilizada por el búfer del archivo. FLUSH es distinto de la función FFLUSH( ). FLUSH no actúa con archivos de bajo nivel sino con tablas e índices.
152
Manual de Genlis
5.5.91. FGETS( ) (Función) Devuelve un conjunto de bytes desde un archivo o un puerto de comunicaciones abierto con una función de archivo de bajo nivel hasta encontrar un retorno de carro.
Sintaxis FGETS(nControladorArchivo [, nBytes])
Tipos devueltos Character
Argumentos nControladorArchivo Especifica el controlador numérico del archivo o el puerto de comunicación desde el que FGETS( ) devuelve datos. nBytes Especifica el número de bytes devueltos por FGETS( ). FGETS( ) devuelve nBytes a menos que encuentre primero un retorno de carro. FGETS( ) devuelve datos entre la posición inicial del puntero del archivo y el retorno de carro si se encuentra un retorno de carro dentro de los nBytes bytes. Si se omite nBytes, FGETS( ) devuelve de forma predeterminada un máximo de 254 bytes.
Comentarios Puede leer un archivo línea a línea si ejecuta varias funciones FGETS( ). FGETS( ) devuelve un conjunto de bytes como una cadena de caracteres. Se devuelven los datos encontrados a partir de la posición actual del puntero del archivo y hasta que se encuentra un retorno de carro. El puntero de archivo se coloca entonces en el byte inmediatamente siguiente al retorno de carro. El retorno de carro no se devuelve como parte de la cadena y los saltos de línea se descartan.
5.5.92. FILE( ) (Función) Devuelve verdadero (.T.) si el archivo especificado se encuentra en el disco.
Sintaxis FILE(cNombreArchivo)
Tipos devueltos Logical
Argumentos
153
Manual de Genlis
cNombreArchivo Especifica el nombre del archivo que desea encontrar. cNombreArchivo debe incluir la extensión del archivo. Genlis busca el archivo en el directorio predeterminado. Si el archivo no puede encontrarse en el directorio predeterminado, se buscará en la ruta de acceso de Genlis establecida con SET PATH. Puede incluir una ruta de acceso con el nombre del archivo para buscar un archivo en un directorio o en una unidad distinta del directorio y unidad actuales.
Comentarios Utilice FILE( ) para encontrar un archivo en el disco. FILE( ) devuelve verdadero (.T.) si consigue encontrarse el archivo; de lo contrario, devuelve falso (.F.).
5.5.93. FLOOR( ) (Función) Devuelve el entero más próximo que sea menor o igual que la expresión numérica especificada.
Sintaxis FLOOR(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica la expresión numérica para la cual FLOOR( ) devuelve el entero más próximo que sea menor o igual que la expresión numérica.
5.5.94. FOPEN( ) (Función) Abre un archivo o puerto de comunicaciones para utilizarlo con funciones de archivo de bajo nivel.
Sintaxis FOPEN(cNombreArchivo [, nAtributo])
Tipos devueltos Numeric
Argumentos cNombreArchivo
154
Manual de Genlis
Especifica el nombre del archivo que se va a abrir. Si cNombreArchivo es un nombre de archivo, puede incluir una ruta para archivos abiertos en directorios o unidades que no estén en la ruta de búsqueda actual de Genlis. Si no se incluye la ruta, Genlis buscará el archivo en las siguientes ubicaciones: El directorio predeterminado La ruta de acceso establecida con SET PATH Nota. Genlis no reconocerá correctamente un nombre de ruta si un disco o un nombre de directorio contiene un signo de exclamación (!). nAtributo Especifica privilegios lectura/escritura o el esquema de almacenamiento en búfer para el archivo que abra. La tabla siguiente lista cada número que puede incluir en nAtributo, y los privilegios de lectura/escritura del archivo y el esquema de almacenamiento en búfer que establece. nAtributo Privilegios de lectura-escritura Con búfer/Sin búfer 0 Sólo lectura (predeterminado) Con búfer 1 Sólo escritura Con búfer 2 Lectura y escritura Con búfer 10 Sólo lectura Sin búfer 11 Sólo escritura Sin búfer 12 Lectura y escritura Sin búfer Si no se incluye nAtributo o si nAtributo se evalúa a 0, el archivo se abrirá como sólo lectura y con búfer. Nota. Genlis no reconocerá correctamente un nombre de ruta si un disco o un nombre de directorio contiene un signo de exclamación (!).
Comentarios Si FOPEN( ) logra abrir un archivo, se devolverá el número de controlador del archivo FOPEN( ) devuelve –1 si el archivo no puede abrirse. Sugerencia. Asigne el número de controlador de archivo a una variable de memoria, lo que le permitirá acceder al archivo o puerto de comunicaciones por la variable de memoria en otras funciones de archivo de bajo nivel.
5.5.95. FOR ... ENDFOR (Comando) Ejecuta un grupo de comandos un número concreto de veces.
Sintaxis FOR NombreVariableMemoria = nValorInicial TO nValorFinal [STEP nIncremento] Comandos [EXIT]
155
Manual de Genlis
[LOOP] ENDFOR | NEXT
Argumentos NombreVariableMemoria Especifica una variable de memoria o un elemento de matriz que actúa como contador. No es necesario que exista la variable de memoria o elemento de matriz antes de ejecutar FOR ... ENDFOR. nValorInicial TO nValorFinal nValorInicial es el valor inicial del contador y; nValorFinal es el valor final del contador. STEP nIncremento nIncremento es la cantidad de incremento o decremento del contador. Si nIncremento es negativo, el contador se decrementará. Si omite la cláusula STEP, el contador se incrementará en 1. Comandos Especifica los comandos de Genlis que se van a ejecutar. Comandos puede incluir cualquier número de comandos. EXIT Transfiere el control desde dentro del bucle FOR ... ENDFOR al comando que sigue inmediatamente a ENDFOR. Puede situar EXIT en cualquier parte entre FOR y ENDFOR. LOOP La inclusión de LOOP devolverá el control directamente a la cláusula FOR sin ejecutar las instrucciones que haya entre LOOP y ENDFOR. El contador se incrementará o decrementará como si se hubiera llegado a ENDFOR. LOOP puede situarse en cualquier parte entre FOR y ENDFOR.
Comentarios Se utiliza una variable de memoria o un elemento de matriz como contador para especificar cuántas veces se ejecutan los comandos de Genlis que hay dentro del bucle FOR ... ENDFOR. Los comandos de Genlis que hay a continuación de FOR se ejecutan hasta que se llega a ENDFOR o NEXT. Entonces se incrementa el contador NombreVariableMemoria con el valor de nIncremento. Si omite la cláusula STEP, el contador se incrementará en 1. Entonces se comparará el contador con el valor final nValorFinal. Si el contador es inferior o igual al valor final nValorFinal, volverán a ejecutarse los comandos que siguen a la cláusula FOR. Si el contador es mayor que el valor final nValorFinal, la ejecución del programa bifurcará fuera del bucle FOR ... ENDFOR y continuará con el primer comando a continuación de ENDFOR o NEXT. Nota. Los valores de nValorInicial, nValorFinal, y nIncremento se leen únicamente al inicio. Sin embargo, cambiar el valor del contador NombreVariableMemoria dentro del bucle afecta al número de veces que se ejecutará el bucle. Si el valor de nIncremento es negativo y el valor inicial nValorInicial es mayor que el valor final nValorFinal, el contador disminuirá cada vez que pase el bucle.
156
Manual de Genlis
5.5.96. FOUND( ) (Función) Devuelve verdadero (.T.) si CONTINUE, FIND, INDEXSEEK( ), LOCATE o SEEK tienen éxito.
Sintaxis FOUND([nÁreaTrabajo | cAliasTabla])
Tipos devueltos Logical
Argumentos nÁreaTrabajo Especifica el área de trabajo de la tabla para la cual FOUND( ) devuelve un valor indicando el éxito del último CONTINUE, FIND, INDEXSEEK( ), LOCATE o SEEK. FOUND( ) devolverá falso (.F.) si una tabla no está abierta en el área de trabajo especificada. cAliasTabla Especifica el alias de la tabla para la cual FOUND( ) devuelve un valor indicando el éxito del último CONTINUE, FIND, INDEXSEEK( ), LOCATE o SEEK. Genlis genera un mensaje de error si especifica un alias de tabla que no existe.
Comentarios FOUND( ) devuelve un valor lógico que indica si el comando CONTINUE, FIND, INDEXSEEK( ), LOCATE o SEEK ejecutado más recientemente se ejecutó con éxito o el puntero se mueve en la tabla relacionada. FOUND( ) devuelve verdadero (.T.) si la búsqueda tiene éxito, de lo contrario devuelve falso (.F.). Si omite los argumentos opcionales, FOUND( ) devuelve un valor indicando el éxito del último CONTINUE, FIND, INDEXSEEK( ), LOCATE o SEEK para la tabla abierta en el área de trabajo seleccionada actualmente. Sugerencia. Esta función es útil para determinar si una tabla secundaria tiene un registro que coincide con el registro primario.
5.5.97. FPUTS( ) (Función) Escribe una cadena de caracteres, retorno de carro y avance de línea en un archivo o en un puerto de comunicaciones abierto con una función de archivo de bajo nivel.
Sintaxis
157
Manual de Genlis
FPUTS(nControladorArchivo), cExpresión [, nCaracteresEscritos])
Tipos devueltos Numeric
Argumentos nControladorArchivo Especifica el numero de controlador del archivo o puerto de comunicaciones al que FPUTS( ) escribe datos. cExpresión Especifica la expresión alfanumérica que escribe FPUTS( ) en el archivo o puerto. nCaracteresEscritos Especifica el número de caracteres de cExpresión que se deben escribir en el archivo o puerto. FPUTS( ) escribirá toda la expresión de caracteres cExpresión en el archivo en caso de que omita nCaracteresEscritos. Si incluye nCaracteresEscritos, escribirá en el archivo el número de caracteres indicado en nCaracteresEscritos. Si nCaracteresEscritos es menor que el número de caracteres de cExpression, solamente se escriben en el archivo los caracteres especificados en nCaracteresEscritos. Si nCaracteresEscritos es igual o mayor que el número de caracteres en nExpresión se escribe cExpresión completa en el archivo.
Comentarios FPUTS( ) devuelve el número de bytes escritos en el archivo o puerto. Se devuelve 0 si FPUTS( ) no puede escribir por alguna razón en el archivo o en el puerto.
5.5.98. FREAD( ) (Función) Devuelve el número de bytes especificado desde un archivo o un puerto de comunicación abierto con una función de bajo nivel.
Sintaxis FREAD(nControladorArchivo, nBytes)
Tipos devueltos Character
Argumentos nControladorArchivo Especifica el número de controlador de archivo para el archivo o puerto de comunicaciones desde el cual FREAD( ) devuelve datos.
158
Manual de Genlis
nBytes Especifica el número de bytes que devuelve FREAD( ). FREAD( ) devuelve datos a partir de la posición actual del puntero de archivo y continúa hasta que devuelve nBytes bytes o hasta que encuentra el final del archivo, lo que ocurra primero.
5.5.99. FULLPATH( ) (Función) Devuelve la ruta de acceso a un archivo especificado o la ruta relativa de otro archivo.
Sintaxis FULLPATH(cNombreArchivo1 [, nRutaMSDOS | cNombreArchivo2])
Tipos devueltos Character
Argumentos cNombreArchivo1 Especifica el archivo buscado por Genlis. Asegúrese de incluir la extensión del nombre de archivo. Si el archivo se encuentra en la ruta de acceso Genlis devolverá la ruta con el nombre del archivo. La ruta de acceso Genlis puede establecerse con SET PATH. nRutaMSDOS Especifica que se busca la ruta de acceso MS-DOS en lugar de la ruta de acceso Genlis. nRutaMSDOS puede tener cualquier valor numérico. Si el archivo no se puede localizar en la ruta de acceso MS-DOS, se devuelve una ruta de acceso y el nombre de archivo como si este archivo se hubiera encontrado en el directorio predeterminado actual. cNombreArchivo2 Especifica un segundo nombre de archivo que se va a buscar. Asegúrese de que incluye la extensión del nombre del archivo. FULLPATH( ) devuelve la ruta de acceso del primer archivo relativo al segundo archivo.
5.5.100. GATHER (Comando) Sustituye los datos del registro actual de la tabla seleccionada actualmente por datos de una matriz, un conjunto de variables de memoria o un objeto.
Sintaxis
159
Manual de Genlis
GATHER FROM NombreMatriz | MEMVAR | NAME NombreObjeto [FIELDS ListaCampos | FIELDS LIKE Estructura | FIELDS EXCEPT Estructura] [MEMO]
Argumentos FROM NombreMatriz Especifica la matriz cuyos datos reemplazan los datos del registro actual. El contenido de los elementos de la matriz, comenzando con el primer elemento, reemplazan el contenido de los campos correspondientes del registro. El contenido del primer elemento de la matriz reemplaza al primer campo del registro; el contenido del segundo elemento de la matriz reemplaza al segundo campo y así sucesivamente. Si la matriz tiene menos elementos que campos tiene la tabla, se pasarán por alto los campos adicionales. Si la matriz tiene más elementos que campos tiene la tabla, se pasarán por alto el resto de elementos de la matriz. MEMVAR Especifica las variables de memoria o la matriz desde las que se copian datos al registro actual. Los datos se transfieren desde la variable de memoria hasta el campo que tenga el mismo nombre que dicha variable. El contenido de un campo no se sustituye en caso de que no exista ninguna variable de memoria con el mismo nombre que el campo. Sugerencia. Puede crear variables con los mismos nombres que los campos incluyendo MEMVAR o BLANK en SCATTER. NAME NombreObjeto Especifica un objeto cuyas propiedades tienen los mismos nombres que los campos de la tabla. El contenido de cada campo se sustituye por el valor de la propiedad que tenga los mismos nombres que los campos. El contenido de un campo no se sustituye si no existe ninguna propiedad con su mismo nombre. FIELDS ListaCampos Especifica los campos cuyo contenido se sustituye por el contenido de los elementos de la matriz o las variables de memoria. Solamente se sustituirá el contenido del campo especificado con ListaCampos. FIELDS LIKE Estructura | FIELDS EXCEPT Estructura Puede reemplazar selectivamente campos con el contenido de elementos de matriz o variables de memoria si incluye la cláusula LIKE o EXCEPT, o ambas. Si incluye LIKE Estructura, Genlis reemplazará los campos que coincidan con Estructura. Si incluye EXCEPT Estructura, reemplazará todos los campos excepto los que coincidan con Estructura. Estructura acepta caracteres comodín (* y ?). Por ejemplo, para reemplazar todos los campos que empiecen por las letras A y P, use: GATHER FROM gamiarray FIELDS LIKE A*,P* MEMO Especifica que el contenido de los campos memo se sustituye por el contenido de los elementos de la matriz o de las variables de memoria. Si omite MEMO, los campos memo se saltarán cuando GATHER reemplace el contenido de los campos con el contenido de una matriz o de variables de memoria. Los
160
Manual de Genlis
campos de tipo General y Picture se pasan por alto siempre en GATHER, incluso si se incluye la palabra clave MEMO.
5.5.101. GETDIR( ) (Función) Muestra el cuadro de diálogo Seleccionar directorio, en el que puede elegir un directorio.
Sintaxis GETDIR([cDirectorio [, cTexto]])
Tipos devueltos Character
Argumentos cRuta Especifica el directorio que aparece inicialmente en el cuadro de diálogo Seleccionar directorio. Cuando no se especifica cDirectorio el cuadro de diálogo Seleccionar directorio se abrirá mostrando el directorio predeterminado de Genlis. cTexto Especifica el texto para la lista de directorios o de carpetas en el cuadro de diálogo. En Windows 3.1, el texto aparece como el título en la barra de título del cuadro de diálogo. En Windows 95, el texto aparece a continuación de la barra de título dentro del cuadro de diálogo.
Comentarios GETDIR( ) devuelve como una cadena de caracteres el nombre del directorio que elija. Si no elige ningún directorio (si elige Cancelar, presiona ESC, o elige Cerrar en la ventana menú, GETDIR( ) devolverá la cadena vacía.
5.5.102. GETFILE( ) (Función) Muestra el cuadro de diálogo Abrir y devuelve el nombre del archivo que elija.
Sintaxis GETFILE([cExtensionesArchivo] [, cTexto] [, cTítuloBotónAbrir] [, nTipoBotón] [cTítuloBarraTítulos])
Tipos devueltos
161
Manual de Genlis
Character
Argumentos cExtensionesArchivo Especifica las extensiones de los archivos mostrados en la lista desplegable cuando el elemento de menú Todos los archivos no se ha elegido. Si se pasa un valor como un literal, es necesario entrecomillarlo. No incluya un punto (.) delante de las extensiones de archivo. cExtensionesArchivo puede asumir diversas formas: Si cExtensionesArchivo contiene una única extensión (por ejemplo, .prg), solamente se mostrarán los archivos con esa extensión. Si cExtensionesArchivo es la cadena vacía, se mostrarán todos los archivos del directorio actuales si no se ha incluido cTipoCreador. cExtensionesArchivos puede contener también caracteres comodín (* y ?) del MS-DOS. Se mostrarán todos los archivos cuyas extensiones cumplan los criterios del comodín. Por ejemplo, si cExtensionesArchivo es "?X?", se mostrarán todos los archivos que tengan la extensión .fxt, .exe y .txt. En Genlis para Windows, cExtensionesArchivo puede contener una descripción de archivo seguida de una extensión de archivo o de una lista de extensiones de archivo separadas por comas. La descripción del archivo aparece en el cuadro de lista Archivos de tipo. Separe con dos puntos (:) la descripción del archivo de la extensión o de la lista de extensiones de archivos. Separe con un punto y coma (;) múltiples descripciones de archivo y sus extensiones de archivo. Por ejemplo, si cExtensionesArchivo es "Texto:TXT" la descripción de archivo "Texto" aparecerá en el cuadro de lista Archivos de tipo y se mostrarán todos los archivos con la extensión .txt. Si cExtensionesArchivo es "Tablas:DBF; Archivos:TXT,BAK" las descripciones de archivo "Tablas" y "Archivos" aparecerán en el cuadro de lista Archivos de tipo. Cuando se elige "Tablas" en el cuadro de lista Archivos de tipo, se mostrarán todos los archivos de extensión .dbf. Cuando se elija "Archivos" del cuadro de lista Archivos de tipo, se mostrarán todos los archivos con la extensión .txt y .bak. Si cExtensionesArchivo contiene sólo un punto y coma (";"), se mostrarán todos los archivos sin extensión. cTexto Especifica el texto para la lista de directorios en el cuadro de diálogo Abrir. En Windows 95, el texto aparece bajo la lista de archivos y es posible que las cadenas de texto largas aparezcan truncadas. cTítuloBotónAbrir Especifica un título para el botón Aceptar. nTipoBotón Especifica el número y el tipo de botones que aparecen en el cuadro de diálogo Abrir. Los botones siguientes aparecen en el cuadro de diálogo cuando nTipoBotón es 0, 1 ó 2:
162
Manual de Genlis
nTipoBotón 0 (or omitted) 1 2
Botones Aceptar Cancelar Aceptar Nuevo Cancelar Aceptar Nada Cancelar
Se devolverá "Sin título" con la ruta de acceso especificada en el cuadro de diálogo Abrir si nTipoBotón es 1 y el usuario elige el botón Nuevo. Se devolverá la cadena vacía si nTipoBotón es 2 y el usuario elige el botón iNothing. cTítuloBarraTítulos Especifica el título de la barra de títulos.
Comentarios GETFILE( ) devuelve la cadena vacía si sale del cuadro de diálogo Abrir presionando ESC, eligiendo Cancelar o eligiendo Cerrar en el menú Control.
5.5.103. GETEXPR (Comando) Muestra el Generador de expresiones que le permite crear una expresión y almacenarla en una variable de memoria o en un elemento de matriz.
Sintaxis GETEXPR [cTextoTítulo] TO NombreVariableMemoria [TYPE cTipoExpresión [; cTextoMensajeError]] [DEFAULT cExpresiónPredeterminada]
Argumentos cTextoTítulo Especifica el título que aparece en el Generador de expresiones. El título puede utilizarse para recordar al usuario de expresión que va a construir. TO NombreVariableMemoria Especifica la variable de memoria o el elemento de matriz donde se almacena la expresión. Si la variable de memoria no existe todavía, Genlis la creará. GETEXPR no crea ningún elemento de matriz. Si sale del Generador de expresiones presionando esc o eligiendo Cancelar, se almacenará la cadena vacía en la variable de memoria o en el elemento de matriz. Si se crea una expresión predeterminada con la cláusula DEFAULT, la expresión predeterminada se almacenará en la variable de memoria si sale del Generador de expresiones presionando esc o eligiendo Cancelar. TYPE cTipoExpresión [; cTextoMensajeError]
163
Manual de Genlis
Especifica el tipo de expresión. La siguiente tabla indica el carácter que debe especificar en cTipoExpresión para cada tipo de expresión: cTipoExpresión Tipo de expresión C Character D Date T DateTime N Numeric F Float I Integer B Double Y Currency L Logical Puede especificar que el mensaje de error cTextoMensajeError que aparecerá si la expresión no es válida. Si se incluye cTextoMensajeError con cTipoExpresión, cTipoExpresión y cTextoMensajeError deberán separarse mediante un signo de punto y coma (;). La combinación de cTipoExpresión, el punto y coma, y cTextoMensajeError deben incluirse entre comillas sencillas o dobles, en pares coincidentes. DEFAULT cExpresiónPredeterminada Permite mostrar la expresión predeterminada inicial en el Generador de expresiones. Puede aceptar la expresión predeterminada o sobrescribirla con su propia expresión especificada con cExpresiónPredeterminada. cDefaultExpression se almacenará en la variable de memoria o en el elemento de matriz si sale del Generador de expresiones presionando esc o eligiendo Cancelar.
5.5.104. GETPICT( ) (Función) Muestra Open Picture (cuadro de diálogo) y devuelve el nombre del archivo de imagen que ha elegido.
Sintaxis GETPICT([cExtensionesArchivos] [, cTítuloNombreArchivo] [, cTítuloBotónAbrir])
Tipos devueltos Character
Argumentos cExtensionesArchivos Especifica las extensiones de los archivos de imagen que se muestran en la lista desplegable cuando no se elige el elemento de menú Todos los archivos. cExtensionesArchivos puede tomar los siguientes formatos: Si cExtensionesArchivos contiene una única extensión (por ejemplo, bmp), sólo se mostrarán los archivos que tengan dicha extensión.
164
Manual de Genlis
cExtensionesArchivos también pueden contener caracteres comodín (* y ?). Se mostrarán todos los archivos cuyas extensiones cumplan los criterios de comodín. Por ejemplo, si cExtensionesArchivos es ?X?, se mostrarán todos los archivos cuyas extensiones sean .fxp, .exe y .txt. Si cExtensionesArchivos contiene la cadena vacía (""), se mostrarán los archivos con las extensiones .bmp y .dib.
cTítuloNombreArchivo Especifica el título mostrado encima del cuadro de texto "Nombre de archivo. cTítuloNombreArchivo reemplaza al "Nombre de archivo" que aparece cuando se omite cTítuloNombreArchivo. cTítuloBotónAbrir Especifica un título para el botón Aceptar.
Comentarios GETPICT( ) devuelve la cadena vacía si sale del cuadro de diálogo Abrir presionando ESC, eligiendo Cancelar o eligiendo Cerrar en el menú Control.
5.5.105. GETPRINTER( ) (Función) Muestra el cuadro de diálogo Imprimir y devuelve el nombre de la impresora que seleccione.
Sintaxis GETPRINTER( )
Tipos devueltos Character
Comentarios GETPRINTER( ) devuelve la cadena vacía si sale del cuadro de diálogo Imprimir presionando la tecla ESC, eligiendo el botón Cancelar o eligiendo Cerrar en el menú Control.
5.5.106. GO | GOTO (Comando) Coloca el puntero de registro en el número de registro especificado de una tabla.
Sintaxis GO [RECORD] nNúmeroRegistro [IN nÁreaTrabajo | IN cAliasTabla] –o bien–
165
Manual de Genlis
GO TOP | BOTTOM [IN nÁreaTrabajo | IN cAliasTabla] –o bien– GOTO [RECORD] nNúmeroRegistro [IN nÁreaTrabajo | IN cAliasTabla] –o bien– GOTO TOP | BOTTOM [IN nÁreaTrabajo | IN cAliasTabla]
Argumentos RECORD nNúmeroRegistro Especifica el número de registro físico al que desea mover el puntero de registro. Puede omitir por completo GO o GOTO y especificar simplemente el número de registro. Si especifica solamente el número de registro, podrá mover el puntero solamente en el área de trabajo actual. IN nÁreaTrabajo Especifica el área de trabajo de la tabla en la cual se mueve el puntero de registro. IN cAliasTabla Especifica el alias de la tabla en la cual se mueve el puntero de registro. TOP Sitúa el puntero de registro en el primer registro de la tabla. Si la tabla tiene en uso un índice ascendente, el primer registro será el registro con el valor clave más bajo. Si el índice está en orden descendente, el primer registro será el registro con el valor clave más alto. BOTTOM Sitúa el puntero de registro en el último registro de la tabla. Si la tabla tiene activo un índice ascendente, el último registro será aquél con el valor de clave más elevado. Si el índice está en orden descendente, el último registro será el que tenga el menor valor de clave.
Comentarios GO y GOTO pueden utilizarse indistintamente. Estos comandos actúan sobre la tabla del área de trabajo actual a menos que especifique otra área de trabajo con la cláusula IN.
5.5.107. GOMONTH( ) (Función) Devuelve la fecha que es un número especificado de meses antes o después de una expresión de fecha o de fecha-hora determinada.
Sintaxis GOMONTH(dExpresión | tExpresión, nNúmeroMeses)
Tipos devueltos
166
Manual de Genlis
Date
Argumentos dExpresión Especifica una expresión de fecha para la cual GOMONTH( ) devuelve la fecha. tExpresión Especifica una expresión de fecha-hora para la cual GOMONTH( ) devuelve la fecha. nNúmeroMeses Especifica el número de meses a partir de la expresión de fecha o de fecha-hora. Si nNúmeroMeses es positivo, GOMONTH( ) devolverá una fecha que es nNúmeroMeses meses después de la expresión. Si nNúmeroMeses es negativo, GOMONTH( ) devolverá una fecha que es nNúmeroMeses meses anterior a la expresión.
5.5.108. HOUR( ) (Función) Devuelve la hora de una expresión DateTime.
Sintaxis HOUR(tExpresión)
Argumentos tExpresión Especifica una expresión DateTime a partir de la cual HOUR( ) devuelve la hora.
Tipos devueltos Numeric
Comentarios HOUR( ) devuelve un valor numérico basado en un formato de 24 horas y no se ve afectado por el valor actual de SET HOURS. Por ejemplo, si SET HOURS es 12 o 24, el comando siguiente devuelve 13: ? HOUR({^1998-02-16 1:00p })
5.5.109. IF ... ENDIF (Comando) Ejecuta condicionalmente un conjunto de comandos dependiendo del resultado de una expresión lógica.
167
Manual de Genlis
Sintaxis IF lExpresión [THEN] Comandos [ELSE Comandos] ENDIF
Argumentos lExpresión Especifica la expresión lógica evaluada. Si lExpresión da como resultado verdadero (.T.), se ejecutarán cualesquiera instrucciones posteriores a IF y anteriores a ELSE o ENDIF (lo que suceda primero). Si lExpresión es falsa y se incluye ELSE, se ejecutan los comandos situados después de ELSE y antes de ENDIF. Si lExpresión es falsa (.F.) y no se incluye ELSE, se pasarán por alto todas las instrucciones entre IF y ENDIF. En este caso la ejecución del programa continuará con la primera línea de comando a continuación de ENDIF.
Comentarios Puede anidar IF ... ENDIF dentro de otro bloque IF ... ENDIF. Los comentarios precedidos de && se pueden colocar en la misma línea después de IF, ELSE y ENDIF. Estos comentarios se pasan por alto durante la compilación y la ejecución del programa.
5.5.110. IIF( ) (Función) Devuelve uno de los dos valores dependiendo del valor de una expresión lógica.
Sintaxis IIF(lExpresión, eExpresión1, eExpresión2)
Tipos devueltos Character, Numeric, Currency, Date, o DateTime
Argumentos lExpresión Especifica la expresión lógica evaluada por IIF( ). eExpresión1, eExpresión2 Si lExpresión se evalúa verdadera (.T.), se devolverá eExpresión1. Si lExpresión se evalúa falsa (.F.), se devolverá eExpression2.
168
Manual de Genlis
Comentarios Esta función, conocida también como IF Inmediato, evalúa una expresión lógica y devuelve a continuación una de las dos expresiones. Si la expresión lógica se evalúa como verdadera (.T.), IIF( ) devolverá la primera expresión. Si la expresión lógica se evalúa como falsa (.F.), IIF( ) devolverá la segunda expresión. Sugerencia. Esta función puede utilizarse en lugar de IF ... ENDIF para expresiones condicionales simples y es especialmente útil en expresiones de etiquetas e informes que especifican condicionalmente el contenido de campos. La función IIF( ) se ejecuta, además, considerablemente más rápido que la estructura IF ... ENDIF equivalente.
5.5.111. INDEXSEEK( ) (Función) Sin mover el puntero de registro, busca en una tabla indexada la primera ocurrencia de un registro cuya clave de índice coincida con una expresión determinada.
Sintaxis INDEXSEEK(eExpresión [, lMoverPuntero [, nÁreaTrabajo | cAliasTabla [, nNúmeroÍndice | cIDXNombreArchivoÍndice | cNombreEtiqueta]]])
Tipos devueltos Lógico
Argumentos eExpresión Especifica la expresión de la clave de índice sobre la que desea realizar una búsqueda con INDEXSEEK( ). lMoverPuntero Especifica si el puntero de registro se desplazará al registro coincidente. Si lMoverPuntero es verdadero (.T.) y existe un registro coincidente, el puntero de registro se moverá al registro coincidente. Si lMoverPuntero es verdadero (.T.) y no existe ningún registro coincidente, el puntero de registro no se moverá. Si lMoverPuntero es falso (.F.) o se omite, el puntero de registro no se moverá incluso si existe un registro coincidente. nÁreaTrabajo Especifica el número de área de trabajo de la tabla en la que se buscará la clave de índice. cAliasTabla Especifica el alias de la tabla en la que se realizará una búsqueda. Si omite nÁreaTrabajo y cAliasTabla, se realizará una búsqueda en la tabla del área de trabajo actualmente seleccionada. nNúmeroÍndice
169
Manual de Genlis
Especifica el número del archivo de índice o la etiqueta utilizada para buscar la clave de índice. nNúmeroÍndice se refiere a los archivos de índice tal y como aparecen en USE o SET INDEX. Los archivos .IDX abiertos están numerados primero en el orden en que aparecen en USE o SET INDEX. Las etiquetas en el archivo estructural .CDX (si existe) son entonces numeradas en el orden en el que son creados. Finalmente, las etiquetas de cualquier archivo independiente .CDX abierto son numeradas en el orden de su creación. Para más información sobre la numeración indexada, consulte SET ORDER. cIDXNombreArchivoÍndice Especifica un archivo .idx que se utiliza para buscar la clave de índice. cNombreEtiqueta Especifica la etiqueta de un archivo .CDX que se utiliza para buscar la clave de índice. El nombre de etiqueta puede pertenecer a un archivo .CDX estructural o a cualquier archivo .CDX independiente abierto. Nota El archivo .IDX tiene prioridad si existen un archivo .IDX duplicado y nombres de etiqueta.
Comentarios INDEXSEEK( ) devuelve verdadero (.T.) si se encuentra una coincidencia; de lo contrario devuelve falso (.F.). Se puede utilizar INDEXSEEK( ) sólo con una tabla que tenga un orden de índices establecido, y sólo se puede buscar una clave de índice. La coincidencia debe ser exacta a menos que SET EXACT esté en OFF (desactivado). INDEXSEEK( ) proporciona una manera rápida de buscar registros sin mover el puntero de registro. Las reglas y desencadenantes no se ejecutan, ya que el puntero de registro no se desplaza. Si INDEXSEEK( ) devuelve verdadero (.T.) indicando que se ha encontrado un registro coincidente, puede ejecutar INDEXSEEK( ) de nuevo con el segundo parámetro lMoverPuntero establecido a verdadero (.T.) para desplazarse al registro coincidente.
5.5.112. INKEY( ) (Función) Devuelve el número correspondiente a la primera tecla presionada o el primer clic del mouse (ratón) que haya en el búfer de teclado.
Sintaxis INKEY([nSegundos] [, cOcultarCursor])
Tipos devueltos Numeric
Argumentos nSegundos
170
Manual de Genlis
Especifica durante cuantos segundos esperará una pulsación INKEY( ). Si nSegundos no se incluye, INKEY( ) devuelve inmediatamente un valor de una pulsación de tecla. INKEY( ) esperará una pulsación eternamente si nSegundos es 0. cOcultarCursor Muestra u oculta el cursor, o comprueba si se ha hecho clic con el mouse. Para mostrar el cursor, incluya S en cOcultarCursor. Para ocultar el cursor, incluya H en cOcultarCursor. Si se incluye S y H, a la vez, en cOcultarCursor, tendrá prioridad el último carácter de cOcultarCursor. De forma predeterminada, INKEY( ) no detecta un clic del mouse. Para detectar un clic del mouse (ratón), incluya M en cOcultarCursor. Si se incluye M en cOcultarCursor, INKEY( ) devolverá el valor 151 para un clic del mouse. Consulte el segundo ejemplo de la tabla siguiente para ver la forma de comprobar un doble clic. Para comprobar un clic del mouse y mostrar el cursor, incluya M y S a la vez. Para comprobar un clic del mouse y ocultar el cursor, incluya H y M a la vez. Cuando se asigna una macro de teclado a una tecla o a una combinación de teclas, puede incluir E en cOcultarCursor para expandir la macro de teclado. Cuando se incluye E, INKEY( ) devuelve un valor correspondiente a la primera pulsación de tecla asignada a la macro de teclado. Puede devolver valores sucesivos para cada pulsación de tecla de una macro de teclado de forma repetitiva ejecutando INKEY( ) con E incluida. Si E no se incluye, INKEY( ) devuelve el valor de la tecla o combinación de teclas que dispara la macro de teclado. Cualquier carácter que no sea H, M, S y E en cOcultarCursor se pasará por alto. La siguiente tabla muestra los valores que devuelve la función INKEY( ) para las teclas en solitario y en combinación con las teclas MAYÚS, CTRL y ALT. Un guión (—) indica que la combinación de teclas no devolverá ningún valor.
Tecla F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 1 2 3 4 5 6 7 8 9
Sola 28 -1 -2 -3 -4 -5 -6 -7 -8 -9 133 134 49 50 51 52 53 54 55 56 57
MAYÚS 84 85 86 87 88 89 90 91 92 93 135 136 33 64 35 36 37 94 38 42 40
CTRL 94 95 96 97 98 99 100 101 102 103 137 138 — — — — — — — — —
ALT 104 105 106 107 108 109 110 111 112 113 139 140 120 121 122 123 124 125 126 127 128
171
Manual de Genlis
Tecla 0 a b c d e f g h i j k l m n o p q r s t u v w x y z INS INICIO SUPR FIN RE PÁG AV PÁG FLECHA ARRIBA FLECHA ABAJO FLECHA DERECHA FLECHA IZQUIERDA ESCAPE ENTRAR RETROCESO TAB BARRA ESPACIADORA
Sola 48 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 22 1 7 6 18 3 5 24 4 19 27 13 127 9 32
* Pulsación reservada por Windows.
Comentarios
172
MAYÚS 41 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 22 55 7 49 57 51 56 50 52 54 —/27 13 127 15 32
CTRL — 1 2 3 4 5 6 7 127 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 146 29 147 23 31 30 141 145 2 26 —*/27 10 127 148/* 32/—
ALT 19 30 48 46 32 18 33 34 35 23 36 37 38 50 49 24 25 16 19 31 20 22 47 17 45 21 44 162 151 163 159 153 161 152 160 157 155 —*/1 —/166 14 * 57
Manual de Genlis
INKEY( ) devuelve 0 si no se ha presionado ninguna tecla. Si hay varias teclas en el búfer de teclado, INKEY( ) devuelve el valor de la primera tecla introducida en el búfer.
5.5.113. INLIST( ) (Función) Determina si una expresión coincide con otra perteneciente a un conjunto de expresiones.
Sintaxis INLIST(eExpresión1, eExpresión2 [, eExpresión3 ...])
Tipos devueltos Logical o valor nulo
Argumentos eExpresión1 Especifica la expresión que INLIST( ) busca en el conjunto de expresiones. eExpresión2 [, eExpresión3 ...] Especifica el conjunto de expresiones dónde debe buscar. Es necesario incluir como mínimo una expresión (eExpresión2) y se admiten un máximo de 24 (eExpresión2, eExpresión3, etc). Todas las expresiones de la lista deben ser del mismo tipo de datos.
Comentarios INLIST( ) devuelve verdadero (.T.) si encuentra la expresión en el conjunto de expresiones. De lo contrario, INLIST( ) devolverá falso (.F.). Se devuelve el valor nulo si eExpresión1 es el valor nulo. También se devuelve el valor nulo si eExpresión1 no es el valor nulo, eExpresión1 no coincide con otra expresión y al menos una de las otras expresiones es el valor nulo.
5.5.114. INSERT - SQL (Comando) Anexa un registro al final de una tabla que contiene los valores de campo especificados.
Sintaxis INSERT INTO nombre_dbf [(fnombre1 [, fnombre2, ...])] VALUES (eExpresión1 [, eExpresión2, ...]) –o bien– INSERT INTO nombre_dbf FROM ARRAY NombreMatriz | FROM MEMVAR
173
Manual de Genlis
Argumentos INSERT INTO nombre_dbf Especifica el nombre de la tabla a la que se anexará un registro. nombre_dbf puede incluir una ruta de acceso y puede ser una expresión de nombre. Si la tabla que especifica no está ya abierta, se abrirá en modo exclusivo en una área de trabajo nueva y se anexará el registro. El área de trabajo nueva no se selecciona, sino que permanece seleccionada el área de trabajo actual. Si la tabla que especifica está abierta, INSERT anexa el registro a la tabla. Si la tabla está abierta en una área de trabajo distinta del área de trabajo actual, no se seleccionará después de anexar el registro; el área de trabajo actual permanecerá seleccionada. [(fnombre1 [, fnombre2 [, ...]])] Especifica los nombres de los campos del nuevo registro donde se insertan los valores. VALUES (eExpresión1 [, eExpresión2 [, ...]]) Especifica los valores de campo que se insertan en el nuevo registro. Si omite los nombres de los campos, debe especificar los valores de campo en el orden definido por la estructura de la tabla. Si SET NULL está ON, INSERT - SQL intentará insertar valores nulos en cualquier campo no especificado de la cláusula VALUES. FROM ARRAY NombreMatriz Especifica la matriz cuyos datos se insertan en el nuevo registro. El contenido de los elementos de la matriz, comenzando por el primer elemento, se inserta en los campos correspondientes del registro. El contenido del primer elemento de la matriz se inserta en el primer campo del nuevo registro, el contenido del segundo elemento se inserta en el segundo campo, y así sucesivamente. Se ignora cualquier valor predeterminado de los campos cuando se incluye la cláusula FROM ARRAY. FROM MEMVAR Especifica que el contenido de las variables de memoria se inserta en los campos que tengan los mismos nombres que dichas variables. Si no existe una variable de memoria con el mismo nombre que el campo, éste permanecerá vacío.
Comentarios El nuevo registro contiene los datos indicados en la cláusula VALUES o incluidos en la matriz o las variables de memoria especificadas. El puntero de registro se coloca en el nuevo registro.
5.5.115. INT( ) (Función) Evalúa una expresión numérica y devuelve la parte entera de dicha expresión.
Sintaxis
174
Manual de Genlis
INT(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica la expresión numérica cuya parte entera devuelve INT( ).
5.5.116. ISALPHA( ) (Función) Determina si el carácter de la izquierda de una expresión de caracteres es alfabético.
Sintaxis ISALPHA(cExpresión)
Tipos devueltos Logical
Argumentos cExpresión Especifica la expresión de caracteres evaluada por ISALPHA( ). Los caracteres situados a la derecha del primer carácter de cExpresión se pasan por alto.
Comentarios ISALPHA( ) devuelve verdadero (.T.) si el carácter situado más a la izquierda de la expresión de caracteres especificada es alfabético. Si no lo es, ISALPHA( ) devuelve falso (.F.).
5.5.117. ISBLANK( ) (Función) Determina si una expresión está en blanco.
Sintaxis ISBLANK(eExpresión)
Tipos devueltos Logical
175
Manual de Genlis
Argumentos eExpresión Especifica la expresión evaluada por ISBLANK( ). eExpresión puede ser un campo de una tabla, una variable de memoria o elemento de matriz, o una expresión. Para un campo, ISBLANK( ) devuelve verdadero (.T.) si contiene los siguientes valores. Tipo. Contenido - Carácter. Una cadena vacía, espacios o ningún valor (registro en blanco recién anexado o borrado con BLANK) . - Numérico. Ningún valor (registro en blanco recién anexado o borrado con BLANK) - Flotante. Ningún valor (registro en blanco recién anexado o borrado con BLANK) - Fecha. Fecha en blanco ({ / / }) o ningún valor (registro en blanco recién anexado o borrado con BLANK) - Fecha-Hora. Fecha y hora en blanco ({ / / : : }) o ningún valor (registro en blanco recién anexado o borrado con BLANK) - Lógico. Ningún valor (registro en blanco recién anexado o borrado con BLANK) - Memo. Vacío (sin contenido memo) - General. Vacío (sin objeto OLE) - Imagen. Vacío (sin imagen)
Comentarios ISBLANK( ) devuelve verdadero (.T.) si la expresión eExpresión está en blanco; de lo contrario, ISBLANK( ) devuelve falso (.F.). APPEND BLANK y BLANK se usan para crear un registro en blanco. BLANK también se puede usar para borrar datos de los campos de un registro. ISBLANK( ) puede determinar si un campo está en blanco. Fíjese en que las expresiones del tipo Currency, Integer y Double nunca están en blanco y que ISBLANK( ) siempre devuelve falso (.F.) para estos tipos de datos. ISBLANK( ) es distinto de EMPTY( ) e ISNULL( ). Por ejemplo, EMPTY( ) devuelve verdadero (.T.) si una expresión de caracteres contiene cualquier combinación de valores nulos, espacios, tabulaciones, retornos de carro o avances de línea; ISBLANK( ) devuelve verdadero (.T.) si una expresión de caracteres contiene solamente la cadena vacía o espacios.
5.5.118. ISDIGIT( ) (Función) Determina si el carácter de la izquierda de la expresión de caracteres especificada es un dígito (0 a 9).
Sintaxis ISDIGIT(cExpresión)
Tipos devueltos Logical
176
Manual de Genlis
Argumentos cExpresión Especifica la expresión de caracteres comprobada por ISDIGIT( ). Los caracteres situados tras el primero en cExpresión se pasan por alto.
Comentarios ISDIGIT( ) devuelve verdadero (.T.) si el carácter más a la izquierda de la expresión de caracteres especificada es un dígito (0 a 9); de lo contrario, ISDIGIT( ) devuelve falso (.F.).
5.5.119. ISEXCLUSIVE( ) (Función) Devuelve verdadero (.T.) si una tabla está abierta para uso exclusivo; de lo contrario, devuelve falso (.F.).
Sintaxis ISEXCLUSIVE([cAliasTabla | nÁreaTrabajo | cNombreBaseDatos [, nTipo]])
Tipos devueltos Logical
Argumentos cAliasTabla Especifica el alias de la tabla para la que se devuelve el estado de uso exclusivo. Genlis genera un mensaje de error si especifica un alias de tabla que no existe. nÁreaTrabajo Especifica el área de trabajo de la tabla para la que se devuelve el estado de uso exclusivo. ISEXCLUSIVE( ) devuelve falso (.F.) si no hay abierta una tabla en el área de trabajo que especifique. cNombreBaseDatos Especifica el nombre de la base de datos para la que se devuelve el estado de uso exclusivo. nTipo Especifica si se devolverá el estado de uso exclusivo para una tabla o para una base de datos. En las siguiente tabla se enumeran los valores para nTipo y el estado devuelto correspondiente. nTipo Estado exclusivo devuelto 1 Tabla 2 Base de datos Para determinar el estado exclusivo para una base de datos, es necesario incluir nTipo con un valor de 2.
177
Manual de Genlis
Comentarios ISEXCLUSIVE( ) devuelve un valor para la tabla abierta en el área de trabajo seleccionada actualmente si omite los argumentos opcionales cAliasTabla, nÁreaTrabajo o cNombreBaseDatos. Una tabla se abre para uso exclusivo al incluir la palabra clave EXCLUSIVE en USE, o al establecer SET EXCLUSIVE como ON antes de abrir la tabla. Para abrir una base de datos para uso exclusivo, incluya la palabra clave EXCLUSIVE en OPEN DATABASE.
5.5.120. ISLOWER( ) (Función) Determina si el carácter más a la izquierda de la expresión de caracteres especificada es una letra minúscula.
Sintaxis ISLOWER(cExpresión)
Tipos devueltos Logical
Argumentos cExpresión Especifica la expresión de caracteres comprobada por ISLOWER( ). ISLOWER( ) pasa por alto los caracteres situados tras el primer carácter de cExpresión.
Comentarios ISLOWER( ) devuelve verdadero (.T.) si el carácter más a la izquierda de la expresión de caracteres especificada es una letra minúscula; de lo contrario, ISLOWER( ) devuelve falso (.F.).
5.5.121. ISNULL( ) (Función) Devuelve verdadero (.T.) si una expresión da como resultado un valor nulo; de lo contrario, ISNULL( ) devuelve falso (.F.).
Sintaxis ISNULL(eExpresión)
Tipos devueltos Logical
178
Manual de Genlis
Argumentos eExpresión Especifica la expresión que se va a evaluar.
Comentarios Utilice ISNULL( ) para determinar si el contenido de un campo, una variable de memoria o un elemento de matriz contiene un valor nulo, o si una expresión da como resultado un valor nulo.
5.5.122. ISUPPER( ) (Función) Determina si el primer carácter de una expresión de caracteres es alfabético y está en mayúsculas.
Sintaxis ISUPPER(cExpresión)
Tipos devueltos Logical
Argumentos cExpresión Especifica la expresión de caracteres evaluada por ISUPPER( ). Se pasan por alto los caracteres situados detrás del primer carácter de cExpresión.
Comentarios ISUPPER( ) devuelve verdadero (.T.) si el primer carácter de una expresión de caracteres es alfabético y está en mayúsculas; de lo contrario, ISUPPER( ) devuelve falso (.F.).
5.5.123. KEYBOARD (Comando) Sitúa la expresión de caracteres especificada en el búfer de teclado.
Sintaxis KEYBOARD cValorTeclado [PLAIN] [CLEAR]
Argumentos cValorTeclado
179
Manual de Genlis
Especifica la expresión de caracteres que se introduce en el búfer de teclado. La expresión de caracteres puede ser una cadena de caracteres, una etiqueta de tecla, un conjunto de etiquetas de tecla o una función definida por el usuario (FDU) que devuelva una expresión de caracteres. Si cValorTeclado es una etiqueta de tecla, deberá incluirla entre llaves y comillas. Por ejemplo, KEYBOARD '{CTRL+LEFTARROW}' Para ver una lista de etiquetas de teclas, vea ON KEY LABEL. El búfer de teclado puede llenarse con hasta 128 caracteres. Una vez que se llena el búfer, los caracteres adicionales se pasan por alto. PLAIN Si tiene definidas macros de teclado o tiene un comando ON KEY LABEL activo, puede incluir PLAIN para eludir esas asignaciones de tecla. PLAIN llenará el teclado con el carácter de tecla literal, no con la asignación de tecla. Por ejemplo, si ha asignado un comando a la tecla A mediante ON KEY LABEL y se incluye A en cValorTeclado, utilice PLAIN para situar la letra A en el búfer de teclado. El comando ON KEY LABEL asignado a A no se ejecutará. CLEAR Vacía el búfer de teclado antes de llenarlo con cValorTeclado.
Comentarios Utilice KEYBOARD para situar caracteres en el búfer de teclado. Los caracteres permanecerán en el búfer hasta que Genlis busque una entrada de teclado. En este punto, los caracteres se leerán y procesarán como si los datos se hubieran escrito directamente desde el teclado. Puede utilizar KEYBOARD para crear sistemas de demostración autoejecutables que actúen como escaparate de sus aplicaciones.
5.5.124. LABEL (Comando) Imprime etiquetas desde un archivo de tabla y un archivo de definición de etiqueta.
Sintaxis LABEL [FORM NombreArchivo1 | FORM ?] [ENVIRONMENT] [Alcance] [FOR lExpresión1] [WHILE lExpresión2] [NOCONSOLE] [NOOPTIMIZE] [PDSETUP]
180
Manual de Genlis
[PREVIEW [NOWAIT]] [NAME NombreObjeto] [TO PRINTER [PROMPT] | TO FILE NombreArchivo2]
Argumentos FORM NombreArchivo1 Especifica el nombre de un archivo de definición de etiqueta cuyas etiquetas se desea imprimir. La extensión predeterminada para un archivo de definición de etiquetas es .lbx. Si este archivo de definición de etiquetas está en una unidad distinta de la predeterminada o en un directorio distinto del actual, también deberá especificar el designador de unidad y el directorio. FORM ? Muestra el cuadro de diálogo Abrir, en el que puede elegir un archivo de etiqueta existente. ENVIRONMENT Se incluye por compatibilidad con las etiquetas de la versión 2.x. Para restaurar el entorno de datos asociado a una etiqueta de Genlis, establezca la propiedad AutoOpenTables del entorno de datos como verdadera (.T.), que es el valor predeterminado. Para asegurarse de que el entorno de etiquetas está cerrado cuando se termina de imprimir una etiqueta, establezca la propiedad AutoCloseTables del entorno de datos como verdadera (.T.), que también es el valor predeterminado. Cuando cree o modifique etiquetas, puede guardar el entorno de datos actual de Genlis con el archivo de definición de etiqueta. Al guardar el entorno de datos de Genlis se incluyen registros adicionales en la tabla de definición de etiqueta para todas las tablas y archivos de índice abiertos, el orden de índice y cualquier relación entre las tablas. Alcance Especifica un intervalo de registros. Solamente se imprimen los registros incluidos en el intervalo. Las cláusulas de alcance son: ALL, NEXT nRegistros, RECORD nNúmeroRegistro y REST. Para obtener más información sobre las cláusulas de alcance, vea los temas de Ayuda en pantalla Cláusulas de alcance o Introducción al lenguaje. Los comandos que incluyen Alcance solamente funcionan en la tabla del área de trabajo activa. El alcance predeterminado de LABEL es ALL (todos los registros). FOR lExpresión1 Especifica una condición por la cual solamente se imprimen los registros que satisfacen la condición lógica lExpresión1. Este argumento permite filtrar los registros que no desea imprimir. Rushmore optimizará una consulta creada con LABEL ... FOR si lExpresión1 es una expresión optimizable. Para obtener un mejor rendimiento, utilice una expresión optimizable en la cláusula FOR. WHILE lExpresión2 Especifica una condición por la cual los registros se imprimen siempre y cuando la expresión lógica lExpresión2 dé como resultado verdadero (.T.). NOCONSOLE
181
Manual de Genlis
Suprime la presentación del resultado de la etiqueta en la ventana principal de Genlis o en una ventana definida por el usuario en el momento de imprimir etiquetas o de enviarlas a un archivo. NOOPTIMIZE Desactiva la optimización Rushmore de LABEL. PDSETUP Carga una configuración del controlador de impresora. En Genlis, puede incluir PDSETUP de forma que pueda utilizar una configuración del controlador de impresora para imprimir etiquetas basadas en caracteres creadas en FoxPro para MS-DOS. PDSETUP se pasa por alto durante la impresión de etiquetas basadas en gráficos creadas en Genlis. PREVIEW [NOWAIT] Muestra las etiquetas en una ventana de vista previa antes de imprimir, pero no imprime las etiquetas. Para imprimir las etiquetas, deberá volver a ejecutar LABEL sin la cláusula PREVIEW. En Genlis, se puede incluir la cláusula opcional NOWAIT para que, en tiempo de ejecución, Genlis no espere a que se cierre la ventana de vista previa de la página para continuar la ejecución del programa. En lugar de esto, Genlis continuará la ejecución del programa mientras esté abierta la ventana de vista previa de la página. NAME NombreObjeto Especifica un nombre de variable de objeto para el entorno de datos de una etiqueta. El entorno de datos y los objetos del entorno de datos tienen propiedades y métodos, por ejemplo AddObject, que necesitan establecerse o llamarse en tiempo de ejecución. La variable de objeto ofrece acceso a estas propiedades y métodos. Si no especifica NAME, Genlis usará un valor predeterminado para el nombre del archivo de etiqueta al que se puede hacer referencia en el código asociado a los eventos. TO PRINTER [PROMPT] Envía una etiqueta a la impresora. Puede incluir la cláusula opcional PROMPT para mostrar el cuadro de diálogo Imprimir antes de que comience la impresión. TO FILE NombreArchivo2 Envía etiquetas basadas en caracteres creadas en FoxPro para MS-DOS al archivo de texto especificado con NombreArchivo2. El archivo que se crea cuando se incluye TO FILE tiene la extensión predeterminada .TXT.
Comentarios Los archivos de definición de etiqueta se crean con MODIFY LABEL o CREATE LABEL. Si ejecuta LABEL sin argumentos adicionales, aparecerá el cuadro de diálogo Abrir, que muestra una lista de los archivos de etiqueta existentes para que usted elija.
182
Manual de Genlis
5.5.125. LEFT( ) (Función) Devuelve un número especificado de caracteres de una expresión de caracteres, a partir del carácter situado más a la izquierda.
Sintaxis LEFT(cExpresión, nExpresión)
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres de la cual LEFT( ) devuelve los caracteres. nExpresión Especifica el número de caracteres devueltos desde la expresión de caracteres. Si nExpresión es mayor que la longitud de cExpresión, se devolverá toda la expresión. Devuelve la cadena vacía si nExpresión es negativa o si es 0. LEFT( ) es idéntica a SUBSTR( ) con una posición inicial de 1.
5.5.126. LEFTC( ) (Función) Devuelve un número específico de caracteres a partir de una expresión de caracteres, a partir del carácter que está más a la izquierda.
Sintaxis LEFTC(cExpresión, nExpresión)
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres a partir de la cual LEFTC( ) devuelve caracteres. nExpresión
183
Manual de Genlis
Especifica el número de caracteres devueltos a partir de la expresión de caracteres. Si nExpresión es mayor que la longitud de cExpresión, se devolverá toda la expresión de caracteres. Se devolverá la cadena vacía si nExpresión es negativa o 0.
Comentarios LEFTC( ) se ha diseñado para expresiones que contengan caracteres de dos bytes. Si la expresión sólo contiene caracteres de un byte, LEFTC( ) será equivalente a LEFT( ). LEFTC( ) devuelve un número específico de caracteres a partir de una expresión de caracteres que contiene cualquier combinación de caracteres de un byte y de dos bytes. LEFTC( ) es idéntica a SUBSTRC( ) con una posición de inicial de 1. Esta función es útil para manipular juegos de caracteres de doble byte de idiomas como el Hiragana y Katakana.
5.5.127. LEN( ) (Función) Devuelve el número de caracteres de una expresión de caracteres.
Sintaxis LEN(cExpresión)
Tipos devueltos Numeric
Argumentos cExpresión Especifica la expresión de caracteres cuyo número de caracteres devuelve LEN( ).
Comentarios Utilice LEN( ) para determinar la longitud de una expresión de caracteres.
5.5.128. LENC( ) (Función) Devuelve el número de caracteres de una expresión de caracteres o de un campo memo.
Sintaxis LENC(cExpresión)
Tipos devueltos
184
Manual de Genlis
Numeric
Argumentos cExpresión Especifica la expresión de caracteres cuyo número de caracteres devuelve LENC( ).
Comentarios LENC( ) se ha diseñado para expresiones que contengan caracteres de dos bytes. Si la expresión sólo contiene caracteres de un byte, LENC( ) será equivalente a LEN( ). LENC( ) devuelve un número específico de caracteres a partir de una expresión de caracteres o de un campo memo que contiene cualquier combinación de caracteres de un byte y de doble byte. Esta función es útil para manipular juegos de caracteres de doble byte de idiomas como el Hiragana y el Katakana.
5.5.129. LIKE( ) (Función) Determina si una expresión de caracteres coincide con otra expresión de caracteres.
Sintaxis LIKE(cExpresión1, cExpresión2)
Tipos devueltos Logical
Argumentos cExpresión1 Especifica la expresión de caracteres que LIKE( ) compara con cExpresión2. cExpresión1 puede contener caracteres comodín, tales como * y ?. El signo de interrogación (?) coincide con cualquier carácter único de cExpresión2 y el asterisco (*) coincide con cualquier número de caracteres. Puede mezclar y combinar cualquier número de caracteres comodín que desee en cExpresión1. cExpresión2 Especifica la expresión de caracteres que LIKE( ) compara con cExpresión1. cExpresión2 debe coincidir con cExpresión1 letra por letra para que LIKE( ) devuelva verdadero (.T.).
Comentarios LIKE( ) devuelve verdadero (.T.) si cExpresión1 coincide con cExpresión2; de lo contrario, devuelve falso (.F.). SET COMPATIBLE determina la forma en que LIKE( ) evalúa cExpresión1 y cExpresión2. Si SET COMPATIBLE está establecido en ON o DB4, se eliminarán todos los espacios en blanco finales de
185
Manual de Genlis
cExpresión1 y cExpresión2 antes de compararlos. Si SET COMPATIBLE está establecido en OFF o FOXPLUS, en la comparación se usarán todos los espacios en blanco finales de cExpresión1 y cExpresión2.
5.5.130. LIKEC( ) (Función) Determina si una expresión de caracteres concuerda con otra expresión de caracteres.
Sintaxis LIKEC(cExpresión1, cExpresión2)
Tipos devueltos Logical
Argumentos cExpresión1 Especifica la expresión de caracteres que LIKEC( ) compara con cExpresión2. cExpresión1 puede contener comodines tales como * y ?. Un signo de interrogación (?) concuerda con cualquier carácter en cExpresión2 y un asterisco (*) concuerda con cualquier número de caracteres. Puede mezclar y combinar el número de comodines que desee en cExpresión1. cExpresión2 Especifica la expresión de caracteres que LIKEC( ) compara con cExpresión1. cExpresión2 tiene que concordar con cExpresión1 carácter a carácter para que LIKE( ) devuelva verdadero (.T.).
Comentarios LIKEC( ) se ha diseñado para expresiones que contienen caracteres de doble byte. Si la expresión sólo contiene caracteres de un byte, LIKEC( ) es equivalente a LIKE( ). LIKEC( ) determina si una expresión de caracteres concuerda con otra expresión de caracteres. LIKEC( ) devuelve verdadero (.T.) si cExpresión1 concuerda con cExpresión2; de lo contrario, devolverá falso (.F.). SET COMPATIBLE determina cómo LIKEC( ) compara espacios en blanco en cExpresión1 y en cExpresión2. Si SET COMPATIBLE está establecido en ON o DB4, se eliminarán todos los espacios en blanco finales de cExpresión1 y cExpresión2 antes de compararlas. Si SET COMPATIBLE está establecido en OFF o FOXPLUS, todos los espacios en blanco finales en cExpresión1 y cExpresión2 se utilizarán en la comparación. Esta función es útil para manipular juegos de caracteres de doble byte de idiomas como el Hiragana y el Katakana.
186
Manual de Genlis
5.5.131. LOWER( ) (Función) Devuelve en letras minúsculas una expresión de caracteres especificada.
Sintaxis LOWER(cExpresión)
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres convertida por LOWER( ).
Comentarios LOWER( ) convierte todas las letras mayúsculas (A – Z) de la expresión a letras minúsculas (a – z). Todos los demás caracteres de la expresión permanecen sin cambios.
5.5.132. LTRIM( ) (Función) Devuelve la expresión de caracteres especificada después de eliminar los espacios en blanco iniciales.
Sintaxis LTRIM(cExpresión)
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres en la cual LRTRIM( ) elimina los espacios en blanco iniciales.
Comentarios Esta función es especialmente útil para eliminar los espacios en blanco iniciales que se insertan cuando se utiliza STR( ) para convertir un valor numérico en una cadena de caracteres.
187
Manual de Genlis
5.5.133. MD | MKDIR (Comando) Crea un nuevo directorio o subdirectorio en el disco.
Sintaxis MD cRuta | MKDIR cRuta
Argumentos cRuta Especifica una ruta de acceso (con un designador de unidad y un directorio) o un directorio. Si cRuta es un directorio sin un designador de unidad, se creará el directorio como subdirectorio del directorio predeterminado de Genlis.
Comentarios Genlis genera un mensaje de error si intenta crear un directorio que ya existe.
5.5.134. MEMLINES( ) (Función) Devuelve el número de líneas de un campo memo.
Sintaxis MEMLINES(NombreCampoMemo)
Tipos devueltos Numeric
Argumentos NombreCampoMemo Es el nombre de un campo memo. Si el campo memo está en una tabla que no está abierta en el área de trabajo actual, incluya delante del nombre del campo memo el alias de la tabla y un punto.
Comentarios El número de líneas de un campo memo está determinado por el valor actual de SET MEMOWIDTH.
5.5.135. MESSAGEBOX( ) (Función) Muestra un cuadro de diálogo definido por el usuario.
188
Manual de Genlis
Sintaxis MESSAGEBOX(cTextoMensaje [, nTipoCuadroDiálogo [, cTextoBarraTítulo]])
Tipos devueltos Numeric
Argumentos cTextoMensaje Especifica el texto que aparece en el cuadro de diálogo. Utilice un retorno de carro (CHR(13)) en cTextoMensaje para mover una parte del mensaje a la siguiente línea del cuadro de diálogo. El alto y el ancho del cuadro de diálogo aumentan lo que sea necesario para que quepa cTextoMensaje. nTipoCuadroDiálogo Especifica los botones y los iconos que aparecen en el cuadro de diálogo, el botón elegido inicialmente cuando se muestra y el comportamiento del mismo. En las tablas siguientes, los valores 0 a 5 del botón del cuadro de diálogo especifican los botones que aparecen en el mismo. Los valores de icono 16, 32, 48 y 64 especifican el icono que aparece en el cuadro de diálogo. Los valores predeterminados 0, 256 y 512 especifican qué botón del cuadro de diálogo es el botón predeterminado. El botón predeterminado se selecciona cuando aparece el cuadro de diálogo. Omitir nTipoCuadroDiálogo es lo mismo que especificar un valor de 0 para nTipoCuadroDiálogo. Valor Botones del cuadro de diálogo 0 Sólo botón Aceptar. 1 Botones Aceptar y Cancelar. 2 Botones Anular, Reintentar e Ignorar. 3 Botones Sí, No y Cancelar. 4 Botones Sí y No. 5 Botones Reintentar y Cancelar. Valor 16 32 48 4
Icono Punto. Signo de interrogación. Signo de exclamación. Icono de información (!).
Valor 0 256 512
Botón predeterminado Primer botón. Segundo botón. Tercer botón.
nTipoCuadroDiálogo puede ser la suma de hasta tres valores, uno de cada una de las tablas anteriores. Por ejemplo, si nTipoCuadroDiálogo es 290 (2+32+256), el cuadro de diálogo especificado tendrá las siguientes características:
189
Manual de Genlis
Botones Anular, Reintentar e Ignorar. El cuadro de mensaje muestra el icono del signo de interrogación. El segundo botón, Reintentar, es el botón predeterminado.
cTextoBarraTítulo Especifica el texto que aparece en la barra de título del cuadro de diálogo. Si omite cTextoBarraTítulo, en la barra de título aparecerá el título "Genlis".
Comentarios El valor que devuelve MESSAGEBOX( ) indica qué botón del cuadro de diálogo se ha elegido. En los cuadros de diálogo con un botón Cancelar, al presionar la tecla ESC para salir del cuadro de diálogo se devolverá el mismo valor (2) que al elegir Cancelar. Observe que la abreviatura más corta para esta función es MESSAGEB( ). La tabla siguiente muestra los valores que devuelve MESSAGEBOX( ) para cada botón. Valor devuelto 1 2 3 4 5 6 7
Botón Aceptar Cancelar Anular Reintentar Ignorar Sí No
5.5.136. MIN( ) (Función) Evalúa un conjunto de expresiones y devuelve la expresión que tenga el valor mínimo.
Sintaxis MIN(eExpresión1, eExpresión2 [, eExpresión3 ...])
Tipos devueltos Character, Numeric, Currency, Double, Float, Date o DateTime
Argumentos eExpresión1, eExpresión2 [, eExpresión3 ...] Especifican el conjunto de expresiones a partir del cual desea que MIN( ) devuelva la expresión cuyo valor es menor. Todas las expresiones deben ser del mismo tipo.
190
Manual de Genlis
5.5.137. MINUTE( ) (Función) Devuelve los minutos de una expresión DateTime.
Sintaxis MINUTE(tExpresión)
Tipos devueltos Numeric
Argumentos tExpresión Especifica la expresión DateTime a partir de la cual se devuelve la parte de minutos.
5.5.138. MLINE( ) (Función) Devuelve una línea específica de un campo memo en una cadena de caracteres.
Sintaxis MLINE(NombreCampoMemo, nNúmeroLínea [, nNúmCaracteres])
Tipos devueltos Character
Argumentos NombreCampoMemo Especifica el nombre del campo memo desde el cual MLINE( ) devuelve una línea. Si el campo memo está en una tabla abierta en un área de trabajo no activa, incluya delante del nombre del campo memo un punto y el alias de la tabla. nNúmeroLínea Especifica el número de la línea del campo memo que se debe devolver. Devuelve una cadena vacía si nNúmeroLínea es negativo, 0, o mayor que el número de líneas del campo memo. nNúmCaracteres Especifica el número de caracteres, contado desde el principio del campo memo del que MLINE( ) devuelve la línea especificada. La variable de memoria del sistema _MLINE se suele utilizar para nNúmCaracteres. _MLINE se ajusta automáticamente cada vez que se llama a MLINE( ).
191
Manual de Genlis
En procedimientos recursivos que devuelven líneas a partir de campos memo grandes, puede mejorar el rendimiento si incluye _MLINE en nNúmCaracteres.
Comentarios MLINE( ) elimina todos los espacios finales desde la línea especificada con nNúmeroLínea. La longitud y el número de líneas de un campo memo están determinados por el valor actual de SET MEMOWIDTH (la longitud de línea predeterminada es 50 caracteres). Si encuentra un retorno de carro, no devolverá ningún carácter adicional. El ajuste actual de _WRAP determina la forma en que se visualiza la línea del campo memo. Cuando se busca una cadena alfanumérica en un campo memo, puede utilizar ATLINE( ) o ATCLINE( ) para devolver el número de la línea en la que se encuentra la cadena alfanumérica. Utilice este número de línea en MLINE( ) para devolver el contenido de la línea del campo memo.
5.5.139. MOD( ) (Función) Divide una expresión numérica por otra expresión numérica y devuelve el resto.
Sintaxis MOD(nDividendo, nDivisor)
Tipos devueltos Numeric
Argumentos nDividendo Especifica el dividendo. El número de lugares decimales en nDividendo determina el número de lugares decimales en el resultado. nDivisor Especifica el divisor. Si nDivisor es positivo, se devolverá un número positivo, si nDivisor es negativo se devolverá un número negativo.
Comentarios La función de módulo MOD( ) y el operador % devuelven resultados idénticos.
5.5.140. MONTH( ) Function Devuelve el número de mes de una expresión determinada de tipo Date o DateTime.
192
Manual de Genlis
Sintaxis MONTH(dExpresión | tExpresión)
Tipos devueltos Numeric
Argumentos dExpresión Especifique la expresión Date de la que quiere que MONTH( ) le devuelva el número de mes.. tExpresión Especifique la expresión DateTime de la que quiere que MONTH( ) le devuelva el número de mes.
Comentarios MONTH( ) devuelve un número de 1 a 12. Enero es el mes 1, y diciembre es el mes 12.
5.5.141. MTON( ) (Función) Devuelve un valor Numeric de una expresión Currency.
Sintaxis MTON(mExpresión)
Tipos devueltos Numeric
Argumentos mExpresión Especifica la expresión Currency cuyo valor devuelve MTON( ). mExpresión debe evaluarse como un valor de tipo Currency válido. De lo contrario, Genlis genera un error. Los valores de tipo Currency se crean al situar el prefijo de signo dólar ($) inmediatamente antes de un valor Numeric.
Comentarios MTON( ) devuelve un valor Numeric con cuatro decimales.
193
Manual de Genlis
5.5.142. NTOM( ) (Función) Devuelve un valor de Currency con cuatro cifras decimales a partir de una expresión numérica.
Sintaxis NTOM(nExpresión)
Tipos devueltos Currency
Argumentos nExpresión Especifica una expresión numérica cuyo valor de Moneda devuelve NTOM( ). Si nExpresión tiene más de cuatro cifras decimales, se redondea hasta cuatro decimales. Si nExpresión tiene menos de cuatro cifras decimales, se rellena con ceros hasta crear las cuatro.
5.5.143. PACK (Comando) Borra definitivamente todos los registros marcados para eliminar de la tabla actual y reduce el tamaño de un archivo memo asociado a una tabla.
Sintaxis PACK [MEMO] [DBF]
Argumentos MEMO Elimina el espacio no utilizado del archivo memo, pero no elimina los registros marcados para eliminar de la tabla. La información de los campos memo se almacena en un archivo memo asociado. Un archivo memo tiene el mismo nombre que la tabla y la extensión .ftp. DBF Elimina de la tabla los registros marcados para eliminación, pero no afecta al archivo memo.
Comentarios Cuando se ejecuta PACK, Genlis copiará todos los registros que no están marcados para borrar a una tabla temporal. Cuando se termine PACK, Genlis eliminará la tabla original del disco y cambiará el nombre de la tabla temporal por el nombre de la tabla original. PACK puede interrumpirse presionando esc. Al presionar esc se detiene PACK, la tabla temporal se borra y la tabla original permanece inalterada. También recuperará la tabla original si agota el espacio del disco durante un PACK.
194
Manual de Genlis
Cuando se ejecuta PACK sin las cláusulas MEMO y DBF, se empaquetan tanto la tabla como el archivo memo. PACK necesita utilizar de forma exclusiva la tabla. Si la tabla activa tiene uno o varios índices abiertos, PACK regenera los archivos de índice. Precaución. Tenga cuidado de marcar solamente los registros que no va a necesitar más. No hay ninguna forma de recuperar los registros eliminados después de utilizar PACK.
5.5.144. PADL( ) | PADR( ) | PADC( ) (Funciones) Devuelve la expresión específica rellenándola por la izquierda, la derecha, o por ambos lados.
Sintaxis PADL(eExpresión, nTamañoResultado [, cCarácterRelleno]) – o bien – PADR(eExpresión, nTamañoResultado [, cCarácterRelleno]) –o– PADC(eExpresión, nTamañoResultado [, cCarácterRelleno])
Tipos devueltos Character
Argumentos eExpresión Incluya la expresión que se va a rellenar. Puede ser una expresión de cualquier tipo, excepto una expresión lógica o un campo general o de imagen. nTamañoResultado Especifica el número total de caracteres que tendrá la expresión después de rellenarla. cCarácterRelleno Especifica el valor que se va a utilizar para el relleno. Este valor se repite todas las veces necesarias para rellenar la expresión con el número especificado de caracteres. Si se omite cCarácterRelleno, se utilizan espacios (ASC(32)) para el relleno.
Comentarios PADL( ) inserta los caracteres de relleno a la izquierda, PADR( ) inserta el relleno a la derecha, y PADC( ) lo inserta en ambos lados.
195
Manual de Genlis
5.5.145. _PAGENO (Variable del sistema) Contiene el número de página actual.
Sintaxis _PAGENO = nNúmeroPáginaActual
Argumentos nNúmeroPáginaActual Especifica un valor numérico desde 1 hasta 32.767 para el número de página actual. _PAGENO, _PBPAGE y _PEPAGE se define (o se incrementa) de forma que quede fuera del rango de _PBPAGE a _PEPAGE, no se imprime ninguna página.
Comentarios _PAGENO contiene un valor numérico que determina el número de página actual. El valor inicial predeterminado es 1. _PAGENO le permite imprimir números de página en salida secuencial de caracteres sin definir, inicializar ni incrementar una variable para este fin.
5.5.146. PAYMENT( ) (Función) Devuelve el importe de cada pago periódico de un préstamo a interés fijo.
Sintaxis PAYMENT(nPrincipal, nTipoInterés, nPagos)
Tipos devueltos Numeric
Argumentos nPrincipal Especifica el principal inicial del préstamo. nTipoInterés Especifica el tipo de interés fijo por periodo. Si en el préstamo se hacen los pagos mensualmente pero el tipo de interés es anual, divida por 12 el tipo de interés anual. nPagos Especifica el número total de pagos a realizar en el préstamo.
196
Manual de Genlis
Comentarios PAYMENT( ) asume un tipo de interés periódico constante y que los pagos se hacen al final de cada periodo.
5.5.147. PRIVATE (Comando) Oculta al programa actual las variables o matrices de memoria especificadas que estaban definidas en el programa que llama.
Sintaxis PRIVATE ListaVariables O bien: PRIVATE ALL [LIKE Estructura | EXCEPT Estructura]
Argumentos ListaVariables Especifica las variables o matrices de memoria privadas que se declaran. ALL LIKE Estructura La cláusula ALL LIKE hace que PRIVATE oculte todas las variables y matrices de memoria cuyos nombres coincidan con la estructura Estructura, que puede contener los caracteres comodín ? y *. ALL EXCEPT Estructura La cláusula PRIVATE hace que se oculten todas las variables o matrices de memoria cuyos nombres no coincidan con la estructura Estructura, que puede contener los caracteres comodín ? y *.
Comentarios Oculta al programa actual las variables o matrices de memoria definidas en un programa ejecutado previamente. Ocultar variables creadas en programas de nivel superior permite manipular en el programa actual variables privadas con el mismo nombre que las variables ocultas. Una vez que termina el programa que contiene PRIVATE, todas las variables y matrices de memoria privadas que se declararon vuelven a estar disponibles. PRIVATE no crea variables; simplemente oculta al programa actual las variables declaradas en programas de nivel superior.
197
Manual de Genlis
5.5.148. PROPER( ) (Función) Devuelve, a partir de una expresión de caracteres, una cadena con el modelo apropiado de mayúsculas/minúsculas para nombres propios.
Sintaxis PROPER(cExpresión)
Tipos devueltos Character
Argumentos cExpresión PROPER( ) devolverá una cadena de caracteres con el modelo apropiado de mayúsculas/minúsculas de la expresión especificada.
5.5.149. PUBLIC (Comando) Define variables de memoria o matrices globales.
Sintaxis PUBLIC ListaVariablesMemoria –o bien– PUBLIC [ARRAY] NombreMatriz1(nFilas1 [, nColumnas1]) [, NombreMatriz2(nFilas2 [, nColumnas2])] ...
Argumentos ListaVariablesMemoria Especifica los nombres de una o más variables de memoria que se van a inicializar y designar como globales. [ARRAY] NombreMatriz1 (nFilas1 [, nColumnas1]) [, NombreMatriz12 (nFilas2 [, nColumnas2])] ... Especifica una o más matrices que se van a inicializar y designar como globales.
Comentarios Las variables y matrices globales pueden utilizarse y modificarse en cualquier programa que ejecute durante la sesión actual de Genlis.
198
Manual de Genlis
Las variables y matrices de memoria que se crean con PUBLIC se inicializan a falso (.F.) excepto las variables públicas FOX y FXOPRO, que se inicializan a verdadero (.T.). Las variables públicas FOX y FOXPRO pueden utilizarse para ejecutar código condicionalmente basándose en el producto que esté ejecutando. Cualquier variable o matriz de memoria que cree en la ventana Comandos será automáticamente pública. Todas las variables o matrices de memoria que quiera declarar como públicas deben declararse públicas antes de asignarles un valor. Si dentro de un programa asigna un valor a una variable de memoria o a una matriz y luego la declara pública mediante PUBLIC, Genlis generará un error de sintaxis.
5.5.150. RAND( ) (Función) Devuelve un número aleatorio entre 0 y 1.
Sintaxis RAND([nValorSemilla])
Tipos devueltos Numeric
Argumentos nValorSemilla Especifica el valor semilla que determina la secuencia de valores que devuelve RAND( ). RAND( ) devuelve la misma secuencia de números aleatorios si utiliza el mismo valor semilla para nValorSemilla la primera vez que ejecuta la función RAND( ) seguida de llamadas posteriores a la función RAND( ) sin nValorSemilla. Si nValorSemilla es negativo la primera vez que ejecuta RAND( ), se usará un valor semilla a partir del reloj del sistema. Para obtener la serie más aleatoria de números, utilice inicialmente RAND( ) con un argumento negativo y, después, ejecute RAND( ) sin ningún argumento. Si omite nValorSemilla, RAND( ) utilizará de forma predeterminada el valor semilla 100.001.
5.5.151. RAT( ) (Función) Devuelve la posición numérica de la última aparición (más a la derecha) de una cadena de caracteres dentro de otra cadena de caracteres.
Sintaxis RAT(cExpresiónBúsqueda, cExpresiónBuscada [, nAparición])
199
Manual de Genlis
Tipos devueltos Numeric
Argumentos cExpresiónBúsqueda Especifica la expresión de caracteres que RAT( ) busca en cExpresiónBuscada. La expresión de caracteres puede hacer referencia a un campo memo de cualquier tamaño. cExpresiónBuscada Especifica la expresión de caracteres donde RAT( ) busca. La expresión de caracteres puede hacer referencia a un campo memo de cualquier tamaño. nAparición Especifica qué aparición, de derecha a izquierda, de cExpresiónBúsqueda busca RAT( ) en cExpresiónBuscada. De forma predeterminada, RAT( ) busca la última vez que aparece cExpresiónBúsqueda (nAparición = 1). Si nAparición es 2, RAT( ) buscará la penúltima aparición y así sucesivamente.
Comentarios RAT( ), que es la función inversa de AT( ), busca en la expresión de caracteres cExpresiónBuscada, de la derecha a la izquierda, la última aparición de otra expresión de caracteres cExpresiónBúsqueda. RAT( ) devuelve un entero que indica la posición del primer carácter de cExpresiónBúsqueda en cExpresiónBuscada. RAT( ) devolverá 0 si no encuentra cExpresiónBúsqueda en cExpresiónBuscada, o si nAparición es mayor que el número de veces que cExpresiónBúsqueda aparece en cExpresiónBuscada. La búsqueda realizada por RAT( ) distingue mayúsculas de minúsculas.
5.5.152. RATC( ) (Función) Devuelve la posición numérica de la última aparición de una expresión de caracteres o de un campo memo dentro de otra expresión de caracteres o campo memo.
Sintaxis RATC(cExpresiónBúsqueda, cExpresiónBuscada [, nAparición])
Tipos devueltos Numeric
Argumentos cExpresiónBúsqueda Especifica la expresión de caracteres que RATC( ) busca en cExpresiónBuscada.
200
Manual de Genlis
cExpresiónBuscada Especifica la expresión de caracteres que RATC( ) examina. Las expresiones de caracteres cExpresiónBúsqueda y cExpresiónBuscada pueden ser campos memo de cualquier tamaño. nAparición Especifica qué aparición, de la derecha a la izquierda, de cExpresiónBúsqueda buscará RATC( ) en cExpresiónBuscada. De forma predeterminada, RATC( ) buscará la última aparición de cExpresiónBúsqueda (nAparición es igual a 1). Si nAparición es 2, RATC( ) buscará la próxima última aparición y así sucesivamente.
Comentarios RATC( ) está diseñado para expresiones que contengan caracteres de dos bytes. Si la expresión sólo contiene caracteres de un byte, RATC( ) será equivalente a RAT( ). RATC( ) devuelve la posición numérica de la última aparición de una expresión de caracteres o campo memo dentro de otra expresión de caracteres o campo memo. Las expresiones de caracteres o campos memo pueden contener cualquier combinación de caracteres de un byte y de dos bytes. RATC( ) es lo opuesto a la función AT_C( ): busca de derecha a izquierda. RATC( ) devuelve un número entero para indicar la posición del primer carácter en cExpresiónBúsqueda en cExpresiónBuscada. RATC( ) devuelve 0 si no encuentra cExpresiónBúsqueda en cExpresiónBuscada o si nAparición es mayor que el número de veces que aparece cExpresiónBúsqueda en cExpresiónBuscada. En la búsqueda realizada por RATC( ) se distingue entre mayúsculas y minúsculas. Esta función es útil para manipular conjuntos de caracteres de doble byte en idiomas como el Hiragana y el Katakana.
5.5.153. RATLINE( ) (Función) Devuelve el número de línea de la última aparición de una expresión de caracteres dentro de otra expresión de caracteres o un campo memo, a partir de la última línea.
Sintaxis RATLINE(cExpresiónBúsqueda, cExpresiónBuscada)
Tipos devueltos Numeric
Argumentos cExpresiónBúsqueda Especifica la expresión de caracteres que RATLINE( ) busca en cExpresiónBuscada. cExpresiónBuscada
201
Manual de Genlis
Especifica la expresión de caracteres donde busca RATLINE( ). Las expresiones de caracteres cExpresiónBúsqueda y cExpresiónBuscada pueden ser campos memo de cualquier tamaño. Utilice MLINE( ) para devolver la línea que contiene cExpresiónBúsqueda. Sugerencia RATLINE( ) ofrece una forma cómoda de buscar en campos memo.
Comentarios RATLINE( ), que es la función inversa de ATLINE( ), busca en una expresión de caracteres cExpresiónBuscada, a partir del último carácter de la misma, la aparición de cExpresiónBúsqueda. Si la búsqueda tiene éxito, RATLINE( ) devolverá el número de línea donde se produce la coincidencia. Si la búsqueda fracasa, RATLINE( ) devolverá 0. La búsqueda realizada por RATLINE( ) distingue mayúsculas de minúsculas. Precaución El número de línea devuelto por RATLINE( ) está determinado por el valor de SET MEMOWIDTH, aunque cExpresiónBuscada no sea un campo memo.
5.5.154. RD | RMDIR (Comando) Elimina un directorio del disco.
Sintaxis RD cRuta | RMDIR cRuta
Argumentos cRuta Especifica el nombre y la ubicación del directorio que se elimina del disco.
Comentarios Genlis genera un mensaje de error si intenta eliminar un directorio que no está vacío.
5.5.155. RECCOUNT( ) (Función) Devuelve el número de registros de la tabla actual o especificada.
Sintaxis RECCOUNT([nÁreaTrabajo | cAliasTabla])
Tipos devueltos
202
Manual de Genlis
Numeric
Argumentos nÁreaTrabajo Especifica el número del área de trabajo de una tabla abierta en otra área de trabajo. Si no hay ninguna tabla abierta en el área de trabajo especificada, RECCOUNT( ) devolverá cero. cAliasTabla Especifica el alias de una tabla abierta en otra área de trabajo.
Comentarios El valor devuelto por RECCOUNT( ) no se ve afectado por SET DELETED y SET FILTER. RECCOUNT( ) sin los argumentos opcionales nÁreaTrabajo o cAliasTabla devuelve el número de registros de la tabla del área de trabajo seleccionada actualmente.
5.5.156. RECNO( ) (Función) Devuelve el número del registro actual de la tabla actual o la especificada.
Sintaxis RECNO([nÁreaTrabajo | cAliasTabla])
Tipos devueltos Numeric
Argumentos nÁreaTrabajo Especifica el número del área de trabajo de una tabla abierta en otra área de trabajo. Si no está abierta ninguna tabla en el área de trabajo que especifica, RECNO( ) devolverá cero. cAliasTabla Especifica el alias de una tabla abierta en otra área de trabajo.
Comentarios El registro actual es el registro en el cual se encuentra el puntero de registro. RECNO( ) devuelve números negativos para registros anexados en un búfer de tablas. RECNO( ) devuelve un valor que es el número de registros de la tabla más uno si el puntero de registro se encuentra mas allá del último registro de la misma. RECNO( ) devuelve 1 si el puntero de registro se encuentra antes del primer registro de la tabla. Si la tabla no tiene registros, EOF( ) siempre devolverá verdadero (.T.).
203
Manual de Genlis
Ejecutar RECNO( ) sin los argumentos opcionales nÁreaTrabajo o cAliasTabla devuelve el número de registro actual de la tabla situada en el área de trabajo seleccionada actualmente. Si ha ejecutado SEEK sin éxito en una tabla indexada, puede especificar 0 para que nÁreaTrabajo utilice la lógica de "búsqueda cercana" para devolver el número del registro más similar. RECNO(0) devuelve 0 si no puede encontrarse ninguna coincidencia. Genlis generará un mensaje de error si ejecuta GO RECNO(0) y no se encuentra ninguna coincidencia.
5.5.157. RENAME (Comando) Cambia el nombre de un archivo.
Sintaxis RENAME NombreArchivo1 TO NombreArchivo2
Argumentos NombreArchivo1 TO NombreArchivo2 Especifica el nombre de archivo que se va a modificar y el nuevo nombre de archivo. Incluya las extensiones de archivo en ambos archivos. Si no se incluyen las extensiones de archivo, se asumirán las extensión .dbf predeterminada. Si cambia el nombre de una tabla libre que tiene un archivo memo .fpt asociado, asegúrese de cambiar el nombre del archivo memo. Incluya un punto (.) después del nombre de archivo para cambiar de nombre un archivo que no tenga extensión. No use RENAME para cambiar el nombre de una tabla de una base de datos; RENAME no cambia el nombre de la tabla en la base de datos. Use RENAME TABLE para cambiar el nombre de una tabla en una base de datos. Incluya rutas de acceso con los nombres de archivo si los archivos no están en la unidad y en el directorio predeterminados. Si NombreArchivo1 y NombreArchivo2 están en directorios diferentes, NombreArchivo1 se mueve al directorio de NombreArchivo2. Cuando ejecute RENAME, NombreArchivo2 no puede existir, y NombreArchivo1 tiene que existir y no puede estar abierto. NombreArchivo1 y NombreArchivo2 pueden contener caracteres comodín tales como * y ?. Por ejemplo, para cambiar el nombre de todos los archivos del programa con la extensión .PRG en el directorio o carpeta actuales para hacer una copia de seguridad de los archivos con la extensión .bak, ejecute RENAME *.prg TO *. bak.
5.5.158. REPLACE (Comando) Actualiza los registros de una tabla.
204
Manual de Genlis
Sintaxis REPLACE NombreCampo1 WITH eExpresión1 [ADDITIVE] [, NombreCampo2 WITH eExpresión2 [ADDITIVE]] ... [Alcance] [FOR lExpresión1] [WHILE lExpresión2] [IN nÁreaTrabajo | cAliasTabla] [NOOPTIMIZE]
Argumentos NombreCampo1 WITH eExpresión1 [, NombreCampo2 WITH eExpresión2 ... ] Especifica que los datos de NombreCampo1 se sustituyen por el valor de la expresión eExpresión1; que los datos de NombreCampo2 se sustituyen por el valor de la expresión eExpresión2; y así sucesivamente. Cuando el valor de la expresión sea más largo que la anchura de un campo numérico, REPLACE hará que quepa el valor: Primero, REPLACE truncarán los decimales y se redondeará la parte decimal restante del campo. Si el valor sigue sin caber, REPLACE almacenará el contenido del campo en notación científica. Si el valor sigue sin caber, REPLACE sustituirá el contenido del campo por asteriscos. ADDITIVE Anexa al final de los campos memo sustituciones de campos memo ADDITIVE se aplica únicamente a las sustituciones de campos memo. Si no se incluye ADDITIVE, el campo memo se sobrescribirá con el valor de la expresión. Alcance Especifica un rango de registros a sustituir. Solamente se sustituyen los registros incluidos dentro del rango. Las cláusulas del alcance son: ALL, NEXT nRegistros, RECORD nNúmeroRegistro y REST. El alcance predeterminado de REPLACE es el registro actual (NEXT 1). FOR lExpresión1 Especifica que los campos designados se sustituyan únicamente en los registros para los que lExpresión1 se evalúe como verdadera (.T.). La inclusión de FOR le permite sustituir registros de forma condicional, descartando los registros no deseados. Si lExpresión1 es una expresión optimizable, Rushmore optimizará REPLACE FOR. Para mejorar el rendimiento, utilice una expresión optimizable en la cláusula FOR. WHILE lExpresión2 Si se incluye la cláusula WHILE, se sustituirán los campos de los registros mientras que la expresión lógica lExpresión2 se evalúe como verdadera (.T.). IN nÁreaTrabajo Especifica el área de trabajo de la tabla en la que se actualizan los registros. IN cAliasTabla Especifica el alias de la tabla en la que se actualizan los registros.
205
Manual de Genlis
Si omite nÁreaTrabajo y cAliasTabla, los registros se actualizarán en la tabla del área de trabajo seleccionada actualmente. NOOPTIMIZE Impide la optimización Rushmore.
Comentarios REPLACE sustituye los datos de un campo con el valor de una expresión. Los campos de las áreas de trabajo no seleccionadas deben ir precedidos de su alias. Nota Si se omite la cláusula IN, no se producirá ninguna sustitución si el puntero de registro está al final del archivo del área de trabajo actual y especifica un campo de otro área de trabajo.
5.5.159. REPLACE FROM ARRAY (Comando) Actualiza los datos de campos que tengan valores procedentes de una matriz de variables.
Sintaxis REPLACE FROM ARRAY NombreMatriz [FIELDS ListaCampos] [Alcance] [FOR lExpresión1] [WHILE lExpresión2] [NOOPTIMIZE]
Argumentos NombreMatriz Especifica el nombre de la matriz cuyos valores sustituyen los datos del campo. FIELDS ListaCampos Especifica que solamente los campos incluidos en ListaCampos se sustituyan por el contenido de la matriz. Los campos de áreas de trabajo no seleccionadas deben ir precedidos de sus alias de tabla. Alcance Especifica un intervalo de registros que se deben sustituir por el contenido de la matriz. Solamente se sustituyen los registros incluidos en el intervalo. Se realiza la sustitución hasta el final del alcance o hasta llegar al final de la matriz. Las cláusulas de alcance son: ALL, NEXT nRegistros, RECORD nNúmeroRegistro y REST. El alcance predeterminado para REPLACE FROM ARRAY es el registro actual (NEXT 1). FOR lExpresión1
206
Manual de Genlis
Especifica que los campos se deben sustituir únicamente en los registros donde lExpresión1 se evalúe como verdadera (.T.). Incluir FOR le permite sustituir registros de forma condicional, filtrando los no deseados. La sustitución se produce en los registros para los cuales lExpresión1 se verdadero (.T.), o hasta llegar al final de la matriz. Rushmore optimiza REPLACE FROM ARRAY FOR si lExpresión1 es una expresión optimizable. Para obtener el mejor rendimiento, utilice expresiones optimizables en la cláusula FOR. WHILE lExpresión2 Especifica una condición por la cual los campos de los registros se sustituyen por el contenido de la matriz siempre que la expresión lógica lExpresión2 se evalúe como verdadera (.T.). NOOPTIMIZE Impide la optimización Rushmore.
Comentarios Los campos de tipo Memo y General se pasan por alto en REPLACE FROM ARRAY. Para importar datos en estos campos, use GATHER y APPEND GENERAL. Los elementos de la matriz sustituyen a los campos correspondientes del registro, comenzando por el primer elemento. El primer elemento de la matriz sustituye al primer campo del registro, el segundo elemento de la matriz sustituye al segundo campo, y así sucesivamente. Si los elementos de la matriz son menos que los campos que hay en la tabla, los campos adicionales se pasan por alto. Si los elementos de la matriz son más que los campos de la tabla, los elementos adicionales de la matriz se pasan por alto. Nota No se produce ninguna sustitución si el puntero de registro está al final del archivo del área de trabajo actual y especifica un campo de otra área de trabajo.
5.5.160. REPORT (Comando) Muestra o imprime un informe bajo el control de un archivo de definición de informe creado con MODIFY REPORT o CREATE REPORT.
Sintaxis REPORT FORM NombreArchivo1 | ? [ENVIRONMENT] [Alcance] [FOR lExpresión1] [WHILE lExpresión2] [HEADING cTextoEncabezado] [NOCONSOLE] [NOOPTIMIZE] [PLAIN] [RANGE nPáginaInicio [, nPáginaFinal]]
207
Manual de Genlis
[PREVIEW [[IN] WINDOW NombreVentana | IN SCREEN] [NOWAIT]] [TO PRINTER [PROMPT] | TO FILE NombreArchivo2 [ASCII]] [NAME NombreObjeto] [SUMMARY]
Argumentos NombreArchivo1 Especifica el nombre del archivo de definición de informe que se va a imprimir. ? Muestra el cuadro de diálogo Abrir, en el que puede elegir un archivo de informe. ENVIRONMENT Se incluye por compatibilidad con informes de las versiones 2.x. Para restaurar el entorno de datos asociado a un informe de Genlis, establezca la propiedad AutoOpenTables del entorno de datos como verdadera (.T.), que es el valor predeterminado. Para asegurarse de que el entorno del informe se cierra cuando termina de imprimirse el informe, establezca la propiedad AutoCloseTables del entorno de datos como verdadera (.T.), que es el valor predeterminado. En el caso de informes de otras versiones anteriores de FoxPro convertidos a la actual, la inclusión de ENVIRONMENT abrirá y restaurará todas las tablas y las relaciones en el entorno de datos incluso si AutoOpenTables está establecida en falso (.F.). Cuando crea o modifica informes, puede guardar el entorno de datos actual de Genlis con el archivo de definición de informe. Al guardar el entorno de datos de Genlis se situarán registros adicionales en la tabla de definición de informe para todas las tablas y archivos de índice abiertos, el orden de índice y las relaciones entre las tablas. Alcance Puede especificar un alcance de registros incluidos en el informe. Solamente se incluyen en el informe los registros comprendidos dentro del rango. Las cláusulas de alcance son: ALL, NEXT nRegistros, RECORD nNúmeroRegistro y REST. El alcance predeterminado de REPORT es ALL (todos los registros). FOR lExpresión1 Imprime solamente los datos incluidos en los registros para los cuales lExpresión1 se evalúa como verdadera (.T.). La inclusión de FOR le permite filtrar los registros que no desea imprimir. Rushmore optimizará REPORT FOR si lExpresión1 es una expresión optimizable. Para obtener el mejor rendimiento, utilice expresiones optimizables en la cláusula FOR. WHILE lExpresión2 Especifica una condición por la cual los datos se imprimen mientras las expresión lógica lExpresión2 se evalúe como verdadera (.T.). HEADING cTextoEncabezado
208
Manual de Genlis
Especifica texto para que se incluya un encabezado adicional en cada página del informe. Si se incluyen a la vez HEADING y PLAIN, la opción PLAIN tendrá preferencia. NOCONSOLE Suprime el eco de un informe a la ventana principal de Genlis o a una ventana definida por el usuario cuando el informe se está imprimiendo o enviando a un archivo. NOOPTIMIZE Para impedir la optimización Rushmore de REPORT, incluya NOOPTIMIZE. PLAIN Especifica que el encabezado de página aparece solamente al principio del informe. RANGE nPáginaInicio [, nPáginaFinal] Especifica el rango de páginas que se van a imprimir nPáginaInicio especifica la primera página impresa; nPáginaFinal especifica la última página impresa. Si se omite nPáginaFinal, el número de la última impresa será el predeterminado: 9.999. PREVIEW [[IN] WINDOW NombreVentana | IN SCREEN] Muestra el informe en el modo de Vista previa en lugar de enviarlo a la impresora. Para imprimir un informe, es necesario ejecutar REPORT con TO PRINTER. Tenga en cuenta que las variables del sistema se pasan por alto cuando se incluye PREVIEW. Para especificar una ventana en la que realizar una vista previa del informe, incluya la cláusula opcional WINDOW o IN WINDOW. NombreVentana puede ser el nombre de una ventana creada con DEFINE. si incluye la cláusula WINDOW, la vista previa asume las características de la ventana (título, tamaño, etc.) de la ventana que especifique en NombreVentana. Si incluye la cláusula IN WINDOW, se hace una vista previa del informe en la ventana que especifique en NombreVentana. Puede incluir la cláusula opcional IN SCREEN para especificar que la ventana de vista previa del informe esté contenida en la ventana principal de Genlis y no se pueda mover fuera de ella. Puede incluir la cláusula opcional NOWAIT de modo que en tiempo de ejecución Genlis no espere a que se cierre la ventana Vista previa antes de continuar con la ejecución del programa. En su lugar, Genlis continúa la ejecución del programa mientras está abierta la ventana Vista previa. En una aplicación distribuida, asegúrese de que el menú Ver está disponible. Si se cierra la barra de herramientas Vista previa, no podrá restaurarse a menos que esté disponible el menú Ver. TO PRINTER [PROMPT] Envía un informe a la impresora. En Genlis, puede incluir la cláusula opcional PROMPT para mostrar un cuadro de diálogo antes de que comience la impresión. La configuración de impresora que puede ajustar dependen del controlador de impresora instalado en este momento. Sitúe la palabra clave PROMPT inmediatamente después de TO PRINTER. TO FILE NombreArchivo2 [ASCII]
209
Manual de Genlis
Especifica el archivo de texto al que envía un informe Se usa el controlador de impresora actual cuando el informe se envía al archivo de texto. El archivo creado cuando incluye TO FILE tiene la extensión predeterminada .txt. Puede incluir la cláusula opcional ASCII para crear un archivo de texto ASCII a partir del archivo de definición de informe. Sin la cláusula ASCII, se escriben códigos PostScript y otros códigos de impresora al archivo de texto. Los gráficos, líneas, rectángulos o rectángulos redondeados de la definición del informe no aparecen en el archivo de texto ASCII. El número de columnas y filas de cada página del archivo de texto ASCII está determinado por el contenido de las variables de memoria del sistema _ASCIICOLS y _ASCIIROWS. Los valores predeterminados para _ASCIICOLS y _ASCIIROWS son 80 columnas y 63 filas, respectivamente. Estos valores corresponden a la página vertical estándar. NAME NombreObjeto Especifica un nombre de variable de objeto para el entorno de datos de un informe. El entorno de datos y los objetos del entorno de datos tienen propiedades y métodos, por ejemplo AddObject, que es necesario establecer o llamar en tiempo de ejecución. La variable de objeto ofrece acceso a estas propiedades y métodos. Si no especifica NAME, Genlis usará de forma predeterminada el nombre del archivo de informe al que se puede hacer referencia en el código asociado a los eventos. SUMMARY Suprime la impresión de líneas de detalle. Solamente se imprimen totales y subtotales.
Comentarios La extensión predeterminada de un archivo de definición de informe es .frx. Si el archivo de definición de informe está en una unidad distinta de la unidad o el directorio predeterminados, deberá incluir también la ruta de acceso con el nombre del archivo.
5.5.161. RIGHT( ) (Función) Devuelve el número especificado de caracteres del lado derecho de una cadena de caracteres.
Sintaxis RIGHT(cExpresión, nCaracteres)
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres cuyos caracteres más a la derecha se devuelven.
210
Manual de Genlis
nCaracteres Especifica el número de caracteres devueltos a partir de la expresión de caracteres. RIGHT( ) devuelve toda la expresión de caracteres si nCaracteres es mayor que la longitud de cExpresión. RIGHT( ) devuelve una cadena vacía si nCaracteres es negativo o 0.
Comentarios Los caracteres se devuelven comenzando por el último carácter de la derecha y continuando durante un número concreto de caracteres.
5.5.162. RIGHTC( ) (Función) Devuelve el número especificado de los caracteres más a la derecha de una cadena de caracteres.
Sintaxis RIGHTC(cExpresión, nCaracteres)
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres de la que se devuelven los caracteres que están más a la derecha. nCaracteres Especifica el número de caracteres devueltos a partir de la expresión de caracteres. RIGHTC( ) devuelve toda la expresión de caracteres si nCharacters supera la longitud de cExpression. RIGHTC( ) devuelve una cadena vacía si nCharacters es negativo o 0.
Comentarios RIGHTC( ) ha sido diseñado para expresiones que contienen caracteres de dos bytes. Si la expresión sólo contiene caracteres de un solo byte, RIGHTC( ) será equivalente a RIGHT( ). Los caracteres se devuelven empezando por el último carácter de la derecha y continuando por nCharacters. Esta función es útil para tratar caracteres codificados en dos bytes, en idiomas como Hiragana y Katana.
211
Manual de Genlis
5.5.163. RLOCK( ) (Función) Intenta bloquear uno o varios registros de una tabla.
Sintaxis RLOCK([nÁreaTrabajo | cAliasTabla] | [cListaNúmerosRegistros, nÁreaTrabajo | cAliasTabla])
Tipos devueltos Logical
Argumentos nÁreaTrabajo | cAliasTabla Especifica el número del área de trabajo o el alias de tabla para una tabla abierta en otra área de trabajo. Si no especifica un área de trabajo o alias, RLOCK( ) intentará bloquear el registro actual de la tabla del área de trabajo seleccionada actualmente. cListaNúmerosRegistros Especifica que RLOCK( ) intenta bloquear múltiples registros. La expresión de caracteres cListaNúmeroRegistros especifica uno o varios números de registro, separados por comas, que RLOCK( ) intenta bloquear. Por ejemplo, para intentar bloqueos de registro en los primeros 4 registros de la tabla, cListaNúmeroRegistros contendrá 1, 2, 3, 4. Para bloquear múltiples registros, es necesario activar SET MULTILOCKS e incluir el número del área de trabajo (nÁreaTrabajo) o el alias (cAliasTabla) de la tabla en la que intenta bloquear los registros. También puede bloquear varios registros moviendo el puntero de registro al registro que quiera bloquear, ejecutando RLOCK( ) o LOCK( ) y repitiendo luego este proceso para registros adicionales. En Genlis, puede especificar 0 como número de registro. Especificar 0 le permite intentar bloquear el encabezado de la tabla. Importante Mantenga el encabezado de la tabla bloqueado por el periodo de tiempo mínimo porque otros usuarios no pueden agregar registros a la tabla cuando el encabezado está bloqueado. Libere el bloqueo del encabezado de la tabla con UNLOCK RECORD 0, UNLOCK o UNLOCK ALL. Si todos los registros especificados en cListaNúmerosRegistros logran bloquearse, RLOCK( ) devolverá verdadero (.T.). Si uno o más de los registros especificados en cListaNúmerosRegistros no puede bloquearse, RLOCK( ) devuelve falso (.F.) y no se bloqueará ningún registro. En cualquier caso, los bloqueos de registro existentes, permanecerán en vigor. El bloqueo de varios registros es un proceso aditivo: al situar bloqueos de registro adicionales no liberará los bloqueos de registro existentes. Desde una perspectiva de rendimiento, es siempre más rápido bloquear la tabla completa que bloquear un número de registros, aunque sea pequeño.
Comentarios RLOCK( ) es idéntico a LOCK( ).
212
Manual de Genlis
Si se logra establecer el bloqueo o los bloqueos, RLOCK( ) devuelve verdadero (.T.). Los registros bloqueados están disponibles para acceso tanto de lectura como de escritura por el usuario que efectuó los bloqueos y estarán disponibles únicamente para acceso de lectura para todos los demás usuarios de la red. La ejecución de RLOCK( ) no garantiza que consigan efectuarse el o los bloqueos que se intenten. No podrá efectuar un bloqueo sobre un registros que ya esté bloqueado por otro usuario o sobre una tabla bloqueada por otro usuario. Si no pueden efectuarse el o los bloqueos por alguna razón, RLOCK( ) devolverá falso (.F.). De forma predeterminada, RLOCK( ) hace un intento de bloquear un registro, Utilice SET REPROCESS para reintentar automáticamente un bloqueo de registro cuando falle el primer intento. SET REPROCESS controla el número de intentos de bloqueo o durante cuanto tiempo se harán intentos de bloqueo cuando fracasa el primer intento. SET MULTILOCKS determina si puede bloquear varios registros de una tabla. Si MULTILOCKS está OFF (el valor predeterminado), únicamente puede bloquear un solo registro de una tabla. Si MULTILOCKS está ON, podrán bloquearse múltiples registros de una tabla. Un registro de una tabla puede desbloquearlo únicamente el usuario que lo bloqueó. Los bloqueos de registro pueden liberarse ejecutando UNLOCK, cerrando la tabla o saliendo de Genlis. UNLOCK puede utilizarse para liberar los bloqueos de registro del área de trabajo actual, un área de trabajo concreta o de todas las áreas de trabajo. Alternando MULTILOCKS de ON a OFF o de OFF a ON, se realiza UNLOCK ALL implícitamente: se liberarán todos los bloqueos de registro de todas las áreas de trabajo. Las tablas pueden cerrase con USE, CLEAR ALL o CLOSE DATABASES.
5.5.164. ROUND( ) (Función) Devuelve una expresión numérica redondeada a un número especificado de cifras decimales.
Sintaxis ROUND(nExpresión, nLugaresDecimales)
Tipos devueltos Numeric
Argumentos nExpresión Especifica la expresión numérica cuyo valor desea redondear. nDecimalPlaces Especifica el número de cifras decimales con los que se redondea nExpresión. Si nLugaresDecimales es negativo, ROUND( ) devuelve un número entero que contiene nLugaresDecimales ceros a la izquierda del separador decimal. Por ejemplo, si nLugaresDecimales es –2, la primera y la segunda cifra a la izquierda del separador decimal del valor serán cero.
213
Manual de Genlis
Comentarios El valor devuelto por ROUND( ) tiene el mismo número de lugares decimales que nLugaresDecimales. ROUND( ) pasa por alto el número de cifras decimales especificado por SET DECIMALS.
5.5.165. RTOD( ) (Función) Convierte radianes en grados.
Sintaxis RTOD(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica la expresión numérica que representa los radianes que RTOD( ) convierte en grados.
Comentarios RTOD( ) convierte el valor (en radianes) de una expresión numérica a su valor equivalente en grados. RTOD( ) es útil cuando se trabaja con funciones trigonométricas de Genlis tales como COS( ), SIN( ), TAN( ). Utilice DTOR( ) para convertir grados en radianes.
5.5.166. RTRIM( ) (Función) Devuelve la expresión de caracteres especificada con todos los espacios en blanco finales recortados.
Sintaxis RTRIM(cExpresión)
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres de la cual se deben recortar los espacios en blanco finales.
214
Manual de Genlis
Comentarios RTRIM( ) puede utilizarse para asegurarse de que se eliminan los espacios en blanco de los datos introducidos por un usuario. La función RTRIM( ) es idéntica a TRIM( ).
5.5.167. SCAN ... ENDSCAN (Comando) Mueve el puntero de registro por la tabla seleccionada y ejecuta un bloque de comandos para cada uno de los registros que cumple las condiciones especificadas.
Sintaxis SCAN ENDSCAN
Comentarios SCAN avanza automáticamente el puntero de registro al siguiente registro y ejecuta el bloque de comandos.
5.5.168. SCATTER (Comando) Copia datos del registro actual a un conjunto de variables de memoria o a una matriz.
Sintaxis SCATTER [FIELDS ListaNombresCampos | FIELDS LIKE Estructura | FIELDS EXCEPT Estructura] [MEMO] TO NombreMatriz | TO NombreMatriz BLANK | MEMVAR | MEMVAR BLANK | NAME NombreObjeto[BLANK]
Argumentos FIELDS ListaNombresCampos Especifica los campos que desea transferir a las variables de memoria o a la matriz. Si omite FIELDS ListaNombresCampos, se transferirán todos los campos. La lista de campos puede contener campos memo si sigue la lista de campos con la palabra clave MEMO. Los campos de tipo general e imagen se pasan por alto siempre en SCATTER, aunque incluya la palabra clave MEMO. FIELDS LIKE Estructura | FIELDS EXCEPT Estructura Puede transferir selectivamente campos a variables de memoria o a una matriz si incluye la cláusula LIKE o EXCEPT o ambas. Si incluye LIKE Estructura, los campos que coinciden con Estructura se transfieren a las
215
Manual de Genlis
variables de memoria o a la matriz. Si incluye EXCEPT Estructura, se transfieren a las variables de memoria o a la matriz todos los campos que coinciden con Estructura. Estructura acepta caracteres comodín. Por ejemplo, para transferir todos los campos que empiezan por las letras A y P a las variables de memoria o a la matriz, use: SCATTER FIELDS LIKE A*,P* TO mimatriz La cláusula LIKE puede combinarse con la cláusula EXCEPT: SCATTER FIELDS LIKE A*,P* EXCEPT PARTNO* TO mimatriz MEMO Especifica que la lista de campos contiene uno o varios campos memo. De forma predeterminada, los campos memo se pasan por alto en SCATTER. Debe tener memoria suficiente para diseminar campos memo grandes en variables de memoria o en una matriz. Genlis mostrará un mensaje de error si no tiene suficiente memoria. Si un campo memo es demasiado grande y no cabe en memoria, ni ése ni los demás campos memo de la lista de campos se diseminarán. Si un campo memo no se disemina, su variable de memoria o elemento de matriz tomará el valor falso (.F.). TO NombreMatriz Especifica qué matriz se copia el contenido de los registros. Comenzando por el primer campo, SCATTER copia en orden secuencial el contenido de cada campo en cada elemento de matriz. Si la matriz tiene más elementos que el número de campos, los elementos de matriz sobrantes no se modificarán. Si la matriz no existe, o si tiene menos elementos que el número de campos, se creará automáticamente una nueva matriz. Los elementos de matriz tendrán el mismo tamaño y los mismos tipos de datos que los campos correspondientes. TO NombreMatriz BLANK Crea una matriz con elementos vacíos que tendrán el mismo tipo y tamaño que los campos de la tabla MEMVAR Disemina los datos en un conjunto de variables de memoria en lugar de en una matriz SCATTER crea una variable de memoria por cada campo de la tabla y rellena cada variable de memoria con datos del campo correspondiente del registro actual, asignando a la variable el mismo nombre, tipo y tamaño que su campo. Se crea una variable de memoria para cada campo en la lista de campos, si se incluye una lista de campos. Incluya delante del nombre de la variable de memoria el calificador M. para referirse a una variable de memoria que tenga el mismo nombre que un campo de la tabla actual. Importante No incluya TO con MEMVAR. Si incluye TO Genlis creará una matriz llamada MEMVAR. MEMVAR BLANK Crea un conjunto de variables de memoria vacías. A cada variable de memoria se le asignará el mismo nombre, tipo de dato y tamaño que su campo. Si se incluye una lista de campos, se creará una variable de memoria para cada campo de la lista de campos. NAME NombreObjeto [BLANK]
216
Manual de Genlis
Crea un objeto cuyas propiedades tienen los mismos nombres que los campos de la tabla. Si no se incluye la palabra clave BLANK, los valores posibles de cada una de las propiedades del objeto son el contenido de los campos de la tabla. Si se incluye la palabra clave BLANK, las propiedades están vacías (vea EMPTY( ) para obtener una descripción de qué contienen las propiedades vacías, en base al tipo de campo correspondiente). No se crean propiedades para los campos de tipo memo o general de la tabla. Para hacer referencia a una propiedad en un objeto que tiene el mismo nombre que una tabla abierta, escriba delante del nombre de la propiedad el cualificador M. Por ejemplo: USE customer SCATTER NAME customer ? customer.company && Devuelve el valor de la tabla ? M.customer.company && Devuelve el valor de propiedad del objeto
Comentarios SCATTER y COPY TO ARRAY son parecidos. COPY TO ARRAY copia múltiples registros en una matriz, mientras que SCATTER copia solamente un registro en una matriz o en un conjunto de variables de memoria. SCATTER crea automáticamente la matriz o las variables de memoria en caso de que no existan todavía. Utilice GATHER para copiar variables de memoria o elementos de matriz a registros de tabla.
5.5.169. SEC( ) Función Devuelve los segundos de una expresión DateTime.
Sintaxis SEC(tExpresión)
Tipo devuelto Numeric
Argumentos tExpresión Especifica la expresión DateTime de la que SEC( ) devuelve los segundos. Si tExpresión sólo contiene una fecha y no una hora, Genlis agregará la hora predeterminada de medianoche (12:00:00 A.M.) a tExpresión.
5.5.170. SECONDS( ) (Función) Devuelve el número de segundos que han transcurrido desde la medianoche.
217
Manual de Genlis
Sintaxis SECONDS( )
Tipos devueltos Numeric
Comentarios SECONDS( ) devuelve un valor numérico en formato decimal, con una resolución de 1 milisegundo. Si está ejecutando Windows NT, la resolución será de 10 milisegundos.
5.5.171. SEEK (Comando) Busca en una tabla la primera aparición de un registro cuya expresión clave de índice coincida con una expresión general, y después mueve el puntero de registro al registro coincidente.
Sintaxis SEEK eExpresión [ORDER nNúmeroÍndice | NombreArchivoÍndiceIDX | [TAG] NombreEtiqueta [OF NombreArchivoCDx] [ASCENDING | DESCENDING]] [IN nÁreaTrabajo | cAliasTabla]
Argumentos eExpresión Especifica la expresión de índice que quiere que busque SEEK. eExpresión puede ser el valor nulo. ORDER nNúmeroÍndice Especifica el número del archivo o etiqueta de índice que se utiliza para buscar la clave de índice. nNúmeroÍndice hace referencia a los archivos de índice tal y como están incluidos en USE o SET INDEX. Los archivos .idx abiertos se numeran primero en el orden en que aparecen en USE o SET INDEX. A continuación se numeran las etiquetas del archivo .cdx estructural (si existe) en el orden en que se crearon. Por último, se numeran las etiquetas de cualquier archivo .cdx independiente abierto en el orden en que se crearon. ORDER NombreArchivoÍndiceIDX Especifica un archivo .idx utilizado para buscar la clave de índice. ORDER [TAG] NombreEtiqueta [OF NombreArchivoCDX] Especifica una etiqueta de un archivo .cdx que se utiliza para buscar la clave de índice. El nombre de la etiqueta de índice puede proceder de un archivo .cdx estructural o de cualquier archivo .cdx independiente abierto.
218
Manual de Genlis
Si existen nombres de etiqueta idénticos en archivos .cdx independientes abiertos .cdx, use OF NombreArchivoCDX para especificar el archivo .cdx que contiene la etiqueta. Nota El archivo .IDX tiene preferencia en caso de que existan nombres de etiquetas y archivos .IDX duplicados. ASCENDING Especifica que se busca en la tabla en orden ascendente. DESCENDING Especifica que se busca en la tabla en orden descendente. IN nÁreaTrabajo Especifica el número del área de trabajo de la tabla donde se busca. IN cAliasTabla Especifica el alias de la tabla donde se busca. Si omite IN nÁreaTrabajo y IN cAliasTabla, se busca en la tabla del área de trabajo seleccionada actualmente.
Comentarios Puede utilizar SEEK únicamente con tablas indexadas y puede buscar únicamente por la expresión clave índice. La coincidencia debe ser exacta a no ser que SET EXACT esté OFF. Si SEEK encuentra un registro con una clave de índice coincidente, RECNO( ) devolverá el número de registro del registro coincidente, FOUND( ) devolverá verdadero (.T.) y EOF( ) devolverá falso (.F.). Si no encuentra ninguna clave coincidente, RECNO( ) devolverá el número de registros de la tabla más 1, FOUND( ) devolverá falso (.F.) y EOF( ) devolverá verdadero (.T.). Si SET NEAR está ON, el puntero de registro se posicionará inmediatamente después del registro con la clave de índice coincidente más cercana. Si SET NEAR está OFF el puntero de registro se posicionará al final del archivo. En cualquier caso, RECNO(0) devolverá el número de registro del registro más cercano.
5.5.172. SEEK( ) (Función) Busca en una tabla indizada la primera aparición de un registro cuya clave de índice coincida con una expresión especificada. SEEK( ) devuelve un valor lógico que indica si la búsqueda ha tenido éxito.
Sintaxis SEEK(eExpresión [, nÁreaTrabajo | cAliasTabla [, nNúmeroÍndice | cNombreArchivoÍndiceIDX | cNombreEtiqueta]])
Tipos devueltos
219
Manual de Genlis
Logical
Argumentos eExpresión Especifica la expresión clave de índice que quiere que SEEK( ) busque nÁreaTrabajo Especifica el número del área de trabajo de la tabla en la que se está buscando la clave de índice. cAliasTabla Especifica el alias de la tabla en la que se busca. Si omite nÁreaTrabajo y cAliasTabla, se busca en la tabla del área de trabajo seleccionada actualmente. nNúmeroÍndice Especifica el número del archivo o etiqueta de índice que se utiliza para buscar la clave de índice. nNúmeroÍndice hace referencia a los archivos de índice tal y como aparecen en USE o SET INDEX. Primero se numeran los archivos de índice .idx abiertos en el orden en el que aparecen en USE o SET INDEX. A continuación se enumeran las etiquetas del archivo .cdx estructural (si existe) en el orden en el que se crearon. Por último, se enumeran las etiquetas de cualquier archivo .cdx independiente abierto en el orden en que se crearon. cNombreArchivoÍndiceIDX Especifica un archivo .idx que se utiliza para buscar la clave de índice. cNombreEtiqueta Especifica una etiqueta de un archivo .cdx que se utiliza para buscar la clave de índice. El nombre de etiqueta puede proceder de un archivo .cdx estructural o de cualquier archivo .cdx independiente abierto. Nota El archivo .idx tiene preferencia si existen nombres duplicados de etiquetas y archivos .idx.
Comentarios Solamente puede utilizar SEEK( ) con una tabla que tenga un conjunto de orden de índice, y solamente puede buscar una clave de índice. La coincidencia debe ser exacta a menos que SET EXACT esté ajustado como OFF. Si se encuentra una coincidencia, SEEK( ) devolverá verdadero (.T.) y el puntero de registro se situará en el registro coincidente. Si no se encuentra ninguna coincidencia, SEEK( ) devolverá falso (.F.) y el puntero de registro se desplazará hasta el final del archivo. Ejecutar SEEK( ) equivale a ejecutar SEEK y FOUND( ) en sucesión. Si omite los argumentos nNúmeroÍndice, NombreArchivoÍndiceIDX y cNombreEtiqueta, SEEK( ) utiliza el índice o la etiqueta de índice de control principal para buscar la clave de índice.
220
Manual de Genlis
5.5.173. SELECT - SQL (Comando) Recupera datos de una o más tablas.
Sintaxis SELECT [ALL | DISTINCT] [TOP nExpresión [PERCENT]] [Alias.] Elemento_Selección [AS Nombre_Columna] [, [Alias.] Elemento_Selección [AS Nombre_Columna] ...] FROM [FORCE] [NombreBaseDatos!]Tabla [[AS] Local_Alias] [[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN NombreBaseDatos!]Tabla [[AS] Local_Alias] [ON CondiciónCombinación …] [[INTO Destino] | [TO FILE NombreArchivo [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]] [PREFERENCE NombrePreferencia] [NOCONSOLE] [PLAIN] [NOWAIT] [WHERE CondiciónCombinación [AND CondiciónCombinación ...] [AND | OR CondiciónFiltro [AND | OR CondiciónFiltro ...]]] [GROUP BY ColumnaGrupo [, ColumnaGrupo ...]] [HAVING CondiciónFiltro] [UNION [ALL] SELECTCommand] [ORDER BY Elemento_Orden [ASC | DESC] [, Elemento_Orden [ASC | DESC] ...]]
Argumentos SELECT Especifica los campos, constantes y expresiones que se mostrarán en el resultado de la consulta. ALL De forma predeterminada, se muestran todas la filas del resultado de la consulta. DISTINCT Excluye duplicados de cualquier fila del resultado de la consulta. Nota Puede utilizar DISTINCT únicamente una vez por cláusula SELECT. TOP nExpresión [PERCENT] Especifica que el resultado de la consulta contenga un número determinado de filas o un porcentaje de filas en el resultado de la consulta. Es necesario incluir una cláusula ORDER BY si incluye la cláusula TOP. La cláusula ORDER BY especifica las columnas en las que la cláusula TOP determinará el número de filas que se va a incluir en el resultado de la consulta.
221
Manual de Genlis
Puede especificar desde 1 a 32,767 filas. Las filas de valores idénticos para las columnas especificadas en la cláusula ORDER BY se incluyen en el resultado de la consulta. A partir de entonces, si especifica 10 para nExpr, el resultado de la consulta podrá obtener más de 10 filas si hay más de 10 filas con valores idénticos para las columnas especificadas en la cláusula ORDER BY. Si se incluye la palabra clave PERCENT, se redondeará al número entero más alto el número de columnas devuelto en el resultado. Los valores permitidos para nExpr cuando se incluye la palabra clave PERCENT son 0.01 a 99.99. Alias. Califica nombres de elementos coincidentes. Cada elemento que especifique con Elemento_Selección genera una columna de los resultados de la consulta. Si dos o más elementos tienen el mismo nombre, incluya el alias de la tabla y un punto antes del nombre del elemento para impedir la duplicación de las columnas. Elemento_Selección especifica un elemento a incluir en el resultado de la consulta. Un elemento puede ser uno de los siguientes: El nombre de un campo de una tabla de la cláusula FROM. Una constante especificando que el mismo valor constante ha de aparecer en cada fila del resultado de la consulta. Una expresión que puede ser el nombre de una función definida por el usuario (FDU). AS Nombre_Columna Especifica el título de una columna en el resultado de la consulta. Esta opción resulta muy útil cuando Elemento_Selección es una expresión o contiene una función de campo y desea dar un nombre significativo a la columna. Nombre_Columna puede ser una expresión pero no puede contener caracteres (por ejemplo, espacios) que no estén permitidos para nombres de campos de tablas. FROM Enumera las tablas que contienen los datos que ha obtenido la consulta. Si no hay ninguna tabla abierta, Genlis mostrará el cuadro de diálogo Abrir para permitirle especificar la ubicación del archivo. Una vez abierta, la tabla permanecerá abierta cuando la consulta se haya terminado. FORCE especifica que las tablas se combinarán en el orden de aparición en la cláusula FROM. Si se omite FORCE, Genlis intentará optimizar la consulta. Sin embargo, es posible que la consulta se ejecute más rápido si se incluye la palabra clave FORCE para desactivar la optimización de consultas de Genlis. NombreBaseDatos! Especifica el nombre de una base de datos inactiva que contiene la tabla. Es necesario incluir el nombre de la base de datos que contiene la tabla en caso de que no sea la base de datos activa. Incluya el delimitador de signo de exclamación (!) después del nombre de la base de datos y antes del nombre de la tabla. Alias_Local Especifica un nombre temporal para la tabla indicada en Tabla. Si especifica un alias local, debe utilizar el alias local en lugar de la tabla a través de todo el SELECT.
222
Manual de Genlis
INNER JOIN especifica que el resultado de la consulta contenga sólo filas para una tabla con la que coincidan una o varias filas en otra tabla. LEFT [OUTER] JOIN especifica que el resultado de la consulta contenga todas las filas de la tabla a la izquierda de la palabra clave JOIN y sólo las filas que concuerden procedentes de la tabla a la derecha de la palabra clave JOIN. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinación externa. RIGHT [OUTER] JOIN especifica que el resultado de la consulta contenga todas las filas desde la tabla hasta la derecha de la palabra clave JOIN y sólo las filas que concuerden desde la tabla hasta la izquierda de la palabra clave JOIN. La palabra clave OUTER es opcional; puede incluirse para resaltar la creación de una combinación externa. FULL [OUTER] JOIN especifica que el resultado de la consulta contenga todas las filas, concuerden o no, de ambas tablas. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinación externa. ON CondiciónCombinación especifica las condiciones según las cuales se combinan las tablas. INTO Destino Determina donde se almacenan los resultados de la consulta. Si incluye una cláusula INTO y una cláusula TO en la misma consulta, la cláusula TO se pasará por alto. Si no incluye la cláusula INTO, los resultados de la consulta se mostrarán en la ventana Examinar. Los resultados de la consulta pueden dirigirse también a la impresora o a un archivo mediante la cláusula TO. Destino puede ser uno de los siguientes: ARRAY NombreMatriz, que almacena los resultados de la consulta en una matriz de variable de memoria. Si la consulta selecciona 0 registros, la matriz no se creará. CURSOR NombreCursor [NOFILTER], que almacena los resultados de la consulta en un cursor. Si especifica el nombre de una tabla abierta, Genlis generará un mensaje de error. Después de que se ejecute SELECT, el cursor temporal permanecerá abierto y estará activo pero solamente para lectura. Una vez que cierre este cursor temporal, se borrará. Los cursores pueden existir como un archivo temporal en la unidad SORTWORK. Incluya NOFILTER para crear un cursor que se pueda usar en consultas posteriores. En versiones anteriores de Genlis, era necesario incluir una expresión o una constante adicional como un filtro para crear un cursor utilizable en consultas posteriores. Por ejemplo, la adición de un Logical verdadero como una expresión de filtro creaba una consulta utilizable en consultas posteriores: SELECT *, .T. FROM customers INTO CURSOR myquery Si se incluye NOFILTER es posible que disminuya el rendimiento de la consulta, puesto que se creará una consulta temporal en el disco. Cuando se cierre el cursor se eliminará del disco la consulta temporal. DBF | TABLE NombreTabla [DATABASE NombreBaseDatos [NAME NombreLargoTabla]] que almacena el resultado de la consulta en una tabla. Si especifica una tabla que ya esté abierta y SET SAFETY está en OFF,
223
Manual de Genlis
Genlis sobrescribirá la tabla sin previo aviso. Si no ha especificado ninguna extensión, Genlis dará una extensión .DBF a la tabla. La tabla permanecerá abierta y activa después de ejecutar SELECT. Incluya DATABASE NombreBaseDatos para especificar una base de datos a la que se agregará la tabla. Incluya NAME NombreLargoTabla para especificar un nombre largo para la tabla. Los nombres largos pueden contener un máximo de 128 caracteres y pueden utilizarse en lugar de nombres cortos en la base de datos.
TO FILE NombreArchivo Si incluye una cláusula TO pero no una cláusula INTO, podrá dirigir el resultado de la consulta a un archivo de texto ASCII llamado NombreArchivo, o a la impresora además de al escritorio o la ventana principal de Genlis. ADDITIVE anexa los resultados de la consulta al contenido existente del archivo de texto especificado en TO FILE NombreArchivo. TO PRINTER [PROMPT] dirige los resultados de la consulta a una impresora. Utilice la cláusula PROMPT opcional para que aparezca en pantalla un cuadro de diálogo antes de que empiece la impresión. En este cuadro de diálogo podrá modificar la configuración de la impresora. Los valores de la impresora modificables dependen del controlador de impresora instalado en este momento. Sitúe la palabra clave PROMPT inmediatamente después de TO PRINTER. TO SCREEN dirige los resultados de la consulta a la ventana principal de Genlis o a una ventana definida por el usuario que esté activa. PREFERENCE NombrePreferencia Si el resultado de una consulta se envía a una ventana Examinar, podrá incluir PREFERENCE para guardar los atributos y opciones de la ventana Examinar para utilizarlos después. PREFERENCE guarda los atributos de la ventana Examinar por tiempo indefinido en el archivo de recursos FOXUSER. Las preferencias pueden recuperarse en cualquier momento. Ejecutando SELECT con un NombrePreferencia de PREFERENCE, la primera vez se crea la preferencia. Ejecutando posteriormente SELECT con el mismo nombre de preferencia, se restaurará la ventana Examinar con el mismo estado de preferencia. Cuando se cierra la ventana Examinar, se actualiza la preferencia. Si sale de una ventana Examinar presionando CTRL+Q+W, no se guardarán los cambios de la ventana Examinar en el archivo de recurso. NOCONSOLE Impide que el resultado de la consulta se envíe a un archivo, a la impresora o a la ventana principal de Genlis. PLAIN Impide que aparezcan las cabeceras de las columnas al mostrar los resultados de la consulta. PLAIN puede utilizarse tanto si está presente una cláusula TO como si no. Si se incluye una cláusula TO, se pasará por alto PLAIN.
224
Manual de Genlis
NOWAIT Continúa la ejecución del programa después de abrir la ventana Examinar y de dirigir a ella los resultados de la consulta. El programa no esperará a que la ventana Examinar se cierre, sino que continuará con la ejecución de la línea de programa inmediatamente siguiente a la instrucción SELECT. Cuando se incluye TO SCREEN para dirigir los resultados hacia la ventana principal de Genlis o una ventana definida por el usuario, los resultados se detiene cuando la ventana principal de Genlis se llena con resultados de la consulta. Presione una tecla para ver el siguiente conjunto de resultados de la consulta. Si se incluye NOWAIT, los resultados de la consulta se desplazarán fuera del escritorio, la ventana principal de Genlis o una ventana definida por el usuario sin esperar a que se presione una tecla. NOWAIT se pasa por alto si se incluye con la cláusula INTO. WHERE Indica a Genlis que incluya únicamente ciertos registros en el resultado de la consulta. WHERE es necesario para recuperar datos de varias tablas. CondiciónCombinación Especifica los campos que vinculan las tablas de la cláusula FROM. Si incluye más de una tabla en una consulta, deberá especificar una condición de combinación para cada tabla después de la primera. Las condiciones de combinación múltiple deben conectarse mediante el operador AND. Cada condición de combinación tiene la forma siguiente: NombreCampo1 Comparación NombreCampo2 NombreCampo1 es el nombre de un campo de una tabla, NombreCampo2 es el nombre de un campo de otra tabla y Comparación es uno de los operadores siguientes: Operador Comparación = Igual == Exactamente igual LIKE SQL LIKE , !=, # Distinto de > Mayor que >= Mayor o igual que < Menor que = 1000 Ejemplo 3 En el Ejemplo 3 se muestra CondiciónFiltro en el formulario de NombreCampo Comparación ALL (Subconsulta) Cuando la condición de filtro incluye ALL, el campo debe cumplir la condición de comparación para todos los valores generados por la subconsulta antes de que se incluya el registro en el resultado de la consulta. company < ALL ; (SELECT company FROM customer WHERE country = "Reino Unido") Ejemplo 4 En el Ejemplo 4 se muestra CondiciónFiltro en el formulario de NombreCampo Comparación ANY | SOME (Subconsulta) Cuando la condición de filtro incluye ANY o SOME, el campo debe cumplir la condición de comparación en al menos uno de los valores generados por la subconsulta. company < ANY ; (SELECT company FROM customer WHERE country = "Reino Unido") Ejemplo 5 En el Ejemplo 5 se muestra CondiciónFiltro en el formulario de NombreCampo [NOT] BETWEEN Inicio_Rango AND Fin_Rango Este ejemplo comprueba si los valores del campo están dentro de un intervalo de valores especificado. customer.postalcode BETWEEN 90000 AND 99999 Ejemplo 6 En el Ejemplo 6 se muestra CondiciónFiltro en el formulario de [NOT] EXISTS (Subconsulta) Este ejemplo comprueba si al menos una línea cumple los criterios de la subconsulta. Cuando la condición de filtro incluye EXISTS, la condición de filtro se evalúa como verdadera (.T.) a no ser que la subconsulta sea un conjunto vacío.
226
Manual de Genlis
EXISTS ; (SELECT * FROM orders WHERE customer.postalcode =
orders.postalcode)
Ejemplo 7 En el Ejemplo 7 se muestra CondiciónFiltro en el formulario de NombreCampo [NOT] IN Conjunto_Configuración Cuando una condición de filtro incluye IN, el campo debe contener uno de los valores antes de que el registro se incluya en los resultados de la consulta. customer.postalcode NOT IN ("98052","98072","98034") Ejemplo 8 En el Ejemplo 8 se muestra CondiciónFiltro en el formulario de NombreCampo [NOT] IN (Subconsulta) Aquí, el campo debe contener uno de los valores devueltos por la subconsulta antes de que su registro se incluya en los resultados de la consulta. customer.cust_id IN ; (SELECT orders.cust_id FROM orders WHERE orders.city="Seattle") Ejemplo 9 En el Ejemplo 9 se muestra CondiciónFiltro en el formulario de NombreCampo [NOT] LIKE cExpresión customer.country NOT LIKE "Reino Unido" Esta condición de filtro busca cada uno de los campos que coinciden con cExpresión. Puede utilizar el signo de porcentaje (%) y subrayado ( _ ) como parte de cExpresión. El signo de porcentaje representa a cualquier secuencia de caracteres desconocidos en la cadena. El subrayado representa un solo carácter desconocido en la cadena. GROUP BY ColumnaGrupo [, ColumnaGrupo ...] Agrupa las filas de la consulta basándose en los valores de una o más columnas. ColumnaGrupo puede ser el nombre de un campo normal de una tabla, o un campo que incluya una función de campo SQL, o una expresión numérica indicando la posición de la columna en la tabla resultado (la columna más a la izquierda tiene el número 1). HAVING CondiciónFiltro Especifica una condición de filtro que los grupos deben satisfacer para quedar incluidos en el resultado de la consulta. HAVING debe utilizarse con GROUP BY. Puede incluir tantas condiciones de filtro como se deseen, conectadas con el operador AND u OR. También puede utilizar NOT para invertir el valor de una expresión lógica. CondiciónFiltro no puede contener una subconsulta. Una cláusula HAVING sin una cláusula GROUP BY actúa como una cláusula WHERE. Puede utilizar alias locales y funciones de campo en la cláusula HAVING. Utilice una cláusula WHERE para acelerar el rendimiento si su cláusula HAVING no contiene funciones de campo. No olvide que la cláusula HAVING debería de aparecer antes de una cláusula INTO porque, de lo contrario, se producirá un error de sintaxis. [UNION [ALL] ComandoSELECT]
227
Manual de Genlis
Combina el resultado final de una SELECT con el resultado final de otra SELECT. De forma predeterminada, UNION comprueba el resultado combinado y elimina las filas duplicadas. Puede utilizar paréntesis para combinar múltiples cláusulas UNION. Utilice la palabra clave opcional ALL para impedir que UNION elimine filas duplicadas de los resultados combinados. Las cláusulas UNION siguen las reglas siguientes: No puede utilizar UNION para combinar subconsultas. Los resultados de ambos SELECT deben tener el mismo número de columnas. Cada columna de los resultados de la consulta de un SELECT debe tener el mismo tipo de dato y anchura que su columna correspondiente en el otro SELECT. Únicamente el SELECT final puede tener una cláusula ORDER BY, que debe referirse a las columnas de los resultados por su número. Si se incluye otra cláusula ORDER BY, afectará al resultado completo. ORDER BY Elemento_Orden Ordena el resultado de la consulta basándose en los datos de una o varias columnas. Cada Elemento_Orden debe corresponder a una columna del resultado de la consulta, y puede ser uno de los siguientes: Un campo de una tabla FROM que también es un elemento de selección en la cláusula principal SELECT (no en una subconsulta). Una expresión numérica que indica la ubicación de la columna en la tabla resultante. (La columna de la izquierda es la número 1.) ASC especifica un orden ascendente para los resultados de la consulta, de acuerdo con el elemento o los elementos de orden, y es el valor predeterminado para ORDER BY. DESC especifica un orden descendente para los resultados de la consulta. Los resultados de la consulta aparecerán desordenados si no especifica un orden con ORDER BY.
Comentarios SELECT es un comando SQL que está incorporado en Genlis como cualquier otro comando de Genlis. Cuando utiliza SELECT para componer una consulta, Genlis interpreta la consulta y recupera los datos especificados de las tablas. Puede crear una consulta SELECT: En la ventana Comandos En un programa Genlis (como cualquier otro comando de Genlis) El Diseñador de consultas Cuando ejecuta SET TALK ON y ejecuta SELECT, Genlis muestra la duración de la consulta y el número de registros del resultado. _TALLY contiene el número de registros del resultado de la consulta. SELECT no respeta la condición de filtro actual especificada con SET FILTER. Una subconsulta, a la que se hace referencia en los argumentos siguientes, es un comando SELECT dentro de otro SELECT y debe incluirse entre paréntesis. Puede tener múltiples subconsultas al mismo nivel (no anidadas) en la cláusula WHERE (consulte esta sección de los argumentos). Las subconsultas pueden contener múltiples condiciones de combinación.
228
Manual de Genlis
Cuando se obtiene el resultado de una consulta, las columnas se denominarán según las siguientes reglas: Si un elemento seleccionado es un campo con un nombre único, el nombre de la columna de resultado es el nombre del campo. Si hay más de un elemento seleccionado con el mismo nombre, se anexarán un signo de subrayado y una letra al nombre de la columna. Por ejemplo, si una tabla llamada Cliente tiene un campo llamado CALLE, y una tabla llamada Empleados también tiene un campo llamado CALLE, las columnas de resultado se llamarán Extensión_A y Extensión_B (CALLE _A y CALLE _B). En el caso de un elemento seleccionado con un nombre de 10 caracteres, se truncará el nombre para anexar el símbolo de subrayado y la letra. Por ejemplo, DEPARTMENT se convertiría en DEPARTME_A. Si un elemento seleccionado es una expresión, su columna de resultado se llamará EXP_A. Cualquier otra expresión recibirá el nombre de EXP_B, EXP_C, y así sucesivamente. Si un elemento seleccionado contiene una función de campo como, por ejemplo, COUNT( ), la columna de resultado se llamará CNT_A. Si otro elemento seleccionado contiene SUM( ), su columna de resultado se llamará SUM_B. Funciones definidas por el usuario con SELECT Aunque la utilización de funciones definidas por el usuario en la cláusula SELECT ofrece unas ventajas evidentes, también debería tener en cuenta las siguientes limitaciones: Es posible que la velocidad de realización de las operaciones con SELECT se vea limitada por la velocidad a la que se ejecutan las funciones definidas por el usuario. Las manipulaciones de un gran volumen que impliquen funciones definidas por el usuario se pueden realizar mejor utilizando funciones API y funciones definidas por el usuario escritas en C o en lenguaje ensamblador. No se puede prever nada acerca de la entrada/salida de Genlis (E/S) ni del entorno de la tabla en funciones definidas por el usuario invocadas a partir de SELECT. Generalmente, no se puede saber qué área de trabajo se ha seleccionado, ni el nombre de la tabla actual, ni los nombres de los campos que se están procesando. El valor de dichas variables depende del lugar específico, dentro del proceso de optimización, en el que se invoque la función definida por el usuario. En funciones definidas por el usuario invocadas desde SELECT, no es seguro cambiar la E/S de Genlis ni el entorno de la tabla. Por norma general, los resultados son impredecibles. La única forma segura de pasar valores a funciones definidas por el usuario invocadas desde SELECT es mediante la lista de argumentos pasada a la función cuando es invocada. Si prueba y descubre una manipulación teóricamente prohibida que funciona correctamente en una versión determinada de FoxPro, eso no significa que también funcione en versiones posteriores. Salvando dichas limitaciones, las funciones definidas por el usuario son aceptables en la cláusula SELECT. Sin embargo, recuerde que la utilización de SELECT puede ralentizar el rendimiento. Las siguientes funciones de campo están disponibles para ser utilizadas con un elemento seleccionado que sea un campo o una expresión que implique a un campo: AVG(Elemento_Selección), que realiza una media de una columna de datos numéricos. COUNT(Elemento_Selección), que cuenta el número de elementos seleccionados en una columna. COUNT(*) cuenta el número de filas en el resultado de la consulta. MIN(Elemento_Selección) determina el menor valor de Elemento_Selección en una columna. MAX(Elemento_Selección) determina el mayor valor de Elemento_Selección en una columna. SUM(Elemento_Selección) que proporciona el total de la suma de una columna de datos numéricos.
229
Manual de Genlis
No se pueden probar las funciones de campo. Combinaciones Genlis acepta sintaxis de combinación de 1992 SQL ANSI, lo que le permite crear consultas que vinculen las filas en dos o más tablas mediante la comparación de los valores de campos especificados. Por ejemplo, una combinación interna selecciona filas procedentes de dos tablas sólo cuando los valores de los campos combinados son iguales. Genlis admite combinaciones anidadas. Dado que SQL se basa en la teoría de conjuntos matemática, se puede representar a cada tabla con un círculo. La cláusula ON que especifica las condiciones de la combinación determina el punto de intersección, el cual representa el conjunto de filas que coinciden. En el caso de una combinación interna, la intersección tendrá lugar en el interior o en una parte "interna" de los dos círculos. Una combinación externa incluye tanto las filas coincidentes que se han encontrado en la sección de intersección interna de las tablas, como las filas de la parte externa del círculo a la izquierda, o a la derecha, de la intersección. Importante Tenga presente la siguiente información a la hora de crear condiciones de combinación: Si incluye dos tablas en una consulta y no especifica una condición de combinación, cada registro de la primera tabla se combinará con cada registro de la segunda tabla hasta que surtan efecto las condiciones del filtro. Una consulta tal puede producir unos resultados interminables. Sea prudente al utilizar, en condiciones de combinación, funciones tales como DELETED( ), EOF( ), FOUND( ), RECCOUNT( ), y RECNO( ), que aceptan un área de trabajo o un alias opcional. La inclusión de un alias o de un área de trabajo en dichas funciones puede producir resultados inesperados. SELECT no utiliza sus áreas de trabajo; realiza lo equivalente a USE ... AGAIN. Las consultas de una única tabla que utilizan estas funciones sin un área de trabajo o un alias opcional, tendrán resultados correctos. De todas formas, las consultas de varias tablas que utilicen dichas funciones (incluso sin un área de trabajo o un alias opcional) pueden tener resultados inesperados. Sea prudente al combinar tablas que contengan campos vacíos porque Genlis concuerda campos vacíos. Por ejemplo, si combina CUSTOMER.ZIP e INVOICE.ZIP, y CUSTOMER contiene 100 códigos postales vacíos e INVOICE contiene 400 códigos postales vacíos, el resultado de la consulta contendrá 40.000 registros más, como resultado de los campos vacíos. Use la función EMPTY( ) para eliminar los registros vacíos del resultado de la consulta.
5.5.174. SELECT (Comando) Activa el área de trabajo especificada.
Sintaxis SELECT nÁreaTrabajo | cAliasTabla
Argumentos nÁreaTrabajo Especifica el área de trabajo que se va a activar. Si nÁreaTrabajo es 0, se activará el área de trabajo no utilizada cuyo número sea inferior.
230
Manual de Genlis
cAliasTabla Especifica un área de trabajo que contiene una tabla abierta para activar. cAliasTabla es el alias de la tabla abierta. También puede incluir una letra de la A a la J para que cAliasTabla active una de las diez primeras áreas de trabajo.
Comentarios De forma predeterminada, el área de trabajo número 1 está activa cuando se inicia Genlis. Nota Los campos de las tablas de cualquier área de trabajo pueden incluirse en comandos y funciones de Genlis. Utilice los formatos siguientes para acceder a los campos de una tabla abierta en un área de trabajo distinta de la actual: alias.campo o alias -> campo.
5.5.175. SELECT( ) (Función) Devuelve el número del área de trabajo actual o del área de trabajo no utilizada cuyo número sea mayor.
Sintaxis SELECT([ 0 | 1 | cAliasTabla ])
Tipos devueltos Numeric
Argumentos 0 Especifica que SELECT( ) devolverá el número del área de trabajo actual. 1 Especifica que SELECT( ) devolverá el número del área de trabajo no utilizada cuyo número sea mayor. cAliasTabla Especifica el alias de la tabla cuya área de trabajo devuelve SELECT( ).
Comentarios SELECT( ) devuelve el número del área de trabajo actual si SET COMPATIBLE está a OFF. Si SET COMPATIBLE está a ON, SELECT( ) devolverá el número del área de trabajo no utilizada cuyo número sea mayor. Un área de trabajo puede seleccionarse (activarse) con SELECT.
231
Manual de Genlis
5.5.176. SIGN( ) (Función) Devuelve el valor numérico 1, –1 ó 0 si la expresión numérica especificada da como resultado un valor positivo, negativo o 0, respectivamente.
Sintaxis SIGN(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica la expresión numérica que evalúa SIGN( ). SIGN( ) devuelve 1 si nExpresión da como resultado un número positivo, –1 si nExpresión da como resultado un número negativo y 0 si nExpresión da como resultado 0.
5.5.177. SIN( ) (Función) Devuelve el seno de un ángulo.
Sintaxis SIN(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica el ángulo cuyo seno devuelve SIN( ). nExpresión puede asumir cualquier valor y el valor devuelto por SIN( ) varía entre –1 y 1. Nota nExpresión se da en radianes. Utilice DTOR( ) para convertir un ángulo de grados a radianes. El número de lugares decimales mostrados por SIN( ) puede especificarse con SET DECIMALS.
232
Manual de Genlis
5.5.178. SKIP (Comando) Mueve el puntero de registro hacia adelante o hacia atrás en una tabla.
Sintaxis SKIP [nRegistros] [IN nÁreaTrabajo | cAliasTabla]
Argumentos nRegistros Especifica el número de registros que hay que mover el puntero. Si ejecuta SKIP sin nRegistros, el puntero avanzará al siguiente registro. El puntero de registro se mueve hacia el final del archivo nRegistros si nRegistros tiene un valor positivo. El puntero de registro se moverá hacia el principio del archivo nRegistros si nRegistros tiene un valor negativo. Si el puntero de registro está situado en el último registro de una tabla y se ejecuta SKIP sin argumentos, RECNO( ) devolverá un valor superior en uno al número de registros de la tabla y EOF( ) devolverá verdadero (.T.). Si el puntero de registro está colocado en el primer registro de una tabla y se ejecuta SKIP -1, RECNO( ) devolverá 1 y EOF( ) devolverá (.T.). IN nÁreaTrabajo | cAliasTabla Mueve el puntero de registro en una tabla de un área de trabajo específica. nÁreaTrabajo especifica el número del área de trabajo y cAliasTabla especifica el alias de una tabla o de un área de trabajo.
Comentarios Si la tabla tiene una etiqueta de índice de control principal o un archivo de índice, SKIP mueve el puntero de registro al registro determinado por la secuencia de índice.
5.5.179. SORT (Comando) Ordena los registros de la tabla seleccionada actualmente y envía los registros ordenados a una tabla nueva.
Sintaxis SORT TO NombreTabla ON NombreCampo1 [/A | /D] [/C] [, NombreCampo2 [/A | /D] [/C] ...] [ASCENDING | DESCENDING] [Alcance] [FOR lExpresión1] [WHILE lExpresión2] [FIELDS ListaNombresCampo | FIELDS LIKE Estructura
233
Manual de Genlis
| FIELDS EXCEPT Estructura] [NOOPTIMIZE]
Argumentos NombreTabla Especifica el nombre de la nueva tabla que contiene los registros ordenados. Genlis supone una extensión de archivo .dbf para las tablas. La extensión .dbf se asigna automáticamente si el nombre de archivo incluido no tiene ninguna extensión. ON NombreCampo1 Especifica el campo de la tabla seleccionada actualmente en el que se basa el orden. El contenido y el tipo de dato del campo determinará el orden de los registros de la tabla. De forma predeterminada, la ordenación se hará en sentido ascendente. No podrá ordenar por campos de tipo Memo o General. El ejemplo siguiente ordena una tabla por el campo cust_id. Se abre customer y se ordena en una tabla nueva llamada temp. Los registros de temp se ordenan por el campo cust_id. CLOSE DATABASES OPEN DATABASE (HOME(2) + 'data\testdata') USE customer && Abre la tabla Customer. CLEAR LIST FIELDS company, cust_id NEXT 3 SORT TO temp ON cust_id USE temp LIST FIELDS company, cust_id NEXT 3 WAIT WINDOW 'Ahora está ordenado por CUST_ID' NOWAIT Puede incluir nombres de campo adicionales(NombreCampo2, NombreCampo3) para ordenar aun más la tabla. El primer campo NombreCampo1 es el campo de ordenación principal, el segundo campo NombreCampo2 es el campo de ordenación secundario, etc. [/A | /D] [/C] Para cada uno de los campos que incluya en la ordenación puede especificar un sentido ascendente o descendente. La opción /A especifica orden ascendente. La opción /D especifica orden descendente. /A o /D pueden incluirse con cualquier tipo de campo. De forma predeterminada, el sentido de ordenación de los campos alfanuméricos distingue entre mayúsculas y minúsculas. Si incluye la opción /C después del nombre de un campo alfanumérico, se ignorará la diferencia. Puede combinar la opción /C con la opción /(A o /D. Por ejemplo, /AC o /DC. En el ejemplo siguiente se crea una tabla nueva denominada clientes. La tabla orders se ordena según el campo order_date en orden ascendente y según el campo freight en orden descendente USE orders SORT TO clientes ON order_date/A,freight/D ASCENDING Especifica un sentido de ordenación para todos los campos que no vayan seguidos de la opción /D. DESCENDING Especifica un sentido de orden descendente para todos los campos que no vayan seguidos de la opción /A.
234
Manual de Genlis
Si no incluye ASCENDING o DESCENDING, asumirá el sentido de ordenación predeterminado, que es ascendente. Alcance Especifica un intervalo de registros que desea ordenar. Las cláusulas de alcance son: ALL, NEXT nRegistros, RECORD nNúmeroRegistro y REST. El alcance predeterminado de SORT es ALL (todos los registros). FOR lExpresión1 Especifica que solamente se incluyen en la ordenación los registros de la tabla actual para los cuales la condición lógica lExpresión1 da como resultado verdadero (.T.). Incluir FOR le permite ordenar registros condicionalmente al filtrar los registros no deseados. Si lExpresión1 es una opción optimizable, Rushmore optimizará un comando SORT ... FOR. Para obtener un mejor rendimiento, utilice una opción optimizable en la cláusula FOR. WHILE lExpresión2 Especifica una condición según la cual los registros de la tabla actual se incluirán en la ordenación hasta que la expresión lógica lExpresión2 los califique de verdaderos (.T.). FIELDS ListaNombresCampo Especifica los campos procedentes de la tabla original que se van a incluir en la nueva tabla creada por SORT. Si no se incluye la cláusula FIELDS, se incluirán todos los campos de la tabla en la nueva tabla. FIELDS LIKE Estructura Especifica que los campos de la tabla original que coincidan con la estructura de campo Estructura se incluyan en la nueva tabla creada por SORT. FIELDS EXCEPT Estructura Especifica que todos los campos excepto los que coincidan con la estructura de campo Estructura se incluyen en la nueva tabla creada por SORT. La estructura de campo Estructura admite caracteres comodín. Por ejemplo, para especificar que se incluyen en la nueva tabla todos los campos que comienzan por las letras A y P, utilice la instrucción siguiente: SORT TO mitabla ON micampo FIELDS LIKE A*,P* La cláusula LIKE se puede combinar con la cláusula EXCEPT: SORT TO mitabla ON micampo FIELDS LIKE A*,P* EXCEPT PARTNO* NOOPTIMIZE Desactiva la optimización Rushmore de SORT.
Comentarios El orden en que aparecerán los registros de la nueva tabla viene determinado por uno o más campos de la tabla actual.
235
Manual de Genlis
Importante Asegúrese de que tiene espacio suficiente en disco para la tabla nueva y para los archivos temporales de trabajo creados durante la ordenación. El espacio en disco necesario para realizar una ordenación puede ser, como máximo, tres veces el tamaño del archivo origen. La cantidad de espacio disponible en disco puede determinarse con DISKSPACE( ) y SYS(2020). Si agota el espacio del disco durante una ordenación, Genlis mostrará un mensaje de error y se eliminarán los archivos temporales. Los campos de tipo Character que contienen números y espacios puede que no se ordenen en el sentido que usted espera. Los campos numéricos se llenan de derecha a izquierda, con espacios vacíos a la izquierda. Por el contrario, los campos alfanuméricos se llenan de izquierda a derecha, con espacios vacíos a la derecha. Por ejemplo, si dos registros de una tabla contienen un campo alfanumérico con 1724 en un registro y 18 en el otro y la tabla está ordenada por este campo en sentido ascendente, el registro que contiene 1724 aparecerá antes que el que contiene 18. Esto se debe a que Genlis lee cada carácter de los campos alfanuméricos de izquierda a derecha y como 17 (en 1724) es menor que 18 (en 18), coloca primero 1724. Para evitar este problema, rellene los números bajos con ceros por la izquierda (0018) o defina el campo como numérico.
5.5.180. SOUNDEX( ) (Función) Devuelve la representación fonética de una expresión de caracteres especificada.
Sintaxis SOUNDEX(cExpresión)
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres que va a evaluar SOUNDEX( ).
Comentarios SOUNDEX( ) devuelve una representación fonética de una expresión de caracteres. Al comparar los resultados que devuelve SOUNDEX( ) de dos expresiones de caracteres, puede determinar si las dos expresiones son similares fonéticamente, es decir, suenan de forma parecida. Esto puede ser útil al buscar registros duplicados en una tabla. SOUNDEX( ) no distingue mayúsculas de minúsculas y, generalmente, descarta las vocales.
236
Manual de Genlis
5.5.181. SPACE( ) (Función) Devuelve una cadena de caracteres compuesta de un número especificado de espacios.
Sintaxis SPACE(nEspacios)
Tipos devueltos Character
Argumentos nEspacios Especifica el número de espacios que devolverá SPACE( ). El valor máximo de nEspacios está limitado únicamente por la memoria en Genlis.
5.5.182. SQRT( ) (Función) Devuelve la raíz cuadrada de la expresión numérica especificada.
Sintaxis SQRT(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica la expresión numérica que se va a evaluar con SQRT( ). nExpresión no puede ser un número negativo.
Comentarios El número de lugares decimales del valor devuelto por SQRT( ) es la mayor configuración actual de lugares decimales y el número de lugares decimales contenidos en nExpresión. La configuración actual de lugares decimales se especifica con SET DECIMALS.
237
Manual de Genlis
5.5.183. STR( ) (Función) Devuelve el carácter equivalente a una expresión numérica especificada.
Sintaxis STR(nExpresión [, nLongitud [, nLugaresDecimales]])
Tipos devueltos Character
Argumentos nExpresión Especifica la expresión numérica evaluada por STR( ). nLongitud Especifica la longitud de la cadena de caracteres devuelta por STR( ). La longitud incluye un carácter para la coma decimal y un carácter para cada dígito a la derecha de la coma decimal. STR( ) llena la cadena de caracteres con espacios al principio si especifica una longitud mayor que el número de dígitos a la izquierda de la coma decimal. STR( ) devuelve una cadena de caracteres, que indica desbordamiento numérico, si especifica una longitud inferior al número de dígitos a la izquierda de la coma decimal. Si nExpresión es del tipo Numeric o Float, STR( ) devuelve un valor con notación científica si nLongitud es menor que el número de dígitos de nExpresión. Si nExpresión es un entero, STR( ) devuelve una cadena de asteriscos, que indica desbordamiento numérico, si nLongitud es menor que el número de dígitos de nExpresión. Si no se incluye nLongitud, la longitud de la cadena de caracteres cambia de forma predeterminada a 10 caracteres. nLugaresDecimales Especifica el número de lugares decimales de la cadena de caracteres devuelta por STR( ). Puede incluir nLongitud para especificar el número de lugares decimales. Si especifica menos lugares decimales de los que están en nExpresión, el valor de retorno se redondea. Si no se incluye nLugaresDecimales, el valor predeterminado para lugares decimales es cero de forma predeterminada.
5.5.184. STRCONV( ) (Función) Convierte las expresiones de caracteres de un byte, de dos bytes, UNICODE y representaciones específicas de configuraciones regionales.
238
Manual de Genlis
Sintaxis STRCONV(cExpresión, nValorConversión [, nIdLocal])
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres que STRCONV( ) convierte. nValorConversión Especifica el tipo de conversión. En la siguiente tabla figuran los valores de nValorConversión y el tipo de conversión realizada. nValorConversión Conversión 1 Convierte los caracteres de un byte de cExpresión en caracteres de dos bytes. 2 Convierte los caracteres de dos bytes de cExpresión en caracteres de un byte. 3 Convierte los caracteres Hiragana de dos bytes de cExpresión en caracteres Katakana de dos bytes. 4 Convierte los caracteres Katakana de dos bytes de cExpresión en caracteres Hiragana de dos bytes. 5 Convierte los caracteres de dos bytes en UNICODE (caracteres anchos). 6 Convierte los caracteres UNICODE (anchos) en caracteres de dos bytes. 7 Convierte cExpresión en minúsculas específicas de la configuración regional. 8 Convierte cExpresión en mayúsculas específicas de la configuración regional. nIdLocal Especifica el Id. local que se utilizará para la conversión. Si nIdLocal no es válido o no es compatible con el equipo, se genera el error "Id. local no válido". Si se omite nIdLocal, se usa de forma predeterminada el Id. local del sistema.
Comentarios Esta función es útil para manipular juegos de caracteres de doble byte para idiomas como el Hiragana y el Katakana.
5.5.185. STRTRAN( ) (Función) Busca en una expresión de caracteres o en un campo memo las apariciones de una segunda expresión de caracteres o campo memo y, luego, reemplaza cada aparición con una tercera expresión de caracteres o campo memo.
Sintaxis
239
Manual de Genlis
STRTRAN(cBuscado, cBuscar [, cReemplazar] [, nApariciónInicial] [, nNúmeroApariciones])
Tipos devueltos Character
Argumentos cBuscado Especifica la expresión de caracteres en la que hay que buscar. cBuscado puede ser un campo memo. cBuscar Especifica la expresión de caracteres que se busca en cBuscado. La búsqueda distingue mayúsculas y minúsculas. cBuscar puede ser un campo memo. cReemplazar Especifica la expresión de caracteres que sustituye cada aparición de cBuscar en cBuscado. Si se omite cReemplazar, las apariciones de cBuscar se sustituyen por la cadena vacía. nApariciónInicial Especifica qué aparición de cBuscar es la primera que se sustituirá. Por ejemplo, si nApariciónInicial es 4, la sustitución comenzará en la cuarta aparición de cBuscar en cBuscado desde la izquierda; las primeras tres apariciones de cBuscar permanecerán inalteradas. La aparición donde comienza a reemplazarse es la primera ocurrencia de cBuscar si se omite nApariciónInicial. nNúmeroApariciones Especifica el número de apariciones de cBuscar que se desea sustituir. Si nNúmeroApariciones se omite, se sustituirán todas las apariciones de cBuscar, a partir de la aparición especificada en nApariciónInicial.
Comentarios También puede especificar dónde comienza la sustitución y cuántas sustituciones se harán. STRTRAN( ) devuelve la cadena de caracteres resultante.
5.5.186. STUFF( ) (Función) Devuelve una cadena de caracteres creada al sustituir un número específico de caracteres de una expresión de caracteres por otra expresión de caracteres.
Sintaxis STUFF(cExpresión, nIniciarReemplazar, nCaracteresReemplazados, cReemplazar)
Tipos devueltos
240
Manual de Genlis
Character
Argumentos cExpresión Especifica la expresión de caracteres en la que se producirá la sustitución. nIniciarReemplazar Especifica la posición en cExpresión donde comenzará la sustitución. nCaracteresReemplazados Especifica el número de caracteres que se reemplazarán. Si nCaracteresReemplazados es 0, la cadena de sustitución cReemplazar se insertará en cExpresión. cReemplazar Especifica la expresión de caracteres de sustitución. Si cReemplazar es la cadena nula, el número de caracteres especificado por nCaracteresReemplazados se eliminará de cExpresión.
5.5.187. STUFFC( ) (Función) Devuelve una cadena de caracteres creada a partir de la sustitución de un número determinado de caracteres, dentro de una expresión de caracteres, por otra expresión de caracteres.
Sintaxis STUFFC(cExpresión, nIniciarReemplazar, nCaracteresReemplazados, cReemplazar)
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres en la que tendrá lugar la sustitución. nIniciarReemplazar Especifica la posición del carácter en cExpresión a partir de la cual se realizará la sustitución. nCaracteresReemplazados Especifica el número de caracteres que se va a sustituir. Si nCaracteresReemplazados es 0, se insertará toda la cadena de sustitución cReemplazar en cExpresión. cReemplazar
241
Manual de Genlis
Especifica la expresión del carácter de sustitución. Si cReemplazar es la cadena vacía, el número de caracteres especificado mediante nCaracteresReemplazados se eliminarán de cExpresión.
Comentarios STUFFC( ) se ha diseñado para expresiones que contengan caracteres de dos bytes. Si la expresión sólo contiene caracteres de un byte, STUFFC( ) será equivalente a STUFF( ). STUFFC( ) devuelve una cadena de caracteres creada mediante la sustitución de un número determinado de caracteres, dentro de una expresión de caracteres, por otra expresión de caracteres. Las expresiones de caracteres pueden consistir en cualquier combinación de caracteres de un byte y de dos bytes. Esta función es útil para manipular juegos de caracteres de doble byte para idiomas como el Hiragana y el Katakana.
5.5.188. SUBSTR( ) (Función) Devuelve un número de caracteres específico de una expresión de caracteres o un campo memo.
Sintaxis SUBSTR(cExpresión, nPosiciónInicial [, nCaracteresDevueltos])
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres o el campo memo desde el cual se devuelve la cadena de caracteres. PosiciónInicial Especifica la posición en la expresión de caracteres o en la cExpresión del campo memo desde la que se devuelve la cadena de caracteres. El primer carácter de cExpresión es la posición 1. Si TALK toma el valor SET ON y nPosiciónInicial es mayor que el número de caracteres de cExpresión, Genlis generará un mensaje de error. Si TALK toma el valor SET OFF, se devuelve la cadena vacía. nCaracteresDevueltos Especifica el número de caracteres que se debe extraer de cExpresión. Si se omite nCaracteresDevueltos, los caracteres se extraerán hasta llegar al final de la expresión de caracteres.
Comentarios
242
Manual de Genlis
SUBSTR( ) devuelve una cadena de caracteres de una expresión de tipo Character o de un campo memo, a partir de la posición especificada de la expresión de caracteres y hasta el número especificado de caracteres. Cuando utilice SUBSTR( ) con campos memo en un comando SELECT – SQL, incluya la función PADR( ) en SUBSTR( ) de modo que los campos memo vacíos o de longitud variable produzcan resultados coherentes cuando se conviertan a cadenas de caracteres. SUBSTR( ) no devolverá ningún valor para un campo memo cuando se ejecute en la ventana Depuración. Para devolver un valor en la ventana Depuración, incluya el nombre del campo memo en ALLTRIM( ) e incluya ALLTRIM( ) en SUBSTR( ).
5.5.189. SUBSTRC( ) (Función) Devuelve una cadena de caracteres a partir de una expresión de caracteres o de un campo memo determinados.
Sintaxis SUBSTRC(cExpresión, nPosiciónInicial [, nCaracteresDevueltos])
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres o el campo memo a partir de los cuales se devuelve la cadena de caracteres. nPosiciónInicial Especifica la posición, dentro de la expresión de caracteres o del campo memo cExpresión, a partir de donde se devolverá la cadena de caracteres. El primer carácter de cExpresión está en la posición 1. Si TALK está establecido en ON y nPosiciónInicial es mayor que el número de caracteres de cExpresión, Genlis genera un mensaje de error. Si TALK está establecido en OFF, se devolverá una cadena vacía. nCaracteresDevueltos Especifica el número de caracteres que se van a devolver a partir de cExpresión. Si se omite nCaracteresDevueltos, se devolverán caracteres hasta que se llegue al final de la expresión de caracteres.
Comentarios SUBSTRC( ) se ha diseñado para expresiones que contengan caracteres de dos bytes. Si la expresión contiene sólo caracteres de un byte, SUBSTRC( ) equivaldrá a SUBSTR( ).
243
Manual de Genlis
SUBSTRC( ) devuelve una cadena de caracteres a partir de la expresión de caracteres o del campo memo especificados. La expresión de caracteres o el campo memo pueden contener cualquier combinación de caracteres de uno y de dos bytes. SUBSTRC( ) no devolverá un valor para un campo memo si se ejecuta en la ventana Depuración. Si desea que se devuelva un valor en la ventana Depuración, coloque el nombre del campo memo en ALLTRIM( ) y coloque ALLTRIM( ) en SUBSTRC( ). Esta función es útil para manipular juegos de caracteres de doble byte para idiomas como el Hiragana y el Katakana.
5.5.190. SUM (Comando) Totaliza los valores de todos los campos numéricos especificados de la tabla actual seleccionada.
Sintaxis SUM [eListaExpresión] [Alcance] [FOR lExpresión1] [WHILE lExpresión2] [TO ListaNombresVariablesMemoria | TO ARRAY NombreMatriz] [NOOPTIMIZE]
Argumentos eListaExpresión Especifica uno o varios campos o expresiones de campo que se van a totalizar. Si se omite la lista de expresiones, se totalizarán todos los campos numéricos. Alcance Especifica un intervalo de registros que se van a utilizar en el total. Las cláusulas de alcance son: ALL, NEXT nRegistro, RECORD nNúmeroRegistro y REST. El alcance predeterminado de SUM es ALL (todos los registros). FOR lExpresión1 Especifica que solamente se incluyen en el total los registros para los cuales la condición lógica lExpresión1 da como resultado verdadero (.T.). Incluir FOR le permite totalizar registros condicionalmente al desechar los registros no deseados. Si lExpresión1 es una expresión optimizable, Rushmore optimizará un comando SUM ... FOR. Para obtener un mejor rendimiento, utilice una expresión optimizable en la cláusula FOR. Para conseguir el rendimiento óptimo, utilice una expresión optimizable en la cláusula FOR. WHILE lExpresión2 Especifica una condición por la cual los registros de la tabla activa se incluyen en el total siempre y cuando la expresión lógica lExpresión2 dé como resultado verdadero (.T.).
244
Manual de Genlis
TO ListaNombresVariablesMemoria Almacena cada total en una variable de memoria. Si especifica en ListaNombresVariablesMemoria el nombre de una variable de memoria que no existe, Genlis la creará automáticamente. Separe los nombres de variables de memoria de la lista con comas. TO ARRAY NombreMatriz Almacena los totales en una matriz de variables de memoria. Si la matriz que especifica en SUM no existe, Genlis la creará automáticamente. Si la matriz existe y es demasiado pequeña para albergar todos los datos, se aumentará automáticamente el tamaño de la matriz para acoger los totales. NOOPTIMIZE Desactiva la optimización Rushmore de SUM.
5.5.191. TAN( ) (Función) Esta función trigonométrica devuelve la tangente de un ángulo.
Sintaxis TAN(nExpresión)
Tipos devueltos Numeric
Argumentos nExpresión Especifica el ángulo en radianes para el que TAN( ) devuelve la tangente. Para convertir un ángulo de grados a radianes, utilice DTOR( ). El número de lugares decimales que devolverá TAN( ) puede especificarse con SET DECIMALS.
5.5.192. TIME( ) (Función) Devuelve la hora actual del sistema en formato de 24 horas, en una cadena de 8 caracteres (HH:MM:SS).
Sintaxis TIME([nExpresión])
Tipos devueltos Character
245
Manual de Genlis
Argumentos nExpresión La hora devuelta incluirá centésimas de segundo si se incluye nExpresión. La expresión numérica nExpresión puede ser cualquier valor. No obstante, la resolución máxima real es de aproximadamente 1/18 de segundo. Utilice SECONDS( ) para obtener mayor resolución.
5.5.193. TOTAL (Comando) Calcula totales para campos numéricos de la tabla seleccionada actualmente.
Sintaxis TOTAL TO NombreTabla ON NombreCampo [FIELDS ListaNombresCampo] [Alcance] [FOR lExpresión1] [WHILE lExpresión2] [NOOPTIMIZE]
Argumentos NombreTabla Especifica el nombre de la tabla que va a contener los totales. Si la tabla especificada no existe, Genlis la creará. Si la tabla existe y SET SAFETY está establecido en ON, Genlis le preguntará si desea sobrescribir la tabla existente. Si SET SAFETY está establecido en OFF, no se le preguntará y se sobrescribirá la tabla de resultado. NombreCampo Especifica el campo en el que se agrupan los totales. Es necesario que la tabla esté ordenada por este campo, o que un índice abierto o una etiqueta de índice tengan este campo como su expresión de clave. FIELDS ListaNombresCampo Especifica los campos cuyo total se debe calcular. Separe los nombres de campos de la lista con comas. Si omite la cláusula FIELDS, se calcula el total de todos los campos numéricos de forma predeterminada. Alcance Especifica un intervalo de registros cuyo total se calcula. Las cláusulas de alcance son: ALL, NEXT nRegistros, RECORD nNúmeroRegistro y REST. El alcance predeterminado de TOTAL es ALL (todos los registros). FOR lExpresión1
246
Manual de Genlis
Especifica una condición por la cual solamente se incluyen en el total los registros que satisfacen la condición lógica lExpresión1. Si lExpresión1 es una expresión optimizable, Rushmore optimizará una consulta creada con TOTAL ... FOR. Para obtener un mejor rendimiento, use una expresión optimizable en la cláusula FOR. WHILE lExpresión2 Especifica una condición por la cual los registros de la tabla activa se incluyen en los totales siempre y cuando la expresión lógica lExpresión2 dé como resultado verdadero (.T.). NOOPTIMIZE Desactiva la optimización Rushmore de TOTAL.
Comentarios Es necesario que la tabla del área de trabajo seleccionada actualmente esté ordenada o indexada. Se calcula un total separado para cada conjunto de registros que tengan un valor de campo común o un valor único de clave de índice. Los resultados se sitúan en registros de una segunda tabla. En esta segunda tabla se crea un registro para cada valor de campo común o para cada valor único de clave de índice. Puede producirse un desbordamiento numérico si los campos numéricos de la segunda tabla no son lo suficientemente amplios para contener los totales. Genlis conservará la parte más significativa de los totales cuando se produce un desbordamiento. Cuando un campo es demasiado pequeño para aceptar un total: Se truncan los decimales y se redondea la parte decimal restante del total. Si todavía no cabe el total, se utiliza notación científica si el campo total contiene siete o más dígitos. Por último, se sustituye el contenido del campo por asteriscos.
5.5.194. TRANSFORM( ) (Función) Devuelve una cadena de caracteres a partir de una expresión en un formato que viene determinado por un código de formato.
Sintaxis TRANSFORM(eExpresión, cCódigosFormato)
Tipos devueltos Character
Argumentos eExpresión Especifica la expresión numérica o de caracteres a la que desea dar formato. cCódigosFormato
247
Manual de Genlis
Especifica uno o más códigos PICTURE o FUNCTION que determinan cómo se da formato a la expresión. En la siguiente tabla se muestran los códigos de formato disponibles. Códigos de formato Descripción @C CR se anexa a los valores positivos de moneda o numéricos para indicar un crédito. @D Los valores Date y DateTime se convierten al formato SET DATE actual. @E Los valores Date y DateTime se convierten al formato de fecha BRITISH. @R La transformación utiliza una máscara de formato. Los caracteres de la máscara no se almacenan en el valor transformado. Utilícelo sólo con datos numéricos o alfanuméricos. La máscara puede incluir los siguientes caracteres: 9 o #Representa un carácter o un número. !Convierte en mayúsculas las letras minúsculas. @T Se eliminan los espacios en blanco de los valores de tipo Character. @X DB se anexan valores numéricos o de moneda negativos para indicar un débito. @Z Si es 0, valores numéricos o de moneda se convierten en espacios. @( Incluye entre paréntesis los valores numéricos o de moneda negativos. @^ Convierte valores numéricos o de moneda en valores científicos. @0 Convierte valores numéricos o de moneda en sus equivalencias hexadecimales. El valor numérico o de moneda tiene que ser positivo y menor que 4.294.967.296. @! Convierte los datos de caracteres en mayúsculas. @$ Agrega el símbolo de moneda actual especificado mediante SET CURRENCY a los valores de moneda y numéricos. De forma predeterminada, el símbolo se colocará justo antes o justo después del valor. De todas formas, tanto el símbolo de moneda y su colocación (especificados mediante SET CURRENCY), como el carácter de separación (especificado mediante SET SEPARATOR) y el carácter decimal (especificado mediante SET POINT) se pueden modificar. X Especifica el ancho de los valores de caracteres. Por ejemplo, si cCódigosFormato es 'XX', se devuelven 2 caracteres. Y Convierte los valores lógicos verdadero (.T.) y falso (.F.) en Y y en N, respectivamente. ! Convierte los caracteres que están en minúsculas en caracteres en mayúsculas. . Especifica la posición del separador de decimales en los valores numéricos y de moneda. , Separa los dígitos que están a la izquierda del separador de decimales en los valores de moneda y numéricos. Si omite cCódigosFormato, Genlis realiza una transformación predeterminada en eExpressión. La siguiente tabla describe las transformación predeterminada para cada tipo de datos que eExpresión puede contener: Tipo de datos Descripción de la transformación Character. No se realiza ninguna transformación. Currency. La transformación está determinada por los valores especificados en la ficha Regional del cuadro de diálogo Opciones. Date. Se realiza una transformación DTOC( ) en la fecha. DateTime. Se realiza una transformación TTOC( ) en la fecha y hora. Logical. Los valores lógicos verdadero (.T.) y falso (.F.) se transforman en las cadenas de caracteres ".T." y ".F." respectivamente.
248
Manual de Genlis
Numeric (incluye los tipos de datos Double, Float o Integer). Se quitan los ceros a la izquierda de la parte decimal de un valor numérico. Si el valor numérico es un número entero, no se incluye un punto decimal en el valor transformado (por ejemplo, 4,0 se convierte en 4). Si el valor numérico es menor que 1 pero mayor que -1, se incluye un cero antes del signo decimal (por ejemplo, ,4 se transforma en 0,4). General. Devuelve "Gen" si el campo general contiene un objeto; devuelve "gen" si el campo general no contiene un objeto. Memo. No se realiza ninguna transformación.
5.5.195. TRIM( ) (Función) Devuelve la expresión de caracteres especificada después de eliminar todos los espacios en blanco finales.
Sintaxis TRIM(cExpresión)
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión de caracteres de la cual TRIM( ) elimina todos los espacios en blanco finales.
Comentarios TRIM( ) es idéntica a RTRIM( ).
5.5.196. TTOC( ) (Función) Devuelve un valor de tipo Character a partir de una expresión DateTime.
Sintaxis TTOC(tExpresión [, 1 | 2])
Tipos devueltos Character
Argumentos tExpresión
249
Manual de Genlis
Especifica una expresión de tipo DateTime a partir de la cual TTOC( ) devuelve un valor de tipo Character. tExpresión sólo contiene una hora, Genlis agregará la fecha predeterminada de 30/12/1899 a tExpresión. Si tExpresión sólo contiene una fecha, Genlis agregará la hora predeterminada de medianoche (12:00:00 a.m.) a tExpresión. 1 Especifica que TTOC( ) devuelve un cadena de caracteres con un formato adecuado para la creación de índices. La cadena de caracteres tiene un formato aaaa:mm:dd:hh:mm:ss de 14 caracteres que no se ve afectado por la configuración actual de SET CENTURY o SET SECONDS. 2 Especifica que TTOC( ) devuelva una cadena Character consistente sólo en el periodo de tiempo de la expresión DateTime. Los valores establecidos para SET SECONDS y para SET DATE especifican si se incluye la cantidad de segundos en la cadena de caracteres. Tenga en cuenta que, si SET DATE está establecido en LONG o en SHORT, el formato de la cadena de caracteres se determinará por el formato establecido para la hora en el Panel de control.
5.5.197. TTOD( ) (Función) Devuelve un valor de tipo Date a partir de una expresión de DateTime.
Sintaxis TTOD(tExpresión)
Tipos devueltos Date
Argumentos tExpresión Especifica una expresión de fecha y hora a partir de la cual TTOD( ) devuelve un valor de Fecha. tExpresión debe evaluarse como una fecha y hora válida. Si tExpresión sólo contiene una hora, Genlis agrega la fecha predeterminada de 30/12/1899 a tExpresión y devuelve esta fecha predeterminada.
5.5.198. TYPE( ) (Función) Evalúa una expresión de caracteres y devuelve el tipo de datos de su contenido.
Sintaxis
250
Manual de Genlis
TYPE(cExpresión)
Tipos devueltos Character
Argumentos cExpresión Especifica la expresión que se va a evaluar, que puede ser una variable o un campo, un campo de memoria o cualquier otra expresión. La expresión tiene que pasarse como una cadena de caracteres; escriba entre comillas los nombres de variables de memoria, campos, etc. Si no escribe la expresión entre comillas, la función TYPE( ) devolverá "U" (expresión indefinida).
Comentarios La tabla siguiente enumera los caracteres que devuelve TYPE( ) y sus tipos de datos correspondientes: Tipo de datos Carácter devuelto Character C Numeric (también Float, Double e Integer) Currency Y Date D DateTime T Logical L Memo M Object O General G Screen (creado con SAVE SCREEN) S Tipo de expresión no definido U
N
5.5.199. UPPER( ) (Función) Devuelve la expresión de caracteres especificada en mayúsculas. Sintaxis UPPER(cExpresión)
Tipos devueltos Character
Argumentos cExpresión
251
Manual de Genlis
Especifica la expresión de caracteres que UPPER( ) convierte a mayúsculas.
Comentarios Cada letra minúscula (a – z) de la expresión de caracteres se convierte en mayúscula (A – Z) en la cadena devuelta. Todos los demás caracteres permanecen inalterados.
5.5.200. USED( ) (Función) Determina si hay una tabla abierta en un área de trabajo especificada.
Sintaxis USED([nÁreaTrabajo | cAliasTabla])
Tipos devueltos Logic
Argumentos nÁreaTrabajo | cAliasTabla Especifica el área de trabajo o el alias de la tabla. USED( ) devuelve un valor lógico verdadero (.T.) si está abierta una tabla en el área de trabajo especificada en nÁreaTrabajo; de lo contrario, devuelve un valor lógico falso (.F.). USED( ) devuelve un valor lógico verdadero (.T.) si se está usando un alias con el alias especificado en cAliasTabla; de lo contrario, devuelve el valor falso (.F.) Si omite nÁreaTrabajo y cAliasTabla, USED( ) devuelve un valor lógico verdadero (.T.) si está abierta una tabla en el área de trabajo seleccionada actualmente; de lo contrario, devuelve falso (.F.).
Comentarios USED( ) puede determinar si se está usando un alias o si hay una tabla abierta en un área de trabajo específica.
5.5.201. VAL( ) (Función) Devuelve un valor numérico a partir de una expresión de caracteres compuesta de números.
Sintaxis VAL(cExpresión)
Tipos devueltos Numeric
252
Manual de Genlis
Argumentos cExpresión Especifica una expresión de caracteres compuesta de hasta 16 números. Si en cExpresión se incluyen más de 16 números, se redondeará.
Comentarios VAL( ) devuelve los números de la expresión de caracteres de izquierda a derecha hasta que encuentra un carácter no numérico (se pasan por alto los espacios en blanco iniciales). VAL( ) devuelve 0 si el primer carácter de la expresión de caracteres no es un número, ni un signo más (+) ni un signo menos (-). VAL( ) se puede utilizar para convertir en valores numéricos las cadenas de caracteres devueltas por las funciones SYS( ) de Genlis.
5.5.202. WAIT (Comando) Muestra un mensaje y detiene la ejecución de Genlis hasta que presione una tecla o haga clic con el mouse.
Sintaxis WAIT [cTextoMensaje] [TO NombreVariable] [WINDOW [AT nFila, nColumna]] [NOWAIT] [CLEAR | NOCLEAR] [TIMEOUT nSegundos]
Argumentos cTextoMensaje Especifica el mensaje personalizado que se desea mostrar. Si omite cTextoMensaje, Genlis mostrará el mensaje predeterminado. Si cTextoMensaje es la cadena vacía (""), no se mostrará ningún mensaje y Genlis esperará hasta que se presione una tecla antes de continuar con la ejecución del programa. TO NombreVariable Guarda la tecla presionada en una variable o en un elemento de matriz. Si la variable o el elemento de matriz que especifica con NombreVariable no existe, se creará. Si presiona la tecla ENTRAR o una tecla o combinación de teclas no imprimible, o hace clic con el mouse, se almacenará en NombreVariable la cadena vacía. WINDOW Muestra el mensaje en una ventana de mensajes del sistema, en la esquina superior derecha de la ventana principal de Genlis. La ventana puede ocultarse temporalmente al presionar la tecla CTRL o MAYÚS.
253
Manual de Genlis
AT nFila, nColumna En Genlis, especifica la posición que ocupará la ventana de mensajes dentro de la pantalla. NOWAIT Continúa la ejecución del programa inmediatamente después de mostrar el mensaje. El programa no espera a que el mensaje desaparezca de la ventana principal de Genlis, sino que continúa ejecutando la línea del programa inmediatamente siguiente a la que contiene WAIT NOWAIT. Si omite NOWAIT, la ejecución del programa se interrumpe hasta que el mensaje se elimine de la ventana principal de Genlis al presionar una tecla o hacer clic con el mouse. CLEAR Elimina una ventana de sistema de Genlis o una ventana de mensajes WAIT de la ventana principal de Genlis desde un programa. Por ejemplo, la conversación procedente de indexar, ordenar, etc. se dirige a una ventana de sistema de Genlis si ejecuta SET TALK WINDOW. La ventana se eliminará cuando presione una tecla o mueva el mouse. Ejecute WAIT CLEAR para eliminar la ventana desde dentro de un programa. NOCLEAR Especifica que una ventana de mensajes WAIT permanecerá en la ventana principal de Genlis hasta que se ejecute WAIT CLEAR u otro comando WAIT WINDOW, o hasta que se muestre un mensaje de sistema de Genlis. TIMEOUT nSegundos Especifica cuántos segundos pueden transcurrir sin entradas desde el teclado o el mouse antes de que WAIT termine. nSegundos especifica el número de segundos (se admiten partes fraccionales de segundo) que pueden transcurrir. Si TIMEOUT no es la última cláusula de WAIT, Genlis genera un mensaje de error de sintaxis.
Comentarios Si se muestra un mensaje WAIT en Genlis para Windows, podrá ocultar todas las ventanas que contengan el mensaje WAIT al presionar la tecla MAYÚS o CTRL.
5.5.203. WEEK( ) (Función) Devuelve un número que representa la semana del año a partir de una expresión de tipo Date o DateTime.
Sintaxis WEEK(dExpresión | tExpresión [, nPrimeraSemana] [, nPrimerDíaSemana])
Tipos devueltos Numeric
254
Manual de Genlis
Argumentos dExpresión | tExpresión Especifica la expresión Date o DateTime para la cual WEEK( ) devuelve la semana del año. Si omite los argumentos opcionales nPrimeraSemana y nPrimerDíaSemana, WEEK( ) utilizará el domingo como primer día de la semana. nPrimeraSemana Especifica los requisitos para la primera semana del año. nPrimeraSemana puede tener uno de los valores siguientes. nPrimeraSemana Descripción 0 WEEK( ) devuelve la semana seleccionada actualmente en el cuadro de lista Primera semana del año de la ficha Internacional, en el cuadro de diálogo Opciones. 1 La primera semana contiene 1 de enero. Éste es el valor predeterminado cuando se omite nPrimeraSemana. 2 La mitad mayor (cuatro días) de la primera semana está en el año actual. 3 La primera semana tiene siete días. nPrimerDíaSemana Especifica el primer día de la semana. nPrimerDíaSemana puede tener uno de los valores siguientes. nPrimerDíaSemana Descripción 0 WEEK( ) devuelve el día seleccionado actualmente en el cuadro de lista La semana empieza en de la ficha Internacional, en el cuadro de diálogo Opciones. 1 Domingo. Éste es el valor predeterminado cuando se omite nPrimerDíaSemana y es el primer día de la semana empleado en versiones anteriores de FoxPro. 2 Lunes 3 Martes 4 Miércoles 5 Jueves 6 Viernes 7 Sábado
Comentarios WEEK( ) devuelve un número del 1 al 53 que representa la semana del año. Por ejemplo, WEEK( ) devuelve 1 para la primera semana del año, 2 para la segunda semana del año, y así sucesivamente. Observe que una semana puede dividirse entre años: la primera semana del año puede estar en el año actual y en el anterior.
255
Manual de Genlis
5.5.204. YEAR( ) (Función) Devuelve el año a partir de la expresión de fecha, o fecha y hora especificada.
Sintaxis YEAR(dExpresión | tExpresión)
Tipos devueltos Numeric
Argumentos dExpresión Especifica una expresión de fecha a partir de la cual YEAR( ) devuelve el año. dExpresión puede ser una función que devuelve una fecha o una variable de memoria, un elemento de matriz o un campo de tipo Date. También puede ser una cadena de fecha literal, por ejemplo: {^1998-06-06}. tExpresión Especifica una expresión de tipo DateTime hora a partir de la cual YEAR( ) devuelve el año.
Comentarios YEAR( ) siempre devuelve el año con el siglo. La configuración de CENTURY (ON u OFF) no afecta al valor devuelto.
256
Manual de Genlis
6. Limitaciones y observaciones sobre la codificación de instrucciones A continuación se proporciona una lista de limitaciones y explicaciones adicionales para poder escribir el código que recupera los datos con Genlis:
Cuando diseñe un formulario debe indicar donde se guardan los valores que introduce el usuario final. Los nombres que usaremos de referencia (parámetros) deben escribirse al momento en que se cree el formulario en el lugar donde se escribirán los valores, tal como se muestra en el gráfico:
Para poder referenciarlos debe incluirse el nombre entre # (Por ejemplo #ARTICULO1#). Debe tenerse en cuenta que Genlis distingue entre mayúsculas y minúsculas, por lo que no es lo mismo #ARTICULO1# y #Articulo1#. Genlis antes de ejecutar el código que recuperará los datos substituirá los parámetros por sus valores. Según el tipo de que se trate, Genlis añadirá los delimitadores correspondientes. Por ejemplo #ARTICULO1# lo substituirá por “00000001” suponiendo que el usuario hay tecleado 00000001. El tipo variante permite introducir valores de carácter que se sustituirán sin añadir los delimitadores.
Las variables deben ser declaradas como publicas. Para impedir conflictos con Genlis es una buena opción definir el nombre añadiendo el carácter subrayado delante el nombre “_”. Ejm.: PUBLIC _Nombre
Se ha introducido una nueva cláusula para las consultas SQL que es FISCALYEAR para indicar el ejercicio de donde se extraen los datos Ejm.: SELECT * FROM ARTICULOS FISCALYEAR 1998 Si se trabaja con cursores temporales los nombres deben empezar por CUR_: Ejm.: SELECT * FROM ARTICULOS INTO CURSOR CUR_TEMPORAL
257
Este documento ha sido creado por el Departamento de Documentación de Sage Eurowin. La información que contiene es cierta salvo error u omisión. El funcionamiento del programa puede ser modificado sin previo aviso. De producirse, las modificaciones se comunican a través de los procedimientos habituales establecidos. Con el fin de mejorar la calidad de este manual, si detecta alguna errata puede comunicárnosla enviando un mensaje a la siguiente dirección de correo electrónico:
[email protected]
Queda totalmente prohibida la reproducción parcial o total, así como la venta de este documento, sin el expreso consentimiento de la empresa. Todas las ofertas, promociones, condiciones y/o tarifas reflejadas en él tienen la vigencia concretada en el mismo.