Tuesday 8 October 2024

A instrução STRING codifica 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.

Read syntax diagramSkip visual syntax diagram>>-STRING------------------------------------------------------->
 
   .-----------------------------------------------------------.
   | .------------------.                                      |
   V V                  |                                      |
>------+-identifier-1-+-+--DELIMITED--+----+--+-identifier-2-+-+-->
       '-literal-1----'               '-BY-'  +-literal-2----+
                                              '-SIZE---------'
 
>--INTO--identifier-3--+---------------------------------+------>
                       '-+------+--POINTER--identifier-4-'
                         '-WITH-'
 
>--+------------------------------------------+----------------->
   '-+----+--OVERFLOW--imperative-statement-1-'
     '-ON-'
 
>--+-----------------------------------------------+------------>
   '-NOT--+----+--OVERFLOW--imperative-statement-2-'
          '-ON-'
 
>--+------------+----------------------------------------------><
   '-END-STRING-'

 

identifier-1, literal-1

Representa os campos de envio .

DELIMITED BY

Define os limites da string.

identifier-2, literal-2

São delimitadores; ou seja, caracteres que delimitam os dados a serem transferidos.

SIZE

Transfere a área de envio completa.

 

INTO

Identifica o campo de recepção.

identifier-3

Representa o campo de recepção .

 

POINTER

Aponta para uma posição de caractere no campo de recebimento. O campo de ponteiro indica uma posição de carácter alfanumérico relativo, posição de carácter DBCS ou posição de carácter nacional quando o campo de recepção é de utilização DISPLAY, DISPLAY-1 ou NATIONAL, respectivamente.

identifier-4

Representa o campo apontador. identifier-4 deve ser suficientemente grande para conter um valor igual ao comprimento do campo de recepção mais 1.

 

Aplicam-se as seguintes regras:

  • Todos os identificadores exceto identifier-4 deve fazer referência a itens de dados descritos de forma explícita ou implicitamente como exibição de uso, DISPLAY-1, ou NATIONAL.
  • literal-1 ou literal-2 deve ser de categoria alfanumérico, DBCS ou NATIONAL e pode ser qualquer constante figurativa que não comece com a palavra ALL (exceto NULL).
  • Se identifier-1 ou identifer-2 faz referência a um item de dados de categoria numérica, cada item numérico deve ser descrito como um inteiro sem o símbolo "P" em seu quadro caractere-string.
  • identifier-3 não deve fazer referência a um item de dados de categoria numérica-editado, alfanumérico-editado, ou nacional-editado; Um item de dados de ponto flutuante externo de uso DISPLAY, ou um item de dados de ponto flutuante externo de uso NACIONAL.
  • identifier-3 não deve descrito com a cláusula justifica.
  • Se identifier-3 é de uso DISPLAY, identificador-1 e identificador-2 deve ser de uso visor e todos os literais devem ser literais alfanuméricos. Qualquer constante figurativa pode ser especificada, exceto uma que começa com a palavra ALL. Cada constante figurativa representa um literal alfanumérico de 1 caractere.
  • Se identifier-3 é de uso DISPLAY-1, identifier-1 e identifier-2 deve ser de uso DISPLAY-1 e todas as literais devem ser literais DBCS. A única constante figurativa que pode ser especificada é SPACE, que representa um literal DBCS de 1 caractere. ALL DBCS-literal não devem ser especificados.
  • Se identifier-3 é de uso NACIONAL, identifier-1 e identifier-2 deve ser de uso nacional e todos os literais devem ser literais nacionais. Qualquer constante figurativa pode ser especificado, exceto simbólica caracteres e um que começa com a palavra ALL. Cada constante figurativa representa um literal nacional de 1 caractere.
  • Se identifier-1 ou identifier-2 faz referência a um item de dados primária do uso de exibição que é descrito como categoria numérico, numérico-editado, ou alfanumérico-editado, o item é tratado como se fosse redefinido como categoria alfanumérico.
  • Se identifier-1 ou identifier-2 faz referência a um item de dados elementar de uso nacional, que é descrito como categoria numérico, numérico-editado, ou item nacional-editado, o item é tratado como se fosse redefinido como categoria nacional.
  • identifier-4 não deve ser descrito com o símbolo P em seu quadro caractere-string.
  • Nenhum dos identificadores em uma instrução STRING pode ser um campo de data com janelas.

A avaliação de subscritos, modificação de referência, comprimento variável, localizações de variáveis ​​e identificadores de função é realizada apenas uma vez, no início da execução da instrução STRING. Portanto, se identifier-3 ou identifier-4 é usado como um índice, referência-modificador, ou argumento de função na instrução cadeia ou afeta o comprimento ou a localização de qualquer dos identificadores na demonstração STRING, os valores calculados para os índices , Modificadores de referência, comprimentos variáveis, locais de variáveis ​​e funções não são afetados por nenhum resultado da instrução STRING.

 

Se identifier-3 e identifier-4 ocupar a mesma área de armazenamento, resultados indefinidos irá ocorrer, mesmo se os identificadores são definidos pela mesma descrição entrada de dados.

Se identifier-1 ou identifier-2 ocupa a mesma área de armazenamento como identifier-3 ou identifier-4, resultados não definidas irá ocorrer, mesmo se os identificadores são definidos pela mesma descrição entrada de dados.

 

ON OVERFLOW

Imperative-statement-1

Executado quando o valor do ponteiro (explícito ou implícito):

  • É menor que 1
  • Excede um valor igual ao comprimento do campo de recebimento

Quando uma das condições acima ocorre, existe uma condição de estouro e não são transferidos mais dados. Em seguida, a operação de STRING é terminada, e NOT ON OVERFLOW, se especificado, é ignorado, e o controle é transferido para o fim da instrução STRING ou, se ON OVERFLOW for especificado, a imperative-statement-1.

 

Se o controle é transferido para imperative-statement-1, a execução continua de acordo com as regras de cada instrução especificada no imperative-statement-1. Se um procedimento de ramificação ou declaração condicional que faz com que a transferência explícita de controle seja executado, o controle é transferido de acordo com as regras para essa instrução; caso contrário, após a conclusão da execução de imperative-statement-1, o controlo é transferido para o fim da instrução STRING.

 

Se no momento da execução de uma instrução STRING, as condições que causariam uma condição de estouro não forem encontradas, então após a conclusão da transferência de dados, ON OVERFLOW, se especificada, será ignorada. O controle é então transferido para o fim da instrução string, ou se NOT ON OVERFLOW for especificado, a imperative-statement-2.

 

Se o controle é transferido para imperative-statement-2, a execução continua de acordo com as regras de cada instrução especificada no imperative-statement-2. Se um procedimento ramificação ou declaração condicional que faz com que a transferência explícita de controle é executado, controle é transferido de acordo com as regras para essa declaração. Caso contrário, depois de concluída a execução dos imperative-statement-2, o controlo é transferido para o fim da instrução STRING.

 

END-STRING

Este terminador de escopo explícito serve para delimitar o escopo da instrução STRING. END-STRING permite que uma instrução STRING condicional seja aninhada em outra instrução condicional. END-STRING também pode ser usado com uma instrução STRING imperativa.

 

Fluxo de dados

Quando a instrução STRING é executada, os caracteres são transferidos dos campos de envio para o campo de recepção. A ordem na qual os campos de envio são processados ​​é a ordem na qual eles são especificados.

Aplicam-se as seguintes regras:

  • Os caracteres dos campos de envio são transferidos para os campos de recepção da seguinte maneira:
    • Para os campos de envio nacionais, os dados são transferidos usando as regras da instrução MOVE para movimentos elementares de nacional para nacional, exceto que não há preenchimento de espaço.
    • Para campos de envio de DBCS, os dados são transferidos usando as regras da instrução MOVE para movimentos DBCS-para-DBCS elementares, exceto que não ocorre preenchimento de espaço.
    • Caso contrário, os dados são transferidos para os campos que recebem usando as regras da declaração jogada para movimentos elementares alfanumérico-a-alfanumérico, exceto que nenhum enchimento espaço tem lugar (ver comunicado MOVIMENTO ).
  • Quando delimitada por identifier-2 ou literal-2 é especificado, o conteúdo de cada item de envio são transferidos, caractere por caractere, começando com a posição do carácter mais à esquerda e continuando até que:
    • É alcançado um delimitador para este campo de envio (o delimitador propriamente dito não é transferido).
    • O caractere mais à direita deste campo de envio foi transferido.
  • Quando DELIMITED BY SIZE é especificado, cada campo de envio inteiro é transferido para o campo de recebimento.
  • Quando o campo de recebimento é preenchido ou quando todos os campos de envio foram processados, a operação é encerrada.
  • Quando POINTER é especificada, um campo ponteiro explícito está disponível para o usuário COBOL controlar a colocação de dados no campo de recebimento. O usuário deve definir o valor inicial do ponteiro explícito, que não deve ser menor que 1 e não mais do que a contagem de posição de caracteres do campo de recebimento.

Nota: O ponteiro de campo deve ser definido como um campo suficientemente grande para conter um valor igual ao comprimento do campo de recepção mais 1; Isso impede o estouro aritmético quando o sistema atualiza o ponteiro no final da transferência.

  • Quando POINTER não é especificada, nenhum ponteiro está disponível para o usuário. No entanto, um ponteiro conceptual implícito com um valor inicial de 1 é utilizado pelo sistema.
  • Conceitualmente, quando a instrução STRING é executada, o valor inicial do ponteiro (explícito ou implícito) é a primeira posição de caractere dentro do campo de recebimento no qual os dados devem ser transferidos. Começando nessa posição, os dados são posicionados, caráter a caráter, da esquerda para a direita. Depois que cada caractere é posicionado, o ponteiro explícito ou implícito é aumentado em 1. O valor no campo do ponteiro é alterado somente dessa maneira. No final do processamento, o valor do ponteiro indica sempre um valor igual a uma posição de carácter para além do último carácter transferido para o campo de recepção.

Após a conclusão da instrução STRING, somente a parte do campo de recebimento em que os dados foram transferidos é alterada. O restante do campo de recebimento contém os dados que estavam presentes antes desta execução da instrução STRING.

Quando a seguinte instrução STRING é executada, os resultados obtidos serão como os 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