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.

Vista de datos: el poder de Velneo al alcance de tus listas

Velneo se define como “Plataforma de desarrollo de aplicaciones empresariales”. Al final el usuario quiere ver datos. Estos datos se muestran a través de listas de registros… y aquí es donde se muestra el poder de nuestro control vista de datos.

Vista de datos listas al alcance de tu mano

En post anteriores vimos como podíamos utilizar el control “vista de datos” para mostrar registros dentro de un menú o cómo optimizar la carga de registros en una vista de datos.

Hoy nos vamos a centrar en el propio control “vista de datos”.

Según la definición de Velneo, la vista de datos es un:

Control de Contenedores que permite incluir dentro de un formulario una acción, desde la que podremos disparar objetos de vista de datos, como por ejemplo, rejilla, formulario, multivista, etc.

 En esta definición aparecen dos de los conceptos fundamentales de Velneo:

  • Concepto de flujo (ya vimos este concepto aquí).
  • Concepto de abstracción o diferenciar el qué del cómo es decir, qué queremos mostrar (lista de registros) de cómo lo queremos mostrar (rejilla, formulario multivista, etc).

Vamos a ver como se aplican estos conceptos.

Crear la vista de datos en nuestro formulario

Hemos visto anteriormente, en la definición de la vista de datos, que éste es un control de los que podemos incluir dentro de un formulario.

Antes de crear los objetos necesarios para mostrar los registros, también deberemos tener en cuenta el flujo. Como ya sabemos, un formulario puede pertenecer a una tabla o ser un formulario sin origen. Por lo tanto deberemos tener en cuenta dónde nos encontramos y qué queremos mostrar.

Generalmente necesitaremos dos objetos para mostrar los registros en nuestra vista de datos:

Control vista de datos

  • En la propiedad “Objeto 1” indicaremos qué queremos mostrar (en este caso los registros que devuelve una búsqueda), por lo tanto una lista de registros: n registros, 1 o ninguno, dependiendo de la búsqueda.
  • En la propiedad “Objeto 2” le indicaremos cómo queremos mostrar esos registros. En este caso al ser la salida del “Objeto 1” una lista de registros, podemos seleccionar cualquier objeto de tipo lista de la tabla a la que hace referencia la búsqueda de dicho objeto.

Esta sería la manera mas sencilla de mostrar los registros de una tabla en una vista de datos… pero Velneo tiene sus peculiaridades.

Consejos antes de crear la vista de datos en nuestro formulario

Algunos consejos antes de crear vistas de datos a lo loco.

  • Si tu aplicación va a ser heredada por otras, nunca vas a saber donde se van a utilizar tus formularios… por lo tanto cuidado con la carga de registros.
  • Velneo carga todos los objetos incluidos en un formulario al crearlo. Es decir si tienes un formulario en el que muestras la ficha de un cliente y en ese formulario tienes un separador de pestañas en el que tienes los plurales de pedidos, albaranes y facturas de dicho cliente… todos esos datos, se cargarán al entrar en la ficha… por lo tanto cuidado con la carga de registros.
  • Si tienes un formulario sin origen que actúa como menú y en dicho formulario cargas n vistas de datos con miles de registros y cada una de ellas se resuelve con una búsqueda de varios componentes, también se cargarán todos los registros al entrar al formulario… por lo tanto cuidado con la carga de registros.
  • Siempre hemos dicho que las búsquedas (o procesos que cargan búsquedas), mejor resolverlas en tercer plano (es decir, en el servidor). Hay una salvedad. Si la búsqueda en cuestión es por un único componente, no vamos a notar diferencia de carga entre lanzarla en primer plano o lanzarla en tercer plano. Para todos los demás casos hay que lanzarlas siempre en el servidor.
  • Siempre que podamos utilizaremos la señal “on-show” del formulario para cargar los registros en la vista de datos mediante un manejador de evento.

Espero que con estos simples consejos no tengáis ningún retardo a la hora de mostrar los registros al usuario.

Utilización del control vista de datos a través de ejemplos prácticos

Particularmente siempre he tenido una “guerra” con los usuarios de mis aplicaciones a la hora de mostrar los registros de un determinado módulo. Están (mal)acostumbrados a que a la hora de entrar, por ejemplo en el módulo de clientes (sirve cualquier otro módulo que se te ocurra) a ver la lista de TODOS los clientes…

  • Si no ven la rejilla con datos… parece que no hay datos.
  • Si al final vas a seleccionar uno en concreto… ¿para que mostrar todos?
  • ¿no será mejor que selecciones primero el rango de los que quieran visualizar?

Como los caminos del Señor son infinitos, vamos a ver varios ejemplos con estas casuísticas.

1.- Mostrar en la vista de datos todos los registros de una tabla al entrar en el formulario que hace de menú.

Lo mas sencillo es hacerlo de la siguiente manera:

Hemos creado un proceso sin origen (ya que el formulario era sin origen) y con destino la lista de la tabla que queremos mostrar en la vista de datos.

Las instrucciones que tenemos en el proceso son:

  • Cargar lista de la tabla por el índice que mas nos interese
  • Añadir lista a la salida (el siguiente objeto en el flujo, recogerá la lista devuelta por el proceso).

Lo único que tendremos que hacer ahora es crear la vista de datos. Como “Objeto 1” pondremos este proceso, y como “Objeto 2” cualquiera de los de tipo lista de la tabla asociada. En este caso “Tareas”

2.- No mostrar en la vista de datos ningún registro de una tabla al entrar en el formulario que hace de menú.

Mi opción preferida… sólo mostramos registros cuando el usuario los seleccione.

En este caso, el proceso no vamos a necesitar igualmente… en el flujo, el “Objeto 2” de la vista de datos tiene que saber que mostrar. La única diferencia es que el proceso asociado no tendrá ninguna línea.

Vista de datos, sin datos

 

Parece increible pero si,  en velneo tenemos procesos que no hacen absolutamente nada… por lo menos aparentemente.

De esta forma, al entrar en el menú no aparecerá ningún registros y será al pulsar sobre un botón cuando se lance la búsqueda que devolverá los registros a la vista de datos.

Tienes el ejemplo completo aquí.

3.- Mostrar en un subformulario de una ficha, un plural (sin optimizar)

En esta caso, ya vamos a estar situados en una ficha, por lo tanto tenemos que tener cuidado con el flujo a la hora de crear los objetos asociados a la vista de datos.

Vista de datos con origen ficha

El montaje es similar a los casos anteriores.

Si recordáis, en uno de los consejos que hemos visto antes os decía que Velneo carga todos los objetos al entrar en este formulario. Por lo tanto los registros que existan en el plural “Desglose de horas” también se cargarán al entrar en la ficha… si tuviésemos 10 plurales mas (sin optimizar) también se cargarían y dependiendo del número de registros que tengamos en cada uno de ellos, es probable que la visualización de la ficha en cuestión se retarde… Y puede además que el usuario sólo quiera ver las “Horas presupuestadas”.

En este caso, lo más sencillo es esto:

Vista de datos de un plural sin optimizar

 

Lo primero es declarar el flujo del proceso, es decir de un origen ficha (de la tabla en la que nos encontremos) queremos mostrar una lista de la tabla destino.

La instrucción para conseguir esto en el proceso es:

  • Cargar el plural que nos interese de la ficha
  • Añadir lista a la salida (invertir lista es para que aparezcan los registros mas recientes al principio de la lista).

Este proceso será el “Objeto 1” de nuestra vista de datos y como “Objeto 2” podremos seleccionar cualquiera de tipo lista del plural en cuestión.

4.- Mostrar en un subformulario de una ficha, un plural (optimizado)

Vamos a realizar algún pequeño cambio para que este montaje esté optimizado y solamente se carguen los plurales al entrar en la pestaña en cuestión.

Vista de datos plural sin datos

 

El flujo del proceso será el mismo… sólo que no le incluiremos ninguna instrucción. De esta forma al entrar en la ficha no se cargará el plural correspondiente.

Ahora tendremos que conseguir que al entrar en la pestaña del plural se carguen en la vista de datos los registros existentes.

Para ello crearemos un “Manejador de evento” en el formulario con las siguientes instrucciones:

Manejador vista de datos

Crearemos una cesta local de la tabla plural que hará de “puente” entre los registros que devuelva el plural y nuestra vista de datos (los registros encontrados se guardarán en dicha cesta).

Con la instrucción “Interfaz: Procesar” accederemos a nuestra vista de datos añadiéndole los registros devueltos por el plural y guardados temporalmente en nuestra cesta con la instrucción “Cesta: Agregar a la lista en curso”.

Sólo nos faltará crear una “Conexión de evento” en el formulario con la señal “On-show” y disparar el manejador que acabamos de crear.

Con este montaje sólo se cargaran los datos de los distintos plurales al acceder a cada una de las pestañas.

 

Espero que a partir de ahora el control vista de datos ya no tenga ningún secreto para ti.

En un próximo artículo veremos todas las instrucciones de proceso que podemos utilizar con este control.

 

¿Alguna duda con respecto al control vista de datos? Si es así, déjame tu pregunta mas abajo en los comentarios.

La entrada Vista de datos: el poder de Velneo al alcance de tus listas aparece primero en AyudaVelneo.

Aprende a utilizar el subindexador y el localizador subindexado

Hay veces que en nuestras aplicaciones, necesitamos introducir un dato en un campo en función del valor que el usuario haya introducido en otro campo o simplemente seleccionar un registro de un determinado tipo. Por ejemplo: Seleccionar un artículo de una determinada familia Un artículo de un determinado proveedor Si usamos una única tabla de entidades, seleccionar en un campo aquellos que son de tipo proveedor, o cliente Vamos a ver como conseguir nuestro objetivo mediante el uso del subindexador y del localizador subindexado. Ejemplo 1: Seleccionar un registro de un determinado tipo Vamos a tomar como ejemplo la plantilla vErp de Velneo. En este caso vamos a seleccionar el formulario “ART_PRV_G” para dar de alta artículos de un determinado proveedor: Lo que nos interesa en este formulario es seleccionar en el campo “Proveedor”, aquellas entidades que sean de este tipo. En la plantilla se usa una única tabla de entidades para dar de alta proveedores, clientes, vendedores, contactos, etc. Además queremos seleccionar los registros por nombre. Pasos a seguir 1.- Dar de alta el índice correspondiente en la tabla: En la tabla de entidades tenemos una campos booleanos que nos indican el tipo de la entidad. Por [...]

El artículo Aprende a utilizar el subindexador y el localizador subindexado fue publicado en Ayudavelneo por Francisco José Vila Martín

Aprende a usar componentes de búsqueda II

En el artículo anterior “Aprende a usar componente de búsqueda” vimos cómo podíamos condicionar componentes de búsqueda y lanzar ésta de una forma sencilla. Al tener un solo componente podemos lanzar la búsqueda tanto en primer plano como en tercer plano ya que la diferencia de velocidad de carga de los registros es casi inapreciable… Pero ¿y si tenemos más de un componente por el que buscar? En este caso si o si tendremos que lanzar la búsqueda en tercer plano ¿Sabes el motivo? Sigue leyendo si quieres averiguarlo… ¿Por qué mis búsquedas van lentas en primer plano? Cuando comenzamos nuestros desarrollos con Velneo V7 normalmente las búsquedas las montamos como en el ejemplo del artículo anterior y si queremos buscar por otros campos… montamos otra búsqueda. Además solemos programar en local porque es más rápido a la hora de probar, porque las comunicaciones son malas, porque los datos mejor en mi equipo que en la nube, porque… etc.. etc.. etc.. (mira, esto me ha dado una idea para otro post… ¿Por qué tenemos que programar en cloud?). Bajo estas circunstancias, búsquedas con un solo componente y trabajando en local, da igual lanzar [...]

El artículo Aprende a usar componentes de búsqueda II fue publicado en Ayudavelneo por Francisco José Vila Martín

Aprende a usar índices complejos en Velneo V7

Joaquín Daneri después de ver el post sobre “¿Cómo integrar un panel de búsquedas avanzadas en un formulario?” quería ir un paso mas allá y planteaba en el foro de Velneo la siguiente cuestión: Tengo tabla pedidos que está asociada a la tabla clientes y a su vez a localidades, y con este método me gustaría ver todas las lineas de pedidos que se solicitaron de una localidad x. Además hoy marianoyana planteaba esta cuestión: Tengo dos tablas, una de ellas es ficha y la otra Establecimiento, por cada establecimiento existen diferentes fichas. En la Tabla ficha tengo un enlace y un índice, y lo que no consigo hacer es que me busque las fichas que tiene un establecimiento. Es decir tengo un índice llamado establecimiento, una búsqueda por este índice y un formulario que me lanza la búsqueda, pero no consigo que me lo haga, y lo hago por el nombre de la ficha si lo hace pero no por el nombre del establecimiento. La respuesta para las dos cuestiones es la misma: UTILIZANDO ÍNDICES COMPLEJOS Antes vayamos con un poco de teoría ¿Qué son los índices complejos? Resulta difícil dar una definición de lo que es [...]

El artículo Aprende a usar índices complejos en Velneo V7 fue publicado en Ayudavelneo por Francisco José Vila Martín

Cómo filtrar los registros de una lista contenida en un formulario sin origen

Como filtrar los registros de una listaEl objetivo de este artículo es mostrar como poder filtrar los registros de una lista contenida en un formulario sin origen por unos valores previamente definidos (poder filtrar las entidades o las actividades por su tipo; movimientos de almacén si son de venta, compra, regularización etc.).

En el ejemplo que vamos a desarrollar queremos filtrar una lista de entidades por su tipo: clientes, proveedores, vendedores, contactos, etc. Hemos utilizado para ello el modulo de entidades de la Plataforma PaaSOS desarrollada por la empresa Tipesoft.

Objetos necesario para filtrar los registros

Además del formulario sin origen que contiene la vista de datos con los registros de las entidades, necesitaremos crear los siguientes objetos:

  • Tabla estática (TIPO_ENTIDAD) con los posibles valores para filtrar los registros de entidades (Proveedor, Cliente, Vendedor, etc.).
  • Tabla en memoria (FILTROS) con dos campos: codigo y un campo enlazado a la tabla estática creada anteriormente (servirá para guardar el registro seleccionado).
  • Vista de datos en el formulario sin origen (MAIN) para mostrar los valores por los que filtrar los registros de entidades (mostraremos los registros de la tabla estática).
  • Formulario (FRM_TIPO_ENTIDAD) asociado a la tabla FILTROS y proceso (PRC_SELECCIONAR_TIPO) para seleccionar el valor de la tabla estática por el que filtrar los registros de entidades
  • Variable global en memoria para guardar el registro seleccionado ($TIPO_ENTIDAD)
  • Añadir un índice a la tabla entidades por el campo “TIPO_ENTIDAD”
  • Añadir un componente a la búsqueda que nos devuelve las entidades, para poder buscar por el índice “Tipo de entidad”

 

¿Cómo filtrar los registros?

  • Creamos en el formulario FRM_TIPO_ENTIDAD un ComboBox y como contenido le ponemos el campo por el que queremos filtrar los registros.
  • Creamos un manejador de evento (EVT_CAMBIO) en el formulario en el que modificaremos la variable global $TIPO_ENTIDAD con el valor seleccionado de la tabla.
  • Creamos una conexión de evento asociada al ComboBox para controlar el cambio del elemento seleccionado asociándole el evento EVT_CAMBIO
  • Creamos un manejador de evento (EVT_ON_INIT) en el formulario en el que modificaremos el valor del campo TIPO_ENTIDAD de la tabla FILTROS con el valor de la variable global $TIPO_ENTIDAD
  • Creamos una conexión de evento con la señal Inicializado asociándole el evento EVT_ON_INIT
  • Creamos el proceso PRC_SELECCIONAR_TIPO y en sus propiedades asignamos como tabla destino FILTROS. Como instrucciones del proceso pondremos:
      Crear nueva ficha en memoria (tipo,tabla FILTROS)
      Añadir ficha a la salida
  • Creamos una variable local (TIPO_ENTIDAD) en el formulario MAIN para asignar al formulario el tipo de entidad que tiene la variable global $TIPO_ENTIDAD
  • Creamos un control Vista de Datos en el formulario sin origen MAIN donde mostramos los registros de entidades. Como primer objeto le asignamos el proceso PRC_SELECCIONAR_TIPO. Como segundo objeto le asignamos el formulario FRM_TIPO_ENTIDAD
  • Creamos una conexión de evento en el formulario MAIN asociada al control Vista de Datos creado en el paso anterior cuya señal sea Item:Cambio de seleccionado. Como slot ejecutaremos el evento por el cual refrescamos la vista de datos de las entidades (EVT_REFRESCO).
  • Por último sólo nos quedaría pasarle al manejador de objeto en el que llamamos a la búsqueda de registros la variable local TIPO_ENTIDAD que contiene el valor del tipo de entidad a filtrar para que la búsqueda resuelva el índice TIPO_ENTIDAD
Si te ha parecido interesante el artículo no dudes en compartirlo

The post Cómo filtrar los registros de una lista contenida en un formulario sin origen appeared first on Ayudavelneo.