COBOL - Comando UNSTRING - www.cadcobol.com.br
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.
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
UNSTRING NOME-COMPLETO DELIMITED BY " " INTO PRI-NOME ULT-NOME END-UNSTRING
UNSTRING DADOS-PESSOAIS DELIMITED BY "/" INTO ULT-NOME PRI-NOME ENDERECO CIDADE ESTADO CEP END-UNSTRING
UNSTRING CAMPO-123 DELIMITED BY "*" INTO CAMPO-1 CAMPO-2 CAMPO-3 CAMPO-4 END-UNSTRING
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
UNSTRING CAMPO-ABC DELIMITED BY "/" OR "*" INTO CAMPO-1 DELIMITER IN DELIMITADOR-1 END-UNSTRING
UNSTRING CAMPO-XYZ DELIMITED BY ALL "*" INTO CAMPO-1 CAMPO-2 END-UNSTRING