PDA

Vollständige Version anzeigen : Bericht, wie Kreuztabelle


bbachmann
05.12.2002, 20:10
Hallo, kann mir noch mal jemand bei einem Berichtsproblem helfen? (Ist so ähnlich wie eine Kreuztabelle aufgebaut)

Abfrage für den Bericht (zur Zeit):
SELECT tab_ErschwernisDatum.Datum,
tab_Erschwernis.Erschwernis_ID,
tab_Erschwernis.PersonalNr,
tab_Erschwernis.Betrag
FROM tab_ErschwernisDatum INNER JOIN tab_Erschwernis ON
tab_ErschwernisDatum.Erschwernis_ID = tab_Erschwernis.Erschwernis_ID;

Kreztabellenabfrage:
TRANSFORM First([tab_Erschwernis].[Betrag])
AS [ErsterWert von Betrag]
SELECT [tab_Erschwernis].[PersonalNr],
Sum([tab_Erschwernis].[Betrag])
AS Summe
FROM tab_ErschwernisDatum INNER JOIN
tab_Erschwernis ON [tab_ErschwernisDatum].[Erschwernis_ID]=[tab_Erschwernis].[Erschwernis_ID]
GROUP BY [tab_Erschwernis].[PersonalNr]
ORDER BY Format([Datum],"yyyy\,mm\,dd")
PIVOT Format([Datum],"yyyy\,mm\,dd");

Im Bericht stehen die Namen der Mitarbeiter wie in der Kreuztabelle untereinander.
Die Spaltenüberschriften sind die Tage des jeweiligen Monats. (1 - 31, egal wieviele Tage der Monat hat)

Als Monatsangabe habe ich im Bericht ein Textfeld mit:
=Format([Datum];"mmm")
Unter dem jeweiligen Tag soll der [Betrag] für den entsprechenden Mitarbeiter ([PersonalNr]) stehen.
Also, wie bekomme ich das, was in der Kreuztabelle
First(tab_Erschwernis.Betrag) AS [ErsterWert von Betrag]
heißt, in die richtigen Berichtsspalten?

Herkunft für das Textfeld (z.B. [Tag25]
=Format([Datum];"\25")
In welchem Zusammenhang die Daten stehen, kann man (glaube ich) an den beiden Abfragen erkennen, oder?
Gruß
Burkhard

bbachmann
05.12.2002, 22:47
<img src="graemlins/lachen2.gif" border="0" alt="[mehr lachen]" /> Ich hab's <img src="graemlins/lachen2.gif" border="0" alt="[mehr lachen]" />

Zum Beispiel für den 12. im Datum:
=Wenn([Tag12]=Tag([Datum]);[Betrag];0)
... und die Nullen mit Bedingte Formatierung unsichtbar gemacht.
Mal schau'n, ob's jetzt auch mit dem Filtern klappt.

Ciao
Burkhard

bbachmann
06.12.2002, 13:35
:( Schade, zu früh gefreut :(
Ich muss meinen Bericht auf eine Kreuztabellenabfrage aufbauen.
Dazu hab ich folgenden Entwurf, der aber nur drei der benötigten Spaltenüberschriften enthält:
TRANSFORM First(qry_Test.Betrag)
AS [ErsterWert von Betrag
SELECT qry_Test.PersonalNr, Sum(qry_Test.Betrag)
AS [Gesamtsumme von Betrag]
FROM qry_Test
GROUP BY qry_Test.PersonalNr
PIVOT IIf(Format([Datum],"dd")=5,"Tag05",
IIf(Format([Datum],"dd")=11,"Tag11",
IIf(Format([Datum],"dd")=15,"Tag15")))
In ("Tag05","Tag11","Tag15");
Ich brauche aber 31 Überschriften , also "Tag01" bis "Tag31"
Hat einer von Euch 'ne Idee, wie man alle Überschriften in die Abfrage einbauen kann, ohne eine ellenlange "Wenn-Kette" zu erzeugen, was Access eh nicht mitmacht?

Gruß
Burkhard

horse79
06.12.2002, 15:20
Hi,

vielleicht wenn Du Dir ne Funktion basteltst die Dir das übernimmt und die Du dann nach dem PIVOT in den Query einbaust? Vielleicht evtl. ein Ansatz, hab ich aber auch noch nicht probiert...

So long

bbachmann
06.12.2002, 18:59
:confused:
... so stelle ich mir das ja auch vor aber von Functionen hab ich ja nun überhaupt noch keinen Schimmer.
Ich hab mal versucht unter Klassenobjekte (und zwar für meinen Bericht) folgende Function zu schreiben: (wahrscheinlich kompletter Unfug)
Public Function x()
x = Format([Datum], "tt")
End Function
In meiner Kreuztabellenabfrage hab ich dann
PIVOT IIf(Format([Datum],"dd")=x,"Tag&x")
In ("Tag1","Tag2","Tag3","Tag4","Tag5",
"Tag6","Tag7","Tag8","Tag9","Tag10",
"Tag11","Tag12","Tag13","Tag14","Tag15",
"Tag16","Tag17","Tag18","Tag19","Tag20",
"Tag21","Tag22","Tag23","Tag24","Tag25",
"Tag26","Tag27","Tag28","Tag29","Tag30","Tag31");
eingegeben.
Haut natürlich nicht hin aber ich hab's versucht.
Burkhard

Nouba
06.12.2002, 19:28
Hallo Burkhard,

lege Dir eine Tabelle mit einem Datumsfeld an, in dem Du alle Tage aufführst, die in XTab erscheinen sollen. In einer Abfrage führst Du diese Abfrage mit der Erschwernistabelle zusammen und erstellst den Join so, dass alle DS aus der Datumstabelle enthalten sind. Solltest Du Parameter verwenden wollen, müssen diese alle explizit hier aufgeführt werden. Auf Basis dieser Abfrage wird die Kreuztabelle erstellt.

HTH

bbachmann
06.12.2002, 22:22
Hallo, ich habe jetzt eine Tabelle mit den Tagen 01 bis 31 als Text angelegt.
Die Tabelle habe ich über das Feld Tag mit qry_Erschwernis verküpft (alle Werte aus tab_Tage)
Tag ist in der Abfrage qry_Erschwernis der Ausdruck Tag: Format([Datum];"tt")
Die Kreuztabellenabfrage aus dieser Basisabfrage:
TRANSFORM First(qry_Erschwernis_Kreuztab_Basis.Betrag) AS [ErsterWert von Betrag]
SELECT qry_Erschwernis_Kreuztab_Basis.PersonalNr,
Sum(qry_Erschwernis_Kreuztab_Basis.[Summe von Betrag]) AS [Summe von Summe von Betrag]
FROM qry_Erschwernis_Kreuztab_Basis
GROUP BY qry_Erschwernis_Kreuztab_Basis.PersonalNr
PIVOT qry_Erschwernis_Kreuztab_Basis.Tag;
funktioniert bis auf mein Kriterium mit dem Feld Datum als Bedingung.
Also, die Abfrage soll eigentlich heißen:
TRANSFORM First(qry_Erschwernis_Kreuztab_Basis.Betrag) AS [ErsterWert von Betrag]
SELECT qry_Erschwernis_Kreuztab_Basis.PersonalNr, Sum(qry_Erschwernis_Kreuztab_Basis.[Summe von Betrag]) AS [Summe von Summe von Betrag]
FROM qry_Erschwernis_Kreuztab_Basis
WHERE (((qry_Erschwernis_Kreuztab_Basis.Datum) Between [Formulare]![frm_Erschwernis]![von] And [Formulare]![frm_Erschwernis]![bis]))
GROUP BY qry_Erschwernis_Kreuztab_Basis.PersonalNr
PIVOT qry_Erschwernis_Kreuztab_Basis.Tag;


[Formulare]![frm_Erschwernis]![von] wird aber nicht als gültiges Feld anerkannt. (und [bis] demnach wohl auch nicht.
Worann kann das denn noch liegen.

Gruß
Burkhard

bbachmann
07.12.2002, 11:55
Hallo (Tschuldigung, ich muss eben noch viel lernen)
Es hat doch noch geklappt, musste halt noch die entsprechenden Parameter unter Eigenschaften eingeben und (weiß nicht warum) die fixierten Spaltenüberschriften neu eintrage.
So muss die Kreuztabelle aussehen:
PARAMETERS [Formulare]![frm_Erschwernis]!
[von] DateTime, [Formulare]![frm_Erschwernis]!
[bis] DateTime;
TRANSFORM First
(qry_Erschwernis_Kreuztab_Basis.Betrag) AS
[ErsterWert von Betrag]
SELECT qry_Erschwernis_Kreuztab_Basis.PersonalNr,
Sum(qry_Erschwernis_Kreuztab_Basis.Betrag) AS Summe
FROM qry_Erschwernis_Kreuztab_Basis
GROUP BY qry_Erschwernis_Kreuztab_Basis.PersonalNr
PIVOT qry_Erschwernis_Kreuztab_Basis.Tag In
("01","02","03","04","05","06","07","08","09","10",
"11","12","13","14","15","16","17","18","19","20",
"21","22","23","24","25","26","27","28","29","30","31");
Ich werde mir wohl mal die Zeit nehmen und mich ein bissche in VBA schlau machen. (Man kommt ja nicht drum herum)

Noch mal besten Dank
und weiterhin gute Zusammenarbeit im Forum
Burkhard