2009-04-27 27 views
5

Sto creando un pacchetto SSIS per leggere i dati decompressi da una serie di file di quaderni. Non sono sicuro della corretta interpretazione delle seguenti definizioni di campo e speravo che qualcuno potesse sapere:Interpretazione di campi decimali compattati COMP-3 in valori numerici

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

I dati sono memorizzati in testo a larghezza fissa. I dati per i campi di cui sopra ha le seguenti lunghezze:

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

sono incerto come interpretare il decimale posiziona e firma.

Qualsiasi aiuto sarebbe molto apprezzato.

Cordiali saluti, Ham

risposta

2

Ecco come fare:

PIC è "immagine"
S9 (15) si intende un campo numerico di 15 cifre firmato: S per il segno, 9 è numerico, (15) è la lunghezza. V è la posizione decimale 9 (3) è un numero a tre cifre

e COMP-3 è decimale codificato BCD. Ogni nybble (mezzo byte) del campo è un valore decimale in binario, così

0b01110110 (duh)

è "76".

18 cifre richiedono 9 byte, il segno è il basso nybble del byte di ordine basso.

Che mi preoccupa, quelli dovrebbero richiedere byte.

Ecco uno nice article on it.

2

Di solito i campi COMP-3 sono costituiti da BCD cifre raggruppate in byte due alla volta, ciascuna cifra utilizzando un nibble (4 bit). L'ultima cifra viene inserita nella parte superiore del nibble dell'ultimo byte. Il boccone inferiore dell'ultimo byte ha 13 se il numero è negativo, e qualcos'altro, (di solito 12) se positivo. Il punto decimale è implicito.

Ad esempio, -1.2 è simile a questo in esadecimale, la D finale è il segno negativo.

01 2D 

12,345 è:

12 34 5C 
4

Qui è un piccolo tentativo diverso a rispondere alle vostre domande.

PIC S9 (15) V9 (3) COMP-3 è simile al seguente nel file:

00 00 00 00 00 00 00 00 00 0F 

Se il valore fosse -4.568.248.323, sarebbe:

00 00 00 00 04 56 82 48 32 3D 

Questo non aiuta, ma può aiutare gli altri. disfatto il valore precedente sarà simile:

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) 

Questo campo ha 15 (in realtà 16) cifre prima del punto decimale e 3 dopo.

Anche se richiede solo 18 cifre (15 + 3), ottiene 19 per renderlo un campo di lunghezza pari con il segno (una cifra aggiunta in primo piano per renderlo lungo 10 byte sul file). La migliore pratica è di rendere sempre i campi imballati una lunghezza strana per evitare questa confusione.

** L'ultima lettera indica il segno, C & F sono positivi, D è negativo. Per il tuo programma, controlla il negativo (D) e, in caso contrario, considera positivo.

** La "V" è un punto decimale implicito. non esiste sul file, ma COBOL sa che è lì per arrotondare e così via. È necessario per controllarlo a livello di programmazione. Non c'è nulla nel file che ti aiuti a identificare dove si trova o se esiste.

Gli altri due campi sono già lunghe dispari, quindi quando sono imballati, con il segno, possono essere memorizzati in una quantità di spazio pari.

Qualsiasi altra domanda, modifica la tua domanda o chiedi nei commenti e qualcuno cercherà di risponderti per te.

1

lunghezza COMP-3 campi viene calcolato come numero di cifre che abbiamo bisogno di memorizzare + 1 diviso per 2. Ad esempio per memorizzare un campo numerico di valore 987 avremmo richiesto 3 +1 diviso per 2 = 2 Quindi un campo Comp-3 di lunghezza 2 byte può memorizzare un valore di +999 a -999 come limite.

15 memorizzato come 01 5C. Quindi gli ultimi quattro bit del numero vengono utilizzati per memorizzare il segno del numero che è C o D, quindi "C" rappresenta il numero positivo e "D" rappresenta il numero negativo. E ogni numero numerico richiede 4 bit per rappresentarsi.

Quindi un numero numerico di 7 cifre richiede 7 +1 = 8/2 = 4 byte di dimensione. Quindi il campo comp-3 della dimensione 4 byte può memorizzare cifre numeriche da +999,9999 a -999,9999 cifre.

Nel caso della domanda precedente per spostare la parte decimale del numero è necessario definire una variabile che può memorizzare solo la parte decimale e spostare il valore in quel campo che contiene solo la parte decimale.

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

è necessario definire un campo decimale come DEC-PORTION V9 (6) comp-3 e quindi spostare FIELD-NAME-3 su DEC-PORTION per mantenere la parte decimale del valore.

In questo modo è possibile separare la parte decimale del numero dal numero intero.

Problemi correlati