Satzlänge im Format DTAUS

Bestimmung der Intervalle im Format DTAUS,

bigbadbanker

Betreff:

Satzlänge im Format DTAUS

 ·  Gepostet: 23.06.2010 - 13:16 Uhr  ·  #67902
Hallo ihr Lieben,

ich habe zusammen mit immersap endlich ein Programm geschrieben, welches nun DTAUS Dateien ins MT940 konvertiert.

Nun haben wir aber folgendes Problem: Die tatsächliche Satzlänge kommt immer in Intervallen von je 128 Zeichen zustande. Dazu wird immer ein Platzhalter ausgegeben bei der Erzeugung des DTAUS (siehe wikipedia). Jetzt habe ich also beim Platzhalter 0245 ganze 256 Zeichen, bei 0303 ganze 384 Zeichen usw... Nur finde ich hierbei keine wirklichen Intervalle. Wenn ich die hätte wäre ich nicht abhängig von einzelnen Platzhaltern, sondern könnte anhand von Intervallen meine Programmierung fortführen. Der Vorteil ist, dass ich mir immense Arbeit spare und das Programm weniger fehleranfällig ist.

Jm. eine Idee wie ich das rausfinden könnte, Links, Dokumente, Erfahrungen usw.

Bin um möglichst schnelle Hilfe sehr dankbar.

Grüße

Michael Döring

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 23.06.2010 - 13:40 Uhr  ·  #67903
?
Die Satzlänge steht doch jeweils in den ersten 4 Byte zu Beginn jedes Satzes. Oder meinst Du was anderes?
Beispiel im A-Satz (weil der immer 128 hat): 0128A

Anders ausgedrückt: Satzlänge lesen (erste 4 Byte), auf den nächsten ohne Rest durch 128 teilbaren Wert aufrunden. Das ist dann die Länge des Satzes inkl. der ersten 4 Führungsbytes. Und danach beginnt der nächste Satz. Damit sollte man das eigentlich sauber lesen können.

bigbadbanker

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 23.06.2010 - 14:16 Uhr  ·  #67905
naja...ich habe den Fehler gemacht nicht genau zu präzisieren: Nicht die Satzlänge vom A-Satz, die ist schließlich immer konstant '0128', ich meine die Satzlänge vom C-Satz. Da steht bspws. 0245, die Satzlänge ist allerdings trotzdem 256, ebenso verhält es sich bspws. bei dem Platzhalter 0303 und es sind dann 384 Zeichen. Wenn ich bloß die Intervalle wüßte ab welchem Platzhalter das nächste um 128 Zeichen vergößerte Intervall ansteht, wäre mir mehr als nur geholfen.

Michael Döring

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 23.06.2010 - 14:32 Uhr  ·  #67906
Nochmal: Du liest die ersten 4 Byte. Das ist eine Zahl. Du schaust, ob diese Zahl ohne Rest durch 128 teilbar ist (modulo). Falls nicht, ermittelst Du die nächst höhere durch 128 ohne Rest teilbare Zahl. Und das ist Deine Satzlänge.
Sind die ersten 4 Byte direkt durch 128 teilbar ist das schon die Satzlänge, wie z.B. beim A- und E-Satz.

Ergänzung: 0303 ist kein Platzhalter sondern eine Satzlänge eines C-Satzes. Nächsthöhere durch 128 teilbare Zahl ist 384. Du liest also beginnend beim Ende des vorigen Satzes exakt 384 Zeichen ein, das ist der komplette 303er Satz. Blanks am Ende einfach ignorieren. Wobei die Dich nicht stören dürften, da die Erweiterungsteile im Hauptteil des C-Satzes immer referenziert sein müssen. Insofern darf eine saubere Routine garnicht bis zu den Füllblanks am Ende lesen bzw. damit Probleme haben.

Nochmal deutlicher:
1. 0128Adas ist dein A-Satz, 128 ist teilbar, du liest genau ab Dateibeginn 128 Zeichen ein und verarbeitest die.
2. Lese nächsten 4 Byte, 0303 kommt raus. Nächste teilbare Zahl ist 384, lese exakt 384 - 4 (die ersten vier bei dieser Position abziehen) ein und verarbeite
3. und weiter mit 2. bis ein 0128E folgt, dann bist Du im E-Satz.

bigbadbanker

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 23.06.2010 - 15:08 Uhr  ·  #67907
ersteinmal vielen Dank für deine Erklärung. Genau das, was du grade umschrieben hast habe ich auch gedacht. Allerdings bin ich dann auf eine Länge eines C-Satzes von 0506. Und die nächsthöhere durch 128 teilbare Zahl (also teilbar in dem Sinne ohne Rest) ist die 512. Allerdings erhalte ich dann einen Zusammenbruch des Programms und muss feststellen, dass er nicht 512, sondern 640 Zeichen haben will als Länge.

Was du geschrieben hast unter "Nochmal deutlicher:" ist mir schon klar, der Rest auch. Ich hatte auch gedacht, es sind immer 128er Schritte, nur das Thema 506 hat mich dann doch stutzig gemacht!?

Michael Döring

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 23.06.2010 - 15:27 Uhr  ·  #67909
Ja, ich hab auch einen Denkfehler, sehe ich gerade. Warte, ich schau mal nach.

Michael Döring

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 23.06.2010 - 15:39 Uhr  ·  #67910
Jetzt haben wir es:
http://de.wikipedia.org/wiki/D…hverfahren

Länge des Datensatzes nach der Formel 187 + x * 29 (x = Anzahl Erweiterungsteile = "Zeilen"; Beispiel: 2 Zeilen = 187 + 2*29 = 245) mit führender 0, also im Beispiel 0256.
Bei 0 Erweiterungsteilen steht hier 0187 und Feld 22 wird mit Leerzeichen aufgefüllt - der Datensatz endet also trotzdem erst mit dem 256. Zeichen.

bugmenot

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 23.06.2010 - 16:07 Uhr  ·  #67911
Oder auch nicht:

Nach der Formel würde 0506 aber auch zu einer Länge von 512 und nicht 640.

187+ 0*29 = 187 -> 256
187+ 1*29 = 216 -> 256
187+ 2*29 = 245 -> 256
187+ 3*29 = 274 -> 384
187+ 4*29 = 303 -> 384
187+ 5*29 = 332 -> 384
187+ 6*29 = 361 -> 384
187+ 7*29 = 390 -> 512
187+ 8*29 = 419 -> 512
187+ 9*29 = 448 -> 512
187+ 10*29 = 477 -> 512
187+ 11*29 = 506 -> 512

Michael Döring

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 23.06.2010 - 16:16 Uhr  ·  #67914
Zitat geschrieben von www.bugmenot.com
Nach der Formel würde 0506 aber auch zu einer Länge von 512 und nicht 640.

Stimmt. Aber wer sagt, dass die Ursprungsdatei mit 640 korrekt ist?
Wenn man die durch einen Checker laufen lassen würde, würde der vielleicht entsprechend meckern.
Wurde da vielleicht ein richtig leerer 12. Erweiterungsteil erzeugt? Manche Programme bauen solche falschen Sätze zusammen.

bigbadbanker

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 25.06.2010 - 13:40 Uhr  ·  #67941
so habe ich das auch nicht betrachtet!!! Aber das ist ein uraltes Standardprogramm von SAP, ich denke mal nicht, dass es so einen Quak produziert!?

Michael Döring

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 25.06.2010 - 13:52 Uhr  ·  #67942
Willst Du mir die Datei mal per PN schicken, falls sie nicht zu groß ist?

bigbadbanker

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 25.06.2010 - 16:44 Uhr  ·  #67948
habe ich dir geschickt, hoffe du kannst damit etwas anfangen.

Michael Döring

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 25.06.2010 - 17:56 Uhr  ·  #67950
Empfangen und beantwortet.

bugmenot

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 30.06.2010 - 22:02 Uhr  ·  #68027
Wo lag denn nun der Fehler?

Michael Döring

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 01.07.2010 - 08:24 Uhr  ·  #68034
Die Datei, die ich bekommen hatte war sauber und hatte keinen 640er Satz. Er sucht jetzt diese Datei mal raus.....

bigbadbanker

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 08.07.2010 - 12:03 Uhr  ·  #68163
so...habe die dem Michael zugeschickt...glaubt mir mal, der geht auf die Bretter wenn ich im Programm einstelle er solle nur 512 Zeichen einlesen, statt 640 beim Platzhalter "0506".

Viele Grüße

Michael Döring

Betreff:

Re: Satzlänge im Format DTAUS

 ·  Gepostet: 08.07.2010 - 12:57 Uhr  ·  #68166
So, jetzt bin ich wieder drin, nachdem ich es im Editor gesehen habe :)

Also, gut aufpassen :)
Wir haben eine Zahlung mit 11 Erweiterungsteilen.
Davon finden sich die ersten beiden beginnend ab Position 187 mit einer Länge von 58 (=2 * 29) innerhalb des C-Stammsatzes.
Dann wird erst einmal aufgefüllt mit 11 Blanks, damit der Block 187 + 58 = 245 einen teilbaren Wert = 256 ergibt.
Also haben wir: 187 + 58 + 11 = 256, das ist unser erste Block im C-Satz.

Bleiben noch 9 Erweiterungsteile übrig:
Diese werden in Viererblocks aufgeteilt und JEWEILS auf einen durch 128 teilbaren Wert gebracht und hinten angehängt:

Erster Block Erweiterungsteile 3, 4, 5 und 6:
Also 4*29 = 116 aufgefüllt auf einen 128er Block also hinten noch 12 Blanks dran.

Und so weiter für die folgenden drei Blöcke. Block 2: Teile 7, 8, 9 und 10 und in Block 3 nur ein Erweiterungsteil 11.

Wir summieren:
C-Stammsatz inkl. 2 E-Teile = 256
3 Blöcke für E-Teile á 128 = 384
Ergibt 640.

Logisch bleibt es bei 506, da 187 + 11*29 = 506 ergibt

Einigermaßen verständlich erklärt?
Wer heutzutage IT macht, wird mit dieser FESTEN SATZLÄNGE oder früher Blockung genannt von 128 garnicht gut zurecht kommen :)
Das stammt noch aus Zeiten weit vor Festplatten und Disketten......