Trick 47: Längsten/kürzesten Satz finden


Aufgabe: Schnell mal eben in einer Datenbank den längsten Satz finden!

Warum: allegro-Datenbanken haben keine festgelegte Satzlänge, jeder
Satz nimmt nur soviel Platz ein, wie er eben braucht. Grenzenlos lang
können Sätze jedoch nicht sein und auch nicht grenzenlos zahlreich die
Indexeinträge. Es ist nur nicht leicht zu sagen, wo denn die Grenzen
wirklich verlaufen.  --> Grenzen Schranken, Barrieren
   http://www.allegro-c.de/grenzen.htm

Für Testzwecke kann es also interessant sein, mal den längsten
Datensatz herauszufinden.

Das leistet der folgende FLEX:


#ulg 0
#uks 0

first #
:loop
keycheck
  Wurde [Esc] gedrückt?
  Wenn ja und Nachfrage mit ja beantwortet, dann -> :exit
if yes jump exit
var jb
if >#ulg ins #ulg;var i;ins #uil
if <#uks ins #uks;var i;ins #uik
next #
if yes jump loop
:exit
  Ende, jetzt den Satz noch zeigen
var "#" #uil
find
sho rec
disp
  und Meldung:
var  "Laengster Satz  :  " #uil ", Laenge " #ulg
var +"Kuerzester Satz :  " #uik ", Laenge " #uks
message


Er findet in der gesamten Datenbank den längsten u. kürzesten Satz und
zeigt den längsten am Ende an.
Wenn man  first #  und  next #  ersetzt durch  first  bzw.  next,
wird nur die aktuelle Egebnismenge durchgeforstet.
Der Ablauf kann mit Esc unterbrochen werden (Befehl keycheck), dann
erhält man den längsten bis dahin gefundenen Satz.

Der Trick ist nur die interne Sondervariable jb, mit der man die Länge
des jeweils aktuellen Satzes erhält. Die Zeile

if >#ulg ins #ulg;var i;ins #uil

vergleicht die so erhaltene Länge mit dem Wert in der Variablen
#ulg. Ist #ulg kleiner, wird der iV-Wert, also der nun größere,
in #ulg kopiert und die interne Satznummer (denn die wird ja am
Ende gebraucht) wird in #uil aufbewahrt. Am Ende hat man die
gewünschten Werte in diesen beiden Variablen.
Mitgeliefert wird ab V27.4 ein FLEX namens lk.flx, der die drei längsten
und kürzesten Sätze als Erg.Menge liefert.

Wo ist die Liste der internen Sondervariablen?
Hier:
http://www.allegro-c.de/flex/seite09_3.html#_Kap09_03
oder auch in  xcstring.rtf