Im alten Forum gab es dieses kleine Tool von mir für die Verarbeitung von DTAUS- Dateien. Wenn man nach Freeware für DTA in google suchte, war der erste Treffer dieses Tool. Nun ist es leider aus der Trefferliste verschwunden. Deshalb(und weil ich nicht mehr daran glaube die Scripte aus dem alten Forum hier zu sehen) stelle ich es hier erneut ein.

DTA-Tool(Free-CSV-DTA)
Wer regelmäßig große Mengen von Lastschriften erstellen muss(etwa Vereine) hat es meist nicht leicht. Es gibt zwar das dta-Format, aber Tools dafür sind eigentlich immer kostenpflichtig.
Deshalb habe ich für unseren Verein ein eigenes Tool geschrieben und wir benutzen es schon einige Jahre um die erstellte dta-Datei anschließend in StarMoney zu importieren. Es sollte aber auch auf klassische Art und Weise(also Übergabe an Bank) funktionieren.
Wozu ist das Tool zu gebrauchen?
* erstellt aus einer csv- oder Exceldatei eine dta-Datei mit Sammellastschriften(oder Gutschriften)
* Belegzettel für dta-Erstellung
* dta-Dateien lassen sich ins csv- oder Excelformat exportieren(DTA2CSV)



Free-CSV-DTA.exe (letzte Änderung 02.05.2013)
ACHTUNG!
KEINE Garantie für irgendwas!
Spoiler
/* Dank an: SafeArray. By Learning one. Beschreibung: Tool zur Erstellung von Sammellastschriften aus CSV-Dateien erstellte Dateien mit StarMoney 7.0 getestet ; ------------------------------Änderungen--------------------------------------- * (Version 0.79) 20:34 Mittwoch, 1. Mai 2013 * Erweiterung auf 8 Verwendungszwecke (noch nicht für DAT2CSV) * (Version 0.78) 01:15 Dienstag, 6. März 2012 * Anpassung C-Satzlänge(Danke Kennichnix) * * (Version 0.77) 23:53 Samstag, 18. Februar 2012 * Excel-Quellen sind nun auch zulässig * * (Version 0.76) 15:43 Donnerstag, 16. Februar 2012 * Musterdaten werden nun bei vorhandenem Excel direkt dort angeboten(keine Probleme mit führenden Nullen mehr beim Import in Excel) * auch der Export landet direkt in Excel(vorrausgesetzt Excel ist installiert) * * (Version 0.7)22:44 Samstag, 12. Februar 2011 * kleine Schönheitskorrekturen(Guibreite,Kommentare...) * Fehler bei Tabreihenfolge der column * * (Version 0.6)22.31 Uhr Donnerstag, 21. Oktober 2010 * fehlerhafte Gui,Buttons fehlten(thx quiclic) * * (Version 0.5)10.34 Uhr Mittwoch, 14. Oktober 2009 * Pfad zur Icon-Datei angepasst(Danke 'aaffe') * (Version 0.5)00.36 Uhr Montag, 12. Oktober 2009 * Export von dta(Lastschrift) in csv * Gutschrift bei dta-Erstellung hinzugefügt * Anzahl der gefundenen Lastschriften und Summe Betrag in CSV als Anzeige in Gui * (Version 0.4)02.10 Uhr Freitag, 09. Oktober 2009 * !NEUE! CSV-Datei als Basis * Möglichkeit verschiedener Begünstigter,im Startfenster wird nun nur noch der Auftraggeber eingetragen * code etwas gestrafft und kommentiert * (Version 0.3)15:50 Dienstag, 2. Juni 2009 * Betrag mit Punkt und Komma auswerten * Explorer.exe mit erstellter Datei öffnen * (Version 0.2)21:43 Montag, 1. Juni 2009 * Belegzettel hinzugefügt * Zähler für Edit hinzugefügt * Hotkeys hinzugefügt Limits: momentan werden nur bis zu 4 Verwendungszwecke verarbeitet andere Erweiterungstypen als Verweendungszweck werden momentan nicht unterstützt nur EURO als Währung unterstützt */ #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. SendMode Input ; Recommended for new scripts due to its superior speed and reliability. SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. #SingleInstance force ; ------------------------------------------------------------------------------ ; ------------------------------------------------------------------------------ if A_IsCompiled FileGetVersion, vv, %A_ScriptName% Else IniRead, vv, %A_ScriptName%, VERSION, File_Version, 0 ver = (Version %vv%) SplitPath, A_ScriptFullPath, , , , OutNameNoExt, ini = %A_ScriptDir%\%OutNameNoExt%.ini summe_blz = 0 summe_ktn = 0 summe_betrag = 0 ; ------------------------------------------------------------------------------ If A_ScreenWidth < 900 { MsgBox, 0, , Auflösung(%A_ScreenWidth%) auf deinem Computer ist leider zu klein!`nAbbruch! ExitApp } ; ------------------------------------------------------------------------------ Menu, Tray, Icon, %A_Windir%\system32\shell32.dll, 195, 1 Menu, Tray, NoStandard Menu, Tray, add, Exit, abbruch Gosub, inir try { oExcel := ComObjCreate("Excel.Application") } Gui, 2:Color, F4F3FF Gui, 2:font, s10, Verdana Gui, 2:add, text, x10 y25 w90, Name Gui, 2:add, edit, x+5 w200 R1 vktn_inhaber gedit_prüfen, % sonderzeichen(ktn_inhaber) Gui, 2:add, text, x+5 w200 vedit_zähler, % StrLen(ktn_inhaber) " von 27 Zeichen" Gui, 2:add, text, x10 w90, Kontonummer Gui, 2:add, edit, x+5 w200 vktn_beg, %ktn_beg% Gui, 2:add, text, x10 w90, BLZ Gui, 2:add, edit, x+5 w200 vblz_beg, %blz_beg% Gui, 2:add, text, x10 y+40, Pfad zur CSV-Datei Gui, 2:font, s7, Verdana Gui, 2:add, edit, x10 w600 R1 H10 vcsv_pfad, %csv_pfad% Gui, 2:font, s10, Verdana Gui, 2:add, Button, x+5 gsfile, ... Gui, 2:add, text, x10 y+10, Pfad zur DTA-Datei Gui, 2:font, s7, Verdana Gui, 2:add, edit, x10 w600 R1 H10 vdta_pfad, %dta_pfad% Gui, 2:font, s10, Verdana Gui, 2:add, Button, x+5 gsfile_dta, ... Gui, 2:add, Checkbox, % "x10 y+10 vCheck_gutschrift Checked" (gutschrift = "L" ? 0 : 1), !Gutschrift! Gui, 2:add, Button, x10 y+35 w90 h30 Default gweiter, &Weiter Gui, 2:add, Button, x+5 w90 h30 gabbruch, A&bbruch Gui, 2:add, Button, x+5 w90 h30 gdta2csv, DTA2CSV Gui, 2:add, Button, x+195 w90 h30 gmuster, Muster-CSV Gui, 2:add, GroupBox, x5 y5 w650 h120 , Konto des Auftraggebers Gui, 2:add, GroupBox, x5 y130 w650 h180 , Einstellungen Gui, 2:show, , %OutNameNoExt% by @fredchf for PHC %ver% Return ; ------------------------------------------------------------------------------ weiter: Gui, Submit, NoHide Gosub, plau If ungültig { Gui +OwnDialogs MsgBox, %fehlertext% Return } ; ------------------------------------------------------------------------------ IfExist, %dta_pfad% { Gui +OwnDialogs MsgBox, 33, , DTA-Datei Existiert bereits`,überschreiben? IfMsgBox, Cancel Return } ; ------------------------------------------------------------------------------ Gosub, iniwr gui_width = 190 LV_width := A_ScreenWidth - 100 Gui, 2:Destroy Gui, Color, F4F3FF Gui, add, text, x5 w%gui_width%, Name des Auftraggebers: Gui, add, text, x+5 w%gui_width%, %ktn_inhaber% Gui, add, text, x+5 w%gui_width%, Anzahl der Datensätze: Gui, add, text, x+5 w%gui_width% vgui_anz, 0 Gui, add, text, x5 y+5 w%gui_width%, BLZ: Gui, add, text, x+5 w%gui_width%, %blz_beg% Gui, add, text, x+5 w%gui_width%, Summe(€): Gui, add, text, x+5 w%gui_width% vgui_betr, 0 Gui, add, text, x5 y+5 w%gui_width%, Konto: Gui, add, text, x+5 w%gui_width%, %ktn_beg% Gui, add, ListView, x5 R20 y+5 W%LV_width% +Grid, % "Name des " (Check_gutschrift = 1 ? "Zahlenden" : "Begünstigten") . "|BLZ des " (Check_gutschrift = 1 ? "Zahlenden" : "Begünstigten") . "|Kto des " (Check_gutschrift = 1 ? "Zahlenden" : "Begünstigten") . "|Name des " (Check_gutschrift = 0 ? "Zahlenden" : "Begünstigten") . "|Kto-Nummer des " (Check_gutschrift = 0 ? "Zahlenden" : "Begünstigten") . "|BLZ des " (Check_gutschrift = 0 ? "Zahlenden" : "Begünstigten") . "|Betrag|Verwendungszweck 1|Verwendungszweck 2|Verwendungszweck 3|Verwendungszweck 4|Verwendungszweck 5|Verwendungszweck 6|Verwendungszweck 7|Verwendungszweck 8" Gui, add, Button, y+5 x5 +Default gok, OK`,Daten sind k&orrekt! Gui, add, Button, yp x+5 gabbruch, A&bbruch Gui, add, text, yp x+15 , Abbruch jederzeit mit ESC csv_string = if OutExtension = csv FileRead, csv_string, %csv_pfad% Else csv_string := excel2string(csv_pfad) Loop, Parse, csv_string , `n, `r { If (A_Index = 1 or StrLen(A_LoopField) < 10) Continue line = %A_LoopField% csv_anzahl++ Loop, Parse, line, `;, %A_Space%%A_Tab% { If A_Index = 1 begünstigter_name = %A_LoopField% If A_Index = 2 begünstigter_blz = %A_LoopField% If A_Index = 3 begünstigter_kto = %A_LoopField% If A_Index = 4 zahlender_n = %A_LoopField% If A_Index = 5 KntNummer = %A_LoopField% If A_Index = 6 BLZ = %A_LoopField% If A_Index = 7 { Beitrag = %A_LoopField% StringReplace, Beitrag, Beitrag, `,, ., All csv_betrag += Beitrag ; ToolTip, % Beitrag ; Sleep, 100 If !RegExMatch(Beitrag, "\d+\.\d{2}", Un) { MsgBox, Beitrag muss im Format ddd,dd vorliegen.`naktuell: %Beitrag% ExitApp } } SetFormat, Float, 6.2 Beitrag += 0.0 If A_Index = 8 Verwndgszweck1 = %A_LoopField% If A_Index = 9 Verwndgszweck2 = %A_LoopField% If A_Index = 10 Verwndgszweck3 = %A_LoopField% If A_Index = 11 Verwndgszweck4 = %A_LoopField% If A_Index = 12 Verwndgszweck5 = %A_LoopField% If A_Index = 13 Verwndgszweck6 = %A_LoopField% If A_Index = 14 Verwndgszweck7 = %A_LoopField% If A_Index = 15 Verwndgszweck8 = %A_LoopField% } StringReplace, Beitrag, Beitrag, ., `,, All LV_Add("" ,begünstigter_name ; 1 ,begünstigter_blz ; 2 ,begünstigter_kto ; 3 ,zahlender_n ; 4 ,KntNummer ; 5 ,BLZ ; 6 ,Beitrag ; 7 ,Verwndgszweck1 ; 8 ,Verwndgszweck2 ; 9 ,Verwndgszweck3 ; 10 ,Verwndgszweck4 ; 10 ,Verwndgszweck5 ; 10 ,Verwndgszweck6 ; 10 ,Verwndgszweck7 ; 10 ,Verwndgszweck8) ; 11 } ; LV_ModifyCol() Gui, show, , Frage:Sind die Daten korrekt? %OutNameNoExt% by @fredchf for PHC %ver% GuiControl, , gui_anz, %csv_anzahl% GuiControl, , gui_betr, %csv_betrag% Return ; ------------------------------------------------------------------------------ ok: Gui, Destroy a_satz := m_a_satz(blz_beg, ktn_beg, ktn_inhaber) Loop, Parse, csv_string , `n, `r { If A_Index = 1 Continue If A_LoopField = Break line = %A_LoopField% c_satz := c_satz m_c_satz(blz_beg, ktn_beg, ktn_inhaber, line) } e_satz := m_e_satz(gesamt) IfExist, %dta_pfad% FileDelete, %dta_pfad% str := a_satz . c_satz . e_satz " " FileAppend, %str%, %dta_pfad% If ErrorLevel MsgBox, Fehler bei der Erstellung der Datei!`n%dta_pfad% Else { Gosub, fertig_gui Return } ExitApp abbruch: 2GuiClose: GuiClose: esc:: ExitApp ; -------------------------------prüfung----------------------------------------------- plau: ungültig = fehlertext = If RegExMatch(ktn_beg, "[^\d]+", o) { fehlertext = %fehlertext%`nungültige Zeichen in Kontonummer(%ktn_beg%) ungültig = 1 } If RegExMatch(blz_beg, "[^\d]+", o) { fehlertext = %fehlertext%`nungültige Zeichen in BLZ(%blz_beg%) ungültig = 1 } If (StrLen(ktn_inhaber) > 27) { fehlertext := fehlertext "`nzu viele Zeichen in Begünstigter(" StrLen(ktn_inhaber) ")" ungültig = 1 } IfNotExist, %csv_pfad% { fehlertext = %fehlertext%`nCSV-Datei nicht gefunden! ungültig = 1 } SplitPath, csv_pfad, OutFileName, OutDir, OutExtension, OutNameNoExt, OutDrive if (!(OutExtension = "csv" or OutExtension = "xls" or OutExtension = "xlsx") or !FileExist(csv_pfad) or ((OutExtension = "xls" or OutExtension = "xlsx") and !IsObject(oExcel))) { fehlertext = Erweiterung(%OutExtension%) nicht unterstützt, oder Datei existiert nicht. ungültig = 1 } Return ; ------------------------------Beispiledatensatz für Excel--------------------- muster: muster = ( Name des Begünstigten;BLZ des Begünstigten;Kto des Begünstigten;Name des Zahlenden;Knt des Zahlenden;BLZ des Zahlenden;Betrag;Verwendungszweck 1;Verwendungszweck 2;Verwendungszweck 3;Verwendungszweck 4;Verwendungszweck 5;Verwendungszweck 6;Verwendungszweck 7;Verwendungszweck 8 Ede Rockefeller;123456;123456;Max Mustermann;1234567890;16050101;33.00 ;Beitrag 2009;Nr. 0179 - 33,00 Euro;1. Hj. 07 - 18,00 Euro;2. Hj. 07 - 15,00 Euro Ede Rockefeller;123456;123456;Anke Mustermann;1234567891;16050101;39.00 ;Beitrag 2010;0092 - 24,00 Euro;0180 - 15,00 Euro; Ede Rockefeller;123456;123456;Guido Mustermann;1234567892;16060122;24.00 ;Beitrag 2011;Nr. 0098 - 24,00 Euro;; ) if !IsObject(oExcel) { IfExist, %A_Temp%\muster.csv FileDelete, %A_Temp%\muster.csv FileAppend, %muster%, %A_Temp%\muster.csv Run, notepad.exe %A_Temp%\muster.csv } Else zeige_in_excel(muster) Return ; --------------------------------CSV-Datei Wählen---------------------------------------------- sfile: Gui +OwnDialogs FileSelectFile, csvRead, , %dta_pfad%, CSV-Datei Öffnen, CSV(*.csv;*.xls;*.xlsx) If ErrorLevel Return GuiControl, , csv_pfad, %csvRead% Return ; --------------------------------DTA-Datei Wählen---------------------------------------------- sfile_dta: Gui +OwnDialogs FileSelectFile, csvRead, 16, %dta_pfad%, DTA-Datei Öffnen, DTA-Dateien(DTAUS) If ErrorLevel Return GuiControl, , dta_pfad, %csvRead% Return ; ------------------------------------------------------------------------------ inir: IniRead, ktn_inhaber, %ini%, Beg, inhaber, Max Mustermann IniRead, ktn_beg, %ini%, Beg, kontonummer, 123456 IniRead, blz_beg, %ini%, Beg, blz, 12345678 IniRead, csv_pfad, %ini%, Settings, csv-pfad, %A_ScriptDir%\star.csv IniRead, dta_pfad, %ini%, Settings, dta-pfad, %A_ScriptDir%\dtaus000 IniRead, last_pfad, %ini%, Settings, last-pfad, %A_ScriptDir% IniRead, gutschrift, %ini%, Settings, gutschrift, L If gutschrift not in L,G { MsgBox, 16, , Fehler in ini-Datei`,gegebenenfalls löschen.`nAbbruch! ExitApp } Return ; ------------------------------------------------------------------------------ iniwr: IniWrite, %ktn_inhaber%, %ini%, Beg, inhaber IniWrite, %ktn_beg%, %ini%, Beg, kontonummer IniWrite, %blz_beg%, %ini%, Beg, blz IniWrite, %csv_pfad%, %ini%, Settings, csv-pfad IniWrite, %dta_pfad%, %ini%, Settings, dta-pfad IniWrite, %last_pfad%, %ini%, Settings, last-pfad IniWrite, % (Check_gutschrift = 1 ? "G" : "L") , %ini%, Settings, gutschrift Return ; ------------------------------------------------------------------------------ edit_prüfen: Gui, Submit, NoHide If (StrLen(ktn_inhaber) > 10) { GuiControl, , ktn_inhaber, % sonderzeichen(ktn_inhaber) Send, {End} Gui, Submit, NoHide GuiControl, , edit_zähler, % StrLen(ktn_inhaber) " von 27 Zeichen" } Return ; -----------------------------------Funktionen------------------------------------------- ; Sonderzeichen umwandeln sonderzeichen(str) { StringReplace, str, str, ä, ae, All StringReplace, str, str, Ä, Ae, All StringReplace, str, str, Ü, Ue, All StringReplace, str, str, ü, ue, All StringReplace, str, str, ö, oe, All StringReplace, str, str, Ö, Oe, All StringReplace, str, str, ß, ss, All str := RegExReplace(str, "[^-\d\w\\.,&+*%/$€]", " ") Return str } ; ------------------------------------A-Satz erstellen------------------------------------------ m_a_satz(blz, ktn, name) { global Check_gutschrift Return "0128A" (Check_gutschrift = 1 ? "G" : "L") "K" nullen_auffüllen(blz, 8) "00000000" feldlänge(sonderzeichen(name), 27) A_DD A_MM SubStr(A_YYYY, -1, 2) " " nullen_auffüllen(ktn, 10) "0000000000 1" } ; ----------------------------------C-Satz erstellen-------------------------------------------- m_c_satz(blz, ktn, name, line) { global summe_blz, summe_ktn, summe_betrag, gesamt, Check_gutschrift erweiteRung = 0 StringSplit, feld, line, `;, %A_Space%%A_Tab% StringReplace, betrag, feld7, `,, , StringReplace, betrag, betrag, ., , summe_betrag += betrag summe_blz += feld6 summe_ktn += feld5 gesamt++ Verwendungszweck_arr := {} Loop, 8 ; Verwendungszweck zählen { ID := A_Index + 7 if (feld%ID%) Verwendungszweck_arr.Insert(feld%ID%) } ;~ MsgBox, % "Erweiterung: " Verwendungszweck_arr.MaxIndex() ;~ erste Erweiterung Präfix+27Zeichen . zweite Erweiterung Präfix+27Zeichen+11Zeichen erweiteRungstext := feldlänge("02" sonderzeichen(Verwendungszweck_arr.2),29) . feldlänge((Verwendungszweck_arr.3 ? "02" : "") sonderzeichen(Verwendungszweck_arr.3),40) if (Verwendungszweck_arr.MaxIndex() > 3) { Loop, 8 { ;~ MsgBox, % "A_INDEX: " A_Index "`nWert: '" Verwendungszweck_arr[A_Index + 3] "'" erweiteRungsteil .= feldlänge((Verwendungszweck_arr[A_Index + 3] ? "02" : "") . sonderzeichen(Verwendungszweck_arr[A_Index + 3]),29) if (A_index = 4 or A_Index = 8) erweiteRungsteil .= " " ToolTip, % StrLen(erweiteRungsteil) if (A_INDEX = 4 and !Verwendungszweck_arr.8) break } erweiteRungstext .= erweiteRungsteil } satz := nullen_auffüllen(blz, 8) ; BLZ erstbeteiligte Bank (optional) wenn BLZ nicht angegeben: 00000000 . nullen_auffüllen(feld6, 8) ; BLZ Begünstigter (bei Überweisungen) bzw. Zahlstelle (bei Lastschriften) . nullen_auffüllen(feld5, 10) ; Kontonummer . "0000000000000" . (Check_gutschrift = 1 ? 51 : 05) ; Lastschrift oder Überweisung(Gutschrift) . "000 00000000000" . nullen_auffüllen(feld2, 8) ; BLZ Auftraggeber . nullen_auffüllen(feld3, 10) ; Kontonummer Auftraggeber . nullen_auffüllen(betrag, 11) . " " ; Betrag . feldlänge(sonderzeichen(feld4), 27) . " " ;Name des Kunden . feldlänge(sonderzeichen(feld1), 27) ; Name Begünstigter (bzw. bei Lastschriften Zahlungspflichtiger) . feldlänge(feld8, 27) . "1 " ; Verwendungszweck 1 . nullen_auffüllen(Verwendungszweck_arr.MaxIndex() - 1, 2) ; Verwendungszwecke 2-4 . erweiteRungstext ; Raum für weitere ErweiteRungsteile ; Return "0" (StrLen(satz) + 5) "C" satz Return nullen_auffüllen(187 + (Verwendungszweck_arr.MaxIndex() - 1) * 29, 4) "C" satz } ; ------------------------------------------------------------------------------ m_e_satz(anzahl_c) { global summe_blz, summe_ktn, summe_betrag Return "0128E " nullen_auffüllen(anzahl_c, 7) "0000000000000" nullen_auffüllen(summe_ktn, 17) nullen_auffüllen(summe_blz, 17) nullen_auffüllen(summe_betrag, 13) } ; ----------------------gibt 27 aufgefüllte Zeichen zurück-------------------------------------------------------- feldlänge(str, ll) { l := ll - StrLen(SubStr(str, 1, ll)) Loop, %l% ID := ID " " Return SubStr(str, 1, ll) ID } ; ------------------------------------------------------------------------------ nullen_auffüllen(str, ll) { l := ll - StrLen(str) Loop, %l% ID := ID "0" Return ID SubStr(str, 1, ll) } ; ------------------------------------------------------------------------------ fertig_gui: SplitPath, dta_pfad, OutFileName, , , , summe_f := Round((summe_betrag / 100), 2) stat = ( Belegzettel Dateiname: %OutFileName% Erstellungsdatum: %A_DD%.%A_MM%.%A_YEAR% Anzahl der verarbeiteten Datensätze: %gesamt% Kontrollsumme der Umsätze: %summe_f% € Kontrollsumme der BLZ: %summe_blz% Kontrollsumme der Kontonummern: %summe_ktn% -------------- Begünstigter Name: %ktn_inhaber% Konto: %ktn_beg% BLZ: %blz_beg% ) Gui 3:add, edit, R15 w600 vstedit , %stat% Gui 3:add, Button, +Default gOK2, &OK Gui 3:add, Button, x+5 gzw, Alles in die &Zwischenablage Gui 3:show, , Fertigmeldung! DTA-Datei erstellt... Send, {Right}{Tab} Return zw: Clipboard := stat ToolTip, kopiert... Sleep, 2000 ToolTip Return OK2: Run, explorer.exe /select`,%dta_pfad% 3GuiClose: ExitApp ; ------------------------------------------------------------------------------ ; ################################################################################# dta2csv: Gui +OwnDialogs FileSelectFile, dtaus_datei, , , DTA-Datei wählen, DTA-Datei(*.*) If ErrorLevel Return Gui, Destroy FileRead, dtaus_str, %dtaus_datei% a_satz := SubStr(dtaus_str, 1, 128) art_derTransaktion := SubStr(a_satz, 6, 2) If art_derTransaktion != LK { MsgBox, 16, , Die dta-Datei enthält keine Lastschriften`,um Komplikationen zu vermeiden werden aber momentan keine anderen Transaktionen unterstützt. ExitApp } blz_auftraggeber := SubStr(a_satz, 8, 8) name_auftraggeber := SubStr(a_satz, 24, 27) kto_auftraggeber := SubStr(a_satz, 61, 10) e_satz := SubStr(dtaus_str, -127) summe_last := SubStr(e_satz, 65, 13) + 0 StringReplace, dtaus_str, dtaus_str, %e_satz%, ; e_satz entfernen StringReplace, dtaus_str, dtaus_str, %a_satz%, ; a_satz entfernen ; MsgBox, % a_satz "`n" e_satz "(" StrLen(e_satz) ")`n" SubStr(dtaus_str, -127) "`n" art_derTransaktion "`n" blz_auftraggeber "`n" kto_auftraggeber "`n" name_auftraggeber neu := RegExReplace(dtaus_str, "\s{11}(\d{4})C", " #$1", anzahl_datensätze, -1, 128) ; trennzeichen(#) für C einfügen,11 leerzeichen gefolgt von 4 ziffern und C anzahl_datensätze++ LV_width := A_ScreenWidth - 100 Gui, Color, F4F3FF Gui, add, text, x5 w200, Name des Auftraggebers: Gui, add, text, x+5 w200, %name_auftraggeber% Gui, add, text, x5 y+5 w200, BLZ: Gui, add, text, x+5 w200, %blz_auftraggeber% Gui, add, text, x5 y+5 w200, Konto: Gui, add, text, x+5 w200, %kto_auftraggeber% Gui, add, text, x5 y+5 w200, Summe Lastschriften(Cent): Gui, add, text, x+5 w200, %summe_last% Gui, add, text, x5 y+5 w200, Anzahl der Datensätze: Gui, add, text, x+5 w200, %anzahl_datensätze% Gui, add, ListView, x5 R15 y+5 W%LV_width% +Grid, % "Name des Begünstigten|BLZ des Begünstigten|Kto des Begünstigten|Name des Zahlenden|Kto-Nummer des Zahlenden|BLZ des Zahlenden|Betrag|Verwendungszweck 1|Verwendungszweck 2|Verwendungszweck 3|Verwendungszweck 4" Gui, add, Button, y+5 x15 +Default gok3, CSV erstellen Gui, add, Button, yp x+5 gabbruch, A&bbruch Gui, add, text, yp x+15 , Abbruch jederzeit mit ESC Gui, show, h440 , Frage:Sind die Daten korrekt? %OutNameNoExt% by @fredchf for PHC %ver% Gosub, lesen Return ; ------------------------------------------------------------------------------ ok3: Gui +OwnDialogs FileSelectFile, csv_datei, 16, , CSV-Datei wählen, CSV-Datei(*.csv) If ErrorLevel Return csv = 1 csv_datei := (RegExMatch(csv_datei, "i)\.csv$") ? csv_datei : csv_datei ".csv") ; ------------------------------------------------------------------------------ lesen: Loop, Parse, neu, # { Line := A_LoopField If A_Index = 1 line := SubStr(line, 1, 4) . SubStr(line, 6) satz_länge := StrLen(Line) + 1 satz_blz := SubStr(line, 13, 8) satz_kto := SubStr(line, 21, 10) + 0 satz_art := SubStr(line, 44, 5) satz_blz_auftrageber := SubStr(line, 61, 8) satz_kto_auftrageber := SubStr(line, 69, 10) + 0 satz_betrag := (SubStr(line, 79, 9) + 0) "." SubStr(line, 88, 2) satz_betrag_gesamt := (satz_betrag_gesamt = "" ? 0 + satz_betrag : Round(satz_betrag_gesamt + satz_betrag, 2)) satz_kunde := SubStr(line, 93, 27) satz_name_auftraggeber := SubStr(line, 128, 27) satz_verwend1 := SubStr(line, 155, 27) anz_erweiteRungen := SubStr(line, 185, 2) erweiteRungen_typ := SubStr(line, 187, 2) If erweiteRungen_typ != 02 { MsgBox, 16, %Ty%, Ein anderer ErweiteRungstyp als Verweendungszweck noch nicht unterstützt.`nAbbruch! ExitApp } If anz_erweiteRungen Loop, %anz_erweiteRungen% { If A_Index = 1 satz_verwend2 := SubStr(line, 189, 27) If A_Index = 2 satz_verwend3 := SubStr(line, 218, 27) If A_Index = 3 satz_verwend4 := SubStr(line, 258, 27) } If csv { If A_Index = 1 { IfExist, %csv_datei% FileDelete, %csv_datei% dta_csv .= "Name des Begünstigten`;BLZ des Begünstigten`;Kto des Begünstigten`;Name des Zahlenden`;Kto-Nummer des Zahlenden`;BLZ des Zahlenden`;Betrag`;Verwendungszweck 1`;Verwendungszweck 2`;Verwendungszweck 3`;Verwendungszweck 4`n" } dta_csv .= kü(satz_name_auftraggeber) ";" satz_blz_auftrageber ";" satz_kto_auftrageber ";" kü(satz_kunde) ";" satz_kto ";" satz_blz ";" satz_betrag ";" kü(satz_verwend1) ";" kü(satz_verwend2) ";" kü(satz_verwend3) ";" kü(satz_verwend4) "`n" ; FileAppend, % kü(satz_name_auftraggeber) ";" satz_blz_auftrageber ";" satz_kto_auftrageber ";" kü(satz_kunde) ";" satz_kto ";" satz_blz ";" satz_betrag ";" kü(satz_verwend1) ";" kü(satz_verwend2) ";" kü(satz_verwend3) ";" kü(satz_verwend4) "`n", %csv_datei% } Else LV_Add("",satz_name_auftraggeber,satz_blz_auftrageber,satz_kto_auftrageber,satz_kunde,satz_kto,satz_blz,satz_betrag,satz_verwend1,satz_verwend2,satz_verwend3,satz_verwend4) clear_vars() } If csv { FileAppend, % dta_csv, %csv_datei% if IsObject(oExcel) zeige_in_excel(dta_csv) ExitApp } Return ; ------------------------------------------------------------------------------ clear_vars() { global line= satz_länge= satz_blz= satz_kto= satz_art= satz_blz_auftrageber= satz_kto_auftrageber= satz_betrag= satz_kunde= satz_name_auftraggeber= satz_verwend1= anz_erweiteRungen= erweiteRungen_typ= satz_verwend1= satz_verwend2= satz_verwend3= satz_verwend4= } ; ------------------------------------------------------------------------------ kü(str) ; entfernt Leerzeichen am Ende der Strings { str = %str% Return str } ; ------------------------------------------------------------------------------ zeige_in_excel(str) { global oExcel StringSplit, rows, str, `n oExcel.Workbooks.Add ; create a new workbook oExcel.Range("A:F").Select oExcel.Selection.NumberFormat := "@" ; formatieren als Text oExcel.Range("H:O").Select oExcel.Selection.NumberFormat := "@" oExcel.Rows("1:1").Select ; erste Zeile auswählen oExcel.Selection.Font.Bold := True oExcel.Cells.Select ; alle Zellen auswählen SafeArray(oExcel.Range("A1:O" rows0), String2Table(str, ";")) oExcel.Cells.EntireColumn.AutoFit oExcel.Range("A1").Select oExcel.Visible := 1 ; make Excel Application visible Return } ;===Functions=========================================================================== SafeArray(oRange, oTable="") { ; Sets or gets SafeArray. By Learning one. /* Parameters: oRange MS Excel range object oTable 2 dimensional array object Operation: if oTable is empty function gets SafeArray from specified oRange and returns it as oTable else function converts oTable to SafeArray, and sets it to specified oRange */ if (oTable = "") ; get SafeArray { oTable := Object() SafeArray := oRange.value if (SafeArray.MaxIndex(1) = "") ; just one cell range return SafeArray ; return as var not object Loop % SafeArray.MaxIndex(1) ; loop through every row { RowNum := A_Index %RowNum% := Object() Loop % SafeArray.MaxIndex(2) ; loop through every column %RowNum%.Insert(SafeArray[RowNum, A_Index]) oTable.Insert(%RowNum%) } return oTable } else ; set SafeArray { if !IsObject(oTable) { oRange.value := oTable return } For k,v in oTable { Dimension1 ++ ; rows CurMaxCol := oTable[k].MaxIndex() if (CurMaxCol > Dimension2) Dimension2 := CurMaxCol } SafeArray := ComObjArray(12, Dimension1, Dimension2) Loop, % Dimension1 ; rows { RowNum := A_Index-1 Loop, % Dimension2 ; columns { ColNum := A_Index-1 SafeArray[RowNum, ColNum] := oTable[RowNum+1][ColNum+1] } } oRange.value := SafeArray } } String2Table(String, ColumnsDelimiter="`t", RowsDelimiter= "`n") { ; converts string to table object (2 dimensional). By Learning one. oTable := Object() Loop, parse, String, %RowsDelimiter% { CurRow := A_LoopField, RowNum := A_index %RowNum% := Object() Loop, parse, CurRow, %ColumnsDelimiter% %RowNum%.Insert(A_LoopField) oTable.Insert(%RowNum%) } return oTable } Table2String(oTable, ColumnsDelimiter="`t", RowsDelimiter= "`n") { ; converts table object (2 dimensional) to string. By Learning one. if !IsObject(oTable) ; var passed as obj return oTable For k,v in oTable { For k2,v2 in oTable[k] RowString .= v2 ColumnsDelimiter RowString := RTrim(RowString, ColumnsDelimiter) TableString .= RowString RowsDelimiter RowString = } return RTrim(TableString, RowsDelimiter) } ; ------------------------------------------------------------------------------ excel2string(Mappe) { global oExcel wb := oExcel.Workbooks.Open(Mappe, False, True) SafeArray := wb.ActiveSheet.Range("A1:O1000").value ; get safe array Loop, % SafeArray.MaxIndex(1) { if !SafeArray[A_INDEX, 2] CONTINUE str .= SafeArray[A_INDEX, 1] . ";" make_str(SafeArray[A_INDEX, 2]) . ";" make_str(SafeArray[A_INDEX, 3]) . ";" make_str(SafeArray[A_INDEX, 4]) . ";" make_str(SafeArray[A_INDEX, 5]) . ";" make_str(SafeArray[A_INDEX, 6]) . ";" Round(SafeArray[A_INDEX, 7], 2) . ";" make_str(SafeArray[A_INDEX, 8]) . ";" make_str(SafeArray[A_INDEX, 9]) . ";" make_str(SafeArray[A_INDEX, 10]) . ";" make_str(SafeArray[A_INDEX, 11]) . ";" make_str(SafeArray[A_INDEX, 12]) . ";" make_str(SafeArray[A_INDEX, 13]) . ";" make_str(SafeArray[A_INDEX, 14]) . ";" make_str(SafeArray[A_INDEX, 15]) . "`n" } ;~ MsgBox, % str wb.Close(False) ; Mappe schließen ohne speichern wb := "" Return str } ; ------------------------------------------------------------------------------ make_str(str) { if str is Float { ; MSGBOX, % str Return Floor(str) } ELSE Return str }
Edited by fredchf, 03 May 2013 - 09:00 AM.