Neuigkeiten:

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

Mobiles Hauptmenü

Kosten auf drei Spalten aufteilen

Begonnen von T417, Juni 21, 2010, 14:39:30

⏪ vorheriges - nächstes ⏩

T417

Folgendes Problem: Ich muss die Endkosten in einen Unterformular auf drei Spalten aufteilen. Je nachdem ob diese Endkosten dieses Jahr, letztes Jahr, oder vorletztes Jahr angefallen sind.
Ich komme auf keine funktionierende Lösung, ich scheitere immer an den Nachteilen eines Endlosformulares.

Irgendwelche Fragen oder Vorschläge?
Arbeite normalerweise mit Access 2000/2003
In letzter Zeit häufiger mit Access 2007

Sowohl auf WinXP als auch auf Win7

Wurliwurm

Das kommt auch darauf an, wie die Quelltabelle für die "Endkosten" aussieht. Wenn hier z.B. die Buchungen untereinander sind, aber das ganze quer dargestellt werden soll, kommst Du mit SQL alleine nicht weiter.

Ich habe solche Anforderungen immer damit gelöst, daß ich eine eigene Reportingtabelle habe und diese mit VBA fuelle.

Tabellenstruktur für die Reportingtabelle entspricht dem Endlosformular, etwa:
-Schlüsselwerte, texte...
-Spalte vorvorjahr
-Spalte vorjahr
-Spalte aktjahr

Die Reportingtabelle wird etwa mit aggregierten SQL (GROUP BY Jahr, Endkosten...) in einer Schleife gefüllt. Dabei Fallunterscheidung:

if rs!Jahr = intJahr then
   update tblReporting set endkosten = endkosten + rs!Kosten
elseif rs!Jahr = (intJahr - 1)
  update tblReporting set endkosten_vj = endkosten_vj + rs!Kosten
else
  update tblReporting set endkosten_vvj = endkosten_vvj + rs!Kosten
end if

Oder so ähnlich. Jedenfalls ist das etwas aufwendiger und für Fortgeschrittene, da man es nicht zusammenklicken kann, aber gehen tut es auf jeden Fall. Wenn Du etwas mehr Details zu deinem Problem lieferst, kann ich auch detaillierter antworten.


T417

Hmm. Ich bin jetzt soweit, das ich mir eine seperate Tabelle gebastelt habe, indem ich versuche mittels den UPDATE-Befehl mir die Endkosten in drei neuerstellte Spalten aufzuteilen.
Deine Anregung hat mich auf die richtige Spur gebracht, aber irgendein Fehler ist bei mir noch drin.
Arbeite normalerweise mit Access 2000/2003
In letzter Zeit häufiger mit Access 2007

Sowohl auf WinXP als auch auf Win7

MzKlMu

Hallo,
ZitatWenn hier z.B. die Buchungen untereinander sind, aber das ganze quer dargestellt werden soll, kommst Du mit SQL alleine nicht weiter.
Das sehe ich nicht so. Mit einer Kreuztabellenabfrage sollte sich das reativ einfach darstellen lassen.
Für Kreutztabellenabfragen gibt es einen Assistenten.
Gruß Klaus

Wurliwurm

Ich habe eine Vermutung, wo der Fehler liegen könnte (wenn Du meinen Lösungsweg realisieren willst und nicht Pivot-Tabellen bzw. Kreuztabellen nützen willst).

Du mußt erst eine leeres Gitter Struktur mit lauter 0-werten (kein NULL) aufbauen und dann erst die Werte füllen. Das "Gitter" mußt Du deshalb vorher aufbauen, weil bei der gruppierten Abfrage nicht alle Zellen vorkommen.

Angenommen, du hast folgende Zahlen
2008 Kostenstelle A Kostenart X 1000.-
2009 Kostenstelle A Kostenart Y 1000.-
2009 Kostenstelle A Kostenart Y   500.-
2010 Kostenstelle A Kostenart Y 1000.-
2010 Kostenstelle B Kostenart X 1000.-


Einfaches Struktur-Beispiel für die Reportingtabelle (Normalisierung ist hier kein Thema!)
-Kostenstelle
-Kostenstellenbezeichnung
-Kostenart
-Kostenartenbezeichnung
-Kosten_aktJahr
-Kosten_aktJahr
-Kosten_vJahr
-Kosten_vvJahr

Dann mußt die das Gitter etwa aufbauen mit:
(Vorher alles rauslöschen mit DELETE FROM...)

SELECT <attribute>, Sum(Kosten) from meineQuelle
group by <attribute>, Sum(Kosten)
where Jahr between(2008) und (2010)

Wichtig: Das Jahr rauslassen bei der Gruppierung!

Dann diese Abfrage in einer Recordset-Schleife in die Reportingtabelle schreiben, entweder mit Recordset und rs.addnew oder mit insert-Befehlen, etwa
INSERT INTO tblReport VALUES (rs!Kostenstelle, rs!Kostenstellenbez, Kostenart, Kostenartenbez, 0, 0, 0)

Gitter als Ergebnis:
Kostenstelle A Kostenart X 0,00 0,00 0,00
Kostenstelle A Kostenart Y 0,00 0,00 0,00
Kostenstelle B Kostenart X 0,00 0,00 0,00

Dann hättest Du ein leeres Gitter, was Du dann in einer weiteren Schleife mit (wie oben beschrieben mit Werten füllst.

Wenn du das ein bißchen modular aufbaust und parametrisiert, ist das m.E. eine gute Lösung, die auch wiederverwendbar ist.

T417

Ich habe da unter Umständen eine einfachere Lösung.
Gib mir nur mal schnell nen Tipp wo mein Denkfehler ist:
Kann ich nicht einfach mit UPDATE die Spalte kopieren?
CurrentDb.Execute ("UPDATE Mitteltabelle SET Kosten02 = Endkosten")
Klappt nicht.
Arbeite normalerweise mit Access 2000/2003
In letzter Zeit häufiger mit Access 2007

Sowohl auf WinXP als auch auf Win7

Wurliwurm

Weiß nicht warum es nicht klappt, syntaktisch ist das SQL richtig...

T417

Ich kapierts auch nicht. Ich habs nochmal ausprobiert und es klappt jetzt.
Samt Auswahl nach Jahren.WHERE "'& Year(Now)&'"=Year(Datum)

Gestern hatte ich identischen Code und es hat nicht geklappt. :-\

Na was solls, das Ergebnis zählt. :)
Arbeite normalerweise mit Access 2000/2003
In letzter Zeit häufiger mit Access 2007

Sowohl auf WinXP als auch auf Win7


T417

WHERE '" & Year(Now()) & "'=Year(Datum)

Oh, sorry, Schreibfehler. Ich habe die Anführungstriche mit den Hochkommas beim abschreiben vertauscht.
Den Fehler hab ich aber nicht gestern gehabt.
Arbeite normalerweise mit Access 2000/2003
In letzter Zeit häufiger mit Access 2007

Sowohl auf WinXP als auch auf Win7

DF6GL

Hallo,


WHERE '" & Year(Now()) & "'=Year(Datum)


naja, das ist doch auch nicht koscher, es fehlt mindestens ein Gänsefuß am Ende.


"Ausgeschrieben" würde der z. B. so heißen:

... Where '2010' = 2009
Dieser Audruck bringt sehr wahrscheinlich einen Datentyp-Fehler..wenn nicht, liefert der Vergleich falsches Ergebnis

Esa wird ein Text ('2010')  mit einer Zahl (2009) verglichen.


Wobei es IMMER SINNVOLL wäre, den KOMPLETTEN  Code/SQL- Ausdruck zu posten.

Es ist nervend, immer wieder Rückfragen zum Rest des Codes stellen zu müssen .. :'( 


T417

Da ich den ersten Teil schon oben reingeschrieben habe, hab ich gedacht der Rest ist logisch.
Also gut:CurrentDb.Execute ("UPDATE Mitteltabelle SET Kosten02 = Endkosten WHERE '" & Year(Now()) & "'=Year(Datum)")

Und der Code klappt problemlos, liefert weder das falsche Ergebnis noch einen Fehler. Auch als INSERT INTO - Anweisung.
Arbeite normalerweise mit Access 2000/2003
In letzter Zeit häufiger mit Access 2007

Sowohl auf WinXP als auch auf Win7

DF6GL

Hallo,

na gut, dann ist vermutlich die Jet-Engine so schlau und sorgt für eine interne Typ-Konvertierung ...

Schreib mal interessehalber und zum Test:


CurrentDb.Execute ("UPDATE Mitteltabelle SET Kosten02 = Endkosten WHERE '" & Year(Now()) & "'=Year(Datum)", dbfailonerror)

und auch mal so:

CurrentDb.Execute ("UPDATE Mitteltabelle SET Kosten02 = Endkosten WHERE Year(Datum) ='" & Year(Now()) &"'" , dbfailonerror)

Wie auch immer , der Vergleich ist fehlerhaft und birgt latente Fehlersituationen.

T417

#13
Laufzeitfehler '3075':
Syntaxfehler(Komma) in Abfrageausdruck ''2009'=Year(Datum),dbfailonerror'.

Ich glaube nicht das das der Fehler war den du meintest.

Ich denke die Jet-Engine wird das standartmäßig übergehen. Zum anderen bin ich mir auch nicht sicher ob das überhaupt anders möglich ist.
Arbeite normalerweise mit Access 2000/2003
In letzter Zeit häufiger mit Access 2007

Sowohl auf WinXP als auch auf Win7

DF6GL

Hallo,

doch, sowas habe ich erwartet, zwar nicht den Komma-Fehler, sondern einen Typ-Fehler, aber vermutlich kann nach der Where-Klausel nicht direkt ein Literalstring folgen. Wie auch immer, die Jet-Engine übergeht da nichts, ohne dbfailonerror wird lediglich keine Fehlermeldung ausgegeben, ob nun die SQl ausgeführt wird oder nicht.


Hast Du das zweite Execute auch mal getestet?