Export/Import
aresqa : allegro relational 
Sinnvolle Koexistenz
`Kurzbeschreibung mit Beispielen`
Worum geht es?
Es gibt viele Unterschiede zwischen allegro und Relationalen Datenbanksystemen (RDBS) - sonst wäre allegro überflüssig. Dazu erschien eine ausführliche, vergleichende und begründende Gegenüberstellung: 

`http://www.allegro-c.de/doku/a-r.htm`.

Weder kann allegro ungefähr dasselbe, was ein relationales System kann, noch umgekehrt. Heutige RDBS sind ohne Frage in ihrem Aufgabenbereich außerordentlich mächtige Instrumente, mit denen allegro in mancher Hinsicht überhaupt nicht konkurrieren könnte, das sollte schon deutlich ausgesprochen werden. Doch es geht nicht um Konkurrenz, denn die Aufgabengebiete sind unterschiedlich. 
Ein wichtiges Werkzeug ist das `aresqa-Listenfenster`. 
 
Stärken von allegro sind die folgenden Eigenschaften, die ein RDBS selten oder nie braucht oder auf welche die meisten RDBS-Anwendungen gut verzichten können: 
 
•	Funktionsreiche Indexdateien: Sichtbare Register zum Blättern u.a. 
•	Geschwindigkeit bei sehr großen Datenmengen auf relativ kleinen Maschinen 
•	Geringer Plattenplatzbedarf 
•	Jedes Feld darf beliebig oft mehrfach auftreten (RDBS mögen das nicht) 
•	Diffizile Feldstrukturierung mit Unterfeldern (RDBS-Datenfelder sollen "atomar" sein) 
•	Hierarchische Satzstrukturen 
•	Unterschiedliche Satztypen in derselben Datei 
•	Export-und Importsprachen von hoher Leistung und Mächtigkeit 
•	FLEX-Skriptsprache für die Programmierung interaktiver Vorgänge. FLEX ist im Gegensatz zu SQL eine prozedurale Sprache, kann also z.B. Daten satzweise verarbeiten. 

Deshalb wäre es noch immer wenig aussichtsreich, ein Bibliothekssystem mit SQL entwickeln zu wollen, um damit allegro letztlich abschaffen zu können. Das bedeutet, allegro wird schon noch eine Weile brauchbar und in einigen Projekten gar unentbehrlich bleiben. 

Warum aber, so fragt man sich immer mal wieder, könnte man nicht die Vorteile beider Welten miteinander kombinieren? 
Das fragen insbesondere solche Anwender oder Systemverwalter, die sich gut mit RDBS auskennen, aber mit allegro überhaupt nicht. Denn die ärgern sich immer wieder, wenn sie nicht "schnell mal eben", wie sie es mit SQL gewöhnt sind, eine SELECT-Auswertung und/oder ein UPDATE machen können. aresqa soll genau das möglich machen, und zwar ohne jede allegro-Kenntnis, insbes. ohne Parametrierung. 

Aber wie soll das gehen?
Es gibt ja schon einen Schritt in diese Richtung: das Menü `Tabellen erstellen!` Eine erstellte Tabelle (manche sprechen von einer CSV-Datei,  CSV= Comma Separated Values) kann man mit Word oder Excel weiterverarbeiten, aber auch in ein RDBS übernehmen. 
Den zweiten, noch größeren Schritt soll aresqa machen! So arbeitet es, und so erklärt sich auch sein Name: 

  a  	allegro-Daten ausgeben in Tabellenform, geeignet zur Übernahme durch ein 
    re 	  relationales Datenbanksystem, darin Anwendung von 
      sq 	    SQL zur beliebigen Bearbeitung der Tabelle, dann Rückgabe an 
         a        allegro : Wiedereinspeisung in die Datenbank 

Die von einer aresqa-Aktion betroffenen Sätze können auf Wunsch während der Aktion in der allegro-Datenbank alle gesperrt werden. 
Hauptinstrument, das wird hier schon klar, bleibt die allegro-Datenbank. Das RDBS wird als Bearbeitungs- und Auswertungsinstrument genutzt, nicht für permanente Datenhaltung. Eine Art Tandem-Betrieb mit verteilten Aufgaben ist hier nicht angestrebt. Aber anders als bei der bisherigen Tabellen-Methode können nun Tabellen auch vom RDBS nach allegro transportiert werden: 

Zugabe 1: Es ist auch möglich, die letzten drei Schritte ohne den ersten zu machen. Falls man in einer relationalen Datenbank einen eindeutigen Schlüssel für eine allegro-Datenbank hat, kann man derselben auch Daten zum Einmischen übergeben, die man vorher nicht als Tabelle von ihr erhalten hatte. Diese Daten können dann in vorhandene Sätze eingefügt oder als neue Sätze gespeichert werden. (Mit der IMPORT-UPDATE-Methode ging das immer schon, aber die Übergabe RDB -> allegro wird nun stark erleichtert.) 

Zugabe 2: Neue Datensätze via Tabelle erzeugen: Wenn die erste Tabellenspalte nichts als die Ziffer 0 enthält, dann wird aus der Zeile ein neuer allegro-Datensatz gemacht, in welchem die Tabellenspalten gemäß der .STR-Datei in Datenfelder verwandelt werden. 

Zugabe 3: Die Tabellenerzeugung ist abgestimmt mit der bisherigen Methode "Tabellen erstellen". Eine für aresqa erstellte Strukturdatei (s.u.) kann in eine Parameterdatei umgewandelt werden, mit der man in der schon bekannten Weise Tabellen für Office-Programme u.ä. erzeugen kann. (Die Unterschiede liegen nur in der Überschriftszeile und der optional möglichen Vorsortierung der Tabelle [bisherige Methode] sowie der Satznummern oder Primärschlüssel in der ersten Tabellenspalte [aresqa].) 

Hinweis: Die dem RDBS oder einer Tabelle übergebenen Daten stellen nie den gesamten Umfang einer Datenbank dar, sondern immer eine Auswahl bestimmter Felder oder Unterfelder aus einer Ergebnismenge oder auch aus der Gesamtbank. (Das ist schon deshalb klar, weil man mit SQL gar nicht den gesamten Datenbestand modellieren kann.) Denn die Aufgaben, die man evtl. mit SQL lösen will, beziehen sich vermutlich nie auf die kompletten Sätze und alle Satztypen mit allen Bestandteilen, sondern eben auf bestimmte Felder. Vorzugsweise werden dies Felder sein, in denen Zahlen, Geldbeträge, Datumsangaben, Codes, Adressen oder sonstige simple Zeichenfolgen stehen, denn damit können RDBS ganz exzellent jonglieren. Die "Zielgruppe" sind also nicht Katalogdaten (bibliographische Daten) im engeren Sinne, sondern in erster Linie Geschäftsgangsdaten. 

Vermutung: In den meisten Fällen wird man wohl im RDBS nur "schnell mal eben" die übergebene Tabelle in irgendeiner Weise bearbeiten und nach Rückgabe wieder löschen - also gar keine eigentliche Datenbankarbeit veranstalten. Dazu reicht auch die Verwendung eines Tabellen-Editors, der CSV-Dateien einlesen und ausgeben kann.

Voraussetzung für ein Zusammenspiel zwischen RDBS und allegro mit aresqa ist ein vorhandenes RDBS oder wenigstens ein Tabelleneditor. Mit dem weit verbreiteten MySQL kann man diese Voraussetzung in weniger als einer Stunde auf einem normalen PC kostenlos und bequem herstellen, falls Interesse besteht. (Notwendig für allegro ist es ansonsten nicht.) 
Man braucht: 

MySQL Server : `www.mysql.de`  "Downloads", oder von Firma MySQL AB: 
	`dev.mysql.com/tech-resources/articles/4.1/installer.html`
	oder das Rundum-Paket XAMPP, in dem Apache und MySQL enthalten sind: 
	`www.apachefriends.org`

Client : Konsolprogramm mysql.exe (im Serverpaket enthalten)  
	oder  SQLyog (empfohlen) 	`www.webyog.com`  
	oder  MySQL-Front:  	`www.mysqlfront.de/download.html`

Ist nur MySQL verwendbar - was ist mit anderen Systemen? MySQL ist kostenlos und deshalb überall einsetzbar, das ist besonders für viele allegro-Anwender ein entscheidender Punkt. Es hat zudem einen Leistungsstand erreicht, mit dem es für die hier interessierenden Aufgabenbereiche hinter keinem anderen System zurücksteht. Gleichwohl, wer aresqa mit einer anderen Engine einsetzen will, etwa Oracle oder DB2, könnte dies tun, denn die Kommunikation zwischen allegro und RDBS erfolgt über standardmäßige SQL-Skripte bzw. CSV-Dateien, wie sie jedes RDBS verarbeiten kann. 

Dateien, die aresqa braucht 

Strukturdatei 	q-xyz.str   	Struktur der Tabelle (welche Felder...) 
FLEXe		aresqa1.flx  	erstellt ein SQL-Skript und eine Tabelle, s.u. 
          	aresqa2.flx  	liest die Tabelle (nach Bearbeitung) wieder ein 
Skript   	q-xyz.sql   	Skript für MySQL zur Übernahme der Tabelle 
Tabelle 	q-xyz.tab   	Die Tabelle selbst, die vom SQL-Skript geladen wird 

Die Namen der Dateien (nicht der FLEXe) beginnen also mit  q- . So kann man sie leicht erkennen. 
Der Nutzer hat nur die Strukturdatei anzulegen, was einfach ist und von a99 unterstützt wird. 
So sieht die übergebene Tabelle q-xyz.tab aus: 

inn1[tab]feld1[tab]feld2[tab]...[tab]feldN
inn2[tab]feld1[tab]... 
... 

wobei nn1, nn2... die internen Satznummern sind, ODER geeignete eindeutige Schlüssel: dann steht nicht ein i am Zeilenanfang, sondern ein | und die Registernummer. 

Die wichtigste Komponente ist die Strukturdatei. Sie ist denkbar einfach konstruiert. So sieht eine Strukturdatei für 4 Felder aus: 

#kk1     Name des Feldes #kk1 
&kk2     Name des Feldes #kk2 
#kk3$s   Name des Teilfelds $s von #kk3 
#kk4$t   Name des Teilfelds $t von #kk4 

Das Feld #kk2 soll dem RDBS übergeben werden, also in der Tabelle auftauchen, bei der Rückgabe an allegro aber nicht mit übernommen werden. Deshalb beginnt die Zeile mit & statt #. 
$s und $t sind Teilfeldcodes. Der Inhalt von feld1 wird also aus #kk1 entnommen, feld2 aus #kk2, feld3 aus dem Teilfeld s von #kk3, Feld 4 aus dem Teilfeld t von #kk4 ... 

Die Strukturdatei wird zuerst gebraucht, um die Tabellendatei zu erstellen, aber dann auch hinterher, wenn die Tabelle zurückgeholt werden soll, um die Spalten dann wieder den Feldnummern und Teilfeldern zuzuordnen (denn in der Tabelle selbst stehen ja diese Angaben nicht drin).  

Vorgang 

FLEX aresqa1.flx erstellt eine Tabelle mit Hilfe der Strukturdatei q-xyz.str : 

  Ergebnismenge bilden 
     aresqa1.flx ausführen: q-xyz.tab und q-xyz.sql entstehen 
         MySQL Client aktivieren 
            Skript q-xyz.sql starten (q-xyz.tab wird geladen, darin steckt die Ergebnismenge als Tabelle) 
            Aktionen mit SQL... 
         q-xyz.tab wieder ausgeben 
     aresqa2.flx ausführen: q-xyz.tab wieder einlesen (mit Hilfe von q-xyz.str) 
  Ergebnismenge ist verändert 

Übrigens, wie oben schon angedeutet: aresqa2.flx kann auch eine Tabelle einlesen, die vorher nicht mit aresqa1 erstellt wurde, sondern die man mit anderen Mitteln selber produziert hat, die aber in Form, Feldfolge und -inhalten der Strukturdatei zu entsprechen hat. 

Mehr zu den Dateien 
Nun die genauere Beschreibung der Strukturdatei, der Tabelle und des sql-Skripts:

q-xyz.str   (Strukturdatei)
   Das ist die Liste der Felder (Nummer und Name), aus denen die Tabelle zu bilden ist. Die erste Tabellenspalte darf nur ein eindeutiger Schlüssel sein. Im einfachsten Fall ist es automatisch die interne Satznummer, mit dem Buchstaben  i  davor. 
Man kann aber einen anderen Schlüssel verlangen, indem man die .STR-Datei mit einem p-Befehl beginnt (kleines p!): 
   pX = eindeutiger Schlüssel (Erzeugung bei Sprungmarke X in den Indexparametern), 
	Sonderfall p@ : Primärschlüssel 
     Weitere Zeilen beginnen mit # oder & 
  #FeldNr1     Feldname1 
  #FeldNr2$x   Feldname2 
  ... 
  &FeldNrn(mb) Feldnamen   Feldn nur in MySQL anzeigen, bei Rückführung ignorieren 
  #FeldNrN     FeldnameN 

Die Feldname-Angaben bilden dann die Spaltennamen der MySQL-Tabelle. Vor Feldnamen (n=1...N) hat jeweils mindestens ein Leerzeichen zu stehen, kein TAB-Zeichen. 
Die erste Spalte aber ist etwas besonderes: sie enthält im Normalfall (ohne p-Befehl) die interne Satznummer, mit Buchstabe i davor. 
Alternativ ist die erste Spalte ein eindeutiger Schlüssel, der durch den p-Befehl deklariert wird. 
Folgen kann eine Zeile, die mit |r xy beginnt. Sie besagt: die erste Spalte ist ein Schlüssel, der im Register r steht und dort das Präfix xy hat. Beim Zurücklesen der Tabelle wird dann jeweils der Inhalt der ersten Spalte genommen, mit xy vorn ergänzt und im Register r gesucht, um den zugehörigen Satz zu finden. 
Jede Zeile, die mit # beginnt oder mit &, entspricht einer Tabellenspalte. 
Zeilen, die mit & statt # beginnen, erzeugen (in aresqa1.flx) eine Tabellenspalte in genau derselben Weise wie die #-Zeilen, aber diese Tabellenspalten werden bei Rückführung der Tabelle (in aresqa2.flx) nicht übernommen. Sie dienen nur dazu, die Tabelle dem menschlichen Bearbeiter im RDBS leichter verständlich zu machen. Z.B. kann ein Name darin stehen, der als solcher nicht verändert werden soll. Manipulationsbefehle (mb) sind nur bei solchen Feldern anwendbar. D.h. die übergebenen und zur Bearbeitung vorgesehenen Feld- und Teilfeldinhalte müssen vollständige, unveränderte Inhalte sein. 

Wenn UTF-8 zum Einsatz kommen soll: Als Hilfe zur Umcodierung nach UTF-8 wird die Parameterdatei p-unicod.apr gebraucht. Diese kann unverändert für andere Konfigurationen benutzt werden. (Kopie machen: p-unicod.bpr, wenn eine B.CFG im Einsatz ist.) 

Hinweis zum p-Befehl: 
Wenn man mit dem p-Befehl einen anderen eindeutigen Schlüssel wählt (der auch bei jedem Satz auftritt), darf bei der Sprungmarke X  kein #u1 vorkommen, m.a.W. dort darf nur mit echten Kategorienummern gearbeitet werden. 

q-xyz.tab   [Codierung in dieser Datei normalerweise ANSI, wahlweise UTF-8] 
   Diese Datei wird von aresqa1.flx automatisch erstellt. 
   Die erste Spalte enthält einen eindeutigen Schlüssel der allegro-Datenbank: 
   iInterneNummer 
     ODER   Schluessel    eindeutiger Schlüssel, dessen Präfix im |-Befehl der Strukturdatei steht 
     ODER   |rSchluessel    r=1...9,:,;  eindeutiger Schlüssel im Reg. r 
   Inhalt von #feld1 
   Inhalt von Teilfeld $x aus #feld2 
   Inhalt von ... #feldN 
Diese Inhalte bilden pro Satz jeweils nur eine Zeile, die Datenfelder sind durch TAB (ASCII-Code 09) getrennt. Das ist die allgemein übliche Struktur einer CSV-Datei, aber eben nicht mit Komma, sondern TAB als Trennung. 

q-xyz.sql
   Auch dieses Skript wird von aresqa1.flx automatisch erstellt. Es enthält die für MySQL nötigen Befehle, um die Datenbank und deren Tabelle anzulegen (beide heißen immer "aresqa") und sodann das Laden der q-xyz.tab zu veranlassen. So sieht das Skript aus: 

/* 
  Skript zum Erstellen und Einlesen einer aresqa-Tabelle 
  2004-11-13 

Ausführen: 
  C:\Programme\MySQL\MySQLServer4.1\bin>mysql <skriptdatei 
  danach ist die Datenbank aresqa vorhanden, sie hat nur 
  1 Tabelle, und die heisst "aresqa". Wenn sie schon existierte, 
  wird sie gelöscht. 
*/ 

CREATE DATABASE IF NOT EXISTS `aresqa`; 

USE `aresqa`; 

DROP TABLE IF EXISTS `aresqa`; 

/* Die Tabellendefinition muss jeweils erstellt werden. */ 
/* Die Feldauswahl ergibt sich aus aresqa1.flx und Strukturdatei */ 

CREATE TABLE `aresqa` ( 
   `Id` varchar(25) NOT NULL, 
   `ISBN` varchar(255) default NULL, 
   `Signatur` varchar(255) default NULL, 
   `jahr` varchar(255) default NULL,                                                                                                                                                                                                                                           
   `verlag` varchar(255) default NULL, 
   PRIMARY KEY  (`Id`) 
 ) ; 

/* Die Datei aresqa.tab wird auch von aresqa1.flx erstellt, 
  darin stehen die Datenzeilen, ANSI- oder UTF-8 codiert mit TAB als Trenner. 
*/ 

LOAD DATA CONCURRENT LOCAL 
 INFILE "c:/allegro/q-xyz.tab" 
 INTO TABLE aresqa 
 FIELDS TERMINATED BY '\t' 
 LINES TERMINATED BY "\r\n" 
 ; 

/* Die Rückgabe erfolgt dann später mit: */ 
use aresqa 
SELECT * from aresqa INTO OUTFILE "c:/allegro/q-xyz.tab" 
Statt c:\allegro hat hier das Arbeitsverzeichnis des Nutzers zu stehen, auf dem a99 läuft. 

Tip:
Diese zwei Befehle kann man auch in eine Datei out.sql schreiben und dann mit dem Aufruf 
mysql <out.sql 
von der Konsole aus starten. 
Mit dem Clientprogramm SQLyog macht man es so: 
SQLyog starten, Server localhost anwählen, dann 
Menü Tools / Import from SQL Dump 
und dann im Feld "File to execute" die entstandene *.sql  angeben. Mit F9 die neu entstandene Datenbank namens "aresqa" links im "object browser" sichtbar. Anwählen, darin die Tabelle namens "aresqa" anwählen, und rechts im unteren Bereich mit "Table Data" die Daten sichtbar machen. 
Daten in der Tabelle editieren: F11. 
Für weitere Möglichkeiten konsultiere man die 

Arbeitsweise in a99
Man startet auf dem Export-Komfortmenü die Funktion: "Tabellen erstellen". 
Dort gibt es ab V25 die Wahl zwischen "Office" und "SQL" - einfach anklicken. 
Dann die Funktion wählen: "Neue Tabellenstruktur einrichten" 
Im Anzeigefeld erscheint eine kurze Erklärung, wie man eine Strukturdatei einzugeben hat. Man gibt die nötigen Zeilen ein, dann Alt+9. Damit startet aresqa1.flx, speichert die Strukturdatei und produziert die Tabellendatei zur aktuellen Ergebnismenge bzw. zur Gesamtbank. 
Nach dem Bearbeiten dieser Tabelle im RDBS holt man sie zurück mit dem Aufruf von aresqa2.flx. Dafür gibt es den Menüpunkt "Tabellendatei einlesen". Erwartet wird dann in der Nutzervariablen #uqQ  der Name der Struktur, die Tabellendatei hat auf dem Arbeitsverzeichnis des Anwenders zu liegen,  Strukturdatei und Tabelle müssen sich selbstverständlich entsprechen. 

Hilfsfunktion: Listen-Viewer und -Editor
Mit der FLEX-Funktion `aresqa` kann man fast alle Textdateien betrachten und bearbeiten, auch Tabellendateien.  
Schnell ausprobieren?  Geben Sie im Schreibfeld mal ein d ein, mehr nicht. 

Beschreibung der Funktionen 
Die Cursor-Tasten funktionieren, wie man es erwartet. Mit Tab-Taste springt man zwischen der Liste und dem Eingabefeld "Find" hin und her.  Die Größe des Fensters kann man frei variieren. 

Im Feld "Find" kann man eingeben: 

-- eine #Zeilennummer, um zu der betreffenden Zeile zu springen 
     (wenn es eine größere Liste ist), also z.B. #1001 für Zeile 1001. 
Oder  (das kennt man vom ViewListen- und Kurzlistenfenster) 
-- ein Suchwort (beliebige Zeichenkombination) wobei Groß-Kleinschreibung gleich 
     wertig ist, auch Umlaute können als solche oder aufgelöst eingegeben werden. 
     Mit [+] und [-] springt man zum nächsten / vorigen Vorkommnis des Suchworts. 
     Sonderfälle: 
	Setzt man ^ vor das Suchwort, wird nur am Zeilenanfang gesucht. 
	Wenn eine Kategorienummer zu suchen ist: \ vor das # setzen
     Suchen und Ersetzen:  (!) 
	Mit _abc_xyz_ bzw. ,abc,xyz, wird die Zeichenkette abc durch xyz ersetzt. 

Mit [Code] wird die Anzeige zwischen ASCII (DOS) und ANSI (Windows) umgeschaltet. 
Wenn die Umlaute falsch erscheinen, drücken Sie auf diesen Knopf. (Nicht immer kann das Programm korrekt erkennen, welche Codierung die Datei hat.) 

[Enter]-Taste zeigt die ausgewählte Zeile in einem Eingabefeld, wo man sie ändern kann. 

[Einfg]-Taste ermöglicht das Eingeben einer neuen Zeile. Sie wird VOR die 
   momentan markierte Zeile eingefügt. 

[Entf]-Taste löscht die markierte Zeile. 

[Add] Ermöglicht die Eingabe neuer Zeilen, die ans Ende gehängt werden. Man gelangt in 
   eine Eingabeschleife, damit man bequem mehrere Zeilen hintereinander eingeben kann, 
   bis man das Eingabefeld mit [Esc]-Taste schließt. 

[Copy] Kopiert die markierte Zeile in das Eingabefeld. Der bearbeitete Text wird dann als 
    neue Zeile unter der markierten Zeile eingefügt. 

[Undo] Macht die letzte Editier-Aktion rückgängig. 

[Redo] Umgekehrt. Beides geht mehrfach hintereinander. Die Markierung springt jeweils auf 
   diejenige Zeile, wo die Änderung sich ausgewirkt hat. Diese Funktionen arbeiten zeilen- 
   bezogen, nicht zeichenweise. Ist man am Anfangs- bzw. Endpunkt der aufgezeichneten 
   Aktionen angekommen, wird der Undo- bzw. Redo-Button grau, damit man sieht: mehr 
   geht nicht. 

Mit Maus kann man eine einzelne Zeile verschieben. Sie wird dann vor diejenige 
Zeile geschoben, auf der man die linke Maustaste freigibt. 
Anm.: Ein Markieren und Kopieren oder Löschen mehrerer Zeilen auf einmal ist nicht vorgesehen. 
Denn dies würde die Funktionen [Undo] und [Redo] sehr erschweren. 

[Save] schreibt, ohne das Fenster zu schließen, die Tabelle in die Datei  aresqa.lst. 
Was damit geschieht, wenn man das Fenster schließt, ist Sache des FLEXes, in den 
der aresqa-Aufruf eingebaut ist. Nach erfolgter Speicherung wird der Button inaktiv 
(grau), aber die nächste Änderung aktiviert ihn wieder. 
Beispiele: onerror.flx, aq.flx 
In welchem Code gespeichert wird, sieht man in dem Feld unter dem Save-Button. 
Mit dem Button x daneben kann man den Speichercode umschalten. So ist es ganz 
einfach, eine ASCII-Datei in ANSI zu wandeln und umgekehrt. 

Mit Taste # erhält man die vollständige Anzeige der ausgewählten Zeile. Nützlich, wenn diese sehr lang ist. Mit Taste [Enter] sieht man auch die ganze Zeile, aber zum Bearbeiten. 

Das Statusfeld (über [Code]) zeigt zwei Zahlen: die Nummer der markierten Zeile und die Gesamtzahl der Zeilen. 
Bei Bearbeitungen ändern sich diese Zahlen entsprechend. 

Hinweis zu alcarta: Darin (und auch in a99, wenn die Berechtigung unter 5 liegt) fehlen die Buttons unter dem Statusfeld, also alle Bearbeitungsfunktionen. In a99 kann man zusätzlich das Bearbeiten ganz verhindern, wenn man die Funktion mit dem FLEX-Befehl Aresqa statt aresqa aufruft. 

[OK] und [Esc] schließen das Fenster. In beiden Fällen wird, wenn Änderungen noch nicht gespeichert sind, zur Entscheidung aufgefordert. Die Originaldatei wird nicht überschrieben, siehe [Save], es entsteht nur die Datei aresqa.lst. 
Der Unterschied ist nur: bei OK steht anschließend die zuletzt markierte Zeile in der "internen Variablen" (iV) und kann dann im FLEX ausgewertet werden, nach Esc dagegen ist die iV leer. 

Sonderfunktionen bei ViewListen
Hat man eine Datei vom Typ .vw vor sich, dann gilt: 
1. Zeilen, die mit h beginnen, bewirken sofortige Anzeige des Hilfetextes 
2. Zeilen, die mit inummer oder nummer beginnen, bewirken direkte Anzeige des zugehörigen 
    Satzes. 
3. Beim Speichern werden die Zeilen auf gleiche Länge gebracht, damit die Datei dann sofort 
    die korrekte Struktur hat. Dazu wird die längste Zeile ermittelt und die anderen auf diese 
    Länge aufgefüllt. 
Die Punkte 1 und 2 entsprechen dem, was man von den ViewListen kennt. Hier jedoch sind die vor dem | stehenden Befehle bzw. Nummern auch zu sehen. So kann man schon beim Bearbeiten einer ViewListe sehen, ob sie funktioniert. 

?http://www.allegro-c.de/doku/a-r.htm=x jan http://www.allegro-c.de/doku/a-r.htm 
?Tabellen erstellen!=h table 
?www.mysql.de=x jan http://www.mysql.de 
?www.webyog.com=x jan http://www.webyog.com 
?dev.mysql.com/tech-resources/articles/4.1/installer.html=x jan http://dev.mysql.com/tech-resources/articles/4.1/installer.html 
?www.mysqlfront.de/download.html=x jan http://www.mysqlfront.de/download.html 
?aresqa=h xaresqa 
?Kurzbeschreibung mit Beispielen=h aq 
?aresqa-Listenfenster=h =Hilfsfunktion