|
|
(6 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) |
Zeile 1: |
Zeile 1: |
| {{Makros und Scripting}} | | {{Makros und Scripting}} |
| 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 [https://de.wikipedia.org/wiki/Makro Makro] kann systemweit oder pro Benutzer hinterlegt werden. | | 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 [https://de.wikipedia.org/wiki/Makro Makro] kann systemweit oder pro Benutzer hinterlegt werden. |
| =Allgemeines=
| |
| ==Aktivierung Modul Customize== | | ==Aktivierung Modul Customize== |
| Der Aktivitätsstatus des Moduls wird über einen [[OBS/Stammdaten/Programmparameter|Programmparameter]] gesteuert, welcher nur Administratoren zugänglich ist. Die Freischaltung erfolgt durch den Support auf Anfrage. | | Der Aktivitätsstatus des Moduls wird über einen [[OBS/Stammdaten/Programmparameter|Programmparameter]] gesteuert, welcher nur Administratoren zugänglich ist. Die Freischaltung erfolgt durch den Support auf Anfrage. |
| ==Zugriff auf die Einstellungen== | | ==Zugriff auf die Einstellungen== |
| Der Zugriff auf die Customize-Einstellungen erfolgt über die [[OBS/System/Rechte_Verwaltung|'''Rechte Verwaltung''']] {{Key|strg}} + {{F12}}. Für Customize-Scripte wählen Sie den entsprechenden Punkt in der sich öffnenden Auswahlbox: | | Der Zugriff auf die Customize-Einstellungen erfolgt über die [[OBS/System/Rechte_Verwaltung|'''Rechte Verwaltung''']] {{Key|strg}} + {{F12}}. Für Customize-Scripte wählen Sie den entsprechenden Punkt in der sich öffnenden Auswahlbox: |
| *Listen: '''A Customize Listen''' | | * [[OBS/Makros und Scripting/Anwendungsbereiche/Customize Listen|Listen: '''A Customize Listen''']] |
| *Eingabemasken: '''A Customize Edit''' | | * [[OBS/Makros und Scripting/Anwendungsbereiche/Customize Edits|Eingabemasken: '''A Customize Edit''']] |
| =Customize in Eingabemasken=
| | * [[OBS/Makros und Scripting/Anwendungsbereiche/Customize Select-Listen|Select-Listen: '''C1 Funktionen Auswahlbox''']] |
| ==Methoden der Eingabemaske==
| |
| Für die Customize-Scripte stehen Ihnen diverse Funktionalitäten zur Verfügung. Nachfolgend eine Liste aller Customize-Funktionen der Maske:
| |
| {| class="wikitable"
| |
| |-
| |
| !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.
| |
| {{Hinweis|Bei der Verwendung der Funktionen in Customize-Scripten ist die Reihenfolge der Abarbeitung der Masken-Funktion und der Customize-Funktion von Bedeutung. Grundsätzlich gilt: Interne Funktionen werden vor dem Customize ausgeführt und Tastatur-Funktionen nach der Customize-Funktion. Um ein Customize vor der internen Funktion auszuführen, muss dem Funktionsnamen der Präfix '''Before_''' gegeben werden. Für Tastatur-Funktionen gilt dies nur für '''OnESC'''.}}
| |
| ==Zugriff auf Komponenten==
| |
| Um auf Komponenten der Maske zuzugreifen, sollten Sie die Funktionen '''xGet''' (Daten lesen) und '''xSet''' (Daten schreiben) verwenden.
| |
| <syntaxhighlight lang="Delphi">
| |
| //Auslesen einer Komponente | |
| cName := FrmEdit.xGet('a_name');
| |
| //Setzen einer Komponente
| |
| FrmEdit.xSet('a_name',"Meier");
| |
| </syntaxhighlight>
| |
| | |
| ==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:
| |
| {| class="wikitable"
| |
| |-
| |
| !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===
| |
| <syntaxhighlight lang="Delphi">
| |
| 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;
| |
| </syntaxhighlight>
| |
| | |
| ===Aufruf von weiteren Macros innerhalb des Macros===
| |
| <syntaxhighlight lang="Delphi">
| |
| 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;
| |
| </syntaxhighlight>
| |
| | |
| ===Eingaben prüfen===
| |
| <syntaxhighlight lang="Delphi">
| |
| 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;
| |
| </syntaxhighlight>
| |
| | |
| ===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
| |
| {{Hinweis| Der Prefix "AN" steht für den DMS-Typ Angebot. Eine Übersicht aller DMS-Typen finden Sie [[OBS/Makros und Scripting/Developer/Sonstiges/DMS Abkürzungen|hier]].}}
| |
| | |
| <syntaxhighlight lang="Delphi">
| |
| 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;
| |
| </syntaxhighlight>
| |
| | |
| =Customize in Listen=
| |
| ==Methoden der Liste==
| |
| {| class="wikitable"
| |
| |- | |
| !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===
| |
| <syntaxhighlight lang="Delphi">
| |
| 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;
| |
| </syntaxhighlight>
| |
| | |
| ===Andere Buttons Mit Funktion versehen===
| |
| <syntaxhighlight lang="Delphi">
| |
| 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;
| |
| </syntaxhighlight>
| |
| | |
| ===Button F12 mit Auswahlfunktion===
| |
| <syntaxhighlight lang="Delphi">
| |
| | |
| 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;
| |
| </syntaxhighlight>
| |
| | |
| =Customizing Erweiterung=
| |
| ==Benutzergruppen== | | ==Benutzergruppen== |
| Den Wiki-Seite zu den Benutzergruppe finden Sie [[OBS/Stammdaten/Weitere Stammdaten/Benutzer Gruppen|hier]]. | | Den Wiki-Seite zu den Benutzergruppe finden Sie [[OBS/Stammdaten/Weitere Stammdaten/Benutzer Gruppen|hier]]. |
|
| |
| =Besonderheiten=
| |
| {{Hinweis|Sämtliche Tastatur-Funktionen haben noch eine Variante mit dem Präfix '''Before_'''.}}
| |
| {{Achtung|Wird bei den '''Before_'''-Funktionen "READY" zurückgegeben, so werden die internen Funktionen nicht mehr ausgeführt. Damit kann der natürliche Ablauf des Programmes verändert werden. Dies kann schwere Programmfehler verursachen!}}
| |
| {{Achtung|Das Überschreiben von nicht zugewiesenen Funktionstasten (F1 - F11) sollte vermieden werden, da diese von uns jederzeit mit Funktionen belegt werden können. F12 steht immer zur Verfügung.}}
| |
|
| |
| =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 [[OBS/Makros und Scripting/Benutzerdefinierte Datenbanktabellen|eigenen Datenbankfeldern]] definiert werden.
| |
|
| |
| [[Datei:Usertab.jpg]]
| |
|
| |
| <syntaxhighlight lang="Delphi">
| |
|
| |
| function OnEdInit(): String;
| |
| var oTab : TTabSheet;
| |
| oStr : TStringEdit;
| |
| oLbl : TLabel;
| |
| oNEd : TNumericEdit;
| |
| oDVE : TDateValEdit;
| |
| oChB : TxCheckBox;
| |
| oCBL : TCombiListe;
| |
| oTRE : TTextRichEdit;
| |
| 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]
| |
|
| |
|
| |
| oTRE := TTextRichEdit.Create(frmEdit);
| |
| oTRE.Name := 'riced_db_user_langtext';
| |
| oTRE.Top := 170;
| |
| oTRE.Left := 10;
| |
| oTRE.Height := 300;
| |
| oTRE.Width := 400;
| |
| oTRE.RulerH := false;
| |
| oTRE.Parent := oTab;
| |
| end;
| |
| end;
| |
| </syntaxhighlight>
| |