PDA

Vollständige Version anzeigen : MSg-Box und Kombifelder


Ulrike B.
19.05.2003, 05:19
Hallo zusammen,

in meiner Datenbank habe ich drei Kombinationsfelder, die über eine Optionsgruppe angesteuert werden Es können jeweils bestimmte Werte oder „Alle Einträge“ ausgewählt werden. Über einen Button „Suchen“wird ein Ergebnisformular aufgerufen, in dem die gesuchten Datensätze angezeigt werden.

Es kann vorkommen, dass im Kombinationsfeld ein Eintrag ausgewählt wird, zu dem noch keine Daten vorhanden sind. Das Ergebnisformular ist also leer. Dann möchte ich eine Msg-Box mit folgendem Text anzeigen lassen:
MsgBox „Zum ausgewählten Suchbegriff sind keine Daten vorhanden“

Das Ergebnisformular soll nicht geöffnet werden.

Weiß jemand, wie der Code lautet? Als kleine Hilfe hier der Code des Suchen-Buttons und eines Kombinationsfeldes:

Private Sub Schaltfläche_Suchen_Click()
On Error GoTo Err_Schaltfläche_Suchen_Click

Dim strForm As String
Dim strSource As String

Select Case Me!Rahmen66
Case 1
strSource = "Listen Ergebnisse Besteller"
Case 2
strSource = "Listen Ergebnisse Firma"
Case 3
strSource = "Listen Ergebnisse Studiengang"
Case Else
MsgBox "Bitte Suchoption markieren und Suchkriterium auswählen!"
Exit Sub
End Select

strForm = "ListenErgebnisse"
DoCmd.OpenForm strForm
Forms(strForm).Form.RecordSource = strSource
Forms(strForm).FilterOn = Me.FilterOn
Forms(strForm).Filter = Me.Filter

Exit_Schaltfläche_Suchen_Click:
Exit Sub

Err_Schaltfläche_Suchen_Click:
MsgBox Err.Description
Resume Exit_Schaltfläche_Suchen_Click

End Sub



Code eines Kombifeldes:
Private Sub Kombinationsfeld62_AfterUpdate()
On Error GoTo Err_Kombinationsfeld62_AfterUpdate

If Kombinationsfeld62 = "<Alle Einträge>" Then
Me.FilterOn = False
Else
Me.Filter = "[FirmaName]='" & Kombinationsfeld62 & "'"
Me.FilterOn = True
End If
Me!Rahmen66 = 2

Exit_Kombinationsfeld62_AfterUpdate:
Exit Sub
Err_Kombinationsfeld62_AfterUpdate:
MsgBox Err.Description
Resume Exit_Kombinationsfeld62_AfterUpdate
End Sub

Würde mich über einen Tipp freuen.

Vielen Dank und Grüße

Ulrike

TommyK
19.05.2003, 06:08
Moin,

ich würde es mit folgender Funktion machen:

<div>
<link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet">
<pre>
<span class="TOKEN">Function</span> FormHasRecords(F <span class="TOKEN">As</span> Form) <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span>
<span class="REM">'</span>
<span class="REM">' Returns False if the form contains no records and True if it contains records.</span>
<span class="REM">'</span>
<span class="REM">' Calling Convention (from a control):</span>
<span class="REM">' =FormHasRecords(Form)</span>
<span class="REM">' =FormHasRecords(MySubform.Form)</span>
<span class="REM">' =FormHasRecords(MySubform.Form!MySubSubform.Form)</span>
<span class="REM">'</span>
<span class="REM">' Calling Convention (Event Code):</span>
<span class="REM">' If FormHasRecords(Me) Then</span>
<span class="REM">' If FormHasRecords(Forms!AnotherForm) Then</span>
<span class="REM">'</span>
<span class="TOKEN">Dim</span> rs <span class="TOKEN">As</span> Recordset
<span class="TOKEN">On</span> <span class="TOKEN">Error</span> <span class="TOKEN">Resume</span> <span class="TOKEN">Next</span>
<span class="TOKEN">Set</span> rs = F.RecordsetClone
rs.MoveFirst
FormHasRecords = <span class="TOKEN">Not</span> Err.Number <span class="TOKEN">And</span> <span class="TOKEN">Not</span> rs.EOF
rs.Close
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>

</pre>
</div>

Diese ermittelt ob ein Formular Datensätze hat oder nicht.
Durch den Rückgabewert kannst Du dann Msg-Box anzeigen lassen

In etwa so (ungetestet):

Private Sub Schaltfläche_Suchen_Click()
On Error GoTo Err_Schaltfläche_Suchen_Click

Dim strForm As String
Dim strSource As String

Select Case Me!Rahmen66
Case 1
strSource = "Listen Ergebnisse Besteller"
Case 2
strSource = "Listen Ergebnisse Firma"
Case 3
strSource = "Listen Ergebnisse Studiengang"
Case Else
MsgBox "Bitte Suchoption markieren und Suchkriterium auswählen!"
Exit Sub
End Select


If FormHasRecords(Forms!ListenErgebnisse) = False Then
MsgBox "Keine Datensätze vorhanden", vbOKOnly + vbExclamation, "Keine Datensätze..."
Else
strForm = "ListenErgebnisse"
DoCmd.OpenForm strForm
Forms(strForm).Form.Recordsource = strSource
Forms(strForm).FilterOn = Me.FilterOn
Forms(strForm).Filter = Me.Filter
End If

Exit_Schaltfläche_Suchen_Click:
Exit Sub

Err_Schaltfläche_Suchen_Click:
MsgBox Err.Description
Resume Exit_Schaltfläche_Suchen_Click

End Sub

Ulrike B.
20.05.2003, 21:09
Hallo Tommy,

vielen Dank für den Code und die schnelle Antwort. Habe inzwischen getestet, aber es funzt nicht richtig. Bin in VBA noch sehr „unfit“. Vermutlich hab’ ich was falsch gemacht.

Bekomme folgende Fehlermeldung:
Fehler beim Kompilieren
Sub oder Function nicht definiert

Ich habe noch nie mit Functions gearbeitet. Vielleicht liegt da der Haken. Muss ich zusätzlich zu dem "roten" Code noch was eintragen? Wenn ja, wo genau?

Viele Grüße

Ulrike

TommyK
21.05.2003, 06:19
Hallo Ulli,

Du musst zuerst den ersten Code von mir, die Funktion FormHasRecords:

<div>
<link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet">
<pre>
<span class="TOKEN">Function</span> FormHasRecords(F <span class="TOKEN">As</span> Form) <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span>
<span class="REM">'</span>
<span class="REM">' Returns False if the form contains no records and True if it contains records.</span>
<span class="REM">'</span>
<span class="REM">' Calling Convention (from a control):</span>
<span class="REM">' =FormHasRecords(Form)</span>
<span class="REM">' =FormHasRecords(MySubform.Form)</span>
<span class="REM">' =FormHasRecords(MySubform.Form!MySubSubform.Form)</span>
<span class="REM">'</span>
<span class="REM">' Calling Convention (Event Code):</span>
<span class="REM">' If FormHasRecords(Me) Then</span>
<span class="REM">' If FormHasRecords(Forms!AnotherForm) Then</span>
<span class="REM">'</span>
<span class="TOKEN">Dim</span> rs <span class="TOKEN">As</span> Recordset
<span class="TOKEN">On</span> <span class="TOKEN">Error</span> <span class="TOKEN">Resume</span> <span class="TOKEN">Next</span>
<span class="TOKEN">Set</span> rs = F.RecordsetClone
rs.MoveFirst
FormHasRecords = <span class="TOKEN">Not</span> Err.Number <span class="TOKEN">And</span> <span class="TOKEN">Not</span> rs.EOF
rs.Close
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>
&nbsp;

</pre>
</div>


in das Modul, in der sich auch der Code für Deine Schaltfläche "Suchen" befindet, am Ende einfügen.
Und den folgenden Code für die Schältfläche "Suchen" musst Du komplett ersetzen.

<div>
<link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet">
<pre>
<span class="TOKEN">Private Sub</span> Schaltfl&auml;che_Suchen_Click()
<span class="TOKEN">On Error GoTo</span> Err_Schaltfl&auml;che_Suchen_Click
&nbsp;
<span class="TOKEN">Dim</span> strForm <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> strSource <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
Select Case Me!Rahmen66
Case 1
strSource = &quot;Listen Ergebnisse Besteller&quot;
Case 2
strSource = &quot;Listen Ergebnisse Firma&quot;
Case 3
strSource = &quot;Listen Ergebnisse Studiengang&quot;
<span class="TOKEN">Case Else</span>
MsgBox &quot;Bitte Suchoption markieren und Suchkriterium ausw&auml;hlen!&quot;
<span class="TOKEN">Exit Sub</span>
<span class="TOKEN">End</span> Select
&nbsp;
strForm = &quot;ListenErgebnisse&quot;
Forms(strForm).Form.Recordsource = strSource
Forms(strForm).FilterOn = Me.FilterOn
Forms(strForm).Filter = Me.Filter
&nbsp;
DoCmd.OpenForm strForm, acFormDS, , , acFormReadOnly, acHidden
<span class="TOKEN">If</span> FormHasRecords(Forms!strForm) = <span class="TOKEN">False</span> <span class="TOKEN">Then</span>
MsgBox &quot;Keine Datens&auml;tze vorhanden&quot;, vbOKOnly + vbExclamation, &quot;Keine Datens&auml;tze...&quot;
<span class="TOKEN">Else</span>
DoCmd.Close acForm, strForm
DoCmd.OpenForm strForm
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
Exit_Schaltfl&auml;che_Suchen_Click:
<span class="TOKEN">Exit Sub</span>
&nbsp;
Err_Schaltfl&auml;che_Suchen_Click:
MsgBox Err.Description
<span class="TOKEN">Resume</span> Exit_Schaltfl&auml;che_Suchen_Click
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;

</pre>
</div>
Ich habe es vorhin mal getestet, die Funktion "FormHasRecords" liefert nur einen Wert wenn das Formular geöffnet ist.
Deshalb öffnet der Code das Formular kurz in versteckter Ansicht, prüft ob DS vorhanden sind oder nicht. Wenn ja wird das versteckte Form geschlossen und das Formular normal wieder geöffnet.

Ulrike B.
21.05.2003, 20:42
Hallo Tommy,

vielen Dank für Deine Hilfe. Inzwischen habe ich den Code eingefügt. Offensichtlich stelle ich mich aber ungeschickt an, denn das Ganze läuft nicht so recht.

Würdest Du Dir die DNB evtl. kurz ansehen? Habe da bestimmt einen Denkfehler drin. Die Function FormHasRecords habe ich unter Module reingeschrieben. Das Suchformular heißt Listen.


Danke und Grüsse

Ulrike

Nouba
21.05.2003, 21:16
gibt DCount auf die Abfrage unter Einbeziehung der Filterbedingung 0 zurück, wird die Form keine Daten enthalten.

If DCount("*", "DeineAbfrage", "DeineFilterbedingung") > 0 Then
' jetzt folgt genialer Kode zum Öffnen der Form