QlikTip #4: Nicht benötigte Felder in QlikView löschen (Dynamic Reduce)

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“:

Geladene Tabellen "Kunden" und "Bestellungen"

Geladene 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:

Tabelle in QlikView um alle Tabellen und Felder zu exportieren

Tabelle in QlikView um alle Tabellen und Felder zu exportieren

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.

Markieren der nicht benötigten Felder in Excel durch "X" in Spalte DropIt

Markieren der nicht benötigten Felder in Excel durch "X" in Spalte DropIt

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:

Bei der nächsten Script-Ausführung werden die Felder automatisch gelöscht

Bei der nächsten Script-Ausführung werden die 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 :)

Beispieldateien zu diesem Beitrag (ZIP, 914 KB)

Bookmark and Share

and tagged , , , . Bookmark the permalink. Both comments and trackbacks are currently closed.

4 Comments

  1. Roland
    Posted September 23, 2009 at 10:37 | Permalink

    Hallo Stefan!
    Danke für Österreichs wohl ersten Qlikview Blog!

    Ich hab gleich den RSS Feed abonniert, und kann hoffentlich von deinen Tipps etwas lernen :)

    • Posted September 23, 2009 at 16:53 | Permalink

      Hallo Roland,

      freut mich, dass Du hierher gefunden hast!

      Schöne Grüsse
      Stefan

  2. Vladimir Sconza
    Posted January 16, 2010 at 14:38 | Permalink

    Sounds interesting, but I cannot really understand the content of this article (German only :) ).

    Could you please translate this!

    V.

    • Posted January 19, 2010 at 13:05 | Permalink

      :)) Some patience please, this article will be translated soon … :)

      Best regards
      Stefan

One Trackback

  1. […] QlikTip #4: Nicht benötigte Felder in QlikView löschen (Dynamic Reduce) […]