COBOL - Comando UNSTRING - www.cadcobol.com.br


Volta a página anterior

Volta ao Menu Principal


Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

O seu formato geral é:



O comando UNSTRING serve para extrair caracteres contíguos de um campo, armazenando-os em campos receptores

identifier-1 é o campo de onde serão extraídos os dados.
É denominado emissor.
Cada LITERAL deve ser um literal não-numérico.
identifier-1, identifier-2, identifier-3 e identifier-5 devem ser itens alfanuméricos.

Cada identifier-4 representa um campo receptor.
Pode ser alfabético (sem o caracter "B" em sua PICTURE), alfanumérico ou  numérico (sem o caracter "P" em sua PICTURE) e deve ter USAGE IS DISPLAY.

identifier-7 é um contador cujo valor inicial indica a posição de início no identifier-1 a partir da qual começará a verificação.
Deve ser um item elementar numérico inteiro, com tamanho suficiente para conter um valor igual ao tamanho do identifier-1 + 1.
O caracter "P" não pode ser usado em sua PICTURE.
Este valor deve ser fornecido pelo DESENVOLVEDOR.

identifier-6 e identifier-8 devem ser itens numéricos inteiros, sem o caracter "P" em suas PICTUREs.
Todos os 'identifier' envolvidos não podem ser entradas em nível 88.

As opções DELIMITER e COUNT podem ser usadas apenas com a opção DELIMITED BY.

Cada identifier-2 | literal-1 representa um delimitador.
Pode conter quaisquer caracteres do conjunto de caracteres aceito (ASCII ou EBCDIC).
Se o identifier-2 | literal-1 for uma constante figurativa, implicará na ocorrência de um único caracter desta, como um literal não-numérico.

Quando a opção ALL for usada, uma ou mais ocorrências contíguas do identifier-2 ou literal-1 serão tratadas como uma única ocorrência e esta será movida para o identifier-5.
Quando um delimitador contiver dois ou mais caracteres, todos os caracteres devem estar presentes em posições contíguas do identifier-1 para que sejam reconhecidos como um delimitador.

identifier-6 indica a quantidade de caracteres processado no identifier-1.
São os caracteres a serem movidos para o identifier-4.

identifier-8 é um contador que registra a quantidade de campos receptores ativados durante a execução do UNSTRING.
Se for usado em mais de um UNSTRING, deverá ser zerado antes de cada execução.

Quando em uma pesquisa no identifier-1, forem encontrados dois delimitadores contíguos, o campo receptor corrente será preenchido com zeros ou espaços, conforme a sua categoria.
Quando dois ou mais delimitadores forem especificados na opção DELIMITED BY, existirá um condição "OR" entre eles.
Cada delimitador é comparado com o identifier-1.
Se houver coincidência, os caracteres no identifier-1 serão considerados como um único delimitador.
Cada delimitador é comparado com o identifier-1 na ordem em que aparece no comando.

Quando o UNSTRING é iniciado, o campo receptor corrente é o identifier-4.
Se a opção POINTER for usada, o identifier-1 será verificado a partir da posição especificada no identifier-7.
Se não for usada, o identifier-1 será verificado a partir da sua posição mais à esquerda.

Se a opção DELIMITED BY for usada, a verificação ocorrerá da esquerda para a direita até o identifier-2 ou literal-1 ser encontrado.
Se não for usada, a quantidade de caracteres a ser verificada será igual ao comprimento do campo receptor corrente.
Entretanto, se o sinal do campo receptor for definido como um carcter separado, a quantidade de caracteres verificada será o comprimento do campo receptor corrente menos uma unidade.

Os caracteres examinados (excluindo-se os delimitadores) são tratados como itens elementares alfa-numéricos e são movidos para o campo receptor corrente, conforme as regras do comando MOVE.
Se a opção DELIMITER IN for usada, os caracteres delimitadores serão tratados como itens elementares alfa-numéricos e serão movidos para o identifier-5, conforme as regras do comando MOVE.
Se a opção COUNT IN for usada, será movida para o identifier-6 a quantidade de caracteres processada no identifier-1 (excluindo-se os caracteres delimitadores), de acordo com as regras de movimentação dos itens elementares.
Após os dados terem sido transferidos para o identifier-4, o campo receptor corrente será uma próxima ocorrência do identifier-4.
O conteúdo do identifier-7 é incrementado de uma unidade para cada caracter verificado no identifier-1.

Ao final da execução do UNSTRING com a opçãp WITH POINTER, o identifier-7 conterá um valor igual ao valor inicial mais o numéro de caracteres verificados no identifier-1.

Ao final da execução do UNSTRING com a opção TALLYING, o identifier-8 conterá um valor igual ao seu valor inicial mais a quantidade de campos receptores ativados durante a execução.

A condição de OVERFLOW ocorrerá quando uma da scondições abaixo se verificar:

1. O valor do identifier-1 for menor que 1 ou maior que o comprimento do identifier-1
2. Se durante a execução do UNSTRING, todos os campos receptores foram ativados e o identifier-1 ainda contiver caracteres não verificados.

Quando ocorrer a condição de OVERFLOW, o UNSTRING será terminado e a opção NOT ON OVERFLOW, se especificada, será ignorada.
E o controle será transferido parao fim do UNSTRING ou, para o imperative-ESTADOment-1, se for especificada a opção ON OVERFLOW.

END-UNSTRING é o delimitador do comando.



Primeiro exemplo
         1         2         3         4         5         6         7         8      
12345678901234567890123456789012345678901234567890123456789012345678901234567890

      *-----------------------------------------------------------------
       WORKING-STORAGE SECTION.
      *-----------------------------------------------------------------

       01  WS-AUXILIARES.
           05  WS-NOME-COMPLETO          PIC X(060) VALUE SPACES.
           05  WS-NOME-01                PIC X(020) VALUE SPACES.
           05  WS-NOME-02                PIC X(020) VALUE SPACES.
           05  WS-NOME-03                PIC X(020) VALUE SPACES.

      *-----------------------------------------------------------------
       PROCEDURE DIVISION.
      *-----------------------------------------------------------------

           MOVE 'CARLOS ALBERTO DORNELLES' TO WS-NOME-COMPLETO

           UNSTRING 
                  WS-NOME-COMPLETO DELIMITED BY SPACES
           INTO 
                  WS-NOME-01
                  WS-NOME-02
                  WS-NOME-03
           END-UNSTRING

       Resultado: WS-NOME-01 = CARLOS
                  WS-NOME-02 = ALBERTO
                  WS-NOME-03 = DORNELLES

Outros exemplos
Código COBOL Dados e resultados
UNSTRING NOME-COMPLETO  
         DELIMITED BY " " 
    INTO PRI-NOME ULT-NOME
END-UNSTRING
NOME-COMPLETO = CARLOS DORNELLES

PRI-NOME = CARLOS
ULT-NOME = DORNELLES
UNSTRING DADOS-PESSOAIS 
         DELIMITED BY "/" 
    INTO ULT-NOME PRI-NOME ENDERECO CIDADE 
         ESTADO CEP
END-UNSTRING
DADOS-PESSOAIS = DORNELLES/CARLOS/ASA NORTE /BRASILIA/DF/70000

ULT-NOME = DORNELLES
PRI-NOME = CARLOS
ENDERECO = ASA NORTE
CIDADE = BRASILIA
ESTADO = DF
CEP = 70000
UNSTRING CAMPO-123
         DELIMITED BY "*" 
    INTO CAMPO-1 CAMPO-2 CAMPO-3 CAMPO-4
END-UNSTRING 
CAMPO-123 = AB*CDJKL*MNS*TUV

CAMPO-1 = AB
CAMPO-2 = CDJKL
CAMPO-3 = MNS
CAMPO-4 =T UV
UNSTRING CAMPO-123 
         DELIMITED BY "*" 
    INTO CAMPO-1 COUNT IN CONTADOR-1 
         CAMPO-2 COUNT IN CONTADOR-2 
         CAMPO-3 COUNT IN CONTADOR-3 
         CAMPO-4 COUNT IN CONTADOR-4
END-UNSTRING
 CAMPO-123 = AB*CDJKL*MNS*TUV
CAMPO-1 = AB CONTADOR-1 = 2 CAMPO-2 = CDJKL CONTADOR-2 = 5 CAMPO-3 = MNS CONTADOR-3 = 3 CAMPO-4 = TUV CONTADOR-4 = 3
UNSTRING CAMPO-123 
         DELIMITED BY "*" 
    INTO CAMPO-1 COUNT IN CONTADOR-1 
         CAMPO-2 COUNT IN CONTADOR-2 
         CAMPO-3 COUNT IN CONTADOR-3 
         CAMPO-4 COUNT IN CONTADOR-4 
    WITH POINTER PONTEIRO-01 
    TALLYING IN CONTADOR-01
END-UNSTRING
 CAMPO-123   = AB*CDJKL*MNS*TUV
 PONTEIRO-01 = 1 (antes da execução)
CAMPO-1 = AB CONTADOR-1 = 2 CAMPO-2 = CDJKL CONTADOR-2 = 5 CAMPO-3 = MNS CONTADOR-3 = 3 CAMPO-4 = TUV CONTADOR-4 = 3
PONTEIRO-01 = 16 (depois da execução) CONTADOR-01 = 4
UNSTRING CAMPO-ABC
         DELIMITED BY "/" OR "*"
    INTO CAMPO-1 DELIMITER IN DELIMITADOR-1
         CAMPO-2 DELIMITER IN DELIMITADOR-2
END-UNSTRING
CAMPO-ABC = XYZ/ABC*DEF

CAMPO-1 = XYZ            DELIMITADOR-1 = /
CAMPO-2 = ABC            DELIMITADOR-2 = *
UNSTRING CAMPO-ABC 
         DELIMITED BY "/" OR "*" 
    INTO CAMPO-1 
         DELIMITER IN DELIMITADOR-1
END-UNSTRING
CAMPO-ABC = XYZ/ABC*DEF

CAMPO-1 = XYZ
DELIMITADOR-1 = /
UNSTRING CAMPO-XYZ
         DELIMITED BY ALL "*" 
    INTO CAMPO-1 CAMPO-2
END-UNSTRING
CAMPO-XYZ = JKLMN****STUV

CAMPO-1 = JKLMN
CAMPO-2 = STUV