Hallo Leute,
heute Nachmittag habe ich nun Zeit gehabt und ein VBScript-Tool erstellt, mit dem man jetzt einen Jahresvorlauf in Monate o. Quartale aufteilen kann. Sollten bei der Aufteilung in einem Vorlauf keine Buchungssätze vorhanden sein, weil in diesem Zeitraum keine Buchungen erfolgten, wird der Vorlauf automatisch gelöscht.
Vorgehensweise:
Ich habe den Export mit ca. 1000 Buchungssätzen auf einer WTS-Station getestet. Es hat insgesamt nur wenige Sekunden gedauert. Die Daten konnten von mir einwandfrei eingelesen werden und ich habe keine Fehlermeldungen erhalten. Auch die Belegverknüpfungen sollten einwandfrei funktionieren, da diese als GUID-Wert ja vorliegen.
So damit sollte das Thema wohl endlich endgültig der Vergangenheit angehören. Auch für zukünftige Versionen sollte alles funktionieren, da ich immer die gesamten Zeilen auslese, ohne diese zu verändern.
Und hier der Quellcode:
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const DATEVBelegdatum = 9
Const DATEVFibuVon = 14
Const DATEVFibuBis = 15
Dim fs
Dim sFileIn, f
Dim sPathOutput
Dim i, z, q
Dim sFileOut
Dim sLine
Dim sTemp, tArray
Dim sYear, iMonth
Dim sOutputFile
Dim ReadFibu
set fs = createobject("Scripting.FileSystemObject")
If WScript.Arguments.length> 0 Then
sFileIn = WScript.Arguments(0)
Else
If sFileIn="" Then sFileIn=ChooseFile()
If sFileIn="" Then WScript.Quit
End If
sPathOutput=GetPathName(sFileIn)
sFileOut = GetFileNameWithOutExtension(sFileIn)
Dim sChooseExport: sChooseExport=InputBox("Bitte wählen Sie die Exportart aus." & vbNewLine & vbNewLine & " => m = Monat" & vbNewLine & " => q = Quartal","Vorlauf trennen","m")
If sChooseExport="" Then WScript.Quit
If sChooseExport="q" Then
ReDim sOutputFile(3)
Else
ReDim sOutputFile(11)
End If
i=0
Set f = fs.OpenTextFile(sFileIn,ForReading)
Select Case LCase(sChooseExport)
Case "m" 'je Monat
For i = 0 To 11
Set sOutputFile(i)=fs.OpenTextFile(fs.BuildPath(sPathOutput, sFileOut &"_" & FormatExt((i+1),2) & ".csv") ,ForWriting,True,0)
Next
'First Step
'Write Header, erste Zeile Umwandlung Vorlaufdatum
For z = 1 To 2
sLine=f.Readline
If z = 1 Then 'Fibu-Vorlaufdatum
tArray = Split(sLine,";")
sYear = Left(tArray(DATEVFibuVon),4)
For i = 0 To 11
tArray(DATEVFibuVon)=sYear & FormatExt((i+1),2) & "01" 'Monatsanfang
If i=11 Then
tArray(DATEVFibuBis)=sYear & "1231" 'Dezember
Else
tArray(DATEVFibuBis)=sYear & FormatExt((i+1),2) & Day(DateSerial(sYear,(i+2),0)) 'Monats => 0.03.2020 => 29.02.2020
End If
For q=LBound(tArray) To UBound(tArray)
sTemp = sTemp & tArray(q) & ";"
Next
sTemp = Left(sTemp,Len(sTemp)-1)
sOutputFile(i).writeline sTemp
sTemp=""
Next
Else
For i = 0 To 11
sOutputFile(i).writeline sLine
Next
End If
Next
'End First Step
'Second Step
'Lese Fibu-Daten und verteile auf Einzevorläufe
Do Until f.AtEndOfStream
sLine = f.ReadLine
tArray=Split(sLine,";")
iMonth=Right(tArray(DATEVBelegdatum),2)
sOutputFile(CInt(iMonth)-1).writeline sLine
Loop
'End Second Step
'Last Step
'Schließe alle offenen Dateien
For i = 0 To 11
sOutputFile(i).close
If GetNumberOfLines(fs.BuildPath(sPathOutput, sFileOut &"_" & FormatExt((i+1),2) & ".csv")) <= 3 Then fs.DeleteFile(fs.BuildPath(sPathOutput, sFileOut &"_" & FormatExt((i+1),2) & ".csv"))
Next
MsgBox "Alle Buchungssätze wurden monatsweise in einzelne Vorläufe verteilt. Die alle Dateien haben den Zusatz *_MM erhalten und können jetzt importiert werden.",48,"Konvert DATEV-Fibu"
Case "q" 'je Quartal
For i = 0 To 3
Set sOutputFile(i)=fs.OpenTextFile(fs.BuildPath(sPathOutput, sFileOut &"_" & RomanNumber((i+1)) & ".csv") ,ForWriting,True,0)
Next
'First Step
'Write Header, erste Zeile Umwandlung Vorlaufdatum
For z = 1 To 2
sLine=f.Readline
If z = 1 Then 'Fibu-Vorlaufdatum
tArray = Split(sLine,";")
sYear = Left(tArray(DATEVFibuVon),4)
For i = 0 To 3
tArray(DATEVFibuVon)=sYear & FormatExt(((i+1)*3)-2,2) & "01" 'Anfang Quartal
If i=3 Then
tArray(DATEVFibuBis)=sYear & "1231" 'Dezember
Else
tArray(DATEVFibuBis)=sYear & FormatExt(((i+1)*3),2) & Day(DateSerial(sYear,((i+1)*3)+1,0)) 'Ende Quartal => 0.03.2020 => 28.02.2020
End If
For q=LBound(tArray) To UBound(tArray)
sTemp = sTemp & tArray(q) & ";"
Next
sTemp = Left(sTemp,Len(sTemp)-1)
sOutputFile(i).writeline sTemp
sTemp=""
Next
Else
For i = 0 To 3
sOutputFile(i).writeline sLine
Next
End If
Next
'End First Step
'Second Step
'Lese Fibu-Daten und verteile auf Einzevorläufe
Do Until f.AtEndOfStream
sLine = f.ReadLine
tArray=Split(sLine,";")
iMonth=Right(tArray(DATEVBelegdatum),2)
Select Case True
Case iMonth >= 1 And iMonth <= 3
sOutputFile(0).writeline sLine
Case iMonth >= 4 And iMonth <= 6
sOutputFile(1).writeline sLine
Case iMonth >= 7 And iMonth <= 9
sOutputFile(2).writeline sLine
Case iMonth >= 10 And iMonth <= 12
sOutputFile(3).writeline sLine
End Select
Loop
'End Second Step
'Last Step
'Schließe alle offenen Dateien
For i = 0 To 3
sOutputFile(i).close
If GetNumberOfLines(fs.BuildPath(sPathOutput, sFileOut &"_" & RomanNumber((i+1)) & ".csv")) <= 3 Then fs.DeleteFile(fs.BuildPath(sPathOutput, sFileOut &"_" & RomanNumber((i+1)) & ".csv"))
Next
MsgBox "Alle Buchungssätze wurden monatsweise in einzelne Vorläufe verteilt. Die alle Dateien haben den Zusatz *_QQ erhalten und können jetzt importiert werden.",48,"Konvert DATEV-Fibu"
Case Else
MsgBox "Sie haben eine falsche Auswahl getroffen. Erlaubt ist nur je Monat (m) oder je Quartal (q)." & vbNewLine & vbNewLine & "Bitte wiederholen Sie den Vorgang.",48,"Falsche Auswahl Exportart"
WScript.Quit
End Select
'Hilfsfunktionen
'---------------
Function GetPathName(sFilePath)
sFilePath = Replace(sFilePath, "/" , "\")
GetPathName = Left(sFilePath, InStrRev(sFilePath, "\"))
End Function
Function GetFileName(sFilePath)
GetFileName = fs.GetFileName(sFilePath)
End Function
Function GetFileNameWithOutExtension(sFilePath)
GetFileNameWithOutExtension = fs.GetBaseName(sFilePath)
End Function
Function FormatExt(Zahl,Anzahl)
FormatExt= Right(String(Anzahl, "0") & zahl,Anzahl)
End Function
Function GetNumberOfLines(strFile)
Dim ts
Set ts = fs.OpenTextFile(strFile)
ts.ReadAll
GetNumberOfLines = ts.Line
End Function
Function FormatExt(Zahl,Anzahl)
FormatExt= Right(String(Anzahl, "0") & zahl,Anzahl)
End Function
Function RomanNumber(Number)
Dim Result
Select Case Number
Case 1 : Result="I"
Case 2 : Result="II"
Case 3 : Result="III"
Case 4 : Result="IV"
End Select
RomanNumber=Result
End Function
Function ChooseFile()
Set oExec=CreateObject("WScript.Shell").Exec( "mshta.exe ""about:" & "<" & "input type=file id=FILE>" & "<" & "script>FILE.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);" & "<" & "/script>""" )
Tst = oExec.StdOut.ReadAll
Tst = Replace( Tst, vbCRLF, "" )
ChooseFile= Tst
End Function
Den Code einfach kopieren und in eine Textdatei einfügen. Anschließend die Datei umbenennen in z. B. SeparateDATEFibu.vbs, wichtig ist die Extension "VBS".
Ich übernehme keine Verantwortung für Schäden am Datenbestand oder System. Es werden von mir keine Änderungen am System vorgenommen. Anspruch auf Support besteht nicht, stehe aber gerne für Probleme und Fragen hier im Forum zur Verfügung.
Gruß Achilleus
wow @Gelöschter Nutzer ,
ich wusste, dass Ihnen das Thema keine Ruhe lässt.
Ich werde spaßeshalber mal 12 Buchungsstapel, die mir gerade vorliegen, zu einem Jahresstapel zusammenfassen und dann wieder in 12 Monatsstapel aufteilen.
Es werden zusammen wohl so ca 130.000 Buchungssätze sein, wie jedes Jahr.
Also ich habe großen Respekt vor diesem KnowHow.
Ich habe in diesem Bereich das Meiste verlernt durch aktives "unlearning" 😉
*** verneig ***
@Gelöschter Nutzer vielen Dank für dieses großartige Stück Software
Frage / Erweiterungsvorschlag:
Wie reagiert dieses Tool auf erfaßte Leistungsdatums, also Leistung im Juni und Re- Datum im Juli.
Üblicherweise gibt das beim import, wenn nach Re- Datum gesplittet wird Probleme.
Vorschlag. Vorlauf wird nach Leistungsdatum gesplittet und - sollte dieses nicht vorhanden sein, wird das Buchungsdatum gezogen.
Dann gibt es die Amazon- Vorläufe, die im Januar Leistungen vom Dezember beinhalteten.
Hallo Hr. @mkolberg,
der Vorlauf wird immer nach dem Belegdatum getrennt.
Ich habe noch nicht ganz verstanden, wo der Sinn nach der Trennung nach dem Leistungsdatum liegen soll? Und was mache ich mit dem Belegdatum? Soll das überschrieben werden?
In DATEV erhält man für eine Buchung mit einem Leistungsdatum einen Warnhinweis. Diesen kann man IMO einfach löschen, dann wird die Leistung dem aktuellen Vorlauf zugewiesen, was unterjährig wohl sowieso der Regelfall ist.
Gruß Achilleus
Hallo @Gelöschter Nutzer ,
habe mal 12 laaange Monats-Stapel zu einem noch lääängeren Jahres-Stapel zusammengefasst (gesamt: 155.667 Zeilen) und anschließend mit Ihrem Script beim ersten Test in 12 Monats-Stapel und beim zweiten Test in 4 Quartals-Stapel aufteilen lassen.
... Die Aufteilung war jeweils eine Sache von nur wenigen Sekunden 😊
An der Formulierung könnte man vielleicht noch etwas feilen, aber die eigentliche Arbeit ist sehr, sehr schnell erledigt.
Da kann man sich viel früher dem Vergnügen widmen 😄
... verprobt habe ich noch nicht, werde ich aber bei Gelegenheit noch tun
Bravo, @Gelöschter Nutzer !
Danke !
Hallo Hr. @vogtsburger,
vielen Dank für das Feedback. Freut mich zu hören, dass es geklappt hat.
Warum jetzt der Meldetext bei Ihnen verkrüppelt ist, kann ich auf Anhieb gar nicht sagen, bei mir hat es ja geklappt.
Ich werde einmal recherchieren. Ist aber auch "nur ein kleiner" Schönheitsfehler. 😊
Wenn Hr. @mkolberg sich noch einmal meldet, kann ich vielleicht auch sein Anliegen irgendwie lösen.
Gruß Achilleus
PS:
Ich habe auch gerade gesehen, dass der Text für die Aufteilung einer Quartalsbuchhaltung nicht richtig ist.
Es müsste heißen:
MsgBox "Alle Buchungssätze wurden quartalsweise in einzelne Vorläufe verteilt. Alle Dateien haben den Zusatz *_QQ erhalten und können jetzt importiert werden.",48,"Konvert DATEV-Fibu"
Also wer es hier sehr genau nehmen möchte, der möge den Text manuell ändern.
... ich wollte nicht allzu pedantisch sein ...
Die Lehrer und Ingenieure in der Mandantschaft bekommen dieses Script ja nicht zu Gesicht 😄
Übrigens,
dieses Script löst 'im Vorbeigehen' auch noch ein anderes Problem.
Bei ca. 100.000 Buchungssätzen pro Buchungs-Stapel ist nämlich 'Schluss mit lustig' beim Import (Stapelverarbeitung) in REWE.
Auch zu diesem Zweck könnte man mit diesem Script einen überlangen Jahres-Stapel 'mundgerecht' aufteilen.
Ok, falls der Monats-Stapel über 100.000 Buchungssätze hätte, müsste man mit einem Editor 'Hand anlegen' und manuell aufteilen. Im Fall der Fälle wäre das aber auch mit wenigen Handgriffen erledigt.
Man kann es nicht oft genug wiederholen:
Respekt, @Gelöschter Nutzer , dass Sie ein solch schönes Tool mal so eben 'raushauen'. Wow !
Danke für die Blumen. Ich hatte Ihre Anmerkungen aber auch nicht als Kritik aufgefasst. Von daher, alles gut.
Übrigens zu den kryptischen Zeichensatz.
Ich kann da auch gar nichts machen, da es sich um VBSript handelt, habe ich auf den verwendeten Zeichensatz keinen Einfluss, zumindest wüsste ich jetzt nicht wie. Zu der Formulierung, da gebe ich Ihnen aber unumwunden recht. Ich hatte mehrere Formulierungsversuche gehabt. Da bin ich einfach blind geworden. 😁
Gruß Achilleus
... den 'Umlaute-Hieroglyphen' kann man auch bei anderen Gelegenheiten begegnen, z.B. auch bei Autorespondern, bei Empfang und Beantwortung von E-Mails auf unterschiedlichen Geräten etc.
Ich umgehe diese eigentlich banalen Zeichensatz-Problem(chen) bei Bedarf und aus Bequemlichkeit gern mit ae statt ä, oe statt ö, ss statt ß etc.
... ich kommuniziere ja glücklicherweise nicht oft mit militanten Deutsch-Lehrern 😉
Hallo Achilleus,
das Tool ist einfach genial und eine unglaubliche Hilfe. Habe es gerade ausprobiert. Salden verglichen, alles da und keine Differenzen oder Fehlermeldungen. Vielen, vielen Dank.
Viele Grüße aus der Pfalz
Sandra Hasieber
Mega!
Neben meinem Kudo, auch noch ein herzliches Dankeschön!
Beste Grüße
Christian Ockenfels
@Gelöschter Nutzer schrieb:Hallo Hr. @mkolberg,
der Vorlauf wird immer nach dem Belegdatum getrennt.
Ich habe noch nicht ganz verstanden, wo der Sinn nach der Trennung nach dem Leistungsdatum liegen soll? Und was mache ich mit dem Belegdatum? Soll das überschrieben werden?
Das Buchungsdatum bleibt natürlich bestehen.
Die Trennung nach dem Leistungsdatum hat Umsatzsteuerliche, aber auch betriebswirtschaftliche Gründe.
In DATEV erhält man für eine Buchung mit einem Leistungsdatum einen Warnhinweis. Diesen kann man IMO einfach löschen, dann wird die Leistung dem aktuellen Vorlauf zugewiesen, was unterjährig wohl sowieso der Regelfall ist.
Normalerweise haben Sie Recht.
Wofür benötige ich aber das Tool?
der Mandant sendet im Januar- Vorlauf diverse Zeilen mit Leistungsdatum November, Dezember, usw. (also 16% MwSt- Amazon- Umsätze und GB- Vorfälle)
Da kommt der Wunsch auf, den Vorlauf zum Unfall- freien Import vorab zu splitten, natürlich unter Beibehaltung des Belegdatums..
Hallo Hr. @kolberg,
machbar ist Ihr Anliegen schon, zumindest für mich 😁! DATEV würde da wohl etwas länger brauchen. 🤣
Zur Lösung:
Wenn ich Sie richtig verstehe, dann möchten Sie bei einem Leistungsdatum, den Buchungssatz in den Monat mit dem Leistungsdatum, unter Beibehaltung des vollständigen Buchungssatzes, verschieben.
Beispiel:
Belegdatum | Leistungsdatum | |
28.02.2021 | 31.01.2021 | Vorlauf 01/2021 |
28.02.2021 | 01.03.2021 | Vorlauf 03/2021 |
31.01.2021 | 31.12.2020 | Vorlauf 12/2020 |
Habe ich Sie hier richtig verstanden?
Wenn ja, dann ist das nicht weiter schwer.
Umfrage an Alle:
Soll die Erweiterung mit Berücksichtigung Leistungsdatum in das aktuelle Tool integriert werden (ggf. mit Zusatzoption), oder lieber als eigenständiges Tool?
Für eine rege Beteiligung würde ich mich freuen und der Mehrheitsentscheid gilt dann. 😎
Gruß Achilleus
... also ich wäre für einen "Mutanten", also für ein zweites abgewandeltes Tool, aus Gründen der Übersichtlichkeit der Ergebnisse und der 'Lesbarkeit' des Quellcodes.
Es entstehen ja dann evtl. mehrere zusätzliche Buchungs-Stapel ...
Nachtrag:
... und die Reihenfolge der Buchungssätze entspricht nicht mehr der Reihenfolge aus dem Originalstapel.
REWE erwartet ja keinen feste Bezeichnung der CSV-Dateien, außer dem "DTVF_" oder "EXTF_" am Dateianfang. Ein kleiner Zusatz in der Dateibezeichnung (bei der zweiten Variante) wäre hilfreich.
Hallo Hr. @vogtsburger,
theoretisch, bei einer Jahresbuchhaltung wären es im Extremstfall (aber unrealistisch) dann bis 36 Vorläufe. 12 Vorläufe Vorjahr, 12 Vorläufe lfd. Jahr und 12 Vorläufe für Folgejahr.
Aber wie gesagt, das ist eher nur theoretisch.
Gruß Achilleus
Genau so meine ich es, und das darf natürlich ein separates VBS- Script sein.
Wobei sich leider DATEV noch immer damit die Zähne daran ausbeißt, wenn der fleißige Geschäftsinhaber am nächsten Sonntag bereits Rechnungen für seine Leistungen vom Montag vorbereitet druckt und exportiert.
(Rechnungsdatum 28.Feb. für Leistung vom 1. März) Vielleicht liest ja DATEV mit.
Hallo @Gelöschter Nutzer ,
... vielleicht könnten Sie in der Script-Variante "Aufteilung nach Leistungsdatum" ein Protokoll(.txt) mitführen, in dem die Buchungssätze aufgeführt sind, die wegen abweichendem Leistungsdatum in einen anderen Buchungs-Stapel (anderer Monat bzw. anderes Quartal) verschoben wurden.
(... natürlich nur, wenn es nicht zu viele Umstände macht 😉)
Bei Import und Verarbeitung der Buchungs-Stapel in REWE erhält man dann ja keine gelben Hinweis-Symbole mehr.
Aber bis Samstag gibt ihr mir noch Zeit oder? 😁
Danke. Das hier ist Gold und Sie haben mir gerade einen Haufen Arbeit erspart!
Mit freundlichen Grüßen - ein sehr erfreuter Bibu!
... wir wollen ja nicht, dass Sie für 'zu schnelles Programmieren' einen Bußgeld-Bescheid erhalten 😄
@Gelöschter Nutzer
Ich habe Ihr Skript auch mal getestet, funktioniert super, bin echt begeistert.
Damit sparen wir vor allem Zeit beim Import von Fremddaten, z.B. Lexware oder Lexoffice. Dort müssen wir / muss der Mandant sonst 12 x exportieren, damit das bei DATEV in der BWA ordentlich angezeigt wird und nicht alles im Dezember.
Da aus diesen Programmen m.E. kein Leistungsdatum exportiert wird, bin ich mit dem aktuellen Stand zufrieden.
Thomas Günther
@Gelöschter Nutzer ,
... das 'Herauspflücken' der wegen dem Leistungsdatum in andere Buchungsstapel zu verschiebenden Buchungssätze ist ja fast so kompliziert wie das nachträgliche Trennen von Milchkaffee in Kaffee und Milch ...
... was aber aus umsatzsteuerlichen Gründen auch eine hochinteressante Aufgabe wäre 😄
Ich sehe bloß noch ein Problem(chen) bei den Jahres-Stapeln.
Wenn sich das herumspricht, dass Ihr Script so komfortabel ist, kommen plötzlich viel mehr Jahres-Buchungsstapel hereingeflattert ... 😉
... oder die Monats-Stapel werden nochmal zusammengefasst, um sie dann wieder mit Hilfe des Scripts in wenigen Sekunden korrekt aufteilen zu können 😄
Mist ich habe zu spät reagiert, ich hätte vielleicht Lizenzgebühren nehmen sollen. 😂
Frage zum Logbuch:
Reicht folgender Logbucheintrag aus:
BS-Nr | Umsatz | S/H | Konto | GKonto | Belegdatum | Leistungsdatum | Vorlauf
3 | 300,00 | S | 4400 | 10000 | 31.01.2020 | 28.12.2019 | _VJ12
oder soll der ganze Buchungssatz als Eintrag rein? Ich persönlich fände das unnötig.
BS-Nr. wäre dann die Excelzeile in der Originaldatei.
Die Vorlaufdateien würde ich dann wie folgt benennen:
*_LJMM <> *_VJMM <> *_FJMM
lfd. J. <> Vorjahr <> Folgejahr
Für Quartal anlog.
Gruß Achilleus
@Gelöschter Nutzer ,
ja, dieser Logbuch-Eintrag wäre super
... mir geht es in diesem Punkt um die Nachvollziehbarkeit der Änderungen
... ohne ein Logbuch würde ich die Übersicht verlieren
... bin wirklich platt, wie schnell und flexibel Sie beim Programmieren sind ...
Kleine Fische.
Neues Tool kommt aber erst Samstag.
Vielen Dank !
... am Samstag ? ... 🤔😮
.. bei der Datev müsste man jetzt nachfragen: "in welchem Jahr ?" 🤔
Sorry @Datev, diesen Kalauer konnte ich mir jetzt nicht verkneifen 🤐
Hallo Achilleus,
was mache ich falsch? Bei mir kommt bei Anwendung des Tools folgende Meldung:
Gruß Niels Ommen
Könnten Sie mir noch ein paar mehr Infos geben?
Haben Sie denn auch einen DATEV-Vorlauf genommen?
Vielleicht stellen Sie einmal ein Screenshot mit den Headerzeilen ein.
So kann ich wenig dazu sagen. 😏
Gruß Achilleus
... ich meine zu wissen, woran das liegt ....
.... an einem 'Rest' mit einer unvollständigen Buchungszeile bzw keiner 'richtigen' Buchungszeile in der CSV-Datei, sondern irgendein 'Nachtröpfeln'
.. zur Klärung am besten mal einen Screenshot vom Ende des Stapels posten