Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Abfrage per Schleife durchlaufen und Textfeld befüllen

Begonnen von Xoar, Juli 06, 2011, 19:51:43

⏪ vorheriges - nächstes ⏩

Xoar

Huhu, ich bins mal wieder.

Ich versuche gerade eine Schleife zu bauen, die eine Abfrage durchläuft, und jeden Datensatz bei dem die Kriterien übereinstimmen in ein Textfeld schreibt.
In der Abfrage: qryDienstplan sind Mitarbeiter aufgelistet die am jeweiligen Tag arbeiten. Als Nebeninfo gibt es in der Abfrage zwei Spalten in denen die Diensthabende Wachabteilung eingetragen ist und zu welcher Wachabteilung die Mitarbeiter gehören, die an dem jeweiligen Tag arbeiten.

Sprich es kann vorkommen, dass heute die Wachabteilung 1 (von 3) arbeiten muss, aber ein Mitarbeiter mit einem anderen getauscht hat, also von der Wachabteilung 2 kommt.

Mitarbeiter 1  Diensthabende WA 1    Mitarbeiter WA 1
Mitarbeiter 2  Diensthabende WA 1    Mitarbeiter WA 1
Mitarbeiter 3  Diensthabende WA 1    Mitarbeiter WA 2

So hoffe ist klar, was ich meine *G*

Nun sollen die jeweiligen Wachabteilungsfremden Mitarbeiter in bestimmte Textfelder eingetragen werden. Die Textfelder heißen: kommandiert1 bis kommandiert4

Über nen Dlookup find ich ja nur den ersten Datensatz mit der Übereinstimmung, da es aber mehrere sein können, funktioniert das net so einfach, oder?

Hab mal angefangen mit ner Schleife, aber ich scheitere eigentlich schon am Anfang.

Dim DatensatzNr As Integer, kommandiertNr As Integer, k As Integer, l As Integer
DatensatzNr = DCount("Nachname", "qryDienstplan")  'ermittelt die Anzahl der Datensätz in der Abfrage
    k = 1
    For k = 1 To DatensatzNr
        If DLookup("[tblMitarbeiter.Wachabteilung]", "qryDienstplan") <> DLookup("[tblDienstplan.Wachabteilung]", "qryDienstplan") Then   'ist quatsch, mir fällt nur gerade keine Lösung ein
          Form_FrmDienstplan("kommandiertNr" & l) = DLookup("[Nachname]", "qryDienstplan")  'hier muss halt der richtige Datensatz ein...
        End If
    k = k + 1
    l = l + 1
    Next

Tja da seht ihr meinen Ansatz. Eigentlich noch vollkommen falsch, das weiß ich, aber ich find keine Lösung -.-


Habt ihr Ideen?

DF6GL

Hallo,

die beste Lösung ist, den Ansatz zu " in bestimmte Textfelder (kommandiert1 bis kommandiert4) eingetragen werden " aufzugeben.

Ersetz diese 4 Textfelder durch ein Listenfeld und fülle dies mit einer passend erstellten Abfrage, die nur die wachabteilungsfremden Mitarbeiter liefert

Dann ist das ganze Getöns mit VBA  und Schleife überflüssig und obendrein noch "performanter".

Xoar

#2
Moin, da in den Feldern leider nicht NUR diese Daten eingetragen werden, möchte ich das gerne erstmal über VBA machen. Habs nun über RecordSet versucht, hab da aber leider nen Fehler den ich nicht deuten kann.

Hier der anfängliche Code
Dim m As Integer
Dim rst2 As DAO.Recordset
m = 1
Set rst2 = CurrentDb.OpenRecordset("qryDienstplan", dbOpenDynaset)  Hier kommt Laufzeitfehler 3061, ein Parameter wurde erwartet, aber warum?
With rst2   'with vereinfacht die Schreibweise. rst2 muss nicht mehr eingegeben werden sondern direkt .Befehl
  Do While Not .EOF
       If .Fields("tblDienstplan.Wachabteilung") <> .Fields("tblMitarbeiter.Wachabteilung") Then
             Form_frmDienstplanAusdruck.("kommandiert" & m).Value = .Fields("Nachname")   'wird noch verändert, nur zum testen
             MsgBox .Fields("Nachname")
       Else
            MsgBox "test"
       End If
  .MoveNext
   m = m +1
  Loop
  .Close
End With

Er lädt da ja noch nichtmal die Abfrage ins RecordSet. Einer ne Idee warum?

DF6GL

Hallo,


".. leider nicht NUR diese Daten eingetragen werden.."

dann nimm ein Endlosform...

"..gerne erstmal über VBA machen.."

dann dokterst Du in Folge an Symptomen herum, ohne die Krankheit zu bekämpfen.


"..aber warum?"

weil in der Abfrage ein Kriterien-Parameter vorhanden ist, der keinen Wert bekommt (bekommen hat).

Xoar

#4
möchte es halt lieber über VBA machen. :D

Wenn ich die Abfrage öffne, bevor ich den Code durchlaufe, kommt der Fehler aber auch.
Und über DLookup greife ich in einem anderen Teil der Sub auch auf die qryDienstplan zu, und da funktioniert das seltsamerweise.

Das Kriterium erhält die Abfrage auch automatisch über das Formular, welches zu dem Zeitpunkt der Ausführung des Codes aktiv ist.

[edit]
habs mal testweise ohne Abfragekriterium in der Abfrage probiert, dann klappts!!
Kapiere aber nicht, warum er das Kriterium nicht von dem Formular nimmt.

Wie kann man dem Kriteriumparameter denn nun noch da den Parameter zuweisen?



DF6GL

Hallo,


am Besten setzt Du statt dem Abfragenamen den SQl-String der Abfrage bei Openrecordset ein und übergibst den Parameter-Wert mittels "SQl-String-Zusammenbau", etwa so:

...Openrecordset ("Select * from tblTabelle where FeldBlahblah ='" & Me!FormularTextfeld & "'", dbopensnapshot)

"..erhält die Abfrage auch automatisch über das Formular "

geht halt doch nicht "automatisch" mit dem verwendeten Formular-Verweis.   ;)

Wie lautet der   (SQL-String der Abfrage) denn?

Man könnte(!) auch eine Public-Funktion schreiben, die den
Ein separates Öffnen der Abfrage hat mit dem Öffnen mit einem Recordset auch nichts zu tun.


Xoar

#6
Hi, der SQL string lautet

SELECT tblDienstplan.Datum, tblMitarbeiter.Nachname, tblFahrzeuge.Fahrzeug, tblFahrzeugPosten.Posten, tblSchichten.Schicht, tblDienstplan.Wachabteilung, tblMitarbeiter.Wachabteilung, tblSonderposten.Sonderposten
FROM tblSonderposten RIGHT JOIN (tblSchichten INNER JOIN (tblMitarbeiter INNER JOIN (tblFahrzeugPosten INNER JOIN (tblFahrzeuge INNER JOIN (tblDienstplan INNER JOIN tblFahrzeugMitarbeiterzuweisung ON tblDienstplan.DienstplanID = tblFahrzeugMitarbeiterzuweisung.DienstplanID) ON tblFahrzeuge.Fahrzeug_ID = tblFahrzeugMitarbeiterzuweisung.Fahrzeug_ID) ON tblFahrzeugPosten.FahrzeugPosten_ID = tblFahrzeugMitarbeiterzuweisung.FahrzeugPosten_ID) ON tblMitarbeiter.Mitarbeiter_ID = tblFahrzeugMitarbeiterzuweisung.Mitarbeiter_ID) ON tblSchichten.SchichtID = tblFahrzeugMitarbeiterzuweisung.Schicht_ID) ON tblSonderposten.Sonderposten_ID = tblFahrzeugMitarbeiterzuweisung.Sonderposten_ID
WHERE (((tblDienstplan.Datum)=[Forms]![frmDienstplan]![Datum]));


etwas länger.

Habs nun mal so gemacht wie du gesagt hast, da kommt wieder der Laufzeitfehler 3061: 1 Parameter erwartet, aber es wurden zuwenig übergeben. Lass ich bei  '" & DatumRST & "' die Hochkommas weg kommt ein Syntaxfehler.

Dim DatumRST As Date
Dim m As Integer
Dim rst2 As DAO.Recordset
DatumRST = Me!Datum
m = 1
Set rst2 = CurrentDb.OpenRecordset(" Select * FROM qryDienstplan where Datum = '" & DatumRST & "'")
With rst2   'with vereinfacht die Schreibweise. rst2 muss nicht mehr eingegeben werden sondern direkt .Befehl
  Do While Not .EOF
       If .Fields("tblDienstplan.Wachabteilung") <> .Fields("tblMitarbeiter.Wachabteilung") Then
             Form_frmDienstplanAusdruck("kommandiert" & m).Value = .Fields("Nachname")
             MsgBox .Fields("Nachname")
       Else
            MsgBox "test"
       End If
  .MoveNext
  m = m + 1
  Loop
  .Close
End With


DF6GL

Hallo,

so:

Set rst2 = CurrentDb.OpenRecordset(" Select * FROM qryDienstplan where tblDienstplan.[Datum] = " & Format(Me![Datum],"\#yyyy-mm-dd\#"),dbOpenSnapshot)


Wenn das Tabellenfeld den Datentyp Datum/Uhrzeit hat und das Kriterium ("Where" mit dem Formular-Verweis) aus der Abfrage entfernt ist.

Xoar

#8
Moin Franz, habs nun doch bissel anders gemacht, da ich das Kriterium in der Abfrage für andere Sachen brauchte und wollte nicht nochmal die Abfrage "duplizieren" ohne Kriterium:

Dim db As DAO.Database
Dim rst2 As DAO.Recordset
Dim qdf As DAO.QueryDef
Dim m As Integer

Set db = CurrentDb
Set qdf = db.QueryDefs("qryDienstplan")
qdf.Parameters(0) = Me!Datum 'Hier konnte ich zwar nirgends finden ob (0) die erste Spalte der Abfrage meint, oder das erste Kriterium von links nach rechts.

m = 1
Set rst2 = qdf.OpenRecordset(dbOpenDynaset)  'Gibt das nen Geschwindigkeitszuwachs wenn ich dbOpenSnapshot nehme?
With rst2  
  Do While Not .EOF
       If .Fields("tblDienstplan.Wachabteilung") <> .Fields("tblMitarbeiter.Wachabteilung") Then  
             Form_frmDienstplanAusdruck("kommandiert" & m).Value = .Fields("Nachname")
              m = m + 1  [edit] das muss hier rein :)
       Else
            'hier brauch eigentlich nichts stehen
       End If
  .MoveNext
  Loop
  .Close
End With
qdf.Close: Set qdf = Nothing
Set db = Nothing

Deine Variante wäre bischen kürzer, leider kann ich da kein Parameter übergeben, deshalb so wie oben :)

Trotzdem danke

DF6GL

Hallo,
Zitat
'Hier konnte ich zwar nirgends finden ob (0) die erste Spalte der Abfrage meint, oder das erste Kriterium von links nach rechts.

weder noch, es meint den ersten Paramater in der Parameterliste der Abfrage.



Zitat'Gibt das nen Geschwindigkeitszuwachs wenn ich dbOpenSnapshot nehme?

Auch, vordergründig steht aber die Vermeidung von Sperrkonflikten, wenn andersweitig parallel auf die Daten zugegriffen wird.