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
f 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.