Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Mehrfachauswahl mit Listenfeld

Begonnen von MP2109, November 23, 2018, 16:02:36

⏪ vorheriges - nächstes ⏩

MP2109

Zitat

   Dim sql As String
       
sql = "SELECT ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum, ArbeitszeitraumOhneWe.Standort, ArbeitszeitraumOhneWe.Bundesland, ArbeitszeitraumOhneWe.Kostenstelle, ArbeitszeitraumOhneWe.Stunden_pro_Tag, Feiertag.Wertigkeit" & _
                            "FROM ArbeitszeitraumOhneWe LEFT JOIN Feiertag ON (ArbeitszeitraumOhneWe.Bundesland = Feiertag.Bundesland2 AND ArbeitszeitraumOhneWe.[Datum] = Feiertag.[Datum]" & _
                            "WHERE MitarbeiterID IN & Forms!Sollstunden!txtMAIDs AND ArbeitszeitraumOhneWe.Kostenstelle Like " * " & [Formulare]![f2_1_Sollstunden]![filterKostenstelle] & " * " And Feiertag.Wertigkeit Is Null Or Feiertag.Wertigkeit < 1"


   

End Sub

Vielen dank @ebs 
Soweit ich Vba jetzt verstanden habe, muss ich Sql als String definieren
und dann unten bei sql einbinden.
Jetzt zeigt er mir als Fehlermeldung eine Typenunverträglichkeit auf. Ich denke das mein Fehler in der Sql Einbindung nicht richtig ist.

ebs17

ZitatIch denke das mein Fehler in der Sql Einbindung nicht richtig ist.
Ja, und es fehlt der prüfende Schritt, später dann auch die Übergabe des Strings an die Verwendung.
Debug.Print sql
Das gibt den erzeugten Finalstring in den Direktbereich aus (erreichbar über Strg + G aus dem VBA-Editor heraus). Dort kannst Du sehen, was Du erzeugt hast, und mit Kenntnis notwendiger Syntax kannst Du Fehler erkennen und überarbeiten.
Mit freundlichem Glück Auf!

Eberhard

MP2109

#17
  sql = " SELECT ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum, ArbeitszeitraumOhneWe.Standort, ArbeitszeitraumOhneWe.Bundesland, ArbeitszeitraumOhneWe.Kostenstelle, ArbeitszeitraumOhneWe.Stunden_pro_Tag, Feiertag.Wertigkeit " & _
                " FROM ArbeitszeitraumOhneWe LEFT JOIN Feiertag ON (ArbeitszeitraumOhneWe.Bundesland = Feiertag.Bundesland2) AND (ArbeitszeitraumOhneWe.[Datum] = Feiertag.[Datum]) " & _
                " WHERE MitarbeiterID"
               
                '& _
                    "IN (1,2,3)  AND ((Feiertag.Wertigkeit) Is Null Or (Feiertag.Wertigkeit)<1) " & _
                " ORDER BY ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum; "
   
        sql = sql & "in" & sAuswahl & _
                    " AND ((Feiertag.Wertigkeit) Is Null Or (Feiertag.Wertigkeit)<1) " & _
                    " ORDER BY ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum; "
        Debug.Print sql
 
   DoCmd.RunSQL sql


Ich bin eigentlich der Meinung, dass der Sql Code richtig sein müsste jetzt. Doch mir wird beim ausführen des Buttons immer noch ein Fehler(23429 angezeigt.
Er makiert immer die Zeile DoCmd.RunSQL

Lachtaube

Du verklebst MitarbeiterID mit IN zu  MitarbeiterIDIN. Weiterhin wird Dir RunSQL garantiert keine Auswahlabfrage anzeigen.
Grüße von der (⌒▽⌒)

MP2109

#19
Habe jetzt mal     Dim qdf As QueryDef, sqltext
sqltext = sql
For Each qdf In CurrentDb.QueryDefs
    If qdf.Name = "tmp" Then
        DoCmd.Close acQuery, "tmp": DoCmd.DeleteObject acQuery, "tmp"
    End If
Next
Set qdf = CurrentDb.CreateQueryDef("tmp", sqltext)
DoCmd.OpenQuery qdf.Name
   
    Me!UnterFormular.Requery
End Sub


benutzt. Jetzt holt er mir die ausgewählten daten in eine neue Abfrage.  Das heißt meine Verknüpfung mit SQL ist schon mal richtig soweit  :) :) :)
Welchen Befehl müsste ich nun anstelle von DoCmd.RunSQL sql das es funktioniert?

MP2109

ZitatDu verklebst MitarbeiterID mit IN
@LAchtaube hatte ich in meinem code auch schon berichtigt

Beaker s.a.

@MP2109
Dein letztgezeigter Code ist überflüssig. Wenn du einen, funktionierenden, 
SQL-String hast (bei dir jetzt wohl "sql"), brauchst du diesen nur der DS-
Herkunft des UFos zu übergeben.

sql = "DeinString"
'u.U. halt noch ein Debug.Print
Me.DeinUFoControl.Form.RecordSource = sql


gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MP2109

#22
Also grundsätzlich habe ich eine Lösung

Private Sub filterAnwenden_Click()
Dim vItem As Variant
   Dim sAuswahlMitarbeiter As String
   Dim sql As String
   Dim rs As DAO.Recordset
   
AuswahlMitarbeiter = "("
    With Me!filterMitarbeiter

        If .ItemsSelected.Count > 0 Then

           For Each vItem In .ItemsSelected
                 AuswahlMitarbeiter = AuswahlMitarbeiter & .ItemData(vItem) & ","
            Next vItem
            'letztes Komma weg
            AuswahlMitarbeiter = Mid(AuswahlMitarbeiter, 1, Len(AuswahlMitarbeiter) - 1)
            'Klammer hinten dran
            AuswahlMitarbeiter = AuswahlMitarbeiter & ")"
              End If
       
        End With
   
   
   
             sql = " SELECT ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum, ArbeitszeitraumOhneWe.Standort, ArbeitszeitraumOhneWe.Bundesland, ArbeitszeitraumOhneWe.Kostenstelle, ArbeitszeitraumOhneWe.Stunden_pro_Tag, Feiertag.Wertigkeit " & _
                " FROM ArbeitszeitraumOhneWe LEFT JOIN Feiertag ON (ArbeitszeitraumOhneWe.Bundesland = Feiertag.Bundesland2) AND (ArbeitszeitraumOhneWe.[Datum] = Feiertag.[Datum]) " & _
                " WHERE MitarbeiterID"
               
           
        sql = sql & " IN" & AuswahlMitarbeiter & _
                    " AND ((Feiertag.Wertigkeit) Is Null Or (Feiertag.Wertigkeit)<1) " & _
                    " ORDER BY ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum; "
                   
        Debug.Print filterMitarbeiter
       
Dim qdf As QueryDef, sqltext
sqltext = sql
For Each qdf In CurrentDb.QueryDefs
    If qdf.Name = "ArbeitszeitraumOhneWeFT" Then
        DoCmd.Close acQuery, "ArbeitszeitraumOhneWeFT": DoCmd.DeleteObject acQuery, "ArbeitszeitraumOhneWeFT"
    End If
Next
Set qdf = CurrentDb.CreateQueryDef("ArbeitszeitraumOhneWeFT", sqltext)

DoCmd.Close acForm, "f1_1_Navigation"
DoCmd.OpenForm "f1_1_Navigation"


End Sub


dies funktioniert jetzt auch. Ist vielleicht nicht besonders elegant, aber es funktioniert.


@beaker wie meintest du das mit sql = "DeinString"
'u.U. halt noch ein Debug.Print
Me.DeinUFoControl.Form.RecordSource = sql


Das funktioniert bei mir nicht. Denn er filtert zwar die Mitarbeiter, doch die anderen Daten der Kreuztabelle bleiben leer(außer Mitarbeiter). Ich denke das liegt daran das die Abfrage, die ich filter nicht die Kreuztabelle ist. Es ist die Abfrage aus der ich die Kreuztabelle erstelle.

Vielen Dank erstmal an alle die mir bis zu diesem Schritt geholfen haben, das mich sehr weiter gebracht!

Grüße

Beaker s.a.

@MP2109
O.K., so langsam komme ich dahinter, was du eigentlich willst.
Ich dachte die ganze Zeit, du willst ein UFo filtern.
Was du willst, ist eine gespeicherte Abfrage, die Basis für eine
Kreuztabellenabfrage ist, zu ändern; -. glaube ich jetzt jeden-
falls so verstanden zu haben.
Dann wird's doch viel einfacher, du brauchst die Abfrage nicht
erst löschen und dann wieder neu erstellen. Es reicht den SQL-
String zu ändern
...
        Debug.Print filterMitarbeiter

        CurrentDb.QueryDefs("ArbeitszeitraumOhneWeFT").SQL = sql
End Sub


Wenn das Form "f1_1_Navigation" auf einer der beiden Abfragen
(sql bzw. "ArbeitszeitraumOhneWeFT" basiert, brauchst du es nicht
extra zu schliessen, da reicht dann ein
'wenn's ein HFo ist
Forms.f1_1_Navigation.Requery
'bei einem UFO
Forms.NameHFO.NameUFoControl.Form.Requery


gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MP2109

#24
@Beaker

Ja genau so wollte ich es eigentlich, wusste jedoch nicht den passenden VBA Befehl.
Ledier ändert sich bei CurrentDb.QueryDefs("ArbeitszeitraumOhneWeFT").SQL = sql
Forms.f1_1_Navigation.Requery

nichts .



++++
Ich habe es gerade noch ein mal ausprobiert ob es aktualisiert wenn man die Navigation wechselt und das tut es.
Heißt wohl ich muss wiederDoCmd.Close acForm, "f1_1_Navigation"
DoCmd.OpenForm "f1_1_Navigation"
benutzen.

Beaker s.a.

Hallo,
ZitatIch habe es gerade noch ein mal ausprobiert ob es aktualisiert wenn man die Navigation wechselt und das tut es.
Das heisst, die Abfrage wird geändert aber das Form aktualisiert nicht?
Kann IMO dann eigentlich nur an der Referenz auf das Formular liegen.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MP2109

@Beaker ja genau die Abfrage aktualisiert jedoch das UFO nicht.

DF6GL

Hallo,

ein Naviform hat nur ein Unterformular(Steuerelement), auf das Bezug genommen werden muss und standardmäßig den Namen "Navigationsunterformular" hat.

Insofern muss es so lauten:

Forms!f1_1_Navigation!NavigationsUnterformular.Requery

sofern das UFO nicht umbenannt wurde.

MP2109

#28
@DF6GL achso ja habe ich verstanden. Jedoch wenn ich den Vba befehl eingebe, klappt leider nicht da er sagt, dass er f1_1_Navigation nicht kennt.

ich beende hier mal, da die Lösung die ich soweit habe den Zweck erfüllt. Zwar nicht perfekt jedoch macht er was er soll. Vielen Dank allen nochmal bei der Hilfe?

DF6GL

Hallo,

wenn er den Formular-Namen nicht kennt, dann existiert der halt nicht und muss durch den aktuell richtigen Namen ersetzt werden.....