Ich habe mal eine Frage:
gegeben:
*ein HF/UFOendlos
*das HF enthält zwei Listenfelder, in denen jeweils ein Merkmal gewählt werden kann, z.B. Mitarbeiter und Kalenderwoche
* Das UFO basiert auf einer Abfrage, die die Auswahl berücksichtigt und entsprechend das UFO ansteuert.
Um die angezeigten Daten druckbar zu machen, soll nun ein Bericht per Knopfdruck erzeugbar sein, der exakt das angezeigte enthält. Das Problem ist nun die Übergabe der Auswahl an den Bericht. Ich habe keine Ahnung, wie das geht.
any suggestions?
Berichte lassen sich analog zu Formularen durch das optionale Argument WhereCondition in der Anweisung DoCmd.OpenReport (https://msdn.microsoft.com/de-de/vba/access-vba/articles/docmd-openreport-method-access) filtern.
Hallo Carl,
Link zu DonKarl
http://www.donkarl.com?FAQ5.9 (http://www.donkarl.com?FAQ5.9)
Gruß
Josef
Die Schwierigkeit besteht darin, dass das UFO auf einer Abfrage basiert, die die in zwei Textfeldern im HF ausgewählten Kriterien berücksichtigt.
Ich möchte sozusagen den Bericht mit den selben gewählten Kriterien öffnen.
Carl
ZitatBerichte lassen sich analog zu Formularen durch das optionale Argument WhereCondition in der Anweisung DoCmd.OpenReport filtern.
Du musst den WHERE-Teil deiner Abfrage als Öffnungs-Filter (WhereCondition) für den Bericht verwenden.
Gruß
Josef
der Where-Teil in der Abfrage, sind das die Kriterien? Also da habe ich zwei:
[Formulare]![Einsatzplan2_HF]![Liste36] und
[Formulare]![Einsatzplan2_HF]![Liste4]
woher weiß die Abfrage, was im Formular in den Listenfeldern gewählt wurde??
Carl
Hallo Carl,
hier ein Muster einer einfachen Abfrage mit WHERE-Teil:
SELECT *
FROM Artikel
WHERE (((Artikel.Artikelname)=[Formulare]![Artikel]![Artikelname]))
ORDER BY Artikel.[Artikel-Nr];
Das Rote ist der WHERE-Teil.
Bei dir ist dieser Teil länger.
Grobe Anleitung (ohne Details):
Und diesen WHERE-Teil (ohne das Wort WHERE) musst du als Öffnungsfilter für deinen Bericht verwenden.
Den Bezug auf deine beiden Listenfelder musst du entsprechend anpassen, je nachdem, von wo aus der Code aufgerufen wird (vom HF oder vom UF), und dann per String-Addition einfügen.
Vielleicht kann es jemand anderer im Forum besser erklären. ;)
Gruß
Josef
Hallo Carl,
Poste doch einfach den kompletten SQL-String deiner Abfrage.
Eigentlich bräuchte man aber nur die RecordSource des UFos im
Bericht zu übernehmen, die ist ja schon gefiltert.
gruss ekkehard
Ich habe den Button im Hauptformular, wo auch die zwei Listenfelder sind.
Private Sub btnBerichtA_Click()
DoCmd.OpenReport "berAEAPEinsatzplanA"
End Sub
Und das ist die funktionierende where-condition aus der Abfrage:
WHERE (((tbWochenDaten.WochenID)=[Formulare]![Einsatzplan2_HF]![Liste36]) AND ((tblmassnahmedurchgaenge.ID)=[Formulare]![Einsatzplan2_HF]![Liste4]));
Ich kriegs nicht hin, es kommt bei manchen Kombinationen die Fehlermeldung, dass sich das Feld WochenID uneindeutig auf zwei Tabellen bezieht.
Carl
Zitat von: Beaker s.a. am Januar 19, 2018, 16:58:31
Hallo Carl,
Poste doch einfach den kompletten SQL-String deiner Abfrage.
Eigentlich bräuchte man aber nur die RecordSource des UFos im
Bericht zu übernehmen, die ist ja schon gefiltert.
gruss ekkehard
Hallo ekkehard,
hier der komplette String der Abfrage:
SELECT tbWochenDaten.*, tbWochenDaten.WochenID, tblmassnahmedurchgaenge.ID, tblmassnahmedurchgaenge.Maßnahmedurchgang, tblTeilnehmer.AEAPTeilnehmerinfosKurz, tblTeilnehmer.AEAPKurzerprobungsbereichKurz, tblTeilnehmer.TeilnehmerAkronym, tblTeilnehmer.AEAPProjekt, tblTeilnehmer.AEAPFragestellung, tbWochenDaten.WochenMemo
FROM tblmassnahmedurchgaenge RIGHT JOIN (tblTeilnehmer INNER JOIN tbWochenDaten ON tblTeilnehmer.ID = tbWochenDaten.TeilnehmerID) ON tblmassnahmedurchgaenge.ID = tblTeilnehmer.massnahmeDurchgang
WHERE (((tbWochenDaten.WochenID)=[Formulare]![Einsatzplan2_HF]![Liste36]) AND ((tblmassnahmedurchgaenge.ID)=[Formulare]![Einsatzplan2_HF]![Liste4]));
Wie kann man eine schon gefilterte RecordSource eines UFos in einen Bericht übernehmen?
Carl
Bericht zu übernehmen
Hallo Carl,
Beim Öffnen des Berichtes
Me.RecordSource = Forms.HfoName.UFoControlName.Form.RecordSource
gruss ekkehard
Es funktioniert nicht. Mann, wenn ich doch nur ein Bisschen begabter wäre!
So sieht mein Code "beim öffnen" aus.
Private Sub Report_Open(Cancel As Integer)
Me.RecordSource = Forms.Einsatzplan2_HF.Einsatzplan2_UF_TN.Form.RecordSource
End Sub
Fehler 2465
Was ist denn "UFoControlName"? Nur der Name vom UFO oder eine Funktion? Carl
Control = Steuerelement
siehe http://www.donkarl.com?FAQ4.2 (http://www.donkarl.com?FAQ4.2)
Ich komme durch einander. Im Hauptformular sind zwei Listenfelder.
Hauptformular: Einsatzplan2_HF
Steuerelement im Hauptformular: Teilnehmer_UF
Unterformular: Einsatzplan2_UF_TN
und dann die zwei Listenfelder:
Liste36
Liste4
Das Button zum Öffnen des Berichts ist im Hauptformular und öffnet normal mit VBA.
In der Abfrage selbst ist das Feld WochenID schon 2x vorhanden, was die Fehlermeldung verursacht haben könnte.
Carl, ich zweifle Deine Begabung nicht an. Du machst Dir das Access-Leben nur unnötig schwer. Wenn Du ernsthaft Datenbanken mit Access entwickeln willst, kommst Du um SQL-Grundkenntnisse einfach nicht herum.
SELECT w.*,
d.ID,
d.Maßnahmedurchgang,
t.AEAPTeilnehmerinfosKurz,
t.AEAPKurzerprobungsbereichKurz,
t.TeilnehmerAkronym,
t.AEAPProjekt,
t.AEAPFragestellung,
w.WochenMemo
FROM tblmassnahmedurchgaenge d
RIGHT JOIN (tblTeilnehmer t
INNER JOIN tbWochenDaten w
ON t.id = w.TeilnehmerID)
ON d.iID = t.massnahmeDurchgang
WHERE w.WochenID = [Formulare]![Einsatzplan2_HF]![Liste36] AND
d.ID = [Formulare]![Einsatzplan2_HF]![Liste4];Warum man seine Steuerelemente Liste36 und Liste4 tauft und anderen hier im Forum den SQL-Text unformatiert vorwirft, ist mir schleierhaft. Das sind Dinge der Konzentration und Selbstdisziplin und hat mit Begabung nichts zu tun. Frei nach dem Motto: wer mir helfen will, kann schließlich selbst die Abfrage in lesbare Form bringen - einen Editor wird er ja schließlich haben.
Ansonsten lautet die korrekte Syntax:Private Sub Report_Open(Cancel As Integer)
Me.RecordSource = Forms!Einsatzplan2_HF.Einsatzplan2_UF_TN.Form.RecordSource
End Sub
Hier mal eine Beispieldatei. Ich kriegs nicht hin und mache vermutlich an mehreren Stellen Fehler.
Zitat von: Lachtaube am Januar 21, 2018, 17:47:09
Warum man seine Steuerelemente Liste36 und Liste4 tauft und anderen hier im Forum den SQL-Text unformatiert vorwirft, ist mir schleierhaft. Das sind Dinge der Konzentration und Selbstdisziplin und hat mit Begabung nichts zu tun. Frei nach dem Motto: wer mir helfen will, kann schließlich selbst die Abfrage in lesbare Form bringen - einen Editor wird er ja schließlich haben.
Sorry :-(
ZitatHauptformular: Einsatzplan2_HF
Steuerelement im Hauptformular: Teilnehmer_UF
Unterformular: Einsatzplan2_UF_TN
Demnach
Forms!Einsatzplan2_HF.Teilnehmer_UF.Form.RecordSource
Weil die Bezüge schon in der Berichtsabfrage fest verdrahtet sind, ist die Anweisung überflüssig. Du musst die doppelte WochenID aus abfWochendatenGewaehlteWoche2 entfernen.
Und außerdem heißt Dein Unterformular frmTeilnehmerzuordnungUFO2, was aber jetzt egal ist, und das Hauptformular benötigt auch keine RecordSouce (Datenherkunft), weil es nur als Container dient.
Zitat von: Lachtaube am Januar 21, 2018, 18:35:30
Weil die Bezüge schon in der Berichtsabfrage fest verdrahtet sind, ist die Anweisung überflüssig. Du musst die doppelte WochenID aus abfWochendatenGewaehlteWoche2 entfernen.
Darf ich nochmal nachfragen?
Welche Anweisung ist überflüssig?
Und wo steht eine doppelte
WochenID? In der Abfrage sehe ich nur eine.
Zitat von: Lachtaube am Januar 21, 2018, 18:35:30
Und außerdem heißt Dein Unterformular frmTeilnehmerzuordnungUFO2, was aber jetzt egal ist, und das Hauptformular benötigt auch keine RecordSouce (Datenherkunft), weil es nur als Container dient.
Es ist für mich nur schwer verständlich, wenn ich es nicht sehe. Kannst Du mir das bitte in der angehängten Datei eintragen, damit ich es am Beispiel erlernen kann?
Carl
Hier SELECT tbWochenDaten.*, tbWochenDaten.WochenID, ... wird die WochenID in die Feldliste 2x aufgenommen.
Der VBA-Code im Bericht ist unnötig, weil sich die gespeicherte Abfrage ja schon auf die Formularparameter der Abfrage bezieht und dadurch die Daten entsprechend einschränkt.
Verwende den Abfragetext aus meiner ersten Antwort hier im Thread für die Abfrage (kopieren und in die SQL-Ansicht einer Abfrage einfügen).
Hallo Carl,
Sorry, von einer gespeicherten Abfrage war ich nicht ausgegangen
(habe mir die DB nicht angeschaut :( )
Somit folge Lachtaubes Anmerkungen.
gruss ekkehard
Also ich habe jetzt den doppelten Bezug auf "WochenID" entfernt. abfWochendatenGewaehlteWoche2 sieht jetzt so aus:
SELECT tbWochenDaten.WochenID, tblmassnahmedurchgaenge.ID, tblmassnahmedurchgaenge.Maßnahmedurchgang, tblTeilnehmer.AEAPTeilnehmerinfosKurz, tblTeilnehmer.AEAPKurzerprobungsbereichKurz, tblTeilnehmer.TeilnehmerAkronym, tblTeilnehmer.AEAPProjekt, tblTeilnehmer.AEAPFragestellung, tbWochenDaten.WochenMemo, tbWochenDaten.MoMemo, tbWochenDaten.DiMemo, tbWochenDaten.MiMemo, tbWochenDaten.DoMemo, tbWochenDaten.FrMemo
FROM tblmassnahmedurchgaenge RIGHT JOIN (tblTeilnehmer INNER JOIN tbWochenDaten ON tblTeilnehmer.ID = tbWochenDaten.TeilnehmerID) ON tblmassnahmedurchgaenge.ID = tblTeilnehmer.massnahmeDurchgang
WHERE (((tbWochenDaten.WochenID)=[Formulare]![Einsatzplan2_HF]![Liste36]) AND ((tblmassnahmedurchgaenge.ID)=[Formulare]![Einsatzplan2_HF]![Liste4]));
Dann habe ich eine neue Abfrage als abfWochendatenGewaehlteWoche2i gewählt und in der SQL-Ansicht hinein kopiert:
SELECT w.*,
d.ID,
d.Maßnahmedurchgang,
t.AEAPTeilnehmerinfosKurz,
t.AEAPKurzerprobungsbereichKurz,
t.TeilnehmerAkronym,
t.AEAPProjekt,
t.AEAPFragestellung,
w.WochenMemo
FROM tblmassnahmedurchgaenge d
RIGHT JOIN (tblTeilnehmer t
INNER JOIN tbWochenDaten w
ON t.id = w.TeilnehmerID)
ON d.iID = t.massnahmeDurchgang
WHERE w.WochenID = [Formulare]![Einsatzplan2_HF]![Liste36] AND
d.ID = [Formulare]![Einsatzplan2_HF]![Liste4];
Darauf basiert dann das Formular?
Wenn ich das öffne, kommen Fehlermeldungen, dass er die Parameterwerte nicht finden kann.
Kannst Du es mir bitte in der hochgeladenen Datei beispielhaft einrichten, damit ich es mir in Ruhe ansehen und lernen kann?
Carl
Dann bleibt mir ja wohl nichts anderes übrig. :)
ah, vielen vielen Dank :-) Und sag mal, wieso heißen die Tabellen in der Abfrage jetzt d, t, w ? Ist das nur eine optische Korrektur oder ist das notwendig?
Carl
Zitat von: Carl am Januar 23, 2018, 12:40:06
wieso heißen die Tabellen in der Abfrage jetzt d, t, w ? Ist das nur eine optische Korrektur oder ist das notwendig?
Wenn die Abfrage dem SQL entspricht, was du vorher hier gepostet hast, dann ist es nur eine kosmetische Änderung um das SQL einfacher und übersichtlicher zu schreiben.
Diese "Ersatznamen" nennt man Alias. - Weiterführende Informationen zu Aliasen (http://codekabinett.com/rdumps.php?Lang=1&targetDoc=sql-as-alias).
In der von mir hier geposteten Abfrage hat sich noch ein Tipp-Fehler meinerseits eingeschlichen.
ON d.iID = t.massnahmeDurchgang enthält an rot markierter Stelle ein i zuviel. Und das Wochenmemo ist mir auch noch als Doublette aufgefallen und wurde eliminiert. Im Anhang habe ich dann auch noch an zwei Stellen in Tabellen ß gegen ss getauscht.