Bericht VBA SQL-Abfrage

Ich habe einen Button im Formular „Teilnehmer auswählen“ erstellt, der den Bericht „Namensschild“ öffnet
Wähernd der Bericht geladen wird wird ein VBA-Code ausgeführt, der
2 Textfeldern das Resultat einer SQL Abfrage zuweist (aber nur das letzte)

Es sollen aber für die erste Berichtsseite der erste Datensatz des Result, für die zweite Seite das zweite Result usw. zugewiesen werden.

Hallo mooooo
Wenn ich das Problem richtig verstanden habe, geht es um einen Seitenvorschub nach jedem Datensatz damit die Namensschilder gedruckt werden können. Falls das erste (nicht gedruckte ) Feld eventuell der Primary Key der Tabelle ist (sonst dieses Feld in die Abfrage aufnehmen):
Dieses Feld in den Bericht einfügen (sichtbar auf „nein“) eine Gruppierung auf dieses Feld anlegen und im Gruppenfuss Eigenschaftenblatt -> Format -> neue Seite „nach Bereich“ auswählen.
Falls ich das Problem nicht richtig verstanden habe, oder nähere Angaben für das Erstellen der Gruppierung erwünscht sind, bitte SQL String und Access Version mitteilen.
Freundliche Grüsse
Fonti46

Hallo mooooo

Man könnte die SQL-Abfrage so definieren, das z.B. nur ein bestimmter Datensatz zurückgegeben wird.
Beispiel:

SELECT TOP 1 CD_Name FROM CD_Bezeichnung WHERE CD_Name
In
(SELECT TOP 3 CD_Name FROM CD_Bezeichnung WHERE Fach = „Fach 03“
ORDER BY CD_Name)
ORDER BY CD_Name DESC;

Dieses Beispiel würde den dritten Datensatz
(weil TOP 3 in der Unterabfrage)
zurückgeben.

Der aktuelle Datensatz des Berichtes könnte folgendermaßen ermittelt werden:
Im Detailbereich des Berichtes ein Textfeld einfügen.
Bei Steuerelementeinhalt eingeben: =1
Laufende Summe auf ‚Über Alles‘ einstellen.
Danach beinhaltet dieses Textfeld den aktuellen Datensatz des Berichtes. Dieses Textfeld kann auf Unsichtbar eingestellt werden (Sichtbar = Nein).
Wenn pro Berichtsseite ein Datensatz angezeigt wird, so könnte über das Ereignis ‚Bei Seite‘ der Inhalt diese Textfeldes in eine globale Variable eingelesen werden, die dann auch außerhalb des Berichtes auswertbar sein sollte und zum Steuern der entsprechenden Unterabfragen herangezogen werden kann.

Gruß Wolfgang

Ich habe überlegt dass ich es so mache:
Ich habe bis jetzt eine Variable erstellt, die Seitennummer der aktuellen Seite im Report beinhaltet
( Report_Namensschild.Page )

Nun will ich das aus dem Resultset nur eine bestimmte Zeile ausgelesen wird
z.B.
RS.getIndex(Report_Namensschild.Page)

Aer wie programmiere ich das?

Gruß Moooooooooo

Haloo fonti46

Ich habe Access 2010 und mein SQL-String lautet:
sql = „SELECT Name, Vorname FROM Anmeldungen INNER JOIN Teilnehmer ON Anmeldungen.Personalnummer = Teilnehmer.Personalnummer WHERE Kursnummer = '“ & Kursnummer & „’ AND Eingeplant = '“ & LfdNr & „’“

Ich gebe eine Kursnummer und eine Laufende Nummer (LfdNr) ein.

Wie in meiner unteren Antwort schon zu entnehmen habe ich gedacht es auf diese weise lösen zu können, denn wenn man einen Bericht normal erstellt und Felder aus einer Tabelle hinzufügt, wird ja auch beim Weiterblättern der nächste Datensatz angezeigt, also müsste es bei einer Abfrage ja eigentlich auch gehen.

Gruß Mooooo

Hallo Mooooo
So sieht es schon viel klarer aus. Zuerst grundsätzlich: eine Abfrage führt nur genau die Anweisung aus die eingegeben ist, in diesem Fall nur einen Record, nämlich den mit der eingegebenen Laufnummer. Beim Blättern sieht diese Abfrage anders aus: da wird das ganze Recordset ausgewählt und Blättern wechselt dann von einem Datensatz zum nächsten. Ich nehme an, du willst nicht alle Teilnehmer ausdrucken sondern nur ausgewählte. In diesem Fall schlage ich vor, du fügst der Tabelle „Anmeldungen“ noch ein ja/nein Feld bei (nennen wir es mal „bolDrucken“ ). In einem Auswahlformular (als Endlosformular) klickst du dann die gewünschten Teilnehmer an. In dieses Formular kannst du auch den Druckbefehl aufnehmen. Nicht vergessen vor dem Drucken noch ein „DoCmd.RunCommand accmdSaveRecord“ einzufügen damit der letzte Auswahl-Klick auch noch gespeichert wird. (Vor dem Formularaufruf vielleicht noch alle bolDrucken-Felder auf nein setzen)
Wahrscheinlich brauchst du dann nach jedem Teilnehmer einen Seitenvorschub, drum nehmen wir das eindeutige Feld auch noch in den SQL-String auf. Auf dieses Feld kannst du dann im Bericht (Menu Entwurf -> Gruppieren und Sortieren) den gewünschten Vorschub einstellen.
Der SQL String lautet dann:
sql = „SELECT Personalnummer, Name, Vorname FROM Anmeldungen INNER JOIN Teilnehmer ON Anmeldungen.Personalnummer = Teilnehmer.Personalnummer WHERE Kursnummer = '“ & Kursnummer & "’ AND bolDrucken = true

Freundliche Grüsse
Fonti46

Hallo fonti46
Ich will ALLE Teilnehmer ausdrucken und ich will es möglichst über VBA lösen und nichts in die Tabelle eintagen, denn diese Datenbank gehört mir nicht.

Was bedeutet gruppieren und wie wendet man es an?
Könnte das mit DLookup gehen, welches nicht nur einen Datensatz liefert?
Gruß Mooooo

Hallo Mooooooo
Wenn es alle sein müssen vereinfacht sich alles. Warum nicht mit dem Etikettenassistenten (im Menu „Entwurf“ rechts)? Der kennt die Etiketten aller Hersteller, falls nicht, kann auch ein eigenes Format damit erstellt werden.
Falls es der Bericht „Namensschild“ sein muss:

Menu „Entwurf“, das vierte Feld von links ist „Sortieren und Gruppieren“, anklicken dann erscheint unter dem Bericht das entsprechende Eingabefeld. „Gruppe hinzufügen“ Feld Personalnummer auswählen, anschliessend „mehr“, „mit Kopfzellenbereich“ auf „ohne Kopfzellenbereich“ ändern, „ohne Fusszellenbereich“ auf „mit Fusszellenbereich“. Jetzt gibt es auf dem Formularentwurf nach „Detailbereich“ (der die Felder Vorname und Name enthält) noch den Balken „Personalnummer – Fussbereich“. Die Höhe kann auf 0 verkleinert werden. Im Eigenschaftenblatt dieses Balkens unter „Format -> neue Seite“ nach Bereich auswählen.
Der SQL String lautet dann nur noch:

sql = „SELECT Personalnummer, Name, Vorname FROM Anmeldungen INNER JOIN Teilnehmer ON Anmeldungen.Personalnummer = Teilnehmer.Personalnummer WHERE Kursnummer = '“ & Kursnummer

Das kann aber auch direkt in der Datensatzquelle des Berichts eingegeben werden. Der letzte Begriff „Kursnummer“ ist zu wenig genau definiert. Der müsste auf „Forms![Teilnehmer auswählen]!kursnummer“ geändert werden (besser gewesen wäre eine eindeutige Bezeichnung im Formular, z.B. lgKursnummer). Bei Eingabe in der Datenquelle des Berichts wäre der SQL-String dazu:

SELECT Personalnummer, Name, Vorname FROM Anmeldungen INNER JOIN Teilnehmer ON Anmeldungen.Personalnummer = Teilnehmer.Personalnummer WHERE Anmeldungen.Kursnummer = Forms![Teilnehmer auswählen]!kursnummer;

(kann anschliessend mit (…) überprüft werden, Vorsicht mit dem Feld Name in Anmeldungen, dies ist ein reservierter Begriff in Access und muss gegebenfalls in [eckige Klammern] eingefasst werden)
Freundliche Grüsse
Fonti46

Hallo Fonti46

Ich habe es ohne deine Lösung gelöst aber trotzdem vielen Dank.
Es war sooo einfach, ich habs mir mal wieder verkompliziert:

Ich habe in den Bericht ein Feld eingefügt und darauf von einer existierenden Namen eingefügt, dann den Namen in VB umgekehrt in das andere Feld eingefügt :stuck_out_tongue:

Gruß Mooooo

Hallo WOlfgang
danke für deine Bemühungen aber ich habe es bereits fertiggestellt
Gruß Mooooo