Browser Action
Zuletzt geändert: 04.03.2026 16:46

BrowserAction #

Der BrowserAction-Dialog zeigt ein Datenbank-Grid in einem modalen Fenster an. Er eignet sich sowohl für die reine Datensatzauswahl (SelectMode) als auch für die Inline-Bearbeitung bestimmter Spalten. Optional kann unter dem Grid ein Kurzinfo-Panel (WebBand) angezeigt werden, das sich beim Zeilenwechsel automatisch aktualisiert.

Editierbare Spalten werden im Grid gelb hinterlegt. Die Daten können per SQL-Abfrage, Tabellenname oder extern übergebenem Recordset befüllt werden.

Set Dialog = Client.CreateDialog("Eulanda.BrowserAction", "MeineInstanz")

Der zweite Parameter (Instance) steuert die Speicherung des Fensterzustands. Dialoge mit unterschiedlichen Instanznamen merken sich Position und Spaltenbreiten getrennt.

Schnelleinstieg #

Option Explicit

' Auswahldialog: Einen Datensatz aus einer Abfrage wählen
Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.BrowserAction", "ArtikelAuswahl")

With Dialog
  .SelectMode = True
  .BrowserName = "ArtikelAuswahl"
  .Title = "Artikel auswählen"
  .SubTitle = "Bitte einen Artikel markieren"
  .Recordset = Client.ExecuteSql( _
    "select top 50 ID, ArtNummer, Kurztext1, VkNetto " & _
    "from dbo.Artikel order by ArtNummer")

  If .Execute Then
    ellib.ShowMessage "Gewählt: " & _
      .SelectedRows.Fields("ArtNummer").Value
  End If
End With

Set Dialog = Nothing

Übersicht #

Eigenschaften — Datenbefüllung #

EigenschaftTypStandardBeschreibung
SelectCommandStringSQL-Abfrage für die Grid-Daten
SelectTableStringTabellenname (Alternative zu SelectCommand)
SelectTableWhereStringWHERE-Bedingung (nur mit SelectTable)
RecordsetVariantExternes Recordset als Datenquelle
InitCommandStringSQL beim Dialog-Start einmalig ausführen
InitTemplateCommandStringZweistufiges Init-SQL (siehe unten)

Eigenschaften — Anzeige und Layout #

EigenschaftTypStandardBeschreibung
TitleStringTitel im Kopfbereich
SubTitleStringUntertitel im Kopfbereich
CaptionStringFenstertitel in der Titelleiste
IconUrlStringSymbol im Kopfbereich (z.B. "folder", "gearwheel")
BrowserNameStringName für Grid-Layout-Persistenz (Spaltenbreiten etc.)
BaseDataObjectStringDatenobjekt für Anzeigenformate (z.B. "Eulanda.Artikel")

Eigenschaften — Bearbeitung #

EigenschaftTypStandardBeschreibung
EditableColumnsStringEditierbare Spalten (kommagetrennt)
PostOnFieldChangeBooleanFalseSofort speichern bei Feldänderung
OKCommandStringSQL nach OK-Klick ausführen
DelCommandStringSQL beim Löschen (zeigt Löschen-Button)
AllowInsertBooleanFalseEinfügen neuer Zeilen erlauben
KeyFieldString"ID"Schlüsselfeld für Update/Delete

Eigenschaften — Auswahl #

EigenschaftTypStandardBeschreibung
SelectModeBoolean(auto)Auswahlmodus, nur lesen (siehe unten)
MultiRowSelectBooleanFalseMehrfachauswahl erlauben
SelectedRowsVariantGewählte Zeilen nach Execute (nur lesen)
RecordsetReadOnlyVariantRead-only-Klon des aktuellen Recordsets (nur lesen)

Eigenschaften — Buttons #

EigenschaftTypStandardBeschreibung
AbortButtonBooleanTrueAbbrechen-Button anzeigen
OkAlwaysEnabledBooleanFalseOK-Button immer aktiv
MengenAufNullVisibleBooleanFalseIntern: Button “Mengen auf Null” anzeigen
MengenAufNullCommandStringIntern: SQL für “Mengen auf Null”

Eigenschaften — WebBand (Kurzinfo) #

EigenschaftTypStandardBeschreibung
WebBandNameStringName des Kurzinfo-Bands
WebBandParamsStringParameter mit %Feld%-Platzhaltern

Methoden #

MethodeRückgabeBeschreibung
ExecuteBooleanDialog modal anzeigen (True = OK)
RefreshRecordsetGrid-Daten aktualisieren
AddButton(Name, Title)ObjectBenutzerdefinierten Button hinzufügen
AddHandler(Handler)Event-Handler registrieren
Buttons(Index)ObjectButton nach Index abrufen
ButtonCountIntegerAnzahl benutzerdefinierter Buttons

Datenbefüllung #

Es gibt drei Wege, den Dialog mit Daten zu befüllen. Diese sind gegenseitig exklusiv — bei Mischung wird eine Exception ausgelöst.

Variante 1: SelectCommand #

Eine vollständige SQL-Abfrage:

.SelectCommand = "select ID, ArtNummer, Kurztext1 from dbo.Artikel where Gesperrt = 0"

Variante 2: SelectTable + SelectTableWhere #

Tabellenname und optionale WHERE-Bedingung. Intern wird daraus SELECT * FROM <Tabelle> WHERE <Bedingung> erzeugt.

.SelectTable = "dbo.Artikel"
.SelectTableWhere = "Gesperrt = 0"

Diese Variante wird benötigt, wenn Änderungen über PostOnFieldChange oder beim OK-Klick direkt in die Tabelle zurückgeschrieben werden sollen (INSERT/UPDATE).

Variante 3: Recordset #

Ein extern erzeugtes Recordset wird übergeben:

.Recordset = Client.ExecuteSql("select * from dbo.Artikel where Gesperrt = 0")

InitCommand / InitTemplateCommand #

InitCommand führt einmalig SQL beim Dialog-Start aus, z.B. um temporäre Tabellen anzulegen:

.InitCommand = "create table #tmp (ID int, Menge decimal(18,4))"

InitTemplateCommand ist eine zweistufige Variante: Das SQL wird ausgeführt, das Ergebnis (erstes Feld der ersten Zeile) wird als weiteres SQL interpretiert und ausgeführt. Dies ist ein Spezialfall für dynamisch generierte Init-Anweisungen.

SelectMode und EditableColumns #

Der Dialog kennt zwei grundlegende Modi:

Auswahlmodus (SelectMode = True): Das Grid ist nicht editierbar, die ganze Zeile wird markiert. Der Benutzer wählt einen oder mehrere Datensätze aus. Dieser Modus ist automatisch aktiv, wenn keine EditableColumns gesetzt sind.

Bearbeitungsmodus: Bestimmte Spalten sind editierbar (gelb hinterlegt), die restlichen sind schreibgeschützt.

' Auswahlmodus explizit setzen
.SelectMode = True

' Bearbeitungsmodus: bestimmte Spalten editierbar
.EditableColumns = "Menge,Bemerkung"

SelectMode wird automatisch aus EditableColumns abgeleitet: Wenn keine editierbaren Spalten gesetzt sind, ist SelectMode = True. Das explizite Setzen von SelectMode = True leert die Liste der editierbaren Spalten.

SelectedRows #

Nach Execute = True enthält SelectedRows ein Recordset mit den gewählten Daten:

  • SelectMode + MultiRowSelect = False: Nur die aktuelle Zeile
  • SelectMode + MultiRowSelect = True: Alle im Grid markierten Zeilen
  • Bearbeitungsmodus: Das vollständige Recordset mit allen (ggf. geänderten) Daten

OKCommand und DelCommand #

OKCommand wird nach erfolgreichem OK-Klick automatisch ausgeführt. Typischer Einsatz: Daten aus einer Temp-Tabelle übernehmen oder einen Stapelverarbeitungs-Befehl auslösen.

DelCommand wird beim Löschen einer Zeile ausgeführt. Der Befehl erhält automatisch einen @id-Parameter mit dem Wert des KeyField der aktuellen Zeile. Wenn DelCommand gesetzt ist, wird der Löschen-Button automatisch sichtbar.

WebBand (Kurzinfo-Panel) #

Unter dem Grid kann ein HTML-Bereich angezeigt werden, der sich beim Zeilenwechsel automatisch aktualisiert. Dazu wird ein in der SQL-Registry definiertes Kurzinfo-Band referenziert.

.WebBandName = "Artikelinfo"
.WebBandParams = "ID=%ID%"

Die %Feldname%-Platzhalter in WebBandParams werden bei jedem Zeilenwechsel dynamisch durch die Werte der aktuellen Zeile ersetzt.

Interne Eigenschaften #

MengenAufNullVisible und MengenAufNullCommand sind interne Properties für den spezialisierten Button “Mengen auf Null setzen”. Sie sind hier der Vollständigkeit halber aufgeführt. Wenn sichtbar, zeigt der Dialog einen zusätzlichen Button an, der beim Klick das hinterlegte SQL ausführt und anschließend das Grid aktualisiert.

Event-Handler #

Der Dialog unterstützt Event-Handler über AddHandler. Das Handler-Objekt kann folgende Ereignisse implementieren:

EreignisAuslöserBeschreibung
Dialog_OnConnectNach Erstellung, vor AnzeigeInitialisierung
Dialog_OnDisconnectNach SchließenAufräumen
dataset_onmoveZeilenwechsel im GridAuf aktuelle Zeile reagieren
Dataset_OnRefreshKlick auf Aktualisieren-ButtonEigene Refresh-Logik
btnZeroQuantity_OnExecuteKlick auf “Mengen auf Null”Standard-Verhalten überschreiben
<ButtonName>_OnClickKlick auf benutzerdefinierten ButtonButton-Aktion

Handler-Klasse #

Class MyHandler
  Public objDialog

  Sub Dialog_OnConnect()
    ' Wird beim Verbinden aufgerufen
    ' objDialog enthält das Dialog-Objekt
  End Sub

  Sub Dialog_OnDisconnect()
    ' Wird beim Trennen aufgerufen
  End Sub

  Sub dataset_onmove()
    ' Wird bei jedem Zeilenwechsel aufgerufen
  End Sub
End Class

Die Property objDialog wird automatisch vom Dialog gesetzt und ermöglicht den Zugriff auf das Dialog-Objekt innerhalb der Event-Handler.

Beispiele #

A. Datensatzauswahl (SelectMode) #

Option Explicit

Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.BrowserAction", "KundenAuswahl")

With Dialog
  .SelectMode = True
  .BrowserName = "KundenAuswahl"
  .Title = "Kunden auswählen"
  .SubTitle = "Bitte einen Kunden markieren"
  .IconUrl = "folder"
  .SelectCommand = _
    "select ID, Match, Name1, Name2, Strasse, PLZ, Ort " & _
    "from dbo.Adresse where Fibukonto>0 order by Match"

  If .Execute Then
    ellib.ShowMessage "Gewählt: " & _
      .SelectedRows.Fields("Match").Value & " - " & _
      .SelectedRows.Fields("Name1").Value
  End If
End With

Set Dialog = Nothing

B. Mehrfachauswahl #

Option Explicit

Dim Dialog, rs
Set Dialog = Client.CreateDialog("Eulanda.BrowserAction", "ArtikelMulti")

With Dialog
  .SelectMode = True
  .MultiRowSelect = True
  .BrowserName = "ArtikelMulti"
  .Title = "Artikel auswählen"
  .SubTitle = "Mehrere Zeilen mit Strg+Klick markieren"
  .SelectCommand = _
    "select ID, ArtNummer, Kurztext1 " & _
    "from dbo.Artikel order by ArtNummer"

  If .Execute Then
    Set rs = .SelectedRows
    rs.MoveFirst
    Do While Not rs.EOF
      ellib.DebugOut "Auswahl", rs.Fields("ArtNummer").Value
      rs.MoveNext
    Loop
  End If
End With

Set Dialog = Nothing

C. Inline-Bearbeitung mit SelectTable #

Option Explicit

Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.BrowserAction", "MengenEdit")

With Dialog
  .BrowserName = "MengenEdit"
  .Title = "Mengen bearbeiten"
  .SubTitle = "Spalte 'Menge' ist editierbar"
  .SelectTable = "dbo.AngebotPos"
  .SelectTableWhere = "KrAuftragID = 424"
  .EditableColumns = "Menge"
  .PostOnFieldChange = True
  .KeyField = "ID"

  .Execute
End With

Set Dialog = Nothing

D. Auswahl mit WebBand-Kurzinfo #

Option Explicit

Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.BrowserAction", "ArtikelMitInfo")

With Dialog
  .SelectMode = True
  .BrowserName = "ArtikelMitInfo"
  .Title = "Artikel mit Kurzinfo"
  .SelectCommand = _
    "select ID, ArtNummer, Kurztext1, VkNetto " & _
    "from dbo.Artikel order by ArtNummer"
  .WebBandName = "cnsoft.Artikel.Stat.Einfach"
  .WebBandParams = "id=%ID%"

  If .Execute Then
    ellib.ShowMessage .SelectedRows.Fields("ArtNummer").Value
  End If
End With

Set Dialog = Nothing

E. Benutzerdefinierte Buttons mit Event-Handler #

Option Explicit

Class ExportHandler
  Public objDialog

  Sub Dialog_OnConnect()
    ' Initialisierung
  End Sub

  Sub Export_OnClick()
    Dim rs
    Set rs = objDialog.RecordsetReadOnly
    ellib.ShowMessage "Export von " & rs.RecordCount & " Datensätzen"
  End Sub
End Class

Dim Dialog, Handler
Set Handler = New ExportHandler
Set Dialog = Client.CreateDialog("Eulanda.BrowserAction", "MitExport")

With Dialog
  .SelectMode = True
  .BrowserName = "MitExport"
  .Title = "Daten mit Export"
  .SelectCommand = _
    "select ID, ArtNummer, Kurztext1 from dbo.Artikel order by ArtNummer"

  .AddButton "Export", "Exportieren"
  .AddHandler Handler

  .Execute
End With

Set Dialog = Nothing
Set Handler = Nothing

Dialogaufbau #

+----------------------------------------------------------------------+
| Kopfbereich (Title + SubTitle + Icon)                                |
+----------------------------------------------------------------------+
| Datenbank-Grid                                                       |
|   Spalte1    | Spalte2       | Spalte3 (gelb = editierbar)           |
|   ...        | ...           | ...                                   |
+----------------------------------------------------------------------+
| WebBand / Kurzinfo (optional, wenn WebBandName gesetzt)              |
+----------------------------------------------------------------------+
| [Mengen=0] [Löschen] [Custom...]    [Aktualisieren] [Abbrechen] [OK] |
+----------------------------------------------------------------------+

Siehe auch #