Zum Inhalt springen

Suchen Sie mithilfe eines Wörterbuchs in Jitterbit Design Studio nach Daten

Anwendungsfall

In diesem Muster enthält ein Quelldatensatz nicht alle vom Ziel benötigten Daten. Wenn beispielsweise bei einer Eltern-Kind-Beziehung ein untergeordneter Datensatz in einem Ziel aktualisiert werden soll, benötigt das Ziel normalerweise einen Verweis auf den übergeordneten Datensatz. Oder wenn mit einem Produktdatensatz gearbeitet wird, enthält der Quelldatensatz möglicherweise nur eine SKU-Nummer, das Ziel möchte jedoch auch einen Gruppen- oder Klassenverweis.

Eine Möglichkeit, dies zu handhaben, besteht darin, eine Inline- oder dynamische Suche durchzuführen, indem ein Funktionsaufruf in die Transformation eingefügt wird, sodass beim Lesen jedes Datensatzes eine Suche nach einem anderen Objekt durchgeführt wird und dieser Wert in das Feld eingetragen wird. Funktionen, die dies durchführen können, sind:

  • DBLookup ist nützlich, um ein einzelnes Feld in einer Datenbankquelle abzurufen.
  • DBLookupAll und DBExecute, sind hilfreich, wenn mehr als ein Feld abgerufen werden muss.
  • Wenn SFDC die benötigten Daten enthält, dann SFLookup, SFLookupAll und SFCacheLookup könnte verwendet werden. SFCacheLookup bietet die zusätzliche Effizienz der Zwischenspeicherung, sodass der Anmeldevorgang übersprungen werden kann, wenn die SFDC-Sitzung noch aktiv ist.

Die Verwendung dieser Funktionen ist jedoch mit Kosten verbunden. Nehmen wir als Beispiel die Verwendung von SFLookup in einer Transformation, wo es verwendet wird, um eine ID von einem Objekt zu erhalten. Wenn ein Quelldatensatz durch eine Transformation geleitet wird, wird jeder Datensatz ausgewertet und alle Script einzeln ausgeführt. Wenn 10 Datensätze verarbeitet werden müssen, erfolgt 10 Aufrufe von SFDC. Wenn die Integration nur eine kleine Anzahl Datensätze verarbeitet, ist die Verwendung von Inline-Lookups eine hervorragende Lösung. Was aber, wenn das Universum der gültigen Lookup-Werte nicht 1.000, sondern 10.000 Datensätze umfasst, die verarbeitet werden müssen? Das Ausführen von zusätzlichen 10.000 Aufrufen in einer Transformation, bei der jeder Aufruf mindestens eine Sekunde dauert, ist sehr ineffizient und langsam. Der weitaus bessere Weg besteht darin, den geringen Zeitaufwand in Kauf zu nehmen, die 1.000 Datensätze in einem Wörterbuch nachzuschlagen und dieses für Lookups zu verwenden.

Was ist ein Wörterbuch in Jitterbit?

In Jitterbit ist ein Wörterbuch ein spezieller Typ eines globalen Variablenarrays, das ein Key-Value Paar enthält. Die Schritte und Funktionen sind:

  • Initialisieren Sie das Wörterbuch mit Dict-Funktion.
  • Laden Sie Daten mit Schlüssel-Wert-Paaren wie „4011“ und „Banane“, „4061“ und „Salat“, „4063“ und „Tomate“ usw. Verwenden Sie die Funktion AddtoDict-Funktion.
  • Suchen Sie einen Schlüssel, nachdem Sie zuerst mit der Funktion HasKey überprüft haben, ob der Schlüssel bereits vorhanden ist-Funktion.
  • Daten nachschlagen, indem der Schlüssel (4011) übergeben und der Wert (Banana) zurückgegeben wird. Das Script verwendet ein '[ ]' nach dem Wörterbuchnamen, beispielsweise: $value= $d["4011"]

Ein Wörterbuch ermöglicht unser Szenario, sodass ein Operation Daten aus der Quelle abrufen und das Wörterbuch laden kann, sodass es für andere Vorgänge zum Nachschlagen verfügbar ist. Ein erster Operation kann das Wörterbuch mit 10.000 Datensätzen laden und ein späterer Operation kann schnell einen Schlüssel an das Wörterbuch übergeben und einen Wert abrufen.

Bei Wörterbüchern sind einige Dinge zu beachten:

  • Der Umfang der Wörterbücher ist auf die Instanz der Operationskette beschränkt. Wenn beispielsweise Operation A lädt $MyDict Bei 10.000 Datensätzen haben nur die Vorgänge, die über Erfolgs- oder Fehlerpfade oder mit RunOperation() verknüpft sind, Zugriff auf dieses Wörterbuch. Wenn ein Operation jedoch chunking und Threading verwendet und eine Transformation aufweist, die ein Wörterbuch füllt, ist das Wörterbuch inkonsistent. Dies liegt daran, dass Jitterbit die von mehreren Operation den Variablen zugewiesenen Werte nicht zu einem einzigen Wertesatz zusammenfasst. Dies gilt für alle globalen Variablen oder Arrays. Verwenden Sie die Standardwerte für chunking/Threading, wenn Sie einen Operation erstellen, der Wörterbücher füllt.
  • Wörterbücher sind sehr schnell beim Finden von Schlüsseln und Zurückgeben von Werten, da sie eine binäre Suche verwenden. Ein Schlüssel kann normalerweise nach fünf bis sechs Versuchen gefunden werden. Vergleichen Sie diese Art der Suche dagegen mit dem Durchlaufen eines Arrays mit 10.000 Datensätzen, um einen Schlüssel zu finden.
  • Wörterbücher werden nicht in den Speicher geschrieben und haben daher keinen wesentlichen Einfluss auf den für die Verarbeitung verfügbaren Serverspeicher.

Beispiel 1

Der Kunde hat zwei Tabellen, eine mit Produktinformationen und die andere mit Produktkategorien, die beide zum Aktualisieren einer dritten Tabelle benötigt werden. Die Quelle ist eine Ansicht eines Data Warehouse, das für die Bereitstellung von Massendaten optimiert ist, jedoch nicht für schnelle Nachschlagevorgänge. Die Verwendung der DBLookup-Funktion für Tausende von Datensätzen wäre ziemlich langsam. Außerdem hat der Kunde eine CSV-Datei, die Informationen enthält, die zum Herausfiltern von Daten aus der Quelle verwendet werden

Anhang

PWE.01 LR-Liste abrufen

  • Dies liest eine externe Datei in den temporären Speicher

PWE.02 Produktwörterbuch festlegen

  • Ein Script initialisiert das Wörterbuch: $Product.Dict.LR_List=Dict();
  • Liest aus einer temporären Quelldatei
  • Die Transformation lädt die Werte in ein Wörterbuch:

Anhang

  • Script: AddtoDict($Product.Dict.LR_List,Style_Color,Flag+"|"+Launch_Release_Date);

  • Beachten Sie hier, dass der Wert eigentlich aus zwei Werten besteht, die durch ein '|' getrennt sind. Die Alternative wäre, zwei Wörterbücher zu erstellen, eines für Flag und eines für Launch_Release_Date, was unnötig kompliziert wäre.

PWE.03 Abfrageprodukt von Teradata

  • Die Transformation verfügt über eine Bedingung zum Herausfiltern von Produkten, die nicht in der CSV-Datei enthalten sind, und die außerdem den in der Transformation verwendeten Variablen Werte zuweist.
  • Beachten Sie, dass wir das, was im vorherigen Operation geladen wurde, aufteilen (mit einem „|“) und in $Product.Flag und $Product.ReleaseDate laden.
result=false;
$Product.Dict.Key=PROD_CD;
If(HasKey($Product.Dict.LR_List,$Product.Dict.Key),
result=true;
value=$Product.Dict.LR_List[$Product.Dict.Key];
arr=Split(value,"|");
$Product.Flag=arr[0];
$Product.ReleaseDate=arr[1];
);
result

PWE.04 Produktkategorien-Abfrage

Dies ist eine SFDC- Abfrage (kein SOAP), die die API Grenzen des Kunden nicht beeinflusst. Sie lädt Daten in eine lokale temporäre Datei.

PWE.05 Produktkategorie-Dict

  • Dadurch wird ein Wörterbuch mit dem Code als Schlüssel und den SFDC-Daten als Wert geladen

attachment

$Code__c=Code__c;
AddToDict($Dict.Product.Category.Line, $Code__c, Id)

PWE.06 Prozessstil

  • Das Wörterbuch wird initialisiert: $Style.Dict.Unique=Dict();
  • Die Transformation sucht die ID im Feld „Product_Category“

Anhang

$GBL_CAT_CORE_FOCS_CD=GBL_CAT_CORE_FOCS_CD;
If(HasKey($Dict.Product.Category.Line,$GBL_CAT_CORE_FOCS_CD),result=$Dict.Product.Category.Line[$GBL_CAT_CORE_FOCS_CD],result="");
result
  • Beachten Sie die Verwendung von HasKey, um zu prüfen, ob der Schlüssel vorhanden ist, anstatt nur ...$Dict.Product.Category.Line[$GBL_CAT_CORE_FOCS_CD].
  • Wenn ein Schlüssel übergeben wird, der im Wörterbuch nicht vorhanden ist, wird ein Fehler ausgegeben, da wir versuchen, einen nicht vorhandenen Wert nachzuschlagen.

PWE.07 Bulk-Upsert-Stile

  • Abschließend wird die Datei per Massenvorgang in SFDC geladen.

Beispiel 2

In diesem Beispiel verarbeiten wir eine XML-Antwort und extrahieren die SKUs und Werte in ein Wörterbuch zur Verwendung in einem späteren Operation.

Anhang

  • Dieses Script befindet sich im vorletzten postoperativen Script:
arr=Array();
$jitterbit.scripting.while.max_iterations=10000;
arr=Split($IFMS.Response,'<');
cnt=Length(arr);i=0;j=0;
$DCL.LineItem=Dict();
While(i<cnt,
If(CountSubString(arr[i],'RemoteOrderNumber xmlns=""')==1,
order=arr[i];
start=Index(order,'>');
end=Length(order);
myorder=Mid(order,start+1,(end-1)-start);
$ACM.Shipment.Number=myorder;
);
If(CountSubString(arr[i],'ShipDate xmlns=""')==1,
shipdate=arr[i];
start=Index(shipdate,'>');
end=Length(shipdate);
shipdate=Mid(shipdate,start+1,(end-1)-start);
if(Length(shipdate)>7,
shipdate=Left(shipdate, Index(shipdate, ' '));
shipdate=CVTDate(shipdate,'?m/?d/yyyy','yyyy-mm-dd');
);
$ACM.ShipDate=shipdate;
WriteToOperationLog("Shipment: "+myorder+" ShipDate: "+shipdate);
);
If(CountSubString(arr[i],'ShippingTrackingNumber xmlns=""')==1,
tracking=arr[i];
start=Index(tracking,'>');
end=Length(tracking);
tracking=Mid(tracking,start+1,(end-1)-start);
$ACM.Tracking.Number=tracking;
WriteToOperationLog("Shipment: "+myorder+" Tracking: "+tracking);
);
If(CountSubString(arr[i],'SKU xmlns=""')==1,
sku=arr[i];
start=Index(sku,'>');
end=Length(sku);
mysku=Mid(sku,start+1, (end-1)-start);
WriteToOperationLog("SKU: "+mysku);
j++;
);
If(CountSubString(arr[i],'QuantityShipped xmlns=""')==1,
qty=arr[i];
start=Index(qty,'>');
end=Length(qty);
myqty=Mid(qty,start+1, (end-1)-start);
WriteToOperationLog("QuantityShipped: "+myqty);
$DCL.LineItem[mysku]=myqty
);
If(CountSubString(arr[i],'/OrderList')==1,
WriteToOperationLog("End of OrderList. " + String(j) + " items found.");
$ACM.Login.Counter=1;
RunOperation("<TAG>Operations/2. Fulfillment/F.5.0.D Get Shipments</TAG>");
$DCL.LineItem=Dict();
);
++i);
  • Dieses Script führt eine Reihe von Aufgaben aus. Diese Kommentare beziehen sich daher auf die in Bezug auf Wörterbücher ausgeführten Aktionen.
  • Das Wörterbuch DCL.LineItem wird initialisiert.
  • Die lokalen Variablen „mysku“ und „myquantity“ werden aus der XML-Quelle gefüllt.
  • DCL.LineItem wird mit „mysku“ als Schlüssel und „myquantity“ als Wert ausgefüllt.
  • Das Wörterbuch wird in einer späteren Operation verwendet, F.5.2.4

Anhang

  • Die Transformation zeigt die Zuordnung zur versendeten Menge an.

Anhang

  • Das Script ShippedQty verwendet das Quellfeld als Schlüssel, um die versendete Menge abzurufen und den Wert einzugeben.
  • Beachten Sie, dass wir (mit HasKey) prüfen, ob der Schlüssel vorhanden ist oder nicht.
$myVal=Envelope$Body$GetResponse$GetResult$Details$ShipmentDetail.InventoryID$Value$;
WriteToOperationLog("Shipped Qty: "+Envelope$Body$GetResponse$GetResult$Details$ShipmentDetail.ShippedQty$Value$+" ------- "+
"InventoryID: "+Envelope$Body$GetResponse$GetResult$Details$ShipmentDetail.InventoryID$Value$);
If(HasKey($DCL.LineItem, $myVal),
output=$DCL.LineItem[$myVal],
WriteToOperationLog("Could not find: "+$myVal+" in Dict");
output=0
);
output