Hallo,
in einer Art "Ausgaben-DB" will ich die Ausgaben möglich simple erfassen, für die Auswertung sollen aber alle Datensätze auf Monats-Ebene harmonisiert werden.
image_2020-11-02_111608.png
Es gibt also Einträge, dessen Werte auf Tages- oder Monatsebene gelten (Lebensmittel, Miete etc.), aber eben auch Jahresbeträge. Für ein ordentliches Reporting hätte ich gern letztere auf die nächsten 12 Monate aufgeteilt.
Geht das? ...idealerweise ohne Makros :-)
Dankeschön
Hallo Tom,
Schaust du hier (https://www.ms-office-forum.net/forum/showthread.php?t=298414)
gruss ekkehard
@Beaker s.a. : Danke für den Hinweis. Sieht vielversprechend aus
Hallo Ekkehard (
@Beaker s.a. ),
das haben wir auch mit VBA gelöst (hmm ... liegt evtl. daran, dass der Kollege von ebay-Kleinanzeigen) ein VBA'ler ist, während ich VBA stets als "Gefummel" und fehleranfällig in Erinnerung habe, während SQL zukunftsweisender wäre und vor allem über Access hinaus Bestand hätte.
Anyways: Wir habe es sogar so gemacht, dass ich flexibel die Anzahl der Monate (Split-Monate) eingeben kann und dementsprechend häufig der Datensatz vervielfältigt wird / geloopt wird.
Hier der Code aus der Demo-DB:
Option Compare Database
Option Explicit
Sub Multi(str_SznerienFreitext)
'Dim = Dimmensionierung (ist immer eine Variable ... Access hat eienen Standardwerte, z.B. "Date")
Dim dbAktuelleDatenbank As DAO.Database
Dim rstObj_betraege As DAO.Recordset
Dim rstObj_betraege_ext As DAO.Recordset
Dim rstObj_tbl_Szenario As DAO.Recordset
Dim iSchleife As Integer
Dim iSzenarien_ID As Integer
Dim D_Dat
Dim dtNewDate
Set dbAktuelleDatenbank = CurrentDb
Set dbAktuelleDatenbank = Application.CurrentDb
Set rstObj_betraege = dbAktuelleDatenbank.OpenRecordset("tbl_betraege") 'Access Datenbank Tabelle
Set rstObj_betraege_ext = dbAktuelleDatenbank.OpenRecordset("tbl_betraege_ext") 'Access Datenbank Tabelle
Set rstObj_tbl_Szenario = dbAktuelleDatenbank.OpenRecordset("tbl_Szenario") 'Access Datenbank Tabelle
rstObj_tbl_Szenario.MoveLast
iSzenarien_ID = rstObj_tbl_Szenario![ID] + 1
rstObj_tbl_Szenario.AddNew
rstObj_tbl_Szenario![ID] = iSzenarien_ID
rstObj_tbl_Szenario![freitext] = str_SznerienFreitext
rstObj_tbl_Szenario.Update
Do While Not rstObj_betraege.EOF
For iSchleife = 1 To rstObj_betraege.Fields("monat")
rstObj_betraege_ext.AddNew
rstObj_betraege_ext![szID] = iSzenarien_ID
rstObj_betraege_ext![ID] = rstObj_betraege.Fields("ID")
rstObj_betraege_ext![art] = rstObj_betraege.Fields("art")
rstObj_betraege_ext![betrag] = Format(rstObj_betraege.Fields("betrag") / rstObj_betraege.Fields("monat"), "0.00")
rstObj_betraege_ext![monat] = rstObj_betraege.Fields("monat")
D_Dat = rstObj_betraege![datum]
dtNewDate = DateAdd("m", iSchleife - 1, D_Dat)
rstObj_betraege_ext![datum] = dtNewDate
rstObj_betraege_ext.Update
Next iSchleife
rstObj_betraege.MoveNext
Loop
MsgBox "Erledigt"
End Sub
Hinweis: Das Feld "Monat" ist NICHT der Kalendermonat, sondern die Anzahl der Split-Monate, also wie häufig der Datensatz vervielfältigt werden soll.
Ach ja, was mich noch begeistert hat, ist, dass das Hochzählen der Monate sehr elegant funktioniert ... so wird aus dem 31.01, dem 30.01. und ggf. dem 29.01. immer der 28.02. ... sehr toll!
Hallo,
Ein paar Anmerkungen zum Code
Set dbAktuelleDatenbank = CurrentDb
Set dbAktuelleDatenbank = Application.CurrentDb
Die erste Zeile reicht (beide machen das gleiche)
rstObj_tbl_Szenario.MoveLast
iSzenarien_ID = rstObj_tbl_Szenario![ID] + 1
Ist so nicht verlässlich. Sieht zwar so aus als ob die ID aufwärts
sortiert ist, kann bei einem RS ohne Sortierung aber auch falsch
sein. Deshalb besser
Set rstObj_tbl_Szenario = dbAktuelleDatenbank.OpenRecordset( _
"SELECT [ID], [freitext] FROM tbl_Szenario ORDER BY [ID]")
gruss ekkehard
VBA versus SQL
VBA (Schleife): Man trägt seine dreißig Bierflaschen und sechzig Wasserflaschen für eine Fete jeweils einzeln aus dem Markt hin zum Auto. (Diesen Vorgang beherrscht intellektuell jeder.)
SQL (Massendatenverarbeitung): Alle Flaschen kommen auf einmal ins Auto (Palette).
Jetzt darf man darüber sinnieren, was einem Spaß macht, was sich als effizient darstellt und derart als sinnvoll darstellt, was einem wirklich Spaß macht, ggf. auch unter Berücksichtigung, dass der Weg vom Markt hin zum eigenen Heim oder zum Grillplatz inmitten der Wildnis verändert könnte.
DateAdd und das Verwerten von Tabellenfeldern klappen in einer Abfrage auch hervorragend.