Access-o-Mania

Access-Forum => Bericht => Thema gestartet von: X-ess am September 25, 2017, 15:46:17

Titel: Dynamischen Bericht erstellen
Beitrag von: X-ess am September 25, 2017, 15:46:17
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 (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
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am September 25, 2017, 16:24:23
Läuft der Code denn überhaupt an? Setze einen Haltepunkt in der ersten Zeile. Ist auch eine Ereignisprozedur im Bericht zugewiesen? Siehe Eigenschaftsfenster.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: X-ess am September 25, 2017, 16:34:33
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.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: DF6GL am September 25, 2017, 17:20:12
Hallo,

gibt es die Abfrage qryStatistikAkq_AnzJeMA_Kreuztabelle  überhaupt?


Liefert diese Abfrage überhaupt DS, wenn sie direkt aufgerufen wird?
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Beaker s.a. am September 25, 2017, 17:29:17
Hallo Franz,
Hatte gerade eine ähnliche Antwort auf dem Schirm.
Zitat
Liefert 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
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: X-ess am September 27, 2017, 08:12:35
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.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: DF6GL am September 27, 2017, 09:03:10
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.

Zitat
TRANSFORM 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.:

Zitat
Liefert 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)
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am September 27, 2017, 12:07:30
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.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Beaker s.a. am September 27, 2017, 13:08:27
Hallo Franz,
Zitat
sieht so aus, als wäre es doch ein Thema..
Warum schreibst du dann ?
Zitat
demzufolge 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
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am September 27, 2017, 14:16:02
@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.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Beaker s.a. am September 27, 2017, 15:58:23
Hallo Lachtaube,
Zitat
er 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
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am September 27, 2017, 16:02:49
Dann sage ich es hiermit Franz. :)
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: DF6GL am September 27, 2017, 16:56:22
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

Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am September 27, 2017, 17:17:36
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).
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: DF6GL am September 28, 2017, 08:34:01
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.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am September 28, 2017, 10:26:36
Franz,

im Upload müsste vermutlich noch der Formularparameter gesetzt werden, um an die Feldnamen zu gelangen.

Zum Testen:Sub Test()
   Const DDL As String = _
         "CREATE TABLE t (" & vbLf & _
         "  a TEXT," & vbLf & _
         "  b TEXT," & vbLf & _
         "  c INTEGER);"

   Const APP As String = "INSERT INTO t VALUES ([@a], [@b], [@c]);"

   Const XTB As String = _
         "TRANSFORM AVG(c) AS x" & vbLf & _
         "SELECT a" & vbLf & _
         "FROM   t" & vbLf & _
         "GROUP BY a, b" & vbLf & _
         "PIVOT  b;"

   Dim i&, j&, va, vb

   va = Array("Peter", "Claudia", "Henriette", "Isolde", "Heinz")
   vb = Array("rot", "grün", "gelb", "blau", "weiß", "schwarz", "violett")

   CurrentDb.Execute DDL

   With CurrentDb.CreateQueryDef(vbNullString, APP)
      For i = 0 To UBound(va)
         .Parameters("@a") = va(i)
         For j = 0 To Int(Rnd * 3)
            .Parameters("@b") = vb(Int(Rnd * 5))
            .Parameters("@c") = Int(Rnd * 6) + 1
            .Execute
         Next
      Next
   End With

   CurrentDb.CreateQueryDef "q", XTB
     
   Dim fn$(), f
   
   With CurrentDb.QueryDefs("q")
      ReDim fn(.Fields.Count - 1): i = 0
      For Each f In .Fields
         fn(i) = "[" & f.Name & "]"
         i = i + 1
      Next
   End With
     
   CurrentDb.QueryDefs.Delete "q"
   CurrentDb.Execute "DROP TABLE t;"
     
   MsgBox Join(fn, ", ")

End Sub
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: DF6GL am September 28, 2017, 15:59:50
Hi,

ja ok, danke.
Ich nehme an, das ist getestet...

Es bestätigt ja dann meine Vermutung, das im Query-Object eine statische Definition vorhanden sein muss, ob nun durch die Parameters-Angabe oder durch den In-Ausdruck...

 
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am September 28, 2017, 16:51:54
@Franz,

nein, ganz im Gegenteil - es widerlegt Deine Behauptung. :)
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: X-ess am Oktober 02, 2017, 08:46:06
Schönen guten Morgen,

erfreulich das hier so rege diskutiert wird, schwierig nachzuvollziehen für alle die den Titel Meister oder Guru noch nicht erworben haben ;)

Gibt es einen einheitlichen Konsens bzw. eine Zusammenfassung, wie das Problem am einfachsten gelöst werden kann?
Ich werde mich mit den Anregungen von EUch nochmal dran setzen, der Vorschlag von Ekkehard mit der Function JahresListe scheint ein gangbarer Weg zu sein, wenn ich das Teil so nicht zum Laufen bekomme.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am Oktober 02, 2017, 10:23:23
Du musst Dich nur exakt an eines der drei Beispielberichte halten und den Code in das Berichtsmodul verfrachten. Wobei ich persönlich den Formularparameter eher gegen eine Funktion (http://www.donkarl.com/FAQ/FAQ3TAbfragen.htm#3.15) tauschen würde, um auch unabhängig vom Formular den Bericht nutzen zu können.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: X-ess am Oktober 18, 2017, 10:12:20
Hallo nochmal,
ich bin hier am verzweifeln  :-\


Hat noch jemand einen Plan wie ich hier weiter komme?
Kann ich die Funktion Year(Now()) irgendwie in den SQL-Befehl integrieren? -> In ("Year(Now())-2","Year(Now())-1", ...)
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: X-ess am Oktober 18, 2017, 10:43:27
Ich hatte nun eine zündende Idee: Statt die Überschriften aus der Kreuztabelle abzufragen habe ich diese einfach selbst im VBA-Code generiert. Damit scheint es gut zu laufen.
Ein Thema in Worte zu fassen hilft oft bei der Lösungsfindung.

Vielen Dank.

sJahr = Year(Now())

Set db = CurrentDb
Set qdf = db.QueryDefs("qryStatistikAkq_AnzJeMA_Kreuztabelle")
FieldList = "[KW] as Field0, "
indexx = 1

    For iAnzFelder = 1 To 5
            FieldList = FieldList & "[" & sJahr & "] as Field" & indexx & ", "
            ReportLabel(indexx) = sJahr
'           MsgBox Label(indexx)
        indexx = indexx + 1
        sJahr = sJahr - 1
    Next iAnzFelder
    For i = indexx To 7
            FieldList = FieldList & "null as Field" & i & ","
     Next i
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: PhilS am Oktober 18, 2017, 11:08:12
Set qdf = db.QueryDefs("qryStatistikAkq_AnzJeMA_Kreuztabelle")
indexx = 0
    For Each fld In qdf.Fields
          'Tue etwas
    Next fld
Nur mal so als Anmerkung. Ein QueryDef-Objekt kann in einigen Fällen (z.B. Kreutabellen, Pass-Through) unmöglich die Felder der Ergebnismenge kennen ohne die Abfrage auszuführen.

In diesem Fällen kann man die Felder über das resultierende Recordset ermitteln nachdem die Abfrage ausgeführt wurde.

Ich bin im Moment nicht sicher, ob man in einer MDB/ACCDB auf das Recordset eines Berichtes zugreifen kann um diese zu ermitteln. - Wäre aber einen Versuch wert.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am Oktober 18, 2017, 12:52:54
@PhilS,

es muss explizit kein Recordset für den Zugriff auf die Feldnamen der Kreuztabellenabfrage geöffnet werden! Eine Querydef-Instanz stellt diese (auch in einer Kreuztabellenabfrage ohne fixierte Spaltenüberschriften) zur Verfügung. Selbst der Abfrageentwurf über eine Kreuztabellenabfrage zeigt die dynamischen Feldnamen in der Feldliste an.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: PhilS am Oktober 18, 2017, 14:19:28
es muss explizit kein Recordset für den Zugriff auf die Feldnamen der Kreuztabellenabfrage geöffnet werden!
Danke für den Hinweis. - Du hast recht und das gilt sogar auch für Pass-Through-Abfragen. - Ich bin entsetzt.

Entsetzt deshalb, weil meine Aussage:
Zitat
Ein QueryDef-Objekt kann [...] unmöglich die Felder der Ergebnismenge kennen ohne die Abfrage auszuführen.
ebenso korrekt ist.

Ein "harmloser" Zugriff auf die Fields-Collection führt eine Abfrage bereits aus. - Das kommt für viele sicherlich unerwartet und ist ziemlich schlecht, wenn entweder die Abfrage eine sehr lange Laufzeit hat und/oder (bei Pass-Through-Abfragen) auch DML-Operationen in einer Stored Procedure ausgeführt werden, die man vermutlich nur bei einem expliziten Execute/OpenRecordset tatsächlich ausführen möchte.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Beaker s.a. am Oktober 18, 2017, 15:05:14
Hallo,
Zitat
3.Die Function JahresListe wäre sehr verlockend, funktioniert aber leider nicht -> "Fehlendes Element ( oder ]" bzw. "Syntax-Fehler in TRANSFORM Anweisung"
Das kann aber nicht an der Function liegen, die gibt die gewünschte
Auflistung der Jahreszahlen SQL-konform zurück. Da stimmt was mit
der Abfrage an sich nicht. Eine fehlende Klammer sollte man aber mit
Debug.Print ausfindig machen können.
gruss ekkehard
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 09, 2017, 18:05:45
Hallo Beaker,
ich habe eine Frage zu "Spaltenüberschriften mit Funktion variabel gestalten". Da mein Formular als Ufo leider nicht funktioniert, weil Access dann bei der Kreuztabelle, die die Daten liefert, fixierte Spaltenüberschriften verlangt, könnte der Kniff mit der Funktion die Lösung sein. Das Ufo (Endlos) hat ungebundene Textfelder. Mit .ControlSource (Kombifeld pro Spalte) weise ich den Steuerlelementeinhalt zu. Klappt super. Aber eben nicht wenn ich das Formular als Ufo nutze. Die Spaltennamen sind Abkürzungen z.B. "ZE", "ADB", "DfR";...
Hier mal die SQL-Ansicht von der Abfrage:
PARAMETERS [Formulare]![frm_Kalender]![WJ] Text ( 255 ), [Formulare]![frm_Kalender]![tfldDatum] Text ( 255 );
TRANSFORM Count(qry_Kalender_Wochenübersicht_mt_Kollektionen_01.tAGKDNR) AS AnzahlvontAGKDNR
SELECT IIf([Stunden]="iLdT","iLdT",[Stunden] & ":00") AS h
FROM tab_int_Stunden_Kalender LEFT JOIN qry_Kalender_Wochenübersicht_mt_Kollektionen_01 ON tab_int_Stunden_Kalender.Stunden = qry_Kalender_Wochenübersicht_mt_Kollektionen_01.Stundenkey
GROUP BY tab_int_Stunden_Kalender.Sortierung, IIf([Stunden]="iLdT","iLdT",[Stunden] & ":00")
ORDER BY tab_int_Stunden_Kalender.Sortierung
PIVOT IIf([Kollkürzel] Is Null,"alle",[Kollkürzel]);
Die Abkürzungen [Kollkürzel] werden vom User festgelegt, sind also variabel. Sie stehn in der Tabelle tab_ex_Lieferanten.
Wie muss nun die Funktion aussehen, die einfach nur alle [Kollkürzel] liefert?
Wie bekomme ich die in die Abfrage?
Ich habe keinen vernünftigen Weg gefunden.
Kannst Du hier bitte helfen?
Ich hoffe, ich habe alle nötigen Infos aufgeführt

Danke und LG
jagger
(Access 2016)

Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am Dezember 09, 2017, 21:15:33
Ein Beispiel einer etwas anderen Umsetzung findest Du unter: Variable Bedingung in Kreuztabelle für Unterformular (http://ms-office-forum.net/forum/showthread.php?t=344136)
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Beaker s.a. am Dezember 10, 2017, 17:07:45
Hallo Jagger,
Wenn die Überschriften in einer Tabelle stehen brauchst du keine
Funktion, da reicht eine Unterabfrage.
PIVOT IN (SELECT [Kollkürzel] FROM tab_ex_Lieferanten)Falls die Kürzel in der Tabelle mehrfach auftauchen
PIVOT IN (SELECT DISTINCT [Kollkürzel] FROM tab_ex_Lieferanten)
gruss ekkehard
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 11, 2017, 14:23:03
Hallo Ekkehard,

ich habe beide Varianten ausprobiert (in der SQL-Ansicht der Abfrage eingetragen), aber leider kommt da nur die Meldung: "Syntaxfehler in TRANSFORM-Anweisung"  :-[
Jetzt stehe ich völlig auf dem Schlauch.

Hast Du eine Idee?
LG
jagger



Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Beaker s.a. am Dezember 11, 2017, 15:28:45
Hallo Jagger,
Sorry, da fehlt die Angabe des aggregierten Feldes
PIVOT qry_Kalender_Wochenübersicht_mt_Kollektionen_01.tAGKDNR IN (SELECT DISTINCT [Kollkürzel] FROM tab_ex_Lieferanten)So ganz nebenbei, lesbarer wird es durch die Verwendung
von Alias-Namen für Tabellen/Abfragen.
gruss ekkehard
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 11, 2017, 16:14:41
Hallo Ekkehard,

erst einmal Danke!
Jetzt meckert Access nicht mehr, aber jetzt erhalte ich als Spaltenname:
"SELECT [Kollkürzel] FROM tab_ex_Lieferanten"
PARAMETERS [Formulare]![frm_Kalender]![WJ] Text ( 255 ), [Formulare]![frm_Kalender]![tfldDatum] Text ( 255 );
TRANSFORM Count(qry_Kalender_Wochenübersicht_mit_Kollektionen_01.tAGKDNR) AS AnzahlvontAGKDNR
SELECT IIf([Stunden]="iLdT","iLdT",[Stunden] & ":00") AS h
FROM tab_int_Stunden_Kalender LEFT JOIN qry_Kalender_Wochenübersicht_mit_Kollektionen_01 ON tab_int_Stunden_Kalender.Stunden = qry_Kalender_Wochenübersicht_mit_Kollektionen_01.Stundenkey
GROUP BY tab_int_Stunden_Kalender.Sortierung, IIf([Stunden]="iLdT","iLdT",[Stunden] & ":00")
ORDER BY tab_int_Stunden_Kalender.Sortierung
PIVOT qry_Kalender_Wochenübersicht_mit_Kollektionen_01.tAGKDNR IN (SELECT [Kollkürzel] FROM tab_ex_Lieferanten);

Was mache ich hier falsch?
LG
jagger
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am Dezember 11, 2017, 16:29:43
AFAIK kann in einer IN-Klausel einer Pivot-Anweisung keine Abfrage verwendet werden.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 11, 2017, 17:06:09
AFAIK kann in einer IN-Klausel einer Pivot-Anweisung keine Abfrage verwendet werden.

...das wäre ja nicht schön.  :o
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Beaker s.a. am Dezember 11, 2017, 17:41:04
O.K., hab's nicht getestet; dachte jedoch das schon mal verwendet zu
haben. Wahrscheinlich irgendwas verwechselt.  :-[
Dann eben doch mit einer Function (Luftcode)
Public Function GetKollKuerzel() As String
    Dim sResult As String
    Dim rs as DAO.Recordset

    Set rs = CurrentDb.OpenRecordset _
                         "SELECT DISTINCT[Kollkürzel] " _
                      & "FROM tab_ex_Lieferanten"
    With rs
        Do While Not .EOF
            sResult = sResult & """" & .[Kollkürzel] & ""","
            .MoveNext
        Loop
    End With

    'letztes Komma abschneiden
    sResult = Mid(sResult,1,Len(sResult)-1)
    GetKollKuerzel = sResult

rs.Close
Set rs = Nothing

End Function
In der Abfrage dann
PIVOT qry_Kalender_Wochenübersicht_mit_Kollektionen_01.tAGKDNR IN (GetKollKuerzel())gruss ekkehard
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 11, 2017, 19:46:34
"...    Set rs = CurrentDb.OpenRecordset _
                         "SELECT DISTINCT[Kollkürzel] " _
                      & "FROM tab_ex_Lieferanten"
   ..."
da fehlt ein &?
"...    Set rs = CurrentDb.OpenRecordset _
                      & "SELECT DISTINCT[Kollkürzel] " _
                      & "FROM tab_ex_Lieferanten"
   ..."

Wenn ich die Abfrage aufrufe bekomme ich die Fehlermeldung
"Fehlendes Element, ) oder ] in Abfrageausdruck 'qry_Kalender_Wochenübersicht_mit Kollektionen_01.tAGKDNR IN (GetKollKuerzel()'."
PARAMETERS [Formulare]![frm_Kalender]![WJ] Text ( 255 );
SELECT [qry_Kalender_Stunden_aus_Termine].[tDate], [qry_Kalender_Stunden_aus_Termine].[Stundenkey], [qry_Kalender_Stunden_aus_Termine].[tAGKDNR], tab_ex_Lieferanten.Kollkürzel, tab_ex_Lieferanten.Sortierung
FROM tab_ex_Lieferanten LEFT JOIN qry_Kalender_Stunden_aus_Termine ON tab_ex_Lieferanten.code = qry_Kalender_Stunden_aus_Termine.tKollektionsCode
WHERE (((tab_ex_Lieferanten.[anzeigen Kalender])=True))
ORDER BY tab_ex_Lieferanten.Sortierung;
... Wo könnte hier noch eine ) oder ] fehlen?

Danke!
LG
jagger
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am Dezember 11, 2017, 20:46:05
Die Funktion wird AFAIK in der Pivot-Anweisung auch nicht funktionieren. Man kann allerhöchstens den Sermon aus der Funktion in den Abfragetext schreiben, was ich als unschön empfinde, aber machbar ist.

So, und nun beschreibe bitte einmal genau, wie die Abfrage aussehen soll (und am besten einige Beispiel-Datensätze in Textform mitliefern, damit man sich die Daten nicht aus den Fingern saugen muss).
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 12, 2017, 14:46:32
Hallo Lachtaube,

erst einmal vielen Dank im Voraus für die angebotene Hilfe.
Die Datenbank und auch der Kalender ist für Modeagenturen, die mit Kunden/Einzelhändlern Termine vereinbaren.

Der Kalender (frm_Kalender) zeigt auf der linken Seite wie viele Termine
am jeweiligen Tag (vom 20. bis 26.11.17 gibt es Fake Termine) in der jeweiligen Stunde vergeben sind (iLdT = im Laufe des Tages). So hat man beim weiteren Terminieren schnell einen Überblick, wo noch Platz für einen weiteren Termin ist. Klickt man in eine Spalte, so werden auf der rechten Seite die dazugehörigen Kunden angezeigt. (Kalender01.jpg)

Manche meiner Kollegen möchten allerdings auch noch sehen,
für welche Kollektionen schon Termine vergeben sind.
dazu wollte ich das Formular(frm_Kalender_Uebersicht_Tag_Kollektionen) verwenden. (Kalender02.jpg)

Im Kopbereich über den Spalten kann man jeweils auswählen welche Kollektion (Kollkürzel) angezeigt werden soll. Da ja nun jede Modeagentur andere Kollektionen hat muss diese Sache dynamisch sein.
Mehr als 7 oder 8 Kollektionen/Spalten werden nicht benötigt.
Im LieferantenSetup (hier nicht in der Beispieldatenbank) kann man seine Kollektionen festlegen (Name, Kollkürzel und für jede Kollektion mit dem Colorpicker eine Farbe). Deswegen hier auch der Einsatz eines Formulars (Formatierung).
Wenn man auf der linken Seite in eine Spalte klickt, soll rechts der dazugehörige Tag angezeigt werden (Ist hier noch nicht synchronisiert).
Leider legt Access hier eben eine Hürde in den Weg.
Das Formulau funktioniert und kommt auch ohne fixierte Spaltennamen aus. Nur eben leider nicht, wenn man es als Ufo einbindet.

Ich hoffe, man kann nachvollziehen, was ich erreichen will und wie die Abfrage bzw. deren Ergebis aussehen soll.
So jetzt muss ich nur noch die Beispieldatenbank auf unter 1000KB schrumpfen. Ich melde mich dann später noch einmal.

Mit unheimlich netten Grüßen
jagger
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Beaker s.a. am Dezember 12, 2017, 17:40:41
Hallo Jagger,
Zitat
da fehlt ein &?
Nö, das ist ja der Anfang des Strings.
Zitat
Wenn ich die Abfrage aufrufe bekomme ich die Fehlermeldung
"Fehlendes Element
Vergleiche (zähle die Klammern)
PIVOT qry_Kalender_Wochenübersicht_mit_Kollektionen_01.tAGKDNR IN (GetKollKuerzel())mit
Zitat
'qry_Kalender_Wochenübersicht_mit Kollektionen_01.tAGKDNR IN (GetKollKuerzel()'

@Lachtaube
Zitat
Die Funktion wird AFAIK in der Pivot-Anweisung auch nicht funktionieren.
Nun gut, getestet habe ich es nicht. Zum Einen weil keine DB vorliegt,
die die relevanten Tabellen/Abfragen enthält (oder hab ich die übersehen),
und zum Anderen war ich zu faul ein eigenes Beispiel zu basteln  :-[.
Falls das so ist wie du sagst, muss ich hier dann aussteigen.

gruss ekkehard
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 12, 2017, 18:52:34
Hallo Ekkehard,

Zitat
Nö, das ist ja der Anfang des Strings.
Wenn ich Deinen Code so reinkopiere (also ohne &) wird der Bereich rot angezeigt.
Zitat
Vergleiche (zähle die Klammern)
Im Programm hatte ich das schon richtig eingetragen.

Aber trotzdem, vielen Dank für Deine Bemühungen.

LG
jagger
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 12, 2017, 19:50:41
...oh, ich sehe gerade, man kann hier gar keine zip.dateien anhängen.  :(
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am Dezember 12, 2017, 19:58:54
Natürlich lassen sich hier hier im Forum auch Zip-Archive hochladen.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 13, 2017, 10:23:19
OMG,
Wald, Bäume,...

also hier das Zip-Archiv. In der Kalender_Extr.mdb (Acc.2003)
sind alle Tabellen, Abfragen,... , die mit dem Kalender zu tun haben.
Mit frm_Kalender geht es los. Dann zum Datum 20.11. bis 26.11.17 navigieren.

Vielleicht gibt es ja eine Lösung für das Problem. Die Frage taucht ja oft auf.

LG
jagger
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am Dezember 13, 2017, 11:53:25
Hi Jagger,

oweia, oweia!!! :-[

Die Tabellen gehören dringend in eine gute Normalisierungswerkstatt.

Ansonsten lässt sich das Beispiel auch nicht wie angesagt starten, weil Formularbezüge aus den Abfragen fehlen. :(
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Beaker s.a. am Dezember 13, 2017, 12:09:32
Zitat
Wenn ich Deinen Code so reinkopiere (also ohne &) wird der Bereich rot angezeigt.
Sorry, da fehlt ein Leerzeichen hinter DISTINCT.
Wenn da Luftcode drübersteht sollte man den Code auch schon mal selber
auf solche Fehler überprüfen (können).
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 13, 2017, 12:49:42
Hallo Ekkehard,
Zitat
Wenn da Luftcode drübersteht sollte man den Code auch schon mal selber
auf solche Fehler überprüfen (können).

...können! Das ist ja mein Problem.  :(
Ich bin da nicht so fit. Gelegenheitsbastler eben.
Aber wenn ich das Leerzeichen hinter DISTINCT mache, bleibt der Fehler trotzdem.
Durch das "&" war es nicht mehr rot. Aber leider nicht richtig. :'(
LG
jagger
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 13, 2017, 13:03:37
Hallo Lachtaube,

Zitat

Die Tabellen gehören dringend in eine gute Normalisierungswerkstatt.
Wie meinst Du das? Sind die Tabellennamen nicht gut?

Zitat
Ansonsten lässt sich das Beispiel auch nicht wie angesagt starten, weil Formularbezüge aus den Abfragen fehlen. :(
Bei mir läuft das. Ich kann das ganz normal aufrufen.
Hab die nochmal als .accdb angehängt. Vielleicht ist ja beim Speichern als .mdb was verloren gegangen.

LG
jagger
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Beaker s.a. am Dezember 13, 2017, 13:36:29
Hallo,
Warum watscht mich eigentlich keiner ab, wenn ich solchen Mist verzapfe?  ;)
Der String muss zusätzlich noch in Klammern gesetzt werden
Set rs = CurrentDb.OpenRecordset _
                         ("SELECT DISTINCT[Kollkürzel] " _
                      & "FROM tab_ex_Lieferanten")

Zitat
...können! Das ist ja mein Problem.
Was du aber können solltest ist die Taste F1 zu drücken.
gruss ekkehard
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am Dezember 13, 2017, 13:37:58
Die Funktion IsParent ist nicht definiert (Zeile 37 in Modul_mKalender). fct_Schicht (Zeile 169 in Modul_mKalender) fehlt. Dito für IsLoaded, DoPopup.

Der Rest hat sich geklärt (ich verwende englische Einstellungen).

Der Grund, warum keine Daten angezeigt werden, dürfte in der falschen Parameterdeklaration für das Datumsfeld liegen, welchen Du in der Abfrage als Text ausweist.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 13, 2017, 14:37:29
Hallo Lachtaube,
Zitat
Die Funktion IsParent ist nicht definiert (Zeile 37 in Modul_mKalender). fct_Schicht (Zeile 169 in Modul_mKalender) fehlt. Dito für IsLoaded, DoPopup.

Oops, das kann sein dass da noch diverse Reste von Programmierversuchen rumliegen. Auch habe ich ja die DB ordentlich ausgemistet, um nur das eigentliche "Kalenderzubehör" zu erhalten.
Sorry.  :-[

Na Hauptsache, es läuft jetzt ers einmal.

LG
jagger
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 23, 2017, 11:43:19
Ein fröhliches "Hallo" in die Runde,

da es ja leider keine Lösung für den Einsatz (frm_Kalender_UF_Uebersicht_Tag_Kollektionen)
als UFO gibt habe ich mir gedacht,
das Formular eben als PopUp (Rahmen: Dialog) zu verwenden.
Den Haken bei "Termine pro Kollektion anzeigen" (im frm_Kalender)
rein und das Formular wir angezeigt.

Noch mal kurz zur Erklärung:
Der Kalender (frm_Kalender) zeigt auf der linken Seite wie viele Termine
am jeweiligen Tag (vom 20. bis 26.11.17 gibt es Fake Termine)
in der jeweiligen Stunde vergeben sind (iLdT = im Laufe des Tages).

Klickt man in eine Spalte, so sollen auf der rechten Seite (im frm_Kalender_UF_Uebersicht_Tag_Kollektionen)
die dazugehörigen "Termine pro Kollektion anzeigen" angezeigt.

Wenn man das Formular (im frm_Kalender_UF_Uebersicht_Tag_Kollektionen) öffnet,
zeigt es auch die entsprechenden Daten an.
Leider bekomme ich es nicht hin, dass das Formular beim Datumswechsel (auf der linken Seite)
akzualisiert wird. Ich habe schon viel probiert. .Refresh, .Requery, auch wenn ich die Funktion,
die beim beim Laden des Formulars benutzt wird, ausführe, passiert leider nix.
Er führt die Abfrage (Kreuztabellenabfrage ohne Fixierte Spaltenüberschriften) einfach nicht wieder aus.
Es kommt auch keine Fehlermeldung.
Wenn man der Abfrage Fixierte Spaltenüberschriften zuweist klappt es.
Zum Testen habe ich eine Refresh-Taste eingebaut.
Wenn ich das Formular schließe und gleich wieder öffne funktioniert es auch.

Hat jemand eine Idee, wie man das Formular dazu bringt, sich komplett zu aktualisiern?

Die Beispieldatenbank habe ich angehängt.

Mit besten Grüßen und Dank im Voraus
jagger
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: Lachtaube am Dezember 23, 2017, 14:46:39
Ich habe wie gesagt nur den Parametertyp auf Datum festgelegt. Hier mal die DB, wie ich sie verwendet habe.
Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 23, 2017, 15:58:15
Hallo Lachtaube,

die Synchronisation mit dem UFO "frm_Kalender_UF_Uebersicht_Tag_kurz" (Dein .gif) hat ja bei mir auch schon funktioniert.

Mir geht es darum, dass das PopUp-Formular
"frm_Kalender_UF_Uebersicht_Tag_Kollektionen" synchronisiert wird.
Aber das tut es leider nicht.
Natürlich soll nach jedem Klick in der entsprechenden Datumsspalte auf der linken Seite (bei Datumsänderung), dann das Formular "frm_Kalender_UF_Uebersicht_Tag_Kollektionen" synchronisiert werden.

Bis es eine funzende Lösung geben wird,
benutze ich zum Testen den "refrech-Button".
Also auf den linken Seite das Datum ändern und dann auf den "refrech-Button" klicken. Dann sollte das Formular "frm_Kalender_UF_Uebersicht_Tag_Kollektionen"
aktualisiert werden.
Aber ich finde keine Lösung. Nur eben schließen und wieder öffnen.
Da muss es doch noch eine elegantere Lösung geben.

In meinem Beispiel öffnet es sich, wenn man im "frm_Kalender"
bei "Termine pro Kollektion anzeigen" das Häkchen setzt.
Durch Enfernen des Häkchens wird es wieder geschlossen.
Du hast dort den Code verändert, so dass das nicht mehr funktioniert.

Egal, man kann es ja "per hand" aufrufen.

Es muss doch möglich sein, ein Formular welches eine Kreuztabellen-Abfrage ohne
Fixierte Spaltenübersichten als Datenquelle hat, zu aktualisieren.
Es ist für mich ja schon nicht nachvollziehbar, warum man so ein Formular nicht als UFO verwenden kann.  :o :o :o

Allen Helfern Dank im Voraus.
LG
jagger








Titel: Re: Dynamischen Bericht erstellen
Beitrag von: jagger am Dezember 31, 2017, 13:27:46
Hallo,

ich habe die Lösung gefunden.  :)
Mit Me.RecordSource = "qry_Kalender_Wochenübersicht_mit_Kollektionen_02"
wird das Formular bzw. die Datensatzquelle neu eingelesen.

Danke an alle Helfer.
Einen guten Rutsch!
LG
jagger