Referencia de comandos de qsam

Mainframe Connector transcodifica archivos planos de método de acceso secuencial en cola (QSAM) a Google Cloud formatos compatibles y viceversa mediante los comandos qsam. Los comandos qsam realizan las siguientes operaciones de transcodificación:

  • El comando qsam decode decodifica los datos de mainframe en Google Cloud
  • El comando qsam encode codifica Google Cloud datos en el mainframe.

Estas operaciones realizan transformaciones simétricas, es decir, mueven los mismos datos hacia y desde Google Cloud. Puedes definir la estructura de un archivo QSAM en un archivo de libro de copias mediante la definición de estructura de datos de COBOL. También puedes definir transformaciones avanzadas con el archivo de configuración del transcodificador de Mainframe Connector. En los siguientes diagramas se describen estas operaciones en detalle.

Decodificar datos de mainframe a Google Cloud
Decodificar datos de mainframe Google Cloud
Codificar datos de mainframe de Google Cloud
Codificar datos Google Cloud en el mainframe

En esta página se ofrece una descripción general del proceso de transcodificación mediante los comandos qsam decode y qsam encode, los tipos físicos y lógicos de datos de mainframe, y las asignaciones de tipos de Optimized Row Columnar (ORC) y BigQuery.

Tipos físicos

Los tipos físicos definen cómo se organizan los datos de los campos en un disco. Los tipos físicos se convierten en tipos lógicos de Mainframe Connector, que se pueden asignar a tipos de bases de datos (ORC o BigQuery).

Campos alfanuméricos

Los campos alfanuméricos se usan para procesar cadenas alfanuméricas. Los datos se tratan como una serie de caracteres y se almacenan como cadenas con una codificación específica, por ejemplo, el código de intercambio decimal codificado en binario extendido (EBCDIC). El proceso de transcodificación no finaliza si se produce algún error durante la codificación o decodificación de campos alfanuméricos. En su lugar, se coloca un carácter SUB para la codificación en la ubicación donde se ha producido el error y el proceso de transcodificación continúa.

Símbolos de imágenes Atributos de imagen Tipo lógico
A, B, G, N, U, X, 9 DISPLAY, DISPLAY-1, NATIONAL, UTF-8 Cadena

Ejemplo

01 REC
  02 STR      PIC X(10)
  02 NATIONAL PIC N(10)
  02 UTF8     PIC U(1) USAGE UTF-8

Formato de codificación

Los campos alfanuméricos se codifican de la siguiente manera:

  • Los campos X tienen la codificación EBCDIC de forma predeterminada
  • Los campos nacionales (N) tienen como valor predeterminado la codificación Unicode Transformation Format de 16 bits (UTF-16 BE).
  • Los campos UTF8 tienen como valor predeterminado la codificación Unicode Transformation Format-8 (UTF-8).

Mainframe Connector admite la mayoría de las codificaciones de conjuntos de caracteres de un solo byte (SBCS) y de doble byte (DBCS). También puedes definir tu propia codificación SBCS personalizada, si es necesario.

Campos binarios (COMPUTACIONAL)

Los campos binarios se almacenan como números enteros big-endian con o sin signo. Mainframe Connector siempre almacena los campos binarios de forma lógica como enteros de 64 bits con signo. Por lo tanto, las entradas unsigned long solo deben usar los 63 bits inferiores. De lo contrario, el proceso de transcodificación fallará.

Símbolos de imágenes Atributos de imagen Tipo lógico
S, 9 COMP, COMPUTATIONAL Largo (entero con signo de 64 bits)

Ejemplo

01 REC
  02 INT PIC S9(8) COMP

Campos de punto flotante hexadecimal (COMP-1, COMP-2)

Los campos de punto flotante hexadecimal (HFP) se admiten completamente. Mainframe Connector usa formatos de precisión simple y doble para los campos HFP.

Símbolos de imágenes Atributos de imagen Tipo lógico
COMP-1, COMP-2 Doble (punto flotante con signo de 64 bits)

Ejemplo

01 REC
  03 HFP-SINGLE COMP-1.
  03 HFP-DOUBLE COMP-2.

Campos decimales empaquetados (COMP-3)

Los campos decimales empaquetados son totalmente compatibles. Durante el proceso de transcodificación, Mainframe Connector selecciona el tipo lógico con mejor rendimiento en función de la precisión y la escala especificadas.

Símbolos de imágenes Atributos de imagen Tipo lógico
S, 9 y V COMP-3 Largo (entero de 64 bits con signo), BigInteger, Decimal64 y BigDecimal

Ejemplo

01 REC
  02 DEC PIC S9(2)V9(8) COMP-3

Campo decimal zonificado (DISPLAY)

Los campos decimales zonificados son totalmente compatibles. Durante el proceso de transcodificación, Mainframe Connector selecciona el tipo lógico con mejor rendimiento en función de la precisión y la escala especificadas.

Símbolos de imágenes Atributos de imagen Tipo lógico
S, 9 y V DISPLAY Largo (entero de 64 bits con signo), BigInteger, Decimal64 y BigDecimal

Ejemplo

01 REC
  02 DEC PIC S9(2)V9(8) DISPLAY

Listas (OCCURS)

Las listas son colecciones ordenadas de elementos del mismo tipo. Mainframe Connector admite los siguientes tipos de listas:

Listas fijas

Las listas fijas se usan cuando se conoce de antemano el número exacto de elementos que formarán parte de la lista y este número siempre es el mismo. Los elementos de una lista fija pueden tener un tamaño variable.

Las listas fijas se definen de la siguiente manera en un copybook:

       01 REC.
         02 LIST OCCURS 5 TIMES       PIC X(1).
         02 FLD                       PIC X(5).

En la siguiente imagen se muestra el diseño de una lista fija con un recuento de elementos de 5.

Diseño de una lista fija
Diseño de una lista fija

Listas dinámicas

Las listas dinámicas se usan cuando se conoce de antemano el número máximo de elementos que formarán parte de la lista. Sin embargo, el recuento de elementos real se desconoce y depende de otro campo. Los elementos de una lista dinámica pueden tener un tamaño variable.

Las propiedades de las listas dinámicas son las siguientes:

  • El campo de longitud se puede convertir en un número entero sin perder precisión.
  • El campo de longitud debe estar en scope.
  • No se aplica un número mínimo de elementos durante el proceso de transcodificación.

Las listas dinámicas se definen de la siguiente manera en un copybook:

01 REC.
  02 LEN                      PIC S9(2) BINARY.
  02 LIST OCCURS 1 TO 5 TIMES
    DEPENDING ON LEN          PIC X(1).
  02 FLD                      PIC X(5).

En la siguiente imagen se muestra el diseño de una lista dinámica con un máximo de cinco elementos.

Diseño de una lista dinámica
Diseño de una lista dinámica

Listas dinámicas empaquetadas

Las listas dinámicas empaquetadas se usan cuando el número máximo de elementos que formarán parte de la lista depende de otro campo y los elementos están empaquetados.

Las propiedades de las listas dinámicas empaquetadas son las siguientes:

  • El campo de longitud se puede convertir en un número entero sin perder precisión.
  • El campo de longitud debe estar en scope.
  • No se aplica un número mínimo de elementos durante el proceso de transcodificación.

Las listas dinámicas empaquetadas se definen de la siguiente manera en un copybook:

01 REC.
  02 LEN                       PIC S9(2) BINARY.
  02 LIST OCCURS UNBOUNDED
      DEPENDING ON LEN         PIC X(1).
  02 FLD                       PIC X(5).

En la siguiente imagen se muestra el diseño de una lista dinámica empaquetada.

Diseño de una lista dinámica empaquetada
Diseño de una lista dinámica empaquetada

Redefiniciones (REDEFINES)

Redefiniciones es una función de COBOL que permite que los mismos datos tengan varias posibilidades de decodificación. Durante el proceso de decodificación, las redefiniciones aparecen como columnas adicionales en la tabla resultante y los datos se decodifican varias veces.

Las propiedades de las redefiniciones son las siguientes:

  • Las redefiniciones de los mismos datos subyacentes no son campos del mismo nivel y, por lo tanto, no están en el ámbito entre sí.
  • Los campos redefinidos se decodifican cuando se decodifica el campo subyacente, no cuando se declaran. El campo subyacente también determina el ámbito de los campos redefinidos.
  • Todos los campos redefinidos deben tener el mismo tamaño y un tamaño fijo. Esto significa que no puedes usar campos de texto de longitud variable ni listas dinámicas empaquetadas en campos redefinidos.

Las redefiniciones se definen de la siguiente manera en un copybook:

01  Rec.
05  Field-1   PIC X(100).
05  Group-1 REDEFINES Field-1.
  10  Field-2 PIC 9(5) comp-3.
  10  Field-3 PIC X(96).
05  Group-2 REDEFINES Field-1.
  10  Field-4 PIC 9(4) comp-4.
  10  Field-5 PIC X(50).
  10  Field-6 PIC X(46).

En la siguiente imagen se muestra el diseño de un campo redefinido.

Diseño de un campo redefinido
Diseño de un campo redefinido

Puedes usar las redefiniciones de muchas formas, entre las que se incluyen las siguientes, que son las más habituales:

  • Ver los mismos datos de dos formas diferentes: esta es la forma más habitual de usar las redefiniciones. Durante el proceso de codificación, el orden en el que se rellenan los datos no está definido, por lo que debe asegurarse de que los datos de BigQuery conserven su integridad al exportarse.

    Ejemplo

    01 REC.
      02 FULL-NAME                  PIC X(12).
      02 NAME REDEFINES FULL-NAME.
        05 FIRST-NAME               PIC X(6).
        05 LAST-NAME                PIC X(6).
    
  • Usar uniones etiquetadas: las uniones etiquetadas son una forma habitual de usar redefines cuando solo necesitas una de las interpretaciones de los datos de cualquier registro, en función de un campo. Puedes usar indicadores nulos para marcar las interpretaciones innecesarias como nulas. Esto también evitará que se analicen debido a que los indicadores nulos tienen evaluaciones diferidas. Las propiedades de las uniones etiquetadas son las siguientes:

    • El proceso de codificación falla si se define más de una redefinición.
    • Solo se implementan comprobaciones de igualdad y desigualdad.

    Ejemplo

    01  REC.
    05  TYPE      PIC X(5).
    05  DATA      PIC X(100).
    05  VARIANT-1 REDEFINES DATA.
      10  Field-2 PIC 9(4) comp-3.
      10  Field-3 PIC X(96).
    05  VARIANT-2 REDEFINES DATA.
      10  Field-4 PIC 9(4) comp-5.
      10  Field-5 PIC X(50).
      10  Field-6 PIC X(46).
    

    Puedes usar el siguiente ejemplo para implementar una unión etiquetada:

    {
      "field_override": [
        {
            "field": "VARIANT-1",
            "modifier": {
              "null_if": {
                "target_field": "TYPE",
                "non_null_value": "VAR1"
              }
            }
        },
        {
            "field": "VARIANT-2",
            "modifier": {
              "null_if": {
                "target_field": "TYPE",
                "non_null_value": "VAR2"
              }
            }
        }
      ],
      "transformations": [
        {
          "field": "DATA",
          "transformation": { "exclude": {}}
        }
      ]
    }
    

Tipos lógicos

Para transcodificar datos a varios formatos y desde ellos, Mainframe Connector convierte todos los datos a una representación intermedia (RI) basada en tipos lógicos. Los formatos de entrada y salida definen cómo se convierten los datos a y desde cualquier tipo lógico. En la siguiente tabla se enumeran todos los tipos lógicos admitidos por Mainframe Connector.

Tipo lógico Descripción
BigDecimal Representa números decimales de cualquier escala y precisión.
BigInteger Representa números enteros de cualquier tamaño.
Bytes Representa una matriz de bytes de tamaño variable.
Fecha Representa una fecha independiente de una zona horaria específica.
Decimal64 Representa un decimal con un intervalo que puede caber en un entero de 64 bits con signo de cualquier escala.
Doble Representa un número de punto flotante de doble precisión, tal como se describe en el estándar IEEE para aritmética de punto flotante (IEEE 754).
Lista Representa una lista de elementos de un tipo específico. La lista puede contener un número arbitrario de elementos.
Long Representa un número con signo de 64 bits.
Grabar Representa una serie fija de campos de diferentes tipos.
Cadena Representa una cadena de caracteres Unicode que no está relacionada con ninguna codificación específica. . Se puede representar cualquier punto de código Unicode válido. Sin embargo, es posible que algunos caracteres no se puedan codificar en todos los procesos de codificación. Las cadenas lógicas tienen una longitud variable.
Marca de tiempo Representa una marca de tiempo independiente de una zona horaria específica.

Asignación de tipos de ORC

En la siguiente tabla se muestra la asignación entre los tipos lógicos de Mainframe Connector y los tipos ORC.

Tipo lógico Tipo de ORC
BigDecimal decimal
BigInteger decimal
Bytes blob binario
Fecha fecha
Decimal64 decimal64
Doble float64
Lista list
Long Entero de 64 bits (bigint)
Grabar tipo STRUCT
Cadena Cadena codificada en UTF-8
Marca de tiempo Marca de tiempo (sin la zona horaria local)

Asignación de tipos de BigQuery

En la siguiente tabla se muestra la asignación entre los tipos lógicos de Mainframe Connector y los tipos de datos de BigQuery.

Tipo lógico Tipo de datos de BigQuery Comentarios
BigDecimal NUMERIC
BigInteger NUMERIC
Bytes BYTES
Fecha FECHA
Decimal64 NUMERIC
Doble FLOAT64
Lista ARRAY No se admiten listas anidadas ni listas de mapas.
Long INT64
Grabar STRUCT Cuando una unión solo tiene una variante, se convierte en un campo NULLABLE. De lo contrario, una unión se convierte en un RECORD con una lista de campos NULLABLE. Los campos que aceptan valores NULL tienen sufijos como field_0 y field_1. Solo se asigna un valor a uno de estos campos cuando se leen los datos.
Cadena STRING
Marca de tiempo TIMESTAMP

Ámbito de los campos

Se considera que un campo está en el ámbito de otro campo si cumple una de las siguientes condiciones:

  • Un campo hermano que se define antes del campo que lo requiere.
  • Un campo de un registro principal que se define antes del campo que lo requiere.