Menu

COBOL - String Statement


A instrução STRING agrupa o conteúdo parcial ou completo de dois ou mais itens de dados ou literais em um único item de dados. Uma instrução STRING pode ser escrita em vez de uma série de instruções MOVE.

A instrução STRING é usada para concatenar itens não numéricos. Qualquer número de itens pode ser concatenado. Strings inteiras ou parciais podem ser concatenadas. Para usar a string inteira, delimite-a por tamanho. Para usar apenas uma parte de uma string, delimite-a por qualquer caractere que indique o final dos dados que você deseja concatenar.

Sintaxe:

STRING identifier-1 or literal-1
            DELIMITED BY identifier-2 or literal-2 or SIZE
                 INTO identifier-3
           [WITH POINTER identifier-4]
           [ON OVERFLOW imperative-statement-1]
           [NOT ON OVERFLOW imperative-statement-2]
END-STRING

identificador-1, literal-1 - Representa os campos de envio.

DELIMITED BY - Define os limites da string. Um delimitador para cada conjunto de campos de envio que, se encontrados, faz com que esses campos de envio parem de ser transferidos (DELIMITED BY frase)
  • identificador-2 , literal-2 - É usado como delimitador; ou seja, caracteres que delimitam os dados a serem transferidos.
  • TAMANHO - Transfere toda a área de envio.
EM - Identifica o campo de recebimento (ou seja, identificador-3 - Representa o campo de recebimento).

POINTER - (Opcional) Um item de dados inteiro que indica a posição do caractere mais à esquerda no campo de recebimento para o qual os dados devem ser transferidos (frase COM POINTER).

identifier-4 - (Opcional) Um item de dados inteiro que indica a posição do caractere mais à esquerda no campo de recebimento para o qual os dados devem ser transferidos (frase COM POINTER).

ON OVERFLOW - (Opcional) Ação a ser tomada se o campo de recebimento for preenchido antes que todos os dados de envio tenham sido processados ​​(frase ON OVERFLOW).

END-STRING - Esse terminador de escopo explícito serve para delimitar o escopo da instrução STRING.
STRING Regras:
  • Os campos de recebimento não devem ser:
    • Campo editado
    • Com Cláusula Justificada
    • Com modificação de referência

  • A variável ponteiro deve ser:
    • Elementar e Numérico
    • Grande o suficiente para manter o comprimento máximo do campo de recepção

  • ON OVERFLOW executado quando o ponteiro Valor <= ou excede o comprimento máximo do campo de recebimento

Exemplo 1:

Ao executarmos a instrução STRING abaixo, os resultados obtidos serão semelhantes aos ilustrados na figura após a instrução.

STRING ID-1 ID-2 DELIMITED BY ID-3
            ID-4 ID-5 DELIMITED BY SIZE
  INTO ID-7 WITH POINTER ID-8
END-STRING

image missing

Exemplo 2:

........
FILE SECTION.
01  RCD-01.
    05  CUST-INFO.
        10  CUST-NAME    PIC X(15).
        10  CUST-ADDR    PIC X(35).
    05  BILL-INFO.
        10  INV-NO       PIC X(6).
        10  INV-AMT      PIC $$,$$$.99.
        10  AMT-PAID     PIC $$,$$$.99.
        10  DATE-PAID    PIC X(8).
        10  BAL-DUE      PIC $$,$$$.99.
        10  DATE-DUE     PIC X(8).
........
WORKING-STORAGE SECTION.
77  RPT-LINE             PIC X(120).
77  LINE-POS             PIC S9(3).
77  LINE-NO              PIC 9(5) VALUE 1.
77  DEC-POINT            PIC X VALUE ".".
-----
PROCEDURE DIVISION.
    .......
    MOVE SPACES TO RPT-LINE.
    MOVE 4      TO LINE-POS.

    STRING
          LINE-NO SPACE CUST-INFO INV-NO SPACE DATE-DUE SPACE
      DELIMITED BY SIZE
          BAL-DUE
      DELIMITED BY DEC-POINT
      INTO RPT-LINE
      WITH POINTER LINE-POS
    END-STRING.
    -------
    STOP RUN.

STRING resultados:

Consideremos que o registro RCD-01 contém as seguintes informações (o símbolo b indica um espaço em branco):

J.B.bSMITHbbbbb
444bSPRINGbST.,bCHICAGO,bILL.bbbbbb
A14275
$4,736.85
$2,400.00
09/22/76
$2,336.85
10/22/76

Quando a instrução STRING é executada, os itens são movidos para RPT-LINE conforme mostrado na tabela abaixo.

ItemPositionsData
LINE-NO4 - 800001
Space9b
CUST-INFO10 - 59444bSPRINGbST.,bCHICAGO,bILL.bbbbbb
INV-NO60 - 65A14275
Space66b
DATE-DUE67 - 7409/22/76
Space75b
Portion of BAL-DUE that precedes the decimal point76 - 81$2,336.85

Após a execução da instrução STRING, o valor de LINE-POS é 82 e RPT-LINE possui os valores,

column 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
value     00001 J.B. SMITH   ST., CHICAGO, ILL.                   A14275 10/22/76 $2,336