Skip to main content
Skip table of contents

TBeCbFormVariantMaskEdit

TBeCbFormVariantMaskEdit

Dialog zum Definieren eines Varianten-Arrays.

Findet Verwendung im Codeblock Standard-Modul "Sachmerkmalleisten".

Eigenschaften

EigenschaftenBeschreibung
CbSLMemo:CVarianten-Definition als String
CbModified:LGibt an, ob Änderungen an der Varianten-Definition durchgeführt wurden.
CbReadOnly:L

True                   Die Varianten-Definition kann nicht verändert werden. Sämtliche Controls zum Ändern der Varianten-Definition sind disabled.

False(Default)    Die Varianten-Definition kann beliebig verändert werden.

EreignisseBeschreibung
OnSaveBeim Speichern der Änderungen
OnCancelBeim Speichern der Änderungen

Beispiel

CODE
//##############################################################################
//##############################################################################
// Beschreibung: Beispiel für die Benutzung des Variatnendialogs
//               (TBeCbFormVariantMaskEdit) im Codeblock.
//##############################################################################
//##############################################################################

|
   m_oOwner:P1,
   m_cPositionSaveID,
   m_cBrowserID,
   m_cSMLFieldName,
   m_nSMLWorkarea,
   m_bCanClose,
   m_oDM,
   m_oMainTable,
   ds_MainTable,
   m_bMainTableExpicitPost,

   // Actions
   A_Save, A_Cancel, A_EditSML,

   // GUI-Controls
   oForm, pnl_Detail, grd_Main, ipnl_EditAttribs, pnl_EditAttribs,
   pnl_Grid, ipnl_SML, pnl_SMLCode, edt_SMLCode, ipnl_SMLCode,
   pnl_Toolbar, toolbar_Main, tb_Save, tb_Cancel, tb_Split, tb_EditSML,
   pnl_SMLControl, btn_AttribsToText, btn_AttribsFromText
|

//##############################################################################
//##############################################################################
// Konstanten
//##############################################################################
//##############################################################################

m_cPositionSaveID := '@VARIANT_POS',
m_cBrowserID      := 'ART_FIN',
m_cSMLFieldName   := 'SL_MEMO',
m_nSMLWorkarea    := waDab010,


//##############################################################################
//##############################################################################
// Funktionen
//##############################################################################
//##############################################################################

//******************************************************************************
// SLMemo aus aktuellen Datensatz der Haupttabelle holen
// @Result: string
//******************************************************************************
function GetSLMemo()
   Result := AsString(m_cSMLFieldName, m_oMainTable),
end,

//******************************************************************************
// Zentrale Steuerung des "Enabled-Zustand" aller Actions
//******************************************************************************
function ActionsEnabled()
| bInEditMode, bMainTableIsEmpty |
   bInEditMode       := EditModes(m_oMainTable),
   bMainTableIsEmpty := Bof(m_oMainTable) and Eof(m_oMainTable),

   // Buttons in der Toolbar En-/Disablen
   A_Save.Enabled    := bInEditMode,
   A_Cancel.Enabled  := bInEditMode,
   A_EditSML.Enabled := not bMainTableIsEmpty,
end,

//******************************************************************************
// Oberflächen-Controls aktualisieren
// @Result: null
//******************************************************************************
function RefreshControls()
| cSLMemo |
   cSLMemo                             := GetSLMemo(),
   pnl_EditAttribs.FormVarCalc.PL_Memo := cSLMemo,
   edt_SMLCode.Text                    := cSLMemo,
end,

//******************************************************************************
// Neue Spalte in einem TBeAltGrid hinzufügen
//    cFieldName: Name des Feldes, dessen Inhalt angezeigt werden soll
//    cCaption:   Anzeigename für das Feld
// @Result: TBeColumn
//******************************************************************************
function TBeAltGrid_AddColumn(oSelf, cFieldName, cCaption)
   Result               := CollAdd(oSelf),
   Result.FieldName     := cFieldName,
   Result.Title.Caption := cCaption,
end,

//******************************************************************************
// SLMemo String speichern
// @Result: null
//******************************************************************************
function SaveSLMemo(cSLMemo)
| oField |
   BeginSuspend(m_oMainTable),
   startseq
      SetErrorIf(not DbEdit(m_oMainTable),
                 'Datensatz konnte nicht bearbeitet werden'),
      oField := DbField(m_cSMLFieldName, m_oMainTable),
      SetErrorIf(Empty(oField),
                 'Feld <' + m_cSMLFieldName + '> nicht vorhanden!'),
      SetErrorIf(not DbReplace(oField, cSLMemo),
                 'SLMemo-String konnte nicht gespeichert werden!'),
      RefreshControls(),
   always
      EndSuspend(m_oMainTable),
   stopseq,
end,

//******************************************************************************
// Variantendialog erzeugen und anzeigen
// @Result: null
//******************************************************************************
function ShowVariantEdit()
| oVariantEdit |
   m_bCanClose  := True,
   oVariantEdit := CreateObject('TBeCbFormVariantMaskEdit', '', oForm),
   oVariantEdit.PositionSaveID := m_cPositionSaveID,
   oVariantEdit.CbSLMemo       := GetSLMemo(),
   AssignEvent(oVariantEdit, 'OnSave',       'VariantEdit_Save'),
   AssignEvent(oVariantEdit, 'OnCancel',     'VariantEdit_Cancel'),
   AssignEvent(oVariantEdit, 'OnCloseQuery', 'VariantEdit_CloseQuery'),
   ShowModal(oVariantEdit),
end,

//##############################################################################
//##############################################################################
// Eventhandler
//##############################################################################
//##############################################################################

//******************************************************************************
// Event: OnScroll_Update
//******************************************************************************
function DataSource_ScrollUpdate()
   ActionsEnabled(),
   RefreshControls(),
end,

//******************************************************************************
// Event: BeforePost
//******************************************************************************
function MainTable_BeforePost(Sender)
   if m_bMainTableExpicitPost then
      m_bMainTableExpicitPost := False,
   else
      Abort(True),
   endif,
end,

//******************************************************************************
// Event: Beim Speichern des SLMemo Strings
//******************************************************************************
function VariantEdit_Save(Sender)
   startseq
      SaveSLMemo(Sender.CbSLMemo),
   onerror
      MessageDlg('Fehler beim Speichern des SLMemo-Strings: [' + CRLF +
                 GetErrorText()                                + CRLF +
                 ']'),
      DbCancel(m_oMainTable),
   stopseq,
end,

//******************************************************************************
// Event: Beim Klick auf "Abbrechen" im Variantendialog
//******************************************************************************
function VariantEdit_Cancel(Sender)
   m_bCanClose := True,
   if Sender.CbModified then
      m_bCanClose := Jn('Änderungen verwerfen?'),
   endif,
end,

//******************************************************************************
// Event: Kann der Dialog geschlossen werden?
//******************************************************************************
function VariantEdit_CloseQuery(Sender, CanClose)
   CanClose := m_bCanClose,
   // Globale CanClose-Variable muss zurückgesetzt werden, damit der Dialog beim
   // nächsten Schließen "normal" geschlossen werden kann.
   m_bCanClose := True,
end,

//******************************************************************************
// Event: Merkmale zu Text
//******************************************************************************
function btn_AttribsToTextExecute(Sender)
   edt_SMLCode.Text := pnl_EditAttribs.FormVarCalc.PL_Memo,
end,

//******************************************************************************
// Event: Merkmale aus Text
//******************************************************************************
function btn_AttribsFromTextExecute(Sender)
   pnl_EditAttribs.FormVarCalc.PL_Memo := edt_SMLCode.Text,
end,


//##############################################################################
//##############################################################################
// Actionhandler
//##############################################################################
//##############################################################################

//******************************************************************************
// Action: Änderung speichern
//******************************************************************************
function A_SaveExecute(Sender)        
   m_bMainTableExpicitPost := True,
   if not DbPost(m_oMainTable) then
      MessageDlg('Änderungen konnten nicht gespeichert werden!', mtError),
   endif,
end,

//******************************************************************************
// Action: Änderung verwerfen
//******************************************************************************
function A_CancelExecute(Sender)
   if Jn('Änderungen verwerfen?') then
      DbCancel(m_oMainTable),
   endif,
end,

//******************************************************************************
// Action: Sachmerkmalleiste bearbeiten
//******************************************************************************
function A_EditSMLExecute(Sender)
   ShowVariantEdit(),
end,


//##############################################################################
//##############################################################################
// Oberflächen-Funktionen
//##############################################################################
//##############################################################################

//******************************************************************************
// InitForm lädt das Formular in Abhängigkeit des Owners
// @Result: null
//******************************************************************************
function InitForm()
   if Empty(m_oOwner) then
      oForm := CreateObject('TFormEx', 'FormEx'),
   else
      oForm := CreateObject('TFormEx', 'FormEx', m_oOwner, m_oOwner),
      oForm.FormStyle   := fsMDIChild,
      oForm.Windowstate := wsMaximized,
   endif,

   //---------------------------------------------------------------------------
   // Formular erstellen
   oForm.Name      := GFU_CalcFormularName('', oForm, m_oOwner),
   oForm.OrigCapt  := 'Beispielprogramm für den Variantendialog im Codeblock',
   oForm.Font.Name := 'Segoe UI',
   oForm.Width     := 1200,

   //---------------------------------------------------------------------------
   // Panel für Toolbar erstellen
   pnl_Toolbar                  := CreateObject('TBePanel', 'pnl_Toolbar', oForm, oForm),
   pnl_Toolbar.Align            := alTop,
   pnl_Toolbar.AlignWithMargins := True,
   pnl_Toolbar.Caption          := '',
   pnl_Toolbar.Height           := 24,
   pnl_Toolbar.BevelOuter       := bvNone,
   //---------------------------------------------------------------------------
   // Toolbar erstellen
   toolbar_Main                  := CreateObject('TToolbar', 'toolbar_Main', pnl_Toolbar, pnl_Toolbar),
   toolbar_Main.Images           := BeImageList(nImageListMain16),
   toolbar_Main.AllowTextButtons := True,
   //---------------------------------------------------------------------------
   // Toolbuttons erstellen
   //    * Sachmerkmalleiste bearbeiten
   tb_EditSML       := CreateObject('TToolButton', 'tb_EditSML', toolbar_Main, toolbar_Main),
   tb_EditSML.Style := 5, // tbsTextButton
   //    * Splitter
   tb_Split       := CreateObject('TToolButton', 'tb_Split', toolbar_Main, toolbar_Main),
   tb_Split.Style := 3,
   tb_Split.Width := 7,
   //    * Abbrechen
   tb_Cancel      := CreateObject('TToolButton', 'tb_Cancel', toolbar_Main, toolbar_Main),
   //    * Speichern
   tb_Save        := CreateObject('TToolButton', 'tb_Save', toolbar_Main, toolbar_Main),

   //---------------------------------------------------------------------------
   // Panel für Grid erstellen
   pnl_Grid                  := CreateObject('TBePanel', 'pnl_Grid', oForm, oForm),
   pnl_Grid.Align            := alLeft,
   pnl_Grid.ShowBeSplitter   := True,
   pnl_Grid.BevelOuter       := bvNone,
   pnl_Grid.Width            := 450,
   //---------------------------------------------------------------------------
   // InfoPanel "Sachmerkmalleisten" erstellen
   ipnl_SML                  := CreateObject('TBeInfoPanel', 'ipnl_SML', oForm, pnl_Grid),
   ipnl_SML.Align            := alTop,
   ipnl_SML.AlignWithMargins := True,
   ipnl_SML.Caption          := 'Sachmerkmalleisten',
   //---------------------------------------------------------------------------
   // Grid erstellen (DAB010)
   grd_Main                  := CreateObject('TBeAltGrid', 'grd_Main', oForm, pnl_Grid),
   grd_Main.Align            := alClient,
   grd_Main.Margins.Top      := 0,
   grd_Main.AlignWithMargins := True,

   //---------------------------------------------------------------------------
   // Detail-Panel erstellen
   pnl_Detail                  := CreateObject('TBePanel', 'pnl_Detail', oForm, oForm),
   pnl_Detail.Align            := alClient,
   pnl_Detail.Caption          := '',
   pnl_Detail.ShowBeSplitter   := True,
   pnl_Detail.BevelOuter       := bvNone,
   //---------------------------------------------------------------------------
   // InfoPanel "Sachmerkmale bearbeiten" erstellen
   ipnl_EditAttribs                  := CreateObject('TBeInfoPanel', 'ipnl_EditAttribs', oForm, pnl_Detail),
   ipnl_EditAttribs.Align            := alTop,
   ipnl_EditAttribs.AlignWithMargins := True,
   ipnl_EditAttribs.Caption          := 'Ausprägungen bearbeiten',
   //---------------------------------------------------------------------------
   // Button "Merkmale als Text" erstellen
   btn_AttribsToText                        := CreateObject('TBeBitBtn', 'btn_AttribsToText', oForm, pnl_Detail),
   btn_AttribsToText.Align                  := alTop,
   btn_AttribsToText.AlignWithMargins       := True,
   btn_AttribsToText.Caption                := 'Merkmale in Text konvertieren',
   btn_AttribsToText.ImageIndex.IndexNormal := 24,
   btn_AttribsToText.Height                 := 22,
   AssignEvent(btn_AttribsToText, 'OnClick', 'btn_AttribsToTextExecute'),
   //---------------------------------------------------------------------------
   // TVarCalcPanel zum bearbeiten der Sachmerkmale erstellen
   pnl_EditAttribs                  := CreateObject('TVarCalcPanel', 'pnl_EditAttribs', oForm, pnl_Detail),
   pnl_EditAttribs.Align            := alClient,
   pnl_EditAttribs.Margins.Top      := 0,
   pnl_EditAttribs.AlignWithMargins := True,
   pnl_EditAttribs.Caption          := '',
   pnl_EditAttribs.BevelOuter       := bvNone,
   pnl_EditAttribs.FormVarCalc.Font.Name := 'Segoe UI',

   //---------------------------------------------------------------------------
   // Detail-Control-Panel erstellen
   pnl_SMLControl                  := CreateObject('TBePanel', 'pnl_SMLControl', oForm, pnl_Detail),
   pnl_SMLControl.Align            := alBottom,
   pnl_SMLControl.AlignWithMargins := True,
   pnl_SMLControl.Caption          := '',
   //pnl_SMLControl.Width            := 24,
   pnl_SMLControl.Height           := 48,
   pnl_SMLControl.BevelOuter       := bvNone,

   //---------------------------------------------------------------------------
   // SML-Code-Panel erstellen
   pnl_SMLCode                := CreateObject('TBePanel', 'pnl_SMLCode', oForm, oForm),
   pnl_SMLCode.Align          := alRight,
   pnl_SMLCode.Caption        := '',
   pnl_SMLCode.ShowBeSplitter := True,
   pnl_SMLCode.Width          := 300,
   pnl_SMLCode.BevelOuter     := bvNone,
   //---------------------------------------------------------------------------
   // InfoPanel "Sachmerkmalleiste als Text" erstellen
   ipnl_SMLCode                  := CreateObject('TBeInfoPanel', 'ipnl_SMLCode', oForm, pnl_SMLCode),
   ipnl_SMLCode.Align            := alTop,
   ipnl_SMLCode.AlignWithMargins := True,
   ipnl_SMLCode.Caption          := 'Sachmerkmalleiste als Text',
   //---------------------------------------------------------------------------
   // Button "Merkmale aus Text" erstellen
   btn_AttribsFromText                        := CreateObject('TBeBitBtn', 'btn_AttribsFromText', oForm, pnl_SMLCode),
   btn_AttribsFromText.Align                  := alTop,
   btn_AttribsFromText.AlignWithMargins       := True,
   btn_AttribsFromText.Caption                := 'Merkmale aus Text befüllen',
   btn_AttribsFromText.ImageIndex.IndexNormal := 23,
   btn_AttribsFromText.Height                 := 22,
   AssignEvent(btn_AttribsFromText, 'OnClick', 'btn_AttribsFromTextExecute'),
   //---------------------------------------------------------------------------
   // Edit für den Code der Sachmerkmalleiste erstellen
   edt_SMLCode                  := CreateObject('TBeEdit', 'edt_SMLCode', oForm, pnl_SMLCode),
   edt_SMLCode.Align            := alClient,
   edt_SMLCode.Margins.Top      := 0,
   edt_SMLCode.AlignWithMargins := True,
   edt_SMLCode.Autosize         := False,
   edt_SMLCode.WordWrap         := True,
   edt_SMLCode.WantReturns      := True,
   edt_SMLCode.Text             := '',

   //---------------------------------------------------------------------------
   // Lokales DataSource erstellen
   ds_MainTable := CreateObject('TDataSourceEx', 'ds_MainTable', oForm),
   AssignEvent(ds_MainTable, 'OnScroll_Update', 'DataSource_ScrollUpdate'),
end,

//******************************************************************************
// Actions erzeugen
// @Result: null
//******************************************************************************
function InitActions()
   // Action: Speichern
   A_Save              := CreateObject('TAction', 'A_Save', oForm),
   A_Save.Caption      := '',
   A_Save.Hint         := 'Änderungen speichern',
   A_Save.ImageIndex   := 7,
   A_Save.Enabled      := False,
   AssignEvent(A_Save, 'OnExecute', 'A_SaveExecute'),
   // Action: Abbrechen
   A_Cancel            := CreateObject('TAction', 'A_Cancel', oForm),
   A_Cancel.Caption    := '',
   A_Cancel.Hint       := 'Änderungen verwerfen',
   A_Cancel.ImageIndex := 8,
   A_Cancel.Enabled    := False,
   AssignEvent(A_Cancel, 'OnExecute', 'A_CancelExecute'),
   // Action: Sachmerkmalleiste bearbeiten
   A_EditSML            := CreateObject('TAction', 'A_EditSML', oForm),
   A_EditSML.Caption    := 'Sachmerkmalleiste bearbeiten',
   A_EditSML.Hint       := 'Sachmerkmalleiste bearbeiten',
   A_EditSML.ImageIndex := 284,
   A_EditSML.Enabled    := False,
   AssignEvent(A_EditSML, 'OnExecute', 'A_EditSMLExecute'),

   // Actions zuordnen
   tb_Save.Action    := A_Save,
   tb_Cancel.Action  := A_Cancel,
   tb_EditSML.Action := A_EditSML,
end,

//******************************************************************************
// Eigenes Datenmodul erstellen, benötigte Tabellen öffnen und mit GUI verbinden
//******************************************************************************
function OpenDataBaseAndLinkToGUI()
| oColumn |
   // Lokales DataSource mit Haupttabelle verbinden
   m_oDM        := CreateObject('TBeDbGet', 'm_oDM', oForm),
   m_oMainTable := DbGetTable(m_oDM, m_nSMLWorkarea, 'DAB010'),
   AssignEvent(m_oMainTable, 'BeforePost', 'MainTable_BeforePost'),
   DbGoTop(m_oMainTable),
   ds_MainTable.DataSet := m_oMainTable,
   GFU_Docking_LinkMasterTableToLocalDataSource(
      m_oMainTable,
      ds_MainTable,
      m_nSMLWorkarea,
      'TBeRightsTable'
   ),

   // Grid mit Haupttabelle verbinden
   grd_Main.DataSource      := ds_MainTable,
   grd_Main.RegisterDataSet := m_oMainTable,
   // HINWEIS:
   // Um den Standard-Artikel-Browser zu nutzen müssen folgende zwei Zeilen
   // einkommentiert werden (kann zu schlechter Performance führen):
   //grd_Main.ID              := m_cBrowserID,
   //grd_Main.ReadWriteProps  := 0,

   // Grid: Ggf. eigene Spalten hinzufügen/initialisieren
   // (darf erst nach der DB Initialisierung gemacht werden)
   if grd_Main.ID == '' then
      oColumn       := TBeAltGrid_AddColumn(grd_Main.Columns, 'ID', 'ID'),
      oColumn.Width := 35,
      if m_nSMLWorkarea = waDab010 then
         TBeAltGrid_AddColumn(grd_Main.Columns, 'ARTNR', 'Artikelnummer'),
         oColumn := TBeAltGrid_AddColumn(grd_Main.Columns, 'BEZ',  'Bezeichnung'),
         oColumn.Width            := 243,
         oColumn.BeAttr.Caption   := 'Bezeichnung',
         oColumn.BeAttr.FuncBlock := 'AllTrim(BEZ1) + iif(Empty(AllTrim(BEZ2)), ""," / " + AllTrim(BEZ2))',
      endif,
   endif,
end,

//******************************************************************************
// ShowGUI zeigt das GUI an, das vorher mit LoadGUI geladen werden muss.
// @Result: null
//******************************************************************************
function ShowGUI()
   if Empty(m_oOwner) then
      ShowModal(oForm),
   else
      Show(oForm),
   endif,
end,


//##############################################################################
//##############################################################################
// Hauptprogramm
//##############################################################################
//##############################################################################

startseq
   InitForm(),
   InitActions(),
   OpenDataBaseAndLinkToGUI(),
   ShowGUI(),
onerror
   MessageDlg('Fehler im Programm ' + ProgName() + CRLF +
              GetErrorText()                     + CRLF + CRLF +
              DebugArr(GetErrorStack(True)), mtError),
   DestroyObject(oForm),
stopseq,

oForm
JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.