cstring   (Abkürzung von "code string")    avanti 

Die Befehle  variable  und  write   werden dadurch zu äußerst mächtigen Instrumenten. Nur diese beiden Befehle können von cstrings Gebrauch machen!

Ein cstring  ist eine Folge von Code-Elementen, beliebig zusammengesetzt, wobei die Elemente aus sechs Typen bestehen, getrennt durch Leerzeichen: 

 

1.            "xyz"  Zeichenfolgen, in "..."  oder '...' oder |...| eingeschlossene druckbare Zeichen.

                Achtung: jeden \ in der Zeichenfolge verdoppeln

2.             d d d      ASCII-Codes als Dezimalzahlen (z.B.  13 10 für einen Zeilenvorschub oder 27  für den Escape-Code) 

3.            #nnn     Feldinhalt   (nnn kann auch eine #u- oder  Sonderkategorie  sein: Handb.10.2.6.2) 

                #nn.     Erstes Datenfeld, das mit #nn anfängt    

                #n..     Erstes Datenfeld, das mit #n anfängt    

                #nn:     Letztes Datenfeld, das mit #nn anfängt    

                #n::     Letztes Datenfeld, das mit #n anfängt    

                _nnn     Feldtext von #nnn incl. der Nummer  nnn   (ohne das # am Anfang) 

                #nnn$a Unterfeld a von #nnn (nur der Inhalt des Unterfeldes wird ausgegeben)  Auch #nn.$a und #n..$a möglich

                                               Sonderfall: Wenn von  #nnn  der Anfangsteil VOR dem ersten Unterfeld gebraucht wird:  #nnn$$

4.             $name   Freie Variable   (beliebig benannte Variablen für beliebige Inhalte.

                                               Dazu -->  Extra-Beschreibung ) 

5.             x             Interne Sondervariablen   (meist nur einzelne Buchstaben; mehr dazu  weiter unten ) 

                                               Diese Variablen beziehen sich alle auf momentane Eigenschaften/Einstellungen des Systems

6.             (...)          Geklammerter Ausdruck mit Manipulationsbefehlen, siehe B. unten

 

Bei den  Sonderkategorien  sind nur die für a99/avanti wirklich sinnvollen verwendbar:  #dt, #dts, #fna, #mv, #nr, #op, #uxa, #uxb

 

Es gibt für  3.  noch Möglichkeiten der Verfeinerung, wenn nicht der gesamte Feldtext gebraucht wird: 

(Zum Ausprobieren und Lernen dieser Befehle (A. und B.)  gibt es eine  Beispielsammlung .)

 

A.  An die Feldnummer anhängen kann man einen Ausdruck (i,j) , mit i>=0 und  j>=0.  

Dann wird vom Feld- bzw. Unterfeldtext nur der Teil ab Position i genommen (Zählung beginnt bei 0) und zwar j Zeichen (wenn  j=0, dann der gesamte Rest - (0,0) wäre also alles). 

Ist i größer als die Länge des Datenfelds, kommt nichts heraus. 

i kann negativ sein, dann werden die letzten i Zeichen genommen, bevor j ausgewertet wird.

Ist j größer als die Länge des Restes, wird nach rechts mit Leerzeichen aufgefüllt.

j kann negativ sein, dann wird eine entspr. Anzahl Zeichen vom Ende her als Ergebnis genommen

Beispiel:  var #76(0,-4) liefert die letzten 4 Zeichen von #76.,

                         dasselbe tun var #76(-4,4) und  var #76(-4,0) .

Wenn vor der Zahl j noch ein  r  steht (dann j aber nicht negativ!), wird statt dessen links aufgefüllt, der Text also rechtsbündig auf die Länge j abgesetzt (so kann man Ausgabefelder mit fester Länge erzeugen) .

Beispiel: var #76(0,r6) : Erscheinungsjahr links auf 6 Zeichen auffüllen.

Noch besser: mit  (rN,x)  kann man den iV-Text in einem N Zeichen kangen Feld nach rechts rücken und links, falls da noch Platz ist, mit dem Zeichen x auffüllen.

Sonderfall: Wenn i der Buchstabe 'i' ist statt einer Zahl, wird der Feldinhalt ab der Indikatorposition genommen. Das ist die Position hinter dem Mehrfachcode. Beim Standardschema macht das keinen Unterschied, bei MARC jedoch gibt es vor dem Textbeginn noch 2 Indikatoren. Siehe dazu die Beschreibung im Anhang A des Handbuchs. Wenn man also schreibt:

var #nnn(i,1) , dann ergibt sich genau der Indikator des Feldes #nnn. 

 

B.  Die zweite Möglichkeit: man hängt noch einen geklammerten Ausdruck direkt an #nnn hinten dran (geht aber nicht bei $-Variablen) in einer der folgenden Formen:  

      (b"xyz")  vom Feldtext nur den Teil hinter dem ersten "xyz" nehmen

                                         (B"xyz")   dasselbe, aber wenn "xyz" gar nicht vorkommt, dann den unveränderten Text

                                         (e"xyz")   Nur den Teil vor "xyz" nehmen (wenn "xyz" nicht vorkommt, unverändert)

                                         (E"xyz")   Nur den Teil bis incl. "xyz" nehmen (wenn "xyz" nicht vorkommt, unverändert). "xyz" bleibt stehen

                                         (t"xyz")   Am Ende den mit dem letzten vorkommenden "xyz" beginnenden Teil beseitigen

(T"xyz")    Den Teil nehmen, der hinter dem letzten vorkommenden "xyz" steht (leer, wenn "xyz" nicht vorkommt)

                                         (f"xyz")   Vorne jedes einzelne der Zeichen xyz  entfernen, auch wenn es mehrfach vorkommt

                (F"xyz")   die entsprechende Aktion am Ende des Textes

                         (u) / (U)        beseitigt die mit Nichtsortierzeichen markierten Teile im iV-Inhalt; U: ersten Buchstaben groß machen

                (u[])        beseitigt Einschlüsse in eckigen Klammern  [u gibt es ab V29.7)

                Speziell, falls iV-Inhalt  XML ist:  (Mehr in  Vb.212 )

                         (x'tag att="abc"')  iV-Inhalt nach <tag> mit Attribut att="abc" absuchen und den Inhalt nehmen 

                (X"tag")   dasselbe, aber  <tag... stehenlassen, jedoch </tag> am Ende wegnehmen

Statt "..." kann man '...' verwenden (wichtig, wenn z.B. innerhalb  xyz  ein " vorkommt).  Aber eins von beiden, nichts anderes!

Der Ausdruck wirkt nur auf den Inhalt des betr. Datenfeldes, an den er angehängt ist.

Achtung: Steht vor dem Klammerausdruck ein Leerzeichen, wirkt er auf den momentanen Inhalt der gesamten  iV, siehe oben 6.   (Das geht dann auch bei $-Variablen, das direkte Anhängen eines Ausdrucks aber nicht.)

Bei  e, B und b  kann xyz auch von der Form [abc] sein, um zu erreichen, daß beim ersten Auftreten eines der Zeichen  a, b oder c die Zeichenfolge abgebrochen wird (Fall e) bzw. der Rest hinter dem Zeichen genommen wird (Fall b und B).

Ausnahmen: Statt (b"<") muß man (b"[<]") schreiben, entspr. für die Zeichen  >, # und ~.

Mit ? kann man einzelne Zeichen maskieren, d.h. (e"?A") setzt das Ende vor   xA  mit bel. x. (Für  f  und  F  macht das keinen Sinn.)

Mit  ^X  (2 Zeichen) innerhalb  xyz  kann man nach Steuerzeichen suchen:

         ^I  z.B. steht für den Code 9, den TAB-Code, ^J für 10 usw.

Wenn in  xyz  das Zeichen ^ selbst gemeint ist, muß man  ^~  dafür setzen.

Wenn xyz mit ~ beginnt, wird ohne Unterscheidung von groß/klein gesucht (ab V28.3).

Auch in  xyz  muß jeder \ verdoppelt werden.

Außer f und F: Statt  xyz  kann auch eine #u-Variable oder Kategorienummer stehen: (b"#uab"), da.nn wird deren Inhalt statt xyz genommen. Mit (b"~#uab") passiert dasselbe, aber ohne Unterscheidung  von groß/klein (ab V28.3).

 

C.  Mehrere Ausdrücke der Art A und B können aufeinander folgen, dann alles zusammen in (...) eingeschlossen (also nicht mehrere Klammernpaare!), getrennt durch optionale Leerzeichen. 

Beispiel: (b"abc" e"def" 0,15) : Hinter abc beginnen, vor def enden, dann davon 15 Zeichen.

Außer bei f und F kann statt xyz auch eine #u-Variable stehen, z.B.  b"#uab"

Wenn in der iV Steuerzeichen vorkommen (Codes unterhalb 32), muß man sie in xyz in der Form ^A für Code 1 usw. angeben. Das Zeichen ^ selbst muß als ^~ angegeben werden.

Sonderfall: Wenn man schreibt  var (...), also ohne Kategorienummer, dann werden die Befehle in (...) auf den momentanen Inhalt der iV angewendet, egal wie er vorher entstanden war, z.B. durch einen Befehl  var Fdateiname  .

Hinweis: Die  Exportsprache  ist vergleichsweise mit ihren  Manipulationsbefehlen  noch etwas mächtiger. 

 

 

Zu 5.      Außerdem  kann man eine Anzahl Interner Sondervariablen in den Ausgabetext einbauen. Das sind die Buchstaben der nachfolgenden Liste, es wird dann jeweils der entsprechende Text statt des Buchstabens automatisch eingesetzt:    

                avanti: nur die sinnvollen Variablen sind nutzbar,  die nicht verfügbaren sind mit  xx  markiert. 

                Die ersten neun entsprechen gleichnamigen Aufruf-Optionen der DOS-Programme. 

Testen:  Starten Sie den FLEX   cstring.flx  

 

Hier die Liste der internen Sondervariablen (s.o. Punkt 4). Es handelt sich um Einstellungen oder Eigenschaften des momentanen Zustands, in dem sich das System befindet. Alle diese Werte kann  man im FLEX auswerten. Das geht immer nach dem Schema dieses Beispiels (außer bei den  J-Werten):

var L

if ="GER" jump deutsch

                Wenn die Arbeitssprache Deutsch ist, dann springe zur Marke :deutsch.

 

Die ersten 10 Sondervariablen entsprechen gleichnamigen Aufruf-Optionen der DOS-Programme (s.  Kap.12  des Handbuchs). 

Die in grün angegebenen Namen bezeichnen dasselbe Element in der INI-Datei, diese Namen können gleichwertig verwendet werden, also z.B. InputFileNr statt N.

 

A xx       Access-Modus der aktuellen Sitzung (Berechtigungsstufe aus INI-Datei)      access

B             Name der Datenbank      DbName

D             Datenbank-Pfadname (mit \ am Ende)    DbDir

E             Name der aktuellen Exportdatei      OutputFile

K             Name der Konfigurationsdatei      Konfiguration

K1          nur der erste Buchstabe davon 

L             Sprachbezeichnung d. Arbeitssprache (INI-Befehl  Language=...) 

N             Nummer der Datei für neue Sätze      InputFileNr

P             Name des Programmverzeichnisses (mit \ am Ende)      ProgDir

Y xx       Pfad der IndexDatei (InxName in INI, falls anders als D, sonst leer) (DOS-Option -y) 

 

Die anderen Variablen in alphabetischer Folge:

Achtung: Die mit xx gekennzeichneten Variablen gibt es in avanti  NICHT!

 

C xx       Copy-Verzeichnis (für Sicherungskopie, siehe _BACKUP.FLX /_RESTORE.FLX) ohne \ am Ende 

Err          Fehlermeldungstext. Entsteht z.B., wenn bei export p ... die Datei nicht existiert.

                avanti : interne Nummer des letzten Fehlers

F             File : hinter F folgt direkt ein Dateiname, und zwar der Name einer lokalen Datei oder eine URL in der Form http://... oder file:///...; der Inhalt dieser Datei (!!) wird in die Ausgabe eingefügt; folgt kein Dateiname, wird Inhalt der iV als Name genommen. Dabei bleiben auch Steuerzeichen erhalten. Für Intenet-Dateien empfiehlt sich allerdings, diese zuerst mittels   get I url   in die iV zu holen und in einer $-Variablen zwischenzuspeichern, weil es dabei bessere Fehlerkontrollen gibt.

                Hinweis: mit  fetch anz  kann man aus einer geöffneten Datei anz Zeichen in die iV einlesen.

G             Name der LOG-Datei (LogName-Befehl in INI, DOS-Option -L ) 

H            Liste der Register-Überschriften (Headlines, |-Zeilen in Indexparametern) 

I              Indexliste : die Liste der symbolischen Registernamen (I-Befehle der Indexparameter)

                    Trennzeichen bei I und R ist der Code 20 ( ¶ ),  Ersetzung bei z.B. Bedarf mit  ins _^T_^M^J_ 

Die mit J beginnenden Sondercodes fallen aus dem Rahmen: sie verändern den iV-Inhalt als Ganzes

J             Feldname laut CFG zu der Feldnummer, die gerade in der iV steht.

                Beispiel: var "#20" J : dann steht in der iV: "Titel"

Jd          Der momentane Inhalt der iV wird in dezimale Codes umgewandelt: aus "abc" wird "97 98 99"

Jl          Länge der iV, d.h. der momentane Inhalt der iV wird durch dessen Länge ersetzt!

JLx        Inhalt der iV nach Links bzw. Rechts durch das Zeichen x auf soviel Stellen auffüllen, wie es der interne Zähler angibt.

JRx        Also z.B. vorher geben:  z=8   für 8 Stellen. Oder:  z=6\var #nr JL0  bedeutet: #nr 6stellig mit führenden Nullen geben.

 

Kk          Werte t und k aus der CFG, mit / dazwischen. Normalfall: 2/4

M xx      Inhalt der Environment-Variable TEMP (dort besteht Schreibrecht!)      ( TempDir )

                bzw. der Inhalt des INI-Befehls DbAux, wenn dieser gesetzt wurde. 

O xx       Name der Offline-Datei 

Q xx       Fokusziffer: (Fokus setzen mit Befehl activate i ) 

                1 : Auswahlliste 

                2 : Schreibfeld 

                3 : Befehlszeile 

                4 : Anzeigefeld 

Qa xx     Was steht momentan in der Auswahlliste? 

                1 : Aktueller Satz

                2 : Hintergrundspeicher (#u-Variablen)

                3 : Ergebnismengenliste

                4 : Abfrageliste aus CFG

                0 : CFG-Liste der Kategorien 

R             Restriktionen : Liste der Namen der Restriktionen (R-Befehle)  

                               Trennzeichen bei I und R ist der Code 20 ( ¶ ) 

S             Short-title Überschrift (aus Zeile |<="..." der Indexparameter) 

T             Titel der Datenbank (aus Zeile |a="..." der Indexparameter) 

                  bzw., wenn gesetzt, die Zeile DbTitle aus der INI-Datei 

U xx       Name der aktuellen Erg.Menge 

Uv xx     Name der zuletzt benutzten ViewListe 

V xx       Name der INI-Datei (Vorgaben), mit der gestartet wurde 

V14        Werte i5 und i6 der Indexparameter, falls V14-Verknüpfungen vorhanden, z.B. _9

W xx      Arbeitsverzeichnis (Working directory) (OHNE \ am Ende)       DbAux

X xx       Name der letzten Hilfedatei 

Z             Wert der internen Zahlenvariablen   iZ   

Zk           dasselbe, gerundet auf k Stellen nach dem Komma (k=0...9) 

 

a xx        Name der aktuellen Anzeigeparameter (DOS: Option -p )       DisplayParameter

b xx        Breite der Kategorienummern, Textanfang. Bei A.CFG:  2,4 

 

ci            ( i =1...499) Zeile i der UIF-Datei. Nummern 70-89 sind frei für Anwender 

ca           momentaner Inhalt/Umfang des Arbeitsspeichers, in Bytes  // momentane Anz.Felder,Max.Zahl    [ CFG: mK ]

cl             Befehlszeile (command line): Was beim Aufruf des Programms hinter dem Programmnamen angegeben wurde

cp           momentaner Inhalt/Umfang des Phrasenspeichers, in Bytes // momentane Zahl, Max.1200  [ CFG: mP ]

cr            momentaner Inhalt/Umfang des Reservespeichers, in Bytes // momentane Anz.Felder,Max.Zahl    [ CFG: mB ]

cn           Feldnummer für Neuerfassungsdatum  (CFG cn ) , ohne #, also z.B.  99n

ce            ... für letztes Änderungsdatum  (CFG ce )

ci             ... für die IdNr  (CFG cg )

cg            Form der IdNr (CFG ci )

cf            Anzahl der Füllzeichen in einem Neusatz (CFG:  f )

d xx        Name der aktuellen Druckparam (DOS: Option -q )       PrintParameter

e              Name der aktuellen Exportparam (DOS: Option -e )       ExportParameter

xx       find Befehl (Name) der letzten ErgMenge 

g xx        Zeile im Index, die zuletzt benutzt wurde 

h             headline des Registers, dessen Nummer in der iZ steht (vorher z.B. mit var "1"\= hineinschreiben) 

i             interne Nr. des Datensatzes 

iR          interne Nr. des mit  fetch rec  aus ALD-Datei eingelesenen Datensatzes   (nur avanti)

ixk-j Satznummern k-j der aktuellen Erg.Menge, getrennt durch das Zeichen x. Ohne k-j: alle Satznummern.

                Sonderfall  x=n :  jede Nummer auf neuer Zeile.   [Hinw.: Zählung beginnt mit 1]

j xx         Nummer der .cLD-Datei des Satzes 

jb xx      Länge des Datensatzes in Byte (aktuelle Länge im Arbeitsspeicher) 

jf xx       ... in der Datei (wird schon beim Einlesen des Satzes festgestellt) 

jp xx      Position des Satzes in der Datei ("offset" vom Dateianfang, beginnt mit 0) 

k0           Anzahl der Kategorien (Felder) des aktuellen Satzes 

k1  k_1 Erstes Feld des Satzes (incl. Kategorienummer), k_1: dasselbe ohne # am Anfang 

k2  k_2 Nächstes Feld (leer, wenn das letzte erreicht war) 

k3  k_3 Letztes Feld  

k4  k_4 Voriges Feld (leer, wenn das erste erreicht war) 

kn           Gesamter Datensatz, Felder mit # beginnend, Code 10 als Feldende

kr            ... desgleichen, aber 13 10 statt nur 10

l               Größe ("length") der ErgMenge 

m            Name des Programms und Nummer der Version (z.B. a99 v26.2, av-x v25.9) 

n             neue Zeile, gleichwertig: 13 10 

o xx        Anzahl der Offline-Sätze 

p             Primärschlüssel des aktuellen Satzes  (Sprungmarke #-@ bzw. die mit  set pX  gesetzte)

pid          Process Identifier (Nummer des laufenden a99 als Prozeß)

q xx        Nummer der aktuellen ErgMenge/momentane Gesamtzahl von Erg.mengen

r              relative Nummer des Satzes in der ErgMenge 

s              Kurzzeile des aktuellen Satzes (aus der .STL-Datei)

size xx    Größe des a99-Fensters: nur 4 Zahlen, links rechts oben unten, in Pixeln. (Anwendung siehe  janas )
SIZE 
xx    Größe des gesamten Desktops:  4 Zahlen in gleicher Weise
sK           Alle Registereinträge zum aktuellen Satz, getrennt durch ==

sk              dasselbe, aber getrennt durch 13 10 (Zeilenvorschub)  [also F7 per FLEX]

st             Inhalt des Statusfeldes unten rechts, in dem die Satznummer steht

t              Gesamtzahl Sätze (total number of records) 

u             aktuelles Datum und Uhrzeit 

ue xx      Datum und Uhrzeit der letzten Änderung des aktuellen Satzes

v xx        Name der Phrasendatei

vi xx       Phrase i (i=1 - 255) (->   phrase  i text

w xx       Inhalt des Schreibfeldes 

x xx        Name des externen Editors 

y xx        Name der Indexparameter (InxParam in INI, falls anders als B) sonst wie B (Option -I) 

z              Wert des internen Zählers 

z0 xx      Anzahl Zeilen in der Anzeige (incl. aller Leerzeilen) 

z1 xx      Erste Zeile des Anzeigefeldes (als ASCII-Text, ohne RTF-Steuerzeichen!) 

z2 xx      Nächste Zeile 

z3  xx     Letzte Zeile (Leerzeilen am Ende unberücksichtigt) 

z4  xx     Vorige Zeile 

zc xx      Text der aktuellen Zeile (wo sich die Schreibmarke befindet) 

                Dann: #uzC = dieselbe Zeile, aber __ (2x Unterstrich) an der Stelle,  

                wo die Schreibmarke sich befindet 

                #uzD = Fliptext, falls Schreibmarke innerhalb eines solchen 

                #uzF = Flipbefehl (zugehörige Nutzervariable #uZi, einschl. der Nummer, also #uzF#uZi...

zn xx      Nummer der Zeile, in der sich die Schreibmarke befindet

zv xx      Nummer der ersten oben sichtbaren (visible) Zeile

 

Wenn  k2,k4,z2  oder  z4  verwendet werden, kann man anschließend mit   if no  ... checken, ob es kein Ergebnis mehr gab. 

Das ist wichtig für Schleifen. 

 

Tip: Sie können diese Variablen alle leicht ausprobieren. Geben Sie z.B. im Schreibfeld ein, um den Primärschlüssel zu sehen: 

 

x var p\mes  oder    

x var T\mes  oder   

x var "interne Nummer: " i\mes

 

Dann wird das Ergebnis des  var-Befehls in einer Message-Box angezeigt.