OBS/Makros und Scripting/Anwendungsbereiche/Customize: Unterschied zwischen den Versionen
Zeile 400: | Zeile 400: | ||
oCBL.Parent := oTab; | oCBL.Parent := oTab; | ||
oCBL.GetSuli.Tablename := 'WARENGR'; | oCBL.GetSuli.Tablename := 'WARENGR'; // Verknüpfte Tabelle | ||
oCBL.GetSuli.CompareField := 'wg_nr'; | oCBL.GetSuli.CompareField := 'wg_nr'; // Feld mit eindeutiger ID zur Zuordnung | ||
oCBL.GetSuli.ShowField := 'wg_name'; | oCBL.GetSuli.ShowField := 'wg_name'; // Feld, das als Bezeichnung in der Kombiliste angezeigt wird | ||
oCBL.GetSuli.Caption := ML('Warengruppe'); | oCBL.GetSuli.Caption := ML('Warengruppe'); // Fenstertitel der Suchliste, die sich beim Klick auf # öffnet | ||
oCBL.GetSuli.SQLOrder := 'wg_nr'; | oCBL.GetSuli.SQLOrder := 'wg_nr'; // Feld, nach dem die Suchliste sortiert werden soll | ||
oCBL.GetSuli.SQlWhere := ''; | oCBL.GetSuli.SQlWhere := ''; // Filter für Daten in der Suchliste, z. bsp. 'az_nr like "5%"' | ||
oCBL.GetSuli.Width := 500; | oCBL.GetSuli.Width := 500; // Weite des Suchlistenfensters | ||
oCBL.GetSuli.Height := 400; | oCBL.GetSuli.Height := 400; // Höhe des Suchlistenfensters | ||
oCBL.GetSuli.InitColumn('Nr', 'wg_nr', 30,nil, '', System.Classes.TAlignment.taLeftJustify); | oCBL.GetSuli.InitColumn('Nr', 'wg_nr', 30, nil, '', System.Classes.TAlignment.taLeftJustify); | ||
oCBL.GetSuli.AddColumn('Name', 'wg_name', 30,nil, '', System.Classes.TAlignment.taLeftJustify); | oCBL.GetSuli.AddColumn('Name', 'wg_name', 30, nil, '', System.Classes.TAlignment.taLeftJustify); | ||
// Die erste Spalte der Suchliste muss mit InitColumn erstellt werden, alle weiteren mit AddColumn. | |||
// Parameter: | |||
// Anzeigename : String, | |||
// Feldname : String, | |||
// relative_Breite : Integer, | |||
// Anzeigefunktion : Function of String, vorerst immer nil, | |||
// Anzeigenmaskierung : String = '', Beispiel: '##9,99': Es werden immer eine Vorkommastelle und immer zwei Nachkommastellen angezeigt, und optional zwei zusätzliche Vorkommastellen, wenn vorhanden. | |||
// Ausrichtung : System.Classes.TAlignment.[taLeftJustify, taRightJustify, taCenter] | |||
end; | end; | ||
end; | end; | ||
</syntaxhighlight> | </syntaxhighlight> |
Version vom 23. Dezember 2019, 15:04 Uhr
Das kostenpflichtige Modul Customize erlaubt die Individualisierug vom OBS und kann die Funktionalität der Software entscheidend erweitern, um z. B. Arbeitsabläufe zu verbessern oder die Einhaltung bestimmter Vorgaben einzuhalten. So lassen sich u. a. Zugriffe auf Felder steuern oder Daten in Eingabemasken vorbelegen oder prüfen. Jedes Makro kann systemweit oder pro Benutzer hinterlegt werden.
Allgemeines
Aktivierung Modul Customize
Der Aktivitätsstatus des Moduls wird über einen Programmparameter gesteuert, welcher nur Administratoren zugänglich ist. Die Freischaltung erfolgt durch den Support auf Anfrage.
Zugriff auf die Einstellungen
Der Zugriff auf die Customize-Einstellungen erfolgt über die Rechte Verwaltung strg + F12. Für Customize-Scripte wählen Sie den entsprechenden Punkt in der sich öffnenden Auswahlbox:
- Listen: A Customize Listen
- Eingabemasken: A Customize Edit
Customize in Eingabemasken
Methoden der Eingabemaske
Für die Customize-Scripte stehen Ihnen diverse Funktionalitäten zur Verfügung. Nachfolgend eine Liste aller Customize-Funktionen der Maske:
Interne Funktionen | Tastatur-Funktionen |
---|---|
OnEdFormInit | OnF1 |
OnEdInit | OnF2 |
OnEdVorb | OnF3 |
OnEdShow | OnF4 |
OnEdStable | OnF5 |
OnEdReadDirect | OnF6 |
OnEdRead | OnF7 |
OnEdStable | OnF8 |
OnEdCheck | OnF9 |
OnEdqSQL | OnF10 |
OnEdSaveDirect | OnF11 |
OnEdSave | OnF12 |
CheckIfChanged | OnPGDN |
OnEdClose | OnPGUP |
OnReturn | |
OnESC |
Die hier aufgeführten internen Funktionen sind in der Reihenfolge aufgelistet, wie sie vom OBS beim Öffnen (OnEdFormInit bis OnEdStable) und Schließen (OnEdCheck bis OnEdClose) von Eingabemasken auch abgearbeitet werden.
Zugriff auf Komponenten
Um auf Komponenten der Maske zuzugreifen, sollten Sie die Funktionen xGet (Daten lesen) und xSet (Daten schreiben) verwenden.
//Auslesen einer Komponente
cName := FrmEdit.xGet('a_name');
//Setzen einer Komponente
FrmEdit.xSet('a_name',"Meier");
Globale Variablen der Eingabemaske
Über die Variable FrmEdit kann auf alle Felder und auf die Property des Edit Objekt zugegriffen werden. Folgende Property's stehen zu Verfügung:
Property | Erläuterung |
---|---|
lCheckOK | Kann bei der Überprüfung von F2 benutzt werden ob die Eingabewerte korrekt eingegeben wurden sind. Bei False wird nicht abgespeichert. |
lEditMode | True = Insertmodus False = Editmodus |
lDataUpdate | True = Daten des Edits wurden verändert |
lDataChecked | False=Daten werden auf gültigkeit überprüft (lCheckok) |
lCloseInsert | Edit-Fenster wird (lEditMode = True) nach F2 geschlossen |
lCloseEdit | Edit-Fenster wird (lEditMode = False) nach F2 geschlossen |
lDataESC | Soll bei einer Änderung im Edit eine Abfrage beim Verlassen der Maske erscheinen |
lCanLock | Ob bei der Eingabe nur eine Person den Datensat editieren darf |
lInsert | Edit Felder im Insert/Überschreibemodus (zur zeit keine Funktion) |
Beispiele Eingabemaske
Button F12 anzeigen und mit Funktionalität versehen
function OnEdInit():string;
begin
frmEdit.cmdF12.Enabled := True;
frmEdit.cmdF12.Caption := 'F12 Test';
frmEdit.InitButtons(frmEdit);
frmEdit.PaintButtons(frmEdit);
end;
procedure OnF12();
begin
Meldung('Test');
end;
Aufruf von weiteren Macros innerhalb des Macros
function OnEdInit():string;
begin
frmEdit.cmdF12.Enabled := True;
frmEdit.cmdF12.Caption := 'F12 Test';
frmEdit.InitButtons(frmEdit);
frmEdit.PaintButtons(frmEdit);
end;
procedure OnF12();
var oParams: TStringlist; //Parameter für Aufruf
begin
//Aufruf ohne Parameter
RunMacroFile('data\MACRO\Spezial\Test123.pmac');
//Aufruf mit Parameter
oParams := TStringlist.Create;
oParams.Add('TEST456');
RunMacroFile('data\MACRO\Spezial\Test123.pmac', frmEdit, oParams);
MyFreeAndNil(oParams);
end;
Eingaben prüfen
function OnEdCheck():string;
var oSte : TEdit;
cEdit : String;
cVorname : String;
begin
if (FrmEdit.lEditMode) then begin
Meldung('Edit Mode True');
end else begin
Meldung('Edit Mode False');
end;
Meldung(FrmEdit.stred_db_a_name.Text);
oSte := FrmEdit.FindComponent('stred_db_a_name');
Meldung(oSte.Text);
cVorname:= FrmEdit.xGet('a_vorname');
Meldung(cVorname);
if (Empty(cVorname)) then begin
FrmEdit.lCheckOk := False;
Meldung('Bitte Vorname eingtragen');
end;
end;
Positionen in Vorgängen blockieren
Mit dem folgendem Beispiel kann entschieden werden ob Positionen eines Vorgangs geöffnet werden sollen.
Name: AN_VORGANG_EDIT Function OpenClose
function OpenClose(cVgNr:String; lInsertMode:Boolean):Boolean;
begin
//DebugLine('cVgNr'+cVgNr);
//02 = Möbel
Result := oOBS.cBenutzergruppe <> '02';
if (Result) then begin
//Wenn Positionen vorhanden dann kein Positions-Edit
if (DB_LSeek(oDB,'ANGPOS','az_nr='+DB_SqlVal(cVGNr))) then begin
Result := False;
end;
end;
if (Result) then begin
//DebugLine(iif(lInsertMode,'True','False'));
//Bei nicht Insert immer False
if (lInsertMode = False) then begin
Result := False;
end;
end;
end;
Customize in Listen
Methoden der Liste
Interne Funktionen | Tastatur-Funktionen |
---|---|
OnListNew | OnF1 |
OnResize | OnF2 |
OnRefresh | OnF3 |
Before_OnClose | OnF4 |
OnF5 | |
OnF6 | |
OnF7 | |
OnF8 | |
OnF9 | |
OnF10 | |
OnF11 | |
OnF12 | |
OnReturn | |
OnInsert | |
OnDelete | |
OnESC |
Beispiele Liste
Button F12 anzeigen und mit Funktionalität versehen
function OnListNew():string;
begin
frmListe.cmdF12.Enabled := True;
frmListe.cmdF12.Caption := 'F12 Test';
frmListe.InitButtons(frmListe);
frmListe.PaintButtons(frmListe);
end;
procedure OnF12();
begin
Meldung('Test');
end;
Andere Buttons Mit Funktion versehen
Var cMyF8 : String;
function OnListNew():String;
begin
cMyF8 := 'Init';
Result := '';
end;
function OnF8():string;
begin
Meldung('Hallo '+cMyF8);
Result := 'OK';
end;
function Before_OnF8():String;
begin
Meldung('Before Hallo '+cMyF8);
//Dann wird Standard F8 nicht ausgeführt
Result := 'READY';
cMyF8 := Result;
end;
Button F12 mit Auswahlfunktion
function OnListNew():string;
begin
frmListe.cmdF12.Enabled := True;
frmListe.cmdF12.Caption := 'F12 Test';
frmListe.InitButtons(frmListe);
frmListe.PaintButtons(frmListe);
end;
procedure OnF12();
var oLines : TStringList;
oResult : TStringList;
lEsc : Boolean;
cSelect : String;
begin
oLines := TStringList.Create();
oLines.Add('A - Test 1');
oLines.Add('B - Test 2');
oLines.Add('C - Test 3');
oResult := GetSelectionExt(oLines, //Auswahl
'Test', //Caption
lEsc, //Abruch? (var)
Nil, //uInit : DefGetSelection;
Nil, //uOnChange : DefGetSelection;
False, //Sort
-1, //Width
False, //MultiSel
False //AllLines
);
cSelect := LeftStr(oResult.Text, 1);
if (cSelect = 'A') then begin
Meldung('A');
end else if (cSelect = 'B') then begin
Meldung('B');
end else if (cSelect = 'C') then begin
Meldung('C');
end;
MyFreeAndNil(oLines);
MyFreeAndNil(oResult);
end;
Customizing Erweiterung
Benutzergruppen
Den Wiki-Seite zu den Benutzergruppe finden Sie hier.
Besonderheiten
User-Reiter
In OBS ab Version 003191 können Edit-Masken per Customizing-Script um eigene Reiter erweitert werden. Diese darin verwalteten Felder können mit eigenen Datenbankfeldern definiert werden.
function OnEdInit(): String;
var oTab : TTabSheet;
oStr : TStringEdit;
oLbl : TLabel;
oNEd : TNumericEdit;
oDVE : TDateValEdit;
oChB : TxCheckBox;
oCBL : TCombiListe;
begin
oTab := frmEdit.AddUserTab(); // Erstellt neuen User-Tab auf dem Edit
if assigned(oTab) then begin
oLbl := TLabel.Create(frmEdit); // Damit die Ressourcenverwaltung funktioniert
oLbl.Caption := 'Textzeile:';
oLbl.Top := 10;
oLbl.Left := 10;
oLbl.Parent := oTab; // Damit die Anzeige korrekt funktioniert
oStr := TStringEdit.Create(frmEdit);
oStr.Name := 'stred_db_user_bemerk'; // Damit automatisches Speichern/Laden von Datenbankfeldern funktioniert, muss im Komponentennamen '_db_' und der Feldname stehen.
oStr.Top := 10;
oStr.Left := 130;
oStr.Parent := oTab;
oLbl := TLabel.Create(frmEdit);
oLbl.Caption := 'Summe:';
oLbl.Top := 40;
oLbl.Left := 10;
oLbl.Parent := oTab;
oNEd := TNumericEdit.Create(frmEdit);
oNEd.Name := 'numed_db_user_betrag';
oNEd.Top := 40;
oNEd.Left := 130;
oNEd.Parent := oTab;
oLbl := TLabel.Create(frmEdit);
oLbl.Caption := 'Datum:';
oLbl.Top := 70;
oLbl.Left := 10;
oLbl.Parent := oTab;
oDVE := TDateValEdit.Create(frmEdit);
oDVE.Name := 'datev_db_user_datum';
oDVE.Top := 70;
oDVE.Left := 130;
oDVE.Parent := oTab;
oLbl := TLabel.Create(frmEdit);
oLbl.Caption := 'Schalter:';
oLbl.Top := 100;
oLbl.Left := 10;
oLbl.Parent := oTab;
oChB := TxCheckBox.Create(frmEdit);
oChB.Name := 'cb_db_user_toggle';
oChB.Caption := 'Schalter';
oChB.Top := 100;
oChB.Left := 130;
oChB.Parent := oTab;
oLbl := TLabel.Create(frmEdit);
oLbl.Caption := 'Suchliste:';
oLbl.Top := 130;
oLbl.Left := 10;
oLbl.Parent := oTab;
oCBL := FrmEdit.AddCombiliste();
oCBL.Name := 'cbl_db_user_wgr';
oCBL.Top := 130;
oCBL.Left := 130;
oCBL.Parent := oTab;
oCBL.GetSuli.Tablename := 'WARENGR'; // Verknüpfte Tabelle
oCBL.GetSuli.CompareField := 'wg_nr'; // Feld mit eindeutiger ID zur Zuordnung
oCBL.GetSuli.ShowField := 'wg_name'; // Feld, das als Bezeichnung in der Kombiliste angezeigt wird
oCBL.GetSuli.Caption := ML('Warengruppe'); // Fenstertitel der Suchliste, die sich beim Klick auf # öffnet
oCBL.GetSuli.SQLOrder := 'wg_nr'; // Feld, nach dem die Suchliste sortiert werden soll
oCBL.GetSuli.SQlWhere := ''; // Filter für Daten in der Suchliste, z. bsp. 'az_nr like "5%"'
oCBL.GetSuli.Width := 500; // Weite des Suchlistenfensters
oCBL.GetSuli.Height := 400; // Höhe des Suchlistenfensters
oCBL.GetSuli.InitColumn('Nr', 'wg_nr', 30, nil, '', System.Classes.TAlignment.taLeftJustify);
oCBL.GetSuli.AddColumn('Name', 'wg_name', 30, nil, '', System.Classes.TAlignment.taLeftJustify);
// Die erste Spalte der Suchliste muss mit InitColumn erstellt werden, alle weiteren mit AddColumn.
// Parameter:
// Anzeigename : String,
// Feldname : String,
// relative_Breite : Integer,
// Anzeigefunktion : Function of String, vorerst immer nil,
// Anzeigenmaskierung : String = '', Beispiel: '##9,99': Es werden immer eine Vorkommastelle und immer zwei Nachkommastellen angezeigt, und optional zwei zusätzliche Vorkommastellen, wenn vorhanden.
// Ausrichtung : System.Classes.TAlignment.[taLeftJustify, taRightJustify, taCenter]
end;
end;