Wie löscht man in einer QlikView-Applikation nicht benötigte Felder um Ressourcen zu sparen.
Die Ausgangssituation:
Sie haben Ihre QlikView-Applikation oder QVDs erstellt, mit denen Sie Daten aus Ihrem Quellsystem, Ihrer Datenbank laden. Nun haben Sie einige Tabellen und Felder in QlikView von denen Sie einige (vorerst) nicht benötigen, möchten aber Ihre Load-Scripts nicht ändern, da sie die Daten vielleicht in Kürze für weitere Analysen benötigen werden; dennoch möchten Sie Speicherplatz am Server/in Ihrer QlikView-Applikation sparen und nicht benötigte Felder dynamisch droppen/löschen.
Dafür habe ich nun die Lösung:
In der nachfolgend präsentierten Lösung können Sie in Ihrer QlikView-Applikation durch Verwendung einer Konfigurations-Datei dynamisch Felder löschen/droppen.
Schritt 1:
Im meinem Beispiel lade ich Daten von QVDs die Tabellen „Kunden“ und „Bestellungen“:
Folgende Felder werden nicht benötigt:
- PersonalNr
- PersonalNrBestell
- Länderkennz
- Fax
Nun erstelle ich als nächstes in der QlikView-Applikation ein Tabellendigramm mithilfe der Systemfelder, in dem alle Felder, die momentan verwendet werden, exportiert werden können. Zusätzlich zu den zwei Spalten „Table“ und „Field“ füge ich eine dritte, leere Spalte hinzu:
Diese Tabelle kann ich nun leicht in Excel exportieren (XL Icon) um dort die Felder in der Spalte DropIt mit einem „X“ zu markieren, die ich in weiterer Folge löschen möchte.
Schritt 2:
Nun füge ich folgendes Script am Ende meines Load-Scripts hinzu:
// Load the values from the excel-sheet into a temporary table // called "DropFields" for later usage ... // // Before using this script in your application just check if the // path to "DropField_Definition.xls" is correct! DropFields: LOAD Table, Field, DropIt FROM DropField_Definition.xls (biff, embedded labels, table is Sheet1$); Trace ----------------------------------------------------------; Trace Starting to drop fields ...; // now iterate through all the values in the temporary table "DropFields" for i = 0 to (NoOfRows('DropFields')-1); // read the values in the current row LET vTable = peek('Table', i); LET vField = peek('Field', i); Let vSysDeleteIt = upper(peek('DropIt',i)); if (vSysDeleteIt = 'X') then SET ErrorMode = 0; //prevent errors if field does not exist Trace DROP FIELD $(vField) from $(vTable); // drop the field by name drop field $(vField) from $(vTable); SET ErrorMode = 1; //reset errorMode to default end if next Trace ### - finished dropping fields; Trace ----------------------------------------------------------; // finally drop the temporary table "DropFields" DROP TABLE DropFields;
Beim nächsten Reload werden nun die im Excel definierten Felder automatisch gelöscht:
Vorteile:
- Wenn ich davon ausgehe, dass diese Lösung bei einem täglichen Ladeprozess am Ende ausgeführt wird, lukriere ich den Vorteil, dass ich zeitweilig nicht benötigte Felder jederzeit sehr schnell wieder „aktivieren“ (nicht mehr löschen) kann und somit einerseits an Flexibilität gewinne, andererseits doch Speicherplatz am QlikView-Server (wie es wohl meistens der Fall sein wird) einspare.
Nachteile
- Dieser Prozess braucht natürlich Rechenzeit; natürlich wäre es effizienter, die Felder, die wir durch diese Lösung wieder löschen, gleich nicht zu laden, um sie anschliessend wieder zu löschen; in Situationen, wo es darum geht, den Load-Prozess möglichst kurz zu halten, würde ich daher diese Lösung nicht einsetzen.
P.S.: Auf wen das ursprüngliche Copyright dieser Idee geht, weiß ich leider nicht; ich habe diese Idee mal aufgeschnappt, umgesetzt und verfeinert und wende dies nun regelmäßig an und bin happy damit
4 Comments