2.1.1.2
– MOD Mehwertsteuer Verwaltung
– neue Verwaltung der Mehrwertsteuer + Steuersätze + Steuerzonen
– MOD Mehwertsteuer; Steuersatz ID wird mit angezeigt bei Auswahl; Autosize eingstellt
– Schriftverkehr; Kostenstellen für Belege (Übernahme in DATEV 7 Export)
. ADD Kostenstellen in Positionen für Script Auswertung
– MOD Schriftverkehr; Verbuchung auf Konten findet erst beim Fibu Export statt.
– UDF Bearbeiten
ADD „Procedure Browser“; CTRL-G
– UDF Verwaltung
ADD „Suche“ mit Filter im Quelltext
– ADD Postleitzahlen Import/Aktualisierung über Script von geonames.org
– ADD Länder Import/Aktualisierung über Script von geonames.org
– MOD Stammdaten IBAN Felder grösser
– MOD Versandarten sind jetzt sortierbar
– MOD Lieferantenartikel Anlage; Währung wie beim lieferanten eingestellt wird vorgeschlagen.
– MOD „Druckbereich“ Auswahl sortierbar; standard = alpha. aufsteigend
– ADD/MOD Webshop Auftragswesen, Felder erweitert..
– MOD Shop Kommunikation
. Sammelabruf + Update
– FIX Anschriften aus WEB Aufträgen ohne „Name1“
– UDF Verwaltung + UDF bearbeiten sind MDI Fenster
. UDF Callback Funktion im SQL Connector für HTTP/FTP Transfer
// Beispiel:procedure progress(a,b:integer;value:string);
begin
ProgressMessage := value;
ProgressIst := a;
ProgressGesamt := b;
ShowProgress(a,b,value);
end;
SQLConnector := TSQLConnector.Create(nil);
try
with SQLConnector do
begin
// Transfer Callback Funktion
FOnDataProgress := @OnDataProgress;
.....
....
FOnDataProgress := nil;
end;
– MOD Mehwertsteuer Verwaltung
– neue Verwaltung der Mehrwertsteuer + Steuersätze + Steuerzonen
– MOD Mehwertsteuer; Steuersatz ID wird mit angezeigt bei Auswahl; Autosize eingstellt
– Schriftverkehr; Kostenstellen für Belege (Übernahme in DATEV 7 Export)
. ADD Kostenstellen in Positionen für Script Auswertung
– MOD Schriftverkehr; Verbuchung auf Konten findet erst beim Fibu Export statt.
– UDF Bearbeiten
ADD „Procedure Browser“; CTRL-G
– UDF Verwaltung
ADD „Suche“ mit Filter im Quelltext
– ADD Postleitzahlen Import/Aktualisierung über Script von geonames.org
– ADD Länder Import/Aktualisierung über Script von geonames.org
– MOD Stammdaten IBAN Felder grösser
– MOD Versandarten sind jetzt sortierbar
– MOD Lieferantenartikel Anlage; Währung wie beim lieferanten eingestellt wird vorgeschlagen.
– MOD „Druckbereich“ Auswahl sortierbar; standard = alpha. aufsteigend
– ADD/MOD Webshop Auftragswesen, Felder erweitert..
– MOD Shop Kommunikation
. Sammelabruf + Update
– FIX Anschriften aus WEB Aufträgen ohne „Name1“
– UDF Verwaltung + UDF bearbeiten sind MDI Fenster
. UDF Callback Funktion im SQL Connector für HTTP/FTP Transfer
// Beispiel:procedure progress(a,b:integer;value:string);
begin
ProgressMessage := value;
ProgressIst := a;
ProgressGesamt := b;
ShowProgress(a,b,value);
end;
SQLConnector := TSQLConnector.Create(nil);
try
with SQLConnector do
begin
// Transfer Callback Funktion
FOnDataProgress := @OnDataProgress;
.....
....
FOnDataProgress := nil;
end;
1.5.2.9
1.5.2.9
– MOD AN/AU nehmen wenn vorhanden das Lieferdatum zur Steuerberechnung
– MOD LI/RE/GU nehmen Lieferdatum; sonst erscheint eine Warnung das das Rechnungsdatum genommen wird.
1.5.2.8
– FIX Ausdruck Revisionstermine
– MOD Anzeige revisionstermine; nur aktive Mitarbeiter
– FIX Provisionsmatrix; keine Provision wenn kein Einzelpreis (Menge=1) angelegt war
– MOD (intern) bei Provisionsmatrix; Aufruf Artikel, Eingabe Menge, SQL Abfragen modifiziert
1.5.2.7
– ADD Formularverwaltung; PrintJobs; Einstellung für ein Script welches nach Druck ausgeführt wir. z.B. Speichern einer PDF Datei in einem Verzeichnis.
(Beispiel – Script: UDF-Scripte: Druck->UDF-Druck: After_Print_SV.pas)
Entsprechend einstellen unter den PrintJobs: System: Formularverwaltung: Printjobs
1.5.2.6
– FIX Auftragswesen; bei eingeschalteter Repositionierung und schliessen des Vorgangs wurde auf „Alle anzeigen“ umgeschaltet
— ADD Auftrags- und Bestellwesen; Sortierung wählbar
1.5.2.5
– FIX manuelle Änderung des MwSt Satzes errechnet nicht den Netto Einzelpreis bei Endkunden wenn der Bruttopreis definiert war.
– FIX Änderung der autom. MwSt Einstellung (Haupt/Nebenleistung) bei Fracht/Versandkosten zeigte nicht sofort an.
1.5.2.4
– FIX Fehler beim Lieferanten anlegen
1.5.2.3
– ADD Labelverwaltung für ZEBRA RFID Printer
– MOD Drucken; Printjob Anzeige; Ausgabeeinheit änderbar
– ADD Formularverwaltung; Printjobs; Spalten hinzugefügt
– UDF Scripte; Funktionen hinzugefügt
für Bit’s und Bytesprocedure Delay(Milliseconds: Integer);
function CharToBit(C: Char): String;
function CharTo6Bit(C: Char): String;
function BitToChar(S: String): Char;
function ByteToBit(B: Byte): String;
function BitToByte(S: AnsiString): Byte;
function StringToHex(S: String): String;
function HexToString(H: String): String;
function BitEnabled( C: Char; nPos: Byte): boolean;
function SetBitString(var cBits:Ansistring;nWhich,nWert:byte): String;
function HiLo(wert:word):String;
function StringToOrd(S: String): String;
function ToWord(Hi, Lo : Byte) : Word;
function IntTo4bytes(value:integer): string;
function IntTo3bytes(value:integer): string;
function bytes4ToInt(value:string): Longint;
function bytes3ToInt(value:string): Longint;
1.5.2.2
– FIX UDF Skripte; SSL/TLS von TLS 1.0 auf TLS 1.2 erweitert
– FIX/MOD; MwSt. kann auf abweichende Sätze geändert werden
– FIX; „Registrierung direkt“ erzeugt Lesefehler
– FIX Inventur überarbeitet (in Verbindung mit DB Server 1.5.x)
– FIX; in der Lieferanten Auswahl Maske war es möglich Lieferanten zu löschen.
– FIX Ausdruck WBS; „Feldfehler“
– ADD UDF Verwaltung; Filterfunktion
– MOD Programm liesst beim Start die eingestellte „LOCALE“; CodePage 407 wird nicht mehr als Standard eingestellt.
– ADD UDF; Funktion „CreateAdminSession“ (:boolean) öffnet eine eigenständige
administrative Verbindung zum Server für lang andauernde oder administrative
Operationen.
Beispiel:if CreateAdminSession then
begin
// Query auf neue Verbindung setzen
oQuery.DatabaseName := GetAdminDatabase;
oQuery.SessionName := GetAdminSession;
oQuery.SQL.Text := 'ALTER TABLE .... etc..';';
oQuery.ExecSQL;
DeleteAdminSession;
// Query auf Ursprung zurücksetzen
oQuery.Databasename := database;
oQuery.Sessionname := session;
end;
– FIX Fensterpositionen wieder herstellen respektieren die eingestellte Auflösung, Größe
(unsichtbare Fenster ausserhalb des Bildschirms..)
1.5.1.1
– ADD WebShop; bei Kundenanlage kann FIBU Konto vergeben werden „Auftrag.Kunde.FibuKto“
ab 1.5 !!!!!!!!!!!!!!
– MOD Registriermechanismus C/S geändert
1.5.2.9
– MOD AN/AU nehmen wenn vorhanden das Lieferdatum zur Steuerberechnung
– MOD LI/RE/GU nehmen Lieferdatum; sonst erscheint eine Warnung das das Rechnungsdatum genommen wird.
1.5.2.8
– FIX Ausdruck Revisionstermine
– MOD Anzeige revisionstermine; nur aktive Mitarbeiter
– FIX Provisionsmatrix; keine Provision wenn kein Einzelpreis (Menge=1) angelegt war
– MOD (intern) bei Provisionsmatrix; Aufruf Artikel, Eingabe Menge, SQL Abfragen modifiziert
1.5.2.7
– ADD Formularverwaltung; PrintJobs; Einstellung für ein Script welches nach Druck ausgeführt wir. z.B. Speichern einer PDF Datei in einem Verzeichnis.
(Beispiel – Script: UDF-Scripte: Druck->UDF-Druck: After_Print_SV.pas)
Entsprechend einstellen unter den PrintJobs: System: Formularverwaltung: Printjobs
1.5.2.6
– FIX Auftragswesen; bei eingeschalteter Repositionierung und schliessen des Vorgangs wurde auf „Alle anzeigen“ umgeschaltet
— ADD Auftrags- und Bestellwesen; Sortierung wählbar
1.5.2.5
– FIX manuelle Änderung des MwSt Satzes errechnet nicht den Netto Einzelpreis bei Endkunden wenn der Bruttopreis definiert war.
– FIX Änderung der autom. MwSt Einstellung (Haupt/Nebenleistung) bei Fracht/Versandkosten zeigte nicht sofort an.
1.5.2.4
– FIX Fehler beim Lieferanten anlegen
1.5.2.3
– ADD Labelverwaltung für ZEBRA RFID Printer
– MOD Drucken; Printjob Anzeige; Ausgabeeinheit änderbar
– ADD Formularverwaltung; Printjobs; Spalten hinzugefügt
– UDF Scripte; Funktionen hinzugefügt
für Bit’s und Bytesprocedure Delay(Milliseconds: Integer);
function CharToBit(C: Char): String;
function CharTo6Bit(C: Char): String;
function BitToChar(S: String): Char;
function ByteToBit(B: Byte): String;
function BitToByte(S: AnsiString): Byte;
function StringToHex(S: String): String;
function HexToString(H: String): String;
function BitEnabled( C: Char; nPos: Byte): boolean;
function SetBitString(var cBits:Ansistring;nWhich,nWert:byte): String;
function HiLo(wert:word):String;
function StringToOrd(S: String): String;
function ToWord(Hi, Lo : Byte) : Word;
function IntTo4bytes(value:integer): string;
function IntTo3bytes(value:integer): string;
function bytes4ToInt(value:string): Longint;
function bytes3ToInt(value:string): Longint;
1.5.2.2
– FIX UDF Skripte; SSL/TLS von TLS 1.0 auf TLS 1.2 erweitert
– FIX/MOD; MwSt. kann auf abweichende Sätze geändert werden
– FIX; „Registrierung direkt“ erzeugt Lesefehler
– FIX Inventur überarbeitet (in Verbindung mit DB Server 1.5.x)
– FIX; in der Lieferanten Auswahl Maske war es möglich Lieferanten zu löschen.
– FIX Ausdruck WBS; „Feldfehler“
– ADD UDF Verwaltung; Filterfunktion
– MOD Programm liesst beim Start die eingestellte „LOCALE“; CodePage 407 wird nicht mehr als Standard eingestellt.
– ADD UDF; Funktion „CreateAdminSession“ (:boolean) öffnet eine eigenständige
administrative Verbindung zum Server für lang andauernde oder administrative
Operationen.
Beispiel:if CreateAdminSession then
begin
// Query auf neue Verbindung setzen
oQuery.DatabaseName := GetAdminDatabase;
oQuery.SessionName := GetAdminSession;
oQuery.SQL.Text := 'ALTER TABLE .... etc..';';
oQuery.ExecSQL;
DeleteAdminSession;
// Query auf Ursprung zurücksetzen
oQuery.Databasename := database;
oQuery.Sessionname := session;
end;
– FIX Fensterpositionen wieder herstellen respektieren die eingestellte Auflösung, Größe
(unsichtbare Fenster ausserhalb des Bildschirms..)
1.5.1.1
– ADD WebShop; bei Kundenanlage kann FIBU Konto vergeben werden „Auftrag.Kunde.FibuKto“
ab 1.5 !!!!!!!!!!!!!!
– MOD Registriermechanismus C/S geändert
Rechnung nach Druck ablegen als PDF
Im Script „AfterPrint“ eines Formulars zuordnen:
{
Parameter
- function GetUDFpara(<name>): variant;
}
program pdf;
const
MB_ICONQUESTION = $00000020;
MB_OK = $00000000;
MB_OKCANCEL = $00000001;
MB_YESNOCANCEL = $00000003;
MB_DEFBUTTON1 = $00000000;
MB_DEFBUTTON2 = $00000100;
MB_DEFBUTTON3 = $00000200;
IDYES = 6;
IDNO = 7;
var
i,s,f,n,d,art:integer;
a,cRes,cVerzeichnis,cDatei,cAusgabeDatei,aufnr:string;
function IsIn(value:integer; menge: array of integer):boolean;
var i:integer;
begin
result := False;
for i := 0 to Length(menge)-1 do
begin
if menge[i] = value then
begin
result := True;
break;
end;
end;
end;
begin
// Ausgabeverzeichnis mit slash am Ende!
cVerzeichnis := IncludeTrailingSlash(GetVarToStr(GetUDFpara('ExpVerzeichnis')));
{f = formcode
0 - Angebot
1 - Auftrag
2 - Lieferschein
3 - Rechnung
4 - Gutschrift
5 - Sonstiges
11 - Mahnung
12 - Bestellanfrage
13 - Bestellung
14 - Wareneingang
15 - Bestellretoure
16 - Bestell Sonstiges
}
{d = device
0 - Nadeldrucker
1 - Screen
2 - E-Mail
3 - Datei
}
a := GetVarToStr(GetUDFpara('kopfguid'));
n := GetVarToInt(GetUDFpara('formular_id'));
s := GetVarToInt(GetUDFpara('sprach_id'));
d := GetVarToInt(GetUDFpara('device'));
f := GetVarToInt(GetUDFpara('formcode'));
if EditorAktiv = True then
begin
cVerzeichnis := 'c:\temp\';
end
else
begin
if trim(cVerzeichnis) = '' then exit;
end;
// Editor debug mode
if EditorAktiv=True then
begin
a := '{4D428936-BCB5-4B5B-9581-428177C7D9B8}';
f := 3;
n := 277;
end;
// device
if IsIn(d, [3]) then exit;
// formcode
if not IsIn(f, [0,1,2,3,4,5,12,13,1,4,15,16]) then exit;
if trim(a) = '' then
begin
ShowMeldung('Kein Vorgang angegeben!');
exit;
end;
if IsIn(f, [0,1,2,3,4,5]) then
begin
oQuery.SQL.Text := 'SELECT aufnr,art FROM kopf WHERE kopfguid='+quotedstring(a);
end
else if IsIn(f, [12,13,1,4,15,16]) then
begin
oQuery.SQL.Text := 'SELECT aufnr,art FROM bkopf WHERE kopfguid='+quotedstring(a);
end
else exit;
oQuery.open;
if oQuery.RecordCount = 0 then
begin
ShowMeldung('Kein Vorgeng vorhanden.');
exit;
end;
aufnr := oQuery.Fields.Fields[0].AsString;
art := oQuery.Fields.Fields[1].AsInteger;
oQuery.Close;
case art of
0: cDatei := 'Angebot';
1: cDatei := 'Auftrag';
2: cDatei := 'Lieferschein';
3: cDatei := 'Rechnung';
4: cDatei := 'Gutschrift';
5: cDatei := 'Sonstiges';
else
cDatei := 'Vorgang';
end;
cAusgabeDatei := cDatei+'_'+aufnr+'.pdf';
// Verzeichnis vorhanden?
if not DirectoryExists(cVerzeichnis) then
begin
ShowMeldung('Verzeichnis existiert nicht, wird angelegt: '+cVerzeichnis);
// create directory
if not ForceDirectories(cVerzeichnis) then
begin
Showmeldung('Ausgabeverzeichnis: '+cVerzeichnis +' konnte nicht angelegt werden.');
exit;
end;
end;
// Datei vorhanden?
i := 0;
while FileExists(cVerzeichnis + cAusgabeDatei) do
begin
i := i+1;
cAusgabeDatei := cDatei+'_'+aufnr+'('+inttostr(i)+')'+'.pdf';
if i>100 then
begin
ShowMeldung('Es existieren mehr als 100 PDF Dokumente von diesem Vorgang...'+#13+#10+ 'Kontaktieren Sie den Support!');
exit;
end;
end;
if (Application.MessageBox( 'Möchten Sie den Ausdruck als PDF Datei ablegen? Formcode:'+ inttostr(f)+
#13+#10+#13+#10'Verzeichnis:'+cVerzeichnis+cAusgabeDatei, 'PDF Ausgabe' , MB_ICONQUESTION or MB_YESNOCANCEL or MB_DEFBUTTON2) = idYes) then
begin
// function DruckPDF(nFormID:integer;cGuid,cPath,cDatei:string):string;
cRes := DruckPdf(n, a, cVerzeichnis, cAusgabeDatei);
end;
end.
Im Script „AfterPrint“ eines Formulars zuordnen:
{
Parameter
- function GetUDFpara(<name>): variant;
}
program pdf;
const
MB_ICONQUESTION = $00000020;
MB_OK = $00000000;
MB_OKCANCEL = $00000001;
MB_YESNOCANCEL = $00000003;
MB_DEFBUTTON1 = $00000000;
MB_DEFBUTTON2 = $00000100;
MB_DEFBUTTON3 = $00000200;
IDYES = 6;
IDNO = 7;
var
i,s,f,n,d,art:integer;
a,cRes,cVerzeichnis,cDatei,cAusgabeDatei,aufnr:string;
function IsIn(value:integer; menge: array of integer):boolean;
var i:integer;
begin
result := False;
for i := 0 to Length(menge)-1 do
begin
if menge[i] = value then
begin
result := True;
break;
end;
end;
end;
begin
// Ausgabeverzeichnis mit slash am Ende!
cVerzeichnis := IncludeTrailingSlash(GetVarToStr(GetUDFpara('ExpVerzeichnis')));
{f = formcode
0 - Angebot
1 - Auftrag
2 - Lieferschein
3 - Rechnung
4 - Gutschrift
5 - Sonstiges
11 - Mahnung
12 - Bestellanfrage
13 - Bestellung
14 - Wareneingang
15 - Bestellretoure
16 - Bestell Sonstiges
}
{d = device
0 - Nadeldrucker
1 - Screen
2 - E-Mail
3 - Datei
}
a := GetVarToStr(GetUDFpara('kopfguid'));
n := GetVarToInt(GetUDFpara('formular_id'));
s := GetVarToInt(GetUDFpara('sprach_id'));
d := GetVarToInt(GetUDFpara('device'));
f := GetVarToInt(GetUDFpara('formcode'));
if EditorAktiv = True then
begin
cVerzeichnis := 'c:\temp\';
end
else
begin
if trim(cVerzeichnis) = '' then exit;
end;
// Editor debug mode
if EditorAktiv=True then
begin
a := '{4D428936-BCB5-4B5B-9581-428177C7D9B8}';
f := 3;
n := 277;
end;
// device
if IsIn(d, [3]) then exit;
// formcode
if not IsIn(f, [0,1,2,3,4,5,12,13,1,4,15,16]) then exit;
if trim(a) = '' then
begin
ShowMeldung('Kein Vorgang angegeben!');
exit;
end;
if IsIn(f, [0,1,2,3,4,5]) then
begin
oQuery.SQL.Text := 'SELECT aufnr,art FROM kopf WHERE kopfguid='+quotedstring(a);
end
else if IsIn(f, [12,13,1,4,15,16]) then
begin
oQuery.SQL.Text := 'SELECT aufnr,art FROM bkopf WHERE kopfguid='+quotedstring(a);
end
else exit;
oQuery.open;
if oQuery.RecordCount = 0 then
begin
ShowMeldung('Kein Vorgeng vorhanden.');
exit;
end;
aufnr := oQuery.Fields.Fields[0].AsString;
art := oQuery.Fields.Fields[1].AsInteger;
oQuery.Close;
case art of
0: cDatei := 'Angebot';
1: cDatei := 'Auftrag';
2: cDatei := 'Lieferschein';
3: cDatei := 'Rechnung';
4: cDatei := 'Gutschrift';
5: cDatei := 'Sonstiges';
else
cDatei := 'Vorgang';
end;
cAusgabeDatei := cDatei+'_'+aufnr+'.pdf';
// Verzeichnis vorhanden?
if not DirectoryExists(cVerzeichnis) then
begin
ShowMeldung('Verzeichnis existiert nicht, wird angelegt: '+cVerzeichnis);
// create directory
if not ForceDirectories(cVerzeichnis) then
begin
Showmeldung('Ausgabeverzeichnis: '+cVerzeichnis +' konnte nicht angelegt werden.');
exit;
end;
end;
// Datei vorhanden?
i := 0;
while FileExists(cVerzeichnis + cAusgabeDatei) do
begin
i := i+1;
cAusgabeDatei := cDatei+'_'+aufnr+'('+inttostr(i)+')'+'.pdf';
if i>100 then
begin
ShowMeldung('Es existieren mehr als 100 PDF Dokumente von diesem Vorgang...'+#13+#10+ 'Kontaktieren Sie den Support!');
exit;
end;
end;
if (Application.MessageBox( 'Möchten Sie den Ausdruck als PDF Datei ablegen? Formcode:'+ inttostr(f)+
#13+#10+#13+#10'Verzeichnis:'+cVerzeichnis+cAusgabeDatei, 'PDF Ausgabe' , MB_ICONQUESTION or MB_YESNOCANCEL or MB_DEFBUTTON2) = idYes) then
begin
// function DruckPDF(nFormID:integer;cGuid,cPath,cDatei:string):string;
cRes := DruckPdf(n, a, cVerzeichnis, cAusgabeDatei);
end;
end.
Währungskurse der ECB einlesen
Dieses Script liesst Währungskurse der ECB ein.
program wechselkurs; type rWaehr = record waehrid:integer; ISOWaCode:string; WaCode:string; einheit:integer; end; var WebConnector:TSQLConnector; M:TMemoryStream; rueckgabe:string; cGet:string; ADoc: TNativeXml; ANode,ANodeCubes: TXMLNode; cECBDate:string; cCurrency,cRate:string; i,nAID:integer; aWaehr: array of rWaehr; nAdded,nUpdated:integer; function GetAID( ISOWaCode:string):integer; var i:integer; begin result := -1; for i := 0 to Length(aWaehr)-1 do begin if aWaehr[i].ISOWaCode = ISOWaCode then begin result := i; end; end; end; begin oQuery.SQL.Text := 'SELECT * FROM waehr'; oQuery.open; while not oQuery.eof do begin i := Length(aWaehr); Setlength(aWaehr, i+1); aWaehr[i].waehrid := oQuery.FieldByName('waehrid').AsInteger; aWaehr[i].ISOWaCode := oQuery.FieldByName('ISOWaCode').AsString; aWaehr[i].WaCode := oQuery.FieldByName('WaCode').AsString; aWaehr[i].Einheit := oQuery.FieldByName('Einheit').AsInteger; oQuery.Next; end; WebConnector := TSQLConnector.Create(nil); M := TMemoryStream.Create; ADoc := TNativeXml.Create; ADoc.Utf8Encoded := True; try with WebConnector do begin // Falls mit .htaccess user/pw auth := False; authname := ''; authpw := ''; ResetParams; cGet := 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml'; if Get(cGet,M) then begin ADoc.LoadFromStream(M); ADoc.XmlFormat := xfReadable; writeln(ADoc.WriteToString); if assigned(ADoc.Root) then with ADoc.Root do begin ANode := NodeByName('Cube'); if ANode <> nil then begin ANodeCubes := ANode.NodeByName('Cube'); if ANodeCubes <> nil then begin cECBDate := ANodeCubes.AttributeByName['time']; writeln( 'Datum: '+cECBDate ); oQuery1.RequestLive := True; nAdded := 0; nUpdated := 0; if cECBDate <> '' then begin for i := 0 to ANodeCubes.NodeCount - 1 do begin cCurrency := ANodeCubes.Nodes[i].AttributeByName['currency']; cRate := ANodeCubes.Nodes[i].AttributeByName['rate']; writeln(cCurrency+' :: '+cRate); nAID := GetAID(cCurrency); if nAID > -1 then begin oQuery1.SQL.Text := 'UPDATE waehr SET kurs='+cRate+ ' WHERE waehrid='+inttostr(aWaehr[nAID].waehrid); oQuery1.ExecSQL; oQuery1.SQL.Text := 'SELECT * FROM waehrk'+ ' WHERE waehrid='+inttostr( aWaehr[nAID].waehrid )+ ' AND datum='+ datestring(date); oQuery1.Open; if oQuery1.RecordCount = 0 then begin oQuery1.SQL.Text := 'INSERT INTO waehrk '+ '(waehrid,wacode,datum,einheit,kurs)VALUES('+ inttostr(aWaehr[nAID].waehrid)+ ','+quotedstring(aWaehr[nAID].wacode)+ ','+datestring(date)+ ','+inttostr(aWaehr[nAID].Einheit)+ ','+cRate+ ')'; oQuery1.ExecSQL; nAdded := nAdded + 1; end else begin oQuery1.SQL.Text := 'UPDATE waehrk SET kurs='+cRate+ ' WHERE waehrid='+inttostr(aWaehr[nAID].waehrid)+ ' AND datum='+datestring(date); oQuery1.ExecSQL; nUpdated := nUpdated+1; end; end; end; end; end; end; end; ShowMeldung('Neue Tageskurse: '+inttostr(nAdded)+#13+#10+ 'Tageskurs Updates: '+inttostr(nUpdated)); end else begin // nur bei Fehler rueckgabe := StreamToString(M); writeln(rueckgabe); ShowMeldung('Abruf nicht erfolgreich: '+rueckgabe); end; end; finally SetLength(aWaehr,0); oQuery.Close; oQuery1.Close; WebConnector.Close; M.Free; ADoc.Free; end; end.
Dieses Script liesst Währungskurse der ECB ein.
program wechselkurs; type rWaehr = record waehrid:integer; ISOWaCode:string; WaCode:string; einheit:integer; end; var WebConnector:TSQLConnector; M:TMemoryStream; rueckgabe:string; cGet:string; ADoc: TNativeXml; ANode,ANodeCubes: TXMLNode; cECBDate:string; cCurrency,cRate:string; i,nAID:integer; aWaehr: array of rWaehr; nAdded,nUpdated:integer; function GetAID( ISOWaCode:string):integer; var i:integer; begin result := -1; for i := 0 to Length(aWaehr)-1 do begin if aWaehr[i].ISOWaCode = ISOWaCode then begin result := i; end; end; end; begin oQuery.SQL.Text := 'SELECT * FROM waehr'; oQuery.open; while not oQuery.eof do begin i := Length(aWaehr); Setlength(aWaehr, i+1); aWaehr[i].waehrid := oQuery.FieldByName('waehrid').AsInteger; aWaehr[i].ISOWaCode := oQuery.FieldByName('ISOWaCode').AsString; aWaehr[i].WaCode := oQuery.FieldByName('WaCode').AsString; aWaehr[i].Einheit := oQuery.FieldByName('Einheit').AsInteger; oQuery.Next; end; WebConnector := TSQLConnector.Create(nil); M := TMemoryStream.Create; ADoc := TNativeXml.Create; ADoc.Utf8Encoded := True; try with WebConnector do begin // Falls mit .htaccess user/pw auth := False; authname := ''; authpw := ''; ResetParams; cGet := 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml'; if Get(cGet,M) then begin ADoc.LoadFromStream(M); ADoc.XmlFormat := xfReadable; writeln(ADoc.WriteToString); if assigned(ADoc.Root) then with ADoc.Root do begin ANode := NodeByName('Cube'); if ANode <> nil then begin ANodeCubes := ANode.NodeByName('Cube'); if ANodeCubes <> nil then begin cECBDate := ANodeCubes.AttributeByName['time']; writeln( 'Datum: '+cECBDate ); oQuery1.RequestLive := True; nAdded := 0; nUpdated := 0; if cECBDate <> '' then begin for i := 0 to ANodeCubes.NodeCount - 1 do begin cCurrency := ANodeCubes.Nodes[i].AttributeByName['currency']; cRate := ANodeCubes.Nodes[i].AttributeByName['rate']; writeln(cCurrency+' :: '+cRate); nAID := GetAID(cCurrency); if nAID > -1 then begin oQuery1.SQL.Text := 'UPDATE waehr SET kurs='+cRate+ ' WHERE waehrid='+inttostr(aWaehr[nAID].waehrid); oQuery1.ExecSQL; oQuery1.SQL.Text := 'SELECT * FROM waehrk'+ ' WHERE waehrid='+inttostr( aWaehr[nAID].waehrid )+ ' AND datum='+ datestring(date); oQuery1.Open; if oQuery1.RecordCount = 0 then begin oQuery1.SQL.Text := 'INSERT INTO waehrk '+ '(waehrid,wacode,datum,einheit,kurs)VALUES('+ inttostr(aWaehr[nAID].waehrid)+ ','+quotedstring(aWaehr[nAID].wacode)+ ','+datestring(date)+ ','+inttostr(aWaehr[nAID].Einheit)+ ','+cRate+ ')'; oQuery1.ExecSQL; nAdded := nAdded + 1; end else begin oQuery1.SQL.Text := 'UPDATE waehrk SET kurs='+cRate+ ' WHERE waehrid='+inttostr(aWaehr[nAID].waehrid)+ ' AND datum='+datestring(date); oQuery1.ExecSQL; nUpdated := nUpdated+1; end; end; end; end; end; end; end; ShowMeldung('Neue Tageskurse: '+inttostr(nAdded)+#13+#10+ 'Tageskurs Updates: '+inttostr(nUpdated)); end else begin // nur bei Fehler rueckgabe := StreamToString(M); writeln(rueckgabe); ShowMeldung('Abruf nicht erfolgreich: '+rueckgabe); end; end; finally SetLength(aWaehr,0); oQuery.Close; oQuery1.Close; WebConnector.Close; M.Free; ADoc.Free; end; end.
1.3.1.1
– FIX Bestellwesen; Fortführen von Belegen (AV/SQL error)
– FIX Bestellwesen; Fortführen von Belegen (AV/SQL error)
1.2.9.9
– ADD UDF ausführen aus ReportBuilder „GetUDF(udf_id, cParam, cResult);“
Beispiel:
procedure HeaderBeforePrint;
var
cParam,cResult:string ;
begin
cParam := ‚Ein Parameter‘;
GetUDF(221, cParam, cResult);
ShowMessage(‚ReportBuilder – Result: ‚+ cResult);
end;
– ADD Bestellwesen Wareneingang; Ändern des Lagers für alle Positionen
– ADD Bestellwesen Wareneingang; Freifeld1 der Charge für alle Positionen zuweisen
– ADD Bestellwesen Bestellung; Einzelne Position splitten und Mengen aufteilen
– ADD UDF ausführen aus ReportBuilder „GetUDF(udf_id, cParam, cResult);“
Beispiel:
procedure HeaderBeforePrint;
var
cParam,cResult:string ;
begin
cParam := ‚Ein Parameter‘;
GetUDF(221, cParam, cResult);
ShowMessage(‚ReportBuilder – Result: ‚+ cResult);
end;
– ADD Bestellwesen Wareneingang; Ändern des Lagers für alle Positionen
– ADD Bestellwesen Wareneingang; Freifeld1 der Charge für alle Positionen zuweisen
– ADD Bestellwesen Bestellung; Einzelne Position splitten und Mengen aufteilen
1.2.9.8
– FIX beim Löschen eines Kunden wurden Liefer-/Rechnungsanschriften nicht mit gelöscht
– FIX beim Löschen eines Kunden wurden Liefer-/Rechnungsanschriften nicht mit gelöscht
Kundenstatistik Top/Down
Script Beispiel für Kundenstatistik Top/Down.
Ausgabe nach Excel.
program statistik_ausgabe; var oDialog:TUDFDialog; XlsApp, XlsWorkBook, XlsWorkSheet: Variant; von,bis:TDateTime; nReihe,nIst,nGesamt:integer; nJahr,i :integer; function GetYear(dDate:TDateTime):integer; var Year, Month, Day: Word; begin DecodeDate(dDate, Year, Month, Day); result := year; end; begin oDialog := TUdfDialog.Create; try oDialog.AddField('Jahr','Jahr',ftInteger,True,True,'',0); nJahr := GetYear(date); oDialog.AddAuswahl('Jahr', inttostr(nJahr), nJahr,True); oDialog.SetFieldValue('Jahr', nJahr); for i := 1 to 5 do begin nJahr := nJahr-1; oDialog.AddAuswahl('Jahr', inttostr(nJahr), nJahr,True); end; if oDialog.Execute then begin XlsApp := CreateOleObject('Excel.Application'); XlsApp.Workbooks.Add; XlsApp.Visible := False; XlsWorkbook := XlsApp.Workbooks[1]; XlsWorksheet := Xlsworkbook.Worksheets[1]; nJahr := oDialog.GetFieldValue('Jahr'); von := EncodeDate(nJahr,1,1); bis := EncodeDate(nJahr,12,31); XlsWorksheet.Cells[1,'A'].Value := 'Auswertung '+inttostr(nJahr); XlsWorksheet.Cells[2,'A'].Value := 'Knd.Nr.'; XlsWorksheet.Cells[2,'B'].Value := 'Match'; XlsWorksheet.Cells[2,'C'].Value := 'Netto'; XlsWorksheet.Cells[2,'D'].Value := 'Brutto'; XlsApp.Columns('B').ColumnWidth := 40; XlsApp.Range('A2:D2').Select; XlsApp.Selection.Font.Bold := true; XlsApp.Selection.Interior.ColorIndex := 1; XlsApp.Selection.Interior.Pattern := 1; //xlSolid XlsApp.Selection.Font.ColorIndex := 2; XlsApp.Columns('C').select; XlsApp.Selection.NumberFormat := '0,00'; XlsApp.Columns('D').select; XlsApp.Selection.NumberFormat := '0,00'; XlsApp.Columns('A').select; XlsApp.Selection.NumberFormat := '@'; XlsApp.Columns('B').select; XlsApp.Selection.NumberFormat := '@'; // auf Anfang positionieren XlsWorksheet.Cells[1,'A'].Select; nReihe := 2; oQuery.SQL.Text := 'SELECT SUM(IF(k.art=3,k.VK_BRUTTO,0-k.VK_BRUTTO)) AS VK_BRUTTO'+ ',SUM(IF(k.art=3,k.VK_Netto,0-k.VK_Netto)) AS VK_Netto,'+ 'k.svnr,k.svadrid,k.svmatch'+ ' FROM kopf k '+ ' WHERE (k.art IN (3,4))'+ ' AND (k.datum BETWEEN '+DateString(von)+' AND '+DateString(bis)+')'+ ' GROUP BY k.svadrid '+ ' ORDER BY "VK_Netto" DESC, k.svnr'; oQuery.Open; nGesamt := oQuery.RecordCount; nIst := 0; while not oQuery.eof do begin nIst := nIst +1; ShowProgress(nIst,nGesamt,'Lese Daten..'); nReihe := nReihe + 1; // Excel schreiben XlsWorksheet.Cells[nReihe,'A'].Value := oQuery.FieldByname('svnr').AsString; XlsWorksheet.Cells[nReihe,'B'].Value := oQuery.FieldByname('svmatch').AsString; XlsWorksheet.Cells[nReihe,'C'].Value := oQuery.FieldByname('vk_netto').AsFloat; XlsWorksheet.Cells[nReihe,'D'].Value := oQuery.FieldByname('vk_brutto').AsFloat; application.processmessages; oQuery.Next; end; end; XlsApp.Visible := True; finally oDialog.Free; end; end.
Script Beispiel für Kundenstatistik Top/Down.
Ausgabe nach Excel.
program statistik_ausgabe; var oDialog:TUDFDialog; XlsApp, XlsWorkBook, XlsWorkSheet: Variant; von,bis:TDateTime; nReihe,nIst,nGesamt:integer; nJahr,i :integer; function GetYear(dDate:TDateTime):integer; var Year, Month, Day: Word; begin DecodeDate(dDate, Year, Month, Day); result := year; end; begin oDialog := TUdfDialog.Create; try oDialog.AddField('Jahr','Jahr',ftInteger,True,True,'',0); nJahr := GetYear(date); oDialog.AddAuswahl('Jahr', inttostr(nJahr), nJahr,True); oDialog.SetFieldValue('Jahr', nJahr); for i := 1 to 5 do begin nJahr := nJahr-1; oDialog.AddAuswahl('Jahr', inttostr(nJahr), nJahr,True); end; if oDialog.Execute then begin XlsApp := CreateOleObject('Excel.Application'); XlsApp.Workbooks.Add; XlsApp.Visible := False; XlsWorkbook := XlsApp.Workbooks[1]; XlsWorksheet := Xlsworkbook.Worksheets[1]; nJahr := oDialog.GetFieldValue('Jahr'); von := EncodeDate(nJahr,1,1); bis := EncodeDate(nJahr,12,31); XlsWorksheet.Cells[1,'A'].Value := 'Auswertung '+inttostr(nJahr); XlsWorksheet.Cells[2,'A'].Value := 'Knd.Nr.'; XlsWorksheet.Cells[2,'B'].Value := 'Match'; XlsWorksheet.Cells[2,'C'].Value := 'Netto'; XlsWorksheet.Cells[2,'D'].Value := 'Brutto'; XlsApp.Columns('B').ColumnWidth := 40; XlsApp.Range('A2:D2').Select; XlsApp.Selection.Font.Bold := true; XlsApp.Selection.Interior.ColorIndex := 1; XlsApp.Selection.Interior.Pattern := 1; //xlSolid XlsApp.Selection.Font.ColorIndex := 2; XlsApp.Columns('C').select; XlsApp.Selection.NumberFormat := '0,00'; XlsApp.Columns('D').select; XlsApp.Selection.NumberFormat := '0,00'; XlsApp.Columns('A').select; XlsApp.Selection.NumberFormat := '@'; XlsApp.Columns('B').select; XlsApp.Selection.NumberFormat := '@'; // auf Anfang positionieren XlsWorksheet.Cells[1,'A'].Select; nReihe := 2; oQuery.SQL.Text := 'SELECT SUM(IF(k.art=3,k.VK_BRUTTO,0-k.VK_BRUTTO)) AS VK_BRUTTO'+ ',SUM(IF(k.art=3,k.VK_Netto,0-k.VK_Netto)) AS VK_Netto,'+ 'k.svnr,k.svadrid,k.svmatch'+ ' FROM kopf k '+ ' WHERE (k.art IN (3,4))'+ ' AND (k.datum BETWEEN '+DateString(von)+' AND '+DateString(bis)+')'+ ' GROUP BY k.svadrid '+ ' ORDER BY "VK_Netto" DESC, k.svnr'; oQuery.Open; nGesamt := oQuery.RecordCount; nIst := 0; while not oQuery.eof do begin nIst := nIst +1; ShowProgress(nIst,nGesamt,'Lese Daten..'); nReihe := nReihe + 1; // Excel schreiben XlsWorksheet.Cells[nReihe,'A'].Value := oQuery.FieldByname('svnr').AsString; XlsWorksheet.Cells[nReihe,'B'].Value := oQuery.FieldByname('svmatch').AsString; XlsWorksheet.Cells[nReihe,'C'].Value := oQuery.FieldByname('vk_netto').AsFloat; XlsWorksheet.Cells[nReihe,'D'].Value := oQuery.FieldByname('vk_brutto').AsFloat; application.processmessages; oQuery.Next; end; end; XlsApp.Visible := True; finally oDialog.Free; end; end.
Adressen Export
Script Beispiel für Adressen Export in Excel.
program adressen_export; const // SheetType xlChart = -4109; xlWorksheet = -4167; // WBATemplate xlWBATWorksheet = -4167; xlWBATChart = -4109; // Page Setup xlPortrait = 1; xlLandscape = 2; xlPaperA4 = 9; // Format Cells xlBottom = -4107; xlLeft = -4131; xlRight = -4152; xlTop = -4160; // Text Alignment xlHAlignCenter = -4108; xlVAlignCenter = -4108; xlVAlignTop = -4160; // Cell Borders xlThick = 4; xlThin = 2; var XlsApp, XlsWorkBook, XlsWorkSheet: Variant; Dateiname,Verzeichnis: String; nAbZeile,i:integer; begin // Geschrieben wird ab Zeile 2 (in der ersten stehen die Überschriften) nAbZeile := 2; // Wir starten Excel im Hintergrund XlsApp := CreateOleObject('Excel.Application'); try XlsApp.Workbooks.Add; XlsApp.Visible := False; XlsWorkbook := XlsApp.Workbooks[1]; XlsWorksheet := Xlsworkbook.Worksheets[1]; oQuery.SQL.Text := 'SELECT IF(a.RGanschriftID>0,ad.anschrift,a.rga) AS Anschrift,'; oQuery.SQL.Add(' a.*'); oQuery.SQL.Add(' FROM adressen a LEFT OUTER JOIN adrdata1 ad ON '); oQuery.SQL.Add(' (a.RGanschriftID>0)'); oQuery.SQL.Add(' AND (a.RGanschriftID=ad.lieferanschriftid)'); oQuery.SQL.Add(' AND (a.adrint=ad.adrint)'); oQuery.SQL.Add(' WHERE a.aktiv ORDER BY a.kndnr'); oQuery.Open; XlsWorksheet.Cells[1,'A'].Value := 'KndNr'; XlsWorksheet.Cells[1,'B'].Value := 'Match'; XlsWorksheet.Cells[1,'C'].Value := 'EMail'; XlsWorksheet.Cells[1,'D'].Value := 'Anschrift'; XlsApp.Range('A1:D1').Select; XlsApp.Selection.Font.Bold := true; XlsApp.Selection.Interior.ColorIndex := 1; XlsApp.Selection.Interior.Pattern := 1; //xlSolid XlsApp.Selection.Font.ColorIndex := 2; XlsApp.Columns('B').ColumnWidth := 50; XlsApp.Columns('C').ColumnWidth := 30; XlsApp.Columns('D').ColumnWidth := 60; XlsApp.Columns('A').VerticalAlignment := xlVAlignTop; XlsApp.Columns('B').VerticalAlignment := xlVAlignTop; XlsApp.Columns('C').VerticalAlignment := xlVAlignTop; XlsApp.Columns('D').VerticalAlignment := xlVAlignTop; XlsApp.Columns('A').select; XlsApp.Selection.NumberFormat := '@'; i := nAbZeile; oQuery.Open; while not oQuery.eof do begin XlsWorksheet.Cells[i,'A'].Value := oQuery.FieldByname('kndnr').AsString; XlsWorksheet.Cells[i,'B'].Value := oQuery.FieldByname('Match').AsString; XlsWorksheet.Cells[i,'C'].Value := oQuery.FieldByname('Email').AsString; XlsWorksheet.Cells[i,'D'].Value := trim(oQuery.FieldByname('anschrift').AsString); writeln(oQuery.FieldByname('kndnr').AsString); oQuery.Next; i := i+1; application.processmessages; end; writeln('Ausgabe beendet.'); // im Editor ShowMeldung('Ausgabe beendet'); // Dialog XlsApp.Visible := True; except ShowMeldung('Fehler'); XlsApp.Quit; // Globale Variable unassigned XlsApp := Unassigned; XlsWorkbook := Unassigned; // excel.exe im Taskmanager als Prozess immer noch vorhanden XlsWorksheet := Unassigned; // Jetzt ist excel.exe im Taskmanager als Prozess verschwunden RaiseLastException; end; end.
Script Beispiel für Adressen Export in Excel.
program adressen_export; const // SheetType xlChart = -4109; xlWorksheet = -4167; // WBATemplate xlWBATWorksheet = -4167; xlWBATChart = -4109; // Page Setup xlPortrait = 1; xlLandscape = 2; xlPaperA4 = 9; // Format Cells xlBottom = -4107; xlLeft = -4131; xlRight = -4152; xlTop = -4160; // Text Alignment xlHAlignCenter = -4108; xlVAlignCenter = -4108; xlVAlignTop = -4160; // Cell Borders xlThick = 4; xlThin = 2; var XlsApp, XlsWorkBook, XlsWorkSheet: Variant; Dateiname,Verzeichnis: String; nAbZeile,i:integer; begin // Geschrieben wird ab Zeile 2 (in der ersten stehen die Überschriften) nAbZeile := 2; // Wir starten Excel im Hintergrund XlsApp := CreateOleObject('Excel.Application'); try XlsApp.Workbooks.Add; XlsApp.Visible := False; XlsWorkbook := XlsApp.Workbooks[1]; XlsWorksheet := Xlsworkbook.Worksheets[1]; oQuery.SQL.Text := 'SELECT IF(a.RGanschriftID>0,ad.anschrift,a.rga) AS Anschrift,'; oQuery.SQL.Add(' a.*'); oQuery.SQL.Add(' FROM adressen a LEFT OUTER JOIN adrdata1 ad ON '); oQuery.SQL.Add(' (a.RGanschriftID>0)'); oQuery.SQL.Add(' AND (a.RGanschriftID=ad.lieferanschriftid)'); oQuery.SQL.Add(' AND (a.adrint=ad.adrint)'); oQuery.SQL.Add(' WHERE a.aktiv ORDER BY a.kndnr'); oQuery.Open; XlsWorksheet.Cells[1,'A'].Value := 'KndNr'; XlsWorksheet.Cells[1,'B'].Value := 'Match'; XlsWorksheet.Cells[1,'C'].Value := 'EMail'; XlsWorksheet.Cells[1,'D'].Value := 'Anschrift'; XlsApp.Range('A1:D1').Select; XlsApp.Selection.Font.Bold := true; XlsApp.Selection.Interior.ColorIndex := 1; XlsApp.Selection.Interior.Pattern := 1; //xlSolid XlsApp.Selection.Font.ColorIndex := 2; XlsApp.Columns('B').ColumnWidth := 50; XlsApp.Columns('C').ColumnWidth := 30; XlsApp.Columns('D').ColumnWidth := 60; XlsApp.Columns('A').VerticalAlignment := xlVAlignTop; XlsApp.Columns('B').VerticalAlignment := xlVAlignTop; XlsApp.Columns('C').VerticalAlignment := xlVAlignTop; XlsApp.Columns('D').VerticalAlignment := xlVAlignTop; XlsApp.Columns('A').select; XlsApp.Selection.NumberFormat := '@'; i := nAbZeile; oQuery.Open; while not oQuery.eof do begin XlsWorksheet.Cells[i,'A'].Value := oQuery.FieldByname('kndnr').AsString; XlsWorksheet.Cells[i,'B'].Value := oQuery.FieldByname('Match').AsString; XlsWorksheet.Cells[i,'C'].Value := oQuery.FieldByname('Email').AsString; XlsWorksheet.Cells[i,'D'].Value := trim(oQuery.FieldByname('anschrift').AsString); writeln(oQuery.FieldByname('kndnr').AsString); oQuery.Next; i := i+1; application.processmessages; end; writeln('Ausgabe beendet.'); // im Editor ShowMeldung('Ausgabe beendet'); // Dialog XlsApp.Visible := True; except ShowMeldung('Fehler'); XlsApp.Quit; // Globale Variable unassigned XlsApp := Unassigned; XlsWorkbook := Unassigned; // excel.exe im Taskmanager als Prozess immer noch vorhanden XlsWorksheet := Unassigned; // Jetzt ist excel.exe im Taskmanager als Prozess verschwunden RaiseLastException; end; end.
Dialog Abfrage Ja/Nein..
Script Beispiel für eine „Ja/Nein/Abbruch“ Abfrage.
program Dialog_Abfrage; const MB_ICONQUESTION = $00000020; MB_OK = $00000000; MB_OKCANCEL = $00000001; MB_YESNOCANCEL = $00000003; MB_DEFBUTTON1 = $00000000; MB_DEFBUTTON2 = $00000100; MB_DEFBUTTON3 = $00000200; IDYES = 6; IDNO = 7; begin { Beispiel: Application.MessageBox( 'Test', 'Frage', MB_ICONQUESTION or MB_OKCANCEL or MB_DEFBUTTON2); } if (Application.MessageBox( 'Text', 'Frage', MB_ICONQUESTION or MB_YESNOCANCEL or MB_DEFBUTTON2) = idYes) then begin /// ... writeln('You clicked yes'); end; end.
Script Beispiel für eine „Ja/Nein/Abbruch“ Abfrage.
program Dialog_Abfrage; const MB_ICONQUESTION = $00000020; MB_OK = $00000000; MB_OKCANCEL = $00000001; MB_YESNOCANCEL = $00000003; MB_DEFBUTTON1 = $00000000; MB_DEFBUTTON2 = $00000100; MB_DEFBUTTON3 = $00000200; IDYES = 6; IDNO = 7; begin { Beispiel: Application.MessageBox( 'Test', 'Frage', MB_ICONQUESTION or MB_OKCANCEL or MB_DEFBUTTON2); } if (Application.MessageBox( 'Text', 'Frage', MB_ICONQUESTION or MB_YESNOCANCEL or MB_DEFBUTTON2) = idYes) then begin /// ... writeln('You clicked yes'); end; end.