OBS/Makros und Scripting/Anwendungsbereiche/Customize: Unterschied zwischen den Versionen

Aus OBS Wiki
Zur Navigation springen Zur Suche springen
Zeile 362: Zeile 362:
         oStr.Left    := 130;
         oStr.Left    := 130;
         oStr.Parent  := oTab;
         oStr.Parent  := oTab;
        //------------------------------------------------------------------


         oLbl        := TLabel.Create(frmEdit);  
         oLbl        := TLabel.Create(frmEdit);  
Zeile 374: Zeile 376:
         oNEd.Left    := 130;
         oNEd.Left    := 130;
         oNEd.Parent  := oTab;
         oNEd.Parent  := oTab;
        //------------------------------------------------------------------
      
      
         oLbl        := TLabel.Create(frmEdit);  
         oLbl        := TLabel.Create(frmEdit);  
Zeile 386: Zeile 390:
         oDVE.Left    := 130;
         oDVE.Left    := 130;
         oDVE.Parent  := oTab;
         oDVE.Parent  := oTab;
        //------------------------------------------------------------------
      
      
         oLbl        := TLabel.Create(frmEdit);  
         oLbl        := TLabel.Create(frmEdit);  
Zeile 398: Zeile 404:
         oChB.Top    := 100;         
         oChB.Top    := 100;         
         oChB.Left    := 130;
         oChB.Left    := 130;
         oChB.Parent  := oTab;      
         oChB.Parent  := oTab;
 
        //------------------------------------------------------------------     
      
      
         oLbl        := TLabel.Create(frmEdit);  
         oLbl        := TLabel.Create(frmEdit);  
Zeile 435: Zeile 443:
         // Ausrichtung        : System.Classes.TAlignment.[taLeftJustify, taRightJustify, taCenter]
         // Ausrichtung        : System.Classes.TAlignment.[taLeftJustify, taRightJustify, taCenter]


        //------------------------------------------------------------------
          
          
         oTRE        := TTextRichEdit.Create(frmEdit);
         oTRE        := TTextRichEdit.Create(frmEdit);
Zeile 444: Zeile 453:
         oTRE.RulerH  := false;  
         oTRE.RulerH  := false;  
         oTRE.Parent  := oTab;         
         oTRE.Parent  := oTab;         
        //------------------------------------------------------------------
     end;     
     end;     
end;
end;
</syntaxhighlight>
</syntaxhighlight>

Version vom 23. Dezember 2019, 15:34 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.

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.

//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

HINWEIS: Der Prefix "AN" steht für den DMS-Typ Angebot. Eine Übersicht aller DMS-Typen finden Sie hier.
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

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 eigenen Datenbankfeldern definiert werden.

Usertab.jpg

Beispiel-Userdatenbank

#DBNAME TODO

  #FELDNAME USER_BEMERK           , C  ,    8 ,  0 , "CCCCCCCC"
  #FELDNAME USER_WGR              , C ,     3 ,  0 , "*"
  #FELDNAME USER_TOGGLE           , C ,     1 ,  0 , "C"
  #FELDNAME USER_BETRAG           , N  ,   11 ,  0 , "NNNNNNNN.NNNN"
  #FELDNAME USER_DATUM            , D  ,    4 ,  0 , "TT.MM.JJ"
  #FELDNAME USER_LANGTEXT         , M  , 2000 ,  0 , "*"

Beispielscript

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;