GDI-BASIC 2.6
Seite 1/114 01.07.05
GDI-BASIC 2.6
Syntax-Beschreibung Stand: 01.07.2005 GDILine 2.0.5.2
GDI-BASIC 2.6
Seite 2/114 01.07.05
Allgemeine Hinweise zur Beschreibung ......................................................................................................................... 5 In GDI-Basic verwendete Datentypen : .......................................................................................................................... 5 String .......................................................................................................................................................................... 5 Integer......................................................................................................................................................................... 5 Float (Double)............................................................................................................................................................. 6 Boolean....................................................................................................................................................................... 6 Date, Time .................................................................................................................................................................. 6 Funktionen zur Bearbeitung von Zeichenketten (Strings) :............................................................................................. 7 StrToInt....................................................................................................................................................................... 7 IntToStr....................................................................................................................................................................... 8 StrToFloat................................................................................................................................................................... 9 FloatToStr................................................................................................................................................................. 10 StrToTime................................................................................................................................................................. 11 TimeToStr................................................................................................................................................................. 11 StrToDate ................................................................................................................................................................. 12 DateToStr ................................................................................................................................................................. 12 OEMtoCHAR ........................................................................................................................................................... 13 CHARtoOEM ........................................................................................................................................................... 13 RICHtoCHAR 2.0............................................................................................................................................... 13 FmtMemoStr 2.0 Neu.......................................................................................................................................... 14 Mask 2.0* .................................................................................................................................................... 15 Upper ........................................................................................................................................................................ 17 Lower........................................................................................................................................................................ 17 Copy.......................................................................................................................................................................... 18 Length ....................................................................................................................................................................... 18 Pos ............................................................................................................................................................................ 19 Replace ..................................................................................................................................................................... 19 GetCommaPos .......................................................................................................................................................... 20 SetCommaPos........................................................................................................................................................... 21 Trim 2.0 ........................................................................................................................................................... 21 GetLValue 2.0 ................................................................................................................................................... 22 GetRValue 2.0 ................................................................................................................................................... 22 Chr ............................................................................................................................................................................ 23 Ord............................................................................................................................................................................ 23 LineCount ................................................................................................................................................................. 24 Abs 2.0 Neu ................................................................................................................................................. 24 Funktionen f端r Dateizugriff und Bedienerf端hrung:....................................................................................................... 25 Show ......................................................................................................................................................................... 25 Question.................................................................................................................................................................... 26 Input.......................................................................................................................................................................... 27 MaskInput 2.0 Neu....................................................................................................................................... 28 CodewortAbfrage 2.0 Neu ........................................................................................................................... 29 OpenDialog 2.0 ................................................................................................................................................... 31 SaveDialog 2.0 ................................................................................................................................................... 34 SelectDirectory 2.0 Neu ...................................................................................................................................... 35 SaveToFile................................................................................................................................................................ 37 LoadFromFile ........................................................................................................................................................... 38 FileExists .................................................................................................................................................................. 38 DeleteFile 2.0 Neu ........................................................................................................................................... 39 RenameFile ............................................................................................................................................................... 39 Funktionen zur Bearbeitung von Stringlisten:............................................................................................................... 40 $Liste.CreateStringList 2.0 ................................................................................................................................... 40 $Liste.FreeStringList 2.0....................................................................................................................................... 40 $Liste.LoadFromFile 2.0....................................................................................................................................... 41 $Liste.SaveToFile 2.0 ........................................................................................................................................... 41 $Liste.SetText 2.0 ................................................................................................................................................ 42 $Liste.GetText 2.0 ............................................................................................................................................... 42 $Liste.Add 2.0 ................................................................................................................................................... 43 $Liste.Count 2.0................................................................................................................................................... 44 $Liste.Element 2.0 ............................................................................................................................................... 45 $Liste.SetElement 2.0 Neu ................................................................................................................................... 46
GDI-BASIC 2.6
Seite 3/114 01.07.05
$Liste.Delete 2.0 .................................................................................................................................................. 47 $Liste.Insert 2.0 ................................................................................................................................................... 48 $Liste.Move 2.0 ................................................................................................................................................... 49 $Liste.Sorted 2.0 Neu........................................................................................................................................... 50 $Liste.IndexOf 2.0 ............................................................................................................................................... 51 $Liste.IndexOfName 2.0 ...................................................................................................................................... 51 $Liste.Values 2.0 ................................................................................................................................................. 53 Funktionen für Datenzugriffe (Tabellen-Funktionen):.................................................................................................. 54 %Tabelle.CreateTable .............................................................................................................................................. 54 %Tabelle.FreeTable.................................................................................................................................................. 55 %Tabelle.FreeSQL ................................................................................................................................................... 56 %Tabelle.CreateSQL 2.0* .................................................................................................................................... 57 @GDI_SQL_Tabelle.SQL 1.x .............................................................................................................................. 58 %Tabelle.SetSQL 2.0........................................................................................................................................... 59 %Tabelle.ExecuteSQL 2.0* ................................................................................................................................. 61 %Tabelle.ExecSQL .................................................................................................................................................. 62 %Tabelle.Open ......................................................................................................................................................... 62 %Tabelle.Close......................................................................................................................................................... 63 %Tabelle.BOF .......................................................................................................................................................... 64 %Tabelle.EOF .......................................................................................................................................................... 64 %Tabelle.First........................................................................................................................................................... 65 %Tabelle.Last ........................................................................................................................................................... 65 %Tabelle.Next .......................................................................................................................................................... 66 %Tabelle.Prior.......................................................................................................................................................... 66 %Tabelle.Edit ........................................................................................................................................................... 67 %Tabelle.CheckEdit ................................................................................................................................................. 67 %Tabelle.Append ..................................................................................................................................................... 68 %Tabelle.Post ........................................................................................................................................................... 69 %Tabelle.Cancel....................................................................................................................................................... 70 %Tabelle.Delete ....................................................................................................................................................... 71 %Tabelle.DeleteTable .............................................................................................................................................. 71 %Tabelle.EmptyTable .............................................................................................................................................. 72 %Tabelle.FindKey .................................................................................................................................................... 73 %Tabelle.FindEdit .................................................................................................................................................... 74 %Tabelle.SetRange................................................................................................................................................... 75 %Tabelle.CancelRange............................................................................................................................................. 75 @GDI_Table_Tabelle.Filter..................................................................................................................................... 76 @GDI_Table_Tabelle.IndexName ........................................................................................................................... 77 @GDI_Table_Tabelle.SaveDeleteRecords .............................................................................................................. 77 %Tabelle.RecordCount............................................................................................................................................. 78 %Tabelle.State.......................................................................................................................................................... 79 %Tabelle.Active ....................................................................................................................................................... 79 %Tabelle.Refresh...................................................................................................................................................... 80 %Tabelle.FieldCount 2.0 Neu.......................................................................................................................... 80 %Tabelle.FieldName 2.0 Neu .............................................................................................................................. 81 %Tabelle.FieldByIndex 2.0 Neu........................................................................................................................ 82 %Tabelle.FindField .................................................................................................................................................. 83 %Tabelle.FieldByName............................................................................................................................................ 84 %Tabelle.TextByName 2.0 Neu ....................................................................................................................... 85 GetTableData 2.0 Neu.......................................................................................................................................... 87 §Datenbank.CreateIBDatabase 2.0 Neu................................................................................................................. 88 §Datenbank.FreeIBDatabase 2.0 Neu .................................................................................................................... 88 Sonderfunktionen:......................................................................................................................................................... 89 System 2.0* ..................................................................................................................................................... 89 SystemTab 2.0* ................................................................................................................................................. 91 ClipBoard 2.0 Neu............................................................................................................................................ 92 WeekOfDate ............................................................................................................................................................. 93 DayOfWeek 2.0 Neu........................................................................................................................................... 94 Runden...................................................................................................................................................................... 94 Sleep ......................................................................................................................................................................... 95 Beep 2.0............................................................................................................................................. 96 ProcessMessages 2.0 Neu .................................................................................................................................. 97 Debug........................................................................................................................................................................ 98
GDI-BASIC 2.6
Seite 4/114 01.07.05
Execute ..................................................................................................................................................................... 99 ExecuteBasic............................................................................................................................................................. 99 Startdialog 2.0* ......................................................................................................................................... 100 SendMail 2.0 Neu.......................................................................................................................................... 105 Übersicht über die Sprachelemente von GDI-BASIC................................................................................................. 107 Hinweise zum Einsatz von GDI-BASIC ab Version 2.0 (Interbase)........................................................................... 108 Sonstiges/Fehlermeldungen/Tricks/Ansprungpunkte/GDI-Basic in Masken .............................................................. 110
GDI-BASIC 2.6
Seite 5/114 01.07.05
Allgemeine Hinweise zur Beschreibung Funktion
Art/Typ
Syntax : Hier steht jeweils der Syntax-Aufbau der Funktion Rückgabewert : Typ des Rückgabewertes der Funktion, soweit vorhanden. Beschreibung : Eine kurze Beschreibung, für welchen Zweck die Funktion (...) benutzt werden soll. Beispiel : Ein oder mehrere Beispiele, die möglichst anschaulich verdeutlichen, wie die Funktion „arbeitet“ und wozu die beschriebene Funktion dient. Anmerkung: Bitte beachten Sie auch die Abschnitte "Übersicht über die Sprachelemente von GDI-BASIC", "Sonstiges/Fehlermeldungen/Tricks" und "Hinweise zum Einsatz von GDI-BASIC ab Version 2.0 (Interbase)" am Ende dieser Syntaxbeschreibung. Desweiteren sei an dieser Stelle noch darauf hingewiesen, daß die Funktion Show (siehe Seite 23) sehr gut dafür geeignet ist, aktuelle Variablenwerte oder feste Texte im Zuge von Programmtests (z.B. wenn Sie die angeführten Beispiele nachbilden wollen) auszugeben.
In GDI-Basic verwendete Datentypen : String
Datentyp
Beschreibung In diesem Datentyp können beliebige Zeichenfolgen gespeichert werden. Die Länge dieser Zeichenfolge ist hierbei nahezu unbegrenzt (2 GB). Ein String wird durch ” begrenzt. Beispiel : Text := ”Dies ist ein String”;
Integer
Datentyp
Beschreibung Der Datentyp Integer beinhaltet eine ganzzahlige Zahl im Bereich von -2147483648 bis 2147483648 (32Bit einschließlich Vorzeichen) Beispiel : I := 12345;
GDI-BASIC 2.6
Seite 6/114 01.07.05
Float (Double)
Datentyp
Beschreibung Der Definitionsbereich von Float ist Teilmenge der reellen Zahlen (Realzahlen), die in Gleitkommanotation mit einer festen Anzahl von Stellen dargestellt werden können. Der Bereich von Float reicht von 5.0 x 10^-324 bis 1.7 x 10^308 (15-16 signifikante Stellen) Beispiel : X := 1.2345; Es ist zu beachten, daß als Dezimaltrenner der Punkt verwendet werden muß.
Boolean
Datentyp
Beschreibung Der Datentyp Boolean dient zur Speicherung von Wahrheitswerten (true/false; entspricht wahr/falsch). Gültige Werte sind true und false Beispiel : Bedingung := true;
Date, Time
Datentyp
Beschreibung In einer Date-Variablen können Datums- und Zeitangaben gespeichert werden. Das Datum wird intern als eine Ganzzahl (integer) abgespeichert. Diese Zahl entspricht der seit dem 31.12.1899 vergangenen Tage. Ein Untertyp des Datentyps Date ist der Datentyp Time. Der Wertebereich für Time liegt immer zwischen 0 (0 Uhr) und 1 (24 Uhr). Der Wert 0.75 entspricht also 18:00:00 Uhr. Für den Einsatzbereich der Business-Line ist die Verwendung von Time unbedeutend. Beispiel : result := Beleg1.Belegdat + Beleg1.Nettotag; Diese Anweisung könnte im Report in einer Expression hinterlegt sein. Anhand der Felddefinition des Feldes Belegdat erkennt das Programm automatisch, daß hier der Datentyp Date gelten soll. Silvester98 := StrToDate(”31.12.1998”); Hier wird eine Zeichenkette in das Datumsformat gewandelt.
GDI-BASIC 2.6
Seite 7/114 01.07.05
Funktionen zur Bearbeitung von Zeichenketten (Strings) : StrToInt
Funktion
Syntax : Ergebnis := StrToInt(Zeichenkette) Ergebnis : Integer Zeichenkette : String Rückgabewert : Integer Beschreibung : Wandelt, falls möglich, den String Zeichenkette in eine Integerzahl um. Man kann also mit dem Ergebnis Rechenoperationen durchführen. Sind in der Zeichenkette neben Zahlen auch andere Zeichen enthalten, so wird nur ein Teil der Zeichenkette umgewandelt (bis zum ersten sonstigen Zeichen). Beispiel : I := StrToInt("4711"); J := I + 20; J = 4731 zum Vergleich: zwei ähnliche Beispiele mit ihren Ergebnissen: I := "4711"; J := I + 20; J = "471120" Hier wurde die Funktion StrToInt weggelassen. Das Programm interpretiert die Zahl 20 als Stringkonstante, da die Variable I bereits eine Stringkonstante ist und fügt sie an den bestehenden String an. I:= 4711; J := I + 20; J = 4731 Hier wurde I schon als Integerwert erkannt/definiert. Deshalb wird die Addition der Zahlen durchgeführt.
GDI-BASIC 2.6
Seite 8/114 01.07.05
IntToStr
Funktion
Syntax : Ergebnis := IntToStr(Zahl) Ergebnis Zahl
: String : Integer
Rückgabewert : String Beschreibung : Wandelt den Integerwert Zahl in einen String um. Man kann mit dem Ergebnis Textoperationen durchführen, z.B. Einfügen in andere Texte. Beispiel : I := IntToStr(4711); I = "4711" I := IntToStr(4711 - 711); I = "4000" Anmerkung: Bei der Umsetzung von negativen Zahlen muß beachtet werden, daß man nicht eine einzige negative Zahl umsetzen kann (IntToStr(-10) führt zu einer Syntaxfehlermeldung, dagegen IntToStr(0 - 10) zum gewollten Ergebnis "-10").
GDI-BASIC 2.6
StrToFloat
Seite 9/114 01.07.05
Funktion
Syntax : Ergebnis := StrToFloat(Zeichenkette) Ergebnis : Float Zeichenkette : String Rückgabewert : Float Beschreibung : Wandelt, falls möglich, den String Zeichenkette in eine Fließkommazahl um. Man kann also mit dem Ergebnis Rechenoperationen durchführen. Sind in der Zeichenkette neben Zahlen und Dezimaltrenner (Punkt) auch andere Zeichen enthalten, so wird nur ein Teil der Zeichenkette umgewandelt (bis zum ersten sonstigen Zeichen). Vorangestelltes „Minus“Zeichen wird berücksichtigt. Beispiel : I := StrToFloat("4711.12"); J := I + 20; J = 4731,12 zum Vergleich: I := "4711.12"; J := I + 20; J = "4711.1220" Hier wurde die Funktion StrToFloat weggelassen. Das Programm interpretiert die Zahl 20 als Stringkonstante, da die Variable I bereits eine Stringkonstante ist und fügt sie an den bestehenden String an.
GDI-BASIC 2.6
Seite 10/114 01.07.05
FloatToStr
Funktion
Syntax : Ergebnis := FloatToStr(Fließkommazahl) Ergebnis Fließkommazahl
: String : Float
Rückgabewert : String Beschreibung : Wandelt den Floatwert Fließkommazahl in eine String um. Man kann mit dem Ergebnis Textoperationen durchführen, z.B. Einfügen in andere Texte. Beispiel : I := FloatToStr(4711.12); J = "4711,12"
GDI-BASIC 2.6
Seite 11/114 01.07.05
StrToTime
Funktion
Syntax : Ergebnis := StrToTime(Zeichenkette) Ergebnis : Time Zeichenkette : String Rückgabewert : Time Beschreibung : Wandelt, falls möglich, den String Zeichenkette in den Datentyp Time um. Beispiel : T := StrToTime("12:00:00"); T := T + 0.25; T hat nun intern den Wert 0,75. Dies entspricht der Uhrzeit 18:00:00 Uhr.
TimeToStr
Funktion
Syntax : Ergebnis := TimeToStr(Zeit) Ergebnis : string Zeichenkette : time Rückgabewert : string Beschreibung : Wandelt, falls möglich, den angebenen Wert für die Zeit in eine Zeichenkette um. Man kann mit dem Ergebnis Textoperationen durchführen, z.B. Einfügen in andere Texte. Beispiel : T := TimeToStr(0.5); T = "12:00:00"
GDI-BASIC 2.6
Seite 12/114 01.07.05
StrToDate
Funktion
Syntax : Ergebnis := StrToDate(Zeichenkette) Ergebnis : Date Zeichenkette : String Rückgabewert : Date Beschreibung : Wandelt, falls möglich, den String Zeichenkette in den Datentyp Date um. Beispiel : Silvester99 := StrToDate("31.12.1999"); Neujahr2000 := Silvester99 + 1; Neujahr2000 hat nun intern den Wert 36526 (Tage seit dem 31.12.1899), was dem 01.01.2000 entspricht.
DateToStr
Funktion
Syntax : Ergebnis := DateToStr(Datum) Ergebnis Datum
: String : Date
Rückgabewert : String Beschreibung : Wandelt das angegebene Datum in einen String (Zeichenkette) um. Man kann mit dem Ergebnis Textoperationen durchführen, z.B. Einfügen in andere Texte. Beispiel : Silvester99 := StrToDate("31.12.1999"); Neujahr2000 := DateToStr(Silvester99 + 1); Neujahr2000 = 01.01.2000
GDI-BASIC 2.6
Seite 13/114 01.07.05
OEMtoCHAR
Funktion
Syntax : Ergebnis := OEMtoCHAR(Zeichenkette) Ergebnis, Zeichenkette
: String
Rückgabewert : String Beschreibung : Die Funktion setzt den Zeichensatz des Strings Zeichenkette vom DOS-Zeichensatz in den Windowszeichensatz um. Dadurch können Probleme mit der Darstellung von Umlauten z.B. beim Datenimport aus DOS-Programmen gelöst werden. Anmerkung: Die Funktion ist ab Version 1.7.4.8 verfügbar
CHARtoOEM
Funktion
Syntax : Ergebnis := CHARtoOEM(Zeichenkette) Ergebnis, Zeichenkette
: String
Rückgabewert : String Beschreibung : Die Funktion setzt den Zeichensatz des Strings Zeichenkette vom Windows-Zeichensatz in den DOS-Zeichensatz um. Umkehrfunktion zur o.g. Funktion OEMtoCHAR. Anmerkung: Die Funktion ist ab Version 1.7.4.8 verfügbar
RICHtoCHAR
2.0
Funktion
Syntax : Ergebnis := RICHtoCHAR(Zeichenkette) Ergebnis, Zeichenkette
: String
Rückgabewert : String Beschreibung : Die Funktion RICHtoCHAR entfernt die Steuerzeichen, die in einer im RichText-Format abgelegten Zeichenkette enthalten sind. Dadurch können Probleme beim Datenexport gelöst werden (Beispiel: Export der Zahlungszieltexte).
GDI-BASIC 2.6
FmtMemoStr
Seite 14/114 01.07.05
2.0 Neu
Funktion
Syntax : Ergebnis := FmtMemoStr(Zeichenkette, Ersetzen) Ergebnis, Zeichenkette Ersetzen
: String : Boolean
Rückgabewert : String Beschreibung : Über die Funktion FmtMemoStr können Zeilenumbrüche oder Hochkommata in einem String durch andere Zeichen ersetzt werden (Ersetzen = true). Dadurch kann z.B. ein Artikeltext mit Zeilenumbrüchen in Stringlisten verarbeitet oder in eine Textdatei exportiert werden. • CR/LF wird durch Ascii255 ersetzt • Hochkomma wird durch Ascii254 ersetzt • Doppeltes Hochkomma wird durch Ascii251 ersetzt. Beispiel : S := "Dies ist ein " + CHR(34) + "Text mit " + CHR(13,10) + "Umbruch" + CHR(34) + ", d.h. er besteht " + CHR(13,10) + "aus mehreren Zeilen. Er enthält zusätzlich " + CHR(13,10) + "verschiedene " + CHR(39) + "Hochkommata" + CHR(39); show(S); S := FmtMemoStr(S, true); show(S); S := FmtMemoStr(S, false); show(S);
Dieser Beispieltext wird erst "im Original", dann mit FmtMemoStr "einzeilig" umgewandelt und wieder zurück transformiert mit show-Anweisungen angezeigt.
GDI-BASIC 2.6
Mask
Seite 15/114 01.07.05
2.0*
Funktion
Syntax : Mask(Format,Wert) Format Wert
: String : String, Integer, Float, Date
Rückgabewert :
Beschreibung : Die Funktion Mask ermöglicht eine Formatierung von Werten. Dies kann z.B. in Verbindung mit der Funktion Show zur formatierten Ausgabe genutzt werden. Folgende Formatanweisungen sind möglich: C Ausgabe eines Strings in definierter Stelligkeit (z.B. "C10") L Ausgabe eines Strings in Kleinbuchstaben U Ausgabe eines Strings in Großbuchstaben N Ausgabe einer Zahl mit definierter Stelligkeit (z.B. "N10.2" oder "N5"). Es erfolgt eine automatische Rundung der Zahl. Nullwerte werden unterdrückt n wie bei N zur Ausgabe einer Zahl mit definierter Stelligkeit (z.B. "n10.2" oder "n5"). Nullwerte werden jedoch als "0" ausgegeben R Ausgabe einer Zahl mit einer speziellen Formatierung (vgl. PrintMask im Reportdesigner). Im Gegensatz zu "N" können hier auch Tausendertrenner definiert werden. (z.B. "R###,###,##0.00;; "). Es erfolgt eine automatische Rundung der Zahl D Datumsformatierung (meist wird "D8" oder "D10" verwendet) D4 JJJJ D5 MM.JJ D7 MM.JJJJ D8 TT.MM.JJ D10 TT.MM.JJJJ D16 TT.MM.JJJJ hh:mm D19 TT.MM.JJJJ hh.mm.ss Die Formatierung auf ein bestimmtes Datumsformat in Basic-Programmen ist auch hilfreich, um Fehler aufgrund verschiedener Datumseinstellungen bei den eingesetzten Rechnern zu vermeiden. T Uhrzeitformatierung. T2 hh T5 hh:mm T8 hh:mm:ss Z Datumsausgabe bei Angabe der Folgetageanzahl im Format D10 (ab 2.0.5.2) Z15 Gibt das Datum des 15. Tages ab dem übergebenen Datum aus Z-15 Gibt das Datum des 15. Tages des nachfolgenden Monats aus Erweiterungen zur Formatierung auf eine vorgegebene Stringlänge (ab 2.0.2.9): Mögliche Einsatzgebiete: Datenexport, Protokollausgabe ..... S Mit grossem S wird ein String linksbündig auf die angegebene Stelligkeit formatiert s Mit kleinem s wird ein String rechtsbündig auf die angegebene Stelligkeit formatiert F Mit grossem F wird eine Zahl rechtsbündig auf die angegebene Stelligkeit formatiert Das Ergebnis ist natürlich ein String, wobei das Komma (Dezimaltrenner) ein Zeichen einnimmt Erweiterungen zur Zahlenausgabe im Klartext (ab 2.0.x): W Ermöglicht die Ausgabe einer Ganzzahl in Worten. Über die Angabe (z.B."W25")
GDI-BASIC 2.6
w
Seite 16/114 01.07.05
der gewünschten Zeichenkettenlänge wird zunächst ein String aus entsprechend vielen Bindestrichen gebildet. Dann wird die Zahl von links beginnend aufgelöst und die Zahlworte in den String eingefügt (jeweils durch einen Bindestrich voneinander abgetrennt). Sofern die Stringlänge für diese Darstellung nicht ausreicht, werden Sternchen (*) statt der gewünschten Formatierung ausgegeben. Mit kleinem w kann man eine Ziffer innerhalb einer Ganzzahl als Wort ausgeben. Die Zahlenangabe steht hierbei für die Position der Ziffer in der zahl von rechts, beginnend mit 1 (also "w2" bedeutet zweite Ziffer von rechts)
Beispiel : S := 20 / 3; M := Mask("N10.2",S); show("Zwischenergebnis: " + M);
Datum := Mask("D10",System("Date")); show(Datum); Jahr := Copy(Datum,7,4); show(Jahr);
Hier wird gezielt das Datum mit D10 formatiert, bevor die Jahreszahl ermittelt wird. Man könnte hierfür auch D4 verwenden A := "*" + mask("S10","abc") + "*" + CHR(13,10) + "*" + mask("s10","abc") + "*" + CHR(13,10) + "*" + mask("F10.3",125.2) + "*" + CHR(13,10); show(A); SaveToFile(system("MandPfad") + "Mask.txt", A); *abc * * abc* * 125,200*
Als Ergebnis liegt hier ein sauber formatierter Textblock vor, sofern man die Ausgabe mit einer Schrift fixer Zeichenbreite vorsieht. Zahl := 1234; W := Mask("W25",Zahl);
W = "EINS-ZWEI-DREI-VIER------" Ergebnis einer Wortausgabe auf 25 Zeichen der Zahl 1234 S1 := Mask("Z10",System("Date")); S2 := Mask("Z-10",System("Date")); show(S1 + " " + S2);
Datumsformatierung mit pos. und neg. Folgetageanzahl
GDI-BASIC 2.6
Seite 17/114 01.07.05
Upper
Funktion
Syntax : Ergebnis := Upper(Zeichenkette) Ergebnis, Zeichenkette
: String
Rückgabewert : String Beschreibung : Wandelt alle Buchstaben aus dem String Zeichenkette in Großbuchstaben um. Dabei bleiben Zahlen und Sonderzeichen unverändert. Ab 1.7.4.12 werden auch Umlaute umgesetzt. Beispiel : A := Upper(”Gdi-Business-Line”); A = "GDI-BUSINESS-LINE"
Lower
Funktion
Syntax : Ergebnis := Lower(Zeichenkette) Ergebnis, Zeichenkette
: String
Rückgabewert : String Beschreibung : Wandelt alle Buchstaben aus dem String Zeichenkette in Kleinbuchstaben um. Dabei bleiben Zahlen und Sonderzeichen unverändert. Ab 1.7.4.12 werden auch Umlaute umgesetzt. Beispiel : A := Lower(”Gdi-Business-Line”); A = "gdi-business-line"
GDI-BASIC 2.6
Seite 18/114 01.07.05
Copy
Funktion
Syntax : Ergebnis := Copy (Zeichenkette, Anfang, Anzahl) Ergebnis, Zeichenkette Anfang, Anzahl
: String : Integer
Rückgabewert : String Beschreibung : Kopiert, beginnend von Anfang, Anzahl Zeichen aus dem String Zeichenkette. Das Ergebnis steht im String Ergebnis Beispiel : Neu := Copy(”Dies ist ein Test”, 1, 4); Neu = “Dies” Neu := Copy(”Dies ist ein Test”, 6, 3); Neu = “ist”
Length Syntax : Ergebnis := Length(Zeichenkette) Ergebnis : Integer Zeichenkette : String Rückgabewert : Integer Beschreibung : Ermittelt die Länge, d.h. die Anzahl der Zeichen des Strings Zeichenkette. Beispiel : Laenge := Length(”Gdi-Basic”); Laenge = 9
Funktion
GDI-BASIC 2.6
Seite 19/114 01.07.05
Pos
Funktion
Syntax : Ergebnis := Pos(Teilzeichenkette,Zeichenkette) Ergebnis Teilzeichenkette, Zeichenkette
: Integer : String
Rückgabewert : Integer Beschreibung : Ermittelt die Anfangsposition des Strings Teilzeichenkette (ein oder mehrere Zeichen) innerhalb des Strings Zeichenkette. Falls der Wert 0 zurückgegeben wird, ist die Teilzeichenkette in der Zeichenkette nicht vorhanden. Beispiel : P := Pos("-","Gdi-Basic"); P=4
Replace
Funktion
Syntax : Ergebnis := Replace(Zeichenkette,Vorher,Nachher,CaseSensitive) Ergebnis, Zeichenkette, Vorher, Nachher : String CaseSensitive : true oder false (Default-Wert ist true) Rückgabewert : String Beschreibung : Mit der Funktion Replace kann man eine Teilzeichenkette innerhalb eines Stringes durch eine andere ersetzen. ("Suchen und Ersetzen"). Das Löschen von Zeichen innerhalb eines Stringes ist mit dieser Funktion auch möglich, wenn man für "Nachher" einen Leer-String einsetzt. Anmerkung: Die Funktion ist ab Version 1.7.1.0 verfügbar Beispiel : S := "GDI_Business_Line"; S := Replace(S,"_","-"); S = "GDI-Business-Line"
GDI-BASIC 2.6
Seite 20/114 01.07.05
GetCommaPos
Funktion
Syntax : Ergebnis := GetCommaPos(Zeichenkette, Position, Trenner) Ergebnis, Zeichenkette, Trennzeichen Position
: String : Integer
R端ckgabewert : String Beschreibung : Besteht eine Zeichenkette aus Elementen, die durch den Trenner voneinander getrennt sind, so kann man mit Hilfe der Funktion GetCommaPos gezielt 端ber die Angabe der Position ein Element aus dieser Zeichenkette ermitteln. Die Positionsz辰hlung beginnt bei 0, die Angabe des Trenners ist optional, Defaulteinstellung ist Komma als Trenner. Anmerkung: Ab Version 1.7.4.20 verf端gbar, Angabe des Trenners ab Version 1.8.0.22 Beispiel : T := "0,1,2,3,4,5,6"; S := GetCommaPos(T,3); S = "3" T := "aaa;bbb;ccc"; S := GetCommaPos(T,2,";"); S = "ccc"
GDI-BASIC 2.6
Seite 21/114 01.07.05
SetCommaPos
Funktion
Syntax : Ergebnis := SetCommaPos(Zeichenkette, Position, Wert, Trenner, Format) Ergebnis, Zeichenkette, Wert, Trenner, Format Position
: String : Integer
Rückgabewert : String Beschreibung : Die Funktion SetCommaPos stellt die Umkehrfunktion der o.g. Funktion GetCommaPos dar. Besteht eine Zeichenkette aus Elementen, die durch Kommata voneinander getrennt sind, so kann man mit Hilfe der Funktion SetCommaPos gezielt über die Angabe der Position den Wert eines Elementes in dieser Zeichenkette durch ein anderen Wert ersetzen. Dabei kann optional eine Formatierung angegeben werden. Anmerkung: Die Funktion ist ab Version 1.7.4.20 verfügbar. Angabe des Trenners ab Version 1.8.0.22 (vor dem Parameter Format, bitte bei Einsatz von älteren Basic-Programmen beachten). Beispiel : T := "0,1,2,3,4,5,6"; S := SetCommaPos(T,3,"XYZ"); S = "0,1,2,XYZ,4,5,6" T := Replace(T,",",";"); S1 := SetCommaPos(T,3,25.7,";","N12.2"); S1 = "0;1;2;25.70;4;5;6"
Trim
Funktion
2.0
Syntax : Ergebnis := Trim(Zeichenkette) Ergebnis, Zeichenkette
: String
Rückgabewert : String Beschreibung : Die Funktion Trim trennt voran- und nachgestellte Leerzeichen und nichtdruckbare Zeichen von einer Zeichenkette ab. Beispiel : T := Trim(" Dies ist ein Text "); T = "Dies ist ein Text"
GDI-BASIC 2.6
GetLValue
Seite 22/114 01.07.05
Funktion
2.0
Syntax : Ergebnis := GetLValue(Zeichenkette) Ergebnis, Zeichenkette
: String
R端ckgabewert : String Beschreibung : Besteht ein Zeichenkette aus zwei Teil-Zeichenketten, die durch ein Gleichheitszeichen "=" voneinander getrennt sind, so kann mit der Funktion GetLValue die linksseitige Teilzeichenkette abgetrennt werden. Beispiel : T := "ARTIKELNR=GDI_CHAR30"; Feldname := GetLValue(T);
Feldname = "ARTIKELNR"
GetRValue
Funktion
2.0
Syntax : Ergebnis := GetRValue(Zeichenkette) Ergebnis, Zeichenkette
: String
R端ckgabewert : String Beschreibung : Besteht ein Zeichenkette aus zwei Teil-Zeichenketten, die durch ein Gleichheitszeichen "=" voneinander getrennt sind, so kann mit der Funktion GetRValue die rechtsseitige Teilzeichenkette abgetrennt werden. Beispiel : T := "ARTIKELNR=GDI_CHAR30"; Felddef := GetRValue(T);
Felddef = "GDI_CHAR30"
GDI-BASIC 2.6
Seite 23/114 01.07.05
Chr
Funktion
Syntax : Ergebnis := Chr(Int1,Int2,...) Ergebnis Int1, Int2,...
: druckbare(s) Zeichen oder Befehlszeichen : Integerzahl zwischen 0 und 255 (Ascii-Zeichentabelle)
Rückgabewert : String ( druckbare(s) Zeichen oder Befehlszeichen) Beschreibung : Wandelt eine oder mehrere Integerzahlen anhand der Ascii-Zeichentabelle in die entsprechenden ausdruckbaren Zeichen oder Befehlszeichen um. Befehlszeichen sind insbesondere die Ascii-Zeichen 9 ( Tabulator), 10 ( Zeilenvorschub) und 13 ( Zeilenumbruch). Beispiel : A := Chr(64); A = "@" A := "Textzeile1" + Chr(13,10) + "Textzeile2"; A = "Textzeile1 Textzeile2"
Ord
Funktion
Syntax : Ergebnis := Ord(Zeichenkette) Zeichenkette : druckbare(s) Zeichen oder Befehlszeichen Ergebnis : Integerzahl zwischen 0 und 255 (Ascii-Zeichentabelle) Rückgabewert : Integerzahl Beschreibung : Umkehrfunktion zur o.g. Funktion Chr. Gibt an, welcher Integerzahl gemäß der AsciiZeichentabelle das erste Zeichen der Zeichenkette entspricht. Anmerkung: Verfügbar ab Version 1.7.4.21 Beispiel : A := Ord("@"); A = 64
GDI-BASIC 2.6
Seite 24/114 01.07.05
LineCount
Funktion
Syntax : Ergebnis := LineCount(Zeichenkette) Ergebnis : Integer Zeichenkette : String Rückgabewert : Integer Beschreibung : Ermittelt die Anzahl der Zeilenumbrüche (CHR10) in einem String. Kann z.B. im Reportdesigner benutzt werden, um die notwendige Höhe von Abschluß- oder Fuß-Bändern zu berechnen. Diese besitzen nicht die "Autostrech"-Funktionalität. Anmerkung: Verfügbar ab Version 1.7.4.14 Beispiel : A := "Dies ist ein" + CHR(13,10) + "zweizeiliger Text"; B := LineCount(A); B= 1
Abs
Funktion
2.0 Neu
Syntax : Ergebnis := Abs(Zahl) Ergebnis, Zahl :
Integer, Float
Rückgabewert : Integer, Float Beschreibung : Bildet den Betrag (Absolutwert) der angegebenen Zahl. Verfügbar ab Version 2.0.3.22 Beispiel : W1 W2 W3 W4
:= := := :=
5.0; 7.33; W1 - W2; Abs(W3);
W3 = -2,33 W4 = 2,33
GDI-BASIC 2.6
Seite 25/114 01.07.05
Funktionen für Dateizugriff und Bedienerführung: Show
Funktion
Syntax : Show(Zeichenkette) Zeichenkette : String, Integer, Float, Date Rückgabewert : Kein Rückgabewert. Es erfolgt die Bildschirmanzeige der Zeichenkette, sofern diese automatisch in einen String umgewandelt werden kann. Ansonsten muß zuvor per GDI-BasicFunktion die Umwandlung durchgeführt werden (z.B. IntToStr, FloatToStr, DateToStr). Beschreibung : Show ermöglicht es, daß man Informationen während des Programmablaufes auf den Bildschirm ausgeben kann. Diese Informationen können feste Texte sein (z.B. Hinweise an den Bediener) oder aber auch aktuelle Werte von Variablen (sinnvoll im Zuge von Programmtests). Nach Bestätigen der Information mit OK läuft das Programm weiter. Beispiel : show("HALLO");
S := 27 + 3; show("Zwischenergebnis: " + S);
GDI-BASIC 2.6
Seite 26/114 01.07.05
Question
Funktion
Syntax : Question(Fragetext,[Symbol,[Buttons]]) Fragetext Symbol Buttons
: String : "*" = Info-Symbol, "?" = Fragezeichen, "X" = rotes Kreuz, "!" = Warnschild Vorgabewert ist "?" : "J" = Ja, "N" = Nein, "A" = Abbruch, "O" = Ok, ein vorangestellter "_" legt den Default-Button fest, Vorgabewert ist "_JN"
Rückgabewert : Boolean. "Ja" und "Ok" ergeben "true", "Nein" und "Abbruch" sowie das mutwillige Beenden des Dialoges liefern "false" zurück. Beschreibung : Durch die Funktion Question wird ein klassischer Ja/Nein- bzw. Ok/Abbruch-Abfragedialog geöffnet. Neben dem Fragetext können verschiedene Buttons auf dem Dialog plaziert werden, welche dem Bediener die Möglichkeit geben, in den Programmablauf einzugreifen. Anmerkung: Die Funktion Question ist ab Version 1.7.1.0 verfügbar. Beispiel : Question("Soll das Programm gestartet werden?")
if Question("Achtung. Die Datei xyz existiert bereits." + CHR(13,10) + "Soll diese überschrieben werden?","!", "J_N") then .... else .... endif; exit;
GDI-BASIC 2.6
Seite 27/114 01.07.05
Input
Funktion
Syntax : Input(Variable,Überschrift,Titel) Variable Überschrift, Titel
: String, Integer, Float, Date : String
Rückgabewert : Integer. Input selbst liefert entweder 0 (bei Abbrechen) oder den Wert -1 (bei OK) zurück. Nur im Falle von OK wird auch der Variablenwert zurückgegeben Beschreibung : Durch die Funktion Input wird ein Eingabedialog geöffnet. Der Dialog kann mit Überschrift und Titel versehen sein, beinhaltet ein Eingabefeld für die Variable und die beiden Buttons „OK“ und „Abbrechen“. Dem Bediener wird somit die Möglichkeit gegeben, in den Programmablauf einzugreifen. Programmtechnisch kann man den Rückgabewert der Inputfunktion selbst als auch den Variablenwert auswerten (s.u. zweites Beispiel). Beispiel : Input(Variable,"Überschrift","Titel");
W := ""; if Input(W,"Programm XYZ","Bitte geben Sie eine Warengruppe ein") = 0 then show("Programm wurde abgebrochen !!"); exit; endif; ... ...
Bei diesem Beispiel wird der Rückgabewert der InputBox abgeprüft. Wird in der Box "Abbrechen" gewählt, so wird das Programm beendet. Da die Variable W hier mit einem Leerstring vorbesetzt ist, wird in der Eingabezeile kein Vorgabewert angezeigt wird.
GDI-BASIC 2.6
MaskInput
Seite 28/114 01.07.05
Funktion
2.0 Neu
Syntax : MaskInput(Variable,Überschrift,Titel,Maske) Variable Überschrift, Titel, Maske
: String, Integer, Float, Date : String
Rückgabewert : Integer. MaskInput selbst liefert entweder 0 (bei Abbrechen) oder den Wert -1 (bei OK) zurück. Nur im Falle von OK wird auch der Variablenwert zurückgegeben Beschreibung : Die Funktion MaskInput stellt eine Erweiterung der Funktion Input (s.o.) dar. Auch hier wird ein Eingabedialog geöffnet, der Dialog kann jedoch einen mehrzeiligen Titel beinhalten und das Eingabefeld für die Variable kann mit einer Maskierung/Formatierung versehen sein. Die Maskierungsfunktionalität ergibt sich analog zur Funktion Mask (s.o.), es können jedoch nur Formatierungen verwendet werden, welche als Eingabeformatierungen gedacht sind (C, N, n, D, T, U, L). Formatierungen, welche ausschliesslich für Ausgabeformate vorgesehen sind können nicht verwendet werden (R, W, w, S, s, F). Verfügbar ab 2.0.3.20 Beispiel : MaskInput(Variable,"Überschrift","Titel","D19");
S := "A"; Titel := "Nach Abfrage: " + CHR(9) + "A" + "Keine Abfrage: " + CHR(9) + "K" + "Protokolliert: " + CHR(9) + "P" + "Bitte gewünschte Option angeben"; if MaskInput(S,"Änderungs-Optionen", Titel, show("Abbruch"); exit; else ... endif;
CHR(13,10) + CHR(13,10) + CHR(13,10) + "A1AKP") = 0 then
GDI-BASIC 2.6
CodewortAbfrage
Seite 29/114 01.07.05
2.0 Neu
Funktion
Syntax : CodewortAbfrage(Überschrift,Titel,Userflag,Bediener,Codewort) Überschrift, Titel, Userflag : String Bediener, Codewort : String oder String aus Teilstrings, durch CRLF getrennt (Liste) Rückgabewert : Die Codewortabfrage liefert immer 0 bei Abbruch oder falschem Codewort, ansonsten bei korrektem Codewort und OK entweder -1 (bei einem Bediener) oder den Bediener selbst bei einer Bedienerliste zurück. Beschreibung : Die Funktion Codewortabfrage ermöglicht die Abfrage der Passwörtern. Sie wird automatisch solange wiederholt aufgerufen, bis entweder Abbruch oder das korrekte Codewort eingegeben wurde. Es sind zwei grundsätzliche Fälle zu unterscheiden: 1. Bei Abfrage der Codeworte von Administrator, Systemmanager oder des aktuell angemeldeten Bedieners genügt die Parameterangabe Userflag ("A","S" oder "B") 2. Bei Abfrage anderer Codeworte muss diesem Dialog Bediener und Codewort bereits übergeben werden, wobei es auch möglich ist, mehrere Bediener und dazugehörige Codeworte in jeweils CRLF getrennten Listen zu übergeben. Insgesamt gibt es folgende Möglichkeiten: • Übergabe eines eigenen Bediener-Kürzels und eines (unverschlüsselten) Codewortes (hierbei UserFlag = "") • Übergabe einer eigenen Bediener-Liste und einer (unverschlüsselten) Codewort-Liste (hierbei UserFlag = "") • Abfrage des Administrator-Codewortes (UserFlag = "A") • Abfrage des Systemmanager-Codewortes (UserFlag = "S") • Abfrage des Codewortes des aktuell angemeldeten Bedieners (UserFlag = "B") • Abfrage des Codewortes eines im System angelegten Bedieners (UserFlag = "L"). Im letzten Fall müssen Bedienernr/Bedienerliste und (verschlüsseltes) Codewort/Codewortliste hierfür aus der Tabelle UserTable ermittelt und an den Dialog übergeben werden. Der Dialog greift nicht selbstständig auf diese Daten zu! Verfügbar ab 2.0.3.22 (nur Administrator, Systemmanager , ein Bediener/Codewort). Erweitert auf aktuelle Funktion mit 2.0.4.2. Gross-/Kleinschreibung beachten!
Beispiel : Codewortabfrage("Überschrift","Titel","A");
GDI-BASIC 2.6
Seite 30/114 01.07.05
Ueberschrift := "Datenexport"; Titel := "F端r diese Funktion ist ein Passwort erforderlich"; if Codewortabfrage(Ueberschrift,Titel,"","Export","abcde") = 0 then show("Programm wurde abgebrochen!"); endif;
%Q.CreateSQL(""); %Q.SetSQL("select bedienernr, passwort from usertable " + " where programm = " + chr(34) + "FACTUR" + chr(34)); %Q.Open; BedListe := ""; CodeListe := ""; while %Q.Eof = False do if BedListe = "" then BedListe := %Q.FieldByName("bedienernr"); else BedListe := BedListe + chr(13,10) + %Q.FieldByName("bedienernr"); endif; if CodeListe = "" then CodeListe := %Q.FieldByName("passwort"); else CodeListe := CodeListe + chr(13,10) + %Q.FieldByName("passwort"); endif; %Q.Next; endwhile; %Q.Close; %Q.FreeSQL; Ueberschrift := "Berechtigung pr端fen"; Titel := "Bitte Bedienerk端rzel und Codewort eingeben"; Res := Codewortabfrage(Ueberschrift,Titel,"L", BedListe, CodeListe); if Res = 0 then show("ABBRUCH"); exit; endif; show("Jetzt gehts weiter mit Bediener " + Res); exit;
GDI-BASIC 2.6
Seite 31/114 01.07.05
OpenDialog
Funktion
2.0
Syntax : OpenDialog(Pfad,Dateiname,Dateifilter,Parameter) Pfad, Dateiname, Dateifilter : String Parameter : Integer Rückgabewert : String. Bei Abbruch wird ein Leerstring zurückgegeben, ansonsten der eingestellte Pfad Beschreibung : Über die Funktion OpenDialog kann ein (Windows-) Dateiauswahldialog geöffnet werden. Hierbei können Default-Werte für Pfad, Dateiname und Dateifilter angegeben werden, um eine entsprechende Benutzerführung gewährleisten zu können. Im Ausdruck für den Dateifilter werden jeweils Beschreibung und Dateisuffix durch "|" voneinander getrennt aneinandergereiht. ("|" = ASCII-Zeichen 124 CHR(124)). Ohne Pfadangabe steht sich der Dialog im zuletzt von Windows benutzten Verzeichnis. Zurückgegeben wird immer ein Pfad einschl. Dateiname. Über den optionalen Parameter kann das Aussehen und das Verhalten des Dialogfeldes zusätzlich beeinflußt werden. Diese Funktionalität entspricht der Eigenschaft TOpenOption unter Delphi. Sollen mehrere der möglichen Optionen kombiniert werden, so sind die Zahlenwerte zu addieren. Die folgende Tabelle enthält die möglichen Parameter-Werte: Wert
Delphi
Bedeutung
1
ofReadOnly
2
ofOverwritePrompt
4 8
ofHideReadOnly ofNoChangeDir
16 32
ofShowHelp ofNoValidate
64
ofAllowMultiSelect
128
ofExtensionDifferent
256
ofPathMustExist
512
ofFileMustExist
1024
ofCreatePrompt
Aktiviert das Kontrollkästchen Schreibgeschützt, wenn das Dialogfeld geöffnet wird. Wenn der Benutzer eine Datei angibt, die bereits im Zugriff ist, wird er in einer Meldung gefragt, ob diese Datei überschrieben werden soll. Dieses Flag wird im Zusammenhang mit TSaveDialog und TSavePictureDialog verwendet. Entfernt das Kontrollkästchen Schreibgechützt aus dem Dialogfeld. Wenn der Benutzer auf OK klickt, wird das aktuelle Verzeichnis auf den Wert zurückgesetzt, den es vor dem Öffnen des Dialogfeldes hatte. Im Dialogfeld wird die Schaltfläche Hilfe angezeigt. Deaktiviert die Prüfung auf ungültige Zeichen in Dateinamen und erlaubt die Auswahl solcher Dateinamen.. Der Benutzer kann im Dialogfeld mehrere Dateien auswählen. Diese Option wird ab 2.0.3.12 unterstützt. Der Rückgabestring besteht hierbei aus entsprechend vielen durch CR/LF getrennten Zeilen. Dieses Flag wird zur Laufzeit gesetzt, wenn der ausgewählte Dateiname eine von DefaultExt verschiedene Erweiterung hat. Vergessen Sie nicht, dieses Flag zurückzusetzen, wenn Sie es in einer Anwendung verwenden. Wenn der Benutzer einen Dateinamen mit einem nicht existierenden Pfad angibt, wird eine Fehlermeldung angezeigt. Gibt eine Fehlermeldung aus, wenn der Benutzer eine nicht existierende Datei angibt (ist nur für Öffnen-Dialogfelder verfügbar). Wenn der Benutzer eine nicht existierende Datei angibt, wird er in einer Meldung gefragt, ob eine neue Datei mit dem angegebenen Namen erzeugt werden soll.
GDI-BASIC 2.6 2048 4096
Seite 32/114 01.07.05 ofShareAware ofNoReadOnlyReturn
Ignoriert Fehler, die aus gemeinsamen Zugriffen resultieren. Zeigt eine Fehlermeldung an, wenn der Benutzer eine schreibgeschützte Datei auswählt. 8192 ofNoTestFileCreate Prüft nicht, ob eine Netzwerkdatei geschützt ist und ob auf ein Laufwerk zugegriffen werden kann. Das Flag ist nur wirksam, wenn der Benutzer eine Datei in einem gemeinsam benutzten Netzwerkverzeichnis speichern will, in dem er zwar Dateien erzeugen, aber nicht ändern darf. 16384 ofNoNetworkButton Entfernt die Schaltfläche Netzwerk (die das Dialogfeld Netzlaufwerk verbinden öffnet) aus dem Dialogfeld. Dies gilt nur, wenn das Flag ofOldStyleDialog gesetzt ist. 32768 ofNoLongNames Zeigt nur Dateinamen im konventionellen DOS-Format an (8.3). Diese Option ist nur gültig, wenn Options auch ofOldStyleDialog enthält. 65536 ofOldStyleDialog Das Dialogfeld wird im traditionellen Stil erzeugt. 131072 ofNoDereferenceLinks Deaktiviert die Dereferenzierung von Windows-Verknüpfungen. Wenn der Benutzer eine Verknüpfung auswählt, wird der Eigenschaft FileName nicht die Datei zugewiesen, auf die die Verknüpfung zeigt, sondern der Pfad und der Dateiname der Verknüpfung selbst (die .LNK-Datei). 262144 ofEnableIncludeNotify Sendet include-Botschaften an das Dialogfeld (Windows 2000 und höher). 524288 ofEnableSizing Ermöglicht dem Benutzer, die Größe des Dialogfeldes zu verändern. Hinweis: Die Funktion einzelner Optionen kann vom Betriebssystem abhängen.
Beispiel : S := OpenDialog(System("MandPfad"),"Kst.dbf","DBF-Dateien|*.dbf"); if S = "" then show("Es wurde Abbruch gewählt"); exit; else if FileExists(S) = "" then show("Datei nicht vorhanden"); exit; else ... endif; ... endif;
GDI-BASIC 2.6
Seite 33/114 01.07.05
Öffnendialog zum Auswahl von dBase-Dateien ohne Verwendung von Parametern. Die Plausibilitätsprüfungen sind im Programm hinterlegt. P := System("MandPfad"); while Auswahl <> "OK" do S := OpenDialog(P,"Kst.dbf","DBF-Dateien|kst.dbf",772); if S = "" then show("Es wurde Abbruch gewählt"); exit; else if Pos("KST.DBF",Upper(S)) > 0 then Auswahl := "OK"; endif; endif; endwhile;
Öffnendialog zur Auswahl der dBase-Datei Kst.dbf mit Parameterangabe 772 (4 + 256 + 512 = 772). Dadurch wird die Checkbox "Mit Schreibschutz öffnen" ausgeblendet und die Plausibilitätsprüfungen auf Existenz der Datei vom Dialog selbst übernommen. Wird z.B. ein falscher Pfad angegeben und "Öffnen" gewählt, so erscheint folgende Meldung:
Durch Implementierung der while-Schleife wird verhindert, dass eine andere existierende Datei ausgewählt werden kann (die Funktion OpenDialog prüft ja lediglich Korrektheit der im Feld Dateiname stehenden Angabe) .
GDI-BASIC 2.6
Seite 34/114 01.07.05
SaveDialog
2.0
Funktion
Syntax : SaveDialog(Pfad,Dateiname,Dateifilter,Parameter) Pfad, Dateiname, Dateifilter : String Parameter : Integer Rückgabewert : String. Bei Abbruch wird ein Leerstring zurückgegeben, ansonsten der eingestellte Pfad Beschreibung : Über die Funktion SaveDialog kann ein (Windows-) Auswahldialog zum Datei-Speichern geöffnet werden. Er ist funktional mit dem OpenDialog (s.o.) identisch, lediglich der Button "Öffnen" ist hierbei mit "Speichern" beschriftet. Beispiel : P := System("MandPfad"); S := SaveDialog(P,"Test.txt","TXT-Dateien|*.txt",4); if S = "" then show("Es wurde Abbruch gewählt"); exit; else if FileExists(S) = "" then ... else if Question("Achtung. Die Datei existiert bereits." + CHR(13,10) + "Soll diese überschrieben werden?","!", "J_N") then ... else ... endif;
endif; ... endif;
GDI-BASIC 2.6
SelectDirectory
Seite 35/114 01.07.05
2.0 Neu
Funktion
Syntax : SelectDirectory(Pfad) oder SelectDirectory(Pfad,Titel) Pfad, Titel
: String
Rückgabewert : String. Bei Abbruch wird ein Leerstring zurückgegeben, ansonsten der ausgewählte Pfad. Beschreibung : Durch die Funktion SelectDirectory wird ein Dialog zur Auswahl eines Ordners geöffnet, wobei der Pfad als Voreinstellung bereits übergeben werden kann. Der Dialog existiert in zwei Varianten, deren Verwendung über den Parameter Titel gesteuert wird: Variante A: Ohne Angabe des zweiten Parameters Titel wird ein Dialog geöffnet, welcher neben einem Verzeichnisbaum auch ein Eingabefeld zum direkten Eintippen des Pfades und eine Auswahlliste der vorhandenen Laufwerke bietet. Zur Information werden die im angewählten Verzeichnis befindlichen Dateien angezeigt. Über das Eingabefeld besteht die Möglichkeit, Verzeichnisse neu anzulegen. Ohne Pfadangabe, bei fehlerhafter Pfadangabe oder alleinige Angabe eines Laufwerkbuchstabens stellt sich der Dialog auf den zuletzt in Windows verwendeten Pfad ein. Im Gegensatz zur Variante B kann man sich innerhalb der angebotenen Laufwerke frei bewegen, dafür steht aber die Netzwerkumgebung nicht zur Verfügung, d.h. innerhalb des Netzwerks man hat nur Zugriff über verbundene Laufwerke. Variante B: Mit Angabe des zweiten Parameters Titel wird ein Dialog geöffnet, welcher lediglich aus einem Verzeichnisbaum besteht. Innerhalb dieses Baumes kann man sich ausgehend vom übergebenen Pfad nur in diesem Ordner einschliesslich seiner Unterordner bewegen. Als Pfadangabe ist auch ein Laufwerksbuchstabe oder ein UNC-Pfad möglich. Ohne Pfadangabe stellt sich der Dialog auf den "Arbeitsplatz" ein, prinzipiell besteht die Möglichkeit über die Netzwerkumgebung Pfade im Netz anzuwählen. Hinweis: Die Funktion ist ab 2.0.4.6 verfügbar
Beispiel :
GDI-BASIC 2.6
Seite 36/114 01.07.05
Variante A: Zweiter Parameter wird nicht verwendet: S := SelectDirectory("D:\GDILine20\GDILINE2.0.4.4\Factur"); show(S);
Variante B: Zweiter Parameter wird verwendet: S := SelectDirectory("","Bitte w채hlen Sie ein Verzeichnis aus"); show(S);
GDI-BASIC 2.6
Seite 37/114 01.07.05
SaveToFile
Funktion
Syntax : SaveToFile(Dateiname,Zeichenkette) Dateiname, Zeichenkette
: String
Rückgabewert :
Beschreibung : Die Funktion SaveToFile erzeugt eine Textdatei mit Namen Dateiname und dem Inhalt Zeichenkette. Ist in dem Dateinamen eine Pfadangabe enthalten, so muß dieser Datenpfad bereits angelegt sein. Die Datei selbst wird vom Programm angelegt. Für den Fall, daß sie bereits existiert, wird die Datei überschrieben (ohne Abfrage). Anmerkung: Per GDI-Basic können nur Textdateien unmittelbar erzeugt werden. Die Erzeugung von Paradox- oder dBase-Dateien ist nicht möglich, da die erforderliche Satzstruktur nicht übergeben werden kann. Beispiel : SaveToFile("C:\Gdiline\Demo\Test.TXT","Text");
GDI-BASIC 2.6
Seite 38/114 01.07.05
LoadFromFile
Funktion
Syntax : Ergebnis := LoadFromFile(Dateiname) Ergebnis, Dateiname
: String
Rückgabewert : String Beschreibung : Die Funktion LoadFromFile lädt den Inhalt einer Textdatei mit Namen Dateiname. (Sinnvoll nur bei Textdateien). Der Dateiname kann eine Pfadangabe enthalten; ist kein Pfad angegeben, so wird die Datei im Mandanten gesucht. Anmerkung: Die Funktion ist ab Version 1.7. verfügbar. Beispiel : LoadFromFile("C:\Gdiline\Demo\Test.TXT");
FileExists
Funktion
Syntax : Ergebnis := FileExists(Dateiname) Ergebnis, Dateiname
: String
Rückgabewert : String. Ist die Datei vorhanden, wird der Pfad einschließlich Dateiname zurückgegeben, ansonsten ein Leer-String. Beschreibung : Mit der Funktion FileExits kann geprüft werden, ob eine Datei mit Namen Dateiname existiert. Der Dateiname kann eine Pfadangabe enthalten; ist kein Pfad angegeben, so wird die Datei im Programmpfad gesucht. Anmerkung: Die Funktion ist ab Version 1.7.2.9 verfügbar. Beispiel : Pfad := System("MandPfad"); S := FileExists(Pfad + "..\Gdiline.exe"); if S = "" then show("GDILINE existiert nicht"); else show(S); endif;
GDI-BASIC 2.6
DeleteFile
Seite 39/114 01.07.05
Funktion
2.0 Neu
Syntax : Ergebnis := DeleteFile(Pfad + Dateiname) Ergebnis, Pfad, Dateiname
: String
Rückgabewert : String. Konnte die Datei gelöscht werden, wird der Pfad einschließlich Dateiname zurückgegeben, ansonsten ein Leer-String. Beschreibung : Mit der Funktion DeleteFile kann eine Datei von Platte gelöscht werden. Die Datei darf nicht schreibgeschützt sein. Anmerkung: Die Funktion ist ab Version 2.0.x verfügbar. Beispiel : Pfad := System("MandPfad"); D := DeleteFile(Pfad + "test.txt"); if D <> "" then show("Datei erfolgreich gelöscht"); else show("Datei konnte nicht gelöscht werden!"); endif;
RenameFile
Funktion
Syntax : Ergebnis := RenameFile(Quelldateiname,Zieldateiname) Ergebnis, Quelldateiname, Zieldateiname
: String
Rückgabewert : Boolean. Das Ergebnis ist true, wenn das Umbenennen erfolgreich war. Beschreibung : Mit der Funktion RenameFile kann eine Datei umbenannt werden. Anmerkung: Die Funktion ist ab Version 1.7.1.0 verfügbar. Beispiel : Pfad := System("MandPfad"); if RenameFile(Pfad + "Export.txt", Pfad + "Export.dat") then show("Datei erfolgreich umbenannt"); else show("Datei konnte nicht umbenannt werden!"); endif;
GDI-BASIC 2.6
Seite 40/114 01.07.05
Funktionen zur Bearbeitung von Stringlisten: Eine Stringliste ist im einfachsten Falle ein in den Arbeitsspeicher geladener Text. (vgl. LoadFromFile einer Text-Datei). Erfüllt dieser Text gewissene Randbedingungen bzw. wird die Liste gezielt aufgebaut (z.B. jede Zeile besitzt einen Aufbau der Form "Schlüssel=Wert"), so ermöglichen die Stringlisten-Funktionen die Bearbeitung der Liste: • Strings können mittels Index in die Liste eingefügt bzw. gelöscht werden. • Die Reihenfolge der String-Einträge läßt sich verändern. • Strings können über ihre Listenposition angesprochen werden. • Strings können aus bzw. in eine Datei gelesen bzw. geschrieben werden. Die Bearbeitung einer Stringliste ist mit dem Bearbeiten einer indizierten Datentabelle vergleichbar. Da die Liste im Arbeitsspeicher liegt, ist eine schnelle Bearbeitung möglich. Wichtig: Sämtliche Stringlisten-Funktionen beginnen mit dem $-Zeichen (Dollar-Zeichen).
$Liste.CreateStringList
2.0
Stringlisten-Funktion
Syntax : $Liste.CreateStringList Liste : Stringlisten-Objekt Rückgabewert : Beschreibung : Die Funktion CreateStringList erzeugt das Stringlisten-Objekt mit Namen Liste. Auf dieses Objekt kann anschließend mit speziellen Stringlisten-Funktionen zugegriffen werden. Beispiel : $LI.CreateStringList;
Hier wird eine Stringliste definiert, die anschließend im Programm unter dem Namen LI ansprechbar ist. Der Inhalt der Stringliste wird durch nachfolgende Funktionen bestimmt.
$Liste.FreeStringList 2.0
Stringlisten-Funktion
Syntax : $Liste.FreeStringList Liste : Stringlisten-Objekt Rückgabewert : Beschreibung : Die Funktion FreeStringList entfernt das Stringlisten-Objekt mit Namen Liste aus dem Arbeitsspeicher. Auf dieses Objekt kann anschließend nicht mehr zugegriffen werden. Beispiel : $LI.FreeStringList;
Hier wird das Stringlisten-Objekt mit Namen LI aus dem Arbeitsspeicher entfernt.
GDI-BASIC 2.6
Seite 41/114 01.07.05
$Liste.LoadFromFile 2.0
Stringlisten-Funktion
Syntax : $Liste.LoadFromFile(Datei); Liste : Stringlisten-Objekt Datei : String Rückgabewert : Stringliste Beschreibung : Die Stringlisten-Funktion LoadFromFile übernimmt den kompletten Inhalt der Textdatei Datei (Dateiname einschl. Pfadangabe) in eine Stringliste. Im Gegensatz zur "normalen" Funktion LoadFromFile kann auf den Text nun mit Stringlisten-Funktionen zugegriffen werden. Beispiel : $LI.CreateStringList; $LI.LoadFromFile(System("MandPfad") + "Kunden.txt");
Hier wird das Stringlisten-Objekt mit Namen LI über die Stringlisten-Funktion LoadFromFile gefüllt.
$Liste.SaveToFile
2.0
Stringlisten-Funktion
Syntax : $Liste.SaveToFileFile(Datei); Liste : Stringlisten-Objekt Datei : String Rückgabewert :
Beschreibung : Die Stringlisten-Funktion SaveToFile legt den kompletten Inhalt der Stringliste in der Textdatei Datei ab. Es erfolgt keine Prüfung, ob die Datei bereits existiert. Beispiel : $LI.CreateStringList; ... $LI.SaveToFile(System("MandPfad") + "Kunden.txt");
Hier wird der Inhalt des Stringlisten-Objekts mit Namen LI über die Stringlisten-Funktion SaveToFile als Datei "Kunden.txt" im Mandantenpfad abgelegt.
GDI-BASIC 2.6
$Liste.SetText
Seite 42/114 01.07.05
2.0
Stringlisten-Funktion
Syntax : $Liste.SetText(Zeichenkette) Liste : Stringlisten-Objekt Zeichenkette : String Rückgabewert : Beschreibung : Über die Funktion SetText kann eine Zeichenkette unmittelbar in eine Stringliste übernommen werden. Ein evtl. vorhandener Listeninhalt wird "überschrieben". Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3");
"AAA=1 BBB=2 CCC=3" Hier wird der Inhalt der Stringliste durch die nachfolgende Funktion SetText bestimmt. Es handelt sich um eine aus drei Zeilen bestehende Liste.
$Liste.GetText
2.0
Stringlisten-Funktion
Syntax : $Liste.GetText Liste : Stringlisten-Objekt Rückgabewert : String Beschreibung : Der komplette Inhalt einer Stringliste kann über die Funktion GetText ausgelesen werden. Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3"); S := $LI.GetText;
S = "AAA=1 BBB=2 CCC=3" Hier wird der Inhalt der Stringliste durch die Funktion SetText bestimmt und über GetText an die Variable S übergeben.
GDI-BASIC 2.6
$Liste.Add
Seite 43/114 01.07.05
2.0
Stringlisten-Funktion
Syntax : $Liste.Add(Zeichenkette) Liste : Stringlisten-Objekt Zeichenkette : String Rückgabewert :
Beschreibung : Über die Stringlisten-Funktion Add kann eine weitere Zeile an die bestehende Liste angefügt werden. Diese Funktion ist z.B. nützlich, wenn man innerhalb von Programmschleifen Stringlisten aufbauen möchte. Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3"); $LI.Add("DDD=4");
"AAA=1 BBB=2 CCC=3 DDD=4" Hier wird eine StringListe definiert, die anschließend im Programm unter dem Namen LI ansprechbar ist. Der Inhalt der Stringliste wird durch die nachfolgende Funktion SetText bestimmt. Über die Funktion Add wird eine weitere Zeile angefügt. $LI.CreateStringList; i := 1; while i <= 5 do $LI.ADD("Zeile" + i + "=Test" + i + "0"); i := i + 1; endwhile;
"Zeile1=Test10 Zeile2=Test20 Zeile3=Test30 Zeile4=Test40 Zeile5=Test50" Hier wird eine StringListe definiert, die anschließend im Programm unter dem Namen LI ansprechbar ist. Über die Funktion Add werden in einer Programmschleife Zeilen angefügt.
GDI-BASIC 2.6
$Liste.Count
Seite 44/114 01.07.05
2.0
Stringlisten-Funktion
Syntax : $Liste.Count Liste : Stringlisten-Objekt Rückgabewert : Integer Beschreibung : Mit Hilfe der Stringlisten-Funktion Count kann die Anzahl der Zeilen der Liste ermittelt werden. Anmerkung: Vergleichbar mit der Funktion LineCount (s.o.), die auf "normale" Zeichenketten (Strings) angewendet werden kann und die Zeilenanzahl über die Anzahl der Zeilenumbrüche (CHR10) im String ermittelt. Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3"); Anzahl := $LI.Count;
"AAA=1 BBB=2 CCC=3" Anzahl = 3 Hier wird eine StringListe definiert, die anschließend im Programm unter dem Namen LI ansprechbar ist. Der Inhalt der Stringliste wird durch die nachfolgende Funktion SetText bestimmt. Es handelt sich um eine aus drei Zeilen bestehende Liste.
GDI-BASIC 2.6
$Liste.Element
Seite 45/114 01.07.05
2.0
Stringlisten-Funktion
Syntax : $Liste.Element(Position) Liste Position
: Stringlisten-Objekt : Integer
Rückgabewert : String Beschreibung : Mit Hilfe der Stringlisten-Funktion Element kann eine Zeile der Liste unter Angabe ihrer Positions-Nummer komplett ausgelesen werden. Die Positionsnummer ist eine Integerzahl mit dem Wertebereich zwischen 0 und Anzahl der Zeilen - 1. Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3"); S := $LI.Element(1);
S = "BBB=2" Hier wird eine StringListe definiert, die anschließend im Programm unter dem Namen LI ansprechbar ist. Der Inhalt der Stringliste wird durch die nachfolgende Funktion SetText bestimmt und mit der Stringlisten-Funktion Element wird die Zeile mit der Position 1 ausgelesen.
$LI.CreateStringList; ... i := 0; while i < $LI.Count do Z := $LI.Element(i); ... ... i := i + 1; endwhile;
Hier wird eine StringListe definiert, die anschließend im Programm unter dem Namen LI ansprechbar ist. Über eine Programmschleife werden die einzelnen Zeilen der Stringliste abgearbeitet.
GDI-BASIC 2.6
Seite 46/114 01.07.05
$Liste.SetElement
2.0 Neu
Stringlisten-Funktion
Syntax : $Liste.SetElement(Position, Wert) Liste Position Wert
: Stringlisten-Objekt : Integer : String
Rückgabewert : String Beschreibung : Umkehrfunktion zur Stringlisten-Funktion Element. Mit Hilfe dieser Stringlisten-Funktion SetElement kann man eine Zeile in einer Stringliste unter Angabe ihrer Positions-Nummer ersetzen. Die Positionsnummer ist eine Integerzahl mit dem Wertebereich zwischen 0 und Anzahl der Zeilen - 1. Interessant ist diese Funktion bei indizierten Stringlisten mit dem Aufbau "Schlüssel=Wert". Sie ermöglicht das Aktualisieren eines bestehenden Listeneintrages, wenn zuvor mit der Stringlisten-Funktion IndexOfName (s.u.) die Positionsnummer des Schlüssels ermittelt wurde. Es ist nicht möglich neue Zeilen über diese Funktion anzufügen. Hierzu ist die Stringlisten-Funktion Add zu verwenden. Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3"); if ... then $LI.SetElement(1,"BBB=5"); endif; S := $LI.GetText;
S = "AAA=1 BBB=5 CCC=3" Hier wird eine StringListe definiert, die anschließend im Programm unter dem Namen LI ansprechbar ist. Der Inhalt der Stringliste wird durch die nachfolgende Funktion SetText bestimmt und mit der Stringlisten-Funktion SetElement wird ggfs. die Zeile mit der Position 1 neu gesetzt.
GDI-BASIC 2.6
$Liste.Delete
Seite 47/114 01.07.05
2.0
Stringlisten-Funktion
Syntax : $Liste.Delete(Position) Liste Position
: Stringlisten-Objekt : Integer
Rückgabewert :
Beschreibung : Mit Hilfe der Stringlisten-Funktion Delete kann eine Zeile unter Angabe ihrer PositionsNummer aus der Liste gelöscht werden. Die Positions-Nummer ist eine Integerzahl mit dem Wertebereich zwischen 0 und Anzahl der Zeilen - 1. Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3"); $LI.Delete(1);
"AAA=1 CCC=3" Hier wird eine StringListe definiert, die anschließend im Programm unter dem Namen LI ansprechbar ist. Der Inhalt der Stringliste wird durch die nachfolgende Funktion SetText bestimmt und mit der Stringlisten-Funktion Delete wird die Zeile mit der Position 1 gelöscht. Die ursprünglich dreizeilige Stringliste umfasst anschließend noch zwei Zeilen (mit Positions-Nummern 0 und 1)
GDI-BASIC 2.6
$Liste.Insert
Seite 48/114 01.07.05
2.0
Stringlisten-Funktion
Syntax : $Liste.Insert(Position, Zeichenkette) Liste : Stringlisten-Objekt Position : Integer Zeichenkette : String Rückgabewert :
Beschreibung : Mit Hilfe der Stringlisten-Funktion Insert kann eine weitere Zeile nach der Zeile mit der angegebenen Positions-Nummer eingefügt werden. Die Positions-Nummer ist eine Integerzahl mit dem Wertebereich zwischen 0 und Anzahl der Zeilen - 1. Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3"); $LI.Insert(1,"DDD=4");
"AAA=1 DDD=4 BBB=2 CCC=3" Hier wird eine StringListe definiert, die anschließend im Programm unter dem Namen LI ansprechbar ist. Der Inhalt der Stringliste wird durch die nachfolgende Funktion SetText bestimmt und mit der Stringlisten-Funktion Insert wird nach der Zeile mit der Position 1 eine weitere Zeile eingefügt. Die ursprünglich dreizeilige Stringliste umfasst anschließend vier Zeilen.
GDI-BASIC 2.6
$Liste.Move
Seite 49/114 01.07.05
2.0
Stringlisten-Funktion
Syntax : $Liste.Move(Position1, Position2) Liste : Stringlisten-Objekt Position1, Position2 : Integer Rückgabewert :
Beschreibung : Mit Hilfe der Stringlisten-Funktion Move können zwei Zeilen einer Stringliste gegenseitig ausgetauscht werden. Hierzu sind die Positions-Nummern anzugeben. Die PositionsNummer ist eine Integerzahl mit dem Wertebereich zwischen 0 und Anzahl der Zeilen - 1. Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3"); $LI.Insert(1,"DDD=4"); $LI.Move(1,3);
"AAA=1 BBB=2 CCC=3 DDD=4" Erweiterung des vorherigen Beispieles. Nach dem Einfügen der neuen Zeile wird diese mit der letzten Zeile getauscht.
GDI-BASIC 2.6
$Liste.Sorted
Seite 50/114 01.07.05
2.0 Neu
Stringlisten-Funktion
Syntax : $Liste.Sorted(Sortieren) Liste Sortieren
: Stringlisten-Objekt : Boolean
Rückgabewert :
Beschreibung : Mit Hilfe der Stringlisten-Funktion Sorted können die Zeilen einer Stringliste alphanumerisch umsortiert werden. Diese Funktion bietet sich an, wenn Daten beim Aufbau der Stringliste noch unsortiert vorliegen, zur Weiterverarbeitung aber eine Sortierung erforderlich ist. Hinweis: Es gibt keine Umkehrfunktion. Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3"); $LI.Insert(1,"DDD=4"); $LI.Sorted(true);
"AAA=1 BBB=2 CCC=3 DDD=4" Erweiterung des vorherigen Beispieles. Nach dem Einfügen der neuen Zeile wird eine Umsortierung der Liste vorgenommen.
GDI-BASIC 2.6
$Liste.IndexOf
Seite 51/114 01.07.05
Stringlisten-Funktion
2.0
Syntax : $Liste.IndexOf(Zeichenkette) Liste : Stringlisten-Objekt Zeichenkette : String Rückgabewert : Integer Beschreibung : Mit Hilfe der Stringlisten-Funktion IndexOf kann die Zeilennummer (Position) einer Zeile innerhalb der Stringliste bestimmt werden. Die angegebene Zeichenkette muß vollständig mit der Zeile der Stringliste übereinstimmen. Wird die Zeichenkette in der Liste nicht gefunden, so wird der Wert "-1" zurückgegeben. Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3"); P1 := $LI.IndexOf("CCC=3"); P2 := $LI.IndexOf("BBB=5");
P1 = 2 P2 = -1 Ermittlung der Position von zwei Zeichenketten in der Stringliste LI. Die Variable P2 erhält den Wert "-1", da die angegebene Zeichenkette in der Stringliste nicht existiert.
$Liste.IndexOfName
2.0
Stringlisten-Funktion
Syntax : $Liste.IndexOfName(Zeichenkette) Liste : Stringlisten-Objekt Zeichenkette : String Rückgabewert : Integer Beschreibung : Mit Hilfe der Stringlisten-Funktion IndexOfName kann die Zeilennummer (Position) einer Zeile innerhalb der Stringliste bestimmt werden. Diese Funktion ist nur anwendbar, wenn die Zeilen in der Form "Schlüssel=Wert" vorliegen. Es wird geprüft, ob die angegebene Zeichenkette mit den links des Gleichheitszeichens stehenden Zeichen (Schlüssel) überein-
GDI-BASIC 2.6
Seite 52/114 01.07.05
stimmen. Wird die Zeichenkette in der Liste nicht gefunden, so wird der Wert "-1" zurückgegeben. Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3"); P1 := $LI.IndexOfName("CCC"); P2 := $LI.IndexOfName("CBB");
P1 = 2 P2 = -1 Ermittlung der Position von zwei Zeichenketten in der Stringliste LI. Die Variable P2 erhält den Wert "-1", da die angegebene Zeichenkette in der Stringliste nicht existiert.
$LI.CreateStringList; %BPos.CreateTable("Belegpos"); %BPos.Open; Heute := Mask("D10",System("Date")); KW := WeekOfdate(Heute); show("" + Heute + " " + KW); Beleg := ""; while %BPos.EOF = false do if (BPos.Belegtyp = "V" and WeekOfDate(BPos.Datumpr) = KW) then Beleg := BPos.Belegtyp + BPos.Belegart + BPos.Belegnr; if $LI.IndexOfName(Beleg) = (0 - 1) then $LI.Add(Beleg + "="); Das "=" ist für IndexOfName notwendig endif; endif; %BPos.Next; endwhile; show($LI.GetText); $LI.FreeStringList; %BPos.Close; %BPos.FreeTable;
Ausgabe aller Verkaufsbelege der aktuellen Kalenderwoche über eine Stringliste, wobei in der Datenbank die Belegpositionen durchlaufen werden. Ein Anwendungsbeispiel könnte z.B. ein Export von Belegpositionen darstellen, wobei man sich die exportierten Belege "merken" möchte, um in einem weiteren Schritt im Belegkopf ein Exportkennzeichen setzen zu können. Durch die Anwendung der Funktion IndexOfName wird hier gewährleistet, daß in der erzeugten Liste kein Schlüssel mehrfach vorkommt (sonst keine eindeutige Indizierung).
GDI-BASIC 2.6
$Liste.Values
Seite 53/114 01.07.05
2.0
Stringlisten-Funktion
Syntax : $Liste.Values(Zeichenkette) Liste : Stringlisten-Objekt Zeichenkette : String Rückgabewert : String Beschreibung : Die Stringlisten-Funktion Values kann nur angewendet werden, wenn die Zeilen der Liste in der Form "Schlüssel=Wert" vorliegen. Existiert in der Liste eine Zeile, bei der die angegebene Zeichenkette mit den links des Gleichheitszeichens stehenden Zeichen (Schlüssel) übereinstimmt, so wird der rechts des Gleichheitszeichens stehende Teilstring (Wert) zurückgegeben. Wird die Zeichenkette in der Liste nicht gefunden, so wird ein Leerstring (der Wert "") zurückgegeben. Anmerkung: Für die korrekte Funktion ist darauf zu achten, daß kein Schlüssel mehrfach vorkommt (sonst keine eindeutige Indizierung). Beispiel : $LI.CreateStringList; $LI.SetText("AAA=1"+CHR(13,10)+"BBB=2"+CHR(13,10)+"CCC=3"); Wert := $LI.Values("BBB"); Wert = "2";
Ermittlung des Wertes der Stringlistenzeile, die mit "BBB=" beginnt (links des Kommas steht "BBB").
Im folgenden Beispiel habe die Stringliste LI folgenden Aufbau und Inhalt: Kundennr=Name1,Name2,Strasse,Ort ..... 10000=Computerstudio 3000,,In den Neuwiesen 35,Versmold 12000=Katharina Glaser,Systemhaus,Rodalber Str. 12 c,Waldfischbach 14000=Kolbenschmidt AG,Systemhaus,Heinestr. 1-5,Neckarsulm 15000=Steiner GmbH,Sägewerk,Bachgasse 4,Edenkoben ..... Wert := $LI.Values("14000"); Wert = "Kolbenschmidt AG,Systemhaus,Heinestr. 1-5,Neckarsulm";
Ermittlung des Wertes der Stringlistenzeile, die mit "14000=" beginnt (links des Kommas steht "14000").
GDI-BASIC 2.6
Seite 54/114 01.07.05
Funktionen für Datenzugriffe (Tabellen-Funktionen): Für den Zugriff auf die in der Datenbank liegenden Daten benötigt man sog. Tabellenfunktionen. Im Basic-Programm werden hierfür im ersten Schritt Tabellenobjekte "creiert", wobei man zwei grundsätzliche Arten unterscheiden kann: • Tabellenobjekte auf Basis von Tables (%Tabelle.CreateTable, Zugriff über BDE) • Tabellenobjekte auf Basis von SQLs (%Tabelle.CreateSQL) In der GDILine 2.x sollte man in erster Linie Letztere verwenden.
%Tabelle.CreateTable
Tabellen-Funktion
Syntax : %Tabelle.CreateTable(Datenpfad,Index,Exclusiv,Filter) Tabelle Datenpfad, Index, Filter Exclusiv
: Tabellenobjekt : String : true oder false
Rückgabewert :
Beschreibung : Die Tabellen-Funktion CreateTable erzeugt das Tabellenobjekt mit Namen Tabelle. Auf dieses Tabellenobjekt kann anschließend zugegriffen werden. Unter Datenpfad muß der Dateiname einschl. Pfadangabe (absolute Pfadangabe, keine relative Pfadangabe) der physikalisch existierenden Tabelle angegeben werden. Die übrigen Parameter sind optional anzugeben. So kann man z.B. bestimmen, ob man auf die nach einem Index vorsortierte Tabelle zugreifen will oder ob man sich gemäß eines Filters nur für bestimmte Datensätze aus der Tabelle interessiert. Exclusiv bedeutet, daß auf die Tabelle kein anderer Bediener zugreifen darf. Anmerkung: Die Pfadangabe entfällt, wenn sich die Tabelle im aktuellen Mandanten befindet. Es kann sowohl mit Paradox- als auch mit dBase-Tabellen (Dateiendung „dbf“ muß angegeben werden) gearbeitet werden, allerdings ist die Erzeugung dieser Tabellen per GDI-Basic nicht möglich, da die erforderliche Satzstruktur nicht übergeben werden kann. Es können nur Textdateien unmittelbar erzeugt werden (siehe oben unter SaveToFile). Die Funktion CreateTable beinhaltet die Funktion Tabelle.Open (s.u). Beispiel : %KD.CreateTable("Kunden","KU_Kundnr",false,"Kundennr < 20000");
Hier wird die Kundentabelle geöffnet und ist anschließend im Programm unter dem Namen KD ansprechbar. Die Tabelle soll nach dem Index KU_Kundnr sortiert sein, wobei gemäß Filterdefinition nur Kundennummern kleiner als 20000 von Bedeutung sind. Die Tabelle ist nicht exclusiv geöffnet. %Test.CreateTable("C:\Gdiline\dBase\Test.dbf");
Erzeugen des Tabellenobjektes Test auf Basis der dBase-Tabelle „Test.dbf“.
GDI-BASIC 2.6
Seite 55/114 01.07.05
%KD.CreateTable("Kunden","",true);
Hier wird die Kundentabelle geöffnet und ist anschließend im Programm unter dem Namen KD ansprechbar. Die Tabelle soll dabei exclusiv geöffnet sein.
%Tabelle.FreeTable
Tabellen-Funktion
Syntax : %Tabelle.FreeTable Tabelle
: Tabellenobjekt
Rückgabewert :
Beschreibung : Die Tabellen-Funktion FreeTable entfernt das Tabellenobjekt mit Namen Tabelle. Auf dieses Tabellenobjekt kann anschließend nicht mehr zugegriffen werden. Zu jedem Erzeugen eines Tabellenobjektes (%Tabelle.CreateTable, s.o.) gehört ein Entfernen des Tabellenobjektes nach Abarbeitung des Programmes. Das Entfernen eines Tabellenobjektes hat nichts mit dem Löschen oder Leeren einer Tabelle oder dem Löschen von Datensätzen zu tun (Funktionen DeleteTable, EmptyTable, Delete). Anmerkung: I.d.R. wird ein Tabellenobjekt automatisch am Ende eines GDI-BASICProgrammes entfernt, beim Einsatz von GDI-BASIC in den Mengeneinheiten muß allerdings ein FreeTable eingesetzt werden, sofern man dort ein Tabellenobjekt erzeugt hat. Die Funktion FreeTable ist ab Business-Line-Version 1.6 verfügbar. Beispiel : %KD.CreateTable("Kunden","KU_Kundnr",false,"Kundennr < 20000"); ... ... %KD.FreeTable;
Hier wird die Kundentabelle geöffnet und ist anschließend im Programm unter dem Namen KD ansprechbar. Die Tabelle soll nach dem Index KU_Kundnr sortiert sein, wobei gemäß Filterdefinition nur Kundennummern kleiner als 20000 von Bedeutung sind. Die Tabelle ist nicht exclusiv geöffnet. Nach dem Abarbeiten von weiteren Programmschritten wird das Tabellenobjekt wieder entfernt.
GDI-BASIC 2.6
Seite 56/114 01.07.05
Tabellenobjekte können auch auf Basis von SQL-Statements erzeugt werden. Prinzipiell sind hierbei immer vier Schritte notwendig: 1. 2. 3. 4.
Erzeugen des Tabellenobjektes Defintion der SQL Absetzen/Ausführen der SQL Entfernen des Tabellenobjektes
Für diese Schritte stehen mehrere Funktionen zu Verfügung. Nachfolgende Tabelle gibt einen kurzen Überblick, danach werden die Funktionen detailliert beschrieben: S
Funktion
1 2 2
%Tabelle.CreateSQL @GDI_SQL_Tabelle.SQL %Tabelle.SetSQL
Version 1.x 2.x X X X X X
3
%Tabelle.Open
X
X
3
%Tabelle.ExecSQL
1.8
X
3
%Tabelle.ExecuteSQL
1.8
X
4
%Tabelle.FreeSQL
X
X
Einsatzgebiet/Beschreibung Erzeugen eines Tabellenobjektes auf Basis einer SQL Definition der SQL-Anweisung Definition der SQL-Anweisung, Einsatz von Parametern/Variablen in Verbindung mit %Tabelle.ParamByName möglich, so daß die SQL auch in Programmschleifen eingesetzt werden kann Ausführen der SQL, Bei der SQL-Abfrage ist nur ein SQL-Befehl möglich, es darf sich nicht um eine Abfolge / Kombination von mehreren SQL-Statements handeln. Es können nur SQL-Statements eingesetzt werden, die eine Ergebnistabelle liefern (selectAnweisung, z.B. keine update-Anweisung möglich). Ausführen der SQL, wie bei %Tabelle.Open ist bei der SQLAbfrage ist nur ein SQL-Befehl möglich, es darf sich nicht um eine Abfolge / Kombination von mehreren SQL-Statements handeln, jedoch können nur SQL-Statements eingesetzt werden, die keine Ergebnistabelle liefern (z.B. update- oder insert-Anweisung, keine select-Anweisung möglich). Ausführen der SQL, Dieser Aufruf bietet dieselben Möglichkeiten zum Ausführen einer SQL wie im Menüpunkt Zusatz/SQL-System. Bei der SQL-Abfrage kann es sich um mehrstufige SQLAnweisungen, d.h. um eine Abfolge / Kombination von mehreren SQL-Statements handeln. Die SQL-Statements müssen nicht zwingend eine Ergebnistabelle liefern (update-Anweisung ist möglich). Es besteht die Möglichkeit, die Ergebnistabelle auf Platte abzulegen. Entfernen eines Tabellenobjektes auf Basis einer SQL
%Tabelle.FreeSQL
Tabellen-Funktion
Syntax : %Tabelle.FreeSQL Tabelle
: Tabellenobjekt auf Basis einer SQL
Rückgabewert : Beschreibung : Die Tabellen-Funktion FreeSQL entfernt das Tabellenobjekt mit Namen Tabelle. Prinzipiell gleiche Funktion wie FreeTable, jedoch für Tabellenobjekte, die per CreateSQL (siehe nächste Seite) erzeugt wurden. Anmerkung: Verfügbar ab Version 1.7.2.10
GDI-BASIC 2.6
Seite 57/114 01.07.05
%Tabelle.CreateSQL
2.0*
Tabellen-Funktion
Syntax %Tabelle.CreateSQL(Datenbankname, unidirektional) Tabelle Datenbankname Unidirektional
: Tabellenobjekt auf Basis einer SQL : String : true oder false, Defaultwert ist false
Rückgabewert : Beschreibung : Die Tabellen-Funktion CreateSQL erzeugt ein Tabellenobjekt mit Namen Tabelle, dessen Inhalt durch eine nachfolgende SQL-Abfrage definiert wird (@GDI_SQL_Tabelle.SQL bei Version 1.x oder ab Version 2.0 mit %Tabelle.SetSQL). Auf dieses Tabellenobjekt kann anschließend zugegriffen werden. Der Datenbankname bestimmt, "wo" die SQL-Abfrage ausgeführt werden soll. Folgende Fälle sind zu unterscheiden: Zugriff auf aktuellen Mandanten externe IB-Datenbank dBase oder Paradox-Tabellen
Datenbankname "" oder "Gdiline" über Funktion §CreateIBDatabase erzeugter Datenbankname (s.dort) absoluter Datenpfad oder UNC-Pfad
Der ab Version 2.0.4.0 verfügbare Parameter Unidirektional bewirkt einen sog. unidirektionalen Cursor in der Ergebnisdatenmenge. Man kann dann die Datenmenge nur in einer Richtung durchlaufen, sich also nicht vorwärts und rückwärts durch die Datenmenge bewegen. Dadurch wird wesentlich weniger Speicher benötigt und die Ausführungsgeschwindigkeit wird verbessert. Wenn man keinen bidirektionalen Zugriff auf die Datensätze einer Ergebnismenge benötigt - was häufig gegeben ist - sollte man Unidirektional auf True setzen. Anmerkung: Im Gegensatz zur Funktion CreateTable beinhaltet die Funktion CreateSQL kein Öffnen der Tabelle. Das Öffnen entspricht dem Ausführen der SQL und muß in einem separaten Schritt über eine der Funktionen %Tabelle.Open, %Tabelle.ExecSQL oder %Tabelle.ExecuteSQL durchgeführt werden.
Beispiel : %Kundentest.CreateSQL("");
Hier wird eine SQL-Abfrage im aktuellen Mandanten vorbereitet. Die Abfrage selbst ist noch nicht definiert. Alle weiteren Zugriffe auf die Ergebnistabelle dieser SQL-Abfrage erfolgen im GDI-Basic-Programm unter dem Namen Kundentest. %Kundentest.CreateSQL("C:\Gdiline\demo\");
Hier wird eine SQL-Abfrage auf eine externe Paradox oder dBase-Tabelle im Verzeichnis "Demo" vorbereitet. Alle weiteren Zugriffe auf die Ergebnistabelle dieser SQL-Abfrage erfolgen wie im obigen Beispiel unter dem Namen Kundentest. DBname := §DB.CreateIBDatabase(Server + ":" + DBPfad); %KD.CreateSQL(DBName, true);
Hier wird eine SQL-Abfrage auf eine externe Interbase-Datenbank vorbereitet.
GDI-BASIC 2.6
@GDI_SQL_Tabelle.SQL
Seite 58/114 01.07.05
1.x
Tabellen-Funktion
Syntax : @GDI_SQL_Tabelle.SQL := Abfrage Tabelle Abfrage
: Tabellenobjekt auf Basis einer SQL : String
Rückgabewert : Beschreibung : Wie oben angeführt, erzeugt die Tabellen-Funktion CreateSQL ein Tabellenobjekt mit Namen Tabelle, dessen Inhalt durch eine nachfolgende SQL-Abfrage definiert wird. Dies erfolgt in Version 1.x über @GDI_SQL_Tabelle.SQL. Das Ausführen der SQL erfolgt über eine weitere Anweisung. Es ist zu beachten, daß die SQL-Abfrage aus Teilstrings zusammengesetzt werden muß, falls man sie in mehreren Zeilen erfaßt. Beispiel : @GDI_SQL_Kundentest.SQL := "select kundennr, Name1, PLZ, Ort " + "from Kunden";
Hier wird eine SQL-Abfrage auf die Kunden-Tabelle definiert. Anmerkung: Die Aufteilung in Teilstrings entfällt, falls die SQL in einer einzigen Zeile eingegeben wird. @GDI_SQL_Kundentest.SQL := "select kundennr, Name1, PLZ, Ort " + "from Kunden where " + "Adressgrp = " + CHR(34) + "100" + CHR(34) + " order by kundennr";
Definition der SQL-Abfrage select kundennr, Name1, PLZ, Ort from Kunden where Adressgrp = "100" order by kundennr auf die Kunden-Tabelle. Das besondere an diesem Beispiel ist, daß innerhalb der SQL-Abfrage Hochkommatas in der where-Bedingung benötigt werden (Zugriff auf das alphanumerische Datenfeld Adressgrp). Da in GDI-Basic die Hochkommatas einen String abgrenzen, können diese nicht wie gewohnt verwendet werden, sondern müssen über die Funktion CHR(34) aus dem AsciiZeichensatz erzeugt werden.
GDI-BASIC 2.6
%Tabelle.SetSQL
Seite 59/114 01.07.05
Tabellen-Funktion
2.0
Syntax : %Tabelle.SetSQL(Abfrage, parametrisiert) oder %Tabelle.SetSQL(Abfrage, parametrisiert) %Tabelle.ParamByName(Parameter, Wert, Zieltyp); Tabelle Abfrage, Parameter, Zieltyp Wert Parametrisiert
: Tabellenobjekt auf Basis einer SQL : String : versch. Datentypen möglich : true oder false, Defaultwert ist true
Rückgabewert : Beschreibung : Wie oben angeführt, erzeugt die Tabellen-Funktion CreateSQL ein Tabellenobjekt mit Namen Tabelle, dessen Inhalt durch eine nachfolgende SQL-Abfrage definiert wird. Dies erfolgt ab Version 2.0 über %Tabelle.SetSQL. Der Vorteil dieser Methode liegt darin, daß man bei Bedarf mit Parametern/Variablen arbeiten kann. Dadurch kann die SQL in Programmschleifen eingesetzt werden. (Voraussetzung: Die Abfrage enthält nur eine SQLAnweisung). Wird keine paramatrisierte SQL eingesetzt, so ist "parametrisiert" auf False zu setzen. Über die optionale Angabe des Zieltyps kann die automatische Typerkennung übersteuert werden. Als Zieltyp wird zur Zeit "BLOB, MEMO, INTEGER, FLOAT, DATE" unterstützt. Bei der Option "DATE" wird aus einem "0"-Datum (1899... etc) ein leeres Datum erzeugt. Bei den Optionen "INTEGER" und "FLOAT" wird bei leerer Quelle der Zielwert auf 0 gesetzt. Dies ermöglicht auch Texte in BLOB- oder MEMO-Felder zu speichern. Beispiel : %Kundentest.SetSQL("select kundennr, Name1 from Kunden", false);
Hier wird eine SQL-Abfrage auf die Kunden-Tabelle definiert. Die Ergebnistabelle dieser SQL-Abfrage kann unter dem Namen Kundentest angesprochen werden. %KUND.SetSQL("select kundennr, Name1, PLZ, Ort from Kunden" + " where Kundennr = :Kundennr"); %KUND.ParamByName("Kundennr", 15000);
Hier wird die SQL-Abfrage select kundennr, Name1, PLZ, Ort from Kunden where Kundennr = 15000 definiert. Dabei wird die Zuweisung der Variablen "Kundennr" in einem separaten Schritt durchgeführt. Die Nummer könnte z.B. per Input-Abfrage vom Bediener eingegeben sein. %KD.CreateTable("Kunden"); %UPDATE.SetSQL("update Kunden " + " set KZExport = " + CHR(34) + "1" + CHR(34) + " where Kundennr = :Kundennr"); %KD.First; while %KD.EOF = false do ... %UPDATE.ParamByName("Kundennr", KD.Kundennr);
GDI-BASIC 2.6
Seite 60/114 01.07.05
%UPDATE.ExecSQL; ... %KD.Next; endwhile;
Beispiel f端r den Einsatz einer parametrisierten SQL in einer Programmschleife
%ArtCount.CreateSQL (""); %ArtCount.SetSQL ("Select Count(*) Anzahl from Artikel", false); %ArtCount.Open; @Anzeige.max := ArtCount.Anzahl; %UpdatePos.CreateSQL (""); %UpdatePos.SetSQL ("Update Belegpos Set Text = :Text " + "where Artikelnr = :Artikelnr"); %Artikel.CreateSQL (""); %Artikel.SetSQL ("Select Artikelnr, ArtText from Artikel", false); %Artikel.Open; i := 1; while %Artikel.EOF = False do @Anzeige.Position := i; i := i +1; %UpdatePos.ParambyName ("Artikelnr",Artikel.Artikelnr); %UpdatePos.ParambyName ("Text",Artikel.ArtText,"MEMO"); %UpdatePos.ExecSQL; %Artikel.Next; endwhile; ... ... %Artikel.FreeSQL; %UpdatePos.FreeSQL; %ArtCount.FreeSQL;
Beispiel f端r den Einsatz einer parametrisierten SQL in einer Programmschleife. Der Artikeltext (Quellfeld) ist vom Datentyp "CHAR" und soll in bestehende Belegpositionen 端bertragen werden. Der Belegpositionstext ist vom Datentyp "MEMO". Ohne die Angabe des Zieltyps w端rde das Programm mit einem BDE-Fehler abbrechen ("Blob and array data types are not supported for move operation")
GDI-BASIC 2.6
%Tabelle.ExecuteSQL
Seite 61/114 01.07.05
2.0*
Tabellen-Funktion
Syntax : %Tabelle.ExecuteSQL(Dateiname,Animation,Überschreiben) Tabelle Dateiname Animation, Überschreiben
: Tabellenobjekt auf Basis einer SQL : String : true oder false
Rückgabewert : Beschreibung : Wie oben angeführt, erzeugt die Tabellen-Funktion CreateSQL ein Tabellenobjekt mit Namen Tabelle, dessen Inhalt durch eine nachfolgende SQL-Abfrage definiert wird (@GDI_SQL_Tabelle.SQL oder %Tabelle.SetSQL). Das Starten/Absetzen der SQL erfolgt in einem weiteren Schritt. Die Funktion %Tabelle.ExecuteSQL bietet dieselben Möglichkeiten zum Ausführen einer SQL wie im Menüpunkt Zusatz/SQL-System. Bei der SQL-Abfrage kann es sich um mehrstufige SQL-Anweisungen, d.h. um eine Abfolge/Kombination von mehreren SQLStatements handeln. Die SQL-Statements müssen nicht zwingend eine Ergebnistabelle liefern (update-Anweisung ist möglich). Gibt man einen Dateinamen (in 2.0 immer einschl. Pfad, in 1.8.x immer ohne Pfad, Typ: .db, .dbf, .csv) an, so wird die Ergebnistabelle auf Platte abgelegt, über den zweiten Parameter kann die Animation/Fortschrittsanzeige bei Bedarf deaktiviert werden, über den dritten kann festgelegt werden, ob eine Systemtabelle überschrieben werden darf. Hinweise: Diese Funktion ist zum Absetzen von SQLs universell einsetzbar, sollte aber nur dort eingesetzt werden, wo die "schlankeren" Funktionen %Tabelle.Open bzw. %Tabelle.ExecSQL nicht ausreichen. Nicht einsetzbar bei Verwendung der Funktion CreateIBDataBase zum Zugriff auf die Datenbank.
Beispiel : %Kundentest.CreateSQL(""); @GDI_SQL_Kundentest.SQL := "select kundennr, Name1, PLZ, Ort " + "from Kunden"; %Kundentest.ExecuteSQL;
Einfachster Aufruf der Funktion ohne Parameter. Hier wird eine SQL-Abfrage im aktuellen Mandanten auf die Kunden-Tabelle durchgeführt. Die Ergebnistabelle dieser SQLAbfrage kann im GDI-Basic-Programm unter dem Namen Kundentest angesprochen werden. Anmerkung: Die Aufteilung in Teilstrings entfällt, falls die SQL in einer einzigen Zeile eingegeben wird. %Kundentest.CreateSQL(""); @GDI_SQL_Kundentest.SQL := "select * from Kunden"; %Kundentest.ExecuteSQL("",false);
Selektion aller Kunden im aktuellen Mandanten, Animation deaktiviert. %Kundentest.CreateSQL(""); S :="select kundennr, Name1, PLZ, Ort from Kunden"; %Kundentest.SetSQL(S, false); %Kundentest.ExecuteSQL("E:\Temp\Test.dbf",true);
Die Ergebnistabelle der SQL-Abfrage select kundennr, Name1, PLZ, Ort from Kunden kann unter dem Namen Kundentest angesprochen werden, gleichzeitig wird das Ergebnis auf Platte abgelegt. Während der Abarbeitung der SQL wird die Animation angezeigt.
GDI-BASIC 2.6
Seite 62/114 01.07.05
%Tabelle.ExecSQL
Tabellen-Funktion
Syntax : %Tabelle.ExecSQL Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert : Beschreibung : Die Tabellen-Funktion ExecSQL dient in Verbindung mit der Funktion CreateSQL (s.o.) zum Ausführen von SQLs. Mit ExecSQL können nur SQL-Statements abgesetzt werden, die keine Ergebnistabelle liefern (z.B. update, insert). Ab Version 1.8.0.22 verfügbar. Beispiel : %UPDATE.CreateSQL(""); @GDI_SQL_UPDATE.SQL := "update Artikel " + " set KZLager = " + CHR(34) + "1" + CHR(34); %UPDATE.ExecSQL; %UPDATE.FreeSQL;
Ausführen einer SQL im Mandantenpfad. Bei allen Artikeln wird das Kennzeichen "Lagerartikel" gesetzt.
%Tabelle.Open
Tabellen-Funktion
Syntax : %Tabelle.Open Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert : Beschreibung : Über die Tabellen-Funktion Open wird eine Tabelle zum Zugriff geöffnet. Die Funktion CreateTable (s.o.) beinhaltet diese Funktion. Die Funktion Open dient darüberhinaus in Verbindung mit der Funktion CreateSQL (s.o.) zum Ausführen von SQLs. Beispiel : %KD.CreateTable("Kunden"); %KD.Open; ... %KD.Close; ... %KD.Open;
GDI-BASIC 2.6
Seite 63/114 01.07.05
Einsatz der Open-Funktion bei einem Tabellenobjekt. Unmittelbar nach CreateTable könnte auf die Funktion Open verzichtet werden. Wurde aber die Tabelle zwischenzeitlich geschlossen, so ist sie immer noch unter Ihrem Aliasnamen KD ansprechbar und es genügt die Funktion Open, um auf Ihre Datensätze zugreifen zu können (CreateTable ist nicht mehr nötig).
@GDI_SQL_Kundentest.SQL := "select kundennr, Name1, PLZ, Ort " + "from Kunden"; %Kundentest.Open;
Einsatz der Open-Funktion bei einem Tabellenobjekt auf Basis einer SQL. Es wird eine SQL-Abfrage auf die Kunden-Tabelle definiert, die eine Ergebnistabelle liefert.Über die Open-Funktion wird die SQL gestartet. Anmerkung: Die Aufteilung in Teilstrings entfällt, falls die SQL in einer einzigen Zeile eingegeben wird.
%Tabelle.Close
Tabellen-Funktion
Syntax : %Tabelle.Close Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert :
Beschreibung : Über die Tabellen-Funktion Close wird die Tabelle geschlossen. Ein Zugriff auf die Datensätze der Tabelle ist nicht mehr möglich. Beispiel : %KD.CreateTable("Kunden"); %KD.Close;
Die nun geschlossene Tabelle ist im Basic-Programm immer noch unter Ihrem Aliasnamen KD ansprechbar und es genügt die Funktion Open, um auf Ihre Datensätze zugreifen zu können (CreateTable ist nicht mehr nötig).
GDI-BASIC 2.6
Seite 64/114 01.07.05
%Tabelle.BOF
Tabellen-Funktion
Syntax : %Tabelle.BOF Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert : Boolean Beschreibung : Über die Tabellen-Funktion BOF (Beginn Of File) kann abgefragt werden, ob sich der Cursor auf dem ersten Datensatz der Tabelle befindet. Die Funktion liefert true oder false zurück. Ein evtl. für die Tabelle angegebener Index und Range wird berücksichtigt. Beispiel : %KD.CreateTable("Kunden", "KU_Kundnr"); %KD.Last; while %KD.BOF = false do .... %KD.Prior; endwhile;
%Tabelle.EOF
Tabellen-Funktion
Syntax : %Tabelle.EOF Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert : Boolean Beschreibung : Über die Tabellen-Funktion EOF (End Of File) kann abgefragt werden, ob sich der Cursor auf dem letzten Datensatz der Tabelle befindet. Die Funktion liefert true oder false zurück. Ein evtl. für die Tabelle angegebener Index und Range wird berücksichtigt. Beispiel : %KD.CreateTable("Kunden", "KU_Kundnr"); %KD.First; while %KD.EOF = false do .... %KD.Next; endwhile;
GDI-BASIC 2.6
Seite 65/114 01.07.05
%Tabelle.First
Tabellen-Funktion
Syntax : %Tabelle.First Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert :
Beschreibung : Über die Tabellen-Funktion First wird der Cursor auf den ersten Datensatz der Tabelle gestellt. Ein evtl. für die Tabelle angegebener Index und Range wird berücksichtigt. Beispiel : %KD.CreateTable("Kunden", "KU_Kundnr"); %KD.First;
%Tabelle.Last
Tabellen-Funktion
Syntax : %Tabelle.Last Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert :
Beschreibung : Über die Tabellen-Funktion Last wird der Cursor auf den letzten Datensatz der Tabelle gestellt. Ein evtl. für die Tabelle angegebener Index und Range wird berücksichtigt. Beispiel : %KD.CreateTable("Kunden", "KU_Kundnr"); %KD.Last;
GDI-BASIC 2.6
Seite 66/114 01.07.05
%Tabelle.Next
Tabellen-Funktion
Syntax : %Tabelle.Next Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert : Beschreibung : Über die Tabellen-Funktion Next wird der Cursor ausgehend von der aktuellen Cursorposition auf den nächsten Datensatz der Tabelle gestellt. Ein evtl. für die Tabelle angegebener Index und Range wird berücksichtigt. Beispiel : %KD.CreateTable("Kunden", "KU_Kundnr"); %KD.First; while %KD.EOF = false do .... .... %KD.Next; endwhile;
%Tabelle.Prior
Tabellen-Funktion
Syntax : %Tabelle.Prior Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert : Beschreibung : Über die Tabellen-Funktion Prior wird der Cursor ausgehend von der aktuellen Cursorposition auf den vorherstehenden Datensatz der Tabelle gestellt. Ein evtl. für die Tabelle angegebener Index und Range wird berücksichtigt. Beispiel : %KD.CreateTable("Kunden", "KU_Kundnr"); %KD.Last; while %KD.BOF = false do .... .... %KD.Prior; endwhile;
GDI-BASIC 2.6
Seite 67/114 01.07.05
%Tabelle.Edit
Tabellen-Funktion
Syntax : %Tabelle.Edit Tabelle
: Tabellenobjekt
Rückgabewert : Beschreibung : Über die Tabellen-Funktion Edit wird ein Ändern von Datensätzen ermöglicht. Der aktuell im Zugriff befindliche Datensatz der Tabelle wird in den sog. Editmodus gesetzt, d.h. Änderungen am Datensatz können vorgenommen werden. Anmerkung: Änderungen am Datensatz werden erst durch nachfolgenden Einsatz der Funktion Post (s.u.) in die Tabelle übernommen. Beispiel : %KD.CreateTable("Kunden"); if %KD.FindKey("KU_Kundnr", 10000) then %KD.Edit; .... endif;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Über die Funktion FindKey wird der gewünschte Datensatz mit der Kundennummer 10000 gesucht und anschließend über Edit in den Änderungsmodus gesetzt.
%Tabelle.CheckEdit
Tabellen-Funktion
Syntax : %Tabelle.CheckEdit Tabelle
: Tabellenobjekt
Rückgabewert : boolean Beschreibung : Die Tabellen-Funktion CheckEdit stellt eine Erweiterung der o.g. Tabellen-Funktion Edit dar und liefert zusätzlich true oder false zurück, je nachdem ob der Datensatz in den Edit-Modus gesetzt werden konnte oder nicht. Der Einsatz ist für Fälle gedacht, bei denen Konflikte durch den Zugriff anderer Bediener wahrscheinlich sind. Ab Version 1.7.5.12 verfügbar. Beispiel : %KD.CreateTable("Kunden"); if %KD.FindKey("KU_Kundnr", 10000) then if %KD.CheckEdit then
GDI-BASIC 2.6
Seite 68/114 01.07.05
.... else .... endif; endif;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Über die Funktion FindKey wird der gewünschte Datensatz mit der Kundennummer 10000 gesucht und anschließend über CheckEdit in den Änderungsmodus gesetzt.
%Tabelle.Append
Tabellen-Funktion
Syntax : %Tabelle.Append Tabelle
: Tabellenobjekt
Rückgabewert : Beschreibung : Über die Tabellen-Funktion Append wird ein Anfügen von Datensätzen ermöglicht. Es wird ein neuer Datensatz an die Tabelle angefügt und in den sog. Editmodus gesetzt. Append wird meist bei der Auslagerung von Datensätzen in Ascii-/ TXT-Dateien benötigt, da hier nur ein Anfügen, nicht aber ein Ändern bestehender Datensätze möglich ist (es fehlt eine Indizierung). Anmerkung: Änderungen am Datensatz werden erst durch nachfolgenden Einsatz der Funktion Post (s.u.) in die Tabelle übernommen. Beispiel : %KD.CreateTable("Kunden"); if %KD.FindKey("KU_Kundnr", 25000) then %KD.Edit; .... else %KD.Append; KD.Kundennr := 25000; .... endif;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Über die Funktion FindKey wird der gewünschte Datensatz mit der Kundennummer 25000 gesucht und anschließend über Edit in den Änderungsmodus gesetzt. Falls er nicht vorhanden ist, wird ein neuer Datensatz angefügt. In dieser Konstellation entspricht dies der Funktion FindEdit (s.u.).
GDI-BASIC 2.6
Seite 69/114 01.07.05
%Tabelle.Post
Tabellen-Funktion
Syntax : %Tabelle.Post Tabelle
: Tabellenobjekt
Rückgabewert : Beschreibung : Über die Tabellen-Funktion Post wird ein Speichern von Datensätzen ermöglicht. Der aktuell im Zugriff befindliche Datensatz der Tabelle wird dabei gespeichert. Beispiel : %KD.CreateTable("Kunden"); if %KD.FindKey("KU_Kundnr", 10000) then %KD.Edit; .... %KD.Post; endif;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Über die Funktion FindKey wird der gewünschte Datensatz mit der Kundennummer 10000 gesucht und anschließend über Edit in den Änderungsmodus gesetzt. Nach den in weiteren Schritten vorgenommenen Änderungen am Datensatz wird dieser über die Funktion Post gespeichert.
GDI-BASIC 2.6
Seite 70/114 01.07.05
%Tabelle.Cancel
Tabellen-Funktion
Syntax : %Tabelle.Cancel Tabelle
: Tabellenobjekt
Rückgabewert :
Beschreibung : Über die Tabellen-Funktion Cancel können Veränderungen an einem Datensatz rückgängig gemacht werden, solange noch kein Post (s.o.) erfolgt ist (der Datensatz befindet sich noch im Editmodus). Beispiel : %KD.CreateTable("Kunden"); if %KD.FindKey("KU_Kundnr", 10000) then %KD.Edit; .... if .... then %KD.Post; else %KD.Cancel; endif; endif;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Über die Funktion FindKey wird der gewünschte Datensatz mit der Kundennummer 10000 gesucht und anschließend über Edit in den Änderungsmodus gesetzt. Die in anschließend vorgenommenen Änderungen am Datensatz werden in Abhängigkeit von weiteren Kriterien über die Funktion Post gespeichert oder die Änderungen mit Cancel verworfen.
GDI-BASIC 2.6
Seite 71/114 01.07.05
%Tabelle.Delete
Tabellen-Funktion
Syntax : %Tabelle.Delete Tabelle
: Tabellenobjekt
Rückgabewert :
Beschreibung : Über die Tabellen-Funktion Delete wird ein Löschen von Datensätzen ermöglicht. Beispiel : %KD.CreateTable("Kunden"); if %KD.FindKey("KU_Kundnr", 12345) then %KD.Delete; endif;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Über die Funktion FindKey wird der gewünschte Datensatz mit der Kundennummer 12345 gesucht und anschließend über Delete gelöscht. ! Vorsicht ! Es gibt hier keine Undo-Funktion.
%Tabelle.DeleteTable
Tabellen-Funktion
Syntax : %Tabelle.DeleteTable Tabelle
: Tabellenobjekt
Rückgabewert :
Beschreibung : Die Tabellen-Funktion DeleteTable bewirkt ein Löschen der Tabelle Tabelle. Es werden die entsprechenden Dateien auf der Festplatte gelöscht. Bei TXT-Dateien wird die dazugehörige SCH-Datei ebenfalls gelöscht. Die Tabelle muß geschlossen oder exclusive geöffnet sein. ! Vorsicht ! Es gibt hier keine Undo-Funktion. Beispiel : %Test.CreateTable("C:\Gdiline\dBase\Test.dbf"); .... %Test.Close; %Test.DeleteTable;
GDI-BASIC 2.6
Seite 72/114 01.07.05
Zunächst wird das Tabellenobjekt Test auf Basis der dBase-Tabelle „Test.dbf“ erzeugt. Anschließend wird es von der Platte gelöscht. Anmerkung: Die Funktion Close ist notwendig, da die Tabelle nicht gelöscht werden kann, wenn das Tabellenobjekt geöffnet ist.
%Tabelle.EmptyTable
Tabellen-Funktion
Syntax : %Tabelle.EmptyTable Tabelle
: Tabellenobjekt
Rückgabewert :
Beschreibung : Die Tabellen-Funktion EmptyTable bewirkt ein Löschen des Inhaltes der Tabelle Tabelle. Die Struktur der Tabelle bleibt im Gegensatz zu DeleteTable erhalten, d.h. es können z.B. Datensätze wieder eingefügt werden. ! Vorsicht ! Es gibt hier keine Undo-Funktion. Beispiel : %Test.CreateTable("C:\Gdiline\dBase\Test.dbf"); .... .... %Test.Close; %Test.EmptyTable;
Zunächst wird das Tabellenobjekt Test auf Basis der dBase-Tabelle „Test.dbf“ erzeugt. Anschließend wird die Datei "geleert". Anmerkung: Die Funktion Close ist notwendig, da die Tabelle nicht geleert werden kann, wenn das Tabellenobjekt geöffnet ist. %Wieder.CreateTable("Wieder"); .... .... %Wieder.Close; %Wieder.EmptyTable;
Zunächst wird das Tabellenobjekt Wieder auf Basis der Tabelle der automatischen Belegerstellung erzeugt. Nach der Verarbeitung ihrer Daten wird die Datei "geleert". Anmerkung: Die Funktion Close ist notwendig, da die Tabelle nicht geleert werden kann, wenn das Tabellenobjekt geöffnet ist.
GDI-BASIC 2.6
Seite 73/114 01.07.05
%Tabelle.FindKey
Tabellen-Funktion
Syntax : %Tabelle.FindKey(Index,Wert1,Wert2,...) Tabelle Index Wert1, Wert2,... Rückgabewert :
: Tabellenobjekt : String : String oder Integer
Boolean Beschreibung : Die Tabellen-Funktion FindKey erlaubt den lesenden Zugriff auf einen Datensatz des Tabellenobjektes Tabelle nach dem Schlüssel Index mit den Werten Wert1, Wert2,.... Die Funktion liefert true oder false zurück. Meist wird die Funktion innerhalb von if-Abfragen eingesetzt. Anmerkung: Es müssen alle Schlüsselfelder angegeben werden. Die Funktion ist nur bei eindeutigen Indizes einsetzbar (Indexname mit vorangestelltem "*"). Beispiel : %KD.CreateTable("Kunden"); %KD.FindKey("KU_Kundnr", 15000);
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Mit der Tabellenfunktion FindKey wird über den Index KU_Kundnr der Datensatz mit der Kundennummer 15000 gesucht. %TA_Basis.CreateTable("GDIDEF"); %TA_Basis.Open; VonDebitor := 0; BisDebitor := 0; VonKreditor := 0; BisKreditor := 0; if %TA_Basis.FindKey("INDEX1","TI", "KUNDEN") then VonDebitor := StrToInt(TA_Basis.W1); BisDebitor := StrToInt(TA_Basis.W2); endif; if %TA_Basis.FindKey("INDEX1","TI", "LIEFER") then VonKreditor := StrToInt(TA_Basis.W1); BisKreditor := StrToInt(TA_Basis.W2); endif;
Hier wird zunächst die Tabelle GDIDEF geöffnet, in der innerhalb der GDI-BusinessLine die Basisdaten gespeichert werden. Sie ist anschließend im Basic-Programm unter dem Namen TA_Basis ansprechbar. Mit der Tabellenfunktion FindKey wird über den Index Index1 die Nummernkreis-Definition für die Kunden und Lieferanten ausgelesen. Anmerkung: Nummernkreise sind in Version 2.0 über die Funktion System auslesbar.
GDI-BASIC 2.6
Seite 74/114 01.07.05
%Tabelle.FindEdit
Tabellen-Funktion
Syntax : %Tabelle.FindEdit(Index,Wert1,Wert2,...) Tabelle Index Wert1, Wert2,... Rückgabewert :
: Tabellenobjekt : String : String oder Integer
Boolean Beschreibung : Die Tabellen-Funktion FindEdit erlaubt den lesenden und editierenden Zugriff auf einen Datensatz des Tabellenobjektes Tabelle nach dem Schlüssel Index mit den Werten Wert1, Wert2,.... Dabei gilt folgende Besonderheit: Existiert der gesuchte Datensatz bereits, so wird er in den Edit-Modus gesetzt, existiert er noch nicht, so wird er angelegt und in den EditModus gesetzt. Dadurch eignet sich die Funktion besonders für den Datenabgleich zwischen Tabellen (z.B. bei Datenimport). Die Funktion liefert true oder false (die Anlage des Datensatzes war nicht möglich und der gesuchte Datensatz existiert noch nicht) zurück. Anmerkung: Zum Speichern wird anschließend die Funktion Post benötigt. Die Funktion FindEdit dient primär zu Editieren. Soll nur gelesen werden, so sollte man die Funktion FindKey benutzen. Beispiel : %KD.CreateTable("Kunden"); %KD.FindEdit("KU_Kundnr", 15000);
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Mit der Tabellenfunktion FindEdit wird über den Index KU_Kundnr der Datensatz mit der Kundennummer 15000 gesucht und in den Edit-Modus gesetzt, d.h. es können Änderungen an dem Datensatz vorgenommen werden. if %Artikel.FindEdit ("AR_ARTNR",Import.ArtikelNr) then Artikel.Suchname := Import.Suchname; Artikel.ArtText := Import.Text; %Artikel.Post; else show ("Artikel kann nicht angelegt werden"); exit; endif;
Dies ist ein Auszug aus einem einfachen Artikelimport-Programm. Mit der Tabellenfunktion FindEdit wird über den Index AR_Artnr der zur Importtabelle korrespondierende Datensatz gesucht (Artikelnummer in Importtabelle = Artikelnummer in Artikeltabelle) und in den Edit-Modus gesetzt. Der Datensatz wird, falls er noch nicht vorhanden ist durch die Funktion angelegt. (Durch die Funktion Post wird der Datensatz gespeichert (s.u.)).
GDI-BASIC 2.6
Seite 75/114 01.07.05
%Tabelle.SetRange
Tabellen-Funktion
Syntax : %Tabelle.SetRange(Index,Wert1,Wert2,...) Tabelle Index Wert1, Wert2,... Rückgabewert :
: Tabellenobjekt : String : String oder Integer
Beschreibung : Die Tabellen-Funktion SetRange erlaubt es, einen sog. Range auf das Tabellenobjekt Tabelle zu definieren. D.h. über einen Index gesteuert sind nur noch die den Indexwerten entsprechenden Datensätze im Zugriff. Die Funktion liefert keinen Rückgabewert zurück. Eine Aufhebung des Ranges erfolgt über die Funktion CancelRange (s.u.). Anmerkung: Das gleiche Ergebnis wie ein Range liefert das Setzen eines entsprechenden Filters auf die Tabelle, allerdings ist das Zeitverhalten schlechter. Ein Wertebereich (von ... bis... (z.B. von Adressgruppe 100 bis 300) kann beim SetRange nicht angegeben werden. Beispiel : %KD.CreateTable("Kunden"); %KD.SetRange("KU_Adrgrp", "100");
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Mit der Tabellenfunktion SetRange wird über den Index KU_Adrgrp der Zugriff auf die Datensätze mit der Adressgruppe "100" eingeschränkt.
%Tabelle.CancelRange
Tabellen-Funktion
Syntax : %Tabelle.CancelRange Tabelle
: Tabellenobjekt
Rückgabewert :
Beschreibung : Die Tabellen-Funktion CancelRange erlaubt es, einen über die Funktion SetRange gesetzten Range (Zugriff auf Datensätze mit gleichen Indexwerten) aufzuheben. Anschließend sind wieder alle Datensätze der Tabelle im Zugriff. Der Cursor befindet sich auf dem zuletzt angewählten Datensatz. Beispiel : %KD.CreateTable("Kunden");
GDI-BASIC 2.6
Seite 76/114 01.07.05
%KD.SetRange("KU_Adrgrp", "100"); ... ... %KD.CancelRange;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Mit der Tabellenfunktion SetRange wird über den Index KU_Adrgrp der Zugriff auf die Datensätze mit der Adressgruppe "100" eingeschränkt und gewünschte Operationen können vorgenommen werden. Nach der Funktion CancelRange stehen wieder alle Datensätze der Tabelle im Zugriff.
@GDI_Table_Tabelle.Filter
Tabellen-Eigenschaft
Syntax : @GDI_Table_Tabelle.Filter := "Filter" Tabelle Filter
: Tabellenobjekt : String
Rückgabewert :
Beschreibung : Über die Tabellen-Eigenschaft @GDI_Table_Tabelle.Filter kann ein Filter auf das Tabellenobjekt Tabelle gesetzt werden. Neben dem Filterausdruck wird zum Zu- und Abschalten des Filters dder Befehl @GDI_Table_Tabelle.filtered := true bzw. false benötigt. Beispiel : %KD.CreateTable("Kunden"); @GDI_Table_KD.Filter := "Kundennr <= 20000 and Adressgrp = " + CHR(39) + "200" + CHR(39);
@GDI_Table_KD.Filtered := true;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Mit der Tabelleneigenschaft Filter wird ein Filter auf die Tabelle gesetzt. (Kundennr <= 20000 and Adressgrp = '200') Beim Erstellen eines Filter-Strings in GDI-BASIC muß beachtet werden, daß hierin vorkommende Stringkonstanten (hier: Zugriff auf das alphanumerische Datenfeld Adressgrp) vom eigentlichen Filterstring abgegrenzt und in einfache Hochkommas gesetzt werden müssen. Zur Erzeugung der einfachen Hochkommas aus dem Ascii-Zeichensatz wird die Funktion CHR(39) benötigt.
GDI-BASIC 2.6
Seite 77/114 01.07.05
@GDI_Table_Tabelle.IndexName
Tabellen-Eigenschaft
Syntax : @GDI_Table_Tabelle.IndexName := "Index" Tabelle Index
: Tabellenobjekt : String
Rückgabewert :
Beschreibung : Über die Tabellen-Eigenschaft @GDI_Table_Tabelle.IndexName kann der aktive Index der Tabelle festgelegt werden. Dadurch kann die Sortierreihenfolge der Datensätze innerhalb der Tabelle beeinflußt werden. Beispiel : %KD.CreateTable("Kunden"); @GDI_Table_KD.IndexName := "KU_Kundnr";
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Mit der Tabelleneigenschaft IndexName wird ein der aktive Index der Tabelle auf den Index über die Kundennummer gesetzt.
@GDI_Table_Tabelle.SaveDeleteRecords
Tabellen-Eigenschaft
Syntax : @GDI_Table_Tabelle.SaveDeleteRecords := "Primärschlüssel" Tabelle Primärschlüssel
: Tabellenobjekt : String
Rückgabewert :
Beschreibung : Über die Tabellen-Eigenschaft @GDI_Table_Tabelle.SaveDeleteRecords kann das Protokollieren von Datensatzänderungen aktiviert werden. Dies ist wichtig in Zusammenhang mit dem Offline-Verbund. Bis Version 1.7.3 wird bei Datensatzänderungen das Feld Offline im geänderten Datensatz auf "0" gesetzt, ab Version 1.7.4.0 wird ein geänderter Satz in der DelDatei festgehalten. Als Primärschlüssel ist jeweils die Definition des Primärindexes anzugeben. Beispiel : %KD.CreateTable("Kunden"); @GDI_Table_KD.SaveDeleteRecords := "KU_Kundnr=Kundennr";
GDI-BASIC 2.6
Seite 78/114 01.07.05
if %KD.FindKey("KU_Kundnr", 15000) then %KD.Edit; KD.Suchname := "TEST"; %KD.Post; endif; exit;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Mit der Tabelleneigenschaft SaveDeleteRecords wird das Protokollieren der Satzänderungen aktiviert. Im Beispiel (Version 1.7.4) findet sich ein Eintrag in der Deldatei, daß der Kundendatensatz 15000 geändert wurde. %BE.CreateTable("Beleg"); @GDI_Table_BE.SaveDeleteRecords := "BE_BelNr=Belegtyp,Belegart,Belegnr"; ... ...
%Tabelle.RecordCount
Tabellen-Funktion
Syntax : %Tabelle.RecordCount Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert : integer Beschreibung : Über die Tabellen-Funktion RecordCount erhält man als Rückgabewert die Anzahl der im Zugriff stehenden Datensätze der Tabelle Tabelle. Ein evtl. gesetzter Range oder Filter wird berücksichtigt. Die Funktion wird oft in Verbindung mit einer Programmfortschrittsanzeige benötigt. Anmerkung: Bei großen dBase-Tabellen kann diese Funktion einige Zeit in Anspruch nehmen. Beispiel : %KD.CreateTable("Kunden"); Anzahl := %KD.RecordCount;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Mit der Tabellenfunktion RecordCount wird über die Anzahl der Datensätze ausgelesen.
GDI-BASIC 2.6
Seite 79/114 01.07.05
%Tabelle.State
Tabellen-Funktion
Syntax : %Tabelle.State Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert : integer
(0 - 3)
Beschreibung : Die Tabellen-Funktion State liefert als Rückgabewert den "Zustand" der Tabelle Tabelle. Folgende Werte werden unterschieden: 0 Tabelle ist inaktiv 1 Tabelle befindet sich im Anzeigemodus (browse) 2 Tabelle befindet sich im Änderungsmodus (edit) 3 Tabelle befindet sich im Einfügemodus (insert, append) Beispiel : %KD.CreateTable("Kunden"); A := %KD.State; %KD.Close; B := %KD.State;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar (A = 1). Nach dem Schließen der Tabelle mit Close besitzt B den Wert 0.
%Tabelle.Active
Tabellen-Funktion
Syntax : %Tabelle.Active Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert : boolean Beschreibung : Die Tabellen-Funktion Active liefert als Rückgabewert in ähnlicher Weise wie State den "Zustand" der Tabelle Tabelle. Es werden hier nur zwei Werte werden unterschieden: false Tabelle ist inaktiv true Tabelle ist geöffnet (Anzeige- , Änderungs- , Einfügemodus ) Beispiel :
GDI-BASIC 2.6
Seite 80/114 01.07.05
%Tabelle.Refresh
Tabellen-Funktion
Syntax : %Tabelle.Refresh Tabelle
: Tabellenobjekt
Rückgabewert :
Beschreibung : Die Tabellen-Funktion Refresh dient zur gezielten Aktualisierung von Bildschirmanzeigen. Z.B. wenn man per Basic-Button in einer Maske Daten in der Tabelle ändert und in einem Grid anzeigt. Beispiel : %Belegpos.Refresh
%Tabelle.FieldCount
2.0 Neu
Tabellen-Funktion
Syntax : %Tabelle.FieldCount Tabelle
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL
Rückgabewert : Integer Beschreibung : Die Tabellen-Funktion FieldCount liefert die Anzahl der Datenfelder zurück, welche das Tabellenobjekt Tabelle besitzt. Ab 2.0.3.18 verfügbar. Beispiel : %KU.CreateTable("Kunden"); %KU.Open; Cnt := %KU.FieldCount; show(cnt);
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Mit der Tabellenfunktion FieldCount wird die Feldanzahl der Tabelle ermittelt.
GDI-BASIC 2.6
Seite 81/114 01.07.05
%Tabelle.FieldName
2.0 Neu
Tabellen-Funktion
Syntax : %Tabelle.FieldName(Position) Tabelle Position
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL : Integer
Rückgabewert : String, Integer Beschreibung : Die Tabellen-Funktion FieldName liefert unter Angabe der Position den Feldnamen eines Datenfeldes in der Datentabelle Tabelle. Die Positionsnummer ist eine Integerzahl mit dem Wertebereich 0 (erstes Feld) und Feldanzahl -1 (letztes Feld). Liegt die Positionsnummer ausserhalb dieses Bereiches wird die Zahl -1 zurückgegeben. Ab 2.0.3.18 verfügbar. Beispiel : %KU.CreateSQL(""); %KU.SetSQL("select kundennr, name1, name2, ort from kunden"); %KU.Open; FeldName2 := %KU.Fieldname(2); Show(FeldName2);
FeldName2 = "NAME2" Hier wird per SQL auf die Kundentabelle zugegriffen. Der Feldname des Feldes mit der Positionsnummer 2 wird ermittelt und angezeigt. Es handelt sich um das Feld "NAME2". %KU.CreateTable("Kunden"); %KU.Open; Cnt := %KU.FieldCount; show(cnt); S := ""; i := 0; while i < Cnt do FeldName := %KU.FieldName(i); S := S + Feldname + (";"); i := i +1; endwhile; show(S); %KU.FreeTable; exit;
Hier wird die Kundentabelle geöffnet. Zunächst wird die Feldanzahl mit der Funktion FieldCount bestimmt und danach in einer Schleife eine Zeichenkette gebildet, welche alle Feldnamen (hintereinander gereiht und durch Semikolon getrennt) enthält.
GDI-BASIC 2.6
Seite 82/114 01.07.05
%Tabelle.FieldByIndex
2.0 Neu
Tabellen-Funktion
Syntax : %Tabelle.FieldByIndex(Position, Wert) Tabelle Position Wert
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL : Integer : verschiedene Datentypen (nur bei Setzen von Werten)
Rückgabewert : Ist das Feld vorhanden wird der Feldinhalt zurückgegeben Beschreibung : Die Tabellen-Funktion FieldByIndex ermöglicht den Lese- und Schreibzugriff auf Felder der Datentabelle. Im Gegensatz zu "normalen" Datenzugriffen muss der Feldname im Programm nicht vorgegeben sein. Vielmehr wird der Zugriff über die Angabe der Position erreicht. Diese Positionsnummer ist eine Integerzahl mit dem Wertebereich 0 (erstes Feld) und Feldanzahl –1 (letztes Feld). Anmerkung: FieldByIndex ist syntaktisch wie die Funktion FieldByName (s.u.) aufgebaut und bietet prinzipiell die gleichen Möglichkeiten. Der Schreibzugriff ist nicht bei einem Tabellenobjekt auf Basis einer SQL möglich Ab 2.0.3.18 verfügbar
Beispiel : %KU.CreateSQL(""); %KU.SetSQL("select kundennr, name1, name2, ort from kunden" + " where kundennr = 15000"); %KU.Open; Wert1 := KU.Name2; Wert2 := %KU.FieldByIndex(2); Wert3 := %KU.FieldByName("Name2"); Show(Wert1 + chr(9) + Wert2 + chr(9) + Wert3); %KU.FreeSQL;
Hier wird per SQL auf den Datensatz mit der Kundennr 15000 der Kundentabelle zugegriffen. Der Feldinhalt des Datenfeldes Name2 wird auf drei Arten ausgelesen: Einmal über den "normalen" Zugriff über die Syntax "Tabellenname.Feldname", einmal über den Zugriff über FieldByIndex mit der Positionsnummer 2 und ein drittes Mal über die Funktion FieldByName.
GDI-BASIC 2.6
Seite 83/114 01.07.05
%Tabelle.FindField
Tabellen-Funktion
Syntax : %Tabelle.FindField(Feldname) Tabelle Feldname
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL (ab 2.0.4.0) : String
Rückgabewert : Integer Beschreibung : Die Tabellen-Funktion FindField liefert -1 zurück, wenn das mit Feldname angegebene Datenfeld in der Tabelle nicht vorhanden ist, ansonsten ja nach Datentyp des Feldes eine positive Zahl (Eigenschaft TFieldType aus Delphi). Anmerkung: Funktion verfügbar seit 1.7.5.15 mit Rückgabewert true / false (boolean), geändert ab 1.8.0.22 auf aktuelle Funktionalität. Wert -1 0 1 2 3 6 9 10 11 15 16
Feld vorhanden nein ja ja ja ja ja ja ja ja ja ja
DatenTyp
Grund-Datentyp
unbekannt String Smallint Integer Float Date Time DateTime Blob Memo
string numerisch numerisch numerisch Date Date Date binär Memo
Beispiel : Feld := ""; input(Feld, "Bitte Feldnamen angeben", "Eingabe Feldname"); %KD.CreateTable("Kunden"); FTyp := %KD.FindField(Feld); if FTyp < 0 then show("Achtung: Das Feld " + Feld + " ist nicht vorhanden!"); else show("Das Feld " + Feld + " ist vorhanden! FeldTyp = " + FTyp); endif;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Mit der Tabellenfunktion FindField wird geprüft, ob ein über einen Input-Dialog vorgegebenes Datenfeld in der Kundentabelle existiert.
GDI-BASIC 2.6
Seite 84/114 01.07.05
%Tabelle.FieldByName
Tabellen-Funktion
Syntax : %Tabelle.FieldByName(Feldname, Wert) Tabelle Feldname Wert
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL : String : verschiedene Datentypen (nur bei Setzen von Werten)
Rückgabewert : Ist das Feld vorhanden, wird der Feldinhalt zurückgeliefert. Beschreibung : Die Tabellen-Funktion FieldByName ermöglicht den Lese- und Schreibzugriff auf Felder der Datentabelle. Im Gegensatz zu "normalen" Datenzugriffen muss der Feldname im Programm nicht vorgegeben sein. D.h. der Feldname eines Feldes kann z.B. über einen input-Dialog vom Bediener abgefragt werden. Nur sinnvoll in Verbindung mit der Funktion FindField (s.o.). Anmerkung: Der Schreibzugriff ist nicht bei einem Tabellenobjekt auf Basis einer SQL möglich. Beispiel : ... %KD.Edit; KD.Name1 := "TEST"; %KD.Post; ... ... %KD.Edit; %KD.FieldByName("Name1","Test"); %KD.Post; ...
Zwei Programmabschnitte für die Anwendung an einem Kundendatensatz (Aliasname der Kundentabelle ist KD), die letztlich zum gleichen Ergebnis führen. Der Feldname (Name1) steht fix im Programm. %KD.CreateTable("Kunden"); a := 0; b := ""; input(a,"Angabe Kundennr","Bitte Kundennr eingeben"); input(b,"Feldangabe","Welches Feld soll angezeigt werden?"); if %KD.FindKey("KU_KUNDNR",a) then if %KD.FindField(b) >= 0 then c := %KD.FieldByName(b); show("Feld " + b + " = " + c); else Show("Feld = " + b + " nicht gefunden!"); endif; else show("Kunde = " + a + " nicht gefunden!"); endif; %KD.Close; %KD.FreeTable; exit;
GDI-BASIC 2.6
Seite 85/114 01.07.05
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Mit der Tabellenfunktion FindField wird geprüft, ob ein über einen Input-Dialog vorgegebenes Datenfeld in der Kundentabelle existiert. Existiert das Feld, so wird der Wert in einer show-Message ausgegeben. %KD.CreateTable("Kunden"); a := 0; b := ""; c := ""; input(a,"Angabe Kundennr","Bitte Kundennr eingeben"); input(b,"Feldangabe","Welches Feld soll angezeigt werden?"); if %KD.FindKey("KU_KUNDNR",a) then if %KD.FindField(b) >= 0 then c := %KD.FieldbyName(b); input(c,"Wertangabe","Bitte neuen Wert angeben"); %KD.Edit; %KD.FieldByName(b,c); %KD.Post; show("Feld: " + b + " = " + c); else Show("Feld = " + b + " nicht gefunden!"); endif; else show("Kunde = " + a + " nicht gefunden!"); endif; %KD.Close; %KD.FreeTable; exit;
Hier wird zunächst die Kundentabelle geöffnet. Sie ist anschließend im Programm unter dem Namen KD ansprechbar. Mit der Tabellenfunktion FindField wird geprüft, ob ein über einen Input-Dialog vorgegebenes Datenfeld in der Kundentabelle existiert. Existiert das Feld, so wird der aktuelle Wert in einer input-Dialog angezeigt, wird er überschrieben, so wird der neue Wert in die Datenbank eingetragen..
%Tabelle.TextByName
2.0 Neu
Tabellen-Funktion
Syntax : %Tabelle.TextByName(Feldname, Wert) Tabelle Feldname Wert
: Tabellenobjekt oder Tabellenobjekt auf Basis einer SQL : String : versch. Datentypen (nur bei Setzen von Werten), keine Binärdaten
Rückgabewert : Ist das Feld vorhanden, wird der Feldinhalt zurückgeliefert. Beschreibung : Die Tabellen-Funktion TextByName wurde speziell für GDI-BASIC-Datenzugriffe in Masken entwickelt. Sie ist von der Funktion FieldByName (s.o.) abgeleitet und syntaktisch gleich aufgebaut. Beide Funktionen sind in weiten Bereichen prinzipiell gegenseitig austauschbar. Analog zu FieldByName wird über %Tabelle.TextByName("Feldname") der Feldinhalt des Feldes Feldname zurückgegeben, über %Tabelle.TextByName("Feldname", Wert) der Wert in die Datenbank eingebracht. Der Hauptunterschied liegt darin, dass dies
GDI-BASIC 2.6
Seite 86/114 01.07.05
(im Gegensatz zu FieldByName) "wie von Hand in der Maske im Grid/Eingabefeld erfasst" erfolgt. D.h. sofern GDI-seitig bei händischer Erfassung in der Maske Aktionen ausgelöst werden, werden diese ebenfalls abgearbeitet. TextByName bietet also Vorteile wenn: - es sich um ein in der Standardmaske vorhandenes Tabellenobjekt handelt. - mit Eingabefeldern GDI-seitig weitergehende Funktionalität verbunden ist. Als Beispiel sei hier die Mengenerfassung in der Belegbearbeitung genannt. Durch die Eingabe wird die Berechnung von Lagerpr, Gesamt etc... angestossen und eine Neuberechnung der Belegposition durchgeführt. Anmerkungen: verfügbar ab 2.0.3.16. Der Schreibzugriff ist nicht bei einem Tabellenobjekt auf Basis einer SQL möglich.
Beispiel : AGR := TA_Kund.Adressgrp; input(AGR,"Adressgruppe","Bitte neuen Wert für Adressgrp eingeben"); %TA_Kund.Edit; %TA_Kund.TextByName("Adressgrp", AGR); exit;
Ein Beispiel für den Einsatz in der Maske Stammdaten | Kunden. Hier wird über eine input-Abfrage ein Wert für das Datenfeld Adressgrp in die Kundentabelle geschrieben. Durch die Anwendung der Funktion TextByName erscheinen im Anschluss die bekannten Abfragen "Sollen die Vorbesetzungen für die Adressgruppe xyz in diesen Kunden übernommen werden" bzw. "Adressgruppe nicht vorhanden". ... %TA_Pos.Edit; Show(FloatToStr(%TA_Pos.TextByName("Menge"))); %TA_Pos.TextByName("Menge", 3.14); exit;
Ein Beispiel für den Einsatz in Belegerfassungsmasken. Über den show-Befehl wird der aktuelle Wert des Feldes Menge angezeigt. Anschliessend wird 3.14 als Menge eingetragen. Durch die Anwendung der Funktion TextByName erfolgt automatisch eine Neuberechnung der Position.
GDI-BASIC 2.6
GetTableData
Seite 87/114 01.07.05
2.0 Neu
Tabellen-Funktion
Syntax : Ergebnis := GetTableData(TabName,Indexfelder,Indexwerte,Ergebnisfelder) Ergebnis, TabName, Indexfelder, Indexwerte, Ergebnisfelder
: String
Rückgabewert : String Beschreibung : Die Funktion GetTableData liefert die Daten der Ergebnisfelder in Form eines durch Kommata getrennten Strings aus der Tabelle mit dem Tabellennamen TabName. Voraussetzung ist die Angabe von Indexfeldern eines Primärschlüssels mit dazugehörigen Indexwerten. Hinweis: Hieraus wird eine SQL der Art "select Ergebnisfelder from TabName where Indexfelder = Indexwerte" gebildet. Für einfache Datenzugriffe kann man sich also "Tipparbeit" sparen, da die notwendigen Anweisungen (%CreateSQL, %SetSQL, %Open...) vom Programm erzeugt werden. Die Funktion ist nicht einsetzbar bei Kommata in Indexwerten (z.B. Komma innerhalb der Artikelnr). Im Ergebnisstring werden Hochkommata nur wenn benötigt gesetzt (z.B. bei Leerzeichen oder falls Dezimalstellen notwendig sind). Bei einer weiteren Verarbeitung des Strings mit GetCommaPos (s.o.) wird dies berücksichtigt.
Beispiel : K := GetTableData("Kunden","Kundennr","10000","Name1,Strasse,Ort");
K = "Computerstudio 3000","In den Neuwiesen 35",Versmold TabName := "Beleg"; Indexfelder := "Belegnr,Belegtyp,Belegart"; Indexwerte := "2100013,V,LI"; Ergebnisfelder := "Name1,Strasse,Ort,Brutto,Netto"; B := GetTableData(TabName,Indexfelder,Indexwerte,Ergebnisfelder); Brutto := StrToFloat(GetCommaPos(B,3));
B = "Kolbenschmidt AG","Heinestr. 1-5",Neckarsulm,"4119,15","3550,99" Brutto = 4119.15 Zugriff auf einen Beleg. Der Index setzt sich aus mehreren Feldern zusammen. Über die Funktion GetCommaPos wird der Bruttowert als Teilstring aus dem Ergebnisstring ermittelt.
GDI-BASIC 2.6
Seite 88/114 01.07.05
§Datenbank.CreateIBDatabase 2.0 Neu
Datenbank-Funktion
Syntax : Datenbankname := §Datenbank.CreateIBDatabase(Datenbankpfad) Datenbankname, Datenbankpfad Datenbank
: String : Datenbank-Objekt
Rückgabewert : String Beschreibung : Mit Hilfe der Datenbank-Funktion "CreateIBDatabase" wird ein Zugriff auf andere Mandanten/Interbase-Datenbanken ermöglicht. Bei der Angabe des Datenbankpfades handelt es sich hier um eine Pfadangabe gemäss Interbase-Konvention: · Servername + ":" + Absoluter Pfad zur GDI.GDB bzw. · TCPIP-Adresse + ":" + Absoluter Pfad zur GDI.GDB Für die Zugriffe selbst stehen dann die Tabellenobjekte auf Basis von SQLs zur Verfügung (CreateSQL etc..), d.h. man kann mit SQL-Statements auf die Daten zugreifen. Wichtig: Datenbank-Funktionen beginnen mit dem §-Zeichen (Paragraph-Zeichen). Hinweise: Die Funktion %Tabelle.RecordCount zur Ermittlung der Datensatzanzahl ist hier nur bedingt einsetzbar. Man sollte stattdessen separate SQL-Statements mit Count(*) verwenden. Die Funktion ExecuteSQL zum Ausführen der SQLs ist bei Verwendung von der Funktion CreateIBDataBase zum Zugriff auf die Datenbank nicht möglich.
Beispiel : Server := "SERVER01"; Pfad := "E:\GDILINE20\Demofact\GDI.GDB"; DBname := §DB.CreateIBDatabase(Server + ":" + Pfad); %KD.CreateSQL(DBName); %KD.SetSQL("Select * from Kunden"); %KD.Open; ...
Hier wird ein Zugriff auf eine extern liegende GDI.GDB durchgeführt. Im Gegensatz zum Zugriff auf den aktuellen Mandanten ist hier die Bildung des Datenbanknamens für die anschliessende CreateSQL-Anweisung notwendig.
§Datenbank.FreeIBDatabase 2.0 Neu
Datenbank-Funktion
Syntax : §Datenbank.FreeIBDatabase Datenbank
: Datenbank-Objekt
Rückgabewert : Beschreibung : Die Datendank-Funktion "FreeIBDatabase" entfernt das Datenbank-Objekt mit dem Namen Datenbank.
GDI-BASIC 2.6
Seite 89/114 01.07.05
Sonderfunktionen: System
Funktion
2.0*
Syntax : Ergebnis := System(Zeichenkette) oder Ergebnis := System("Tmp_"-Zeichenkette, Wert) Ergebnis, Wert : untersch. Datentypen Zeichenkette : String (gültige Werte siehe unten) "Tmp_"-Zeichenkette : String, beginnend mit "Tmp_" Rückgabewert : Date, Time String
im Falle der Systemdatumermittlung im Falle anderer Systemdaten
Beschreibung : Die Funktion System kann in zwei Bereiche untergliedert werden: • Sie dient zur Ermittlung aktueller, allgemeiner Systemdaten wie z.B. Datum und Mandantenpfad. Anmerkung: Es ist zu beachten, daß in vielen Fällen diese Systemwerte bei Programmstart gesetzt werden und Änderungen erst bei Neustart wirksam werden (z.B. NKMenge). Die Systemwerte der untenstehenden Tabelle können per Basic nicht gesetzt werden sondern nur ausgelesen werden. • Neu ab 2.0.2.9: Sie dient zur Definition eigener "globaler" Systemvariablen. Die Variablen müssen namentlich mit "TMP_" beginnen. Als Rückgabewert erhält man bereits beim Setzen den Variablenwert zurück, ansonsten können die Variablen einfach über System(Variablenname) ausgelesen werden. Dadurch kann man beispielsweise die "Kommunikation" zwischen Masken steuern, ohne Werte in die Datenbank schreiben zu müssen. Beispielsweise wird in Maske A eine Variable gesetzt. In Maske B kann man diese Variable auslesen. Anmerkung: Globale Variablen sind so lange gültig, bis die GDILine beendet wird. Man sollte sie daher auf einen definierten Wert setzen, wenn man sie nicht mehr benötigt. Folgende Systemdaten können ausgegeben werden: Beschreibung Datum und Uhrzeit Datum Uhrzeit Bedienerkürzel Mandantenpfad
Syntax System("now") System("date") System("time") System("Bedname") System("MandPfad")
Programmpfad (ab 1.7.2.10)
System("ExePfad")
Datenbanktreiber (nur 1.x) WordPfad (ab 1.7.2.10) ExcelPfad (ab 1.7.2.10)
System("Treiber") System("WordPfad") System("ExcelPfad")
Beispiel für Rückgabewert 14.11.01 13:25:22 14.11.01 13:25:22 1 E:\GDILINE20\DemoFact\ (je nach Konstellation auch UNC) E:\GDILINE20\ (je nach Konstellation auch UNC) Paradox C:\MSOffice\Winword\Winword.exe C:\MSOffice\Excel\Excel.exe
Datentyp DateTime Date Time String String String String String String
GDI-BASIC 2.6
Seite 90/114 01.07.05
Geschäftsjahr (ab 1.7.5.11) Version (ab 1.7.5.11) Neue Systemdaten ab Version 2.0: Version Versionsdatum BDEVersion BDEDatum ProgPfad EXE-Dateiname MandantName MandantNummer RechnerName Geschäftsjahrbeginn Geschäftsjahrende Geschäftsjahr "abgerechnet bis" VonKundennr BisKundennr VonLiefernr BisLiefernr Nachkommast.Preis Nachkommast.Beleg Nachkommast.Statistik Nachkommastellen Menge Filialnummer des Mandanten Hauswährung Betriebssystem Betriebssystem-Version Betriebssystem-Build Betriebssystem-Temppfad Anzahl Bediener bei Einloggen Anzahl aktiver Bediener Anzahl max. Bediener Datenbankserver Datenbankpfad zur GDI.GDB DBPfad in UNC-Konvention (nur im Netzwerk)
System("GJahr") System("Version")
2001 2.0.0.75
Integer String
System("ProgVersion") oder System("Version") System("ProgDatum") System("BDEVersion") System("BDEDatum") System("ExePath") oder System("ExePfad") System("ExeName") System("MandName") System("MandNr") System("RechnerName") System("VonGJahr") System("BisGJahr") System("Jahr") System("AbgerBis") System("VonDebitor") System("BisDebitor") System("VonKreditor") System("BisKreditor") System("NKPreis") System("NKBeleg") System("NKStatistik") System("NKMenge") System("Filiale") System("Waehrung") System("Platform")
2.0.0.75
String
14.11.2001 11:29:54 5.1.1.1 12.11.1999 06:11:00 E:\GDILINE20\
String String String String
GDILINE.EXE Demo-Daten 001 TEST 01.01.2001 31.12.2001 2001 31.12.2000 10000 69999 70000 99999 2 2 2 0 1 EUR 1 Windows95/98 2 Windows NT/2000/XP 4.10 2222 C:\WIN98\Temp 3 1 6 SERVER01 E:\GDILINE20\Demofact\gdi.gdb \\SERVER01\GDILINE20\Demofact\ gdi.gdb
String String String String String String String String String String String String String String String String String String String
System("SysVersion") System("SysBuild") System("Temppfad") System("BedAnzahl") System("BedAktiv") System("BedMaximal") System("DBServer") System("DBPfad") System("DBUNCPfad")
Beispiel : Jetzt
:= System("now");
Heute := System("date"); Morgen := DateToStr(Heute + 1); Prot := "............" Pfad := System("MandPfad"); SaveToFile(Pfad + "Protokoll.txt",Prot);
Beispiele für die Verwendung allgemeiner Systemvariablen. Var1 := System("tmp_variable1",35); Var2 := System("tmp_variable1");
String String String String String String String String String
GDI-BASIC 2.6
Seite 91/114 01.07.05
Beispiel für die Verwendung globaler Systemvariablen. Bei der Definition muss nicht zwingend eine lokale Variable (im Beispiel Var1) erzeugt werden. Hier haben Var1 und Var2 beide den Wert 35. Var2 könnte in einer anderen GDI-BASIC-Programm stehen.
SystemTab
Funktion
2.0*
Syntax : Ergebnis := SystemTab(Parameter1,Parameter2,Position) Ergebnis, Parameter1, Parameter2 Position
: String (gültige Werte siehe unten) : Integer (Wertebereich 0 bis n)
Rückgabewert : String Beschreibung : Die Funktion SystemTab liefert Information zu im Programm hinterlegten "Systemtabellen". Hierbei handelt es sich um Stringlisten mit dem Aufbau "Schlüssel=Wert", wobei "Wert" meist eine durch Kommata getrennte Folge von Einzelwerten darstellt. Im Programm werden solche Listen z.B. für die angelegten Währungen, für Lizenzinformationen, für Systemdateneinstellungen, Mengeneinheiten und Steuerschlüssel geführt (i.d.R. findet man diese Infos auch in der Datenbank). Als Parameter1 wird immer der Listenname übergeben, Parameter2 ist notwendig um eine bestimmte Zeile der Liste auszulesen, über die Angabe der Position (nur bei durch Kommata getrennte Folge von Einzelwerten) kann man aus einer Zeile einen bestimmten Wert erhalten. Anhand folgender Beispielliste soll die Funktion verdeutlicht werden, der Listenname sei "Test": AAA=1,2,3,4,5 BBB=10,20,30,40,50 CCC=100,200,300,400,500 Beschreibung Komplette Liste
Parameter1 Test
Parameter2 -
Wert der Zeile, welche mit dem Schlüssel "CCC" beginnt Vierter Einzelwert der Zeile, welche mit dem Schlüssel "BBB" beginnt
Test
CCC
Position Beispiel/Ergebnis AAA=1,2,3,4,5 BBB=10,20,30,40,50 CCC=100,200,300,400,500 100,200,300,400,500 -
Test
BBB
3
40
Übersicht über vorhandene Listen: Listenname LWaehr Lizenz System LMe LSteuer
Bedeutung Währungen Lizenzinformationen Systemdateneinstellungen Mengeneinheiten Steuerschlüssel
Syntax-Beispiel SystemTab("LWaehr") SystemTab("Lizenz","Programmnr") SystemTab("System") SystemTab("LMe") SystemTab("LSteuer")
GDI-BASIC 2.6 LZahlart LFiliale VFiliale
Seite 92/114 01.07.05 Zahlarten Filialen gemäss Basisdaten Filialen gemäss Bedienerverwaltung
SystemTab("LZahlart") SystemTab("LFiliale") SystemTab("VFiliale")
Beispiel : USDInfo := SystemTab("LWAEHR","USD");
USDInfo = "$","","2","1,023832",0,"US-Dollar" P := Systemtab("LIZENZ","Programmnr");
P = "99999" E := SystemTab("System","Ek.Spanne");
E = "DurchEk,KalkEk,LetzterEK"
ClipBoard
2.0 Neu
Funktion
Syntax : Ergebnis := ClipBoard(Wert) Ergebnis, Wert
: String
Rückgabewert : String Beschreibung : Mit Hilfe der Funktion ClipBoard kann der aktuelle Inhalt der Windows-Zwischenablage ausgelesen und bei Angabe des Parameters Wert neu gesetzt werden. Über diese Funktion kann eine Übergabe von Aufrufparametern (Druckjob) über die Zwischenablage an den FastReporter erreicht werden, sofern dieser aus einem Basic-Programm gestartet werden soll. Beispiel : S := Clipboard(""); show(S);
liest Zwischenablage aus S := Clipboard("Dies ist ein Test"); show(S);
liest Zwischenablage aus und stellt "Dies ist ein Test" in die Zwischenablage. Die Variable S besitzt noch den "alten" Zwischenablage-Wert. Clipboard("Noch ein Test");
Stellt den String "Noch ein Test" in die Zwischenablage
GDI-BASIC 2.6
Seite 93/114 01.07.05
WeekOfDate
Funktion
Syntax : Ergebnis := WeekOfDate(Datum) Ergebnis Datum
: String : Date
R端ckgabewert : String Beschreibung : Ermittelt aus dem angegebene Datum die Kalenderwoche und das Jahr. Die Ausgabe erfolgt in einem String mit dem Aufbau WW-JJJJ (zweistellige Kalenderwoche und vierstellige Jahreszahl durch Bindestrich getrennt). Anmerkung: Bis 1.6.2.12 erfolgte die Ausgabe in der Form W.JJJJ bzw. WW.JJJJ Beispiel : Ostersonntag99 := StrToDate("04.04.1999"); OsterKW := WeekOfDate(Ostersonntag99); OsterKW = "13-1999"
GDI-BASIC 2.6
DayOfWeek
Seite 94/114 01.07.05
2.0 Neu
Funktion
Syntax : Ergebnis := DayOfWeek(Datum) Ergebnis Datum
: Integer (1 – 7) : Date
Rückgabewert : String Beschreibung : Ermittelt die Wochentagsnummer aus einem Datum, Rückgabewert also die Zahlen 1 bis 7, 1 Montag, 2 Dienstag, ... Beispiel : Tag := DayOfWeek("21.10.2003"); Tag = 2
Runden
Funktion
Syntax : Ergebnis := Runden(Wert,NkSt) Ergebnis, Wert NkSt
: Float : Integer
Rückgabewert : Float Beschreibung : Durch die Funktion Runden wird der angegebene Wert kaufmännisch auf die gewünschte Nachkommastelligkeit NkSt gerundet. Beispiel : Z := Runden(3.14159,3); Z = 3,142
GDI-BASIC 2.6
Sleep
Seite 95/114 01.07.05
Funktion
Syntax : Sleep(Wert) Wert : Float Rückgabewert : Beschreibung : Mit der Funktion Sleep kann die Weiterverarbeitung des Programmes für eine über den Wert in Sekunden vorgegebene Zeitspanne gestoppt werden. In dieser Zeit wird die Belastung des Systems durch das BASIC-Programm auf ein Minimum reduziert. Die Funktion eignet sich für Programme, die in Endlosschleife betrieben werden sollen ("Polling"). Sofern man dieser Zeitspanne eine Aktualisierung eines Oberflächenelementes vornimmt, kann man die Abbruchfunktionalität des Basic-Buttons oder der autom. Belegerstellung nutzen, um die Endlosschleife beenden zu können. Anmerkung: Die Funktion ist ab Version 1.7.4.20 verfügbar. Beispiel : i := 0; while i < 5 do sleep(5); i := i + 1; @Text2.caption := System("now"); .... endwhile; show("Ende"); exit; Hier wird innerhalb einer Schleife alle 5 Sekunden ein Programmablauf durchgeführt. Gleichzeitig wird das Oberflächenelement @Text2 (Objekttyp Label) aktualisiert. Durch diese Massnahme kann das Programm vorzeitig beendet werden, wenn der Bediener abbrechen möchte (z.B. über nochmaliges Drücken des BASIC-Buttons, falls das Programm über einen BASIC-Button gestartet wurde oder den Beenden-Button in der autom. Belegerstellung).
GDI-BASIC 2.6
Beep
Seite 96/114 01.07.05
Funktion
2.0
Syntax : Beep(Frequenz,Dauer) Frequenz, Dauer
: Integer
Rückgabewert : Beschreibung : Mit der Funktion Beep kann eine (Warn-) Tonausgabe über den eingebauten Systemlautsprecher erzeugt werden. Die Höhe des Tones in Herz (Hz) wird über den Parameter Frequenz, die Dauer des Tones in Millisekunden (Ms) über den Parameter Dauer bestimmt. Ohne Angaben von Frequenz und/oder Dauer wird mit 440 Hz für 500Ms gepiepst. Anmerkung: Die Funktion ist ab Version 2.0.3.2 verfügbar. Beispiel : beep(500,250); Diese Programmanweisung erzeugt einen Ton von 250 ms Dauer bei 500 Hz.
GDI-BASIC 2.6
ProcessMessages
Seite 97/114 01.07.05
2.0 Neu
Funktion
Syntax : ProcessMessages("")
Rückgabewert : Beschreibung : Mit der Funktion ProcessMessages kann erreicht werden, dass Windows Informationen zur Aktualisierung der Anzeige von Bildschirminhalten erhält. Interessant ist dies in den Fällen, wenn man beispielsweise in einer Programmschleife Datensätze durchläuft. Wechselt man den Windows-Task zu einer anderen Anwendung und wieder zur GDILINE zurück, so erfolgt der Task-Wechsel verzögert oder nur Teile der GDILINE-Masken sind korrekt sichtbar (z.B. läuft die Fortschrittsanzeige, aber restliche Maskenteile werden nicht aktualisiert). Anmerkung: Die Funktion wird in Version 1.8 automatisch ausgeführt, dieser Automatismus wurde zur 2.0 entfernt, da er in vielen Fällen unnötigerweise Performanceeinbußen mit sich bringt. Beispiel : i := 0; @Anzeige.min := 0; @Anzeige.max := 20000; while i < 20000 do i := i + 1; @Anzeige.Position := i; @Text1.caption := i; processmessages(""); endwhile; exit; Kleines Testprogramm zur Verdeutlichung der Funktion. Einfach einmal mit und einmal ohne ProcessMessages im Menüpunkt Autom. Belegerstellung ausführen und das Verhalten hinsichtlich der Aktualisierung des Objekts Text1 und bei Task-Wechsel beobachten.... In der Praxis führt man sinnvollerweise nicht bei jedem Durchlauf der Schleife diese Anweisung aus: i := 0; @Anzeige.min := 0; @Anzeige.max := 20000; while i < 20000 do i := i + 1; @Anzeige.Position := i; @Text1.caption := i; if Runden(i/100,0) = i/100 then processmessages(""); endif; endwhile; exit;
GDI-BASIC 2.6
Seite 98/114 01.07.05
Debug
Funktion
Syntax : Debug(Wert) Wert
: 0 oder 1
Rückgabewert : Beschreibung : Es besteht die Möglichkeit einen Debug-Modus zu wählen, bei dem das Programm im Dialog mit dem Bediener Schritt für Schritt abgearbeitet wird. Solange der Debug-Modus aktiv ist, erhält der Bediener Informationen über den nächsten auszuführenden Befehl und die aktuellen Werte der GDI-Basic-Variablen des Programmes. Beispiel : Debug(1); -> Debug-Modus ein Debug(0); -> Debug-Modus aus debug(1); S := 1.00; A := 20; B := 50; while S < 10 do S := S + 1; endwhile;
Nächste auszuführende Befehlszeile Aktuelle Variablenwerte
Weiter oder Stop Der hier abgebildete Dialog wird angezeigt, wenn sich das Programm im zweiten Durchgang der while-Schleife befindet.
GDI-BASIC 2.6
Seite 99/114 01.07.05
Execute
Funktion
Syntax : execute(Programm, Parameter) Programm, Parameter : String Rückgabewert : Beschreibung : Mit der Funktion Execute kann ein ausführbares Programm gestartet werden, welchem optional Parameter übergeben werden können. Die Funktionalität entspricht dem Objekttyp TpsExebutton des Bildschirmdesigners. Anmerkung: Die Funktion ist ab Version 1.7.4.20 verfügbar. Beispiel : execute("command.com","/c copy vorlage.xls neu.xls"); Hier wird aus dem GDI-BASIC-Programm heraus das ausführbare Programm command.com gestartet, mit welchem eine Kopie einer Excel-Datei angelegt wird (im Mandantenpfad). Der Aufruf über einen ExeButton würde analog lauten: @TpsExeButton1.Exename := "command.com"; @TpsExeButton1.Params := "/c copy vorlage.xls neu.xls"; @TpsExeButton1.Clicked := true;
ExecuteBasic
GDI-BASIC-Funktion
Syntax : ExecuteBasic(Programm) Programm
: String
Rückgabewert : Beschreibung : Mit Hilfe der Funktion "ExecuteBasic" kann ein extern liegendes GDI-BASIC-Programm ausgeführt werden. Beispiel : P := LoadFromFile("C:\Gdiline\Demo\Test.prg");
GDI-BASIC 2.6
Seite 100/114 01.07.05
ExecuteBasic(P);
Hier wird ein extern liegendes GDI-Basic-Programm geladen und anschließend ausgeführt. Dies entspricht der Möglichkeit, per GDI-BASIC in einer Maske einen GDI-BASICButton anzustoßen (@TpsBasicButton1.clicked := true;). Anmerkung: Die Funktion ist ab 1.8.0.17 verfügbar.
Startdialog
GDI-BASIC-Funktion
2.0*
Syntax : StartDialog(Dialog,Modal,Start,Default,Return,Filter,Zusatz,T) Dialog, Start, Default, Return, Filter, Zusatz, T Modal
: String : true oder false, Vorgabewert ist true
Rückgabewert : String Beschreibung : Über den Befehl Startdialog können Masken aus einem GDI-BASIC-Programm heraus aufgerufen werden. Im Prinzip entspricht dieser Aufruf der Funktion des Maskenaufrufes über ein DBEdit-Feld in der Maske mit eingestellter Buttonstyle-Option "ebsDialog". Die Einstellungsmöglichkeiten/Parameter entsprechen daher weitestgehend der Property Dialog beim DBEditFeld:. Parameter Default
Typ String
Dialog
String
Bedeutung Hier können der aufzurufenden Maske Defaultwerte zugewiesen werden, die dort bei Neuanlage eines Datensatzes berücksichtigt werden, Beispiel: "Adressgrp=200" Sinnvollerweise müssen die Unter-Properties Default und Filter (s.u.) aufeinander abgestimmt sein, damit bei Neuanlage der neue Satz nicht gleich "herausgefiltert" wird und somit nicht sichtbar ist. Hinweis: Keine Hochkommata bei Konstanten erforderlich Je nach Maske sind hier verschiedene Fälle zu unterscheiden: o Soll eine System-Maske gestartet werden, so wird hier der Maskenalias eingetragen (z.B. "TFAKunden" oder "TFABelegVK"). Den Maskenalias einer System-Maske kann man leicht ermitteln: Er wird im Property-Pad in der Überschrift der Property-Tabelle angezeigt, wenn man den Bildschirmdesigner aufgerufen hat. Alternativ kann man den Menüdesigner heranziehen. o Soll eine eigene Maske gestartet werden, so muss hier das Schlüsselwort "Maske", gefolgt von dem Alias der Maske gesetzt werden. (durch Punkt getrennt, z.B. "Maske.Test". Bei eigenen Masken erhält man den Maskenalias am einfachsten über den Menüdesigner. o Soll ein F4-Auswahldialog geöffnet werden, so ist hier das Schlüsselwort "Gridbutton" zu setzen. Weitere Details werden über den Parameter Zusatz gesetzt (s.u.) o Ab 2.0.3.x: Zur Anzeige einer auf einer beliebigen SQL basierenden Ergebnismenge ist hier das Schlüsselwort "TableBrowser" zu setzen Es handelt sich um einen Sonderfall der Gridbutton-Funktionalität. Weitere Details werden über den Parameter T gesetzt (s.u.) o Ab 2.0.3.10: Zur Auswahl eines Datums mittels Kalender (wie beim Editfeld ButtonStyle ebsDate) ist hier das Schlüsselwort "TDatum" zu setzen
GDI-BASIC 2.6
Seite 101/114 01.07.05
Filter
String
Modal
Return
True bzw. False String
Start
String
Zusatz
String
T
String
Allgemein: Filterwert, der bei Verwendung einer Navigationsleiste in der aufzurufenden Maske (LoadFromForm muss dort auf True gesetzt sein) für die Haupttabelle dieser Maske gesetzt wird, Beispiel "Adressgrp=" + CHR(39) + "200" + CHR(39) o Sonderfall (ab 2.0.3.20): bei Aufruf von TFStueckListe notwendig: "KZSTUECK = " + Chr(39) + "P" + Chr(39) + " or KZSTUECK = " + Chr(39) + "H" + Chr(39); I.d.R. sollte hier True gesetzt werden. Die aufzurufende Maske wird somit modal aufgerufen, d.h. andere Masken können erst nach Schliessen der aufgerufenen Maske bearbeitet werden. Das GDI-BASIC-Programm wird in dieser Zeit "angehalten". Rückgabewert in der Form Empfängerfeld=Senderfeld, , insbesondere beim GridButtonoder TableBrowser-Aufruf. Der Rückgabewert ergibt sich dann aus einem String des Aufbaues "Empfängerfeld=Wert"). Beispiel: "Kundennr=Kundennr" bei Auswahl des Datensatzes 15000 wird "Kundennr=15000" zurückgegeben. Mehrzeilige Feldinhalte werden automatisch über die Funktion FmtMemoStr in ein einzeiliges Format gewandelt. Den originalen Inhalt erhält man also durch Rückwandlung über FmtMemoStr(Wert, false). Startwert für die Maske in der Form Empfängerfeld=Senderfeld, Beispiel "Belegnr=2100003" oder "Artikelnr=xyz". Hinweis: Es kann nur ein Wert übergeben werden, nicht mehrere Werte, keine Hochkommata bei alphanumerischen Werten o Neu ab 2.0.5.2: Sonderfall Aufruf Belegdruck-Dialog TFSBelDr: Übergabe des Beleges in der Form "Belegtyp,Belegart,Belegnr". Beispiel "V,RE,2500125" o Bei Aufruf einer Belegbearbeitungsmaske muss hier die Belegart angegeben werden in der Form "Belegart-Kürzel, Text" Beispiel "RE, Rechnungen". Hier ist die Eigenschaft Filter nicht notwendig. o Bei Aufruf eines Gridbuttons wird der Aufbau der Auswahltabelle näher festgelegt. Wichtig: Wie beim EditFeld mit Buttonstyle-Option ebsGridButton ist eine zeilenweise Angabe der Schlüsselwörter erforderlich. D.h. hier werden entsprechende Umbrüche in Form von CHR(13,10) benötigt. o Bei der TableBrowser-Funktionalität kann über die Einstellung "Multiselect=true" die Möglichkeit zur Auswahl mehrerer Datensätze aktiviert werden Dieser Parameter ist nur bei TableBrowser-Funktion notwendig. Hier wird der Name des SQL-Tabellen-Objektes angegeben. Wird das Objekt z.B. über %TestSQL.CreateSQL("") erzeugt, so ist "TestSQL" anzugeben
Beispiel : Aufruf des Kundenstammes, einfachster Aufruf ohne weitere Parameterangabe: ... Startdialog("TFAKunden"); ...
Aufruf der Kundenstamm-Maske, Anzeige des Kundendatensatzes für Kunde 15000: ... Startdialog("TFAKunden",true,"Kundennr=15000","","","","",""); ...
Aufruf der Kundenstammmaske, es sollen nur Kunden der Adressgruppe 200 bearbeitet werden können: ... Startdialog("TFAKunden", true, "", "Adressgrp=" + CHR(39) + "200" + CHR(39), "", "Adressgrp=" + CHR(39) + "200" + CHR(39), "", "");
GDI-BASIC 2.6
Seite 102/114 01.07.05
...
Aufruf der Stücklistenstamm-Maske, Anzeige der Stückliste "HSL_Test": ... Start := "Artikelnr=HSL_Test"; Filter := "KZSTUECK = " + CHR(39) + "P" + CHR(39) + " or " + "KZSTUECK = " + CHR(39) + "H" + CHR(39); StartDialog("TFStueckListe", True, Start, "","", Filter, "",""); ...
Der Bediener soll bei Ablauf eines GDI-BASIC-Programmes einen Kunden auswählen können. Gegenüber einer einfachen Abfrage über einen Input-Dialog (Bediener tippt die Nummer ein) erlaubt die Startdialog-Funktion eine Auswahl über den F4-Auswahlgrid. Voreingestellt wird der Kunde mit der Nummer 12000: ... S := Startdialog("GridButton", true, "Kundennr=12000", "", "Kundennr=Kundennr", "", "LoadDefs=KUNDEN" + CHR(13,10) + "TableName=KUNDEN" + CHR(13,10) + "Query=True" + CHR(13,10) + "Caption=Bitte Kunden auswählen"); show(GetRValue(S)); if S = "" then show("Es wurde abgebrochen"); exit; endif; ... ...
Folgende Schreibweise macht das Ganze etwas übersichtlicher: ... Start := "Kundennr=12000"; Return := "Kundennr=Kundennr"; Zusatz := "LoadDefs=KUNDEN" + CHR(13,10) + "TableName=KUNDEN" + CHR(13,10) + "Query=True" + CHR(13,10) + "Caption=Bitte Kunden auswählen"; S := Startdialog("GridButton",true,Start,"",Return,"",Zusatz); show(GetRValue(S)); if S = "" then show("Es wurde abgebrochen"); exit; endif; ... ...
Aufruf des F4-Auswahlgrids für Artikel. Es sollen nur Artikel angezeigt und gesucht werden können, deren Artikelnr mit "ibm" beginnt. Es sollen mehrere Werte an das Basic-Programm zurückgegeben werden. ...
GDI-BASIC 2.6
Seite 103/114 01.07.05
Return := "Artikelnr=Artikelnr" + chr(13,10) + "Suchname=Suchname" + chr(13,10) + "RabattGruppe=RabattGr" + chr(13,10) + "ArtikelText=ArtText" + chr(13,10) + "Hinweis=Hinweis"; Filter := "substrex(Artikelnr,1,3) = ''ibm'' "; Zusatz := "Caption=Artikeldaten" + chr(13,10) + "LoadDefs=Artikel" + chr(13,10) + "Query=True" + chr(13,10) + "Datafield=Artikelnr" + chr(13,10) + "Tablename=Artikel"; S := StartDialog("GridButton",True,"","",Return,Filter,Zusatz); show(s); ...
Anzeige des Ergebnisses einer SQL mit der TableBrowser-Funktionalität: Es wird eine SQL auf die Basisdatentabelle GDIDEF abgesetzt. IND1 und F1 (Bezeichnung) werden bei Auswahl eines Satzes zurückübergeben. Die Suche im Browser selbst wird ab 2.0.3.20 unterstützt. (vorher war in der Ergebnistabelle nur die F3-Suche möglich). %Test.CreateSQL(""); %Test.SetSQL("select * from gdidef"); %Test.Open; Return := "IND1=IND1" + CHR(13,10) + "F1=F1"; T := "Test"; S := StartDialog("TableBrowser",True,"","",Return,"","",T); Show(S); %Test.Close; %Test.FreeSQL;
Neu ab 2.0.5.2: MultiSelect bei TableBrowser: Sofern beim Parameter Zusatz "Multiselect=true" übergeben wird, besteht die Möglichkeit der An-/ Auswahl mehrerer Datensätze in der angezeigten Ergebnistabelle. Wichtig: Im Ergebnis stehen bei Multiselect nicht mehr die einzelnen Rückgabewerte in der Form "Feldname=Wert" durch Zeilenumbruch getrennt untereinander, sondern die gewählten Datensätze. Die Rückgabewerte stehen in der Zeile durch das Pipe-Zeichen ("|") getrennt, also "Feldname1=Wert1"|"Feldname2=Wert2"|"Feldname3=Wert3"... Nachfolgend ein Beispielprogramm, welches auch zeigt, wie der Rückgabestring unter Zuhilfenahme einer Stringliste "durchgearbeitet" werden kann. Man beachte auch den Einsatz FmtMemoStr(Wert, false). Dies wird am Artikeltext deutlich. %Test.CreateSQL(""); %Test.SetSQL("select * from Artikel"); %Test.Open; Return := "artikelnr=artikelnr" + chr(13,10) + "suchname=suchname" + chr(13,10) + "arttext=arttext"; T := "Test"; Zusatz := "Multiselect=True" + chr(13,10) + "LoadDefs=Artikel" + chr(13,10) + "Caption=Artikeldaten"; S := StartDialog("TableBrowser",True,"","",Return,"",Zusatz,T); Show(S); $L1.CreateStringList; $L1.SetText(S); i := 0;
GDI-BASIC 2.6
Seite 104/114 01.07.05
Zeile := ""; while i < $L1.Count do Zeile := $L1.Element(i); j := 0; while GetCommaPos(Zeile, j, "|") <> "" do S := GetCommaPos(Zeile, j, "|"); Show("Feldname=" + GetLValue(S) + CHR(13,10) + "Wert=" + FmtMemoStr(GetRValue(S), False)); j := j + 1; endwhile; i := i + 1; endwhile; $L1.FreeStringList; %Test.Close; %Test.FreeSQL;
Auswahl eines Datums über den Aufruf der Kalendermaske "TDatum" (ab Version 2.0.3.10): Es können zwei Datumswerte über die Parameter Start und Default an den immer modal geöffneten Kalender-Dialog übergeben werden. Rückgabewert ist das ausgewählte Datum. Wird der Dialog mit Abbruch verlassen, wird ein Leerstring zurückgegeben. S:= StartDialog("TDatum"); show(S);
einfachster Aufruf. Der Dialog stellt sich auf das Rechnerdatum ein. S:= StartDialog("TDatum",True,"17.02.1999"); show(S);
Der Dialog stellt sich auf das per Start-Parameter vorgegebene Datum ein.
Datum := @ED_Datum.Text; S:= StartDialog("TDatum", True, Datum, System("VonGJahr")); show(S);
Der Dialog stellt sich auch hier auf das per Start-Parameter vorgegebene Datum ein. Dieses Datum wird aus der Programmoberfläche aus einem Editfeld mit Namen "ED_Datum" entnommen. Sofern hier kein Datum zu finden ist, wird auf den Defaultparameter zurückgegriffen, d.h. hier auf das Datum des Geschäftsjahresbeginn aufgesetzt.
GDI-BASIC 2.6
Seite 105/114 01.07.05
SendMail
2.0 Neu
Funktion
Syntax : Ergebnis := SendMail(AN,CC,BCC,Betreff,Text,Anhang,Absender, Host,AuthLogin,AuthUser,AuthPwd,MailPort)
MailPort AuthLogin alle übrigen Param.
: Integer, Defaultwert ist 25 : Boolean, Defaultwert ist false : String
Rückgabewert : String(liste) Beschreibung : Die Funktion SendMail ermöglicht das Versenden von eMails direkt aus einem GDI-BASICProgramm heraus. Man kann somit beispielsweise bei Datenimporten/-exporten erzeugte Protokolle an den Systemverwalter schicken oder Rundmailings generieren ("Newsletter verschicken"). Bei den Adressparametern (AN, CC, BCC) ist jeweils nur eine eMail-Adresse ohne Alias-Angabe erlaubt (also nicht "Max Muster" <Mustermann@Musterfirma.de> sondern nur "Mustermann@Musterfirma.de"). Soll der Anhang aus mehreren Dateien bestehen, so sind diese im String durch Semikolon zu trennen. Existiert die angegebene Datei nicht, wird die Mail ohne Anhang versendet. Die Parameter AuthLogin, AuthUser und AuthPwd werden nur benötigt, wenn der MailServer die sog. Authentifizierung erfordert. Sofern die Mails über den Standardport 25 verschickt werden, kann die Angabe des Parameters MailPort entfallen. Als Rückgabewert erhält man bei erfolgreichem Versand eine Liste mit den wichtigsten Infos der Mail (s.u.). Hinweise: Verfügbar ab Version 2.0.4.4. Sofern bereits eMails mit der GDILine versendet werden, kann man sich bzgl. der Servereinstellungen an den im Personalstamm hinterlegten Email-Definitionen orientieren. Es gibt in der GDILine keinen Ordner für "ausgehende Mails", d.h. gegebenenfalls muss man sich über das BasicProgramm eine eigene Sende-Protokollierung realisieren.
Beispiel : AN CC BCC Betreff MailText Anhang Absender MailHost
:= := := := := := := :=
"mueller@musterfirma.de"; ""; ""; "Betreff einer Testmail aus GDI-Basic"; LoadFromFile("D:\temp\MailText.txt"); "C:\WINNT\Angler.bmp;C:\WINNT\Kaffeetasse.bmp"; "Mustermann@Musterfirma.de"; "ken";
Y := SendMail(AN,CC,BCC,Betreff,MailText,Anhang,Absender,MailHost); show(Y);
Generierung eines Mails, wobei der eigentliche Mailtext aus einer Datei geladen wird. Es sind zwei BMP-Dateien als Anhang beigefügt, der Server erfordert für den Versand keine Authentifizierung. Die Abbildung zeigt den Wert der Variablen Y:
GDI-BASIC 2.6
Seite 106/114 01.07.05
AN := "mueller@musterfirma.de"; CC := ""; BCC := ""; Betreff := "Betreff einer Testmail aus GDI-Basic"; MailText := LoadFromFile("D:\temp\MailText.txt"); Anhang := "C:\WINNT\Angler.bmp;C:\WINNT\Kaffeetasse.bmp"; Absender := "Mustermann@Musterfirma.de"; MailHost := "ken"; AuthLogin := true; AuthUser := "XYZ"; AuthPwd := "xyz"; Y := SendMail (AN,CC,BCC,Betreff,MailText,Anhang,Absender,MailHost, AuthLogin,AuthUser,AuthPwd);
analoge Generierung eines Mails, jedoch mit Authentifizierung.
GDI-BASIC 2.6
Seite 107/114 01.07.05
Übersicht über die Sprachelemente von GDI-BASIC Sprachelement
Bedeutung
:= + * / = <> <= >= < > AND OR NOT ( ) , ; IF THEN ELSE ENDIF WHILE DO
Zuweisung Addition Subtraktion Multiplikation Division gleich ungleich kleiner gleich größer gleich kleiner größer logisches UND logisches ODER logisches NICHT Beginn von Funktionsparametern Ende von Funktionsparametern Trennzeichen für Funktionsparameter Trennzeichen für Befehle/Befehlszeilen Beginn einer Programmabfrage/Bedingung Beginn einer Befehlsfolge bei zutreffender Bedingung Beginn einer Befehlsfolge bei nicht zutreffender Bedingung Ende einer Programmabfrage/Bedingung Beginn einer Programmschleife mit folgender Bedingung Beginn der Befehlsfolge, die bei zutreffender Schleifenbedingung ausgeführt wird Ende einer Programmschleife Sprungziel, Marke (z.B. :Ansprungpunkt_1) Sprungbefehl, Programmfortführung geht bei dem Label weiter (z.B. GOTO Ansprungpunkt_1) Beenden des Programms
ENDWHILE :Label GOTO EXIT
GDI-BASIC 2.6
Seite 108/114 01.07.05
Hinweise zum Einsatz von GDI-BASIC ab Version 2.0 (Interbase) Grundsätzlich wurde darauf geachtet, daß "alte" Programme aus den Vorgängerversionen (Paradox) auch in der InterBase-Version lauffähig sind. An dieser Stelle finden Sie Hinweise, inwieweit an GDI-BASIC-Programmen Änderungen notwendig werden und Tipps zur Gestaltung neuer GDIBASIC-Programme. • Bei Zugriffen auf die Daten können mit Programmen aus den Vorgängerversionen erheblichen Performance-Einbußen auftreten. Dies liegt in der Natur der unterschiedlichen Datenbanksysteme (weshalb man zwar in der Theorie z.B. die GDILINE in kurzer Zeit auf andere Datenbanksysteme umstellen könnte, in der Praxis dies aber keine akzeptable Performance liefert. Eine Großteil der Entwicklungarbeit der InterBase-Variante bezog sich auf die Optimierung hinsichtlich des Geschwindigkeitsverhaltens!). Als Merkregel beim Dateizugriff mit GDI-BASIC unter InterBase gilt: Der Zugriff über Tabellen-Objekte (%Tabelle.CreateTable) sollte durch den Zugriff über Tabellenobjekte auf Basis von SQL (%Tabelle.CreateSQL) ersetzt werden. Insbesondere dann, wenn mit größeren Datenmengen gearbeitet wird. Hieraus ergibt sich:
Paradox
InterBase
%CreateTable %FindKey
%CreateSQL %SetSQL mit Select-Anweisung, in Schleifenkon- Mit %RecordCount oder struktion parametrisiert besser mit %EOF prüfen ob Satz gefunden wurde/vorhanden ist Konstruktion bestehend aus: Mit %RecordCount oder %SetSQL mit Select-Anweisung, in Schleifenkon- besser mit %EOF prüfen ob struktion parametrisiert Satz gefunden wur%SetSQL mit Update-Anweisung, in Schleifende/vorhanden ist, anschliekonstruktion parametrisiert ßend entweder nur Update %SetSQL mit Insert-Anweisung, in Schleifenkon- oder Insert mit Schlüsselstruktion parametrisiert wert und anschließendem Update %SetSQL mit Update-Anweisung, in Schleifenkonstruktion parametrisiert %SetSQL mit Insert-Anweisung, in Schleifenkon- Neuanlage eines Satzes auch struktion parametrisiert über Kombination Insert/Update %SetSQL mit Delete-Anweisung, in Schleifenkonstruktion parametrisiert
%FindEdit
%Edit, %Post %Append
%Delete
Bemerkung
In einem Test wurden 1000 Belegpositionen per GDI-Basic bearbeitet (Selektieren/Filtern und Durchlauf von 1000 Positionen, dabei jeweils Zugriff auf Arumsatz-Tabelle und von dort ein Wert in die Belegposition übertragen). Ergebnis: Der Zeitaufwand betrug mit Tabellenobjekten ca. 250 sec., mit Tabellenobjekten auf Basis von SQL ca. 11 sec. • Zugriff auf Datumsfelder: In Interbase werden die Datumswerte die Inhalte bei Datumsfeldern z.B. Belegdat in Belegtabelle immer als DateTime abgelegt, d.h. Datum und Uhrzeit werden ge-
GDI-BASIC 2.6
Seite 109/114 01.07.05
speichert. In der Regel mĂśchte man in GDI-BASIC-Programmen nur mit dem Datum arbeiten, der Feldinhalt ist also mit der Mask-Funktion auf D10-Format zu formatieren. Beispiel: Datum := Mask("D10", Beleg.Belegdat); if Datum = ... then ... endif;
FĂźr den Zugriff auf Datumsfelder per SQL wurde der SQL-Funktionsumfang erweitert.
GDI-BASIC 2.6
Seite 110/114 01.07.05
Sonstiges/Fehlermeldungen/Tricks/Ansprungpunkte/GDI-Basic in Masken • Variablen müssen nicht zu Beginn eines Programmes definiert werden. Die Definition erfolgt automatisch beim ersten Auftreten der Variablen im Programm, entweder anhand der mit der Variablen verbundenen Funktion oder anhand des zugewiesenen Wertes. Beispiel 1: S sei eine Variable. S S S S
:= := := :=
WeekOfDate(Beleg1.Belegdat); S ist eine Variable vom Datentyp String 1; S ist eine Variable vom Datentyp Integer 1.00; S ist eine Variable vom Datentyp Float "Hallo"; S ist eine Variable vom Datentyp String
Beispiel 2: NEGBetrag := 0 - Belegpos.Gesamt; Variable wird als Integer interpretiert! NEGBetrag := 0.00 - Belegpos.Gesamt; Variable wird als Float interpretiert!
• Kopieren von GDI-Basic-Programmzeilen aus Textverarbeitungs-Dokumenten, z.B. WordDateien (Doc): Werden anschließend Stringvariablen nicht korrekt erkannt, kann es daran liegen, daß die Hochkommas nicht korrekt erkannt werden. Sie sollten im Zweifelsfall im GDI-BasicEditor eingegeben werden. • Mit Doppelslash // können einzelne Programmzeilen auskommentiert werden. Hierbei werden alle Zeichen nach dem Doppelslash und vor dem nächsten Return als Kommentar angesehen. //Position des Bindestriches ermitteln P := Pos("-","Gdi-Basic"); //show(P);
• Ganze Programmbereiche können durch geschweifte Klammern {} auskommentiert werden. Verschachtelte Kommentare sind nicht zulässig, d.h. Mehrfach-Klammerungen wie z.B. {...{...}} dürfen nicht vorgenommen werden. { Im nachfolgenden Programmteil..... .... } P := Pos("-","Gdi-Basic");
• Das Programm führt vor der Ausführung immer einen Syntaxcheck durch. Falls Fehler erkannt werden, erfolgt eine entsprechende Ausgabe: Beispiel: I := IntToStr(4711-);
Abbruchmeldung Ausschnitt aus Programm (Anmerkung: zeigt nicht unbedingt die Stelle, wo der Fehler liegt)
• Es besteht die Möglichkeit einen Debug-Modus zu wählen, bei dem das Programm im Dialog mit dem Bediener Schirtt für Schritt abgearbeitet wird. Einschalten: Debug(1);
GDI-BASIC 2.6
Seite 111/114 01.07.05
Ausschalten: Debug(0); • Fehlermeldung. „Typkonvertierung von Variant ungültig“:
Diese Meldung erscheint, wenn eine Operation von zwei oder mehreren Variablen durchgeführt werden soll, die sich vom Typ her unterscheiden und das Programm keine automatische Typkonvertierung vornehmen kann. Beispiel: Es wird versucht eine Addition einer Datumsvariablen mit einer Stringvariablen durchzuführen. Silvester99 := StrToDate("31.12.1999"); S := Silvester99 + " ist der letzte Tag des Jahres 1999"; Fehlermeldung S := "Der " + Silvester99 + " ist der letzte Tag des Jahres 1999"; keine Fehlermeldung, da das Programm die Variable Silvester99 automatisch in einen String umwandelt.
• Ausführen/Hinterlegen von GDI-Basic-Programmen • Menüpunkt Verkauf | Automatische Belegerstellung. • Nummernkreise, Karteireiter GDI-Basic (speziell für Belegerstellung) • :Kopfteil dient zum Setzen von Texten bei Belegübernahme. • :Laden.Kunden Aufruf bei Auswahl einer Belegadresse (Verkauf) • :Laden.Lieferanten Aufruf bei Auswahl einer Belegadresse (Einkauf) • :Laden.Lieferadesse Aufruf bei Auswahl einer Lieferadresse • :Laden.Ansprechpartner Aufruf bei Auswahl eines Ansprechpartners • :Laden.Artikel Aufruf bei Auswahl eines Artikels • :Laden.Arttext Zum Laden eigener Artikeltexte :Laden.Arttext if (Bedingung) then Arttext := Artikel.Text2; else Arttext := 0; endif; exit;
• :AfterBelUeb Wird abgearbeitet, wenn nach einer Belegübernahme die Belegübernahme-Maske geschlossen wird. In diesem Moment besteht Datenzugriff auf den zuletzt angelegten Zielbeleg. • :Laden.Serien. Erlaubt den Zugriff auf die Beleg und Belegpos-Tabelle zu dem Zeitpunkt, wenn eine Seriennr in die Position übernommen wird (z.B. Drücken des OK-Button in der Serientabelle nach der Zuweisung der Seriennummern im Verkaufsbeleg) • :Erzeuge.Seriennr bis 2.0.3.20, kann in Nummernkreisen unter Stammdaten/Seriennummern hinterlegt werden. Abarbeitung bei Anlage einer Seriennummer. Wird pro Seriennr einmal aufgerufen. • :Update.Seriennr ersetzt ab 2.0.3.20 das Label :Erzeuge.Seriennr, kann in Nummernkreisen unter Stammdaten/Seriennummern hinterlegt werden. Abarbei-
GDI-BASIC 2.6
Seite 112/114 01.07.05
tung nach Anlage von Seriennummern. Wird pro Seriennr-Stapel einmal aufgerufen. • :AfterBeleg ab 2.0.4.6, für über die Autom. Belegerstellung erzeugte Belege: Man kann in den Nummernkreisen unter "Stammdaten" einen Knoten für die Tabelle "WIEDER" anlegen (sofern noch nicht vorhanden) und hier dieses Label ":AfterBeleg" benutzen, es wird zeitmäßig nach Anlage und Übertragung aller für diesen Beleg erforderlichen Daten (inklusive Positionen) und vor dem Speichern dieses Beleges abgearbeitet. Möglicher Einsatzbereich: Individuelle Protokollierung der erzeugten Belege. Zugriff auf den Beleg über Beleg.Feldname. • Mengeneinheiten der GDILine (Mengenermittlung) • Grundsätzlich besteht die Möglichkeit zur Mengenermittlung hier ein GDIBASIC-Programm zu hinterlegen, um beispielsweise aus Laenge und Breite eine Menge zu berechnen. WICHTIG: Bei Belegteilübernahmen wird dieses BASIC nicht abgearbeitet (bei Teilübernahme wird die Menge geändert, es kann keine "Rückrechnung" erfolgen). • speziell für Bestellwesen ":Bestell" In diesem Abschnitt ist mit der Tabelle „Bestell“ und nicht mit der Tabelle „BelegPos“ zu arbeiten. Wichtig: 1. Eine bereits vorhandene Mengenermittlungsformel ist mit "exit;" abzuschließen und danach das Label ":Bestell" zu setzen. 2. In der GDILine 2.0.x ist in diesem Abschnitt bei Zugriff auf eigene Tabellenobjekte die Funktion FieldByName zu benutzen. :BESTELL %ArtTab.CreateSQL(""); %ArtTab.SETSQL("Select gewicht from artikel where Artikelnr = :Artikel"); %ArtTab.ParamByName("Artikel", bestell.Artikelnr); %ArtTab.Open; Gewicht := 1.0 * %ArtTab.FieldByName('gewicht'); bestell.gewicht := bestell.hoehe * Gewicht; ... ... %ArtTab.FreeSQL; exit;
• speziell zur Abarbeitung von GDI-BASIC bei der Stücklistenerfassung im Artikelstamm (ab Version 1.8.0.15): • :Stuck.Laden --> bei Auswahl des Unterartikels • :Stuck.[Feldname] --> bei Ändern des Feldinhaltes, z.B. :Stuck.Menge --> bei Mengenänderung :Stuck.Mengeneinh --> bei Ändern der Mengeneinheitsnummer :Stuck.Epreis --> bei Preisänderung dabei Zugriff auf Oberartikel über Artikel.[Feldname], Zugriff auf Unterartikel über Stuck.[Feldname] Wichtig: Eine bereits vorhandene Mengenermittlungsformel ist mit "exit;" abzuschließen und danach sind die neuen Labels zu setzen. • Maskendesigner bei GDI-Basic-Button • Maskendesigner direkt auf Maskenebene bei der Property "GDIBasic" (hier ist ggfs. nach Hinterlegung des Basic ein Programmneustart erforderlich, damit die Änderungen wirksam werden): • Ansprungpunkte für Editfelder und Comboboxen z.B. ":ED_xyz1.exit" oder ":ED_xyz1.enter"). Speziell in den Masken gibt es noch die Funktion, den Fokus auf ein Eingabefeld zu setzen. Syntax: @Objektname.SetFocus; • :FormShow Abarbeitung bei Aufruf der Maske (ab Version 2.0) • :FormClose Abarbeitung bei Schliessen der Maske (ab Version 2.0)
GDI-BASIC 2.6
Seite 113/114 01.07.05
• Sofern Table-Objekte auf einer Maske vorhanden sind, kann man per Basic auch die Informationen auswerten, ob von einem Datensatz zu einem anderen gewechselt oder ob der aktuelle Satz gespeichert wird. Die Ansprungmarken lauten • :Tabellenobjektname.Scroll und • :Tabellenobjektname.Post Zusätzlich ist eine Systemdateneinstellung (im Textmodus einzugeben) erforderlich: DisableTabmessages=Nein Bisher wurden diese Ansprungmarken nur im Einzelfalle bekanntgegeben, da sie die BDE verwenden - diese soll ja irgendwann entfallen - und dann eine andere Lösung gefunden werden muss. Desweiteren gibt es in der 2.0 die Trigger zum Reagieren auf Datenbankereignisse (Vorteil: laufen direkt in der Datenbank ab, Nachteil: kein Dialog mit Bediener möglich). Hier muss man auf "Verträglichkeit" prüfen. Bitte bei Verwendung dieser beiden Ansprungmarken ausreichende Tests durchführen! Bitte beachten: - Scroll erfolgt auch bei Aufruf einer Maske, wenn die Tabelle geöffnet wird - Post erfolgt im BeforePost, der Datensatz ist noch im Editmodus und wird dann gepostet. Der neue Feldinhalt eines geänderten Feldes ist über die Syntax Tabellenobjektname.Feldname noch nicht verfügbar. Falls erforderlich muss dieser aus dem betreffenden Maskenelement (@Objektname.Objekteigenschaft) ausgelesen werden.
Beispiel zum Test in Kundenstamm-Maske: :TA_Kund.Scroll show("SCROLL " + TA_KUND.Kundennr); exit; :TA_Kund.Post show("POST " + TA_KUND.Kundennr); TA_Kund.Homepage := "WWW.HALLO.DE"; exit;
• Reportdesigner unter „Programm“. Das GDI-Basic-Programm wird beim Ausdruck des Reports „abgearbeitet“ • Reportdesigner in einer Expression. Das Programm wird beim Ausdruck der Expression abgearbeitet. Das Ergebnis (result := ) wird an die Expression übergeben.
• Zugriff auf Daten per GDI-BASIC in Masken: In Masken benötigt man oftmals den Zugriff auf aktuelle in der Maske bereits "vorhandene" Daten. Das Erzeugen von Tabellenobjekten (Tables oder Queries) per CreateTable oder CreateSQL ist hierzu nicht erforderlich. Man kann auf die vorhandenen Objekte zugreifen. Sofern Tables verwendet werden, genügt die Syntax "Tabellenname.Feldname" zu Zugriff auf den aktuellen Datensatz (Beispiel: KD := Kunden.Kundennr) oder "Objektname.Feldname" (z.B. KD := TA_Kund.Kundennr). Für Aktionen/Funktionen verwendet man wie gewohnt ein vorangestelltes %-Zeichen (%TA_Kund.Edit). Ein Erzeugen eines Tabellenobjektes per GDI-BASIC ist nicht erforderlich. Der direkte Zugriff auf Daten, die durch Queries bereitgestellt werden, ist ab Version 2.0.1.18 möglich über "Objektname.Feldname" (z.B. S := QU_1.Seriennr). Belegbearbeitungsmasken ab Version 2.0.3.2 (Sonderfall Belegpos als ASTA-Tabelle), Zugriff auf aktuelle Belegposition möglich über TA_POS.Feldname (z.B. S := TA_POS.Artikelnr). Diese Vorgehensweise über "Objektname.Feldname" empfiehlt sich somit ab 2.0.3.2 generell. • Zugriff auf Maskenelemente (Maskenoberfläche) per GDI-BASIC: Objekte können über die Syntax "@Objektname.Objekteigenschaft" angesprochen werden. Beispiel: @TpsLabel1.Caption := "Hallo";
GDI-BASIC 2.6
Seite 114/114 01.07.05
Beim Setzen von (konstanten) Properties muss man beachten, dass hier Hochkommata gesetzt werden müssen. Beispiel: if Bedingung = "1" then @PN_Kopf.Color := "clMaroon"; else @PN_Kopf.Color := "clBtnFace"; endif;
Gleiches gilt für das Auslesen solcher Properties, z.B. bei der Abfrage des Zustandes von CheckBoxen. Hier ist auch Gross-/Kleinschreibung zu beachten ("false" ist nicht gleich "False" !!) Beispiel: S := @CH_Hinweis.checked; if S = "False" then show("FALSCH"); else show("WAHR"); endif; exit;
• Was kann mit GDI-BASIC nicht erreicht werden: • Aufruf von Masken !AB 2.0.1.6 geht’s mit Startdialog!! • Ausführen von Aktionen beim Löschen von Datensätzen. In 2.0.x ist dies mit Triggern in der Datenbank möglich.