2009-04-27 12 views
5

Estoy creando un paquete SSIS para leer datos desempacados de una serie de archivos de libro de copias. No estoy seguro de la interpretación correcta de las siguientes definiciones de campo y esperaba que alguien lo supiera:Interpretación de campos decimales compactos COMP-3 en valores numéricos

CAMPO-NOMBRE-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.

Los datos se almacenan en texto de ancho fijo. Los datos para los campos anteriores tiene las siguientes longitudes:

CAMPO-NOMBRE-1: 19 CAMPO-NOMBRE-2: 11 nombre-campo-3: 9

No estoy seguro de cómo interpretar la decimal colocar y firmar

Cualquier ayuda sería muy apreciada.

Saludos cordiales, jamón

Respuesta

2

Aquí vamos:

PIC es "imagen"
S9 (15) significa un campo numérico de 15 dígitos firmado: S para la muestra, 9 es numérico, (15) es la longitud. V es la posición decimal 9 (3) es un número de tres dígitos

y COMP-3 es BCD con codificación decimal. Cada nybble (media bytes) del campo es un valor decimal en binario, por lo

0b01110110 (duh)

es "76".

18 dígitos requieren 9 bytes, el signo es el nybble bajo del byte de orden inferior.

Lo que me preocupa, esos deberían requerir bytes.

Aquí hay un nice article on it.

2

Normalmente los campos COMP-3 consisten en BCD dígitos empaquetados en bytes de dos en dos, cada dígito usando un nibble (4 bits). El último dígito va en el nibble superior del último byte. El nibble inferior del último byte tiene 13 si el número es negativo y algo más (generalmente 12) si es positivo. El punto decimal está implícito.

Por ejemplo, -1.2 se ve así en hex, la D final es el signo negativo.

01 2D 

12,345 es:

12 34 5C 
4

aquí es un poco diferente al intento de responder a sus preguntas.

PIC S9 (15) V9 (3) COMP-3 es la siguiente con el archivo:

00 00 00 00 00 00 00 00 00 0F 

Si el valor era -4568248.323, sería:

00 00 00 00 04 56 82 48 32 3D 

Esto no lo ayuda, pero puede ayudar a otros. descomprimido el valor anterior se vería así:

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) 

Este campo cuenta con 15 (16 en realidad) dígitos antes del punto decimal y 3 después.

Aunque solo solicita 18 dígitos (15 + 3), obtiene 19 para que sea un campo de longitud par con el signo (un dígito agregado al frente para que tenga 10 bytes de longitud en el archivo). La mejor práctica es siempre hacer que los campos empaquetados tengan una longitud impar para evitar esta confusión.

** La última letra denota el signo, C & F es positivo, D es negativo. Para su programa, verifique si es negativo (D) y, de no ser así, trátelo como positivo.

** La 'V' es un punto decimal implícito. no existe en el archivo, pero COBOL sabe que está allí para redondear y tal. Necesitas contabilizarlo programáticamente. No hay nada en el archivo que lo ayude a identificar dónde está o si existe.

Los otros dos campos ya son de longitudes impares, por lo que cuando se empaquetan, con el signo, se pueden almacenar en una cantidad de espacio par.

Cualquier otra pregunta, edite su pregunta o pregunte en los comentarios y alguien intentará responder por usted.

1

longitud COMP-3 campos se calcula como el número de dígitos que necesitamos almacenar + 1 dividido por 2. Por ejemplo, para almacenar un campo numérico de valor 987, necesitaríamos 3 +1 dividido por 2 = 2 Por lo tanto, un campo Comp-3 de longitud 2 bytes puede almacenar un valor de +999 hasta -999 como el límite.

15 se almacenaría como 01 5C. Así que los últimos cuatro bits del número se usan para almacenar el signo del número que es C o D, por lo que "C" representa el número positivo y "D" representa el número negativo. Y cada número numérico toma 4 bits para representarse a sí mismos.

Así que un número numérico de 7 dígitos requeriría 7 +1 = 8/2 = 4 bytes de tamaño. Entonces el campo comp-3 de tamaño 4 bytes puede almacenar dígitos numéricos de +999,9999 a -999,9999 dígitos.

En el caso de la pregunta anterior para mover la parte decimal del número necesita definir una variable que puede almacenar solo la porción decimal y mover el valor a ese campo que mantendría solo la porción decimal.

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

necesitamos definir un campo decimal como DEC-PORTION V9 (6) comp-3 y luego mover el FIELD-NAME-3 a DEC-PORTION para retener la parte decimal del valor.

De esta manera podemos tener la porción decimal del número separada del número completo.

Cuestiones relacionadas