Interne Sondervariablen
cstring (Abkürzung von "code string") acon
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 es sechs Typen von Elementen gibt, getrennt durch Leerzeichen:
1. "xyz" Zeichenfolgen, in "..." oder '...' eingeschlossene druckbare Zeichen. Für acon geht auch |...| .
Achtung: wenn \ in der Zeichenfolge auftritt, dann 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. Achtung: Hier für 2stelliges Schema angegeben; Sonst #nnnx bzw. #nnnnx, x=Space oder Mehrfachcode
#nnx Feldinhalt (nnx 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
#nn+ Alle Datenfelder #nnx, getrennt durch Code 10 (^J). Interessant bei HFM-Feldern.
_nnx Feldtext von #nnx incl. der Nummer nnn (ohne das # am Anfang)
#nnx$a Unterfeld a von #nnn (nur der Inhalt des Unterfeldes wird ausgegeben) Auch #nn.$a und #n..$a möglich
Achtung: Kein Leerzeichen zwischen Feldnummer und $, also z.B. #90$u, nicht #90 $u
Sonderfall: Wenn von #nnn der Anfangsteil VOR dem ersten Unterfeld gebraucht wird: #nnn$$
4a. $name Freie Variable (beliebig benannte Variablen für beliebige Inhalte.
Dazu --> Extra-Beschreibung )
4b. &name Persistente Variable (beliebig benannte Variablen für beliebige Inhalte. [ab V34.1]
Dazu --> Extra-Beschreibung )
5. 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/acon 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 (m,n) , mit zwei Zahlen m>=0 und n>=0.
Dann wird vom Feld- bzw. Unterfeldtext nur der Teil ab Position m genommen (Zählung beginnt bei 0) und zwar n Zeichen (wenn n=0, dann der gesamte Rest; mit (0,0) bekäme man also alles, aber das kriegt man auch ohne diese Angabe).
Ist m größer als die Länge des Datenfelds, kommt nichts heraus.
m kann negativ sein, dann werden die letzten m Zeichen genommen, bevor n ausgewertet wird.
Ist n größer als die Länge des Restes, wird nach rechts mit Leerzeichen aufgefüllt.
n 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 n noch ein r steht (dann n aber nicht negativ!), wird statt dessen links aufgefüllt, der Text also rechtsbündig auf die Länge n 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 langen Feld nach rechts rücken und links, falls da noch Platz bleibt, mit dem Zeichen x auffüllen.
Sonderfall: Wenn man i0 schreibt statt einer Zahl m, 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(i0,1), dann ergibt sich genau der Indikator des Feldes #nnn. Will man den zweiten Indikator oder das Zeichen hinter dem ersten, dann var #nnn(i1,1).
B. Die zweite Möglichkeit: man hängt noch einen geklammerten Ausdruck direkt an #nnn hinten dran in einer der folgenden Formen: [ nur bei $- und &-Variablen ein Spatium vor (...), sonst nicht! ]
(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.
Achtung: Wenn das Feld <tag ...> mehrfach vorkommt, werden alle eingesammelt und die Inhalte mit 2x Code 20 getrennt.
Statt "..." kann man '...' verwenden (wichtig, wenn z.B. innerhalb xyz ein " vorkommt). Aber nur 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 $- und &-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 (TAB-Code), ^M^J für 13 10, ^T für 20 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 die ersten 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, siehe B. Das Zeichen ^ selbst muß als ^~ angegeben werden.
Wichtiger 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 oder var $.
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:
acon: 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 (ger oder GER), dann springe zur Marke :deutsch.
Die ersten 10 Sondervariablen entsprechen gleichnamigen Aufruf-Optionen der alten DOS-Programme (s. Kap.12 des Handbuchs).
Nicht für acon gilt:
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. Möglich ist also statt var P genausogut var ProgDir
A 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:
Nochmals Achtung: Die mit xx gekennzeichneten Variablen gibt es in acon NICHT!
$ Zweite interne Variable, auch iV2 genannt. Mit ins $ kann man sie belegen, mit var $ wieder in die normale iV holen.
C xx Copy-Verzeichnis (für Sicherungskopie, siehe _backup.flx /_restore.flx) ohne \ am Ende
Err Letzter Fehlermeldungstext. Mit if no var Err;mes;jump ... kann man eine Meldung erscheinen lassen und einen Sprung auslösen, z.B. nach einem find-Befehl: var Err\if not "" jump ...
Fname 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
Man muß sie jeweils hinten an den var-Befehl mit anhängen, nicht auf die nächste Zeile als eigenen var-Befehl!
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 Inhalt der Environment-Variable TEMP (dort besteht Schreibrecht!) ( TempDir )
bzw. der Inhalt des INI-Befehls DbAux, wenn dieser gesetzt wurde.
acon : Dateinamensmuster, z.B. demo2\cat*.ald, wenn auf c:\allegro der Befehl acon -ddemo2 -bcat gegeben 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 Ergebnismenge
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)
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 Breite der Kategorienummern,Textanfangsposition. 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
cm xx momentaner Inhalt der Suchbefehlszeile (Feld "Schnelle Suche")
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 )
cg ... für die IdNr (CFG cg )
ci 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 Ergebnismenge
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 acon)
ixk-j Satznummern k-j der aktuellen Ergebnismenge, 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 Nummer der .cLD-Datei des Satzes
jb Länge des Datensatzes in Byte (aktuelle Länge im Arbeitsspeicher)
jf ... in der Datei (wird schon beim Einlesen des Satzes festgestellt)
jc Nummer der Datendatei
jp 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 Ergebnismenge
m Name des Programms und Nummer der Version
(z.B. a99: a99 v36.2 -- acon: ac-w V35.10, ac-x v25.9)
mw xx Nummer der Windows-Version (5 = XP / 6.1 = 7 / 6.2 = 10) [ab V36.2]
n neue Zeile, gleichwertig: 13 10
o xx Anzahl der Offline-Sätze
oq xx Position des Satzes in der Offline.Datei (vgl. get q )
p Primärschlüssel des aktuellen Satzes (Sprungmarke #-@ bzw. die mit set pX gesetzte)
pid Process Identifier (Nummer des laufenden a99 als Prozeß)
pvs Name des aktuell eingestellten Persistenz-Index, default: z1 für Register 1 von cat.azx [ab V35.8]
q xx Nummer der aktuellen Ergebnismenge/momentane Gesamtzahl von Erg.mengen
r relative Nummer des Satzes in der Ergebnismenge
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]
Der Text beginnt dann mit einer Zeile (Anzahl/Gesamtlänge)
sL Status des letzten Sperrbefehls (Locking status) (ab V32.4): set lock ..., aber auch if Lock ...
st xx 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
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 bzw. den Titel der Datenbank bzw. die interne Nummer des aktuellen Satzes zu sehen:
x var p\mes bzw.
x var T\mes bzw.
x var "interne Nummer: " i\mes
Dann wird jeweils das Ergebnis des var-Befehls in einer Message-Box angezeigt.