4D v16

Mengen und temporäre Auswahlen

Home

 
4D v16
Mengen und temporäre Auswahlen

Mengen und temporäre Auswahlen    


 

Diese Sequenz zeigt, wie Sie eine Auswahl beibehalten und Aktionen ausführen (Vereinigung, Schnittmenge und Differenz).

Mengen sind ein einfacher Weg, um Aktionen auf Datensätze in einer Tabelle auszuführen.

So können Sie eine Auswahl beibehalten und später wiederverwenden.
Beim Operieren mit zwei Mengen können wir eine Untermenge als Ergebnis der bestimmten Operation bilden (gemäß der konventionellen Mengenlehre).

Wir wenden das auf die Liste der Einsätze im Formular Navigator an und erstellen eine Menge aus der aktuellen Auswahl.

Wir erstellen eine Schaltfläche, die nach den vor 9:00 gestarteten Einsätzen sucht.

Hier die Methode zur Schaltfläche:

 QUERY([Interventions];[Interventions]Hour_Intervention<?09:00:00?)

Wir erstellen eine 2. Schaltfläche für alle noch nicht 100% abgeschlossenen Einsätze. Wir schreiben folgenden Code:

 QUERY([Interventions];[Interventions]Progress<100)

Momentan enthält die importierte Datei noch nicht diese Angabe in %.

Also wenden wir zuerst auf alle Einsätze eine Formel an. Hierzu zeigen wir eine Auswahl von allen Einsätzen (11.732 ) an und wenden folgende Formel an (Menü Datensätze => Formel anwenden):

 [Interventions]Progress:=Round(Mod(Random;100);-1)

Sie berechnet den Prozentwert und rundet die letzte Stelle.

Klicken wir jetzt auf die 1. Schaltfläche und dann auf die 2., verlieren wir natürlich die mit dem 1. Klick erstellte Menge.
Es ist also sinnvoll, in der 1. Schaltfläche nach der Suche die Information in einer Menge zu halten. Wir nennen sie Intervention-Morning. Wir setzen folgende Zeile an das Ende der Schaltflächenmethode:

 CREATE SET([Interventions];"Intervention_Morning")

Die Menge der gefundenen Einsätze, die noch nicht abgeschlossen sind, nennen wir Intervention_InProgress.

 CREATE SET([Interventions];"Intervention_InProgress")

Dann können wir die Mengen vergleichen:

  • Vereinigungsmenge Früheinsätze + Einsätze in Bearbeitung.
    Wir duplizieren die Schaltfläche und geben an, dass dies die Einsätze vor 9:00 a.m. + jene noch in Bearbeitung sind.
    Wir schreiben wie folgt:
     UNION("Intervention_Morning";"Intervention_InProgress";"Interventions_Result")

    Die 3. Menge Interventions_Result legt fest, die ersten beiden zu behalten.
  • Für Früheinsätze noch in Bearbeitung vergleichen wir den gemeinsamen Teil beider Mengen, so dass wir alle noch nicht erledigten Früheinsätze erhalten. In diesem Fall müssen Sie nicht den Befehl UNION, sondern INTERSECTION verwenden.
  • Für abgeschlossene Einsätze müssen wir auf die beiden Mengen DIFFERENCE anwenden: alle Früheinsätze minus der noch in Bearbeitung ergeben diese Menge.

Wir testen die verschiedenen Möglichkeiten durch Ausführen des Formulars Navigator.
Wir nehmen alle Einsätze, es sind 11.732, nach Klick auf Query haben wir immer noch 11.732.

Warum ist das so? Im vorigen Kapitel haben wir in der Methode Navigator_Functions ganz unten eine Zeile gesetzt. Sie gibt die Anzahl Datensätze nach Erstellen einer neuen Auswahl an.

 vNbRecords:=Records in selection([Interventions])

Wir kopieren diesen Code und wenden ihn auf die 5 neu erstellten Schaltflächen an.
Derzeit haben wir hier keinen Zeiger auf die Tabelle; wir bearbeiten Interventions.

Testen wir die Schaltflächen, fällt auf, dass <9:00+ <100%, <9:00 in progress und <9:00 finished die hier angezeigte Zahl in vNbRecords nicht verändern.

Warum ist das so? Weil das Erstellen einer Menge nicht ihre Verwendung impliziert.
In dieser Schaltfläche müssen wir nach Erstellen der Vereinigung/Differenz/Schnittmenge angeben, dass diese Menge verwendet werden muss.

Wir ändern also den Code:

  • Hier fügen wir den Befehl USE SET hinzu
  • Wir fügen also die Zeile für die zu verwendende Menge in diesen Schaltflächen hinzu

Wir testen jetzt (Abweichungen möglich, da wir zuvor die Random Funktion verwendet haben):

  • Einsätze in Bearbeitung: Wir haben ca. 600
  • Beendete Einsätze: Wir haben um die 30
  • Das entspricht den Einsätzen vor 9:00 Uhr: also ca. 630

Wir schließen das Formular und starten die Methode Navigator erneut.
Klicken wir auf eine der drei rechten Schaltflächen, erscheint eine Meldung, dass die Mengen nicht existieren. Sie müssen natürlich existieren, bevor wir sie nutzen.
Wir verfolgen das Erstellen dieser Mengen. Dazu klicken wir mit Alt + Shift + Rechtsklick auf die 1. Suchschaltfläche und wählen einen Prozess.

Wir sehen in der Liste links, dass unter "Mengen" die Liste der vorhandenen Mengen im Prozess im Schrittmodus erscheint. Derzeit gibt es keine. 

Beim Ausführen der Methode sehen wir:

Wiederholen Sie den Vorgang mit den anderen Schaltflächen, um den Ablauf zu verstehen.

Sie müssen beachten, dass eine Menge nur eine Liste Datensätze ist, die nicht unbedingt die aktuelle Auswahl ist. Hier enthält die aktuelle Auswahl der Tabelle Interventions derzeit 11180 Datensätze.

Wechseln wir zum Befehl USE SET, enthält die Auswahl jetzt eine Anzahl Datensätze, die zur Anzahl in der Menge passt (hier 11215). Die Variable vNbRecords wird ebenfalls entsprechend angepasst.

Eine andere praktische Verwendung von Mengen ist: mehrere Datensätze (Strg + Linksklick) auswählen und als aktuelle Auswahl festlegen; klicken wir auf die Schaltfläche, gibt es nur diese X Datensätze.

Dazu müssen Sie:

  • Die Schaltfläche Selection programmieren
  • Angeben, dass wir eine Auswahl wollen
  • Eine Eingabe in die Methode kopieren
  • Und den entsprechenden Code schreiben

Der Code auf der Schaltfläche lautet:

 Navigator_Functions("Selection";FORM Get current page)

und in der Methode innerhalb der Case-of Abfrage:

:($Action="Selection")
 $SetName:="Userset_"+String(Milliseconds)
 GET HIGHLIGHTED RECORDS($PTable->;$SetName)
 USE SET($SetName)
 vNumRecords:=Records in selection($PTable->)
 CLEAR SET($SetName)

Da wir bereits dabei sind, überarbeiten wir auch die Schaltfläche Sort. Dazu übergeben wir in der Schaltfläche dieselbe Codezeile, verwenden aber statt „Selection“, „Sort“ und fügen in der Methode Navigator_Functions

:($Action="Sort")
 ORDER BY($PTable->)

ein. Diese Schaltfläche benötigen wir im späteren Verlauf des Kapitels.

Das heißt im Klartext:

  • Mengenname setzen (hier Textteil + in Text konvertierte Millisekunden)
  • Markierte Datensätze der entsprechenden Tabelle erhalten und in die zuvor erstellte Menge übertragen
  • Die Menge verwenden
  • Anzahl der dazugehörigen Datensätze neu berechnen

Eine Menge besteht aus einem Bit pro Datensatz, sie behält nicht die Sortierreihenfolge.

Wollen Sie diese Information behalten, müssen Sie Befehle zu temporären Auswahlen verwenden:
COPY NAMED SELECTION und USE NAMED SELECTION

Wir fügen eine weitere Schaltfläche hinzu, um:

  • Eine erste Auswahl zu erstellen (T1 temporäre Auswahl)
  • Dafür verwenden wir diese Codezeile:
     COPY NAMED SELECTION([Interventions];"T1")
  • Und duplizieren die Schaltfläche: T2

Jetzt können Sie 2 Auswahlen erstellen, die die Sortierreihenfolge berücksichtigen.

Sie existieren im Speicher, werden aber nicht verwendet.

Als nächstes:

  • Duplizieren wir diese Schaltflächen
  • Ändern ihre Formel, um die Verwendung dieser Auswahlen anzufordern (hier müssen wir die Tabelle nicht angeben.)
     USE NAMED SELECTION("T1")

Wir zeigen alle Einsätze an, dann machen wir folgendes:

  • Markieren die ersten Einsätze
  • Klicken auf Selection
  • Sortieren nach Einsatzdatum
  • Erstellen eine 1. Auswahl (T1)
  • Nehmen dann diese Auswahl
  • Sortieren sie nach Einsatzzeit
  • Und erstellen dann eine 2. Auswahl (T2)

Wir testen:

  • Fordern wir die 1. Auswahl an, erscheint sie gemäß den angegebenen Kriterien Datum und Zeit
  • Klicken wir auf die 2. Schaltfläche, werden sie nach Objekt und dann nach Datum sortiert

Hier sollten Sie folgendes beachten:

Es gibt folgenden Speicherbedarf:

  • Eine Auswahl benötigt 4 Bytes pro gewähltem Datensatz, unabhängig von der Anzahl Datensätze in der Tabelle (anders als bei Mengen).
  • Eine Menge benötigt 1 Bit pro Datensatz in der Tabelle.
    Mengen bestehen aus einer Reihe Bits. Eine Menge enthält so viele Bits, wie es Datensätze in der Tabelle gibt. Jedes Bit einer Menge entspricht einem Schnellbericht "in der Auswahl enthalten" oder "nicht enthalten" für den xten Datensatz der Tabelle, in dem Moment, wo die Menge erstellt wird.

Nachfolgende Tabelle zeigt die Unterschiede zwischen Mengen und temporären Auswahlen:

ThemaMengeTemporäre Auswahl
Speicherplatz für einen Datensatz1 Bit4 Bytes
Sortierung beibehaltenNeinJa
Aktuellen Datensatz beibehaltenBedingtJa
Vereinigung/Befehl UNIONJaNein
Überschneidung/Befehl INTERSECTIONJaNein
Differenz/Befehl DIFFERENCEJaNein
Sichern auf FestplatteJaNein
Speicherplatz für 10 ausgewählte Datensätze aus 20.00020.000 Bits oder 2500 Bytes10 x 4 Bytes = 40 Bytes
ReichweiteLokal, Prozess, InterprozessProzess, Interprozess

Sie können nur Mengen aus derselben Tabelle miteinander vergleichen.

Achtung: Mengen sind nur zeitlich begrenzt gültig, arbeiten Sie evtl. mit Semaphoren (weitere Infos siehe Handbuch 4D Programmiersprache im Kapitel Prozess (Kommunikation).

Jedes Bit entspricht der derzeitigen Position eines Datensatzes in einer Tabelle. Werden Datensätze gelöscht oder hinzugefügt, kann der bisherige Inhalt eines vorhandenen Datensatzes durch neuen Inhalt ersetzt werden, der dann nicht mehr mit den Angaben in der Menge übereinstimmt, d.h. die Menge ist veraltet.

Gehen Sie beim Verwenden von Mengen methodisch vor. Sie sind ein effizienter und schneller Weg zum Vergleichen von Auswahlen.

Um eine Auswahl beizubehalten, können Sie auch ein Array verwenden, das über den Befehl SELECTION TO ARRAY ihre Identifikation enthält.

Eine weitere Möglichkeit ist der Einsatz von Clustern, die z.B. in BLOBs gespeichert werden.

Sie sollten natürlich nicht mehr benötigte Auswahlen löschen, um den Speicherplatz wieder freizugeben.

 CLEAR SET("MengeName")
 CLEAR NAMED SELECTION("AuswahlName")

 
 

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Mengen und temporäre Auswahlen

 
GESCHICHTE 

 
ARTIKELVERWENDUNG

Self-Training ( 4D v16)