Cosmos
F.A.Q. – Preguntas Frecuentes
F.A.Q. – Preguntas Frecuentes
¿Puede crear una tabla temporal un usuario con permiso CONNECT?
No, el usuario debe tener permiso RESOURCE.
Al confeccionar un impreso con rupturas de secuencia no se limpia bien la página al realizar la ruptura. Además, en el siguiente grupo imprime líneas del grupo anterior.
Utilizar el método «Truncate».
Se produce el siguiente error "COMPONENT OF THE KEY ARE MISSING IN DE COLUMN LIST".
Cuando se modifica un campo que forma parte de una clave referencial compuesta se han de modificar todos los campos que forman dicha clave, aunque no varíe su valor.
¿Cómo aplicar una "Variable global" a toda la aplicación?
Ponerla en una INCLUDE que siempre esté cargada; es decir, que esté asociada a todos los módulos que utilicen este objeto global y al módulo de inicio.
En un grupo definido, ¿Cómo imprimir un registro que ocupa varias líneas?
Incluir los campos dentro de una caja con varias páginas para que el grupo la repita o utilizar un control de tipo «BAND GROUP».
Al intentar borrar un registro con integridad referencial, ¿cómo capturar el aviso producido y cambiar el texto del mensaje?
Bajar el «ErrorLevel» y, si el borrado falla, mostrar el mensaje de error que queramos.
¿Cómo hacer un grupo si cada registro necesita cuatro líneas de impresión?
Utilizar una caja con tantas páginas como formatos de línea tenga y luego ir cambiando el «CurrentRow» del grupo y la «Page» de la caja; o bien utilizar un control de tipo «BAND GROUP».
¿Cómo limitar los valores que se pueden introducir a un campo de una tabla? Por ejemplo: Valores posibles "X" o " "
Se puede hacer de dos formas:
La manera óptima sería utilizando las dos a la vez.
¿Cómo poner una variable en la cláusula WHERE al hacer una SelectWindow?
Concatenándola con el operador «+» de la clase «char» al resto de la sentencia SQL.
No funciona la ayuda de Cosmos, ni siquiera ejecutando directamente los archivos ".chm" desde el Explorador.
Registrar el control «hhctrl.ocx» del directorio «Windows\System»; copiar el fichero «hh.exe» del directorio «bin» de Cosmos al directorio Windows.
Instalando Internet Explorer 5 o posterior también funciona.
¿Es posible detectar en qué línea se ha producido un error capturado con Whenever?
Con el evento «On Error» de la clase «SqlServer» o bien con el de la clase «module».
Se produce el siguiente error "COMPONENT OF THE KEY ARE MISSING IN DE COLUMN LIST"
Cuando se modifica un campo que forma parte de una clave referencial compuesta se han de modificar todos los campos que forman dicha clave, aunque no varíe su valor.
Al imprimir un informe se ejecuta "setup"; al seleccionar orientación horizontal hace caso omiso.
Se debe utilizar el método «SetOrientation» indicando un 2 como parámetro.
¿Cómo realizar una consulta que permita recuperar las filas que no tienen información en algunas de sus columnas?
Poner en la condición la cláusula «IS NULL».
¿Existe algún método que permita mostrar una ventana y poder realizar búsquedas de ficheros?
Sí, el método «TreeWalk».
¿Cómo cambiar el orden de tabulación de los controles?
Pinchando con el botón secundario del ratón y eligiendo la opción «set tab order». También se puede hacer editando las propiedades del control y modificando el atributo «Order».
’Toggle
«. El nombre de la tabla que aparece en el error no es el de la tabla que está intentando borrar desde programa.’ tags=» custom_id=»]
Aumentar la variable de entorno MBISFILES a 100. Revisar los índices de la tabla con el comando «tchkidx».
¿Cuáles son los eventos para controlar lo que se teclea en un "EDIT FIELD"?
Con el evento «EditChange».
¿Cómo se pueden tener repartidas las columnas de una tabla en un "grid" y en un "box"?
Asociar la tabla a un «box» y, dentro de ella, poner el «grid» y los controles para las columnas.
¿Cómo mostrar un carácter por medio de su código ASCII?
Con el método «Character()».
¿Cómo ver un fichero de texto como en una window?
Utilizando un control de tipo «list box» con la propiedad «Sql Type» y valor «File».
¿Se puede utilizar el método "Locate" sobre un campo de tipo carácter en la definición de un CURSOR?
No, se debe utilizar «matches» o «like».
Al asociar una "tabla" a un "box" (la tabla se llama color), se producen errores al compilar el módulo, deshaciendo la asociación de la "tabla" con el "box".
El nombre de la tabla («color») es una palabra reservada, por lo que no se puede utilizar.
¿Cómo deshabilitar un menú?
Poniendo la propiedad «DISABLED» del menú o de la opción que quiera deshabilitar a «TRUE».
Si la opción de menú tiene asociado un comando se podrá deshabilitar con el método «DisableCommand» de la clase «form».
Al utilizar el método GetEnv para recoger el valor de una variable de entorno no funciona.
Comprobar que el nombre de la variable es idéntico al definido en el fichero «cosmos.ini».
Si queremos recoger una variable de entorno de una conexión asociada a un SqlServer debemos utilizar el método «GetValue».
Otra posibilidad es reiniciar Cosmos si se ha modificado el fichero «cosmos.ini».
Al utilizar el método "GetQueryLike()" devuelve nulo.
Para utilizar este método debemos estar en modo edición.
¿Existe algún método que permita saber si una columna de una tabla ha sido modificada?
Sí, el método «SqlModified» de la clase FORMTABLE.
¿Hay alguna forma inmediata de posicionarnos en un número de registro determinado?
Utilizando el método «SetCurrentRow».
Al arrancar Cosmos aparece el siguiente mensaje: "Imposible actualizar el catálogo del sistema".
Tiene definido otro Cosmos en la variable de entorno «COSMOSDIR» en el fichero «win.ini».
¿Cómo se relaciona una "view" de la base de datos con una "template" de un repositorio.
Por el nombre de la «view» y del «template». El de ambos debe coincidir.
Tenemos un "check box" en un "grid" como "pseudo". Al hacer una consulta no refresca el "check box", sino sólo el de la fila activa. Tiene activada la propiedad "store status". ¿Cómo hacer que refresque el "check box" completo?
Asociando una variable al control y modificándola. La variable tiene que ser booleana.
¿Cómo hacer un "ADD" de "MultiBase" en el modo edición de Cosmos?
Hay que redefinir el comando «AcceptEdit», ver si el método «Status» devuelve «New» y, si es así, hacer de nuevo el «EditNew».
¿Se puede cambiar el color de un control desactivado para que no salga en gris?
No.
¿Cómo ver los controles en todas las páginas de un "TAB CONTROL"?
Poniendo la propiedad «Page» de los controles a 0.
¿Se pueden asignar variables definidas como Boolean a un "Edit Field"?
No se puede asignar una variable Boolean a un control «Edit Field». Hay que utilizar los controles adecuados, por ejemplo: «Radio button», «check», «drop», etc.
Cuando en un CURSOR con una SELECT con GROUP BY queremos agrupar por una serie de campos, las cantidades que se obtienen no son correctas (hay 3 niveles de grupos).
No poner la cláusula GROUP BY en la SELECT, poner en su lugar la ORDER BY y utilizar el método «group by» de la clase Sqlcursor.
Tenemos una variable pseudo asociada a una tabla en un "grid". Al pasar a otra fila no guarda el estado de esa variable. ¿Cómo recoger el valor de esa variable para cada fila?
Hay que modificar el registro para que se actualice el valor de la variable asociada método Update de la clase FormTable.
¿Cómo añadir "templates" nuevos para los wizards a Cosmos?
¿Cómo añadir «templates» nuevos para los wizards a Cosmos?
Copiar el archivo «.smd» al directorio «templates» y añadir, en el fichero «templates.ini», una línea en la entrada que queramos con el siguiente formato:
¿Cómo añadir campos muy grandes a un grid?
Poniendo un control «Multilínea» o gestionándolo desde otro «Form».
¿Se puede convertir a mayúsculas o minúsculas el "label" de un control del tipo "Text"?
Sí, de la siguiente manera:
¿Cómo pasar de ANSI a OEM?
Con la función «AnsiToOem» o bien con la variable de entorno DBCHARSET.
En un "List Box" de tipo sql, ¿hay Drag and Drop?
Sí, se puede hacer chequeando en las propiedades de la ventana «Allow Drop» y en las de la lista «Allow Drag».
¿Cómo pueden desarrollar varios usuarios un mismo proyecto?
En el «Cosmos.ini» poner el parámetro «MultiUser=TRUE» en la entrada [Cosmos Visual Editor]. De este modo los usuarios no podrán modificar el módulo que esté modificando otro usuario.
En la clase "ArgList" de tipo char, al utilizar el método Select de la clase "SqlServer" aparece un error indicando que dicho método no existe en la clase "ArgList".
No se pueden instanciar objetos de clases heredadas de la clase «ArgList». Sólo se pueden utilizar en la declaración de funciones para recibir parámetros.
Queremos añadir una entrada al fichero "template.ini" de una clase que no es hija de la clase "FORM", sino de una clase abstracta que hemos generado. ¿Cómo podemos hacerlo?
Hay que generar un «include» con la clase abstracta y, posteriormente, crear un módulo donde haya una clase que derive de esa clase abstracta. Dicho «include» deberá quedar guardado en el directorio «includes» y el módulo en el directorio «templates».
En un "AcceptEdit" redefinido, ¿cómo se puede salir de dicho comando en un momento dado?
Con la palabra reservada «Return».
Al borrar una registro de una tabla de líneas ésta queda desordenada. ¿Existe algún método que la reordene automáticamente?
No. Lo único que podemos hacer es un «query» de esa tabla habiendo definido previamente una columna de ordenación para la misma.
Tenemos un "TabControl" con 3 páginas. ¿De qué forma podemos cambiar de página por programa?
¿Cómo se puede calcular el número de registros que se han recogido en un CURSOR?
La única manera es hacer previamente un «Select count(*)» con las mismas condiciones del CURSOR.
Si ya hubiésemos recorrido todo, podríamos haber llevado un contador de filas.
En un mantenimiento con un "Tab Control" con una tabla asociada, al arrastrar a la tercera pestaña se produce un error y la tabla queda desasociada. ¿Cómo se puede volver a asociar dicha tabla?
Se puede realizar desde el «Source Editor».
¿Se puede poner un "bmp" en un control de tipo "List Box"?
No. Se deben utilizar los controles de tipo «Bitmap».
¿Se pueden leer los archivos "syserror" y "Sysmonitor" con algún editor?
No, ya que se trata de ficheros binarios.
¿Se pueden pasar "arrays" a una función?
No. Hay que definir un «array» público que pueda ser visto por la función.
¿Cómo restringir los accesos a unas tablas a través de ODBC?
Estableciendo los permisos mediante el SQL.
Una impresora con un cajón monedero necesita enviar un "null" para que dicho cajón se abra.
Se puede hacer enviando un «Character(0)» o bien haciendo un copy de un fichero «.pif» directamente al puerto donde está conectada la impresora.
¿Cómo hacer que un usuario de Cosmos tenga una conexión por defecto?
Llamando al usuario de la misma forma que a la conexión para que compartan las variables de entorno definidas.
¿Cómo se pueden sacar mensajes en la barra de estado?
La barra de estado está compuesta por controles. Se puede utilizar un control de tipo «PANEL» para sacar los comentarios (propiedad «comment») o bien poner un nuevo control de tipo «TEXT» y modificar su propiedad «Text».
¿Existe en Cosmos una variable similar la "locked" de MultiBase?
El método «locked» de la clase SqlCursor.
¿Cómo podemos imprimir sin utilizar un objeto de la clase Page?
Abriendo un STREAM sobre el puerto de impresión del ordenador, aunque es aconsejable utilizar la clase «Page».
¿Cómo se puede conectar Cosmos con una base de datos en un servidor UNIX?
Con el editor de configuración crear una conexión cliente-servidor y definir las variables de entorno necesarias para poder realizar dicha conexión (DBHOST, DBUSER, DBSERVICE, DBPATH, etc.).
Para realizar la apertura de cajón en un TPV es necesario enviar una secuencia de escape. ¿Cómo podemos enviar dicha secuencia?
Hay que utilizar un «stream binary» y enviar el «character(xxx)» necesario.
Tenemos variables a=null, b="jjj". Cuando realizamos las siguientes comparaciones (a <> b o a == b) siempre devuelve falso.
Los nulos tienen un valor indeterminado, con lo que no son ni iguales ni distintos. Para preguntar por nulo utilizar «IS NULL» o «IS NOT NULL».
¿Existe alguna manera de definir objetos de forma dinámica?
Sólo con objetos simples («smallint», «integer», «date») con el método SetValue. Para recuperar su valor utilizaremos el método GetValue.
¿Cómo podemos asignar iconos a botones de un FORM desde una INCLUDE?
Hay que crear un Form Abstracto con un método que permita modificar los iconos de los botones por medio de la función «Control(
Tenemos variables a=null, b="jjj". Cuando realizamos las siguientes comparaciones (a <> b o a == b) siempre devuelve falso.
Los nulos tienen un valor indeterminado, con lo que no son ni iguales ni distintos. Para preguntar por nulo utilizar «IS NULL» o «IS NOT NULL».
¿Existe alguna manera de definir objetos de forma dinámica?
Sólo con objetos simples («smallint», «integer», «date») con el método SetValue. Para recuperar su valor utilizaremos el método GetValue.
¿Cómo podemos asignar iconos a botones de un FORM desde una INCLUDE?
Hay que crear un Form Abstracto con un método que permita modificar los iconos de los botones por medio de la función «Control(
¿Cómo podemos saber qué "Radio Button" está seleccionado?
Con la propiedad «Selected» del control.
¿Cómo se puede cambiar el número de copias de un listado?
Con el método NumCopies.
¿Cómo hacer que un FORM desaparezca automáticamente?
Definir un «Timer» en el lugar donde se cierre el módulo y ejecutar el método Close de la clase Form.
Realizamos el chequeo de una tabla y a partir de ese momento aparece un mensaje indicando que la tabla puede estar deteriorada. ¿Cómo se puede quitar el mensaje?
Borrar el fichero «syserr» que se encuentra en el directorio «*.dbs».
¿Cómo recoger valores de una SELECT sin usar un CURSOR?
Utilizando el método Select de la clase SqlServer.
¿Cómo recoger valores de una SELECT WINDOW en un control de tipo TEXT?
Asociando una variable al «TEXT» para que vaya recogiendo los distintos valores.
¿Existe algún método que redimensione los controles cuando cambia de tamaño el FORM?
Simplemente «attachando» (botones de la paleta «Adjust Palette») los controles a su contenedor.
¿Se puede saber con alguna función el nombre de un menú?
No.
¿Se puede activar el "Click" de un "Grid" cuando se pulsa sobre la parte izquierda?
Con el evento «Click Index».
¿Se pueden crear controles de forma dinámica?
No.
¿Cómo añadir columnas de una tabla definida en la sección "tables" de un "form" al FORM?
Tomando la columna del repositorio del proyecto y arrastrándola sobre la tabla de la sección «tables» del FORM.
También es posible hacerlo abriendo la lista de columnas, pulsando con el botón derecho «Add» y chequeando en las propiedades de la variable «Is Column».
Al ejecutar el comando "COPY" de MS-DOS aparece un mensaje de error indicando que no encuentra el fichero.
Emplear el método «COPY» de la clase module.
Cuando grabamos una fila aparece el mensaje "Value too big for an INTEGER". No hay campos de tipo INTEGER, pero sí de tipo fecha y éstas pueden venir no inicializadas.
Poner los campos de tipo fecha con un valor correcto, ya que las fechas se almacenan como enteros.
¿Se puede realizar la gestión de dos tablas con los mismos botones?
Sí, para ello hay que redefinir el comando que ejecuta el botón.
¿Se puede modificar la clave primaria de una tabla en un mantenimiento?
No. Esto es debido a que la clave primaria se utiliza para generar la lista en curso.
¿De qué forma se puede cargar un menú en ejecución?
Con el método «SetMenu».
¿Cómo cambiar el color de un control en un "grid" sin que lo cambie a todas las filas?
Activando la propiedad «STORE DESIGN» del control que está en el «grid».
En una clase abstracta, ¿cómo declarar el evento RowChanged para cualquier tabla?
De la siguiente manera:
On RowChanged table (p_table as char)
¿Existe algún método que permita limpiar las variables en un listado?
El método «CLEAR» de la clase «PAGE».
¿Puede un programa de MultiBase compartir una tabla temporal creada en Cosmos?
No, ya que las tablas temporales se crean por número de proceso, y aunque ejecutásemos al mismo tiempo MultiBase y Cosmos, entre ellos habría procesos diferentes.
¿Se puede modificar el tipo de letra por programa?
Utilizando el método SetProperty de la clase Control.
Después de haber realizado un wizard de un proyecto aparece un mensaje indicando que la base de datos no está abierta. ¿Cómo se puede solucionar?
Hay que generar una librería con la conexión y desconexión a la base de datos e incluirla en el módulo de inicio de la aplicación.
Al cambiar el atributo "Bold" éste se aplica a todo el grupo, ¿hay alguna manera de evitarlo?
Activando el «store status» del control variable que está dentro del grupo.
¿Se hereda el atributo "comments" en campos enlazados ("linkados")?
No, sólo se heredan los atributos SQL.
¿Cómo se puede cambiar el directorio por defecto para grabar un fichero ".sql"?
Cambiando el valor de la variable DBTEMP.
Al intentar crear un cabeceras-líneas no deja crear la "foreign key" en el repositorio.
Para que esto no suceda hay que poner correctamente el orden de los campos de la «foreign key».
¿Cómo se puede determinar el ancho de un dato en una "List Box"?
Utilizando el método «SetColumnChars».
¿De qué manera automática se pueden ver los valores en un listado?
Haciendo «PrintVars» sobre los valores que queramos ver.
¿Qué hay que hacer para que salga el carácter de coma (",") como separador de miles?
Definir la variable de entorno «DBMONEY=.» o bien modificar en la configuración regional del equipo el símbolo decimal.
¿Cómo hacer un tratamiento dinámico de selección de tablas?
Creando un método que construya la SELECT a partir del catálogo y utilizando «ArgList».
¿Hay que tener joins diferentes para tener columnas de "lookup" y "foreign key"?
No, con uno solo es suficiente.
Al realizar un preview de impresión no se ven más que 10 páginas. ¿Es éste el número máximo de páginas que se pueden ver?
No. Para establecer el número de páginas a previsualizar hay que emplear el método «SetBufferPages» de la clase «PrnDocument».
Al emplear una variable "pseudo" en un "grid" repite el mismo valor en todas las filas. ¿Esto es realmente así?
No. El motivo es que la variable se ha establecido como variable local del FORM. Esta variable debería estar creada para la tabla, de esta manera nos iría mostrando valores diferentes.
En un equipo funciona correctamente la aplicación en modo cliente-servidor. Sin embargo, en otro equipo aparece el mensaje: "unknown host".
No. El motivo es que la variable se ha establecido como variable local del FORM. Esta variable debería estar creada para la tabla, de esta manera nos iría mostrando valores diferentes.
En un equipo funciona correctamente la aplicación en modo cliente-servidor. Sin embargo, en otro equipo aparece el mensaje: "unknown host".
Definir el la variable DBHOST el nombre del servidor o bien su dirección IP.
¿Cómo acceder en cada momento a las variables de entorno si tenemos distintas conexiones?
Con el método GetValue de la clase SqlServer.
En un listado, cuando una línea de detalle no cabe físicamente en una línea, ¿es posible dividirla en varias?
Sí, en cajas con varias páginas o bandas.
Normalmente aparece una ventana que indica el número de registros que se han recuperado. ¿Se podría eliminar dicha ventana?
Dicha ventana es utilizada por Cosmos para mostrar el número de filas que se han recuperado, y lo normal es que aparezca. No obstante, se puede evitar su aparición con la variable de entorno «QueryProgressWindow».
¿Hay posibilidad de recoger el resultado de una SELECT en un ARGLIST?
Sí, declarando el «ArgList» como parámetro de un método y pasándole tantas variables como valores queramos recoger. Ahora bien, la SELECT se tiene que ejecutar dentro del método donde ha sido definido el «ArgList», debiendo coincidir, además, los tipos de dato.
¿Existe en Cosmos alguna función similar a la "procid" de MultiBase?
No. Lo que puede hacer es simular el número con el método RANDOM.
¿Cómo se puede definir un literal que incluya texto entre comillas dobles?
Utilizando comillas simples para delimitar el contenido del literal. Por ejemplo: ‘select * from tabla where nombre= «minombre» ‘.
¿Qué hay que hacer para utilizar a la vez una "box" asociada a una tabla y un control "tab" sobre la misma?
Incluir el control «tab» dentro de la «box». De esta forma el «tab» usará la misma tabla que la «box».
¿Qué tipo de variable hay que definir para poder ordenar el contenido de una "drop list"?
Una variable definida de tipo General.
¿Hay que hacer algo especial para utilizar el método QueryLike?
Hay que estar en modo no-edición.
¿Qué es lo primero que hay que hacer para utilizar los controles "ActiveX" en Cosmos?
Disponer de los ficheros que contengan los controles y tenerlos registrados, y, si es posible, los ficheros de ayuda para saber los métodos, eventos y propiedades que se pueden utilizar.
¿Cómo se puede hacer una ventana no modal?
Abrir el FORM con el método «Open» y generar un bucle mientras que el formulario esté abierto (método «Hisopeen»), ejecutando dentro del bucle el método «Yield» (para que Windows gestione los mensajes que tenga pendientes).
También se puede crear el objeto en la sección «objects» del módulo y, antes de ejecutarlo, cargarlo en memoria.
¿Cómo usar una "drop list" sin tener una base de datos?
Crear la «drop list» y asignarle un número de «Tags». A continuación, crear una variable de tipo enumerado y darle el mismo número de valores que a los «Tags» del control.
Las opciones de un menú "pulldown" aparecen hacia arriba en lugar de hacerlo hacia abajo.
Añadir el menú como «pulldown» («Screen Layout»).
¿Cómo poner en una "drop list" todos los nombres de los subdirectorios ".dbs" de un determinado directorio?
Se pueden utilizar los métodos de la clase module: OpenDir, ReadDir y CloseDir, y después añadir los nombres de los directorios a la lista con «AddString».
¿Cómo definir un conjunto de variables para que sean como los campos de una tabla?
Con una «struct like table».
¿Cómo validar el valor de los controles?
Se puede realizar de dos formas:
¿Qué evento puede capturar el cambio de fila activa de una "grid"?
El «RowChanged» de la tabla que gestiona el «grid».
¿Se puede quitar la columna de la izquierda de una "grid"?
Mediante los atributos «Rows Number» y «Arrows».
¿Se puede ocultar una pestaña de un "Tab Control"?
Sí, utilizando el método HidePage.
En una "ListBox", al seleccionar un campo que en el repositorio es un "link" a un campo de otra tabla se obtiene la clave primaria de la tabla sobre la que se hace el "link". ¿Cómo se puede evitar esto?
En este caso no se puede hacer por los «links». Habrá que ejecutar una instrucción SELECT y, si queremos sacar campos de varias tablas, tendremos que enlazarlas.
Teniendo definidos como aceleradores las teclas de los cursores, éstas no funcionan en las "window select". ¿Cómo se puede evitar?
No se puede, ya que los aceleradores redefinen las teclas del cursor y a partir de ese momento dejan de funcionar en una «window select».
¿Con qué métodos podemos tratar los errores en Cosmos?
Con los métodos «Error» y «SqlError» y con el evento «Error».
¿Puede Cosmos trabajar vía ODBC?
Si.
¿Cómo hacer que el cursor del ratón sea un reloj?
Utilizando el método «WaitCursor».
¿Podemos ocultar una columna de un "grid"?
Con la propiedad invisible del control que esté en esa columna.
Tenemos un "ListBox" en árbol y el evento "dobleClick" definido, pero sólo se ejecuta en los elementos hoja. ¿Esto es así?
Efectivamente, ya que sobre los elementos «padre» se utiliza para desplegar o cerrar el nodo.
¿De qué forma se puede actualizar el año de una fecha por SQL?
Con las funciones «mdy» y «Year».
En una "include" tenemos definido un "OnCommand" que ejecuta una función que está dentro de esa "include". Desde un FORM que tiene este comando pulsamos sobre un botón y no sale nada.
Los comandos siempre se asocian a botones, y éstos residen en un formulario. Si definimos el comando en un FORM abstracto y nuestro FORM no lo hereda de aquél, no se podrán usar los comandos.
¿De qué forma podemos minimizar el tiempo de carga de datos en una base de datos mediante la instrucción "Load"?
Para reducir el tiempo de carga se pueden borrar los índices antes de hacer los «load» y crearlos al terminar. Para hacerlo de esta manera debemos estar seguros de que los datos a cargar respetan la integridad.
¿Cómo hacer una consulta indicando condiciones en campos de dos tablas a la vez?
Se debe realizar con un FORM en paralelo.
¿Cómo cambiar en un menú la propiedad "checked" por programa de un FORM?
Hay que hacerlo de la siguiente manera:
Al generar un fichero ASCII con descarga de datos decimales, el separador de enteros y de decimales es la coma (,). Al utilizar la instrucción: "var_dec = cadena.substring().Decimal;" se produce un error de conversión.
Hacer previamente un «PutEnv(«DBMONEY», «.»)» para que el separador sea el punto(.) en lugar de la coma (,); de esta forma generará el fichero correctamente. Al leer habrá que hacer un «Replace» de la coma por el punto.
¿Cómo ejecutar un comando de MS-DOS?
Con los métodos «System» o «Exec».
Al generar un listado con el Wizard, ¿podemos mover las columnas?
Sí, para ello tendremos que meter una caja dentro del grupo y, dentro de ésta, las variables.
¿Cómo se puede definir un array?
Definiendo una clase y después un objeto de dicha clase.
¿Cómo cambiar la ordenación en los Query?
Usando el método «OrderBy» o indicándolo en las propiedades de la tabla.
¿Se puede evitar que al pasar el foco entre controles no pase a un botón determinado?
Sí, quitando la propiedad «TabStop» a ese botón.
¿Cómo hacer que cambie el color de un "edit field" cuando recibe el foco?
Utilizando el evento «On Enter» y la propiedad «Background» del «EditField».
¿Cómo se puede saber el estado de un FORM en modo edición?
Con el método Status.
¿Se pueden utilizar componentes externos a Cosmos?
Sí, utilizando la clase «Actives».
¿Cómo asociar una variable a un "Radio Button"?
Definiendo en la variable tantos «values» como opciones tenga el «radio button».
¿Cómo se puede devolver el foco al control que lo tenía después de haber ejecutado una opción de menú?
Guardando en una variable el nombre del control y utilizando luego la función «Control» con esa variable.
¿Cómo controlar los mensajes de las ventanas de error?
Con el método «ErrorLevel» y el evento «On Error».
En un FORM tenemos asociado un botón al comando "delete", redefinido en un Form Abstracto. Al ejecutar dicho botón no ejecuta el comando "delete" por defecto, mientras que con otros comandos sí funciona, y también desde un menú.
Es posible que estemos ejecutando el comando «DELETE» de la clase «FORMTABLE», no así en el menú.
En una tabla de aproximadamente 700.000 registros, declaramos un CURSOR seleccionando unas 40.000 filas. En la "control" de ese CURSOR realizamos un UPDATE de un campo que es índice. ¿Hay alguna forma de agilizar este proceso de actualización?
Sí. Antes de iniciar el proceso, borrar el índice y volverlo a crear al final.
¿Por qué aparece el mensaje: "Imposible abrir fichero de mensajes" al reparar una tabla?
Porque la variable de entorno TRANSDIR no está bien definida.
¿Cómo utilizar la función "Inwords"?
Ha de estar declarada como una función de tipo «dll», pudiéndose utilizar entonces como una función normal.
¿Cómo utilizar dispositivos conectados a los puertos de comunicaciones?
Con las funciones de la librería dinámica «UTIL32.dll» o bien con la clase Stream.
En una "List Box" de tipo "Column List" ¿podemos saber el número de elementos de la lista?
Sí, utilizando el método Count.
No es posible conectarse a una base de datos ya creada; el mensaje de error que aparece es: "Base de datos no encontrada o sin permiso de sistema"
Establecer correctamente el DBPATH en la conexión.
En una base de datos cliente-servidor contra NT previamente creada, al pasarla a una máquina para trabajar en local se produce el siguiente error al intentar seleccionarla: "Imposible abrir catálogo (systables)". La base de datos es transaccional.
Hay que crear un fichero de log en la máquina actual en la misma ruta donde estaba creado anteriormente.
’Toggle
no lo permite’ tags=» custom_id=»]
El operador [ ] sólo sirve para obtener valores, no para asignarlos. Se puede utilizar el método ReplaceAt de la clase Char en versiones 3.4 y posteriores.
¿Cómo se puede quitar el fichero de log en una base de datos transaccional?
Con la instrucción ‘start database nombre_base with log in «» ‘.
Si disponemos de un proyecto en una unidad de red y queremos pasarlo a una unidad local, al instalar Cosmos en local no deja ejecutar ningún módulo. El mensaje que aparece es: "Can not open file".
Hay que redefinir la ruta del repositorio, ya que éste se está buscando en una unidad que no existe.
Tenemos creada una tabla temporal, pero necesitamos cerrar y abrir distintas bases de datos. En un momento determinado, al cerrar la base de datos sobre la que se ha creado dicha tabla y seleccionar otra base de datos, al intentar consultar la tabla temporal aparece un mensaje diciendo que la tabla temporal no existe.
Hay que utilizar tantas definiciones con la clase «SqlServer» como bases de datos tengamos.
¿Cómo se puede saber si un fichero existe o no?
Utilizando el método «TestFile» de la clase «Module».
¿Se puede imprimir texto en vertical?
Sí. Desde la versión 4.4 de Cosmos para los controles de tipo Text y Variable.
Hemos creado una serie de usuarios mediante el Editor de Configuración. ¿Tienen éstos alguna relación con los usuarios que podemos utilizar en la variable de entorno DBUSER?
No. Sólo en local y versiones LAN si en el entorno del usuario que está activo no está definida la variable de entorno DBUSER.
¿Se pueden asignar dinámicamente comandos a botones?
Sí, utilizando el método «SendCommand» en el «OnClick» del botón.
¿Se pueden borrar los comandos definidos en un proyecto?
No. Los comandos que aparecen en el proyecto son los definidos en los módulos que actualmente están cargados.
En una "list box" queremos ver el contenido de un fichero. Al ejecutar el módulo no aparece el fichero, pero si hacemos un "test" sobre él sí está.
Hay que asignar a la propiedad «ListFile» la ruta del fichero que queremos ver en el «On Open» del formulario.
¿De qué modo se pueden realizar búsquedas como en MultiBase?
Poniendo la variable de entorno «QUERYLIKEEXTENDED=TRUE» y con el método «SetOption» de las clases «Module», «Form» o «FormTable».
¿Se puede hacer que en un "Edit Field Multilínea" cambie de línea cuando llegue al final del control?
Sí, activando la propiedad «Auto Wrap» de la pestaña «Special».
¿Dónde se crean los ficheros temporales, en memoria o en disco?
En el directorio especificado en la variable de entorno «DBTEMP».
¿Cómo llamar a un "Extern Objects"?
Con el método «Run» de la clase «Module». Por ejemplo: «Module.Run;».
¿El ODBC sólo funciona en cliente-servidor?
Si.
¿Por qué no se puede generar la documentación?
Para ello hay que tener definidas en el fichero «cosmos.ini» las entradas correspondientes al documentador.
¿De qué manera se puede hacer un "input" simulando el funcionamiento de Basic?
Mediante una función de librería o a través de un «include» llamando a un FORM con un título, pasando una variable por referencia y asociando el texto a la variable.
¿Cómo poner una línea en un grupo de impresión en Cosmos?
En una caja con dos páginas.
En campos de texto y "EditFields" ¿cómo pasamos el foco de un control a otro?
Con el método SetFocus.
¿Cómo se puede generar un repositorio de una base de datos Interbase vía ODBC?
Utilizando una conexión ODBC, siempre y cuando exista una compatibilidad de tipos.
Creamos un sinónimo para una tabla desde Cosmos e intentamos utilizar la tabla a través del sinónimo desde MultiBase.
Para poder utilizar dicho sinónimo el usuario que lo ha creado en Cosmos ha de ser el mismo que el que lo intenta utilizar en MultiBase.
¿Cómo ejecutar un proyecto Cosmos desde el editor de desarrollo?
Seleccionando el módulo de inicio y pulsando [F5].
Si hay definidas conexiones a diferentes bases de datos, ¿cómo se puede conectar a ellas por programa?
Utilizando los métodos «Attachconnection» y «Connect».
¿Qué hay que hacer para que salga en una ventana el resultado de una SELECT?
Utilizar el método «SelectWindow».
Para imprimir en una impresora matricial, ¿es preferible utilizar "Streams" o "Pages"?
En versiones anteriores a la 3.2 es mejor utilizar Streams. Si utilizamos Pages es recomendable emplear fuentes de impresión en lugar de True Type.
¿Se puede ejecutar un módulo que no sea el principal?
Sí, empleando la opción «-omd» del comando «Cosrun».
¿Cómo se deshabilita una página de un "Tab Control"?
Con la propiedad «DisablePage(
Si cargamos una tabla con 1 millón de registros y a continuación los borramos no se libera el espacio en disco. ¿A qué es debido?
Los registros no se borran físicamente, sino que se marcan como «borrados».
Para eliminarlo, podemos hacer:
¿Cómo imprimir un "Edit Field" multilínea?
Con otro «Edit Field» multilínea o con los métodos «Wraped».
Tenemos un "include" y un "On Command" redefinido. Si lo incluimos dentro del código de la clase funciona, pero en el "include" no. ¿Qué hay que hacer para que funcione en el "include"?
Definir la clase como derivada de la clase abstracta del INCLUDE.
En un campo "Edit Field" con una variable char(1), ¿qué se puede hacer si el campo tiene una serie de valores predefinidos?
Declarar el campo de tipo enumerado.
Queremos que un campo de una estructura lo herede otra estructura, es decir, que el campo "a" (Estructura 1) sea común al campo "b" (Estructura 2).
Hay que definir una segunda estructura en la que uno de los componentes sea la estructura predefinida en el módulo.
¿De qué manera se puede asociar un char(1) a un "check box"?
Definiendo el campo como «booleano».
Hemos creado una "view" de una SELECT de varias tablas. ¿Se puede hacer una SELECT de dicha "view"?
Sí, pero al crear la «view» tenemos que darle las columnas que van a formar parte de ella.
¿Se pueden enviar varios parámetros a un módulo desde la línea de comandos del "cosrun"?
No, solamente se puede pasar un parámetro por módulo.
No funciona el "QueryEnd". ¿A qué es debido?
A que está activa la variable de entorno QUERYBUFFERING. Desactivarla.
En un Control ActiveX, ¿para qué sirve la clase "event"?
Para poder controlar sus eventos.
¿Cómo se pueden poner "labels" a un grupo?
Con la propiedad «Label» del grupo. Si las variables están dentro del «grupo», también valen las «labels» de las variables. Si éstas están dentro de una «caja», y ésta a su vez dentro del grupo, se pueden definir las «labels» en la caja.
¿Cómo ejecutar el "EditNew" nada más entrar al formulario?
Poniendo en «On Open» del formulario:
¿Existe algún método que devuelva la fecha y hora de modificación de un fichero?
Sí, el método GetFileDate de la clase Module. Este método se implementó en la versión 3.9 de Cosmos.
¿Se puede pasar un "char" a un "decimal"?
Sí, el «char» ha de estar formateado. Reemplazar los puntos por «» y la coma por un punto.
¿De qué forma se puede saber qué usuarios están conectados en un servidor UNIX en cliente-servidor?
Dada una tabla con un "char(5)" y el atributo "rigth", introducimos unas filas con la siguiente información: "1", "2" y "10". Al hacer una SELECT sobre la tabla ordenando por esa columna, aparecen de la siguiente manera "1", "10" y "2". ¿Por qué?
Porque estamos ordenando cadenas de caracteres y no números.
Intentamos hacer un "Update" con el método "Select" en un programa, pero éste no funciona. ¿Por qué?
Porque se está haciendo con el método «Select», cuando lo correcto sería hacerlo con el «SqlExec».
¿Se pueden utilizar GIFs animados en Cosmos?
No.
¿Existe algún comando en Cosmos que simule el "Query" de MultiBase?
Sí, el comando «QueryLike».
¿Se puede cambiar una columna de tipo "serial" a numérico y viceversa?
Se puede cambiar de «serial» a «integer» sin problemas. Sin embargo, para cambiar de «integer» a «serial» hay que descargar todas las columnas de la tabla, menos la «serial», borrarla y crearla con el tipo de dato «serial» y, por último, realizar la carga de la tabla.
Tenemos una clase derivada de "ArgList" Decimal. ¿Se puede definir un objeto derivado de esa clase en la sección "objects"?
No.
¿Existe algún método para saber sin una fila está bloqueada dentro de un FORM?
No. Lo que se puede hacer es declarar un CURSOR, leer la fila y ver si está bloqueada o ejecutar la aplicación Monitor que muestra los registros y tablas bloqueadas.
Al imprimir etiquetas, ¿qué se puede hacer para que vayan saliendo por la impresora sin tener que esperar al final?
Hay que utilizar el método «WritePage» en lugar del «SendPage».
¿Se puede asociar una tabla temporal a un "grid"?
Sí. Para ello hay que crear una «template» en el repositorio con la estructura de la tabla y asociarla al «grid».
¿Se puede acceder a los "tags" del repositorio?
Sí, utilizando la «rep.dll».
¿Cómo se hace para utilizar los parámetros que se pasan en la "main" dentro de un FORM?
Asignándolos a un objeto global o bien pasarlos al FORM de la siguiente manera:
nombre.objeto = objeto
¿Se puede dar el mismo nombre a un parámetro y a una variable local?
No, ya que comparten el mismo ámbito.
Al hacer un "update" de un campo con el método "Prepare" de la clase "SqlCursor" se produce un error sintáctico. ¿Por qué?
Porque el método «Prepare» que hay que utilizar es el de la clase «SqlStatement».
¿Se puede declarar un CURSOR "for update" de una instrucción SELECT preparada?
Sí, para ello hay que incluir la cláusula FOR UPDATE en la instrucción PREPARE de la instrucción SELECT y darle un nombre al CURSOR con el método «Púntame» si queremos realizar actualizaciones sobre dicho CURSOR.
Al ejecutar una instrucción "Update" sobre una tabla aparece el siguiente mensaje: "faltan componentes en la clave"
No se hace un UPDATE sobre columnas que tienen el atributo «no update».
¿Qué manera rápida hay de saber el número de filas de una tabla?
Ejecutando la instrucción «Update statistics for table» y a continuación una SELECT por la columna «nrows» de la tabla del catálogo «systables» de la tabla en cuestión.
¿Se puede saber si un "AcceptEdit" que graba una tabla desde un FORM ha tenido éxito o no?
Hay que controlar esto antes de hacer el «AcceptEdit». Existen dos estados («metodo Status») dentro de una tabla: «New» y «Browse». Si el estado es «New» es que se está dando un alta, y en ese momento controlaríamos la existencia o no de la fila a grabar.
¿Por qué puede ocurrir que, en un mantenimiento de una tabla a través de un "grid", al realizar la modificación de un registro, ésta no se lleve a cabo?
Porque la tabla no tiene clave primaria.
Tenemos un CURSOR dentro de un bucle y la condición de salida es la siguiente: "id_cursor.Fetch == false", pero no termina nunca. ¿Por qué?
Porque hay que preguntar por «Found».
En una base de datos transaccional, ¿en el fichero de log se guardan también las lecturas?
No, sólo aquellas operaciones SQL que indiquen un cambio en la estructura o en los datos de la base de datos.
¿Se puede eliminar el botón del "Print" del "Preview"?
No, pero se puede utilizar el método PreviewEx que sí lo permite. Este método se implementó en la versión 4.2.2 de Cosmos.
¿De qué manera se puede borrar un fichero?
Con el método «Delete» de la clase «Module».
¿Se puede asociar una variable en un "check box".
Sí. Además, dicha variable puede ser de cualquier tipo, pero en la pestaña de «Special» tiene que tener «boolean».
¿Cómo reutilizar un módulo definido en otro proyecto?
Con los «extern objects» de Cosmos, pero teniendo cuidado de no poner en el path la ruta absoluta, o bien enlazando el módulo.
¿Cómo componer una fecha en una instrucción SELECT si el día, mes y año están en columnas distintas?
Con la función «mdy(
¿Cómo podemos ejecutar un programa sin que reciba el foco?
Con la función «WinExec» de la librería dinámica «Kernel32.dll».
Al definir un acelerador con una tecla, ¿podemos utilizar la funcionalidad normal de dicha tecla?
No, Sólo podemos restringir el uso del acelerador a un FORM en concreto con el método «NewAccelerator».
¿De qué forma se pueden mostrar los mensajes de un fichero de mensajes?
Con los métodos «MsgText» y «MsgTextDef».
¿Cómo se pueden pasar argumentos en el comando "Cosrun"?
Con el modificador «-arg».
¿Traduce la parte decimal el comando "Inwords"?
No, ha de hacerse manualmente.
En un "MessageBox" queremos lanzar un mensaje cuyo contenido es muy largo y deseamos que aparezca en varias líneas. ¿Cómo se puede hacer esto?
Hay que poner un retorno de carro y un salto de línea con el método «Character». Por ejemplo: «10.Character;» «13.Character;».
¿De qué forma se puede leer un fichero que tiene una única línea cuyo contenido es tan grande que no cabe en un "char"?
Leyendo el fichero en modo binario.
En una tabla, al enviar un campo booleano (Char(1) values N,S interface CheckBox) a una hoja de formulario de impresora, aparece correctamente, pero muestra un mensaje indicando que la "variable" y el "control" son incompatibles. ¿A qué puede ser debido?
Hay que definir la variable de tipo «boolean», no del tipo de dato «boolena» (en la definición de variable en la pestaña de «values»), indicando ahí sus valores, uno por cada línea.
¿Cuál es el equivalente en Cosmos de la variable interna de MultiBase "Operation"?
Los métodos «InEditQueryLike» y «Status».
¿Cómo podemos cambiar la página de una caja por programa?
Con la propiedad «Page».
Las funciones "EvalVar" y "AsgVar" no dan aviso o error en ejecución si la variable cuyo nombre se pasa como parámetro no existe. ¿Se puede realizar algún tipo de control al respecto?
Efectivamente no se produce ningún aviso, pero el método devuelve verdadero o falso si la variable no existe, por lo que se puede realizar una comprobación.
Al imprimir directamente al puerto con un STREAM, ¿cómo se pueden poner atributos de impresión tales como negrita, comprimido, etc.?
Enviando directamente las secuencias de escape.
¿Se puede saber cuál es el nodo "padre" de un nodo en una lista en árbol?
Sí, con el método «GetTreeParent».
¿Cómo se puede cargar en una "drop list" el contenido de una tabla?
Utilizando un CURSOR y el método «AddString», o bien utilizando el método «LoadSelect».
¿Se puede trabajar en cliente-servidor a través de un router?
Si.
¿Cómo podemos tener dos tablas abiertas al mismo tiempo en determinados procesos?
Hay que utilizar dos objetos de la clase «SqlServer» distintos.
En un mantenimiento cabeceras-líneas queremos ver la información de la tabla de líneas cargando dicho contenido en una lista. ¿De qué forma se puede hacer?
Utilizando el evento «RowChanged» de la tabla de cabeceras y un «LoadSelect» sobre la lista de tipo «sql» y «column list».
¿Cómo se puede seleccionar un registro de una tabla de cabecera sin que seleccione todos los registros de la tabla de líneas?
La única forma posible es no conectando las tablas y realizando un mantenimiento manual.
¿Se puede leer el fichero de "log" de una base de datos transaccional?
No. Lo único que se puede hacer es un «»rollforward database to «file»»», donde nos aparecerán todas las instrucciones.
¿Para heredar las propiedades de un formulario, éste tiene que ser abstracto?
No necesariamente.
¿Se puede utilizar el método "GetEnv" para leer la variable de entorno "DBHOST"?
Sólo se puede hacer si está definida dentro del entorno del usuario, si no, es necesario utilizar el método «GetValue».
¿Cómo saber en el evento "ClickHeader" la columna donde se ha pinchado?
Por el parámetro que recibe dicho evento.
¿Cómo convertir una base de datos a transaccional?
Con la instrucción: start database
¿Qué capacidad tiene Cosmos en cuanto a registros?
Tiene un número ilimitado de accesos en cuanto a registros, ficheros y rowsize.
Puesto que los campos numéricos no admiten edición, lo simulamos ejecutando la instrucción: "char=decimal.Using(3);". De esta forma se consigue edición, pero el campo queda ajustado a la izquierda. ¿Qué hay que hacer para ajustarlo a la derecha?
Utilizando el método «SetColumnAlign».
¿Cómo se puede deshabilitar una rama entera de un menú?
Utilizando este conjunto de instrucciones:
En un mantenimiento cabeceras-líneas, las líneas se llevan en un "grid", el cual lleva un menú para mantenerlo. Si quisiéramos asignar un valor a un campo de la tabla que está oculto, ¿de qué manera podemos saber en qué tabla nos encontramos?
Utilizando el método «EditingTable» para saber qué tabla está en edición y posteriormente aplicar el método «ChildTable» para saber si es la tabla de líneas. A continuación, si el «Status» es «New» se le podrá asignar valor al campo.
¿Es mejor usar ActiveX o DDE?
Es igual, pero es más manejable el ActiveX.
¿Cómo crear un acceso directo a un proyecto?
Mediante la siguiente línea de comando:
cosrun -prj
Dentro de un grupo tenemos una caja con campos y dibujamos una raya vertical, pero se muestra siempre. ¿Qué se puede hacer para que la dibuje solamente una vez?
Hay que activar el «store status» solamente en una línea.
¿Se puede crear un repositorio de una conexión ODBC?
En versiones 3.3 y posteriores sí.
¿Cómo hacer que en un grupo se vea como fondo un "bmp"?
En primer lugar, colocar el «bmp»; a continuación, poner encima el grupo y pinchar la «T» en la paleta de colores de Cosmos y arrastrarla al grupo para que lo ponga transparente.
¿Hay que incluir la librería de conexión a todos lo módulos de un proyecto?
No, basta con incluirla en el módulo de inicio.
¿Se puede cambiar el título de un FORM de forma dinámica?
Sí. Por ejemplo, con la instrucción:
Self.Frame().Text = «Nuevo Título del Form»;
¿Cómo se puede hacer que en un "grid" aparezcan los últimos movimientos sin tener que desplazarse con la barra de scroll?
Desactivando el «buffering» y situándonos donde queramos con el evento «QueryEnd» de la tabla. También es posible hacerlo redefiniendo el comando «AcceptEdit».
¿Hay alguna función en Cosmos que permita pasar un carácter a número?
Sí, utilizando los conversores.
¿Se pueden utilizar los "lookup’s" del repositorio en una "SelectWindow"?
No, los «lookups» no son del SQL. Habría que definir la SELECT con un «inner join».
¿Se pueden tener menús comunes en varios formularios?
Sí, para ello pondremos el menú en una «include» y, posteriormente, la include en los formularios que queramos.
¿Cómo se pueden recoger en forma de condición los valores de la lista en curso?
Con el método «GetQueryByForm».
¿Qué funcionalidad tiene el EasyReport de Cosmos?
Generar informes.
¿Se puede tener la misma tabla en una "caja" y en un "grid"?
Sólo es posible introduciendo el «grid» dentro de la caja.
¿Se puede crear una clase a partir de nada?
No, siempre tiene que haber una «parent class».
Necesitamos crear un "array" de una clase "struct". Hacemos un método en la clase "array" que permite cargar la estructura. ¿Es correcto?
No. El método tiene que estar declarado en la clase «struct» para independizar más la estructura.
Durante la ejecución de un programa, ¿cómo se puede hacer un "hard copy" de la pantalla por impresora?
Pulsando simultáneamente las teclas [Alt]+[PrtScreen] o bien utilizando el método «ExportImage» de la clase «form».
Tenemos un "Grupo con caja". Si no se imprimen todas las líneas del grupo el resto tiene el formato por defecto de la caja. ¿Cómo se puede evitar esto?
Al hacer el diseño la dejaremos en blanco, o bien por programa podemos recorrer las líneas y mostrar una página en blanco o, por último, utilizar el método «Truncate».
Al ejecutar un "AcceptEdit", ¿podemos saber el error que se produce cuando se inserta un registro con clave duplicada?
No, ya que el mensaje que da el «AcceptEdit» es un «Warning». Además, depende del gestor de base de datos con el que estemos trabajando.
Dentro de un "grid" soportamos el mantenimiento de una tabla en modo líneas. Esta tabla tiene un campo "serial" y está incluido en la línea del "grid". Al intentar grabar el registro aparece un mensaje de error indicando que no puede grabar nulo en una columna declarada como "Not null", precisamente la columna de tipo "serial". ¿Por qué sucede esto?
Hay que poner una variable asociada en la sección «tables» con los atributos «noentry» y «noupdate».
En un "Band Group", ¿cómo podemos saber el número de líneas que quedan?
Utilizando el método «RemainigSpace();».
En una instrucción PREPARE, al utilizar una SELECT con la cláusula ORDER BY aparece el siguiente mensaje de error: "Objects scoped in method (Into) must contain SqlCursor scoped" (en la cláusula ORDER BY se ha puesto el nombre de las columnas).
En la cláusula ORDER BY dentro de una PREPARE no se pueden poner nombres de columnas, hay que poner la posición de dicha columna dentro de la lista de la SELECT.
¿Cómo podemos cambiar el "Mask" de una variable de un listado?
Utilizando la siguiente línea de código:
¿Cómo saber en qué campo estamos dentro de un control?
Por la variable asociada con el método «Field». Si lo que queremos saber es el control que tiene el foco podemos utilizar el método «CurrentFocus».