Neuigkeiten:

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

Mobiles Hauptmenü

Dynamischen Bericht erstellen

Begonnen von X-ess, September 25, 2017, 15:46:17

⏪ vorheriges - nächstes ⏩

X-ess

Hallo,

ich versuche einen dynamischen Bericht zu erstellen und mich dabei an dem Beispiel von rogersaccesslibrary zu orientieren (habe ich in einem anderen Thema hier im Forum gefunden).
http://www.rogersaccesslibrary.com/forum/topic362.html

Mein Problem in der Kurzfassung: In dem Bericht stehen die Jahre in den Spalten, diese sind abhängig vom aktuellen Jahr (aktuelles Jahr + letzte 4 Jahre). Der Bericht muss sich entsprechend anpassen. Die Daten kommen aus einer Kreuztabelle.
Das Beispiel von rogersaccesslibrary scheint sehr hilfreich zu sein, ich hänge nur schon ganz am Anfang:


Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim fld As DAO.Field

Set db = CurrentDb
Set qdf = db.QueryDefs("qryStatistikAkq_AnzJeMA_Kreuztabelle")
indexx = 0
    For Each fld In qdf.Fields
          'Tue etwas
    Next fld


Das Programm läuft gar nicht in die Schleife hinein und ich komme nicht drauf wieso nicht. Das Beispiel von rogersaccesslibrary läuft auch problemlos. Die "Microsoft DAO 3.6 Object Library" habe ich aktiviert, daran lag es auch nicht.

Woran könnte das liegen?

Wenn das gelöst ist mache ich weiter bis zum nächsten Problem  :D

Lachtaube

Läuft der Code denn überhaupt an? Setze einen Haltepunkt in der ersten Zeile. Ist auch eine Ereignisprozedur im Bericht zugewiesen? Siehe Eigenschaftsfenster.
Grüße von der (⌒▽⌒)

X-ess

Der Code läuft wunderbar, überspringt aber einfach diese Schleife. Dadurch bleibt die erstellte Abfrage ohne Inhalt.

Dem Bericht ist noch keine Ereignisprozedur zugewieden, da es vorab nur um die Erstellung der Abfrage geht, die dann als Grundlage für den Bericht dient.
Wie ich das ganze dann in den Bericht bekomme ist eine weitere Hürde.

DF6GL

Hallo,

gibt es die Abfrage qryStatistikAkq_AnzJeMA_Kreuztabelle  überhaupt?


Liefert diese Abfrage überhaupt DS, wenn sie direkt aufgerufen wird?

Beaker s.a.

Hallo Franz,
Hatte gerade eine ähnliche Antwort auf dem Schirm.
ZitatLiefert diese Abfrage überhaupt DS, wenn sie direkt aufgerufen wird?
Ist, glaube ich hier nicht das Thema. Mein Vorschlag wäre gewesen
".Fields.Count" zu prüfen. Wobei ich nicht darüber nachgedacht habe,
ob das (= 0) bei einer vorhandenen Abfrage überhaupt möglich ist.
If qdf.Fields.Count > 0 Then
    'Schleife

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

X-ess

Hallo an alle,

vielen Dank für die Hilfsbereitschaft. Um nicht länger im trüben zu raten habe ich meine Datenbank auf das Minimum beschränkt, um das Problem zu verdeutlichen.

Der alte Bericht (statisch) funktioniert einwandfrei. ABER: Wenn sich die anzuzeigenden Jahre verändern (Spalten), dann funktioniert der Bericht nicht mehr. (Es ist immer ein Mitarbeiter auszuwählen, sonst ist der Bericht leer)
Der neue Bericht soll die anzuzeigenden Spalten aus der Kreuztabelle entnehmen, daraus eine neue Abfrage basteln und diese in den Bericht einfügen (wie bei dem Beispiel, das ich oben verlinkt habe). Wie gesagt hängt es schon am Anfang und ich blicke nicht ganz durch.
Eigentlich wird das Makro beim Öffnen des Berichtes geöffnet, ich habe zum Testen einen Button gemacht.

Über Hilfe bin ich sehr dankbar.

DF6GL

Hallo,

die Kreuztabelle beinhaltet keine fixierten Spaltenüberschriften, demzufolge gibt es zur Zeit der Code-Bearbeitung gar keine Felder.

Versorge  den SQL-String der Kreuztabellenabfrage per VBA mit den aktuellen Überschriften  und drucke damit direkt den Bericht.

ZitatTRANSFORM Count(qryStatistikAkq_AnzJeMA.KW) AS AnzahlvonKW
SELECT qryStatistikAkq_AnzJeMA.KW
FROM qryJahrStatistik LEFT JOIN qryStatistikAkq_AnzJeMA ON qryJahrStatistik.JahrBezeichnung = qryStatistikAkq_AnzJeMA.Jahr
GROUP BY qryStatistikAkq_AnzJeMA.KW
ORDER BY qryJahrStatistik.JahrBezeichnung DESC
PIVOT qryJahrStatistik.JahrBezeichnung In ("2013","2014","2015","2016","2017");

Der weitere  damit zusammenhängende Code könnte entfallen.



@Beaker s.a.:

ZitatLiefert diese Abfrage überhaupt DS, wenn sie direkt aufgerufen wird?

Ist, glaube ich hier nicht das Thema

sieht so aus, als wäre es doch ein Thema..   ;) :) :) :) 8)

Lachtaube

Du hast den Ablauf nicht verstanden. Setze Haltepunkte in Rogers Beispiel, blende das Lokalfenster ein und arbeite Schritt für Schritt die Anweisungen beobachtend ab.

Der Einsprungspunkt findet sich im beim Öffnen Ereignis des Berichts, damit das lokale Datenfeld (Array) ReportLabel die richtigen Überschriften erhält und die lokale Funktion FillLabel auch das Datenfeld mit den Überschriften findet.

Und die Dimensionierung des Datenfelds ReportLabel muss nicht größer als die Anzahl der gebundenen Steuerelemente im Bericht - 1 sein.
Grüße von der (⌒▽⌒)

Beaker s.a.

Hallo Franz,
Zitatsieht so aus, als wäre es doch ein Thema..
Warum schreibst du dann ?
Zitatdemzufolge gibt es zur Zeit der Code-Bearbeitung gar keine Felder.
Ich hatte aus dem Code entnommen, dass eine Fields-Auflistung
abgearbeitet werden soll. Und da interessiert mich erstmal nicht
ob DS vorhanden sind.

@x-ess
In ("2013","2014","2015","2016","2017")
Die Liste zwischen den Klammern kannst du mit einer öffentlichen
Function auch variabel gestalten.
Prinzip (Luftcode):
Public Function JahresListe(RefJahr As Integer, Vorlauf As Integer, Nachlauf As integer) As String
   
    Dim z As Integer
    For z = RefJahr - Vorlauf To RefJahr + Nachlauf
        JahresListe = JahresListe & """" & z & ""","
    Next z
    'letztes Komma abschneiden
    JahresListe = Mid(JahresListe,1,Len(Jahresliste)-1)

End Function

In die Abfrage eingebaut
... IN (JahresListe(2017,2,3))
ergibt das die Jahre 2015 - 2020

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

@Ekkehard,

er will und braucht doch gar keine fixierten Spaltenüberschriften in der Kreuztabelle. Das Prinzip aus Rogers Beispiel funktioniert nun schon seit ca. 20 Jahren, wenn man es nur richtig anwendet. Zugegeben, man kann den Code noch etwas aufpolieren. Speziel für den Fall, wenn mehr Spalten in der Abfrage geliefert werden, als Steuerelemente vorhanden sind.
Grüße von der (⌒▽⌒)

Beaker s.a.

Hallo Lachtaube,
Zitater will und braucht doch gar keine fixierten Spaltenüberschriften in der Kreuztabelle
Sag das Franz  ;).
Darüber ob fixierte Überschriften nötig sind habe ich mir keine Gedanken
gemacht. Das verlinkte Beispiel habe ich mir nicht angeschaut.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

Grüße von der (⌒▽⌒)

DF6GL

Hallo,
na, dann sag ich Euch was   ;) :D ;D


Meine Ausführungen haben sich auf den betreffenden Codeteil in der geposteten  Beispiel-Db bezogen.  Dort wird die Field-Auflistung nur durchlaufen, wenn es fixierte Spaltenüberschriften in der Kreuztabellenabfrage gibt.  Weitere Untersuchen, speziell des "Roger"-Beispiels (was ich nicht kenne), hab ich nicht angestellt.  :P


Lachtaube

Franz, so könnte man glauben - so ist es aber nicht. Die Access-/Jet-Engine stellt trotzdem im Querydef die Namen zur Verfügung (was dabei im Hintergrund geschieht,  ist wohl undokumentiert, aber bestimmt keine Magie).
Grüße von der (⌒▽⌒)

DF6GL

#14
Hallo ,

nun, mein durchgeführter Test hat eben dies gezeigt, dass (in der besagten DB beim entspr. Code-Fragment)  die .Fields -Auflistung/Eigenschaft nur dann existiert, wenn die mit set x = db.Querydefs.....  angesprochene Kreuztabellenabfrage definitiv fixierte Überschriften besitzt, ansonsten nicht.   Ich stelle mir das so vor, als dass die KT-Abfrage durch die Objektreferenzierung nicht ausgeführt wird und somit keine dynamischen Überschriften (Felder) erzeugt.  Vielleicht wird ja in den funktionieren "Roger"-Codes nicht eine KT-Abfrage als solche, sondern eine temporäre Ergebnis-Tabelle referenziert oder aber die KT-Abfrage in irgendeiner Weise vorab ausgeführt.

Magie ist es sicher nicht,  aber man weiß ja nie, was MS bei den einzelnen A-Versionen im Hintergrund alles anstellt. Will sagen: Vielleicht hängt das Ganz ja auch von der verwendeten A-Version ab.   (bei mir A2010)


Ich bin aber natürlich offen für einen gegenteiliges Beispiel    8) :)


PS:

Statt set querydefs könnte auch ein Recordset mit der KT-Abfrage (ohne fixierte Spalten)  geöffnet werden und dessen Felder durchlaufen werden.  Vermutlich wird das funktionieren, weil eben der Recordset ein Ausführen der SQL erfordert.