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 #
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
SelectCommand | String | SQL-Abfrage für die Grid-Daten | |
SelectTable | String | Tabellenname (Alternative zu SelectCommand) | |
SelectTableWhere | String | WHERE-Bedingung (nur mit SelectTable) | |
Recordset | Variant | Externes Recordset als Datenquelle | |
InitCommand | String | SQL beim Dialog-Start einmalig ausführen | |
InitTemplateCommand | String | Zweistufiges Init-SQL (siehe unten) |
Eigenschaften — Anzeige und Layout #
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
Title | String | Titel im Kopfbereich | |
SubTitle | String | Untertitel im Kopfbereich | |
Caption | String | Fenstertitel in der Titelleiste | |
IconUrl | String | Symbol im Kopfbereich (z.B. "folder", "gearwheel") | |
BrowserName | String | Name für Grid-Layout-Persistenz (Spaltenbreiten etc.) | |
BaseDataObject | String | Datenobjekt für Anzeigenformate (z.B. "Eulanda.Artikel") |
Eigenschaften — Bearbeitung #
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
EditableColumns | String | Editierbare Spalten (kommagetrennt) | |
PostOnFieldChange | Boolean | False | Sofort speichern bei Feldänderung |
OKCommand | String | SQL nach OK-Klick ausführen | |
DelCommand | String | SQL beim Löschen (zeigt Löschen-Button) | |
AllowInsert | Boolean | False | Einfügen neuer Zeilen erlauben |
KeyField | String | "ID" | Schlüsselfeld für Update/Delete |
Eigenschaften — Auswahl #
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
SelectMode | Boolean | (auto) | Auswahlmodus, nur lesen (siehe unten) |
MultiRowSelect | Boolean | False | Mehrfachauswahl erlauben |
SelectedRows | Variant | Gewählte Zeilen nach Execute (nur lesen) | |
RecordsetReadOnly | Variant | Read-only-Klon des aktuellen Recordsets (nur lesen) |
Eigenschaften — Buttons #
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
AbortButton | Boolean | True | Abbrechen-Button anzeigen |
OkAlwaysEnabled | Boolean | False | OK-Button immer aktiv |
MengenAufNullVisible | Boolean | False | Intern: Button “Mengen auf Null” anzeigen |
MengenAufNullCommand | String | Intern: SQL für “Mengen auf Null” |
Eigenschaften — WebBand (Kurzinfo) #
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
WebBandName | String | Name des Kurzinfo-Bands | |
WebBandParams | String | Parameter mit %Feld%-Platzhaltern |
Methoden #
| Methode | Rückgabe | Beschreibung |
|---|---|---|
Execute | Boolean | Dialog modal anzeigen (True = OK) |
RefreshRecordset | — | Grid-Daten aktualisieren |
AddButton(Name, Title) | Object | Benutzerdefinierten Button hinzufügen |
AddHandler(Handler) | — | Event-Handler registrieren |
Buttons(Index) | Object | Button nach Index abrufen |
ButtonCount | Integer | Anzahl 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:
| Ereignis | Auslöser | Beschreibung |
|---|---|---|
Dialog_OnConnect | Nach Erstellung, vor Anzeige | Initialisierung |
Dialog_OnDisconnect | Nach Schließen | Aufräumen |
dataset_onmove | Zeilenwechsel im Grid | Auf aktuelle Zeile reagieren |
Dataset_OnRefresh | Klick auf Aktualisieren-Button | Eigene Refresh-Logik |
btnZeroQuantity_OnExecute | Klick auf “Mengen auf Null” | Standard-Verhalten überschreiben |
<ButtonName>_OnClick | Klick auf benutzerdefinierten Button | Button-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 #
- Client.CreateDialog — Dialoge erstellen
- MultiSelect — Mehrfachauswahl-Dialog
- MultiDlg — Universeller Eingabedialog
- ADO-Recordset — Arbeiten mit Abfrageergebnissen