Modul Form: Unterschied zwischen den Versionen

Aus bafbal.de
Zur Navigation springen Zur Suche springen
 
(139 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 14: Zeile 14:
 
* flt ("Filter") - Setzt das Filter-Kommando des Formulars. Dieses Kommando wird aufgerufen, wenn in einer der edt- oder chk-Komponenten eine Eingabe gemacht wird. Kann auch mit #filter ausgelöst werden.
 
* flt ("Filter") - Setzt das Filter-Kommando des Formulars. Dieses Kommando wird aufgerufen, wenn in einer der edt- oder chk-Komponenten eine Eingabe gemacht wird. Kann auch mit #filter ausgelöst werden.
 
* lhc ("LogHideCommand") - Wenn Y, dann wird der Typ C ("Command") nicht geloggt. Das kann bei Massenverarbeitung den Vorgang beschleunigen; Default N, Funktionen werden ersetzt.
 
* lhc ("LogHideCommand") - Wenn Y, dann wird der Typ C ("Command") nicht geloggt. Das kann bei Massenverarbeitung den Vorgang beschleunigen; Default N, Funktionen werden ersetzt.
 +
* ncd ("no confoirmation dialog") - Wenn Y, dann wird beim Typ console kein Bestätigungsdialog verwendet. Das kann zum Beispiel dann sinnvoll sein, wenn ohnehin zu Beginn Daten per Dialog abgefragt werden und damit ggf. die Ausführung abgebrochen werden kann. Default N, Funktionen werden ersetzt.
 
* prc ("PageRefreshCommand") - Das Kommando, mit dem die Seite aktualisiert werden kann; nur bei Typ ''page''
 
* prc ("PageRefreshCommand") - Das Kommando, mit dem die Seite aktualisiert werden kann; nur bei Typ ''page''
 
* w ("Width") - Breite der Baum-Komponente beim Typ treegrid und Höhe der Baum-Komponente bei treeovergrid
 
* w ("Width") - Breite der Baum-Komponente beim Typ treegrid und Höhe der Baum-Komponente bei treeovergrid
Zeile 34: Zeile 35:
  
 
* c ("Caption") - Text der ausgegeben wird; Funktionen werden ersetzt; default ist ''#cout, Parameter c nicht gesetzt''
 
* c ("Caption") - Text der ausgegeben wird; Funktionen werden ersetzt; default ist ''#cout, Parameter c nicht gesetzt''
 +
* cn ("Caption no double function") - beim Parameter c werden zweimal Funktionen ersetzt, das erlaubt Funktionen von Funktionen (also zum Beispiel eine Funktion, die mittels $DATA aus einer Datenbank geladen wird). Bisweilen führt dieses Verhalten zu unerwünschten Ergebnissen, siehe unten im Beispiel. Wird statt c der Parameter cn verwendet, werden Funktionen nur einmal ersetzt.
 
* clr ("Clear") - Y löscht vor der Ausgabe des Textes die Konsole; Funktionen werden ersetzt; default N
 
* clr ("Clear") - Y löscht vor der Ausgabe des Textes die Konsole; Funktionen werden ersetzt; default N
 
* cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 
* cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
* cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
+
* m ("max") - die maximale Anzahl der Zeilen; werden es mehr Zeilen, wird ab md gelöscht. Default MaxInt, Funktionen werden ersetzt
 +
* md ("max delete") - wenn wegen Überschreitung der mit m vorgegebenen Grenze Zeilen gelöscht werden, werden sie aber dieser Position gelöscht. Auf diese Weise kann erreicht werden, dass der Anfang eines Logs stehen bleibt, zum Beispiel, damit man sieht, wann die Ausführung eines Kommandos begonnen wurde. Default 0, Funktionen werden ersetzt.
 
* wts ("WithoutTimeStamp") - Wenn Y, dann wird auf die Ausgabe der Datums- und Zeitangabe sowie des Typs verzichtet; Funktionen werden ersetzt; default N
 
* wts ("WithoutTimeStamp") - Wenn Y, dann wird auf die Ausgabe der Datums- und Zeitangabe sowie des Typs verzichtet; Funktionen werden ersetzt; default N
 
* y - Typ der Ausgabe, üblicherweise ein einzelner Buchstabe (I "Info", W "Warning" E "Error"); default I
 
* y - Typ der Ausgabe, üblicherweise ein einzelner Buchstabe (I "Info", W "Warning" E "Error"); default I
Zeile 44: Zeile 47:
 
  #cout  c="Hello world"   
 
  #cout  c="Hello world"   
 
  #cout  c=" "  clr=Y  wts=Y
 
  #cout  c=" "  clr=Y  wts=Y
 +
 +
#cout c=DIR$CHR(dollar)RWC:2740_GFI_5555.pdf
 +
#cout cn=DIR$CHR(dollar)RWC:2740_GFI_5555.pdf
  
 
==#coutl==
 
==#coutl==
Zeile 96: Zeile 102:
 
  #cancel
 
  #cancel
  
=Die einfachen Komponenten=
+
=Dialoge=
 +
 
 +
==#msg / #message==
 +
 
 +
Gibt eine Meldung über ein Dialogfenster aus
 +
 
 +
'''Parameter'''
 +
 
 +
* c ("caption") - Beschriftung; Funktionen werden ersetzt
 +
* cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 +
 
 +
'''Beispiel'''
 +
 
 +
#msg c="Hello world"
 +
 
 +
==#progress_dlg==
 +
 
 +
Zeigt einen Fortschrittsdialog an, mit dem die Ausführung einer Schleife auch abgebrochen werden kann.
  
==#btn==
+
Die folgenden Prozeduren lassen sich über den Fortschrittsdialog abbrechen:
 +
* #sql_open
 +
* #loop
 +
* #csv_paste
 +
* #sepline
 +
* #text_loop
 +
* #xml_loop
 +
* #grd_loop
  
Fügt einen Button in den Button- oder den Filterbereich ein.
 
  
 
'''Parameter'''
 
'''Parameter'''
 +
* acmd ("abort command") - Kommando, das im Falle eines Abbruchs dann noch ausgeführt wird
 +
* c ("caption") - Beschriftung; Funktionen werden ersetzt
 +
* cmd ("command") - Kommando, das ausgeführt wird
 +
* cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 +
* max - Die Gesamtzahl der Schleifendurchläufe (ohne Abbruch), Bezugspunkt (100%) für den Fortschrittsbalken; Funktionen werden ersetzt
 +
* title - Titel des Dialogs, Funktionen werden ersetzt
  
* c ("caption") - Beschriftung des Buttons
+
'''Beispiel'''
* cmd ("command") - Kommando des Buttons, wenn s nicht gesetzt ist
 
* cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 
* h ("hint") - Mouse-Over-Text des Buttons
 
* p ("parent") - legt fest, in welchem Bereich der Button eingefügt wird.
 
** b - Button-Bereich
 
** f - Filter-Bereich
 
* nl ("new line") - Für den Button wird eine neue Zeile begonnen
 
* s ("select") - Kommando des Buttons
 
* se ("status enabled") - Je nach Status des Formulars ist der Button enabled oder nicht (es können mehrere Status-Buchstaben in beliebiger Reihenfolge kombiniert werden)
 
** b ("browse") - Normalzustand des Formulars
 
** c ("changed") - Nachdem Daten geändert wurden
 
** e ("editing") - Während einer Editierung
 
** f ("failed") - Die Plausibilitätsprüfung wurde nicht bestanden
 
* w ("width") - Breite des Buttons
 
* y ("type") - wenn einer der folgenden Standard-Werte verwendet wird, dann erhält der Button ein Standard-Verhalten und die Parameter c und w bleiben unberücksichtigt.
 
** back - Button mit Back-Symbol (Pfeil nach links)
 
** cancel - Button mit Cancel-Symbol (Daumen nach unten)
 
** export - Button mit Export-Symbol
 
** fwd - Button mit Forward-Symbol (Pfeil nach rechts)
 
** import - Button mit Import-Symbol
 
** pdf - Button mit PDF-Symbol
 
** save - Button mit Disketten-Symbol
 
** xls - (Schreibt den Seiteninhalt in eine Excel-Datei; noch nicht implementiert)
 
  
'''Beispiel'''
+
[[file:progress.png|Fortschrittsdiakig]]
  
#btn  y=save  s=#save  se=c
+
Ein einfaches Konsolen-Programm, das die Tabelle cache_buchungen ausliest und den Inhalt von zwei Spalten ausgibt. Zunächst wird die Gesamtzahl ermittelt, damit die nach max geschrieben werden kann. #cmd2 ist ein lokales Kommando, das im Falle des Abbruchs ausgeführt wird.
#btn  y=cancel  s=#cancel  se=cf
 
#btn  y=back  s=#tree_back  se=b
 
#btn  y=backback  s=#tree_fwd  se=b
 
#btn  y=export  s=xlookup_eximport(ex)  se=b
 
#btn  y=import  s=xlookup_eximport(im)  se=b
 
#btn  c=$T(Add_list)  w=120  s=xlookup_add(list)  se=b
 
  
==#chk==
+
In #progress_dlg werden an die Caption c einige Leerzeichen angehängt, damit der Dialog breit genug dargestellt wird.
  
Fügt eine Checkbox in den Button- oder den Filterbereich ein.
+
#frm  c="c_test"  y=console
 +
 +
#sql select count(*) as cnt from cache_buchungen
 +
#sql_openval  f_cnt=1
 +
 +
#cmd2 #coutl Vorgang abgebrochen
 +
 +
#progress_dlg  cmd=c_test_cmd  title=Fortschritt  max=$VAL(1)  acmd=2  c="Ausgeführte Datensätze:                                  "
 +
 +
#cout  c="c_test executed"
  
'''Parameter'''
+
Die Routine c_test_cmd führt die SQL-Abfrage aus und führt für jeden Datensatz das lokale Kommando #cmd aus. Dieses gibt die Daten auf der Konsole aus und erhöht den Fortschrittdialog.
  
* c ("caption") - Beschriftung der Checkbox
+
#cmd #coutl $DATA(dat,customernumber) - $DATA(dat,servicecode)
* cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
+
#cmd #progress  c="Ausgeführte Datensätze:  "
* h ("hint") - Mouse-Over-Text der Checkbox
+
* p ("parent") - legt fest, in welchem Bereich die Checkbox eingefügt wird.
+
#sql select * from cache_buchungen
** b - Button-Bereich
+
#sql_open  n=dat  er=1  m_=3
** f - Filter-Bereich
+
 
* n - Name der Checkbox, wird benötigt, um mit $EDT() auf den Check-Status zugreifen zu können
+
==#progress==
* nl ("new line") - Für die Checkbox wird eine neue Zeile begonnen
+
 
* z - Wert der Checkbox (Y oder N)
+
Erhöht den Wert des Fortschritt-Dialogs
 +
 
 +
'''Parameter'''
 +
* c ("caption") - Beschriftung; Funktionen werden ersetzt
 +
* cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  
 
'''Beispiel'''
 
'''Beispiel'''
  
==#edt==
+
siehe #progress_dlg
 +
 
 +
==$DLG_YESNO==
  
Fügt ein Edit-Feld in den Button- oder den Filterbereich ein.
+
Zeigt einen Dialog an, der mit Yes (Funktionsergebnis Y) oder No (Funktionsergebnis N) beantwortet werden kann.
  
 
'''Parameter'''
 
'''Parameter'''
 
+
# Titel des Dialogs
* cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
+
# Beschriftung des Dialogs
* h ("hint") - Mouse-Over-Text des Edit-Felds
 
* p ("parent") - legt fest, in welchem Bereich das Edit-Feld eingefügt wird; default f
 
** b - Button-Bereich
 
** f - Filter-Bereich
 
* n - Name des Edit-Feldes, wird benötigt, um mit $EDT() auf den Inhalt zugreifen zu können
 
* nl ("NewLine") - Für das Edit-Feld wird eine neue Zeile begonnen
 
* sf ("SetFocus") - Wenn Y, wird der Eingabefokus auf dieses Edit-Feld gesetzt; default N, Funktionen werden ersetzt
 
* z - Inhalt des Edit-Feldes
 
  
 
'''Beispiel'''
 
'''Beispiel'''
  
#lbl  c=$T(lookup_filter)  w=140 
 
#edt  n=edt1  w=135  h="Hier den Text eingeben, nach dem gesucht werden soll."  z=$INI(usr,edt1,xlookup)
 
  
==#lbl==
+
#cout  c="$DLG_YESNO(frei gewählter Titel,da steht ein beliebiger Text)"
 +
 
 +
=Die einfachen Komponenten=
 +
 
 +
==#btn==
  
Fügt ein Label in den Button- oder den Filterbereich ein.
+
Fügt einen Button in den Button- oder den Filterbereich ein.
  
 
'''Parameter'''
 
'''Parameter'''
  
* c ("caption") - Beschriftung des Labels
+
* c ("caption") - Beschriftung des Buttons
 +
* cmd ("command") - Kommando des Buttons, wenn s nicht gesetzt ist
 
* cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 
* cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
* h ("hint") - Mouse-Over-Text des Labels
+
* h ("hint") - Mouse-Over-Text des Buttons
* p ("parent") - legt fest, in welchem Bereich das Label eingefügt wird; default f
+
* p ("parent") - legt fest, in welchem Bereich der Button eingefügt wird.
 
** b - Button-Bereich
 
** b - Button-Bereich
 
** f - Filter-Bereich
 
** f - Filter-Bereich
* nl ("new line") - Für das Label wird eine neue Zeile begonnen
+
* nl ("new line") - Für den Button wird eine neue Zeile begonnen
 
+
* s ("select") - Kommando des Buttons
'''Beispiel'''
+
* se ("status enabled") - Je nach Status des Formulars ist der Button enabled oder nicht (es können mehrere Status-Buchstaben in beliebiger Reihenfolge kombiniert werden); Funktionen werden ersetzt
 
+
** b ("browse") - Normalzustand des Formulars
==$EDT()==
+
** c ("changed") - Nachdem Daten geändert wurden
 +
** e ("editing") - Während einer Editierung
 +
** f ("failed") - Die Plausibilitätsprüfung wurde nicht bestanden
 +
* w ("width") - Breite des Buttons
 +
* y ("type") - wenn einer der folgenden Standard-Werte verwendet wird, dann erhält der Button ein Standard-Verhalten und die Parameter c und w bleiben unberücksichtigt.
 +
** back - Button mit Back-Symbol (Pfeil nach links)
 +
** cancel - Button mit Cancel-Symbol (Daumen nach unten)
 +
** export - Button mit Export-Symbol
 +
** fwd - Button mit Forward-Symbol (Pfeil nach rechts)
 +
** import - Button mit Import-Symbol
 +
** pdf - Button mit PDF-Symbol
 +
** save - Button mit Disketten-Symbol
 +
** xls - (Schreibt den Seiteninhalt in eine Excel-Datei; noch nicht implementiert)
  
Gibt den Wert einer Edit- oder Checkbox-Komponente zurück. Eine Checkbox gibt Y oder N zurück.
+
'''Beispiel'''
  
'''Parameter'''
+
#btn  y=save  s=#save  se=c
 +
#btn  y=cancel  s=#cancel  se=cf
 +
#btn  y=back  s=#tree_back  se=b
 +
#btn  y=backback  s=#tree_fwd  se=b
 +
#btn  y=export  s=xlookup_eximport(ex)  se=b
 +
#btn  y=import  s=xlookup_eximport(im)  se=b
 +
#btn  c=$T(Add_list)  w=120  s=xlookup_add(list)  se=b
  
# Name der Edit- oder Checkbox-Komponente
+
==#chk==
  
'''Beispiele'''
+
Fügt eine Checkbox in den Button- oder den Filterbereich ein.
  
~ $LEN($EDT(edt1)) = 4
+
'''Parameter'''
#filltreesql  k_kuerzel=$EDT(edt1)
 
  
=Tree=
+
* c ("caption") - Beschriftung der Checkbox
 +
* cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 +
* h ("hint") - Mouse-Over-Text der Checkbox
 +
* p ("parent") - legt fest, in welchem Bereich die Checkbox eingefügt wird.
 +
** b - Button-Bereich
 +
** f - Filter-Bereich
 +
* n - Name der Checkbox, wird benötigt, um mit $EDT() auf den Check-Status zugreifen zu können
 +
* nl ("new line") - Für die Checkbox wird eine neue Zeile begonnen
 +
* z - Wert der Checkbox (Y oder N)
  
Der Tree ist eine Baumansicht, in welcher die einzelnen Einträge hierarchisch gegliedert werden können.
+
'''Beispiel'''
  
Die Einträge können aus Tabelleninhalten und SQL-Statements gefüllt werden, es können auch einzelne Einträge hinzugefügt werden. Der Baum muss nicht von Anfang an komplett aufgebaut werden, sondern es können Inhalte beim Öffnen eines Eintrags dynamisch nachgeladen werden.
+
==#edt==
  
Der gängigste Weg, einen Baum zu füllen, ist #tree_fillsql. Siehe Beispiel dort.
+
Fügt ein Edit-Feld in den Button- oder den Filterbereich ein.
 
 
==#tree_clear==
 
 
 
Macht den Tree leer. Wird üblicherweise eingesetzt, bevor der Baum (neu) gefüllt wird.
 
  
 
'''Parameter'''
 
'''Parameter'''
  
(keine)
+
* cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 
+
* cy ("character type") - Groß- und Kleinschreibung, default n
'''Beispiel'''
+
** l - lower case
 +
** n - normal
 +
** u - upper case
 +
* h ("hint") - Mouse-Over-Text des Edit-Felds
 +
* p ("parent") - legt fest, in welchem Bereich das Edit-Feld eingefügt wird; default f
 +
** b - Button-Bereich
 +
** f - Filter-Bereich
 +
* l ("length") - maximale Länge; default unbegrenzt, Funktionen werden ersetzt
 +
* n - Name des Edit-Feldes, wird benötigt, um mit $EDT() auf den Inhalt zugreifen zu können
 +
* nl ("NewLine") - Für das Edit-Feld wird eine neue Zeile begonnen
 +
* sf ("SetFocus") - Wenn Y, wird der Eingabefokus auf dieses Edit-Feld gesetzt; default N, Funktionen werden ersetzt
 +
* y - Typ, spezifiziert, welche Eingaben zulässig sind; default text,
 +
** int
 +
** curr, curr4
 +
** date, datemin, datesec
 +
** text
 +
* z - Inhalt des Edit-Feldes
 +
 
 +
'''Beispiel'''
  
  #tree_clear
+
  #lbl  c=$T(lookup_filter)  w=140 
 +
#edt  n=edt1  w=135  h="Hier den Text eingeben, nach dem gesucht werden soll."  z=$INI(usr,edt1,xlookup)
  
==#tree_add==
+
==#lbl==
  
Für dem Baum einen einzelnen Eintrag hinzu.
+
Fügt ein Label in den Button- oder den Filterbereich ein.
  
 
'''Parameter'''
 
'''Parameter'''
  
* c ("caption") - die Beschriftung des Eintrags
+
* c ("caption") - Beschriftung des Labels
* c1, c2 ("caption") - die Feldnamen in der Datenmenge, aus welcher die erste und zweite Beschriftung geladen werden
+
* cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
* ld1, ld2, ls1, ls2 - sind die Feldnamen in der Datenmenge Schlüsselwerte für Nachschlagelisten, so können für die Beschriftung die Klartexte genutzt werden. Dazu muss die Nachschlageliste (ld1, ld2) beziehungsweise das Special (ls1, ls2) angegeben werden.
+
* h ("hint") - Mouse-Over-Text des Labels
* k ("key") - das Schlüsselfeld für den Eintrag; wird dieser Parameter nicht gesetzt, dann wird das Schlüsselfeld aus dem Namen der Tabelle abgeleitet.
+
* p ("parent") - legt fest, in welchem Bereich das Label eingefügt wird; default f
* ne ("node expand") - der neue Eintrag soll gleich expandiert werden.
+
** b - Button-Bereich
* o ("open") - Kommando, das ausgeführt wird, wenn der Eintrag expandiert wird; üblicherweise werden dabei Bauminhalte dynamisch nachgeladen.
+
** f - Filter-Bereich
* r ("rights") - Rechtedefinition für den Eintrag
+
* nl ("new line") - Für das Label wird eine neue Zeile begonnen
* s ("select") - Kommando, das ausgeführt wird, wenn der Eintrag selektiert wird; üblicherweise wird dabei eine neue Seite geladen.
 
* si ("select item") - der neue Eintrag soll nach Abschluss des Kommandos selektiert werden
 
* sii ("select item instantly") - der neue Eintrag soll sofort und nicht erst nach Abschluss des Kommandos selektiert werden
 
* sn ("special node") - wenn Y, wird der Eintrag gekennzeichnet und kann mit u=spec referenziert werden; Funktionen werden ersetzt
 
* t ("table") - der Tabellenname der für den Eintrag maßgeblichen Tabelle
 
* u - Übergeordneter Eintrag. Unter diesem Eintrag wird der neue Eintrag eingefügt.
 
** s ("selected") - der selektierte Baum-Eintrag
 
** sp ("selected parent") - Der übergeordnete Eintrag des selektierten Eintrags
 
** spp
 
** sppp
 
** o ("opening") - der Baum-Eintrag, der gerade expandiert wird.
 
** l ("last") - der zuletzt eingefügt Baum-Eintrag
 
** lp ("last parent") - Der übergeordnete Eintrag des zuletzt eingefügten Eintrags
 
** lpp
 
** lppp
 
** r ("root") - Der übergeordnete Eintrag der obersten Ebene
 
** spec ("special") - Der Eintrag wird unter denjenigen Eintrag gehängt, der mit sn=Y als ''special node''  gekennzeichnet wurde.
 
  
 +
'''Beispiel'''
  
'''Beispiele'''
+
==$EDT()==
  
#addtree  u=root  c=$T(change_passwort)  s="#page_fill  d=xsettings_page_password"
+
Gibt den Wert einer Edit- oder Checkbox-Komponente zurück. Eine Checkbox gibt Y oder N zurück.
#addtree  u=root  c=$T(Set_language)  s="#page_fill  d=xsettings_page_language"
 
  
#addtree  u=sel  c=$T(new_list)  t=data_list    s="#page_fill  d=xlookup_page_list"  si=Y    f_category=$FND(category)
+
'''Parameter'''
  
==#tree_fill==
+
# Name der Edit- oder Checkbox-Komponente
 +
 
 +
'''Beispiele'''
 +
 
 +
~ $LEN($EDT(edt1)) = 4
 +
#filltreesql  k_kuerzel=$EDT(edt1)
 +
 
 +
=Tree=
 +
 
 +
Der Tree ist eine Baumansicht, in welcher die einzelnen Einträge hierarchisch gegliedert werden können.
  
Füllt den Baum aus den Werten einer Datenbanktabelle.  
+
Die Einträge können aus Tabelleninhalten und SQL-Statements gefüllt werden, es können auch einzelne Einträge hinzugefügt werden. Der Baum muss nicht von Anfang an komplett aufgebaut werden, sondern es können Inhalte beim Öffnen eines Eintrags dynamisch nachgeladen werden.
  
Mit Hilfe der Parameter qw und qo kann das Ergebnis gefiltert und sortiert werden, es ist aber stets nur eine Ebene im Baum. Sollen mehrere Ebenen im Baum gefüllt werden, so ist die Prozedur #tree_fillsql das Mittel der Wahl.
+
Der gängigste Weg, einen Baum zu füllen, ist #tree_fillsql. Siehe Beispiel dort.
  
Üblicherweise wird das SQL-Statement aus den Parameters t, qw und qo zusammengesetzt. Dabei sind die Parameter qw und qo optional. Fehlen Sie, lautet das SQL-Statement SELECT * FROM tabllenname.
+
==#tree_clear==
  
Alternativ kann auch mit #sql das Statement vorgegeben werden (zum Beispiel, wenn ein JOIN gebraucht wird). Dann werden die Parameter qw und qo nicht berücksichtigt.
+
Macht den Tree leer. Wird üblicherweise eingesetzt, bevor der Baum (neu) gefüllt wird.
  
 
'''Parameter'''
 
'''Parameter'''
  
* c ("caption") - die Beschriftung des Eintrags
+
* cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
* c1, c2 ("caption") - die Feldnamen in der Datenmenge, aus welcher die erste und zweite Beschriftung geladen werden
+
 
* db ("DataBase") - Name der Datenbank, default ist die Default-Datenbank
+
'''Beispiel'''
* fi ("first item") - Wenn Y, wird nach dem Füllen des Baums der erste Eintrag selektiert. Default N, Funktionen werden ersetzt.
+
 
 +
#tree_clear
 +
 
 +
==#tree_add==
 +
 
 +
Für dem Baum einen einzelnen Eintrag hinzu.
 +
 
 +
'''Parameter'''
 +
 
 +
* c ("caption") - die Beschriftung des Eintrags
 +
* c1, c2 ("caption") - die Feldnamen in der Datenmenge, aus welcher die erste und zweite Beschriftung geladen werden
 +
* cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 
* ld1, ld2, ls1, ls2 - sind die Feldnamen in der Datenmenge Schlüsselwerte für Nachschlagelisten, so können für die Beschriftung die Klartexte genutzt werden. Dazu muss die Nachschlageliste (ld1, ld2) beziehungsweise das Special (ls1, ls2) angegeben werden.
 
* ld1, ld2, ls1, ls2 - sind die Feldnamen in der Datenmenge Schlüsselwerte für Nachschlagelisten, so können für die Beschriftung die Klartexte genutzt werden. Dazu muss die Nachschlageliste (ld1, ld2) beziehungsweise das Special (ls1, ls2) angegeben werden.
 
* k ("key") - das Schlüsselfeld für den Eintrag; wird dieser Parameter nicht gesetzt, dann wird das Schlüsselfeld aus dem Namen der Tabelle abgeleitet.
 
* k ("key") - das Schlüsselfeld für den Eintrag; wird dieser Parameter nicht gesetzt, dann wird das Schlüsselfeld aus dem Namen der Tabelle abgeleitet.
* m ("max") - Maximale Anzahl der Baumeinträge, die erstellt werden
 
 
* ne ("node expand") - der neue Eintrag soll gleich expandiert werden.
 
* ne ("node expand") - der neue Eintrag soll gleich expandiert werden.
 
* o ("open") - Kommando, das ausgeführt wird, wenn der Eintrag expandiert wird; üblicherweise werden dabei Bauminhalte dynamisch nachgeladen.
 
* o ("open") - Kommando, das ausgeführt wird, wenn der Eintrag expandiert wird; üblicherweise werden dabei Bauminhalte dynamisch nachgeladen.
* qw ("query where") - WHERE-Klausel für das zu erstellende SQL-Statement
 
* qo ("query order") - ORDER-Klausel für das zu erstellende SQL-Statement
 
 
* r ("rights") - Rechtedefinition für den Eintrag
 
* r ("rights") - Rechtedefinition für den Eintrag
 
* s ("select") - Kommando, das ausgeführt wird, wenn der Eintrag selektiert wird; üblicherweise wird dabei eine neue Seite geladen.
 
* s ("select") - Kommando, das ausgeführt wird, wenn der Eintrag selektiert wird; üblicherweise wird dabei eine neue Seite geladen.
Zeile 308: Zeile 364:
 
** spec ("special") - Der Eintrag wird unter denjenigen Eintrag gehängt, der mit sn=Y als ''special node''  gekennzeichnet wurde.
 
** spec ("special") - Der Eintrag wird unter denjenigen Eintrag gehängt, der mit sn=Y als ''special node''  gekennzeichnet wurde.
  
'''Beispiel'''
 
  
  #filltree u=exp   t=test_test   c1=zahl  c2=test_1
+
'''Beispiele'''
 +
 
 +
  #addtree  u=root  c=$T(change_passwort)  s="#page_fill  d=xsettings_page_password"
 +
  #addtree  u=root   c=$T(Set_language)   s="#page_fill  d=xsettings_page_language"
  
==#tree_node==
+
#addtree  u=sel  c=$T(new_list)  t=data_list    s="#page_fill  d=xlookup_page_list"  si=Y    f_category=$FND(category)
  
Die Prozedur #tree_node legt für #tree_fillsql und #tree_fillpath eine Ebenen-Definition an.
+
==#tree_fill==
  
'''Parameter'''
+
Füllt den Baum aus den Werten einer Datenbanktabelle.
  
* c ("caption") - die Beschriftung des Eintrags
+
Mit Hilfe der Parameter qw und qo kann das Ergebnis gefiltert und sortiert werden, es ist aber stets nur eine Ebene im Baum. Sollen mehrere Ebenen im Baum gefüllt werden, so ist die Prozedur #tree_fillsql das Mittel der Wahl.
* c1, c2 ("caption") - die Feldnamen in der Datenmenge, aus welcher die erste und zweite Beschriftung geladen werden
+
 
 +
Üblicherweise wird das SQL-Statement aus den Parameters t, qw und qo zusammengesetzt. Dabei sind die Parameter qw und qo optional. Fehlen Sie, lautet das SQL-Statement SELECT * FROM tabllenname.
 +
 
 +
Alternativ kann auch mit #sql das Statement vorgegeben werden (zum Beispiel, wenn ein JOIN gebraucht wird). Dann werden die Parameter qw und qo nicht berücksichtigt.
 +
 
 +
'''Parameter'''
 +
 
 +
* c ("caption") - die Beschriftung des Eintrags
 +
* c1, c2 ("caption") - die Feldnamen in der Datenmenge, aus welcher die erste und zweite Beschriftung geladen werden
 +
* cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 +
* db ("DataBase") - Name der Datenbank, default ist die Default-Datenbank
 +
* fi ("first item") - Wenn Y, wird nach dem Füllen des Baums der erste Eintrag selektiert. Default N, Funktionen werden ersetzt.
 
* ld1, ld2, ls1, ls2 - sind die Feldnamen in der Datenmenge Schlüsselwerte für Nachschlagelisten, so können für die Beschriftung die Klartexte genutzt werden. Dazu muss die Nachschlageliste (ld1, ld2) beziehungsweise das Special (ls1, ls2) angegeben werden.
 
* ld1, ld2, ls1, ls2 - sind die Feldnamen in der Datenmenge Schlüsselwerte für Nachschlagelisten, so können für die Beschriftung die Klartexte genutzt werden. Dazu muss die Nachschlageliste (ld1, ld2) beziehungsweise das Special (ls1, ls2) angegeben werden.
* k ("key") - das Schlüsselfeld für den Eintrag; wird dieser Parameter nicht gesetzt, dann wird das Schlüsselfeld aus dem Namen der Tabelle abgeleitet; Funktionen werden ersetzt
+
* k ("key") - das Schlüsselfeld für den Eintrag; wird dieser Parameter nicht gesetzt, dann wird das Schlüsselfeld aus dem Namen der Tabelle abgeleitet.
* nc ("node clear") - Werden Einträge auf mehreren Ebenen angelegt, dann müssen meist bei einem Wechsel auf der übergeordneten Ebene die Werte der Ebenen darunter gelöscht werden. Mit nc=Y passiert eben dies.
+
* m ("max") - Maximale Anzahl der Baumeinträge, die erstellt werden
 
* ne ("node expand") - der neue Eintrag soll gleich expandiert werden.
 
* ne ("node expand") - der neue Eintrag soll gleich expandiert werden.
 
* o ("open") - Kommando, das ausgeführt wird, wenn der Eintrag expandiert wird; üblicherweise werden dabei Bauminhalte dynamisch nachgeladen.
 
* o ("open") - Kommando, das ausgeführt wird, wenn der Eintrag expandiert wird; üblicherweise werden dabei Bauminhalte dynamisch nachgeladen.
 +
* qw ("query where") - WHERE-Klausel für das zu erstellende SQL-Statement
 +
* qo ("query order") - ORDER-Klausel für das zu erstellende SQL-Statement
 
* r ("rights") - Rechtedefinition für den Eintrag
 
* r ("rights") - Rechtedefinition für den Eintrag
 
* s ("select") - Kommando, das ausgeführt wird, wenn der Eintrag selektiert wird; üblicherweise wird dabei eine neue Seite geladen.
 
* s ("select") - Kommando, das ausgeführt wird, wenn der Eintrag selektiert wird; üblicherweise wird dabei eine neue Seite geladen.
 +
* si ("select item") - der neue Eintrag soll nach Abschluss des Kommandos selektiert werden
 +
* sii ("select item instantly") - der neue Eintrag soll sofort und nicht erst nach Abschluss des Kommandos selektiert werden
 
* sn ("special node") - wenn Y, wird der Eintrag gekennzeichnet und kann mit u=spec referenziert werden; Funktionen werden ersetzt
 
* sn ("special node") - wenn Y, wird der Eintrag gekennzeichnet und kann mit u=spec referenziert werden; Funktionen werden ersetzt
* t ("table") - der Tabellenname der für den Eintrag maßgeblichen Tabelle; Funktionen werden ersetzt
+
* t ("table") - der Tabellenname der für den Eintrag maßgeblichen Tabelle
 
* u - Übergeordneter Eintrag. Unter diesem Eintrag wird der neue Eintrag eingefügt.
 
* u - Übergeordneter Eintrag. Unter diesem Eintrag wird der neue Eintrag eingefügt.
 
** s ("selected") - der selektierte Baum-Eintrag
 
** s ("selected") - der selektierte Baum-Eintrag
Zeile 342: Zeile 415:
 
** spec ("special") - Der Eintrag wird unter denjenigen Eintrag gehängt, der mit sn=Y als ''special node''  gekennzeichnet wurde.
 
** spec ("special") - Der Eintrag wird unter denjenigen Eintrag gehängt, der mit sn=Y als ''special node''  gekennzeichnet wurde.
  
'''Beispiele'''
+
'''Beispiel'''
  
Siehe #tree_fillsql
+
#filltree  u=exp  t=test_test  c1=zahl  c2=test_1
  
==#tree_fillsql==
+
==#tree_node==
  
Füllt den Baum aus den Werten eines SQL-Statements. Es können dabei Einträge auf mehreren Ebenen angelegt werden. Die einzelnen Ebenen sind mit #tree_node zu definieren.
+
Die Prozedur #tree_node legt für #tree_fillsql und #tree_fillpath eine Ebenen-Definition an.
  
 
'''Parameter'''
 
'''Parameter'''
  
* db ("DataBase") - Name der Datenbank, default ist die Default-Datenbank
+
* c ("caption") - die Beschriftung des Eintrags
* fi ("first item") - Wenn Y, wird der erste hinzugefügte Eintrag anschließend selektiert. Default ist N, Funktionen werden ersetzt.
+
* c1, c2 ("caption") - die Feldnamen in der Datenmenge, aus welcher die erste und zweite Beschriftung geladen werden
* k ("key") - Die Parameter im SQL-Statement beginnen nach den Konventionen mit :k. Da keine weitere Parameter mit k beginnen, werden so Namenskonflikte vermieden. Siehe auch das zweite Beispiel.
+
* cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
* m ("max") - Maximale Anzahl von Datensätzen in der Ergebnismenge, aus denen Baumeinträge erstellt werden
+
* ld1, ld2, ls1, ls2 - sind die Feldnamen in der Datenmenge Schlüsselwerte für Nachschlagelisten, so können für die Beschriftung die Klartexte genutzt werden. Dazu muss die Nachschlageliste (ld1, ld2) beziehungsweise das Special (ls1, ls2) angegeben werden.
* mex ("max expand") - Wenn die Zahl der hinzugefügten Einträge der obersten Ebene unter dieser Zahl liegt, dann werden die Einträge expandiert. Default 0.
+
* k ("key") - das Schlüsselfeld für den Eintrag; wird dieser Parameter nicht gesetzt, dann wird das Schlüsselfeld aus dem Namen der Tabelle abgeleitet; Funktionen werden ersetzt
* q ("Quelle") - Quelle der Daten; default ist sql. (Relevant, wenn weitere Datenquellen hinzugefügt werden.)
+
* nc ("node clear") - Werden Einträge auf mehreren Ebenen angelegt, dann müssen meist bei einem Wechsel auf der übergeordneten Ebene die Werte der Ebenen darunter gelöscht werden. Mit nc=Y passiert eben dies.
** sql - Das mit #sql erstellte SQL-Statement.
+
* ne ("node expand") - der neue Eintrag soll gleich expandiert werden.
* r ("rights") - damit der Einträge dem Baum hinzu gefügt werden, muss zumindest das Leserecht vorliegen. Default sind die Rechte des Formulars.
+
* o ("open") - Kommando, das ausgeführt wird, wenn der Eintrag expandiert wird; üblicherweise werden dabei Bauminhalte dynamisch nachgeladen.
* t ("table") - Name der Tabelle. Wird benötigt, wenn Werte in den Baum zurück geschrieben werden sollen.
+
* r ("rights") - Rechtedefinition für den Eintrag
 
+
* s ("select") - Kommando, das ausgeführt wird, wenn der Eintrag selektiert wird; üblicherweise wird dabei eine neue Seite geladen.
'''Beispiele'''
+
* sn ("special node") - wenn Y, wird der Eintrag gekennzeichnet und kann mit u=spec referenziert werden; Funktionen werden ersetzt
 +
* t ("table") - der Tabellenname der für den Eintrag maßgeblichen Tabelle; Funktionen werden ersetzt
 +
* u - Übergeordneter Eintrag. Unter diesem Eintrag wird der neue Eintrag eingefügt.
 +
** s ("selected") - der selektierte Baum-Eintrag
 +
** sp ("selected parent") - Der übergeordnete Eintrag des selektierten Eintrags
 +
** spp
 +
** sppp
 +
** o ("opening") - der Baum-Eintrag, der gerade expandiert wird.
 +
** l ("last") - der zuletzt eingefügt Baum-Eintrag
 +
** lp ("last parent") - Der übergeordnete Eintrag des zuletzt eingefügten Eintrags
 +
** lpp
 +
** lppp
 +
** r ("root") - Der übergeordnete Eintrag der obersten Ebene
 +
** spec ("special") - Der Eintrag wird unter denjenigen Eintrag gehängt, der mit sn=Y als ''special node'' gekennzeichnet wurde.
  
#sql select *    from data_special      order by category, name;
+
'''Beispiele'''
#defnode  u=root    k=category  c1=category  nc=Y  s="#fillgrid  d=xspecial_page_category"
 
#defnode  u=last    t=data_special    c1=name    s="#fillgrid  d=xspecial_page_list" 
 
#filltreesql  mex=3
 
  
#sql select l.*    from data_list l 
+
Siehe #tree_fillsql
#sql    left outer join data_list_item i          on l.data_list_id = i.data_list_id
 
#sql    left outer join translate_list_item t    on i.data_list_item_id = t.data_list_item_id
 
#sql  where upper(l.name) like upper(:kedt)
 
#sql    or upper(i.value) like upper(:kedt)
 
#sql    or upper(t.value) like upper(:kedt)
 
#sql  order by l.name;
 
#defnode  u=root    t=data_list    c1=name    s="#fillgrid  d=xlookup_page_list"  o=xlookup_open(list)
 
#filltreesql  kedt=$EDT(edt1)%  mex=3
 
  
==#tree_fillpath==
+
==#tree_fillsql==
  
Füllt den Baum aus der Pfad-Spalte eines SQL-Statements. Die Ebene ist mit #tree_node zu definieren.
+
Füllt den Baum aus den Werten eines SQL-Statements. Es können dabei Einträge auf mehreren Ebenen angelegt werden. Die einzelnen Ebenen sind mit #tree_node zu definieren.
  
Das SQL-Statement kann mit #sql definiert werden, aber auch mit t, qw und qo zusammengesetzt werden. Das SQL-Statement muss nach dem Pfad sortiert sein.
+
'''Parameter'''
 
 
'''Parameter'''
 
  
 +
* cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 
* db ("DataBase") - Name der Datenbank, default ist die Default-Datenbank
 
* db ("DataBase") - Name der Datenbank, default ist die Default-Datenbank
 
* fi ("first item") - Wenn Y, wird der erste hinzugefügte Eintrag anschließend selektiert. Default ist N, Funktionen werden ersetzt.
 
* fi ("first item") - Wenn Y, wird der erste hinzugefügte Eintrag anschließend selektiert. Default ist N, Funktionen werden ersetzt.
Zeile 392: Zeile 466:
 
* m ("max") - Maximale Anzahl von Datensätzen in der Ergebnismenge, aus denen Baumeinträge erstellt werden
 
* m ("max") - Maximale Anzahl von Datensätzen in der Ergebnismenge, aus denen Baumeinträge erstellt werden
 
* mex ("max expand") - Wenn die Zahl der hinzugefügten Einträge der obersten Ebene unter dieser Zahl liegt, dann werden die Einträge expandiert. Default 0.
 
* mex ("max expand") - Wenn die Zahl der hinzugefügten Einträge der obersten Ebene unter dieser Zahl liegt, dann werden die Einträge expandiert. Default 0.
* pfx ("prefix") - Dem eigentlichen Pfad vorangehende Zeichenfolge.
+
* q ("Quelle") - Quelle der Daten; default ist sql. (Relevant, wenn weitere Datenquellen hinzugefügt werden.)
* pn ("path name") - Name der Pfad-Spalte in der SQL-Abfrage
+
** sql - Das mit #sql erstellte SQL-Statement.
* qo ("query order") - ORDER-Klausel für das zu erstellende SQL-Statement
 
* qw ("query where") - WHERE-Klausel für das zu erstellende SQL-Statement
 
 
* r ("rights") - damit der Einträge dem Baum hinzu gefügt werden, muss zumindest das Leserecht vorliegen. Default sind die Rechte des Formulars.
 
* r ("rights") - damit der Einträge dem Baum hinzu gefügt werden, muss zumindest das Leserecht vorliegen. Default sind die Rechte des Formulars.
* t ("table") - der Tabellenname der für den Eintrag maßgeblichen Tabelle
+
* t ("table") - Name der Tabelle. Wird benötigt, wenn Werte in den Baum zurück geschrieben werden sollen.
  
 
'''Beispiele'''
 
'''Beispiele'''
  
  #sql select g.* from user_group g where g.type = 'G' order by path
+
  #sql select *   from data_special      order by category, name;
  #tree_node  u=exp    t=user_group    c1=path     s="#fillgrid  d=xuser_page_group"
+
  #tree_node  u=root    k=category  c1=category  nc=Y  s="#fillgrid d=xspecial_page_category"
  #tree_fillpath  t=user_group   pn=path
+
  #tree_node  u=last    t=data_special    c1=name     s="#fillgrid  d=xspecial_page_list"
 +
  #tree_fillsql   mex=3
  
==#tree_sel==
+
#sql select l.*    from data_list l 
 +
#sql    left outer join data_list_item i          on l.data_list_id = i.data_list_id
 +
#sql    left outer join translate_list_item t    on i.data_list_item_id = t.data_list_item_id
 +
#sql  where upper(l.name) like upper(:kedt)
 +
#sql    or upper(i.value) like upper(:kedt)
 +
#sql    or upper(t.value) like upper(:kedt)
 +
#sql  order by l.name;
 +
#tree_node  u=root    t=data_list    c1=name    s="#fillgrid  d=xlookup_page_list"  o=xlookup_open(list)
 +
#tree_fillsql  kedt=$EDT(edt1)%  mex=3
  
Selektiert einen Eintrag.
+
==#tree_fillpath==
  
Bei den Typen rf, sf, rfa und sfa wird im Baum nach einem bestimmten Wert (oder zwei bestimmten Werten) durchsucht. An jedem Eintrag hängt eine Ini-Datei, in der verschiedene Werte gespeichert sind. Es wird dann der erste Eintrag selektiert, in dessen Ini-Feld f der Wert z steht. Die Groß- und Kleinschreibung wird dabei ignoriert.
+
Füllt den Baum aus der Pfad-Spalte eines SQL-Statements. Die Ebene ist mit #tree_node zu definieren.
  
Neben f und z können auch noch f2 und z2 gesetzt werden. Bei rf und sf sind diese beiden Suchkriterien (f/z und f2/z2) oder-verknüpft. Die Typen rf und sf werden auch bei nur einem Suchkriterium verwendet, da bei einer oder-Verknüpfung das Ergebnis und damit die Existenz eines zweiten Suchkriteriums egal ist. Mit rfa und sfa werden die Suchkriterien und-verknüpft.
+
Das SQL-Statement kann mit #sql definiert werden, aber auch mit t, qw und qo zusammengesetzt werden. Das SQL-Statement muss nach dem Pfad sortiert sein.
  
 
'''Parameter'''
 
'''Parameter'''
  
* cnd ("condition") - nur wenn true, wir die Anweisung ausgeführt. Default true, Funktionen werden ersetzt.
+
* cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
* f, f2 ("field") - der erste und zweite Feldname (nur für die Typen rf, sf, rfa und sfa)
+
* db ("DataBase") - Name der Datenbank, default ist die Default-Datenbank
* o ("open") - expandiert den nach der Selektierung selektierten Eintrag
+
* fi ("first item") - Wenn Y, wird der erste hinzugefügte Eintrag anschließend selektiert. Default ist N, Funktionen werden ersetzt.
* y - Typ der Prozedur
+
* k ("key") - Die Parameter im SQL-Statement beginnen nach den Konventionen mit :k. Da keine weitere Parameter mit k beginnen, werden so Namenskonflikte vermieden. Siehe auch das zweite Beispiel.
** c ("child") - geht zum ersten untergeordneten Eintrag
+
* m ("max") - Maximale Anzahl von Datensätzen in der Ergebnismenge, aus denen Baumeinträge erstellt werden
** cc ("childchild") - geht zum ersten untergeordneten Eintrag des ersten untergeordneten Eintrags
+
* mex ("max expand") - Wenn die Zahl der hinzugefügten Einträge der obersten Ebene unter dieser Zahl liegt, dann werden die Einträge expandiert. Default 0.
** ccc - geht in der Hierarchie drei Stufen nach unten
+
* pfx ("prefix") - Dem eigentlichen Pfad vorangehende Zeichenfolge.
** cccc - geht in der Hierarchie vier Stufen nach unten
+
* pn ("path name") - Name der Pfad-Spalte in der SQL-Abfrage
** ccccc - geht in der Hierarchie fünf Stufen nach unten
+
* qo ("query order") - ORDER-Klausel für das zu erstellende SQL-Statement
** p ("parent") - geht zum direkt übergeordneten Eintrag
+
* qw ("query where") - WHERE-Klausel für das zu erstellende SQL-Statement
** pp ("parentparent") - geht zum übergeordneten Eintrag des übergeordneten Eintrags
+
* r ("rights") - damit der Einträge dem Baum hinzu gefügt werden, muss zumindest das Leserecht vorliegen. Default sind die Rechte des Formulars.
** ppp - geht in der Hierarchie drei Stufen nach oben
+
* t ("table") - der Tabellenname der für den Eintrag maßgeblichen Tabelle
** pppp - geht in der Hierarchie vier Stufen nach oben
 
** ppppp - geht in der Hierarchie fünf Stufen nach oben
 
** rf ("rootfind") - Sucht im kompletten Baum, die Suchkriterien sind oder-verknüpft
 
** rfa ("rootfindand") - Sucht im kompletten Baum, die Suchkriterien sind und-verknüpft
 
** sf ("selectedfind") - Sucht unterhalb des selektierten Eintrags, die Suchkriterien sind oder-verknüpft
 
** sfa ("selectedfindand") - Sucht unterhalb des selektierten Eintrags, die Suchkriterien sind und-verknüpft
 
* z, z2 - der erste und zweite Wert (nur für die Typen rf, sf, rfa und sfa)
 
  
 +
'''Beispiele'''
  
'''Beispiel'''
+
#sql select g.* from user_group g  where g.type = 'G' order by path
 +
#tree_node  u=exp    t=user_group    c1=path    s="#fillgrid  d=xuser_page_group"
 +
#tree_fillpath  t=user_group  pn=path
  
#btn  c=test  w=120  s="#tree_sel  y=sf  f=data_list_id  z=7B0EC22C-8526-4FDB-8D10-0187ECF793C0  sic=Y"  se=b
+
==#tree_fillthread==
  
#cmdclear
+
Ergänzt den Baum durch Daten aus einem Thread. Wird üblicherweise dazu verwendet, Daten aus einer anderen Datenbank zu ergänzen.
#cmd #tree_sel  y=c  o=Y
 
#cmd #tree_sel  y=c
 
#segbuttons 
 
#segbutton  c=Test  w=150  cmd=1
 
 
 
Im zweiten Beispiel soll in der Hierarchie zwei Stufen nach unten gegangen werden. Eigentlich würde das mit dem Typ cc gehen. Allerdings wird die unterste Ebene hier dynamisch nachgeladen, so dass eine Suche mit dem Typ cc ins Leere laufen würde. Die Lösung ist, zunächst mit dem Typ c eine Stufe nach unten zu gehen, dabei mit o=Y den Node zu expandieren und dabei dynamisch nachzuladen und dann mit dem Typ c eine weitere Stufe nach unten zu gehen.
 
 
 
==#tree_back==
 
 
 
Geht in die Baum-Historie einen Schritt zurück, also zum davor selektierten Eintrag.
 
  
 
'''Parameter'''
 
'''Parameter'''
  
(keine)
+
* cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 
+
* db ("DataBase") - Name der Datenbank, default ist die Default-Datenbank
 +
* k ("key") - Parameter im SQL-Statement; in der Ini des Baums (Sektion DATA) muss es einen Eintrag mit diesem Feldnamen geben.
 +
* u - Der übergeordnete Knoten, unterhalb dessen der Thread den Baum ergänzt; default r, Funktionen werden ersetzt
 +
** s ("selected") - der selektierte Baum-Eintrag
 +
** sp ("selected parent") - Der übergeordnete Eintrag des selektierten Eintrags
 +
** spp
 +
** sppp
 +
** o ("opening") - der Baum-Eintrag, der gerade expandiert wird.
 +
** l ("last") - der zuletzt eingefügt Baum-Eintrag
 +
** lp ("last parent") - Der übergeordnete Eintrag des zuletzt eingefügten Eintrags
 +
** lpp
 +
** lppp
 +
** r ("root") - Der übergeordnete Eintrag der obersten Ebene
 +
** spec ("special") - Der Eintrag wird unter denjenigen Eintrag gehängt, der mit sn=Y als ''special node''  gekennzeichnet wurde.
 +
 
 
'''Beispiel'''
 
'''Beispiel'''
  
  #btn y=back  s=#tree_back  se=b
+
  #sql select vorname || ' ' || nachname as kname from asd where adrnr = :adrnr
  #btn  y=fwd   s=#tree_fwd  se=b
+
  #tree_fillthread  u=o   k=adrnr  db=ora_prod
  
==#tree_fwd==
+
==#tree_sel==
  
Geht in die Baum-Historie einen Schritt weiter. Kann zur aufgerufen werden, wenn zuvor zurück gegangen wurde.
+
Selektiert einen Eintrag.
  
'''Parameter'''
+
Bei den Typen rf, sf, rfa und sfa wird im Baum nach einem bestimmten Wert (oder zwei bestimmten Werten) durchsucht. An jedem Eintrag hängt eine Ini-Datei, in der verschiedene Werte gespeichert sind. Es wird dann der erste Eintrag selektiert, in dessen Ini-Feld f der Wert z steht. Die Groß- und Kleinschreibung wird dabei ignoriert.
  
(keine)
+
Neben f und z können auch noch f2 und z2 gesetzt werden. Bei rf und sf sind diese beiden Suchkriterien (f/z und f2/z2) oder-verknüpft. Die Typen rf und sf werden auch bei nur einem Suchkriterium verwendet, da bei einer oder-Verknüpfung das Ergebnis und damit die Existenz eines zweiten Suchkriteriums egal ist. Mit rfa und sfa werden die Suchkriterien und-verknüpft.
  
'''Beispiel'''
+
'''Parameter'''
 +
 
 +
* cnd ("condition") - nur wenn true, wir die Anweisung ausgeführt. Default true, Funktionen werden ersetzt.
 +
* f, f2 ("field") - der erste und zweite Feldname (nur für die Typen rf, sf, rfa und sfa)
 +
* o ("open") - wenn Y, wird der nach der Selektierung selektierten Eintrag expandiert; default N, Funktionen werden ersetzt
 +
* op ("open paretns") - wenn Y, werden nach der Selektierung alle übergeordneten Einträge des selektierten Eintrag expandiert; default N, Funktionen werden ersetzt
 +
* sic ("search in children") - wnn Y, werden auch die Unterknoten durchsucht; default N, Funktionen werden ersetzt
 +
* y - Typ der Prozedur
 +
** c ("child") - geht zum ersten untergeordneten Eintrag
 +
** cc ("childchild") - geht zum ersten untergeordneten Eintrag des ersten untergeordneten Eintrags
 +
** ccc - geht in der Hierarchie drei Stufen nach unten
 +
** cccc - geht in der Hierarchie vier Stufen nach unten
 +
** ccccc - geht in der Hierarchie fünf Stufen nach unten
 +
** p ("parent") - geht zum direkt übergeordneten Eintrag
 +
** pp ("parentparent") - geht zum übergeordneten Eintrag des übergeordneten Eintrags
 +
** ppp - geht in der Hierarchie drei Stufen nach oben
 +
** pppp - geht in der Hierarchie vier Stufen nach oben
 +
** ppppp - geht in der Hierarchie fünf Stufen nach oben
 +
** rf ("rootfind") - Sucht im kompletten Baum, die Suchkriterien sind oder-verknüpft
 +
** rfa ("rootfindand") - Sucht im kompletten Baum, die Suchkriterien sind und-verknüpft
 +
** sf ("selectedfind") - Sucht unterhalb des selektierten Eintrags, die Suchkriterien sind oder-verknüpft
 +
** s ("selected") - Selektiert den selektierten Eintrag erneut, ruft damit das Selektionskommando erneut auf
 +
** sfa ("selectedfindand") - Sucht unterhalb des selektierten Eintrags, die Suchkriterien sind und-verknüpft
 +
** sfo ("selectedfindopen") - Sucht unterhalb des selektierten Eintrags, die Suchkriterien sind oder-verknüpft; zuvor wird der Eintrag expandiert
 +
** sfoa ("selectedfindopenand") - Sucht unterhalb des selektierten Eintrags, die Suchkriterien sind und-verknüpft; zuvor wird der Eintrag expandiert; funktioniert auch als sfao
 +
* wsc ("without select command") - Wenn Y, wird der Eintrag selektiert, ohne das Selection-Kommando auszuführen; default N. Wird üblicherweise dann verwendet, wenn mit mehreren #tree_sel-Prozeduren durch den Baum navigiert wird und aus Gründen der Geschwindigkeit dazwischenliegende Seitenaufrufe vermieden werden sollen.
 +
* z, z2 - der erste und zweite Wert (nur für die Typen rf, sf, rfa und sfa)
  
#btn  y=back  s=#tree_back  se=b
 
#btn  y=fwd  s=#tree_fwd  se=b
 
  
==$FND()==
+
'''Beispiel'''
  
Sucht in der Ini-Datei des mit dem ersten Parameter spezifizierten Baum-Eintrags nach dem im zweiten Parameter übergebenen Feld und gibt dessen Inhalt zurück. Wird in der Ini-Datei kein entsprechender Eintrag gefunden, dann wird der Vorgang in den übergeordneten Einträgen so lange wiederholt, bis ein Eintrag mit diesem Feldnamen gefunden wurde oder es keine übergeordneten Einträge mehr gibt.
+
#btn  c=test  w=120  s="#tree_sel  y=sf  f=data_list_id  z=7B0EC22C-8526-4FDB-8D10-0187ECF793C0  sic=Y"  se=b
  
'''Parameter'''
+
#cmdclear
# Eintrag im Tree
+
#cmd #tree_sel  y=c  o=Y
## s ("selected") - der selektierte Baum-Eintrag
+
#cmd #tree_sel  y=c
## sp ("selected parent") - Der übergeordnete Eintrag des selektierten Eintrags
+
#segbuttons 
## spp
+
#segbutton  c=Test  w=150  cmd=1
## sppp
+
 
## o ("opening") - der Baum-Eintrag, der gerade expandiert wird.
+
Im zweiten Beispiel soll in der Hierarchie zwei Stufen nach unten gegangen werden. Eigentlich würde das mit dem Typ cc gehen. Allerdings wird die unterste Ebene hier dynamisch nachgeladen, so dass eine Suche mit dem Typ cc ins Leere laufen würde. Die Lösung ist, zunächst mit dem Typ c eine Stufe nach unten zu gehen, dabei mit o=Y den Node zu expandieren und dabei dynamisch nachzuladen und dann mit dem Typ c eine weitere Stufe nach unten zu gehen.
## l ("last") - der zuletzt eingefügt Baum-Eintrag
 
## lp ("last parent") - Der übergeordnete Eintrag des zuletzt eingefügten Eintrags
 
## lpp
 
## lppp
 
## r ("root") - Der übergeordnete Eintrag der obersten Ebene
 
# Feldname (Name des Eintrags in der Ini-Datei)
 
# optional: NULL-Value-Wert, also Ergebniswert, wenn der Inhalt des Feldes leer sein sollte
 
  
'''Beispiel'''
+
==#tree_back==
  
#grddata  q=sql  t=data_list  k_cat=$FND(s,category)
+
Geht in die Baum-Historie einen Schritt zurück, also zum davor selektierten Eintrag.
  
=Page=
+
'''Parameter'''
  
==#page==
+
* cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  
Das Kommando #page setzt einige Eigenschaften auf Seiten-Ebene.
+
'''Beispiel'''
  
'''Parameter'''
+
#btn  y=back  s=#tree_back  se=b
* n - Name der Page; kann mit $PAGE() dann ermittelt werden
+
#btn  y=fwd  s=#tree_fwd  se=b
* rar ("refresh after return") - wenn von dem Tab auf einen anderen gesprungen wird, und dieser Tab wird geschlossen, dann wird die Page aktualisiert, sofern rar=Y. Beim Formulartyp ''treepage'' wird das Selektionskommando des selektierten Baumeintrags neu aufgerufen, beim Formulartyp ''page'' wird das Kommando im Parameter rar der Prozedur #frm angegeben.
 
* ras ("refresh after save") - wenn Y, wird die Seite nach dem Speichern erneut geladen; default N, Funktionen werden ersetzt
 
* tac ("tab caption") - setzt die Beschriftung des jeweiligen Tabs des BAF-Clients; Funktionen werden ersetzt
 
* y - Typ der Seite; default ist ''normal''
 
** dashhor
 
** dashvert
 
** normal
 
  
'''Beispiele'''
+
==#tree_fwd==
  
#page
+
Geht in die Baum-Historie einen Schritt weiter. Kann zur aufgerufen werden, wenn zuvor zurück gegangen wurde.
#page  ras=Y
 
 
 
==#page_fill==
 
 
 
Füllt die Page neu.
 
  
 
'''Parameter'''
 
'''Parameter'''
  
* cmd ("command") - Das Kommando, das ausgeführt wird, um die Seite aufzubauen.
+
(keine)
  
 
'''Beispiel'''
 
'''Beispiel'''
#tree_fill  u=root  t=devtext  c1=name  f_parent=!  s="#page_fill  d=xdevtext_page_text"  o=xdevtext_open  fi=Y
 
  
==#page_prim / #prim==
+
#btn  y=back  s=#tree_back  se=b
 +
#btn  y=fwd  s=#tree_fwd  se=b
  
Seiten werden zunächst in Primärregionen unterteilt (die keine sichtbaren Elemente haben), die Primärregionen wiederum in die Kategorien, und diese wiederum in die Sektionen.  
+
==$FND()==
 +
 
 +
Sucht in der Ini-Datei des mit dem ersten Parameter spezifizierten Baum-Eintrags nach dem im zweiten Parameter übergebenen Feld und gibt dessen Inhalt zurück. Wird in der Ini-Datei kein entsprechender Eintrag gefunden, dann wird der Vorgang in den übergeordneten Einträgen so lange wiederholt, bis ein Eintrag mit diesem Feldnamen gefunden wurde oder es keine übergeordneten Einträge mehr gibt.
  
 
'''Parameter'''
 
'''Parameter'''
* as ("AutoSize") - Die Größe der Primärregion wird dem Inhalt angepasst
+
# Eintrag im Tree
* sz ("size") - Größe der Primärregion in Pixel
+
## s ("selected") - der selektierte Baum-Eintrag
 +
## sp ("selected parent") - Der übergeordnete Eintrag des selektierten Eintrags
 +
## spp
 +
## sppp
 +
## o ("opening") - der Baum-Eintrag, der gerade expandiert wird.
 +
## l ("last") - der zuletzt eingefügt Baum-Eintrag
 +
## lp ("last parent") - Der übergeordnete Eintrag des zuletzt eingefügten Eintrags
 +
## lpp
 +
## lppp
 +
## r ("root") - Der übergeordnete Eintrag der obersten Ebene
 +
# Feldname (Name des Eintrags in der Ini-Datei)
 +
# optional: NULL-Value-Wert, also Ergebniswert, wenn der Inhalt des Feldes leer sein sollte
  
'''Beispiele'''
+
'''Beispiel'''
#prim 
 
#prim  as=N  sz=500
 
  
==#page_cat / #cat==
+
#grddata  q=sql  t=data_list  k_cat=$FND(s,category)
  
Legt eine Kategorie an. Zuvor muss eine Primärregion angelegt worden sein. #page_cat und #cat sind äquivalente Bezeichner für dieselbe Prozedur.
+
=Page=
  
'''Parameter'''
+
==#page==
* c ("Caption") - Beschriftung der Kategorie
+
 
* co ("categorie opened") - wenn Y, dann wird die Kategorie geöffnet erzeugt; default Y; Funktionen werden ersetzt
+
Das Kommando #page setzt einige Eigenschaften auf Seiten-Ebene.
* as ("AutoSize") - Die Größe der Primärregion wird dem Inhalt angepasst
+
 
* sz ("size") - Größe der Primärregion in Pixel
+
'''Parameter'''
 +
* n - Name der Page; kann mit $PAGE() dann ermittelt werden
 +
* rar ("refresh after return") - wenn von dem Tab auf einen anderen gesprungen wird, und dieser Tab wird geschlossen, dann wird die Page aktualisiert, sofern rar=Y. Beim Formulartyp ''treepage'' wird das Selektionskommando des selektierten Baumeintrags neu aufgerufen, beim Formulartyp ''page'' wird das Kommando im Parameter rar der Prozedur #frm angegeben.
 +
* ras ("refresh after save") - wenn Y, wird die Seite nach dem Speichern erneut geladen; default N, Funktionen werden ersetzt
 +
* tac ("tab caption") - setzt die Beschriftung des jeweiligen Tabs des BAF-Clients; Funktionen werden ersetzt
 +
* y - Typ der Seite; default ist ''normal''
 +
** dashhor
 +
** dashvert
 +
** normal
  
'''Beispiel'''
+
'''Beispiele'''
#cat  as=N  sz=360  c=$T(Languages)
 
  
==#page_val==
+
#page
 +
#page  ras=Y
  
Schreibt einen Wert in die Page, genauer gesagt in das mit i bezeichnete Segment.
+
==#page_fill==
  
Bei Text- und Memo-Segmenten werden nur die Parameter i und z benötigt und beachtet. Die VL, Grid- und XGrid-Segmenten muss die Spalte und die Reihe spezifiziert werden.
+
Füllt die Page neu.
  
 
'''Parameter'''
 
'''Parameter'''
* chg ("change") - Wenn Y, wird mit der Änderung die Zelle auf Changed gesetzt; default Y; Funktionen werden ersetzt
 
* col ("Column") - Index der Spalte, in welche der Wert geschrieben wird; wenn nicht gesetzt, dann wird der Parameter f verwendet
 
* f ("field") - Feldname der Zelle oder der Spalte, in welche der Wert geschrieben wird; wird nur verwendet, wenn col nicht gesetzt ost
 
* i ("item") - Name des Segments, in welches der Wert geschrieben wird
 
* ie ("if empty") - Wenn Y, wird der Wert nur in die Zelle geschrieben, wenn diese leer ist; default N; Funktionen werden ersetzt
 
* row - Index der Reihe, in die geschrieben wird. Alternativ sind bei Grid-Segmenten folgende Reihenbezeichnungen möglich:
 
** all - der Wert wird in alle Reihen geschrieben
 
** allsel ("all selected") - der Wert wird in alle Reihen geschrieben, die mit der in der Prozedur #grd_seg mit der Parameter sc ("selection column") spezifizierten Zelle selektiert wurden
 
** looprow - die in der Ausführung der Prozedur #grd_loop gerade aktive Reihe
 
** sel ("selected") - die aktuell selektierte Reihe
 
* z - Wert, der geschrieben wird
 
  
'''Beispiel'''
+
* cmd ("command") - Das Kommando, das ausgeführt wird, um die Seite aufzubauen. (Alternativ d)
  #cmd #page_val   i=vl   col=1   row=4   z=$HASH($PVAL(vl,1,2),SHA512)
+
* rs ("resize") - wenn Y, wird eine Größenänderungs-Nachricht an die Page gesendet, die bisweilen benötigt wird, damit die Seite korrekt aufgebaut wird; default N; Funktionen werden ersetzt.
 +
 
 +
'''Beispiel'''
 +
  #tree_fill  u=root  t=devtext  c1=name   f_parent=!   s="#page_fill   d=xdevtext_page_text"  o=xdevtext_open   fi=Y
 +
 
 +
==#page_prim / #prim==
  
==#page_check==
+
Seiten werden zunächst in Primärregionen unterteilt (die keine sichtbaren Elemente haben), die Primärregionen wiederum in die Kategorien, und diese wiederum in die Sektionen.  
 
 
Um Eingaben zu Validieren, können Checks definiert werden. Diese werden nach Benutzereingaben ausgeführt. Führen diese Checks zu Fehlern, so wird das Speichern der Daten verhindert. Die Fehlerliste wird statt des Trees angezeigt. Mit dem Beseitigen der Fehler oder dem verwerfen der Änderungen wird die Fehlerliste wieder ausgeblendet.
 
  
 
'''Parameter'''
 
'''Parameter'''
* c ("caption") - Text, der beim Scheitern der Prüfung in die Fehlerliste aufgenommen wird.
+
* as ("AutoSize") - Wenn Y, wird die Größe der Primärregion dem Inhalt angepasst; default Y, Funktionen werden ersetzt
* chk ("check") - Wenn nicht Y, dann gilt die Prüfung als gescheitert; Funktionen werden ersetzt
+
* sz ("size") - Größe der Primärregion in Pixel; Funktionen werden ersetzt
* cnd ("condition") - Wenn Y, wird die Prüfung ausgeführt; Funktionen werden ersetzt
 
* y - Typ des Checks; default e
 
** e ("error") - Fehler
 
** n ("none") - Check wird geprüft, aber nicht angezeigt und verhindert auch nicht da Speichern
 
** w ("warning") - Warnung; wird angezeigt, aber verhindert nicht das Speichern
 
  
 
'''Beispiele'''
 
'''Beispiele'''
 +
#prim 
 +
#prim  as=N  sz=500
  
#page_check  c="Das Passwort muss mindestens 6 Zeichen lang sein"  chk="$BOOL($LEN($PVAL(vl,1,2)) > 5)"
+
==#page_cat / #cat==
#page_check  c="Die Bestätigung stimmt nicht mit dem Paswort überein"  chk="$BOOL($PVAL(vl,1,2) = $PVAL(vl,1,3))"
 
  
==#page_ready==
+
Legt eine Kategorie an. Zuvor muss eine Primärregion angelegt worden sein. #page_cat und #cat sind äquivalente Bezeichner für dieselbe Prozedur.
 
 
Wird eine Seite nicht über #page_fill erstellt, sondern dadurch, dass das Kommando direkt aufgerufen wird, so müssen die Routinen, welche nach Aufbau der Seite ausgeführt werden müssen, explizit aufgerufen werden; dazu dient #page_ready.
 
  
 
'''Parameter'''
 
'''Parameter'''
 +
* c ("Caption") - Beschriftung der Kategorie
 +
* as ("AutoSize") - Die Größe der Primärregion wird dem Inhalt angepasst
 +
* o ("opened") - wenn Y, dann wird die Kategorie geöffnet erzeugt; default Y; Funktionen werden ersetzt
 +
* oci ("open close ini") - Wenn ein Wert gesetzt ist, wird der Open/Close-Status in der User-Ini gespeichert und beim nächsten Aufruf der Seite so wiederhergestellt. Dem Parameter oci wird der Name des Eintrags in der Ini-Datei zugewiesen; Funktionen werden ersetzt.
 +
* sz ("size") - Größe der Primärregion in Pixel
  
(keine)
+
'''Beispiel'''
 +
#cat  as=N  sz=360  c=$T(Languages)   oci=lamguages
  
'''Beispiel'''
+
==#page_val==
  
#page_ready
+
Schreibt einen Wert in die Page, genauer gesagt in das mit i bezeichnete Segment. Zusätzlich oder alternativ kann eine Zelle selektiert werden.
  
==$PAGE()==
+
Bei Text-, Memo- und Picture-Segmenten werden nur die Parameter i und z benötigt und beachtet. Die VL, Grid- und XGrid-Segmenten muss die Spalte und die Reihe spezifiziert werden.
  
Ermittelt den Namen der aktuellen Page.
+
Bei Picture-Segmenten wird die Eigenschaft Filename geschrieben, sie sollten q=file haben.
  
 
'''Parameter'''
 
'''Parameter'''
 
+
* c ("caption") - Verändert die Beschriftung des Segments
(keine)
+
* chg ("change") - Wenn Y, wird mit der Änderung die Zelle auf Changed gesetzt; default Y; Funktionen werden ersetzt
 +
* cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 +
* col ("Column") - Index der Spalte, in welche der Wert geschrieben wird; wenn nicht gesetzt, dann wird der Parameter f verwendet
 +
* f ("field") - Feldname der Zelle oder der Spalte, in welche der Wert geschrieben wird; wird nur verwendet, wenn col nicht gesetzt ost
 +
* i ("item") - Name des Segments, in welches der Wert geschrieben wird
 +
* ie ("if empty") - Wenn Y, wird der Wert nur in die Zelle geschrieben, wenn diese leer ist; default N; Funktionen werden ersetzt
 +
* row - Index der Reihe, in die geschrieben wird. Alternativ sind bei Grid-Segmenten folgende Reihenbezeichnungen möglich:
 +
** all - der Wert wird in alle Reihen geschrieben
 +
** allsel ("all selected") - der Wert wird in alle Reihen geschrieben, die mit der in der Prozedur #grd_seg mit der Parameter sc ("selection column") spezifizierten Zelle selektiert wurden
 +
** looprow - die in der Ausführung der Prozedur #grd_loop gerade aktive Reihe
 +
** sel ("selected") - die aktuell selektierte Reihe
 +
* sr ("segment refresh") - Wenn Y, wird ein Refresh des Segments durchgeführt; default N, Funktionen werden ersetzt
 +
* y - Typ der Operation; Funktionen werden ersetzt, default val
 +
** allcol - Es werden alle Spalten auf Übereinstimmung mit dem Parameter f geprüft; wird vor allem in einem X-Grid verwendet
 +
** sel - Die Zelle wird selektiert und das Grid bekommt den Focus
 +
** val - Ein Wert wird geschrieben
 +
** valsel oder selval - Ein Wert wir geschrieben und die Zelle wird selektiert.
 +
* z - Wert, der geschrieben wird
  
 
'''Beispiel'''
 
'''Beispiel'''
 +
#cmd #page_val  i=vl  col=1  row=4  z=$HASH($PVAL(vl,1,2),SHA512)
  
#btn  c=test  w=120  s="#message  c=$PAGE()"  se=b    h="Dies ist ein Test"
+
==#page_check==
  
==$PVAL()==
+
Um Eingaben zu Validieren, können Checks definiert werden. Diese werden nach Benutzereingaben ausgeführt. Führen diese Checks zu Fehlern, so wird das Speichern der Daten verhindert. Die Fehlerliste wird statt des Trees angezeigt. Mit dem Beseitigen der Fehler oder dem verwerfen der Änderungen wird die Fehlerliste wieder ausgeblendet.
  
Ermittelt einen Wert aus der Page
+
'''Parameter'''
 +
* c ("caption") - Text, der beim Scheitern der Prüfung in die Fehlerliste aufgenommen wird.
 +
* chk ("check") - Wenn nicht Y, dann gilt die Prüfung als gescheitert; Funktionen werden ersetzt
 +
* cnd ("condition") - Wenn Y, wird die Prüfung ausgeführt; Funktionen werden ersetzt
 +
* y - Typ des Checks; default e
 +
** e ("error") - Fehler
 +
** n ("none") - Check wird geprüft, aber nicht angezeigt und verhindert auch nicht da Speichern
 +
** w ("warning") - Warnung; wird angezeigt, aber verhindert nicht das Speichern
  
'''Text- und Memo-Segmente'''
+
'''Beispiele'''
  
Es muss nur der Name des Segments angegeben werden, $PVAL() gibt den kompletten Text zurück.
+
#page_check  c="Das Passwort muss mindestens 6 Zeichen lang sein"  chk="$BOOL($LEN($PVAL(vl,1,2)) > 5)"
 +
#page_check  c="Die Bestätigung stimmt nicht mit dem Paswort überein"  chk="$BOOL($PVAL(vl,1,2) = $PVAL(vl,1,3))"
  
'''Grid- und XGrid-Segmente'''
+
==#page_ready==
  
Wie immer muss der Name des Segments als erster Parameter angegeben werden.
+
Wird eine Seite nicht über #page_fill erstellt, sondern dadurch, dass das Kommando direkt aufgerufen wird, so müssen die Routinen, welche nach Aufbau der Seite ausgeführt werden müssen, explizit aufgerufen werden; dazu dient #page_ready.
  
Als zweiter Parameter folgt entweder der Index der Spalte (0-relativ, die erste Spalte hat also den Index 0) oder der Feldname der Spalte.
+
'''Parameter'''
  
Als dritter Parameter wird 0-relativ der Index der Zeile angegeben, alternativ eine Sonderzeile oder eine Aggregatfunktion.
+
* rs ("resize") - wenn Y, wird eine Größenänderungs-Nachricht an die Page gesendet, die bisweilen benötigt wird, damit die Seite korrekt aufgebaut wird; default N; Funktionen werden ersetzt.
  
'''Aggregatfunktionen'''
+
'''Beispiel'''
  
Für Grid- und XGrid-Segmente können Aggregatfunktionen gebildet werden. Erste Parameter ist der Name des Segments, zweiter Parameter Index der Spalte oder Feldname, als dritter Parameter der Name der Aggregatfunktion:
+
#page_ready
* count - Anzahl der Datensätze
 
* sum - Summe der Werte
 
* max - Maximum der Werte
 
* min - Minimum der Werte
 
* avg - Durchschnitt der Werte
 
* med - Median der Werte
 
* countsel - Anzahl der selektierten Datensätze
 
* sumsel - Summe der Werte der selektierten Datensätze
 
* maxsel - Maximum der Werte der selektierten Datensätze
 
* minsel - Minimum der Werte der selektierten Datensätze
 
* avgsel - Durchschnitt der Werte der selektierten Datensätze
 
* medsel - Median der Werte der selektierten Datensätze
 
  
'''VL-Segment'''
+
==$PAGE()==
  
Wie immer muss der Name des Segments als erster Parameter angegeben werden.
+
Ermittelt den Namen der aktuellen Page.
  
Als zweiter und dritter Parameter wird 0-relativ der Index der Spalte und der Zeile angegeben.
+
'''Parameter'''
  
Alternativ kann als zweiter Parameter ein Feldname angegeben werden. $PVAL() durchsucht dann alle Reihen und Spalten des VL-Segments nach diesem Feldnamen.
+
# Art der Wertes; default ist name
 +
* changecol - Der 0-relative Index der Spalte, in der gerade ein Wert geändert wird
 +
* changerow - Der 0-relative Index der Reihe, in der gerade ein Wert geändert wird
 +
* link - LinkValue
 +
* debuginfos - Infos zum Debugging
 +
* name - Name der Page
  
'''Sonderzeilen'''
+
'''Beispiel'''
  
Statt der Bezeichnung über die Zeilennummer sind auch die folgenden Werte möglich:
+
#btn  c=test  w=120  s="#message  c=$PAGE()"  se=b    h="Dies ist ein Test"
  
* looprow - die aktuelle Zeile bei der Ausführung von #grd_loop
+
==$PVAL()==
* checkrow - die aktuelle Zeile bei der Ausführung von $GRD_CHECK
 
* data - dieselbe Zeile im Grid wie das Kommando, das in dieser Zeile ausgeführt wird
 
* sel - die selektierte Zeile
 
  
'''Sonderwerte'''
+
Ermittelt einen Wert aus der Page
  
Bei Grid-, XGrid- und VL-Segmenten können Sonderwerte ermittelt werden. Es ist als zweiter Parameter ein Ausrufezeichen und als dritter Parameter der Name des Sonderwertes einzugeben:
+
'''Text- und Memo-Segmente'''
* looprow - der 0-relative Index der aktuellen Reihe in #grd_loop
 
  
'''Parameter'''
+
Es muss nur der Name des Segments angegeben werden, $PVAL() gibt den kompletten Text zurück.
# Name des Segments
 
# Spaltenindex (0-relativ) oder Feldname; bei Sonderwerten ein Ausrufezeichen
 
# Reihenindex (0-relativ), alternativ eine Sonderreihe:
 
## looprow - aktuelle Reihe in #grd_loop
 
## all - es werden alle Reihen zurückgegeben, als Trennzeichen wird der vierte Parameter verwendet
 
## allsel - es werden alle selektierten Reihen zurückgegeben, als Trennzeichen wird der vierte Parameter verwendet
 
# Trennzeichen(folge), wenn mehrere Zeilen zurückgegeben werden
 
  
'''Beispiele'''
+
'''Grid- und XGrid-Segmente'''
  
#cmd #message c=$PVAL(item,value,1)
+
Wie immer muss der Name des Segments als erster Parameter angegeben werden.
#text $PVAL(item,name,looprow) - $PVAL(item,description,looprow)
 
#clipboard  t=$PVAL(grid,adrnr,all,$CHR(crlf))
 
  
=Segmente=
+
Als zweiter Parameter folgt entweder der Index der Spalte (0-relativ, die erste Spalte hat also den Index 0) oder der Feldname der Spalte.
  
Eine Page ist in Primär-Regionen, diese in Kategorien und diese wiederum in Segmente eingeteilt.
+
Als dritter Parameter wird 0-relativ der Index der Zeile angegeben, alternativ eine Sonderzeile oder eine Aggregatfunktion.
  
==Segment-Typen==
+
'''Spaltenaggregate'''
  
'''VL-Segment'''
+
Für Grid- und XGrid-Segmente können Spaltenaggreagte gebildet werden. Erste Parameter ist der Name des Segments, zweiter Parameter Index der Spalte oder Feldname, als dritter Parameter der Name der Aggregatfunktion:
 +
* count - Anzahl der Datensätze
 +
* sum - Summe der Werte
 +
* max - Maximum der Werte
 +
* min - Minimum der Werte
 +
* avg - Durchschnitt der Werte
 +
* med - Median der Werte
 +
* countsel - Anzahl der selektierten Datensätze
 +
* sumsel - Summe der Werte der selektierten Datensätze
 +
* maxsel - Maximum der Werte der selektierten Datensätze
 +
* minsel - Minimum der Werte der selektierten Datensätze
 +
* avgsel - Durchschnitt der Werte der selektierten Datensätze
 +
* medsel - Median der Werte der selektierten Datensätze
 +
* countvis - Anzahl der sichtbaren Datensätze
 +
* sumvis - Summe der Werte der sichtbaren Datensätze
 +
* maxvis - Maximum der Werte der sichtbaren Datensätze
 +
* minvis - Minimum der Werte der sichtbaren Datensätze
 +
* avgvis - Durchschnitt der Werte der sichtbaren Datensätze
 +
* medvis - Median der Werte der sichtbaren Datensätze
  
Ein VL-Segment ist ein Grid zur Darstellung und Bearbeitung eines einzelnen Datensatzes.
+
'''Reihenaggregate'''
  
Das Standard-VL-Segment (VL für "value list") ist zweispaltig: Links der Namen, rechts der Wert. Es können jedoch auch weitere Spalten ergänzt werden, so dass der zur Verfügung stehende Platz in der Horizontalen besser genutzt werden kann oder dass weitere Werte in unsichtbaren Spalten gespeichert werden können.
+
Für Grid- und XGrid-Segmente können Reihenaggreagte gebildet werden. Erste Parameter ist der Name des Segments, zweiter Parameter die Funktion, die mit einem Fragezeichen beginnen muss, als dritter Parameter der Index der Reihe beziehungsweise eine Sonderreihe:
 +
* ?count - Anzahl der Spalten
 +
* ?sum - Summe der Werte
 +
* ?max - Maximum der Werte
 +
* ?min - Minimum der Werte
 +
* ?avg - Durchschnitt der Werte
 +
* ?all - Alle Zellenwerte, getrennt durch das Trennzeichen bzw. die Trennzeichenfolge in Parameter vier.
  
[[file:Ssht vl seg.png|VL-Segment]]
+
In einem Grid sind üblicherweise Spalten, für welche die Aggregatfunktion gebildet werden soll, mit anderen Spalten kombiniert. Um diese Spalten unterscheiden zu können, kann der Parameter ''grp'' der Spalte gesetzt werden. Bei der Berechnung der Reihenaggregate wird dann geschaut, ob die Zeichenfolge im fünften Parameter im Parameter ''grp'' der Spalte vorkommt; nur dann wird die betreffende Spalte berücksichtigt. Hinweis: Der Parameter ''grp'' der Spalte kann mehrere Gruppenbezeichner enthalten, wenn die betreffende Spalte für verschiedene Reihenaggregate verwendet wird. Diese können durch frei gewählte Trennzeichen getrennt werden, müssen aber nicht, sofern sie hinreichend unterscheidbar sind. Groß- und Kleinschreibung wird unterschieden.
  
 +
Im sechsten Parameter kann der Ergebnistyp angegeben werden:
 +
* bool
 +
* curr
 +
* curr4
 +
* date
 +
* datemin
 +
* datesek
 +
* int
  
'''Grid-Segment'''
+
Die Funktion ?count wird jedoch immer als ganze Zahl dargestellt.
  
Ein Grid-Segment dient zur Darstellung und Bearbeitung mehrerer Datensätze.
+
'''VL-Segment'''
  
Ein Standard-Grid hat eine Kopfzeile, kann jedoch mehrere Kopf- und Fußzeilen haben.
+
Wie immer muss der Name des Segments als erster Parameter angegeben werden.
  
[[file:Ssht grd seg.png|Grid-Segment]]
+
Als zweiter und dritter Parameter wird 0-relativ der Index der Spalte und der Zeile angegeben.
  
 +
Alternativ kann als zweiter Parameter ein Feldname angegeben werden. $PVAL() durchsucht dann alle Reihen und Spalten des VL-Segments nach diesem Feldnamen.
  
'''XGrid-Segment'''
+
'''Sonderzeilen'''
  
Ein XGrid-Segment ähnelt einem Grid-Segment. Allerdings besteht hier die Möglichkeit, Reihen einer Tabelle als Spalten zu ergänzen.
+
Statt der Bezeichnung über die Zeilennummer sind auch die folgenden Werte möglich:
  
Im nachfolgenden Bild gehören alle Spalte bis einschließlich Status zur Tabelle todo_todo, während die folgenden Spalten (und auch die Anzahl der folgenden Spalten) davon abhängt, welche Gruppen dem jeweiligen ToDo-Typ zugeordnet sind.
+
* change - die Zeile, in der die gerade geänderte Zelle liegt
 +
* checkrow - die aktuelle Zeile bei der Ausführung von  $GRD_CHECK
 +
* calcrow - die Zeile, die gerade bei grd_calc verwendet wird
 +
* datarow - bezieht sich auf die aktuelle Zeile bei $PVAL
 +
* data - dieselbe Zeile im Grid wie das Kommando, das in dieser Zeile ausgeführt wird
 +
* linkrow - die Zeile eines ausgeführten Link-Kommandos
 +
* lookuplive - die Zeile, die gerade in Lookup-Live verwendet wird
 +
* looprow - die aktuelle Zeile bei der Ausführung von #grd_loop
 +
* radio - die mit einem Radio-Button gewählte Zeile; sc des Grid-Segments muss auf diese Spalte zeigen
 +
* saverow - beim Speichern des Grids die Zeile, die gerade gespeichert wird
 +
* sel - die selektierte Zeile
  
[[file:Ssht xgrd seg.png|XGrid-Segment]]
+
'''Sonderwerte'''
  
 +
Bei Grid-, XGrid- und VL-Segmenten können Sonderwerte ermittelt werden. Es ist als zweiter Parameter ein Ausrufezeichen und als dritter Parameter der Name des Sonderwertes einzugeben:
 +
* looprow - der 0-relative Index der aktuellen Reihe in #grd_loop
  
'''Button-Segment'''
+
'''Parameter'''
 +
# Name des Segments
 +
# Spaltenindex (0-relativ) oder Feldname; bei Sonderwerten ein Ausrufezeichen, ''!col'' bezieht sich auf die aktuelle Spalte, Reihenaggregate beginnen mit einem Fragezeichen
 +
# Reihenindex (0-relativ), alternativ eine Sonderreihe:
 +
## looprow - aktuelle Reihe in #grd_loop
 +
## all - es werden alle Reihen zurückgegeben, als Trennzeichen wird der vierte Parameter verwendet
 +
## allsel - es werden alle selektierten Reihen zurückgegeben, als Trennzeichen wird der vierte Parameter verwendet
 +
# Trennzeichen(folge), wenn mehrere Zeilen zurückgegeben werden
 +
# Spaltengruppe, wird nur bei Reihenaggreagten gebraucht
 +
# Ergebnistyp, wird nur bei Reihenaggreagten gebraucht
 +
# wenn ''display'', dann wird der angezeigte Text (z.B. bei Nachschlagelisten) verwendet
  
In ein Button-Segment können mehrere Buttons eingefügt werden.
+
'''Beispiele'''
  
[[file:Ssht_btns_seg.png|Button-Segment mit zwei Buttons]]
+
#cmd #message c=$PVAL(item,value,1)
 +
#text $PVAL(item,name,looprow) - $PVAL(item,description,looprow)
 +
#clipboard  t=$PVAL(grid,adrnr,all,$CHR(crlf))
 +
#grdcol  c1=Summe  y=curr  nd=Y  cmdn=$PVAL(grid,?sum,data,,csum)
 +
#xgrd_col  c1="Gesamt"  w=80  nd=Y  ro=Y  cmd=$PVAL(gridxy,?sum,datarow,,sumc,int)  y=int  a=r  fc1=$PVAL(gridxy,!col,sum)  fa1=r  fy1=int
  
 +
==$CCI()==
  
'''Memo-Segment'''
+
Ermittelt die Farbe für eine Zelle anhand eines ganzzahligen Wertes
  
Das Memo-Segment dient zu Anzeige und Bearbeitung von mehrzeiligem Text.
+
'''Parameter'''
  
[[file:Ssht_memo_seg.png|Memo-Segment]]
+
# Wert. Wenn !, dann der Wert der Zelle, deren Farbe gerade gesetzt werden soll.
 +
# Wenn L (lower), dann muss der Wert gleich oder unterhalb des Vergleichswertes sein; andernfalls muss er gleich oder über dem vergleichswert
 +
# Vergleichswert für die Farbe rot
 +
# optional: Vergleichswert für die Farbe gelb - wird nur geprüft, wenn die Farbe nicht bereits rot
 +
# optional: Vergleichswert für die Farbe grün - wird nur geprüft, wenn die Farbe nicht bereits rot oder gelb
  
 +
'''Beispiel'''
  
'''Text-Segment'''
+
#grd_col  f=dubletten  y=int  w=30  a=r  c1="D"  h1="Dubletten"  ccc=$CCI(!,,1)
  
Mit einem Text-Segment kann mehrzeiliger Text auf der Seite angezeigt werden. (Die zugrunde liegende Delphi-Komponente ist ein Memo, so dass der Text markiert und in die Zwischenablage kopiert werden kann.)
+
Wenn die Anzahl der Dubletten 1 oder höher, wird die Farbe der Zelle auf rot gesetzt.
  
Text-Segmente werden bisweilen auch einfach dafür eingesetzt, den Abstand zwischen anderen Segmenten zu vergrößern.
+
=Segmente=
  
[[file:Ssht_text_seg.png|Memo-Segment]]
+
Eine Page ist in Primär-Regionen, diese in Kategorien und diese wiederum in Segmente eingeteilt.
  
==Gemeinsame Parameter aller Segmente==
+
==Segment-Typen==
  
Die folgenden Parameter können in allen Segmenten genutzt werden:
+
'''VL-Segment'''
  
'''Parameter'''
+
Ein VL-Segment ist ein Grid zur Darstellung und Bearbeitung eines einzelnen Datensatzes.
  
* b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
+
Das Standard-VL-Segment (VL für "value list") ist zweispaltig: Links der Namen, rechts der Wert. Es können jedoch auch weitere Spalten ergänzt werden, so dass der zur Verfügung stehende Platz in der Horizontalen besser genutzt werden kann oder dass weitere Werte in unsichtbaren Spalten gespeichert werden können.
* c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
 
* hp ("help path") - noch ohne Funtion
 
* n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
 
* mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
 
* mho ("max height opened") - maximale Höhe im geöffneten Zustand
 
* oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
 
** c - Segment wird nur in geschlossenem Zustand angezeigt
 
** o - Segment wird nur in geöffnetem Zustand angezeigt
 
** oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
 
* r ("rights") - Rechtedefinition
 
* ro ("read only") - Der Anwender kann die Daten im Segment nicht ändern
 
  
'''Beispiel'''
+
[[file:Ssht vl seg.png|VL-Segment]]
#grd_seg    frc=1  fcc=1  clt=ss  mhc=300  n=test  c=" "  b=HAI  sc=0
 
  
==Nachschlagelisten==
 
  
Bei der Auswahl von Optionen werden häufig Nachschlagelisten eingesetzt.
+
'''Grid-Segment'''
  
[[file:Lookupliste.png|172px|Nachschlageliste]]
+
Ein Grid-Segment dient zur Darstellung und Bearbeitung mehrerer Datensätze.
  
'''Definierte Nachschlagelisten'''
+
Ein Standard-Grid hat eine Kopfzeile, kann jedoch mehrere Kopf- und Fußzeilen haben.
  
Mit xlookup können Nachschlagelisten definiert werden. Diese können in xlookup auch in die definierten Sprachen übersetzt werden.
+
[[file:Ssht grd seg.png|Grid-Segment]]
  
Diese werden dann mit dem Parameter ld eingebunden:
 
  
#grd_col  f=status  c1="Status"  w=80  y=lookup  ld=srv_status
+
'''XGrid-Segment'''
  
'''Nachschlagelisten aus SQL-Statements'''
+
Ein XGrid-Segment ähnelt einem Grid-Segment. Allerdings besteht hier die Möglichkeit, Reihen einer Tabelle als Spalten zu ergänzen.
  
Nachschlagelisten können auch mittels SQL-Statement erzeugt werden. Hier gibt es zwei Möglichkeiten.  
+
Im nachfolgenden Bild gehören alle Spalte bis einschließlich Status zur Tabelle todo_todo, während die folgenden Spalten (und auch die Anzahl der folgenden Spalten) davon abhängt, welche Gruppen dem jeweiligen ToDo-Typ zugeordnet sind.
  
Zum Einen können diese Statements in xspecial definiert werden. Sie werden dann mit dem Parameter ls eingebunden:
+
[[file:Ssht xgrd seg.png|XGrid-Segment]]
  
#grd_col  f=user_group_id  c1=$T(Group)  w=300    y=lookup  ls=system_groups_all
 
  
Zum Anderen kann das SQL-Statement auch im Quelltext stehen. Das ist insbesondere dann hilfreich, wenn einzelne Werte noch gesetzt werden müssen. Diese Statements müssen mit dem Parameter ld eingebunden werden, dem der Name des SQL-Statements übergeben wird (Statements, die - wie hier im Beispiel - mit #sql2 definiert wurden, werden mit ld=sql2 eingebunden).
+
'''XXGrid-Segment'''
  
#sql2  select ctype as ckey, name as cvalue from todo_type where ctype like '$CP(0)%'
+
Ein XXGrid-Segment ("Double-X-Grid") ähnelt einem XGrid-Segment. Allerdings haben wir hier zwei Abfragen, die Spalten liefern.
...
 
xgrd_col  f=ctype  c1=$T(type)  y=lookup  ld=sql2  q=y2  w=150
 
  
Beiden Möglichkeiten ist gemeinsam, dass die beiden Spalten mit ckey und cvalue benannt werden müssen. Weitere Spalten sind unschädlich, werden aber ignoriert.
+
Im nachfolgenden Bild haben wir einerseits die Kategorien für die Stichworte, und dahinter jeweils alle Reisenummern, die bei der betreffenden Reklamation bemängelt wurden. Somit kann schnell und übersichtlich angehakt werden, welches Stichwort für welche Reisenummer zutrifft.
  
'''LookupLive'''
+
[[file:Xxgrid 2.png|XXGrid-Segment]]
  
Den zuvor erwähnten Möglichkeiten ist gemeinsam, dass alle Nachschlagelisten in einer Spalte stets gleich aussehen. Es können zwar unterschiedliche Werte gewählt werden, aber die Optionen in der Liste sind stets dieselben.
 
  
Manchmal benötigt man jedoch unterschiedliche Listen. Als Beispiel sei ein Grid genannt, in dem in einer Spalte eine Reise angegeben oder ausgewählt wird, und in einer anderen Spalte sollen in einer Nachschlageliste die Ausflüge gelistet werden, die zu dieser Reise buchbar sind. Und da die Reisen unterschiedliche Ausflüge haben, und auch unterschiedliche Reisen eingegeben werden können, sieht die Nachschlageliste in jeder Zeile unterschiedlich aus.
 
  
So etwas zu bewerkstelligen ist in BAF nicht weiter schwer: Es wird der Typ y=lookuplive verwendet mit mit llc (LookupLiveCommand) ein Kommando (Name oder Nummer) angegeben, das immer dann ausgeführt wird, wenn die Liste geöffnet wird (sowie beim erstmaligen Anzeigen - damit der Wert im Grid korrekt dargestellt werden kann). Mit diesem Kommando wird dann die Nachschlageliste gefüllt.
+
'''Button-Segment'''
  
#cmd_clear
+
In ein Button-Segment können mehrere Buttons eingefügt werden.
#cmd #sql select ckey, cvalue from data_list_item
 
#cmd #sql    where data_list_id = '21DE9AF0-0C30-4222-A131-B855FAA85DEB' 
 
#cmd #sql      and (ckey = 1 or ckey <= $NVL($PVAL(grid,nummer,lookuplive),0))    order by csort
 
#cmd #grd_lookuplivefill
 
 
#grd_col  f=lookup  c1="Lookup"  y=lookuplive  llc=1 
 
  
Hier im Beispiel wird ein lokales Kommando verwendet, das mit #cmd definiert wird. Damit das sicher leer ist, wird es zuvor mit #cmd_clear geleert. Das Kommando ist im Prinzip ein SQL-Statement sowie die Prozedur #grd_lookuplivefill, welche die Nachschlageliste füllt.
+
[[file:Ssht_btns_seg.png|Button-Segment mit zwei Buttons]]
  
LookupLive-Nachschlagelisten wird meist unter Berücksichtigung von anderen Werten in derselben Zeile des Grids gefüllt - also muss auf diese zugegriffen werden. Dafür wird die Funktion $PVAL verwendet, welcher als dritter Parameter - nach Name des Grid und Name oder Nummer der Spalte - der Reihensonderbezeichner ''lookuplive'' mitgegeben wird, so dass immer dieselbe Zeile wie die jeweilige Nachschlageliste verwendet wird.
 
  
Hinweis: Bei neu angelegten Zeilen ist die betreffende Zelle in der Regel leer. Von daher wird üblicherweise $NVL eingesetzt, um einen Ersatzwert zu verwenden, damit zumindest das SQL-Statement syntaktisch korrekt ist und auf keine Fehlermeldung läuft. (Hinweis zum Beispiel: Es handelt sich hier um keine kurze Demonstration der Funktionalität ohne praktischen Sinn.)
+
'''Memo-Segment'''
  
=Text-, Memo- und Button-Segmente=
+
Das Memo-Segment dient zu Anzeige und Bearbeitung von mehrzeiligem Text.
  
==#text_seg==
+
[[file:Ssht_memo_seg.png|Memo-Segment]]
  
Legt ein Text-Segment an.
 
  
'''Parameter'''
+
'''Text-Segment'''
  
Text-Segmente haben nur die gemeinsamen Parameter aller Segmente.
+
Mit einem Text-Segment kann mehrzeiliger Text auf der Seite angezeigt werden. (Die zugrunde liegende Delphi-Komponente ist ein Memo, so dass der Text markiert und in die Zwischenablage kopiert werden kann.)
  
'''Beispiel'''
+
Text-Segmente werden bisweilen auch einfach dafür eingesetzt, den Abstand zwischen anderen Segmenten zu vergrößern.
 +
 
 +
[[file:Ssht_text_seg.png|Memo-Segment]]
 +
 
 +
'''Picture-Segment'''
  
#text_seg  c=Test
+
Zeigt ein Bild an.
#textline Erste Zeile
 
#textline Zweite Zeile
 
  
==#text_line==
+
==Gemeinsame Parameter aller Segmente==
  
Fügt einem Text-Segment eine Zeile hinzu. Die komplette Zeile nach dem Prozedurennamen und dem folgenden Leerzeichen wird als neue Zeile hinzugefügt.
+
Die folgenden Parameter können in allen Segmenten genutzt werden:
  
 
'''Parameter'''
 
'''Parameter'''
  
Die komplette Zeile nach dem Prozedurennamen und dem folgenden Leerzeichen wird als neue Zeile dem Segment hinzugefügt.
+
* b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
 +
* c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
 +
* hp ("help path") - noch ohne Funtion
 +
* n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
 +
* mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
 +
* mho ("max height opened") - maximale Höhe im geöffneten Zustand
 +
* oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
 +
** c - Segment wird nur in geschlossenem Zustand angezeigt
 +
** o - Segment wird nur in geöffnetem Zustand angezeigt
 +
** oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
 +
* r ("rights") - Rechtedefinition
 +
* ro ("read only") - Wenn Y, kann der Anwender die Daten im Segment nicht ändern; default N, Funktionen werden ersetzt
  
 
'''Beispiel'''
 
'''Beispiel'''
 +
#grd_seg    frc=1  fcc=1  clt=ss  mhc=300  n=test  c=" "  b=HAI  sc=0
 +
 +
==Nachschlagelisten==
  
#text_seg  c=Test
+
Bei der Auswahl von Optionen werden häufig Nachschlagelisten eingesetzt.
#textline Erste Zeile
 
#textline Zweite Zeile
 
  
==#memo_seg==
+
[[file:Lookupliste.png|172px|Nachschlageliste]]
  
Legt ein Memo-Segment an, also ein Segment, in dem mehrzeiliger Text bearbeitet werden kann.
+
'''Definierte Nachschlagelisten'''
  
'''Data'''
+
Mit xlookup können Nachschlagelisten definiert werden. Diese können in xlookup auch in die definierten Sprachen übersetzt werden.
  
Mit q=data werden die Texte in der Tabelle data_memo gespiechert. Diese Tabelle ist dafür vorgesehen, mal schnell ein Bemerkungsfeld zu beliebigen Daten hinzuzufügen, ohne die jeweilige Datenbak-Tabelle erweitern zu müssen.
+
Diese werden dann mit dem Parameter ld eingebunden:
  
Der Datensatz in data_memo wird mit den Spalten item und ref referenziert. Item wird über den Parameter i gesetzt und ist zwingend. Für ref wird der Parameter k verwendet, der üblicherweise auf die ID-Spalte der Daten gesetzt wird, mit denen das Memo-Feld verbunden werden soll. Bleibt k leer, so wird none als Konstante eingefügt.
+
#grd_col  f=status  c1="Status"  w=80  y=lookup  ld=srv_status
  
'''File'''
+
'''Nachschlagelisten aus SQL-Statements'''
  
Mehrzeiliger Text kann auch einfach in einer Datei auf der Festplatte gespeichert werden. Dazu wird q=file und fn auf den gewünschten Dateinamen gesetzt. Möchte man für unterschiedliche Datensätze unterschiedliche Texte und damit unterschiedliche Dateinamen, so holt man einfach die ID oder eine andere eindeutige Spalte mit in den Dateinamen.
+
Nachschlagelisten können auch mittels SQL-Statement erzeugt werden. Hier gibt es zwei Möglichkeiten.  
  
'''Link'''
+
Zum Einen können diese Statements in xspecial definiert werden. Sie werden dann mit dem Parameter ls eingebunden:
  
Zellen in VL- und Grid-Segmente können problemlos mehrzeiligen Text speichern, sie können ihn aber nicht brauchbar anzeigen und bearbeiten. Mit q=link lässt sich ein Memo-Segment an ein VL- oder Grid-Segment hängen, so dass mehrzeiliger Text dort im Memo-Segment angezeigt und bearbeitet wird. Der Parameter i referenziert auf das VL- oder Grid-Segment, mit f wird die Datenbankspalte angegeben. Mit w=0 wird üblicherweise die entsprechende Spalte im VL- oder Grid-Segment ausgeblendet.
+
#grd_col  f=user_group_id  c1=$T(Group)  w=300    y=lookup  ls=system_groups_all
  
In einem Grid-Segment wird der Feldinhalt der gerade aktuellen Zeile angezeigt. Bei einem Zeilenwechsel ändert sich dann auch der Inhalt der Memo-Segments.
+
Zum Anderen kann das SQL-Statement auch im Quelltext stehen. Das ist insbesondere dann hilfreich, wenn einzelne Werte noch gesetzt werden müssen. Diese Statements müssen mit dem Parameter ld eingebunden werden, dem der Name des SQL-Statements übergeben wird (Statements, die - wie hier im Beispiel - mit #sql2 definiert wurden, werden mit ld=sql2 eingebunden).
  
Datenänderungen werden über das VL- oder Grid-Segment gespeichert.
+
#sql2  select ctype as ckey, name as cvalue from todo_type where ctype like '$CP(0)%'
 +
...
 +
xgrd_col  f=ctype  c1=$T(type)  y=lookup  ld=sql2  q=y2  w=150
  
'''Parameter'''
+
Beiden Möglichkeiten ist gemeinsam, dass die beiden Spalten mit ckey und cvalue benannt werden müssen. Weitere Spalten sind unschädlich, werden aber ignoriert.
  
* f ("field") - bei q=link der Feldname im verbundenen Segment
+
'''Nachschlagelisten aus Text-ValueLists'''
* fn ("file name") - Dateiname, wird für q=file verwendet; Funktionen werden ersetzt
 
* k ("key") - Wert für die Spalte ref in data_memo
 
* i ("item") - bei q=link Name des Segments, bei q=data der Item-Name; bei letzterem werden Funktionen ersetzt
 
* q ("Quelle") - Herkunft der Daten
 
** data - Daten werden in der Tabelle data_memo gespeichert; benötigt die Parameter i und meist auch k
 
** file - Daten werden in einer Datei gespeichert; benötigt den Parameter fn
 
** link - Daten werden in einem anderen Segment gespeichert; benötigt die Parameter i und vl
 
* z - Text des Memo-Segments; Wird von den Daten in q gegebenenfalls überschrieben
 
  
Zusätzlich gibt es die Parameter aller Segmente.
+
Eine Text-ValueList in eine Value-Liste, die in einem Text (text, text2, text3...) aufgebaut ist nach dem Muster key=value. Die Text-ValueList wird dem Parameter ld als tvl (text), tvl2 (text2), tvl3 (text3) und so weiter zugewiesen.  
  
'''Beispiele'''
+
#vl_line  c1=Lieferant  f2=vendor_id  ro2=Y  nd2=Y  c3=" "  c4=Name  f5=vendor_url  y5=lookup  ld5=tvl2
  
#memo_seg  q=link  i=vl  f=code  c="Code"  b=H
+
'''LookupLive'''
#memo_seg  q=file  fn=i:\temp\test.txt  c=$T(Notes)
 
#memo_seg  q=data  i=memo_reise  k=$PVAL(vl,reise_id)  c=" "  b=H
 
  
 +
Den zuvor erwähnten Möglichkeiten ist gemeinsam, dass alle Nachschlagelisten in einer Spalte stets gleich aussehen. Es können zwar unterschiedliche Werte gewählt werden, aber die Optionen in der Liste sind stets dieselben.
  
==#btns_seg==
+
Manchmal benötigt man jedoch unterschiedliche Listen. Als Beispiel sei ein Grid genannt, in dem in einer Spalte eine Reise angegeben oder ausgewählt wird, und in einer anderen Spalte sollen in einer Nachschlageliste die Ausflüge gelistet werden, die zu dieser Reise buchbar sind. Und da die Reisen unterschiedliche Ausflüge haben, und auch unterschiedliche Reisen eingegeben werden können, sieht die Nachschlageliste in jeder Zeile unterschiedlich aus.
  
Legt ein Button-Segment an.
+
So etwas zu bewerkstelligen ist in BAF nicht weiter schwer: Es wird der Typ y=lookuplive verwendet mit mit llc (LookupLiveCommand) ein Kommando (Name oder Nummer) angegeben, das immer dann ausgeführt wird, wenn die Liste geöffnet wird (sowie beim erstmaligen Anzeigen - damit der Wert im Grid korrekt dargestellt werden kann). Mit diesem Kommando wird dann die Nachschlageliste gefüllt.
  
'''Parameter'''
+
#cmd_clear
 
+
#cmd #sql select ckey, cvalue from data_list_item
Button-Segmente haben nur die gemeinsamen Parameter aller Segmente. Meist werden überhaupt keine Parameter benötigt.
+
#cmd #sql    where data_list_id = '21DE9AF0-0C30-4222-A131-B855FAA85DEB'  
 +
#cmd #sql      and (ckey = 1 or ckey <= $NVL($PVAL(grid,nummer,lookuplive),0))    order by csort
 +
#cmd #grd_lookuplivefill
 +
 +
#grd_col  f=lookup  c1="Lookup"  y=lookuplive  llc=1 
 +
 
 +
Hier im Beispiel wird ein lokales Kommando verwendet, das mit #cmd definiert wird. Damit das sicher leer ist, wird es zuvor mit #cmd_clear geleert. Das Kommando ist im Prinzip ein SQL-Statement sowie die Prozedur #grd_lookuplivefill, welche die Nachschlageliste füllt.
 +
 
 +
LookupLive-Nachschlagelisten wird meist unter Berücksichtigung von anderen Werten in derselben Zeile des Grids gefüllt - also muss auf diese zugegriffen werden. Dafür wird die Funktion $PVAL verwendet, welcher als dritter Parameter - nach Name des Grid und Name oder Nummer der Spalte - der Reihensonderbezeichner ''lookuplive'' mitgegeben wird, so dass immer dieselbe Zeile wie die jeweilige Nachschlageliste verwendet wird.
  
'''Beispiel'''
+
Hinweis: Bei neu angelegten Zeilen ist die betreffende Zelle in der Regel leer. Von daher wird üblicherweise $NVL eingesetzt, um einen Ersatzwert zu verwenden, damit zumindest das SQL-Statement syntaktisch korrekt ist und auf keine Fehlermeldung läuft. (Hinweis zum Beispiel: Es handelt sich hier um keine kurze Demonstration der Funktionalität ohne praktischen Sinn.)
  
#btns_seg
+
=Text-, Memo- und Button-Segmente=
  
==#btn_btn==
+
==#text_seg==
  
Legt einen Button in einem Button-Segment an.
+
Legt ein Text-Segment an.
  
 
'''Parameter'''
 
'''Parameter'''
  
* c ("caption") - Beschriftung des Buttons; Funktionen werden ersetzt
+
Text-Segmente haben nur die gemeinsamen Parameter aller Segmente.
* cmd ("command") -Kommando, das ausgeführt wird, wenn auf den Button geklickt wird (und ggf. die Bestätigungsabfrage mit Ja beantwortet wurde); Funktionen werden ersetzt (zum Zeitpunkt des Buttons-klicks)
 
* cnf ("confirmation") - Beim Mausklick auf den Button wird zunächst ein Bestätigungs-Dialog mit dem im Parameter cnf angegebenen Text angezeigt. Nur wenn dieser Bestätigungs-Dialog mit Ja geschlossen wird, wird cmd ausgeführt. Funktionen werden bei Anzeige des Bestätigungs-Dialogs ersetzt. Ist cnf leer, unterbleibt die Anzeige.
 
* r ("rights") - Rechte-Definition des Buttons; zum Ausführen des Buttons werden Schreibrechte benötigt
 
* ro ("read only") - Mit Y wird die Ausführung des Buttons gesperrt; Funktionen werden ersetzt
 
* w ("width") - Breite des Buttons
 
  
 
'''Beispiel'''
 
'''Beispiel'''
  
  #btns_seg  
+
  #text_seg c=Test
  #btns_btn  c=$T(Test_special) w=150  cmd="#pagefill  d=xspecial_page_list(test)"
+
  #textline Erste Zeile
 +
  #textline Zweite Zeile
  
=VL-Segmente=
+
==#text_line==
  
VL-Segmente ("Value List") sind Gitter-Segmente zur Anzeige eines einzelnen Datensatzes.
+
Fügt einem Text-Segment eine Zeile hinzu. Die komplette Zeile nach dem Prozedurennamen und dem folgenden Leerzeichen wird als neue Zeile hinzugefügt.  
  
Im Standard-Fall sind VL-Segmente zweispaltig: Auf der linken Seite wird die Beschriftung angezeigt, auf der rechten Seite der jeweilige Wert des Datensatzes.
+
'''Parameter'''
  
VL-Segmente können aber auch mehr als zwei Spalten haben. Das können unsichtbare Spalten sein, um Daten für z.B. ein Memo-Segment zu beinhalten, das können aber auch sichtbare Spalten sein, um den Platz auf dem Bildschirm besser auszunutzen.
+
Die komplette Zeile nach dem Prozedurennamen und dem folgenden Leerzeichen wird als neue Zeile dem Segment hinzugefügt.  
  
==#vl_seg==
+
'''Beispiel'''
  
Mit der Prozedur #vl_seg wird ein VL-Segment angelegt.
+
#text_seg  c=Test
 +
#textline Erste Zeile
 +
#textline Zweite Zeile
  
'''Parameter'''
+
==#memo_seg==
  
* cc ("ColumnCount") - Anzahl der Spalten; default 2; Funktionen werden ersetzt
+
Legt ein Memo-Segment an, also ein Segment, in dem mehrzeiliger Text bearbeitet werden kann.
* clt (column line type) - Spezifiziert, ob Spalten verbreitert oder umgebrochen werden; default sf; Funktionen werden ersetzt
 
** mf - multi line fixed
 
** ms - multi line stretch
 
** sf - single line fixed
 
** ss - single line stretch
 
* fcc (fixed columns count) - Spalten, die auch beim Scrollen links angezeigt werden; Wird bei #vl_seg sehr selten verwendet; default 0
 
* w ("width") - Breite der Spalte (w1, w2, w3...); Funktionen werden ersetzt
 
* wst ("width stretch") - Anzahl der Pixel, um welche die Spalte maximale verbreitert wird (wst1, wst2, wst3...); Funktionen werden ersetzt; findet nur bei clt=ss und clt=ms Verwendung
 
  
Zusätzlich gibt es die Parameter aller Segmente.
+
'''Data'''
 +
 
 +
Mit q=data werden die Texte in der Tabelle data_memo gespiechert. Diese Tabelle ist dafür vorgesehen, mal schnell ein Bemerkungsfeld zu beliebigen Daten hinzuzufügen, ohne die jeweilige Datenbak-Tabelle erweitern zu müssen.
 +
 
 +
Der Datensatz in data_memo wird mit den Spalten item und ref referenziert. Item wird über den Parameter i gesetzt und ist zwingend. Für ref wird der Parameter k verwendet, der üblicherweise auf die ID-Spalte der Daten gesetzt wird, mit denen das Memo-Feld verbunden werden soll. Bleibt k leer, so wird none als Konstante eingefügt.
 +
 
 +
'''File'''
 +
 
 +
Mehrzeiliger Text kann auch einfach in einer Datei auf der Festplatte gespeichert werden. Dazu wird q=file und fn auf den gewünschten Dateinamen gesetzt. Möchte man für unterschiedliche Datensätze unterschiedliche Texte und damit unterschiedliche Dateinamen, so holt man einfach die ID oder eine andere eindeutige Spalte mit in den Dateinamen.
  
'''Beispiel'''
+
'''Link'''
  
#vl_seg  cc=3  clt=ss  w1=100  w2=200  wst2=200  w3=200  n=vl  c=" "  b=H
+
Zellen in VL- und Grid-Segmente können problemlos mehrzeiligen Text speichern, sie können ihn aber nicht brauchbar anzeigen und bearbeiten. Mit q=link lässt sich ein Memo-Segment an ein VL- oder Grid-Segment hängen, so dass mehrzeiliger Text dort im Memo-Segment angezeigt und bearbeitet wird. Der Parameter i referenziert auf das VL- oder Grid-Segment, mit f wird die Datenbankspalte angegeben. Mit w=0 wird üblicherweise die entsprechende Spalte im VL- oder Grid-Segment ausgeblendet.
  
==#vl_line==
+
In einem Grid-Segment wird der Feldinhalt der gerade aktuellen Zeile angezeigt. Bei einem Zeilenwechsel ändert sich dann auch der Inhalt der Memo-Segments.
  
Legt eine Zeile in einem VL-Segment an
+
Datenänderungen werden über das VL- oder Grid-Segment gespeichert.
  
 
'''Parameter'''
 
'''Parameter'''
  
Die Parameter in #vl_line haben als Postfix die Nummer die Spalte, auf die sie sich beziehen.
+
* f ("field") - bei q=link der Feldname im verbundenen Segment
 +
* fn ("file name") - Dateiname, wird für q=file verwendet; Funktionen werden ersetzt
 +
* k ("key") - Wert für die Spalte ref in data_memo
 +
* i ("item") - bei q=link Name des Segments, bei q=data der Item-Name; bei letzterem werden Funktionen ersetzt
 +
* q ("Quelle") - Herkunft der Daten
 +
** data - Daten werden in der Tabelle data_memo gespeichert; benötigt die Parameter i und meist auch k
 +
** file - Daten werden in einer Datei gespeichert; benötigt den Parameter fn
 +
** link - Daten werden in einem anderen Segment gespeichert; benötigt die Parameter i und vl
 +
** none - Lädt und speichert keine Daten; der eingegebene Text kann mit $PVAL ermittelt oder mit #page_val gesetzt werden
 +
* ww ("WordWrap") - Wenn Y, werden zu lange Zeilen automatisch umgebrochen; default Y, Funktionen werden ersetzt
 +
* z - Text des Memo-Segments; Wird von den Daten in q gegebenenfalls überschrieben
  
* c1, c2... ("caption") - Beschriftung der Spalte; Wird die Beschriftung ersetzt, wird die Zelle auf ReadOnly gesetzt; Funktionen werden ersetzt
+
'''gemeinsame Parameter aller Segmenttypen'''
* chg1, chg2... ("change") - Kommando, das ausgeführt wird, wenn der Inhalt der Zelle geändert wird; siehe auch ''Beispiel für chg''
+
 
* cs1, cs2... ("col span") - Werte größer 1 fügen Zellen zusammen; default 1
+
* b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
* cy1, cy2... ("char type")
+
* c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
** l - LowerCase
+
* hp ("help path") - noch ohne Funtion
** n - Normal
+
* n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
** u - UpperCase
+
* mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
* f1, f2... ("field") - Feldname in der Datenbank
+
* mho ("max height opened") - maximale Höhe im geöffneten Zustand
* ld1, ld2... ("lookup data") - Name der Lookup-Liste, wenn der Datentyp lookup; Alternativ sql1, sql2..., um die Daten aus einem SQL-Statement zu ziehen
+
* oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
* ls1, ls2... ("lookup special") - Alternativ zu ld: Name des Specials, wenn die Daten aus einem Special gezogen werden sollen
+
** c - Segment wird nur in geschlossenem Zustand angezeigt
* l1, l2... ("length") - Zeichenlänge der Zelle
+
** o - Segment wird nur in geöffnetem Zustand angezeigt
* nd1, nd2... ("no data") - Daten werden beim Speichern nicht zurück in die Datenbank geschrieben; Änderungen an den Daten versetzen das VL-Segment und somit die Page nicht in den Changed-Status
+
** oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
* nv1, nv2... ("no value") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist
+
* r ("rights") - Rechtedefinition
* nvi1, nvi2... ("no value insert") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment auch in den Insert-Modus gesetzt
+
* ro ("read only") - Der Anwender kann die Daten im Segment nicht ändern
* nvic1, nvic2... ("no value insert change") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment in den Insert- und Changed-Modus gesetzt
+
 
* pw1, pw2... ("password") - Wenn Y, dann werden statt des Inhalts Punkte angezeigt; Funktionen werden ersetzt
+
Zusätzlich gibt es die Parameter aller Segmente.
* q1, q2... ("Quelle") - Datenquelle für die Zelle; siehe auch ''Beispiel für Datenquelle''
 
* r1, r2... ("rights") - Rechtedefinition der Zelle
 
* ro1, ro2... ("read only") - Zelle kann nicht bearbeitet werden
 
* y1, y2... ("type") - Datentyp der Spalte; default ist text
 
** bool - bool'sche Felder mit Y und N; wird als Checkbox dargestellt
 
** bool2 - bool'sche Felder, Y wird als angehakte Checkbox dargestellt, N als leeres Feld
 
** curr - Currency, also Zahlen mit zwei Nachkommastellen
 
** curr4 - Zahlen mit vier Nachkommastellen
 
** date - Datum im Format dd.mm.yyyy
 
** datemin - Datum im Format dd.mm.yyyy hh:mm
 
** datesec / datesek - Datum im Format dd.mm.yyyy hh:mm:ss
 
** guid - Inhalt wird als drei Punkte dargestellt; wird für GUIDs verwendet, die sich dann aber kopieren lassen
 
** iban - noch nicht implementiert
 
** int - Integer, also ganze Zahlen
 
** link - Link-Symbol
 
** lookup - Nachschlageliste
 
** lookuplive - Nachschlageliste, die beim Öffnen neu und auch für jede Zelle individuell geladen wird
 
** text - normaler Text
 
** todo - Symbole für ToDo-Listen
 
* z1, z2... - Wert der Zelle; im Unterschied zur Caption wird der Wert von #vl_data überschrieben, die Zelle wird auch nicht auf ReadOnly gesetzt.
 
  
 
'''Beispiele'''
 
'''Beispiele'''
  
  #vl_line   c1="Namef2=name
+
  #memo_seg   q=link  i=vl  f=code  c="Codeb=H
  #vl_line   c1="Type"   f2=type   ro=Y   y2=lookup   ld2=user_group_type   nv2=$FND(s,type)
+
  #memo_seg   q=file   fn=i:\temp\test.txt   c=$T(Notes)
#vl_line   c1="Data Special Id"   f2=data_special_id  ro2=Y  nvic2=$GUID()  f3=code
+
#memo_seg   q=data   i=memo_reise   k=$PVAL(vl,reise_idc=" " b=H
 +
 
 +
==#btns_seg==
  
'''Beispiel für chg'''
+
Legt ein Button-Segment an.
  
#cmdclear
+
'''Parameter'''
#cmd #page_val  i=vl  col=1  row=4  z=$HASH($PVAL(vl,1,2),SHA512)
 
...
 
vl_line  c1=$T(new_password)    nd2=Y    chg2=1  pw2=Y
 
  
'''Beispiel für Datenquelle'''
+
Button-Segmente haben nur die gemeinsamen Parameter aller Segmente. Meist werden überhaupt keine Parameter benötigt.
  
Im Normalfall ist mit einem VL-Segment immer nur eine Tabelle verbunden. Mit Hilfe eines Joins können zwar Daten aus mehreren Tabellen angezeigt werden, aber üblicherweisen werden die Daten nur in eine Tabelle zurück geschrieben, die anderen Zellen sind mit nd=Y gekennzeichnet.
+
'''Beispiel'''
  
Sollen Daten jedoch in mehrere Tabellen zurückgeschrieben werden, dann ist das Vorgehen das Folgende:
+
#btns_seg
  
* Die weiteren Tabellen benötigen eine Schlüsselspalte, welche denselben Inhalt wie die primäre Tabelle hat. Gegebenenfalls muss diese Spalte ergänzt werden. Bei der Benennung dieser Spalte gibt es zwei Möglichkeiten:
+
==#btns_btn==
** Die Spalte heißt genau so wie die Schlüsselspalte in der primären Tabelle (hier im Beispiel hat die Tabelle test_test2 die ID test_test2_id, und die angehängte Tabelle test_test2_add hat auch die ID test_test2_id - und nicht test_test2_add_id).
 
** Die Spalte heißt nicht so wie die Schlüsselspalte in der primären Tabelle (hier im Beispiel hat die Tabelle test_add3 die Schlüsselspalte test_add3_id); die bei BAF "übliche" Benennung mit einem angehängten _id wie hier bei test_add3 ist zu bevorzugen.
 
* Es wird ein SQL-Statement erstellt, um diese Tabellen zusammenzufügen. Die angehängten Tabellen werden mit einem left outer join verbunden. Dort, wo die ID-Spalten der angehängten Tabellen gleich wie in der primären Tabelle heißen (im Beispiel test_test2_id), werden sie umbenannt (im Beispiel yid).
 
* In #vl_data werden die weiteren Tabellen als t2, t3... aufgezählt; hier im Beispiel t2=test_tes2_add und  t3=test_add3. Wo sich der Name der Schlüsselspalte nicht auf dem Tabellennamen ableiten lässt, sind auch die Schlüsselspalten entsprechend anzugeben als k2, k3...; hier im Beispiel k2=yid
 
* Die Schlüsselspalten der ergänzten Tabellen sind im VL-Segment zu speichern. Üblicherweise wird dafür eine ausgeblendete Spalte verwendet.
 
* Bei jeder Zelle, die in einer der angehängten Tabellen gespeichert werden soll, ist mit dem Parameter q anzugeben, welches die angehängte Tabelle ist. y2 ist t2, y3 ist t3... (hier im Beispiel q2, weil die Daten in der zweiten Spalte der VL-Segments stehen).
 
* Dort, wo Schlüsselspalten gleich heißen wie in der primären Tabelle und deswegen im SQL-Statement umbenannt werden müssen (hier im Beispiel yid statt test_test2_id), muss der Spaltenname in der Tabelle mit yf angegeben werden, damit die Daten korrekt zurück geschrieben werden (hier im Beispiel yf3=test_test2_id - die Ziffer 3 bei yf3 bezieht sich auf die (unsichtbare) Spalte im VL-Segment, nicht auf die Nummer der Tabelle)
 
* Es ist sicherzustellen, dass alle beteiligten Tabellen dieselben Schlüsselwerte bekommen. Zu diesem Zweck wird im Beispiel die ID der primären Tabelle in den Value 1 geschrieben, ersatzweise wird eine neue GUID verwendet. Dieser Value wird dann mittels nvi in alle Schlüsselfelder geschrieben.
 
  
#setval  n=1  z=$FND(s,test_test2_id)  ie=$GUID()
+
Legt einen Button in einem Button-Segment an.
 
#vl_seg  cc=3  clt=ss  w1=100  w2=200  wst2=200  w3=0  n=vl  c=" "  b=H
 
#vl_line  c1="ID"  f2=test_test2_id  ro2=Y  nvic2=$VAL(1)    f3=yid  yf3=test_test2_id    q3=y2  nvi3=$VAL(1)
 
#vl_line  c1="Zahl"  f2=zahl  f3=test_add3_id  q3=y3  nvi3=$VAL(1)
 
#vl_line  c1="Text"  f2=text
 
#vl_line  c1="Todo"  f2=boolsch  y2=todo
 
#vl_line  c1="Add 1"  f2=add_1    q2=y2
 
#vl_line  c1="Add 2"  f2=add_2    q2=y2
 
#vl_line  c1="Add 3"  f2=add_3    q2=y2
 
#vl_line  c1="Add 31"  f2=add31    q2=y3
 
#sql select t.test_test2_id, t.zahl, t.text, t.boolsch, a.test_test2_id as yid, a.add_1, a.add_2, a.add_3, b.test_add3_id, b.add31
 
#sql  from test_test2 t
 
#sql    left outer  join test_test2_add a on a.test_test2_id = t.test_test2_id
 
#sql    left outer join test_add3 b on b.test_add3_id = t.test_test2_id
 
#sql  where t.test_test2_id = :kid
 
#vl_data  q=sql  t=test_test2      t2=test_test2_add  k2=yid  t3=test_add3  kid=$FND(s,test_test2_id)
 
  
==#vl_data==
+
'''Parameter'''
  
Füllt ein VL-Segment mit Daten
+
* c ("caption") - Beschriftung des Buttons; Funktionen werden ersetzt
 
+
* cmd ("command") -Kommando, das ausgeführt wird, wenn auf den Button geklickt wird (und ggf. die Bestätigungsabfrage mit Ja beantwortet wurde); Funktionen werden ersetzt (zum Zeitpunkt des Buttons-klicks)
'''Parameter'''
+
* cnf ("confirmation") - Beim Mausklick auf den Button wird zunächst ein Bestätigungs-Dialog mit dem im Parameter cnf angegebenen Text angezeigt. Nur wenn dieser Bestätigungs-Dialog mit Ja geschlossen wird, wird cmd ausgeführt. Funktionen werden bei Anzeige des Bestätigungs-Dialogs ersetzt. Ist cnf leer, unterbleibt die Anzeige.
* k ("key") - Name der Schlüsselspalte; default ist der Tabellenname mit einem angehängten _id
+
* r ("rights") - Rechte-Definition des Buttons; zum Ausführen des Buttons werden Schreibrechte benötigt; default sind die Rechte des Formulars
* k ("key") - Als Prefix für alle SQL-Parameter; siehe Beispiel; Funktionen werden ersetzt
+
* se ("status enabled") - Je nach Status des Formulars ist der Button enabled oder nicht (es können mehrere Status-Buchstaben in beliebiger Reihenfolge kombiniert werden); Funktionen werden ersetzt
* kid ("key id") - bei q=t der Wert der Schlüsselspalte, damit der Datensatz lokalisiert werden kann
+
** b ("browse") - Normalzustand des Formulars
* q ("Quelle") - Datenherkunft
+
** c ("changed") - Nachdem Daten geändert wurden
** sql - SQL-Statement
+
** e ("editing") - Während einer Editierung
** t - Table
+
** f ("failed") - Die Plausibilitätsprüfung wurde nicht bestanden
* t ("table") - Name der Tabelle; obligatorisch bei q=t und wenn bei q=sql die Daten zurückgeschrieben werden sollen; Funktionen werden ersetzt
+
* ro ("read only") - Mit Y wird die Ausführung des Buttons gesperrt; Funktionen werden ersetzt
* t2, t3... ("table") weitere Tabellen, in die Daten gespeichert werden sollen; siehe ''Beispiel für Datenquelle'' in #vl_line
+
* w ("width") - Breite des Buttons
  
'''Beispiele'''
+
'''Beispiel'''
  
  #vl_data  q=t  t=data_list  kid=$FND(s,data_list_id) 
+
  #btns_seg  
   
+
  #btns_btn c=$T(Test_specialw=150   cmd="#pagefill  d=xspecial_page_list(test)"
  #sql select * from menu_category where menu_category_id = :k_menu_category_id
 
  #vl_data  q=sql  t=menu_category  k_menu_category_id=$FND(s,menu_category_id)
 
 
#sql select * from menu_category where menu_category_id = :kid
 
  #vl_data  q=sql   t=menu_category  kid=$FND(s,menu_category_id)
 
  
=Grid-Segmente=
+
=VL-Segmente=
  
Grid-Segmente sind Segmente, in denen in Tabellenform mehrere Datensätze einer Datenbanktabelle oder einer SQL-Abfrage angezeigt werden. Grid-Segmente können Kopf- und Fußzeilen haben (default 1 Kopfzeile, 0 Fußzeilen)
+
VL-Segmente ("Value List") sind Gitter-Segmente zur Anzeige eines einzelnen Datensatzes.
 +
 
 +
Im Standard-Fall sind VL-Segmente zweispaltig: Auf der linken Seite wird die Beschriftung angezeigt, auf der rechten Seite der jeweilige Wert des Datensatzes.  
 +
 
 +
VL-Segmente können aber auch mehr als zwei Spalten haben. Das können unsichtbare Spalten sein, um Daten für z.B. ein Memo-Segment zu beinhalten, das können aber auch sichtbare Spalten sein, um den Platz auf dem Bildschirm besser auszunutzen.
  
==#grd_seg==
+
==#vl_seg==
  
Mit der Prozedur #grd_seg wird ein Grid-Segment angelegt.
+
Mit der Prozedur #vl_seg wird ein VL-Segment angelegt.
  
 
'''Parameter'''
 
'''Parameter'''
  
 +
* cc ("ColumnCount") - Anzahl der Spalten; default 2; Funktionen werden ersetzt
 
* clt (column line type) - Spezifiziert, ob Spalten verbreitert oder umgebrochen werden; default sf; Funktionen werden ersetzt
 
* clt (column line type) - Spezifiziert, ob Spalten verbreitert oder umgebrochen werden; default sf; Funktionen werden ersetzt
 
** mf - multi line fixed
 
** mf - multi line fixed
Zeile 1.080: Zeile 1.199:
 
** sf - single line fixed
 
** sf - single line fixed
 
** ss - single line stretch
 
** ss - single line stretch
* fcc (fixed columns count) - Spalten, die auch beim Scrollen links angezeigt werden; default 0; Funktionen werden ersetzt
+
* fcc (fixed columns count) - Spalten, die auch beim Scrollen links angezeigt werden; Wird bei #vl_seg sehr selten verwendet; default 0
* frc (footer row count) - Anzahl der Fußzeilen; default 0; Funktionen werden ersetzt
+
* w ("width") - Breite der Spalte (w1, w2, w3...); Funktionen werden ersetzt
* hrc (header row count) - Anzahl der Kopfzeilen; default 0; Funktionen werden ersetzt
+
* wst ("width stretch") - Anzahl der Pixel, um welche die Spalte maximale verbreitert wird (wst1, wst2, wst3...); Funktionen werden ersetzt; findet nur bei clt=ss und clt=ms Verwendung
* sc (selection column) - Spaltenindex der Selection-Zeile. Ein Grid-Segment kann eine Selection-Spalte haben, also eine Spalte vom Typ bool, mit deren Hilfe einzelne Zeilen ausgewählt werden können. Default ist -1, Funktionen werden ersetzt.
+
* whs (without horizontal scrollbar) - Blendet einen horizontalen Scrollbalken komplett aus, das Grid wird dadurch 20 Pixel weniger hoch.
  
Zusätzlich gibt es die Parameter aller Segmente.
 
  
'''Beispiel'''
+
'''gemeinsame Parameter aller Segmenttypen'''
  
  #grd_seg   frc=0   fcc=1   clt=ss   mhc=300   n=item
+
* b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
 
+
* c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
==#grd_col==
+
* hp ("help path") - noch ohne Funtion
 
+
* n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
Mit der Prozedur #grd_col wird eine Spalte in einem Grid-Segment definiert.
+
* mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
 +
* mho ("max height opened") - maximale Höhe im geöffneten Zustand
 +
* oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
 +
** c - Segment wird nur in geschlossenem Zustand angezeigt
 +
** o - Segment wird nur in geöffnetem Zustand angezeigt
 +
** oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
 +
* r ("rights") - Rechtedefinition
 +
* ro ("read only") - Der Anwender kann die Daten im Segment nicht ändern
 +
 
 +
'''Beispiel'''
 +
 
 +
  #vl_seg  cc=3  clt=ss   w1=100   w2=200   wst2=200   w3=200   n=vl  c=" "  b=H
 +
 
 +
==#vl_line==
 +
 
 +
Legt eine Zeile in einem VL-Segment an
  
 
'''Parameter'''
 
'''Parameter'''
* a (align) - Ausrichtung des Textes in der Spalte; default ist l.
+
 
** c (center) - Text wird zentriert ausgerichetet
+
Die Parameter in #vl_line haben als Postfix die Nummer die Spalte, auf die sie sich beziehen.
** d2 (decimal 2) - Text wird rechtsbündig für zwei Nachkommastellen ausgerichtet
+
 
** d4 (decimal 4) - Text wird rechtsbündig für vier Nachkommastellen ausgerichtet
+
* c1, c2... ("caption") - Beschriftung der Spalte; Wird die Beschriftung ersetzt, wird die Zelle auf ReadOnly gesetzt; Funktionen werden ersetzt
** l (left) - Text wird linksbündig ausgerichtet
+
* chg1, chg2... ("change") - Kommando, das ausgeführt wird, wenn der Inhalt der Zelle geändert wird; siehe auch ''Beispiel für chg''
** r (right) - Text wird rechtsbündig ausgerichtet
+
* ci1, ci2... (characters ignore) - Zeichen, die bei der Eingabe über die Tastatur ignoriert werden; default leer; Funktionen werden ersetzt
* a1, a2... (align) - [Header] Ausrichtung des Textes des Headers der Spalte der ersten, zweiten... Zeile. Zulässige Werte siehe Parameter a.
+
* cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
* c (caption) - Spalten-Titel im Filter-Formular; Funktionen werden ersetzt. Bleibt dieser Parameter leer, so wird ersatzweise c1 verwendet.
+
* cs1, cs2... ("col span") - Werte größer 1 fügen Zellen zusammen; default 1
* c1, c2... (caption) - [Header] Spalten-Titel der ersten, zweiten... Zeile; Funktionen werden ersetzt.
+
* cy1, cy2... ("char type")
* cmd (command) - Kommando, zum Beispiel für Verlinkung; Funktionen werden sofort ersetzt.
+
** l - LowerCase
* cmdn (command no) - Kommando, zum Beispiel für Verlinkung; Funkionen werden erst bei Ausführung des Kommandos ersetzt; wird nur berücksichtigt, wenn cmd leer ist.
+
** n - Normal
* cs1, cs2... (ColSpan) - [Header] Die Zelle des Spaltentitels der ersten, zweiten... Zeile überspannt die angegebene Anzahl an Spalten. Default ist 1; Funktionen werden ersetzt.
+
** u - UpperCase
* cy (character type) - Groß- und Kleinschreibung; default ist n
+
* f1, f2... ("field") - Feldname in der Datenbank
** l (lower case) - Spalte wird in Kleinbuchstaben dargestellt
+
* h1, h2... ("hint") - Feldname in der Datenbank für den Hinweistext, ersatzweise der Hinweistext selbst
** n (normal) - Groß- und Kleinschreibung wie eingegeben
+
* ld1, ld2... ("lookup data") - Name der Lookup-Liste, wenn der Datentyp lookup; Alternativ sql1, sql2..., um die Daten aus einem SQL-Statement zu ziehen
** u (upper case) - Spalte wird in Großbuchstaben dargestellt
+
* ls1, ls2... ("lookup special") - Alternativ zu ld: Name des Specials, wenn die Daten aus einem Special gezogen werden sollen
* f (fieldname) - Feldname der Spalte in der Datenmenge; Funktionen werden ersetzt.
+
* l1, l2... ("length") - Zeichenlänge der Zelle
* f1, f2... (fieldname) - [Header] Feldname des Spaltentitels der ersten, zweiten... Zeile; Funktionen werden ersetzt. Sind auch die Parameter c1, c2... gesetzt, dann werden die Texte zusammengefügt, wobei der Text aus c1, c2... vorangestellt wird.
+
* nd1, nd2... ("no data") - Daten werden beim Speichern nicht zurück in die Datenbank geschrieben; Änderungen an den Daten versetzen das VL-Segment und somit die Page nicht in den Changed-Status
* fa1, fa2... (footer align) - [Footer] Ausrichtung des Textes der Fußzeile der Spalte der ersten, zweiten... Zeile. Zulässige Werte siehe Parameter a.
+
* nv1, nv2... ("no value") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist
* fc1, fc2... (footer caption) - [Footer] Spalten-Fußzeile der ersten, zweiten... Zeile. Ist im Text ein $-Zeichen enthalten, dann wird der Text als Zellen-Kommando interpretiert.
+
* nvc1, nvc2... ("no value change") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment in den Changed-Modus gesetzt
* fcs1, fcs2... (footer ColSpan) - [Footer] Die Zelle der Fußzeile der ersten, zweiten... Zeile überspannt die angegebene Anzahl an Spalten. Default ist 1; Funktionen werden ersetzt.
+
* nvi1, nvi2... ("no value insert") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment auch in den Insert-Modus gesetzt
* ff1, ff2... (footer fieldname) - [Footer] Feldname des Fußzeile der ersten, zweiten... Zeile; Funktionen werden ersetzt. Sind auch die Parameter fc1, fc2... gesetzt, dann werden die Texte zusammengefügt, wobei der Text aus fc1, fc2... vorangestellt wird.
+
* nvic1, nvic2... ("no value insert change") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment in den Insert- und Changed-Modus gesetzt
* fh1, fh2... (footer hint) - [Footer] Feldname des Hint-Textes der Spalte der ersten, zweiten... Fußeile; Funktionen werden ersetzt. Gibt es in der Datenmenge keine Spalte dieses Namens, dann wird der Wert als Konstante ausgegeben.
+
* pw1, pw2... ("password") - Wenn Y, dann werden statt des Inhalts Punkte angezeigt; Funktionen werden ersetzt
* fy1, fy2... (footer Typ) - [Footer] Datentyp des Datentyps der ersten, zweiten... Fußzeile; default ist text. Zulässige Werte siehe y.
+
* q1, q2... ("Quelle") - Datenquelle für die Zelle; siehe auch ''Beispiel für Datenquelle''
* h (hint) -  Feldname des Hint-Textes in der Datenmenge; Funktionen werden ersetzt.
+
* r1, r2... ("rights") - Rechtedefinition der Zelle
* h1, h2... (hint) - [Header] Feldname des Hint-Textes der Spalte der ersten, zweiten... Zeile; Funktionen werden ersetzt. Gibt es in der Datenmenge keine Spalte dieses Namens, dann wird der Wert als Konstante ausgegeben.
+
* ro1, ro2... ("read only") - Zelle kann nicht bearbeitet werden
* jy (join type) - Im Standardfall werden bei Join-Gruppierung die Daten durch Kommata getrennt dargestellt. Sie können jedoch auch summiert werden, dafür ist jy=sum  zu setzen.
+
* y1, y2... ("type") - Datentyp der Spalte; default ist text
* l (length) - Maximale Länge in Zeichen bei der Eingabe
 
* ld (LookupData) - Name der Nachschlageliste beim Spaltentyp y=lookup
 
* llc (LookupLiveCommand) - Name oder Nummer des Kommandos, das beim Spaltentyp y=lookuplive verwendet wird; ls und ls dürfen nicht gesetzt werden
 
* ls (LookupSpecial) - Name des Specials (hinterlegte SQL-Anweisung in xspecial), wird nur berücksichtigt, wenn ld nicht gesetzt ist
 
* nd (no data) - Spalte wird beim Speichern nicht berücksichtigt; Änderungen versetzen das Grid auch nicht in den Zustand changed.
 
* q (quelle) - Datenquelle für das Grid.
 
** j, join - Daten aus einem Datenbank-Join werden gruppiert dargestellt
 
** s, sql - SQL-Statement
 
** t, tbl, tab, table - Datenbanktabelle
 
* r (right) - Rechtedefinition der Spalte
 
* ro (ReadOnly) - Wenn Y, dann kann die Spalte nicht beschrieben werden.
 
* rof (ReadOnlyField) - Wenn der Inhalte der angegebenen Datenbankspalte Y ist, dann kann die betreffende Zelle nicht beschrieben werden.
 
* ss1, ss2... (SortSymbols) - [Header] Mit Mausklick auf den Spaltentitel kann nach dieser Spalte sortiert werden, mit einem weiteren Mausklick die Sortierrichtung umgekehrt werden. Es werden dabei entsprechend Symbole rechts im Spaltentitel angezeigt. Um eine Sortierung zu verhinden, kann ss1, ss2... auf N gesetzt werden. Funktionen werden ersetzt.
 
* w (width) - Breite der Spalte in Pixel; Funktionen werden ersetzt.
 
* wst (width stretch) - Anzahl von Pixel, welche die Spalte maximal verbreitert wird, wenn Platz dafür da ist. Voraussetzung dafür ist, dass der Parameter clt von #grd_seg den Wert ss oder ms hat. Funktionen werden ersetzt.
 
* y (typ) - Datentyp der Spalte; default ist text
 
 
** bool - bool'sche Felder mit Y und N; wird als Checkbox dargestellt
 
** bool - bool'sche Felder mit Y und N; wird als Checkbox dargestellt
 
** bool2 - bool'sche Felder, Y wird als angehakte Checkbox dargestellt, N als leeres Feld
 
** bool2 - bool'sche Felder, Y wird als angehakte Checkbox dargestellt, N als leeres Feld
Zeile 1.154: Zeile 1.271:
 
** text - normaler Text
 
** text - normaler Text
 
** todo - Symbole für ToDo-Listen
 
** todo - Symbole für ToDo-Listen
* yf (Y fieldname) - Feldname der Spalte in einer zusätzlichen Datenmenge; Funktionen werden ersetzt.
+
** triex - drei Symbole: 0, ? und !
 +
** triplus - drei Symbole: 0, - und +
 +
* z1, z2... - Wert der Zelle; im Unterschied zur Caption wird der Wert von #vl_data überschrieben, die Zelle wird auch nicht auf ReadOnly gesetzt.
  
 
'''Beispiele'''
 
'''Beispiele'''
  
  #grd_col   f=translate_list_item_id   c1=ID   w=30   y=guid   ro=Y  nvi=$GUID()
+
  #vl_line   c1="Name"   f2=name
  #grd_col   f=user_group_id   c1=$T(groupy=lookup   ls=system_groups_all   w=200   wst=200
+
#vl_line   c1="Type"   f2=type   ro=Y  y2=lookup  ld2=user_group_type  nv2=$FND(s,type)
 +
  #vl_line   c1="Data Special Id"   f2=data_special_id  ro2=Y  nvic2=$GUID()  f3=code
 +
 
 +
'''Beispiel für chg'''
 +
 
 +
#cmdclear
 +
#cmd #page_val  i=vl  col=1  row=4   z=$HASH($PVAL(vl,1,2),SHA512)
 +
...
 +
vl_line   c1=$T(new_password)    nd2=Y    chg2=1   pw2=Y
  
==#grd_data==
+
'''Beispiel für Datenquelle'''
  
Füllt das Grid mit Daten aus der Dankenbank.
+
Im Normalfall ist mit einem VL-Segment immer nur eine Tabelle verbunden. Mit Hilfe eines Joins können zwar Daten aus mehreren Tabellen angezeigt werden, aber üblicherweisen werden die Daten nur in eine Tabelle zurück geschrieben, die anderen Zellen sind mit nd=Y gekennzeichnet.
  
'''Parameter'''
+
Sollen Daten jedoch in mehrere Tabellen zurückgeschrieben werden, dann ist das Vorgehen das Folgende:
  
* db ("DataBase") - Name der Datenbankverbindung, aus der die Daten bezogen werden; Funktionen werden ersetzt, default ist die Standard-Datenbankverbindung
+
* Die weiteren Tabellen benötigen eine Schlüsselspalte, welche denselben Inhalt wie die primäre Tabelle hat. Gegebenenfalls muss diese Spalte ergänzt werden. Bei der Benennung dieser Spalte gibt es zwei Möglichkeiten:
* gc (grid cache) - Erhält dieser Paremeter einen Wert, dann wird das SQL-Statement nur beim erstmaligen Aufruf von #grd_data ausgeführt. Die Daten werden dann in einem Cache gespeichert, so dass erneute Aufrufe weniger lange dauern. Der Inhalt das Parameters wird als Name für die Seite im Cache verwendet und muss eindeutig sein - im Zweifelsfall verwendet man eine GUID. Hinweise: Wenn weitere Spalten der Abfrage und dem Grid hinzugefügt werden, bleiben diese erste mal leer. Auch Veränderungen der Daten durch andere User bleiben erst mal unsichtbar. Ein erneuter Start der BAF-Clients führt zu einem leeren Cache und somit zur erneuten Ausführung des SQL-Statements.
+
** Die Spalte heißt genau so wie die Schlüsselspalte in der primären Tabelle (hier im Beispiel hat die Tabelle test_test2 die ID test_test2_id, und die angehängte Tabelle test_test2_add hat auch die ID test_test2_id - und nicht test_test2_add_id).
* ior (insert one row) - Wenn Y, wird eine (leere) Zeile eingefügt, wenn die Datenmenge leer ist; default N; Funktionen werden ersetzt
+
** Die Spalte heißt nicht so wie die Schlüsselspalte in der primären Tabelle (hier im Beispiel hat die Tabelle test_add3 die Schlüsselspalte test_add3_id); die bei BAF "übliche" Benennung mit einem angehängten _id wie hier bei test_add3 ist zu bevorzugen.
* k (key) - Name der Schlüsselspalte; per default der Tabellennamen plus ein angehängtes _id; Funktionen werden ersetzt
+
* Es wird ein SQL-Statement erstellt, um diese Tabellen zusammenzufügen. Die angehängten Tabellen werden mit einem left outer join verbunden. Dort, wo die ID-Spalten der angehängten Tabellen gleich wie in der primären Tabelle heißen (im Beispiel test_test2_id), werden sie umbenannt (im Beispiel yid).
* k2, k3... - Name der Schlüsselspalten weiterer Tabellen; per default der Tabellennamen plus ein angehängtes _id
+
* In #vl_data werden die weiteren Tabellen als t2, t3... aufgezählt; hier im Beispiel t2=test_tes2_add und  t3=test_add3. Wo sich der Name der Schlüsselspalte nicht auf dem Tabellennamen ableiten lässt, sind auch die Schlüsselspalten entsprechend anzugeben als k2, k3...; hier im Beispiel k2=yid
* Prefix k - Prefix für SQL-Parameter
+
* Die Schlüsselspalten der ergänzten Tabellen sind im VL-Segment zu speichern. Üblicherweise wird dafür eine ausgeblendete Spalte verwendet.
* ocd (open cat on data) - Wenn Y, wird die übergeordnete Kategorie geöffnet, wenn das Grid Daten enthält; default N; Funktionen werden ersetzt
+
* Bei jeder Zelle, die in einer der angehängten Tabellen gespeichert werden soll, ist mit dem Parameter q anzugeben, welches die angehängte Tabelle ist. y2 ist t2, y3 ist t3... (hier im Beispiel q2, weil die Daten in der zweiten Spalte der VL-Segments stehen).
* q (quelle) - Herkunft der Daten
+
* Dort, wo Schlüsselspalten gleich heißen wie in der primären Tabelle und deswegen im SQL-Statement umbenannt werden müssen (hier im Beispiel yid statt test_test2_id), muss der Spaltenname in der Tabelle mit yf angegeben werden, damit die Daten korrekt zurück geschrieben werden (hier im Beispiel yf3=test_test2_id - die Ziffer 3 bei yf3 bezieht sich auf die (unsichtbare) Spalte im VL-Segment, nicht auf die Nummer der Tabelle)
** j - Join
+
* Es ist sicherzustellen, dass alle beteiligten Tabellen dieselben Schlüsselwerte bekommen. Zu diesem Zweck wird im Beispiel die ID der primären Tabelle in den Value 1 geschrieben, ersatzweise wird eine neue GUID verwendet. Dieser Value wird dann mittels nvi in alle Schlüsselfelder geschrieben.
** sql - SQL-Statement
 
** t - Table
 
* t (table) - Name der Datenbanktabelle, in welche die Daten beim Speichern zurückgeschrieben werden; Funktionen werden ersetzt
 
* t2, t3... - Tabellennamen weiterer Tabellen
 
  
 +
#setval  n=1  z=$FND(s,test_test2_id)  ie=$GUID()
 +
 +
#vl_seg  cc=3  clt=ss  w1=100  w2=200  wst2=200  w3=0  n=vl  c=" "  b=H
 +
#vl_line  c1="ID"  f2=test_test2_id  ro2=Y  nvic2=$VAL(1)    f3=yid  yf3=test_test2_id    q3=y2  nvi3=$VAL(1)
 +
#vl_line  c1="Zahl"  f2=zahl  f3=test_add3_id  q3=y3  nvi3=$VAL(1)
 +
#vl_line  c1="Text"  f2=text
 +
#vl_line  c1="Todo"  f2=boolsch  y2=todo
 +
#vl_line  c1="Add 1"  f2=add_1    q2=y2
 +
#vl_line  c1="Add 2"  f2=add_2    q2=y2
 +
#vl_line  c1="Add 3"  f2=add_3    q2=y2
 +
#vl_line  c1="Add 31"  f2=add31    q2=y3
 +
#sql select t.test_test2_id, t.zahl, t.text, t.boolsch, a.test_test2_id as yid, a.add_1, a.add_2, a.add_3, b.test_add3_id, b.add31
 +
#sql  from test_test2 t
 +
#sql    left outer  join test_test2_add a on a.test_test2_id = t.test_test2_id
 +
#sql    left outer join test_add3 b on b.test_add3_id = t.test_test2_id
 +
#sql  where t.test_test2_id = :kid
 +
#vl_data  q=sql  t=test_test2      t2=test_test2_add  k2=yid  t3=test_add3  kid=$FND(s,test_test2_id)
  
'''Beispiel'''
+
==#vl_data==
 
 
#grddata  q=sql  t=translate_list_item  kid=$FND(s,data_list_item_id)
 
 
 
==#grd_add==
 
 
 
Fügt einem Grid-Segment eine weitere Reihe hinzu.
 
  
Hinweis: Die Primärschlüsselspalte wird üblicherweise nicht in der Prozedur #grd_add gesetzt, sondern mit dem Parameter nvi in der Prozedur #grd_col.
+
Füllt ein VL-Segment mit Daten
  
 
'''Parameter'''
 
'''Parameter'''
 +
* k ("key") - Name der Schlüsselspalte; default ist der Tabellenname mit einem angehängten _id
 +
* k ("key") - Als Prefix für alle SQL-Parameter; siehe Beispiel; Funktionen werden ersetzt
 +
* kid ("key id") - bei q=t der Wert der Schlüsselspalte, damit der Datensatz lokalisiert werden kann
 +
* q ("Quelle") - Datenherkunft
 +
** sql - SQL-Statement
 +
** t - Table
 +
* t ("table") - Name der Tabelle; obligatorisch bei q=t und wenn bei q=sql die Daten zurückgeschrieben werden sollen; Funktionen werden ersetzt
 +
* t2, t3... ("table") weitere Tabellen, in die Daten gespeichert werden sollen; siehe ''Beispiel für Datenquelle'' in #vl_line
  
* chg ("change") - Wenn Y, wird die neue Reihe gleich in den Changed-Modus gesetzt; default N; Funktionen werden ersetzt
+
'''Beispiele'''
* f_ ("field) - Prefix für die Feldnamen der Spalten, deren Werte gesetzt werden sollen
 
* i ("item") - Name des Grid-Segments
 
  
'''Beispiel'''
+
#vl_data  q=t  t=data_list  kid=$FND(s,data_list_id) 
 +
 +
#sql select * from menu_category where menu_category_id = :k_menu_category_id
 +
#vl_data  q=sql  t=menu_category  k_menu_category_id=$FND(s,menu_category_id)
 +
 +
#sql select * from menu_category where menu_category_id = :kid
 +
#vl_data  q=sql  t=menu_category  kid=$FND(s,menu_category_id)
  
#grd_add  i=todo_add  f_ref=$VAR(todo_id)  f_ref_text=$VAR(todo_text)  f_ref_hint=$VAR(todo_hint)  f_status=1
+
==#vl_hist==
  
==#grd_loop==
+
Definiert die Rechte für ein Feld in der History-Ansicht. Funktioniert auch mit #grd_seg, #xgrs_seg und #xxgrd_seg
 
 
Die Prozedur #grd_loop führt eine Schleife über alle oder alle selektierten Reihen eines Grid-Segments durch.
 
  
 
'''Parameter'''
 
'''Parameter'''
 
+
* f ("field") - Name der Spalte in der Tabelle
* er (each row) - Kommando, das für jede oder jede selektierte Zeile des Grids ausgeführt wird.
+
* r ("rights") - Name der Rechtedefinition für diese Spalte
* ert (each row transaction) - Wenn Y, dann wird jeder Aufruf des mit er festgelegten Kommandos in einer Transaktion gekapselt
 
* i (item) - Name des Grid-Segments
 
* sc (selection column) - Index der Selection-Column; Wenn damit eine Spalte angegeben wird, dann wird das mit er festgelegte Kommando nur ausgeführt, wenn der Werte dieser Spalte in der betreffenden Reihe Y ist; default ist -1; Funktionen werden ersetzt.
 
  
 
'''Beispiel'''
 
'''Beispiel'''
  
  #grd_loop   i=grid   er=1   sc=0
+
  #vl_line  c1=$T(Description)  f2=description  l2=80   r=admin
 +
#vl_hist   f=description   r=admin
  
==#grd_cnt==
+
In diesem Beispiel wird durch r=admin in #vl_line dafür gesorgt, dass nur Administratoren die Beschreibung im VL-Segment sehen. Mit der Anweisung #vl_hist wird sichergestellt, dass andere als Administratoren den Spalteninhalt auch nicht über die Historie einsehen können.
  
Zählt die Zeilen in einem Grid. Es kann dabei eine Bedingung formuliert werden, welche Datensätze gezählt werden sollen.
+
==#vl_thread==
  
Diese Prozedur kann auch dazu verwendet werden, um zu ermitteln, ob eine bestimmte Zeile schon im Grid vorhanden ist oder nicht. Davon lässt sich dann zum Beispiel abhängig machen, ob Daten in das Grid eingefügt werden sollen oder nicht.
+
Ergänzt Daten mittels eines Thread. Wird üblicherweise dazu verwendet, Daten aus anderen Datenbanken zu ergänzen.
  
 
'''Parameter'''
 
'''Parameter'''
  
* ccnd ("CountCondition") - Wenn Y, dann wird die Zeile gezählt. Default Y, Funktionen werden ersetzt.
+
* chg ("change") - Wenn Y, werden Zellen, die durch den Thread gefüllt werden, als geändert gekennzeichnet; default N, Funktionen werden ersetzt
* i ("item") - Name des Grid- oder XGrid-Segments
+
* cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
* n (name / number) - Name der Variable oder Nummer des Values, in die/den das Ergebnis geschrieben wird.
+
* db ("DataBase") - Datenbank, in der das Statement ausgeführt wird.
* sc ("SelectionColumn") - Index der Spalte, die als Selection-Column verwendet wird. Eine Zeile wird dann nur gezählt, wenn sie auch selektiert ist. Default ist -1, dann wird keine SelectionColumn verwendet.
+
* i ("item") - Name des VL-Segments; Funktionen werden ersetzt, default ist das zuletzt eingefügte Segment
 +
* k ("key") - Parameter im SQL-Statement; im VL-Segment muss es eine Spalte mit diesem Feldnamen geben.
  
 
'''Beispiel'''
 
'''Beispiel'''
  
  #grd_cnt  i=item  n=1  ccnd="$BOOL($PVAL(item,key,cntrow) > 5)"
+
  #sql select bezeichnung from rsd where aktion = $PVAL(vl,aktion)
 +
#vl_thread  db=ora_prod  i=vl
  
==#grd_lookuplivefill==
+
=Grid-Segmente=
  
Füllt aus einem SQL-Statement eine LookupLive-Nachschlageliste
+
Grid-Segmente sind Segmente, in denen in Tabellenform mehrere Datensätze einer Datenbanktabelle oder einer SQL-Abfrage angezeigt werden. Grid-Segmente können Kopf- und Fußzeilen haben (default 1 Kopfzeile, 0 Fußzeilen)
  
'''Parameter'''
+
==#grd_seg==
  
(keine)
+
Mit der Prozedur #grd_seg wird ein Grid-Segment angelegt.
 
 
'''Beispiel'''
 
 
 
#cmd_clear
 
#cmd #sql select ckey, cvalue from data_list_item
 
#cmd #sql    where data_list_id = '21DE9AF0-0C30-4222-A131-B855FAA85DEB' 
 
#cmd #sql      and (ckey = 1 or ckey <= $NVL($PVAL(grid,nummer,lookuplive),0))    order by csort
 
#cmd #grd_lookuplivefill
 
 
#grd_col  f=lookup  c1="Lookup"  y=lookuplive  llc=1
 
 
 
=XGrid-Segmente=
 
 
 
XGrid-Segmente sind Segmente, in denen in Tabellenform mehrere Datensätze einer SQL-Abfrage angezeigt werden. Dabei werden die Spalten durch eine andere SQL-Abfrage gebildet. Grid-Segmente können Kopf- und Fußzeilen haben (default 1 Kopfzeile, 0 Fußzeilen)
 
 
 
==#xgrd_seg==
 
 
 
Mit der Prozedur #xgrd_seg wird ein XGrid-Segment angelegt.
 
  
 
'''Parameter'''
 
'''Parameter'''
  
 +
* acmd (add command) - Kommando, das ausgeführt wird, wenn auf den Button + geklickt wird.
 
* clt (column line type) - Spezifiziert, ob Spalten verbreitert oder umgebrochen werden; default sf; Funktionen werden ersetzt
 
* clt (column line type) - Spezifiziert, ob Spalten verbreitert oder umgebrochen werden; default sf; Funktionen werden ersetzt
 
** mf - multi line fixed
 
** mf - multi line fixed
Zeile 1.271: Zeile 1.398:
 
* hrc (header row count) - Anzahl der Kopfzeilen; default 0; Funktionen werden ersetzt
 
* hrc (header row count) - Anzahl der Kopfzeilen; default 0; Funktionen werden ersetzt
 
* sc (selection column) - Spaltenindex der Selection-Zeile. Ein Grid-Segment kann eine Selection-Spalte haben, also eine Spalte vom Typ bool, mit deren Hilfe einzelne Zeilen ausgewählt werden können. Default ist -1, Funktionen werden ersetzt.
 
* sc (selection column) - Spaltenindex der Selection-Zeile. Ein Grid-Segment kann eine Selection-Spalte haben, also eine Spalte vom Typ bool, mit deren Hilfe einzelne Zeilen ausgewählt werden können. Default ist -1, Funktionen werden ersetzt.
 +
* whs (without horizontal scrollbar) - Blendet einen horizontalen Scrollbalken komplett aus, das Grid wird dadurch 20 Pixel weniger hoch.
  
Zusätzlich gibt es die Parameter aller Segmente.
 
  
'''Beispiel'''  
+
'''gemeinsame Parameter aller Segmenttypen'''
  
siehe unten
+
* b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
 
+
** A ("active") setzt in der mit sc spezifizierten Spalten alle Zellen auf Y; ist das Grid gefiltert, werden nur die gefilterten Zellen gesetzt.
==#xgrd_col==
+
** F ("filter") öffnet den Filter-Dialog
 +
** H ("history") öffnet den History-Dialog
 +
** I ("inactive") setzt in der mit sc spezifizierten Spalten alle Zellen auf N; es werden immer alle Zellen auf N gesetzt, auch wenn sie ausgefiltert sind
 +
** X ("xlsx") exportiert das Grid im xlsx-Format
 +
** Y exportiert das Grid im pdf-Format
 +
** + führt acmd aus (nur #grd_seg); wird üblicherweise dazu verwendet, einen Datensatz hinzuzufügen
 +
* c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
 +
* hp ("help path") - noch ohne Funtion
 +
* n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
 +
* mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
 +
* mho ("max height opened") - maximale Höhe im geöffneten Zustand
 +
* oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
 +
** c - Segment wird nur in geschlossenem Zustand angezeigt
 +
** o - Segment wird nur in geöffnetem Zustand angezeigt
 +
** oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
 +
* r ("rights") - Rechtedefinition
 +
* ro ("read only") - Der Anwender kann die Daten im Segment nicht ändern
  
Die Prozedur #xgrid_col definiert die fixen Spalten des Grid, die an der linken Seite stehen.
+
'''Beispiel'''
  
'''Parameter'''
+
#grd_seg  frc=0  fcc=1  clt=ss  mhc=300  n=item
  
Diese Prozedur gleich #grid_col, die Parameter sind dort beschrieben.
+
==#grd_col==
  
'''Beispiel'''
+
Mit der Prozedur #grd_col wird eine Spalte in einem Grid-Segment definiert.
 
 
siehe unten
 
 
 
==#xgrd_xcol==
 
 
 
Die Prozedur #xgrd_xcol definiert die X-Spalten, also die Spalten, die für jeden Datensatz der #xgrd_xdata eingefügt werden.
 
  
 
'''Parameter'''
 
'''Parameter'''
 +
* a (align) - Ausrichtung des Textes in der Spalte; default ist l.
 +
** c (center) - Text wird zentriert ausgerichetet
 +
** d2 (decimal 2) - Text wird rechtsbündig für zwei Nachkommastellen ausgerichtet
 +
** d4 (decimal 4) - Text wird rechtsbündig für vier Nachkommastellen ausgerichtet
 +
** l (left) - Text wird linksbündig ausgerichtet
 +
** r (right) - Text wird rechtsbündig ausgerichtet
 +
* a1, a2... (align) - [Header] Ausrichtung des Textes des Headers der Spalte der ersten, zweiten... Zeile. Zulässige Werte siehe Parameter a.
 +
* c (caption) - Spalten-Titel im Filter-Formular; Funktionen werden ersetzt. Bleibt dieser Parameter leer, so wird ersatzweise c1 verwendet.
 +
* c1, c2... (caption) - [Header] Spalten-Titel der ersten, zweiten... Zeile; Funktionen werden ersetzt.
 +
* ccc (CellColorCommand) - Kommando, das die Farbe der Zelle setzt.
 +
* ci (characters ignore) - Zeichen, die bei der Eingabe über die Tastatur ignoriert werden; default leer; Funktionen werden ersetzt
 +
* chg (change) - Kommando, das ausgeführt wird, wenn der Inhalt der Zelle geändert wird.
 +
* cmd (command) - Kommando, zum Beispiel für Verlinkung oder die Formatierung; Funktionen werden sofort ersetzt.
 +
** no_crlf - Zeilenumbüche werden durch Leerzeichen ersetzt
 +
** conv_yyyy - Datum im Format yyyymmddhhmmss wird nach dd.mm.yyyy hh:mm:ss und yyyymmdd nach dd.mm.yyyy konvertiert
 +
* cmdn (command no) - Kommando, zum Beispiel für Verlinkung; Funkionen werden erst bei Ausführung des Kommandos ersetzt; wird nur berücksichtigt, wenn cmd leer ist.
 +
* cs1, cs2... (ColSpan) - [Header] Die Zelle des Spaltentitels der ersten, zweiten... Zeile überspannt die angegebene Anzahl an Spalten. Default ist 1; Funktionen werden ersetzt.
 +
* cy (character type) - Groß- und Kleinschreibung; default ist n
 +
** l (lower case) - Spalte wird in Kleinbuchstaben dargestellt
 +
** n (normal) - Groß- und Kleinschreibung wie eingegeben
 +
** u (upper case) - Spalte wird in Großbuchstaben dargestellt
 +
* f (fieldname) - Feldname der Spalte in der Datenmenge; Funktionen werden ersetzt.
 +
* f1, f2... (fieldname) - [Header] Feldname des Spaltentitels der ersten, zweiten... Zeile; Funktionen werden ersetzt. Sind auch die Parameter c1, c2... gesetzt, dann werden die Texte zusammengefügt, wobei der Text aus c1, c2... vorangestellt wird.
 +
* fa1, fa2... (footer align) - [Footer] Ausrichtung des Textes der Fußzeile der Spalte der ersten, zweiten... Zeile. Zulässige Werte siehe Parameter a.
 +
* fc1, fc2... (footer caption) - [Footer] Spalten-Fußzeile der ersten, zweiten... Zeile. Ist im Text ein $-Zeichen enthalten, dann wird der Text als Zellen-Kommando interpretiert.
 +
* fcs1, fcs2... (footer ColSpan) - [Footer] Die Zelle der Fußzeile der ersten, zweiten... Zeile überspannt die angegebene Anzahl an Spalten. Default ist 1; Funktionen werden ersetzt.
 +
* ff1, ff2... (footer fieldname) - [Footer] Feldname des Fußzeile der ersten, zweiten... Zeile; Funktionen werden ersetzt. Sind auch die Parameter fc1, fc2... gesetzt, dann werden die Texte zusammengefügt, wobei der Text aus fc1, fc2... vorangestellt wird.
 +
* fh1, fh2... (footer hint) - [Footer] Feldname des Hint-Textes der Spalte der ersten, zweiten... Fußeile; Funktionen werden ersetzt. Gibt es in der Datenmenge keine Spalte dieses Namens, dann wird der Wert als Konstante ausgegeben.
 +
* fy1, fy2... (footer Typ) - [Footer] Datentyp des Datentyps der ersten, zweiten... Fußzeile; default ist text. Zulässige Werte siehe y.
 +
* h (hint) -  Feldname des Hint-Textes in der Datenmenge; Funktionen werden ersetzt.
 +
* h1, h2... (hint) - [Header] Feldname des Hint-Textes der Spalte der ersten, zweiten... Zeile; Funktionen werden ersetzt. Gibt es in der Datenmenge keine Spalte dieses Namens, dann wird der Wert als Konstante ausgegeben.
 +
* jy (join type) - Im Standardfall werden bei Join-Gruppierung die Daten durch Kommata getrennt dargestellt. Sie können jedoch auch summiert werden, dafür ist jy=sum  zu setzen.
 +
* l (length) - Maximale Länge in Zeichen bei der Eingabe
 +
* ld (LookupData) - Name der Nachschlageliste beim Spaltentyp y=lookup
 +
* llc (LookupLiveCommand) - Name oder Nummer des Kommandos, das beim Spaltentyp y=lookuplive verwendet wird; ls und ls dürfen nicht gesetzt werden
 +
* ls (LookupSpecial) - Name des Specials (hinterlegte SQL-Anweisung in xspecial), wird nur berücksichtigt, wenn ld nicht gesetzt ist
 +
* nd (no data) - Spalte wird beim Speichern nicht berücksichtigt; Änderungen versetzen das Grid auch nicht in den Zustand changed.
 +
* nv ("no value") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist
 +
* nvc ("no value change") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment in den Changed-Modus gesetzt
 +
* nvi ("no value insert") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment auch in den Insert-Modus gesetzt
 +
* nvic ("no value insert change") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment in den Insert- und Changed-Modus gesetzt
 +
* q (quelle) - Datenquelle für das Grid.
 +
** j, join - Daten aus einem Datenbank-Join werden gruppiert dargestellt
 +
** s, sql - SQL-Statement
 +
** t, tbl, tab, table - Datenbanktabelle
 +
* r (right) - Rechtedefinition der Spalte. Sofern nur ein Leserecht vorliegt, wird die Spalte ReadOnly. Sofern kein Recht vorliegt, wird die Spalte ausgeblendet und auch nicht in der Historie angezeigt.
 +
* ro (ReadOnly) - Wenn Y, dann kann die Spalte nicht beschrieben werden.
 +
* rof (ReadOnlyField) - Wenn der Inhalte der angegebenen Datenbankspalte Y ist, dann kann die betreffende Zelle nicht beschrieben werden.
 +
* ss1, ss2... (SortSymbols) - [Header] Mit Mausklick auf den Spaltentitel kann nach dieser Spalte sortiert werden, mit einem weiteren Mausklick die Sortierrichtung umgekehrt werden. Es werden dabei entsprechend Symbole rechts im Spaltentitel angezeigt. Um eine Sortierung zu verhinden, kann ss1, ss2... auf N gesetzt werden. Funktionen werden ersetzt.
 +
* w (width) - Breite der Spalte in Pixel; Funktionen werden ersetzt.
 +
* wst (width stretch) - Anzahl von Pixel, welche die Spalte maximal verbreitert wird, wenn Platz dafür da ist. Voraussetzung dafür ist, dass der Parameter clt von #grd_seg den Wert ss oder ms hat. Funktionen werden ersetzt.
 +
* y (typ) - Datentyp der Spalte; default ist text
 +
** bool - bool'sche Felder mit Y und N; wird als Checkbox dargestellt
 +
** bool2 - bool'sche Felder, Y wird als angehakte Checkbox dargestellt, N als leeres Feld
 +
** curr - Currency, also Zahlen mit zwei Nachkommastellen
 +
** curr4 - Zahlen mit vier Nachkommastellen
 +
** date - Datum im Format dd.mm.yyyy
 +
** datemin - Datum im Format dd.mm.yyyy hh:mm
 +
** datesec / datesek - Datum im Format dd.mm.yyyy hh:mm:ss
 +
** guid - Inhalt wird als drei Punkte dargestellt; wird für GUIDs verwendet, die sich dann aber kopieren lassen
 +
** iban - noch nicht implementiert
 +
** int - Integer, also ganze Zahlen
 +
** link - Link-Symbol
 +
** lookup - Nachschlageliste
 +
** lookuplive - Nachschlageliste, die beim Öffnen neu und auch für jede Zelle individuell geladen wird
 +
** text - normaler Text
 +
** todo - Symbole für ToDo-Listen
 +
** triex - drei Symbole: 0, ? und !
 +
** triplus - drei Symbole: 0, - und +
 +
* xw (xlsx width) - Spaltenbreite, wenn das Segment im Excel-Format exportiert wird; wenn leer, wird statt dessen w verwendet; Funktionen werden ersetzt
 +
* yf (Y fieldname) - Feldname der Spalte in einer zusätzlichen Datenmenge; Funktionen werden ersetzt.
 +
 +
'''Beispiele'''
 +
 +
#grd_col  f=translate_list_item_id  c1=ID  w=30  y=guid  ro=Y  nvi=$GUID()
 +
#grd_col  f=user_group_id  c1=$T(group)  y=lookup  ls=system_groups_all  w=200  wst=200
 +
#grd_col  f=dubletten  y=int  w=30  a=r  c1="D"  h1="Dubletten"  ccc=$CCI(!,,1)
  
Diese Prozedur gleich #grid_col, die Parameter sind dort beschrieben.
+
==#grd_data==
 
 
'''Beispiel'''
 
 
 
siehe unten
 
 
 
==#xgrd_xdata==
 
 
 
Mit #xgrd_xdata werden die variablen Spalten des Grids angelegt. Für jede Zeile der mit #xgrd_xdata geöffneten SQL-Abfrage wird ein Satz von den mit #xgrd_xcol angelegten Spalten angelegt.
 
 
 
'''Parameter'''
 
 
 
* db ("DataBase") - Name der Datenbankverbindung, aus der die Daten bezogen werden; Funktionen werden ersetzt, default ist die Standard-Datenbankverbindung
 
* Prefix k - Prefix für SQL-Parameter
 
 
 
'''Beispiel'''
 
 
 
siehe unten
 
 
 
==#xgrd_data==
 
 
 
Mit #xgrd_data werden Zeilen des Grids angelegt.
 
 
 
'''Parameter'''
 
 
 
* db ("DataBase") - Name der Datenbankverbindung, aus der die Daten bezogen werden; Funktionen werden ersetzt, default ist die Standard-Datenbankverbindung
 
* k (key) - Name der Schlüsselspalte; per default der Tabellennamen plus ein angehängtes _id; Funktionen werden ersetzt
 
* k2, k3... - Name der Schlüsselspalten weiterer Tabellen; per default der Tabellennamen plus ein angehängtes _id
 
* Prefix k - Prefix für SQL-Parameter
 
* ocd (open cat on data) - Wenn Y, wird die übergeordnete Kategorie geöffnet, wenn das Grid Daten enthält; default N; Funktionen werden ersetzt
 
* t (table) - Name der Datenbanktabelle, in welche die Daten beim Speichern zurückgeschrieben werden; Funktionen werden ersetzt
 
* t2, t3... - Tabellennamen weiterer Tabellen
 
 
 
'''Beispiel'''
 
 
 
siehe unten
 
 
 
==Beispiel==
 
 
 
Für das Beispiel werden die folgenden drei Tabellen verwendet, zwei Detail-Tabellen und eine Verknüpfungstabelle:
 
 
 
create table sd_cross_x (
 
  sd_cross_x_id varchar(40) not null primary key,
 
  name varchar(40) not null,
 
  datechg date,
 
  usrchg varchar(40),
 
  progchg varchar(40)     
 
);
 
 
create table sd_cross_y (
 
  sd_cross_y_id varchar(40) not null primary key,
 
  name varchar(40) not null,
 
  datechg date,
 
  usrchg varchar(40),
 
  progchg varchar(40)     
 
);
 
 
create table sd_cross_xy (
 
  sd_cross_xy_id varchar(40) not null primary key,
 
  sd_cross_x_id varchar(40) not null,
 
  sd_cross_y_id varchar(40) not null,
 
  active char(1),
 
  remarks varchar(40),
 
  datechg date,
 
  usrchg varchar(40),
 
  progchg varchar(40)     
 
);
 
  
Damit wollen wir das folgende Formular erstellen:
+
Füllt das Grid mit Daten aus der Dankenbank.
  
[[file:demo xgrid.png|1000px|Demo XGrid]]
+
'''Parameter'''
  
Damit die Änderungen in den Detail-Tabellen gleich nach dem Speichern im XGrid sichtbar werden, wird bei der Page der Parameter ras ("RefreshAfterSave") gesetzt.
+
* c ("Caption") - Beschriftung des Segments, wenn der Thread ausgeführt wurde; nur für thread und xmlthread; Funktionen werden ersetzt
 +
* db ("DataBase") - Name der Datenbankverbindung, aus der die Daten bezogen werden; Funktionen werden ersetzt, default ist die Standard-Datenbankverbindung
 +
* gc (grid cache) - Erhält dieser Paremeter einen Wert, dann wird das SQL-Statement nur beim erstmaligen Aufruf von #grd_data ausgeführt. Die Daten werden dann in einem Cache gespeichert, so dass erneute Aufrufe weniger lange dauern. Der Inhalt das Parameters wird als Name für die Seite im Cache verwendet und muss eindeutig sein - im Zweifelsfall verwendet man eine GUID. Hinweise: Wenn weitere Spalten der Abfrage und dem Grid hinzugefügt werden, bleiben diese erste mal leer. Auch Veränderungen der Daten durch andere User bleiben erst mal unsichtbar. Ein erneuter Start der BAF-Clients führt zu einem leeren Cache und somit zur erneuten Ausführung des SQL-Statements.
 +
* ior (insert one row) - Wenn Y, wird eine (leere) Zeile eingefügt, wenn die Datenmenge leer ist; default N; Funktionen werden ersetzt
 +
* jk (join key) - Feldname der Spalte, nach der bei q=j gruppiert wird
 +
* k (key) - Name der Schlüsselspalte; per default der Tabellennamen plus ein angehängtes _id; Funktionen werden ersetzt
 +
* k2, k3... - Name der Schlüsselspalten weiterer Tabellen; per default der Tabellennamen plus ein angehängtes _id
 +
* Prefix k - Prefix für SQL-Parameter
 +
* m ("maximum") - Nach dieser Anzahl von Zeilen wird abgebrochen; default MaxInt (2 147 483 647), Funktionen werden ersetzt
 +
* mk ("merge key") - Die Spalte, die das Entscheidungskriterium bei q=merge beinhaltet.
 +
* ocd (open cat on data) - Wenn Y, wird die übergeordnete Kategorie geöffnet, wenn das Grid Daten enthält; default N; Funktionen werden ersetzt
 +
* q (quelle) - Herkunft der Daten
 +
** j - Join
 +
** json - Das Grid wird mit einem geparsten JSON gefüllt
 +
** sql - SQL-Statement
 +
** sqladd / add - SQL-Statement, fügt Daten zu einem Grid hinzu; somit können die Daten aus zwei unterschiedlichen SQL-Statements kommen, die ggf. auch auf unterschiedlichen Datenbanken ausgeführt werden können
 +
** sqlmerge / merge - SQL-Statement, fügt wie ''sqladd'' Daten zu einem Grid hinzu, hier aber unter Berücksichtigung der im Parameter mk spezifizierten Spalte: Ein Datensatz wird nur dann hinzugefügt, wenn es noch keine Zeile mit dem entsprechenden Wert gibt.
 +
** t - Table
 +
** thread - ein SQL-Statement wird in einem Hintergrund-Thread ausgeführt
 +
** xml - Das Grid wird mit einem geparsten XML gefüllt
 +
** xmlthread - In einem Hintergrundthread wird mit http(s) ein XML geholt, dieses geparst und damit das Grid gefüllt.
 +
* sc (SaveCommand) - Kommando das ausgeführt wird, wenn das Grid gespeichert werden soll; nur für xml und xmlthread
 +
* t (table) - Name der Datenbanktabelle, in welche die Daten beim Speichern zurückgeschrieben werden; Funktionen werden ersetzt
 +
* t2, t3... - Tabellennamen weiterer Tabellen
  
#page  ras=Y
 
  
Wir verwenden hier in einer Primär-Region zwei Kategorien, links für die Spalten (X), rechts für die Reihen (Y). Die beiden Kategorien werden also nebeneinander angezeigt.
+
'''Beispiele'''
 +
 
 +
#grddata  q=sql  t=translate_list_item  kid=$FND(s,data_list_item_id)
 +
 
 +
#text_clear
 +
#text <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.xxxxxxxxxxxxxxxxxx.de/">
 +
#text    <soapenv:Header/>
 +
#text    <soapenv:Body>
 +
#text      <web:searchCustomer>
 +
#text          <searchCustomerRequest>
 +
#text          <postalCode>31582</postalCode>
 +
#text          </searchCustomerRequest>
 +
#text      </web:searchCustomer>
 +
#text    </soapenv:Body>
 +
#text </soapenv:Envelope>
 +
#code  url=https://xxxxxxxxxxxxxxxxxx.de/ITAPIWebservice/xxxxxxxxxxInterface?doAgencyLogin
 +
#code  e_res=ansi
 +
#http_request  y=post    cy="application/xml"  request=$TEXT(1)   response=resp  se=Y  acc=application/xml    $CODE$
 +
#xml_parse  xml=$VAR(resp)
 +
#grd_data  q=xml    pfx=customer  path=soap:Envelope.soap:Body.ns2:searchCustomerResponse.searchCustomerResponse  sc=xbaftest_save_soap
 +
 
 +
#text_clear
 +
#text <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.xxxxxxxxxxxxxxxxxx.de/">
 +
#text    <soapenv:Header/>
 +
#text    <soapenv:Body>
 +
#text      <web:searchCustomer>
 +
#text          <searchCustomerRequest>
 +
#text          <postalCode>31582</postalCode>
 +
#text          </searchCustomerRequest>
 +
#text      </web:searchCustomer>
 +
#text    </soapenv:Body>
 +
#text </soapenv:Envelope>
 +
#code  url=https://xxxxxxxxxxxxxxxxxx.de/ITAPIWebservice/xxxxxxxxxxInterface?doAgencyLogin
 +
#code  e_res=ansi
 +
#code  y=post    cy="application/xml"  request=$TEXT(1)  response=resp  se=Y   acc=application/xml 
 +
#grd_data  q=xmlthread    pfx=customer  path=soap:Envelope.soap:Body.ns2:searchCustomerResponse.searchCustomerResponse  sc=xbaftest_save_soap    $CODE$
  
Jede Kategorie hat ein Button-Segment mit einem Button, mit dem jeweils ein neuer Datensatz angelegt werden kann. Dazu muss lediglich die Prozedur #grd_add aufgerufen werden.
+
==#grd_add==
  
Die Tabellen hier im Beispiel haben (neben den Standard-Spalten _id, datechg, usrchg und progchg) lediglich einen Namen. Damit die ID-Spalte mit einer GUID versorgt wird, wird diese für den Parameter nvi ("NullValue Insert") erzeugt; bei der Gelegenheit wird die Zeile dann gleich als neu eingefügt gekennzeichnet.
+
Fügt einem Grid-Segment eine weitere Reihe hinzu.
  
#prim  as=Y 
+
Hinweis: Die Primärschlüsselspalte wird üblicherweise nicht in der Prozedur #grd_add gesetzt, sondern mit dem Parameter nvi in der Prozedur #grd_col.
#cat  as=Y    c=X
+
 
#btns_seg 
+
'''Parameter'''
#btns_btn  c="$T(Add item)"  w=150  cmd="#grd_add   i=gridx"
 
 
#grd_seg  frc=0  fcc=1  clt=ss  n=gridx  c=" "  b=XYH 
 
#grd_col  f=sd_cross_x_id  c1=ID  w=30  y=guid  ro=Y    nvi=$GUID()
 
#grd_col   f=name  c1="Name"  l=40  w=100  wst=500  xw=400
 
#sql select * from sd_cross_x  order by name
 
#grd_data  q=sql  t=sd_cross_x
 
 
#cat  as=Y    c=Y
 
#btns_seg 
 
#btns_btn  c="$T(Add item)"  w=150  cmd="#grd_add  i=gridy"
 
 
#grd_seg  frc=0  fcc=1  clt=ss  n=gridy  c=" "  b=xYH
 
#grd_col  f=sd_cross_y_id  c1=ID  w=30  y=guid  ro=Y  nvi=$GUID()
 
#grd_col  f=name  c1="Name"  l=40  w=100  wst=500  xw=400
 
#sql select * from sd_cross_y  order by name
 
#grd_data  q=sql  t=sd_cross_y 
 
  
Die zweite Primärregion beinhaltet das XGrid, mit dem die Verknüpfung angezeigt wird. Nach der Prozedur #xgrd_seg werden mit #xgrd_col erst mal die beiden fixen Spalten definiert, die ID und der Name (der Reihe).
+
* chg ("change") - Wenn Y, wird die neue Reihe gleich in den Changed-Modus gesetzt; default N; Funktionen werden ersetzt
 +
* f_ ("field) - Prefix für die Feldnamen der Spalten, deren Werte gesetzt werden sollen
 +
* i ("item") - Name des Grid-Segments
 +
* sc ("selected column") - Index oder Feldname der Spalte, deren Zelle im Anschluss an die Einfügeoperation selektiert werden soll. Wenn leer, wird die Selektierung nicht verändern. Funktionen werden ersetzt, default leer.
 +
* y - Typ der Einfügeoperation; Funktionen werden ersetzt; default bottom
 +
** asel ("after selected") - die neue Zeile wird nach der selektierten Zeile eingefügt
 +
** bottom - die neue Zeile wird unten angehängt
 +
** bsel ("before selected") - die neue Zeile wird vor der selektierten Zeile eingefügt
 +
** top - die neue Zeile wird als erste Zeile eingefügt
  
Danach werden die variablen Spalten mit #xgrd_xcol definiert und mit #xgrd_xdata angelegt. Als erste Spalte in einem solchen Spaltensatz wird eine Spalte für die IDs eingefügt. Diese hat üblicherweise die Breite w=0, da die IDs nicht interessieren. Zum Debuggen kann diese Spalte jedoch breiter gemacht werden. Diese "unsichtbare" Spalte hat als Feld f die ID der Verknüpfungstabelle, hier also f=sd_cross_xy_id. Als Feld für die erste Headerzeile f1 muss die ID der X-Datenmenge, hier also f1=sd_cross_x_id.
+
'''Beispiel'''
  
Bei den weiteren Spalten besteht die Freiheit des Programmierers. Hier im Beispiel wird eine bool'sche Spalte für die Verknüpfung sowie eine Anmerkungsspalte eingefügt. Mit cs1=2 bei der bool'schen Spalte wird die Überschrift über beide Spalten gezogen.
+
#grd_add  i=todo_add  f_ref=$VAR(todo_id)  f_ref_text=$VAR(todo_text)  f_ref_hint=$VAR(todo_hint)  f_status=1
  
#prim  as=
+
==#grd_loop==
#cat  as=Y    c=XY
+
 
+
Die Prozedur #grd_loop führt eine Schleife über alle oder alle selektierten Reihen eines Grid-Segments durch.
#xgrd_seg  frc=0  fcc=1  clt=ss  n=gridxy  c=" "  b=XYH
+
 
#xgrd_col  f=sd_cross_y_id  c1=ID  w=30  y=guid  ro=Y
+
'''Parameter'''
#xgrd_col  f=yname  c1="name"  w=80  nd=Y  ro=Y
+
 
+
* er (each row) - Kommando, das für jede oder jede selektierte Zeile des Grids ausgeführt wird.
#xgrd_xcol  f1=sd_cross_x_id  f=sd_cross_xy_id  w=0  y=guid  ro=Y
+
* ert (each row transaction) - Wenn Y, dann wird jeder Aufruf des mit er festgelegten Kommandos in einer Transaktion gekapselt
#xgrd_xcol  f1=name  cs1=2  f=active  y=bool  w=30  xcs1=2
+
* i (item) - Name des Grid-Segments
#xgrd_xcol  f=remarks  l=40 
+
* nkomma - In eine Variable dieses Namens wird bei jedem Schleifendurchlauf mit Ausnahme des letzten Schleifendurchlaufs ein Komma geschrieben; default leer, Funktionen werden ersetzt. Wird üblicherweise dazu verwendet, um aus einem Grid eine Liste zu machen, bei der die einzelnen Elemente durch ein Komma getrennt sind, aber kein Komma hinter dem letzten Element stehen soll. Werden andere Trennzeichen benötigt, lässt sich diese mit $VT() bewerkstelligen.
#sql select * from sd_cross_x order by name
+
* sc (selection column) - Index der Selection-Column; Wenn damit eine Spalte angegeben wird, dann wird das mit er festgelegte Kommando nur ausgeführt, wenn der Werte dieser Spalte in der betreffenden Reihe Y ist; default ist -1; Funktionen werden ersetzt.
#xgrd_xdata 
+
 
 +
'''Beispiel'''
  
Für die Daten im XGrid brauchen wir zunächst ein SQL-Statement, das aus den beiden Detail-Datenmengen ein kartesisches Produkt (Mengenprodukt) erstellt; dafür sehen wir im Statement die Verknüpfungsbedingung 1=1 (die nur deswegen eingefügt ist, damit formal eine Verknüpfungsbedingung vorhanden und das SQL-Statement syntaktisch korrekt ist). Mit einem left outer join wird die Verknüpfungstabelle hinzugefügt (kein inner join, da anfangs ja die Datensätze noch nicht vorhanden sind).
+
#grd_loop  i=grid  er=1   sc=0
  
Mit der Prozedur #xgrd_data werden die Daten dann aus der Ergebnismenge geladen. Wir müssen hier die Tabellen t angeben, in welche die Daten zurückgeschrieben werden (also in die Verknüpfungstabelle, hier t=sd_cross_xy), welches die ID für die Spalten ist (hier fcol=sd_cross_x_id, das muss übereinstimmen mit f1=sd_cross_x_id in der 0-breiten ersten Spalte des Spalten-Sets), und wann eine neue Zeile begonnen wird (frow=sd_cross_y_id). Damit Letzteres korrekt funktioniert, muss die erste Sortierung im Statement nach den Reihen sein (hier order by y.name)
+
==#grd_calc==
  
  #sql select y.sd_cross_y_id, y.name as yname, x.sd_cross_x_id, x.name as xname, c.sd_cross_xy_id, c.active, c.remarks
+
Zählt die Zeilen in einem Grid oder berechnet eine Funktion. Es kann dabei eine Bedingung formuliert werden, welche Datensätze gezählt werden sollen.
  #sql  from sd_cross_y y
+
 
 +
Diese Prozedur kann auch dazu verwendet werden, um zu ermitteln, ob eine bestimmte Zeile schon im Grid vorhanden ist oder nicht. Davon lässt sich dann zum Beispiel abhängig machen, ob Daten in das Grid eingefügt werden sollen oder nicht.
 +
 
 +
'''Parameter'''
 +
 
 +
* ccnd ("CalcCondition") - Wenn Y, dann wird die Zeile berücksichtigt. Default Y, Funktionen werden ersetzt. Auf die aktuelle Zeile kann mit der Sonderzeile ''calcrow'' zugegriffen werden. Üblicherweise muss die Funktion $BOOL() verwendet werden, um eine Bedingung auszuwerten, siehe Beispiel.
 +
* col - Index der Spalte. Wenn nicht gesetzt, wird der Feldname verwendet. Wird beim Typ cnt nicht benötigt.
 +
* f ("fieldname") - Feldname der Spalte. Wird nur verwendet, wenn col nicht gesetzt ist. Wird beim Typ cnt nicht benötigt.
 +
* i ("item") - Name des Grid- oder XGrid-Segments
 +
* n (name / number) - Name der Variable oder Nummer des Values, in die/den das Ergebnis geschrieben wird.
 +
* ocr (OnlyChangedRows) - Wenn Y, werden nur Zeilen bei der Berechnung berücksichtigt, die geändert wurden; default N. Wird gerne in Kombination mit page_check verwendet, um zu prüfen, ob alle geänderten Zeilen den formulierten Anforderungen genügen. Siehe Beispiel.
 +
* ry ("result type") - Ergebnistyp; default ist int, Funktionen werden ersetzt.
 +
** curr - zwei Nachkommastellen
 +
** curr4 - vier Nachkommastellen
 +
** int - keine Nachkommastelle
 +
* sc ("SelectionColumn") - Index der Spalte, die als Selection-Column verwendet wird. Eine Zeile wird dann nur gezählt, wenn sie auch selektiert ist. Default ist -1, dann wird keine SelectionColumn verwendet.
 +
* y - Typ der Operation. Funktionen werden ersetzt, default ist cnt
 +
** avg - Durchschnitt
 +
** cnt - Anzahl
 +
** min - Minimum
 +
** max - Maximum
 +
** sum - Summe
 +
 
 +
'''Beispiele'''
 +
 
 +
#grd_calc  i=item  n=1  ccnd="$BOOL($PVAL(item,key,cntrow) > 5)"
 +
 
 +
In Kombination mit #page_check
 +
 
 +
#page_check  y=e  chk="$EXEC(xm_konfiguration_check(partner_g))"        c="Codes, die mit G beginnen, müssen der Channel Group 'Partner' zugeordnet werden."
 +
 
 +
-- in xm_konfiguration_check
 +
~ $ICP(0,partner_g)
 +
#grd_calc  n=1  i=grid  ocr=Y  ccnd="$BOOL($COPY($PVAL(grid,code,calcrow),1,1) = G  and  $PVAL(grid,channel_group,calcrow) <> P)"
 +
#var_set  n=result  z="$BOOL($VAL(1) = 0)"
 +
 +
~~
 +
 
 +
==#grd_lookuplivefill==
 +
 
 +
Füllt aus einem SQL-Statement eine LookupLive-Nachschlageliste
 +
 
 +
'''Parameter'''
 +
 
 +
* db ("DataBase") - Name der Datenbankverbindung, aus der die Daten bezogen werden; Funktionen werden ersetzt, default ist die Standard-Datenbankverbindung
 +
 
 +
'''Beispiel'''
 +
 
 +
#cmd_clear
 +
#cmd #sql select ckey, cvalue from data_list_item
 +
#cmd #sql    where data_list_id = '21DE9AF0-0C30-4222-A131-B855FAA85DEB' 
 +
#cmd #sql      and (ckey = 1 or ckey <= $NVL($PVAL(grid,nummer,lookuplive),0))    order by csort
 +
#cmd #grd_lookuplivefill
 +
 +
#grd_col  f=lookup  c1="Lookup"  y=lookuplive  llc=1
 +
 
 +
==#grd_paste==
 +
 
 +
Fügt Daten aus der Zwischenablage in ein Grid-Segment ein.
 +
 
 +
'''Parameter'''
 +
 
 +
* add - Wenn Y, werden die über die Zwischenablage zugewiesenen Zeilen hinzugefügt, andernfalls ersetzt; Funktionen werden ersetzt, default N;
 +
* cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 +
* f_ ("field") - Prefix für Spalten, denen im Anschluss ein Wert zugewiesen wird; beginnt der Wert mit ''row'' (zum Beispiel f_cvalue=row1), dann wird die folgende Zahl als 0-relativer Spaltenindex in den eingefügten Daten interpretiert, andernfalls wird der zugewiesene Wert direkt eingefügt, wobei Funktionen ersetzt werden.
 +
* fr ("first row") - Als erste Zeile muss der angegebene String gepastet werden, sonst wird die Verarbeitung abgebrochen; wenn fr nicht gesetzt ist, wird die erste Zeile nicht geprüft und statt dessen wir eine normale Datenzeile behandelt;Funktionen werden ersetzt, default leer.
 +
* frow - Index der Spalte in den eingefügten Daten, der in der Grid-Spalte fxrow gesucht wird. Wird nur bei y=r verwendet.
 +
* frowpre, frowpost - Prefix und Postfix für frow, nur bei y=r. Wenn der mittels frow ermittelte Indexwert mit dem durch fxrow spezifizierten Wert im Grid verglichen wird, dann wird vor diesen Wert frowpre und nach diesem Wert frowpost eingefügt.
 +
* fxrow - Feldname (f) der Spalte, mit deren Hilfe jeweilige Reihe identifiziert werden soll. Bei y=r muss dieser Parameter gesetzt werden.
 +
* ige ("ignore empty") - Wenn Y, werden leere Zeilen ignoriert; default N, Funktionen werden ersetzt.
 +
* lat ("lookup as text") - Wenn Y, dann werden für Lookup-Spalten nicht die Schlüssel, sondern die Werte gepastet, der Import ermittelt daraus dann die Schlüssel; default N, Funktionen werden ersetzt.
 +
* sep ("separator") - Trennzeichen, mit denen innerhalb einer Zeile die Spalten getrennt werden; Funktionen werden ersetzt, default ist ein Tab-Zeichen
 +
* trim - Wenn Y, werden vor dem Einfügen alle Werte getrimmt, es werden also insbesondere führende oder anhängende Leerzeichen entfernt; default N, Funktionen werden ersetzt.
 +
* y - Typ
 +
** c ("column") - Die Spalten werden entsprechend der Definition zugeordnet
 +
** d ("direct") - Spalten und Reihen werden so eingefügt, wie sie in der Zwischenablage sind; Link- und Button-Spalten werden ignoriert. Mit f_fieldname=wert definierte Werte werden anschließend den entsprechenden Spalten zugewiesen.
 +
** r ("row") - Mittels fxrom und frow wird die Reihe im Grid-Segment ermittelt, welcher die Werte aus der aktuellen Zeile zugewiesen werden sollen. Sofern eine solche Reihe nicht gefunden wird und(!) add=Y ist, wird die Reihe neu angelegt und dann mit Werten befüllt.
 +
 
 +
'''Beispiele'''
 +
 
 +
#grd_paste  y=c    i=item  ige=Y  add=Y  f_ckey=row0  f_cvalue=row1  f_csort=row2  f_status=1
 +
#grd_paste  y=r    i=grid  fxrow=datum    frow=0  f_ft_sperren=row1  fr=$FND(aktion)
 +
#grd_paste  y=r    ige=Y  add=Y  lat=Y  i=grid  frow=0  fxrow=code  f_code=row0  f_target=row1  f_channel_type=row2  f_channel_group=row3  f_channel=row4
 +
 
 +
==#grd_ac==
 +
 
 +
Die Prozedur #grd_ac fügt einem Grid eine Zeile hinzu und setzt dort die Werte ("add") oder ändert nur die Werte ab ("change"), abhängig davon, ob der mit fnd_1 bis fnd_9 definierte Datensatz bereits vorhanden ist oder nicht.
 +
 
 +
'''Parameter'''
 +
 
 +
* chg ("change") - Wenn Y, werden die Zellen in den Changed-Modus gesetzt, auch wenn sich ihr Wert nicht ändert; default N; Funktionen werden ersetzt
 +
* cnd - ("condition") Die Prozedur wird nur dann ausgeführt, wenn das Statement in cnd Y ergibt. Default ist Y, Funktionen werden ersetzt
 +
* f_ ("field) - Prefix für die Feldnamen der Spalten, deren Werte gesetzt werden sollen; Funktionen werden ersetzt
 +
* fnd_1 bis fnd_9 - Namen der Spalten, anhand die Zeile identifiziert wird; es wird die erste Zeile verwendet, auf die diese Bedingung zutrifft; Funktionen werden ersetzt
 +
* i ("item") - Name des Grid-Segments
 +
* ic ("IgnoreCase") - bei der Prüfung mit fnd_1 bis fnd_9 bleiben Groß- und Kleinschreibung unberücksichtigt
 +
* y - Typ der Einfügeoperation; Funktionen werden ersetzt; default bottom
 +
** asel ("after selected") - die neue Zeile wird nach der selektierten Zeile eingefügt
 +
** bottom - die neue Zeile wird unten angehängt
 +
** bsel ("before selected") - die neue Zeile wird vor der selektierten Zeile eingefügt
 +
** top - die neue Zeile wird als erste Zeile eingefügt
 +
 
 +
'''Beispiel'''
 +
 
 +
#cmd_clear2 #grd_ac  i=grid  fnd_1=adrnr  fnd_2=aktion  f_adrnr=$SEPLINE(0)  f_aktion=$SEPLINE(1)  f_add_1=$SEPLINE(2)  f_add_2=$SEPLINE(3) 
 +
#btns_btn  c="Kunden aus Zwischenablage"  w=200  cmd="#csv_paste  er=2"  se=bcp
 +
 
 +
==#grd_sort==
 +
 
 +
Sortiert das Grid nach der angegebenen Spalte. Das kann beispielsweise erforderlich sein, wenn ein Grid mit zwei #grd_data-Prozeduren gefüllt wird, so dass nicht mit einer ORDER BY-Klausel sortiert werden kann.
 +
 
 +
'''Parameter'''
 +
 
 +
* f (field) - Feldname der Spalte, nach der sortiert werden soll
 +
* i (item) - Name des Grids, das sortiert werden soll
 +
* y - Sortierreihenfolge (u oder d, entsprechend der Symbole an der Spalte, wenn manuell sortiert wird)
 +
 
 +
'''Beispiel'''
 +
 
 +
#grd_sort  i=grid  f=aktion  y=d
 +
#grd_sort  i=grid  f=adrnr  y=d
 +
 
 +
Diese beiden Zeilen entsprechen einem ORDER BY adrnr, aktion
 +
 
 +
==#grd_pos==
 +
 
 +
Ermittelt die Zeilennummer der ersten Zeile, auf welche die Such-Kriterien zutreffen
 +
 
 +
'''Parameter'''
 +
 
 +
* f_ (field) - Prefix der Spaltenbezeichner, die das Suchkriterium bilden. Als Wert des Parameters wird dann der Wert übergeben, nach dem in dieser Spalte gesucht werden soll.
 +
* i (item) - Name des Grids, in dem gesucht wird
 +
* res (result) - Name der Variable oder Nummer des Values, in die das Suchergebnis (Y oder N) geschrieben wird
 +
* row - Name der Variable oder Nummer des Values, in welche die Reihennummer geschrieben wird.
 +
 
 +
'''Beispiel'''
 +
 
 +
#grd_pos  i=grid  f_adrnr=$SEPLINE(0)  f_isocode=$SEPLINE(1)  f_status=1  res=1  row=2
 +
 
 +
==#grd_dub==
 +
 
 +
Ermittelt, ob in einer Spalte oder einer Spaltenkombination Duletten auftreten.
 +
 
 +
Mit ccnd, ocr und sc kann die Menge der Zeilen eingeschränkt werden, die geprüft wird. Dubletten werden nur innerhalb der Reihen gefunden, die geprüft werden. Üblicherweise werden die ocr und sc nicht verwendet.
 +
 
 +
Wenn auf mehrere Spalten geprüft wird, dann wird dieselbe Kombination alles Spalten als Dublette erkannt. (Die Zellenwerte werden zu einem langen String zusammengefügt und dabei mit ~@~ getrennt.)
 +
 
 +
'''Parameter'''
 +
 
 +
* ccnd ("CheckCondition") - Wenn Y, dann wird die Zeile bei der Prüfung berücksichtigt. Default Y, Funktionen werden ersetzt. Auf die aktuelle Zeile kann mit der Sonderzeile ''calcrow'' zugegriffen werden. Üblicherweise muss die Funktion $BOOL() verwendet werden, um eine Bedingung auszuwerten, siehe Beispiel.
 +
* cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 +
* cnt ("count") - Anzahl der Spalten oder Feldnamen, die verwendet werden
 +
* col1, col2... - Index der Spalte. Wenn nicht gesetzt, wird der Feldname verwendet; Funktionen werden ersetzt
 +
* d1, d2... ("dublette") -  Name der Variable oder Nummer des Values, in welche(n) die erste gefundene Dublette geschrieben wird; Funktionen werden ersetzt
 +
* f1, f2... ("fieldname") - Feldname der Spalte. Wird nur verwendet, wenn col nicht gesetzt ist.
 +
* i (item) - Name des Grids, in dem gesucht wird
 +
* n - Name der Variable oder Nummer des Values, in welche(n) das Prüfungsergebnis geschrieben wird (Y - mindestens eine Dublette, N - keine Dublette); Funktionen werden ersetzt
 +
* ocr (OnlyChangedRows) - Wenn Y, werden nur Zeilen bei der Berechnung berücksichtigt, die geändert wurden; default N.
 +
* sc ("SelectionColumn") - Index der Spalte, die als Selection-Column verwendet wird. Eine Zeile wird dann nur geprüft, wenn sie auch selektiert ist. Default ist -1, dann wird keine SelectionColumn verwendet; Funktionen werden ersetzt
 +
 
 +
'''Beispiel'''
 +
 
 +
#code  ccnd="$BOOL($PVAL(reisen,status,calcrow) = 1  and $IN($PVAL(reisen,reise_jahr_id,calcrow),30211BFC-A87D-4C07-9D7E-A92B07C52377) = N)"
 +
#grd_dub  i=reisen  n=result  cnt=2  f1=reise_jahr_id  f2=kgr  $CODE$
 +
 
 +
==#grd_thread==
 +
 
 +
Lädt Daten aus einem Hintergrund-Thread in ein Grid-Segment. Wird dazu verwendet, Daten aus unterschiedlichen Datenbank zusammen zu führen.
 +
 
 +
'''Parameter für alle Typen'''
 +
 
 +
* cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
 +
* i ("item") - Name des Grid-Segments; Funktionen werden ersetzt, default ist das zuletzt eingefügte Segment
 +
* k ("key") - Parameter im SQL-Statement; im Grid-Segment muss es eine Spalte mit diesem Feldnamen geben.
 +
* ready - Kommando, das ausgeführt wird, wenn der Thread fertig ist; lokale Kommandos können nicht verwendet werden; Funktionen werden ersetzt (zum Zeitpunkt des Kommandos #grd_thread)
 +
* to ("TimeOut") - Zeit in Sekunden, bis ein Request abgebrochen wird; Funktionen werden ersetzt, default 15
 +
* y - Typ des Threads; Funktionen werden ersetzt, default grid
 +
** grid - Grid wird mittels SQL-Statement gefüllt, das mit #sql definiert werden muss
 +
** gridbulk - Die Daten werden mit nur einer Abfrage ermittelt; geht bisweilen deutlich schneller
 +
** gridlist - im Gegensatz zu den anderen Typen wird nicht ein einzelner Wert abgefragt, sondern alle Zeilen, welche die SQL-Abfrage liefert; die einzelnen Zeilen werden mit dem Inhalt des Parameters sep getrennt.
 +
** gridxml - Grid wird mittels xml gefüllt, das mittels http(s)-Abfrage beschafft wird
 +
 
 +
'''Parameter für SQL-Statements'''
 +
 
 +
* db ("DataBase") - Datenbank, in der das Statement ausgeführt wird.
 +
* sep ("separator") - Zeichenfolge, mit der bei y=gridlist die einzelnen Zeilen getrennt werden; Funktionen werden ersetzt; um Zeilenumbrüche zu setzen, verwendet man sep=$CHR(crlf)
 +
 
 +
'''Parameter für XML'''
 +
* acc - Akzeptierte Response-Formate
 +
* cu8 ("convert UTF8") - wenn Y, werden die Zeichen von UTF8 nach ANSI konvertiert; default N, Funktionen werden ersetzt
 +
* cy - Content-Typ der Anfrage
 +
* e_req - Encoding des Requests, zulässig sind ansi, ascii, utf7, utf8, unicode und bigendianunicode. Funktionen werden ersetzt, default utf8.
 +
* e_res - Encoding des Response, zulässig sind ansi, ascii, utf7, utf8, unicode und bigendianunicode. Funktionen werden ersetzt, default utf8.
 +
* f_ - Prefix für Header-Einträge, zum Beispiel für die Authorisierung; Funktionen werden ersetzt
 +
* isc ("ignore server certificate") - Wenn Y, werden bei den SSL-Options die Werte IgnoreServerCertificateConstraints, IgnoreServerCertificateInsecurity und IgnoreServerCertificateValidity gesetzt. Das ist zum Beispiel erforderlich, um auf REST-Server zuzugreifen, deren Zertifikat abgelaufen ist. Default N, Funktionen werden ersetzt.
 +
* method - Methode des http(s)-Aufrufs (nicht y, da bereits belegt); Funktionen werden ersetzt
 +
** delete
 +
** get
 +
** post
 +
** put
 +
* request - Text der Anfrage bei post und put; Funktionen werden ersetzt
 +
* response - Nummer des Values oder Name der Variable, in die bzw. den das Ergebnis geschrieben wird
 +
* url - Webadresse des aufgerufenen Services; Funktionen werden ersetzt
 +
* wait - Zeit in Millisekunden, die auf die Antwort gewartet wird; Funktionen werden ersetzt; default 1000
 +
 
 +
 
 +
'''Beispiel'''
 +
 
 +
Hier im Beispiel werden drei Spalten als q=thread definiert. Die Daten für diese Spalten werden mittels #grd_thread ermittelt, der das vorangehende SQL-Statement ausführt. Schlüssel ist dwversionid.
 +
 
 +
#grd_col  f=dwversionid  c1="Dwversionid"
 +
#grd_col  f=szlongname    h=szlongname  c1="Dateiname"  w=100    q=thread
 +
#grdcol c1=Tournr  f=tournr  w=50  st=gsj  f=szlongname  q=thread  ss1=Y
 +
#grdcol c1="Dok Time"  h1="Dokumentendatum Uhrzeit"  f=doctime  q=thread  w=80  ro=Y  nd=Y  ss1=Y  st=gsj
 +
...
 +
#grd_data  q=sql 
 +
 
 +
 +
#sql SELECT substring(xyz, 1, 2) + ':' + substring(xyz, 3, 2) AS doctime, dwinteger09 as tournr , szlongname FROM
 +
#sql  (SELECT format(b.dwCreation_time, '000000') AS xyz, dwinteger09, szlongname
 +
#sql    FROM dbo.baseattributes b    WHERE b.dwVersionId = :dwversionid) q
 +
#grd_thread  k=dwversionid  db=wd
 +
 
 +
==$GRD_CHECK==
 +
 
 +
Die Funktion $GRD_CHECK prüft ein Grid-Segment auf bestimmte Bedingungen und ist damit eine Alternative zu #grd_calc in bestimmten Konstellationen.
 +
 
 +
'''Parameter'''
 +
 
 +
# Name des Grid-Segments
 +
# Spaltenindex oder Feldname der Spalte, die untersucht wird
 +
# Reihentyp
 +
## all - es werden alle Reihen geprüft
 +
## cellchanged - es werden nur die Reihen geprüft, wenn sie in der angegebenen Spalte geändert wurden
 +
## rowchanged - es werden nur die Reihen geprüft, die (in einer beliebigen Spalte) geändert wurden
 +
## rowselected - es wird nur die Reihe der selektierten Zelle geprüft
 +
# Prüf-Statement, der Inhalt der jeweiligen Zelle wird durch $CELL$ eingefügt, siehe Beispiel. Bitte beachten, dass Funktionen in diesem Parameter nicht verwendbar sind.
 +
 
 +
'''Beispiel'''
 +
 
 +
#page_check  c="MWSt muss 7, 19 oder leer sein"    chk="$GRD_CHECK(codes,kosten_mwst,all,$CELL$ = 7 or $CELL$ = 19 or $CELL$ =)"
 +
 
 +
==$CCI==
 +
 
 +
Die Funktion $CCI ermittelt aus einem Integer-Wert die zu setzenden Zellen-Farbe
 +
 
 +
'''Parameter'''
 +
 
 +
# Der Wert, der die Zellen-Farbe bestimmt. Sofern der Wert der Zelle verwendet werden soll, deren Farbe gesetzt wird, reicht ein Ausrufezeichen.
 +
# Wenn L, dann muss der Wert in Parameter 1 den Schwellwert erreichen oder unterschreiten, andernfalls muss er ihn erreichen oder überschreiten
 +
# Schwellwert rot.
 +
# optional: Schwellwert gelb; wird nur geprüft, wenn der Schwellwert rot nicht erreicht ist
 +
# optional: Schwellwert grün; wird nur geprüft, wenn die Schwellwerte rot und gelb nicht erreicht sind
 +
 
 +
'''Beispiel'''
 +
 
 +
#grd_col  f=dubletten  y=int  w=30  a=r  c1="D"  h1="Dubletten"  ccc=$CCI(!,,1)
 +
 
 +
=XGrid-Segmente=
 +
 
 +
XGrid-Segmente sind Segmente, in denen in Tabellenform mehrere Datensätze einer SQL-Abfrage angezeigt werden. Dabei werden die Spalten durch eine andere SQL-Abfrage gebildet. Grid-Segmente können Kopf- und Fußzeilen haben (default 1 Kopfzeile, 0 Fußzeilen)
 +
 
 +
==#xgrd_seg==
 +
 
 +
Mit der Prozedur #xgrd_seg wird ein XGrid-Segment angelegt.
 +
 
 +
'''Parameter'''
 +
 
 +
* clt (column line type) - Spezifiziert, ob Spalten verbreitert oder umgebrochen werden; default sf; Funktionen werden ersetzt
 +
** mf - multi line fixed
 +
** ms - multi line stretch
 +
** sf - single line fixed
 +
** ss - single line stretch
 +
* fcc (fixed columns count) - Spalten, die auch beim Scrollen links angezeigt werden; default 0; Funktionen werden ersetzt
 +
* frc (footer row count) - Anzahl der Fußzeilen; default 0; Funktionen werden ersetzt
 +
* hrc (header row count) - Anzahl der Kopfzeilen; default 0; Funktionen werden ersetzt
 +
* sc (selection column) - Spaltenindex der Selection-Zeile. Ein Grid-Segment kann eine Selection-Spalte haben, also eine Spalte vom Typ bool, mit deren Hilfe einzelne Zeilen ausgewählt werden können. Default ist -1, Funktionen werden ersetzt.
 +
 
 +
 
 +
'''gemeinsame Parameter aller Segmenttypen'''
 +
 
 +
* b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
 +
* c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
 +
* hp ("help path") - noch ohne Funtion
 +
* n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
 +
* mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
 +
* mho ("max height opened") - maximale Höhe im geöffneten Zustand
 +
* oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
 +
** c - Segment wird nur in geschlossenem Zustand angezeigt
 +
** o - Segment wird nur in geöffnetem Zustand angezeigt
 +
** oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
 +
* r ("rights") - Rechtedefinition
 +
* ro ("read only") - Der Anwender kann die Daten im Segment nicht ändern
 +
 
 +
'''Beispiel'''
 +
 
 +
siehe unten
 +
 
 +
==#xgrd_col==
 +
 
 +
Die Prozedur #xgrid_col definiert die fixen Spalten des Grid, die an der linken Seite stehen.
 +
 
 +
'''Parameter'''
 +
 
 +
Diese Prozedur gleich #grid_col, die Parameter sind dort beschrieben.
 +
 
 +
'''Beispiel'''
 +
 
 +
siehe unten
 +
 
 +
==#xgrd_xcol==
 +
 
 +
Die Prozedur #xgrd_xcol definiert die X-Spalten, also die Spalten, die für jeden Datensatz der #xgrd_xdata eingefügt werden.
 +
 
 +
'''Parameter'''
 +
 
 +
Diese Prozedur gleich #grid_col, die Parameter sind dort beschrieben.
 +
 
 +
'''Beispiel'''
 +
 
 +
siehe unten
 +
 
 +
==#xgrd_xdata==
 +
 
 +
Mit #xgrd_xdata werden die variablen Spalten des Grids angelegt. Für jede Zeile der mit #xgrd_xdata geöffneten SQL-Abfrage wird ein Satz von den mit #xgrd_xcol angelegten Spalten angelegt.
 +
 
 +
'''Parameter'''
 +
 
 +
* db ("DataBase") - Name der Datenbankverbindung, aus der die Daten bezogen werden; Funktionen werden ersetzt, default ist die Standard-Datenbankverbindung
 +
* Prefix k - Prefix für SQL-Parameter
 +
 
 +
'''Beispiel'''
 +
 
 +
siehe unten
 +
 
 +
==#xgrd_data==
 +
 
 +
Mit #xgrd_data werden Zeilen des Grids angelegt.
 +
 
 +
'''Parameter'''
 +
 
 +
* db ("DataBase") - Name der Datenbankverbindung, aus der die Daten bezogen werden; Funktionen werden ersetzt, default ist die Standard-Datenbankverbindung
 +
* k (key) - Name der Schlüsselspalte; per default der Tabellennamen plus ein angehängtes _id; Funktionen werden ersetzt
 +
* k2, k3... - Name der Schlüsselspalten weiterer Tabellen; per default der Tabellennamen plus ein angehängtes _id
 +
* Prefix k - Prefix für SQL-Parameter
 +
* m ("maximum") - Nach dieser Anzahl von Zeilen wird abgebrochen; default MaxInt (2 147 483 647), Funktionen werden ersetzt
 +
* ocd (open cat on data) - Wenn Y, wird die übergeordnete Kategorie geöffnet, wenn das Grid Daten enthält; default N; Funktionen werden ersetzt
 +
* t (table) - Name der Datenbanktabelle, in welche die Daten beim Speichern zurückgeschrieben werden; Funktionen werden ersetzt
 +
* t2, t3... - Tabellennamen weiterer Tabellen
 +
 
 +
'''Beispiel'''
 +
 
 +
siehe unten
 +
 
 +
==#xgrd_calc==
 +
 
 +
Mit #grd_calc funktioniert grundsätzlich auf bei X-Grids. Allerdings gibt es Aufgabenstellungen, die mit #grd_calc nicht durchführbar sind.
 +
 
 +
Die Prozedur #xgrd_calc bildet erst eine Aggregatfunktion in der einen Richtung, und dann aus den Ergebnissen eine zweite Aggregatfunktion in der anderen. Nähre Erläuterungen siehe Beispiel.
 +
 
 +
'''Parameter'''
 +
 
 +
* cnd - ("condition") Die Prozedur wird nur dann ausgeführt, wenn das Statement in cnd Y ergibt. Default ist Y, Funktionen werden ersetzt
 +
* f - ("FieldName") Feldname der Zelle im Grid, für welche die fnc1 ausgeführt wird; Funktionen werden ersetzt
 +
* fnc1, fnc2 - ("Function") die erste und zweite Funktion, die ausgeführt wird; default sum, Funktionen werden ersetzt
 +
** avg - Durchschnitt
 +
** count - Anzahl
 +
** max - Maximum
 +
** min - Minimum
 +
** sum - Summe
 +
* nv0 - ("NullValue = 0") Wenn Y, werden leere Zellen sowie Spalten- beziehungsweise Reihen-Ergebnisse wie 0 behandelt; default N, Funktionen werden ersetzt
 +
* ry - ("result type") Type des Ergebnisses; default curr
 +
** curr - Festkommewert mit zwei Nachkommastellen
 +
** curr 4 - Festkommawert mit vier Nachkommastellen
 +
** date - Datum
 +
** datemin - Datum mit Stunden und Minuten
 +
** datesec / datesek - Datum mit Stunden, Minuten und Sekunden
 +
** int - Ganzzahlen
 +
* y - Typ; default xy, Funktionen werden ersetzt
 +
** xy - Erst wird in X-Richtung (durch alle Spalten) die fnc1 ermittelt; jede Zeile hat dann ein Ergebnis. Danach wird über alle Zeilenergebnisse fnc2 ermittelt.
 +
** yx - Erst wird in Y-Richtung (durch alle Zeilen) die fnc1 ermittelt. Jede Spalte hat dann ein Ergebnis. Danach wird über alle Spaltenergebnisse fnc2 ermittelt.
 +
* z - Name der Variable oder Nummer des Values, in die das/den das Ergebnis geschrieben wird.
 +
'''Beispiel'''
 +
 
 +
Im X-grid jahr2code werden Reisejahre Werbecodes zugeordnet. Es soll geprüft werden, wie viele Reisen einem Code maximal zugewiesen sind. Dazu wird in X-Richtung die Summe der aktivierten Zellen in der Spalte aktiv gezählt, so dass für jede Zeile (hier jedem Werbecode) ein Anzahl ermittelt wird. fnc1 ist somit sum. Dann geht die Prozedur durch alle Zeilen und ermittelt das Maximum, fnc2 ist daher max.
 +
 
 +
#xgrd_calc  i=jahr2code  y=xy  f=aktiv  fnc1=sum  fnc2=max  nv0=Y  ry=int  n=result
 +
 
 +
==$XGRD_CALC==
 +
 
 +
Wie die Prozedur #xgrd_calc, kann aber direkter in #page_check verwendet werden, siehe Beispiel
 +
 
 +
'''Parameter'''
 +
 
 +
# Segment
 +
# Typ; xy oder yx
 +
# FieldName
 +
# Func 1 (avg, count, max, min oder sum)
 +
# Func 2 (avg, count, max, min oder sum)
 +
# NV0 - wenn Y, werden leere Feldwerte oder Spalten- oder Zeilenergebnisse wie 0 gezählt
 +
# Ergebnistyp (curr, curr4, date, datemin, datesek / datesec, int)
 +
 
 +
'''Beispiel'''
 +
 
 +
Im X-grid jahr2code werden Reisejahre Werbecodes zugeordnet. Es soll mittels #page_check sichergestellt werden, dass bei fertig angelegten und nicht stornierten Werbeaktionen (status zwischen 2 und 8, wird über cnd realisiert) jedem Code mindestens eine Reise und jeder Reise mindestens ein Code zugeordnet ist.
 +
 
 +
Zunächst wird für jede Spalte und jede Zeile die Anzahl der Zuordnungen (aktiv = Y) ermittelt (erste Funktion sum), von den Ergebnissen wird dann das Minimum gebildet; das Ergebnis wird dann darauf geprüft, ob es > 0 ist.
 +
 
 +
#code  chk="$BOOL($XGRD_CALC(jahr2code,xy,aktiv,sum,min,Y,int) > 0)"
 +
#page_check  c="Jeder aktive Code muss mindestens einer Reise zugeordnet sein"    cnd=$NUMBETWEEN($PVAL(vl,status),2,8)  $CODE$
 +
#code  chk="$BOOL($XGRD_CALC(jahr2code,yx,aktiv,sum,min,Y,int) > 0)"
 +
#page_check  c="Jede aktive Reise muss mindestens einem Code zugeordnet sein"    cnd=$NUMBETWEEN($PVAL(vl,status),2,8)    $CODE$
 +
 
 +
==Beispiel==
 +
 
 +
Für das Beispiel werden die folgenden drei Tabellen verwendet, zwei Detail-Tabellen und eine Verknüpfungstabelle:
 +
 
 +
create table sd_cross_x (
 +
  sd_cross_x_id varchar(40) not null primary key,
 +
  name varchar(40) not null,
 +
  datechg date,
 +
  usrchg varchar(40),
 +
  progchg varchar(40)     
 +
);
 +
 +
create table sd_cross_y (
 +
  sd_cross_y_id varchar(40) not null primary key,
 +
  name varchar(40) not null,
 +
  datechg date,
 +
  usrchg varchar(40),
 +
  progchg varchar(40)     
 +
);
 +
 +
create table sd_cross_xy (
 +
  sd_cross_xy_id varchar(40) not null primary key,
 +
  sd_cross_x_id varchar(40) not null,
 +
  sd_cross_y_id varchar(40) not null,
 +
  active char(1),
 +
  remarks varchar(40),
 +
  datechg date,
 +
  usrchg varchar(40),
 +
  progchg varchar(40)     
 +
);
 +
 
 +
Damit wollen wir das folgende Formular erstellen:
 +
 
 +
[[file:demo xgrid.png|1000px|Demo XGrid]]
 +
 
 +
Damit die Änderungen in den Detail-Tabellen gleich nach dem Speichern im XGrid sichtbar werden, wird bei der Page der Parameter ras ("RefreshAfterSave") gesetzt.
 +
 
 +
#page  ras=Y
 +
 
 +
Wir verwenden hier in einer Primär-Region zwei Kategorien, links für die Spalten (X), rechts für die Reihen (Y). Die beiden Kategorien werden also nebeneinander angezeigt.
 +
 
 +
Jede Kategorie hat ein Button-Segment mit einem Button, mit dem jeweils ein neuer Datensatz angelegt werden kann. Dazu muss lediglich die Prozedur #grd_add aufgerufen werden.
 +
 
 +
Die Tabellen hier im Beispiel haben (neben den Standard-Spalten _id, datechg, usrchg und progchg) lediglich einen Namen. Damit die ID-Spalte mit einer GUID versorgt wird, wird diese für den Parameter nvi ("NullValue Insert") erzeugt; bei der Gelegenheit wird die Zeile dann gleich als neu eingefügt gekennzeichnet.
 +
 
 +
#prim  as=Y 
 +
#cat  as=Y    c=X
 +
#btns_seg 
 +
#btns_btn  c="$T(Add item)"  w=150  cmd="#grd_add  i=gridx"
 +
 +
#grd_seg  frc=0  fcc=1  clt=ss  n=gridx  c=" "  b=XYH 
 +
#grd_col  f=sd_cross_x_id  c1=ID  w=30  y=guid  ro=Y    nvi=$GUID()
 +
#grd_col  f=name  c1="Name"  l=40  w=100  wst=500  xw=400
 +
#sql select * from sd_cross_x  order by name
 +
#grd_data  q=sql  t=sd_cross_x
 +
 +
#cat  as=Y    c=Y
 +
#btns_seg 
 +
#btns_btn  c="$T(Add item)"  w=150  cmd="#grd_add  i=gridy"
 +
 +
#grd_seg  frc=0  fcc=1  clt=ss  n=gridy  c=" "  b=xYH
 +
#grd_col  f=sd_cross_y_id  c1=ID  w=30  y=guid  ro=Y  nvi=$GUID()
 +
#grd_col  f=name  c1="Name"  l=40  w=100  wst=500  xw=400
 +
#sql select * from sd_cross_y  order by name
 +
#grd_data  q=sql  t=sd_cross_y 
 +
 
 +
Die zweite Primärregion beinhaltet das XGrid, mit dem die Verknüpfung angezeigt wird. Nach der Prozedur #xgrd_seg werden mit #xgrd_col erst mal die beiden fixen Spalten definiert, die ID und der Name (der Reihe).
 +
 
 +
Danach werden die variablen Spalten mit #xgrd_xcol definiert und mit #xgrd_xdata angelegt. Als erste Spalte in einem solchen Spaltensatz wird eine Spalte für die IDs eingefügt. Diese hat üblicherweise die Breite w=0, da die IDs nicht interessieren. Zum Debuggen kann diese Spalte jedoch breiter gemacht werden. Diese "unsichtbare" Spalte hat als Feld f die ID der Verknüpfungstabelle, hier also f=sd_cross_xy_id. Als Feld für die erste Headerzeile f1 muss die ID der X-Datenmenge, hier also f1=sd_cross_x_id.
 +
 
 +
Bei den weiteren Spalten besteht die Freiheit des Programmierers. Hier im Beispiel wird eine bool'sche Spalte für die Verknüpfung sowie eine Anmerkungsspalte eingefügt. Mit cs1=2 bei der bool'schen Spalte wird die Überschrift über beide Spalten gezogen.
 +
 
 +
#prim  as=Y 
 +
#cat  as=Y    c=XY
 +
 +
#xgrd_seg  frc=0  fcc=1  clt=ss  n=gridxy  c=" "  b=XYH
 +
#xgrd_col  f=sd_cross_y_id  c1=ID  w=30  y=guid  ro=Y
 +
#xgrd_col  f=yname  c1="name"  w=80  nd=Y  ro=Y
 +
 +
#xgrd_xcol  f1=sd_cross_x_id  f=sd_cross_xy_id  w=0  y=guid  ro=Y 
 +
#xgrd_xcol  f1=name  cs1=2  f=active  y=bool  w=30  xcs1=2
 +
#xgrd_xcol  f=remarks  l=40 
 +
#sql select * from sd_cross_x order by name
 +
#xgrd_xdata 
 +
 
 +
Für die Daten im XGrid brauchen wir zunächst ein SQL-Statement, das aus den beiden Detail-Datenmengen ein kartesisches Produkt (Mengenprodukt) erstellt; dafür sehen wir im Statement die Verknüpfungsbedingung 1=1 (die nur deswegen eingefügt ist, damit formal eine Verknüpfungsbedingung vorhanden und das SQL-Statement syntaktisch korrekt ist). Mit einem left outer join wird die Verknüpfungstabelle hinzugefügt (kein inner join, da anfangs ja die Datensätze noch nicht vorhanden sind).
 +
 
 +
Mit der Prozedur #xgrd_data werden die Daten dann aus der Ergebnismenge geladen. Wir müssen hier die Tabellen t angeben, in welche die Daten zurückgeschrieben werden (also in die Verknüpfungstabelle, hier t=sd_cross_xy), welches die ID für die Spalten ist (hier fcol=sd_cross_x_id, das muss übereinstimmen mit f1=sd_cross_x_id in der 0-breiten ersten Spalte des Spalten-Sets), und wann eine neue Zeile begonnen wird (frow=sd_cross_y_id). Damit Letzteres korrekt funktioniert, muss die erste Sortierung im Statement nach den Reihen sein (hier order by y.name)
 +
 
 +
  #sql select y.sd_cross_y_id, y.name as yname, x.sd_cross_x_id, x.name as xname, c.sd_cross_xy_id, c.active, c.remarks
 +
  #sql  from sd_cross_y y
 
  #sql    inner join sd_cross_x x on 1=1
 
  #sql    inner join sd_cross_x x on 1=1
  #sql    left outer join sd_cross_xy c on c.sd_cross_y_id = y.sd_cross_y_id and c.sd_cross_x_id = x.sd_cross_x_id
+
  #sql    left outer join sd_cross_xy c on c.sd_cross_y_id = y.sd_cross_y_id and c.sd_cross_x_id = x.sd_cross_x_id
  #sql  order by y.name, x.name
+
  #sql  order by y.name, x.name
  #xgrd_data  q=sql  t=sd_cross_xy  fcol=sd_cross_x_id  frow=sd_cross_y_id
+
  #xgrd_data  q=sql  t=sd_cross_xy  fcol=sd_cross_x_id  frow=sd_cross_y_id
 
+
 
==Tipps==
+
==Tipps==
 
+
 
Das Erstellen des Codes für ein XGrid ist am Anfang ein wenig komplex und fehleranfällig. Von daher sollen hier noch die folgenden Tipps gegeben werden:
+
Das Erstellen des Codes für ein XGrid ist am Anfang ein wenig komplex und fehleranfällig. Von daher sollen hier noch die folgenden Tipps gegeben werden:
 
+
 
'''Vorlage kopieren'''  
+
'''Vorlage kopieren'''  
 
+
 
Nehmen Sie sich ein bestehendes XGrid-Segment, kopieren es und ändern es entsprechend ab.
+
Nehmen Sie sich ein bestehendes XGrid-Segment, kopieren es und ändern es entsprechend ab.
 +
 
 +
'''Schrittweise vorgehen'''
 +
 
 +
Legen Sie erst die Spalten an, dann den Code für die Daten. Wenn Sie eine Vorlage kopiert haben, dann setzen Sie nach #xgrd_xdata erst mal vier Minuszeichen (der Rest das Codes ist dann Kommentar) und schauen erst mal, dass die Spalten korrekt angezeigt werden.
 +
 
 +
'''Gern gemachte Fehler'''
 +
 
 +
* In der ersten Spalte das variablen Spaltensatzes ist f oder f1 nicht oder nicht korrekt gesetzt. Oder f1 stimmt nicht mit fcol aus #xgrd_data überein.
 +
* Das Statement für die Daten ist kein kartesisches Produkt als Spalten und Reihen
 +
* Die Verknüpfungtabelle ist nicht mit einem left outer join hinzugefügt.
 +
* Das Statement für die Daten ist nicht nach den Reihen sortiert.
 +
 
 +
'''In mehrere Tabellen schreiben'''
 +
 
 +
Müssen die Daten in mehrere Tabellen geschrieben werden, so ist die Verknüpfungstabelle immer die Tabelle t, alle anderen Tabellen werden mit t2, t3... hinzugefügt.
 +
 
 +
Schauen Sie sich als Beispiel xtodo_page_add an.
 +
 
 +
=XXGrid-Segmente=
 +
 
 +
XXGrid-Segmente ("Double-X-Grid-Segmente") sind Segmente, in denen in Tabellenform mehrere Datensätze einer SQL-Abfrage angezeigt werden. Dabei werden die Spalten durch zwei andere SQL-Abfrage gebildet. Grid-Segmente können Kopf- und Fußzeilen haben (default 1 Kopfzeile, 0 Fußzeilen)
 +
 
 +
==#xxgrd_seg==
 +
 
 +
Mit der Prozedur #xxgrd_seg wird ein XXGrid-Segment angelegt.
 +
 
 +
'''Parameter'''
 +
 
 +
* clt (column line type) - Spezifiziert, ob Spalten verbreitert oder umgebrochen werden; default sf; Funktionen werden ersetzt
 +
** mf - multi line fixed
 +
** ms - multi line stretch
 +
** sf - single line fixed
 +
** ss - single line stretch
 +
* fcc (fixed columns count) - Spalten, die auch beim Scrollen links angezeigt werden; default 0; Funktionen werden ersetzt
 +
* frc (footer row count) - Anzahl der Fußzeilen; default 0; Funktionen werden ersetzt
 +
* hrc (header row count) - Anzahl der Kopfzeilen; default 0; Funktionen werden ersetzt
 +
* sc (selection column) - Spaltenindex der Selection-Zeile. Ein Grid-Segment kann eine Selection-Spalte haben, also eine Spalte vom Typ bool, mit deren Hilfe einzelne Zeilen ausgewählt werden können. Default ist -1, Funktionen werden ersetzt.
 +
 
 +
 
 +
'''gemeinsame Parameter aller Segmenttypen'''
 +
 
 +
* b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
 +
* c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
 +
* hp ("help path") - noch ohne Funtion
 +
* n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
 +
* mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
 +
* mho ("max height opened") - maximale Höhe im geöffneten Zustand
 +
* oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
 +
** c - Segment wird nur in geschlossenem Zustand angezeigt
 +
** o - Segment wird nur in geöffnetem Zustand angezeigt
 +
** oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
 +
* r ("rights") - Rechtedefinition
 +
* ro ("read only") - Der Anwender kann die Daten im Segment nicht ändern
 +
 
 +
==#xxgrd_col==
 +
 
 +
Die Prozedur #xxgrid_col definiert die fixen Spalten des Grids, die an der linken Seite stehen.
 +
 
 +
'''Parameter'''
 +
 
 +
Diese Prozedur gleich #grid_col, die Parameter sind dort beschrieben.
 +
 
 +
'''Beispiel'''
 +
 
 +
siehe unten
 +
 
 +
==#xxgrd_xcol==
 +
 
 +
Die Prozedur #xxgrid_xcol definiert die vorderen variablen Spalten des Grids.
 +
 
 +
'''Parameter'''
 +
 
 +
Diese Prozedur gleich #grid_col, die Parameter sind dort beschrieben.
 +
 
 +
'''Beispiel'''
 +
 
 +
siehe unten
 +
 
 +
==#xxgrd_xxcol==
 +
 
 +
Die Prozedur #xxgrid_xxcol definiert die hinteren variablen Spalten des Grids.
 +
 
 +
'''Parameter'''
 +
 
 +
Diese Prozedur gleich #grid_col, die Parameter sind dort beschrieben.
 +
 
 +
'''Beispiel'''
 +
 
 +
siehe unten
 +
 
 +
==Beispiel==
 +
 
 +
Das folgende Beispiel ist aus der Reklamationsbearbeitung eines Reiseveranstalters. Die einzelnen Stichworte (hier nur ausschnittsweise) sind in Kategorien zusammengefasst. Diese Kategorien bilden die vorderen Spaltenüberschriften, die Reisenummern die hinteren (in einer Reklamation können mehrere Reisen bemängelt werden, die Stichworte müssen von daher den Reisen zugeordnet werden).
 +
 
 +
[[file:Xxgrid 2.png|XXGrid-Segment]]
 +
 
 +
Um die Stichworte positionieren zu können, wird mit Zeilennummern gearbeitet, diese werden in der ersten Spalte angezeigt. Da die gesetzten Stichworte dem Vorgang zugeordnet werden müssen, muss die Vorgangs-ID gespeichert werden, dies passiert in einer Spalte mit der Breit 0.
 +
 
 +
#xxgrd_seg  n=cross  fcc=1  c=" "  b=H
 +
#xxgrd_col  c1=Nr  w=30  ro=Y  f=zahl  st=gsj  nd=Y
 +
#xxgrd_col  w=0  ro=Y  f=ks_vorgang_id 
 +
 
 +
Hier werden nun die variablen Spalten definiert. Vorne (xxgrid_xcol) haben wir das Stichwort, für die IDs, auch der Kategorie, haben wir davor eine Spalte mit der Breite 0. Hinten (xxgrid_xxcol) haben wir dann die Möglichkeit, einen Haken zu setzen (y=bool2), darüber muss die Reisenummer (f1=aktion), davor gibt es wieder eine Spalte mit der Breite 0 mit der ID des Stichworts. Da der Platz begrenzt ist, wird die Bezeichnung der Reise nur als Hint-Text der Reisenummer angezeigt.
 +
 
 +
#xxgrd_xcol  w=0  f1=rekla_tbs_kat_id  f=rekla_tbs_id
 +
#xxgrd_xcol  w=170  f1=name  f=stiwo  ro=Y  st=gsf  nd=Y
 +
#xxgrd_xxcol  w=0  f=rekla_stiwo_id
 +
#xxgrd_xxcol  w=36  f1=aktion  f=aktiv  h1=bezeichnung  y=bool2
 +
 
 +
Mit #xxgrd_xdata werden die Spalten ermittelt. Das SQL-Statement muss ein kartesisches Produkt aus den Kategorien und denjenigen Reisenummern bilden, die beim Vorgang beteiligt sind (Tabelle neuland.ks_vorgang_reise). (Am Rande: Es handelt sich hier um einen Test auf einem System, das auf einer Postgres-Datenbank läuft, die Datenbank aber aus einem Oracle-System holt. Entsprechend ist db=ora_prod gesetzt und die GUID des Vorgangs hart codiert.)
 +
 
 +
#sql select k.rekla_tbs_kat_id, k.name, r.aktion, d.bezeichnung
 +
#sql  from neuland.rekla_tbs_kat k
 +
#sql    inner join neuland.ks_vorgang_reise r on r.ks_vorgang_id = :kid  and r.status < 7
 +
#sql    inner join rsd d on d.aktion = r.aktion
 +
#sql  where k.status = 1  and k.az = :kaz
 +
#sql  order by k.sort, r.aktion;
 +
#xxgrd_xdata  k=rekla_tbs_kat_id  kid=FFACF140-151F-412C-8EE7-A872B1DCA7EB    kaz=R  db=ora_prod
 +
 
 +
Die Tabelle, in welche die gesetzten Stichworte geschrieben werden, ist neuland.rekla_stiwo. Eine solche Tabelle muss stets mit einem left outer join der restlichen Abfrage hinzugefügt werden. Das restliche Statement liefert die Stichworte, Kategorien und Reisenummern. Der Parameter kaz ist ein Parameter aus dem SQL-Statement, in den die Abteilungszugehörigkeit (hier R für Reklamationsabteilung) geschrieben wird.
 +
 
 +
Wenn das Statement korrekt ist, müssen dann nur noch die Spaltenbezeichner für die Überschrift der vordere Variable Spalte (Kategorie, also fcol=rekla_tbs_kat_id), die vordere variable Spalte (Stichwort, also fxcol=rekla_tbs_id) und die hintere variable Spalte (Reisenummer, also fxxcol=aktion) sowie der Reihen (frow=zahl) gesetzt werden.
 +
 
 +
#sql select r.ks_vorgang_id, t.zahl, k.rekla_tbs_kat_id, k.name as kat, r.aktion, b.rekla_tbs_id, b.name as stiwo, s.rekla_stiwo_id, s.aktiv
 +
#sql  from neuland.stamm_tage t
 +
#sql    inner join neuland.rekla_tbs_kat k on  k.status = 1  and k.az = :kaz
 +
#sql    inner join neuland.ks_vorgang_reise r on r.ks_vorgang_id = :kid  and r.status < 7
 +
#sql    inner join neuland.rekla_tbs b on b.rekla_tbs_kat_id = k.rekla_tbs_kat_id and b.sort = t.zahl
 +
#sql    left outer join neuland.rekla_stiwo s    on s.ks_vorgang_id = r.ks_vorgang_id      and s.rekla_tbs_id = b.rekla_tbs_id    and s.aktion = r.aktion
 +
#sql  where t.zahl between 1 and 20
 +
#sql  order by t.zahl, k.sort, r.aktion;
 +
#code  fcol=rekla_tbs_kat_id  fxcol=rekla_tbs_id  fxxcol=aktion 
 +
#xxgrd_data  t=neuland.rekla_stiwo  kid=FFACF140-151F-412C-8EE7-A872B1DCA7EB  kaz=R  $CODE$  frow=zahl  db=ora_prod
 +
 
 +
=Picture-Segmente=
 +
 
 +
Picture-Segmente dienen dazu, Bilder anzuzeigen.
 +
 
 +
==#pic_seg==
 +
 
 +
Die Prozedur #pic_seg fügt ein Bild ein. Mit dem Parameter y wird spezifiziert, wo das Bild her kommt.
 +
 
 +
'''Parameter'''
 +
* f ("Field") - Feldname, in dem der Dateiname des Bildes steht, wenn Parameter q=link; Funktionen werden ersetzt
 +
* fn ("FileName") - Dateiname des Bildes, wenn Parameter q=file; Funktionen werden ersetzt
 +
* ho ("height closed") - Die Höhe des Segments bei geschlossener Kategorie, wenn nicht AutoSize verwendet wird.
 +
* ho ("height open") - Die Höhe des Segments bei geöffneter Kategorie, wenn nicht AutoSize verwendet wird.
 +
* i ("Item") - Name des Grid-Segmentes, wenn Parameter q=link; Funktionen werden ersetzt
 +
* isc ("ignore server certificate") - Wenn Y, wird das Zertifikat des Servers bei q=http ignoriert; Funktionen werden ersetzt, default N
 +
* q - Datenquelle des Bildes
 +
** file - Der Dateiname des Bildes wird mit dem Parameter fn angegeben.
 +
** link - Der Dateiname des Bildes steht in einem verbundenen Grid-Segment, dessen Namen mit dem Parameter i und dessen Feldname mit dem Parameter f angegeben wird.
 +
** http - Das Bild wird aus dem Netz geladen, siehe Parameter url und isc
 +
* sh ("scroll horizontal") - Wenn Y, wird ein waagerechter Scrollbalken eingefügt;  Funktionen werden ersetzt, default Y
 +
* sv ("scroll vertical") - Wenn Y, wird ein senkrechter Scrollbalken eingefügt;  Funktionen werden ersetzt, default Y
 +
 
 +
'''Beispiele'''
  
'''Schrittweise vorgehen'''
+
#pic_seg  aso=Y  q=file  fn="T:\Tools Gruppenrechte\BafClient2\pics\gutschein_a4.png"  c=Gutschein  sv=N  sh=N
 
+
#pic_seg  aso=Y  q=link  i=grid  f=filename  c=Gutschein    sv=N  sh=N
Legen Sie erst die Spalten an, dann den Code für die Daten. Wenn Sie eine Vorlage kopiert haben, dann setzen Sie nach #xgrd_xdata erst mal vier Minuszeichen (der Rest das Codes ist dann Kommentar) und schauen erst mal, dass die Spalten korrekt angezeigt werden.
+
#pic_seg  ho=300  q=http  url="https://api.predic8.de/shop/products/$FND(s,id)/photo"  isc=Y    sv=N  sh=N
 
 
'''Gern gemachte Fehler'''
 
 
 
* In der ersten Spalte das variablen Spaltensatzes ist f oder f1 nicht oder nicht korrekt gesetzt. Oder f1 stimmt nicht mit fcol aus #xgrd_data überein.
 
* Das Statement für die Daten ist kein kartesisches Produkt als Spalten und Reihen
 
* Die Verknüpfungtabelle ist nicht mit einem left outer join hinzugefügt.
 
* Das Statement für die Daten ist nicht nach den Reihen sortiert.
 
 
 
'''In mehrere Tabellen schreiben'''
 
 
 
Müssen die Daten in mehrere Tabellen geschrieben werden, so ist die Verknüpfungstabelle immer die Tabelle t, alle anderen Tabellen werden mit t2, t3... hinzugefügt.
 
 
 
Schauen Sie sich als Beispiel xtodo_page_add an.
 

Aktuelle Version vom 7. Mai 2024, 13:58 Uhr

Das Modul Form

Im Modul Form werden die Routinen zur zur Formulargestaltung zusammengefasst.

Das Formular

#frm

Legt ein Formular an.

Parameter

  • c ("Caption") - Überschrift des Formulars; Funktionen werden ersetzt
  • flt ("Filter") - Setzt das Filter-Kommando des Formulars. Dieses Kommando wird aufgerufen, wenn in einer der edt- oder chk-Komponenten eine Eingabe gemacht wird. Kann auch mit #filter ausgelöst werden.
  • lhc ("LogHideCommand") - Wenn Y, dann wird der Typ C ("Command") nicht geloggt. Das kann bei Massenverarbeitung den Vorgang beschleunigen; Default N, Funktionen werden ersetzt.
  • ncd ("no confoirmation dialog") - Wenn Y, dann wird beim Typ console kein Bestätigungsdialog verwendet. Das kann zum Beispiel dann sinnvoll sein, wenn ohnehin zu Beginn Daten per Dialog abgefragt werden und damit ggf. die Ausführung abgebrochen werden kann. Default N, Funktionen werden ersetzt.
  • prc ("PageRefreshCommand") - Das Kommando, mit dem die Seite aktualisiert werden kann; nur bei Typ page
  • w ("Width") - Breite der Baum-Komponente beim Typ treegrid und Höhe der Baum-Komponente bei treeovergrid
  • y - Typ des Formulars; default ist treepage
    • console - Eine Konsolen-Anwendung, bei der nur Ausgaben in Textform gemacht werden
    • live - Oben ein Eingabefeld zur Eingabe von Kommandos, unten ein Ausgabebereich; wird nur für xlive verwendet.
    • page - Eine Page-Komponenten, darüber ein Filter-Bereich
    • treeoverpage - Von oben nach unten: Filter-Bereich, Baum, Button-Bereich, Page
    • treepage - Links eins Baum-Komponente, rechts eine Page-Komponente, darüber einer Filter- und ein Button-Bereich; ist er Default-Wert

Beispiel

#frm   c=xlookup   flt=xlookup_flt   w=300

#cout

Gibt Text auf der Konsole aus. Wird bei den Form-Typen console und live verwendet.

Parameter

  • c ("Caption") - Text der ausgegeben wird; Funktionen werden ersetzt; default ist #cout, Parameter c nicht gesetzt
  • cn ("Caption no double function") - beim Parameter c werden zweimal Funktionen ersetzt, das erlaubt Funktionen von Funktionen (also zum Beispiel eine Funktion, die mittels $DATA aus einer Datenbank geladen wird). Bisweilen führt dieses Verhalten zu unerwünschten Ergebnissen, siehe unten im Beispiel. Wird statt c der Parameter cn verwendet, werden Funktionen nur einmal ersetzt.
  • clr ("Clear") - Y löscht vor der Ausgabe des Textes die Konsole; Funktionen werden ersetzt; default N
  • cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • m ("max") - die maximale Anzahl der Zeilen; werden es mehr Zeilen, wird ab md gelöscht. Default MaxInt, Funktionen werden ersetzt
  • md ("max delete") - wenn wegen Überschreitung der mit m vorgegebenen Grenze Zeilen gelöscht werden, werden sie aber dieser Position gelöscht. Auf diese Weise kann erreicht werden, dass der Anfang eines Logs stehen bleibt, zum Beispiel, damit man sieht, wann die Ausführung eines Kommandos begonnen wurde. Default 0, Funktionen werden ersetzt.
  • wts ("WithoutTimeStamp") - Wenn Y, dann wird auf die Ausgabe der Datums- und Zeitangabe sowie des Typs verzichtet; Funktionen werden ersetzt; default N
  • y - Typ der Ausgabe, üblicherweise ein einzelner Buchstabe (I "Info", W "Warning" E "Error"); default I

Beispiel

#cout  c="Hello world"   
#cout  c=" "   clr=Y   wts=Y

#cout c=DIR$CHR(dollar)RWC:2740_GFI_5555.pdf
#cout cn=DIR$CHR(dollar)RWC:2740_GFI_5555.pdf

#coutl

Fügt der Konsole eine Zeile ohne Datums- und Zeitangabe sowie ohne Typ hinzu.

Parameter

#coutl hat keine benannten Parameter. Die ganze Zeile nach dem #text und dem trennenden Leerzeichen wird der Konsole hinzugefügt.

Funktionen werden ersetzt.

Beispiel

#coutl Hello World

#filter

Ruft das Standard-Filter-Kommando des Formulars auf. #filter wird meist ohne Parameter aufgerufen.

Parameter

  • f (Field) - Wenn hier der Name eines Feldes angegeben wird, dann wird vor der Ausführung des Filter-Statements der Wert dieses Feldes in der NodeIni ermittelt. Nach der Ausführung des Filter-Statements wird dann der erste Baumeintrag selektiert, dessen Feldinhalt übereinstimmt. Dieses Parameter wird dazu verwendet, nach der Aktualisierung des Baums an dieselbe Stelle zurückzukehren. Dazu sollte der betreffende Baumeintrag eine GUID haben, die auch in der NodeIni steht, und die vom Filter-Statement (und nicht erst durch ein Open-Statement) geladen wird. Funktionen werden ersetzt.
  • o (Open) - Wenn Y, wird der über den Parameter f selektierte Baumeintrag geöffnet. Default N, Funktionen werden ersetzt.

Beispiel

#filter
#btns_btn  c=Filter   w=150   cmd="#filter   f=data_list_id   o=Y"

#save

Speichert alle Änderungen auf der Page.

Parameter

(keine)

Beispiel

#save

#cancel

Verwirft alle Änderungen auf der Page.

Parameter

(keine)

Beispiel

#cancel

Dialoge

#msg / #message

Gibt eine Meldung über ein Dialogfenster aus

Parameter

  • c ("caption") - Beschriftung; Funktionen werden ersetzt
  • cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt

Beispiel

#msg c="Hello world"

#progress_dlg

Zeigt einen Fortschrittsdialog an, mit dem die Ausführung einer Schleife auch abgebrochen werden kann.

Die folgenden Prozeduren lassen sich über den Fortschrittsdialog abbrechen:

  • #sql_open
  • #loop
  • #csv_paste
  • #sepline
  • #text_loop
  • #xml_loop
  • #grd_loop


Parameter

  • acmd ("abort command") - Kommando, das im Falle eines Abbruchs dann noch ausgeführt wird
  • c ("caption") - Beschriftung; Funktionen werden ersetzt
  • cmd ("command") - Kommando, das ausgeführt wird
  • cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • max - Die Gesamtzahl der Schleifendurchläufe (ohne Abbruch), Bezugspunkt (100%) für den Fortschrittsbalken; Funktionen werden ersetzt
  • title - Titel des Dialogs, Funktionen werden ersetzt

Beispiel

Fortschrittsdiakig

Ein einfaches Konsolen-Programm, das die Tabelle cache_buchungen ausliest und den Inhalt von zwei Spalten ausgibt. Zunächst wird die Gesamtzahl ermittelt, damit die nach max geschrieben werden kann. #cmd2 ist ein lokales Kommando, das im Falle des Abbruchs ausgeführt wird.

In #progress_dlg werden an die Caption c einige Leerzeichen angehängt, damit der Dialog breit genug dargestellt wird.

#frm  c="c_test"   y=console

#sql select count(*) as cnt from cache_buchungen
#sql_openval   f_cnt=1

#cmd2 #coutl Vorgang abgebrochen

#progress_dlg   cmd=c_test_cmd   title=Fortschritt   max=$VAL(1)   acmd=2   c="Ausgeführte Datensätze:                                  "

#cout  c="c_test executed"

Die Routine c_test_cmd führt die SQL-Abfrage aus und führt für jeden Datensatz das lokale Kommando #cmd aus. Dieses gibt die Daten auf der Konsole aus und erhöht den Fortschrittdialog.

#cmd #coutl $DATA(dat,customernumber) - $DATA(dat,servicecode)
#cmd #progress   c="Ausgeführte Datensätze:  "

#sql select * from cache_buchungen
#sql_open   n=dat   er=1   m_=3

#progress

Erhöht den Wert des Fortschritt-Dialogs

Parameter

  • c ("caption") - Beschriftung; Funktionen werden ersetzt
  • cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt

Beispiel

siehe #progress_dlg

$DLG_YESNO

Zeigt einen Dialog an, der mit Yes (Funktionsergebnis Y) oder No (Funktionsergebnis N) beantwortet werden kann.

Parameter

  1. Titel des Dialogs
  2. Beschriftung des Dialogs

Beispiel


#cout   c="$DLG_YESNO(frei gewählter Titel,da steht ein beliebiger Text)"

Die einfachen Komponenten

#btn

Fügt einen Button in den Button- oder den Filterbereich ein.

Parameter

  • c ("caption") - Beschriftung des Buttons
  • cmd ("command") - Kommando des Buttons, wenn s nicht gesetzt ist
  • cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • h ("hint") - Mouse-Over-Text des Buttons
  • p ("parent") - legt fest, in welchem Bereich der Button eingefügt wird.
    • b - Button-Bereich
    • f - Filter-Bereich
  • nl ("new line") - Für den Button wird eine neue Zeile begonnen
  • s ("select") - Kommando des Buttons
  • se ("status enabled") - Je nach Status des Formulars ist der Button enabled oder nicht (es können mehrere Status-Buchstaben in beliebiger Reihenfolge kombiniert werden); Funktionen werden ersetzt
    • b ("browse") - Normalzustand des Formulars
    • c ("changed") - Nachdem Daten geändert wurden
    • e ("editing") - Während einer Editierung
    • f ("failed") - Die Plausibilitätsprüfung wurde nicht bestanden
  • w ("width") - Breite des Buttons
  • y ("type") - wenn einer der folgenden Standard-Werte verwendet wird, dann erhält der Button ein Standard-Verhalten und die Parameter c und w bleiben unberücksichtigt.
    • back - Button mit Back-Symbol (Pfeil nach links)
    • cancel - Button mit Cancel-Symbol (Daumen nach unten)
    • export - Button mit Export-Symbol
    • fwd - Button mit Forward-Symbol (Pfeil nach rechts)
    • import - Button mit Import-Symbol
    • pdf - Button mit PDF-Symbol
    • save - Button mit Disketten-Symbol
    • xls - (Schreibt den Seiteninhalt in eine Excel-Datei; noch nicht implementiert)

Beispiel

#btn  y=save   s=#save  se=c
#btn  y=cancel   s=#cancel  se=cf
#btn  y=back   s=#tree_back  se=b
#btn  y=backback   s=#tree_fwd  se=b
#btn  y=export   s=xlookup_eximport(ex)  se=b
#btn  y=import   s=xlookup_eximport(im)  se=b
#btn  c=$T(Add_list)  w=120  s=xlookup_add(list)  se=b

#chk

Fügt eine Checkbox in den Button- oder den Filterbereich ein.

Parameter

  • c ("caption") - Beschriftung der Checkbox
  • cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • h ("hint") - Mouse-Over-Text der Checkbox
  • p ("parent") - legt fest, in welchem Bereich die Checkbox eingefügt wird.
    • b - Button-Bereich
    • f - Filter-Bereich
  • n - Name der Checkbox, wird benötigt, um mit $EDT() auf den Check-Status zugreifen zu können
  • nl ("new line") - Für die Checkbox wird eine neue Zeile begonnen
  • z - Wert der Checkbox (Y oder N)

Beispiel

#edt

Fügt ein Edit-Feld in den Button- oder den Filterbereich ein.

Parameter

  • cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • cy ("character type") - Groß- und Kleinschreibung, default n
    • l - lower case
    • n - normal
    • u - upper case
  • h ("hint") - Mouse-Over-Text des Edit-Felds
  • p ("parent") - legt fest, in welchem Bereich das Edit-Feld eingefügt wird; default f
    • b - Button-Bereich
    • f - Filter-Bereich
  • l ("length") - maximale Länge; default unbegrenzt, Funktionen werden ersetzt
  • n - Name des Edit-Feldes, wird benötigt, um mit $EDT() auf den Inhalt zugreifen zu können
  • nl ("NewLine") - Für das Edit-Feld wird eine neue Zeile begonnen
  • sf ("SetFocus") - Wenn Y, wird der Eingabefokus auf dieses Edit-Feld gesetzt; default N, Funktionen werden ersetzt
  • y - Typ, spezifiziert, welche Eingaben zulässig sind; default text,
    • int
    • curr, curr4
    • date, datemin, datesec
    • text
  • z - Inhalt des Edit-Feldes

Beispiel

#lbl   c=$T(lookup_filter)   w=140  
#edt   n=edt1   w=135   h="Hier den Text eingeben, nach dem gesucht werden soll."   z=$INI(usr,edt1,xlookup)

#lbl

Fügt ein Label in den Button- oder den Filterbereich ein.

Parameter

  • c ("caption") - Beschriftung des Labels
  • cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • h ("hint") - Mouse-Over-Text des Labels
  • p ("parent") - legt fest, in welchem Bereich das Label eingefügt wird; default f
    • b - Button-Bereich
    • f - Filter-Bereich
  • nl ("new line") - Für das Label wird eine neue Zeile begonnen

Beispiel

$EDT()

Gibt den Wert einer Edit- oder Checkbox-Komponente zurück. Eine Checkbox gibt Y oder N zurück.

Parameter

  1. Name der Edit- oder Checkbox-Komponente

Beispiele

~ $LEN($EDT(edt1)) = 4
#filltreesql   k_kuerzel=$EDT(edt1)

Tree

Der Tree ist eine Baumansicht, in welcher die einzelnen Einträge hierarchisch gegliedert werden können.

Die Einträge können aus Tabelleninhalten und SQL-Statements gefüllt werden, es können auch einzelne Einträge hinzugefügt werden. Der Baum muss nicht von Anfang an komplett aufgebaut werden, sondern es können Inhalte beim Öffnen eines Eintrags dynamisch nachgeladen werden.

Der gängigste Weg, einen Baum zu füllen, ist #tree_fillsql. Siehe Beispiel dort.

#tree_clear

Macht den Tree leer. Wird üblicherweise eingesetzt, bevor der Baum (neu) gefüllt wird.

Parameter

  • cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt

Beispiel

#tree_clear

#tree_add

Für dem Baum einen einzelnen Eintrag hinzu.

Parameter

  • c ("caption") - die Beschriftung des Eintrags
  • c1, c2 ("caption") - die Feldnamen in der Datenmenge, aus welcher die erste und zweite Beschriftung geladen werden
  • cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • ld1, ld2, ls1, ls2 - sind die Feldnamen in der Datenmenge Schlüsselwerte für Nachschlagelisten, so können für die Beschriftung die Klartexte genutzt werden. Dazu muss die Nachschlageliste (ld1, ld2) beziehungsweise das Special (ls1, ls2) angegeben werden.
  • k ("key") - das Schlüsselfeld für den Eintrag; wird dieser Parameter nicht gesetzt, dann wird das Schlüsselfeld aus dem Namen der Tabelle abgeleitet.
  • ne ("node expand") - der neue Eintrag soll gleich expandiert werden.
  • o ("open") - Kommando, das ausgeführt wird, wenn der Eintrag expandiert wird; üblicherweise werden dabei Bauminhalte dynamisch nachgeladen.
  • r ("rights") - Rechtedefinition für den Eintrag
  • s ("select") - Kommando, das ausgeführt wird, wenn der Eintrag selektiert wird; üblicherweise wird dabei eine neue Seite geladen.
  • si ("select item") - der neue Eintrag soll nach Abschluss des Kommandos selektiert werden
  • sii ("select item instantly") - der neue Eintrag soll sofort und nicht erst nach Abschluss des Kommandos selektiert werden
  • sn ("special node") - wenn Y, wird der Eintrag gekennzeichnet und kann mit u=spec referenziert werden; Funktionen werden ersetzt
  • t ("table") - der Tabellenname der für den Eintrag maßgeblichen Tabelle
  • u - Übergeordneter Eintrag. Unter diesem Eintrag wird der neue Eintrag eingefügt.
    • s ("selected") - der selektierte Baum-Eintrag
    • sp ("selected parent") - Der übergeordnete Eintrag des selektierten Eintrags
    • spp
    • sppp
    • o ("opening") - der Baum-Eintrag, der gerade expandiert wird.
    • l ("last") - der zuletzt eingefügt Baum-Eintrag
    • lp ("last parent") - Der übergeordnete Eintrag des zuletzt eingefügten Eintrags
    • lpp
    • lppp
    • r ("root") - Der übergeordnete Eintrag der obersten Ebene
    • spec ("special") - Der Eintrag wird unter denjenigen Eintrag gehängt, der mit sn=Y als special node gekennzeichnet wurde.


Beispiele

#addtree   u=root   c=$T(change_passwort)   s="#page_fill   d=xsettings_page_password"
#addtree   u=root   c=$T(Set_language)   s="#page_fill   d=xsettings_page_language"
#addtree  u=sel   c=$T(new_list)   t=data_list    s="#page_fill  d=xlookup_page_list"   si=Y    f_category=$FND(category)

#tree_fill

Füllt den Baum aus den Werten einer Datenbanktabelle.

Mit Hilfe der Parameter qw und qo kann das Ergebnis gefiltert und sortiert werden, es ist aber stets nur eine Ebene im Baum. Sollen mehrere Ebenen im Baum gefüllt werden, so ist die Prozedur #tree_fillsql das Mittel der Wahl.

Üblicherweise wird das SQL-Statement aus den Parameters t, qw und qo zusammengesetzt. Dabei sind die Parameter qw und qo optional. Fehlen Sie, lautet das SQL-Statement SELECT * FROM tabllenname.

Alternativ kann auch mit #sql das Statement vorgegeben werden (zum Beispiel, wenn ein JOIN gebraucht wird). Dann werden die Parameter qw und qo nicht berücksichtigt.

Parameter

  • c ("caption") - die Beschriftung des Eintrags
  • c1, c2 ("caption") - die Feldnamen in der Datenmenge, aus welcher die erste und zweite Beschriftung geladen werden
  • cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • db ("DataBase") - Name der Datenbank, default ist die Default-Datenbank
  • fi ("first item") - Wenn Y, wird nach dem Füllen des Baums der erste Eintrag selektiert. Default N, Funktionen werden ersetzt.
  • ld1, ld2, ls1, ls2 - sind die Feldnamen in der Datenmenge Schlüsselwerte für Nachschlagelisten, so können für die Beschriftung die Klartexte genutzt werden. Dazu muss die Nachschlageliste (ld1, ld2) beziehungsweise das Special (ls1, ls2) angegeben werden.
  • k ("key") - das Schlüsselfeld für den Eintrag; wird dieser Parameter nicht gesetzt, dann wird das Schlüsselfeld aus dem Namen der Tabelle abgeleitet.
  • m ("max") - Maximale Anzahl der Baumeinträge, die erstellt werden
  • ne ("node expand") - der neue Eintrag soll gleich expandiert werden.
  • o ("open") - Kommando, das ausgeführt wird, wenn der Eintrag expandiert wird; üblicherweise werden dabei Bauminhalte dynamisch nachgeladen.
  • qw ("query where") - WHERE-Klausel für das zu erstellende SQL-Statement
  • qo ("query order") - ORDER-Klausel für das zu erstellende SQL-Statement
  • r ("rights") - Rechtedefinition für den Eintrag
  • s ("select") - Kommando, das ausgeführt wird, wenn der Eintrag selektiert wird; üblicherweise wird dabei eine neue Seite geladen.
  • si ("select item") - der neue Eintrag soll nach Abschluss des Kommandos selektiert werden
  • sii ("select item instantly") - der neue Eintrag soll sofort und nicht erst nach Abschluss des Kommandos selektiert werden
  • sn ("special node") - wenn Y, wird der Eintrag gekennzeichnet und kann mit u=spec referenziert werden; Funktionen werden ersetzt
  • t ("table") - der Tabellenname der für den Eintrag maßgeblichen Tabelle
  • u - Übergeordneter Eintrag. Unter diesem Eintrag wird der neue Eintrag eingefügt.
    • s ("selected") - der selektierte Baum-Eintrag
    • sp ("selected parent") - Der übergeordnete Eintrag des selektierten Eintrags
    • spp
    • sppp
    • o ("opening") - der Baum-Eintrag, der gerade expandiert wird.
    • l ("last") - der zuletzt eingefügt Baum-Eintrag
    • lp ("last parent") - Der übergeordnete Eintrag des zuletzt eingefügten Eintrags
    • lpp
    • lppp
    • r ("root") - Der übergeordnete Eintrag der obersten Ebene
    • spec ("special") - Der Eintrag wird unter denjenigen Eintrag gehängt, der mit sn=Y als special node gekennzeichnet wurde.

Beispiel

#filltree  u=exp   t=test_test   c1=zahl  c2=test_1

#tree_node

Die Prozedur #tree_node legt für #tree_fillsql und #tree_fillpath eine Ebenen-Definition an.

Parameter

  • c ("caption") - die Beschriftung des Eintrags
  • c1, c2 ("caption") - die Feldnamen in der Datenmenge, aus welcher die erste und zweite Beschriftung geladen werden
  • cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • ld1, ld2, ls1, ls2 - sind die Feldnamen in der Datenmenge Schlüsselwerte für Nachschlagelisten, so können für die Beschriftung die Klartexte genutzt werden. Dazu muss die Nachschlageliste (ld1, ld2) beziehungsweise das Special (ls1, ls2) angegeben werden.
  • k ("key") - das Schlüsselfeld für den Eintrag; wird dieser Parameter nicht gesetzt, dann wird das Schlüsselfeld aus dem Namen der Tabelle abgeleitet; Funktionen werden ersetzt
  • nc ("node clear") - Werden Einträge auf mehreren Ebenen angelegt, dann müssen meist bei einem Wechsel auf der übergeordneten Ebene die Werte der Ebenen darunter gelöscht werden. Mit nc=Y passiert eben dies.
  • ne ("node expand") - der neue Eintrag soll gleich expandiert werden.
  • o ("open") - Kommando, das ausgeführt wird, wenn der Eintrag expandiert wird; üblicherweise werden dabei Bauminhalte dynamisch nachgeladen.
  • r ("rights") - Rechtedefinition für den Eintrag
  • s ("select") - Kommando, das ausgeführt wird, wenn der Eintrag selektiert wird; üblicherweise wird dabei eine neue Seite geladen.
  • sn ("special node") - wenn Y, wird der Eintrag gekennzeichnet und kann mit u=spec referenziert werden; Funktionen werden ersetzt
  • t ("table") - der Tabellenname der für den Eintrag maßgeblichen Tabelle; Funktionen werden ersetzt
  • u - Übergeordneter Eintrag. Unter diesem Eintrag wird der neue Eintrag eingefügt.
    • s ("selected") - der selektierte Baum-Eintrag
    • sp ("selected parent") - Der übergeordnete Eintrag des selektierten Eintrags
    • spp
    • sppp
    • o ("opening") - der Baum-Eintrag, der gerade expandiert wird.
    • l ("last") - der zuletzt eingefügt Baum-Eintrag
    • lp ("last parent") - Der übergeordnete Eintrag des zuletzt eingefügten Eintrags
    • lpp
    • lppp
    • r ("root") - Der übergeordnete Eintrag der obersten Ebene
    • spec ("special") - Der Eintrag wird unter denjenigen Eintrag gehängt, der mit sn=Y als special node gekennzeichnet wurde.

Beispiele

Siehe #tree_fillsql

#tree_fillsql

Füllt den Baum aus den Werten eines SQL-Statements. Es können dabei Einträge auf mehreren Ebenen angelegt werden. Die einzelnen Ebenen sind mit #tree_node zu definieren.

Parameter

  • cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • db ("DataBase") - Name der Datenbank, default ist die Default-Datenbank
  • fi ("first item") - Wenn Y, wird der erste hinzugefügte Eintrag anschließend selektiert. Default ist N, Funktionen werden ersetzt.
  • k ("key") - Die Parameter im SQL-Statement beginnen nach den Konventionen mit :k. Da keine weitere Parameter mit k beginnen, werden so Namenskonflikte vermieden. Siehe auch das zweite Beispiel.
  • m ("max") - Maximale Anzahl von Datensätzen in der Ergebnismenge, aus denen Baumeinträge erstellt werden
  • mex ("max expand") - Wenn die Zahl der hinzugefügten Einträge der obersten Ebene unter dieser Zahl liegt, dann werden die Einträge expandiert. Default 0.
  • q ("Quelle") - Quelle der Daten; default ist sql. (Relevant, wenn weitere Datenquellen hinzugefügt werden.)
    • sql - Das mit #sql erstellte SQL-Statement.
  • r ("rights") - damit der Einträge dem Baum hinzu gefügt werden, muss zumindest das Leserecht vorliegen. Default sind die Rechte des Formulars.
  • t ("table") - Name der Tabelle. Wird benötigt, wenn Werte in den Baum zurück geschrieben werden sollen.

Beispiele

#sql select *    from data_special      order by category, name;
#tree_node  u=root     k=category  c1=category   nc=Y   s="#fillgrid  d=xspecial_page_category"
#tree_node  u=last     t=data_special     c1=name     s="#fillgrid  d=xspecial_page_list"  
#tree_fillsql   mex=3
#sql select l.*    from data_list l  
#sql    left outer join data_list_item i          on l.data_list_id = i.data_list_id
#sql    left outer join translate_list_item t     on i.data_list_item_id = t.data_list_item_id 
#sql  where upper(l.name) like upper(:kedt)
#sql     or upper(i.value) like upper(:kedt)
#sql     or upper(t.value) like upper(:kedt)
#sql  order by l.name;
#tree_node  u=root     t=data_list     c1=name     s="#fillgrid  d=xlookup_page_list"   o=xlookup_open(list)
#tree_fillsql   kedt=$EDT(edt1)%   mex=3

#tree_fillpath

Füllt den Baum aus der Pfad-Spalte eines SQL-Statements. Die Ebene ist mit #tree_node zu definieren.

Das SQL-Statement kann mit #sql definiert werden, aber auch mit t, qw und qo zusammengesetzt werden. Das SQL-Statement muss nach dem Pfad sortiert sein.

Parameter

  • cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • db ("DataBase") - Name der Datenbank, default ist die Default-Datenbank
  • fi ("first item") - Wenn Y, wird der erste hinzugefügte Eintrag anschließend selektiert. Default ist N, Funktionen werden ersetzt.
  • k ("key") - Die Parameter im SQL-Statement beginnen nach den Konventionen mit :k. Da keine weitere Parameter mit k beginnen, werden so Namenskonflikte vermieden. Siehe auch das zweite Beispiel.
  • m ("max") - Maximale Anzahl von Datensätzen in der Ergebnismenge, aus denen Baumeinträge erstellt werden
  • mex ("max expand") - Wenn die Zahl der hinzugefügten Einträge der obersten Ebene unter dieser Zahl liegt, dann werden die Einträge expandiert. Default 0.
  • pfx ("prefix") - Dem eigentlichen Pfad vorangehende Zeichenfolge.
  • pn ("path name") - Name der Pfad-Spalte in der SQL-Abfrage
  • qo ("query order") - ORDER-Klausel für das zu erstellende SQL-Statement
  • qw ("query where") - WHERE-Klausel für das zu erstellende SQL-Statement
  • r ("rights") - damit der Einträge dem Baum hinzu gefügt werden, muss zumindest das Leserecht vorliegen. Default sind die Rechte des Formulars.
  • t ("table") - der Tabellenname der für den Eintrag maßgeblichen Tabelle

Beispiele

#sql select g.* from user_group g  where g.type = 'G'  order by path
#tree_node  u=exp    t=user_group    c1=path     s="#fillgrid  d=xuser_page_group"
#tree_fillpath   t=user_group   pn=path

#tree_fillthread

Ergänzt den Baum durch Daten aus einem Thread. Wird üblicherweise dazu verwendet, Daten aus einer anderen Datenbank zu ergänzen.

Parameter

  • cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • db ("DataBase") - Name der Datenbank, default ist die Default-Datenbank
  • k ("key") - Parameter im SQL-Statement; in der Ini des Baums (Sektion DATA) muss es einen Eintrag mit diesem Feldnamen geben.
  • u - Der übergeordnete Knoten, unterhalb dessen der Thread den Baum ergänzt; default r, Funktionen werden ersetzt
    • s ("selected") - der selektierte Baum-Eintrag
    • sp ("selected parent") - Der übergeordnete Eintrag des selektierten Eintrags
    • spp
    • sppp
    • o ("opening") - der Baum-Eintrag, der gerade expandiert wird.
    • l ("last") - der zuletzt eingefügt Baum-Eintrag
    • lp ("last parent") - Der übergeordnete Eintrag des zuletzt eingefügten Eintrags
    • lpp
    • lppp
    • r ("root") - Der übergeordnete Eintrag der obersten Ebene
    • spec ("special") - Der Eintrag wird unter denjenigen Eintrag gehängt, der mit sn=Y als special node gekennzeichnet wurde.

Beispiel

#sql  select vorname || ' ' || nachname as kname from asd where adrnr = :adrnr
#tree_fillthread   u=o   k=adrnr   db=ora_prod

#tree_sel

Selektiert einen Eintrag.

Bei den Typen rf, sf, rfa und sfa wird im Baum nach einem bestimmten Wert (oder zwei bestimmten Werten) durchsucht. An jedem Eintrag hängt eine Ini-Datei, in der verschiedene Werte gespeichert sind. Es wird dann der erste Eintrag selektiert, in dessen Ini-Feld f der Wert z steht. Die Groß- und Kleinschreibung wird dabei ignoriert.

Neben f und z können auch noch f2 und z2 gesetzt werden. Bei rf und sf sind diese beiden Suchkriterien (f/z und f2/z2) oder-verknüpft. Die Typen rf und sf werden auch bei nur einem Suchkriterium verwendet, da bei einer oder-Verknüpfung das Ergebnis und damit die Existenz eines zweiten Suchkriteriums egal ist. Mit rfa und sfa werden die Suchkriterien und-verknüpft.

Parameter

  • cnd ("condition") - nur wenn true, wir die Anweisung ausgeführt. Default true, Funktionen werden ersetzt.
  • f, f2 ("field") - der erste und zweite Feldname (nur für die Typen rf, sf, rfa und sfa)
  • o ("open") - wenn Y, wird der nach der Selektierung selektierten Eintrag expandiert; default N, Funktionen werden ersetzt
  • op ("open paretns") - wenn Y, werden nach der Selektierung alle übergeordneten Einträge des selektierten Eintrag expandiert; default N, Funktionen werden ersetzt
  • sic ("search in children") - wnn Y, werden auch die Unterknoten durchsucht; default N, Funktionen werden ersetzt
  • y - Typ der Prozedur
    • c ("child") - geht zum ersten untergeordneten Eintrag
    • cc ("childchild") - geht zum ersten untergeordneten Eintrag des ersten untergeordneten Eintrags
    • ccc - geht in der Hierarchie drei Stufen nach unten
    • cccc - geht in der Hierarchie vier Stufen nach unten
    • ccccc - geht in der Hierarchie fünf Stufen nach unten
    • p ("parent") - geht zum direkt übergeordneten Eintrag
    • pp ("parentparent") - geht zum übergeordneten Eintrag des übergeordneten Eintrags
    • ppp - geht in der Hierarchie drei Stufen nach oben
    • pppp - geht in der Hierarchie vier Stufen nach oben
    • ppppp - geht in der Hierarchie fünf Stufen nach oben
    • rf ("rootfind") - Sucht im kompletten Baum, die Suchkriterien sind oder-verknüpft
    • rfa ("rootfindand") - Sucht im kompletten Baum, die Suchkriterien sind und-verknüpft
    • sf ("selectedfind") - Sucht unterhalb des selektierten Eintrags, die Suchkriterien sind oder-verknüpft
    • s ("selected") - Selektiert den selektierten Eintrag erneut, ruft damit das Selektionskommando erneut auf
    • sfa ("selectedfindand") - Sucht unterhalb des selektierten Eintrags, die Suchkriterien sind und-verknüpft
    • sfo ("selectedfindopen") - Sucht unterhalb des selektierten Eintrags, die Suchkriterien sind oder-verknüpft; zuvor wird der Eintrag expandiert
    • sfoa ("selectedfindopenand") - Sucht unterhalb des selektierten Eintrags, die Suchkriterien sind und-verknüpft; zuvor wird der Eintrag expandiert; funktioniert auch als sfao
  • wsc ("without select command") - Wenn Y, wird der Eintrag selektiert, ohne das Selection-Kommando auszuführen; default N. Wird üblicherweise dann verwendet, wenn mit mehreren #tree_sel-Prozeduren durch den Baum navigiert wird und aus Gründen der Geschwindigkeit dazwischenliegende Seitenaufrufe vermieden werden sollen.
  • z, z2 - der erste und zweite Wert (nur für die Typen rf, sf, rfa und sfa)


Beispiel

#btn  c=test  w=120  s="#tree_sel  y=sf   f=data_list_id   z=7B0EC22C-8526-4FDB-8D10-0187ECF793C0   sic=Y"  se=b
#cmdclear
#cmd #tree_sel   y=c   o=Y
#cmd #tree_sel   y=c
#segbuttons  
#segbutton  c=Test  w=150   cmd=1

Im zweiten Beispiel soll in der Hierarchie zwei Stufen nach unten gegangen werden. Eigentlich würde das mit dem Typ cc gehen. Allerdings wird die unterste Ebene hier dynamisch nachgeladen, so dass eine Suche mit dem Typ cc ins Leere laufen würde. Die Lösung ist, zunächst mit dem Typ c eine Stufe nach unten zu gehen, dabei mit o=Y den Node zu expandieren und dabei dynamisch nachzuladen und dann mit dem Typ c eine weitere Stufe nach unten zu gehen.

#tree_back

Geht in die Baum-Historie einen Schritt zurück, also zum davor selektierten Eintrag.

Parameter

  • cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt

Beispiel

#btn  y=back   s=#tree_back  se=b
#btn  y=fwd   s=#tree_fwd  se=b

#tree_fwd

Geht in die Baum-Historie einen Schritt weiter. Kann zur aufgerufen werden, wenn zuvor zurück gegangen wurde.

Parameter

(keine)

Beispiel

#btn  y=back   s=#tree_back  se=b
#btn  y=fwd   s=#tree_fwd  se=b

$FND()

Sucht in der Ini-Datei des mit dem ersten Parameter spezifizierten Baum-Eintrags nach dem im zweiten Parameter übergebenen Feld und gibt dessen Inhalt zurück. Wird in der Ini-Datei kein entsprechender Eintrag gefunden, dann wird der Vorgang in den übergeordneten Einträgen so lange wiederholt, bis ein Eintrag mit diesem Feldnamen gefunden wurde oder es keine übergeordneten Einträge mehr gibt.

Parameter

  1. Eintrag im Tree
    1. s ("selected") - der selektierte Baum-Eintrag
    2. sp ("selected parent") - Der übergeordnete Eintrag des selektierten Eintrags
    3. spp
    4. sppp
    5. o ("opening") - der Baum-Eintrag, der gerade expandiert wird.
    6. l ("last") - der zuletzt eingefügt Baum-Eintrag
    7. lp ("last parent") - Der übergeordnete Eintrag des zuletzt eingefügten Eintrags
    8. lpp
    9. lppp
    10. r ("root") - Der übergeordnete Eintrag der obersten Ebene
  2. Feldname (Name des Eintrags in der Ini-Datei)
  3. optional: NULL-Value-Wert, also Ergebniswert, wenn der Inhalt des Feldes leer sein sollte

Beispiel

#grddata  q=sql   t=data_list   k_cat=$FND(s,category)

Page

#page

Das Kommando #page setzt einige Eigenschaften auf Seiten-Ebene.

Parameter

  • n - Name der Page; kann mit $PAGE() dann ermittelt werden
  • rar ("refresh after return") - wenn von dem Tab auf einen anderen gesprungen wird, und dieser Tab wird geschlossen, dann wird die Page aktualisiert, sofern rar=Y. Beim Formulartyp treepage wird das Selektionskommando des selektierten Baumeintrags neu aufgerufen, beim Formulartyp page wird das Kommando im Parameter rar der Prozedur #frm angegeben.
  • ras ("refresh after save") - wenn Y, wird die Seite nach dem Speichern erneut geladen; default N, Funktionen werden ersetzt
  • tac ("tab caption") - setzt die Beschriftung des jeweiligen Tabs des BAF-Clients; Funktionen werden ersetzt
  • y - Typ der Seite; default ist normal
    • dashhor
    • dashvert
    • normal

Beispiele

#page
#page   ras=Y

#page_fill

Füllt die Page neu.

Parameter

  • cmd ("command") - Das Kommando, das ausgeführt wird, um die Seite aufzubauen. (Alternativ d)
  • rs ("resize") - wenn Y, wird eine Größenänderungs-Nachricht an die Page gesendet, die bisweilen benötigt wird, damit die Seite korrekt aufgebaut wird; default N; Funktionen werden ersetzt.

Beispiel

#tree_fill   u=root   t=devtext   c1=name   f_parent=!   s="#page_fill   d=xdevtext_page_text"  o=xdevtext_open   fi=Y

#page_prim / #prim

Seiten werden zunächst in Primärregionen unterteilt (die keine sichtbaren Elemente haben), die Primärregionen wiederum in die Kategorien, und diese wiederum in die Sektionen.

Parameter

  • as ("AutoSize") - Wenn Y, wird die Größe der Primärregion dem Inhalt angepasst; default Y, Funktionen werden ersetzt
  • sz ("size") - Größe der Primärregion in Pixel; Funktionen werden ersetzt

Beispiele

#prim  
#prim  as=N  sz=500

#page_cat / #cat

Legt eine Kategorie an. Zuvor muss eine Primärregion angelegt worden sein. #page_cat und #cat sind äquivalente Bezeichner für dieselbe Prozedur.

Parameter

  • c ("Caption") - Beschriftung der Kategorie
  • as ("AutoSize") - Die Größe der Primärregion wird dem Inhalt angepasst
  • o ("opened") - wenn Y, dann wird die Kategorie geöffnet erzeugt; default Y; Funktionen werden ersetzt
  • oci ("open close ini") - Wenn ein Wert gesetzt ist, wird der Open/Close-Status in der User-Ini gespeichert und beim nächsten Aufruf der Seite so wiederhergestellt. Dem Parameter oci wird der Name des Eintrags in der Ini-Datei zugewiesen; Funktionen werden ersetzt.
  • sz ("size") - Größe der Primärregion in Pixel

Beispiel

#cat  as=N   sz=360   c=$T(Languages)   oci=lamguages

#page_val

Schreibt einen Wert in die Page, genauer gesagt in das mit i bezeichnete Segment. Zusätzlich oder alternativ kann eine Zelle selektiert werden.

Bei Text-, Memo- und Picture-Segmenten werden nur die Parameter i und z benötigt und beachtet. Die VL, Grid- und XGrid-Segmenten muss die Spalte und die Reihe spezifiziert werden.

Bei Picture-Segmenten wird die Eigenschaft Filename geschrieben, sie sollten q=file haben.

Parameter

  • c ("caption") - Verändert die Beschriftung des Segments
  • chg ("change") - Wenn Y, wird mit der Änderung die Zelle auf Changed gesetzt; default Y; Funktionen werden ersetzt
  • cnd ("Condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • col ("Column") - Index der Spalte, in welche der Wert geschrieben wird; wenn nicht gesetzt, dann wird der Parameter f verwendet
  • f ("field") - Feldname der Zelle oder der Spalte, in welche der Wert geschrieben wird; wird nur verwendet, wenn col nicht gesetzt ost
  • i ("item") - Name des Segments, in welches der Wert geschrieben wird
  • ie ("if empty") - Wenn Y, wird der Wert nur in die Zelle geschrieben, wenn diese leer ist; default N; Funktionen werden ersetzt
  • row - Index der Reihe, in die geschrieben wird. Alternativ sind bei Grid-Segmenten folgende Reihenbezeichnungen möglich:
    • all - der Wert wird in alle Reihen geschrieben
    • allsel ("all selected") - der Wert wird in alle Reihen geschrieben, die mit der in der Prozedur #grd_seg mit der Parameter sc ("selection column") spezifizierten Zelle selektiert wurden
    • looprow - die in der Ausführung der Prozedur #grd_loop gerade aktive Reihe
    • sel ("selected") - die aktuell selektierte Reihe
  • sr ("segment refresh") - Wenn Y, wird ein Refresh des Segments durchgeführt; default N, Funktionen werden ersetzt
  • y - Typ der Operation; Funktionen werden ersetzt, default val
    • allcol - Es werden alle Spalten auf Übereinstimmung mit dem Parameter f geprüft; wird vor allem in einem X-Grid verwendet
    • sel - Die Zelle wird selektiert und das Grid bekommt den Focus
    • val - Ein Wert wird geschrieben
    • valsel oder selval - Ein Wert wir geschrieben und die Zelle wird selektiert.
  • z - Wert, der geschrieben wird

Beispiel

#cmd #page_val   i=vl   col=1   row=4   z=$HASH($PVAL(vl,1,2),SHA512)

#page_check

Um Eingaben zu Validieren, können Checks definiert werden. Diese werden nach Benutzereingaben ausgeführt. Führen diese Checks zu Fehlern, so wird das Speichern der Daten verhindert. Die Fehlerliste wird statt des Trees angezeigt. Mit dem Beseitigen der Fehler oder dem verwerfen der Änderungen wird die Fehlerliste wieder ausgeblendet.

Parameter

  • c ("caption") - Text, der beim Scheitern der Prüfung in die Fehlerliste aufgenommen wird.
  • chk ("check") - Wenn nicht Y, dann gilt die Prüfung als gescheitert; Funktionen werden ersetzt
  • cnd ("condition") - Wenn Y, wird die Prüfung ausgeführt; Funktionen werden ersetzt
  • y - Typ des Checks; default e
    • e ("error") - Fehler
    • n ("none") - Check wird geprüft, aber nicht angezeigt und verhindert auch nicht da Speichern
    • w ("warning") - Warnung; wird angezeigt, aber verhindert nicht das Speichern

Beispiele

#page_check   c="Das Passwort muss mindestens 6 Zeichen lang sein"   chk="$BOOL($LEN($PVAL(vl,1,2)) > 5)"
#page_check   c="Die Bestätigung stimmt nicht mit dem Paswort überein"   chk="$BOOL($PVAL(vl,1,2) = $PVAL(vl,1,3))"

#page_ready

Wird eine Seite nicht über #page_fill erstellt, sondern dadurch, dass das Kommando direkt aufgerufen wird, so müssen die Routinen, welche nach Aufbau der Seite ausgeführt werden müssen, explizit aufgerufen werden; dazu dient #page_ready.

Parameter

  • rs ("resize") - wenn Y, wird eine Größenänderungs-Nachricht an die Page gesendet, die bisweilen benötigt wird, damit die Seite korrekt aufgebaut wird; default N; Funktionen werden ersetzt.

Beispiel

#page_ready

$PAGE()

Ermittelt den Namen der aktuellen Page.

Parameter

  1. Art der Wertes; default ist name
  • changecol - Der 0-relative Index der Spalte, in der gerade ein Wert geändert wird
  • changerow - Der 0-relative Index der Reihe, in der gerade ein Wert geändert wird
  • link - LinkValue
  • debuginfos - Infos zum Debugging
  • name - Name der Page

Beispiel

#btn  c=test  w=120  s="#message  c=$PAGE()"  se=b     h="Dies ist ein Test"

$PVAL()

Ermittelt einen Wert aus der Page

Text- und Memo-Segmente

Es muss nur der Name des Segments angegeben werden, $PVAL() gibt den kompletten Text zurück.

Grid- und XGrid-Segmente

Wie immer muss der Name des Segments als erster Parameter angegeben werden.

Als zweiter Parameter folgt entweder der Index der Spalte (0-relativ, die erste Spalte hat also den Index 0) oder der Feldname der Spalte.

Als dritter Parameter wird 0-relativ der Index der Zeile angegeben, alternativ eine Sonderzeile oder eine Aggregatfunktion.

Spaltenaggregate

Für Grid- und XGrid-Segmente können Spaltenaggreagte gebildet werden. Erste Parameter ist der Name des Segments, zweiter Parameter Index der Spalte oder Feldname, als dritter Parameter der Name der Aggregatfunktion:

  • count - Anzahl der Datensätze
  • sum - Summe der Werte
  • max - Maximum der Werte
  • min - Minimum der Werte
  • avg - Durchschnitt der Werte
  • med - Median der Werte
  • countsel - Anzahl der selektierten Datensätze
  • sumsel - Summe der Werte der selektierten Datensätze
  • maxsel - Maximum der Werte der selektierten Datensätze
  • minsel - Minimum der Werte der selektierten Datensätze
  • avgsel - Durchschnitt der Werte der selektierten Datensätze
  • medsel - Median der Werte der selektierten Datensätze
  • countvis - Anzahl der sichtbaren Datensätze
  • sumvis - Summe der Werte der sichtbaren Datensätze
  • maxvis - Maximum der Werte der sichtbaren Datensätze
  • minvis - Minimum der Werte der sichtbaren Datensätze
  • avgvis - Durchschnitt der Werte der sichtbaren Datensätze
  • medvis - Median der Werte der sichtbaren Datensätze

Reihenaggregate

Für Grid- und XGrid-Segmente können Reihenaggreagte gebildet werden. Erste Parameter ist der Name des Segments, zweiter Parameter die Funktion, die mit einem Fragezeichen beginnen muss, als dritter Parameter der Index der Reihe beziehungsweise eine Sonderreihe:

  • ?count - Anzahl der Spalten
  • ?sum - Summe der Werte
  • ?max - Maximum der Werte
  • ?min - Minimum der Werte
  • ?avg - Durchschnitt der Werte
  • ?all - Alle Zellenwerte, getrennt durch das Trennzeichen bzw. die Trennzeichenfolge in Parameter vier.

In einem Grid sind üblicherweise Spalten, für welche die Aggregatfunktion gebildet werden soll, mit anderen Spalten kombiniert. Um diese Spalten unterscheiden zu können, kann der Parameter grp der Spalte gesetzt werden. Bei der Berechnung der Reihenaggregate wird dann geschaut, ob die Zeichenfolge im fünften Parameter im Parameter grp der Spalte vorkommt; nur dann wird die betreffende Spalte berücksichtigt. Hinweis: Der Parameter grp der Spalte kann mehrere Gruppenbezeichner enthalten, wenn die betreffende Spalte für verschiedene Reihenaggregate verwendet wird. Diese können durch frei gewählte Trennzeichen getrennt werden, müssen aber nicht, sofern sie hinreichend unterscheidbar sind. Groß- und Kleinschreibung wird unterschieden.

Im sechsten Parameter kann der Ergebnistyp angegeben werden:

  • bool
  • curr
  • curr4
  • date
  • datemin
  • datesek
  • int

Die Funktion ?count wird jedoch immer als ganze Zahl dargestellt.

VL-Segment

Wie immer muss der Name des Segments als erster Parameter angegeben werden.

Als zweiter und dritter Parameter wird 0-relativ der Index der Spalte und der Zeile angegeben.

Alternativ kann als zweiter Parameter ein Feldname angegeben werden. $PVAL() durchsucht dann alle Reihen und Spalten des VL-Segments nach diesem Feldnamen.

Sonderzeilen

Statt der Bezeichnung über die Zeilennummer sind auch die folgenden Werte möglich:

  • change - die Zeile, in der die gerade geänderte Zelle liegt
  • checkrow - die aktuelle Zeile bei der Ausführung von $GRD_CHECK
  • calcrow - die Zeile, die gerade bei grd_calc verwendet wird
  • datarow - bezieht sich auf die aktuelle Zeile bei $PVAL
  • data - dieselbe Zeile im Grid wie das Kommando, das in dieser Zeile ausgeführt wird
  • linkrow - die Zeile eines ausgeführten Link-Kommandos
  • lookuplive - die Zeile, die gerade in Lookup-Live verwendet wird
  • looprow - die aktuelle Zeile bei der Ausführung von #grd_loop
  • radio - die mit einem Radio-Button gewählte Zeile; sc des Grid-Segments muss auf diese Spalte zeigen
  • saverow - beim Speichern des Grids die Zeile, die gerade gespeichert wird
  • sel - die selektierte Zeile

Sonderwerte

Bei Grid-, XGrid- und VL-Segmenten können Sonderwerte ermittelt werden. Es ist als zweiter Parameter ein Ausrufezeichen und als dritter Parameter der Name des Sonderwertes einzugeben:

  • looprow - der 0-relative Index der aktuellen Reihe in #grd_loop

Parameter

  1. Name des Segments
  2. Spaltenindex (0-relativ) oder Feldname; bei Sonderwerten ein Ausrufezeichen, !col bezieht sich auf die aktuelle Spalte, Reihenaggregate beginnen mit einem Fragezeichen
  3. Reihenindex (0-relativ), alternativ eine Sonderreihe:
    1. looprow - aktuelle Reihe in #grd_loop
    2. all - es werden alle Reihen zurückgegeben, als Trennzeichen wird der vierte Parameter verwendet
    3. allsel - es werden alle selektierten Reihen zurückgegeben, als Trennzeichen wird der vierte Parameter verwendet
  4. Trennzeichen(folge), wenn mehrere Zeilen zurückgegeben werden
  5. Spaltengruppe, wird nur bei Reihenaggreagten gebraucht
  6. Ergebnistyp, wird nur bei Reihenaggreagten gebraucht
  7. wenn display, dann wird der angezeigte Text (z.B. bei Nachschlagelisten) verwendet

Beispiele

#cmd #message c=$PVAL(item,value,1)
#text $PVAL(item,name,looprow) - $PVAL(item,description,looprow)
#clipboard   t=$PVAL(grid,adrnr,all,$CHR(crlf))
#grdcol   c1=Summe   y=curr   nd=Y   cmdn=$PVAL(grid,?sum,data,,csum)
#xgrd_col   c1="Gesamt"   w=80   nd=Y   ro=Y   cmd=$PVAL(gridxy,?sum,datarow,,sumc,int)   y=int   a=r   fc1=$PVAL(gridxy,!col,sum)   fa1=r   fy1=int

$CCI()

Ermittelt die Farbe für eine Zelle anhand eines ganzzahligen Wertes

Parameter

  1. Wert. Wenn !, dann der Wert der Zelle, deren Farbe gerade gesetzt werden soll.
  2. Wenn L (lower), dann muss der Wert gleich oder unterhalb des Vergleichswertes sein; andernfalls muss er gleich oder über dem vergleichswert
  3. Vergleichswert für die Farbe rot
  4. optional: Vergleichswert für die Farbe gelb - wird nur geprüft, wenn die Farbe nicht bereits rot
  5. optional: Vergleichswert für die Farbe grün - wird nur geprüft, wenn die Farbe nicht bereits rot oder gelb

Beispiel

#grd_col   f=dubletten   y=int   w=30   a=r   c1="D"   h1="Dubletten"   ccc=$CCI(!,,1)

Wenn die Anzahl der Dubletten 1 oder höher, wird die Farbe der Zelle auf rot gesetzt.

Segmente

Eine Page ist in Primär-Regionen, diese in Kategorien und diese wiederum in Segmente eingeteilt.

Segment-Typen

VL-Segment

Ein VL-Segment ist ein Grid zur Darstellung und Bearbeitung eines einzelnen Datensatzes.

Das Standard-VL-Segment (VL für "value list") ist zweispaltig: Links der Namen, rechts der Wert. Es können jedoch auch weitere Spalten ergänzt werden, so dass der zur Verfügung stehende Platz in der Horizontalen besser genutzt werden kann oder dass weitere Werte in unsichtbaren Spalten gespeichert werden können.

VL-Segment


Grid-Segment

Ein Grid-Segment dient zur Darstellung und Bearbeitung mehrerer Datensätze.

Ein Standard-Grid hat eine Kopfzeile, kann jedoch mehrere Kopf- und Fußzeilen haben.

Grid-Segment


XGrid-Segment

Ein XGrid-Segment ähnelt einem Grid-Segment. Allerdings besteht hier die Möglichkeit, Reihen einer Tabelle als Spalten zu ergänzen.

Im nachfolgenden Bild gehören alle Spalte bis einschließlich Status zur Tabelle todo_todo, während die folgenden Spalten (und auch die Anzahl der folgenden Spalten) davon abhängt, welche Gruppen dem jeweiligen ToDo-Typ zugeordnet sind.

XGrid-Segment


XXGrid-Segment

Ein XXGrid-Segment ("Double-X-Grid") ähnelt einem XGrid-Segment. Allerdings haben wir hier zwei Abfragen, die Spalten liefern.

Im nachfolgenden Bild haben wir einerseits die Kategorien für die Stichworte, und dahinter jeweils alle Reisenummern, die bei der betreffenden Reklamation bemängelt wurden. Somit kann schnell und übersichtlich angehakt werden, welches Stichwort für welche Reisenummer zutrifft.

XXGrid-Segment


Button-Segment

In ein Button-Segment können mehrere Buttons eingefügt werden.

Button-Segment mit zwei Buttons


Memo-Segment

Das Memo-Segment dient zu Anzeige und Bearbeitung von mehrzeiligem Text.

Memo-Segment


Text-Segment

Mit einem Text-Segment kann mehrzeiliger Text auf der Seite angezeigt werden. (Die zugrunde liegende Delphi-Komponente ist ein Memo, so dass der Text markiert und in die Zwischenablage kopiert werden kann.)

Text-Segmente werden bisweilen auch einfach dafür eingesetzt, den Abstand zwischen anderen Segmenten zu vergrößern.

Memo-Segment

Picture-Segment

Zeigt ein Bild an.

Gemeinsame Parameter aller Segmente

Die folgenden Parameter können in allen Segmenten genutzt werden:

Parameter

  • b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
  • c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
  • hp ("help path") - noch ohne Funtion
  • n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
  • mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
  • mho ("max height opened") - maximale Höhe im geöffneten Zustand
  • oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
    • c - Segment wird nur in geschlossenem Zustand angezeigt
    • o - Segment wird nur in geöffnetem Zustand angezeigt
    • oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
  • r ("rights") - Rechtedefinition
  • ro ("read only") - Wenn Y, kann der Anwender die Daten im Segment nicht ändern; default N, Funktionen werden ersetzt

Beispiel

#grd_seg    frc=1   fcc=1   clt=ss   mhc=300   n=test   c=" "   b=HAI   sc=0

Nachschlagelisten

Bei der Auswahl von Optionen werden häufig Nachschlagelisten eingesetzt.

Nachschlageliste

Definierte Nachschlagelisten

Mit xlookup können Nachschlagelisten definiert werden. Diese können in xlookup auch in die definierten Sprachen übersetzt werden.

Diese werden dann mit dem Parameter ld eingebunden:

#grd_col   f=status   c1="Status"   w=80   y=lookup   ld=srv_status

Nachschlagelisten aus SQL-Statements

Nachschlagelisten können auch mittels SQL-Statement erzeugt werden. Hier gibt es zwei Möglichkeiten.

Zum Einen können diese Statements in xspecial definiert werden. Sie werden dann mit dem Parameter ls eingebunden:

#grd_col   f=user_group_id   c1=$T(Group)   w=300    y=lookup   ls=system_groups_all

Zum Anderen kann das SQL-Statement auch im Quelltext stehen. Das ist insbesondere dann hilfreich, wenn einzelne Werte noch gesetzt werden müssen. Diese Statements müssen mit dem Parameter ld eingebunden werden, dem der Name des SQL-Statements übergeben wird (Statements, die - wie hier im Beispiel - mit #sql2 definiert wurden, werden mit ld=sql2 eingebunden).

#sql2   select ctype as ckey, name as cvalue from todo_type where ctype like '$CP(0)%'
...
xgrd_col   f=ctype   c1=$T(type)   y=lookup   ld=sql2   q=y2   w=150

Beiden Möglichkeiten ist gemeinsam, dass die beiden Spalten mit ckey und cvalue benannt werden müssen. Weitere Spalten sind unschädlich, werden aber ignoriert.

Nachschlagelisten aus Text-ValueLists

Eine Text-ValueList in eine Value-Liste, die in einem Text (text, text2, text3...) aufgebaut ist nach dem Muster key=value. Die Text-ValueList wird dem Parameter ld als tvl (text), tvl2 (text2), tvl3 (text3) und so weiter zugewiesen.

#vl_line   c1=Lieferant   f2=vendor_id   ro2=Y   nd2=Y   c3=" "   c4=Name   f5=vendor_url   y5=lookup   ld5=tvl2

LookupLive

Den zuvor erwähnten Möglichkeiten ist gemeinsam, dass alle Nachschlagelisten in einer Spalte stets gleich aussehen. Es können zwar unterschiedliche Werte gewählt werden, aber die Optionen in der Liste sind stets dieselben.

Manchmal benötigt man jedoch unterschiedliche Listen. Als Beispiel sei ein Grid genannt, in dem in einer Spalte eine Reise angegeben oder ausgewählt wird, und in einer anderen Spalte sollen in einer Nachschlageliste die Ausflüge gelistet werden, die zu dieser Reise buchbar sind. Und da die Reisen unterschiedliche Ausflüge haben, und auch unterschiedliche Reisen eingegeben werden können, sieht die Nachschlageliste in jeder Zeile unterschiedlich aus.

So etwas zu bewerkstelligen ist in BAF nicht weiter schwer: Es wird der Typ y=lookuplive verwendet mit mit llc (LookupLiveCommand) ein Kommando (Name oder Nummer) angegeben, das immer dann ausgeführt wird, wenn die Liste geöffnet wird (sowie beim erstmaligen Anzeigen - damit der Wert im Grid korrekt dargestellt werden kann). Mit diesem Kommando wird dann die Nachschlageliste gefüllt.

#cmd_clear
#cmd #sql select ckey, cvalue from data_list_item 
#cmd #sql    where data_list_id = '21DE9AF0-0C30-4222-A131-B855FAA85DEB'   
#cmd #sql       and (ckey = 1 or ckey <= $NVL($PVAL(grid,nummer,lookuplive),0))     order by csort
#cmd #grd_lookuplivefill 

#grd_col   f=lookup   c1="Lookup"   y=lookuplive   llc=1   

Hier im Beispiel wird ein lokales Kommando verwendet, das mit #cmd definiert wird. Damit das sicher leer ist, wird es zuvor mit #cmd_clear geleert. Das Kommando ist im Prinzip ein SQL-Statement sowie die Prozedur #grd_lookuplivefill, welche die Nachschlageliste füllt.

LookupLive-Nachschlagelisten wird meist unter Berücksichtigung von anderen Werten in derselben Zeile des Grids gefüllt - also muss auf diese zugegriffen werden. Dafür wird die Funktion $PVAL verwendet, welcher als dritter Parameter - nach Name des Grid und Name oder Nummer der Spalte - der Reihensonderbezeichner lookuplive mitgegeben wird, so dass immer dieselbe Zeile wie die jeweilige Nachschlageliste verwendet wird.

Hinweis: Bei neu angelegten Zeilen ist die betreffende Zelle in der Regel leer. Von daher wird üblicherweise $NVL eingesetzt, um einen Ersatzwert zu verwenden, damit zumindest das SQL-Statement syntaktisch korrekt ist und auf keine Fehlermeldung läuft. (Hinweis zum Beispiel: Es handelt sich hier um keine kurze Demonstration der Funktionalität ohne praktischen Sinn.)

Text-, Memo- und Button-Segmente

#text_seg

Legt ein Text-Segment an.

Parameter

Text-Segmente haben nur die gemeinsamen Parameter aller Segmente.

Beispiel

#text_seg  c=Test
#textline Erste Zeile
#textline Zweite Zeile

#text_line

Fügt einem Text-Segment eine Zeile hinzu. Die komplette Zeile nach dem Prozedurennamen und dem folgenden Leerzeichen wird als neue Zeile hinzugefügt.

Parameter

Die komplette Zeile nach dem Prozedurennamen und dem folgenden Leerzeichen wird als neue Zeile dem Segment hinzugefügt.

Beispiel

#text_seg  c=Test
#textline Erste Zeile
#textline Zweite Zeile

#memo_seg

Legt ein Memo-Segment an, also ein Segment, in dem mehrzeiliger Text bearbeitet werden kann.

Data

Mit q=data werden die Texte in der Tabelle data_memo gespiechert. Diese Tabelle ist dafür vorgesehen, mal schnell ein Bemerkungsfeld zu beliebigen Daten hinzuzufügen, ohne die jeweilige Datenbak-Tabelle erweitern zu müssen.

Der Datensatz in data_memo wird mit den Spalten item und ref referenziert. Item wird über den Parameter i gesetzt und ist zwingend. Für ref wird der Parameter k verwendet, der üblicherweise auf die ID-Spalte der Daten gesetzt wird, mit denen das Memo-Feld verbunden werden soll. Bleibt k leer, so wird none als Konstante eingefügt.

File

Mehrzeiliger Text kann auch einfach in einer Datei auf der Festplatte gespeichert werden. Dazu wird q=file und fn auf den gewünschten Dateinamen gesetzt. Möchte man für unterschiedliche Datensätze unterschiedliche Texte und damit unterschiedliche Dateinamen, so holt man einfach die ID oder eine andere eindeutige Spalte mit in den Dateinamen.

Link

Zellen in VL- und Grid-Segmente können problemlos mehrzeiligen Text speichern, sie können ihn aber nicht brauchbar anzeigen und bearbeiten. Mit q=link lässt sich ein Memo-Segment an ein VL- oder Grid-Segment hängen, so dass mehrzeiliger Text dort im Memo-Segment angezeigt und bearbeitet wird. Der Parameter i referenziert auf das VL- oder Grid-Segment, mit f wird die Datenbankspalte angegeben. Mit w=0 wird üblicherweise die entsprechende Spalte im VL- oder Grid-Segment ausgeblendet.

In einem Grid-Segment wird der Feldinhalt der gerade aktuellen Zeile angezeigt. Bei einem Zeilenwechsel ändert sich dann auch der Inhalt der Memo-Segments.

Datenänderungen werden über das VL- oder Grid-Segment gespeichert.

Parameter

  • f ("field") - bei q=link der Feldname im verbundenen Segment
  • fn ("file name") - Dateiname, wird für q=file verwendet; Funktionen werden ersetzt
  • k ("key") - Wert für die Spalte ref in data_memo
  • i ("item") - bei q=link Name des Segments, bei q=data der Item-Name; bei letzterem werden Funktionen ersetzt
  • q ("Quelle") - Herkunft der Daten
    • data - Daten werden in der Tabelle data_memo gespeichert; benötigt die Parameter i und meist auch k
    • file - Daten werden in einer Datei gespeichert; benötigt den Parameter fn
    • link - Daten werden in einem anderen Segment gespeichert; benötigt die Parameter i und vl
    • none - Lädt und speichert keine Daten; der eingegebene Text kann mit $PVAL ermittelt oder mit #page_val gesetzt werden
  • ww ("WordWrap") - Wenn Y, werden zu lange Zeilen automatisch umgebrochen; default Y, Funktionen werden ersetzt
  • z - Text des Memo-Segments; Wird von den Daten in q gegebenenfalls überschrieben

gemeinsame Parameter aller Segmenttypen

  • b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
  • c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
  • hp ("help path") - noch ohne Funtion
  • n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
  • mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
  • mho ("max height opened") - maximale Höhe im geöffneten Zustand
  • oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
    • c - Segment wird nur in geschlossenem Zustand angezeigt
    • o - Segment wird nur in geöffnetem Zustand angezeigt
    • oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
  • r ("rights") - Rechtedefinition
  • ro ("read only") - Der Anwender kann die Daten im Segment nicht ändern

Zusätzlich gibt es die Parameter aller Segmente.

Beispiele

#memo_seg   q=link   i=vl   f=code   c="Code"   b=H
#memo_seg   q=file   fn=i:\temp\test.txt   c=$T(Notes)
#memo_seg   q=data   i=memo_reise   k=$PVAL(vl,reise_id)   c=" "  b=H

#btns_seg

Legt ein Button-Segment an.

Parameter

Button-Segmente haben nur die gemeinsamen Parameter aller Segmente. Meist werden überhaupt keine Parameter benötigt.

Beispiel

#btns_seg

#btns_btn

Legt einen Button in einem Button-Segment an.

Parameter

  • c ("caption") - Beschriftung des Buttons; Funktionen werden ersetzt
  • cmd ("command") -Kommando, das ausgeführt wird, wenn auf den Button geklickt wird (und ggf. die Bestätigungsabfrage mit Ja beantwortet wurde); Funktionen werden ersetzt (zum Zeitpunkt des Buttons-klicks)
  • cnf ("confirmation") - Beim Mausklick auf den Button wird zunächst ein Bestätigungs-Dialog mit dem im Parameter cnf angegebenen Text angezeigt. Nur wenn dieser Bestätigungs-Dialog mit Ja geschlossen wird, wird cmd ausgeführt. Funktionen werden bei Anzeige des Bestätigungs-Dialogs ersetzt. Ist cnf leer, unterbleibt die Anzeige.
  • r ("rights") - Rechte-Definition des Buttons; zum Ausführen des Buttons werden Schreibrechte benötigt; default sind die Rechte des Formulars
  • se ("status enabled") - Je nach Status des Formulars ist der Button enabled oder nicht (es können mehrere Status-Buchstaben in beliebiger Reihenfolge kombiniert werden); Funktionen werden ersetzt
    • b ("browse") - Normalzustand des Formulars
    • c ("changed") - Nachdem Daten geändert wurden
    • e ("editing") - Während einer Editierung
    • f ("failed") - Die Plausibilitätsprüfung wurde nicht bestanden
  • ro ("read only") - Mit Y wird die Ausführung des Buttons gesperrt; Funktionen werden ersetzt
  • w ("width") - Breite des Buttons

Beispiel

#btns_seg  
#btns_btn  c=$T(Test_special)  w=150   cmd="#pagefill  d=xspecial_page_list(test)"

VL-Segmente

VL-Segmente ("Value List") sind Gitter-Segmente zur Anzeige eines einzelnen Datensatzes.

Im Standard-Fall sind VL-Segmente zweispaltig: Auf der linken Seite wird die Beschriftung angezeigt, auf der rechten Seite der jeweilige Wert des Datensatzes.

VL-Segmente können aber auch mehr als zwei Spalten haben. Das können unsichtbare Spalten sein, um Daten für z.B. ein Memo-Segment zu beinhalten, das können aber auch sichtbare Spalten sein, um den Platz auf dem Bildschirm besser auszunutzen.

#vl_seg

Mit der Prozedur #vl_seg wird ein VL-Segment angelegt.

Parameter

  • cc ("ColumnCount") - Anzahl der Spalten; default 2; Funktionen werden ersetzt
  • clt (column line type) - Spezifiziert, ob Spalten verbreitert oder umgebrochen werden; default sf; Funktionen werden ersetzt
    • mf - multi line fixed
    • ms - multi line stretch
    • sf - single line fixed
    • ss - single line stretch
  • fcc (fixed columns count) - Spalten, die auch beim Scrollen links angezeigt werden; Wird bei #vl_seg sehr selten verwendet; default 0
  • w ("width") - Breite der Spalte (w1, w2, w3...); Funktionen werden ersetzt
  • wst ("width stretch") - Anzahl der Pixel, um welche die Spalte maximale verbreitert wird (wst1, wst2, wst3...); Funktionen werden ersetzt; findet nur bei clt=ss und clt=ms Verwendung
  • whs (without horizontal scrollbar) - Blendet einen horizontalen Scrollbalken komplett aus, das Grid wird dadurch 20 Pixel weniger hoch.


gemeinsame Parameter aller Segmenttypen

  • b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
  • c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
  • hp ("help path") - noch ohne Funtion
  • n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
  • mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
  • mho ("max height opened") - maximale Höhe im geöffneten Zustand
  • oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
    • c - Segment wird nur in geschlossenem Zustand angezeigt
    • o - Segment wird nur in geöffnetem Zustand angezeigt
    • oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
  • r ("rights") - Rechtedefinition
  • ro ("read only") - Der Anwender kann die Daten im Segment nicht ändern

Beispiel

#vl_seg  cc=3  clt=ss   w1=100   w2=200   wst2=200   w3=200   n=vl   c=" "   b=H

#vl_line

Legt eine Zeile in einem VL-Segment an

Parameter

Die Parameter in #vl_line haben als Postfix die Nummer die Spalte, auf die sie sich beziehen.

  • c1, c2... ("caption") - Beschriftung der Spalte; Wird die Beschriftung ersetzt, wird die Zelle auf ReadOnly gesetzt; Funktionen werden ersetzt
  • chg1, chg2... ("change") - Kommando, das ausgeführt wird, wenn der Inhalt der Zelle geändert wird; siehe auch Beispiel für chg
  • ci1, ci2... (characters ignore) - Zeichen, die bei der Eingabe über die Tastatur ignoriert werden; default leer; Funktionen werden ersetzt
  • cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • cs1, cs2... ("col span") - Werte größer 1 fügen Zellen zusammen; default 1
  • cy1, cy2... ("char type")
    • l - LowerCase
    • n - Normal
    • u - UpperCase
  • f1, f2... ("field") - Feldname in der Datenbank
  • h1, h2... ("hint") - Feldname in der Datenbank für den Hinweistext, ersatzweise der Hinweistext selbst
  • ld1, ld2... ("lookup data") - Name der Lookup-Liste, wenn der Datentyp lookup; Alternativ sql1, sql2..., um die Daten aus einem SQL-Statement zu ziehen
  • ls1, ls2... ("lookup special") - Alternativ zu ld: Name des Specials, wenn die Daten aus einem Special gezogen werden sollen
  • l1, l2... ("length") - Zeichenlänge der Zelle
  • nd1, nd2... ("no data") - Daten werden beim Speichern nicht zurück in die Datenbank geschrieben; Änderungen an den Daten versetzen das VL-Segment und somit die Page nicht in den Changed-Status
  • nv1, nv2... ("no value") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist
  • nvc1, nvc2... ("no value change") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment in den Changed-Modus gesetzt
  • nvi1, nvi2... ("no value insert") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment auch in den Insert-Modus gesetzt
  • nvic1, nvic2... ("no value insert change") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment in den Insert- und Changed-Modus gesetzt
  • pw1, pw2... ("password") - Wenn Y, dann werden statt des Inhalts Punkte angezeigt; Funktionen werden ersetzt
  • q1, q2... ("Quelle") - Datenquelle für die Zelle; siehe auch Beispiel für Datenquelle
  • r1, r2... ("rights") - Rechtedefinition der Zelle
  • ro1, ro2... ("read only") - Zelle kann nicht bearbeitet werden
  • y1, y2... ("type") - Datentyp der Spalte; default ist text
    • bool - bool'sche Felder mit Y und N; wird als Checkbox dargestellt
    • bool2 - bool'sche Felder, Y wird als angehakte Checkbox dargestellt, N als leeres Feld
    • curr - Currency, also Zahlen mit zwei Nachkommastellen
    • curr4 - Zahlen mit vier Nachkommastellen
    • date - Datum im Format dd.mm.yyyy
    • datemin - Datum im Format dd.mm.yyyy hh:mm
    • datesec / datesek - Datum im Format dd.mm.yyyy hh:mm:ss
    • guid - Inhalt wird als drei Punkte dargestellt; wird für GUIDs verwendet, die sich dann aber kopieren lassen
    • iban - noch nicht implementiert
    • int - Integer, also ganze Zahlen
    • link - Link-Symbol
    • lookup - Nachschlageliste
    • lookuplive - Nachschlageliste, die beim Öffnen neu und auch für jede Zelle individuell geladen wird
    • text - normaler Text
    • todo - Symbole für ToDo-Listen
    • triex - drei Symbole: 0, ? und !
    • triplus - drei Symbole: 0, - und +
  • z1, z2... - Wert der Zelle; im Unterschied zur Caption wird der Wert von #vl_data überschrieben, die Zelle wird auch nicht auf ReadOnly gesetzt.

Beispiele

#vl_line   c1="Name"   f2=name
#vl_line   c1="Type"   f2=type   ro=Y   y2=lookup   ld2=user_group_type   nv2=$FND(s,type)
#vl_line   c1="Data Special Id"   f2=data_special_id   ro2=Y   nvic2=$GUID()   f3=code

Beispiel für chg

#cmdclear
#cmd #page_val   i=vl   col=1   row=4   z=$HASH($PVAL(vl,1,2),SHA512)
...
vl_line   c1=$T(new_password)    nd2=Y     chg2=1   pw2=Y

Beispiel für Datenquelle

Im Normalfall ist mit einem VL-Segment immer nur eine Tabelle verbunden. Mit Hilfe eines Joins können zwar Daten aus mehreren Tabellen angezeigt werden, aber üblicherweisen werden die Daten nur in eine Tabelle zurück geschrieben, die anderen Zellen sind mit nd=Y gekennzeichnet.

Sollen Daten jedoch in mehrere Tabellen zurückgeschrieben werden, dann ist das Vorgehen das Folgende:

  • Die weiteren Tabellen benötigen eine Schlüsselspalte, welche denselben Inhalt wie die primäre Tabelle hat. Gegebenenfalls muss diese Spalte ergänzt werden. Bei der Benennung dieser Spalte gibt es zwei Möglichkeiten:
    • Die Spalte heißt genau so wie die Schlüsselspalte in der primären Tabelle (hier im Beispiel hat die Tabelle test_test2 die ID test_test2_id, und die angehängte Tabelle test_test2_add hat auch die ID test_test2_id - und nicht test_test2_add_id).
    • Die Spalte heißt nicht so wie die Schlüsselspalte in der primären Tabelle (hier im Beispiel hat die Tabelle test_add3 die Schlüsselspalte test_add3_id); die bei BAF "übliche" Benennung mit einem angehängten _id wie hier bei test_add3 ist zu bevorzugen.
  • Es wird ein SQL-Statement erstellt, um diese Tabellen zusammenzufügen. Die angehängten Tabellen werden mit einem left outer join verbunden. Dort, wo die ID-Spalten der angehängten Tabellen gleich wie in der primären Tabelle heißen (im Beispiel test_test2_id), werden sie umbenannt (im Beispiel yid).
  • In #vl_data werden die weiteren Tabellen als t2, t3... aufgezählt; hier im Beispiel t2=test_tes2_add und t3=test_add3. Wo sich der Name der Schlüsselspalte nicht auf dem Tabellennamen ableiten lässt, sind auch die Schlüsselspalten entsprechend anzugeben als k2, k3...; hier im Beispiel k2=yid
  • Die Schlüsselspalten der ergänzten Tabellen sind im VL-Segment zu speichern. Üblicherweise wird dafür eine ausgeblendete Spalte verwendet.
  • Bei jeder Zelle, die in einer der angehängten Tabellen gespeichert werden soll, ist mit dem Parameter q anzugeben, welches die angehängte Tabelle ist. y2 ist t2, y3 ist t3... (hier im Beispiel q2, weil die Daten in der zweiten Spalte der VL-Segments stehen).
  • Dort, wo Schlüsselspalten gleich heißen wie in der primären Tabelle und deswegen im SQL-Statement umbenannt werden müssen (hier im Beispiel yid statt test_test2_id), muss der Spaltenname in der Tabelle mit yf angegeben werden, damit die Daten korrekt zurück geschrieben werden (hier im Beispiel yf3=test_test2_id - die Ziffer 3 bei yf3 bezieht sich auf die (unsichtbare) Spalte im VL-Segment, nicht auf die Nummer der Tabelle)
  • Es ist sicherzustellen, dass alle beteiligten Tabellen dieselben Schlüsselwerte bekommen. Zu diesem Zweck wird im Beispiel die ID der primären Tabelle in den Value 1 geschrieben, ersatzweise wird eine neue GUID verwendet. Dieser Value wird dann mittels nvi in alle Schlüsselfelder geschrieben.
#setval   n=1   z=$FND(s,test_test2_id)   ie=$GUID()

#vl_seg  cc=3  clt=ss   w1=100  w2=200   wst2=200  w3=0   n=vl   c=" "  b=H
#vl_line   c1="ID"   f2=test_test2_id   ro2=Y   nvic2=$VAL(1)     f3=yid   yf3=test_test2_id    q3=y2   nvi3=$VAL(1)
#vl_line   c1="Zahl"   f2=zahl   f3=test_add3_id   q3=y3   nvi3=$VAL(1)
#vl_line   c1="Text"   f2=text
#vl_line   c1="Todo"   f2=boolsch   y2=todo
#vl_line   c1="Add 1"   f2=add_1     q2=y2
#vl_line   c1="Add 2"   f2=add_2     q2=y2
#vl_line   c1="Add 3"   f2=add_3     q2=y2
#vl_line   c1="Add 31"   f2=add31     q2=y3
#sql select t.test_test2_id, t.zahl, t.text, t.boolsch, a.test_test2_id as yid, a.add_1, a.add_2, a.add_3, b.test_add3_id, b.add31
#sql   from test_test2 t
#sql     left outer  join test_test2_add a on a.test_test2_id = t.test_test2_id 
#sql     left outer join test_add3 b on b.test_add3_id = t.test_test2_id 
#sql   where t.test_test2_id = :kid
#vl_data   q=sql   t=test_test2      t2=test_test2_add   k2=yid   t3=test_add3   kid=$FND(s,test_test2_id)

#vl_data

Füllt ein VL-Segment mit Daten

Parameter

  • k ("key") - Name der Schlüsselspalte; default ist der Tabellenname mit einem angehängten _id
  • k ("key") - Als Prefix für alle SQL-Parameter; siehe Beispiel; Funktionen werden ersetzt
  • kid ("key id") - bei q=t der Wert der Schlüsselspalte, damit der Datensatz lokalisiert werden kann
  • q ("Quelle") - Datenherkunft
    • sql - SQL-Statement
    • t - Table
  • t ("table") - Name der Tabelle; obligatorisch bei q=t und wenn bei q=sql die Daten zurückgeschrieben werden sollen; Funktionen werden ersetzt
  • t2, t3... ("table") weitere Tabellen, in die Daten gespeichert werden sollen; siehe Beispiel für Datenquelle in #vl_line

Beispiele

#vl_data   q=t   t=data_list   kid=$FND(s,data_list_id)  

#sql select * from menu_category where menu_category_id = :k_menu_category_id
#vl_data   q=sql   t=menu_category   k_menu_category_id=$FND(s,menu_category_id)

#sql select * from menu_category where menu_category_id = :kid
#vl_data   q=sql   t=menu_category   kid=$FND(s,menu_category_id)

#vl_hist

Definiert die Rechte für ein Feld in der History-Ansicht. Funktioniert auch mit #grd_seg, #xgrs_seg und #xxgrd_seg

Parameter

  • f ("field") - Name der Spalte in der Tabelle
  • r ("rights") - Name der Rechtedefinition für diese Spalte

Beispiel

#vl_line  c1=$T(Description)   f2=description   l2=80   r=admin
#vl_hist   f=description   r=admin

In diesem Beispiel wird durch r=admin in #vl_line dafür gesorgt, dass nur Administratoren die Beschreibung im VL-Segment sehen. Mit der Anweisung #vl_hist wird sichergestellt, dass andere als Administratoren den Spalteninhalt auch nicht über die Historie einsehen können.

#vl_thread

Ergänzt Daten mittels eines Thread. Wird üblicherweise dazu verwendet, Daten aus anderen Datenbanken zu ergänzen.

Parameter

  • chg ("change") - Wenn Y, werden Zellen, die durch den Thread gefüllt werden, als geändert gekennzeichnet; default N, Funktionen werden ersetzt
  • cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • db ("DataBase") - Datenbank, in der das Statement ausgeführt wird.
  • i ("item") - Name des VL-Segments; Funktionen werden ersetzt, default ist das zuletzt eingefügte Segment
  • k ("key") - Parameter im SQL-Statement; im VL-Segment muss es eine Spalte mit diesem Feldnamen geben.

Beispiel

#sql select bezeichnung from rsd where aktion = $PVAL(vl,aktion)
#vl_thread   db=ora_prod   i=vl

Grid-Segmente

Grid-Segmente sind Segmente, in denen in Tabellenform mehrere Datensätze einer Datenbanktabelle oder einer SQL-Abfrage angezeigt werden. Grid-Segmente können Kopf- und Fußzeilen haben (default 1 Kopfzeile, 0 Fußzeilen)

#grd_seg

Mit der Prozedur #grd_seg wird ein Grid-Segment angelegt.

Parameter

  • acmd (add command) - Kommando, das ausgeführt wird, wenn auf den Button + geklickt wird.
  • clt (column line type) - Spezifiziert, ob Spalten verbreitert oder umgebrochen werden; default sf; Funktionen werden ersetzt
    • mf - multi line fixed
    • ms - multi line stretch
    • sf - single line fixed
    • ss - single line stretch
  • fcc (fixed columns count) - Spalten, die auch beim Scrollen links angezeigt werden; default 0; Funktionen werden ersetzt
  • frc (footer row count) - Anzahl der Fußzeilen; default 0; Funktionen werden ersetzt
  • hrc (header row count) - Anzahl der Kopfzeilen; default 0; Funktionen werden ersetzt
  • sc (selection column) - Spaltenindex der Selection-Zeile. Ein Grid-Segment kann eine Selection-Spalte haben, also eine Spalte vom Typ bool, mit deren Hilfe einzelne Zeilen ausgewählt werden können. Default ist -1, Funktionen werden ersetzt.
  • whs (without horizontal scrollbar) - Blendet einen horizontalen Scrollbalken komplett aus, das Grid wird dadurch 20 Pixel weniger hoch.


gemeinsame Parameter aller Segmenttypen

  • b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
    • A ("active") setzt in der mit sc spezifizierten Spalten alle Zellen auf Y; ist das Grid gefiltert, werden nur die gefilterten Zellen gesetzt.
    • F ("filter") öffnet den Filter-Dialog
    • H ("history") öffnet den History-Dialog
    • I ("inactive") setzt in der mit sc spezifizierten Spalten alle Zellen auf N; es werden immer alle Zellen auf N gesetzt, auch wenn sie ausgefiltert sind
    • X ("xlsx") exportiert das Grid im xlsx-Format
    • Y exportiert das Grid im pdf-Format
    • + führt acmd aus (nur #grd_seg); wird üblicherweise dazu verwendet, einen Datensatz hinzuzufügen
  • c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
  • hp ("help path") - noch ohne Funtion
  • n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
  • mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
  • mho ("max height opened") - maximale Höhe im geöffneten Zustand
  • oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
    • c - Segment wird nur in geschlossenem Zustand angezeigt
    • o - Segment wird nur in geöffnetem Zustand angezeigt
    • oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
  • r ("rights") - Rechtedefinition
  • ro ("read only") - Der Anwender kann die Daten im Segment nicht ändern

Beispiel

#grd_seg   frc=0   fcc=1   clt=ss   mhc=300   n=item

#grd_col

Mit der Prozedur #grd_col wird eine Spalte in einem Grid-Segment definiert.

Parameter

  • a (align) - Ausrichtung des Textes in der Spalte; default ist l.
    • c (center) - Text wird zentriert ausgerichetet
    • d2 (decimal 2) - Text wird rechtsbündig für zwei Nachkommastellen ausgerichtet
    • d4 (decimal 4) - Text wird rechtsbündig für vier Nachkommastellen ausgerichtet
    • l (left) - Text wird linksbündig ausgerichtet
    • r (right) - Text wird rechtsbündig ausgerichtet
  • a1, a2... (align) - [Header] Ausrichtung des Textes des Headers der Spalte der ersten, zweiten... Zeile. Zulässige Werte siehe Parameter a.
  • c (caption) - Spalten-Titel im Filter-Formular; Funktionen werden ersetzt. Bleibt dieser Parameter leer, so wird ersatzweise c1 verwendet.
  • c1, c2... (caption) - [Header] Spalten-Titel der ersten, zweiten... Zeile; Funktionen werden ersetzt.
  • ccc (CellColorCommand) - Kommando, das die Farbe der Zelle setzt.
  • ci (characters ignore) - Zeichen, die bei der Eingabe über die Tastatur ignoriert werden; default leer; Funktionen werden ersetzt
  • chg (change) - Kommando, das ausgeführt wird, wenn der Inhalt der Zelle geändert wird.
  • cmd (command) - Kommando, zum Beispiel für Verlinkung oder die Formatierung; Funktionen werden sofort ersetzt.
    • no_crlf - Zeilenumbüche werden durch Leerzeichen ersetzt
    • conv_yyyy - Datum im Format yyyymmddhhmmss wird nach dd.mm.yyyy hh:mm:ss und yyyymmdd nach dd.mm.yyyy konvertiert
  • cmdn (command no) - Kommando, zum Beispiel für Verlinkung; Funkionen werden erst bei Ausführung des Kommandos ersetzt; wird nur berücksichtigt, wenn cmd leer ist.
  • cs1, cs2... (ColSpan) - [Header] Die Zelle des Spaltentitels der ersten, zweiten... Zeile überspannt die angegebene Anzahl an Spalten. Default ist 1; Funktionen werden ersetzt.
  • cy (character type) - Groß- und Kleinschreibung; default ist n
    • l (lower case) - Spalte wird in Kleinbuchstaben dargestellt
    • n (normal) - Groß- und Kleinschreibung wie eingegeben
    • u (upper case) - Spalte wird in Großbuchstaben dargestellt
  • f (fieldname) - Feldname der Spalte in der Datenmenge; Funktionen werden ersetzt.
  • f1, f2... (fieldname) - [Header] Feldname des Spaltentitels der ersten, zweiten... Zeile; Funktionen werden ersetzt. Sind auch die Parameter c1, c2... gesetzt, dann werden die Texte zusammengefügt, wobei der Text aus c1, c2... vorangestellt wird.
  • fa1, fa2... (footer align) - [Footer] Ausrichtung des Textes der Fußzeile der Spalte der ersten, zweiten... Zeile. Zulässige Werte siehe Parameter a.
  • fc1, fc2... (footer caption) - [Footer] Spalten-Fußzeile der ersten, zweiten... Zeile. Ist im Text ein $-Zeichen enthalten, dann wird der Text als Zellen-Kommando interpretiert.
  • fcs1, fcs2... (footer ColSpan) - [Footer] Die Zelle der Fußzeile der ersten, zweiten... Zeile überspannt die angegebene Anzahl an Spalten. Default ist 1; Funktionen werden ersetzt.
  • ff1, ff2... (footer fieldname) - [Footer] Feldname des Fußzeile der ersten, zweiten... Zeile; Funktionen werden ersetzt. Sind auch die Parameter fc1, fc2... gesetzt, dann werden die Texte zusammengefügt, wobei der Text aus fc1, fc2... vorangestellt wird.
  • fh1, fh2... (footer hint) - [Footer] Feldname des Hint-Textes der Spalte der ersten, zweiten... Fußeile; Funktionen werden ersetzt. Gibt es in der Datenmenge keine Spalte dieses Namens, dann wird der Wert als Konstante ausgegeben.
  • fy1, fy2... (footer Typ) - [Footer] Datentyp des Datentyps der ersten, zweiten... Fußzeile; default ist text. Zulässige Werte siehe y.
  • h (hint) - Feldname des Hint-Textes in der Datenmenge; Funktionen werden ersetzt.
  • h1, h2... (hint) - [Header] Feldname des Hint-Textes der Spalte der ersten, zweiten... Zeile; Funktionen werden ersetzt. Gibt es in der Datenmenge keine Spalte dieses Namens, dann wird der Wert als Konstante ausgegeben.
  • jy (join type) - Im Standardfall werden bei Join-Gruppierung die Daten durch Kommata getrennt dargestellt. Sie können jedoch auch summiert werden, dafür ist jy=sum zu setzen.
  • l (length) - Maximale Länge in Zeichen bei der Eingabe
  • ld (LookupData) - Name der Nachschlageliste beim Spaltentyp y=lookup
  • llc (LookupLiveCommand) - Name oder Nummer des Kommandos, das beim Spaltentyp y=lookuplive verwendet wird; ls und ls dürfen nicht gesetzt werden
  • ls (LookupSpecial) - Name des Specials (hinterlegte SQL-Anweisung in xspecial), wird nur berücksichtigt, wenn ld nicht gesetzt ist
  • nd (no data) - Spalte wird beim Speichern nicht berücksichtigt; Änderungen versetzen das Grid auch nicht in den Zustand changed.
  • nv ("no value") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist
  • nvc ("no value change") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment in den Changed-Modus gesetzt
  • nvi ("no value insert") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment auch in den Insert-Modus gesetzt
  • nvic ("no value insert change") - Wert, der eingefügt wird, wenn das Feld in der Datenmenge leer ist; dann wird das Segment in den Insert- und Changed-Modus gesetzt
  • q (quelle) - Datenquelle für das Grid.
    • j, join - Daten aus einem Datenbank-Join werden gruppiert dargestellt
    • s, sql - SQL-Statement
    • t, tbl, tab, table - Datenbanktabelle
  • r (right) - Rechtedefinition der Spalte. Sofern nur ein Leserecht vorliegt, wird die Spalte ReadOnly. Sofern kein Recht vorliegt, wird die Spalte ausgeblendet und auch nicht in der Historie angezeigt.
  • ro (ReadOnly) - Wenn Y, dann kann die Spalte nicht beschrieben werden.
  • rof (ReadOnlyField) - Wenn der Inhalte der angegebenen Datenbankspalte Y ist, dann kann die betreffende Zelle nicht beschrieben werden.
  • ss1, ss2... (SortSymbols) - [Header] Mit Mausklick auf den Spaltentitel kann nach dieser Spalte sortiert werden, mit einem weiteren Mausklick die Sortierrichtung umgekehrt werden. Es werden dabei entsprechend Symbole rechts im Spaltentitel angezeigt. Um eine Sortierung zu verhinden, kann ss1, ss2... auf N gesetzt werden. Funktionen werden ersetzt.
  • w (width) - Breite der Spalte in Pixel; Funktionen werden ersetzt.
  • wst (width stretch) - Anzahl von Pixel, welche die Spalte maximal verbreitert wird, wenn Platz dafür da ist. Voraussetzung dafür ist, dass der Parameter clt von #grd_seg den Wert ss oder ms hat. Funktionen werden ersetzt.
  • y (typ) - Datentyp der Spalte; default ist text
    • bool - bool'sche Felder mit Y und N; wird als Checkbox dargestellt
    • bool2 - bool'sche Felder, Y wird als angehakte Checkbox dargestellt, N als leeres Feld
    • curr - Currency, also Zahlen mit zwei Nachkommastellen
    • curr4 - Zahlen mit vier Nachkommastellen
    • date - Datum im Format dd.mm.yyyy
    • datemin - Datum im Format dd.mm.yyyy hh:mm
    • datesec / datesek - Datum im Format dd.mm.yyyy hh:mm:ss
    • guid - Inhalt wird als drei Punkte dargestellt; wird für GUIDs verwendet, die sich dann aber kopieren lassen
    • iban - noch nicht implementiert
    • int - Integer, also ganze Zahlen
    • link - Link-Symbol
    • lookup - Nachschlageliste
    • lookuplive - Nachschlageliste, die beim Öffnen neu und auch für jede Zelle individuell geladen wird
    • text - normaler Text
    • todo - Symbole für ToDo-Listen
    • triex - drei Symbole: 0, ? und !
    • triplus - drei Symbole: 0, - und +
  • xw (xlsx width) - Spaltenbreite, wenn das Segment im Excel-Format exportiert wird; wenn leer, wird statt dessen w verwendet; Funktionen werden ersetzt
  • yf (Y fieldname) - Feldname der Spalte in einer zusätzlichen Datenmenge; Funktionen werden ersetzt.

Beispiele

#grd_col   f=translate_list_item_id   c1=ID   w=30   y=guid   ro=Y   nvi=$GUID()
#grd_col   f=user_group_id   c1=$T(group)   y=lookup   ls=system_groups_all   w=200   wst=200
#grd_col   f=dubletten   y=int   w=30   a=r   c1="D"   h1="Dubletten"   ccc=$CCI(!,,1)

#grd_data

Füllt das Grid mit Daten aus der Dankenbank.

Parameter

  • c ("Caption") - Beschriftung des Segments, wenn der Thread ausgeführt wurde; nur für thread und xmlthread; Funktionen werden ersetzt
  • db ("DataBase") - Name der Datenbankverbindung, aus der die Daten bezogen werden; Funktionen werden ersetzt, default ist die Standard-Datenbankverbindung
  • gc (grid cache) - Erhält dieser Paremeter einen Wert, dann wird das SQL-Statement nur beim erstmaligen Aufruf von #grd_data ausgeführt. Die Daten werden dann in einem Cache gespeichert, so dass erneute Aufrufe weniger lange dauern. Der Inhalt das Parameters wird als Name für die Seite im Cache verwendet und muss eindeutig sein - im Zweifelsfall verwendet man eine GUID. Hinweise: Wenn weitere Spalten der Abfrage und dem Grid hinzugefügt werden, bleiben diese erste mal leer. Auch Veränderungen der Daten durch andere User bleiben erst mal unsichtbar. Ein erneuter Start der BAF-Clients führt zu einem leeren Cache und somit zur erneuten Ausführung des SQL-Statements.
  • ior (insert one row) - Wenn Y, wird eine (leere) Zeile eingefügt, wenn die Datenmenge leer ist; default N; Funktionen werden ersetzt
  • jk (join key) - Feldname der Spalte, nach der bei q=j gruppiert wird
  • k (key) - Name der Schlüsselspalte; per default der Tabellennamen plus ein angehängtes _id; Funktionen werden ersetzt
  • k2, k3... - Name der Schlüsselspalten weiterer Tabellen; per default der Tabellennamen plus ein angehängtes _id
  • Prefix k - Prefix für SQL-Parameter
  • m ("maximum") - Nach dieser Anzahl von Zeilen wird abgebrochen; default MaxInt (2 147 483 647), Funktionen werden ersetzt
  • mk ("merge key") - Die Spalte, die das Entscheidungskriterium bei q=merge beinhaltet.
  • ocd (open cat on data) - Wenn Y, wird die übergeordnete Kategorie geöffnet, wenn das Grid Daten enthält; default N; Funktionen werden ersetzt
  • q (quelle) - Herkunft der Daten
    • j - Join
    • json - Das Grid wird mit einem geparsten JSON gefüllt
    • sql - SQL-Statement
    • sqladd / add - SQL-Statement, fügt Daten zu einem Grid hinzu; somit können die Daten aus zwei unterschiedlichen SQL-Statements kommen, die ggf. auch auf unterschiedlichen Datenbanken ausgeführt werden können
    • sqlmerge / merge - SQL-Statement, fügt wie sqladd Daten zu einem Grid hinzu, hier aber unter Berücksichtigung der im Parameter mk spezifizierten Spalte: Ein Datensatz wird nur dann hinzugefügt, wenn es noch keine Zeile mit dem entsprechenden Wert gibt.
    • t - Table
    • thread - ein SQL-Statement wird in einem Hintergrund-Thread ausgeführt
    • xml - Das Grid wird mit einem geparsten XML gefüllt
    • xmlthread - In einem Hintergrundthread wird mit http(s) ein XML geholt, dieses geparst und damit das Grid gefüllt.
  • sc (SaveCommand) - Kommando das ausgeführt wird, wenn das Grid gespeichert werden soll; nur für xml und xmlthread
  • t (table) - Name der Datenbanktabelle, in welche die Daten beim Speichern zurückgeschrieben werden; Funktionen werden ersetzt
  • t2, t3... - Tabellennamen weiterer Tabellen


Beispiele

#grddata   q=sql   t=translate_list_item   kid=$FND(s,data_list_item_id)
#text_clear
#text <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.xxxxxxxxxxxxxxxxxx.de/">
#text    <soapenv:Header/>
#text    <soapenv:Body>
#text       <web:searchCustomer>
#text           <searchCustomerRequest>
#text          <postalCode>31582</postalCode>
#text          </searchCustomerRequest>
#text       </web:searchCustomer>
#text    </soapenv:Body>
#text </soapenv:Envelope>
#code   url=https://xxxxxxxxxxxxxxxxxx.de/ITAPIWebservice/xxxxxxxxxxInterface?doAgencyLogin
#code   e_res=ansi
#http_request   y=post    cy="application/xml"   request=$TEXT(1)   response=resp   se=Y   acc=application/xml     $CODE$
#xml_parse   xml=$VAR(resp)
#grd_data   q=xml    pfx=customer   path=soap:Envelope.soap:Body.ns2:searchCustomerResponse.searchCustomerResponse   sc=xbaftest_save_soap
#text_clear
#text <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.xxxxxxxxxxxxxxxxxx.de/">
#text    <soapenv:Header/>
#text    <soapenv:Body>
#text       <web:searchCustomer>
#text           <searchCustomerRequest>
#text          <postalCode>31582</postalCode>
#text          </searchCustomerRequest>
#text       </web:searchCustomer>
#text    </soapenv:Body>
#text </soapenv:Envelope>
#code   url=https://xxxxxxxxxxxxxxxxxx.de/ITAPIWebservice/xxxxxxxxxxInterface?doAgencyLogin
#code   e_res=ansi
#code   y=post    cy="application/xml"   request=$TEXT(1)   response=resp   se=Y   acc=application/xml   
#grd_data   q=xmlthread    pfx=customer   path=soap:Envelope.soap:Body.ns2:searchCustomerResponse.searchCustomerResponse   sc=xbaftest_save_soap     $CODE$

#grd_add

Fügt einem Grid-Segment eine weitere Reihe hinzu.

Hinweis: Die Primärschlüsselspalte wird üblicherweise nicht in der Prozedur #grd_add gesetzt, sondern mit dem Parameter nvi in der Prozedur #grd_col.

Parameter

  • chg ("change") - Wenn Y, wird die neue Reihe gleich in den Changed-Modus gesetzt; default N; Funktionen werden ersetzt
  • f_ ("field) - Prefix für die Feldnamen der Spalten, deren Werte gesetzt werden sollen
  • i ("item") - Name des Grid-Segments
  • sc ("selected column") - Index oder Feldname der Spalte, deren Zelle im Anschluss an die Einfügeoperation selektiert werden soll. Wenn leer, wird die Selektierung nicht verändern. Funktionen werden ersetzt, default leer.
  • y - Typ der Einfügeoperation; Funktionen werden ersetzt; default bottom
    • asel ("after selected") - die neue Zeile wird nach der selektierten Zeile eingefügt
    • bottom - die neue Zeile wird unten angehängt
    • bsel ("before selected") - die neue Zeile wird vor der selektierten Zeile eingefügt
    • top - die neue Zeile wird als erste Zeile eingefügt

Beispiel

#grd_add   i=todo_add   f_ref=$VAR(todo_id)   f_ref_text=$VAR(todo_text)   f_ref_hint=$VAR(todo_hint)   f_status=1

#grd_loop

Die Prozedur #grd_loop führt eine Schleife über alle oder alle selektierten Reihen eines Grid-Segments durch.

Parameter

  • er (each row) - Kommando, das für jede oder jede selektierte Zeile des Grids ausgeführt wird.
  • ert (each row transaction) - Wenn Y, dann wird jeder Aufruf des mit er festgelegten Kommandos in einer Transaktion gekapselt
  • i (item) - Name des Grid-Segments
  • nkomma - In eine Variable dieses Namens wird bei jedem Schleifendurchlauf mit Ausnahme des letzten Schleifendurchlaufs ein Komma geschrieben; default leer, Funktionen werden ersetzt. Wird üblicherweise dazu verwendet, um aus einem Grid eine Liste zu machen, bei der die einzelnen Elemente durch ein Komma getrennt sind, aber kein Komma hinter dem letzten Element stehen soll. Werden andere Trennzeichen benötigt, lässt sich diese mit $VT() bewerkstelligen.
  • sc (selection column) - Index der Selection-Column; Wenn damit eine Spalte angegeben wird, dann wird das mit er festgelegte Kommando nur ausgeführt, wenn der Werte dieser Spalte in der betreffenden Reihe Y ist; default ist -1; Funktionen werden ersetzt.

Beispiel

#grd_loop   i=grid   er=1   sc=0

#grd_calc

Zählt die Zeilen in einem Grid oder berechnet eine Funktion. Es kann dabei eine Bedingung formuliert werden, welche Datensätze gezählt werden sollen.

Diese Prozedur kann auch dazu verwendet werden, um zu ermitteln, ob eine bestimmte Zeile schon im Grid vorhanden ist oder nicht. Davon lässt sich dann zum Beispiel abhängig machen, ob Daten in das Grid eingefügt werden sollen oder nicht.

Parameter

  • ccnd ("CalcCondition") - Wenn Y, dann wird die Zeile berücksichtigt. Default Y, Funktionen werden ersetzt. Auf die aktuelle Zeile kann mit der Sonderzeile calcrow zugegriffen werden. Üblicherweise muss die Funktion $BOOL() verwendet werden, um eine Bedingung auszuwerten, siehe Beispiel.
  • col - Index der Spalte. Wenn nicht gesetzt, wird der Feldname verwendet. Wird beim Typ cnt nicht benötigt.
  • f ("fieldname") - Feldname der Spalte. Wird nur verwendet, wenn col nicht gesetzt ist. Wird beim Typ cnt nicht benötigt.
  • i ("item") - Name des Grid- oder XGrid-Segments
  • n (name / number) - Name der Variable oder Nummer des Values, in die/den das Ergebnis geschrieben wird.
  • ocr (OnlyChangedRows) - Wenn Y, werden nur Zeilen bei der Berechnung berücksichtigt, die geändert wurden; default N. Wird gerne in Kombination mit page_check verwendet, um zu prüfen, ob alle geänderten Zeilen den formulierten Anforderungen genügen. Siehe Beispiel.
  • ry ("result type") - Ergebnistyp; default ist int, Funktionen werden ersetzt.
    • curr - zwei Nachkommastellen
    • curr4 - vier Nachkommastellen
    • int - keine Nachkommastelle
  • sc ("SelectionColumn") - Index der Spalte, die als Selection-Column verwendet wird. Eine Zeile wird dann nur gezählt, wenn sie auch selektiert ist. Default ist -1, dann wird keine SelectionColumn verwendet.
  • y - Typ der Operation. Funktionen werden ersetzt, default ist cnt
    • avg - Durchschnitt
    • cnt - Anzahl
    • min - Minimum
    • max - Maximum
    • sum - Summe

Beispiele

#grd_calc   i=item   n=1   ccnd="$BOOL($PVAL(item,key,cntrow) > 5)"

In Kombination mit #page_check

#page_check   y=e   chk="$EXEC(xm_konfiguration_check(partner_g))"         c="Codes, die mit G beginnen, müssen der Channel Group 'Partner' zugeordnet werden."
-- in xm_konfiguration_check
~ $ICP(0,partner_g)
#grd_calc   n=1   i=grid   ocr=Y   ccnd="$BOOL($COPY($PVAL(grid,code,calcrow),1,1) = G   and   $PVAL(grid,channel_group,calcrow) <> P)"
#var_set   n=result   z="$BOOL($VAL(1) = 0)"

~~

#grd_lookuplivefill

Füllt aus einem SQL-Statement eine LookupLive-Nachschlageliste

Parameter

  • db ("DataBase") - Name der Datenbankverbindung, aus der die Daten bezogen werden; Funktionen werden ersetzt, default ist die Standard-Datenbankverbindung

Beispiel

#cmd_clear
#cmd #sql select ckey, cvalue from data_list_item 
#cmd #sql    where data_list_id = '21DE9AF0-0C30-4222-A131-B855FAA85DEB'   
#cmd #sql       and (ckey = 1 or ckey <= $NVL($PVAL(grid,nummer,lookuplive),0))     order by csort
#cmd #grd_lookuplivefill 

#grd_col   f=lookup   c1="Lookup"   y=lookuplive   llc=1

#grd_paste

Fügt Daten aus der Zwischenablage in ein Grid-Segment ein.

Parameter

  • add - Wenn Y, werden die über die Zwischenablage zugewiesenen Zeilen hinzugefügt, andernfalls ersetzt; Funktionen werden ersetzt, default N;
  • cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • f_ ("field") - Prefix für Spalten, denen im Anschluss ein Wert zugewiesen wird; beginnt der Wert mit row (zum Beispiel f_cvalue=row1), dann wird die folgende Zahl als 0-relativer Spaltenindex in den eingefügten Daten interpretiert, andernfalls wird der zugewiesene Wert direkt eingefügt, wobei Funktionen ersetzt werden.
  • fr ("first row") - Als erste Zeile muss der angegebene String gepastet werden, sonst wird die Verarbeitung abgebrochen; wenn fr nicht gesetzt ist, wird die erste Zeile nicht geprüft und statt dessen wir eine normale Datenzeile behandelt;Funktionen werden ersetzt, default leer.
  • frow - Index der Spalte in den eingefügten Daten, der in der Grid-Spalte fxrow gesucht wird. Wird nur bei y=r verwendet.
  • frowpre, frowpost - Prefix und Postfix für frow, nur bei y=r. Wenn der mittels frow ermittelte Indexwert mit dem durch fxrow spezifizierten Wert im Grid verglichen wird, dann wird vor diesen Wert frowpre und nach diesem Wert frowpost eingefügt.
  • fxrow - Feldname (f) der Spalte, mit deren Hilfe jeweilige Reihe identifiziert werden soll. Bei y=r muss dieser Parameter gesetzt werden.
  • ige ("ignore empty") - Wenn Y, werden leere Zeilen ignoriert; default N, Funktionen werden ersetzt.
  • lat ("lookup as text") - Wenn Y, dann werden für Lookup-Spalten nicht die Schlüssel, sondern die Werte gepastet, der Import ermittelt daraus dann die Schlüssel; default N, Funktionen werden ersetzt.
  • sep ("separator") - Trennzeichen, mit denen innerhalb einer Zeile die Spalten getrennt werden; Funktionen werden ersetzt, default ist ein Tab-Zeichen
  • trim - Wenn Y, werden vor dem Einfügen alle Werte getrimmt, es werden also insbesondere führende oder anhängende Leerzeichen entfernt; default N, Funktionen werden ersetzt.
  • y - Typ
    • c ("column") - Die Spalten werden entsprechend der Definition zugeordnet
    • d ("direct") - Spalten und Reihen werden so eingefügt, wie sie in der Zwischenablage sind; Link- und Button-Spalten werden ignoriert. Mit f_fieldname=wert definierte Werte werden anschließend den entsprechenden Spalten zugewiesen.
    • r ("row") - Mittels fxrom und frow wird die Reihe im Grid-Segment ermittelt, welcher die Werte aus der aktuellen Zeile zugewiesen werden sollen. Sofern eine solche Reihe nicht gefunden wird und(!) add=Y ist, wird die Reihe neu angelegt und dann mit Werten befüllt.

Beispiele

#grd_paste   y=c    i=item   ige=Y   add=Y   f_ckey=row0   f_cvalue=row1   f_csort=row2   f_status=1
#grd_paste   y=r    i=grid   fxrow=datum    frow=0   f_ft_sperren=row1  fr=$FND(aktion)
#grd_paste   y=r    ige=Y   add=Y   lat=Y   i=grid   frow=0   fxrow=code   f_code=row0   f_target=row1   f_channel_type=row2   f_channel_group=row3   f_channel=row4

#grd_ac

Die Prozedur #grd_ac fügt einem Grid eine Zeile hinzu und setzt dort die Werte ("add") oder ändert nur die Werte ab ("change"), abhängig davon, ob der mit fnd_1 bis fnd_9 definierte Datensatz bereits vorhanden ist oder nicht.

Parameter

  • chg ("change") - Wenn Y, werden die Zellen in den Changed-Modus gesetzt, auch wenn sich ihr Wert nicht ändert; default N; Funktionen werden ersetzt
  • cnd - ("condition") Die Prozedur wird nur dann ausgeführt, wenn das Statement in cnd Y ergibt. Default ist Y, Funktionen werden ersetzt
  • f_ ("field) - Prefix für die Feldnamen der Spalten, deren Werte gesetzt werden sollen; Funktionen werden ersetzt
  • fnd_1 bis fnd_9 - Namen der Spalten, anhand die Zeile identifiziert wird; es wird die erste Zeile verwendet, auf die diese Bedingung zutrifft; Funktionen werden ersetzt
  • i ("item") - Name des Grid-Segments
  • ic ("IgnoreCase") - bei der Prüfung mit fnd_1 bis fnd_9 bleiben Groß- und Kleinschreibung unberücksichtigt
  • y - Typ der Einfügeoperation; Funktionen werden ersetzt; default bottom
    • asel ("after selected") - die neue Zeile wird nach der selektierten Zeile eingefügt
    • bottom - die neue Zeile wird unten angehängt
    • bsel ("before selected") - die neue Zeile wird vor der selektierten Zeile eingefügt
    • top - die neue Zeile wird als erste Zeile eingefügt

Beispiel

#cmd_clear2 #grd_ac   i=grid   fnd_1=adrnr   fnd_2=aktion   f_adrnr=$SEPLINE(0)   f_aktion=$SEPLINE(1)   f_add_1=$SEPLINE(2)   f_add_2=$SEPLINE(3)  
#btns_btn  c="Kunden aus Zwischenablage"   w=200   cmd="#csv_paste   er=2"   se=bcp

#grd_sort

Sortiert das Grid nach der angegebenen Spalte. Das kann beispielsweise erforderlich sein, wenn ein Grid mit zwei #grd_data-Prozeduren gefüllt wird, so dass nicht mit einer ORDER BY-Klausel sortiert werden kann.

Parameter

  • f (field) - Feldname der Spalte, nach der sortiert werden soll
  • i (item) - Name des Grids, das sortiert werden soll
  • y - Sortierreihenfolge (u oder d, entsprechend der Symbole an der Spalte, wenn manuell sortiert wird)

Beispiel

#grd_sort   i=grid   f=aktion   y=d 
#grd_sort   i=grid   f=adrnr   y=d

Diese beiden Zeilen entsprechen einem ORDER BY adrnr, aktion

#grd_pos

Ermittelt die Zeilennummer der ersten Zeile, auf welche die Such-Kriterien zutreffen

Parameter

  • f_ (field) - Prefix der Spaltenbezeichner, die das Suchkriterium bilden. Als Wert des Parameters wird dann der Wert übergeben, nach dem in dieser Spalte gesucht werden soll.
  • i (item) - Name des Grids, in dem gesucht wird
  • res (result) - Name der Variable oder Nummer des Values, in die das Suchergebnis (Y oder N) geschrieben wird
  • row - Name der Variable oder Nummer des Values, in welche die Reihennummer geschrieben wird.

Beispiel

#grd_pos   i=grid   f_adrnr=$SEPLINE(0)   f_isocode=$SEPLINE(1)   f_status=1   res=1   row=2

#grd_dub

Ermittelt, ob in einer Spalte oder einer Spaltenkombination Duletten auftreten.

Mit ccnd, ocr und sc kann die Menge der Zeilen eingeschränkt werden, die geprüft wird. Dubletten werden nur innerhalb der Reihen gefunden, die geprüft werden. Üblicherweise werden die ocr und sc nicht verwendet.

Wenn auf mehrere Spalten geprüft wird, dann wird dieselbe Kombination alles Spalten als Dublette erkannt. (Die Zellenwerte werden zu einem langen String zusammengefügt und dabei mit ~@~ getrennt.)

Parameter

  • ccnd ("CheckCondition") - Wenn Y, dann wird die Zeile bei der Prüfung berücksichtigt. Default Y, Funktionen werden ersetzt. Auf die aktuelle Zeile kann mit der Sonderzeile calcrow zugegriffen werden. Üblicherweise muss die Funktion $BOOL() verwendet werden, um eine Bedingung auszuwerten, siehe Beispiel.
  • cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • cnt ("count") - Anzahl der Spalten oder Feldnamen, die verwendet werden
  • col1, col2... - Index der Spalte. Wenn nicht gesetzt, wird der Feldname verwendet; Funktionen werden ersetzt
  • d1, d2... ("dublette") - Name der Variable oder Nummer des Values, in welche(n) die erste gefundene Dublette geschrieben wird; Funktionen werden ersetzt
  • f1, f2... ("fieldname") - Feldname der Spalte. Wird nur verwendet, wenn col nicht gesetzt ist.
  • i (item) - Name des Grids, in dem gesucht wird
  • n - Name der Variable oder Nummer des Values, in welche(n) das Prüfungsergebnis geschrieben wird (Y - mindestens eine Dublette, N - keine Dublette); Funktionen werden ersetzt
  • ocr (OnlyChangedRows) - Wenn Y, werden nur Zeilen bei der Berechnung berücksichtigt, die geändert wurden; default N.
  • sc ("SelectionColumn") - Index der Spalte, die als Selection-Column verwendet wird. Eine Zeile wird dann nur geprüft, wenn sie auch selektiert ist. Default ist -1, dann wird keine SelectionColumn verwendet; Funktionen werden ersetzt

Beispiel

#code  ccnd="$BOOL($PVAL(reisen,status,calcrow) = 1   and $IN($PVAL(reisen,reise_jahr_id,calcrow),30211BFC-A87D-4C07-9D7E-A92B07C52377) = N)"
#grd_dub   i=reisen   n=result   cnt=2   f1=reise_jahr_id   f2=kgr  $CODE$

#grd_thread

Lädt Daten aus einem Hintergrund-Thread in ein Grid-Segment. Wird dazu verwendet, Daten aus unterschiedlichen Datenbank zusammen zu führen.

Parameter für alle Typen

  • cnd ("condition") - Wenn Y, wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
  • i ("item") - Name des Grid-Segments; Funktionen werden ersetzt, default ist das zuletzt eingefügte Segment
  • k ("key") - Parameter im SQL-Statement; im Grid-Segment muss es eine Spalte mit diesem Feldnamen geben.
  • ready - Kommando, das ausgeführt wird, wenn der Thread fertig ist; lokale Kommandos können nicht verwendet werden; Funktionen werden ersetzt (zum Zeitpunkt des Kommandos #grd_thread)
  • to ("TimeOut") - Zeit in Sekunden, bis ein Request abgebrochen wird; Funktionen werden ersetzt, default 15
  • y - Typ des Threads; Funktionen werden ersetzt, default grid
    • grid - Grid wird mittels SQL-Statement gefüllt, das mit #sql definiert werden muss
    • gridbulk - Die Daten werden mit nur einer Abfrage ermittelt; geht bisweilen deutlich schneller
    • gridlist - im Gegensatz zu den anderen Typen wird nicht ein einzelner Wert abgefragt, sondern alle Zeilen, welche die SQL-Abfrage liefert; die einzelnen Zeilen werden mit dem Inhalt des Parameters sep getrennt.
    • gridxml - Grid wird mittels xml gefüllt, das mittels http(s)-Abfrage beschafft wird

Parameter für SQL-Statements

  • db ("DataBase") - Datenbank, in der das Statement ausgeführt wird.
  • sep ("separator") - Zeichenfolge, mit der bei y=gridlist die einzelnen Zeilen getrennt werden; Funktionen werden ersetzt; um Zeilenumbrüche zu setzen, verwendet man sep=$CHR(crlf)

Parameter für XML

  • acc - Akzeptierte Response-Formate
  • cu8 ("convert UTF8") - wenn Y, werden die Zeichen von UTF8 nach ANSI konvertiert; default N, Funktionen werden ersetzt
  • cy - Content-Typ der Anfrage
  • e_req - Encoding des Requests, zulässig sind ansi, ascii, utf7, utf8, unicode und bigendianunicode. Funktionen werden ersetzt, default utf8.
  • e_res - Encoding des Response, zulässig sind ansi, ascii, utf7, utf8, unicode und bigendianunicode. Funktionen werden ersetzt, default utf8.
  • f_ - Prefix für Header-Einträge, zum Beispiel für die Authorisierung; Funktionen werden ersetzt
  • isc ("ignore server certificate") - Wenn Y, werden bei den SSL-Options die Werte IgnoreServerCertificateConstraints, IgnoreServerCertificateInsecurity und IgnoreServerCertificateValidity gesetzt. Das ist zum Beispiel erforderlich, um auf REST-Server zuzugreifen, deren Zertifikat abgelaufen ist. Default N, Funktionen werden ersetzt.
  • method - Methode des http(s)-Aufrufs (nicht y, da bereits belegt); Funktionen werden ersetzt
    • delete
    • get
    • post
    • put
  • request - Text der Anfrage bei post und put; Funktionen werden ersetzt
  • response - Nummer des Values oder Name der Variable, in die bzw. den das Ergebnis geschrieben wird
  • url - Webadresse des aufgerufenen Services; Funktionen werden ersetzt
  • wait - Zeit in Millisekunden, die auf die Antwort gewartet wird; Funktionen werden ersetzt; default 1000


Beispiel

Hier im Beispiel werden drei Spalten als q=thread definiert. Die Daten für diese Spalten werden mittels #grd_thread ermittelt, der das vorangehende SQL-Statement ausführt. Schlüssel ist dwversionid.

#grd_col   f=dwversionid   c1="Dwversionid"
#grd_col   f=szlongname    h=szlongname   c1="Dateiname"   w=100    q=thread 
#grdcol c1=Tournr   f=tournr   w=50   st=gsj   f=szlongname   q=thread   ss1=Y
#grdcol c1="Dok Time"   h1="Dokumentendatum Uhrzeit"   f=doctime   q=thread  w=80   ro=Y   nd=Y   ss1=Y  st=gsj
...
#grd_data   q=sql  
 

#sql SELECT substring(xyz, 1, 2) + ':' + substring(xyz, 3, 2) AS doctime, dwinteger09 as tournr , szlongname FROM
#sql   (SELECT format(b.dwCreation_time, '000000') AS xyz, dwinteger09, szlongname
#sql     FROM dbo.baseattributes b     WHERE b.dwVersionId = :dwversionid) q
#grd_thread   k=dwversionid   db=wd

$GRD_CHECK

Die Funktion $GRD_CHECK prüft ein Grid-Segment auf bestimmte Bedingungen und ist damit eine Alternative zu #grd_calc in bestimmten Konstellationen.

Parameter

  1. Name des Grid-Segments
  2. Spaltenindex oder Feldname der Spalte, die untersucht wird
  3. Reihentyp
    1. all - es werden alle Reihen geprüft
    2. cellchanged - es werden nur die Reihen geprüft, wenn sie in der angegebenen Spalte geändert wurden
    3. rowchanged - es werden nur die Reihen geprüft, die (in einer beliebigen Spalte) geändert wurden
    4. rowselected - es wird nur die Reihe der selektierten Zelle geprüft
  4. Prüf-Statement, der Inhalt der jeweiligen Zelle wird durch $CELL$ eingefügt, siehe Beispiel. Bitte beachten, dass Funktionen in diesem Parameter nicht verwendbar sind.

Beispiel

#page_check   c="MWSt muss 7, 19 oder leer sein"    chk="$GRD_CHECK(codes,kosten_mwst,all,$CELL$ = 7 or $CELL$ = 19 or $CELL$ =)"

$CCI

Die Funktion $CCI ermittelt aus einem Integer-Wert die zu setzenden Zellen-Farbe

Parameter

  1. Der Wert, der die Zellen-Farbe bestimmt. Sofern der Wert der Zelle verwendet werden soll, deren Farbe gesetzt wird, reicht ein Ausrufezeichen.
  2. Wenn L, dann muss der Wert in Parameter 1 den Schwellwert erreichen oder unterschreiten, andernfalls muss er ihn erreichen oder überschreiten
  3. Schwellwert rot.
  4. optional: Schwellwert gelb; wird nur geprüft, wenn der Schwellwert rot nicht erreicht ist
  5. optional: Schwellwert grün; wird nur geprüft, wenn die Schwellwerte rot und gelb nicht erreicht sind

Beispiel

#grd_col   f=dubletten   y=int   w=30   a=r   c1="D"   h1="Dubletten"   ccc=$CCI(!,,1)

XGrid-Segmente

XGrid-Segmente sind Segmente, in denen in Tabellenform mehrere Datensätze einer SQL-Abfrage angezeigt werden. Dabei werden die Spalten durch eine andere SQL-Abfrage gebildet. Grid-Segmente können Kopf- und Fußzeilen haben (default 1 Kopfzeile, 0 Fußzeilen)

#xgrd_seg

Mit der Prozedur #xgrd_seg wird ein XGrid-Segment angelegt.

Parameter

  • clt (column line type) - Spezifiziert, ob Spalten verbreitert oder umgebrochen werden; default sf; Funktionen werden ersetzt
    • mf - multi line fixed
    • ms - multi line stretch
    • sf - single line fixed
    • ss - single line stretch
  • fcc (fixed columns count) - Spalten, die auch beim Scrollen links angezeigt werden; default 0; Funktionen werden ersetzt
  • frc (footer row count) - Anzahl der Fußzeilen; default 0; Funktionen werden ersetzt
  • hrc (header row count) - Anzahl der Kopfzeilen; default 0; Funktionen werden ersetzt
  • sc (selection column) - Spaltenindex der Selection-Zeile. Ein Grid-Segment kann eine Selection-Spalte haben, also eine Spalte vom Typ bool, mit deren Hilfe einzelne Zeilen ausgewählt werden können. Default ist -1, Funktionen werden ersetzt.


gemeinsame Parameter aller Segmenttypen

  • b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
  • c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
  • hp ("help path") - noch ohne Funtion
  • n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
  • mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
  • mho ("max height opened") - maximale Höhe im geöffneten Zustand
  • oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
    • c - Segment wird nur in geschlossenem Zustand angezeigt
    • o - Segment wird nur in geöffnetem Zustand angezeigt
    • oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
  • r ("rights") - Rechtedefinition
  • ro ("read only") - Der Anwender kann die Daten im Segment nicht ändern

Beispiel

siehe unten

#xgrd_col

Die Prozedur #xgrid_col definiert die fixen Spalten des Grid, die an der linken Seite stehen.

Parameter

Diese Prozedur gleich #grid_col, die Parameter sind dort beschrieben.

Beispiel

siehe unten

#xgrd_xcol

Die Prozedur #xgrd_xcol definiert die X-Spalten, also die Spalten, die für jeden Datensatz der #xgrd_xdata eingefügt werden.

Parameter

Diese Prozedur gleich #grid_col, die Parameter sind dort beschrieben.

Beispiel

siehe unten

#xgrd_xdata

Mit #xgrd_xdata werden die variablen Spalten des Grids angelegt. Für jede Zeile der mit #xgrd_xdata geöffneten SQL-Abfrage wird ein Satz von den mit #xgrd_xcol angelegten Spalten angelegt.

Parameter

  • db ("DataBase") - Name der Datenbankverbindung, aus der die Daten bezogen werden; Funktionen werden ersetzt, default ist die Standard-Datenbankverbindung
  • Prefix k - Prefix für SQL-Parameter

Beispiel

siehe unten

#xgrd_data

Mit #xgrd_data werden Zeilen des Grids angelegt.

Parameter

  • db ("DataBase") - Name der Datenbankverbindung, aus der die Daten bezogen werden; Funktionen werden ersetzt, default ist die Standard-Datenbankverbindung
  • k (key) - Name der Schlüsselspalte; per default der Tabellennamen plus ein angehängtes _id; Funktionen werden ersetzt
  • k2, k3... - Name der Schlüsselspalten weiterer Tabellen; per default der Tabellennamen plus ein angehängtes _id
  • Prefix k - Prefix für SQL-Parameter
  • m ("maximum") - Nach dieser Anzahl von Zeilen wird abgebrochen; default MaxInt (2 147 483 647), Funktionen werden ersetzt
  • ocd (open cat on data) - Wenn Y, wird die übergeordnete Kategorie geöffnet, wenn das Grid Daten enthält; default N; Funktionen werden ersetzt
  • t (table) - Name der Datenbanktabelle, in welche die Daten beim Speichern zurückgeschrieben werden; Funktionen werden ersetzt
  • t2, t3... - Tabellennamen weiterer Tabellen

Beispiel

siehe unten

#xgrd_calc

Mit #grd_calc funktioniert grundsätzlich auf bei X-Grids. Allerdings gibt es Aufgabenstellungen, die mit #grd_calc nicht durchführbar sind.

Die Prozedur #xgrd_calc bildet erst eine Aggregatfunktion in der einen Richtung, und dann aus den Ergebnissen eine zweite Aggregatfunktion in der anderen. Nähre Erläuterungen siehe Beispiel.

Parameter

  • cnd - ("condition") Die Prozedur wird nur dann ausgeführt, wenn das Statement in cnd Y ergibt. Default ist Y, Funktionen werden ersetzt
  • f - ("FieldName") Feldname der Zelle im Grid, für welche die fnc1 ausgeführt wird; Funktionen werden ersetzt
  • fnc1, fnc2 - ("Function") die erste und zweite Funktion, die ausgeführt wird; default sum, Funktionen werden ersetzt
    • avg - Durchschnitt
    • count - Anzahl
    • max - Maximum
    • min - Minimum
    • sum - Summe
  • nv0 - ("NullValue = 0") Wenn Y, werden leere Zellen sowie Spalten- beziehungsweise Reihen-Ergebnisse wie 0 behandelt; default N, Funktionen werden ersetzt
  • ry - ("result type") Type des Ergebnisses; default curr
    • curr - Festkommewert mit zwei Nachkommastellen
    • curr 4 - Festkommawert mit vier Nachkommastellen
    • date - Datum
    • datemin - Datum mit Stunden und Minuten
    • datesec / datesek - Datum mit Stunden, Minuten und Sekunden
    • int - Ganzzahlen
  • y - Typ; default xy, Funktionen werden ersetzt
    • xy - Erst wird in X-Richtung (durch alle Spalten) die fnc1 ermittelt; jede Zeile hat dann ein Ergebnis. Danach wird über alle Zeilenergebnisse fnc2 ermittelt.
    • yx - Erst wird in Y-Richtung (durch alle Zeilen) die fnc1 ermittelt. Jede Spalte hat dann ein Ergebnis. Danach wird über alle Spaltenergebnisse fnc2 ermittelt.
  • z - Name der Variable oder Nummer des Values, in die das/den das Ergebnis geschrieben wird.

Beispiel

Im X-grid jahr2code werden Reisejahre Werbecodes zugeordnet. Es soll geprüft werden, wie viele Reisen einem Code maximal zugewiesen sind. Dazu wird in X-Richtung die Summe der aktivierten Zellen in der Spalte aktiv gezählt, so dass für jede Zeile (hier jedem Werbecode) ein Anzahl ermittelt wird. fnc1 ist somit sum. Dann geht die Prozedur durch alle Zeilen und ermittelt das Maximum, fnc2 ist daher max.

#xgrd_calc   i=jahr2code   y=xy   f=aktiv   fnc1=sum   fnc2=max   nv0=Y   ry=int   n=result

$XGRD_CALC

Wie die Prozedur #xgrd_calc, kann aber direkter in #page_check verwendet werden, siehe Beispiel

Parameter

  1. Segment
  2. Typ; xy oder yx
  3. FieldName
  4. Func 1 (avg, count, max, min oder sum)
  5. Func 2 (avg, count, max, min oder sum)
  6. NV0 - wenn Y, werden leere Feldwerte oder Spalten- oder Zeilenergebnisse wie 0 gezählt
  7. Ergebnistyp (curr, curr4, date, datemin, datesek / datesec, int)

Beispiel

Im X-grid jahr2code werden Reisejahre Werbecodes zugeordnet. Es soll mittels #page_check sichergestellt werden, dass bei fertig angelegten und nicht stornierten Werbeaktionen (status zwischen 2 und 8, wird über cnd realisiert) jedem Code mindestens eine Reise und jeder Reise mindestens ein Code zugeordnet ist.

Zunächst wird für jede Spalte und jede Zeile die Anzahl der Zuordnungen (aktiv = Y) ermittelt (erste Funktion sum), von den Ergebnissen wird dann das Minimum gebildet; das Ergebnis wird dann darauf geprüft, ob es > 0 ist.

#code   chk="$BOOL($XGRD_CALC(jahr2code,xy,aktiv,sum,min,Y,int) > 0)"
#page_check   c="Jeder aktive Code muss mindestens einer Reise zugeordnet sein"    cnd=$NUMBETWEEN($PVAL(vl,status),2,8)   $CODE$
#code   chk="$BOOL($XGRD_CALC(jahr2code,yx,aktiv,sum,min,Y,int) > 0)"
#page_check   c="Jede aktive Reise muss mindestens einem Code zugeordnet sein"    cnd=$NUMBETWEEN($PVAL(vl,status),2,8)     $CODE$

Beispiel

Für das Beispiel werden die folgenden drei Tabellen verwendet, zwei Detail-Tabellen und eine Verknüpfungstabelle:

create table sd_cross_x (
  sd_cross_x_id varchar(40) not null primary key,
  name varchar(40) not null,
  datechg date,
  usrchg varchar(40),
  progchg varchar(40)      
);

create table sd_cross_y (
  sd_cross_y_id varchar(40) not null primary key,
  name varchar(40) not null,
  datechg date,
  usrchg varchar(40),
  progchg varchar(40)      
);

create table sd_cross_xy (
  sd_cross_xy_id varchar(40) not null primary key,
  sd_cross_x_id varchar(40) not null,
  sd_cross_y_id varchar(40) not null,
  active char(1),
  remarks varchar(40),
  datechg date,
  usrchg varchar(40),
  progchg varchar(40)      
);

Damit wollen wir das folgende Formular erstellen:

Demo XGrid

Damit die Änderungen in den Detail-Tabellen gleich nach dem Speichern im XGrid sichtbar werden, wird bei der Page der Parameter ras ("RefreshAfterSave") gesetzt.

#page   ras=Y

Wir verwenden hier in einer Primär-Region zwei Kategorien, links für die Spalten (X), rechts für die Reihen (Y). Die beiden Kategorien werden also nebeneinander angezeigt.

Jede Kategorie hat ein Button-Segment mit einem Button, mit dem jeweils ein neuer Datensatz angelegt werden kann. Dazu muss lediglich die Prozedur #grd_add aufgerufen werden.

Die Tabellen hier im Beispiel haben (neben den Standard-Spalten _id, datechg, usrchg und progchg) lediglich einen Namen. Damit die ID-Spalte mit einer GUID versorgt wird, wird diese für den Parameter nvi ("NullValue Insert") erzeugt; bei der Gelegenheit wird die Zeile dann gleich als neu eingefügt gekennzeichnet.

#prim  as=Y  
#cat  as=Y     c=X
#btns_seg  
#btns_btn  c="$T(Add item)"  w=150   cmd="#grd_add   i=gridx"

#grd_seg   frc=0   fcc=1   clt=ss   n=gridx   c=" "   b=XYH  
#grd_col   f=sd_cross_x_id   c1=ID   w=30   y=guid   ro=Y     nvi=$GUID()
#grd_col   f=name   c1="Name"   l=40   w=100   wst=500   xw=400
#sql select * from sd_cross_x   order by name
#grd_data   q=sql   t=sd_cross_x 

#cat  as=Y     c=Y
#btns_seg  
#btns_btn  c="$T(Add item)"  w=150   cmd="#grd_add   i=gridy"

#grd_seg   frc=0   fcc=1   clt=ss   n=gridy   c=" "   b=xYH
#grd_col   f=sd_cross_y_id   c1=ID   w=30   y=guid   ro=Y   nvi=$GUID()
#grd_col   f=name   c1="Name"   l=40   w=100   wst=500   xw=400
#sql select * from sd_cross_y   order by name
#grd_data   q=sql   t=sd_cross_y   

Die zweite Primärregion beinhaltet das XGrid, mit dem die Verknüpfung angezeigt wird. Nach der Prozedur #xgrd_seg werden mit #xgrd_col erst mal die beiden fixen Spalten definiert, die ID und der Name (der Reihe).

Danach werden die variablen Spalten mit #xgrd_xcol definiert und mit #xgrd_xdata angelegt. Als erste Spalte in einem solchen Spaltensatz wird eine Spalte für die IDs eingefügt. Diese hat üblicherweise die Breite w=0, da die IDs nicht interessieren. Zum Debuggen kann diese Spalte jedoch breiter gemacht werden. Diese "unsichtbare" Spalte hat als Feld f die ID der Verknüpfungstabelle, hier also f=sd_cross_xy_id. Als Feld für die erste Headerzeile f1 muss die ID der X-Datenmenge, hier also f1=sd_cross_x_id.

Bei den weiteren Spalten besteht die Freiheit des Programmierers. Hier im Beispiel wird eine bool'sche Spalte für die Verknüpfung sowie eine Anmerkungsspalte eingefügt. Mit cs1=2 bei der bool'schen Spalte wird die Überschrift über beide Spalten gezogen.

#prim  as=Y  
#cat  as=Y     c=XY

#xgrd_seg   frc=0   fcc=1   clt=ss   n=gridxy   c=" "  b=XYH
#xgrd_col   f=sd_cross_y_id   c1=ID   w=30   y=guid   ro=Y
#xgrd_col   f=yname   c1="name"   w=80   nd=Y   ro=Y 

#xgrd_xcol   f1=sd_cross_x_id   f=sd_cross_xy_id   w=0   y=guid   ro=Y  
#xgrd_xcol   f1=name   cs1=2   f=active   y=bool   w=30   xcs1=2
#xgrd_xcol   f=remarks   l=40   
#sql select * from sd_cross_x order by name
#xgrd_xdata  

Für die Daten im XGrid brauchen wir zunächst ein SQL-Statement, das aus den beiden Detail-Datenmengen ein kartesisches Produkt (Mengenprodukt) erstellt; dafür sehen wir im Statement die Verknüpfungsbedingung 1=1 (die nur deswegen eingefügt ist, damit formal eine Verknüpfungsbedingung vorhanden und das SQL-Statement syntaktisch korrekt ist). Mit einem left outer join wird die Verknüpfungstabelle hinzugefügt (kein inner join, da anfangs ja die Datensätze noch nicht vorhanden sind).

Mit der Prozedur #xgrd_data werden die Daten dann aus der Ergebnismenge geladen. Wir müssen hier die Tabellen t angeben, in welche die Daten zurückgeschrieben werden (also in die Verknüpfungstabelle, hier t=sd_cross_xy), welches die ID für die Spalten ist (hier fcol=sd_cross_x_id, das muss übereinstimmen mit f1=sd_cross_x_id in der 0-breiten ersten Spalte des Spalten-Sets), und wann eine neue Zeile begonnen wird (frow=sd_cross_y_id). Damit Letzteres korrekt funktioniert, muss die erste Sortierung im Statement nach den Reihen sein (hier order by y.name)

#sql select y.sd_cross_y_id, y.name as yname, x.sd_cross_x_id, x.name as xname, c.sd_cross_xy_id, c.active, c.remarks
#sql   from sd_cross_y y
#sql     inner join sd_cross_x x on 1=1
#sql     left outer join sd_cross_xy c on c.sd_cross_y_id = y.sd_cross_y_id and c.sd_cross_x_id = x.sd_cross_x_id
#sql   order by y.name, x.name
#xgrd_data   q=sql   t=sd_cross_xy   fcol=sd_cross_x_id   frow=sd_cross_y_id

Tipps

Das Erstellen des Codes für ein XGrid ist am Anfang ein wenig komplex und fehleranfällig. Von daher sollen hier noch die folgenden Tipps gegeben werden:

Vorlage kopieren

Nehmen Sie sich ein bestehendes XGrid-Segment, kopieren es und ändern es entsprechend ab.

Schrittweise vorgehen

Legen Sie erst die Spalten an, dann den Code für die Daten. Wenn Sie eine Vorlage kopiert haben, dann setzen Sie nach #xgrd_xdata erst mal vier Minuszeichen (der Rest das Codes ist dann Kommentar) und schauen erst mal, dass die Spalten korrekt angezeigt werden.

Gern gemachte Fehler

  • In der ersten Spalte das variablen Spaltensatzes ist f oder f1 nicht oder nicht korrekt gesetzt. Oder f1 stimmt nicht mit fcol aus #xgrd_data überein.
  • Das Statement für die Daten ist kein kartesisches Produkt als Spalten und Reihen
  • Die Verknüpfungtabelle ist nicht mit einem left outer join hinzugefügt.
  • Das Statement für die Daten ist nicht nach den Reihen sortiert.

In mehrere Tabellen schreiben

Müssen die Daten in mehrere Tabellen geschrieben werden, so ist die Verknüpfungstabelle immer die Tabelle t, alle anderen Tabellen werden mit t2, t3... hinzugefügt.

Schauen Sie sich als Beispiel xtodo_page_add an.

XXGrid-Segmente

XXGrid-Segmente ("Double-X-Grid-Segmente") sind Segmente, in denen in Tabellenform mehrere Datensätze einer SQL-Abfrage angezeigt werden. Dabei werden die Spalten durch zwei andere SQL-Abfrage gebildet. Grid-Segmente können Kopf- und Fußzeilen haben (default 1 Kopfzeile, 0 Fußzeilen)

#xxgrd_seg

Mit der Prozedur #xxgrd_seg wird ein XXGrid-Segment angelegt.

Parameter

  • clt (column line type) - Spezifiziert, ob Spalten verbreitert oder umgebrochen werden; default sf; Funktionen werden ersetzt
    • mf - multi line fixed
    • ms - multi line stretch
    • sf - single line fixed
    • ss - single line stretch
  • fcc (fixed columns count) - Spalten, die auch beim Scrollen links angezeigt werden; default 0; Funktionen werden ersetzt
  • frc (footer row count) - Anzahl der Fußzeilen; default 0; Funktionen werden ersetzt
  • hrc (header row count) - Anzahl der Kopfzeilen; default 0; Funktionen werden ersetzt
  • sc (selection column) - Spaltenindex der Selection-Zeile. Ein Grid-Segment kann eine Selection-Spalte haben, also eine Spalte vom Typ bool, mit deren Hilfe einzelne Zeilen ausgewählt werden können. Default ist -1, Funktionen werden ersetzt.


gemeinsame Parameter aller Segmenttypen

  • b ("Buttons") - Buttons für das Segment; benötigt eine Überschrift (zur Not ein Leerzeichen), weil die Buttons rechts oben in der Überschriftszeile untergebracht werden; Funktionen werden ersetzt
  • c ("Caption") - Überschrift für das Segment; Funktionen werden ersetzt
  • hp ("help path") - noch ohne Funtion
  • n ("name") - Name des Segments, wird benötigt, wenn auf das Segment zugegriffen werden soll
  • mhc ("max height closed") - maximale Höhe im geschlossenen Zustand
  • mho ("max height opened") - maximale Höhe im geöffneten Zustand
  • oc ("open close") - Spezifiziert, ob das Segment im geöffneten und/oder geschlossenen Zustand der Kategorie angezeigt wird; Funktionen werden ersetzt; default o
    • c - Segment wird nur in geschlossenem Zustand angezeigt
    • o - Segment wird nur in geöffnetem Zustand angezeigt
    • oc - Segment wird in geöffnetem und geschlossenen Zustand angezeigt
  • r ("rights") - Rechtedefinition
  • ro ("read only") - Der Anwender kann die Daten im Segment nicht ändern

#xxgrd_col

Die Prozedur #xxgrid_col definiert die fixen Spalten des Grids, die an der linken Seite stehen.

Parameter

Diese Prozedur gleich #grid_col, die Parameter sind dort beschrieben.

Beispiel

siehe unten

#xxgrd_xcol

Die Prozedur #xxgrid_xcol definiert die vorderen variablen Spalten des Grids.

Parameter

Diese Prozedur gleich #grid_col, die Parameter sind dort beschrieben.

Beispiel

siehe unten

#xxgrd_xxcol

Die Prozedur #xxgrid_xxcol definiert die hinteren variablen Spalten des Grids.

Parameter

Diese Prozedur gleich #grid_col, die Parameter sind dort beschrieben.

Beispiel

siehe unten

Beispiel

Das folgende Beispiel ist aus der Reklamationsbearbeitung eines Reiseveranstalters. Die einzelnen Stichworte (hier nur ausschnittsweise) sind in Kategorien zusammengefasst. Diese Kategorien bilden die vorderen Spaltenüberschriften, die Reisenummern die hinteren (in einer Reklamation können mehrere Reisen bemängelt werden, die Stichworte müssen von daher den Reisen zugeordnet werden).

XXGrid-Segment

Um die Stichworte positionieren zu können, wird mit Zeilennummern gearbeitet, diese werden in der ersten Spalte angezeigt. Da die gesetzten Stichworte dem Vorgang zugeordnet werden müssen, muss die Vorgangs-ID gespeichert werden, dies passiert in einer Spalte mit der Breit 0.

#xxgrd_seg   n=cross   fcc=1   c=" "   b=H
#xxgrd_col  c1=Nr   w=30  ro=Y  f=zahl  st=gsj  nd=Y
#xxgrd_col  w=0  ro=Y  f=ks_vorgang_id  

Hier werden nun die variablen Spalten definiert. Vorne (xxgrid_xcol) haben wir das Stichwort, für die IDs, auch der Kategorie, haben wir davor eine Spalte mit der Breite 0. Hinten (xxgrid_xxcol) haben wir dann die Möglichkeit, einen Haken zu setzen (y=bool2), darüber muss die Reisenummer (f1=aktion), davor gibt es wieder eine Spalte mit der Breite 0 mit der ID des Stichworts. Da der Platz begrenzt ist, wird die Bezeichnung der Reise nur als Hint-Text der Reisenummer angezeigt.

#xxgrd_xcol   w=0   f1=rekla_tbs_kat_id   f=rekla_tbs_id
#xxgrd_xcol   w=170   f1=name   f=stiwo   ro=Y   st=gsf   nd=Y
#xxgrd_xxcol   w=0   f=rekla_stiwo_id
#xxgrd_xxcol   w=36   f1=aktion   f=aktiv   h1=bezeichnung   y=bool2

Mit #xxgrd_xdata werden die Spalten ermittelt. Das SQL-Statement muss ein kartesisches Produkt aus den Kategorien und denjenigen Reisenummern bilden, die beim Vorgang beteiligt sind (Tabelle neuland.ks_vorgang_reise). (Am Rande: Es handelt sich hier um einen Test auf einem System, das auf einer Postgres-Datenbank läuft, die Datenbank aber aus einem Oracle-System holt. Entsprechend ist db=ora_prod gesetzt und die GUID des Vorgangs hart codiert.)

#sql select k.rekla_tbs_kat_id, k.name, r.aktion, d.bezeichnung
#sql   from neuland.rekla_tbs_kat k
#sql     inner join neuland.ks_vorgang_reise r on r.ks_vorgang_id = :kid   and r.status < 7
#sql     inner join rsd d on d.aktion = r.aktion
#sql   where k.status = 1   and k.az = :kaz
#sql   order by k.sort, r.aktion;
#xxgrd_xdata   k=rekla_tbs_kat_id   kid=FFACF140-151F-412C-8EE7-A872B1DCA7EB    kaz=R   db=ora_prod

Die Tabelle, in welche die gesetzten Stichworte geschrieben werden, ist neuland.rekla_stiwo. Eine solche Tabelle muss stets mit einem left outer join der restlichen Abfrage hinzugefügt werden. Das restliche Statement liefert die Stichworte, Kategorien und Reisenummern. Der Parameter kaz ist ein Parameter aus dem SQL-Statement, in den die Abteilungszugehörigkeit (hier R für Reklamationsabteilung) geschrieben wird.

Wenn das Statement korrekt ist, müssen dann nur noch die Spaltenbezeichner für die Überschrift der vordere Variable Spalte (Kategorie, also fcol=rekla_tbs_kat_id), die vordere variable Spalte (Stichwort, also fxcol=rekla_tbs_id) und die hintere variable Spalte (Reisenummer, also fxxcol=aktion) sowie der Reihen (frow=zahl) gesetzt werden.

#sql select r.ks_vorgang_id, t.zahl, k.rekla_tbs_kat_id, k.name as kat, r.aktion, b.rekla_tbs_id, b.name as stiwo, s.rekla_stiwo_id, s.aktiv
#sql   from neuland.stamm_tage t
#sql     inner join neuland.rekla_tbs_kat k on  k.status = 1   and k.az = :kaz
#sql     inner join neuland.ks_vorgang_reise r on r.ks_vorgang_id = :kid   and r.status < 7
#sql     inner join neuland.rekla_tbs b on b.rekla_tbs_kat_id = k.rekla_tbs_kat_id and b.sort = t.zahl
#sql     left outer join neuland.rekla_stiwo s     on s.ks_vorgang_id = r.ks_vorgang_id      and s.rekla_tbs_id = b.rekla_tbs_id     and s.aktion = r.aktion
#sql   where t.zahl between 1 and 20
#sql   order by t.zahl, k.sort, r.aktion;
#code   fcol=rekla_tbs_kat_id   fxcol=rekla_tbs_id   fxxcol=aktion   
#xxgrd_data  t=neuland.rekla_stiwo   kid=FFACF140-151F-412C-8EE7-A872B1DCA7EB   kaz=R   $CODE$   frow=zahl   db=ora_prod

Picture-Segmente

Picture-Segmente dienen dazu, Bilder anzuzeigen.

#pic_seg

Die Prozedur #pic_seg fügt ein Bild ein. Mit dem Parameter y wird spezifiziert, wo das Bild her kommt.

Parameter

  • f ("Field") - Feldname, in dem der Dateiname des Bildes steht, wenn Parameter q=link; Funktionen werden ersetzt
  • fn ("FileName") - Dateiname des Bildes, wenn Parameter q=file; Funktionen werden ersetzt
  • ho ("height closed") - Die Höhe des Segments bei geschlossener Kategorie, wenn nicht AutoSize verwendet wird.
  • ho ("height open") - Die Höhe des Segments bei geöffneter Kategorie, wenn nicht AutoSize verwendet wird.
  • i ("Item") - Name des Grid-Segmentes, wenn Parameter q=link; Funktionen werden ersetzt
  • isc ("ignore server certificate") - Wenn Y, wird das Zertifikat des Servers bei q=http ignoriert; Funktionen werden ersetzt, default N
  • q - Datenquelle des Bildes
    • file - Der Dateiname des Bildes wird mit dem Parameter fn angegeben.
    • link - Der Dateiname des Bildes steht in einem verbundenen Grid-Segment, dessen Namen mit dem Parameter i und dessen Feldname mit dem Parameter f angegeben wird.
    • http - Das Bild wird aus dem Netz geladen, siehe Parameter url und isc
  • sh ("scroll horizontal") - Wenn Y, wird ein waagerechter Scrollbalken eingefügt; Funktionen werden ersetzt, default Y
  • sv ("scroll vertical") - Wenn Y, wird ein senkrechter Scrollbalken eingefügt; Funktionen werden ersetzt, default Y

Beispiele

#pic_seg   aso=Y   q=file   fn="T:\Tools Gruppenrechte\BafClient2\pics\gutschein_a4.png"   c=Gutschein   sv=N   sh=N
#pic_seg   aso=Y   q=link   i=grid   f=filename   c=Gutschein     sv=N   sh=N
#pic_seg   ho=300   q=http   url="https://api.predic8.de/shop/products/$FND(s,id)/photo"   isc=Y     sv=N   sh=N