top of page
  • Foto del escritorAlejandro Caravantes Molina

Clonar registros con PowerFx


Si pienso en cómo tendríamos que implementar esta funcionalidad cuando empecé con Dynamics hace ya unos cuantos años, y lo comparo con lo que vamos a ver ahora me explota el cerebro la verdad.

Hace algún tiempo si quisieramos implementar una funcionalidad tan simple como clonar un registro de Dynamics, ahora Dataverse, se me hubiera ocurrido por ejemplo implementar un Plugin que se invoque a través de un botón que hay que configurar con el Ribbon Workbench entre otras opciones... Todas esas opciones bastante mas costosas de lo que vamos a hacer hoy.


Vamos a clonar registros de la tabla Cuentas utilizando PowerFx a través de una funcionalidad que actualmente sigue en preview.


Lo primero que tenemos que hacer es crear una nueva solución y agregar la aplicación model-driven que queremos customizar. Una vez se ha agregado la aplicación, sobre el menú contextual de la propia aplicación haz clic en la opción Editar, Editar en vista previa.


En la lista de tablas que aparece en la zona de la izquierda, haz scroll hasta la tabla Cuentas y en su menú contextual selecciona Editar barra de comandos (vista previa).


Esto abrirá una nueva ventana de navegador que nos va a preguntar que barra de comandos queremos editar. Como ves hay varias opciones que elegir y te invito a que jueges un poco para investigar.


Nosotros vamos a editar la barra de comandos de la vista o cuadricula principal por lo que selecciona la opción Cuadrícula principal.



Si eres un tanto oldie como yo, por decirlo finamente, te lanzo una pregunta:


¿No te parece un tanto increíble que lo que había que liar antes con el Ribbon Workbench (gracias comunidad por hacernos la vida un poco mas fácil) ahora sea tan sencillo como lo que estás viendo?

A mi la verdad que sí. Si has seguido los pasos estarás viendo una pantalla parecida a la que se puede ver a continuación con todos los comandos disponibles de la tabla Cuentas.


Haz clic en la opción Nuevo Comando y como pordrás suponer lo que va a ocurrir es que se va a añadir un nuevo comando. Juega con las opciones Subir y Bajar para colocar el nuevo botón donde consideres. Escribe un nombre descriptivo para el nuevo comando en el campo Etiqueta y establece un icono para el comando. Yo he elegido el icono de caja Clone.


Lo siguiente que vamos a hacer es establecer una mínima lógica para mostrar u ocultar el botón en función de una determinada casuística. ¿Qué casuística? Que sólo se muestre cuando el total de los registros seleccionados en la cuadricula principal sea igual a uno. Para ello haz scroll hasta abajo en las opciones del nuevo comando y en el desplegable Visibilidad selecciona Mostrar en condiciones de fórmula. A continuación haz clic en Abrir la barra de fórmulas y escribe lo siguiente:


CountRows(Self.Selected.AllItems)=1

Sencillo ¿no?. Vamos con lo importante: clonar el registro. Justo encima de la opción Visibilidad verás que hay una opción que se llama Acción. En el desplegable selecciona Ejecutar fórmula y vuelve a hacer clic en Abrir barra de fórmulas.


Vamos a utilizar la función Patch exactamente igual que la utilizamos en las aplicaciones Canvas cuando queremos trabajar con registros en Dataverse sin utilizar los formularios de creación integrados. Para ello escribe lo siguiente en la barra de fórmulas:

Patch(
    Cuentas; 
    Defaults(Cuentas);
    {
        'Nombre de cuenta': "Copia de " & Self.Selected.Item.'Nombre de cuenta';
        'Correo electrónico':If(IsBlank(Self.Selected.Item.'Correo electrónico');Blank();Self.Selected.Item.'Correo electrónico')
    }
);;
Notify("Una copia de la cuenta seleccionada: '" & Self.Selected.Item.'Nombre de cuenta' & "' ha sido creada. Por favor abre la nueva cuenta y actualiza los campos necesarios.")



Fíjate que además de crear el registro estamos lanzando una notificación al usuario que es una nueva funcionalidad también.






Por último selecciona Guardar y Publicar y prueba tu nuevo botón en la cuadrícula principal Cuentas.



Lógicamente lo que hemos visto aquí ha sido una chorrada y esto se puede complicar todo lo que queramos. Por ejemplo si necesitas clonar un registro y todos sus registros hijos puedes utilizar la función ForAll para clonar tambien estos registros. La fórmula podría tener un aspecto como el siguiente:

Set(ClonedAccount,
    Patch(Cuentas; 
          Defaults(Cuentas);
          {
                'Nombre de cuenta': "Copia de " & Self.Selected.Item.'Nombre de cuenta';
                'Correo electrónico':If(IsBlank(Self.Selected.Item.'Correo electrónico');Blank();Self.Selected.Item.'Correo electrónico')
          }
         )
   );;
ForAll(
      Self.Selected.Item.Casos;
      Patch(
            Casos;
            Defaults(Casos);
            {
                  'Título de caso': "Copia de" & 'Título de caso';
                  'Cliente:':ClonedAccount 
            }
           )
      );;
Notify("Product " & Self.Selected.Item.Name & " and its assets have been cloned. Please open the records and update the necessary fields.")

Espero que lo que has leido hasta aquí haya servido de ayuda. ¡Hasta la próxima!

bottom of page