PDA

Vollständige Version anzeigen : variabler Bericht


Localadmin
06.07.2006, 18:54
Hallo Zusammen,
ich habe ein kleines Problem mit einem Bericht.
Ich habe eine Abfrage erstellt, welche 9 Spalten enthält
(Artikel, 1. Quartal des Vorjahres, 2. Quartal des Vorjahres, 3. Quartal des Vorjahres, 4. Quartal des Vorjahres, 1. Quartal dieses Jahres usw.)

Nun zum Problem:
Ich möchte nun einen Bericht auf diese Abfrage hin erstellen, indem diese 9 Spalten immer erscheinen (auch wenn in den einzelnen Zeilen vom 4. Quartal 2006 noch nichts stehen kann).

Meine Frage ist nun: Wie kann man einen Bericht generieren, welcher diess 9 Spalten stets anzeigt und nur die Spalten der jeweiligen Quartale ausfüllt?????


Sven

Bernd Koch
06.07.2006, 19:04
Ich verstehe nicht so ganz deine Frage. Wenn du in der der Abfrage zugrundeliegenden Tabelle für jedes Quartal ein Feld eingerichtet hast und somit pro Feld in der Abfrage eine Spalte, dann wird das auch so im Bericht angezeigt.

Aaaaber
dann wäre die Struktur der Tabelle nicht sonderlich optimal

Oder
hast du in der Tabelle nur ein einziges Feld für die Quartale und hast die Abfrage in Form einer Kreuztabelle erstellt ... dann wird im Normalfall tatsächlich das Quartal, das keine Werte enthält, ausgelassen. Dem kannst du aber durch fixierte Spaltenbezeichnungen entgehen.

Ehe ich da aber ins Detail gehe, schreibe doch bitte, wie der Aufbau deiner Tabelle und deiner Abfrage ist.

Bernd

Localadmin
03.09.2006, 15:49
Hallo Bernd,

die Daten für den Bericht kommen aus einer Kreuztabellenabfrage.

Diese Abfrage summiert den Verbrauch pro Artikel (Gruppiert nach Quartal).
Wurde in einem Quartal nichts gebucht, so wird in der Abfrage auch keine Spalte für dieses Quartal erstellt.

In meinem Bericht will ich den Verbrauch pro Artikel für die vergangenen 8 Quartale anzeigen.

Ein kleines Beispiel:
- aktuelles Quartal 06_03:
- Es sollen die Quartale 06_02, 06_01, ... , 04_04 angezeigt werden.

Die Tabelle hat folgenden (vereinfachten) Aufbau:
- Datum
- ArtikelNr
- Gesamtverbrauch

Wenn ich die Felder im Bericht aus der Feldliste benutze funktioniert der Bericht, solange alle Quartale in der Kreuztabellenabfrage vorhanden sind.

Wenn z.B. für das Quartal 06_01 keine Daten vorhanden sind, wird ja in der Abfrage auch keine Spalte erzeugt. Der Bericht bricht dann mit einer Fehlermeldung ab, da er das Feld [06_01] nicht findet.

Kannst du mir da weiterhelfen?


Danke,
Sven

Bernd Koch
03.09.2006, 15:58
Hast du es denn schon mit fixierten Spaltenbezeichnungen (wird in der Kreuztabellenabfrage gemacht) versucht?

Bernd

Localadmin
03.09.2006, 16:42
Hallo Bernd,
danke für deine schnelle Antwort.

Mit fixierten Spaltenüberschriften komm ich auch nicht zum Ziel.

In der Kreuztabellenabfrage ist die Spaltenüberschrift folgendermaßen definiert:
PIVOT Format([Datum],"yy\/q"

z.B. 06/3

Das Problem liegt in der Fortschreibung der Daten.
Wie programmiere ich den Bericht, dass er mir nächstes Jahr im April (also 07/2) die letzen 8 Quartale anzeigt (also bis 05/3)?

Gruß
Sven

Bernd Koch
03.09.2006, 17:49
Tja, da beißt sich natürlich die Katze in den Schwanz, denn einerseits möchtest du eine Anzeige-Automatik und andererseits gibt es anscheinend ab und zu keine Daten in einem Quartal, das deshalb "leer" bleibt.

Das Einfachste wäre, dass du doch fixierte Spaltenüberschriften nimmst, sie aber laufend anpassen musst.

Eine andere Lösung, dass du bei Quartalen, in denen es keinen Eintrag gibt, einen Dummy-Datensatz eingibst, dessen Anzeige man im Bericht wieder rausfiltern könnte, wodurch aber das Quartal als Spalte auftaucht.

Beides ist natürlich unelegant und verlangt dauernde "Handarbeit".

Wirklich automatisch ginge es wohl nur, wenn du aufwändig programmierst, indem du
- zunächst den Datenbestand analysiert nach allen Datumsangaben in der Tabelle, die vom Tagesdatum z.B. max 2 Jahre zurück liegen und diese selektierst,
- dann für diesen Zeitraum die 8 Quartale ermittelst und sie einer Variablen zuweist
- und diese Variable dann im SQL-Code quasi als fixierte Spaltenüberschriften einsetzt, also DoCmd.RunSQL "Select ... PIVOT [Datum] In (VARIABLE)"
Das Ganze z.B. als Ereignis BeimÖffnen des Berichts.

Aber du siehst schon, das ist nicht ganz ohne. Etwas anderes fällt mir aber nicht ein; vielleicht weiß ein anderes Forenmitglied noch eine andere/einfachere Lösung.

Bernd

Beere
03.09.2006, 18:14
Also, mal sehen, ob ich's zusammen bekomme. Ich habe im Bericht soviel ungebundene Felder, wie ich voraussichtlich maximal brauchén werde, konstante Felder sind gebunden. Die Kreuztabellenabfrage wird immer in einer Tabelle gespeichert (vor/nach Gebrauch gelöscht). Die Label+Text-Felder habe ich L1/T1, L2/T2...LnTn benamst. Bevor ich den Bericht anzeige, öffne ich ihn in der Entwurfsansicht und verknüpfe die ungebunden/benötigten Felder, setze bei denen Visible=true und bei den unbenutzen false. Dann Bericht speichern/schließen(bei mir ist/sind das UB) und anschließend wird der Bericht angezeigt.
sieht in etwa so aus - und ist nicht exakt das, was Du brauchst, weil bei mir immer von links nach rechts angezeigt wird, bei dir kann wohl mittendrin eine Lücke sein:

Set rep = Reports!BKreuzAbgabe.Report
rep.RecordSource = "tKreuzAbgabe"
Set rs = CurrentDb.OpenRecordset("tKreuzAbgabe", dbOpenTable)
i = 2
For Each fld In rs.Fields
found(i) = False
If Right(fld.Name, 1) <> "r" And Right(fld.Name, 1) <> "l" Then
m(i) = CLng(fld.Name)
found(i) = True
If m(i) > 0 Then
rep("L" & i).Visible = True
rep("L" & i).Caption = IIf(found(i), m(i - 1) & " - " & fld.Name & " m", "")
rep("T" & i).ControlSource = IIf(found(i), fld.Name, "")
rep("T" & i).Visible = True
'notwendige Breite für UB
t = rep("T" & i).Left + rep("T" & i).Width
End If
i = i + 1
End If
Next fld
Du müßtest aus den Feldbezeichnungen in der Kreuztabelle herauslesen(rechnen), ob 1 Quartal fehlt, und dann im Bericht 'einfach' ein Feld ungebunden lassen mit der entsprechenden Label-Beschriftung