[Allegro] Vb.301: Neuer FLEX ista.flx : Index-Statistik

Bernhard Eversberg b-eversberg at gmx.de
Do Sep 27 14:04:35 CEST 2018


Verlautbarung 301 zur allegro-Entwicklung                    2018-09-27
-----------------------------------------

Neuer FLEX ista.flx : Index-Statistik
-------------------------------------

Wieviele Wörter sind in meinem ALL-Register?

... oder Wieviele Einträge stehen im Namensregister, oder ...

Solche Fragen werden manchmal gestellt - verständliche Neugier, wenn
man lange und fleißig an einer Datenbank geschuftet hat.

Näher betrachtet gibt es jeweils zwei verschiedene Fragen:

1. Wieviele ZEILEN hat mein ALL-Register?
   Genauer gefragt: Wieviele verschiedene Wörter stehen im Wortregister
   oder Namen im Namensregister oder ...?
   Dafür hätte man jede Zeile als 1 Zeile zu zählen, auch wenn
   sie z.B.  "9781 xyz"  lautet, was ja bedeutet, daß in 9781 Sätzen
   das Wort "xyz" vorkommt. (Innerhalb eines Satzes mag das Wort sogar
   mehrfach auftreten, aber DAS schlägt sich im Index NICHT nieder! Das
   zu zählen wäre noch eine Aufgabe für sich - deutlich schwieriger, 
   aber wer würde sowas wissen wollen?)

2. Wieviele EINTRÄGE stehen im ALL-Register?
   Dazu hätte man nicht einfach die Zeilen zu zählen, sondern die
   Zahlen zu addieren, die am Beginn der Zeilen stehen. Das Ergebnis
   wird oft sehr viel größer sein: allein schon die in 1. genannte
   Zeile würde mit 9781 Einträgen zu Buche schlagen.

Wenn jede Zeile in einem Register nur genau einen Eintrag hat, wie es
z.B. im Register der Primärschlüssel sein sollte, sind beide Summen 
gleich, andernfalls ist die zweite stets größer.

Es folgt die Lösung:

Wer sich auskennt, dem fällt sofort ein: Es entsteht doch, wenn man den
Index erneuert, die Datei "protoq", da steht drin, wieviele Einträge
es in jedem Register gibt!
Nun ja, in der Datei  protoq  steht z.B. unter "Endphase ...":

   Vorgang beginnt, maximale Schluessellaenge 128
     INDEX d1 enthaelt 4863 Eintraege
     INDEX d2 enthaelt 3240 Eintraege
     ...

und die Zahlen, die sind jeweils die Antwort auf Frage 2, sie verraten
aber eben nicht, wieviele Zeilen es sind, d.h. Frage 1 bleibt damit 
unbeantwortet. 
Ferner werden die "virtuellen" Register nicht separat gezählt, z.B. 
nicht das DIS-Register u.a. 
Ein weiterer Nachteil ist, daß die Datei "protoq" nur den
Zustand zum Zeitpunkt der letzten Index-Erneuerung offenlegt, nicht
den akkuraten, aktuellen Stand der Dinge, den man schnell mal eben 
wissen würde - Index erneuern ist dafür viel zu aufwendig!

Was man folglich gerne hätte, wäre eine Methode, jederzeit ganz fix
klipp und klar beide Fragen beantworten zu können. Dann könnte man bei
wichtigen Projekten z.B. routinemäßig eine Tagesstatistik machen,
sowas sollte ja wohl so gut wie gar keine Zeit kosten.

Genau das wurde realisiert: ista.flx  heißt der neue FLEX.
Abholen von allegro-b mit  X gf ista.flx
Dann starten mit  X ista  und schauen, was passiert.

An den Programmen wurde nichts verändert - deshalb kein neues inst-all.exe.
(Das ist ja eben der Vorteil, daß man neue Funktionen schaffen kann, OHNE am
Programm was zu machen. Außenstehende sind darüber manchmal höchst verblüfft.)

Nach jeder Aktion mit  X ista  darf man die dabei jeweils entstehenden
Dateien löschen, unbedingt nötig ist das aber nicht:
ixlist :  der Registerauszug - eine Textliste des Registerinhalts
         (kann man u.U. auch mal brauchen, einfach mal kucken!)
ista.bat : die Batchdatei, die in Wirklichkeit die Arbeit macht
ista.lst : Die Ergebnisliste, die in a99 angezeigt wird.
Wenn man die Dateien nicht löscht, werden sie überschrieben bei der
nächsten Aktion mit  X ista. Nur  ista.flx  keinesfalls löschen,
es sei denn, man wird es ganz sicher nie benutzen.

*** *** *** *** *** *** *** *** *** *** *** ***

ANHANG
Für FLEXologen und andere Neugierige
------------------------------------

Wie arbeitet ista.flx - was genau tut er?
Es stehen natürlich Kommentare drin, hier aber noch einiger
Klartext zur Erläuterung:

Das Werkzeug, das hier schnell und einfach helfen kann, das ist
lange schon da! Es handelt sich um das Programm qrix. Man muß
es nur mit einem geeigneten Aufruf laufen lassen. Diesen Aufruf
bastelt ista.flx zusammen und läßt ihn ausführen, dann liedert der
die Ergebnisse. (Mehr zu qrix und seinen Optionen:  h ac7-2)

Beisp. A:
---------
Register 9 in cat.adx 
qrix -fd -ddemo2 -ecat=demo2 -w9 -x0 >ixlist

Beisp. B:
---------
Register 1 in cat.aex (ALL-Register)
Der Befehl ist derselbe, nur mit -w1, und es wird noch -Ze angegeben:

qrix -fd -ddemo2 -ecat=demo2 -w1 -x0 -Ze >ixlist

Am Ende der Datei "ixlist" stehen dann jeweils die Zahlen, die man
braucht, und zwar in dieser Form:

  Gesamtzahl Indexeintraege = 1396  [Frage 2]
  Zeilen = 913  [Frage 1.]

Diese zwei Zeilen wird der FLEX dann zeigen, sonst nichts.
Das macht er, indem er diese Zeilen extrahiert, die am Ende der
Datei ixlist stehen.
Die Ergebnisliste kann man sich aus dem Anzeigefeld kopieren,
oder die Datei ixlist für eigene Zwecke verwenden.

Aber das Allerinteressanteste:
Wenn man "Gesamtstatistik" wählt, wird der Vorgang für jedes
der Register ausgeführt, d.h. es wird die ganze Liste der I-Zeilen
abgearbeitet, die in den Indexparametern stehen, und am Ende hat
man die komplette Übersicht.

Wie lange dauert's? Klar, es hängt von der Größe der Indexdatei
ab. Lassen Sie sich überraschen. Vielleicht erst mal ausprobieren
mit der Demo-Bank? Kaputtgehen kann dabei nichts, versteht sich!

"Geht das auch, wenn zugleich andere arbeiten?" wird man jetzt
fragen: Schließlich wär's ja möglich, daß während des Vorgangs 
jemand anders was speichert und die Ergebnisse am Ende nicht 
korrekt sind. Dem ist vorgebeugt, indem im ista.flx eingebaut
wurde, daß vor dem Aufruf des ista.bat die Datenbank zum Speichern
gesperrt und danach wieder freigegeben wird: set tbl loc / fre

Tips zum guten Schluß
---------------------
Vielleicht wollen Sie gar nicht das gesamte Register 1 checken,
sondern nur den Abschnitt von a bis b? (Sicher werden Ihnen
sinnvollere andere Abschnitte einfallen.)
Dann lassen Sie zuerst mal das gesamte Reg. 1 machen und nehmen
sich dann die erste Zeile in insta.bat vor. Die lautet z.B. für
die Demo-Bank:
qrix -fd -dc:\allegro\demo2\ -ecat=c:\allegro\demo2\ -x0 -w1 1>ixlist

Hinter -w1 fügen Sie dann ein:  -sa -Sb, also:

qrix -fd -dc:\allegro\demo2\ -ecat=c:\allegro\demo2\ -x0 -w1 -sa -Sb 1>ixlist
 
Achtung, das zweite S ist ein großes. So werden Anfang und Ende des
gewünschten Abschnitts an qrix übergeben.
Dann den Befehl geben:  insta.bat
und in der Datei ixlist landet genau das, was Sie sehen wollen, und die
Zahlen dazu in  ista.lst.
Genau auf diese Weise funktioniert auch das Auswerten der virtuellen
Register, z.B. DIS. Denn diese sind ja nur ganz gewöhnliche Abschnitte,
deren Zeilen alle mit einer bestimmten Zeichenfolge anfangen, im Falle
von DIS ist es "D ", und ista.flx setzt dann ... -sD -SDzzz

Das geht auch mit einem Register in einem anderen Index der Datenbank,
also z.B. in  cat.aex. Dazu braucht man nur noch  -Ze einzufügen:

qrix -fd -dc:\allegro\demo2\ -ecat=c:\allegro\demo2\ -x0 -w1 -sa -Sb -Ze 1>ixlist

Nochmal der Hinweis: Die für qrix möglichen Optionen stehen in  h ac7-2

Und übrigens: Der FLEX-Befehl "qrix" (siehe h xqrix) ruft nicht etwa
seinerseits das Programm qrix.exe auf, sondern ist vollständig in
die Programme a99 und acon integriert. Der ista.flx ist dagegen ohne
diesen Befehl geschrieben, denn damit hätte es ein paar weniger schöne
Komplikationen gegeben, sondern es wird  qrix.exe  bemüht, was denn 
auch nebenbei viel schneller geht.






Mehr Informationen über die Mailingliste Allegro