November 25, 2020, 06:02:59

Neuigkeiten:

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


Aufsplittung eines Datensatz auf 12 Einträge (12-fach Loop?)

Begonnen von tomm85, November 02, 2020, 11:16:38

⏪ vorheriges - nächstes ⏩

tomm85

November 02, 2020, 11:16:38 Letzte Bearbeitung: November 02, 2020, 11:56:36 von tomm85
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.

Sie dürfen in diesem Board keine Dateianhänge sehen.

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

Beaker s.a.

--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

tomm85


tomm85

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!

Beaker s.a.

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
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard