2009-04-27 10 views
5

Ich erstelle ein SSIS-Paket, um entpackte Daten aus einer Reihe von Copybook-Dateien einzulesen. Ich bin unsicher bezüglich der korrekten Interpretation der folgenden Felddefinitionen und hoffe, dass jemand es wissen würde:COMP-3 Packed Dezimalfelder in numerische Werte interpretieren

FELD-NAME-1 PIC S9 (15) V9 (3) COMP-3.
FELD-NAME-2 PIC S9 (3) V9 (8) COMP-3.
FELD-NAME-3 PIC S9 (3) V9 (6) COMP-3.

Die Daten werden in Text mit fester Breite gespeichert. Die Daten für die oben genannten Felder haben die folgenden Längen:

FIELD-NAME-1: 19 FIELD-NAME-2: 11 FIELD-NAME-3: 9

Ich bin nicht sicher, wie die dezimale zu interpretieren Platz und Zeichen.

Jede Hilfe würde sehr geschätzt werden.

Mit freundlichen Grüßen, Ham

Antwort

2

Here we go:

PIC ist "Bild"
S9 (15) bedeutet eine 15-stellige Zahlen unterzeichnet Feld: S für Zeichen, 9 numerisch ist, (15) ist Länge. V ist die Dezimalstelle 9 (3) ist eine dreistellige numerische

und COMP-3 ist BCD codiert dezimal. Jede nybble (Halbbyte) des Feldes ist ein Dezimalwert in binär, so

0b01110110 (Duh)

ist "76".

18 Ziffern erfordern 9 Bytes, das Zeichen ist der Low-Nibble des niederwertigen Bytes.

Was mir Sorgen macht, sollten diese Bytes benötigen.

Hier ist ein nice article on it.

2

Normalerweise bestehen COMP-3-Felder aus BCD Ziffern, die jeweils zu zweit in Bytes gepackt sind, wobei jede Ziffer ein Nibble (4 Bits) verwendet. Die letzte Ziffer geht in das obere Nibble des letzten Bytes. Das untere Nibble des letzten Bytes hat 13, wenn die Zahl negativ ist, und etwas anderes (normalerweise 12), wenn es positiv ist. Der Dezimalpunkt ist impliziert.

Zum Beispiel sieht -1.2 wie in hex aus, das letzte D ist das negative Vorzeichen.

01 2D 

12,345 ist:

12 34 5C 
4

hier ein wenig anders Versuch, Ihre Fragen zu beantworten.

PIC S9 (15) V9 (3) COMP-3 sieht wie folgt in der Datei:

00 00 00 00 00 00 00 00 00 0F 

Wenn der Wert -4.568.248 war.323, wäre es:

00 00 00 00 04 56 82 48 32 3D 

Dies hilft Ihnen nicht, kann aber anderen helfen. ausgepackt der vorherige Wert aussehen würde:

F0 F0 F0 F0 F0 F0 F0 F0 F0 F4 F5 F6 F8 F2 F4 F8 F3 F2 D3 (or F3 as the last byte, therefore losing the sign) 

Dieses Feld hat 15 (tatsächlich 16) Ziffern vor dem Komma und 3 nach.

Obwohl es nur 18 Ziffern (15 + 3) anfordert, wird es 19, um es zu einem geraden Feld mit dem Vorzeichen zu machen (eine Ziffer an der Vorderseite hinzugefügt, um es 10 Bytes lang auf der Datei zu machen). Es empfiehlt sich, gepackte Felder immer mit einer ungeraden Länge zu versehen, um diese Verwirrung zu vermeiden.

** Der letzte Buchstabe kennzeichnet das Vorzeichen, C & F sind positiv, D ist negativ. Überprüfen Sie für Ihr Programm auf negativ (D), und wenn nicht, als positiv behandeln.

** Das 'V' ist ein implizierter Dezimalpunkt. es existiert nicht in der Datei, aber COBOL weiß, dass es für das Runden und so da ist. Sie müssen dies programmatisch berücksichtigen. Es gibt nichts in der Datei, das Ihnen hilft zu identifizieren, wo es ist oder ob es überhaupt existiert.

Die anderen beiden Felder sind bereits ungerade, so dass sie im gepackten Zustand mit dem Vorzeichen in gleichmäßiger Länge gespeichert werden können.

Andere Fragen, bearbeiten Sie Ihre Frage oder Fragen in den Kommentaren und jemand wird versuchen, sie für Sie zu beantworten.

1

COMP-3 Felder Länge wie Anzahl der berechnet wird Ziffern, die wir speichern müssen + 1 geteilt durch 2. Um beispielsweise ein numerisches Feld mit dem Wert 987 zu speichern, würden wir 3 +1 geteilt durch 2 = 2 benötigen. Ein Comp-3-Feld mit einer Länge von 2 Bytes kann also einen Wert von +999 speichern bis -999 als Grenze.

15 würde als 01 5C gespeichert werden. So werden die letzten vier Bits der Zahl verwendet, um das Vorzeichen der Zahl C oder D zu speichern, so dass "C" die positive Zahl darstellt und "D" die negative Zahl darstellt. Und jede numerische Zahl benötigt 4 Bits, um sich selbst darzustellen.

So eine 7-stellige numerische Nummer würde 7 +1 = 8/2 = 4 Byte Größe benötigen. So kann das comp-3-Feld der Größe 4 Byte eine numerische Ziffern von +999,9999 bis -9999999 Ziffern speichern.

Bei der obigen Frage muss der Dezimalteil der Zahl eine Variable definieren, die nur den Dezimalteil speichern kann und den Wert in das Feld verschieben, das nur den Dezimalteil enthält.

wie FIELD-NAME-3 PIC S9 (3) V9 (6) COMP-3.

Wir müssen ein Dezimalfeld wie DEC-PORTION V9 (6) comp-3 definieren und dann FIELD-NAME-3 nach DEC-PORTION verschieben, um den Dezimalteil des Werts beizubehalten.

Auf diese Weise können wir den Dezimalanteil der Zahl von der vollen Zahl trennen.