Sabías que … (3)

Vamos con una nueva entrega de nuestro mítico juego… “Sabías que” en este post veremos curiosidades sobre búsquedas, cestas y listas.

Por si te perdiste las dos primeras entregas del “juego”, no está de mas recordarlas:

¿Sabías que..?

En los objetos Búsqueda no sabemos a priori el campo por el que va a estar ordenada la lista de salida

    • Aunque esto ya está documentado en la ayuda, no está de más recordarlo. Para ordenar la salida de un objeto Búsqueda tendremos que usar siempre un comando Ordenar lista.
    • En procesos, funciones o manejadores de evento que disparen búsquedas, usaremos el comando Ordenar lista, en acciones que disparen búsquedas, incluiremos entre la Búsqueda y el objeto de lista de la salida un proceso, con origen y destino lista de la tabla de la búsqueda, que ordene y añada la lista a la salida, .

Las Cestas pierden la ordenación que tuviera establecida la Lista Origen

    • Si ordenamos la Lista de salida de una Búsqueda y la copiamos a una Cesta para poder volcarla a una Rejilla, entonces perderemos el orden establecido.
    • Por lo tanto, el comando Ordenar lista deberá ejecutarse después de copiar la Cesta a la Rejilla. Veamos un ejemplo:
Rem ( Ejecución de una Búsqueda para alimentar la Rejilla del formulario )
Rem ( Utilizamos la Cesta como bufer intermedio para rellenar la Rejilla con el resultado de la Búsqueda )
Cesta: Crear cesta local ( MI_BUSQUEDA@MiApp_app, oCesta )
Crear manejador de objeto ( oBuscar, Proceso PRO_BUSCAR@MiApp_app )
Libre
Set variable local de objeto ( oBuscar, DFECHA_INI, DFECHA_DES_INI )
Set variable local de objeto ( oBuscar, DFECHA_FIN, DFECHA_DES_FIN )
Libre
Disparar objeto ( oBuscar, 3º plano: Servidor (síncrono), )
   Set ( NNUM_REGISTROS, sysListSize )
   Rem ( ¡OJO! La Cesta pierde la ordenación que tuviera establecida la Lista Origen )
   Cesta: Agregar lista a la cesta ( oCesta )
Interfaz: Procesar ( GRD_DOCUMENTOS, Todas )
   Cortar lista ( 0, )
   Cesta: Agregar a la lista en curso ( oCesta )
   Rem ( Tenemos que ordenar la lista obtenida después de pasar por la Cesta porque ésta deshace la ordenación )
   Ordenar lista ( #F_REGISTRO, #ID, , , , )
   Invertir lista
   Seleccionar ficha por posición ( 1 )
Interfaz: Establecer foco ( GRD_DOCUMENTOS )

El comando “Modificar ficha de maestro” FUERZA EL refresco DE los campos DEL MAESTRO

    • En los controles del formulario, después de haber modificado la ficha del Maestro desde un proceso independiente, los campos de dicho maestro no refrescan los cambios porque el puntero a maestro no ha cambiado.
    • Para forzar la lectura de la ficha del maestro desde el servidor y actualizar la caché es suficiente con ejecutar el comando Modificar ficha de maestro desde un manejador de evento.
    • Este comando produce un refresco en el formulario de todos los campos del maestro.

El ancho y alto mínimos de los controles Caja de texto vienen determinados por la clase VMainWindow y las propiedades CSS min-weight y min-height

    • Si has fijado a un valor determinado las propiedades CSS min-weight y min-height de la clase VMainWindow comprobarás que los controles Cajas de texto de los formularios en modo Vista también se verán afectados.

El comando Set dato de retorno no funciona en los procesos, aunque hay una excepción

    • En los procesos que van a ser usados desde la web (con VModApache) la forma de devolver el dato al servicio de Apache es mediante el comando Set dato de retorno.
    • Esto ocurre cuando el Estilo del proceso lo fijamos a “Accesible Web“.

La propiedad Valor del control Botón de radio debemos expresarla como una Constante

    • El control Botón de radio tiene la propiedad Contenido (expresión de fórmula) y la propiedad Valor (valor constante).
    • Por lo tanto, si el contenido es numérico pondremos Valor = 9 y si es de tipo carácter pondremos Valor = A, sin las comillas.

La función HomePath() en Cloud nos permite crear directorios en tercer plano

    • Crear directorio” es un comando de Velneo que actúa a nivel de sistema operativo. Por esa razón en Cloud tenemos que acceder con al ruta completa homePath() + “/Velneo/datos/<<archivo.ext>>” que es la ruta del sistema Linux en el vServer.
    • SDV: Subir fichero al servidor” es un comando de Velneo de tipo Cliente/Servidor, por lo tanto la ruta donde guardamos el fichero es una ruta Virtual. Esa ruta Virtual se define en vAdmin en la opción de menú Datos. Por defecto disponemos de la ruta Virtual “datos/” que equivale a la ruta física homePath() + “/Velneo/datos/ en el vServer.

Si cruzamos 2 listas del mismo tamaño el resultado se ordena igual que la lista cargada en primer lugar

    • Ya sabemos que cuando cruzamos 2 listas, la lista resultante tendrá el mismo orden que la lista de mayor tamaño
    • Cuando cruzamos 2 listas, si éstas tienen el mismo tamaño, el orden de la lista resultante es el mismo que la lista que hayamos cargado primero

Por ejemplo:  Cargo la Lista1 y se añade a la Cesta1. Cargo nuevamente la Lista1 con el mismo número de registros pero en distinto orden y cruzo la Cesta1 con la Lista1.
El orden que prevalece es el de la Cesta1.

Podemos usar el selector CSS CLASE[objectName|=valor] para filtrar los controles de nuestra aplicación

    • Cuando queremos aplicar un determinado CSS a un objeto concreto de nuestra aplicación usamos el selector CLASE#IDENTIFICADOR
    • Sin embargo, podemos usar también un Selector que nos aporta una gran flexibilidad, es el selector CLASE[objectName|=<valor>] que funciona seleccionando los controles cuya propiedad Identificador comienza con <valor>.
      Veamos un ejemplo:

Queremos que el usuario identifique visualmente los campos obligatorios dentro de los formularios. Para ello usaremos un fondo amarillo brillante.
La selección en el CSS será QDoubleSpinBox[objectName|=NUM_O_], QDateEdit[objectName|=DAT_O_], QDateTimeEdit[objectName|=DAT_O_], QTimeEdit[objectName|=TIM_O_], QLineEdit[objectName|=TXT_O_] {background: yellow;}

De esta forma es suficiente con cambiar el Identificador de un control para que tenga fondo amarillo, sin tocar el CSS de la aplicación.

Otros ejemplos:

QPushButton:flat[objectName|=CMD_IMP_] {background-color: orange;}    /* Botones naranjas */
QLabel[objectName|=LBL_AZUL_] {color: SteelBlue;}                     /* Etiquetas azules */

Y ahora confiesa… ¿cuántas sabías? 

Déjame un comentario mas abajo y comenzamos el debate.

 

La entrada Sabías que … (3) aparece primero en AyudaVelneo.

Sabías que …

Hoy os propongo un “juego”…

Se sincero…

¿Sabías que..?

El juego se llama “Sabías que?

¿Sabías que se puede añadir un campo nuevo a una tabla que ya contiene datos y rellenarlo con un valor inicial para los registros que ya existen?

    • Crear el nuevo campo con el valor inicial si es necesario.
    • Añadir un subobjeto Traspaso de campo seleccionando el nuevo campo y rellenando la fórmula con el valor que tendrá inicialmente en los registros existentes.

¿Sabías que los campos Alfa 256 se pueden ordenar sin tener en cuenta mayúsculas/minúsculas, acentos y signos de puntuación?

    • Crear un índice por el campo Alfa 256 con el Modo igual a Campo porción. Establecer la longitud del texto que se incluirá en el índice y la conversión a Alfa 40 para no tener en cuenta mayúsculas/minúsculas, acentos y signos de puntuación.

¿Sabías que no es necesario usar vInstallBuilder si solo queremos actualizar la Aplicación y no es necesario copiar nuevas tablas con datos iniciales?

    • Copiar los ficheros actualizados de los proyectos de aplicación (vca) y de datos (vcd) a la carpeta cajas de vServer (en un sistema Windows 64 es C:/Windows/SysWOW64/config/systemprofile/Velneo/cajas). La subcarpeta donde copiamos los ficheros vca y vcd tiene el mismo nombre que la solución a la que pertenecen.
    • Reinicar la solución desde vAdmin teniendo en cuenta que no puede haber enganches activos en el proyecto de aplicación principal ni en todos los proyectos heredados por la solución.

¿Sabías que el servidor vServer desconectará automáticamente aquellos componentes clientes de edición (vDevelop, vTranslator) y de administración (vAdmin) tras 12 horas sin uso?

    • En el caso de clientes de edición (vDevelop y vTranslator), no se deshará la desprotección de los proyectos, con el fin de permitir enviar los cambios realizados en esa sesión de edición que se ha mantenido abierta e inactiva durante más de 12 horas. En ese caso, para guardar los cambios simplemente deberíamos ejecutar la opción de conexión con el servidor y, una vez restablecida, guardar el proyecto que estábamos editando.

¿Sabías que si un enganche de vClient se ha perdido (por ejemplo un fallo de conexión), el enganche quedará activo en el servidor durante 5 minutos? Este tiempo es configurable.

    • El tiempo de desconexión del enganche es configurable mediante una entrada en el registro o archivo de configuración del servidor. La entrada se llama ConnectionExpiredSeconds y el valor por defecto es 300 segundos. El tiempo debemos indicarlo en segundos y la clave se lee en el arranque del servidor.
      Por ejemplo, en Windows la clave se guarda en HKEY_USERS/.DEFAULT/Software/Velneo/vServer/ConnectionExpiredSeconds para el usuario system.

¿Sabías que cuando instanciamos un Objeto mediante un manejador de objeto podemos dispararlo las veces que queramos en el mismo proceso?

    • El manejador de objeto es local al proceso o manejador en el que se haya declarado.
    • Una vez declarado el manejador, podemos asignar valores a las Variables locales y Disparar el Objeto las veces que queramos.

Por ejemplo, queremos obtener todos los pedidos de las zonas geográficas donde el Usuario es responsable:

Rem ( Declaramos el manejador del objeto Búsqueda )
Crear manejador de objeto ( hBuscar, Búsqueda BUS_GBX_EXP@0PS_Gabex_app )

Rem ( Asignamos valor a las variable locales del Objeto)
Set variable local de objeto ( oBuscar, NPERIODO, NPERIODO )
Set variable local de objeto ( oBuscar, NID_TIPO_PED, NID_TIPO_PED )

Rem ( Solo se buscan los pedidos de las Zonas geográficas del Usuario conectado )
Cesta: Crear cesta local ( PEDIDOS@MiApp_dat, cesPedidos )

Rem ( Obtenemos las Zonas geográficas del Usuario )
Cargar lista ( ZONAS_USUARIOS@MiApp_dat, ZONA_USU, NID_USUARIO, , , )
        Rem ( Disparamos la búsqueda tantas veces como Zonas geográficas tenga asignadas el Usuario )
        Rem ( Acumulamos el resultado de las búsquedas en una cesta )
        Recorrer lista sólo lectura
                Set variable local de objeto ( oBuscar, CID_ZONA, #ZONA )
                Disparar objeto ( oBuscar, No aplicable, )
                        Cesta: Agregar lista a la cesta ( cesPedidos )
Rem ( Devolvemos la lista de pedidos )
Cesta: Procesar ( cesPedidos )
Ordenar lista ( #FECHA_ALTA, , , , , )
Invertir lista
Añadir lista a la salida

¿Sabías que las cestas declaradas en un manejador son compartidas con los manejadores que éste llama?

    • Las cestas declaradas en un Manejador del formulario son visibles también desde los Manejadores que se ejecutan desde el Manejador inicial.
    • Hay que ser conscientes de este hecho y en su caso evitar usar el mismo nombre de Cesta en los manejadores de un formulario.

En este ejemplo la cesta cesEmpleados es compartida por el manejador SECUNDARIO llamado por el manejador PRINCIPAL.

Rem ( Manejador PRINCIPAL )
Rem ( ----------------------------------- )
Rem ( Una Cesta creada en un manejador es compartida con los manejadores que éste llama )
Cesta: Crear cesta local ( EMPLEADOS@MiApp_dat, cesEmpleados )
Cargar lista ( EMPLEADOS@MiApp_dat, NAME_TROZOS, "jos", , , )
        Cesta: Agregar lista a la cesta ( cesEmpleados )
Cesta: Procesar ( cesEmpleados )
        Crear manejador de objeto ( oLisEmplados, Rejilla GRD_EMPLEADOS@MiApp_app )
        Añadir lista al objeto ( oLisEmplados )
        Disparar objeto ( oLisEmplados, No aplicable, )

Rem ( Ejecuta un Manejador secundario )
Interfaz: Ejecutar manejador de evento ( SECUNDARIO, )


Rem ( Manejador SECUNDARIO )
Rem ( ----------------------------------- )
Rem ( Si el manejador cesEmpleados ¡¡ya existe!! la cesta en lugar de crearse se reutiliza con los registros que tenga )
Cesta: Crear cesta local ( EMPLEADOS@MiApp_dat, cesEmpleados )
Cargar lista ( EMPLEADOS@MiApp_dat, NAME_TROZOS, "luis", , , )
        Cesta: Agregar lista a la cesta ( cesEmpleados )
Cesta: Procesar ( cesEmpleados )
        Rem ( Aquí obtenemos los Empleados "jos" más los empleados "luis" )
        Crear manejador de objeto ( oLisEmplados, Rejilla GRD_EMPLEADOS@MiApp_app )
        Añadir lista al objeto ( oLisEmplados )
        Disparar objeto ( oLisEmplados, No aplicable, )

Y ahora confiesa… ¿cuántas sabías? 

Déjame un comentario mas abajo y comenzamos el debate.

La entrada Sabías que … aparece primero en AyudaVelneo.