Saltar al contenido

Capturar cambios de datos con consultas basadas en marcas de tiempo en Jitterbit Design Studio

Caso de uso

Los datos, como los cambios en los datos maestros o las nuevas transacciones, deben trasladarse de una fuente a un destino. Una consultar periódica, respaldada por una programación, incluirá una condición que utiliza una marca de tiempo para seleccionar los registros de la fuente que deben procesarse en el destino.

Hay varias consideraciones:

  • Almacenamiento persistente de los datos de marca de tiempo
  • Evite un "bucle infinito", donde los cambios realizados por Jitterbit en el destino se retoman y se aplican nuevamente a la fuente, y así sucesivamente.
  • No se debe incluir el aislamiento de los cambios previstos de los cambios no previstos en la fuente, como los datos modificados por un disparador, pero sí los datos modificados por un usuario.

Este enfoque tiene ventajas y desventajas en comparación con un enfoque basado en eventos y en tiempo real.

  • Ventajas:
    • Si el destino no está disponible, la fuente continuará intentando mover los datos hasta que se complete.
    • Puede 'retroceder' la marca de tiempo para permitir repeticiones
    • Puede comenzar relativamente rápido
    • Es más fácil de desarrollar y probar al utilizar conjuntos de datos más pequeños.
    • Puede controlar mejor el tamaño de los datos a procesar.
    • Si se implementa una 'escritura diferida' en la fuente, entonces puede rastrear la actividad de integración desde la fuente hasta el destino.
  • Contras:
    • Solo se aplica si hay una marca de tiempo disponible o se puede construir una condición de consultar.
    • Las encuestas/consultas pueden ser más complicadas que las basadas en eventos.
      • El primero requiere un almacén de datos de marca de tiempo, consultas con condiciones y posiblemente otros filtros, y es sensible a los cambios de esquema en la fuente. En el segundo, Jitterbit simplemente recibe una carga útil. Mientras ese esquema no cambie, los sistemas están acoplados de manera más flexible, lo que es una ventaja desde el punto de vista del desarrollo.
    • Mueva la herramienta de integración a un nivel administrativo más alto. Por ejemplo, si necesita detener un flujo o cambiar o actualizar el cronograma en Jitterbit, que es un cambio de configuración de software. Para muchas empresas, realizar un cambio se realiza bajo un proceso de control de software y requiere más pasos. Con un proceso impulsado por eventos, el cambio se realiza en la fuente.
    • Dado que las marcas de tiempo suelen ser generadas por el sistema, no se adaptan a las reglas comerciales, lo que lleva a incluir reglas comerciales en el middleware y a una gran cantidad de scripts. Desde el punto de vista de la arquitectura empresarial, las reglas comerciales deberían estar contenidas solo en las aplicaciones. Como veremos en este ejemplo, hay una gran cantidad de scripts de reglas comerciales.

Ejemplo

Consultar NetSuite, actualizar Salesforce

adjunto

JB Sync: secuencia de comandos para obtener la marca de tiempo

Las marcas de tiempo se almacenan en SFDC y una consultar obtiene el ID de sincronización y la marca de tiempo en sí. Tenga en cuenta que las marcas de tiempo son UTC y los valores se devuelven en una matriz.

$result = SfLookupAll("<TAG>Salesforce Orgs/sysadmin@example.com</TAG>",
    "Select Id, Object_Last_Modified_Date_del__c from Jitterbit_Syncs__c where Object_Name_del__c = 'Ticket'");
$Jitterbit_SyncsId = Get($result,0,0);
$synctimestampticket = Get($result,0,1);

Obtener Sync_Time

Utilice una función de Salesforce para obtener la hora actual, que se utilizará para actualizar el registro de JB Sync. Tenga en cuenta que esto se realiza antes de la consultar NS en lugar de después de la inserción y actualización de SFDC, que es el método más tradicional. Sin embargo, se descubrió que se estaban perdiendo registros debido a que se estaban realizando cambios en la fuente que ocurrieron entre el momento en que se realizó la consultar y el momento en que finalizó la inserción y actualización. Se tomó la decisión de utilizar este enfoque, incluso a expensas de seleccionar los mismos registros en la consultar de origen. Tenga en cuenta también que no hay una "reescritura" en los registros seleccionados para actualizarlos en función de una inserción y actualización exitosa en SFDC. Si se desplegara eso, se podría construir una consultar que no seleccionara registros duplicados.

$Sync_Time = GetUTCFormattedDateTime(
    LoginToSalesforceAndGetTimestamp("<TAG>Salesforce Orgs/sysadmin@example.com</TAG>","UTC"),"UTC",false);

Pase la variable global synctimestampticket a la consultar

adjunto

Mapeo

Se utiliza una condición para filtrar aún más los datos.

attachment

Condición

El requisito era filtrar determinados sitios en función de las fechas hasta que se completara la despliegue a nivel nacional. Dado que la consultar no filtra en función de los requisitos de fecha cambiantes, se utiliza una condición dentro de la transformación.

Los datos entrantes se escriben en el registro de operación. Luego se verifican los identificadores internos de la ubicación y, si la ubicación está dentro del alcance, se verifica el último valor modificado del registro y, si lo hizo Jitterbit, se marca para omitirlo.

Dado que los valores LMB dependen del ambiente, se realiza una verificación del ambiente actual.

A continuación, se compara el registro con una lista de rangos de fechas, ya que se excluyen los registros anteriores a una determinada hora. Si el registro supera todas las pruebas, se utilizará.

WriteToOperationLog(
"----------"+"\r\n"+
"Int id: "+searchResponse$searchResult$recordList$record.SalesOrder$internalId+"\r\n"+
"Ord id: "+searchResponse$searchResult$recordList$record.SalesOrder$tranId$ +"\r\n"+
"LMD: " +searchResponse$searchResult$recordList$record.SalesOrder$lastModifiedDate$+"\r\n"+
"Loc: " +searchResponse$searchResult$recordList$record.SalesOrder$location$internalId+"\r\n"+
"LMB: " +searchResponse$searchResult$recordList$record.SalesOrder$customFieldList$Last_Modified_By$value$internalId+"\r\n"+
"Cust:" +searchResponse$searchResult$recordList$record.SalesOrder$entity$internalId);
If(searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==25||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==6||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==3||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==10||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==4||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==18||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==26||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==29||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==16||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==22||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==14||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==15||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==35||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==19||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==17||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==12||`FINAL DE LA MESA`


 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==84,

 $loccheck = true,
 $loccheck = false);
//exclude changes in NS made by Jitterbit
If($loccheck && GetEnvironmentName()=='DEV',
 If(
 searchResponse$searchResult$recordList$record.SalesOrder$customFieldList$Last_Modified_By$value$internalId=='9836'||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$customFieldList$Last_Modified_By$value$internalId=='9837'||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$customFieldList$Last_Modified_By$value$internalId=='9838',
 $idcheck = false,
 $idcheck = true));
If($loccheck && GetEnvironmentName()=='PROD',
 If(
 searchResponse$searchResult$recordList$record.SalesOrder$customFieldList$Last_Modified_By$value$internalId=='10780'||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$customFieldList$Last_Modified_By$value$internalId=='10781'||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$customFieldList$Last_Modified_By$value$internalId=='9631',
 $idcheck = false,
 $idcheck = true));
Case(
 $loccheck==false, $result=false;WriteToOperationLog("Skip loc"),
$loccheck==true && $idcheck == false, $result = false; WriteToOperationLog("Skip id"),
$loccheck==true && $idcheck == true,$result = true; WriteToOperationLog("Pass")
 );

// region & timestamp check
If($result == true && (searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==4||`FINAL DE LA MESA`
 searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==26),
//check create date not before point in time when region went live. For these two regions, that is 2015-09-13T13:00:00Z
 If(Date(GetUtCFormattedDateTime(searchResponse$searchResult$recordList$record.SalesOrder$createdDate$,"UTC",false))
< Date(GetUTCFormattedDateTime("2015-09-13T13:00:00Z","UTC",false)),
 $result = false;
 WriteToOperationLog("Colo Region ticket before 2015-09-13"))
);
If($result == true && searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==18,
//check create date not before point in time when region went live.
 If(Date(GetUtCFormattedDateTime(searchResponse$searchResult$recordList$record.SalesOrder$createdDate$,"UTC",false))
< Date(GetUTCFormattedDateTime("2015-09-20T13:00:00Z","UTC",false)),
 $result = false;
 WriteToOperationLog("Williston Region ticket before 2015-09-20"))
);
If($result == true && searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==29,
//check create date not before point in time when region went live.
 If(Date(GetUtCFormattedDateTime(searchResponse$searchResult$recordList$record.SalesOrder$createdDate$,"UTC",false))
< Date(GetUTCFormattedDateTime("2015-09-23T16:00:00Z","UTC",false)),
 $result = false;
 WriteToOperationLog("Caspar Region ticket before 2015-09-23")
 )
);
//AR
If($result == true && searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==16,
//check create date not before point in time when region went live.
 If(Date(GetUtCFormattedDateTime(searchResponse$searchResult$recordList$record.SalesOrder$createdDate$,"UTC",false))
< Date(GetUTCFormattedDateTime("2015-10-04T12:00:00Z","UTC",false)),
 $result = false;
 WriteToOperationLog("AR Region ticket before 2015-10-4")
 )
);
//DFW
If($result == true && searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==22||`FINAL DE LA MESA`
searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==14||`FINAL DE LA MESA`
searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==15||`FINAL DE LA MESA`
searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==17||`FINAL DE LA MESA`
searchResponse$searchResult$recordList$record.SalesOrder$location$internalId==35,
//check create date not before point in time when region went live.
 If(Date(GetUtCFormattedDateTime(searchResponse$searchResult$recordList$record.SalesOrder$createdDate$,"UTC",false))
< Date(GetUTCFormattedDateTime("2015-10-11T08:00:00Z","UTC",false)),
 $result = false;
 WriteToOperationLog("DFW Region ticket before 2015-10-11")
 )
);
$result

Después de que los datos se escriben en un archivo temporal, se llama a Update Jitterbit Syncs:

attachment

adjunto

adjunto

Finalmente, se llama a la operación A02 si hay registros para procesar.