Está en la página 1de 105

Capacitación WorkWithPlus

Ejercicios Prácticos
Page |2

Índice

El Problema.................................................................................................................................. 3
Parte 1 - Introducción ................................................................................................................... 3
Parte 2 – Grid Objects ................................................................................................................. 28
Parte 3 – Otros Objetos .............................................................................................................. 57
Parte 4 – Update Instances & Web Panels ................................................................................... 74
Parte 5 – Generación de Reportes ............................................................................................... 92
Parte 6 - Seguridad ..................................................................................................................... 96
Parte 7 – Auditoría ....................................................................................................................104
Page |3

El Problema
Una empresa consultora lo contrata para que desarrolle un sistema web que lo ayude a
gestionar las empresas que son sus clientes y las personas que trabajan en ellas.

Este sistema será accedido por los empleados de la consultora, desde un navegador web.

En este práctico se utilizará WorkWithPlus para implementar el sistema deseado.

Parte 1 - Íntroduccion

1. Crear una base de conocimiento de nombre “WWPTraining” para comenzar el


desarrollo de la aplicación. Seleccionar ‘C# Environment’ como ambiente y ‘Web’
como tipo de aplicación.

2. Importar el .xpz llamado “WWPTraining_Transactions” para obtener las


transacciones necesarias para realizar el training. Luego, ejecutar el Web Panel
‘WebPanelLoadData’ para cargar los datos de todas las transacciones
automáticamente.

2. Se quiere tener la posibilidad de tener una pantalla para ver las empresas del
sistema, y desde allí ir a editarlas, eliminarlas y crear nuevas. ¿Qué podemos hacer
para generar esto de forma automática?

Se aplica WorkWithPlus a la transacción de empresa (Company). Esto se efectúa en la


pestaña Pattern → opción WorkWithPlus de Company.

La primera vez que aplica WorkWithPlus a una KB, debe inicializar la configuración y
el tema de la aplicación. Por lo tanto, haga clic en el enlace “Initialize WorkWithPlus'
para abrir el Design System Wizard donde podrá definir la configuración principal de
la aplicación.
Page |4

Seleccione las siguientes opciones a través del Design System Wizard (si la propiedad no esta
especificada a continuación, use el valor por defecto):

Step 1 Predefined Theme Seine

Step 2 Base Color Red

Step 3 Logo for Login LogoLoginCocaCola.png


Logo LogoCocaCola.png
Step 5
Footer Text Coca Cola Company – 2019

Step 6 Home Pages Banner and Modules

Observaciones:

• Debe obtener los logotipos de la carpeta Logos.


• Mientras trabaja en el Design System Wizard, puede usar la vista previa en
tiempo real para visualizar cómo se verá su aplicación de acuerdo con las
opciones que ha seleccionado.
• En el Paso 3, hemos definido el tipo de seguridad de la aplicación.
Utilizaremos GAM + WorkWithPlus y es por eso que tendrá automáticamente
una pantalla de inicio de sesión (entre otras pantallas) lista para usar. En la
Page |5

parte 6 de la capacitación, nos enfocaremos en la administración de la


seguridad de la aplicación.

Como puede visualizar, una vez que haya terminado con el Design System Wizard,
WorkWithPlus importará algunos objetos relacionados con el aspecto de la aplicación
(objeto Theme, MasterPages, imágenes, Web Panels, etc.) y la configuración de
WorkWithPlus personalizada de acuerdo con las definiciones seleccionadas en el Design
System Wizard.

Una vez que finalice el proceso de importación, aparecerá una pantalla donde puede definir
el template que usará para esta transacción. Hay diferentes opciones que se usarán más
adelante en la capacitación. Ahora, seleccione la opción "Default list":
Page |6

Cuando aplique WorkWithPlus a un objeto de la KB, se mostrará qué objetos se


actualizaron (Succeeded) y cuáles no se han modificado (Skipped). La primera vez son
creados todos los objetos, ya que no existían anteriormente en la KB.

Observación: es importante observar siempre la ventana de Output 'General' cuando aplica


el pattern, ya que cuando escribe algo incorrecto en una de sus propiedades (por ejemplo,
en una condición usando un atributo que no existe) mostrará un mensaje de error en el
objeto y no actualizará los objetos.
Page |7

3. ¿Y si ahora lo queremos también para las personas, contactos y proyectos?


Aplicar WorkWithPlus a Person, PersonContact y Project.

Luego hacer F5 para ejecutar la aplicación y ver los resultados.

Si no está desplegando la aplicación en la nube, deberá configurar la Base de Datos la


primera vez que ejecuta la aplicación, por ejemplo, usando el servidor SQL Server de
su máquina.

Crear las tablas en la base de datos:

Cuando ejecuta la aplicación, lo primero que verá será la pantalla de inicio de sesión:
Page |8

Una vez que inicie sesión en la aplicación (usuario: admin, contraseña: admin123), verá
el siguiente Dashboard:

De forma predeterminada muestra diferentes consultas y visualizaciones de datos, pero


podrá personalizarlo o crear un Dashboard completamente nuevo mediante templates
WorkWithPlus.
Page |9

Vamos a personalizar esta página home para verla de la siguiente manera y que al hacer click
en cada tarjeta nos lleve al listado de cada transacción:

Para eso, vamos a crear un DataProvider llamado DPLoadHome, que va a contener el


siguiente código:

Puede copiar y pegar el código mencionado desde el siguiente link: Code Snippets
Observación: puede usar los íconos que quiera para personalizar las tarjetas. Acceda a
https://fontawesome.com/icons?d=gallery, seleccione uno y copie el contenido que está
dentro de esta tag: <i class>.
P a g e | 10

Seguidamente, abra el Web Panel Home y modifique la última línea del evento Start,
sustituyendo el Data Provider llamado GetMainHomeModulesSample() (que es el que carga
los datos por defecto) por el que acabamos de crear (DPLoadHome):

Puede navegar en la aplicación usando el menú responsive, ya que de manera


predeterminada se agrega la opción 'Developer Menu' con las opciones para ir al ‘trabajar
con’ de todas las transacciones que tienen aplicado el pattern WorkWithPlus.

4. Si accede a la opción para crear un registro de Person, puede visualizar la siguiente


pantalla:
P a g e | 11

Como puede ver, la transacción Person tiene muchos atributos, por lo que la página tiene un
desplazamiento vertical grande, lo que hace que la experiencia de usuario sea mala.

Cuando trabaje con el pattern de alguna transacción, visualizará un entorno de desarrollo


especial en el que tiene pestañas, un árbol jerárquico y una vista previa en tiempo real:

• Las pestañas (Transaction, Selection, etc.) muestran los objetos que están siendo
generados para esta transacción en particular (que en este caso es la transacción
Person).
P a g e | 12

• El árbol jerárquico corresponde al objeto que se encuentra modificando (que es el


que está marcado en las pestañas). En este ejemplo es el formulario de la
transacción.
• El preview en tiempo real muestra un boceto de cómo se generará en ejecución el
objeto en el que se encuentra trabajando (el que está marcado en las pestañas). En
este ejemplo es el formulario de la transacción. Además, tiene la opción de dejar el
preview separado de la ventana de GeneXus, para visualizarlo en otro monitor por
ejemplo, o también deshabilitarlo.

5. Modificar la instancia del formulario de la transacción para que tenga la apariencia


mostrada a continuación, teniendo en cuenta las siguientes observaciones:

Observaciones:
- Puede cortar los nodos de atributos seleccionando varios y pegarlos dentro de
otras tablas, ejecutando ‘Control + X’ o clic derecho, ‘Cortar’.
- Utilice la funcionalidad Preview en tiempo real para visualizar cómo va quedando
el formulario de la Transacción.
- Debe mantener en alguna sección de la instancia de la transacción Person la tabla
denominada TableAttributes que por defecto se encuentra definida como un
Panel con el título ´General Information´. No es necesario que quede definida
como Panel, pero sí que esté presente en alguna parte del formulario. Esto será
comprendido más adelante en la capacitación, cuando el tema ´Update Instances´
sea estudiado.
P a g e | 13

- Asigne al control Tabs las propiedades Cell Width (Small) con el valor 75%. Esto se
analizará en detalle en la sección Web Reponsive.
P a g e | 14
P a g e | 15

Generar y ejecutar la aplicación (F5) y navegar hacia PersonWW para insertar una
persona.
P a g e | 16

Ahora la información de la persona se encuentra agrupada y el tamaño de la pantalla se


redujo.
P a g e | 17

6. El sistema requiere que los campos ‘First Name’, ‘Last Name’ y ‘Birth Date’ sean
obligatorios, es decir, que el usuario en tiempo de ejecución no pueda dejarlos en
blanco. ¿Qué funcionalidad provee WorkWithPlus para ello?

Generar y ejecutar la aplicación (F5), para visualizar los resultados:

7. A su vez, se desea que el campo ‘Home Address’ sea obligatorio solamente cuando el
campo ‘Is Home Address Required’ está en true. Y que el campo ‘Favorite Band’ esté
visible solo cuando el campo ‘Has Favorite Band’ está en true. Efectuar esto en
WorkWithPlus y luego probarlo en ejecución.

Sin banda favorita, el campo para ingresar el nombre de la banda está oculto. A su
vez, como el check box que define si el campo Home Address es obligatorio no está
marcado, se puede verificar que dicho campo no está como obligatorio:
P a g e | 18

Luego si se marcan ambos check box se puede verificar que el campo para ingresar la banda
favorita queda visible en pantalla y que el campo Home Address es requerido:
P a g e | 19

8. Ahora se necesita mejorar el formulario de la transacción Company, agrupando los


atributos de auditoría en un panel colapsable, y que aparezca expandido al cargar la
pantalla, como se puede visualizar a continuación:

Al cargar la pantalla está expandido el panel ‘Auditing Information’, pero se puede


colapsar (haciendo clic en el título del panel).

Observación: Asigne a la propiedad CellThemeClass del nuevo Panel el valor


‘CellMarginTop’ para que los paneles estén separados uno del otro.

Ejecutar la aplicación y ver los resultados.


P a g e | 20

9. Dado que los atributos de auditoría serán asignados por una regla en forma
automática, no se desea que estén editables en el formulario de la transacción.
¿Qué mecanismo provee WorkWithPlus para dejar campos no editables desde la
instancia?

Solución: Utilice la propiedad NoAccept

Ejecutar la aplicación y ver los resultados.

10. Ahora, usaremos una nueva funcionalidad de WorkWithPlus para crear una pantalla
que muestre los datos de una transacción de forma dividida.

Para crearlo, hagamos un “Save as” de la transacción Person. Nombre al nuevo objeto
"PersonWithSplitScreen".

Aplique WorkWithPlus en la transacción mencionada y seleccione el template "Split Screen".


P a g e | 21

Preste atención en los objetos generados:

En el objeto "SplitScreen", vamos a configurar lo referente a la lista de personas que


aparecerá a la izquierda de la pantalla.
Modifique los atributos dentro de TableItem para mostrar el nombre completo de la persona
y el nombre de la empresa para la cual esa persona trabaja.
P a g e | 22

En el objeto "ViewSplitScreen", puede modificar las tabs que serán mostradas en la vista de
la persona seleccionada.

Agregue la pantalla recién creada al menú para probar su funcionamiento en ejecución.

11. Luego, en la transacción PersonContact se desea poder seleccionar la persona


asociada a este contacto mediante un dynamic combo box. Para ello debe cambiar la
definición del atributo PersonId:
P a g e | 23

Ejecutar la aplicación y ver los resultados tras agregar un contacto a una persona:

Dado que ‘Person Id’ muestra un dynamic combo box con los valores de
‘PersonFullName’, se está mostrando dos veces el mismo campo.

Elimine el atributo ‘PersonFullName’ de la instancia de la transacción, para que se


actualice el Form de la misma.

Ejecute la aplicación para visualizar los resultados.

Además, el cliente necesita tener una idea de cuántos contactos tiene una persona.
Para hacer esto, vamos a agregar un gráfico dentro de PersonContactWW que
muestre la información necesaria.
¿Qué mecanismo proporciona WorkWithPlus para agregar controles complejos?
P a g e | 24

Solución: agregue el User Control siguiendo los pasos a continuación.

Agregue el nodo UserControl y luego, para mostrar el gráfico junto al Grid, debe
crear una nueva ResponsiveTable y mover el Grid y el nodo UserControl dentro de
esta tabla (puede cortar y pegar el Grid en la nueva tabla).

Asigne 2 columnas a la tabla que acaba de crear y asigne a la propiedad Cell Width (Small)
del Grid el valor 75% para que el gráfico ocupe el 25% del ancho del navegador.

En el nodo del User Control, seleccione el User Control que desea incluir de la siguiente
manera:

Luego, configure las siguientes propiedades para el control GoogleChart:

• Width: 270px
• Is 3D: false
P a g e | 25

• Type: Pie Chart

Abra los eventos para agregar comportamiento al gráfico. Agregue la siguiente subrutina
‘GxChartData’ y copie el código desde el siguiente link: Code Snippets

En el evento Start llamar a la subrutina creada, como código de usuario:

Deberá definir las variables GoogleChartData y GoogleChartSeries como se detalla a


continuación:

Ejecutar la aplicación y visualizar los resultados (para probar el gráfico es recomendable que
cree varias personas con varios contactos):
P a g e | 26

12. Para finalizar la primera sección del práctico, colocar los siguientes tooltips a los
atributos en la pantalla de la transacción Person, y verificarlo en tiempo de ejecución.

PersonFirstName: Solo el primer nombre de la persona


PersonLastName: Apellido paterno
PersonBirthDate: Formato: dd/mm/yyyy

¿Dónde se está mostrando el tooltip? ¿Cómo se configura para que se muestre un


ícono al lado del campo y el tooltip esté allí, tal como vemos en la siguiente imagen?
P a g e | 27

Capacitación WorkWithPlus
Parte 2 – Grid Objects
P a g e | 28

Parte 2 – Grid Objects


1. Ejecutar la aplicación (F5), y navegar hacia PersonWW.

Como se puede visualizar, la pantalla posee scroll horizontal, por más que los campos estén
adaptados al espacio disponible ocupando varias líneas. Desde la instancia, para este objeto
no muestre las columnas ‘PersonCreateDate’, ‘PersonUpdateDate’, ‘PersonCreateUser’ y
‘PersonUpdateUser’. ¿Qué podemos hacer para que las columnas mencionadas no se
muestren? ¿Cuál es la diferencia entre ocultar utilizando la propiedad Visible o remover el
atributo de ese objeto?

Ejecutar la aplicación y visualizar los resultados:

2. Toda la información que contiene el Grid ahora es importante para unos u otros
usuarios del sistema, aunque el Grid continúa teniendo un ancho demasiado grande y
P a g e | 29

sus columnas están apretadas. ¿Qué funcionalidad provee WorkWithPlus para que los
usuarios finales puedan elegir qué columnas ver y eventualmente ordenarlas?

Solución: Columns Selector para Grids. Activar dicha funcionalidad implementada con
un Grid Regular y agregar dentro del ActionGroup la StandardAction EditColumns.

Se desea que las siguientes columnas del grid no estén visibles al cargarlo por primera
vez:

- PersonFirstName
- PersonLastName
- PersonNickName
- CompanyId
- PersonHasFavoriteMusicBand
- PersonFavoriteMusicBand
- PersonIsHomeAddressRequired
- PersonHomeAddress

¿Cómo se realiza esto con WorkWithPlus?

Observación: puede seleccionar varias columnas (atributos en este caso) al mismo


tiempo y modificar la propiedad correspondiente.

Ejecutar la aplicación (F5), y navegar a PersonsWW para visualizar los resultados.


P a g e | 30

Observaciones:
- El ColumnsSelector implementado con un grid Regular tiene la limitación de que
los datos no se pueden reordenar dado que los grids regulares de GeneXus no lo
permiten. Si desea hacer esto, el Columns Selector implementado con Free Style
Grid lo soporta, aunque posee otras limitaciones por dicho motivo, por lo que se
recomienda usar la primera de las opciones.
- Si cierra la aplicación y abre nuevamente el objeto PersonWW, las columnas
mostradas en el Grid y el orden de las mismas va a ser reiniciado a los valores por
defecto. Se puede guardar el estado de esto en la base de datos abriendo los
procedimientos LoadColumnsSelectorState y SaveColumnsSelectorState y
siguiendo las instrucciones descritas en sus respectivos Sources, aunque no
haremos ello en esta capacitación (puede probar esto luego de finalizar el
mismo).

3. Como puede apreciar, el Grid tiene muchos atributos que dificultan la visualización.
Por eso, es necesario organizarlos en tres categorías:

• General Information: PersonId, PersonFirstName, PersonLastName, PersonFullName,


PersonNickName, PersonBirthDate
• Additional Information: PersonHobby, PersonGender, CompanyId, CompanyName,
PersonCellNumber, PersonHomeTelNumber, PersonIsHomeAddressRequired,
PersonHomeAddress, PersonHasFavouriteMusicBand, PersonFavouriteMusicBand
• Auditing Information: PersonCreateDate, PersonCreateUser, PersonUpdateDate,
PersonUpdateUser

Solución: modifique la propiedad 'Title Category' de los atributos del Grid.

Ejecute la aplicación y vea los resultados:


P a g e | 31

4. Se desea brindarle la posibilidad al usuario de editar la información que está


visualizando de las personas sin necesidad de abrir la transacción, directamente desde
el grid. Para poder hacer esto, la transacción Person debe estar configurada como
Business Component. Efectuar esta configuración y guardar el objeto para luego
proceder.

Dado que se quiere mantener el PersonWW en donde se tienen las opciones para
editar los registros llamando a la transacción, se debe crear un ExtraSelection.

Asignar la propiedad ‘Name’ del objeto ExtraSelection como ‘EditInGrid’ y la


descripción que desee. Cambiar la propiedad ‘In Line’ de las acciones Insert, Update y
Delete a True.
P a g e | 32

Ocultar la columna PersonId y dejar visibles solamente las siguientes columnas en el


grid (eliminando el resto de las columnas):

- PersonFirstName
- PersonLastName
- PersonNickName
- PersonGender
- PersonHobby

Observación: para hacer uso de la funcionalidad EditInGrid en determinada


transacción, es necesario que la misma sea Business Component dado que es la forma
en que se actualizarán dichos registros.

Ejecutar la aplicación (F5) y navegar hacia el objeto recién creado. Puede probar la
nueva funcionalidad modificando y eliminando un registro dentro del Grid.
P a g e | 33

5. Para exportar a PDF, WorkWithPlus provee la StandardAction que lo hace


automáticamente, denominada ExportReport. Se quiere exportar a PDF únicamente
los atributos que se encuentran visibles en el Grid, y se debe verificar si está
habilitado por defecto (para esto, en el objeto WorkWithPlus Settings, la propiedad
‘Enabled by default’ debe ser ‘True’).
P a g e | 34

Ejecutar la aplicación y visualizar los resultados (exportando a PDF los datos de


CompanyWW).

6. Se desea que las acciones de insertar y modificar de CompanyWW sean Popup. De


esta forma cuando el usuario haga clic en ellas la pantalla se abrirá en popup, dentro
de la misma ventana.
¿Cómo se realiza? Configurarlo. Para que se visualice correctamente en ejecución,
asignar a la transacción Company la MasterPage llamada ‘PromptMasterPage’.

Ejecutar la aplicación y probar lo efectuado modificando un registro y creando otro.


P a g e | 35

7. En ejecución, seleccionar un registro de empresa que no tenga personas asociadas


(por ejemplo el recién creado), y eliminarlo. ¿Cómo se denomina la acción que
ejecutó? ¿De qué tipo es?

Se desea que al presionar la opción para eliminar un registro de una empresa, el


sistema muestre un mensaje de confirmación y en caso que el usuario confirme lo
elimine directamente (sin llamar a la transacción en modo delete). Entonces, no se
puede utilizar la StandardAction ‘Delete’. ¿Qué otro tipo de acciones conoce?

Eliminar la StandardAction Delete y crear una acción de usuario (UserAction)


denominada ‘UDelete’, con las siguientes propiedades:

Se podrá eliminar una empresa solamente cuando la misma no posea personas


asignadas. En caso que se intente eliminar una empresa con personas el sistema deberá
mostrar un mensaje de error, o directamente restringir la eliminación a dichas empresas.
Para resolver esto, ¿qué opción tenemos?

Solución:
Insertar la acción dentro del grid y agregar una condición (propiedad Condition de la
acción) que analiza si tiene personas asociadas y habilita o deshabilita la acción para cada
registro del Grid.

Previo a desarrollar la opción mencionada es necesario importar el XPZ


“WWPTraining_DeleteCompany” que posee 2 procedimientos: DeleteCompany y
CompanyCanBeDeleted.
P a g e | 36

El comportamiento que analiza si una empresa tiene personas asociadas se encuentra


en el procedimiento CompanyCanBeDeleted.

Desarrollar esta opción, utilizando el procedimiento CompanyCanBeDeleted.

Luego se debe desarrollar el comportamiento de la acción. Para ello asignar la


propiedad GXObject de la acción con el procedimiento DeleteCompany y agregar el
parámetro correspondiente:

El evento asociado a la acción es ‘DoUDelete’. El mismo abre la confirmación, y en caso


que el resultado sea correcto llama al sub ‘Do UDelete’. En el Sub ‘DoUDelete’ se llama
al procedimiento que lo elimina (asignado en la propiedad GXObject). Verificar todo
esto en su máquina.
P a g e | 37

Ejecutar la aplicación y visualizar los resultados. Hacer clic en una empresa que se pueda
eliminar y seleccionar ‘No’ cuando pida confirmación. Luego volver a seleccionar la
opción para eliminar esa empresa y seleccionar ‘Sí’, verificando que efectivamente se
elimina el registro.
P a g e | 38

Observación: Cuando la condición de cierta acción no se cumple, se puede determinar si


se quiere que se oculte la misma o aparezca como deshabilitada. Esto se configura en el
objeto WorkWithPlus Settings, dentro del nodo StandardActions (propiedad ‘Disabled
Actions’). En este caso la opción está en ‘Hidden’.

8. El cliente solicita poder seleccionar y eliminar múltiples registros de contactos al


mismo tiempo. Para ello existe una propiedad en las Standard Actions, ¿Cuál es?

Cree una acción de usuario que se muestre debajo del grid denominada
‘DeleteSelected’ y asigne la propiedad ‘Multi row selection’ a True. ¿Para qué sirve la
propiedad ‘Multi row select all’? También asígnele true.

WorkWithPlus ha creado un SDT con la información que está en el Grid:

Cuando el usuario presiona en la acción creada se invocará a una subrutina que carga los
registros seleccionados en una variable basada en el SDT mostrado.

Desde la instancia puede hacer clic derecho ‘Go to event’ para agregar comportamiento a
dicha acción. Y en el evento 'DoDeleteSelected' insertar el siguiente código, debajo del
código generado automáticamente por WorkWithPlus: Code Snippets

Ejecutar la aplicación, y probar la acción creada (no seleccionar ningún contacto y presionar
la acción, luego seleccionar algunos contactos y presionar la acción).
P a g e | 39

Observación: En este caso el ErrorViewer se encuentra debajo de los filtros y acciones. Si


desea puede moverlo y colocarlo en cualquier parte de la pantalla.

9. En PersonWW, ¿qué filtros de búsqueda tiene disponibles el usuario final? ¿Qué tipo
de filtros son?

Solución: están disponibles los filtros PersonFullName, CompanyName y


CountryCityName. Todos se encuentran como filtros dinámicos. Por defecto
WorkWithPlus agrega un filtro para el DescriptionAttribute de la transacción y un
filtro para cada clave foránea (esto último se configura).
P a g e | 40

¿Para qué son los filtros dinámicos? Permiten que el usuario en tiempo de ejecución elija
qué filtros quiere usar desde un combo y luego agrega dinámicamente nuevos filtros.

Además de los filtros ya disponibles, agregar la posibilidad de filtrar por los siguientes
campos como filtros dinámicos:
- PersonId
- PersonFirstName
- PersonLastName
- PersonBirthDate
- PersonGender
- PersonHobby
- PersonHasFavoriteMusicBand

Observación: cuando agregue los nuevos filtros (haciendo clic derecho → Add
FilterAttribute), puede seleccionar múltiples atributos al mismo tiempo.

Ejecutar la aplicación, y probar los filtros dinámicos agregando más de un filtro de


búsqueda:
P a g e | 41

Como puede visualizar, el filtro de búsqueda por FirstName es un filtro con operadores
dinámicos, pues puede elegir buscar por comienzo de palabra o contenido. ¿Y si se
quisiera buscar por un rango de nombres? ¿Qué tipo de filtro provee WorkWithPlus?

Modificar el tipo del filtro PersonFirstName para que sea un filtro de tipo Range. Para ello
puede hacer clic derecho ‘Convert into Range Filter’ y podrá visualizar que cambió su tipo.
Ejecutar la aplicación para ver los resultados:

La consultora solicita que los filtros por PersonFirstName y PersonLastName estén siempre
visibles en lugar de estar como filtros dinámicos, dado que los usan en la mayoría de las
búsquedas. ¿Cómo se efectúa esto con WorkWithPlus?

Solución: Usar Fixed Filters, que tienen el mismo aspecto que los filtros dinámicos pero se
muestran fijos arriba de los filtros dinámicos.
P a g e | 42

Ejecutar la aplicación y visualizar los resultados:

10. El cliente solicita tener la posibilidad de filtrar por más de una empresa,
seleccionándolas desde un Prompt, y desea tener este filtro como un filtro dinámico.
¿Qué tipo de filtro permite esta posibilidad? Impleméntelo y ejecute para visualizar
los resultados:
P a g e | 43

Observación: Antes de crear el filtro en el objeto Selection de Person debe crear un objeto
de tipo PromptMultiple en Company para poder asociarlo al filtro posteriormente.

11. Además, se desea tener la opción de filtrar por múltiples nicknames (dentro de los
filtros dinámicos). ¿Qué tipo de filtro permite esta funcionalidad? Impleméntelo y
ejecute para visualizarlo en runtime:
P a g e | 44

12. Por otro lado, el cliente necesita poder filtrar por las fechas de nacimiento de las
personas, usando operadores fijos. El requerimiento es poder ver las personas con
Birth Date:
• Today
• Last Month
• This Month
• Next Month

¿Qué tipo de filtro permite cumplir este requerimiento? Agregue los nuevos operadores y
verifique en tiempo de ejecución:

13. Luego de un tiempo, se hace una muestra al cliente de los avances. El cliente visualiza
todas las pantallas, y en el ‘Work With Persons’ (PersonWW) solicita que desea que
sus usuarios tengan la opción de visualizar el CompanyId en la misma columna que el
CompanyName o uno en cada columna independiente.

En el momento solo se tiene la opción de ver las columnas en forma independiente:


P a g e | 45

¿Qué se puede hacer para lograr lo que solicita el cliente?

Solución: Una opción es agregar una variable en el grid, y en su propiedad LoadCode


asignarle el valor de CompanyId concatenado con CompanyName.

Observaciones:
- Cuando se inserta una variable en pantalla, lo primero que debe hacer es definir
en qué dominio/atributo/SDT/Bussiness component esa variable va a estar
basada. En este caso, dado que se trata de una descripción puede basarla en el
dominio Description.

- El LoadCode es el valor con el cual se carga una variable de un grid. Puede ser el
resultado de otra variable, de llamar a un procedimiento, de concatenar
atributos, entre otros. Ejemplos de asignaciones para el LoadCode:
o &MiVariable = &OtraVariable
o &MiVariable = Procedimiento.udp(&parm1, att2, …)
o &MiVariable = Att1 + “ “ + &Var2 …

Por último, asignar la propiedad correspondiente para que cuando se carga por
primera vez el grid, esta variable no aparezca visible. ¿Cuál es esa propiedad? Ya fue
utilizada en forma previa para algunas columnas de ese objeto. Efectuar lo solicitado y
probarlo en ejecución.
P a g e | 46

Volver a visualizar CompanyName y notar que CompanyName posee un link, y si hace clic
en él llamará al objeto View de la transacción Company. Este es un comportamiento
automático de WorkWithPlus, denominado Autolink.

Dado que ahora no se posee ese comportamiento en la nueva columna, utilizar la acción
‘Link’ para agregarlo manualmente, como se puede apreciar en la siguiente imagen:

Ejecutar la aplicación y probar lo efectuado.


P a g e | 47

14. El cliente precisa en la pantalla para trabajar con empresas, poder filtrar por nombre
de la empresa o por su descripción, en la misma caja de búsqueda.

Solución: agregue un nodo "Filter Full Text" dentro de un objeto Grid:


P a g e | 48

Personalice los atributos que englobe el filtro con la propiedad 'Attributes' (por defecto,
incluye todos los atributos):

Seguidamente, elimine el nodo Dynamic Filters, (ya que no será necesario en esta pantalla)
y configure la propiedad Description del Full text filter con el valor "Search".
P a g e | 49

15. A su vez, se desea tener una nueva pantalla para visualizar las personas y trabajar con
ellas (ExtraSelection).

La pantalla debe contener un scroll vertical para mostrar personas sin paginado, por lo
que crearemos el nuevo selection basado en el template InfiniteScrolling:
P a g e | 50

16. Ir a PersonWW en tiempo de ejecución, y analizar el Columns Filter de First Name, Id,
Hobby y Gender. ¿Cuál es la funcionalidad de WorkWithPlus que permite esto?

Como se puede observar, Id tiene un filtro de tipo Range pero First Name tiene un
único campo de búsqueda y una lista dinámica, y Gender tiene una lista fija. Por lo
tanto, ¿dónde se configuran los valores por defecto de cada Column Filter?

17. El cliente precisa una opción que permita crear un nuevo registro de empresa
copiándolo de un registro ya existente, realizando los cambios necesarios y luego
guardando el registro. ¿Qué Standard Action provee WorkWithPlus para esta
funcionalidad?
Agregue dicha acción y verifique los resultados en ejecución.

18. El cliente precisa visualizar los siguientes totalizadores en el ‘Work With Projects’
(ProjectWW):

• Sumatoria del ProjectEstimatedCost


• Sumatoria del ProjectRealCost
• Promedio de la rentabilidad del proyecto

¿Qué mecanismo provee WorkWithPlus para realizar esta funcionalidad?

Solución: usar Totalizadores para desarrollar la funcionalidad solicitada. Se pueden aplicar


directamente a los atributos:
P a g e | 51

También se pueden usar los totalizadores cuando se trabaja con variables. Para esto hay que
agregar una nueva variable en el Grid, cargarla correctamente, y definir el totalizador:

Ejecutar y visualizar los cambios en ejecución.

19. El cliente necesita otra pantalla (ExtraSelection) para visualizar fácilmente la


rentabilidad de los proyectos con diferentes colores en el Grid. ¿Qué funcionalidad
provee WorkWithPlus para hacerlo?

Solución: Usar Conditional Formatting para definir las condiciones y cómo serán
formateadas las filas del Grid. Agregar las siguientes condiciones y formatos:

• ProjectEstimatedCost < ProjectRealCost and ProjectStatus = Status.Finished→


Danger
• ProjectEstimatedCost>ProjectRealCost*1.1 and
ProjectStatus=Status.Finished→ Info
• ProjectEstimatedCost > ProjectRealCost and ProjectStatus = Status.Finished→
Lite

Ejecutar y visualizar la funcionalidad implementada:


P a g e | 52

¿Qué otras formas de formatear las filas están disponibles en WorkWithPlus?

20. El cliente necesita visualizar fácilmente los proyectos con un ícono de estrella según
su estado.
¿Qué característica proporciona WorkWithPlus para ello?

Solución: use ColumnTag para definir las condiciones y seleccione los iconos deseados que
se utilizarán para cada condición.

¿Cuál es la diferencia entre usar ColumnTag y usar el formato condicional?


P a g e | 53

21. El cliente necesita una página donde visualizar los proyectos y poder expandir uno de
ellos y visualizar las personas trabajando en el:

Solución: crear un WebComponent denominado “DetailWebComponent”, basado en el


template “NestedGrid”. Agregarle al “Grid” los siguientes atributos y parámetros:

Luego, cree un Web Panel denominado “ProjectsWithDetail”, basado en el template


“Default list” y seleccionando la transacción “Project”. Una vez creado, defina su descripción
y agregue la Standard Action en el grid como se muestra a continuación:
P a g e | 54

Ejecute la aplicación y visualice los resultados en ejecución. Si es necesario, modifique un


proyecto para asignarle personas en él. Luego, abra el listado y visualice el Proyecto
actualizado expandiéndolo.

22. El cliente desea visualizar las personas agrupadas por empresa:

Solución: crear un Web Panel, basado en el template ‘Default list’, asignarle la descripción
“Person Grouped Columns”. Eliminar los atributos innecesarios para definer el grupo como
se muestra a continuación:
P a g e | 55

Ejecute la aplicación y visualice los resultados.


P a g e | 56

Capacitación WorkWithPlus
Parte 3 – Otros Objetos
P a g e | 57

Parte 3 – Otros Objetos


1. Ejecutar la aplicación y navegar a PersonWW.

Cliquear en ‘Full Name’ de algún registro, de manera de ir al objeto View de ese registro, y
navegar por las diferentes pestañas del mismo.
P a g e | 58

¿Por qué se ingresó el link en PersonFullName al objeto View en forma automática? Porque
PersonFullName es el ‘Description attribute’ de la transacción Person (como muestra la
imagen a continuación), y porque la propiedad AutoLink de este atributo en el Grid es true.

En lugar de mostrar un link en el atributo PersonFullName, se desea que se muestre una


acción (imagen) dentro del Grid que navegue al View de ese registro. ¿Qué mecanismo
provee WorkWithPlus para ello?

Efectuar lo necesario para lograrlo y luego ejecutar la aplicación y visualizar los resultados.

Observaciones:
- Existe una Standard Action para ello, utilizarla asegurándose que la misma tiene
la propiedad ‘Include action’ en True.
- El link que se encuentra en PersonFullName debe quitarlo.

¿Y si ahora se desea que esa acción llame a la transacción en modo Display en lugar de
llamar al View?
P a g e | 59

Solución: modificar la propiedad ‘Behavior’ de la Standard Action Display para ‘Go to


transaction’. Luego probar lo efectuado en ejecución.

Volver a modificar esta propiedad para que llame al objeto View.


P a g e | 60

2. Se desea que el View de Person se muestre con la vista expandida, tal como se ve en
la siguiente imagen:

¿Qué propiedad debe modificar desde WorkWithPlus? Hacer los cambios necesarios y
probarlo en ejecución.

3. Ir a modificar una persona. Cuando va a modificar la información de la empresa


asociada aparece una acción para seleccionar la empresa a ingresar. ¿Cuál es ese
objeto?
P a g e | 61

Solución: es el objeto CompanyPrompt que se encuentra en la instancia de la transacción


Company. WorkWithPlus agrega automáticamente el llamado al prompt en las rules de
Person (dado que la propiedad AutoPrompt de CompanyId en la instancia de Person está en
True). Ir a las Rules de Person a verificar que se encuentra la regla prompt a
CompanyPrompt.

Luego modificar el Prompt de Company para que muestre las siguientes columnas y ejecutar
la aplicación:
P a g e | 62

Es aconsejable utilizar los prompts de WorkWithPlus. De forma predeterminada son


generados, aunque podemos desmarcar la casilla 'Generate Prompts' al hacer las
configuraciones generales desde el Design System Wizard, en el paso 9.

Si esta casilla está marcada, veremos la propiedad para generar los prompts GeneXus con el
valor 'No':
P a g e | 63

4. En una de las reuniones de avance, la empresa consultora comenta que cada una de
las empresas tiene que almacenar con qué monedas trabaja (USD, Pesos Uruguayos,
Reales, etc.). Para realizar esta parte del práctico, debe importar el XPZ denominado
‘WWPTraining_CompanyCurrency’ que contiene entre otros 2 transacciones:
- Currency: almacena los datos de las monedas
- CompanyCurrency asocia una moneda con una empresa.

Se necesita tener una pantalla que muestre todas las monedas, y el usuario asocie
aquellas con las que trabaja cierta empresa. ¿Qué objetos provee WorkWithPlus para
ello?

Solución: Objeto Association y Objeto Association Selection. Siempre que se posea


una estructura de tablas como la mostrada a continuación (que es la que tiene ahora
en la aplicación tras la importación del último xpz) se pueden utilizar los objetos
mencionados.

Crear en primera instancia un objeto Association para asociar las monedas con las
que trabaja una empresa.
P a g e | 64

Para ello abrir la instancia de Company y desde el ícono + efectuar → Add →


Association. Luego seleccionar la transacción relacionada sobre la que se desea crear
el objeto (CompanyCurrency en este caso) y se creará un nuevo nodo Association con
toda la estructura.

Guardar para que se cree el objeto en la KB.

Luego, es necesario agregar una acción en el objeto CompanyWW que llame a este objeto
Association, pasándole por parámetro el identificador de la empresa (CompanyId). Colocar
esta acción dentro del Grid, y en un Action Group de tipo Combo box.

Antes de probarlo en ejecución agregar una User Action en el objeto Selection de Company
(al lado de la acción para exportar a Excel) que inicialice las monedas. Esta acción se
agregará dentro del mismo ActionGroup ya existente y llamará al procedimiento que crea
automáticamente todas las monedas en el sistema (procedimiento CreateCurrencies). Luego
ejecutar y probar la aplicación.

Presione en la opción de crear monedas y luego haga clic en la opción de asociar monedas a
alguna transacción:
P a g e | 65

Ahora debe asociar las monedas con las que trabaja la empresa seleccionada y presionar
‘Confirm’.

Crear ahora un objeto Association Selection para asociar las monedas a una empresa. Es un
objeto que tiene el mismo propósito que el Association, solo que se muestra la información
de manera diferente.

Para ello debe hacer clic en el ícono + de Company, seleccionar Add → Association Selection
y seleccionar las tablas relacionadas sobre las que se quiere generar el Association Selection.

Hacer Preview del objeto Association Selection para ver la pantalla que generará y luego
salvar para que se genere el objeto en la KB.

Luego debe agregar la User Action que llame a este nuevo objeto, de la misma manera que
hizo para el Association (dentro del mismo ActionGroup).
P a g e | 66

Ejecutar y visualizar los resultados.


P a g e | 67

5. Dado que se poseen varias acciones en el objeto WWCompany, se solicita agrupar algunas
de las que se encuentran dentro del Grid en un ActionGroup, y asignar la propiedad
‘Caption’ para cada una de ellas. El nombre a asignar al nodo ActionGroup es ‘Actions’.

Ejecutar la aplicación y visualizar los resultados.

6. Se desea almacenar la información de cada registro (fecha y usuario de creación;


fecha y usuario de modificación) para personas y empresas, en principio. Para ello es
que cada una de esas transacciones posee 4 atributos que almacenan esta
información. Lo que está faltando es cargar estos atributos con reglas (una para cada
atributo, por transacción). Se sabe que en el futuro van a existir otras transacciones
que tengan los atributos de auditoría a los que también habrá que agregar esas
reglas.
¿Qué mecanismo posee WorkWithPlus para agregar reglas que aplican a múltiples
transacciones, para ciertos atributos?

Solución: Reglas automáticas. Agregar un nodo Rules en el Transaction template,


dentro del objeto WorkWithPlus Settings, y crear las reglas mencionadas a
continuación.
P a g e | 68

▪ CreateDate
P a g e | 69

▪ CreateUser

▪ UpdateDate
P a g e | 70

▪ UpdateUser

En estos nodos se utiliza la propiedad ‘UserName’ del Context, que aún no se ha


asignado. Pero la idea es que cuando se active la seguridad a la aplicación, se guarde la
información del usuario logueado en el Context. Ahora se usará esta propiedad del
Context, pero su valor será asignado más adelante en la capacitación, en el módulo de
Seguridad.

Hacer ‘Update Instances’ al Transaction template, de modo de crear las reglas en cada
una de las instancias de las transacciones (el proceso de ‘Update Instance’ será explicado
más adelante en la capacitación).

Abrir la instancia de WorkWithPlus de la transacción Company, para verificar que se


insertaron estas reglas.
P a g e | 71

7. Aplicar el pattern a Company (marcando y desmarcando el checkbox ‘Apply this


pattern on save’) y abrir la sección Rules para verificar que las mismas fueron
insertadas.
P a g e | 72

Ejecutar la aplicación, crear un registro y verificar que se actualiza la fecha de creación del
mismo. Luego efectuar el mismo proceso para modificar otro registro.
P a g e | 73

Capacitación WorkWithPlus
Parte 4 – Update Instances & Web Panels
P a g e | 74

Parte 4 – Update Ínstances & Web


Panels
1. El cliente solicita agregar una nueva transacción a la aplicación para incluir las
propiedades disponibles para las oficinas del Supermercado.

Importe el objeto WWPTraining_Properties.xpz para agregar estas transacciones en su


Knowledge Base:

Ejecute el Web Panel "WebPanelLoadData" para cargar los barrios y las propiedades
automáticamente.

Aplique WorkWithPlus a las transacciones y configure el campo para seleccionar el barrio al


que pertenece cada propiedad (en la transacción Property), con la finalidad de utilizar un
control que permita al usuario seleccionar los barrios (agrupados por ciudad) de un combo:
P a g e | 75

Solución: configure el atributo NeighborhoodId con las siguientes propiedades:

Ejecute la aplicación y agregue una nueva propiedad para probar esta funcionalidad.

El cliente desea ver las propiedades disponibles utilizando una visualización diferente
(diferente del típico Grid con filtros que estábamos usando en las secciones anteriores).

¿Cómo podemos lograr una visualización de datos diferente en WorkWithPlus?

Soluciones: hay dos posibilidades:

A. Aplique WorkWithPlus a la transacción Property y use otro template en lugar del


template "Selection" utilizado anteriormente.
B. Cree un nuevo Web Panel y aplique WorkWithPlus seleccionando uno de los
templates disponibles.
En esta parte de la capacitación usaremos la Solución B, para aprender a usar WorkWithPlus
en los Web Panels. Por lo tanto, cree un nuevo Web Panel llamado WPProperties y
seleccione el template "Card with Main Image " de la siguiente manera:
P a g e | 76

Observación: como puede ver, hay muchos templates disponibles para usar en un Web
Panel: Dashboards con diferentes diseños, Wizards, Selections, etc.

Una vez que haya seleccionado el template deseado, elija la transacción Property (para crear
el Web Panel con la tabla base) y defina qué elementos desea mostrar en cada parte del
template (WorkWithPlus inferirá algunos de ellos según sus tipos de datos) pero puede
cambiarlos si lo desea.
P a g e | 77

Agregue este nuevo Web Panel al menú editando el DataProvider "Menu Options Data" y
visualice los resultados en tiempo de ejecución:

2. Vamos a crear un Web Panel que nos permita visualizar toda la información de los
proyectos como un Selection, pero en lugar de basarlo en una tabla base, crearemos un
SDT y variables para realizar su carga.

La idea de este ejercicio es probar el poder de crear Web Panels que tengan todas las
funciones de un Selection, pero sin la necesidad de tener una tabla base.

Carga con SDT:

Primero, cree un SDT llamado ‘SDTProjects’ con la siguiente estructura:

Ahora, cree el Data Provider llamado "DPLoadProjects" para cargarlo:


P a g e | 78

Por último, cree el Web Panel llamado "WPProjectsWithSDT", basado en el template


"Selection".

Seleccione la opción "Based on a SDT":


P a g e | 79

Ahora, seleccione el SDT que acabó de crear (SDTProjects) y los datos que desea mostrar:

Guarde los cambios y ejecute la carga del Grid en el evento Start, de la siguiente manera:

Pruebe lo realizado en ejecución.

Carga con variables:

Ahora crearemos la misma pantalla, pero esta vez usando variables para cargar el Grid.

Para hacerlo, cree un nuevo Web Panel de nombre 'WPProjectsWithVariables', también


basado en el template Selection, pero ahora seleccione la opción ‘Variables based on
Attributes or Domains’:
P a g e | 80

Seleccione los atributos en los cuales las variables estarán basadas y presione OK.

Ahora, vamos a programar el for each correspondiente para cargar las variables en el
evento Load.
P a g e | 81

Pruebe lo realizado en ejecución.

3. Aplicar WorkWithPlus a la transacción Country, generando solamente los objetos


Transaction y Selection (el resto de los objetos eliminarlos antes de guardar por primera
vez para que no se generen).

Se desea que el usuario ingrese los datos del país y la ciudad a través de un dynamic
combo box. ¿Cómo hace esto? Recuerde que no puede modificar el Form de la
transacción directamente desde allí porque pierde los cambios al guardar.
¿Qué otro mecanismo posee?

Solución: Ir a la estructura de la transacción y modificar su control type directamente allí


para los atributos CountryId y CountryCityId. Luego visualizar cómo se va a mostrar
mediante el preview en tiempo real:
P a g e | 82

Dado que el atributo CountryId ahora es un dynamic combo box mostrando CountryName,
no es necesario tener presente en pantalla el campo CountryName (porque es lo que
muestra el combo). Por lo tanto, en la instancia, remover ese atributo del formulario de la
transacción. Ídem para CountryCityName, y luego mediante el preview en tiempo real
verificar lo efectuado.

Ejecutar la aplicación, crear algunos países con ciudades y luego a las personas existentes en
el sistema asignarle un país y ciudad de residencia.
P a g e | 83

4. Es solicitado que al dar de alta una persona se mencione si es director (PersonIsDirector).


Agregar este campo booleano, y efectuar Update Instance sobre Person para que se
adicione en todos los objetos asociados.

5. En muchas ocasiones, la empresa consultora crea nuevas empresas en el sistema, en el


mismo momento que agrega al director de la misma (confirma ambas al mismo tiempo).
Entonces solicitó tener una opción para hacerlo en una misma pantalla.

¿Cómo lo hacemos? El boceto a seguir que entregó el cliente para esta funcionalidad es
el siguiente:

¿Cuál de los templates de WorkWithPlus le parece que podría utilizar para crear este Web
Panel? Analizar los que vienen creados por defecto (con sus bloques de código) y crear un Web
Panel basado en el template que sea conveniente. Luego modificar la instancia de ese Web
Panel para que tenga los mismos controles y atributos mostrados en las imágenes anteriores
(para el caso de Person mostrar también PersonGender, PersonBirthDate, CountryId y
CountryCityId además de PersonFirstName y PersonLastName).

Observaciones:
• Utilizar las transacciones Person y Company en modo BussinessComponent y
agregarlas en pantalla como variables, de manera que solo haya que hacer Save de
los BC para crear los registros asociados, y además se ejecuten las reglas de negocio
definidas en la transacción.
P a g e | 84

• El botón ‘Add email’ podría agregar un nuevo ítem a &Person.Email para que sea
sencillo y fácil de usar:
&PersonEmail = new()
&Person.Email.Add(&PersonEmail)
GridEmails.Refresh()

en donde la variable &PersonEmail es de tipo Person.Email

• El botón Enter debería salvar primero &Company, y si no ocurren errores asignarle a


&Person la empresa recién creada y hacer un Save de la persona. En caso que
ocurran errores desplegarlos como msg. A modo de simplificar, se entrega el código
del evento Enter:
&Company.Save()
If &Company.Success()
&Person.CompanyId = &Company.CompanyId
&Person.PersonIsDirector = True
&Person.Save()
if &Person.Success()
commit
msg('Data successfully added')
else
&Messages = &Person.GetMessages()
do 'Show Messages'
endif
else
&Messages = &Company.GetMessages()
do 'Show Messages'
endif

Ejecutar la aplicación, ir al Web Panel creado y agregar una nueva empresa con su
director. Luego navegar por el WWCompany para verificar que la empresa se creó y
entrar a visualizarla para verificar que la persona asociada a esa empresa también se
creó correctamente.

6. El cliente solicita tener una pantalla donde crear una nueva persona y seleccionar los
proyectos que esa persona realizará. Para ello, desarrollar el Wizard que se describe:

Step 1: Bienvenida al Wizard

Step 2: Agregar la información de la nueva persona: en este paso, agregar una variable
basada en la transacción Person y seleccionar los atributos: PersonFirstName,
PersonLastName, PersonNickName, PersonGender, PersonHobby y PersonBirthDate.
P a g e | 85

Step 3: Agregar emails a la persona. Para este paso se recomienda usar el step template
‘Add Grid Items’ y crear un SDT que contenga una colección de emails. Luego de crear el
SDT, hacer click derecho sobre el Grid → Select SDT y seleccionar el SDT creado.

Step 4: Seleccionar Proyectos que realizará la persona.

Step 5: Finalización del Wizard.

En esta capacitación no agregamos el código/comportamiento para guardar los datos en


el paso final porque es simplemente un ejemplo (y el objetivo es entender cómo crear
los wizards y sus pasos). En caso de estar desarrollando un wizard real, se debería
agregar el código en el evento Next del paso final, usando la variable basada en el SDT
que WorkWithPlus crea para el wizard y que es cargada automáticamente en cada paso.

Después de crear el Wizard, ejecutar la aplicación para verificar cómo se visualiza el


Wizard en tiempo de ejecución (recuerde que no se creará la persona en el paso final,
salvo que agregue el código correspondiente).
P a g e | 86
P a g e | 87

7. Se requiere ahora que todas las pantallas de ingreso de datos (como las transacciones y
el Web Panel recién creado) muestren las acciones (confirmar, cancelar) arriba de los
atributos.
¿Dónde debería modificar esto? Dado que se trata de un cambio masivo, ¿provee
WorkWithPlus un mecanismo para efectuarlo una vez y propagar los cambios?
P a g e | 88

Solución:

1. Realizar el cambio en el Transaction template y efectuar Update Instances sobre


dicho template. Abrir una transacción cualquiera y hacer Preview para verificar
que se haya actualizado su instancia.
2. Luego efectuar el mismo cambio en el template correspondiente y también
efectuar Update Instances sobre ese template (Web Panel Template).

Ejemplo para modificar el template de la transacción

Observaciones:
- Puede efectuar Preview de los templates para verificar que lo que ha efectuado
es lo que desea hacer.
- Cerrar todos los objetos antes de efectuar Update Instances.

Ejecutar la aplicación y visualizar los resultados en la transacción Person y en el Web


Panel creado en punto anterior.
P a g e | 89

8. El cliente también desea que todas las transacciones mencionen en el título del
formulario lo que el usuario se encuentra haciendo en ese momento (si está insertando,
modificando o eliminando un registro). Dado que es un código que se quiere insertar
para todas las transacciones, ¿qué mecanismo provee WorkWithPlus para ello?

Solución: Crear un bloque de código en el evento Start, y en la parte inferior del evento
adicione el siguiente código:
[web]
{
Do case
case &Mode = TrnMode.Insert
Form.Caption += " (Insert)"
case &Mode = TrnMode.Update
Form.Caption += " (Update)"
case &Mode = TrnMode.Delete
Form.Caption += " (Delete)"
EndCase
}

Luego efectuar Update Instances para que se adicione el código en todas las
transacciones. Ejecutar la aplicación y visualizar los resultados en todas las
transacciones:
P a g e | 90

Por último, abrir una transacción y verificar que se agregó el bloque de código en el
evento Start, dentro del código generado por el Pattern.
P a g e | 91

Capacitación WorkWithPlus
Parte 5 – Generación de Reportes
P a g e | 92

Parte 5 – Generacion de Reportes

1. El cliente necesita imprimir una factura en PDF con las ventas del supermercado. Esta
factura se utilizará para los usuarios finales, por lo que es importante crear un diseño
con una gran apariencia.

¿Cómo podemos crear informes PDF personalizados en WorkWithPlus?

Solución: como ya sabe, WorkWithPlus genera automáticamente informes de Excel,


CSV y PDF dentro de los objetos Selection, incluidos los filtros y otras configuraciones
seleccionadas en la pantalla.
Sin embargo, para este requisito, el cliente necesita un informe personalizado con un
diseño y apariencia especial, por lo que los crearemos utilizando los templates de
WorkWithPlus para la generación de informes.

Por lo tanto, importe las transacciones Sale y Product desde WWPTraining_Sales.xpz.


Aplique WorkWithPlus y registre algunos productos y ventas para el Supermercado.

Luego, cree un nuevo procedimiento llamado InvoiceReport, aplique WorkWithPlus y


seleccione el siguiente template:

Como puede visualizar, puede trabajar con un informe PDF de la misma manera que trabaja
con transacciones y Web Panels utilizando la vista previa en tiempo real y la declaración
jerárquica. De este modo, puede cambiar y personalizar el diseño si necesita modificarlo.

WorkWithPlus crea el diseño deseado y solo necesita agregar el código necesario en la


sección Source del procedimiento para cargar la factura correctamente:
P a g e | 93

&CompanyName = 'The Coca-Cola Company'

&Phone = '+598-2604-1325'
&Mail = 'info@coca.com'
&Website = 'http://www.cocacolacompany.com'

&AddressLine1 = 'Av. Italia 6201'


&AddressLine2 = 'Montevideo, Uruguay'
&AddressLine3 = '11300'

print printTitle

for each Sale

&TaxInvoice = SaleTotalAmount*0.23
&BilledTo = PersonFullName
&BilledToAddressLine1 = 'Av. Italia 2387'
&BilledToAddressLine2 = 'Montevideo, Uruguay'
&BilledToAddressLine3 = '12500'
&InvoiceNumber = "#"+SaleId.ToFormattedString()
&Date = SaleDate
&InvoiceTotal = "$"+SaleTotalAmount.ToFormattedString()
print printDetailInfo
print printLines_titles
for each Sale.Products
&ProductName = ProductName
&UnitCost = ProductPrice.ToFormattedString()
&Quantity = SaleProductQuantity
&LineTotal = SaleProductTotal.ToFormattedString()
print printLines_data
endfor
&Tax=&TaxInvoice.ToFormattedString()
&SubTotal = SaleTotalAmount.ToFormattedString()
&LinesTotal = &InvoiceTotal
print printTotals
endfor

Importante: también debe agregar la regla Output_file y establecer la propiedad Call


Protocol del procedimiento con el valor HTTP.

Finalmente, debe agregar una UserAction en el objeto Selection de la transacción Sale para
llamar a este nuevo procedimiento. Para esta User Action, usaremos la posibilidad de incluir
un ícono de fuente de la siguiente manera:
P a g e | 94

Observación: puede encontrar más iconos en el siguiente sitio:


http://fontawesome.io/examples/

Ejecute la aplicación para visualizar la factura en tiempo de ejecución:


P a g e | 95

WorkWithPlus Training
Parte 6 – Seguridad
P a g e | 96

Parte 6 - Seguridad
En el Design System Wizard, hemos decidido usar la seguridad GAM + WorkWIthPlus, y es
por eso que estaba utilizando un objeto de inicio de sesión para acceder a la aplicación. En
esta parte de la capacitación, vamos a personalizar la seguridad para aprovecharla.

Paso 1 - Asignar funcionalidades de seguridad (permisos) a los atributos

La verificación de si algún usuario puede acceder a un objeto (Web Panel o Report) se


realizará automáticamente por GAM Security. Entonces, las únicas funcionalidades que
tienen sentido asignar en este paso son las relacionadas con acciones, links, pestañas o
atributos.

WorkWithPlus agregará el código para verificar si algún usuario puede hacer clic en alguna
acción o link y ocultará / deshabilitará la acción cuando el usuario no tenga permiso para
ello. Lo mismo ocurre con los atributos no editables o no visibles.

Hay algunos campos de las personas que no pueden ser visibles para todos los usuarios, y
hay algunos campos que no pueden ser actualizados por todos los usuarios. Por lo tanto, el
cliente solicita configurar esto en tiempo de ejecución asociado a los roles. ¿Cómo se logra
esto con WorkWithPlus?

Solución: al usar la seguridad para atributos y variables que proporcionan WorkWithPlus, a


partir de la definición de los atributos, modifique sus propiedades ‘Enable Show/Hide
Security’ y ‘Enable Edit/Readonly Security’.

En particular, los campos que deben tener la posibilidad de ocultarse son los siguientes:

- PersonId
- PersonFirstName
- PersonLastName
- PersonNickName
- PersonGender
- PersonBirthDate
- CountryId
- CountryCityId
- PersonCreateDate
- PersonCreateUser
- PersonUpdateDate
P a g e | 97

- PersonUpdateUser

Y los campos que pueden ser editables o de solo lectura son los siguientes:

- PersonFirstName
- PersonLastName
- PersonHobby

Observación: Modifique las propiedades ‘Enable Show/Hide Security’ y ‘Enable


Edit/Readonly Security’ con los atributos que considere necesarios a partir de la estructura
de la transacción. Puede seleccionar más de un atributo a la vez y cambiar esa propiedad
masivamente.

Step 2 - Update Security objects code

Después de asignar el nombre de la funcionalidad a los atributos, pestañas y acciones (la


configuración de pestañas y acciones se mantuvo con sus valores predeterminados),
WorkWithPlus necesita crear la estructura asociada a estas asignaciones en el DataProvider
SecGAMGetAdvancedSecurityWWPFunctionalities.

Para hacer esto, debe ir al objeto WorkWithPlus Settings y seleccionar la opción "Update
Security objects code":
P a g e | 98

Después de hacer esto, se actualizó el objeto


SecGAMGetAdvancedSecurityWWPFunctionalities:
P a g e | 99

Luego haga Build all. Inicie sesión en la aplicación con el usuario admin y la contraseña
admin123 (puede acceder a GAMHome para configurar usuarios y roles).

Desde el Backend de GAM agregue un rol llamado 'Visitante'.

Asigne a este rol los siguientes permisos de objetos (pantallas):

• GAM Home
• CompanyWW
• Company
• Country
• CountryWW
• Person
• PersonWW
• PersonContact
• PersonContactWW

Guarde y luego asocie los permisos para insertar y modificar personas (pero no para
eliminar). Para hacer eso, puede hacer clic en la acción que está al lado del registro 'Person'.

A continuación, cree un nuevo usuario llamado VisitorUser, contraseña 1234 y asóciele el rol
'Visitante'.

Cierre sesión con este usuario e inicie sesión en la aplicación con el usuario 'VisitorUser' y la
contraseña '1234'.

Vaya a PersonWW y compruebe que las acciones 'Insertar' y 'Actualizar' están disponibles,
pero la acción 'Eliminar' no está visible (porque este usuario no tiene permisos para ejecutar
esa acción). Además, los atributos que están disponibles son solo los que el usuario
registrado tiene permisos:
P a g e | 100

Vaya a modificar alguna persona y verifique los siguientes elementos:

• La primera pestaña no está visible (porque este usuario no tiene permiso para
visualizar ninguno de los atributos de la primera pestaña)
• El panel de auditoría que está en la segunda pestaña no está visible
• El campo PersonHobby es de solo lectura

Intente ir a CurrencyWW, por ejemplo, sin tener permisos para acceder a ese Web Panel y
verifique que el sistema llame automáticamente al Web Panel 'No autorizado'.

A continuación, cierre la sesión y acceda con el usuario administrador para otorgar permisos
para visualizar los atributos PersonFirstName, PersonLastName y PersonCreateDate y editar
PersonHobby al rol Visitante (puede filtrar por tipo: Attribute en la asociación de permisos al
rol Visitante).

Cierre la sesión con el usuario administrador e inicie sesión con el usuario visitante para
verificar que pueda ver las columnas del Grid de estos atributos:
P a g e | 101

Luego modifique alguna persona para verificar que pueda visualizar la primera pestaña de
Person, el Panel de Auditoría y que el campo PersonHobby es editable.
P a g e | 102
P a g e | 103

Capacitación WorkWithPlus
Parte 7 – Auditoría
P a g e | 104

Parte 7 – Auditoría

1. La empresa consultora desea tener un historial acerca de las acciones efectuadas con
cada una de las entidades del sistema: personas, empresas, contactos, etc. Es decir,
poder ver cuáles registros se crearon, modificaron, eliminaron, en qué fecha y quién
lo efectuó. Cuando se crea un registro ver los valores para cada atributo, y cuando se
modifican ver los valores anteriores y nuevos. ¿Qué funcionalidad provee
WorkWithPlus para ello?

Solución: Auditoría para las acciones de una transacción.

¿Cómo se activa la auditoría para todas las transacciones? En el nodo Template del
objeto WorkWithPlus Settings modificar la propiedad ‘Enable Auditing’ a True.

Luego que el usuario inserta, modifica o elimina un registro, la aplicación llamará a


un único procedimiento centralizado llamado ‘AuditTransaction’. En ese
procedimiento es donde el desarrollador debe codificar el comportamiento que
desea que se ejecute como auditor de la aplicación.

El procedimiento 'AuditTransaction' por defecto contiene una sugerencia en su


fuente para guardar en la base de datos la información de la acción. Siga esa
sugerencia teniendo en cuenta todo lo que se menciona en el Source (incluido lo que
se detalla en la parte inferior del Source).
P a g e | 105

Ejecute la aplicación y visualice los resultados. Para verificar que el comportamiento


de auditoría es el correcto, modifique algún registro dentro de la empresa, elimine un
registro de una persona y cree un registro desde PersonContact. Luego vaya a
AuditWW y verifique los registros creados.

2. Ahora se quiere auditar solamente cuando se están eliminando registros de todas las
entidades. ¿Cómo lo configura en WorkWithPlus?

Solución: propiedad ‘Auditing Condition’ en el nodo Template del objeto


WorkWithPlus Settings, pues es para todas las transacciones.

También podría gustarte