Bericht per Makro aus Formular anstoßen

Aus einem Formular wird per Makro ein Dialog aufgerufen, in dem man angeben kann, welche ID’s der zugrundeliegenden Tabelle im Bericht erscheinen sollen: Entweder die im Formular ausgewählten (per Markieren-Box) oder die in einem bestimmten Wertebereich der ID-Nummer. Soweit funktioniert das. Nun will ich die eingegebenen Daten an eine Ansicht (“ViewEtikett”) weitergeben, die Grundlage für den Bericht (“Bericht_Etikett_2”) ist. Der Versuch, die Selektions-Kriterien in die Ansicht zu übertragen:

führt zu einer Fehlermeldung, aus der hervorgeht, dass “ViewEtikett” nicht als Tabelle erkannt wird. Wie spreche ich eine Ansicht an und wie kann ich per Makro die “Kriterien” innerhalb dieser Ansicht verändern? Die Ansicht sieht wie folgt aus: der z.Z. aktuelle SQL-Code lautet:

Der Titel dieser Anfrage ist irreführend. Es geht nicht um den Start des Berichtes sondern um die Beeinflussung einer Ansicht. Eine Ansicht ist aber keine Tabelle sondern eine Abfrage von Tabellen, die lediglich in der Datenbank direkt ausgeführt wird. Eine Ansicht kann nicht über einen UPDATE-Befehl mit Daten versehen werden. Da musst Du schon die ursprüngliche Tabelle bearbeiten.

Du kannst aber eine Ansicht so formulieren, dass sie sich z.B. auf wechselnde Einträge in einer Filter-Tabelle bezieht. In dieser Filter-Tabelle würden sich solche Einträge wie stID_Max, stID_Min und bWert_Auswahl befinden, nach denen Du dann filtern kannst. Und die Filterung erfolgt dann in Deinem Falle über CASE WHEN … THEN … ELSE … END - in Abhängigkeit von bWert_Auswahl.

Mit einer einzeiligen Filter-Tabelle lassen sich die Ausgewählten Datensätze einfach mit der Ansicht verknüpfen. Auch das Schreiben in diese Filtertabelle funktioniert mit “update” und “Set”. Danke dafür. Aber wie kann ich in der Ansicht erreichen, dass nur ein bestimmter ID-Nummern-Bereich ausgewählt wird? Muss ich aus dem Makro heraus in einer Tabelle Filter_ID die Spalte ID_Nr über eine Schleife mit den ID-Zahlen von ID_Min bis ID_Max füllen? Wie macht man das?

Du benötigst Doch nur die minimale und die maximale Nummer, oder? Ich würde genau diese Felder, die in deinem Makro vorkommen, in die Filtertabelle einbauen.

Dann steht anschließend in der Ansicht:

... CASE WHEN (SELECT "Ausgewählt" FROM "Filter") = TRUE THEN "Ausgewählt" = TRUE ELSE ("Ausgewählt"  = FALSE AND "Objekt-Nr." BETWEEN (SELECT "Min" FROM "Filter") AND (SELECT "Max" FROM "Filter")) END

Habe ich jetzt allerdings nicht getestet

Wenn ich in der Ansicht in der SQL-Darstellung Deinen Code ergänze (so, oder durch den Tabellennamen ergänzte Spalten wie “Filter”.“Ausgewählt”) meldet mir das System “Fehler in der SQL-Syntax” ohne weitere Spezifizierung. Mir ist unklar, ob ein solcher Zugriff auf eine andere Tabelle im Grunde als Auswahlkriterium in einer Ansicht zulässig ist. Der erheblich umständlichere Weg wäre der Aufbau einer Filter-ID-Tabelle, die entweder (keine IDs ausgewählt) die ID-Nummern z.B. 1 bis 1000 enthält, oder nur die ID-Nummern zwischen ID_Min und ID_Max. Wenn eine solche Filter-ID-Tabelle in der Ansicht mit der Objekt-Nr. verbunden wird, würden nur die ausgewählten ID’s im Bericht erscheinen. Dazu müsste man aus dem Makro heraus Eine Vorrats_Tabelle (Mit den ID-Nr. 1-z.B. 1000) auf die verknüpfte Filter_ID-Tabelle überschreibend kopieren können (Fall: kein ID ausgewählt) bzw. aus der vollständigen Tabelle mit den IDs 1-1000 die Zeilen größer ID-Min und kleiner ID_Max herauslöschen.

Ich habe das jetzt einmal getestet und auch eine Fehlermeldung bekommen. Hier der Code, der bei mir funktioniert:

SELECT "Tabelle".* FROM "Tabelle" WHERE "Check" = ( SELECT "Check" FROM "Filter" ) AND "ID" BETWEEN CASE WHEN ( SELECT "Check" FROM "Filter" ) = TRUE THEN ( SELECT MIN( "ID" ) FROM "Tabelle" ) ELSE ( SELECT "min_ID" FROM "Filter" ) END AND CASE WHEN ( SELECT "Check" FROM "Filter" ) = TRUE THEN ( SELECT MAX( "ID" ) FROM "Tabelle" ) ELSE ( SELECT "max_ID" FROM "Filter" ) END

“Check” ist bei Dir “Ausgewählt”. Und die “ID” ist bei mir in der Kurzfassung das, was bei Dir die Objekt-Nummer ist.

Die Syntax stimmt bei mir jetzt (keine Fehlermeldung), Das Markierfeld “Ausgewählt” funktioniert auch mit obigem Code(also kann auf die Filter-Tabelle zugegriffen werden), aber die Objekt-Nummern Einschränkung liefert nur eine leere Tabelle (auch wenn in der Filter-Tabelle gültige Werte eingetragen sind).

Schau einmal hier: Filterabfrage.odb. Da funktioniert das, wenn ich es richtig verstanden habe. Sind Deine Objekt-Nr. vielleicht gar keine Zahlen?

Die Objekt-Nummern in der zugrundeliegenden Tabelle sind mit small Integer definiert, die ID_Min und ID_Max in der Filter-Tabelle habe ich als aus Versehen als Integer definiert. Probehalber hab ich eine neue Filter-Tabelle erstellt, in der ich die auch als small Integer definiert habe. Das hat aber Nichts geändert. Ob sich unsere Syntax unterscheidet, kann ich nicht sehen, da ich in die Definitionen deiner Probedatenbank nicht reinschauen kann. Vielleicht ist es nur eine fehlende Klammer (obwohl ich da schon einige ausprobiert habe)

Warum Du in die Definition nicht rein schauen kannst ist mir nicht verständlich. Du hast doch die Datenbank runter geladen, oder? Und da ist eine Abfrage drin sowie eben 2 Tabellen. Und die SQL-Definition der Abfrage ist doch über Abfrage → in SQL-Ansicht bearbeiten ersichtlich.

Vielleicht liegt der Fehler darin, dass Du beides Mal “min_ID” in der Abfrage stehen hast. Dann wird alles gesucht, was z.B. zwischen 3 und 3 liegt. Ich hatte am Anfang auch durch das Kopieren gerade so einen Fehler.

An unterschiedlichen Integer-Feldern kann es nicht liegen, sofern die benutzten Werte eben in beide Integer-Felder passen.

Habe die Spalten umbenannt (IDunten und IDoben), kein Effekt. Reihenfolge der Spalten jetzt auch so wie bei Dir. Kein Effekt: Meinen SQL-Code habe ich oben bei der Frage ergänzt. So recht fällt mir nichts mehr ein.

Du kannst mir die Datenbank gerne einmal per privater Mail zuschicken. Ich schaue mir das dann einmal an.

Testweise würde ich einmal ausprobieren, wie das ist, wenn Du die BETWEEN-Bedingung einfach einmal mit konkreten Zahlen besetzt, z.B. "Objekt-Nr." BETWEEN 5 AND 10

… oder kann es sein, dass eins der Felder in der Filtertabelle “min_ID” oder “max_ID” keinen Inhalt hat?

Sobald die Auswahl-Bedingung bei den Kriterien steht, funktioniert die between-Bedingung noch nicht mal mit Zahlen. Ohne die Auswahl-Bedingung funktioniert dagegen auch die “between case when” Formulierung. Muss man nicht verstehen, da es bei Roberts Probe-DB ja geklappt hat. Sei es drum: Ich habe zwei Abfragen/Ansichten formuliert und diese jeweils zur Grundlage von zwei verschiedenen Berichten gemacht. In der Ansicht “View_Etikett_Auswahl” steht nur die Bedingung “WHERE “tblObjekte”.“Ausgewählt” = TRUE”, in der Ansicht “View_Etikett_ID” steht dagegen " WHERE “tblObjekte”.“Objekt-Nr.” BETWEEN CASE WHEN ( SELECT “IDunten” FROM “tblFilter” ) = 0 THEN ( SELECT MIN( “tblObjekte”.“Objekt-Nr.” ) FROM “tblObjekte” ) ELSE ( SELECT “IDunten” FROM “tblFilter” ) END AND CASE WHEN ( SELECT “IDoben” FROM “tblFilter” ) = 0 THEN ( SELECT MAX( “tblObjekte”.“Objekt-Nr.” ) FROM “tblObjekte” ) ELSE ( SELECT “IDoben” FROM “tblFilter” ) END" Durch die Abfrage nach den “=0”-Werten kann man fehlende Einträge bei IDunten bzw. IDoben abfangen. Das entsprechende Makro sieht dann wie folgt aus:

So funktioniert das Ganze. Danke noch einmal an Robert.