Robert W.B. Linn´s Hobby Homepage Kontakt  ::  Impressum

TurboDB Studio Tipps

20.03.2011 :: Autor: Robert W.B. Linn :: http://www.rwblinn.de
Auswahl:

_Information
Top
TurboDB Studio Tipps zusammengestellt von Robert W.B. Linn.

Der Autor übernimmt keine Haftung für den Inhalt.

Information zu TurboDB Studio TurboDB Studio eine vollständige Entwicklungsumgebung für Windows-Applikationen auf Basis von TurboDB. Hersteller dataWeb GmbH http://www.dataweb.de TurboDB Studio Produktbeschreibung http://www.dataweb.de/de/produkte/datenbank_ide.html TurboDB Studio Handbuch http://www.turbodb.de/de/support/dokumentation/turbodbstudio/index.html TurboDB Studio Supportforum http://www.dataweb.de/webapps/forum/TopicsList.aspx?ForumId=1 Datenbanken und SQL http://www.dataweb.de/de/support/datenbanken_und_sql.html --- Information TurboDB VCL TurboDB für VCL ist eine eingebettete Datenbank für Delphi und C++ Builder. TurboDB VCL Produktbeschreibung http://www.dataweb.de/de/produkte/delphi_datenbank.html TurboDB VCL Tipps zusammengestellt von Robert W.B. Linn In Vorbereitung --- eine Vorabversion auf Anfrage
_ToDo
Top
ToDo-Liste Stand: 20-03-2011

• TurboPL
  * FileNr weitere Beispiele
• Updates aus dataWeb Foren
• TurboDB VCL für Delphi Beispiele und Verweise
• Alte VDP Einträge entfernen




Anwendung

SingleFile Datenbank in eine Directory Datenbank umstellen
Anwendung/SingleFile Datenbank in eine Directory Datenbank umstellen
Top
Kurzanleitung
=============
1.Compound File Viewer aufrufen
2.Tabellen mit dem Compound File Viewer aus dem SingleFile extrahieren
3.Neues Projekt anlegen
4.Datenbankverzeichnis hinzufügen
5.Formulare, Module, Berichte, etc hinzufügen

Ausführlich
=============
1.Neuen Ordner anlegen, in den die Tabellendateien hinein kopiert werden sollen,
2.Compound File Viewer aus den Windows-Startmenü aufrufen
(Programmgruppe "TurboDB Studio")
3.Die *.tdbd-Datei (SingleFile Datenbank) des Projektes öffnen,
4.In der Buttonleiste den rechten Button "Extract Directory" klicken und den
eingangs angelegten Ordner (oder den Projektordner) wählen,
5.Den Compound File Viewer beenden.

Nachdem die Tabellen aus dem SingleFile extrahiert wurden, dann
a/ mit TurboDB Studio ein neues Projekt anlegen und dabei die unterste Option
"Datenbank auswählen" aktivieren.
b/ das Projektverzeichnis wählen und alle übrigen Dateien zum Projekt hinzufügen

Startgeschwindigkeit TDB-Studio-Anwendung
Anwendung/Startgeschwindigkeit TDB-Studio-Anwendung
Top
Die Anwendung liegt auf einem Server und die PROJEKT.EXE wird direkt von dort
gestartet.
Negativ auf die Startgeschwindigkeit:
(-) Ein sehr großes Logo
(-) Die Anzahl von Elementen in Formularen hat einen Einfluss darauf wie
schnell das Formular geöffnet wird und wie sich damit arbeiten lässt.
(=) Solange so ein Formular mir sehr vielen Feldern nicht gleich beim Start
automatisch geöffnet wird, hat das keinen Einfluss.
(=) Die Anzahl der Tabellen sollte keinen Einfluss haben.

Analyse zur Startgeschwindigkeit
• Startet die Anwendung auf dem betreffenden Rechner auch langsam wenn sie
komplett lokal gestartet wird?
• Starten andere, auf gleiche Weise übers Netzwerk gestartete Programme aus
dem betreffenden Rechner auch langsamer als gewohnt?
• Kommentieren Sie alle 'OnOpenProject' in Ihrem Code aus. Starten Sie die
Anwendung, schliessen Sie alle Fenster und dann die Anwendung. Wenn Sie jetzt
die Anwendung wieder starten, sollte beim Start weder ein Formular geöffnet
noch ein Makro ausgeführt werden.

Startet das Programm jetzt in der erwarteten Zeit, kann die Problemsuche auf
sich auf Programmcode konzentrieren:
Nacheinander alle auskommentierten Prozeduren wieder einkommentieren und dabei
das Programm einmal beenden und neu starten.

Ist der Programmstart immer noch zu langsam, sollten sich die Problemsuche auf
Windows und dessen Netzwerkeinstellungen konzentrieren:
• Besteht an dem Rechner schon eine Verbindung zum Server?
• Ist der Rechner ordnungsgemäß in die Domäne eingebunden?
• Ist der angemeldete Benutzer ein Mitglied der Domäne?
• Wie sieht es mit der Netzwerkauslastung aus?

TurboDB Studio als portable Anwendung
Anwendung/TurboDB Studio als portable Anwendung
Top
TurboDB Studio Anwendungen als "portable Anwendungen" einsetzen, d.h. zum
Beispiel direkt von einem USB-Stick startbar.
Frage
Wenn das Programm auf einem fremden PC gestartet wird, wird dann irgendwo auf
der Festplatte etwas abgespeichert oder ein Eintrag in die Registry gemacht?
Antwort
Es wird nichts auf die Festplatte oder in die Registry geschrieben.

Frage
Was ist mit der CFG-Datei.
Die befindet sich normalerweise nicht im Projekt-Verzeichnis sondern in einem
Unterverzeichnis von "Dokumente und Einstellungen".
Wenn das Projekt-Verzeichnis auf einem Stick abgespeichert wird, fehlt diese.
Wird die CFG-Datei dann am Zielrechner neu erzeugt?
Antwort:
Die CFG und die INI der Anwendung werden neu angelegt.

Somit können mit TurboDB Studio Datenbankanwendungen auf einem USB-Stick
ausgeliefert werden oder in ein beliebiges Verzeichnis kopieren werden.
Es sind keine Einträge in der Registry und keine weitere Installation nötig.

TurboDB Studio Eigene Dateien Verzeichnis ermitteln
Anwendung/TurboDB Studio Eigene Dateien Verzeichnis ermitteln
Top
Um das "eigene Verzeichnis" ermitteln zu können, wird eine DLLProc verwendet.

dllproc SHGetSpecialFolderPathW(owner: Integer; var path: String; csidl:
Integer; create: Integer): Integer Library 'shell32.dll';

Const CSIDL_PERSONAL = 5;

Procedure ZeigeEigeneDateienVerzeichnis;
Var CCRLF = Chr(13) + Chr(10);
Var CHDG  = "TurboDb Studio Eigene Dateien Verzeichnis";
Var CINF  = "Das TurboDB Studio Eigene Dateien Verzeichnis:";
Var CERR1 = "Fehler:";
Var CERR2 = "Das Eigene Dateien Verzeichnis konnte nicht ermittelt werden.";
Vardef sPath: string;
  ..#Pfad initialisieren
  sPath := NTimes(' ', 1024);
  ..#DLLProc aufrufen
  If SHGetSpecialFolderPathW(0, sPath, CSIDL_PERSONAL, 0) <> 0
    Message(CINF + sPath);
  Else
    Message(CERR1 + CCRLF + CERR2, CHDG);
  End;
Endproc;
Übersicht alle Systemvariablen
Anwendung/Übersicht alle Systemvariablen
Top
procedure Übersicht_Systemsvariable;
  Var CCRLF = Chr(13) + Chr(10);
  Var sMsg = "";

  sMsg := sMsg + "$heute: " + $heute+ CCRLF;
  sMsg := sMsg + "$jetzt: " + $jetzt+ CCRLF;
  sMsg := sMsg + "" + CCRLF;
  sMsg := sMsg + "$TDB-Pfad (Programmverzeichnis TS Bin Dateien): " + $TDB-Pfad + CCRLF;
  sMsg := sMsg + "$T-Eingabe (Globale Variable für Input): " + $T-Eingabe + CCRLF;
  sMsg := sMsg + "" + CCRLF;
  sMsg := sMsg + "$Seite (nur Datenbankjob): " + Str($Seite) + CCRLF;
  sMsg := sMsg + "$Zeile (nur Datenbankjob): " + Str($Zeile) + CCRLF;
  sMsg := sMsg + "G_alt (nur Datenbankjob): wird bei Gruppenwechsel (Steuerbefehl .GP) verwendet" + CCRLF;
  sMsg := sMsg + "G_neu (nur Datenbankjob): wird bei Gruppenwechsel (Steuerbefehl .GP) verwendet" + CCRLF;
  sMsg := sMsg + "" + CCRLF;
  sMsg := sMsg + "$Fehler: " + "nicht mehr verwenden, dafür Error" + CCRLF;
  sMsg := sMsg + "Error.Nummer: " + Str(Error.Nummer)+ CCRLF;
  sMsg := sMsg + "Error.Meldung: " + Error.Message+ CCRLF;
  sMsg := sMsg + "Error.Beschreibung: " + Error.Description+ CCRLF;
  Message(sMsg, "Übersicht der Systemvariablen - WICHTIG: Groß/Kleinschreibung beachten", 1);
endproc;

Unterscheidung von Null und Leer
Anwendung/Unterscheidung von Null und Leer
Top
Wie kann mit der Unterscheidung von Null und Leer geprüft werden,
ob eine Null eingetragen ist oder noch keine Eintragung erfolgt ist.

Lösungen:
1) Tabellensicht mittels Suchen mit Bedingung GetField(...) = "".
GetField liefert einen Leerstring oder "0" zurück.

2) Index auf das Integer Feld definieren.
Dann in der Tabellensicht Suchen, Integer Feld aufrufen.
Eingabefeld leer lassen.
Es wird der erste Eintrag angezeigt. Mittels F3 zum Nächsten usw...

3) Als Makro
MoveBegin($TESTTAB);
While ReadNext($TESTTAB)
  If GetField($TESTTAB, LabelNo($TESTTAB, "Testinteger")) = ""
    Message("Feld " + $TESTTAB.Teststring + " hat kein Wert");
  End;
End;

Windows Fehler Code mittels NET HELPMSG auslesen
Anwendung/Windows Fehler Code mittels NET HELPMSG auslesen
Top
procedure WindowsFehlerCode(nCode : Integer) : String;
..#windows fehlercode mittels "net helpmsg" ermitteln
..#ablauf:
..#net help msg mit fehlercode als parameter aufrufen.
..#ergebnis in eine datei speichern
..#datei auslesen und text als string zurueckgeben
..#test mittels:
..# Message( WindowsFehlerCode(151));
..##
  Var CWINCODEFILE = BaseDir + "wincode.txt"; .. oder "%TEMP%:\Test.txt"
  Var CERR1 = "Fehlercode konnte nicht ermittelt werden.";
  Vardef nRT : Integer;  ..#rueckgabe code
  Vardef nFH : Integer;  ..#filehandle
  Vardef sStr : String;  ..#hilfstring
  Vardef sCode : String; ..#fehlercode text

  sStr := GetEnv('Comspec') + ' /C  net helpmsg ' + Str(nCode) + ' > ' + CWINCODEFILE;
  nRT := Execute(sStr, 1, -1);
  If nRT <> 0
    Return CERR1
  End;
  nFH := Reset(CWINCODEFILE);
  If nFH = 0
    Return CERR1
  End;
  While NOT EOT(nFH)
    sStr := ReadLn(nFH);
    If sStr <> ""
      sCode := sCode + sStr;
    End;
  End;
  Close(nFH);
  ..#und die datei wieder löschen
  DelFile(CWINCODEFILE);
  ..#und den code wiedergeben
  sCode := sCode + " (" + Str(nCode) + ")";
  ..#nicht vergessen code umwandlung
  sCode := OEMToAnsi(sCode);
  Return sCode;
endproc;


Logo

Ein eigenes Logo erstellen
Anwendung/Logo/Ein eigenes Logo erstellen
Top
Die Datei LOGO.BMP im Programmverzeichnis durch eine eigene LOGO.BMP ersetzen.

Logo und Standardtext darstellen
Anwendung/Logo/Logo und Standardtext darstellen
Top
Der Standardtext erscheint erst nach Aufruf der kompilierten Anwendung.


Menüfunktionen

Hinweise VDP
Anwendung/Menüfunktionen/Hinweise VDP
Top
Menüpunkte und easy-Funktionen
NUR VDP
Für die meisten Menüpunkte gibt es entsprechende easy-Funktionen.
Probleme gibt es bei den Menüpunkten:
Bearbeiten|Einfügen
Der Inhalt der Zwischenablage läßt sich mit Clip2Text auslesen.

Ansicht|Alle Datensätze
Mit Sortierung oder SetSortOder

Menüpunkte in der generierte EXE-Datei
NUR VDP

Es können mehr als 10 Menüpunkte angelegt werden, allerdings werden diese abhängig vom verfügbaren Speicher aufgebaut.
Der verfügbare Speicher ist wiederum abhängig von
a/ Anzahl der Prozeduren in dem Modul woraus die Menüpunkte aufgebaut werden und
b/ von der Länge der Prozedurnamen.

Fazit:
Prozeduren die nicht in Menüpunkte verwendet werden mit einem dummy Parameter
versehen (Procedur myProc(nB : Real) und Prozedurnamen so kurz
(aber noch verständlich) halten.
Werden neue Prozeduren erstellt und danach die Menüstruktur im Formular
angepasst, kann es sein, daß abhängig vom verfügbaren Speicher,
Prozeduren "wegfallen" ohne einen Hinweis dass der Speicher nicht mehr ausreicht.
Der Menüpunkt ist aber noch da, allerdings ohne Funktion. also vorsicht!
Anwendungsupdates
Anwendung/Anwendungsupdates
Top
Folgende Dateien bei Anwendungsupdates aktualisieren

Formulare:
Alle Formulare aktualisieren.

Module:
Bei TurboDB Studio werden alle Module und Jobs in eine Datei übersetzt.
Die PRG-Datei aktualisieren.

Berichte:
Alle Berichte aktualisieren.

Projekt geändert (Elemente hinzugefügt, gelöscht, umbenannt):
Projektdatei aktualisieren.


Berichte

Aufrufe von TurboPL-Funktionen
Berichte/Aufrufe von TurboPL-Funktionen
Top
Aufrufe von TurboPL-Funktionen müssen (pro Aufruf) in eckigen Klammern []
gesetzt werden, sonst werden die intenen Funktionen der Bericht-Komponente
benutzt:

[Str( [SUM( [TESTTAB.Wert] )] , 1, 2)]


Bit Operationen

Beispiele Bit Operationen
Bit Operationen/Beispiele Bit Operationen
Top
Encode und Decode RGB
=====================
Procedure EncodeRGBA(R, G, B, Alpha: integer): Integer;
  Return BitAnd(R, 255) + BitShl(BitAnd(G, 255), 8) + BitShl(BitAnd(B, 255), 16) + BitShl(BitAnd(Alpha, 255), 24);
Endproc

Procedure DecodeRGBA(Color: Integer; Var R, G, B, Alpha: Integer);
  R := BitAnd(Color, 255);
  G := BitAnd(BitShr(Color, 8), 255);
  B := BitAnd(BitShr(Color, 16), 255);
  Alpha := BitAnd(BitShr(Color, 24), 255);
Endproc

Blob

Bild in Datenbankjob anzeigen
Blob/Bild in Datenbankjob anzeigen
Top
Ein Datenbankob ist nur in der Lage Bilder aus Tabellenfeldern auszugeben.
Dazu ein Blob-Feld zB. innerhalb einer Systemtabelle (SYSTEM) hinzufügen und
dieses Feld mit dem Bild belegen.

Procedure ImportGrafik;
..#importiert eine grafikdatei in einem systemfeld vom typ blob
..#die systemtabelle hat nur 1 datensatz.
..#diese muss vorhanden sein, befor diese prozedur ausgeführt wird.
  T-Eingabe := "";
  If ChoosePicture("Wählen Sie eine Grafikdatei aus", 127)
    ModifyRec(SYSTEM);
    EmbedBlob(SYSTEM.MeinBild, T-Eingabe);
    PostRec(SYSTEM);
  End;
Endproc;

Alternativ:
Erstellen eines Berichtes und ein Berichtfeld verwenden.

Blob Eingenschaft FileName
Blob/Blob Eingenschaft FileName
Top
Externe Bilddatei an einem Image zuweisen.

Vardef sFileName : String;    ..externe bilddatei
Vardef imgBild: Image;        ..das bild

If ChooseFile('Bild laden...', 'Alle Dateien|*.*|JPG-Grafikdateien|*.jpg|JPEG-Grafikdateien|*.jpeg|Bitmap-Grafikdateien|*.bmp|PNG-Grafikdateien|*.png|GIF-Grafikdateien|*.gif|', sFileName)
  imgBild := FindControl("Bildbetrachter") as Image;
  imgBild.FileName := sFileName;
End;

Blob von ein Blobfeld in ein anderes Blobfeld kopieren
Blob/Blob von ein Blobfeld in ein anderes Blobfeld kopieren
Top
procedure btnBlobKopierenBeimAnklicken;
..#kopiert inhalt eines blob feldes in ein andere blobfeld
..#idf: von feld blob1 zum feld blob2 der tabelle testblob
..##
  Var CHDG = "Blob kopieren";
  Var sTempFile = BaseDir + "\tempblob.bmp";
  Vardef nRNo : Integer;
  Vardef nRT : Integer;

  If FileSize($TESTBLOB) = 0
    Message("Fehler: Datensatz ist nicht vorhanden!", CHDG);
    Return
  End;
  Try
    nRNo := ReadRec($TESTBLOB, RecNo($TESTBLOB))
  Except
    Message(Error.Message, CHDG);
    Return
  End;
  ..#
  If nRNo = 0
    Message("Fehler: Datensatz kann nicht gelesen werden!", CHDG);
    Return
  End;
  ..#Blob1 in eine Datei kopieren
  ..#vorher erst die tempdatei löschen (falls vorhanden)
  DelFile(sTempFile);
  ..#blob kopieren
  nRT := CopyBlob($TESTBLOB.blob1, sTempFile);
  If nRT <> 0
    Message("Fehler: Temporäre Blobdatei kann nicht erstellt werden!", CHDG);
    Return
  End;
  ..#so kann auch geprüft werden ob die tempdate da ist
  If Not IsFile(sTempFile)
    Message("Fehler: Temporäre Blobdatei kann nicht erstellt werden!", CHDG);
    Return
  End;
  ..#blob jetzt aus der tempdatei in das zweite blobfeld laden
  Try
    ReadRec($TESTBLOB, nRNo);
    EmbedBlob($TESTBLOB.blob2, sTempFile);
    WriteRec($TESTBLOB, nRNo);
  Except
    Message(Error.Message, CHDG);
    Return
  End;
  ..#temp datei löschen
  DelFile(sTempFile);
  ..#ansicht aktualisieren
  Refresh;
  ..#und meldung Ok ausgeben
  Message("Blob erfogreich kopiert!", CHDG);
endproc;

Blob von ein Blobfeld in ein anderes Blobfeld kopieren - Kurz
Blob/Blob von ein Blobfeld in ein anderes Blobfeld kopieren - Kurz
Top
..#blob in eine datei speichern
CopyBlob($TABELLE1.Blobfeld, Dateiname);
..#blob aus der datei in die andere tabelle einlesen
EmbedBlob($TABELLE2.Blobfeld, Dateiname);
..#datei löschen
DelFile(Dateiname);
..#anzeige im formular aktualisieren
Refresh;
Grafiken aus einem Verzeichnis in einem Blobfeld einlesen
Blob/Grafiken aus einem Verzeichnis in einem Blobfeld einlesen
Top
Procedure btnTextBlobVerzeichnisEinlesenBeimAnklicken;
..##
  Var CHDG = "Grafiken einlesen";

  Vardef nRT : Integer;   ..#return code operationen
  Vardef nCnt : Integer;   ..#return code operationen
  Vardef sFolder : String;..#folder welches gelesen werden soll
  Vardef FName, FAttributes, FFolder: string;
  Vardef FSize: Integer;
  Vardef FDate: Date;
  Vardef FTime: Time;

  ..#init
  nCnt := 0;
  sFolder := BaseDir;
  ClearDat($TESTBLOB);
  ..#verzeichnis wählen
  nRT := ChooseFolder("Verzeichnis wählen", sFolder);
  If nRT = 0
    Message("Abbruch durch den Benutzer.", CHDG);
    Return
  End;
  nRT := FindFirstFile(sFolder + "\*.*", "DHS", FName, FSize, FDate, FTime, FAttributes, FFolder);
  While nRT = 0
    If Pos(".jpg", Lower(FName)) > 0 Or Pos(".bmp", Lower(FName)) > 0
      Try
        ShowWait("Erstelle... " + Lower(sFolder + FName));
        NewRec($TESTBLOB);
        $TESTBLOB.blobname := Lower(sFolder + FName);
        EmbedBlob($TESTBLOB.blobinhalt, sFolder + FName);
        PostRec($TESTBLOB);
        nCnt := nCnt + 1;
      Except
        Message(Error.Message, "Fehler - " + CHDG);
      End;
    End;
    nRT := FindNextFile(FName, FSize, FDate, FTime, FAttributes, FFolder);
  End;
  CloseFindFile;
  Hidewait;
  Message(Str(nCnt) + " Grafiken aus dem Verzeichnis " + sFolder + " eingelesen." , "Info - " + CHDG);
EndProc;


Datenbankjob

Ausgabe Text zentriert in einem Rahmen
Datenbankjob/Ausgabe Text zentriert in einem Rahmen
Top
..#Rahmen mit Text zentriert
.HL
$(VL "Mein Text zentriert in einem Rahmen" C_Form ToMargin VL)
.HL
.EVL

Ausgabe-Reihenfolge der Datensatzausgabe mit DE 1 umkehren
Datenbankjob/Ausgabe-Reihenfolge der Datensatzausgabe mit DE 1 umkehren
Top
Für TurboDB Studio Version 4:
Die aktuelle Job-Engine und die Datenbank-Engine unterstützen dieses Feature
nicht. Folgende Möglichkeiten zur Nachbildung:
Möglichkeit 1:
Definition einen neuen Index mit absteigender statt aufsteigender bzw.
aufsteigender statt absteigender Reihenfolge und diese als Sortierung angeben.
Das hat auch den positiven Nebeneffekt, daß Sie diese Sortierungen auch
in Formularen nutzen können.

Möglichkeit 2:
Eine andere Möglichkeit wäre das Kommando "SortBy", mit dem eine Sortierung
definieren können, bspw.
.SortBy Name, Vorname
um nach Name/Vorname in aufsteigender Reichenfolge zu sortieren oder
.SortBy -Name, -Vorname
um nach Name/Vorname in absteigender Reichenfolge zu sortieren.
Dieses Kommando legt einen temporären Index an, der wieder gelöscht wird
sobald das Projekt geschlossen wird.

Die bessere Möglichkeit ist die Erste
(solange die Anzahl von maximal 15 Indexen pro Tabelle nicht überschreiten),
denn bei größeren Tabellen kann das Erzeugen eines (temporären) Index
schon mal dauern - und das würde jedes mal erfolgen.
Bild BLOB Feld ausgeben
Datenbankjob/Bild BLOB Feld ausgeben
Top
Bei der Ausgabe muss die Bildbreite angegeben werden.
Beispiel: $(MeinBild:50)

Datenbankjob Beispiel - Kurz
Datenbankjob/Datenbankjob Beispiel - Kurz
Top
..#G R U P P E
.GP 1
..#gruppenkopf ausgeben
.GroupHeader $TABELLE.Titel
$(@a10b "")
.If G_Neu = ""
$(@a10b "<Kein Thema>")
.Else
$(@a10b G_Neu)
.End
$(@a8n $TABELLE.Beschreibung)
.HL
..die linien verwischen nach seitenumbruch. hier einen trick das zu beheben
.If $SYSTEM.DruckenNotizenGruppiertMitCR = JA
$(@a8n /)
.End
..#gruppenfuß ausgeben.
..#eignet sich sehr gut für seitenumbruch nach gruppenwechsel
.GroupFooter
.If $SYSTEM.DruckenNotizenGruppiertMitCR = JA
.PA
Datenbankjobname ermitteln
Datenbankjob/Datenbankjobname ermitteln
Top
Message(GetCompleteObjectName(Project.adressen.Adressenliste));
liefert
ADRESSEN.Adressenliste

Mittels Run könnte diesen Datenbankjob ausgeführt werden:
Run(GetCompleteObjectName(Project.adressen.Adressenliste));

In den Projekteigenschaften wurde diese Datenbankjob wie folgt definiert:
Tabelle: ADRESSEN
Pfad: D:\Daten\tdbstudio\projekte\ropav\ber\ADRESSEN-Bericht.ber
Titel: Adressenliste

Beispiel als Prozedur:

procedure Adressenliste_Drucken
  vardef sJob : String;
  sJob := GetCompleteObjectName(Project.ADRESSEN.Adressenliste));
  If sJob <> ""
    Drucken(sjobName);
  Else
    Message("Fehler: Jobname konnte nicht ermittelt werden!");
  End;
Endproc

Dezimalpunkt in Datenbankjobs
Datenbankjob/Dezimalpunkt in Datenbankjobs
Top
Voreinstellung
In OnOpenProject mit SetNumberFormats als Dezimaltrennzeichen den
Punkt eingestellen.

Ausgabe im datenbankjob:
SetNumberFormats bezieht sich auf die Funktion "Str".
Das ist die einzige Möglichkeit, wie den Dezimalpunkt in DruckJobs
beeinflussen werden kann:
$(Str(Tabelle.FloatFeld, 1, 2, "", "", "."))
Fehlermeldung Illegale Indexdefinition
Datenbankjob/Fehlermeldung Illegale Indexdefinition
Top
In nachfolgenden Programmfragment erscheint die Fehlermeldung:
"Illegale Indexdefinition"

Beispiel Anhand Datenbankjob
.Sub Topic.Titel
$(TOPICS.tTitel)
.Do GotoXY(SYSTEM.sPrnPO...)
.Endsub Titel

Die Fehlerursache ist die Verwendung der Angabe SYSTEM.sPrnPO.
Die Angabe der SYSTEM-Tabelle.

Abhilfe

.Var nTmp = $SYSTEM.sPrnPO
.Sub Topic.Titel
$(TOPICS.tTitel)
.Do GotoXY(nTmp, ...)
Fonts definieren und aufrufen
Datenbankjob/Fonts definieren und aufrufen
Top
..#Fonts definieren
.FONT a6n = Arial, 6, n
.FONT a6b = Arial, 6, b
.FONT a8b = Arial, 8, b
.FONT a8i = Arial, 8, i
.FONT a8n = Arial, 8, n
.FONT a10n = Arial, 10, n
.FONT a10i = Arial, 10, i
.FONT a10b = Arial, 10, b
.FONT a10u = Arial, 10, u
.FONT a10bi = Arial, 10, bi
.FONT a10bu = Arial, 10, bu
.FONT a10ui = Arial, 10, ui
.FONT a12n = Arial, 12, n
.FONT a12b = Arial, 12, b
.FONT a12i = Arial, 10, i
.FONT a14n = Arial, 14, n
.FONT a16b = Arial, 16, b
.FONT a20b = Arial, 20, b
.FONT a24b = Arial, 24, b

..#Beispiel Aufrufe
$(@a8n "TurboPL Zusatzreferenz")
$(@a12b "Makro Übersicht" C_Form ToMargin)

Fonts in einem Datenbankjob definieren
Datenbankjob/Fonts in einem Datenbankjob definieren
Top
..#Fonts
.FONT a6n = Arial, 6, n
.FONT a6b = Arial, 6, b
.FONT a8b = Arial, 8, b
.FONT a8i = Arial, 8, i
.FONT a8n = Arial, 8, n
.FONT a10n = Arial, 10, n
.FONT a10i = Arial, 10, i
.FONT a10b = Arial, 10, b
.FONT a10u = Arial, 10, u
.FONT a10bi = Arial, 10, bi
.FONT a10bu = Arial, 10, bu
.FONT a10ui = Arial, 10, ui
.FONT a12n = Arial, 12, n
.FONT a12b = Arial, 12, b
.FONT a12i = Arial, 10, i
.FONT a14n = Arial, 14, n
.FONT a16b = Arial, 16, b
.FONT a20b = Arial, 20, b
.FONT a24b = Arial, 24, b

Fußzeile mit $Heute - $Jetzt - $Seite
Datenbankjob/Fußzeile mit $Heute - $Jetzt - $Seite
Top
In eine Fußzeile (Footer) $heute / $today, $jetzt / $Now und $Seite verwenden.

..#Fußzeile
.Footer
.HL
$(@a8n "Ausgegeben am " + DateStr(ToDay) + " um " + TimeStr(Now))
$(@a8n "Seite " + $Seite R_Form ToMargin)

Fußzeile mit Linie oberhalb und links Datum+Zeit und rechts Seitenzahl
Datenbankjob/Fußzeile mit Linie oberhalb und links Datum+Zeit und rechts Seitenzahl
Top
..#Fußzeile
.Footer
.HL
$(@a8n "Ausgegeben am " + DateStr(ToDay) + " um " + TimeStr(Now))
$(@a8n "Seite " + $Seite R_Form ToMargin)

Kopfzeile mit Rahmen und zwei Textbausteine links und rechts oberhalb
Datenbankjob/Kopfzeile mit Rahmen und zwei Textbausteine links und rechts oberhalb
Top
.HE 1
.Header
$("Text Links" "Text Rechts" R_Form ToMargin)
.HL
$(VL KOPFZEILE C_Form ToMargin VL)
.HL
.EVL

Seitenbreite ermitteln
Datenbankjob/Seitenbreite ermitteln
Top
..#Seitenbreite Variabele (pagewidth)
.Var nPW = 0
..#Seitenbreite errechnen
..#volle seitenbreite - rand links - rand rechts
..#Pagewidth (W) - MarginRight(MR) - PageOverall(PO)
.Do nPW := GetPara("PW") - GetPara("MR") - GetPara("PO")

Tabelle mit Einstellungen verwenden
Datenbankjob/Tabelle mit Einstellungen verwenden
Top
Es ist sinnvoll eine Tabelle mit Einstellungen für Ihr Projekt zudefinieren,
z.B. eine Tabelle SYSTEM.
Diese Tabelle kann dann u.a. Einstellungen für Berichte(Reports) enthalten.
Diese Einstellungen können innerhalb eines Datenbankjobs
wie folgt gesetzt werden:

.REPORT
.PROLOG
..#Systemtabelle lesen - enthält nur einen Datensatz
.DO ReadRec(SYSTEM, 1)
..#
..#Werte aus der Systemtabelle mittels SetPara zuweisen
..#PL und PO sind Datenbanlfelder vom Typ Integer
.DO SetPara(".PL"+STR($SYSTEM.PL)+", PO"+STR($SYSTEM.PO))
...


DO

DO in Datenbankjobs definieren
Datenbankjob/DO/DO in Datenbankjobs definieren
Top
Anhand eines Beispiels zur Erstellung eine HTML-Datei
  ..#
  ..#HTMLFileCreate
  ..#
  .Procedure HTMLFileCreate(sFile : String; sTitel : string);
  ..#legt eine html-datei an
  .VarDef nFH : Real;
  .If nFH :=Rewrite(sFile)
  .Do WriteLn(nFH, "<HTML>")
  .Do WriteLn(nFH,"<!-- Copyright: " + TABELLE.Copyright + " -->");
  .Do WriteLn(nFH,"<!-- Datei: " + sFile + " -->");
  .Do WriteLn(nFH,"<!-- Titel: " + ToHTML(sTitel) + " -->");
  .Do WriteLn(nFH,"<!-- Datum: " + DateStr(Today)+" "+TimeStr(Now)+" -->");
  .Do WriteLn(nFH,"<head>");
  .Do WriteLn(nFH, "<meta name='Generator' content='" +
ToHTML(TABELLE.Version) + "'>");
  .Do WriteLn(nFH, "<meta name='Author' content='" + ToHTML(TABELLE.Copyright)
+ "'>");
  .Do WriteLn(nFH, "<meta name='Description' content='" + ToHTML("") + "'>");
  .Do WriteLn(nFH, "<meta name='Keywords' content='" + ToHTML("KEYWORD") +
"'>");
  .Do WriteLn(nFH,"");
  .Do WriteLn(nFH,"<title>" + ToHTML(sTitel) + "</title>");
  .Do WriteLn(nFH,"</head>");
  .Do WriteLn(nFH,"<BODY>");
  .Do WriteLn(nFH,"<A NAME='top'> </A>");
  .Do Close(nFH)
  .Else
  .Do Message(sFile + " kann nicht erstellt werden.","Fehler",1)
  .ST
  .End
  .Endproc
  ..

und zur Schliessung eine HTML-Datei

  ..#
  ..#HTMLFileClose
  ..#
  .Procedure HTMLFileClose(sFile : String);
  .VarDef nFH : Real;
  .Do nFH := TAppend(sFile)
  .If nFH > 0
  .Do WriteLn(nFH, "<br>")
  .Do WriteLn(nFH, "<center><font size=-1>Erstellt mittels ANWENDUNG (c) <a
href='mailto:" + TABELLE.EMail +"'> " + ToHTML($TABELLE.Autor) + "</a> " +
DateStr(ToDay) + " " + TimeStr(Now) + "</font></center>");
  .Do WriteLn(nFH, "</BODY>")
  .Do WriteLn(nFH, "</HTML>")
  .Do Close(nFH);
  .End
  .Endproc
  ..

DO Zuweisung
Datenbankjob/DO/DO Zuweisung
Top
Wichtig ist die Verwendung von := anstatt =.
Es gibt keine Fehlermeldung bei der Verwendung von = und
man wundert sich warum kein Wert zugewiesen wurde.

Beispiel Datenbankjob
.DO nSelektion := $NOTIZEN.Laufende_Nummer

Dynamische Übergabe von Variablen in einem Module mittels
Datenbankjob/DO/Dynamische Übergabe von Variablen in einem Module mittels
Top
DO _"Execmacro(MODUL,Prozedur("+STR(real)+"))"

Mit DO dynamisch Ausdrücke auswerten und ausführen
Datenbankjob/DO/Mit DO dynamisch Ausdrücke auswerten und ausführen
Top
..#variable definieren der turbopl code enthält
Var sMsg = "Message('Hallo Welt')";
..#die variable sMsg DO zuweisen und ausführen.
..#Wichtig is der Unterstrich (_) vor DO

DO _sMsg;

..#Angezeigt wird das Meldungsfenster mit als Begrüßung Hallo Welt.

Epilog

Datenbankjob Anzahl Datensätze prüfen
Datenbankjob/Epilog/Datenbankjob Anzahl Datensätze prüfen
Top
Prüfen im Datenbankjob ob Datensätze vorhanden sind.
Wenn keine Datensätze gefunden wurde, dann gebe eine Meldung aus und
Job beenden.

..#
.Epilog
.If Count(TABELLE) = 0
.Do Message("Keine Datensätze vorhanden!", "Hinweis")
.ST
.End

Font

Datenbankjob Fonts definieren
Datenbankjob/Font/Datenbankjob Fonts definieren
Top
Fonts in einem Datenbankjob definieren
..#
..# Fonts
..#
.FONT a6n = Arial, 6, n
.FONT a6b = Arial, 6, b
.FONT a8b = Arial, 8, b
.FONT a8i = Arial, 8, i
.FONT a8n = Arial, 8, n
.FONT a10n = Arial, 10, n
.FONT a10i = Arial, 10, i
.FONT a10b = Arial, 10, b
.FONT a10u = Arial, 10, u
.FONT a10bi = Arial, 10, bi
.FONT a10bu = Arial, 10, bu
.FONT a10ui = Arial, 10, ui
.FONT a12n = Arial, 12, n
.FONT a12b = Arial, 12, b
.FONT a12i = Arial, 10, i
.FONT a14n = Arial, 14, n
.FONT a16b = Arial, 16, b
.FONT a20b = Arial, 20, b
.FONT a24b = Arial, 24, b

..#
..# Beispielaufrufe definierte Fonts
..#

$(@a8n "TurboPL Zusatzreferenz")
$(@a12b "Makro Übersicht" C_Form ToMargin)



GetPara

GetPara
Datenbankjob/GetPara/GetPara
Top
Wert eines Steuerbefehls ermitteln. Siehe [Getpara]


GroupHeader und Footer

Verwendung
Datenbankjob/GroupHeader und Footer/Verwendung
Top
GroupHeader/Footer soll anstatt. group oder .gruppe verwendet werden um in
Datenbankjobs Gruppen aufzubauen.

Beispiel

..#
..# G R U P P E
..#
.GP 1
..#gruppenkopf ausgeben
.GroupHeader $NOTIZEN.Thema.Thema
$(@a10b "")
.If G_Neu = ""
$(@a10b "<Kein Thema>")
.Else
$(@a10b G_Neu)
.End
$(@a8n $NOTIZEN.Thema.Kurzbeschreibung)
.HL
..die linien verwischen nach seitenumbruch. hier einen trick das zu beheben
.If $SYSTEM.DruckenNotizenGruppiertMitCR = JA
$(@a8n /)
.End
..#gruppenfuß ausgeben. eignet sich sehr gut für seitenumbruch nach gruppenwechsel
.GroupFooter
.If $SYSTEM.DruckenNotizenGruppiertMitCR = JA
.PA
.End

Punktbefehle

Punktbefehle werden dynamisch gesetzt.
Datenbankjob/Punktbefehle/Punktbefehle werden dynamisch gesetzt.
Top
Punktbefehle die aber währendder Übersetzung schon bearbeitet werden,
können mittels SetPara nicht mehr zuverläßig bearbeitet werden.

Steuerbefehl ST in Datenbankjobs EPILOG Teil verwenden
Datenbankjob/Punktbefehle/Steuerbefehl ST in Datenbankjobs EPILOG Teil verwenden
Top
.Epilog
..#wenn count 0 liefert, eine meldung ausgeben und job beenden
.If Count(TABELLE.Laufende_Nummer) = 0
.Do Message("Keine Einträge gefunden!", "Hinweis")
.ST
.End

Steuerbefehl ST in Datenbankjobs PROLOG Teil verwenden
Datenbankjob/Punktbefehle/Steuerbefehl ST in Datenbankjobs PROLOG Teil verwenden
Top
.Report
.Prolog
.PRIMTABLEIS TABELLE
.ZUGRIFF TABELLE.ID


SetPara

Illegalen Punktbefehle
Datenbankjob/SetPara/Illegalen Punktbefehle
Top
Bei illegalen Punktbefehle wird SetPara nicht ausgeführt.
Es gibt keine Fehlermeldung.

Punktbefehle werden dynamisch gesetzt.
Datenbankjob/SetPara/Punktbefehle werden dynamisch gesetzt.
Top
Punktbefehle die aber währendder Übersetzung schon bearbeitet werden, können mittels SetPara nicht mehr zuverläßig bearbeitet werden.

Steuerbefehle
Datenbankjob/SetPara/Steuerbefehle
Top
Steuerbefehle setzen. Siehe [SetPara]

Syntax SetPara
Datenbankjob/SetPara/Syntax SetPara
Top
SetPara(Zeichenkette: String);
Parameter in einem Job dynamisch setzen.

Tabelle mit Einstellungen
Datenbankjob/SetPara/Tabelle mit Einstellungen
Top
Es ist sinnvoll eine Tabelle mit Einstellungen für Ihr Projekt zudefinieren, z.B. Tabelle SYSTEM.
Diese Tabelle kann dann u.a. Einstellungen für Reports enthalten. DieseEinstellungen können innerhalb eines Datenbankjobs wie folgt gesetzt werden:

.REPORT
.PROLOG
.DO ReadRec(SYSTEM, 1)
.DO SetPara(".PL"+STR(SYSTEM.EL)+", PO"+STR(SYSTEM.ER))
...



SUB

Fehlermeldung Illegale Indexdefinition
Datenbankjob/SUB/Fehlermeldung Illegale Indexdefinition
Top
In nachfolgenden Programmfragment erscheint die Fehlermeldung:
"Illegale Indexdefinition"

Beispiel Anhand Datenbankjob

.Sub Topic.Titel
$(TOPICS.tTitel)
.Do GotoXY(SYSTEM.sPrnPO...)
.Endsub Titel

Die Fehlerursache ist die Verwendung der Angabe SYSTEM.sPrnPO.
Die SYSTEM-Tabelle stört VDP.
Lösung:

.Var nTmp = SYSTEM.sPrnPO
.Sub Topic.Titel
$(TOPICS.tTitel)
.Do GotoXY(nTmp, ...)
.Endsub Titel

Syntax Sub
Datenbankjob/SUB/Syntax Sub
Top
SUB
SUB [Selektion]
 ..Anweisungen
ENDSUB [Indexdefinition]



Datenstrukturen

Erweiterung der Datenstruktur bei einem VDP-Projekt, wobei VDP nicht am Rechner installiert ist
Datenstrukturen/Erweiterung der Datenstruktur bei einem VDP-Projekt, wobei VDP nicht am Rechner installiert ist
Top
Die alte Tabelle in eine temporäre TDB-Tablle exportieren.
Dann eine leere Tabelle mit der neuen Datenstruktur in das Projekt kopieren.
Schließlich einen Import der temp. TDB-Tabelle durchführen;
"Felder nach Name zuweisen" wählen und den Import starten.
Dabei bleiben die alten Auto-Nummern erhalten.

Dabei nicht vergessen, die Index-Dateien zu sichern (*.CIN !), ebenso
die von der exportierten Datei benutzten Relationsdateien
(falls Relationsfelder enthalten).

NUR für VDP

Debug


Drucken

Druckvorschau verwenden aus einem Formular verwenden und das Formular danach schließen
Drucken/Druckvorschau verwenden aus einem Formular verwenden und das Formular danach schließen
Top
Die Anwendung hat ein Hauptformular.
Angekoppelte Datnsätze sollen in eine Druckvorschau gezeigt werden.
Dazu wird ein zweites Formular aufgerufen, welches die Druckvorschau zeigt.
Um dieses zu ermöglichen, muss DataWnd verwendet werden.
Hintergrund:
CloseWnd bezieht sich immer auf das aktive Datenfenster, in diesem Fall
liegt aber das Druckvorschau-Fenster ganz oben.
CloseWnd muss gezielt für das betreffende Datenfenster aufgerufen werden.

Procedure DruckeBericht;
VarDef nRec : Integer;
VarDef wnd : DataWnd;
  nRec := RecNr(AUFTRAG);
  If nRec > 0
    ActivateForm ("AUFTRAG.Auftrag");
    wnd := FindDataWnd("AUFTRAG.Auftrag");
    Delmarks(AUFTRAG);
    SetMark( AUFTRAG,RecNr(AUFTRAG));
    Access(AUFTRAG,"Markierung");
    Attach;
    Drucken("AUFTRAG.Jobname");
    wnd.closewnd;
End

Formulare

ComboBox bei Auswahl Makro ausführen
Formulare/ComboBox bei Auswahl Makro ausführen
Top
Ein Formular ComboBox hat folgende Einträge in der Werteliste:
Berlin, Hamburg, München usw.
Wenn nun Hamburg angeklickt wird, soll ein Makro ausgeführt werden.
Lösung:
1. Im Formulareditor die ComboBox anklicken
2. Im Eigenschafts-Bereich unter "BeimÄndern", "Neues Makro" auswählen
3. In dieses ein Makro bsw. Message("BeimÄndern (Formular ComboBox)") eintragen.
4. Alles speichern und neu übersetzen
5. Das Formular im 'normalen' Modus öffnen.

Wird in der ComboBox einen anderen Wert ausgewählt, erscheint ein
Meldungsfenster mit dem Text "BeimÄndern (Formular ComboBox)".

Dynamische Ausdrücke bei Nachschlagefilter
Formulare/Dynamische Ausdrücke bei Nachschlagefilter
Top
Bei Nachschlagefiltern, verwendet bei Nachschlagefelder, sind nur
einfache statische Ausdrücke möglich.
Wird eine dynamische Lösung benötigt, muss die Funktion BeimÖffnen des
Nachschlage-Formulares zu implementieren.
Editfeld Gültigkeitsbedingung
Formulare/Editfeld Gültigkeitsbedingung
Top
Procedure Edit1Gültigkeitsbedingung : Integer;
..#ein integerfeld sollte den wert 5 enthalten
..#falls nicht wird eine ungültigkeitsmeldung ausgegeben
..#die ungültigkeitsmeldung ist im formular unter feldeigenschaften definiert
..#Feld Edit1 Ungültigkeitsmeldung:
..#"Bitte den richtigen Wert von 5 eingeben."
..#Feld Edit1 Gültigkeitsbedingung:
..#Edit1Gültigkeitsbedingung
..#Rückgabe:
..#0 = ungültig; 1 = gültig
  ..#eingegeben wert prüfen
  If $TESTTAB.Testinteger <> 5
    ..#wert ist nicht 5, dann 0 = ungültig zurückgeben
    Return 0
  Else
    ..#wert ist 5, dann 1 = gültig zurückgeben
    Return 1
  End;
EndProc;
Eingebettete Tabelle Makro ausführen
Formulare/Eingebettete Tabelle Makro ausführen
Top
Im Formular Kunden ist eine eingebette Tabelle Termine mit folgenden
Datensätzen: Termin 1, Termin 2, Termin 3 usw.
Wenn nun Termin 2 angeklickt wird sollte ein Makro ausgeführt werden.
Lösung:
1.Im Formulareditor die eingebettete Tabelle doppelklicken um
den Spalteneditor zu öffnen.
2.In der Liste der Spalten die ComboBox-Spalte wählen und
die Option Daten wählen.
3.Im Eigenschaften-Bereich beim Eintrag "BeimÄndern" ein "Neues Makro" wählen.
4.Im Hintergrund wurde schon im Makroeditor ein Makro angelegt, in
dem ein Befehl einegtrahen wird.
Beispiel: Message("BeimÄndern (Datengrid ComboBox)"
5.Formular speichern, neu übersetzen und das Formular im 'normalen' Modus öffnen.
6.Wenn in der ComboBox einen anderen Wert ausgewählt wird, erscheint ein
Meldungsfensterchen mit dem Text "BeimÄndern (Formular ComboBox)".

Wenn ein eigenes Makro (bzw. im Beispiel oben die MessageBox) nur ausgeführt
werde soll, wenn der Benutzer tatsächlich etwas geändert hat, muß vorher noch
den Wert in der Tabelle mit dem Wert in der ComboBox abgleichen, also:
Procedure ComboBoxBeimÄndern;
  If (Str(Tabelle.Feld) <> ComboBox.Text)
    Message("BeimÄndern (Formular ComboBox)");
  End
Endproc;

Dieses Vorgehen nur bei Formular-Comboboxen, da man auf Comboboxen in einer
Formular Bearbeitungsmodus zeigen
Formulare/Formular Bearbeitungsmodus zeigen
Top
Procedure Formular_Modus(sFormular: String):String;
..#zeige bearbeitungsstatus an. es muss datawnd verwendet werden, weil sonst beim drucken
..#eine fehlermeldung gezeigt wird (formular kann nicht gefunden werden)
..##
  VarDef dwDatenfenster: DataWnd;  ..fensterobject für das formular

  dwDatenfenster := DatenfensterSuchen(sFormular);
  ..#datenfenster wurde nicht gefunde, dann leerstring zurückgeben
  IF Assigned(dwDatenfenster) = 0
    Return ""
  Else
    ..#getmode auswerten
    If dwDatenfenster.GetMode < 0
      Return ""
    Else
      Return 'Modus: ' + Choice(dwDatenfenster.GetMode+1, 'Betrachten', 'Ändern', 'Neueingabe', 'Fehler');
    End;
  End;
Endproc;

Formular ComboxBox ausgewählter Wert zeigen
Formulare/Formular ComboxBox ausgewählter Wert zeigen
Top
Im Formular der Wert eine Combobox zeigen

Beispiel 1
==========
procedure MeinComboxboxBeimÄndern;
..#combobox control suchen und ausgewählter wert anzeigen
..##
  Vardef cbCtrl: ComboBox;  ..#combobox deren wert gesucht wird
  ..#control suchen
  cbCtrl := FindControl("MeinComboxbox") as ComboBox;
  ..#gefunden, dann wert zeigen
  if Assigned(cbCtrl)
    Message(cbCtrl.Text);
  else
    Message('ComboBox gibt es nicht');
  End;
endproc;

Beispiel 2
==========
Procedure cbEinstellungenDBVerwaltungDBBeimÄndern;
..#Der ausgewählte Wert eines Comboboxes den Text eines Labels zuweisen
..##
  Vardef cbCtrl: ComboBox;  ..#combobox deren wert ermittelt wird
  Vardef lblCtrl: Label;    ..#label welche datenbank info zeigt

  cbCtrl := FindControl("cbEinstellungenDBVerwaltungDB") as ComboBox;
  ..#control gefunden? wenn nicht dann abbruch
  if NOT Assigned(cbCtrl)
    Return
    ..Message(cbCtrl.Text);
  End;
  lblCtrl := FindControl("lblEinstellungenDBVerwaltungDB") as Label;
  ..#control gefunden? wenn nicht dann abbruch
  if NOT Assigned(lblCtrl)
    Return
    ..Message(lblCtrl.Text);
  End;
  ..#combobox eintrag den labeltext zuweisen
  lblCtrl.Text := cbCtrl.Text;
EndProc;

Formular mit eingebettete Tabelle die markierte Einträge ermitteln
Formulare/Formular mit eingebettete Tabelle die markierte Einträge ermitteln
Top
Procedure Button1BeimAnklicken;
..#In einem Formular mit eingebettete Tabelle die markierte Einträge ermitteln
..#und darstellen
..##
  Var    CCRLF = Chr(13) + Chr(10);
  Vardef Marks: Integer[0];
  Vardef nCnt, i : Integer;
  VarDef dwDatenfenster: DataWnd;
  Vardef sTitel : String;

  ..#keine einträge dann stop
  ?FileSize($MP3TITEL) = 0 / Return
  ..#tabelle in formular suchen
  dwDatenfenster := FindDataWnd("INTERPRET.Interpret", "dgInterpretTitel");
  ..#gefunden
  If Assigned(dwDatenfenster)
    ..#gibt es markierungen
    If dwDatenfenster.StarNum > 0
      nCnt := dwDatenfenster.GetStars(Marks);
      ..#wieviele markierungen
      Message(Str(nCnt));
      i := -1; ..#muss mit -1 starten und dann bei < ncnt aufhören
      ..#loop durch die titel und gebe aus
      While i := i + 1 < nCnt
        ReadRec($MP3TITEL, Marks[i]);
        sTitel := sTitel + $MP3TITEL.Ablage + $MP3TITEL.Titel + ".mp3" + CCRLF;
        ..#zeige die tabelleneinträge
        Message(Str(Marks[i]) + CCRLF + sTitel);
      End;
    End;
  End;
Endproc;

Formular Schalter Text setzen
Formulare/Formular Schalter Text setzen
Top
Procedure SchalterTextSetzen;
..#Ändert den standardtext eines schalters mit den namen BtnOK
..##
  Vardef BtnCtrl: Button;  #schalter
  ..#schalter btnok im formular suchen
  BtnCtrl := FindControl("BtnOK") as Button;
  ..#schalter gefunden, dann neuen text zuweisen, sonst fehlermeldung
  If Assigned(BtnCtrl)
    BtnCtrl.Text := "Schaltertext";
  Else
    Message("Sorry, aber Schalter BtnOK gibt es nicht!");
  End;
Endproc;

Formularschalter Farbe zuweisen
Formulare/Formularschalter Farbe zuweisen
Top
Unter Windows XP darf bei Farbzuweisungen,

wie SCHALTER.Color := clGreen,

der Rahmentyp nicht auf "STANDARD" gesetztwerden.

Im Formular eingebettete Tabelle Einträge mittels Schalter bearbeiten
Formulare/Im Formular eingebettete Tabelle Einträge mittels Schalter bearbeiten
Top
procedure btnTippVerweisAendernBeimAnklicken;
..#im formular tipps befindet sich eine eingebette tabelle verweise
..#die tabelle verweise hat einen linkfeld auf die tabelle tipps
..##
  Vardef nVRNo : Integer; ..#verweis record speichern
  Vardef dwVerweise : dataWnd; ..#eingebette tabelle verweise

  nVRNo := RecNr($VERWEISE);
  If nVRNo = 0
    Return
  End;
  ..Message(VERWEISE.Verweis, Str(nRNo));
  ActivateForm("VERWEISE.Verweise");
  dwVerweise := FindDataWnd("VERWEISE.Verweise");
  If Assigned(dwVerweise)
    dwVerweise.ShowRec(nVRNo);
    dwVerweise.EditRec("Ändern Sie die Angaben.");
    dwVerweise.Schließen;
    Refresh;
  End;
endproc;

Im Formular Inhalt eines Memoelement zeigen
Formulare/Im Formular Inhalt eines Memoelement zeigen
Top
procedure btnMemoZeigenBeimAnklicken;
..#Im formular inhalt eines memoelement zeigen
..##
  Vardef MemoCtrl : Memo;
  MemoCtrl := FindControl("Memo1") as Memo;
  Message(MemoCtrl.Text);
endproc;
In einem Formular DateTimePicker Control Wert auslesen
Formulare/In einem Formular DateTimePicker Control Wert auslesen
Top
Vardef CtrlDP1 : DateTimePicker;
..#datetimepicker control suchen
CtrlDP1 := FindControl("DateTimePicker1") as DateTimePicker;
..#wenn gefunden, dann inhalt ausgeben
If Assigned(CtrlDP1)
  Message(CtrlDP1.Text);
End;

In einem Formular mittels Schalter zwischen Formular- und Listen-Ansicht schalten
Formulare/In einem Formular mittels Schalter zwischen Formular- und Listen-Ansicht schalten
Top
Procedure btnFormularListeBeimAnklicken;
..schaltet um im register pagecontrol1 und setzt entsprechend den text im schalter
  Vardef ButtonCtrl: Button;
  ButtonCtrl := FindControl("btnFormularListe") as Button;
  If Assigned(ButtonCtrl)
    If ViewPage(0) = 2
      ViewPage(-3);
      ButtonCtrl.Text := 'Liste';
    Else
      ViewPage(-2);
      ButtonCtrl.Text := 'Formular';
    End;
  End;
  ..Message(Str(ViewPage(0)));
Endproc;

In einem Formular Objekt ComboBox aktueller Eintrag ermitteln
Formulare/In einem Formular Objekt ComboBox aktueller Eintrag ermitteln
Top
Verwendet Eigenschaft: ComboBox1.Text

In einem Formular Objekt Radiogroup aktueller Eintrag ermitteln
Formulare/In einem Formular Objekt Radiogroup aktueller Eintrag ermitteln
Top
Verwendet Eigenschaft: RadioGroup1.ItemIndex

Beispiel:
procedure RadioGroup1BeimÄndern;
  Message(Str(RadioGroup1.ItemIndex));
endproc;
Dazu muss im Formular die Option "FormularbezogeneMakros" aktiviert sein.

Info-Formular aufrufen definiert in der Systemtabelle SYSTEM
Formulare/Info-Formular aufrufen definiert in der Systemtabelle SYSTEM
Top
Dieses Info-Formular kann wie folgt definiert und aufgerufen werden:

Procedure Anwendung_Info;
..#info fenster aufrufen
  ExecDialog("SYSTEM.Information");
  Return
Endproc;

Aufruf: Anwendung_Info

Verwendet werden kann der Aufruf in Formularmenüstrukturen (Menüpunkt, Symbol oder Taste)

Inhalt eines Formular Memos ohne Datenbankzuordnung ausführen - Einfach
Formulare/Inhalt eines Formular Memos ohne Datenbankzuordnung ausführen - Einfach
Top
procedure btnTestTurboPLBeimAnklicken;
..#formularmemo turbopl code ausführen. das memofeld ist kein datenbankfeld zugeordnet und
..#wird als objekt verwendet
..#Hinweis:
..#keine weitere prüfungen eingebaut
..#anstatt tempfile kann auch ramtext verwendet werden
..##
  Var CTEMPFILE = BaseDir+"x.x";
  Vardef nRT : Integer;
  Vardef memoCtrl: Memo;

  memoCtrl := FindControl("memoTestTurboPL") as Memo;
  nRT := Rewrite(CTEMPFILE);
  WriteLn(nRT, memoCtrl.Text);
  Close(nRT);
  nRT := ExecProg(CTEMPFILE);
  If nRT <> 0
    Message(Error.Message, "Fehler");
  End;
  DelFile(CTEMPFILE);
endproc;

Inhalt Formular Memo ausführen - Ausführlich
Formulare/Inhalt Formular Memo ausführen - Ausführlich
Top
procedure btnTurboPLCodeAusfuehrenBeimAnklicken;
..#der code wird zeile für zeile gelesen und ausgeführt.
,,#der code befindet sich in ein memofled einer systemtabelle:
..#$SYSTEM.TurboPLMemo
..##
  Var CCRLF = Chr(13) + Chr(10);
  VarDef sTempPrg : String;
  VarDef sTempMod : String;
  VarDef nFH : Integer;             ..handle für dateiöffnen
  VarDef nRT : Integer;             ..returncode execprog
  VarDef i : Integer;              ..counter
  VarDef nFound : Integer;          ..flag ob proc gefunden wurde
  Vardef sProcname : String;        ..die proc die gesucht wird
  Vardef sLine : String;            ..zeilenbuffer
  Vardef asProcCode : String[];     ..codebuffer zeile für zeile

  sTempPrg := "temp.prg";
  sTempMod := "temp.mod";
  ..gibt es inhalt
  If $SYSTEM.TurboPLMemo = ''
    Message("Fehler: Kein Code definiert!", "Quellcode Ausführen");
    Return
  End;
  ..moduldatei setzen
  sTempMod := BaseDir + sTempMod;
  ..öffne modul
  If Copymemo($SYSTEM.TurboPLMemo, sTempMod) <> 0
    Message("Fehler: Temporäre Datei '" + sTempMod + "' kann nicht erstellt werden!","Quellcode Ausführen");
    Return
  End;
  nFH := Reset(sTempMod);
  If nFH = 0
    Message("Fehler: Temporäre Datei '" + sTempMod + "' kann nicht gelesen werden!","Quellcode Ausführen");
    Return
  End;
  ..
  i := 0;
  ClrArray(asProcCode);
  While Not EOT(nFH)
    sLine := ReadLn(nFH);
    ReDim(asProcCode, i);
    asProcCode[i] := sLine;
    i := i + 1;
  End;
  Close(nFH);
  If i = 0
    Message("Abbruch: Code wurde nicht gefunden!");
  Else
    nFH := Rewrite(sTempPrg);
    ..erste und letzte zeile mit angaben procedure (prozedur) und endproc (endproz) löschen
    ..sonst werden die anweisungen nicht ausgeführt
    asProcCode[0] := "";
    asProcCode[High(1, asProcCode)] := "";
    ..schreibe in eine temp datei
    NLoop(i, High(1,asProcCode), WriteLn(nFH, asProcCode[i]));
    Close(nFH);
    ..NLoop(i, High(1,asProcCode), Message(asProcCode[i]))
    ..ExecProg(asProcCode);
    ..führe tempdatei aus
    nRT := ExecProg(sTempPrg);
    ..falls fehler
    If nRT > 0
      Message("Fehler bei der Ausführung ' Fehlercode = " + Str(nRT) + CCRLF + Error.Message, "Quellcode Ausführen");
    End;
    ..tempdateien löschen
    DelFile(sTempMod);
    DelFile(sTempPrg);
  End;
Inhalt Memofeld an eine Datei anfügen
Formulare/Inhalt Memofeld an eine Datei anfügen
Top
Den kompletten Inhalt eines Memos TABELLE.MemoFeld an die angegebene Datei anhängen:

 Vardef FileHdl: integer;
 FileHdl := TAppend('c:\temp\Test.txt');
 Write(FileHdl, TABELLE.MemoFeld);
Label Position setzen
Formulare/Label Position setzen
Top
Es können nur die englische Eigenschaftsbezeichnungen verwendet werden.
Beispiel:
 Label.Left := 336;
 Label.Top := 112;
Menüpunkte in der generierte EXE-Datei
Formulare/Menüpunkte in der generierte EXE-Datei
Top
NUR VDP

Es können mehr als 10 Menüpunkte angelegt werden, allerdings werden diese abhängig vom verfügbaren Speicher aufgebaut.
Der verfügbare Speicher ist wiederum abhängig von
a/ Anzahl der Prozeduren in dem Modul woraus die Menüpunkte aufgebaut werden und
b/ von der Länge der Prozedurnamen.

Fazit:
Prozeduren die nicht in Menüpunkte verwendet werden mit einem dummy Parameter versehen (Procedur myProc(nB : Real) und Prozedurnamen so kurz (aber noch verständlich) halten.
und werden neue Prozeduren erstellt und danach die Menüstruktur im Formular angepasst, kann es sein, daß abhängig vom verfügbaren Speicher,
Prozeduren "wegfallen" ohne einen Hinweis dass der Speicher nicht mehr ausreicht.
Menüpunkte und easy-Funktionen
Formulare/Menüpunkte und easy-Funktionen
Top
NUR VDP
Für die meisten Menüpunkte gibt es entsprechende easy-Funktionen.
Probleme gibt es bei den Menüpunkten:
Bearbeiten|Einfügen
Der Inhalt der Zwischenablage läßt sich mit Clip2Text auslesen.

Ansicht|Alle Datensätze
Mit Sortierung oder SetSortOder

Radiogroup ItemIndex als Control verwenden
Formulare/Radiogroup ItemIndex als Control verwenden
Top
Procedure Test;
..#in einem Formular erst ein Optionselement definieren
..##
  Message(str(RadioGroup1.ItemIndex))
Endproc;

Kann verwendet werden um Variablen zu belegen deren Inhalt in einer
Tabelle nichts zu suchen haben.


Schalterlabel Rot oder Schwarz setzen - Visible verwenden
Formulare/Schalterlabel Rot oder Schwarz setzen - Visible verwenden
Top
Im Formular zwei Schalter definieren, eine mit Textfarbe Rot (LabelRot),
der andere mit Textfarbe Schwarz (LabelSchwarz)
Sicherstellen das die Option Formularbezogene Makros aktiviert ist.

procedure Button1BeimAnklicken;
..#Testprozedur der die Schalter ROT oder SCHWARZ setzt
..##
  if LabelRot.Visible
    LabelSchwarz.Visible := 1;
    LabelRot.Visible := 0;
  else
    LabelRot.Visible := 1;
    LabelSchwarz.Visible := 0;
  end;
endproc;

procedure ReferenzSchwarzBeimAnklicken;
..#schwarz setze rot
..##
  ReferenzRot.Visible := 1;
  ReferenzSchwarz.Visible := 0;
endproc;

procedure ReferenzRotBeimAnklicken;
..#rot setze schwarz
..##
  ReferenzSchwarz.Visible := 1;
  ReferenzRot.Visible := 0;
endproc;

Verwendung in einem Formularfeld als Vorgabe mit eine Anzahl Tage addiert
Formulare/Verwendung in einem Formularfeld als Vorgabe mit eine Anzahl Tage addiert
Top
In eine Systemtabelle ein Feld definieren der die Anzahl Tage vom aktuellen Datum zum Ziel Datum enthält:
Feldname: $SYSTEM.VorgabeZielDatumTage
Typ: DateTime oder DatumZeit
Option: "Unterscheidung zwischen Null und leer" darf NICHT gesetzt sein!

Eintrag im Feld unter Vorgabe:
CombineDateTime(ToDay + $SYSTEM.VorgabeZielDatumTage, Now)

Wert eines Eingabefeldes setzen. Dieses Feld hat kein Datenbankbezug
Formulare/Wert eines Eingabefeldes setzen. Dieses Feld hat kein Datenbankbezug
Top
procedure FormOnOpen;
..#wird beim öffnen des formulars ausgeführt
..#gesetzt wird inhalt des eingabefeldes MakroSuchen
..##

  edMakroSuchen.Text := "<Makro suchen>";
  Return

  ..#eine andere möglichkeit den wert zu setzen
  Vardef EditCtrl : Edit;
  EditCtrl := FindControl("edMakroSuchen") as Edit;
  If Assigned(EditCtrl)
    EditCtrl.Text := "<Makro suchen>";
  End;
EndProc;


FormCondition

Gültigkeitsprüfung
Formulare/FormCondition/Gültigkeitsprüfung
Top
Formular mit Gültigkeitsprüfung.
Funktion des Formulares mit einem nummerischen Rückgabewert.
Innerhalb dieser Funktion erfolgt ebenfalls die Prüfung und eine eventuelle
Meldung.
Rückgabewert der Funktion entscheidet, ob der Datensatz gespeichert werden soll:
0 = nicht speichern
1 = speichern

Beispiel:
Procedure FormCondition: Integer;
  If CountRecs(TABELLE) > 0
    Return 1       ..#Bedingung erfüllt: 1 (True)
  Else
    Return 0
  End;
Endproc;

Weitere Prüfungsbeispiele:
Feld Text
  FELD = "VergleichtsText"
  FELD <> "VergleichtsText"

Length:
  Length(FELD) = VergleichsZahl
  Length(FELD) < VergleichsZahl


FormOnOpen

Beim Formular öffnen, die aktuelle Programmversion setzen
Formulare/FormOnOpen/Beim Formular öffnen, die aktuelle Programmversion setzen
Top
procedure FormOnOpen;
..#möglichkeit die programmversion mittels eines labels zu zeigen
..##
  Vardef lblProgrammversion: Label;   ..#label deren text gesetzt wird

  ..#label suchen
  lblProgrammversion := FindControl("lblHauptmenueProgrammversion") as Label;
  ..#nicht gefunden, dann anhalten
  If not Assigned(lblProgrammversion)
    Halt;
  End;
  ..#gefunden, dann text zuweisen
  lblProgrammversion.Text := "Programmname Version 1";
endproc;

Tipps zu TurboDB Studio Formulare
Formulare/Tipps zu TurboDB Studio Formulare
Top
Tipps zu TurboDB Studio Formulare

..#
..# ComboBox bei Auswahl Makro ausführen
..#
Ein Formular ComboBox hat folgende Einträge in der Werteliste:
Berlin, Hamburg, München usw.
Wenn nun Hamburg angeklickt wird, sollte ein Makro ausgeführt werden.
Lösung:
Im Formulareditor die ComboBox anklicken, dann im Eigenschafts-Bereich unter
"BeimÄndern", "Neues Makro" auswählen und in dieses Makro bsw.
Message("BeimÄndern (Formular ComboBox)") eintragen.
Alles speichern und neu übersetzen, anschließend das Formular
im 'normalen' Modus öffnen.
Wird in der ComboBox einen anderen Wert ausgewählt, erscheint ein
Meldungsfenster mit dem Text "BeimÄndern (Formular ComboBox)".

..#
..# Eingebettete Tabelle Makro ausführen
..#
Im Formular Kunden ist eine eingebette Tabelle Termine mit folgenden
Datensätzen: Termin 1, Termin 2, Termin 3 usw.
Wenn nun Termin 2 angeklickt wird sollte ein Makro ausgeführt werden.
Lösung:
1.Im Formulareditor die eingebettete Tabelle doppelklicken um
den Spalteneditor zu öffnen.
2.In der Liste der Spalten die ComboBox-Spalte wählen und
die Option Daten wählen.
3.Im Eigenschaften-Bereich beim Eintrag "BeimÄndern" ein "Neues Makro" wählen.
4.Im Hintergrund wurde schon im Makroeditor ein Makro angelegt, in
dem ein Befehl einegtrahen wird.
Beispiel: Message("BeimÄndern (Datengrid ComboBox)"
5.Formular speichern,neu übersetzen und das Formular im 'normalen' Modus öffnen.
6.Wenn in der ComboBox einen anderen Wert ausgewählt wird, erscheint ein
Meldungsfensterchen mit dem Text "BeimÄndern (Formular ComboBox)".

Wenn ein eigenes Makro (bzw. im Beispiel oben die MessageBox) nur ausgeführt
werde soll, wenn der Benutzer tatsächlich etwas geändert hat, muß vorher noch
den Wert in der Tabelle mit dem Wert in der ComboBox abgleichen, also:
Procedure ComboBoxBeimÄndern;
  If (Str(Tabelle.Feld) <> ComboBox.Text)
    Message("BeimÄndern (Formular ComboBox)");
  End
Endproc;

Dieses Vorgehen nur bei Formular-Comboboxen, da man auf Comboboxen in einer
eingebetteten Tabelle keinen direkten Zugriff hat.


Module

Uses Modulname
Module/Uses Modulname
Top
TS/VDP sucht das Modul im aktuellen Verzeichnis.
Dieses wird aber durch Datei-Dialoge verstellt.
Wenn also irgendwo in TS/VDP ein Datei-Dialog benutzt wird, der dann aufein anderes
Verzeichnis weist, ist es aus.
Projekt schließen und neu öffnen stellt einfach nur dasProjektverzeichnis wieder als das Aktuelle ein.

Netzwerk

Expizite Netzwerksperren
Netzwerk/Expizite Netzwerksperren
Top
Expizite Netzwerksperren braucht man nur dann einzusetzen, wenn man
hinsichtlich Netzwerkperformance optimieren möchte.
Eine Totalsperre einzurichten bedeutet, daß während dieser Zeit kein anderer
User auf die Daten zugreifen kann und dann nach dem eingestellten
TimeOut den Netzmonitor bekommt.
Dies sollte eigentlich vermieden werden, damit nicht der Eindruck entsteht,
daß permanent die Datenbank gesperrt ist.
Am besten versucht man, Servieläufe, die eine Totalsperre erfolgen
nachts laufen zu lassen.
Ich würde dazu raten, expilzites Looken auf ein Minimum zu reduzieren.


SQL

ExecSQL
SQL/ExecSQL
Top
ExecSQL wird ausgeführt bei INSERT, DELETE, UPDATE, CREATE, ALTER oder DROP Befehle
Aufruf: ExecSQL(SQL-Befehl : String) : Integer;
Rückgabe: Anzahl Datansätze die geändert wurde.
Beispiel:
procedure btnExecSQLBeimAnklicken;
..#Tabellenstruktur: Name (S20), ID (AutoInc)
..##
  Var CCRLF = Chr(13) + Chr(10);
  Var CSQLCMD = "INSERT INTO TESTTAB12 (Name) VALUES ('Name99')";
  Vardef nRT : Integer;
  ..#
  Try
    ..#sql befehl ausführen
    nRT := ExecSQL(CSQLCMD);
  Except
    Message(Error.Message + CCRLF + CSQLCMD, "Fehler: SQL Befehl");
    Return
  End;
  ..#der sql befehl wurde ausgeführt, aber war das ergebnis auch OK?
  If nRT < 0
    Message(Error.Message + CCRLF + CSQLCMD, "Fehler: SQL Befehl");
  Else
    Message("SQL Befehl erfolgreich ausgeführt." + CCRLF + CSQLCMD, "Hinweis: SQL Befehl");
    Refresh;
  End;
Endproc;

OpenSQL
SQL/OpenSQL
Top
OpenSQL wird ausgeführt für SELECT Befehle
Aufruf:  OpenSQL(SQL-Befehl : String) : Tabellenhandle;
Rückgabe: Tabelle mit dem Ergebnis
Beispiel:
Procedure btnOpenSQLBeimAnklicken;
..#Beispiel OpenSQL
..#Tabellenstruktur: Name (S20), ID (AutoInc)
..##
  Var CCRLF = Chr(13) + Chr(10);
  Var CSQLCMD = "SELECT * FROM TESTTAB12 WHERE Name = 'Name1'";
  Vardef nSQLTab: Integer;
  Vardef nRNo : Integer;
  Vardef nCnt : Integer;
  ..#
  Try
    ..#sql befehl ausführen
    nSQLTab := OpenSQL(CSQLCMD);
    ..#anzahl gefunden records ermitteln
    nCnt := FileSize(nSQLTab);
    ..#oder klassisch
    ..nCnt := 0;
    ..nRNo := FirstRec(nSQLTab);
    ..While nRNo > 0
    ..  nRNo := ReadRec(nSQLTab, nRNo);
    ..  nCnt := nCnt + 1;
    ..  nRNo := NextRec(nSQLTab);
    ..End;
    ..#und ausgeben
    Message(Str(nCnt), "SQL Befehle - Datensätze");
    ..#ergebnis zeigen
    nRNo := FirstRec(nSQLTab);
    While nRNo > 0
      ReadRec(nSQLTab, nRNo);
      Message(GetField(nSQLTab, 1) + " (ID:" + GetField(nSQLTab, 2) + ")");
      nRNo := NextRec(nSQLTab);
    End;
    CloseDB(nSQLTab);
  Except
    Message(Error.Message + CCRLF + CSQLCMD, "Fehler: SQL Befehl");
  End;
Endproc;

SQL ALTER - Tabelle restrukturieren
SQL/SQL ALTER - Tabelle restrukturieren
Top
SQL-Befehl:
ExecSQL("Alter Table MeineTabelle");

Hinweis:
SQL Alter Table kann nur für Tabellen funktionieren, die nicht im Projekt
eingebunden sind.


..#TurboPL Beispiel
Vardef sqlCmd: String;
sqlCmd := 'ALTER TABLE [TabellenNameOhnePunktDat]';
ExecSql(sqlCmd);

SQL Beispiele anhand Adressen Tabelle
SQL/SQL Beispiele anhand Adressen Tabelle
Top
..#Adressen der Tabelle adressen.dat bearbeiten Spalten Name S50, EMail S255, Internet S255
..#pfad zur adressen tabelle
Var CADRESSENDB = BaseDir + "BSP\ADRESSEN.DAT";

procedure SQL_Adressen_lesen;
..#adressen mittels sql lesen
..##
  Var CCRLF = Chr(13) + Chr(10);
  Vardef nRNo: Integer;         ..#handle für records
  Vardef nSQLTab: Integer;  ..#handle für die sql tabelle
  Vardef sSQLCMD : String;    ..#string für sql befehl
  Vardef sStr : String;        ..#string der die adresseneinträge hält
  Vardef sSQLTab : String;    ..#sql tabelle

  ..Message("Start ...");
  Try
    sSQLTab := '"'+CADRESSENDB+'"';
    sSQLCMD := "SELECT * FROM " + sSQLTab;
    nSQLTab := OpenSQL(sSQLCMD);
    sStr := "";
    sStr := "*** Adressen Einträge ***" + CCRLF;
    sStr := sStr + "-------------------------" + CCRLF;
    sStr := sStr + "Anzahl Einträge: " + Str(Filesize(nSQLTab)) + CCRLF;
    nRNo := FirstRec(nSQLTab);
    While nRNo > 0
      ReadRec(nSQLTab, nRNo);
      sStr := sStr + Label(nSQLTab, 1) + " = " + GetField(nSQLTab, 1) + ", ";
      sStr := sStr + Label(nSQLTab, 2) + " = " + GetField(nSQLTab, 2) + ", ";
      sStr := sStr + Label(nSQLTab, 3) + " = " + GetField(nSQLTab, 3) + ", ";
      sStr := sStr + CCRLF;
      nRNo := NextRec(nSQLTab);
    End;
    CloseDB(nSQLTab);
    ..CopyStrToClipboard(sSQLCMD);
    Message(sStr, "Adressen Einträge");
  Except
    Message(Error.Message, "Fehler - Datenbank öffnen");
  End;
  ..Message("Ende ...");
Endproc;

procedure SQL_Adressen_einfuegen;
..#adressen mittels sql einfuegen
..##
  Var CCRLF = Chr(13) + Chr(10);
  Var CCNT = 5;        ..#anzahl testeinträge
  Vardef nRNo: Integer;         ..#handle für records
  Vardef i: Integer;             ..#laufvar
  Vardef nRT: Integer;           ..#handle für records
  Vardef nSQLTab: Integer;  ..#handle für die sql tabelle
  Vardef sSQLTab : String;    ..#sqltabelle
  Vardef sSQLCMD : String;    ..#string für sql befehl
  Vardef sStr : String;        ..#string der die adresseneinträge hält

  ..Message("Start ...");
  sSQLTab := '"' + CADRESSENDB + '"';
  For i := 1 To CCNT
    sSQLCMD := "";
    sStr := "";
    Try
      sStr := sStr + "'Testname" + Str(i) + "', ";
      sStr := sStr + "'name" + Str(i) + "@adresse.de', ";
      sStr := sStr + "'www.meineadresse" + Str(i) + ".de'";
      sSQLCMD := sSQLCMD + "INSERT INTO " + CCRLF;
      sSQLCMD := sSQLCMD + sSQLTab + CCRLF;
      sSQLCMD := sSQLCMD + "(Name, EMail, Internet)" + CCRLF;
      sSQLCMD := sSQLCMD + "VALUES (" + sStr + ")";
      ..CopyStrToClipboard(sSQLCMD);
      ..Message(sSQLCMD);
      ..sSQLCMD := "INSERT INTO " + sSQLTab + "(Name,EMail,Internet) VALUES (" + sStr + ")";
      nRT := ExecSQL(sSQLCMD);
     CloseDB(nSQLTab);
  Except
    Message(Error.Message + CCRLF + sSQLCMD, "Fehler: SQL Befehl");
    Return
  End;
   ..#der sql befehl wurde ausgeführt, aber war das ergebnis auch OK?
  If nRT < 0
    Message(Error.Message + CCRLF + sSQLCMD, "Fehler: SQL Befehl");
  End;
  Next;
  ..#
  Message("Adressen - " + Str(CCNT) + " Testeinträge - hinzugefügt.", "Adressen Test Einträge");
  ..Message("Ende ...");
Endproc;

procedure SQL_Adressen_loeschen;
..#adressen mittels sql loeschen
..##
  Var CCRLF = Chr(13) + Chr(10);
  Vardef nRT: Integer;           ..#handle für records
  Vardef nSQLTab: Integer;  ..#handle für die sql tabelle
  Vardef sSQLTab : String;    ..#sqltabelle
  Vardef sSQLCMD : String;    ..#string für sql befehl

  ..Message("Start ...");
  sSQLTab := '"'+CADRESSENDB+'"';
  sSQLCMD := "";
  Try
    sSQLCMD := sSQLCMD + "DELETE FROM " + CCRLF;
    sSQLCMD := sSQLCMD + sSQLTab + CCRLF;
    nRT := ExecSQL(sSQLCMD);
    CloseDB(nSQLTab);
  Except
    Message(Error.Message + CCRLF + sSQLCMD, "Fehler: SQL Befehl");
    Return
  End;
  ..#der sql befehl wurde ausgeführt, aber war das ergebnis auch OK?
  If nRT < 0
    Message(Error.Message + CCRLF + sSQLCMD, "Fehler: SQL Befehl");
  End;
  ..#
  Message("Adressen gelöscht.", "Adressen Einträge löschen");
  ..Message("Ende ...");
Endproc;

procedure SQL_Adressen_abfragen;
..#adressen mittels sql abfragen
..##
  Var CCRLF = Chr(13) + Chr(10);
  Vardef nRNo: Integer;         ..#handle für records
  Vardef nRT: Integer;         ..#returncodehandle
  Vardef nSQLTab: Integer;  ..#handle für die sql tabelle
  Vardef sSQLCMD : String;..#string für sql befehl
  Vardef sStr : String;        ..#string der die adresseneinträge hält
  Vardef sAbfrage : String;   ..#abfrage
  Vardef sSQLTab : String;  ..#sql tabelle

  ..Message("Start ...");
  sAbfrage := "Name has 'name1'";
  nRT := Input("Suchbegriff eingeben:", "Adressen suchen", 0, sAbfrage);
  If nRT = 0
    Message("Abbruch durch den Benutzer", "Adresse suchen");
    Return
  End;
  Try
    sSQLTab := '"'+CADRESSENDB+'"';
    sSQLCMD := sSQLCMD + "SELECT * " + CCRLF;
    sSQLCMD := sSQLCMD + "FROM " + CCRLF;
    sSQLCMD := sSQLCMD + sSQLTab + " " + CCRLF;
    sSQLCMD := sSQLCMD + "WHERE " + CCRLF;
    sSQLCMD := sSQLCMD + sAbfrage + CCRLF;
    ..CopyStrToClipboard(sSQLCMD);
    ..Message(sSQLCMD);
    nSQLTab := OpenSQL(sSQLCMD);
    sStr := "";
    sStr := "*** Adressen Einträge ***" + CCRLF;
    sStr := sStr + "-------------------------" + CCRLF;
    sStr := sStr + "Anzahl Einträge: " + Str(Filesize(nSQLTab)) + CCRLF;
    nRNo := FirstRec(nSQLTab);
    While nRNo > 0
      ReadRec(nSQLTab, nRNo);
      sStr := sStr + Label(nSQLTab, 1) + " = " + GetField(nSQLTab, 1) + ", " + Label(nSQLTab, 2) + " = " + GetField(nSQLTab, 2) + CCRLF;
      ..Message(Label(nSQLTab, 1) + " = " + GetField(nSQLTab, 1) + ", " + Label(nSQLTab, 2) + " = " + GetField(nSQLTab, 2));
      nRNo := NextRec(nSQLTab);
    End;
    CloseDB(nSQLTab);
   ..CopyStrToClipboard(sSQLCMD);
    Message(sStr, "Adressen Einträge");
  Except
    Message(Error.Message, "Fehler - Datenbank öffnen");
  End;
  ..Message("Ende ...");
Endproc;

procedure SQL_Adressen_export_csv;
..#adressen mittels sql in eine csv datei exportieren
..##
  Var CCRLF = Chr(13) + Chr(10);
  Var CHDG = "CSV Export";
  Var CHDGF = "Fehler - CSV Export";
  Var CINF1 = "Einträge exportiert.";
  Var CERR1 = "Die CSV Datei kann nicht erstellt werden.";
  Var CERR2 = "Einträge konnten nicht exportiert werden.";
  Vardef nRNo: Integer;          ..#handle für records
  Vardef nSQLTab: Integer;    ..#handle für die sql tabelle
  Vardef sSQLTab : String;     ..#sql tabelle
  Vardef sSQLCMD : String;   ..#string für sql befehl
  Vardef sStr : String;            ..#string der die adresseneinträge hält
  Vardef nFH : Integer;           ..#csv datei handle
  Vardef sCSVDatei : String;   ..#die csv datei

  ..Message("Start ...");
  sCSVDatei := Exchange(Lower(CADRESSENDB), ".dat", ".csv")
  nFH := Rewrite(sCSVDatei);
  If nFH = 0
    Message(CERR1+CCRLF+sCSVDatei, CHDGF);
    Return
  End;
  Try
    sSQLTab := '"'+CADRESSENDB+'"';
    sSQLCMD := "SELECT * FROM " + sSQLTab;
    ..Message(sSQLCMD);
    nSQLTab := OpenSQL(sSQLCMD);
    sStr := "";
    sStr := sStr + Label(nSQLTab, 1) + ",";
    sStr := sStr + Label(nSQLTab, 2) + ",";
    sStr := sStr + Label(nSQLTab, 3);
    WriteLn(nFH, sStr);
    nRNo := FirstRec(nSQLTab);
    While nRNo > 0
      ReadRec(nSQLTab, nRNo);
      sStr := "";
      sStr := sStr + "'" + GetField(nSQLTab, 1) + "',";
      sStr := sStr + "'" + GetField(nSQLTab, 2) + "',";
      sStr := sStr + "'" + GetField(nSQLTab, 3) + "'";
      WriteLn(nFH, sStr);
      nRNo := NextRec(nSQLTab);
    End;
    CloseDB(nSQLTab);
    Close(nFH);
    ..CopyStrToClipboard(sSQLCMD);
    If IsFile(sCSVDatei)
      Message(CINF1+CCRLF+"CSV-Datei: " + sCSVDatei, CHDG)
    Else
      Message(CERR2+CCRLF+"CSV-Datei: " + sCSVDatei, CHDGF)
    End;
  Except
    Message(Error.Message, "Fehler - Datenbank");
  End;
  ..Message("Ende ...");
SQL Blob Felder leeren
SQL/SQL Blob Felder leeren
Top
SQL-Befehl:
ExecSQL("Update MeineTabelle Set MeinBlobFeld = null");

Hinweis: Die zugehörige Blobdatei wird dabei NICHT automatisch verkleinert, der freigewordene Platz wird lediglich als unbelegt markiert und für neue Inhalte verwendet. Soll Dateigröße der *.blb-Datei auf das Minimum verkleinert werden ist es nötig eine Restrukturierung der Tabelle auszuführen.

SQL CREATE
SQL/SQL CREATE
Top
SQL CREATE LEVEL 3 Maximale Stringlänge liegt bei 255

Beispiel:
CREATE TABLE "TABELLE" LEVEL 3 ("ID" INTEGER,"Spalte" VARCHAR(255))

SQL INSERT - Tabelle mit Testdaten füllen
SQL/SQL INSERT - Tabelle mit Testdaten füllen
Top
procedure btnSQLInsertBeimAnklicken;
..#Tabellenstruktur: Name (S20), ID (AutoInc)
..##
  Var CCRLF = Chr(13) + Chr(10);
  Var CSQLCMD = "";
  Var CSQLOK = "SQL Befehl erfolgreich ausgeführt.";
  Var CCNT = 5;
  Vardef nRT : Integer;
  Vardef i : Integer;
  Vardef sStr : String;
  ..#
  For i := 1 To CCNT
    CSQLCMD := "";
    Try
      sStr := 'Name' + Str(i);
      CSQLCMD := "INSERT INTO TESTTAB12 (Name) VALUES ('" + sStr + "')";
      nRT := ExecSQL(CSQLCMD);
    Except
      Message(Error.Message + CCRLF + CSQLCMD, "Fehler: SQL Befehl");
      Return
    End;
    ..#der sql befehl wurde ausgeführt, aber war das ergebnis auch OK?
    If nRT < 0
      Message(Error.Message + CCRLF + CSQLCMD, "Fehler: SQL Befehl");
    End;
  Next;
  ..#
  EndeDerTabelle;
  Message(CSQLOK, "Hinweis: SQL Befehl");
Endproc;

SQL SELECT Ergebnisse abfragen
SQL/SQL SELECT Ergebnisse abfragen
Top
Mit SQL Select können Daten selektiert und mit ReadRec gelesen werden.
Diese Möglichkeit ist sehr vielfältig.

Beispiel 1
Var CCRLF = Chr(13) + Chr(10);
..#SQL Select Befehl definieren
Var CSQLCMD = "SELECT Count(*), SUM(ID), AVG(ID) FROM TESTTAB12 WHERE Name = 'Name5'";
..#handle für die sql tabelle
Vardef nSQLTab: Integer;

..#sql befehl ausführen
..#als ergebis eine sql tabelle mit einem satz und 3 spalten count(*), sum(id), avg(id)
nSQLTab := OpenSQL(CSQLCMD);
ReadRec(nSQLTab, 1);
sStr := sStr + Label(nSQLTab, 1) + ': Das Ergebnis der Anzahl ist: ' + GetField(nSQLTab, 1) + CCRLF;
sStr := sStr + Label(nSQLTab, 2) + ': Das Ergebnis der Summierung ist: ' + GetField(nSQLTab, 2) + CCRLF;
sStr := sStr + Label(nSQLTab, 3) + ': Das Ergebnis des Mittelwertes ist: ' + GetField(nSQLTab, 3) + CCRLF
CloseDB(nSQLTab);
Message(sStr, "SQL Befehle");

Beispiel 1
Var CCRLF = Chr(13) + Chr(10);
Var CSQLCMD = "SELECT * FROM TESTTAB12 WHERE Name = 'Name5'";
Vardef nSQLTab: Integer; ..#handle für die sql tabelle

..#sql befehl ausführen
..#als ergebis eine sql tabelle mit alle felder der tabelle TESTTAB12 und Anzahl datensätze gefunden
nSQLTab := OpenSQL(CSQLCMD);
nRNo := FirstRec(nSQLTab);
While nRNo > 0
  ReadRec(nSQLTab, nRNo);
  Message(Label(nSQLTab, 1) + " = " + GetField(nSQLTab, 1) + ", " + Label(nSQLTab, 2) + " = " + GetField(nSQLTab, 2));
  nRNo := NextRec(nSQLTab);
End;
CloseDB(nSQLTab);

SQL UPDATE
SQL/SQL UPDATE
Top
Im Update-Statement kann kein Sub-Select verwendet werden,
das müssen feste Werte sein.

tdbengine

tdbegine als Utility-Programm ausführen
tdbengine/tdbegine als Utility-Programm ausführen
Top
Verwende den Befehl Execute um die tdbengine mit Parameter aufzurufen.
Parameter:
Modul.prg
Beispiel:
Execute("tdbengine.exe test.prg");


TurboPL


ActivateForm

Formular aufrufen und Datensatz neu anlegen oder bearbeiten
TurboPL/ActivateForm/Formular aufrufen und Datensatz neu anlegen oder bearbeiten
Top
Procedure FormularAufrufenMitParameter(nMode : Integer);
..#abhängig vom parameter nmode wird bei
..#1 = ein neuer datensatz angelegt
..#2 = der datensatz bearbeitet
..##

  ActivateForm("TABELLE.Formular");
  ?nMode = 1 / AppendNewRecords;
  ?nMode = 2 / ModifyRecords;
EndProc;

Testaufruf: FormularAufrufenMitParameter(2);


Array

Formular Memofeld Inhalt in ein String Array kopieren
TurboPL/Array/Formular Memofeld Inhalt in ein String Array kopieren
Top
  Vardef arMemo : String[0];  ..#string array
  Vardef sZeile : String;     ..#zeilen buffer
  Vardef sStr : String;       ..#string buffer
  Vardef memoInfo: Memo;      ..#memo control dem der text zugeordnet wird
  Vardef i, nZeile, nCnt : Integer;  ..#lauf vars

  ..#
  sStr := "";
  ..#memo control im formular suchen
  memoInfo := FindControl("memoInfo") as Memo;
  ..#control nicht gefunden, dann anhalten
  If not Assigned(memoInfo)
    Halt;
  End;
  ..#inhalt memocontrol einem string zuweisem
  sStr := memoInfo.Text;
  ..#wenn leer, dann abbruch
  If sStr = ""
    Halt;
  End;
  ..#wieviel zeichen sind im memo enthalten
  nCnt := Length(sStr);
  ..#zeilen counter
  nZeile := -1;
  i := 0;
  ..#lese zeichenweise
  Repeat
    i := i + 1;
    If sStr[i] = Chr(13)
      nZeile := nZeile + 1;
      ReDim(arMemo, nZeile);
      arMemo[nZeile] := sZeile;
      sZeile := "";
    Else
      sZeile := sZeile + sStr[i];
    End;
  Until i = nCnt + 1;
  ..#die letzte zeile abfangen
  If sZeile <> ""
      nZeile := nZeile + 1;
      ReDim(arMemo, nZeile);
      arMemo[nZeile] := sZeile;
  End;
  ..#
  ..#Testausgabe
  ..NLoop(i, High(1, arMemo), Message(arMemo[i]));

Tabellennamen aus einem String Array für Tabellenoperationen verwenden
TurboPL/Array/Tabellennamen aus einem String Array für Tabellenoperationen verwenden
Top
procedure Tabelle_aus_Array;
..#Tabellennamen aus einem String Array für Tabellenoperationen verwenden
..##
  Vardef asTabelle : String[20];  ..#array mit tabellen namen
  Vardef nTabelle  : Integer;     ..#Tabellennummer
  Vardef i : Integer;             ..#Ausgewählte tabelle

  ..#tabellenamen zum array zuordnen
  asTabelle[1] := "TESTBLOB.DAT"
  asTabelle[2] := "TESTTAB.DAT"
  ..#die erste tabelle auswählen
  i := 1;
  ..
  nTabelle := Round(Val(asTabelle[i]));
  ..#und als text anzeigen
  Message("Tabellennummer:"+Str(nTabelle)+ " für Tabelle:" + DBName(nTabelle));
  ..#hier können tabellen operationen durchgeführt werden, wie
  ..Try
  ..  ClearDat(nTabelle);
  ..  RegenAll(nTabelle);
  ..Except
  ..  Message(Error.Meldung, "Fehler: " + Str(Error.Nummer));
  ..End;
EndProc;
TurboPL Code ausführen
TurboPL/Array/TurboPL Code ausführen
Top
procedure btnTurboPLCodeAusfuehrenBeimAnklicken;
..#formular schalter
..#beim anklicken wird der code zeile für zeile gelesen und ausgeführt.
..#der code ist in ein memofeld einer sytemtabelle gespeichert:
..#  Vardef memoInfo: Memo;   ..#memo control dem der text zugeordnet wird
..##
  Var CCRLF = Chr(13) + Chr(10);
  VarDef sTempPrg : String;  ..#temporäre programmdatei
  VarDef sTempMod : String;  ..#temporäres modul
  VarDef nFH : Integer;           ..#handle für dateiöffnen
  VarDef nRT : Integer;           ..#returncode execprog
  VarDef i : Integer;             ..#counter
  VarDef nFound : Integer;        ..#flag ob proc gefunden wurde
  Vardef sProcname : String;      ..#die proc die gesucht wird
  Vardef sLine : String;          ..#zeilenbuffer
  Vardef asProcCode : String[];   ..#codebuffer (zeile für zeile)

  sTempPrg := "temp.prg";
  sTempMod := "temp.mod";
  ..#gibt es code im memofeld der systemtabelle
  If $SYSTEM.TurboPLMemo = ''
    Message("Fehler: Kein Code definiert!", "Quellcode Ausführen");
    Return
  End;
  ..#moduldateinamen definieren
  sTempMod := BaseDir + sTempMod;
  ..#öffne modul indem der memoinhalt in das temporäre module gespeichert wird
  If Copymemo($SYSTEM.TurboPLMemo, sTempMod) <> 0
    Message("Fehler: Temporäre Datei '" + sTempMod + "' kann nicht erstellt werden!","Quellcode Ausführen");
    Return
  End;
  ..#modul datei öffnen
  nFH := Reset(sTempMod);
  If nFH = 0
    Message("Fehler: Temporäre Datei '" + sTempMod + "' kann nicht gelesen werden!","Quellcode Ausführen");
    Return
  End;
  ..#und zeile für zeile lesen und in codebuffer speichern
  i := 0;
  ClrArray(asProcCode);
  While Not EOT(nFH)
    sLine := ReadLn(nFH);
    ReDim(asProcCode, i);
    asProcCode[i] := sLine;
    i := i + 1;
  End;
  Close(nFH);
  If i = 0
    Message("Abbruch: Code wurde nicht gefunden!");
  Else
    nFH := Rewrite(sTempPrg);
    ..#erste und letzte zeile mit angaben procedure (prozedur) und endproc (endproz) löschen
    ..#sonst werden die anweisungen nicht ausgeführt
    asProcCode[0] := "";
    asProcCode[High(1, asProcCode)] := "";
    ..#schreibe in eine temp datei
    NLoop(i, High(1,asProcCode), WriteLn(nFH, asProcCode[i]));
    Close(nFH);
    ..NLoop(i, High(1,asProcCode), Message(asProcCode[i]))
    ..ExecProg(asProcCode);
    ..#führe tempdatei aus
    nRT := ExecProg(sTempPrg);
    ..#falls fehler
    If nRT > 0
      Message("Fehler bei der Ausführung ' Fehlercode = " + Str(nRT) + CCRLF + Error.Message, "Quellcode Ausführen");
    End;
    ..#tempdateien löschen
    DelFile(sTempMod);
    DelFile(sTempPrg);
  End;
EndProc;


Assigned

Assigned
TurboPL/Assigned/Assigned
Top
Assigned(myObject : Object) : Integer

Siehe auch unter Eintrag:/DataWnd und Eintrag:/Object


Formular Schalter Text setzen
TurboPL/Assigned/Formular Schalter Text setzen
Top
..#.............................................................................
..# Formular Schalter Text setzen
..#.............................................................................

Procedure SchalterTextSetzen;
..#Ändert den standardtext eines schalters mit den namen BtnOK
..##
  Vardef BtnCtrl: Button;  #schalter
  ..#schalter btnok im formular suchen
  BtnCtrl := FindControl("BtnOK") as Button;
  ..#schalter gefunden, dann neuen text zuweisen, sonst fehlermeldung
  If Assigned(BtnCtrl)
    BtnCtrl.Text := "Schaltertext";
  Else
    Message("Sorry, aber Schalter BtnOK gibt es nicht!");
  End;
Endproc;

Timer
TurboPL/Assigned/Timer
Top
..#.............................................................................
..# Timer mittels Prozedur an- oder ausstellen und
..# Text eines Labels dazu anpassen.
..#.............................................................................

procedure btnActivateTimerBeimAnklicken;
..#timer an oder ausstellen
..#braucht formularelemente timer und label
..##
  Vardef TimerCtrl: Timer;  ..#der timer
  Vardef LabelCtrl: Label;  ..#label der den status des timers zeigt
  ..#label zur info darstellug finden
  LabelCtrl := FindControl("lblTimerScandata") as Label;
  If NOT Assigned(LabelCtrl)
    Message("Fehler: Labelcontrol für Timer kann nicht gefunden werden");
  End;
  ..#timer de- oder aktivieren
  ..#der timer has als name timerScandata
  TimerCtrl := FindControl("timerScandata") as Timer;
  If Assigned(TimerCtrl)
    ..timer is an, dann ausstellen
    If TimerCtrl.Enabled = JA
      TimerCtrl.Enabled := NEIN
      LabelCtrl.Text := "Timer = AUS";
    Else
    ..timer is aus, dann anstellen
      TimerCtrl.Enabled := JA;
      LabelCtrl.Text := "Timer = AN";
    End;
    ..#hier kann der timer interval gesetzt werden
    ..#TimerCtrl.Interval
    LabelCtrl.Text := LabelCtrl.Text + " (Interval=" + Str(TimerCtrl.Interval DIV 10) + "s.)";
  End;
endproc;


Choice

Bei einem JaNein Feld Ja oder Nein als String ausgeben
TurboPL/Choice/Bei einem JaNein Feld Ja oder Nein als String ausgeben
Top
Ja oder Nein ausgeben, wobei ein JaNein Feld (Boolean) verwendet wird:
Choice($TABELLE.FeldJaNein, "Ja", "Nein")

Das aktuelle Pfad eines Laufwerks ermitteln
TurboPL/Choice/Das aktuelle Pfad eines Laufwerks ermitteln
Top
Procedure GetPfadAusLaufwerk(sDrive : String) : String;
..#sDrive ist Laufwerk A:, B:, C: ...
..#Rückgabe ist dann z.B. c:\, d:\daten\test\
..##
  VarDef nDrive : Integer;

  ..laufwerk numerisch ermitteln
  Choice(Sel(nDrive:=Asc(Upper(LTRIM(sDrive)[1])) Von 65 Bis 90),nDrive:=nDrive - 64,nDrive:=0)
  ..dann mittels getdir das verzeichnis holen
  sDrive:=GetDir(nDrive)
  ..und mit \ zurückgeben
  Return Choice(SEL(RightStr(sDrive,1)="\"),sDrive, Choice(Sel(sDrive),sDrive+"\",""))
Endproc

Dateiname aus Verzeichnispfad lesen
TurboPL/Choice/Dateiname aus Verzeichnispfad lesen
Top
Procedure GetDateinameAusPfad(sPath : String) : String;
..#sPath ist der Komplettpfad einer Datei
..##
  Vardef sSep : String;

  sPath := "";
  ..separator ermitteln
  sSep := Choice(Sel(sPath := Exchange(sPath," ","") Hat "\"),"\",":")
  ..pfad extrahieren
  Repeat
  Until Not sPath := RightStr(sPath, Length(sPath) - Pos(sSep, sPath)) Hat sSep
  Return sPath
Endproc;

Monat aus Monatsnummer ermitteln
TurboPL/Choice/Monat aus Monatsnummer ermitteln
Top
Procedure GetMonat(nMnt: Integer): string;
..#Monat aus Monatsnummer ermitteln
..##
  VarDef nTmp  :  String;
  nTmp := "";
  If (nMnt > 0) AND (nMnt < 13)
    nTmp := Choice(nMnt, "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
  End;
  Return nTmp
Endproc;

oder einfach

Choice(nMonth, "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember")
Choice(nMonth, "Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez")

Monat aus sDatum als String Jan Feb
TurboPL/Choice/Monat aus sDatum als String Jan Feb
Top
Procedure GetMonatAusDatum(sDatum: string): string;
..#Monat aus sDatum als String Jan, Feb ...
..##
 VarDef nTmp : String;
 Return Choice(Month(DateTimeVal(sDatum)), "Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez");
Endproc;

Prüfen ob Datei vorhanden ist
TurboPL/Choice/Prüfen ob Datei vorhanden ist
Top
Procedure FileDateiVorhandenX(sFile : String) : String;
..#Prüft ob eine Datei vorhanden ist.
..#Wenn ja, wird ein "X" sonst "Datei nicht vorhanden" angezeigt.
..##
  Return Choice(IsFile(sFile), "X","Datei nicht vorhanden")
EndProc;

Prüfen ob Datei vorhanden ist und zeige das mittels Sternchen in einem Formular an
TurboPL/Choice/Prüfen ob Datei vorhanden ist und zeige das mittels Sternchen in einem Formular an
Top
Return Choice(Sel(IsFile(MeinVerzeichnis + MeineDatei) >0), "*", "");

Prüfen ob ein Memofeld leer ist
TurboPL/Choice/Prüfen ob ein Memofeld leer ist
Top
Choice(Sel(MemoStr(TABELLE.MemoFeld) = ""),"Kein Inhalt","Inhalt vorhanden!");


ChooseFile

Aktuelle Verzeichnis darstellen
TurboPL/ChooseFile/Aktuelle Verzeichnis darstellen
Top
ChooseFile("") zeigt das aktuelle Verzeichnis.

ChooseFile und CopyFile
TurboPL/ChooseFile/ChooseFile und CopyFile
Top
Siehe [CopyFile]

Nicht existierende Datei angeben
TurboPL/ChooseFile/Nicht existierende Datei angeben
Top
Mittels ChooseFile(Dateiname) kann auch eine nicht existierende Datei
angegeben werden.
Diese Möglichkeit kann z.B. verwendet werden um ein Memo zu sichern.

Pfad aus Dateinamen ermitteln
TurboPL/ChooseFile/Pfad aus Dateinamen ermitteln
Top
Procedure ExtractFilePath(sDateiname: String): String;
Vardef s, sResult: String;
Vardef i: Integer;

  s := sDateiname;
  sResult := "";
  i := Pos("\", s);
  While i > 0
    sResult := sResult + LeftStr(s, i);
    If s = "\"
      ..#Sonderfall: hinter letztem \ kein Text mehr vorhanden
      s := ""
    Else
       s := RightStr(s, Length(s) - i)
    End
  i := Pos("\", s);
  End
  Return sResult;
Endproc

Procedure Bildpfad;
..#Dateinamen bestimmen:
Vardef sPfad: String;
  T-Eingabe := "";
  sPfad := "";
  IF ChoosePicture("Bitte Bilddatei auswählen", "Datei|*.*|")
    sPfad := ExtractFilePath(T-Eingabe)
  End;
EndProc;

T-Eingabe verwenden
TurboPL/ChooseFile/T-Eingabe verwenden
Top
Choosefile übergibt den Dateinamen der gewählten Datei in der Variablen T-Eingabe.

Der Rückgabewert = 1 bedeutet, Datei ausgewählt.

Bitte beachten: ChooseFile nimmt einen Verzeichniswechsel vor.
Aus diesem Grund sollte man das Ausgangsverzeichnis speichern undanschließend sofort wieder dahin zurückwechseln.

Beispiel:

PROCEDURE Import_starten
   VARDEF sAktDir : STRING
   sAktDir := GetDir(0)
   T-Eingabe := PARAM.Importverzeichnis + "\*.TXT";
   IF ChooseFile("Bitte Quelldatei auswählen!") = 1
    CHDIR(sAktDir);
   END
ENDPROC

Textdatei auswählen und Inhalt zeigen
TurboPL/ChooseFile/Textdatei auswählen und Inhalt zeigen
Top
Procedure Textdatei_Auswahl_und_Inhalt_Zeigen;
..#Eine einfache Methode den Inhalt eine Textdatei zu zeigen. Die Datei kann vorher ausgewählt werden.
..##
VarDef nFH : Integer;
VarDef sStr : String;
VarDef sDatei : String;

  ..#datei wählen
  If ChooseFile("Textdatei auswählen", "Textdatei (*.txt)|*.txt|Alle Dateien (*.*)|*.*|", sDatei) <> 1
    Return
  End;
  ..#und öffnen
  nFH := Reset(sDatei);
  If nFH = 0
    Message("Datei " + sDatei + " kann nicht geöffnet werden!", "Fehler - Datei zeigen");
    Return
  End;
  ..#und lesen
  While NOT Eot(nFH)
    sStr := sStr + Read(nFH, 1);
  End;
  ..#und inhalt zeigen
  Message(sStr, "Inhalt " + sDatei);
  ..#und schliessen
  Close(nFH);
EndProc;

Verschiedene Aufruf Möglichkeiten
TurboPL/ChooseFile/Verschiedene Aufruf Möglichkeiten
Top
  Vardef sFile : String;
  Vardef nRT : Integer;

  ..#standard öffnen dialog zeigen und rückgabe in globale var t-eingabe
  nRT := ChooseFile("");
  ?nRT = 1 / Message(T-Eingabe);
  ..#
  ..#öffnen dialog mit eigene überschrift zeigen und rückgabe in globale var t-eingabe
  nRT := ChooseFile("Datei wählen ...");
  ?nRT = 1 / Message(T-Eingabe);
  ..#
  ..#öffnen dialog mit eigene überschrift, filter zeigen und rückgabe in globale var t-eingabe
  nRT := ChooseFile("Text Datei wählen ...", "Textdatei (*.txt)|*.txt|Alle Dateien (*.*)|*.*|");
  ?nRT = 1 / Message(T-Eingabe);
  ..#
  ..#öffnen dialog mit eigene überschrift, filter zeigen und rückgabe in lokale var sFile
  nRT := ChooseFile("Text Datei wählen ...", "Alle Dateien (*.*)|*.*|", sFile);
  ?nRT = 1 / Message(sFile);
  ..#
  ..#öffnen dialog mit eigene überschrift, filter zeigen, lokale var vorbelegen und rückgabe in lokale var sFile
  sFile := "*.bmp";
  nRT := ChooseFile("Text Datei wählen ...", "Alle Dateien (*.*)|*.*|", sFile);
  ?nRT = 1 / Message(sFile);


ChooseFolder

Verzeichnis auswählen und Inhalt in einem Formular Memofeld ausgeben
TurboPL/ChooseFolder/Verzeichnis auswählen und Inhalt in einem Formular Memofeld ausgeben
Top
procedure btnShowFolderBeimAnklicken;
..#Verzeichnis einlesen
..##
  Var CCRLF = Chr(13) + Chr(10);
  Vardef nRT: Integer;
  Vardef sFolder: String;
  Vardef FName, FAttributes, FFolder: string;
  Vardef FSize: Integer;
  Vardef FDate: Date;
  Vardef FTime: Time;
  Vardef sStr : String;
  Vardef MemoCtrl : Memo;

  sStr := "";
  ..#Vorbelegung Projektverzeichnis
  sFolder := BaseDir;
  ..#Dialog ausführen
  nRT := ChooseFolder("Wähle Verzeichnis welches gelesen soll ...", sFolder);
  ..#Auf Eingabe reagieren
  If nRT <> 1
    Message("Abbruch gedrückt");
    Halt;
  End
  ..#
  nRT := FindFirstFile(sFolder + "\*.*", "DHS", FName, FSize, FDate, FTime, FAttributes, FFolder);
  While nRT = 0
    If not FName = "." and not FName = ".."
      sStr := sStr + Exchange(Lower(FFolder + FName), "\\", "\") + CCRLF;
    End;
    nRT := FindNextFile(FName, FSize, FDate, FTime, FAttributes, FFolder);
  End;
  CloseFindFile;
  MemoCtrl := FindControl("Memo1") as Memo;
  MemoCtrl.Text := sStr;
  Message("Verzeichnis " + sFolder + " wurde gelesen.", "Verzeichnis lesen");
EndProc;


ChoosePicture

Rückgabe des Verzeichnisses aus dem das Bild gewählt wurde
TurboPL/ChoosePicture/Rückgabe des Verzeichnisses aus dem das Bild gewählt wurde
Top
Procedure AuswahlJPGoderGIFBild: String
  ..#1. Aktuelle Verzeichnis merken.
  ..#2. Verzeichnis wechseln + Dateiauswahl
  ..#3. Arbeitsverzeichnis zurücksetzen
  VarDef sOrgDir : String;
  sOrgDir := GetDir(0);
  T-Eingabe := "C:\Demo\*.JPG";
  ChDir("C:\Demo");
  IF ChoosePicture("Bilddatei auswählen", 32 + 64) = 1
   ChDir(sOrgDir);
   RETURN T-Eingabe;
  ELSE
   ChDir(sOrgDir);
   RETURN "";
  END
ENDPROC;

Chr

Beispiele
TurboPL/Chr/Beispiele
Top
..#
....Zeilenumbruch mittels Chr(13) + Chr(10)
..#

Als Konstante definiert:
  CRLF = Chr(13) + Chr(10);

oder als DEF
  DEF = Chr(13) + Chr(10);

oder als VAR
  Var CCRLF = Chr(13) + Chr(10);

..#
....Zeilenumbruch in einem String setzen (als Prozedur)
..#

Procedure SetCRLF(nTimes:Integer):String;
..#setzt zeilenumbruch in einem string
..#ntimes = anzahl zeilenumbrüche die gesetzt werden
..##
Var CCRLF = Chr(13) + Chr(10);
Vardef i : Integer;
Vardef sStr : String;
  sStr := "";
  ?nTimes <= 0 / Return sStr
  NLoop(i, nTimes - 1, sStr := sStr + CCRLF);
  Return sStr
Endproc;

..#
....Sonderzeichen
..#
Verschiedene Sonderzeichen:

Chr(9)  = Tab
Chr(13) = Return
Chr(184) = © = Copyright

Sonderzeichen
TurboPL/Chr/Sonderzeichen
Top
....Sonderzeichen
..#
Verschiedene Sonderzeichen:

Chr(9)  = Tab
Chr(13) = Return
Chr(184) = © = Copyright
Zeilenumbruch
TurboPL/Chr/Zeilenumbruch
Top
....Zeilenumbruch mittels Chr(13) + Chr(10)
..#

Als Konstante definiert:
  CRLF = Chr(13) + Chr(10);

oder als DEF
  DEF = Chr(13) + Chr(10);

oder als VAR
  Var CCRLF = Chr(13) + Chr(10);
Zeilenumbruch als Prozedur
TurboPL/Chr/Zeilenumbruch als Prozedur
Top
....Zeilenumbruch in einem String setzen (als Prozedur)
..#

Procedure SetCRLF(nTimes:Integer):String;
..#setzt zeilenumbruch in einem string
..#ntimes = anzahl zeilenumbrüche die gesetzt werden
..##
Var CCRLF = Chr(13) + Chr(10);
Vardef i : Integer;
Vardef sStr : String;
  sStr := "";
  ?nTimes <= 0 / Return sStr
  NLoop(i, nTimes - 1, sStr := sStr + CCRLF);
  Return sStr
Endproc;

Zeilenumbruch mittels Chr
TurboPL/Chr/Zeilenumbruch mittels Chr
Top
Als Konstante definiert:
  CRLF = Chr(13) + Chr(10);

oder als DEF
  DEF = Chr(13) + Chr(10);

oder als VAR
  Var CCRLF = Chr(13) + Chr(10);

Zeilenumbruch verwenden
TurboPL/Chr/Zeilenumbruch verwenden
Top
Zeilenumbruch im Text darstellen mittels
  "Zeile 1" + Chr(13) + Chr(10) + "Zeile 2".
oder
  DEF CRLF = Chr(13) + Chr(10);

"Zeile 1" + CRLF + "Zeile 2".

Gilt auch für die Funktion Message.


ClearDat

Beispiel alle Einträge eine Tabelle löschen
TurboPL/ClearDat/Beispiel alle Einträge eine Tabelle löschen
Top
Procedure Tabelle_alle_Einträge_löschen(nTabelle : Integer; sTabelle : String):integer
..#alle einträge der tabelle <nTabelle> unwiderruflich löschen
..#rückgabe: 0 = OK, 1 = fehler/abbruch
  Vardef nCnt : Integer;
  Vardef sHdg : String;

  ..#parameter prüfen und Vorgaben setzen
  ?nTabelle = 0 / Return 1
  ?sTabelle = "" / Return 1
  sHdg := sTabelle + " alle Einträge löschen"
  ..#anzahl einträge
  nCnt := FileSize(nTabelle);
  If nCnt = 0
    Meldung_Fehler("Abbruch: " + sTabelle + " nicht gefunden.", sHdg);
    Return 1
  End;
  If Message("Wollen Sie wirklich alle " + sTabelle + " (#" + Str(nCnt) + ") unwiderruflich löschen?", sHdg, 2) <> 1
    Return 1
  End;
  Try
    ..#alle einträge löschen
    ClearDat(nTabelle);
    ..#autonummer wieder auf 1 setzen
    SetAuto(nTabelle, 1);
    ..#indices regenieren
    RegenAll(nTabelle);
    ..#anzeige aktualisiere
    Refresh;
  Except
    Meldung_Fehler("Einträge der " + sTabelle + " konnten nicht gelöscht werden!", sHdg);
    Return 1
  End;
  ..
  Meldung_Info("Alle Einträge der " + sTabelle + " (#" + Str(nCnt) + ") wurden gelöscht.", sHdg);
  Return 1

Clip2Text

Inhalt der Zwischenablage zeigen
TurboPL/Clip2Text/Inhalt der Zwischenablage zeigen
Top
Procedure Zeige_Zwischenablage;
..#zeigt den inhalt der zwischenablage
..##
  Var CHDG = "Inhalt der Zwischenablage zeigen";
  Var CERR1 = "Abbruch: Datei zur Speicherung Inhalt Zwischenablage konnte nicht gelesen werden.";
  Var CERR2 = "Abbruch: Die Zwischenablage ist leer.";
  Vardef sStr : String;
  Vardef nFH : Integer;

  ..#inhalt zwischenablage zum ramtext kopieren
  Clip2Text;
  nFH := Reset("RAMTEXT");
  If nFH = 0
    Message(CERR1, "Fehler - " + CHDG);
    Return
  End;
  While Not EOT(nFH)
    sStr := sStr + ReadLn(nFH) + Chr(13) + Chr(10);
  End;
  Close(nFH);
  Message(sStr, CHDG);
EndProc;


CombineDateTime

Beispiele CombineDateTime
TurboPL/CombineDateTime/Beispiele CombineDateTime
Top
..#format aktuellen computer setzen
SetNumberFormats(-1, -1, -1);

..#datum und aktuelle zeit ausgeben, 3 = zeit in sekunden
DateTimeStr(CombineDateTime(Today, Now), 3)

..#aktuelles datum und zeit in eine datei schreiben
WriteLn(nFH, DateTimeStr(CombineDateTime(Today, Now), 3));

Heute im Format Datum, Zeit, Wochentag und Woche ausgeben
TurboPL/CombineDateTime/Heute im Format Datum, Zeit, Wochentag und Woche ausgeben
Top
Var sStr : String;

sStr := "";
sStr := sStr + "Heute " + DateTimeStr(CombineDateTime(Today, Now), 3);
sStr := sStr + ", " + DayOfWeek(Today) + ", " + "Woche " + Str(Week(Today));
Message(sStr);

Ausgabe ist:
Heute 11.05.2009 08:39:21, Montag, Woche 20

CopyFile

Datei auswählen und kopieren
TurboPL/CopyFile/Datei auswählen und kopieren
Top
Procedure GetFileFromDir(sPath : String) : String;
    Vardef sSep : String
    sSep := Choice(Sel(sPath := Exchange(sPath," ","") HAT "\"),"\",":")
    Repeat
    Until Not sPath := RightStr(sPath, Length(sPath) - POS(sSep, sPath)) HAT sSep
    Return sPath
Endproc

Procedure Kopiere_Datei_zum_Verzeichnis;
..#datei zum einem verzeichnis kopieren
..##
   T-Eingabe := "*.*";
   If ChooseFile("Datei auswählen der zum " + TABELLE.Verzeichnis + "' kopiert werden soll.", "Bitmap|*.bmp|Gif|*.gif|Alle Dateien|*.*|") = 1
    CopyFile(T-Eingabe, TABELLE.Verzeichnis + GetFileFromDir(T-Eingabe));
    If IsFile(TABELLE.Verzeichnis + GetFileFromDir(T-Eingabe))
      Message("Datei '" + T-Eingabe + "' zum Thema-Verzeichnis " + TABELLE.Verzeichnis + " kopiert!", "INFORMATION");
    Else
      Message("Datei '" + T-Eingabe + "' konnte NICHT zum Thema-Verzeichnis " + TABELLE.Verzeichnis + " kopiert werden!", "FEHLER");
    End
   Else
    Return
   End;
Endproc;

Datensicherung Projektdatenbank durchführen
TurboPL/CopyFile/Datensicherung Projektdatenbank durchführen
Top
Procedure btnDBBackupBeimAnklicken;
..#eine sicherungsdatei der datenbank anlegen
..##
  Var CDBBAKFILE = BaseDir + "meinprojekt.tdbd";
  Var    CHDG = "Datensicherung";
  Var    CINF = "Sicherungsdatei " + CDBBAKFILE + " erfolgreich angelegt!";
  Var    CERR = "Sicherungsdatei " + CDBBAKFILE + " konnte NICHT angelegt werden.";
  Vardef nRT : Integer;  ..#returncode von copyfile: 0 = OK, sonst windows fehlercode

  nRT := CopyFile(CDBFILE, CDBBAKFILE);
  If nRT <> 0
    Message(CERR + " (Code = " + Str(nRT) + ")", CHDG)
  Else
    Message(CINF, CHDG);
  End;

CopyStrToClipboard

Notiz zur Zwischenablage kopieren
TurboPL/CopyStrToClipboard/Notiz zur Zwischenablage kopieren
Top
Procedure Notiz_zur_Zwischenablage;
..#kopiert den aktuellen tabelleneintrag zur zwischenablage
..##
  DEF CCRLF = Chr(13) + Chr(10);
  Vardef sStr : String;

  If ReadRec($TABELLE, RecNo($TABELLE)) = 0
    Return
  End;
  ..#string initialisieren
  sStr := "";
  ..#betreff als erstes
  sStr := sStr + $TABELLE.Betreff + CCRLF;
  ..#memofeld beschreibung
  sStr := sStr + $TABELLE.Beschreibung + CCRLF;
  ..#und kopieren
  CopyStrToClipboard(sStr);
EndProc;


Count

Prüfen im Datenbankjob ob Datensätze vorhanden sind
TurboPL/Count/Prüfen im Datenbankjob ob Datensätze vorhanden sind
Top
Gebe eine Meldung aus, wenn keine Datensätze gefunden wurden und beende
den Job entsprechend

..
.Epilog
.If Count($TABELLE) = 0
.Do Message("Abbruch: Keine Datensätze vorhanden!", "HINWEIS")
.ST

CreateOleObject


DataWnd

Alle Oberflächenfunktionen können mit dem Punktoperator als Funktion des Forumlars ausgeführt werden
TurboPL/DataWnd/Alle Oberflächenfunktionen können mit dem Punktoperator als Funktion des Forumlars ausgeführt werden
Top
..#datenfenster definieren
VarDef dwDatenfenster: DataWnd;

..#und suchen
dwDatenfenster := FindDataWnd("TABELLE.Formular");
..#wenn nicht gefunden, dann abbruch
?NOT Assigned(dwDatenfenster) / Return
..#Daten ausgeben
..#Datensatznummer 123
dwDatenfenster.ShowRec(123);
..#aktueller Datensatz
dwDatenfenster.CurrentRecNo;

Anzahl Markierungen in ein Formular ermitteln
TurboPL/DataWnd/Anzahl Markierungen in ein Formular ermitteln
Top
VarDef dwDatenfenster: DataWnd
..#prüfungen durchführen
..#anzahl adressen ermitteln, sind keine da dann abbruch
?FileSize($TABELLE) = 0 / Return
dwDatenfenster := DatenfensterSuchen("TABELLE.Formular");
?NOT Assigned(dwDatenfenster) / Return
..#gibt es markierte adressen
nSCnt := dwDatenfenster.StarNum;
If nSCnt = 0
  Message("Es wurden keine markierte Einträge gefunden!", "Hinweis");
  Return
End;

DateTime

Anzahl Tage zwischen zwei Dati
TurboPL/DateTime/Anzahl Tage zwischen zwei Dati
Top
VarDef rDaysBetween : Real;
rDaysBetween := $TABELLE.MyDateField2 - $TABELLE.MyDateField1;
Bei Operationen auf Date und DateTime Felder sind Variablen vom Typ Date und DateTime zu verwenden.
TurboPL/DateTime/Bei Operationen auf Date und DateTime Felder sind Variablen vom Typ Date und DateTime zu verwenden.
Top
Beispiele:
TABELLE.MyDateField
TABELLE.MyDateTimeField

VarDef dMyDate : Date;
VarDef dtMyDateTime : DateTime;

dMyDate := $TABELLE.MyDateField;
dMyDateTime := $TABELLE.MyDateTimeField;


DateTimeStr

Datum und Zeit in einem Datenbankjob ausgeben
TurboPL/DateTimeStr/Datum und Zeit in einem Datenbankjob ausgeben
Top
Beispiel wie ein DateTimeFeld in einem Datenbankjob ausgegeben werden kann:

$(@a8b $AUFGABEN.Aufgabe:100)
$(@a8n DateTimeStr($AUFGABEN.AufgenommenAm,3):40)
$(DateTimeStr($AUFGABEN.ErledigenBis,3):40)

Hinweise
Die Fontangabe @a8b definiert wird mittels
.FONT a8b = Arial, 8, b

DateTimeStr($AUFGABEN.AufgenommenAm,3):40 ausgegeben wird als dd.mm.YYYY ss:mm.
Beispiel: 01.04.2009 11:11
Datum, Zeit, Wochentag und Woche ausgeben
TurboPL/DateTimeStr/Datum, Zeit, Wochentag und Woche ausgeben
Top
Vardef sStr : String;

sStr := "";
sStr := sStr + "Heute " + DateTimeStr(CombineDateTime(Today, Now), 3);
sStr := sStr + ", " + DayOfWeek(Today) + ", " + "Woche " + Str(Week(Today));

DBName

Aktuelle Tabellennummer abfragen und mit Tabellenname vergleichen
TurboPL/DBName/Aktuelle Tabellennummer abfragen und mit Tabellenname vergleichen
Top
If DBName(FileNo) = 'meintab.dat'
  //Tabelle gefunden...
End;

Liste der Projekttabellen - einfach
TurboPL/DBName/Liste der Projekttabellen - einfach
Top
Procedure Projekttabellen-Liste;
..#listet alle tabellen eines projekts
..##
  Vardef i : Integer;
  Vardef sStr : String;

  sStr := "Tabellenliste für Projekt <Projektname>" + Chr(13) + Chr(10);
  sStr := "Anzahl Tabellen: " + Str(MaxFile) + Chr(13) + Chr(10);
  For i := 1 To MaxFile
    sStr := sStr + Str(i) + " : " + DBName(i) + Chr(13) + Chr(10);
  Next
  Message(sStr, "Liste der Tabellen");
Endproc;


Liste der Projekttabellen - erweitert
TurboPL/DBName/Liste der Projekttabellen - erweitert
Top
Procedure Projekttabellen-Liste;
..#listet alle tabellen eines projekts
..##
  Vardef i : Integer;
  Vardef sStr : String;

  sStr := "Tabellenliste für Projekt <Projektname>" + Chr(13) + Chr(10);
  sStr := sStr + "Anzahl Tabellen: " + Str(MaxFile) + Chr(13) + Chr(10);
  sStr := sStr + "-----------------------------------------" + Chr(13) + Chr(10);
  sStr := sStr + "Nr : Tabellenname (#Datensätze)" + Chr(13) + Chr(10);
  sStr := sStr + "-----------------------------------------" + Chr(13) + Chr(10);
  For i := 1 To MaxFile
    sStr := sStr + Str(i) + " : " + DBName(i) + " (#" + Str(FileSize(i)) + ")" + Chr(13) + Chr(10);
    ..oder nur der tabellenname
    ..sStr := sStr + Str(i) + " : " + DBName(i) + Chr(13) + Chr(10);
  Next
  sStr := sStr + Chr(13) + Chr(10);
  sStr := sStr + "Stand: " + DateTimeStr(CombineDateTime(Today, Now), 3) + Chr(13) + Chr(10);
  Message(sStr, "Liste der Tabellen");
  ..oder zum clipboard
  ..CopyStrToClipboard(sStr);
Endproc


DEF

DEF in Datenbankjobs definieren
TurboPL/DEF/DEF in Datenbankjobs definieren
Top
.DEF CRLF = Chr(10) + Chr(13)
DEF in Module definieren
TurboPL/DEF/DEF in Module definieren
Top
In ein globales Modul verschiedene DEFs definieren, wie

  DEF DEFCRLF = Chr(13) + Chr(10);
  DEF DEFCRLF2 = Chr(13) + Chr(10) + Chr(13) + Chr(10);

Verwendung für Meldungen:
  Message("Notiz " + DEFCRLF2 + GetField(NOTIZEN, LabelNo(NOTIZEN, "Betreff")) +
DEFCRLF2 + "ist leer!");

Die Definition von

  DEF DEFCRLF2 = DEFCRLF + DEFCRLF;

vermeiden. Führt zu einer Fehlermeldung.


DLLProc

Alternative Messagebox mittels Windows API
TurboPL/DLLProc/Alternative Messagebox mittels Windows API
Top
Verwendet wird die Funktionen MessageBoxW aus der Windows user32.dll.
dllproc MessageBoxW(hWnd: Integer;
                    lpText: String;
                    lpCaption: String;
                    dwType: Integer): Integer Library 'user32.dll';

Procedure Meldung_Fehler(sMeldung, sÜberschrift : String);
..#standard fehlermeldung plus überschrift
..#Falls error.meldung <> "" wird diese auch noch mit ausgegeben
  Var CCRLF2 = Chr(13) + Chr(10) + Chr(13) + Chr(10);
  Vardef sMsg : String;  ..die meldung die ausgegeben wird

  sMsg := sMeldung;
  If Error.Meldung <> ""
    sMsg := sMsg + CCRLF2;
    sMsg := sMsg + "Beschreibung: " + Error.Meldung;
    sMsg := sMsg + " (" + Str(Error.Number) + ")";
  End;
  ..#überschrift anpassen
  ?sÜberschrift = "" / sÜberschrift := "Fehler";
  MessageBoxW(0, sMsg, sÜberschrift, MB_OK +  MB_ICONERROR);
  ..Message(sMsg, sÜberschrift, 1);
EndProc;

Procedure Meldung_Warnung(sMeldung, sÜberschrift : String);
..#standard hinweismeldung plus überschrift
  ?sÜberschrift = "" / sÜberschrift := "Warnung";
  MessageBoxW(0, sMeldung, sÜberschrift, MB_OK + MB_ICONWARNING);
  ..Message(sMeldung, sÜberschrift, 1);
EndProc;

Procedure Meldung_Info(sMeldung, sÜberschrift : String);
..#standard infomeldung plus überschrift
  ?sÜberschrift = "" / sÜberschrift := "Information";
  MessageBoxW(0, sMeldung, sÜberschrift, MB_OK +  MB_ICONASTERISK);
  ..Message(sMeldung, sÜberschrift, 1);
EndProc;
Beispiel Aufruf eines Internet URLs mittels ShellExecuteA
TurboPL/DLLProc/Beispiel Aufruf eines Internet URLs mittels ShellExecuteA
Top
DLLProc ShellExecuteA(hwnd:Integer;LpOp:String;LPFile:String;LpPar:String;LpDir:String;nCmd:Integer):Integer Library "Shell32.dll";

Procedure Aufruf_URL;
..#Ein URL aufrufen
..##
   Vardef sUrl : String;
   Vardef nHdl : Integer;
   nHdl:= 0
   sUrl := "http://www.rwblinn.de"
   ShellExecuteA(nHdl, "Open", sUrl, "", "", 1);
EndProc;

Beispiel mittels Delphi DLL Computer und Benutzername anzeigen
TurboPL/DLLProc/Beispiel mittels Delphi DLL Computer und Benutzername anzeigen
Top
..#Im TurboPL Modul dllprocs definieren und als beispiel eine testaufruf
..#die rotsnet.dll enthält die prozeduren
DLLProc TSGetComputerName(Var sResult: string as LPStr) library "rotsnet.dll";
DLLProc TSGetCurrentUserName(Var sResult: string as LPStr) library "rotsnet.dll";

Procedure NetInfo;
..#computername und benutzer anzeigen
  Vardef sComputerName, sCurrentUserName: String;

  sComputerName := "<Unbekannt>";
  TSGetComputerName(sComputerName);
  sCurrentUserName := "<Unbekannt>";
  TSGetCurrentUserName(sCurrentUserName);
  Message("Computername: " + sComputerName + Chr(13) + Chr(10) + "Benutername: " + sCurrentUserName + Chr(13) + Chr(10));
Endproc;

..#In Delphi folgende Library definieren und die fertige dll im Projektverzeichnis kopieren
Library rotsnet;
Uses
  ShellAPI, Windows, SysUtils;
{$R *.RES}
Procedure TSGetComputerName(pResult : PChar);StdCall; Export;
//lese computername
var
  buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
  Size: Cardinal;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  Windows.GetComputerName(@buffer, Size);
  StrPLCopy(pResult, StrPas(buffer), 255);
end;

Procedure TSGetCurrentUserName(pResult : PChar);StdCall; Export;
 var iLen: Cardinal;
 var S : String;
begin
  iLen := 255;
  SetLength(S, iLen - 1);
  if GetUserName(PChar(S), iLen) then
    SetLength(S, iLen - 1)
  else
    begin RaiseLastWin32Error;
    end;
  StrPLCopy(pResult, S, 255);
end;
//
//EXPORTS
//
Exports
  TSGetComputerName     Index 1,
  TSGetCurrentUserName  Index 2;

Begin
End.

Computer- und Benutzername ermitteln mittels Funktion aus der kernel32.dll
TurboPL/DLLProc/Computer- und Benutzername ermitteln mittels Funktion aus der kernel32.dll
Top
dllproc GetComputerNameW(Var lpBuffer: String; Var nSize: Integer): Integer Library 'kernel32.dll';
dllproc GetUserNameW(Var lpNameBuffer : String; nSize : Integer): Integer Library 'advapi32.dll';

Procedure ZeigeComputerName : String;
..#zeigt der aktuelle computername
..##
  Vardef sResult : String;
  Vardef nSize : Integer;
  ..#Init ist wichtig
  nSize := 1024;
  sResult := FillStr(' ', ' ', nSize);
  Try
    If GetComputerNameW(sResult, nSize) <> 0
      Message("Computername: " + sResult, "Information")
      Return sResult
    Else
      Message("Computername kann nicht ermittelt werden!", "Fehler");
      Return ""
    End;
  Except
    Message("Computername kann nicht ermittelt werden!", "Fehler");
    Return ""
  End;
Endproc;

Procedure ZeigeBenutzerName : String;
..#zeigt der aktuelle benutzername
..##
  Vardef sResult : String;
  Vardef nSize : Integer;;
  ..#Ini ist wichtig
  nSize := 255;
  sResult := FillStr(' ', ' ', nSize);
  GetUserNameW(sResult, nSize);
  Message("Username: " + sResult, "Information")
  Return
  ..#funktioniert nicht. Warum?
  Try
    GetUserNameW(sResult, nSize);
    Message("Username: " + sResult, "Information")
    Return sResult
  Except
    Message("Benutzername kann nicht ermittelt werden!", "Fehler");
    Return ""
  End;
Endproc;

..#
..# Zweite Möglichkeit
..#
dllproc GetComputerNameW(var computerName: String; var size: Integer): Integer Library "Kernel32.dll";
dllproc GetUserNameW(var userName: String; var size: Integer): Integer Library "Advapi32.dll";

Procedure GetUserName: String;
Vardef Size: Integer;
Vardef UserName: String;
  Size := 1024;
  UserName := NTimes(" ", Size);
  GetUserNameW(UserName, Size);
  Return UserName
Endproc;

Procedure GetComputerName: String;
Vardef Size: Integer;
Vardef ComputerName: String;
  Size := 1024;
  ComputerName := NTimes(" ", Size);
  GetComputerNameW(ComputerName, Size);
  Return ComputerName
Endproc;

Procedure GetUserNameAndComputerName
  Message(GetUserName + " sitzt an Rechner: " + GetComputerName);
Endproc;

Cursor Normal oder als Sanduhr mittels Funktionen aus der user32.dll setzen
TurboPL/DLLProc/Cursor Normal oder als Sanduhr mittels Funktionen aus der user32.dll setzen
Top
..#Konstanten definieren aus der windows api
Var OCR_NORMAL = 32512;  ..#normal als zeigen
Var OCR_WAIT = 32514;       ..#sanduhr = warten

..#Windows api funktionen cursor laden und setzen
DLLProc LoadCursorA(hInstance: Integer; lpCursorName: Integer): Integer Library "user32.dll";
DLLProc SetCursor(hCursor: Integer): Integer Library "user32.dll";
.
procedure SetCursorTo(nM : Integer);
..#setzt den cursor.
..#cursor als sanduhr: SetCursorTo(OCR_WAIT); oder normal SetCursorTo(OCR_NORMAL)
..##
  Vardef nC : Integer;
  nC := LoadCursorA(0, nM);
  SetCursor(nC);
Endproc;

..#Beispiel Cursor zeigen für lange operationen - zB suche mittels BySelection (TurboPL)
  Try
    SetCursorTo(OCR_WAIT);
    ViewPage(-1);
    ..#erst alle datensätze anzeigen, dazu markierungen entfernen
    SetSortOrder("MARKIERUNG");
    AlleMarkierungenEntfernen(1);
    SetSortOrder(sIndex);
    ..#dann datum suche durchführen
    nRT := BySelection("LetzteAenderung >= " + sStr,1,1);
    SetCursorTo(OCR_NORMAL);
    sMsg := "";

Datei öffnen mit Dialog mittels ShellExecuteW
TurboPL/DLLProc/Datei öffnen mit Dialog mittels ShellExecuteW
Top
DLLProc ShellExecuteW(hWnd: Integer; lpOperation: String; lpFile: String; lpParameters: String; lpDirectory: String; nShowCmd: Integer): Integer Library 'shell32.dll';

procedure Datei_Öffnen_Mit
..#Diese Proceudre zeigt den Öffnen-Mit-Dialog an. Als Parameter muss die Datei übergeben werden, auf die der Dialog reagieren soll.
..#Als Beispiel wird hier die datei text.txt angegeben
..##
  ShellExecuteW(0, 'open','rundll32.exe', 'shell32.dll,OpenAs_RunDLL ' + 'test.txt', "", 5);
endproc;

Eigene Fehlermeldung plus zusätzlich Error.Beschreibung ausgeben
TurboPL/DLLProc/Eigene Fehlermeldung plus zusätzlich Error.Beschreibung ausgeben
Top
..#DLLProc definieren
dllproc MessageBoxW(hWnd: Integer; lpText: String; lpCaption: String; dwType: Integer): Integer Library 'user32.dll';

Procedure Meldung_Fehler(sMeldung, sÜberschrift : String);
..#standard fehlermeldung plus überschrift
..#Falls error.meldung <> "" wird diese auch noch mit ausgegeben
..#dieses beispiel braucht ein windows dll messageboxw
..##
  Var CCRLF2 = Chr(13) + Chr(10) + Chr(13) + Chr(10);
  Vardef sMsg : String;  ..die meldung die ausgegeben wird

  sMsg := sMeldung;
  If Error.Meldung <> ""
    sMsg := sMsg +  + CCRLF2 + "Beschreibung: " + Error.Meldung + " (" + Str(Error.Number) + ")";
  End;
  ..#überschrift anpassen
  ?sÜberschrift = "" / sÜberschrift := "Fehler";
  MessageBoxW(0, sMsg, sÜberschrift, MB_OK +  MB_ICONERROR);
  ..oder mittels TS message
  ..Message(sMsg, sÜberschrift, 1);
EndProg;

EMail senden mittels ShellExecuteW
TurboPL/DLLProc/EMail senden mittels ShellExecuteW
Top
DLLProc ShellExecuteW(hWnd: Integer; lpOperation: String; lpFile: String; lpParameters: String; lpDirectory: String; nShowCmd: Integer): Integer Library 'shell32.dll';

Procedure Adresse_Mailen;
..#adresse mailen
..##
..Beispiel: ShellExecuteW(0, "", "mailto:robert@rwblinn.de", "", "", 5);
  Vardef sEMail : String;
  If $ADRESSEN.EMail <> ""
    sEMail := "mailto:" + $ADRESSEN.EMail;
    ShellExecuteW(0, "", sEMail, "", "", 5);
  End;
Endproc;

oder

Procedure Tipp_Senden;
..##
  ..#sonderzeichen für zeilenumbruch im email text
  Var CCRLF = "%0D%0A"; ..Chr(13) + Chr(10);
  Vardef sWWW : String;

  ..erst mal ein wieder ein paar prüfungen
  ?FileSize(TIPPS) = 0 / Return
  ?ReadRec(TIPPS, RecNr(TIPPS)) = 0 / Return
  ..#adresse vorbelegen
  sWWW := "mailto:name@adresse.xyz?"
  sWWW := sWWW + "subject="+$TIPPS.Makro;
  sWWW := sWWW + "&body="+$TIPPS.Beschreibung;
  ..sonderzeichen umsetzen
  sWWW := Exchange(sWWW, Chr(13) + Chr(10), "%0D%0A");
  ..#dll ausführen
  ShellExecuteW(0, "open",sWWW, "","",5);
Endproc;

Meldungsfenster mittels MessageBoxW
TurboPL/DLLProc/Meldungsfenster mittels MessageBoxW
Top
..#Konstanten definieren (aus der windows api)
const  MB_OK = 0;
const  MB_OKCANCEL = 1;
const  MB_ABORTRETRYIGNORE = 2;
const  MB_YESNOCANCEL = 3;
const  MB_YESNO = 4;
const  MB_RETRYCANCEL = 5;

const  MB_ICONERROR = 16;
const  MB_ICONQUESTION = 32;
const  MB_ICONWARNING = 48;
const  MB_ICONASTERISK = 64;

const  MB_DEFBUTTON1 = 0;
const  MB_DEFBUTTON2 = 256;
const  MB_DEFBUTTON3 = 512;

const  MB_APPLMODAL = 0;
const  MB_SYSTEMMODAL = 4096;
const  MB_TASKMODAL = 8192;

..#Messagebox dll aus der user32.dll
DLLproc MessageBoxW(hWnd: Integer; lpText: String; lpCaption: String; dwType: Integer): Integer Library 'user32.dll';
..#Beispiele
..#procedure MessageBoxTest;
..#Beispiel
..# Vardef nType : Integer;
..# nType := MB_YESNOCANCEL + MB_ICONERROR;
..# MessageBoxW(0, "Testmeldung", "Testüberschrift", nType);
..#oder
..# MessageBoxW(0, sMsg, sÜberschrift, MB_OK +  MB_ICONERROR);
..# MessageBoxW(0, sMeldung, sÜberschrift, MB_OK + MB_ICONWARNING);
..# MessageBoxW(0, sMeldung, sÜberschrift, MB_OK +  MB_ICONASTERISK);
..#endproc;

Windows Funktion ShellExecuteA
TurboPL/DLLProc/Windows Funktion ShellExecuteA
Top
Definition von ShellExecuteA:

DLLProc ShellExecuteA(hwnd:Integer;LpOp:String;LPFile:String;LpPar:String;LpDir:String;nCmd:Integer):Integer Library "Shell32.dll";


EmbedBlob


EndProg

Verwendung EndProg bei OnOpenProject
TurboPL/EndProg/Verwendung EndProg bei OnOpenProject
Top
Eine Anwendung verwendet eine Tabelle um Einstellungen zu speichern.
Diese Tabelle, auch Systemtabelle genannt, hat nur 1 Datensatz.
Bei starten der Anwendung wird die Prozedur OnOpenProject ausgeführt.
Bei der Ausführung wird der eine Datensatz der Systemtabelle gelesen.
Kann der Datensatz nicht gelesen werden, erfolgt einen Programmabbruch.

..#Tabelle SYSTEM lesen
..#Die Anwendung wird abgebrochen, wenn die Systemtabelle nicht gelesen werden
..#kann
Procedure OnOpenProject;
Var CHDG = "Anwendung";
Var CERR = "Abbruch: Die Optionen können nicht gelesen werden!";
Var CINF = "Aktion: Anwendung neu installieren."
Try
  MoveBegin(SYSTEM);
  ReadNext(SYSTEM);
  ..#Einträge aus der Systemtabelle lesen.
  ..#
Except
  Message(CERR + Chr(13) + Chr(10) + CINF, CHDG);
  EndProg;
EndProc;


EnumStr

Beispiel Anzeige Stringwert aus der angekoppelte Tabelle
TurboPL/EnumStr/Beispiel Anzeige Stringwert aus der angekoppelte Tabelle
Top
Procedure Zeige_Kundenfahrzeug;
  Message("Fahrzeug des Kunden: " + EnumStr(KFZ, LabelNo(KFZ, "Art"),KUNDEN.Fahrzeug.Art));
EndProg;

Beispiel KFZ Demo-Tabelle und Anzeige Enum Wert
TurboPL/EnumStr/Beispiel KFZ Demo-Tabelle und Anzeige Enum Wert
Top
Procedure Button1BeimAnklicken;
..##
 Vardef ExtStr: string;
 ExtStr := EnumStr(KFZ, LabelNo(KFZ, 'Art'), KFZ.Art);
 Message(ExtStr);
Endproc;


EnumVal

Beispiel Druckermodus festlegen und mittels Run drucken
TurboPL/EnumVal/Beispiel Druckermodus festlegen und mittels Run drucken
Top
Procedure BerichtDruckenBeimAnklicken;
..#der druckermodus ist in eine SYSTEM tabelle wie folgt definiert:
..#Feld: VorgabeDruckModus
..#Typ:  Enum, Size: 20
..#Specifikation: Druckdialog,Standard_Drucker,Druckvorschau,Datei
..##
  Vardef nModus : Integer; ..#druckermodus

  ..#druckermodus ermitteln
  nModus := EnumVal($SYSTEM, LabelNo($SYSTEM, "VorgabeDruckModus"), Str($SYSTEM.VorgabeDruckModus)) - 1;
  ..#und bericht ausgeben
  Run("TABELLE.MeinBericht", nModus);
Endproc;

Error

$Fehler nicht mehr verwenden, statt dessen Error
TurboPL/Error/$Fehler nicht mehr verwenden, statt dessen Error
Top
procedure ZeigeFehlermeldung;
..#ausgabe der error werte
..##
  Var CCRLF = Chr(13) + Chr(10);
  Var sMsg = "";

  sMsg := sMsg + "Nummer:" + Str(Error.Nummer)+ CCRLF;
  sMsg := sMsg + "Meldung:" + Error.Message + CCRLF;
  sMsg := sMsg + "Beschreibung:" + Error.Description+ CCRLF;
  Message(sMsg, "Fehler", 1);
endproc;


EsGibt

Verknüpfungen
TurboPL/EsGibt/Verknüpfungen
Top
Tabelle A, der mit der Tabelle B verknüpft ist,
Sätze zur Weiterbearbeitung markieren, die keinen Eintrag in Feld X, Tabelle B haben:
EsGibt(TabelleB,TabelleB.X#"")


Exchange

Platzhalter verwenden - Beispiel 1
TurboPL/Exchange/Platzhalter verwenden - Beispiel 1
Top
Vardef sStr : String;    ..#Zeichenkette mit Platzhalter
Vardef sTStr : String;    ..#Hilfszeichenkette
..#Platzhalter ersetzen
sStr := Exchange(sStr, "%d%", DateStr(ToDay));
sStr := Exchange(sStr, "%z%", TimeStr(Now));
sStr := Exchange(sStr, "%dz%", DateTimeStr(CombineDateTime(ToDay, Now)));
sStr := Exchange(sStr, "%jmt%", Str(Year(ToDay)) + Str(Month(Today),2,0,"","0") + Str(Day(Today),2,0,"","0"));
sStr := Exchange(sStr, "%h%", DayOfWeek(Today) + ", den " + DateStr(ToDay) + " um " + TimeStr(Now));
sStr := Exchange(sStr, "%w%", "Woche " + Str(Week(ToDay)));
sStr := Exchange(sStr, "%t%", DayOfWeek(Today));
sStr := Exchange(sStr, "%m%", Choice(Month(Today), "Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"));
sStr := Exchange(sStr, "%j%", Str(Year(ToDay)));
sTStr := "";
sStr := Exchange(sStr, "%kl%", "..#" + FillStr(sTStr, '*', 77));
sStr := Exchange(sStr, "%n%", Chr(13) + Chr(10));

Platzhalter verwenden - Beispiel 2
TurboPL/Exchange/Platzhalter verwenden - Beispiel 2
Top
Procedure MeldungSetzen(sMsg: string): string;
..#setzt eine Erstellungsmeldung unten am fenster
..##
Vardef sTmp : String;

  sTmp := sMsg;
  ?Pos( "%Datum", sTmp) > 0 / sTmp := Exchange(sTmp, "%Datum", DateStr(ToDay));
  ?Pos( "%Date",  sTmp) > 0 / sTmp := Exchange(sTmp, "%Date",  DateStr(ToDay));
  ?Pos( "%Zeit",  sTmp) > 0 / sTmp := Exchange(sTmp, "%Zeit",  TimeStr(Now));
  ?Pos( "%Time",  sTmp) > 0 / sTmp := Exchange(sTmp, "%Time",  TimeStr(Now));
  Return sTmp;
Endproc;

Platzhalter verwenden - Beispiel 3
TurboPL/Exchange/Platzhalter verwenden - Beispiel 3
Top
Procedure ReplaceMsgToken(sToken, sMsg : String) : String;
..##
Vardef sTMsg, sTmp : String;
Vardef nP : Real;

  ?(sMsg = "") Or (sToken = "") / Return sMsg
  sTMsg := "";
  sToken := Lower(sToken);
  If Pos(sToken, Lower(sMsg)) > 0
    While nP := Pos(sToken, Lower(sMsg)) > 0
     ?sToken = "%c%" / sTMsg := sTMsg + sMsg[1, nP - 1] + Chr(13) + Chr(10);
     ?sToken = "%t%" / sTMsg := sTMsg + sMsg[1, nP - 1] + "  ";
     ?sToken = "%d%" / sTMsg := sTMsg + sMsg[1, nP - 1] + DateStr(Today);
     ?sToken = "%z%" / sTMsg := sTMsg + sMsg[1, nP - 1] + TimeStr(Now);
     sTmp := sMsg[nP + 3, 255];
     sMsg := sTmp;
    End;
  End;
  sTMsg := sTMsg + sMsg;
  Return sTMsg;
Endproc;

Verschiedene Datum und Zeit Ausgaben anhand von Platzhalter
TurboPL/Exchange/Verschiedene Datum und Zeit Ausgaben anhand von Platzhalter
Top
Vardef sStr : String;

sStr := Exchange(sStr, "%d%", DateStr(ToDay));
sStr := Exchange(sStr, "%z%", TimeStr(Now));
sStr := Exchange(sStr, "%dz%", DateTimeStr(CombineDateTime(ToDay, Now)));
sStr := Exchange(sStr, "%jmt%", Str(Year(ToDay)) + Str(Month(Today),2,0,"","0") + Str(Day(Today),2,0,"","0"));
sStr := Exchange(sStr, "%h%", DayOfWeek(Today) + ", den " + DateStr(ToDay) + " um " + TimeStr(Now));
sStr := Exchange(sStr, "%w%", "Woche " + Str(Week(ToDay)));
sStr := Exchange(sStr, "%t%", DayOfWeek(Today));
sStr := Exchange(sStr, "%m%", Choice(Month(Today), "Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"));
sStr := Exchange(sStr, "%j%", Str(Year(ToDay)));

Ausgabe:
Datum = 13.08.2009
Zeit = 09:30
Datum + Zeit = 13.08.2009 09:30
Datum JJJMMTT = 20090813
Heute = Donnerstag, den 13.08.2009 um 09:30
Woche = Woche 33
Tag = Donnerstag
Monat = Aug
Zeichen durch HTML-Tags ersetzen
TurboPL/Exchange/Zeichen durch HTML-Tags ersetzen
Top
VarDef sTStr : String;

sTStr := "";
..#zeilenumbruch
sTStr := Exchange($TABELLE.MemoFeld, Chr(13) , "<BR>");
..#leerzeichen
sTStr := Exchange(sTStr, Chr(0) , "&nbsp;");
..#leerzeichen
sTStr := Exchange(sTStr, Chr(32) , "&nbsp;");
..#tab

ExecDialog

ExecDialog für eigene Hilfstexte verwenden
TurboPL/ExecDialog/ExecDialog für eigene Hilfstexte verwenden
Top
Procedure Hilfe_Zeigen(sID : String);
..#hilfetext in einem modulen fenster zeigen
..#verwendet wird eine tabelle mit hilfetexte:
..#Tabelle HILFETEXTE, Felder Hilfsthema (S50), Hilfstext (Memo), HilfsID (AutoNUmmer)
..#sID ist die autonummer des hilfetextes
..#Beispielaufruf: Hilfe_Zeigen("1");
..#alternativ kann auch ein feld mit zum beispiel formularname verwendet werden
..#Beispielaufruf: Hilfe_Zeigen("Formular 1");
..##
  Vardef nRNo : Integer;
  nRNo := Findrec(HILFSTEXTE, sID, "HILFSTEXTE.INR", 1);
  If nRNo > 0
    ExecDialog("HILFSTEXTE.hilfstexte-Formular", nRNo);
  Else
    Message("Hilfetext nicht gefunden!", "Hinweis");
  End;
EndProg;


ExecMacro

Ausführen ExecMacro einer anderen Tabelle
TurboPL/ExecMacro/Ausführen ExecMacro einer anderen Tabelle
Top
Wenn in einem Formular ein ExecMacro eine andere Tabelle ausgeführt wird,
kann es vorkommen, daß nachdem Datensätze markiert sind und ein Formular in
Tabellensicht aufgerufen wird, keine Datensätze angezeigt werden.

Hierzu folgenden Tipp wie die Datensätze angezeigt werden:
Statt Makro-Befehl
  EXECMACRO(Tabelle, Ausdruck...),
den Befehl
  ACTIVATEFORM(Formular);EXECMACRO(Tabelle, Ausdruck...)
verwenden.

ExecMacro kann auch Prozeduren aus nicht im Projekt eingebundenenModule ausführen
TurboPL/ExecMacro/ExecMacro kann auch Prozeduren aus nicht im Projekt eingebundenenModule ausführen
Top
Aufruf:
  ExecMacro(ModulName, Prozedur 1, Prozedur n ) : Real

Beispiel:

  ExecMacro(c:\daten\adres95\uti-pana, ProjektAnalyse,Zeige_ProjektAnalyseReport)

Dieses Beispiel ruft nach einander die Prozeduren ProjektAnalyse und Zeige_ProjektAnalyseReport aus dem Modul uti-pana.prg auf.
Mit der Funktion ExecMacro ist es Möglich eine Bibliothek von Moduleaufzubauen, die in den verschiedensten
Projekte verwendet werden können.
Das Beispiel analysiert alle Tabellen und Indizes in einem Projekt.

ExecMacro kann keine Proceduren innerhalb des gleichen Moduls aufrufen.
TurboPL/ExecMacro/ExecMacro kann keine Proceduren innerhalb des gleichen Moduls aufrufen.
Top
Beispiel:

  ExecMacro(SYSTEM,SystemMeldung("Test"));

SystemMeldung ist im  Modul SYSTEM definiert.
Es erscheint die Fehlermeldung, daß das Modul SYSTEM nicht gefundenwerden kann.
Innerhalb des gleichen Moduls die Procedure direkt aufrufen. FürsBeispiel wäre das SystemMeldung(...) direkt.


ExecProg

Inhalt eines Formular Memo ausführen
TurboPL/ExecProg/Inhalt eines Formular Memo ausführen
Top
ExecProg(Dateiname oder Feld[] oder Memo-Datenbankfeld) : Integer;

..#
..# Inhalt eines Formular Memos ohne Datenbankzuordnung ausführen
..# (Einfache Methode)
..#
procedure btnTestTurboPLBeimAnklicken;
..#formularmemo turbopl code ausführen. das memofeld ist kein datenbankfeld zugeordnet und
..#wird als objekt verwendet
..#Hinweis:
..#keine weitere prüfungen eingebaut
..#anstatt tempfile kann auch ramtext verwendet werden
..##
  Var CTEMPFILE = BaseDir+"x.x";
  Vardef nRT : Integer;
  Vardef memoCtrl: Memo;

  memoCtrl := FindControl("memoTestTurboPL") as Memo;
  nRT := Rewrite(CTEMPFILE);
  WriteLn(nRT, memoCtrl.Text);
  Close(nRT);
  nRT := ExecProg(CTEMPFILE);
  If nRT <> 0
    Message(Error.Message, "Fehler");
  End;
  DelFile(CTEMPFILE);
endproc;

..#
..# Inhalt eines Formular Memo ausführen (Ausführliche Methode)
..#
procedure btnTurboPLCodeAusfuehrenBeimAnklicken;
..#der code wird zeile für zeile gelesen und ausgeführt.
,,#der code befindet sich in ein memofled einer systemtabelle:
..#$SYSTEM.TurboPLMemo
..##
  Var CCRLF = Chr(13) + Chr(10);
  VarDef sTempPrg : String;
  VarDef sTempMod : String;
  VarDef nFH : Integer;           ..handle für dateiöffnen
  VarDef nRT : Integer;           ..returncode execprog
  VarDef i : Integer;            ..counter
  VarDef nFound : Integer;        ..flag ob proc gefunden wurde
  Vardef sProcname : String;      ..die proc die gesucht wird
  Vardef sLine : String;          ..zeilenbuffer
  Vardef asProcCode : String[];   ..codebuffer zeile für zeile

  sTempPrg := "temp.prg";
  sTempMod := "temp.mod";
  ..gibt es inhalt
  If $SYSTEM.TurboPLMemo = ''
    Message("Fehler: Kein Code definiert!", "Quellcode Ausführen");
    Return
  End;
  ..moduldatei setzen
  sTempMod := BaseDir + sTempMod;
  ..öffne modul
  If Copymemo($SYSTEM.TurboPLMemo, sTempMod) <> 0
    Message("Fehler: Temporäre Datei '" + sTempMod + "' kann nicht erstellt werden!","Quellcode Ausführen");
    Return
  End;
  nFH := Reset(sTempMod);
  If nFH = 0
    Message("Fehler: Temporäre Datei '" + sTempMod + "' kann nicht gelesen werden!","Quellcode Ausführen");
    Return
  End;
  ..
  i := 0;
  ClrArray(asProcCode);
  While Not EOT(nFH)
    sLine := ReadLn(nFH);
    ReDim(asProcCode, i);
    asProcCode[i] := sLine;
    i := i + 1;
  End;
  Close(nFH);
  If i = 0
    Message("Abbruch: Code wurde nicht gefunden!");
  Else
    nFH := Rewrite(sTempPrg);
    ..erste und letzte zeile mit angaben procedure (prozedur) und endproc (endproz) löschen
    ..sonst werden die anweisungen nicht ausgeführt
    asProcCode[0] := "";
    asProcCode[High(1, asProcCode)] := "";
    ..schreibe in eine temp datei
    NLoop(i, High(1,asProcCode), WriteLn(nFH, asProcCode[i]));
    Close(nFH);
    ..NLoop(i, High(1,asProcCode), Message(asProcCode[i]))
    ..ExecProg(asProcCode);
    ..führe tempdatei aus
    nRT := ExecProg(sTempPrg);
    ..falls fehler
    If nRT > 0
      Message("Fehler bei der Ausführung ' Fehlercode = " + Str(nRT) + CCRLF + Error.Message, "Quellcode Ausführen");
    End;
    ..tempdateien löschen
    DelFile(sTempMod);
    DelFile(sTempPrg);
  End;
endproc;


Execute

Anwendung ausführen
TurboPL/Execute/Anwendung ausführen
Top
procedure Anwendung_ausführen;
..#beispiel prozedur zur prüfung des übergabeparameters
..##
Var CHDGF = "Fehler - Anwendung ausführen";
Vardef nRT : Integer;
Vardef sAnwendung : String;

  sAnwendung := "test.exe";
  If Not IsFile(sAnwendung)
    Message("Abbruch: Anwendung '" + sAnwendung + "' nicht gefunden!", CHDGF);
    Return
  End;
  Try
    nRT := Execute(sAnwendung, 1);
  Except
    Message("Die Anwendung '" + sAnwendung + "' konnte nicht ausgeführt werden!", CHDGF);
  End;
endproc;

AppExecute Prozedur
TurboPL/Execute/AppExecute Prozedur
Top
Procedure AppExecute(sAppType: string; sApp: string; sFile: string; nTask: Integer);
..#eine anwendung ausführen, dabei fehlerbehandlung übernehmen
..##
   Vardef nRT : Integer;
   If sApp = ""
    Message("Abbruch: '" + sAppType + "' nicht angegeben.", "Fehler - Anwendung ausführen");
    Return
   End;
   ..nur check wenn pfadangabe, sonst wird path durchsucht
   If sApp hat "\"
    If (IsFile(sApp) = 0)
     Message("Abbruch: '" + sAppType + "' nicht gefunden (" + sApp + ").", "Fehler - Anwendung ausführen");
     Return
    End;
   End;
   ..wenn sfile ist - dann keine prüfung
   If sFile = "-"
    sFile := ""
   End
   If sFile <> ""
    nRT := Execute(sApp + " " + sFile, nTask);
   Else
    nRT := Execute(sApp, nTask);
   End;
   If nRT > 0
    Message("Abbruch: '" + sApp + "' konnte nicht ausgeführt werden.", "Fehler - Anwendung ausführen");
   End;
Endproc;

Dateien direkt ausführen
TurboPL/Execute/Dateien direkt ausführen
Top
Dateien, wie txt, ini etc. können direkt mittels Execute ausgeführt werden.
Beispiele:
  Vardef sAnwendung : String;
  sAnwendung := '"C:\Dokumente und Einstellungen\rwblinn\Anwendungsdaten\dataWeb\TurboDB Studio\turbodbstudio.ini"';
  Execute(sAnwendung);

  Vardef sAnwendung : String;
  sAnwendung := "meinehilfedatei.chm";
  Execute(sAnwendung);

EMail Sonderzeichen ersetzen
TurboPL/Execute/EMail Sonderzeichen ersetzen
Top
Procedure Nachricht_Senden;
..#email nachricht aus eine tabelle senden
..#anstatt eines strings kann auch ein memofeld verwendet werden
..##
  ..#Sonderzeichen für zeilenumbruch im email text
  Var CCRLF = "%0D%0A"; ..# ist Chr(13) + Chr(10);
  Vardef sWWW : String;

  ..erst mal ein wieder ein paar prüfungen
  ?FileSize($TABELLE) = 0 / Return
  ?ReadRec($TABELLE, RecNr($TABELLE)) = 0 / Return
  ..#adresse vorbelegen
  sWWW := "mailto:name@adresse.xyz?"
  sWWW := sWWW + "subject="+$TABELLE.Betreff;
  sWWW := sWWW + "&body="+$TABELLE.Nachricht;
  ..#sonderzeichen umsetzen
  sWWW := Exchange(sWWW, Chr(13) + Chr(10), "%0D%0A");
  ..#Execute
  Execute(sWWW)
  ..#oder mittels DLL - diese muss erst mit DLLPROC definiert werden
  ..#ShellExecuteW(0, "open",sWWW, "","",5);
Endproc;

EMail verfassen und senden - Beispiel 1
TurboPL/Execute/EMail verfassen und senden - Beispiel 1
Top
Procedure Nachricht_Senden;
..#email nachricht aus eine tabelle senden
..##
  ..#Sonderzeichen für zeilenumbruch im email text
  Var CCRLF = "%0D%0A"; ..# ist Chr(13) + Chr(10);
  Vardef sWWW : String;

  ..#erst mal ein wieder ein paar prüfungen
  ?FileSize($TABELLE) = 0 / Return
  ?ReadRec($TABELLE, RecNr($TABELLE)) = 0 / Return
  ..#adresse vorbelegen
  sWWW := "mailto:name@adresse.xyz?"
  sWWW := sWWW + "subject="+$TABELLE.Betreff;
  sWWW := sWWW + "&body="+$TABELLE.Nachricht;
  ..#sonderzeichen umsetzen
  sWWW := Exchange(sWWW, Chr(13) + Chr(10), "%0D%0A");
  ..#Execute
  Execute(sWWW)
Endproc;

EMail verfassen und senden - Beispiel 2
TurboPL/Execute/EMail verfassen und senden - Beispiel 2
Top
procedure Code_Senden;
..#Code als email senden
..#Syntax für mailto:
..#mailto:name@adresse.de?subject=Meine Nachricht&cc=kopiean@adresse.de&body=Der Nachrichten Text
..##

  ..#Sonderzeichen für zeilenumbruch im email text
  Var CCRLF = Chr(13) + Chr(10);
  Var CECR = "%0A"; ..# ist Chr(13) + Chr(10);
  Var CECRLF = "%0A%0A"; ..# ist Chr(13) + Chr(10);
  Var CHDG = "EMail senden";
  Var CERR1 = "Abbruch: Keine Einträge vorhanden.";
  Var CERR2 = "Abbruch: Eintrag kann nicht gelesen werden.";
  Vardef sStr : String;           ..#email
  Vardef sEmpfaenger : String;    ..#empfaenger name@adresse.de
  Vardef nRT : Integer;           ..#return code

  ..#erst mal ein wieder ein paar prüfungen
  If FileSize($CODE) = 0
    Message(CERR1, "Fehler - " + CHDG);
    Return
  End;
  If ReadRec($CODE, RecNr($CODE)) = 0
    Message(CERR2, "Fehler - " + CHDG);
    Return
  End;
  sEmpfaenger := "name@adresse.de";
  nRT := Input("Empfänger Adresse: ", CHDG, 0, sEmpfaenger);
  ?nRT = 0 / Return
  ?sEmpfaenger = "" / Return
  sStr := "mailto:" + sEmpfaenger + "?"
  sStr := sStr + "subject="+$CODE.Thema;
  sStr := sStr + "&body="+$CODE.Code;
  ..#sonderzeichen umsetzen
  sStr := Exchange(sStr, CCRLF, CECRLF);
  ..#Execute
  Execute(sStr);
Endproc;

Hilfedatei in HTML Help Format KontextID direkt aufrufen
TurboPL/Execute/Hilfedatei in HTML Help Format KontextID direkt aufrufen
Top
Procedure Hilfe_Zeigen_Kontext(sKontextID:String);
..#zeigt die htmlhelp kontextseite sKontextID
..#Beispiel: aufruf hilfe zu einstellungen mittels Hilfe_Zeigen_Kontext("144972385");
..##
  Execute("hh.exe -mapid " + sKontextID + " " + BASEDIR+"projekt.chm");
Endproc;

..#Beispiel
Procedure Hilfe_Zeigen_Einstellungen;
..#zeigt die html hilfe zu den einstellungen
..##
  Hilfe_Zeigen_Kontext("144972385");
Endproc;

Readme Datei aus einem Projektverzeichnis lesen
TurboPL/Execute/Readme Datei aus einem Projektverzeichnis lesen
Top
Procedure refInfoReadmeBeimAnklicken;
..#die textdatei readme.txt aus dem projektverzeichnis lesen
..##
  Vardef sReadme : String;

  sReadme :=BaseDir + "readme.txt";
  If IsFile(sReadme)
    Execute(sReadme)
  Else
    Message("Abbruch: Die Readme Datei nicht gefunden.", "Readme lesen");
  End;
EndProc;

Übergabeparameter mit Leerzeichen
TurboPL/Execute/Übergabeparameter mit Leerzeichen
Top
Enthält der Übergabeparameter Leerzeichen, dann muss der Übergabeparameter in doppelte Anführungszeichen gesetzt werden:
  Execute('"c:\programme\mein programm\mit leerzeichen.exe"')

Mit einer TurboDBStudio-Variable geht es jedenfalls so:
  Vardef sDateiName : String;
  sDateiName := "meinedatei.txt";
  Execute('"c:\programme\mein programm\mit leerzeichen.exe" "' + sDateiName + '"');

Zu Beachten:
Sowohl der Pfad des zu startenden Programms als auch der Pfad
der zu ladenden Datei von Anführungszeichen (keine Hochkommas!) umschlossen sein
sollten um Probleme mit Leerzeichen im Pfad zu vermeiden.

Übergabeparameter nicht gefunden
TurboPL/Execute/Übergabeparameter nicht gefunden
Top
SetSortOrder gibt keine Meldung aus, wenn der Übergabeparameter(Indexdatei) im aktuellen  Verzeichnis nicht gefunden wurde.
Dieses Problem läßt sich wie folgt umgehen:

  Vardef sDatei : String;
  sDatei := "Executeparameter";
  IF Exists(sDatei) = 2
    Message("Kann Programm " + sDatei + " nicht finden.", "Fehler");
    Halt;
  END


Exp

Exp für Potenz Funktion verwenden
TurboPL/Exp/Exp für Potenz Funktion verwenden
Top
Procedure PotenzFunktion(X: Real; Y:Real): Real
  Return Exp(Y*Log(X))
Endproc;

Procedure Testpotenztfunktion;
..#test aufrufe für die potenzfunktion
..##
  Message(Str(PotenzFunktion(5, 8)), "5 hoch 8");
  Message(Str(PotenzFunktion(5, 9 - 3)), "5 hoch (9 - 3)");
EndProc;


FileNr

Nummer der Primärtabelle
TurboPL/FileNr/Nummer der Primärtabelle
Top
FileNr : Real;

FileNr liefert die Nummer der aktuellen Primärtabelle

..#
..# Nummer einer Tabelle im aktuellen Projekt ermitteln
..#

Um die Nummer einer Tabelle im aktuellen Projekt zu ermitteln, VAL verwenden.
VAL("TABELLE1.DAT");


FileSize

Prüfen ob Datensätze einer Tabelle vorhanden sind:
TurboPL/FileSize/Prüfen ob Datensätze einer Tabelle vorhanden sind:
Top
If FileSize($TABELLE) = 0
  Message("Keine Datensätze für Tabelle " + DBName($TABELLE) + "gefunden!", "Hinweis");
End;


FindControl

Beispiel Control DataGrid
TurboPL/FindControl/Beispiel Control DataGrid
Top
VarDef dwDatenfenster: DataWnd
Vardef GRIDCtrl: DataGrid;

..#Gibt es Einträge
?FileSize(ADRESSEN) = 0 / Return
?FileSize(KONTAKTE) = 0 / Return
..#Tabelle (Grid) suchen
GRIDCtrl := FindControl("dgAdressenKontakte") as DataGrid;
..#Gefunden
If Assigned(GRIDCtrl)
  If Upper(IndName(KONTAKTE, IndNo(KONTAKTE))) = "KONTAKTETERMINDESC.IND"
    GRIDCtrl.Sortierung("KONTAKTETERMINASC.IND");
  Else
    GRIDCtrl.Sortierung("KONTAKTETERMINDESC.IND");
  End;
  GRIDCtrl.AlleMarkierungenEntfernen(1);
End;
Beispiel Control Edit
TurboPL/FindControl/Beispiel Control Edit
Top
Procedure edMakroSuchenBeimÄndern;
..#kleines eingabefeld wo direkt nach einen wert gesucht werden kann
..##
  Vardef EditCtrl : Edit;
  Vardef nCnt : Integer;
  Vardef sStr : String;
  ..#suche eingabe feld
  EditCtrl := FindControl("edMakroSuchen") as Edit;
  ..#gefunden, dann suche makro
  If Assigned(EditCtrl)
    sStr := 'TIPPS.Makro wie "' + EditCtrl.Text + '*"';
    ..#Message(sStr, EditCtrl.Text);
    nCnt := BySelection(sStr, 0, 2);
  End;
endproc;


Beispiel Control PageControl
TurboPL/FindControl/Beispiel Control PageControl
Top
..#npage auf -1 = nicht gefunden
nPage := -1;
..#suche pagecontrol und ermittle aktive seite
pageCtrl := FindControl("pcAdressenFormular") as PageControl;
If Assigned(pageCtrl)
  nPage := pageCtrl.ViewPage(0);
End;
..#jetzt schalter formular <> tabelle suchen und text anhand seite setzen
ButtonCtrl := FindControl("btnAdressenFormularListe") as Button;
If Assigned(ButtonCtrl)
  ?nPage = 1 / ButtonCtrl.Text := 'Liste';
  ?nPage = 2 / ButtonCtrl.Text := 'Formular';
End;
...

Beispiel EditCtrl einen Wert zuweisem
TurboPL/FindControl/Beispiel EditCtrl einen Wert zuweisem
Top
Procedure btnEinstellungenHauptordnerWaehlenBeimAnklicken;
..#Mittels Choosefolder den Hauptordner wählen und dann Feld Hauptordner
..#zuweisen
..##
  Vardef EditCtrl : Edit;
  Vardef sFolder: String;
  Vardef nRT: Integer;

  ?GetMode = 0 / ModifyRecords;
  nRT := ChooseFolder("Hauptordner wählen", sFolder);
  ..#bei 1 ist alles gut
  If nRT = 1
    ..#jetzt verwenden wir editctrl um den wert zu setzen
    ..#suche eingabe feld
    EditCtrl := FindControl("edEinstellungenHauptordner") as Edit;
    ..#gefunden, dann setze wert
    If Assigned(EditCtrl)
      EditCtrl.Text := sFolder;
    End;
  End;
EndProc;

Controls Eigenschaften setzen
TurboPL/FindControl/Controls Eigenschaften setzen
Top
procedure SetzeEditControlText(Var editCtrl : Edit; sEditCtrl: String; sText : String);
..#Setzt den Text für EditCtrl
..##

  ..#suche eingabe feld
  editCtrl := FindControl(sEditCtrl) as Edit;
  ..#gefunden, dann setze wert
  If Assigned(editCtrl)
    editCtrl.Text := sText;
  End;
endproc;

procedure SetzeEditControlHinweis(Var editCtrl : Edit; sEditCtrl: String; sHinweis : String);
..#Setzt den Hinweistext für EditCtrl
..##

  ..#suche eingabe feld
  editCtrl := FindControl(sEditCtrl) as Edit;
  ..#gefunden, dann setze wert
  If Assigned(editCtrl)
    editCtrl.Hint := sHinweis;
  End;
endproc;

Datepicker Control auslesen
TurboPL/FindControl/Datepicker Control auslesen
Top
  ..#datepicker 1
  Vardef CtrlDP1 : DateTimePicker;
  CtrlDP1 := FindControl("DateTimePicker1") as DateTimePicker;
  ..#datepicker 2
  Vardef CtrlDP2 : DateTimePicker;
  CtrlDP2 := FindControl("DateTimePicker2") as DateTimePicker;
  ..#werte auslesen, umwandeln und differenz tage ermitteln
  rDaysBetween := Val(CtrlDP2.Text) - Val(CtrlDP1.Text);
  ..#und als string zurückgeben
  Return "Anzahl Tage zwischen Datum 1 und 2: " + Str(rDaysBetween)
Ein Objekt suchen
TurboPL/FindControl/Ein Objekt suchen
Top
Procedure Button1BeimAnklicken;
  ..#erste  möglichkeit mittels object
  VarDef objFeld: Object;
  objFeld := DatenfensterSuchen("SYSTEM.Optionen", "edSystemAdressenGeburtstageVoraus");
  IF Assigned(objFeld)
    Message("Gefunden");
  Else
    Message("NICHT Gefunden")
  End;
  ..#
  ..#zweite möglichkeit mittels control
  vardef EditCtrl: Edit;
  EditCtrl := FindControl("edSystemAdressenGeburtstageVoraus") as Edit;
  if Assigned(EditCtrl)
    Message('edSystemAdressenGeburtstageVoraus gibt es.');
  else
    Message('edSystemAdressenGeburtstageVoraus gibt es nicht!');
  end;
Endproc;

Rückgabewert der Funktion FindControl umwandeln
TurboPL/FindControl/Rückgabewert der Funktion FindControl umwandeln
Top
Das Kommando "as" verwenden um den Rückgabewert von FindControl umzuwandeln.

Procedure TESTLookupTable1BeimÄndern;
  Vardef coLT: LookupTable;
  coLT := FindControl("TESTLookupTable1") as LookupTable
  If Assigned(coLT)
   trace(coLT.Text)
  End
Endproc;

Taschenrechner mittels FindControl
TurboPL/FindControl/Taschenrechner mittels FindControl
Top
procedure Button1BeimAnklicken;
..#einfacher taschenrechner.
..#dazu in einem formular folgende felder und schalter definieren:
..#3 editfelder; 1 radiogroup; 1 schalter
..##
  Vardef i : Integer;
  Vardef ctrlEdit1: Edit;
  Vardef ctrlEdit2: Edit;
  Vardef ctrlEdit3: Edit;
  Vardef rgPlusMinus: RadioGroup;
  Vardef nAction : Integer;

  ctrlEdit1 := FindControl("Edit1") as Edit;
  ctrlEdit2 := FindControl("Edit2") as Edit;
  ctrlEdit3 := FindControl("Edit3") as Edit;
  rgPlusMinus := FindControl("rgPlusMinus") as RadioGroup;
  ..#
  if NOT Assigned(ctrlEdit1)
    Message("Edit1 konnte nicht zugewiesen werden.");
    Return;
  end;
  if NOT Assigned(ctrlEdit2)
    Message("Edit2 konnte nicht zugewiesen werden.");
    Return;
  end;
  if NOT Assigned(ctrlEdit3)
    Message("Edit3 konnte nicht zugewiesen werden.");
    Return;
  end;
  if NOT Assigned(rgPlusMinus)
    Message("Radiogroup konnte nicht zugewiesen werden.");
    Return;
  end;
  ..#
  Try
    nAction := rgPlusMinus.ItemIndex;
    ?nAction = 0 / ctrlEdit3.Text := Str(Val(ctrlEdit1.Text) + Val(ctrlEdit2.Text));
    ?nAction = 1 / ctrlEdit3.Text := Str(Val(ctrlEdit1.Text) - Val(ctrlEdit2.Text));
    ?nAction = 2 / ctrlEdit3.Text := Str(Val(ctrlEdit1.Text) * Val(ctrlEdit2.Text));
    ?nAction = 3 / ctrlEdit3.Text := Str(Val(ctrlEdit1.Text) / Val(ctrlEdit2.Text),1, 2);
  Except
    Message(Error.Message, "Fehler");
  End;
  Refresh;
endproc;


FindDataWnd

Beispiel Daten zum Clipboard aus eingebette Tabelle
TurboPL/FindDataWnd/Beispiel Daten zum Clipboard aus eingebette Tabelle
Top
Procedure TopicLinkZumClipboard(nDummy: real);
  ..#aus einem formular mit eine eingebette tabelle TOPICS werden der inhalt des
  ..#autonummer feld eines markierten records zum clipboard kopiert
  DEF CRLF = Chr(13) + Chr(10);
  Vardef oTT : Object;
  Vardef nTRNo, nCnt, nLN, nLNLast : Real;

  nCnt := 0;
  ..clipboard entleeren
  CopyStrToClipboard("");
  ..keine topics in der eingebette tabelle, dann verlasse procedur
  If LinkCount(TOPICS) = 0
   Return
  End;
  ..suche die eingebette topicstabelle
  oTT := FindDataWnd("THEMA.Thema_Links", "TABLINKTOPICS");
  ..eingebette tabelle gefunden
  If Assigned(oTT)
   ..oTT.SetSortOrder("TOPICS.ID",2);
   ..sind recorsd markiert?
   If oTT.StarNum > 0
    ..gehe zum ende der tabelle
    oTT.BottomOfTable;
    ..und ermittle die autonummer des letzten records
    ReadRec(TOPICS, RecNr(TOPICS));
    nLN := 0;
    nLNLast := TOPICS.Laufende_Nummer;
    ..gehe wieder zum anfang der tabelle
    oTT.TopOfTable;
    ..und durchlaufe die tabelle und prüfe ob records markiert (*) sind
    Repeat
     ..lese record
     ReadRec(TOPICS, RecNr(TOPICS));
     ..speichere die autonummer
     nLN := TOPICS.Laufende_Nummer;
     ..wenn markiert dann kopiere zum clipboard
     If oTT.IsStar
      nCnt := nCnt + 1;
      AddStrToClipboard("<[T:" + Str(TOPICS.Laufende_Nummer) + "]"+TOPICS.tTitel+">" + CRLF);
     End;
     ..wenn aktuelle autonummer ungleich autonummer des letzten record ist gehe
     ..zum nächsten record
     ?nLN <> nLNLast / oTT.NextRecord;
     ..ende erreicht
    Until nLN = nLNLast
   End;
  End;
  ..wenn keine records markiert waren, dann kopiere aktuelles record
  If nCnt = 0
   ?ReadRec(TOPICS, RecNr(TOPICS))  = 0/ Return
   AddStrToClipboard("<[T:" + Str(TOPICS.Laufende_Nummer) + "]"+TOPICS.tTitel+">");
  End;
  CloseWnd;
  Endproc;

Durch eine im Formular eingebette Tabelle loopne und sichtbare markierungen setzen
TurboPL/FindDataWnd/Durch eine im Formular eingebette Tabelle loopne und sichtbare markierungen setzen
Top
procedure btnAlbumAbspielenBeimAnklicken;
..#das aktuelle album abspielen. dabei werden im formular tabellengrid alle
..#mp3titel mit eine markierung gesetzt. dann die system routine mp3titelabspielen
..#aufgerufen. hier wird eine playlist generiert und der mp3player gestartet.
..#dann werden alle sichtbare markierungen entfernt.
..##
  VarDef objDG: DataWnd;  ..#die eingebette tabelle mit mp3titel
  Vardef nRNo : Integer;  ..#die jeweils aktuelle mp3titel record nummer

  ..#mp3titel tabelle im formular suchen
  objDG := FindDataWnd("ALBUM.Alben", "dgAlbumMP3Titel");
  ..#gefunden
  IF Assigned(objDG)
    ..#gehe zur anfang der tabelle und merke recno
    objDG.TopOfTable;
    nRNo := objDG.CurrentRecNo;
    ..#loope durch die tabelle so lange bis recno 0 ist
    While nRNo <> 0
      ..#Message(Str(objDG.CurrentRecNo));
      objDG.PutStar;
      objDG.NextRecord;
      ..#sind wir schon am ende der tabelle gelangt?
      If objDG.CurrentRecNo <> nRNo
        nRNo := objDG.CurrentRecNo
      Else
        nRNo := 0;
      End;
    End;
    ..#mp3 titel abspielen
    MP3TitelAbspielen("ALBUM.Alben", "dgAlbumMP3Titel");
    ..#und anschließend alle sichbare markierungen entfernen
    objDG.RemoveAllStars(1);
    ..#und gehe wieder zum ersten eintrag
    objDG.TopOfTable;
  End;
endproc;

Fensterobjekt ermitteln und verwenden
TurboPL/FindDataWnd/Fensterobjekt ermitteln und verwenden
Top
procedure GetWindow(window: Object): DataWnd
..#Gibt ein Fenster-Objekt zurück. Ist das Fenster nicht geöffnet, wird es geöffnet.
..#Verwendung:
..# VarDef wnd: Datawnd;  ..#windowvar
..# ..window holen mittels syntax project.tabelle.formular
..# wnd := GetWindow(Project.Aufgaben.Aufgaben);
..# ..und mit dem window arbeiten, wie zB
..# wnd.SetSortOrder("AUFGABEN.ID", 0);
..# wnd.ViewPage(2);
..##
  Vardef wndName: String;  ..#fenster = formular name
  Vardef wnd: DataWnd;     ..#formular objekt
  wndName := GetCompleteObjectName(window);
  wnd := FindDataWnd(wndName);
  if not Assigned(wnd)
    ActivateForm(wndName);
    wnd := FindDataWnd(wndName);
  end;
  if not Assigned(wnd)
    Message("Formular '" + wndName + "' konnte nicht geöffnet werden.");
    Halt;
  end;
  return wnd;
endproc;


FindFirstFile

Dateiattribut mittels Parameter ermitteln
TurboPL/FindFirstFile/Dateiattribut mittels Parameter ermitteln
Top
procedure GetFileAttr(sFile:String; sAttr:String):String;
vardef nRT : Integer;
vardef FName, FAttributes, FFolder: string;
vardef FSize: Integer;
vardef FDate: Date;
vardef FTime: Time;
  sAttr := Upper(sAttr);
  nRT := FindFirstFile(sFile, "DHS", FName, FSize, FDate, FTime, FAttributes, FFolder);
  CloseFindFile;
  ..#wurde die datei auch gefunden?
  If nRT = 0
    ?sAttr = 'N' / Return FName;
    ?sAttr = 'S' / Return Str(FSize);
    ?sAttr = 'D' / Return DateStr(FDate);
    ?sAttr = 'T' / Return TimeStr(FTime);
    ?sAttr = 'X' / Return DateStr(FDate) + " " + TimeStr(FTime);
    ?sAttr = 'A' / Return FAttributes;
    ?sAttr = 'F' / Return FFolder;
    ?sAttr = 'P' / Return FFolder + FName;
  Else
    ?nRT = -1 / Return "Allgemeiner Fehler"
    ?nRT = -2 / Return "Der Pfad in Mask ist ungültig, zum Beispiel weil er ein nicht vorhandenes Laufwerk oder Verzeichnis enthält."
    ?nRT = -3 / Return "Es wurde kein passender Verzeichniseintrag gefunden."
    ..#oder eingene fehlerbehandlung, dann leeren string als return und oben auskommentieren
    ..#Return ""
  End;
endproc;

Obige Prozedur (vereinfacht) zur Verwendung in Datenbankjobs
.procedure GetFileAttr(sFile:String; sAttr:String):String;
..#aufrufbeispiel:
..#$("Letzte Änderung:":50       + GetFileAttr(BaseDir + "meindb.tdbd", "X"))
.vardef nRT : Integer;
.vardef FName, FAttributes, FFolder: string;
.vardef FSize: Integer;
.vardef FDate: Date;
.vardef FTime: Time;
.Do sAttr := Upper(sAttr);
.Do nRT := FindFirstFile(sFile, "DHS", FName, FSize, FDate, FTime, FAttributes, FFolder);
.Do CloseFindFile;
.If sAttr = 'N'
.Return FName
.End
.If sAttr = 'S'
.Return Str(FSize);
.End
.If sAttr = 'D'
.Return DateStr(FDate);
.End
.If sAttr = 'T'
.Return TimeStr(FTime);
.End
.If sAttr = 'X'
.Return DateStr(FDate) + " " + TimeStr(FTime);
.End
.If sAttr = 'A'
.Return FAttributes;
.End
.If sAttr = 'F'
.Return FFolder;
.End
.If sAttr = 'P'
.Return FFolder + FName;
.End
.endproc;

Datei-Informationen ermitteln
TurboPL/FindFirstFile/Datei-Informationen ermitteln
Top
Procedure GetFileInfo(sFile: string) : String;
..#Dateiinformationen ermitteln und in einem Infofenster ausgeben
..##
  var CCRLF = Chr(13) + Chr(10);
  Vardef nRT : Integer;
  Vardef nS : Integer;
  Vardef sTmp, sF,sA,sV : String
  Vardef dD : Date;
  Vardef tT : Time;
  sTmp := "";
  nRT := FindFirstFile(sFile, "DHS", sF, nS, dD, tT, sA, sV);
  ..#return code auswerten
  ..#0 = OK
  ?nRT = 0  / sTmp := sF + CCRLF + Str(nS) + CCRLF + DateStr(dD) + CCRLF + TimeStr(tT) + CCRLF + sA + CCRLF + sV + CCRLF;
  ?nRT = -1 / sTmp := "Allgemeiner Fehler";
  ?nRT = -2 / sTmp := "Der Pfad in Mask ist ungültig, zum Beispiel weil er ein nicht vorhandenes Laufwerk oder Verzeichnis enthält.";
  ?nRT = -3 / sTmp := "Es wurde kein passender Verzeichniseintrag gefunden.";
  CloseFindFile;
  Return sTmp
Endproc;

Verschiedene Dateiinformationen
TurboPL/FindFirstFile/Verschiedene Dateiinformationen
Top
Procedure GetTheFileDate(sFile: string) : String;
..#liefert das datei-datum + zeit
..#Parameter:
..#sFile = Dateiname
..#Rückgabe:
..#das datei-datum
  Vardef sF, sA, sV, sTmp : String;
  Vardef nRT, nS : Integer;
  Vardef sD : Date;
  Vardef sT : Time;

   ?sFile = "" / Return ""
   ?Lower(sFile) = "nul" / Return ""
   sTmp := "";
   If sFile hat "/"
    sFile := sFile[1, Pos("/", sFile) - 1];
   End;
   nRT := FindFirstFile(sFile, "", sF, nS, sD, sT, sA, sV);
   If nRT = 0
    sTmp := DateStr(nD) + " " + TimeStr(nT);
   Else
    sTmp := "nicht vorhanden!";
   End;
   CloseFindFile;
   ?sFile = "" / sTmp := "";
   Return sTmp
Endproc;

Procedure GetTheFileSize(sFile: string) : Integer;
..#liefert die dategroesse
..#Parameter:
..#sFile = Dateiname
..#Rückgabe:
..#dateigroesse
..##
   Vardef sF, sA, sV, sTmp : String;
   Vardef nRT, nS : Integer;
   Vardef sD : Date;
   Vardef sT : Time;

   ?sFile = "" / Return 0
   sTmp := "";
   If sFile hat "/"
    sFile := sFile[1, Pos("/", sFile) - 1];
   End
   nRT := FindFirstFile(sFile, "", sF, nS, sD, sT, sA, sV);
   CloseFindFile;
   Return nS
Endproc;

Procedure GetTheFileInfo(sFile: string): string;
..#liefert dateidatum, zeit und groesse
..##
   VarDef sTmp : String;
   VarDef nSize : Real;
   Vardef sResult : String;
   sResult := "";
   ?sResult = "" / Return ""
   nSize := GetTheFileSizeKB(sFile);
   sTmp := Str(nSize,0,0,".") + " Kb.";
   ?nSize = 0 / sTmp := "";
   Return GetTheFileDate(sFile) + " " + sTmp

FindRec

Beispiel mit Datensatzänderung und Netzwerksperre
TurboPL/FindRec/Beispiel mit Datensatzänderung und Netzwerksperre
Top
..#Datenatz suchen
nRNo := FindRec(TABELLE,...)
If nRNo < 1 Or ReadRec(TABELLE, nRNo) < 1
  ..#Meldung ausgeben Datensatz nicht gefunden oder kann nicht gelesen werden
Else
  If EditOn(TABELLE) = 1
    Try
      ..#Änderungen durchführen und Satz speichern
      WriteRec(TABELLE, nRNo);
    Except
      ..#Meldung dass die Tabelle nicht bearbeitet werden kann
    Finally
      EditOff(TABELLE)
    End
  Else
    ..#Meldung dass die Tabelle nicht bearbeitet werden kann
  End;
End;

Suche mit mehren Werte im Index
TurboPL/FindRec/Suche mit mehren Werte im Index
Top
Vardef nRT : Integer;
Beispiel anhand Beispielprojekt KFZ:
nRT := FindRec(KFZ, "Audi 80 1.8 S, 1991", GetFileName(Project.KFZ.Index_Standard), 1);

Suche mit mehreren Felder
TurboPL/FindRec/Suche mit mehreren Felder
Top
  nRNo := FindRec(TABELLE, Feld1 + "," + Feld2, "TABELLE.ID", 1);
  If nRNo > 0 Satz gefunden

Hinweis:
Feld1 und Feld2 sind alphanumerische Felder
Der Index tabelle.id enthält die Felder die bei der Tabellen-Definitionin den Eigenschaften des Auto-Nummer Feldes eingetragen wurden.
I.d.F. Feld1, Feld2

Suche mit mehreren Felder wobei ein Feld ein Koppelfeld ist
TurboPL/FindRec/Suche mit mehreren Felder wobei ein Feld ein Koppelfeld ist
Top
  nRNo := FindRec(TABELLE, Str(KOPPELTABELLE.Laufende_Nummer) + "," +Feld1, "TABELLE.ID", 1);
  If nRNo > 0 Satz gefunden

Hinweis:
Feld1 ist ein alphanumerisches Feld

Suche mittels Auto-Nummer Feld
TurboPL/FindRec/Suche mittels Auto-Nummer Feld
Top
  nRNo := FindRec(TABELLE, Str(Laufende_Nummer), "TABELLE.INR", 1);
  If nRNo > 0 Satz gefunden

Hinweis:
Der Index tabelle.inr verwaltet das Auto-Nummer Feld

Suchen mittels Index ID
TurboPL/FindRec/Suchen mittels Index ID
Top
Beispiel:

  Try
    ..#suchen mittels index name
    nRNo := FindRec(ADRESSEN, sName, "ADRESSEN.ID", 1);
    If nRNo > 0
      Meldung_Info("Name '" + sName + "' gefunden!", "Adressen nach Name Suchen");
      ShowRec(nRNo);
    End;
    ?nRNo = 0 / Meldung_Info("Name '" + sName + "' nicht gefunden!", "Adressen nach Name Suchen");
  Except
    Meldung_Fehler("Die Suchfunktion konnte nicht ausgeführt werden!", "Adressen nach Name Suchen");
  End;


FirstDir

Die Funktionen FIRSTDIR und NEXTDIR liefern einen String zurück, der anbestimmte Positionen Informat
TurboPL/FirstDir/Die Funktionen FIRSTDIR und NEXTDIR liefern einen String zurück, der anbestimmte Positionen Informat
Top
Der Dateiname befindet sich an der Position 1 bis 12 und
läßt sich mit folgende Möglichkeit extrahieren:

  Vardef sDateiName : String;
  Vardef s : String;
  s := FirstDir("*.*", "A");
  sDateiName := s[1, Pos(Chr(0),s) - 1];

Der Trick ist Chr(0) und nicht Chr(32) oder " " zu benutzen.


GetCompleteObjectName

Objectname als String ermitteln
TurboPL/GetCompleteObjectName/Objectname als String ermitteln
Top
Objectname als String ermitteln

Parameter: Project.<Tabelle>.<Objectname>

..#
..# Datenbankjobname ermitteln
..#

Message(GetCompleteObjectName(Project.adressen.Adressenliste));
liefert
ADRESSEN.Adressenliste

Mittels Run könnte diesen Datenbankjob ausgeführrt werden:
Run(GetCompleteObjectName(Project.adressen.Adressenliste));

In den Projekteigenschaften wurde diese Datenbankjob wie folgt definiert:
Tabelle: ADRESSEN
Pfad: D:\Daten\tdbstudio\projekte\ropav\ber\ADRESSEN-Bericht.ber
Titel: Adressenliste

Beispiel als Prozedur:

procedure Adressenliste_Drucken
  vardef sJob : String;
  sJob := GetCompleteObjectName(Project.ADRESSEN.Adressenliste));
  If sJob <> ""
    Drucken(sjobName);
  Else
    Message("Fehler: Jobname konnte nicht ermittelt werden!");
  End;
endproc;

GetField

Unterscheidung von Null und Leer
TurboPL/GetField/Unterscheidung von Null und Leer
Top
Unterscheidung von Null und Leer

Frage:
Wie kann mit der Unterscheidung von Null und Leer geprüft werden, ob eine Null
eingetragen ist oder noch keine Eintragung erfolgt ist.

Lösungen
Lösung A:
Tabellensicht mittels Suchen mit Bedingung GetField(...) = "".
GetField liefert einen Leerstring oder "0" zurück.

Lösung B: Index auf das Integer Feld definieren. Dann in der Tabellensicht Suchen,
Integer Feld aufrufen. Eingabefeld leer lassen.
Es wird der erste Eintrag angezeigt. Mittels F3 zum Nächsten usw...

Lösung C:
Als Makro
  MoveBegin($TESTTAB);
  While ReadNext($TESTTAB)
    If GetField($TESTTAB, LabelNo($TESTTAB, "Testinteger")) = ""
      Message("Feld " + $TESTTAB.Teststring + " hat kein Wert");
    End;
  End;



GetMode

Beispiel GetMode aus einem Formular aufrufen unter DataWnd Verwendung
TurboPL/GetMode/Beispiel GetMode aus einem Formular aufrufen unter DataWnd Verwendung
Top
Procedure Formular_Modus:String;
..#formular modus ermitteln (neu, betrachen, ändern
..##
  VarDef dwDatenfenster: DataWnd;

  dwDatenfenster := DatenfensterSuchen("TABELLE.Formular");
  If Assigned(dwDatenfenster) = 0
    Return ""
  Else
    If dwDatenfenster.GetMode < 0
      Return ""
    Else
      Return 'Modus: ' + Choice(dwDatenfenster.GetMode+1, 'betrachten', 'ändern', 'neu eingeben', 'unbekannt');
    End;
  End;
EndProc;

Beispiel wie GetMode aus einem Formular aufgerufen wird
TurboPL/GetMode/Beispiel wie GetMode aus einem Formular aufgerufen wird
Top
Dazu ist ein DataWnd Variable notwendig.
Der Rückgabewert kann für ein Formelfeld (CalcLabel) verwendet werden.
Ausserdem ist diese Möglichkeit unter TS notwendig, wenn Datenbankjobs
ausgeführt werden.

Würde GetMode ohne dataWnd ausgeführt werden, erscheint eine Fehlermeldung, dass das Formular nicht gefunden werden kann.

Procedure Adressen_Modus:String;
..
  VarDef dwDatenfenster: DataWnd;

  dwDatenfenster := DatenfensterSuchen("ADRESSEN.Adressenformular");
  IF Assigned(dwDatenfenster) = 0
    Return ""
  Else
    If dwDatenfenster.GetMode < 0
      Return ""
    Else
      Return 'Adressen: ' + Choice(dwDatenfenster.GetMode+1, 'betrachten', 'ändern', 'neu eingeben', 'Fehler');
    End;
  End;
EndProc;


HideProgress

.#
TurboPL/HideProgress/.#
Top
Frage
Das über ShowProgress eingeblendete Fenster verschwindet mit HideProgress nicht.

Antwort
Das Problem tritt auf:
1.Wenn den Aufruf aus onopenproject erfolgt.
2. Aus eine Prozedur aufgerufen wird, der einen Execdialog enthält.
ExecDialog erlaubt keine weiteren Fenster.


Import

IMPORT-Tabelle mit Volltextsuche
TurboPL/Import/IMPORT-Tabelle mit Volltextsuche
Top
Hat die IMPORT-Tabelle eine Volltextsuche mit der Position an erster Stelle,
dann ist das Feld für die Volltextsuche (Begriffe)
an die letzte Stelle zu setzen.
Erst dann können die Daten nach Reihenfolge importiert werden.

Wenn das .REL-Feld die Reihenfolge stört, entsteht jeweils
eine Verschiebung um 1 Feld ...

Hat die IMPORT-Tabelle keine Volltextsuche muß beim Übernehmen auch
die Reihenfolge der Zuweisung stimmen.


IndName

Index ermitteln
TurboPL/IndName/Index ermitteln
Top
Indexname suchen und Indexnummer zurückgeben

Procedure GibIndexNummer(Tabelle: Integer; IndexName: string): Integer
Vardef Result : Integer
Vardef i : Integer;
Vardef TempName : string;
  Result := 0;
  i := 1;
  TempName := IndName(Tabelle, i)
  Repeat
    If Upper(TempName) = Upper(IndexName)
      Result := i;
    End
    i := i + 1;
    TempName := IndName(Tabelle, i)
  Until TempName = ""
  Return Result
Endproc;

Procedure Test
  Message(Str(GibIndexNummer(ABC, "MeinIndex.ind")), "Indexnummer ist")
Endproc



Input

Datum prüfen nach Benutzereingabe
TurboPL/Input/Datum prüfen nach Benutzereingabe
Top
Procedure Prüfe_Datum;
..##
   Vardef nDatum : Integer;
   Vardef sDatum : String;
   T-Eingabe := DateStr(Today);
   Input("Datum");
   SetPara('ec 1');
   nDatum := VAL(T-Eingabe);
   SetPara('ec 0')
   IF nDatum >= 1.1.1900 And nDatum <= 31.12.2099
    Message("Datum '" + T-Eingabe + "' ist gültig...")
   ELSE
    Message("Datum '" + T-Eingabe + "' ist NICHT gültig...")
   END
EndProc;

Input in einem Job verwenden
TurboPL/Input/Input in einem Job verwenden
Top
  .Report
  ..
  .Prolog
  .PRIMTABLEIS TABELLE
  ..sortierung. hier ist es wichtig das nach Jahrx und Monatx sortiertwird, d.h.
  ..der Index der Tabelle muss Jahrx, Monatx sein. Entweder
  ..wird das über die Laufende_Nummer (=Autonummer) oder
  ..über eine separaten Index (z.B. jahrmnt.ind) definiert.
  .ZUGRIFF TABELLE.ID
  ..
  ..Definition der Vars
  .Var nRT = 0
  .Var sDatum = ""
  ..
  ..Datum vorgeben.
  ..Hier ist das aktuelle datum, kann aber auch was anderes sein z.B."1997, 5")
  .Var sDatum = DateStr(ToDay)
  .Do T-Eingabe := DateStr(ToDay);
  .Do nRT := Input("z.B. 1998, 9","Jahrx, Monatx");
  .Do sDatum := T-Eingabe
  ..Rückgabe 0 dann beende Job
  .If nRT = 0
  .ST
  .End
  ..
  ..Die Selektionskriterien sind die Felder "Jahrx" und "Monatx".
  .Selektion Val(DateStr(TABELLE.Datumsfeld)) = Val(sDatum)
  ..
  .Header
usw...

Input mit infotext mehrzeilig
TurboPL/Input/Input mit infotext mehrzeilig
Top
  Procedure Projekttabellenstrukturliste_abfragen;
  Var     CCRLF = Chr(13) + Chr(10);
  Vardef i,j : Integer
  Vardef sStr : String; ..auswahl, d.h ergebnis von input
  Vardef sListe : String; ..liste der tabellenfelder
  Vardef asFelder : String[250];     ..array für die felder

  ..keine tabellen dann abbruch
  ?MaxFile = 0 / Return
  ..liste der tabellen erstellen um diese in der abfrage anzeigen zu können
  sListe := "";
  While j:=j+1 <= MaxFile
    sListe := sListe + Lower(Exchange(Upper(DBName(j)),".DAT", "")) + CCRLF;
  End;
  ..tabelle abfragen, dabei werden alle tabellen gezeigt
  If Input("Bitte Tabelle eingeben. Liste der Tabellen:" + CCRLF + sListe, "Tabellenstruktur abfragen und kopieren", 0, sStr) = 0
    Return
  End;
Taschenrechner mittels Input und Val
TurboPL/Input/Taschenrechner mittels Input und Val
Top
Procedure Taschenrechner : Real;
   Vardef sFrage : String;
   sFrage := "";
   Input(sFrage, "Taschenrechner");
   Return Val(T-Eingabe)
EndProc;

...#Eine kleine Rechenspielerei.

Procedure Taschenrechner(A, B : Real)
   Vardef sFrage : String;
   sFrage := Str(A) + " mal " + Str(B) + " ist?";
   Input(sFrage, "Rechentest");
   If Val(T-Eingabe) ist A * B
    Message("Sehr gut!")
   Else
    Message("Ist leider nicht richtig!");
   End
EndProc;



IsStar

IsStar Markierungen anderer Formulare erkennen
TurboPL/IsStar/IsStar Markierungen anderer Formulare erkennen
Top
  Vardef wndD: DataWnd;
  wndD := FindDataWnd('TABELLE.Formularname')
  If wndD.IsStar
    Message("Der Datensatz ist markiert.");

IsUnDef

Prüfen ob eine Zahl definiert ist
TurboPL/IsUnDef/Prüfen ob eine Zahl definiert ist
Top
procedure btnTestBeimAnklicken;
..##
  MoveBegin($TESTTAB);
  While ReadNext($TESTTAB)
    ..#option 1
    If IsUndef($TESTTAB.Testinteger)
      Message("Feld " + $TESTTAB.Teststring + " hat kein Wert (undefiniert).");
    End;
    ..#option 2
    ..If GetField($TESTTAB, LabelNo($TESTTAB, "Testinteger")) = ""
    ..  Message("Feld " + $TESTTAB.Teststring + " hat kein Wert (undefiniert).");
    ..End;
  End;
  Message("Fertig");
EndProc;


Label

Undokumentierten dritten Parameter
TurboPL/Label/Undokumentierten dritten Parameter
Top
Label verfügt über ein undokumentierten dritten Parameter Koppelfeldausgabe vom Typ Real.
NUR VDP
Syntax:
  Label(Tabelle, Feldnummer, Koppelfeldausgabe : Real) : String;

Werte:
Koppelfeldausgabe = 1
bei Koppelfelder (L-Felder)wird die Datei in Klammern mit ausgegeben
Koppelfeldausgabe = 0
keine Ausgabe der Datei bei Koppelfelder

Test:
  Message(Label(KAPITEL, 1, 1), "mit Datei");
  Message(Label(KAPITEL, 1, 0), "ohne Datei");

LeftStr

Verwendung LeftStr anstatt Array
TurboPL/LeftStr/Verwendung LeftStr anstatt Array
Top
If sTmp <> ""
  sTmp := LeftStr(sTmp, Length(sTmp) - 2);
End;

anstatt

If sTmp <> ""
  sTmp := sTmp[1, Length(sTmp) - 2];
End;


LinkBlob

Eine Verknüpfung läßt sich durch die Übergabe eines Leerstrings wiederaufheben
TurboPL/LinkBlob/Eine Verknüpfung läßt sich durch die Übergabe eines Leerstrings wiederaufheben
Top
LinkBlob(TABELL.BlobFeld, "", 1);
BlobFeld ist ein Real Feld welches den Zeiger auf die Verknüpfungspeichert.

..#Bild Laden

  Procedure Bild_Laden;
   ?GetMode = 1 / ModifyRecords;
   ?GetMode = 2 / AppendNewRecords
   T-Eingabe:="*.JPG"
   IF ChooseFile("Bild Laden")
    IF T-Eingabe
     LinkBlob(MeineBilder, T-Eingabe, 1);
     Attach
    END
   END
  EndProc;

WICHTIG
Der Datensatz muß bereits gespeichert sein.
Das Linkblob funktioniert analog zum Speichern eines Memos und dazu ist es
erforderlich, daß der Datensatz bereits physikalisch angelegt ist.
Man kann in der Procedure zuerst einen leeren DAtensatz anlegen und
speichern und anschließend LinkBlob aufrufen.

VDP baut bei Öffnen der Tabellen anhand der Linkfelder eine Beziehung zwischen
den Tabellen auf. Diese kann unter Tabelle / Verknüpfungen eingesehen werden.


LinkCount

Prüfen ob angekoppelte Datensätze vorhanden sind
TurboPL/LinkCount/Prüfen ob angekoppelte Datensätze vorhanden sind
Top
Verwende dazu LinkCount($ANGEKOPPELTE_TABELLE)

Beispiele:
Anzahl Datensätze angekoppelt an TABELLE: Str(LinkCount($TABELLE))

Vardef nCnt : Integer;

nCnt := LinkCount($TAB);
If nCnt = 0
  Message("Keine angekoppelte Datensätze vorhanden!");
Else
  Message(Str(nCnt) + " angekoppelte Datensätze vorhanden!");
End;

..#Datenbankjob: LinkSum/Count funktionieren nicht

Sollte LinkSum oder LinkCount nicht funktionieren, dann kann es sein daß die Reihenfolge der Tabellen eine Verknüpfung zwischen den beiden Tabellen vorangig herstellt.

In einem Datenbankjob kann das mit dem Kommando .Relation manuell umgestellt werden.

LinkSum

LinkSum und LinkCount funktionieren nicht
TurboPL/LinkSum/LinkSum und LinkCount funktionieren nicht
Top
Sollten LinkSum/Count nicht funktionieren, dann kann es sein daß
die Reihenfolge der Tabellen eine Verknüpfung zwischen den
beiden Tabellen vorangig herstellt.

Lock


Logging

Logging Möglichkeit
TurboPL/Logging/Logging Möglichkeit
Top
..#LOGDATEI routinen
Procedure LogEintrag(sStr: string);
..#log eintrag in die logdatei basedir + ropav.log schreiben
  Vardef sLogFile : String;
  Vardef nFH : Integer;

  sLogFile := BaseDir + "anwendung.log";
  ..#ist die logdatei nicht vorhanden, erstellt eine neue logdatei
  ..#und schreibe eine überschrift
  If NOT IsFile(sLogFile)
    nFH := Rewrite(sLogFile);
    WriteLn(nFH, "Logdatei - Erstellt am " + DateTimeStr(CombineDateTime(Today, Now), 3));
    WriteLn(nFH, FillStr("-", "-", 50));
    Close(nFH);
  End;
  ..#keine meldung angegeben, dann mache nichts
  ?sStr = "" / Return
  ..#die logdatei ist vorhanden, dann schreibe eintrag
  nFH := TAppend(sLogFile);
  If nFH > 0
    WriteLn(nFH, DateTimeStr(CombineDateTime(Today, Now), 3) + ' : ' + sStr);
    Close(nFH);
  End;
EndProc;


MakeDir

Verzeichnis in Schritte erstellen
TurboPL/MakeDir/Verzeichnis in Schritte erstellen
Top
Procedure CreateADir(sDir: string): real;
  ..#erstellt ein Verzeichnis in Zwischenschritte
  ..#Parameter: sDir : Verzeichnis welches erstellt werden soll
  ..#Rückgabe: 1 = Ok, 0 = Fehler
   Vardef nRT, i : Real;
   Vardef sTmpDir : String;

   ..keine angabe
   ?sDir = "" / Return 1
   ?sDir[Length(sDir)] <> "\"/ sDir := sDir + "\";
   sTmpDir := "";
   i := 1;
   While i <= Length(sDir)
    ..Zwischenverzeichnis erstellen
    If sDir[i] = "\"
     nRT := MakeDir(sTmpDir);
     sTmpDir := sTmpDir + sDir[i];
    Else
     sTmpDir := sTmpDir + sDir[i];
    End
    i := i + 1;
   End
   If IsFile(sTmpDir + "NUL")
    Message(sTmpDir + " erstellt.");
    Return 1
   Else
    Message(sTmpDir + " konnte NICHT erstellt werden.");
    Return 0
   End;
EndProc;


MarkTable

Volltextsuche
TurboPL/MarkTable/Volltextsuche
Top
MarkTable(Table, IndexTable: Real; SearchExpr: String; ExtABC,Operators: String; Mask: Real; Relations: String): Real;

..#
....Volltextsuche
..#
Beispiel: gesucht wird der Inhalt String sStr in der Tabelle VTINDEX. Die gefunde Einträge werden dann in Tabelle TIPPS markiert.
Die Tabelle STICHWORT enthält die Relation zwischen der Tabelle TIPPS und der Volltextindex Tabelle VTINDEX.

  Vardef nRT : Integer; ..#Rückgabewert.
  nRT := MarkTable($TIPPS, $VTINDEX, sStr, '', '', 0, $STICHWORT);

  ..#fehler?
  Vardef sHStr : String;
  If nRT >= 201 And nRT <= 204
    ?nRT = 201 / sHStr := "Ungültige Index-Tabelle";
    ?nRT = 202 / sHStr := "Ungültige Relation"
    ?nRT = 203 / sHStr := "Schließende Klammer erwartet"
    ?nRT = 204 / sHStr := "Ungültiges Zeichen"
    Message(sHStr, "Fehler Volltextsuche"););
    Return
  End;

..#
....Volltextsuche mit Zahlen
..#

Wenn ein Volltextindex statt über die TurboDB Studio Oberfläche mit der TurboPL-Funktion ScanRecs erzeugt wird, kann ein
erweitertes Alphabet angeben (Parameter ExtABC) werden und dort Zahlen mit aufnehmen.

Nachdem der Volltextindex mit ScanRecs unter Verwendung von ExtABC erzeugt wurde, muß bei der Suche nun
ebenfalls das erweiterte Alphabet angegeben werden.

Es ist deshalb besser für die Suche die Funktion MarkTable zu verwenden.

..#
....Beispiel Volltextsuche
..#

PROCEDURE Volltextsuche
..#Beispiel einer Volltextsuche
..##

  ACCESS(ADRESSEN, "ADRESSEN.ID");
  DelMarks(ADRESSEN);
  T-Eingabe := ""
  IF INPUT("Bitte geben Sie Ihren Suchbegriff ein:")=1
   T-Eingabe := UPPER(T-Eingabe)
   MarkTable(ADRESSEN.DAT, STICHWOR.DAT, T-Eingabe,"","",0, STICHWOR.REL)
   IF nMarks( ADRESSEN)>0
    Showwait(STR( nMarks( ADRESSEN))+" Eintrag gefunden!")
    ACCESS( ADRESSEN,"Markierung")
    ATTACH;
    SetSortOrder("ADRESSEN.ID",2)
    SetView(2)
   ELSE
    Message("Keinen passenden Datensatz gefunden");
   END
  END
ENDPROC

MaxLabel

Tabellenstruktur
TurboPL/MaxLabel/Tabellenstruktur
Top
Abfrage der Tabellenstruktur

Procedure Projekttabellenfeldliste_abfragen;
..#abfrage der tabellenfelder für eine tabelle
..##
  Var    CCRLF = Chr(13) + Chr(10);  ..#zeilenumbruch für meldungen
  Var    CHDG = "Tabellenstruktur abfragen und kopieren";
  Vardef i,j, n : Integer            ..#laufvars
  Vardef sTabelle : String;          ..#tabelle der abgefragt wird
  Vardef sListe : String;            ..#liste der tabellenfelder
  Vardef asTabellen : String[250];   ..#array für tabellen. dieses wird sortiert
  Vardef asFelder : String[250];     ..#array für tabellen felder

  ?MaxFile = 0 / Return
  ..#liste der tabellen erstellen und diese in der abfrage anzeigen zu können
  i := 0;
  While j:=j+1 <= MaxFile
    asTabellen[i] := Lower(Exchange(Upper(DBName(j)),".DAT", ""));
    i := i + 1;
  End;
  ..#strsort verwenden
  n := i - 1;
  StrSort(asTabellen, n);
  NLoop(i, n, sListe := sListe + asTabellen[i] + CCRLF);
  ..#tabelle abfragen, dabei werden alle tabellen gezeigt
  If Input("Liste der Tabellen:" + CCRLF + sListe + CCRLF + "Tabelle eingeben:", CHDG, 0, sTabelle) = 0
    Return
  End;
  sTabelle := Upper(sTabelle);
  j := 0;
  While j:=j+1 <= MaxFile
    If Exchange(Upper(DBName(j)),".DAT", "") = sTabelle
      ..Message( Exchange(Upper(DBName(j)),".DAT", ""));
      ..#liste alle feldlabel der tabelle auf
      WHILE i:=i+1 <= MaxLabel(j)
        asFelder[i] := "$" + Exchange(Upper(DBName(j)),".DAT", "") + "." + Label(j, i,1)
      END;
      ..und sortiere
      StrSort(asFelder, MaxLabel(j));
      ..und gebe in der feldliste aus
      sListe := "";
      NLoop(i, MaxLabel(j),sListe := sListe + asFelder[i] + CCRLF);
      CopyStrToClipboard(sListe);
      Message("Feldliste für Tabelle '" + Lower(sTabelle) + "' erstellt und zur Zwischenablage kopiert", "Hinweis - Projekttabellenfeldliste");
      Return;
    End;
  End;
  Message("Abbruch: Tabelle " + sTabelle + " nicht gefunden!", "Fehler - Projekttabellenfeldliste");
Endproc;


MemoStr

MemoStr Begrenzung - TS
TurboPL/MemoStr/MemoStr Begrenzung - TS
Top
Ab TS4 enthält MemoStr eine zusätzlichen Parameter nLen = Anzahl Zeichen die gelsen werden sollen. Möglichkeiten:
nLen = keine Angabe - die ersten 255 zeichen werden gelesen
nLen = N - die ersten N Zeichen werden gelesen
nLen = 0 - der gesamte Memoinhalt wird gelesen

MemoStr Begrenzung - VDP
TurboPL/MemoStr/MemoStr Begrenzung - VDP
Top
Mit MemoStr können die ersten 255 Zeichen eines Memos erhalten werden
Diesen String kann weiter begrenzt werden: MemoStr(TABELLE.Memofeld)[1,100]


Message

Alternative Messagebox mittels Windows API
TurboPL/Message/Alternative Messagebox mittels Windows API
Top
Verwendet wird die Funktionen MessageBoxW aus der Windows user32.dll.

dllproc MessageBoxW(hWnd: Integer; lpText: String; lpCaption: String; dwType: Integer): Integer Library 'user32.dll';

Procedure Meldung_Fehler(sMeldung, sÜberschrift : String);
..#standard fehlermeldung plus überschrift
..#Falls error.meldung <> "" wird diese auch noch mit ausgegeben
  Var CCRLF2 = Chr(13) + Chr(10) + Chr(13) + Chr(10);
  Vardef sMsg : String;  ..die meldung die ausgegeben wird

  sMsg := sMeldung;
  If Error.Meldung <> ""
    sMsg := sMsg +  + CCRLF2 + "Beschreibung: " + Error.Meldung + " (" + Str(Error.Number) + ")";
  End;
  ..#überschrift anpassen
  ?sÜberschrift = "" / sÜberschrift := "Fehler";
  MessageBoxW(0, sMsg, sÜberschrift, MB_OK +  MB_ICONERROR);
  ..Message(sMsg, sÜberschrift, 1);
Endproc;

Procedure Meldung_Warnung(sMeldung, sÜberschrift : String);
..#standard hinweismeldung plus überschrift
  ?sÜberschrift = "" / sÜberschrift := "Warnung";
  MessageBoxW(0, sMeldung, sÜberschrift, MB_OK + MB_ICONWARNING);
  ..Message(sMeldung, sÜberschrift, 1);
Endproc;

Procedure Meldung_Info(sMeldung, sÜberschrift : String);
..#standard infomeldung plus überschrift
  ?sÜberschrift = "" / sÜberschrift := "Information";
  MessageBoxW(0, sMeldung, sÜberschrift, MB_OK +  MB_ICONASTERISK);
  ..Message(sMeldung, sÜberschrift, 1);
Endproc;

Zeilenumbruch im Text darstellen mittels
TurboPL/Message/Zeilenumbruch im Text darstellen mittels
Top
Zeilenumbrüche können dargestellt werden mittels Chr

"Zeile 1" + Chr(13) + Chr(10) + "Zeile 2".

DEF CRLF = Chr(13) + Chr(10);
"Zeile 1" + CRLF + "Zeile 2".

Beispiel: Hilfetext ausgeben

procedure btnQuickHelpBeimAnklicken;
..#schalter QuickHelp. Hilfetext zeigen beim anklicken
..##
  Var CCRLF = Chr(13) + Chr(10);
  Vardef sStr : String;
  sStr := "";
  sStr := sStr + "Readme.txt enthält weitere Informationen" + CCRLF;
  sStr := sStr + "" + CCRLF;
  sStr := sStr + "Testlauf starten:" + CCRLF;
  sStr := sStr + "Schalter [Grafik zeigen] betätigen." + CCRLF;
  sStr := sStr + "Dann die beiden Anwendungen nebeneinander laufen lassen." + CCRLF;
  Message(sStr, "QuickHelp");
endproc;


MitBedingung

DateStr in MitBedingung verwenden
TurboPL/MitBedingung/DateStr in MitBedingung verwenden
Top
MitBedingung('DateStr($KONTAKTE.KontaktTermin) = DateStr(Today)', 1, 1);
Funktion MitBedingung und die Variabele T-Eingabe kombinieren
TurboPL/MitBedingung/Funktion MitBedingung und die Variabele T-Eingabe kombinieren
Top
Procedure Sondersuche;
  If Input ('Name' , 'Suche') = 1
    MitBedingung ('Volksmund = " '+ T-Eingabe + " ' , 1);
  End;
Endproc;

Markierungen - Alle setzen oder Alle entfernen
TurboPL/MitBedingung/Markierungen - Alle setzen oder Alle entfernen
Top
Procedure Markierungen_Alle_Setzen;
  MitBedingung('Laufende_Nummer > 0',2,2);
Endproc;

Procedure Markierungen_Alle_Entfernen;
  MitBedingung('',3,2);
Endproc;;

String zusammen setzen und an MitBedingung übergeben
TurboPL/MitBedingung/String zusammen setzen und an MitBedingung übergeben
Top
Maximale Stringlänge ist 255.

Vardef sStr : string;
sStr := "vonkm > 20";
sStr := sStr + " und vonkg > 0";
OpenForm("STCKGUT.STCKGUT");
BySelection(sStr);

oder

sStr := "vonkm > 20";
sStr := sStr + " und vonkg > 20";
BySelection(sStr);

Sollte sStr nicht ausreichen, dann Tabellennamen und Felder abkürzen.
Hierbei die Tabellenstruktur beachten.
Es kann bis zum Feldnummer abgekürzt werden.

Suche MitBedingung bei einem Datumsfeld und DateStr
TurboPL/MitBedingung/Suche MitBedingung bei einem Datumsfeld und DateStr
Top
Ein Datumsfeld ist ein Real-Feld. Es muß daher mittels Str umgewandelt werden.

  Vardef nDatum : Real;
  ..Ausgabe des Datums
  Message("Gesucht wird nach Einträge mit Datum " + DateStr(nDatum));
  MitBedingung("$TABELLE.MeinDatum="+DateStr(nDatum),1,1);


ModifyRec

Feld in eine Systemtabelle aktualisieren
TurboPL/ModifyRec/Feld in eine Systemtabelle aktualisieren
Top
Procedure SystemUpdate(sField:String; sValue:String):Integer;
..#feld in der system tabelle aktualisieren
..#Bsp:   SystemUpdate("MeineMeldung", "Hallo Welt");
..##
  Vardef nFNo : Integer;  ..#feldnr
  Vardef nRT : Integer;    ..#return code 0 = fehler, 1 = OK

  ..#noch ist alles nicht ok
  nRT := 0;
  ..#feld label suchen
  nFNo := LabelNr($SYSTEM, sField);
  ..#gefunden, dann setze neuen wert
  If nFNo > 0
    Try
      MoveBegin($SYSTEM);
      ReadNext($SYSTEM);
      ModifyRec($SYSTEM);
      SetField($SYSTEM, nFNo, sValue);
      PostRec($SYSTEM);
      nRT := 1;
    Except
      nRT := 0;
    End;
  End;
  Return nRT;
EndProc;

ModifyRec und SQL
TurboPL/ModifyRec/ModifyRec und SQL
Top
Mit ModifyRecords setzt das Formular den aktuellen Datensatz in den
Editiermodus.

Das SQL-Statement möchte das auch tun, deshalb gibt es einen Konflikt.
Wenn Sie mit SQL eine Tabelle ändern möchten, muss diese in allen Formularen
auf Betrachten stehen, so wie sie ja auch nicht in zwei Formularen gleichzeitig
dieselbe Tabelle editieren können.
Man muss sich das so vorstellen, dass SQL nicht in einem Formular wirkt sondern
separat, es besitzt eigene Kursors.
Zum interaktiven Editieren sind daher nach wie vor die Befehle EditRec, PostRec
etc. die richtigen.
Mit SQL kann man vor allem komplexere Abfragen und Updates auf vielen

Datensätzen realisieren.

Nachschlagefilter

Dynamische Ausdrücke bei Nachschlagefilter
TurboPL/Nachschlagefilter/Dynamische Ausdrücke bei Nachschlagefilter
Top
Bei Nachschlagefiltern, verwendet bei Nachschlagefelder, sind nur einfache
statische Ausdrücke möglich.
Wird eine dynamische Lösung benötigt, muss die Funktion BeimÖffnen des
Nachschlage-Formulares zu implementieren.


NLoop

Zeilenumbruch in einem String setzen als Prozedur
TurboPL/NLoop/Zeilenumbruch in einem String setzen als Prozedur
Top
Procedure SetCRLF(nTimes:Integer):String;
..#setzt zeilenumbruch in einem string
..#ntimes = anzahl zeilenumbrüche die gesetzt werden
..##
Var CCRLF = Chr(13) + Chr(10);
Vardef i : Integer;
Vardef sStr : String;
  sStr := "";
  ?nTimes <= 0 / Return sStr
  NLoop(i, nTimes - 1, sStr := sStr + CCRLF);
  Return sStr
Endproc;


NTimes

Übersetzungsfehlermeldung bei nTimes-1
TurboPL/NTimes/Übersetzungsfehlermeldung bei nTimes-1
Top
Dieses Problem ist ein grundsätzliches, weil den '-' als gültigen Bezeichner
erlaubt ist.
Da es Spalten- oder Variablennamen mit einem '-' geben kann muss bei einer
Subtraktion ein Leerzeichen angegeben werden, sonst wird der Ausdruck als Bezeichner interpretiert.

Demnach anstatt
  nTimes-1
Leerzeichen verwenden
  nTimes - 1

Zeilen in der Messagebox zentriert darstellen
TurboPL/NTimes/Zeilen in der Messagebox zentriert darstellen
Top
Procedure ShowMessageZentriert
   DEF CRLF = Chr(13) + Chr(10);
   DEF MSGLEN = 30 ..max zeilen länge
   Vardef sTmp, sLine1, sLine2, sLine3, sLine4 : String;
   sTmp := "Zeile 1";
   sLine1 := NTimes(Chr(32), (30 - Length(sTmp)) DIV 2) + sTmp +NTimes(Chr(32), (30 - Length(sTmp)) DIV 2);
   sTmp := "Zeile 2 unterhalb Zeile 1";
   sLine2 := NTimes(Chr(32), (30 - Length(sTmp)) DIV 2) + sTmp +NTimes(Chr(32), (30 - Length(sTmp)) DIV 2);
   sTmp := "Zeile 3 oberhalb Zeile 4";
   sLine3 := NTimes(Chr(32), (30 - Length(sTmp)) DIV 2) + sTmp +NTimes(Chr(32), (30 - Length(sTmp)) DIV 2);
   sTmp := "Zeile 4";
   sLine4 := NTimes(Chr(32), (30 - Length(sTmp)) DIV 2) + sTmp +NTimes(Chr(32), (30 - Length(sTmp)) DIV 2);
   Message(sLine1 + CRLF + CRLF + sLine2 + CRLF + sLine3 + CRLF + sLine4,"Info");
Endproc


Object

Daten zum Clipboard aus eingebette Tabelle
TurboPL/Object/Daten zum Clipboard aus eingebette Tabelle
Top
Procedure TopicLinkZumClipboard(nDummy: real);
  ..#aus einem formular mit eine eingebette tabelle TOPICS werden der inhalt des
  ..#autonummer feld eines markierten records zum clipboard kopiert
  DEF CRLF = Chr(13) + Chr(10);
  Vardef oTT : Object;
  Vardef nTRNo, nCnt, nLN, nLNLast : Real;

  nCnt := 0;
  ..clipboard entleeren
  CopyStrToClipboard("");
  ..keine topics in der eingebette tabelle, dann verlasse procedur
  If LinkCount(TOPICS) = 0
   Return
  End;
  ..suche die eingebette topicstabelle
  oTT := FindDataWnd("THEMA.Thema_Links", "TABLINKTOPICS");
  ..eingebette tabelle gefunden
  If Assigned(oTT)
   ..oTT.SetSortOrder("TOPICS.ID",2);
   ..sind recorsd markiert?
   If oTT.StarNum > 0
    ..gehe zum ende der tabelle
    oTT.BottomOfTable;
    ..und ermittle die autonummer des letzten records
    ReadRec(TOPICS, RecNr(TOPICS));
    nLN := 0;
    nLNLast := TOPICS.Laufende_Nummer;
    ..gehe wieder zum anfang der tabelle
    oTT.TopOfTable;
    ..und durchlaufe die tabelle und prüfe ob records markiert (*) sind
    Repeat
     ..lese record
     ReadRec(TOPICS, RecNr(TOPICS));
     ..speichere die autonummer
     nLN := TOPICS.Laufende_Nummer;
     ..wenn markiert dann kopiere zum clipboard
     If oTT.IsStar
      nCnt := nCnt + 1;
      AddStrToClipboard("<[T:" + Str(TOPICS.Laufende_Nummer) + "]"+TOPICS.tTitel+">" + CRLF);
     End;
     ..wenn aktuelle autonummer ungleich autonummer des letzten record ist gehe
     ..zum nächsten record
     ?nLN <> nLNLast / oTT.NextRecord;
     ..ende erreicht
    Until nLN = nLNLast
   End;
  End;
  ..wenn keine records markiert waren, dann kopiere aktuelles record
  If nCnt = 0
   ?ReadRec(TOPICS, RecNr(TOPICS))  = 0/ Return
   AddStrToClipboard("<[T:" + Str(TOPICS.Laufende_Nummer) + "]"+TOPICS.tTitel+">");
  End;
  CloseWnd;
  Endproc;


Ein Objekt suchen
TurboPL/Object/Ein Objekt suchen
Top
Procedure Button1BeimAnklicken;
..#
  ..#erste  möglichkeit mittels object
  VarDef objFeld: Object;
  objFeld := DatenfensterSuchen("SYSTEM.Optionen", "edSystemAdressenGeburtstageVoraus");
  IF Assigned(objFeld)
    Message("Gefunden");
  Else
    Message("NICHT Gefunden")
  End;
  ..#
  ..#zweite möglichkeit mittels control
  vardef EditCtrl: Edit;
  EditCtrl := FindControl("edSystemAdressenGeburtstageVoraus") as Edit;
  if Assigned(EditCtrl)
    Message('edSystemAdressenGeburtstageVoraus gibt es.');
  else
    Message('edSystemAdressenGeburtstageVoraus gibt es nicht!');
  end;
Endproc;


Object in einem Fensterermitteln und verwenden
TurboPL/Object/Object in einem Fensterermitteln und verwenden
Top
procedure GetDataGrid(window: Object; name: String): DataWnd;
..#Eingebettete Tabellen von Formularen zurückgeben und arbeiten wie mit Fenstern.
..#Beispiel
..#vardef grid: DataWnd;
..#grid := GetDataGrid(Project.Aufgaben.Aufgaben, "dgNotizen");
..#grid.TopOfTable;
..#grid.NextRecord;
..#grid.NextRecord;
..#Message("Satznummer des aktuellen Datensatzes in der eingebetteten Tabelle: " + Str(grid.CurrentRecNo));
..##
 Vardef wndName: String;
 Vardef wnd: DataWnd;

 wndName := GetCompleteObjectName(window);
 wnd := FindDataWnd(wndName, name);
 If not Assigned(wnd)
   ActivateForm(wndName);
  wnd := FindDataWnd(wndName);
 End;
 If not Assigned(wnd)
  Message("Die eingebettete Tabelle '" + name + "' und/oder das Formular '" + wndName + "' existiert nicht.");
  Halt;
 End;
 Return wnd;
Endproc;

OLE

SoftMaker PlanMaker - Object verwenden Beispiel Aufgaben Liste exportieren
TurboPL/OLE/SoftMaker PlanMaker - Object verwenden Beispiel Aufgaben Liste exportieren
Top
Procedure Aufgaben_Export_Planmaker;
..#Erstellt wird eine Zusatzreferenz in TextMaker Format
..#Daten werden mittels OLE übertragen
..##
  Var    CHDG   = "Liste der Aufagben Planmaker";
  Var    CERR1 = "Abbruch: Textmaker Dokument kann nicht erstellt werden!"
  Vardef pm: OleObject;    ..#das planmaker object
  Vardef pm2: OleObject;  ..#das planmaker object
  Vardef nRNo : Integer;    ..#recordnr
  Vardef i : Integer;           ..#eine laufvariable
  Vardef nRow : Integer;    ..#laufvar für die zeile im planmaker objekt
  Vardef nCol : Integer;     ..#laufvar für die spalte im planmaker objekt

  ?FileSize($AUFGABEN) = 0 / Return
  Try
    pm := CreateOleObject('PlanMaker.Application');
  Except
    Message(CERR1, CHDG);
    Return
  End;
  pm.WindowState := 1;
  pm.Visible := True;
  pm.Activate;
  pm.Workbooks.Add;
  nRow := 1;
  ..#heading schreiben
  ..#heading überschriften
  pm.ActiveSheet.Cells.Item(nRow, 1).Value := "Aufgabe";
  pm.ActiveSheet.Cells.Item(nRow, 2).Value := "AufgenommenAm";
  pm.ActiveSheet.Cells.Item(nRow, 3).Value := "Erledigen";
  ..#heading fett
  pm.ActiveSheet.Rows(1).Font.Bold := True;
  ..#die aufgaben eintragen - nur die erste 3 spalten
  nRNo := FirstRec($AUFGABEN);
  While nRNo > 0
    ..#nächste zeile
    nRow := nRow + 1;
    ..#spalten befüllen - A:C
    ReadRec($AUFGABEN, nRNo);
    pm.ActiveSheet.Cells.Item(nRow, 1).Value := $AUFGABEN.Aufgabe;
    pm.ActiveSheet.Cells.Item(nRow, 2).Value := DateStr($AUFGABEN.AufgenommenAm);
    pm.ActiveSheet.Cells.Item(nRow, 3).Value := DateStr($AUFGABEN.ErledigenBis);
    ..#nächste aufgabe
    nRNo := NextRec($AUFGABEN);
  End;
  ..#spaltenbreite anpassen
  pm.ActiveSheet.Range("A:C").AutoFit;
  ..#splaten B und C zentriert
  pm.ActiveSheet.Range("B:C").HorizontalAlignment := 3;
  ..#planmaker schließen?
  pm.Workbooks.Close;
  ..pm.Nothing;
Endproc;
SoftMaker TextMaker - Object verwenden
TurboPL/OLE/SoftMaker TextMaker - Object verwenden
Top
Procedure Textmaker_Dokument_Erstellen
..##
Vardef tm: OleObject; ..objekt
  ..
  Try
    tm := CreateOleObject('TextMaker.Application');
  Except
    Message("Abbruch: Textmaker Dokument kann nicht erstellt werden!", "Fehler");
    Return
  End;
  tm.WindowState := 1;
  tm.Visible := TRUE;
  tm.Activate;
  ..neues dokument erstellen
  tm.Documents.Add;
Endproc;

SoftMaker TextMaker - Object weitere OLE Befehle
TurboPL/OLE/SoftMaker TextMaker - Object weitere OLE Befehle
Top
Zeilenumbruch einfügen
tm.ActiveDocument.Selection.InsertBreak(0);

Text eingeben
tm.ActiveDocument.Selection.TypeText("Hallo 2");

Font ändern
tm.ActiveDocument.Selection.Font.Size := 12;
tm.ActiveDocument.Selection.Font.Bold := 1;

Inhalt der Zwischenablage einfügen
tm.ActiveDocument.Selection.Paste;


OnCloseProject

OnCloseProject - Alle Fenster schliessen
TurboPL/OnCloseProject/OnCloseProject - Alle Fenster schliessen
Top
Sicherstellen, dass ausschließlich die in OnOpenProject vorgesehenen Fenster
beim Programmstart geöffnet werden, müssen die beim Beenden der Anwendung
noch offenen Formulare in OnCloseProject geschlossen werden.

Procedure SchliesseFenster(Name: string);
VarDef wnd: DataWnd;
wnd := FindDataWnd(Name);
If Assigned(wnd)
  wnd.CloseWnd;
End;
Endproc;

Procedure OnCloseProject;
..#alle fenster beim programmstart erstmal schliessen
  SchliesseFenster('TABELLE1.Formular1')
  SchliesseFenster('TABELLE1.Formular2')
  ..#usw.
Endproc;

OnOpenProject

Das über ShowProgress eingeblendete Fenster verschwindet mit HideProgress nicht
TurboPL/OnOpenProject/Das über ShowProgress eingeblendete Fenster verschwindet mit HideProgress nicht
Top
Das Problem tritt auf:
wenn den Aufruf aus OnOpenProject erfolgt
aus eine Prozedur aufgerufen wird, der einen Execdialog enthält.
ExecDialog erlaubt keine weiteren Fenster.
Formular bei OnOpenProject öffnen und Seite setzen
TurboPL/OnOpenProject/Formular bei OnOpenProject öffnen und Seite setzen
Top
Beispiele wie eine Formularseite beim Start gesetzt wird.

Procedure OnOpenProject;
..#Hinweis: Verwendet wird UIniGet... aus mein TS4UTIL.DLL.
..##
  ..#notizenformular aufrufen
  ActivateForm("notizen.notizen");
  ..#prüfen welche startseite gezeigt werden soll. dazu inidatei auslesen
  UIniGetValue(BaseDir + CPGMINI, "Global", "StartseiteNotizformular", "1", sRT, 255);
  Try
    ..#wert umwandeln
    nRT := Round(RealVal(sRT));
  Except
    ..#bei fehler zeige die seite 1
    nRT := 1;
  End;
  ..#und die Formularseite anzeigen
  ViewPage(nRT);
EndProc;

Procedure OnOpenProject;
..#Hinweis: Verwendet wird eine Systemtabelle mit Formularseiten Angabe
..##
  Vardef nSeite : Integer;

  ..#Formularseite aus der Systemtabelle Feld StartSeite (Integer) ermitteln
  nSeite := 1;
  Try
    ReadRec($SYSTEM, 1);
    nSeite := $SYSTEM.StartSeite;
  Except
  End;
  ..#Notizenformular aufrufen
  ActivateForm("notizen.notizen");
  ..#und die Formularseite anzeigen
  ViewPage(nSeite);
EndProc;

OnOpenProject testen
TurboPL/OnOpenProject/OnOpenProject testen
Top
OnOpenProject wird nur im Anwendungsmodus aufgerufen.
Um die Prozedur zu tesen eine einfache Prozedur, wie unten verwenden

Procedure OOPTest;
..#OnOpenProject testen
..##
  OnOpenProject;
Endproc;

Verwendung Systemtabelle
TurboPL/OnOpenProject/Verwendung Systemtabelle
Top
Diese Möglichkeit kann in OnOpenProject verwendet werden.

  ..#system tabelle prüfen --- muss ein datensatz enthalten
  Try
    MoveBegin(SYSTEM);
    ReadNext(SYSTEM);
  Except
    Meldung_Fehler("Die Optionen können nicht gelesen werden!" + Chr(13) + Chr(10) + "Aktion: Anwendung neu installieren.", "Anwendung starten");
    EndProg;

PlaySound

PlaySound mittels Makro
TurboPL/PlaySound/PlaySound mittels Makro
Top
Das Einlesen einer WAV-Datei geschieht genau wie das eines Bildes:
DerSound erscheint als Schalter im Formular.
Zuerst muß man den Editiermodus einschalten.
Nach Drücken des Schalters wird ein Fenster geöffnet, in welchem ein
Mikrofonsymbol enthält, falls das Feld schon mit einer WAV-Datei verbunden ist.
Zum Abspielen eines Sounds braucht man auf jeden Fall die FunktionPlaySound.
Plazieren Sie einfach einen Makroschalter in Ihr Formular und
geben Sie als Makrobefehl an:

PlaySound(Klangfeld)

Wobei "Klangfeld" das Label Ihres Klangfeldes ist.
Syntax Playsound
TurboPL/PlaySound/Syntax Playsound
Top
PlaySound(blobSound: Tabellenfeld);

Pos

Pfad aus Dateinamen ermitteln
TurboPL/Pos/Pfad aus Dateinamen ermitteln
Top
Procedure ExtractFilePath(sDateiname: String): String;
Vardef s, sResult: String;
Vardef i: Integer;

  s := sDateiname;
  sResult := "";
  i := Pos("\", s);
  While i > 0
    sResult := sResult + LeftStr(s, i);
    If s = "\"
      ..#Sonderfall: hinter letztem \ kein Text mehr vorhanden
      s := ""
    Else
       s := RightStr(s, Length(s) - i)
    End
  i := Pos("\", s);
  End
  Return sResult;
Endproc

Syntax Pos
TurboPL/Pos/Syntax Pos
Top
Pos(sStrIn, sStrHat: String): Integer
Zahlen prüfen
TurboPL/Pos/Zahlen prüfen
Top
Procedure ZahlPrüfen(sStr:string):integer
..#Prüft ob sStr eine Zahl ist. Liefert 1 wenn OK
..#Test: Message(Str(ZahlPrüfen("1234")));
..##
Var i = 0;
Var nLen = Length(sStr);
Var sStrC = "0123456789.,";
Var nRT = 1;

  While i := i + 1 <= nLen
    ?Pos(sStr[i], sStrC) = 0 / nRT := 0;
  End;
  Return nRT
Endproc


RamText

Beispiele: RamText Grösse
TurboPL/RamText/Beispiele: RamText Grösse
Top
Procedure GetRamtextSize : Integer;
..#Anzahl Zeichen im RamText ermitteln
..##
   VarDef nFH, nCnt : Integer;
   VarDef c : String;

   nCnt := 0;
   If nFH := Reset("RAMTEXT") > 0
     While Not EOT(nFH)
       nCnt := nCnt + 1;
       c := Read(nFH, 1);
     End;
     Close(nFH);
   End;
   Return nCnt
Endproc;

RamText verwenden um Inhalt Zwischenablage zu zeigen
Procedure Zeige_Zwischenablage;
..#zeige Inhalt der Zwischenablage
..##
  Var CHDG = "Inhalt der Zwischenablage zeigen";
  Vardef sStr : String;
  Vardef nFH : Integer;

  ..#inhalt zwischenablage zum ramtext kopieren
    Clip2Text;
    If GetRamtextSize(0) = 0
      Message("Abbruch: Die Zwischenablage ist leer.", "Info - " + CHDG);
      Return
    End;
    nFH := Reset("RAMTEXT");
    If nFH = 0
      Message("Abbruch: Datei zur Speicherung Inhalt Zwischenablage konnte nicht gelesen werden.", "Fehler - " + CHDG);
      Return
    End;
    While Not EOT(nFH)
      sStr := sStr + ReadLn(nFH) + Chr(13) + Chr(10);
    End;
    Close(nFH);
    Message(sStr, CHDG);
Endproc;


ReadNext

Beispiel Einträge einer Systemtabelle lesen, bei Fehler Programmabbruch
TurboPL/ReadNext/Beispiel Einträge einer Systemtabelle lesen, bei Fehler Programmabbruch
Top
Var CERR = "Abbruch: Optionen können nicht gelesen werden!";
Try
    ..#anfang der tabelle - datensatz wurde noch nicht
gelesen
    MoveBegin(SYSTEM);
    ..#datensatz lesen
    ReadNext(SYSTEM);
    ..#mach irgebdetwas mit dem satz
    Return 1
Except
    ..#fehler aufgetreten, meldung inkl. TS fehlercode
    Message(CERR + Chr(13) + Chr(10) + Error.Message, "Fehler");
    Return 0
End;


ReadRec

Datenbankjob Vorgaben aus eine Taybelle SYSTEM lesen
TurboPL/ReadRec/Datenbankjob Vorgaben aus eine Taybelle SYSTEM lesen
Top
..#Vorgane aus der Tabelle SYSTEM lesen
..#Die Tabelle hat nur einen Datensatz
..#Wenn der Satz nicht gelesen werden kann, Job abbrechen
.If ReadRec(SYSTEM, 1) = 0
.Do Message("Abbruch: Keine Vorgaben gefunden!", "Fehler")
.ST
.End

Satz kopieren ohne Inhalt Memofeld
TurboPL/ReadRec/Satz kopieren ohne Inhalt Memofeld
Top
Ein Datensatz kopieren, dabei Inhalt des Memofeldes nicht kopieren.

Procedure SatzKopieren
  RELATION K=KUNDEN
  ReadRec(K,1);
  ReadRec(KUNDEN, 0);
  SetRecord(K, KUNDEN);
  SetField(KUNDEN, LabelNo(KUNDEN, 'Bemerkung'), null);
  WriteRec(KUNDEN, FileSize(KUNDEN)+1);
Endproc;


RegenAll

Alle Indices eines Projektes regenieren
TurboPL/RegenAll/Alle Indices eines Projektes regenieren
Top
Var  CHDG = "Datenbank Regenerieren";
Var  CINF = "Die Datenbank wurde erfolgreich regeniert."
Var  CERR = "Die Datenbank konnte nicht regeniert werden!"
Vardef j : Integer;  ..#laufvar

j := 0;
Try
  While j := j + 1 <= MaxFile
    ShowWait("Regeneriere Tabelle " + Exchange(Lower(DBName(j)),".dat", "") + " (" + Str(j) + "/" + Str(MaxFile) + ")");
    RegenAll(j);
  End;
  Hidewait;
  Message(CINF, CHDG);
  Return 1
Except
  Message(CERR, CHDG);
  Return 0
End;
Syntax RegenAll
TurboPL/RegenAll/Syntax RegenAll
Top
RegenAll(ntabelle : Integer);

Relation

Syntax RELATION
TurboPL/Relation/Syntax RELATION
Top
Syntax: RELATION Relationsdefinition

Statische Links festlegen, Tabellen virtuelle öffnen und Inklusionen definieren
Das Relationskommando dient der Einrichtung von

• virtuellen Tabellen, über die ein zusätzlicher Zugriff auf bereits geöffnete Tabellen möglich wird, und
• statischen Links, mit denen die Tabellenverknüpfungen über das ADL-System erweitert oder überschrieben werden können, und
• Zwangsverknüpfungen, so dass immer eine Kombination mit der Primärdatei hergestellt wird, auch wenn kein verknüpfter Datensatz vorhanden ist (Erzwungene Bildung des Kreuzproduktes).

Die einzelnen Angaben werden einfach durch Komma getrennt hintereinander geschrieben. Die Länge eines Kommandos ist auf 255 Zeichen beschränkt. Jedes Relationskommando hebt
das vorhergehende wieder auf.

Eine Relationsdefinition wird innerhalb von Datenbankjobs und easy-Modulen mit dem Kommando RELATION angegeben.

In Datenbankjobs ist dieses Kommando nur im Prolog zulässig. In allen anderen Textbereichen wird die Bearbeitung mit der Meldung "Illegale Operation" abgebrochen.

Projektweite Relationsdefinitionen können über den Menüpunkt Projekt/Tabellen verknüpfen angelegt werden.
Syntax RELATION Relationsdefinition
TurboPL/Relation/Syntax RELATION Relationsdefinition
Top
 

Replace

Replace Syntax in Datenbankjob
TurboPL/Replace/Replace Syntax in Datenbankjob
Top
Syntax im Datenbankjob
..#

.primTableIs [MeineTabelle]
.setAccess Nummer
.sub
.replace [MeineTabelle]([MeinFeld1] = [NeuerWert])
.endsub

REPLACE [MeineTabelle]([MeinFeld2] = [NeuerWert]


Syntax Replace
TurboPL/Replace/Syntax Replace
Top
Replace TABELLE.Feldname := Wert

Werte direkt ändern
TurboPL/Replace/Werte direkt ändern
Top
Mittels Replace können Werte direkt geändert werden, wenn vorher allerdings den Index umgestellt wird, so daß dieser nicht über das zu ersetzende Feld geht.
Beispiel:
Anstatt

  ReadRec (TABELLE,0) .. leeren Datensatz zur Verfügung stellen
  Replace Feldname := x
  WriteRec (TABELLE)

kann

 Replace TABELLE.Feldname := x

verwendet werden.


Reset

Inhalt eine Textdatei zeigen
TurboPL/Reset/Inhalt eine Textdatei zeigen
Top
Procedure Textdatei_Inhalt_Zeigen;
..#Eine einfache Methode den Inhalt eine Textdatei zu zeigen
..##
VarDef nFH : Integer;
VarDef sStr : String;
  nFH := Reset(BaseDir + "readme.txt");
  If nFH = 0
    Message("Datei kann nicht geöffnet werden!", "Fehler - Datei zeigen");
    Return
  End;
  While NOT Eot(nFH)
    sStr := sStr + Read(nFH, 1);
  End;
  Message(sStr);
  Close(nFH);
EndProc;

Projektdatei Platzhalter auslesen
TurboPL/Reset/Projektdatei Platzhalter auslesen
Top
Procedure LeseProjektEdition(nDummy:Integer):String;
..#lese aus der projekt tdb datei die projektedition.
..#verwendet werden die platzhalter # um die edition zu ermitteln. beispiel:
..#projekt eigenschaften, edition #20090118 (Professional)#
..##
  Vardef nFH, i, nGo : Integer;
  Vardef c, sStr : String;

  sStr := "";
  nGo := 0;
  nFH := Reset(Basedir + "roptipp.tdb");
  While NOT EOT(nFH)
    c := Read(nFH, 1);
    If c = "#" And nGo = 0
      nGo := 1;
      c := "";
    End;
    If c = "#" And nGo = 1
      nGo := 0;
      c := "";
    End;
    If nGo = 1
      sStr := sStr + c;
    End;
  End;
  Close(nFH);
  Return sStr
EndProc;

Syntax Reset
TurboPL/Reset/Syntax Reset
Top
Rewrite(DateiHandle : Integer);


Rewrite

Datei mittels Rewrite öffnen und bei Datenbankfehler richtig schließen
TurboPL/Rewrite/Datei mittels Rewrite öffnen und bei Datenbankfehler richtig schließen
Top
Vardef nFH : Integer; ..#Dateihandle
..#Datei neu erstellen
nFH := Rewrite(MeineDatei);
Try
   #Datensätze lesen
Except
   ..#Fehlerbehandlung
   Trace(Error.Message);
Finally
   ..#Datei richtig schließen
   If nFT > 0
     Close(nFT)
   End;
End;
String in eine Datei speichern und in Standardeditor zeigen
TurboPL/Rewrite/String in eine Datei speichern und in Standardeditor zeigen
Top
Procedure StringImEditorZeigen(sStr : String);
..#string in eine text datei speichern und im standardeditor zeigen
..#beispiel: StringImEditorZeigen("Hallo, hier nich ich...");
..##
  Var sDatei = "temp.txt";  ..textdatei
  Vardef nFH : Integer;     ..dateihandle

  If nFH := Rewrite(sDatei) > 0
    WriteLn(nFH, sStr);
    Close(nFH);
    Execute(sDatei);
  Else
    Message("Datei kann nicht erstellt werden!", "Fehler");
  End;
Endproc;

String in eine Texdatei speichern
TurboPL/Rewrite/String in eine Texdatei speichern
Top
Procedure StringToFile(sStr : String);
..#string in eine text datei speichern
..##
  Var sDatei = "temp.txt";  ..textdatei
  Vardef nFH : Integer;     ..dateihandle

  If nFH := Rewrite(sDatei) > 0
    WriteLn(nFH, sStr);
    Close(nFH);
    Message("Datei erstellt.", "Hinweis");
  Else
    Message("Datei kann nicht erstellt werden!", "Fehler");
  End;
Endproc;


Syntax Rewrite
TurboPL/Rewrite/Syntax Rewrite
Top
Rewrite(DateiHandle : Integer);

Zwei Dateien zusammenfügen
TurboPL/Rewrite/Zwei Dateien zusammenfügen
Top
Procedure MergeTmpFiles(sTmpDatei, sTmpDatei2 : String) : Real;
   Vardef nFH2, nFH3 : Real;
   Vardef sLine : String;
   ?(sTmpDatei = "") Or (sTmpDatei2 = "") / Return 0
   If (IsFile(sTmpDatei2) = 0)
    Message("Die temporäre Dateien können nicht zusammengefügt werden.", "FEHLER");
    Return 0
   End;
   ?IsFile(sTmpDatei) = 1 / nFH2 := TAppend(sTmpDatei);
   ?IsFile(sTmpDatei) = 0 / nFH2 := Rewrite(sTmpDatei);
   If NOT nFH3 := Reset(sTmpDatei2)
    Message("Die temporäre Dateien können nicht zusammengefügt werden.", "FEHLER");
    Close(nFH2);
    Return 0
   Else
    While Not Eot(nFH3)
     sLine := ReadLn(nFH3);
     WriteLn(nFH2, sLine) ;
    End;
   End;
   Close(nFH2);
   Close(nFH3);
   Return 1
  Endproc;


Round

Datum Differenz ermitteln
TurboPL/Round/Datum Differenz ermitteln
Top
Vardef nTage : Integer;
..#wieviele tage noch zum Termin
nTage := Round($KONTAKTE.KontaktTermin - Today);

Ergebnis abrunden
TurboPL/Round/Ergebnis abrunden
Top
Die Funktion Round() rundet nur Nachkommastellen.

Wenn man aber die Zahl vorher durch 10 teilt und
danach wieder mit 10 multipliziert kann man sie auch für diesen Zweck benutzen:
.. Parameter:
.. number = die zu rundende Zahl
.. digits = Zahner-Stelle die zu gerundet werden soll

Procedure RoundInt(number: Real; digits: Integer): Integer
  number := number / Exp( digits * Log(10)); .. number / 10 hoch digits
  return Int(Round(number) * Exp(digits * Log(10))));
Endproc;

In der Praxis sieht das dann so aus:
RoundInt(152.531, 1) gibt 150 zurück.
RoundInt(152.531, 2) gibt 200 zurück.


ScanRecs

Beispiele Volltext und ScanRecs
TurboPL/ScanRecs/Beispiele Volltext und ScanRecs
Top
Volltext aktualisieren
Beispiel Volltext aktualisieren für die Tabelle Tipps
=====================================================
Die Stichworte werden in der Tabelle VTINDEX gespeichert und die Relation zwischen der
Tabelle TIPPS und VTINDEX mittels STICHWORT.REL.

Die Angabe der Felder, Fields, sollte der Tabellennamen vorangestellt werden. Das Dollar ($) Zeichen dabei nicht vergessen.

Vardef nCnt : Integer; ..#die Anzahl der gefunden Einträge.
nCnt := ScanRecs($TIPPS, $VTINDEX, $STICHWORT, Fields($TIPPS.Beschreibung, $TIPPS.Tipp), "", 100, BaseDir+"stiwono.txt", 0);

Volltextsuche
Beispiel: gesucht wird der Inhalt String sStr in der Tabelle VTINDEX
====================================================================
Die gefunde Einträge werden dann in Tabelle TIPPS markiert.
Die Tabelle STICHWORT enthält die Relation zwischen der Tabelle TIPPS und der Volltextindex Tabelle VTINDEX.

  Vardef nRT : Integer; ..#Rückgabewert.
  nRT := MarkTable($TIPPS, $VTINDEX, sStr, '', '', 0, $STICHWORT);

  ..#fehler?
  Vardef sHStr : String;
  If nRT >= 201 And nRT <= 204
    ?nRT = 201 / sHStr := "Ungültige Index-Tabelle";
    ?nRT = 202 / sHStr := "Ungültige Relation"
    ?nRT = 203 / sHStr := "Schließende Klammer erwartet"
    ?nRT = 204 / sHStr := "Ungültiges Zeichen"
    Message(sHStr, "Fehler Volltextsuche"););
    Return
  End;

Volltextsuche mit Zahlen
========================
Wenn ein Volltextindex statt über die TurboDB Studio Oberfläche mit der TurboPL-Funktion ScanRecs erzeugt wird, kann ein
erweitertes Alphabet angeben (Parameter ExtABC) werden und dort Zahlen mit aufnehmen.

Nachdem der Volltextindex mit ScanRecs unter Verwendung von ExtABC erzeugt wurde, muß bei der Suche nun
ebenfalls das erweiterte Alphabet angegeben werden.

Es ist deshalb besser für die Suche die Funktion MarkTable zu verwenden.

Syntax ScanRecs
TurboPL/ScanRecs/Syntax ScanRecs
Top
ScanRecs(MainTable, IndexTable, RelTable: Real; Fields(Column1 [,Column2, ..ColumnN]); ExtABC: String; MaxFrequency: Real; ContraIndex: String; Mode: Real):Real;


Selektion

Dynamische Selektion
TurboPL/Selektion/Dynamische Selektion
Top
.Var nRT = 0
.Var sStr = ""
..#input mittels ts input funktion
.DO nRT := Input("Bedingung: ", "Suchbedingung eingeben", 0, sStr)
..#nur für tests
..Do Message("Die Bedingung lautet:" + sStr);
..#die bedingung ausführen
.Try
.Selection _sStr
.Except
.Do Message("Fehler bei der Selektion:" + Error.Message, "Fehler Selektion")
.ST
.End
Selektion: aktuellen Datensatz mittels $SYSTEM.Hilfsstring
TurboPL/Selektion/Selektion: aktuellen Datensatz mittels $SYSTEM.Hilfsstring
Top
.Do Message($SYSTEM.Hilfsstring)
.If $SYSTEM.Hilfsstring = ""
.Do Message("Fehler: keine Bedingung angegeben!", "Aktueller Datensatz lesen")
.ST
.End
.Selektion $NOTIZEN.Laufende_Nummer = Val($SYSTEM.Hilfsstring)

Selektion: aktuellen Datensatz mittels eine globale variable sNOTE
TurboPL/Selektion/Selektion: aktuellen Datensatz mittels eine globale variable sNOTE
Top
.Do Message(sNOTE)
.Selektion $NOTIZEN.Laufende_Nummer = Val(sNOTE)

Selektion: aktuellen Datensatz mittels ReadRec
TurboPL/Selektion/Selektion: aktuellen Datensatz mittels ReadRec
Top
.Do ReadRec($NOTIZEN, RecNr($NOTIZEN))
.Do nSelektion := $NOTIZEN.Laufende_Nummer
.Selektion $NOTIZEN.Laufende_Nummer = nSelektion
.Do Message(Str(nSelektion), "Aktueller Datensatz lesen")
..

Selektionen Dynamisch ausführen
TurboPL/Selektion/Selektionen Dynamisch ausführen
Top
Mittels DO können Selektionen dynamisch durchgeführt werden.
Beispiel

  c := 'Name like "Müller"'
  Do _"x:=SEL("+c+")"
  If x=1
   .. erfüllt
  Else
   .. nicht erfüllt
  End


SetAccess

Sortierordnung mittels SetAccess
TurboPL/SetAccess/Sortierordnung mittels SetAccess
Top
SetAccess <Indexdatei> funktioniert auch in Easy-Module.

Beispiel:
Setaccess adr-name.ind

Syntax SetAccess
TurboPL/SetAccess/Syntax SetAccess
Top
SETACCESS Index


SetFilter

SetFilter ausschalten
TurboPL/SetFilter/SetFilter ausschalten
Top
Mittels SetFilter(Tabelle,"")
kann der aktuelle Filter ausgeschaltet werden.
Das gilt für statischen und dynamischen Filter.

SetFilter ermitteln, ändern und wieder zurücksetzen
TurboPL/SetFilter/SetFilter ermitteln, ändern und wieder zurücksetzen
Top
Mit der Funktion IndNo(Tabelle) ermitteln, welcher Index momentan aktiv ist.
Dann diesen IndexWert in einer Variablen speichern.
SetFilter anpassen und zuordnen
Hinterher wieder der Ursprungsindex setzen

Beispielcode bezogen auf das bei TurboDB Studio mitgelieferte Demo "Vögel":
...
VarDef idxNo: Integer;
idxNo := IndNo(VÖGEL);
Access(VÖGEL, "VÖGEL.ind");
SetFilter(VÖGEL, "A*", "M*");
Attach;

Message("Weiter mit OK...");

Access(VÖGEL, IndName(VÖGEL, idxNo));
Attach;

SetMark

JOB oder MAKRO eine Liste drucken
TurboPL/SetMark/JOB oder MAKRO eine Liste drucken
Top
Über einen JOB oder MAKRO eine Liste drucken, bei der die Bedingung für die
Selektion vom Anwender selbst eingegeben werden kann.

Makro schreiben:

  Input ("Selektion:","Frage")
  SUB _T-Eingabe
   SetMark (FileNo, RecNo (FileNo))
  ENDSUB Name, Vorname
  SetSortOrder ("Markierung")
  Run ("Liste")
...bzw. 'Liste' druckt nur markierte Datensaetze.


SetNumberFormats

Beim Start einer Anwendung gesetzt werden um sicherzustellen, dass die Formate auch stimmen.
TurboPL/SetNumberFormats/Beim Start einer Anwendung gesetzt werden um sicherzustellen, dass die Formate auch stimmen.
Top
Eine Möglichkeit wäre SetNumberFormats in OnOpenProject aufzurufen:

Procedure OnOpenProject
..#wird beim starten der anwendung ausgeführt

  ..#format für dec, datum, zeit setzen. -1 ist wie am rechner eingestellt
  SetNumberFormats(-1, -1, -1);
EndProc;


SetOutputFile

SetOutPutFile verwenden
TurboPL/SetOutputFile/SetOutPutFile verwenden
Top
procedure Bericht_Drucken(sBerichtname : String);
..#bericht drucken
..##
  Vardef nModus : Integer;    ..#druckermodus = wohin soll gedruckt werden
  Vardef sFile : String;      ..#dateiname fall output in eine datei

  ..#modus ermitteln - aus denn einstellungen
  nModus := EnumVal($SYSTEM, LabelNo($SYSTEM, "VorgabeDruckModus"), Str($SYSTEM.VorgabeDruckModus)) - 1;
  ..#nmodus auswerten
  ..#ausgabe datei - dann dateiname und typ abfragen
  If nModus = 3
    If Input("Dateiname (" + Str($SYSTEM.VorgabeDruckerDateiformat) + "):", "Drucken in Datei", 0, sFile) = 0
      Halt;
    End;
    SetOutputFile(sFile, $SYSTEM.VorgabeDruckerDateiformat);
  End;
  Run(sBerichtname, nModus);
EndProc;

Syntax SetOutputFile
TurboPL/SetOutputFile/Syntax SetOutputFile
Top
SetOutputFile(Dateiname : String; Format : String);


ShellExecute

Hilfedatei in HTML Help Format direkt aufrufen
TurboPL/ShellExecute/Hilfedatei in HTML Help Format direkt aufrufen
Top
Procedure Hilfe_Zeigen;
..#zeigt die projekt htmlhelp datei
..##
  ShellExecuteW(0, "open",BASEDIR+"projekt.chm", "","",5);
Endproc;


ShowWait

Fortschrittsanzeige (Progressbar) darstellen
TurboPL/ShowWait/Fortschrittsanzeige (Progressbar) darstellen
Top
Procedure Progressbar(nArt: real; sMeldung: string; nMax: real; nAct: real);
  ..#Zeigt den Vorschreitungsstatus einer Operation
  ..#Parameter:
  ..#nArt: 1 = balken, 2 = %
  ..#sMeldung = die Meldung (wie zB "Bitte Warten"
  ..#nMax = Maximalwert, nAct = aktueller Wert
   DEF CRLF = Chr(13) + Chr(10);
   DEF nPMax = 100;
   DEF sDEL = Chr(219)
   Vardef sTmp : String;
   Vardef i, k, f : Real;

   f := nMax / nPMax;
   ?f = 0 / f := 1;
   k := Int(nAct / f);
   If nArt = 1
    sTmp := "";
    nLoop(i, k, sTmp := sTmp + Chr(219));
    ShowWait("Thema: " + sThema + CRLF + sMeldung + CRLF + sTmp);
   End
   ?nArt = 2/ShowWait(sMeldung + CRLF + Str(k,1,0) + "%");
EndProc;

Links abgeschnittenen String in ShowWait zeigen
TurboPL/ShowWait/Links abgeschnittenen String in ShowWait zeigen
Top
Zeigt ein links abgeschnittenen String. Wird für Showwait verwendet.
Abgeschnittener Teil wird als ... gezeigt.

Procedure pShowLine(sLine : String; nMaxLength : Real) : String;
  ..#Zeigt ein links abgeschnittenen String. Wird für Showwait verwendet.
  ..#Abgeschnittener Teil wird als ... gezeigt.
  ..#Parameter:
  ..#sLine = dargestellte Information
  ..#nMaxLength = max. Länge des Strings
  ..#Returnwert
  ..#angepasster String

   ?nMaxLength < 0 Or nMaxLength > 255 / nMaxLength := 255
   If Length(sLine) > nMaxLength
    Return "..." + sLine[Length(sLine) - nMaxLength, 255]
   Else
    Return sLine
   End
EndProc;

Syntax ShowWait
TurboPL/ShowWait/Syntax ShowWait
Top
ShowWait(Message: String);

Zeilenumbruch verwenden
TurboPL/ShowWait/Zeilenumbruch verwenden
Top
Zeilenumbruch im Text darstellen mittels
  "Zeile 1" + Chr(13) + Chr(10) + "Zeile 2".
oder
  DEF CRLF = Chr(13) + Chr(10);

"Zeile 1" + CRLF + "Zeile 2".

Gilt auch für die Funktion Message.



Sortierung

Nach einer Sortierung den ersten richtigen Datensatz anzeigen
TurboPL/Sortierung/Nach einer Sortierung den ersten richtigen Datensatz anzeigen
Top
Frage:
Gibt es die Möglichkeit nach einer Sortierung (z.B. nach Namen) den ersten
richtigen Datensatz nicht unten sondern oben am Feldrand anzuzeigen?

Lösung:
In das Ereignis BeimÖffnen des betreffenden Auswahlformulars die
Funktion BottomOfTable eintragen.

Syntax Sortierung
TurboPL/Sortierung/Syntax Sortierung
Top
Sortierung(IndexName: String; Modus: Real)
SetSortOrder(IndexName: String; Mode: Real)

Übergabeparameter nicht gefunden
TurboPL/Sortierung/Übergabeparameter nicht gefunden
Top
SetSortOrder gibt keine Meldung aus, wenn der Übergabeparameter(Indexdatei) im aktuellen  Verzeichnis nicht gefunden wurde.
Dieses Problem läßt sich wie folgt umgehen:

  Vardef sDatei : String;
  sDatei := "Executeparameter";
  IF Exists(sDatei) = 2
    Message("Kann Programm " + sDatei + " nicht finden.", "Fehler");
    Halt;
  END



SoundEx

SoundEx Regeln
TurboPL/SoundEx/SoundEx Regeln
Top
Die Funktion SOUNDEX liefert eine sehr simples phonetisches Bild
einer Zeichenkette. Hier kurz die Regeln:

Der erste Buchstabe wird unverändert übernommen.
Die folgenden Zeichen werden von links nach rechts so codiert:

'B','F','P','V' -> '1'
'C','G','K','Q','S','X','Z','ß' -> '2'
'D','T' -> '3'
'L' -> '4'
'M','N' -> '5'
'R' -> '6'

Alle anderen Zeichen werden übersprungen. Ein Zeichen wird auch übersprungen,
wenn es den gleichen Code wie das letzte Zeichen liefert.
Von dem resultierenden String werden nur die ersten 4 Zeichen verwendet.
Der Hauptnachteil besteht darin, dass viel zu viele unterschiedliche Wörter
passen, eine Suche also meist eine zu große Trefferzahl liefert.
Allerdings hat SOUNDEX nichts mit dem Operator "enthält" zu tun, der
wiederum auf dem Einsatz der Funktion POS beruht.
Wenn der gesuchte Begriff nicht am Anfang des Strings steht,
wird man mit "ähnlich" kein Glück haben.
Besser als "ähnlich" oder "enthält" ist in jedem Fall der Einsatz
von "wie" und "in" oder auch von STRCOMP (für Spezialanwendungen).


Str

Nachkommastellen
TurboPL/Str/Nachkommastellen
Top
Bei der Verwendung von numerischen berechneten Feldern in Formularen und
Berichten kann es störend sein, daß immer zwei Nachkommastellen ausgegeben
werden. Hier kann die Funktion STR Abhilfe schaffen:

Wenn Ihr bisheriger Ausdruck <Formel> war, sollten Sie STR(<Formel>, 0,n)
angeben, wobei n die gewünschte Anzahl von Nachkommastellen ist.

Beispiel:
Wenn Ihr bisheriger Ausdruck  war, sollten Sie STR(, 0,n)
angeben, wobei n die gewünschte Anzahl von Nachkommastellen ist.

Beispiel:
STR(INT(Geburtstag),5,0)

StrSort

Beispiel StrSort für die Abfrage einer Tabellenstruktur
TurboPL/StrSort/Beispiel StrSort für die Abfrage einer Tabellenstruktur
Top
Procedure Projekttabellenfeldliste_abfragen;
..#abfrage der tabellenfelder für eine tabelle
..##
  Var    CCRLF = Chr(13) + Chr(10);  ..#zeilenumbruch für meldungen
  Var    CHDG = "Tabellenstruktur abfragen und kopieren";
  Vardef i,j, n : Integer            ..#laufvars
  Vardef sTabelle : String;          ..#tabelle der abgefragt wird
  Vardef sListe : String;            ..#liste der tabellenfelder
  Vardef asTabellen : String[250];   ..#array für tabellen. dieses wird sortiert
  Vardef asFelder : String[250];     ..#array für tabellen felder

  ?MaxFile = 0 / Return
  ..#liste der tabellen erstellen und diese in der abfrage anzeigen zu können
  i := 0;
  While j:=j+1 <= MaxFile
    asTabellen[i] := Lower(Exchange(Upper(DBName(j)),".DAT", ""));
    i := i + 1;
  End;
  ..#strsort verwenden
  n := i - 1;
  StrSort(asTabellen, n);
  NLoop(i, n, sListe := sListe + asTabellen[i] + CCRLF);
  ..#tabelle abfragen, dabei werden alle tabellen gezeigt
  If Input("Liste der Tabellen:" + CCRLF + sListe + CCRLF + "Tabelle eingeben:", CHDG, 0, sTabelle) = 0
    Return
  End;
  sTabelle := Upper(sTabelle);
  j := 0;
  While j:=j+1 <= MaxFile
    If Exchange(Upper(DBName(j)),".DAT", "") = sTabelle
      ..Message( Exchange(Upper(DBName(j)),".DAT", ""));
      ..#liste alle feldlabel der tabelle auf
      WHILE i:=i+1 <= MaxLabel(j)
        asFelder[i] := "$" + Exchange(Upper(DBName(j)),".DAT", "") + "." + Label(j, i,1)
      END;
      ..und sortiere
      StrSort(asFelder, MaxLabel(j));
      ..und gebe in der feldliste aus
      sListe := "";
      NLoop(i, MaxLabel(j),sListe := sListe + asFelder[i] + CCRLF);
      CopyStrToClipboard(sListe);
      Message("Feldliste für Tabelle '" + Lower(sTabelle) + "' erstellt und zur Zwischenablage kopiert", "Hinweis - Projekttabellenfeldliste");
      Return;
    End;
  End;
  Message("Abbruch: Tabelle " + sTabelle + " nicht gefunden!", "Fehler - Projekttabellenfeldliste");

Subst

Kopiere ein HTML-Template mit Platzhalten nach Ramtext
TurboPL/Subst/Kopiere ein HTML-Template mit Platzhalten nach Ramtext
Top
z.B. aus einem Memo mittels CopyMemo und ersetzen dann alle Platzhalter
durch Feldinhalte.


Syntax Subst
TurboPL/Subst/Syntax Subst
Top
Subst(SuchString : String; ErsetzString : String; Art : Real) : Real

Die Funktion ermöglich die Ersetzung von Zeichen innerhalb RAMTEXT. Ramtext ist eine virtuelle Textdatei (in den Speicher abgelegte Datei).

Parameter
SuchString = String der innerhalb von Ramtext gesucht wird
ErsetzString = neue String
Art: 0 = Normal, 1 = in HTML konvertieren
Returnwert:
Position der Ersetzung oder 0 bei keine Ersetzung


Systemvariablen

Beispiele Verwendung Systemvariablen
TurboPL/Systemvariablen/Beispiele Verwendung Systemvariablen
Top
procedure Übersicht_Systemsvariable;
..#Übersicht alle Systemvariablen
..##
Var CCRLF = Chr(13) + Chr(10);
Var sMsg = "";

  sMsg := sMsg + "$heute: " + $heute+ CCRLF;
  sMsg := sMsg + "$jetzt: " + $jetzt+ CCRLF;
  sMsg := sMsg + "" + CCRLF;
  sMsg := sMsg + "$TDB-Pfad (Programmverzeichnis TS Bin Dateien): " + $TDB-Pfad + CCRLF;
  sMsg := sMsg + "$T-Eingabe (Globale Variable für Input): " + $T-Eingabe + CCRLF;
  sMsg := sMsg + "" + CCRLF;
  sMsg := sMsg + "$Seite (nur Datenbankjob): " + Str($Seite) + CCRLF;
  sMsg := sMsg + "$Zeile (nur Datenbankjob): " + Str($Zeile) + CCRLF;
  sMsg := sMsg + "G_alt (nur Datenbankjob): wird bei Gruppenwechsel (Steuerbefehl .GP) verwendet" + CCRLF;
  sMsg := sMsg + "G_neu (nur Datenbankjob): wird bei Gruppenwechsel (Steuerbefehl .GP) verwendet" + CCRLF;
  sMsg := sMsg + "" + CCRLF;
  sMsg := sMsg + "$Fehler: " + "nicht mehr verwenden, dafür Error" + CCRLF;
  sMsg := sMsg + "Error.Nummer: " + Str(Error.Nummer)+ CCRLF;
  sMsg := sMsg + "Error.Meldung: " + Error.Message+ CCRLF;
  sMsg := sMsg + "Error.Beschreibung: " + Error.Description+ CCRLF;
  Message(sMsg, "Übersicht der Systemvariablen - WICHTIG: Groß/Kleinschreibung beachten", 1);
endproc;

Beispiel Datenbankjob Footer
wo $heute / $today, $jetzt / $Now und $Seite verwendet werden
$(@a8n "Ausgegeben am " + DateStr(ToDay) + " um " + TimeStr(Now)) $(@a8n "Seite " + $Seite R_Form ToMargin)

Procedure SystemUpdate(sField:String; sValue:String):Integer;
..#feld in der system tabelle aktualisieren
..#Bsp:   SystemUpdate("MeineMeldung", "Hallo Welt");
..##
  Vardef nFNo : Integer;  ..#feldnr
  Vardef nRT : Integer;    ..#return code 0 = fehler, 1 = OK

  ..#noch ist alles nicht ok
  nRT := 0;
  ..#feld label suchen
  nFNo := LabelNr($SYSTEM, sField);
  ..#gefunden, dann setze neuen wert
  If nFNo > 0
    Try
      MoveBegin($SYSTEM);
      ReadNext($SYSTEM);
      ModifyRec($SYSTEM);
      SetField($SYSTEM, nFNo, sValue);
      PostRec($SYSTEM);
      nRT := 1;
    Except
      nRT := 0;
    End;
  End;
  Return nRT;
Endproc;


TAppend

Beispiel Inhalt Memofeld an eine Datei anfügen
TurboPL/TAppend/Beispiel Inhalt Memofeld an eine Datei anfügen
Top
Den kompletten Inhalt eines Memos TABELLE.MemoFeld an die angegebene Datei anhängen:

Vardef nFH: Integer;

nFH := TAppend('c:\hallowelt.txt');
Write(nFH, TABELLE.MemoFeld);
Close(nFH);

Hinweis:
Kann erweitert werden, durch z.B. vorher zu prüfen ob die Datei
c:\hallowelt.txt auch vorhanden ist:
If NOT Exists('c:\hallowelt.txt') Then
  Message("Datei nicgt gefunden.");
  Return
End;

Syntax TAppend
TurboPL/TAppend/Syntax TAppend
Top
TAppend(Dateiname) : Integer;

Zwei Dateien zusammenfügen
TurboPL/TAppend/Zwei Dateien zusammenfügen
Top
Procedure MergeTmpFiles(sTmpDatei, sTmpDatei2 : String) : Real;
   Vardef nFH2, nFH3 : Real;
   Vardef sLine : String;
   ?(sTmpDatei = "") Or (sTmpDatei2 = "") / Return 0
   If (IsFile(sTmpDatei2) = 0)
    Message("Die temporäre Dateien können nicht zusammengefügt werden.", "FEHLER");
    Return 0
   End;
   ?IsFile(sTmpDatei) = 1 / nFH2 := TAppend(sTmpDatei);
   ?IsFile(sTmpDatei) = 0 / nFH2 := Rewrite(sTmpDatei);
   If NOT nFH3 := Reset(sTmpDatei2)
    Message("Die temporäre Dateien können nicht zusammengefügt werden.", "FEHLER");
    Close(nFH2);
    Return 0
   Else
    While Not Eot(nFH3)
     sLine := ReadLn(nFH3);
     WriteLn(nFH2, sLine) ;
    End;
   End;
   Close(nFH2);
   Close(nFH3);
   Return 1
  Endproc;


T-Eingabe

Beispiele
TurboPL/T-Eingabe/Beispiele
Top
Verschiedene Beispiele zu T-Eingabe

Procedure Taschenrechner : Real;
..#t-eingabe als taschenrechner
..##
Vardef sFrage : String;
 sFrage := "";
 Input(sFrage, "Taschenrechner");
 Return Val(T-Eingabe)
Endproc

Procedure Taschenrechner(A, B : Real)
..#taschenrechner mit parameter
..##
Vardef sFrage : String;
  sFrage := Str(A) + " mal " + Str(B) + " ist?";
  Input(sFrage, "Rechentest");
  If Val(T-Eingabe) ist A * B
    Message("Sehr gut!")
  Else
    Message("Ist leider nicht richtig!");
  End
Endproc

Procedure Prüfe_Datum;
..#Datum prüfen nach Benutzereingabe
..##
   Vardef nDatum : Integer;
   Vardef sDatum : String;
   T-Eingabe := DateStr(Today);
   Input("Datum");
   SetPara('ec 1');
   nDatum := VAL(T-Eingabe);
   SetPara('ec 0')
   IF nDatum >= 1.1.1900 And nDatum <= 31.12.2099
    Message("Datum '" + T-Eingabe + "' ist gültig...")
   ELSE
    Message("Datum '" + T-Eingabe + "' ist NICHT gültig...")
   END
EndProc;

Procedure Prüfe_Zahl;
..#Zeichenkette als Zahl prüfen
..##
  VarDef nRT : Integer; ..Rückgabe
  ..Fehlerhandling setzen
   SetPara('ec 1');
   nRT := VAL(TABELLE.MeinWert);
   If $Fehler <> 0
     Message("Fehler: Wert '" + TABELLE.MeinWert + "' ist kein Zahl! Fehlercode: " + Str(nRT), "Fehler");
   End;
   SetPara('ec 0');
Endproc;

Syntax T-Eingabe
TurboPL/T-Eingabe/Syntax T-Eingabe
Top
T-Eingabe : String;


Timer

Timer mittels Prozedur an- oder ausstellen und Text eines Labels dazu anpassen.
TurboPL/Timer/Timer mittels Prozedur an- oder ausstellen und Text eines Labels dazu anpassen.
Top
procedure btnActivateTimerBeimAnklicken;
..#timer an oder ausstellen
..#braucht formularelemente timer und label
..##
  Vardef TimerCtrl: Timer;  ..#der timer
  Vardef LabelCtrl: Label;  ..#label der den status des timers zeigt
  ..#label zur info darstellug finden
  LabelCtrl := FindControl("lblTimerScandata") as Label;
  If NOT Assigned(LabelCtrl)
    Message("Fehler: Labelcontrol für Timer kann nicht gefunden werden");
  End;
  ..#timer de- oder aktivieren
  ..#der timer has als name timerScandata
  TimerCtrl := FindControl("timerScandata") as Timer;
  If Assigned(TimerCtrl)
    ..timer is an, dann ausstellen
    If TimerCtrl.Enabled = JA
      TimerCtrl.Enabled := NEIN
      LabelCtrl.Text := "Timer = AUS";
    Else
    ..timer is aus, dann anstellen
      TimerCtrl.Enabled := JA;
      LabelCtrl.Text := "Timer = AN";
    End;
    ..#hier kann der timer interval gesetzt werden
    ..TimerCtrl.Interval
    LabelCtrl.Text := LabelCtrl.Text + " (Interval=" + Str(TimerCtrl.Interval DIV 10) + "s.)";
  End;
EndProc;

Timer Steuerung
TurboPL/Timer/Timer Steuerung
Top
Die Steuerung erfolgt mittels
Enabled := JA|NEIN
Interval := NN (wobei NN 1/10 Sek ist. 10 ist also 1 Sek und 600 ist 1 Min.)

Innerhalb eine Prozedur Object Timer verwenden

  Vardef TimerCtrl: Timer;  ..der timer
  ..#der timer has als name timerScandata
  TimerCtrl := FindControl("timerScandata") as Timer;
  If Assigned(TimerCtrl)
    TimerCtrl.Enabled := JA
    TimerCtrl.Interval := 600;

Trace

Beispiel Trace
TurboPL/Trace/Beispiel Trace
Top
procedure Button1BeimAnklicken;
..#schalter in einem formular erstellen und wenn angeklickt werden verschiedene hinweise im ausgabefenster ausgegeben.
..##
  Trace("Aufruf eines Formulars.");
  OpenForm("testblob.testblob-formular");
  Trace("Das Formular ist jetzt geöffnet und sollte den Fokus haben.");
  Trace("Es geht aber munter weiter...");
  Trace("Wieviel sind 1 + 1?");
  Trace(Str(Val("1") + Val("1")));
endproc;
Syntax Trace
TurboPL/Trace/Syntax Trace
Top
Trace(Zeichenkette: String);


TransOnOff

Beispiel mit TransOn und TransOff
TurboPL/TransOnOff/Beispiel mit TransOn und TransOff
Top
If TransOn(TABELLE) = 0
  Try
    ..#
    ..#Datenbankoperationen durchführen
    ..#
    TransOff(TABELLE);
  Except
    ..#Bei Fehler rollback durchführen
    Rollback(TABELLE);
  End
End;


TryExcept

Beispiel Datei öffnen und bei Fehler richtig schließen
TurboPL/TryExcept/Beispiel Datei öffnen und bei Fehler richtig schließen
Top
Vardef nFH : Integer; ..#Dateihandle
..#Datei neu erstellen
nFH := Rewrite(MeineDatei);
Try
   #Datensätze lesen
Except
   ..#Fehlerbehandlung
   Trace(Error.Message);
Finally
   ..#Datei richtig schließen
   If nFT > 0
     Close(nFT)
   End;
End;

Beispiel Datensatzänderung und Netzwerksperre
TurboPL/TryExcept/Beispiel Datensatzänderung und Netzwerksperre
Top
..#Datenatz suchen
nRNo := FindRec(TABELLE,...)
If nRNo < 1 Or ReadRec(TABELLE, nRNo) < 1
  ..#Meldung ausgeben Datensatz nicht gefunden oder kann nicht gelesen werden
Else
  If EditOn(TABELLE) = 1
    Try
      ..#Änderungen durchführen und Satz speichern
      WriteRec(TABELLE, nRNo);
    Except
      ..#Meldung dass die Tabelle nicht bearbeitet werden kann
    Finally
      EditOff(TABELLE)
    End
  Else
    ..#Meldung dass die Tabelle nicht bearbeitet werden kann
  End;
End;

Beispiel Einträge einer Systemtabelle lesen, bei Fehler Abbruch
TurboPL/TryExcept/Beispiel Einträge einer Systemtabelle lesen, bei Fehler Abbruch
Top
Die Systemtabelle SYSTEM enhält ein Datensatz
Try
    ..#anfang der tabelle - datensatz wurde noch nicht gelesen
    MoveBegin(SYSTEM);
    ..#datensatz lesen
    ReadNext(SYSTEM);
    ..#mach irgendetwas mit dem satz
    ..#Eintrag lesen
    Return 1
Except
    ..#fehler aufgetreten, meldung inkl. TS fehlercode
    Message("Abbruch: Die Optionen können nicht gelesen werden!" + Chr(13) + Chr(10) + Error.Message, "Fehler");
    Return 0
End;

Beispiel TransOn und TransOff
TurboPL/TryExcept/Beispiel TransOn und TransOff
Top
..#

If TransOn(TABELLE) = 0
  Try
    ..#
    ..#Datenbankoperationen durchführen
    ..#
    TransOff(TABELLE);
  Except
    Rollback(TABELLE);
  End
End;


Syntax Try - Except Finally
TurboPL/TryExcept/Syntax Try - Except Finally
Top
Fehlerbehandlung mittels Try:

  Try
    ..
  Except
    ..
  Finally
    ..
  End

Hinweis
Except darf nicht weggelassen werden.


Uses

Syntax Uses
TurboPL/Uses/Syntax Uses
Top
Uses modul, modul, modul;

Uses Modulname
TurboPL/Uses/Uses Modulname
Top
TS/VDP sucht das Modul im aktuellen Verzeichnis.
Dieses wird aber durch Datei-Dialoge verstellt.
Wenn also irgendwo in TS/VDP ein Datei-Dialog benutzt wird, der dann aufein anderes
Verzeichnis weist, ist es aus.
Projekt schließen und neu öffnen stellt einfach nur dasProjektverzeichnis wieder als das Aktuelle ein.



Val

Datum prüfen nach Benutzereingabe
TurboPL/Val/Datum prüfen nach Benutzereingabe
Top
Datum nach Benutzereingabe prüfen.
Verwendet werden Input und T-Eingabe

Procedure Prüfe_Datum : Integer;
..#Datum OK = 1, sonst 0
..##
   Vardef nDatum : Integer;
   Vardef sDatum : String;
   T-Eingabe := DateStr(Today);
   Input("Datum");
   SetPara('ec 1');
   nDatum := VAL(T-Eingabe);
   SetPara('ec 0')
   IF nDatum >= 1.1.1900 And nDatum <= 31.12.2099
    Message("Datum '" + T-Eingabe + "' ist gültig...");
    Return 1
   ELSE
    Message("Datum '" + T-Eingabe + "' ist NICHT gültig!");
    Return 0
   END
EndProc;

Meldung Illegale Zahlenkonstante und FirstDir
TurboPL/Val/Meldung Illegale Zahlenkonstante und FirstDir
Top
Dateizeit ist vom Typ ZEIT
Die Meldung erscheint bei
DATEIEN.Dateizeit := Val(LTRIM(RTRIM(sTmp[39,5])));
Verwendedeshalb:
DATEIEN.Dateizeit := LTRIM(RTRIM(sTmp[39,5]));

Bei Datum geht es schon:
DATEIEN.Dateidatum := VAL(LTRIM(RTRIM(sTmp[27,10])));

Nummer einer Tabelle im aktuellen Projekt ermitteln
TurboPL/Val/Nummer einer Tabelle im aktuellen Projekt ermitteln
Top
Um die Nummer einer Tabelle im aktuellen Projekt zu ermitteln, VAL verwenden.
VAL("TABELLE1.DAT");
Syntax Val
TurboPL/Val/Syntax Val
Top
Val(Zeichenkette: String): Real;

Taschenrechner
TurboPL/Val/Taschenrechner
Top
Procedure Taschenrechner : Real;
   Vardef sFrage : String;
   sFrage := "";
   Input(sFrage, "Taschenrechner");
   Return Val(T-Eingabe)
EndProc;

...#Eine kleine Rechenspielerei.

Procedure Taschenrechner(A, B : Real)
   Vardef sFrage : String;
   sFrage := Str(A) + " mal " + Str(B) + " ist?";
   Input(sFrage, "Rechentest");
   If Val(T-Eingabe) ist A * B
    Message("Sehr gut!")
   Else
    Message("Ist leider nicht richtig!");
   End
EndProc;


Zahl prüfen
TurboPL/Val/Zahl prüfen
Top
Tabellenfeld Zeichenkette als Zahl prüfen

Procedure Prüfe_Zahl;
..#Zeichenkette als Zahl prüfen
..##
  VarDef nRT : Integer; ..Rückgabe
  ..Fehlerhandling setzen
   SetPara('ec 1');
   nRT := VAL(TABELLE.MeinWert);
   If $Fehler <> 0
     Message("Fehler: Wert '" + TABELLE.MeinWert + "' ist kein Zahl! Fehlercode: " + Str(nRT), "Fehler");
   End;
   SetPara('ec 0');
Endproc;

ViewPage

Die aktuelle Registerseite ermitteln
TurboPL/ViewPage/Die aktuelle Registerseite ermitteln
Top
Var nRegisterSeiteAktiv : Integer;

nRegisterSeiteAktiv := ViewPage(0);

Syntax ViewPage
TurboPL/ViewPage/Syntax ViewPage
Top
 

WriteLn

String in eine Datei speichern
TurboPL/WriteLn/String in eine Datei speichern
Top
Procedure StringToFile(sStr : String);
..#string in eine text datei speichern
..##
  Var sDatei = "temp.txt";  ..textdatei
  Vardef nFH : Integer;     ..dateihandle

  If nFH := Rewrite(sDatei) > 0
    WriteLn(nFH, sStr);
    Close(nFH);
    Message("Datei erstellt.", "Hinweis");
  Else
    Message("Datei kann nicht erstellt werden!", "Fehler");
  End;
Endproc;

String in eine Datei speichern und in Standardeditor zeigen
TurboPL/WriteLn/String in eine Datei speichern und in Standardeditor zeigen
Top
procedure StringImEditorZeigen(sStr : String);
..#string in eine text datei speichern und im standardeditor zeigen
..#beispiel: StringImEditorZeigen("Hallo, hier nich ich...");
..##
  Var sDatei = "temp.txt";  ..textdatei
  Vardef nFH : Integer;     ..dateihandle

  If nFH := Rewrite(sDatei) > 0
    WriteLn(nFH, sStr);
    Close(nFH);
    Execute(sDatei);
  Else
    Message("Datei kann nicht erstellt werden!", "Fehler");
  End;
EndProc;

String in eine Tempdatei kopieren
TurboPL/WriteLn/String in eine Tempdatei kopieren
Top
Procedure Str2TmpFile(nArt : Real; sTmpfile, sStr : String);
  ..#kopiert einen string in eine tempdatei.
  ..#auch wenn sstr leer ist wird eine datei erstellt (dann aber 0 byte)
  VarDef nFI : REAL;
   ..speicherdatei anlegen oder anhängen
   ?nArt = 1 / nFI := Rewrite(sTmpfile);
   ?nArt = 2 / nFI := TAppend(sTmpfile);
   ?nFI = 0 / Return
   ?sStr <> "" / WriteLn(nFI, sStr);
   Close(nFI);
Endproc

Syntax WriteLn
TurboPL/WriteLn/Syntax WriteLn
Top
Write(Ln)
Write(Zahl: Real; Zeichenkette: String)
WriteLn(Zahl: Real, Zeichenkette: String)


Write Fehlermeldung
TurboPL/WriteLn/Write Fehlermeldung
Top
Write(0, $1) gibt Fehlermeldung "Typen stimmen nicht überein"

Lösung:
Write(0, $Feldname);
WriteLn und Sonderzeichen
TurboPL/WriteLn/WriteLn und Sonderzeichen
Top
Mittels Write(Ln) werden Zeichenketten in Gänzefüßen dargestellt.
Beispiel:

  WriteLn("Hallo");

Um das Zeichen " mittels Write(Ln) auszugeben, die Funktion CHRverwenden.
Beispiel:

  WriteLn("Jetzt wird das Zeichen " + Chr(34) + " ausgegeben.");

Man beachte, daß als Code den ANSI-Code angegeben werden muß. Ist denANSI-Code nicht bekannt,
dann kann diese mittels der Funktion Asc("zeichen") ermittelt werden.
Beispiel:

  Message("ANSI-Zeichencode:"+Str(Asc(""")));


XWert

Hexwert in Dezimalstring umwandeln
TurboPL/XWert/Hexwert in Dezimalstring umwandeln
Top
Procedure Hex2StrOEM(sHex: string): string;
  ..#wandelt ein hexwert in ein dezimalstring um. diese kann dann mittels der VAL funktion in
  ..#ein wert umgewandelt werden.
  ..#Parameter:
  ..#sHex = Hexstring
   Vardef x : Real;
   x := xWert(Asc(sHex[2]) - 48,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15) * 16 ;
   x := x + xWert(Asc(sHex[3]) - 48,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15);
   Return AnsiToOEM( Chr(x) )
Endproc;

Syntax xWert
TurboPL/XWert/Syntax xWert
Top
XWert(Selektor: Integer; Ausdruck1, Ausdruck2, ..., AusdruckN): Variant;

XWert und VAL
TurboPL/XWert/XWert und VAL
Top
XWert erwartet als Rückgabe einen Integer Wert.
Bei der Verwendung von VAL, wo einen Real zurückgegeben wird, muss diesen Wert mittels INT in ein Integer umgewandelt werden.

Val(Zeichenkette: String): Real

XWert(Selektor: Integer; Ausdruck1, Ausdruck2, ..., AusdruckN): Variant;

Vardef nReal : Real;
Vardef nInteger: Integer;

nInteger := xWert(Int(Val(nReal)), '', '', '', '', '', '', '', "Hallo Welt", '', '')

Volltextsuche

Beispiel 1 - Volltextsuche
Volltextsuche/Beispiel 1 - Volltextsuche
Top
Procedure Volltextsuche;
  SetAccess( TITEL, "AUTOR.IND")
  MarkTable( TITEL.DAT, VOLLTITEL.DAT,"Suchbegriff","","",0,SCHLAGWO.REL)
  Run("TITEL.Titelsuche");
Endproc;

Sortierreihenfolge kann mittels SortMark gesetzt werden.

Beispiel 2 - Volltextsuche
Volltextsuche/Beispiel 2 - Volltextsuche
Top
PROCEDURE Volltextsuche
..#Beispiel einer Volltextsuche
..##

  ACCESS(ADRESSEN, "ADRESSEN.ID");
  DelMarks(ADRESSEN);
  T-Eingabe := ""
  IF INPUT("Bitte geben Sie Ihren Suchbegriff ein:")=1
   T-Eingabe := UPPER(T-Eingabe)
   MarkTable(ADRESSEN.DAT, STICHWOR.DAT, T-Eingabe,"","",0, STICHWOR.REL)
   IF nMarks( ADRESSEN)>0
    Showwait(STR( nMarks( ADRESSEN))+" Eintrag gefunden!")
    ACCESS( ADRESSEN,"Markierung")
    ATTACH;
    SetSortOrder("ADRESSEN.ID",2)
    SetView(2)
   ELSE
    Message("Keinen passenden Datensatz gefunden");
   END
  END:
Endproc;
Beispiel 3 - Volltextsuche
Volltextsuche/Beispiel 3 - Volltextsuche
Top
Beispiel: gesucht wird der Inhalt String sStr in der Tabelle VTINDEX. Die gefunde Einträge werden dann in Tabelle TIPPS markiert.
Die Tabelle STICHWORT enthält die Relation zwischen der Tabelle TIPPS und der Volltextindex Tabelle VTINDEX.

  Vardef nRT : Integer; ..#Rückgabewert.
  nRT := MarkTable($TIPPS, $VTINDEX, sStr, '', '', 0, $STICHWORT);

  ..#fehler?
  Vardef sHStr : String;
  If nRT >= 201 And nRT <= 204
    ?nRT = 201 / sHStr := "Ungültige Index-Tabelle";
    ?nRT = 202 / sHStr := "Ungültige Relation"
    ?nRT = 203 / sHStr := "Schließende Klammer erwartet"
    ?nRT = 204 / sHStr := "Ungültiges Zeichen"
    Message(sHStr, "Fehler Volltextsuche"););
    Return
  End;

Volltext aktualisieren
Volltextsuche/Volltext aktualisieren
Top
Beispiel Volltext aktualisieren für die Tabelle Tipps. Die Stichworte werden in der Tabelle VTINDEX gespeichert und die Relation zwischen der
Tabelle TIPPS und VTINDEX mittels STICHWORT.REL.

Die Angabe der Felder, Fields, sollte der Tabellennamen vorangestellt werden. Das Dollar ($) Zeichen dabei nicht vergessen.

Vardef nCnt : Integer; ..#die Anzahl der gefunden Einträge.

nCnt := ScanRecs($TIPPS, $VTINDEX, $STICHWORT, Fields($TIPPS.Beschreibung, $TIPPS.Tipp), "", 100, BaseDir+"stiwono.txt", 0);

Volltextsuche mit Zahlen
Volltextsuche/Volltextsuche mit Zahlen
Top
Wenn ein Volltextindex statt über die TurboDB Studio Oberfläche mit der TurboPL-Funktion ScanRecs erzeugt wird, kann ein
erweitertes Alphabet angeben (Parameter ExtABC) werden und dort Zahlen mit aufnehmen.

Nachdem der Volltextindex mit ScanRecs unter Verwendung von ExtABC erzeugt wurde, muß bei der Suche nun
ebenfalls das erweiterte Alphabet angegeben werden.

Es ist deshalb besser für die Suche die Funktion MarkTable zu verwenden.


roPMemo :: Version 20110320 :: Copyright (c) 2011 Robert W.B. Linn, Pinneberg, Germany :: http://www.rwblinn.de