Salesforce: come gestire i valori NULL in update con Mule 4

Ciao amico sviluppatore, ho deciso di scrivere questo articolo per condividere con te come ho gestito i valori NULL dei campi nel payload in input alle operazioni di update o upsert con il connettore Salesforce v10 per Mule 4.

In generale, la documentazione di Mulesoft è sempre stata sufficiente per affrontare gli enigmi quotidiani ma, questa volta, ho riscontrato alcune difficoltà considerando la scarsa quantità di informazioni sul caso in oggetto.

Inizio dell’avventura

Nessuno nasce onnisciente.
I colleghi mi segnalarono un problema: si accorsero che alcuni dati in Salesforce non erano correttamente allineati rispetto al sistema sorgente, in particolare delle date che dovevano risultare non valorizzate.
Bene, aprii Anypoint Studio e modificai alcuni MUnit test di update, lanciai i test: ecco cascai dal pero, effettivamente nonostante io forzai la valorizzazione a NULL di alcuni campi, le operazioni di update non avevano effetto sulla base dati di Salesforce.

Secondo tentativo, provai con il DataLoader (se non lo sai è un tool di Salesforce che permette di effettuare operazioni massive di ins/upd/del) ma nulla di fatto, anche lui assunse un comportamento strano.
Secondo te cosa feci? Con super Google sempre al nostro servizio e la documentazione di Salesforce scoprii che effettivamente nelle operazioni di update o upsert, oltre al payload bisogna anche esplicitare il fatto di scrivere anche il valore NULL.
Con DataLoader, il gioco è semplice, basta impostare a true il flag “Insert null value” nelle impostazioni:

Impostazioni Dataloader

Ad ogni modo, non avevo ancora capito come riprodurre lo stesso comportamento in Mule :D.

Ci siamo quasi

Pensai che l’intervento al codice sarebbe stato poco invasivo, in quanto si trattava di un semplice flag da impostare nella configurazione globale del connettore Salesforce di Mule.
Ancora una volta, tornai su Studio aprii la configurazione e…. di nuovo cascai dal pero 😂
nessuna traccia di una configurazione simile al Dataloader.

Nemmeno nella documentazione di Mulesoft trovai riscontro.

Cercando su Super Google riuscii a trovare alcuni post sul heldesk di Mule dove qualcuno suggeriva di valorizzare un campo denominato “fieldsToNull” (Array), provai ad intuire il comportamento al variare della valorizzazione ma senza grandi risultati.

Aria di vittoria

Sempre con Google al mio fianco continuai la ricerca (sai benissimo che può durare anche giorni).
Ed ecco che all’ennesimo click trovai un post che spiegava che l’array fieldsToNull deve contenere solo i nomi dei campi contenuti nel payload che sono effettivamente valorizzati a NULL.

Esempio update di un Lead:

%dw 2.0
output application/java

---
{  
   Id: "jdjjdjscjn000jjW",
   FirstName: "Mario",
   LastName: "Rossi",
   Company: null,
   Phone: "123345668",
   fieldsToNull: [
      "Company"
   ]
}

Se proviamo a togliere fieldsToNull e in Salesforce la colonna Company di Mario fosse valorizzata con “MyBusiness” allora la chiamata non avrebbe effetto, cioè in Salesforce vedremo ancora “MyBusiness”.

Luca wins

Quasi risolto se non per un piccolo fattore, nel progetto ETL fatto con Mule 4 ci sono circa 35 flussi che aggiornano oggetti diversi di Salesforce con in media una decina di campi ognuno.
Tuttavia, non sono a conoscenza della logica di business sovrastante ai flussi, per me sono solo record da aggiornare su un database perciò non posso sapere a priori quali campi potrebbero assumere un valore NULL e/o su quali flussi intervenire.

Come ho fatto?

Mi son detto, scrivo uno script DataWeave e lo piazzo a valle di tutte le trasformazioni del payload prima del operazione di update.

Con quale logica?

Ecco lo script:

Semplice, itero ogni campo dell’oggetto filtrando, con la funzione filterObject, ogni campo con chiave K e valore V con V == NULL, e infine con l’ausilio della funzione namesOf mi ritroverò un array valorizzato con solo i nomi dei campi valorizzati a NULL.

%dw 2.0
import mergeWith from dw::core::Objects

  
fun fieldsToNull(obj) =
  namesOf(obj filterObject ((f) -> f ~= null))
  
output application/java
---
payload map (value, index) -> value mergeWith {
	fieldsToNull: fieldsToNull(value)
}

In questo caso si ipotizza di elaborare in input un array di oggetti, destinati a diventare dei parametri in input ad un’operazione di upsert o update.

Salvando lo script in un file .dwl ho dovuto solo aggiungere uno step di trasformazione a valle di ogni mapping.
Esempio con anagrafica:

Esempio script su flusso anagrafica

Conclusioni

Sono felice di aver condiviso la mia esperienza su questo argomento, spero ti possa essere d’aiuto.
Se conosci strade alternative ti invito a lasciare un commento qui sotto, mi aiuterai a crescere come sviluppatore perché non si finisce mai d’imparare.

Link al post: https://blogs.perficient.com/2016/08/31/mulesoft-salesforce-connector-release-7-2-0-201608251058-and-fieldstonull/

Leggi anche: Proprietà di configurazione in Mule

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

1 + due =