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

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.  a99a99 v36.2  --  aconac-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.