Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Paul Meixner am Januar 11, 2023, 13:28:19

Titel: Mehrere Kriterien in Abfrage
Beitrag von: Paul Meixner am Januar 11, 2023, 13:28:19
Liebe Spezialisten,
habe sicherlich zu wenig VBA Grundkenntnisse :'(
Möchte ein Unterformular mit Daten einer Abfrage füllen.
Kriterium für Firma (aus Combobox) '    'Wie "*" & [Formulare]![frm_Projekt]![cbxFirma] & "*"
Kriterium für Gewerk(aus Combobox) '    'Wie "*" & [Formulare]![frm_Projekt]![cbxGewerk] & "*"
Kriterium für Belegtyp (aus Listenfeld) siehe Code.
Leider wird nach dem Ausführen die grundlegende Abfrage reduziert und nur noch die Spalte mit dem erzeugten Kriterium gefiltert?!

Wie bekomme ich es hin, damit alle 3 Kriterien abgefragt werden und wie kann ich den Belegtyp auch wieder entsprechen 'Wie "*" & [Formulare]![frm_Projekt]![lbxBelegtyp] & "*" leeren.

Vielen Dank für eine Lösung.
Gruß OttoPrivate Sub Befehl98_Click()

'Meine Variablen
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim varItem As Variant
    Dim strCriteria As String
    Dim strSQL As String

'Abrufen der Datenbank und der gespeicherten Abfrage
    Set db = CurrentDb()
    Set qdf = db.QueryDefs("qry_Belege")
   
' Durchlaufen der ausgewählten Elemente im Listenfeld und Erstellen einer Textzeichenfolge
    For Each varItem In Me!lbxBelegtyp.ItemsSelected
        strCriteria = strCriteria & "," & Me!lbxBelegtyp.ItemData(varItem) & ""
    Next varItem
   
'Überprüfen ob ich etwas ausgewählt habe
    If Len(strCriteria) = 0 Then
    MsgBox "Es wurde kein Belegtyp ausgewählt" _
            , vbExclamation, "Pauli!"
        Exit Sub
    End If
   
'Entfernen des führenden Kommas aus der Zeichenfolge
    strCriteria = Right(strCriteria, Len(strCriteria) - 1)
   
'Erstellen der newSQL-Anweisung mit der Zeichenfolge
    strSQL = "SELECT * FROM tbl_Belege " & _
             "WHERE tbl_Belege.Typ_Nr IN(" & strCriteria & ");"             
             Debug.Print strSQL

' Anwenden der neuen SQL-Anweisung auf die Abfrage
        qdf.SQL = strSQL
   
'Aktualisieren Abfrage
     'Me.Requery '"qry_Belege"
   
   
'Leeren Sie den Speicher
    Set db = Nothing
    Set qdf = Nothing

End Sub

'    'Wie "*" & [Formulare]![frm_Projekt]![cbxFirma] & "*"


Private Sub cbxFirma_AfterUpdate()
    PID2 = Me!P_ID
    DoCmd.Requery
    DoCmd.GoToControl "P_ID"
    DoCmd.FindRecord PID2, , , , , , True
End Sub

Private Sub cbxFirma_DblClick(Cancel As Integer)
    PID2 = Me!P_ID
    Me.cbxBelegtyp = ""
    Me.cbxFirma = ""
    Me.cbxGewerk = ""
    'Me.Requery
    DoCmd.Requery
    DoCmd.GoToControl "P_ID"
    DoCmd.FindRecord PID2, , , , , , True
End Sub

Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Beaker s.a. am Januar 11, 2023, 14:15:55
Hallo Paul,
Zunächst mal gibt ein Kombi immer den ganzen Feldinhalt der
ausgewählten Spalte zurück,- da braucht es kein LIKE (Wie)
und das ganze Joker-Geraffel, ein einfaches "=" genügt.
Die Kriterien für Firma und Gewerk sind vermutlich in der
Abfrage fest hintelegt. Wenn du nun den SQL-String der
Abfrage änderst, überschreibst du diese Kriterien. die müssen
also wieder rein (oder gleich rauslassen)
(Luftcode)
strSQL = "SELECT * FROM tbl_Belege " & _
             "WHERE Firma = [Forms]![frm_Projekt]![cbxFirma] " & _
             " AND Gewerk = [Forms]![frm_Projekt]![cbxGewerk] " &
             " AND Typ_Nr IN(" & strCriteria & ")"

gruss ekkehard
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Paul Meixner am Januar 11, 2023, 15:54:05
Hi Ekkehard,
vielen Dank, könnte dich "knutschen" :)
Musste erstmals noch bei deinem Code den & _ in der zweiten Zeile setzen, aber soweit reichen meine Kenntnisse.
Das "Joker-Geraffel" war angedacht Wie "*" um wieder Alle Datensätze anzuzeigen, bzw. falls ich nur ein Kriterium abfragen will, vom Rest alles angezeigt wird.
Bei Wie "*" bekomme ich, da ich jeweils die X_Nr abfrage, auch mehrfache Werte z.B. 1,11,21... überall wo eine  1(Zahl) drin ist, hierfür habe ich auch noch keine Lösung :'(
Die PID Funktion benötige ich auch, da es mehre Projekt gibt und ich wieder zum aktuellem Projekt kommen muss.

Wie könnte ich das hinbekommen?
Könntest mich nochmal glücklich machen und mir viel Zeit sparen, vielen Dank im Voraus.

Beste Grüße Paul

    strSQL = "SELECT * FROM tbl_Belege " & _
            "WHERE F_Nr = [Forms]![frm_Projekt]![cbxFirma] " & _
            " AND G_Nr = [Forms]![frm_Projekt]![cbxGewerk] " & _
            " AND Typ_Nr IN(" & strCriteria & ")"

            Debug.Print strSQL

' Anwenden der neuen SQL-Anweisung auf die Abfrage
        qdf.SQL = strSQL
   
'Öffnender Abfrage
    PID2 = Me!P_ID
    DoCmd.Requery
    DoCmd.GoToControl "P_ID"
    DoCmd.FindRecord PID2, , , , , , True
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Josef P. am Januar 11, 2023, 17:41:00
Hallo!

    strSQL = "SELECT * FROM tbl_Belege " & _
            "WHERE F_Nr = [Forms]![frm_Projekt]![cbxFirma] " & _
            " AND G_Nr = [Forms]![frm_Projekt]![cbxGewerk] " & _
            " AND Typ_Nr IN(" & strCriteria & ")"
In diesem Code mischt du einen dynamisch generierten SQL-Filterausdruck (strCriteria) mit einem direkten Zugriff auf Formular-Steuerelemente.

In Zusammenhang mit
ZitatDas "Joker-Geraffel" war angedacht Wie "*" um wieder Alle Datensätze anzuzeigen, bzw. falls ich nur ein Kriterium abfragen will, vom Rest alles angezeigt wird.
schlage ich vor, dass du nur einen dynamisch zusammengesetzte Filterausdruck verwendest, dann kannst du die Filterbedingungen weg lassen, wenn in cbxFirma oder cbxGewerk nichts ausgewählt ist.

Prinzip
dim FilterString as String
dim SqlText as String

with [Forms]![frm_Projekt] ' oder Me falls [Forms]![frm_Projekt] das Formular von diesem Code ist
   if !cbxFirma.Value > 0 then
      FilterString = "F_Nr = " & !cbxFirma.Value
   end if

   if !cbxGewerk.Value > 0 then
      if len(FilterString) > 0 then
         FilterString = FilterString  & " AND "
      end if
      FilterString =  FilterString & "G_Nr = " & !cbxGewerk.Value
   end if

   if len(strCriteria) > 0 then
      if len(FilterString) > 0 then
         FilterString = FilterString  & " AND "
      end if
      FilterString =  FilterString & "Typ_Nr IN (" & strCriteria & ")"
   end if

   strSQL = "SELECT * FROM tbl_Belege"
   if len(FilterString) then
      strSQL = strSQL  & " where " & FilterString
   end if

   qdf.SQL = strSQL

end with

Bei Änderung von cbxFirma oder cbxGewerk muss die Abfrage neu geschrieben werden.


Alternative:
Statt die Abfrage des Unterformulars zu ändern, die Filterbedingungen an das Unterformular weitergeben (Filter-Eigenschaft des Formulars verwenden) und dafür eine ungefilterte Datenquelle einsetzen.

Zum Setzen von Filterwerten für eine Formular sollten einige Beispiele zu finden sein.

Gruß
Josef



Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Beaker s.a. am Januar 12, 2023, 17:04:53
Hallo,
@Josef
ZitatIn diesem Code mischt du einen dynamisch generierten SQL-Filterausdruck (strCriteria) mit einem direkten Zugriff auf Formular-Steuerelemente.
Mein Fehler  :( ; - frag mich nicht, wie ich das verbrochen habe.

@Paul
Josefs Vorschlag mit einem Filter ist auf jeden Fall dynamischer,
und zum Anzeigen aller DS musst du den Filter nur löschen.
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Paul Meixner am Januar 13, 2023, 11:11:37
Moin, Moin

Erstmal Danke, bin wirklich positiv überrascht, wie schnell und freundlich in diesem Forum reagiert wird!

Melde mich erst heute, da ich gestern den ganzen Tag versucht habe den Code von Josef einzubauen, musste weinend abbrechen, da ich schlicht und ergreifend zu "doof" bin diesen irgendwie hinzubekommen :'(
Dynamisch kenne ich nur aus meinem Statik Programm und direkten Zugriff von irgendwelchen Polizeieinsätzen ;)

War vorher mit "Excel" unterwegs, da gibt es eine wunderbare Funktion "Datenschnitt", eine oder mehrere Felder auswählen, anschauen/bearbeiten, Filter löschen und gut iss :)  das wäre das was ich brauche.
Hatte jedoch keine Ahnung wie schwierig das ist in ACCESS umzusetzen, jedoch habe ich jetzt "Lunte" geschnuppert, was hier alles möglich wäre/ist, wenn man weiß wies geht (gilt ja für viele Dinge :) )

Prinzip, eine Firma kann mehrere Gewerke ausführen, dazu gibt es Beleg mit verschiedenen Typen.
Ein Gewerk kann von mehreren Firmen ausgeführt werden, meine Idee mit der Abfrage war, das ich aus der aktuell gefilterte Anzeige im Formular sofort einen Bericht (Belegliste...) abrufen kann.

[code]
Private Sub Befehl120_Click()

'Deklarieren von Variablen
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim varItem As Variant
    Dim strCriteria As String
    Dim strSQL As String
'Abrufen der Datenbank und der gespeicherten Abfrage
    Set db = CurrentDb()
    Set qdf = db.QueryDefs("qry_Belege")
   
' Durchlaufen der ausgewählten Elemente im Listenfeld und Erstellen einer Textzeichenfolge
    For Each varItem In Me!lbxBelegtyp.ItemsSelected
        strCriteria = strCriteria & "," & Me!lbxBelegtyp.ItemData(varItem) & ""
    Next varItem
   
'Überprüfen Sie, ob der Benutzer etwas ausgewählt hat
    If Len(strCriteria) = 0 Then
    MsgBox "Es wurde kein Belegtyp ausgewählt" _
            , vbExclamation, "Pauli!"
        Exit Sub
    End If
   
'Entfernen des führenden Kommas aus der Zeichenfolge
    strCriteria = Right(strCriteria, Len(strCriteria) - 1)

    Dim FilterString As String
    Dim SqlText As String
   
    With [Forms]![frmProjekt] ' oder Me falls [Forms]![frmProjekt] das Formular von diesem Code ist
      If !cbxFirma.Value > 0 Then
          FilterString = "F_Nr = " & !cbxFirma.Value
      End If
   
      If !cbxGewerk.Value > 0 Then
          If Len(FilterString) > 0 Then
            FilterString = FilterString & " AND "
          End If
          FilterString = FilterString & "G_Nr = " & !cbxGewerk.Value
      End If
   
      If Len(strCriteria) > 0 Then
          If Len(FilterString) > 0 Then
            FilterString = FilterString & " AND "
          End If
          FilterString = FilterString & "Typ_Nr IN (" & strCriteria & ")"
      End If
   
      strSQL = "SELECT * FROM tbl_Belege"
      If Len(FilterString) Then
          strSQL = strSQL & " where " & FilterString
      End If
     
      Debug.Print strSQL
   
      qdf.SQL = strSQL
   
    End With
   
    Me.Requery
   
End Sub


Private Sub Befehl98_Click()

'Deklarieren von Variablen
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim varItem As Variant
    Dim strCriteria As String
    Dim strSQL As String
'Abrufen der Datenbank und der gespeicherten Abfrage
    Set db = CurrentDb()
    Set qdf = db.QueryDefs("qry_Belege")
   
' Durchlaufen der ausgewählten Elemente im Listenfeld und Erstellen einer Textzeichenfolge
    For Each varItem In Me!lbxBelegtyp.ItemsSelected
        strCriteria = strCriteria & "," & Me!lbxBelegtyp.ItemData(varItem) & ""
    Next varItem
   
'Überprüfen Sie, ob der Benutzer etwas ausgewählt hat
    If Len(strCriteria) = 0 Then
    MsgBox "Es wurde kein Belegtyp ausgewählt" _
            , vbExclamation, "Pauli!"
        Exit Sub
    End If
   
'Entfernen des führenden Kommas aus der Zeichenfolge
    strCriteria = Right(strCriteria, Len(strCriteria) - 1)
   
'Erstellen der newSQL-Anweisung mit der Zeichenfolge

               
    strSQL = "SELECT * FROM tbl_Belege " & _
            "WHERE F_Nr = [Forms]![frmProjekt]![cbxFirma] " & _
            " AND G_Nr = [Forms]![frmProjekt]![cbxGewerk] " & _
            " AND Typ_Nr IN(" & strCriteria & ")"
           
            Debug.Print strSQL

' Anwenden der neuen SQL-Anweisung auf die Abfrage
        qdf.SQL = strSQL
   
'Öffnender Abfrage
   
    PID2 = Me!P_ID 'Projektnummer zwischenspeicher
    DoCmd.Requery
    DoCmd.GoToControl "P_ID"
    DoCmd.FindRecord PID2, , , , , , True
       
'Leeren Sie den Speicher
    'Set db = Nothing
    'Set qdf = Nothing

End Sub

'    'Wie "*" & [Formulare]![frmProjekt]![qryBelegtyp] & "*"

Private Sub cbxBelegtyp_AfterUpdate()
    PID2 = Me!P_ID
    DoCmd.Requery
    DoCmd.GoToControl "P_ID"
    DoCmd.FindRecord PID2, , , , , , True
End Sub

Private Sub cbxBelegtyp_DblClick(Cancel As Integer)
    PID2 = Me!P_ID
    Me.lbxBelegtyp = ""
    DoCmd.Requery
    DoCmd.GoToControl "P_ID"
    DoCmd.FindRecord PID2, , , , , , True
End Sub

Private Sub cbxFirma_AfterUpdate()
    Dim FilterString As String
    Dim SqlText As String
   
    With [Forms]![frmProjekt] ' oder Me falls [Forms]![frmProjekt] das Formular von diesem Code ist
     
      If !cbxFirma.Value > 0 Then
          FilterString = "F_Nr = " & !cbxFirma.Value
      End If
        strSQL = "SELECT * FROM tbl_Belege"
      If Len(FilterString) Then
          strSQL = strSQL & " where " & FilterString
      End If
     
      Debug.Print strSQL
   
      qdf.SQL = strSQL
   
    End With
   
    Me.Requery
     
     
'    PID2 = Me!P_ID
'    DoCmd.Requery
'    DoCmd.GoToControl "P_ID"
'    DoCmd.FindRecord PID2, , , , , , True
End Sub

Private Sub cbxFirma_DblClick(Cancel As Integer)
    PID2 = Me!P_ID
    Me.lbxBelegtyp = ""
    Me.cbxFirma = ""
    Me.cbxGewerk = ""
    DoCmd.Requery
    DoCmd.GoToControl "P_ID"
    DoCmd.FindRecord PID2, , , , , , True
End Sub

Private Sub cbxGewerk_AfterUpdate()
PID2 = Me!P_ID
    DoCmd.Requery
    DoCmd.GoToControl "P_ID"
    DoCmd.FindRecord PID2, , , , , , True
End Sub

Private Sub cbxGewerk_DblClick(Cancel As Integer)
    PID2 = Me!P_ID
    Me.cbxGewerk = ""
    'Me.Requery
    DoCmd.Requery
    DoCmd.GoToControl "P_ID"
    DoCmd.FindRecord PID2, , , , , , True
End Sub

@ Ekkehard und Josef, evtl. könnt ihr mir nochmal unter die Arme greifen?
Anbei nochmal mein aktueller Code.
Mein Dank  wir euch ewig nachschleichen.

Beste Grüße Paul
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Josef P. am Januar 13, 2023, 11:57:37
Hallo!

Vorab ein Tipp: wenn du den Code in mehre Prozeduren aufteilst, wird er meiner Meinung nach verständlicher.

Ich lasse einmal den Inhalt deines Filter-Codes (fast) gleich (den Rest habe ich nicht übernommen) und strukturiere ihn nur etwas um und ergänze ihn mit Kommentaren.


Private Sub Befehl120_Click()
' Name des CommandButtons ist ursuper, da weiß man gleich welcher das ist. ;)

   ' Prüfung, ob etwas ausgewählt wurde, bereits vor dem Erstellen des Filters durchführen
   ' .. falls das überhaupt notwendig ist (eventuell diese Prüfung in die Prozedur ApplyFilter verschieben)
   If Me!lbxBelegtyp.ItemsSelected.Count = 0 Then
      MsgBox "Es wurde kein Belegtyp ausgewählt" _
            , vbExclamation, "Pauli!"
        Exit Sub
   End If

   ApplyFilter

End Sub

Private Sub ApplyFilter()
' Diese Prozedur überall dort aufrufen, wo Filterwerte geändert werden

'Deklarieren von Variablen
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
   
    Dim strSQL As String
'Abrufen der Datenbank und der gespeicherten Abfrage
    Set db = CurrentDb()
    Set qdf = db.QueryDefs("qry_Belege")
   
' FilterString holen:
    Dim FilterString As String
    FilterString = CreateFilterString()
   
' SQL-Text zusammenstellen:
    Dim SqlText As String
   
    strSQL = "SELECT * FROM tbl_Belege"
    If Len(FilterString) Then
        strSQL = strSQL & " where " & FilterString
    End If
     
    Debug.Print strSQL
   
    qdf.SQL = strSQL
   
    Me.Requery
   
End Sub

Private Function CreateFilterString() As String

   Dim FilterString As String
   Dim BelegtypFilterString As String
   
   With Me
   
      If !cbxFirma.Value > 0 Then
          FilterString = "F_Nr = " & !cbxFirma.Value
      End If
   
      If !cbxGewerk.Value > 0 Then
          If Len(FilterString) > 0 Then
            FilterString = FilterString & " AND "
          End If
          FilterString = FilterString & "G_Nr = " & !cbxGewerk.Value
      End If
   
      BelegtypFilterString = CreateBelegtypFilterString()
      If Len(BelegtypFilterString) > 0 Then
          If Len(FilterString) > 0 Then
            FilterString = FilterString & " AND "
          End If
          FilterString = FilterString & BelegtypFilterString
      End If

    End With

    CreateFilterString = FilterString

End Function

Private Function CreateBelegtypFilterString() As String
   
   Dim varItem As Variant
   Dim strCriteria As String

   ' Durchlaufen der ausgewählten Elemente im Listenfeld und Erstellen einer Textzeichenfolge
    For Each varItem In Me!lbxBelegtyp.ItemsSelected
        strCriteria = strCriteria & "," & Me!lbxBelegtyp.ItemData(varItem) & ""
    Next varItem
   
'Überprüfen Sie, ob der Benutzer etwas ausgewählt hat
    If Len(strCriteria) = 0 Then
    MsgBox "Es wurde kein Belegtyp ausgewählt" _
            , vbExclamation, "Pauli!"
        Exit Function
    End If
   
'Entfernen des führenden Kommas aus der Zeichenfolge
    strCriteria = Right(strCriteria, Len(strCriteria) - 1)

    CreateBelegtypFilterString = "Typ_Nr IN (" & strCriteria & ")"

End Function


Gruß
Josef
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Paul Meixner am Januar 13, 2023, 13:46:23
Hi Josef, Danke für die schnelle Antwort.
Ich check es einfach nicht :'(
Habe deine Code eingebaut, der Stoppt nach Private Sub ApplyFilter() bei qdf.SQL = strSQL, Anzeige im Direktbereich SELECT * FROM tbl_Belege where F_Nr = 33 AND G_Nr =  AND Typ_Nr IN (1)
Komme da nicht weiter zu den nächsten Funktionen Private Function CreateFilterString() As String
Teile das ganze gerne auf, aber wie?
' .. falls das überhaupt notwendig ist (eventuell diese Prüfung in die Prozedur ApplyFilter verschieben) die Abfrage benötige ich eigentlich nicht, wenn ich Firma oder/und Gewerk gewählt habe sollten eigentlich dementsprechend alle Belege erscheinen.

Vielen Dank wenn du mir nochmal auf die Sprünge helfen könntest.

Name des CommandButtons ist ursuper, da weiß man gleich welcher das ist, da hast Du recht, habe schon soviel Kopien der Testdatenbanken auf dem Computer, das meine Festplatte fast voll ist ;), wenn ich mal einen Stand habe der funktioniert, werde ich die Befehle gut Beschriften. Möchte eh immer lieber "After Update" verwenden...

Beste  Grüße Paul
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Josef P. am Januar 13, 2023, 15:08:49
Vielleicht führst du statt
Private Sub Befehl120_Click()diese Prozedur aus:
Private Sub Befehl98_Click()
...
   strSQL = "SELECT * FROM tbl_Belege " & _
            "WHERE F_Nr = [Forms]![frmProjekt]![cbxFirma] " & _
            " AND G_Nr = [Forms]![frmProjekt]![cbxGewerk] " & _
            " AND Typ_Nr IN(" & strCriteria & ")"
          
            Debug.Print strSQL
...

Da fehlt die Prüfung ob in cbxFirma ein Wert enthalten ist.
Zitatwenn ich mal einen Stand habe der funktioniert, werde ich die Befehle gut Beschriften.
Möglicherweise würdest du einen funktionierenden Stand früher schaffen, wenn der Code übersichtlich wäre - und da gehören verständliche Steuerelementnamen dazu.
Gruß
Josef
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Paul Meixner am Januar 13, 2023, 17:07:49
Servus Josef,
dein Code funktioniert vom "Feinsten" 8)
Wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht :(
Die qry_Belege wird richtig gefiltert :) aber das Unterformular wird nicht aktualisiert, wenn ich das Formular Projekt schließe und wieder öffne wird es perfekt angezeigt.
Kannst du mir bitte noch mitteilen was ich als Datenquelle für das Unterformular angeben muss, bzw. gibt es einen Requery Befehl der das richtig stellt?

Befehl198 war noch für den Code von Ekkehard.

Dann wäre mein Wochenende gerettet und Du der Retter ;)

Beste Grüße Paul
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Paul Meixner am Januar 14, 2023, 15:45:48
Servus Josef und Ekkehard,
nochmal vielen Dank, habe das jetzt irgendwie hinbekommen.

Noch eine Frage, obwohl ich damit Leben könnte, gibt es für die Funktion PID PID2 = Me!P_ID
    DoCmd.Requery
    DoCmd.GoToControl "P_ID"
    DoCmd.FindRecord PID2, , , , , , True
irgend was anderes, damit ich im Hauptformular im aktuellem Projekt bleibe?

Beste Grüße Paul
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: ebs17 am Januar 14, 2023, 16:12:19
DoCmd.Requery
DoCmd.GoToControl "P_ID"
Das sind zwei Aktionen zum Verlassen des aktuellen Datensatzes. Was könnte einem da einfallen?
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Paul Meixner am Januar 15, 2023, 15:38:04
Hi Eberhard,
geht so nicht.
Hauptformular besteht aus mehreren Projekten, wenn ich Requery anleiere ohne mir vorher die Projektnummer (P_Nr) zu merken, wird das erste Projekt geöffnet und nicht das in dem ich gearbeitet habe.
Schönen Sonntag, Gruß Paul
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Josef P. am Januar 15, 2023, 17:03:02
Hallo!

Das nutze ich:

Prinzip:
1. ID wie in deinem Code merken
2. Requery
3. Im RecordsetClone zum gewünschten Datensatz gehen
4. Bookmarks gleichsetzen


Der Aufruf würde bei mir so aussehen:
FormTools.RequeryData Me, "P_ID"
Code siehe Klasse FormTools (https://github.com/AccessCodeLib/AccessCodeLib/blob/master/form/FormTools.cls)

Gruß
Josef
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Beaker s.a. am Januar 16, 2023, 18:29:02
Hallo Josef,
Nettes Tool.
Ich hätte da noch eine Function, die da gut reinpassen würde.
Kannst du sicher noch verbessern (den Namen wahrscheinlich zuerst  ;) ),
- du bist mir da ja um einige Schritte voraus.
Public Function NotInListControls( _
        sTableName As String, _
        sFieldName As String, _
        vNewData As Variant) As Integer
    Dim rst As DAO.Recordset
    If MsgBox(Prompt:="Möchten sie den Eintrag übernehmen?", _
            Buttons:=vbOKCancel, _
            Title:="Eintrag noch nicht vorhanden ...") = vbOK Then
        Set rst = CurrentDbC.OpenRecordset(sTableName)
        With rst
            .AddNew
                .FIELDS(sFieldName) = vNewData
            .Update
        End With
        NotInListControls = acDataErrAdded
    Else
        NotInListControls = acDataErrContinue
    End If
rst.Close
Set rst = Nothing
End Function
Aufruf
Private Sub EinKombi_NotInList(NewData As String, Response As Integer)
    Response = NotInListControls("Tabelle", "Feld", NewData)
End Sub

gruss ekkehard
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Paul Meixner am Januar 17, 2023, 12:49:45
Servus meine zwei "Retter"

@ Josef
Zitat von: Josef P. am Januar 15, 2023, 17:03:02Der Aufruf würde bei mir so aussehen:
FormTools.RequeryData Me, "P_ID"

Wenn ich deinen Code aufrufe, passiert nichts?
Muss ich bei Me noch irgendetwas angeben?
Bei meinem PID Aufruf, ruckelt die ganze Sache, deshalb würde ich gerne  deine Funktion benüten.

Gruß Paul
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Josef P. am Januar 17, 2023, 15:08:19
Hallo!

Wenn ich deinen Code aufrufe, passiert nichts? Ich hätte erwartet, dass eine Fehlermeldung kommt. ;)
Der gezeigte Aufruf ist nur als Beispiel zu sehen, wie man das gekapselt nutzen könnte.
Der funktioniert so nur, wenn die FormTools-Klasse über den Dateiimport importiert wird (oder mit dem ImportWizard).
Du kannst den Code aber auch einfach in ein Standardmodul kopieren und verwenden.

Muss ich bei Me noch irgendetwas angeben?Der erste Parameter ist die Refernz zum Formular, das aktualisiert werden soll. Me wäre das formular, in dem der Code steht.
Du könntest auch schreiben:
FormTools.RequeryData Me.DeinSubFormControl, "P_ID"falls du ein Unterformular aktualisieren willst.

Wenn du eine Beispiel-DB bereitstellst, baue ich dir das gerne ein.

Gruß
Josef
Titel: Re: Mehrere Kriterien in Abfrage
Beitrag von: Paul Meixner am Januar 17, 2023, 21:38:48
Servus Josef,
für PID habe ich was gefunden, das wenigstens nicht so ruckelt.
Meine Euphorie ist mittlerweile weit Unten :'(

Hab noch einige "Schmerzen" mit meiner begonnenen Datenbank und der Weg ist noch weit, scheitere schon an vielen Kleinigkeiten.

Habe bereits ein schlechtes Gewissen mit meiner Unkenntnis.

Wenn du aber willst, sende ich dir meinen Stand der Dinge, und beschreibe mein ganzen Schmerzen.

Bin aber nicht böse wenn du keine Zeit hast, dann  werde ich die Sache erstmal so lassen.

Beste Grüß Paul