CICS

INTRODUCAO


O Que é Cics ?

O CICS (Customer Information Control System), que é composto de vários módulos/programas de gerenciamento, é um sistema de dados e de comunicação de dados desenvolvido pela IBM para rodar em equipamentos IBM e compatíveis. Este sistema permite que sejam transmitidos dados de um terminal para o computador, que estes dados sejam processados, acessem arquivos (podem ser também bancos de dados) e sejam então transmitidos de volta ao terminal de origem.

Para este processamento, o sistema precisa usar um software de telecomunicações (por exemplo , VTAM, TCAM ou BTAM) e um ou mais dos seguintes métodos de acesso : VSAM, BDAM, ISAM ou DL/I. Desta maneira, pode-se dizer que o CICS é um sistema de banco de dados/comunicação de dados (DB/DC). O CICS irá suportar as seguintes linguagens de programação : COBOL, Assembler, PL/I e RPG II.

O CICS pode ser executado sob os sistemas MVS, VSE, VM ou OS/2. Os programas podem ser transportados de um ambiente para outro com pouca ou mesmo nenhuma alteração.

Existem também dois níveis de codificação do CICS, a saber : Macro, que é similar ao assembler; e Command, que é similar ao COBOL. É importante não esquecer que o CICS roda sob o controle do sistema operacional. A forma semelhante ao Assembler é chamada de MACRO LEVEL e a outra forma de codificar instruções para o CICS em um programa é o COMMAND LEVEL

O que é processamento ON-LINE ?

Processamento ON-Line do ponto de vista do CICS é o recebimento de informações (dados) do terminal, manipulação destas informações e, a seguir o envio de uma mensagem de volta ao usuário. Tudo isto pode normalmente ser feito em questão de segundos em um sistema CICS. Neste tipo de transação , cada vez que o operador pressiona a tecla ENTER, o software de comunicação verifica se o terminal é válido. Isso é possível graças a tabela de controle de terminal (TCT). As informações sobre o terminal, basicamente, seriam : identificação do terminal, modelo, tamanho da tela e status.

Podemos entender que as aplicações Batch são diferentes das aplicações ON-Line tendo em vista que cada uma trabalha em uma área específica. Dentro de sua região o CICS trabalha com várias aplicações simultaneamente, pois, trata-se de uma das características multi-tarefas do CICS.

Para que esses recursos sejam utilizados de maneira satisfatória é preciso observar que um programa de aplicação não pode se comunicar diretamente com o sistema operacional. Para tanto, quando isso se fizer necessário, a aplicação deve recorrer ao CICS que então irá se comunicar com o sistema operacional.

Devemos considerar também que o programa de aplicação não deve abrir ou fechar arquivos, pois, o CICS executará essas funções no momento apropriado. Quanto à um programa COBOL, devemos considerar que o comando STOP RUN/GOBACK é preciso, porém, quando um desses comandos é executado o programa encerra o CICS, fazendo com que toda a rede entre em OFF Line.

Dessa forma, afim de atender ao COBOL e ao CICS ao mesmo tempo, colocamos essas instruções em uma região do programa CICS a qual não será executada. Essa área será após o comando RETURN ou XTCL. (veremos adiante). Toda aplicação ON-Line deve retornar o controle para o CICS.

O CICS divide a memória utilizada basicamente em 2 partes :

• Núcleo : Contém os módulos e tabelas do CICS.

Módulos Principais


TCP (Terminal Control Program) - Controla o envio e recebimento de mensagens envolvendo terminais.

KCP (Task Control Program) - Controla as múltiplas Task que estão sendo executadas concorrentemente. Para cada task, o KCP cria um bloco na DAS chamado TCA (Task Control Área), que contém informações sobre a task (registradores do programa, endereço do terminal associado, número da task, etc.).

PCP (Program Control Program) - Controla a execução de programas de aplicação; gerencia programas e tabelas.

FCP (File Control Program) - Controla e manipula datasets VSAM e BDAM.

SCP (Storage Control Program) - Embora transparente ao programador, este módulo é muito importante, pois gerencia toda a memória utilizada na execução do CICS.

DAS (Dynamic Storage Area) - É uma área de memória reservada pelo CICS em tempo de inicialização para armazenar principalmente dados de utilização temporária. Os programas de aplicação, áreas de trabalho de aplicações, algumas áreas de controle do CICS são armazenados nesta área. A DAS alocada acima da linha dos 16 Mb é chamada EDSA (Extended DSA).

Tabelas CICS


O CICS administra recursos do usuário que estão definidos em tabelas. Estas tabelas podem ser compiladas e serão carregadas na memória na fase de inicialização do CICS.

As quatro principais tabelas do CICS são :

TCT (Terminal Control Table) - Contém a descrição dos terminais a serem reconhecidos pelo CICS. Para cada terminal deve ser criada uma entrada e infomado o nome pelo qual o CICS reconhecerá este terminal e como ele é reconhecido pela rede, e também as características deste terminal (impressora ou vídeo, por exemplo).

PCT (Program Control Table) Contém os dados das transações que podem ser solicitadas, como nome do programa a ser acionado, prioridade , etc.

PPT (Processing Program Table) - Descreve as características dos programas que podem ser executados. Devem ser informados nome do programa, linguagem, etc.

FCT (File Control Table) - armazena as informações referentes às características dos arquivos que serão manipulados pelo CICS. Devem ser informados nome, método de acesso, operações permitidas (READ, UPDATE, INSERT, etc.).

O processamento de uma transação é iniciado quando o operador tecla o código no terminal. É possível executar uma mesma transação em dois ou mais terminais concorrentes e o CICS atribui um número para cada task. As instruções do programa (Procedure Division no COBOL) são partilhadas por todas as tasks, mas a área de dados (Working-Storage Section, no COBOL) é copiada para cada task.

Os programas projetados com esta característica são chamados de semi-reentrantes. As áreas referentes a Procedure, a Working e as áreas criadas para gerenciamento da task estão localizados na DAS (Dynamic Storage Area).


CONCEITOS DE PROGRAMAÇÃO


O interface de nível de comando é uma interface entre seus programas de aplicação e o CICS. Essa interface elimina a necessidade de se aprender a estrutura interna e operação do CICS. Permite ainda que se programe uma aplicação “ON LINE” da mesma forma que você faria em uma aplicação BATCH.

Uma aplicação onde a interface de nível de comando (COMMAND LEVEL) está sendo utilizada permite que sejam solicitados serviços ao CICS. Os comandos CICS são tratados pelo EXEC Interface Program, que aciona o módulo responsável pelo serviço solicitado.

Através do COMMAND LEVEL, o programa pode solicitar serviços de :

Terminais (Send, Receive, etc.)
Arquivos (Reads, Rewites, etc.)
Programas (Links, loads, etc.)

Durante a execução de uma aplicação CICS um programa pode manipular outra transação com a mesma identificação que é iniciada de outro terminal. Dentro desse conceito um programa de aplicação pode ser carregado apenas uma vez e múltiplas tarefas podem ser executadas. Todavia, somente a parte executável do programa é compartilhada.

O CICS proporciona uma cópia da memória de trabalho do programa para cada tarefa que executa o programa. Isto é possível tendo em vista que o conteúdo da memória de trabalho variará de uma tarefa para outra.

Toda memória adquirida e liberada dinamicamente durante a execução de uma tarefa é parte da área de memória dinâmica do CICS (DAS). Assim a cópia da tarefa de uma memória de trabalho do programa está colocada na DAS.

Quando imaginamos uma transação que recebe uma chave de registro a partir da tela, lê este registro e exibe-o na tela, temos uma solicitação de serviço ao CICS (Receive, Send, Read, etc.). A task então passa o controle ao CICS, o qual dará prosseguimento a outras transações de maior prioridade.

Terminal Control Task Control Program Control User Program Storage Control File Control
Inicializa Tarefa Valida
Solicita Armazenamento Ativa Memoria
Agenda Tarefa
Dispara Tarefa Seleciona e Carrega Programa Requisita Receive
Aguarda Solicita Area de Registro Ativa Memoria Requisita area de Entrada
Aguarda Formata Saida de Terminal Leitura de Registro
Grava Agenda Requisita envio de Terminal
Finaliza Tarefa Termina Transacao Retorno Libera Area de Memoria
Grava

FORMATO DE COMANDOS


Os comandos em CICS devem ser iniciados pelas palavras-chave EXEC-CICS seguidas pela função e opções/argumentos desejados. Em programas COBOL, é necessário o terminador END-EXEC.

A função presente na cláusula EXEC CICS é uma palavra-chave que descreve a operação solicitada.

Exemplo :

READ – especifica que um registro de arquivo será lido.

A opção é uma palavra-chave que descreve recursos à disposição em cada função. Algumas opções são seguidas por um argumento entre parênteses e outras não.

Exemplo :

DATASET(‘PAYROLL’) RIDFLD(RECKEY) GTEQ.

As opções podem ser codificadas em qualquer ordem. Os possíveis valores de argumentos que podem ser especificados nos comandos são nome, ponteiro, área de dados, rótulo e valor de dados.

No exemplo abaixo temos a solicitação de uma leitura do registro do arquivo CCCONTA, cuja chave está no campo CC-CONTA, e o registro deve ser copiado na área CC-AREA.

Exemplo :

EXEC CICS READ FILE(‘CCCONTA’)
RIDFLD(CC-CONTA)
INTO(CC-AREA)
END-EXEC.

Ou ainda, em outro exemplo, em um programa que :

• Solicita que os dados entrados pelo terminal fiquem disponíveis para acesso (RECEIVE);

• Move o campo recebido do terminal para a área de chave do registro;

• Lê o registro do arquivo CCCONTA que possui chave igual ao campo CC-CONTA, tornando-o disponível na área CC-AREA;

• Envia os dados de volta para o terminal que iniciou a transação (SEND);

• Devolve o controle (RETURN).

Teríamos :

EXEC CICS RECEIVE
MOVE CONTACORR TO CC-CONTA
MOVE ….
MOVE ….
MOVE ….
EXEC CICS READ FILE(‘CCCONTA’)
INTO(CC-AREA)
RIDFLD(CC-CONTA)
EXEC CICS SEND
EXEC CICS RETURN
END-EXEC.

Para ilustrarmos o uso de argumentos, vamos utilizar, como exemplo, a situação em que temos o arquivo CCCONTA e necessitamos ver se um cliente já está cadastrado neste arquivo. Assim sendo, quando a requisição de leitura do arquivo for passada para o CICS, será preciso incluir o nome do arquivo. Isto será codificado como um DATASET. Uma outra maneira de indicar o nome para o DATASET, pode ser :

WORKING-STORAGE SECTION.
WSWORKAREA.
02 ARQCONTA
PROCEDURE DIVISION.
EXEC CICS READ
DATASET(ARQCONTA) ou DATASET(‘CCCONTA’)

Portanto, o argumento NOME pode ser tanto um literal ou uma variável que contenha um valor. O próximo tipo de argumento (área-de-dados) será usado para indicar onde , na área de trabalho (Working), queremos que o registro seja colocado – INTO(área-de-dados). Podemos usar área-de-dados como um item de grupo ou item elementar.

Exemplo :

WORKING-STORAGE SECTION.
WSWORKAREA.
02 ARQCONTA
CC-AREA.
02 REG-CONTA
PROCEDURE DIVISION.

EXEC CICS READ
DATASET(ARQCONTA) ou DATASET(‘CCCONTA’)
INTO(CC-AREA) ou INTO(REG-CONTA)

Temos ainda que informar ao CICS o tamanho da área de dados (área-tam), e neste caso área-de-dados tem que ser um item elementar com tamanho de meia palavra ou palavra inteira, contendo o valor do tamanho. Estes tamanhos são normalmente especificados como meia palavra binária.

WORKING-STORAGE SECTION.
WSWORKAREA.
02 ARQCONTA
02 AREA-TAM
CC-AREA.
02 REG-CONTA

PROCEDURE DIVISION.
EXEC CICS READ
DATASET(ARQCONTA)
INTO(CC-AREA)
LENGHT(AREA-TAM)

Tendo em vista que utilizamos comandos do CICS dentro de um programa COBOL, vamos fazer uma revisão :

NOME – Literal DATASET(‘CCCONTA’) ou uma variável DATASET(ARQCONTA).

Área-de-dados – Uma variável de grupo ou elementar INTO(CC-AREA) OU INTO(REG-CONTA).

Tamanho da área – Uma variável elementar de meia ou palavra inteira LENGTH(AREA-TAM).

Quanto ao rótulo e ao ponteiro, teremos exemplos posteriormente que ilustrarão o uso desses conceitos.


TRATAMENTO DE ERROS


O erro em um programa CICS é considerado como uma condição de exceção. Essa condição representa uma situação anormal que pode ter ocorrido durante a execução de um comando CICS. Por exemplo, uma condição de exceção ocorre quando um registro solicitado não pode ser encontrado no arquivo designado.

O tratamento das condições de exceção dentro de um programa CICS, permite ao programador um controle através de rotinas que irão manusear os erros. Para isso, o CICS possui o comando HANDLE, o qual permite que o programador especifique a ação a ser tomada em qualquer situação anormal.

O comando HANDLE

O comando HANDLE possui o seguinte formato :

EXEC CICS HANDLE CONDITION opção (argumento)

Sendo que :

• Opção : é uma palavra-chave que identifica a condição de exceção. Podem ser especificadas até 12 condições em um comando e em qualquer ordem.

Exemplo : DUPREC – chave duplicada e NOTFND – Registro não encontrado

• Argumento : É o nome da rotina dentro do programa na qual será realizado o desvio quando a condição de exceção ocorrer. O nome do parágrafo é escrito entre parênteses imediatamente após a condição.

Supondo que se queira gravar um novo registro em um arquivo, porém, já exista um outro registro com a mesma chave, poderemos manusear essa condição de erro (registro duplicado) da seguinte forma :

EXEC CICS HANDLE CONDITION DUPREC(DUPLICADO)
ERROR(ERRTN)
END-EXEC.

Na codificação acima, temos que o programa deverá desviar para o parágrafo DUPLICADO sempre que uma chave duplicada for encontrada. Para as demais condições de exceção uma rotina geral de erro poderá ser usada para manipulá-las.


CONTROLE DO TERMINAL


O controle das funções em terminal é realizado pelo TCP (Terminal Control Program), que conforme já vimos, é o módulo de gerência que proporciona o interface de comunicações com o programa de aplicação. O programa de aplicação carrega o TCP que então controlará as comunicações com os terminais da rede. Isso ocorre através de um dos métodos de acesso de telecomunicações (VTAM, TCAM, BTAM).

As principais funções do Terminal Control Program, são :

• Solicitar aos terminais que estes enviem suas transações;

• Transferir dados entre o programa de aplicação e o terminal : Observe que as transferências de dados são pedidas pelo programa de aplicação, porém, estas não são executadas pelo TCP;

• Manusear as exigências de comunicação de hardware : O TCP é responsável pela transmissão real de uma mensagem por linhas de comunicação. Isto poderia envolver a tradução da mensagem no código de transmissão requerido, inserindo ou removendo caracteres de controle de transmissão, e manipulando as exigências de endereçamento para certos tipos de terminais.

• Pesquisar a TCT (Terminal Control Table) : Cada terminal na rede é identificado por uma entrada única na TCT. A entrada é chamada Terminal Control Table Terminal Entry (TCTTE). Quando os dados estiverem prontos para serem enviados para o terminal, uma indicação é posta na TCTTE. O TCP pesquisa a TCT periodicamente e faz com que os dados sejam enviados para os respectivos terminais.

• Pedir a iniciação de uma nova tarefa : Quando um operador entrar uma identificação da transação, o CICS inicia uma nova tarefa. Todos os comandos de E/S encontrados durante a execução desta tarefa são endereçados exclusivamente ao terminal que entrou a identificação da transação.

O TCP pode ainda trabalhar com dois tipos de formatos CRT. O primeiro tipo é utilizado para uma tela não formatada, que permite ao operador entrar com dados em qualquer lugar da tela, e o programa de aplicação então recebe exatamente o que foi teclado

O outro tipo utilizado é para telas formatadas. Este tipo de telá possuirá campos pré-definidos onde dados podem ser informados. Normalmente existem campos de títulos na tela.

—-

Área de Entrada/Saída de Terminal (TIOA)


Quando o terminal enviar uma transação para o Terminal Control Program, a entrada é colocada numa área especial de E/S chamada de Área de Entrada/Saída de Terminal (TIOA). Esta área é adquirida dinamicamente pelo CICS antes de o programa de aplicação correspondente for carregado na memória. O pedido de transação colocado na memória consiste de uma identificação de transação de um a quatro caracteres tipicamente seguida de um caracter em branco e então por dados de entrada. A identificação de transação mostra qual o programa de aplicação a ser executado.

Logo que o programa de aplicação para uma dada transação estiver na memória e em execução, os dados de entrada na TIOA são deslocados da TIOA para a área de trabalho definida no programa de aplicação. A transferência de dados da TIOA é manipulada pelo CICS – um processo que é transparente para o programa de aplicação.

Um dos comandos utilizados para receber e enviar dados a partir de um teminal é o RECEIVE. Um comando RECEIVE deve ser codificado para cada operação que envolva a entrada de um terminal.

O comando RECEIVE possui como formato geral o seguinte :

EXEC CICS RECEIVE INTO (AREA-DE-DADOS ) LENGTH (AREA-DE-MSG)
END-EXEC.

Tanto a área-de-dados quanto a área-de-msg devem ter os nomes das áreas de trabalho em seu programa de aplicação. A especificação de LENGTH deve representar o comprimento máximo de qualquer mensagem que será exibida em seu programa. Ela deve ser especificada como um campo binário de dois bytes.

Tipicamente a mensagem de entrada é menor ou igual à área de dados especificada na opção INTO. O CICS colocará a mensagem na área-de-dados. Os bytes mais a direita restantes serão alterados se a mensagem menor que a área-de-dados.

Se a mensagem for maior que o campo área-de-msg, o CICS truncará a mensagem para o comprimento especificado. Caracteres na posição mais a direita serão perdidos. Além disso o comprimento de mensagem real antes da truncagem será colocado na área de trabalho especificado, seguinte a palavra-chave LENGTH. Ocorrerá a condição de exceção LENGERR (erro de comprimento) se ela tiver sido codificada.

Erro de comprimento é uma condição de exceção que será detectada quando uma mensagem transmitida for maior do que o comprimento especificado no programa.

Para evitar uma execução com término anormal da tarefa quando ocorrer um erro dessa natureza, o comando HANDLE CONDITION deve ser codificado e colocados antes de qualquer comando RECEIVE no programa de aplicação.

Exemplos :

PROCEDURE DIVISION.
000-ROTINA PRINCIPAL.
EXEC CICS HANDLE CONDITION LENGERR(MENS-ERRO)
END-EXEC.

Ou ainda

IDENTIFICATION DIVISION.
…….
WORKING-STORAGE SECTION.
MSG-LENGTH PIC S9(04) USAGE IS COMP.
INPUT-MSG.
03 TRANS-ID
03 FILLER
03 MESSAGE
PROCEDURE DIVISION.
MOVE 10 TO MSG-LENGTH.
EXEC CICS
HANDLE CONDITION LENGERR(LENGTH-ERROR-RT)
END-EXEC.


EXEC CICS RECEIVE INTO(INPUT-MSG) LENGTH(MSG-LENGTH)
END-EXEC.


Comando SEND


O comando SEND é utilizado para o envio de mensagens ao terminal. Dessa forma, seu formato geral é o seguinte :

EXEC CICS SEND FROM (ÁREA-DE-DADOS) LENGTH (TAMANHO) ERASE
END-EXEC.

Onde :

Área-de-dados : Identifica o nome da área de trabalho contendo a mensagem a ser enviada ao terminal;

Tamanho : Tamanho da mensagem a ser enviada ao terminal. Deve ser uma constante binária de dois bytes ou o nome de um campo binário de dois bytes.

ERASE : Opção que faz com que a tela seja limpa antes da mensagem ser mostrada. Porém, será apagado a posição onde encontra-se o cursor. Para a pagar completamente a tela, deve-se utilizar o comando :

EXEC CICS ISSUE ERASEAUP

Exemplo :

IDENTIFICATION DIVISION.
…..
WORKING-STORAGE SECTION.
OUTPUT-MESSAGE.
03 MSG-ID
03 FILLER
03 MSG-TXT

…..
PROCEDURE DIVISION.
….
MOVE ‘BANCO’ TO MSG-ID.
MOVE ‘RACIONAL S/A’ TO MSG-TXT.
EXEC CICS SEND FROM (OUTPUT-MESSAGE)
LENGTH(18) ERASE
END-EXEC.

No exemplo acima, a área de trabalho que irá conter a mensagem possui um tamanho de 40 caracteres. A área denominada OUTPUT-MESSAGE recebe um grupo de mensagens para seus campos (MSG-ID e MSG-TXT) inferior ao especificado para a área de dados. Isso é possível por quê o parâmetro de comprimento deve apenas especificar o número real de caracteres a ser enviado e portanto, pode ser menor do que o comprimento declarado da área MESSAGE-OUTPUT.


CONTROLE DE PROGRAMAS (PCP)


Quando uma tarefa necessita de um determinado programa aplicação, este pode ou não estar na memória. Existem três razões pelas quais um programa pode já estar na memória no momento em que for requisitado para uma determinada tarefa :

• Pode ser um programa residente, ou seja, é um programa que foi carregado na memória quando o CICS foi inicializado;

• Alguma outra tarefa está fazendo deste programa;

• Outra tarefa utilizou o programa e a área de memória não foi usada para nada mais, e dessa forma, o programa permaneceu na memória.

O Programa de Controle de Programa (PCP – Program Control Program) gerencia o fluxo de controle entre programas dentro do sistema CICS. Os programas gerenciados pelo PCP devem Ter seus nomes definidos na tabela de programas de processamento (PPT- Processing Program Table).

Portanto, o PCP procura determinar se o programa de aplicação que foi solicitado está ou não na região do CICS. Quando este não encontra-se na memória, o PCP o carregará. Em seguida o PCP transfere o controle para o programa de aplicação, de modo que ele posa começar a execução.

Cada programa de aplicação existe uma entrada na tabela PPT. Esta entrada contém, entre outras coisas, os seguintes itens :

Nome do programa, Endereço de memória, Endereço de Disco, Linguagem de programação utilizada, etc. A definição do programa na PPT é feita pelo programador.

Quando uma tarefa termina, o programa de aplicação usado pela tarefa pode não ser mais necessário. Em muitos casos o CICS pode usar novamente a área de memória que o programa de aplicação ocupou.

Se a tarefa que tiver sido recentemente terminada é a única tarefa do usuário utilizando um programa de aplicação, então essa área de memória fica disponível para outras finalidades. Entretanto, se diversas tarefas estão usando o mesmo programa de aplicação, como acontece na maioria das vezes, o CICS não pode tornar a usar a área de memória.

Para uma gerência adequada da memória o PCP necessita saber se existem tarefas simultâneas usando o mesmo programa. O PCP obtém essa informação através de um contador de uso na entrada da PPT para tal programa de aplicação

• Nome do programa;
• Endereço de Memória;
• Endereço de disco;
• Linguagem de programação usada; e
• Contador de uso

O contador de uso é incrementado sempre que uma tarefa começa a fazer uso de um programa. Cada vez que uma tarefa termina, o contador é decrementado. Quando o contador é zerado, o PCP autoriza o novo uso da área ocupada pelo programa de aplicação. Assim, uma das funções de PCP é determinar quando os programas de aplicação não são solicitados pelas tarefas.

É possível transferir o controle de um programa para outro dentro da mesma tarefa, permanecendo no mesmo nível lógico. Os comandos empregados para essa função são o LINK e o XTCL.

O comando LINK transfere o controle do programa de aplicação atual para outro programa especificado, prevendo ainda o retorno ao final da execução.
Quanto ao comando XCTL, também ocorre a transferência do controle para outro programa especificado, porém não é previsto o retorno ao final da execução.


Transferência de dados entre programas


Os dados usados ou criados por um programa devem, em algumas situações, ser passados para um outro programa. Isso ocorre sempre que é necessário transmitir uma informação ou ainda um processamento adicional. Essa transferência pode ser especificada pelos comandos LINK ou XCTL.

Em uma mesma task podem ser executados vários programas.

Quando um programa é chamado pelo comando LINK, ocorre uma execução em um nível mais abaixo do que o programa que o chamou (PROG1 chamando PROG2). Quando o programa é chamado pelo XCTL é executado no mesmo nível do programa que o chamou

O formato geral para o comando XTCL é :

EXEC CICS XTCL PROGRAM(NOME)
COMMAREA(ÁREA-DE-DADOS)
LENGTH(VALOR)
END-EXEC.

Quanto ao comando LINK, temos :

EXEC CICS LINK PROGRAM(NOME)
COMMAREA(ÁREA-DE-DADOS)
LENGTH(VALOR)
END-EXEC.


Troca de parâmetros entre programas


É possível o envio de dados de um programa para outro, através das opções COMMAREA e LENGTH.

IDENTIFICATION DIVISION.
PROGRAM-ID. PROG1.

….
WORKING-STORAGE SECTION.
WSPARAMETRO.

PROCEDURE DIVISION.
EXEC CICS XCTL PROGRAM(‘PROG2’)
COMMAREA(WSPARAMETRO)
LENGTH(10)
END-EXEC.

IDENTIFICATION DIVISION.
PROGRAM-ID. PROG2.

LINKAGE SECTION.
DFHCOMMAREA.


PROCEDURE DIVISION.
…..
IF EIBCALEN = 10
MOVE PARAMETRO TO …..

O programa PROG1 é o que está enviando dados de qualquer área que tenha endereçamento. O programa que está recebendo (PROG2) necessita receber os dados na área DFHCOMMAREA, que está na Linkage Section.

O endereçamento para DFHCOMMAREA é automaticamente providenciado pelo CICS e a maneira de determinar se existe uma área associada com o DFHCOMMAREA é verificando se o conteúdo de uma área interna do CICS, chamada EIBCALEN, é maior que zeros, ou ainda se o seu tamanho corresponde exatamente ao valor da área de dados que se espera receber. Quando for necessário passar dados para outros programas e receber o controle de volta, poderemos usar a seguinte opção :

IDENTIFICATION DIVISION.
PROGRAM-ID. PROG1.

….
WORKING-STORAGE SECTION.
WSPARAMETRO.
03 INFO
PROCEDURE DIVISION.

EXEC CICS LINK PROGRAM(‘PROG2’)
COMMAREA(WSPARAMETRO)
LENGTH(10)
END-EXEC.

IDENTIFICATION DIVISION.
PROGRAM-ID. PROG2.
LINKAGE SECTION.
DFHCOMMAREA.
02 INFO

….
PROCEDURE DIVISION.
…..
IF EIBCALEN = 10
MOVE PARAMETRO TO …..

Quando o programa PROG1 emite o comando LINK usando a opção DFHCOMMAREA, PROG2 receberá o controle e a área que foi passada no seu próprio DFHCOMMAREA. Se o PROG2 fizer qualquer alteração nos dados da DFHCOMMAREA, essas alterações estarão disponíveis para o PROG1, quando o PROG2 terminar o procesamento e retornar o controle para PROG1.


Comando LOAD


O comando LOAD é usado para solicitar a carga de um programa, tabela, ou ainda de um mapa na memória, sem entretanto executá-lo.

O formato geral do comando LOAD é :

EXEC CICS LOAD PROGRAM(NOME)
SET(INDICADOR)
LENGTH(ÁREA-DE-DADOS)
HOLD

Onde :

PROGRAM - O nome identifica a tabela a ser carregada. O CICS considera esta tabela como um programa, uma vez que a tabela deve residir em uma biblioteca de programa e o nome da tabela deve ser registrada ba PPT (Processing Program Table). O conteúdo da tabela não é executável.

SET - O CICS armazena o endereço inicial no qual a tabela foi carregada no inidcador de localização especificado para o parâmetro SET. O indicador é definido como um campo binário de quatro bytes.

LENGTH - É opcional. Se o comprimento é dado no comando LOAD, os dados carregados são limitados ao comprimento indicado pela área-de-dados.

HOLD - Refere-se a área de memória ocupada pela tabela citada no comando LOAD. Se o HOLD for omitido, a área de memória é liberada automaticamente no fim da tarefa que executou o comando HOLD; Se o HOLD for incluído, a tabela permanece na memória até que o sistema encontre o seguinte comando :

EXEC CICS RELEASE PROGRAM(NOME) END-EXEC.

O HOLD é uma opção úitl. Por exemplo, pode-se usar HOLD para guardar uma tabela de valores na memória durante toda a execução do CICS.


CONTROLE DE ARQUIVOS


Uma aplicação CICS pode manusear, através da FCP, arquivos de acesso direto do tipo VSAM, BDAM e ISAM. Os arquivos são acessados por programas de aplicação que especificam o nome do arquivo. Estes nomes de arquivos estão definidos na tabela de controle de arquivos (FCT). O tipo de processamento permitidos para cada arquivo (leitura, gravação, etc.) e o tipo de arquivos (VSAM, BDAM, ISAM, etc.).

É importante observar que em uma rede pode haver múltiplos usuários, os quais podem estar tentando acessar, ao mesmo tempo, dados de um mesmo arquivo. Os acessos podem ser para uma consulta aos dados de um arquivo, uma atualização ou até mesmo uma exclusão de registros.

O FCP facilita o acesso aos arquivos em uma base de acesso direto, pois, ele gerencia essas operações concorrentes, podendo evitar atualizações simultâneas de um mesmo registro. Os comandos READ, REWRITE, WRITE e DELETE, são fornecidos por ele, atendendo aos padrões e métodos de acesso IBM.

Os arquivos envolvidos em uma aplicação são abertos quando o CICS é inicializado e fechados quando o CICS é terminado. Assim sendo, a aplicação não define arquivos através de uma cláusula SELECT. Outrossim, Para o processamento de arquivos seqüenciais serão empregados os recursos de dados transitórios (Transient Data), o qual será visto posteriormente.

Com relação aos arquivos VSAM, as organizações disponíveis em uma aplicação CICS, seriam :

ESDS (Entry Sequencial DataSet);

KSDS (Key Sequenced DataSet);

RRDS (Relative Record DataSet).


Leitura de Registros


O acesso ao registro pode ser feito, dentro de uma aplicação, através dos seguintes comandos :

EXEC CICS READ DATASET(CCCONTA)
INTO(REG-CONTA-S)
LENGTH(123)
RIDFLD(CC-CONTA-S)
END-EXEC.

Onde :

DATASET - Indica o nome do DATASET que queremos utilizar (Arquivo);
INTO - Essa opção especifica a área onde desejamos colocar o registro encontrado.
LENGTH - Indica o tamanho da área reservada.
RIDFLD - Contém a chave do registro que queremos ler.

Devemos levar em consideração que o programa CICS processa registros lógicos e não registros físicos. Para processar um registro lógico defini-se uma área de trabalho na WORKING-STORAGE SECTION da aplicação.

A área de trabalho é o espaço no qual é possível ler um registro, ou ainda, pode ser o local onde o registro será construído para uma posterior gravação. O EIP (Execute Interface Program) move os dados entre a área de trabalho no programa e as áreas de trabalho que pertencem ao FCP.

A execução de comandos de E/S em arquivos (ler, gravar, regravar, etc.) são controladas pelas condições de exceção. Portanto, uma instrução HANDLE CONDITION deve ser codificada antes de cada uma dessas operações.

Exemplo :

EXEC CICS HANDLE CONDITION
LENGERR(100-ERRO-TAM)
NOTFND(200-SEM-REG)
ERROR(900-OUTROS)

Os parâmetros 100-ERRO-TAM, 200-SEM-REG, 900-OUTROS são nomes de parágrafos em um programa COBOL, para onde o programa desviará caso ocorra a situação de exceção.


Atualização de Registros


Quando for preciso ler um registro o qual será atualizado, devemos fazer uma pesquisa com chave igual e completa.

A atualização de um registro envolve sua leitura (através de um comando READ com UPDATE), modificando-o, inicialmente, na memória e sendo regravado na mesma localização em disco. Abaixo temos as várias opções do comando READ. A instrução UPDATE é a opção que indica ao FCP que um registro deve ser obtido para atualização.

Metodo de Acesso EXEC CICS READ
VSAM, DAM/BDAM e ISAM INTO (AREA DE DADOS), LENGTH (AREA DE DADOS), DATASET (NOME), RIDFLD (AREA DE DADOS), UPDATE
DAM/BDAM DEBKEY, DEBREC
VSAM GENERIC, KEYLENGTH (VALOR DE DADOS)
VSAM GETQ, EQUAL, RBA, RRN
EXEC CICS REWRITE
VSAM, DAM/BDAM, ISAM FROM (AREA DE DADOS), LENGTH (VALOR DE DADOS), DATASET (NOME)

Uma solicitação de regravação começa no programa de aplicação e é recebida pelo Programa de Controle de Arquivos (FCP). O FCP irá obter a memória para o registro e emitir uma instrução interna ENQUEUE que entregará para a tarefa o controle exclusivo do registro único. Após isso, o FCP emitirá uma solicitação ao VSAM para que ele obtenha o registro. Neste momento, a tarefa corrente irá aguardar até que a operação de I/O se e complete e outra tarefa poderá ser processada.

O VSAM irá passar o registro obtido para o FCP que, por sua vez, retornará o registro para o programa de aplicação. Após ter ocorrido a modificação no registro, e, para que o mesmo seja regravado, será executado o seguinte comando :

EXEC CICS REWRITE DATASET(‘CCCONTA’)
FROM(REGCONTA) LENGTH(RECLEN)
END-EXEC.

O comando REWRITE é usado para atualizar um registro que tenha sido lido por um comando READ, com a opção UPDATE. No comando REWRITE, a opção FROM indica onde está localizado o registro que estamos querendo gravar.

A opção LENGTH especifica o tamanho do registro. É possível regravar um tamanho diferente de registro até o máximo especificado para o tamanho variável na FCT.

Veja um outro exemplo, onde é ilustrado a utilização desse recurso a partir da Working-Storage Section :

WORKING-STORAGE SECTION.
01 WSWORKAREA.
03 RECLEN
03 RECKEY
01 RECDESC.
02 CUSTNO
02 CUSTNAME
02 CUSTADDR
02 CUSTINFO

PROCEDURE DIVISION.
EXEC CICS HANDLE CONDITION ERROR(FATALERR)
NOTFND(NOREC)
END-EXEC.
MOVE INKEY TO RECKEY.

EXEC CICS READ DATASET(‘CUSTMAS’)
INTO (RECDESC) LENGTH(RECLEN)
RIDFLD(RECKEY) EQUAL
UPDATE
END-EXEC.

EXEC CICS REWRITE DATASET(‘CUSTMAS’)
FROM(RECDESC) LENGTH(RECLEN)
END-EXEC.


Exclusão de Registros


É provável que, em algumas situações, tenhamos que excluir um registro de um arquivo. Para tanto, o comando DELETE poderá ser usado para removê-lo fisicamente, mas somente de arquivos VSAM KSDS ou RRDS.

Todavia, antes do registro ser deletado é preciso que o mesmo seja lido, afim de determinar a necessidade ou não da exclusão do mesmo. Neste caso, o registro será lido para atualização e então deletado, se necessário.

Exemplo :

EXEC CICS READ
INTO(ÁREA-DE-DADOS)
DATASET(NOME)
RIDFLD(ÁREA-DE-DADOS)
UPDATE

E em seguida :

EXEC CICS DELETE
DATASET(NOME)

Em outra situação, podemos necessitar de uma exclusão mais completa, ou seja, um determinado grupo de registros. Para tanto, a exclusão é realizada através do método da chave genérica ou parcial, sendo somente permitido para arquivos que estejam desprotegidos na FCT. Ainda dentro dessa situação, não será necessário que seja feita nenhuma leitura para atualização.

Exemplo :

EXEC CICS DELETE DATASET(‘CCCONTA’)
RIDFLD(RECKEY) GENERIC KEYLENGTH(2)
NUMREC(RECDEL) END-EXEC.

A opção GENERIC indica que desejamos fazer uma exclusão com chave parcial. A opção KEYLENGTH e seu argumento associado indica o número de posições, começando pelo byte mais à esquerda, da chave que queremos comparar. Neste exemplo, queremos que o CICS encontre cada registro no arquivo cuja duas primeiras posições sejam iguais às duas que especificamos no argumento RIDFLD. Todos os registros que forem encontrados serão excluídos. Após a operação terminar, o CICS informará à nossa tarefa o número de registros excluídos.

Inclusão de Registros

Os registros são incluídos em um arquivo de acesso direto pelo comando WRITE. As opções são mostradas abaixo :

Metodo de Acesso EXEC CICS WRITE
VSAM, DAM/BDAM, ISAM FROM (AREA DE DADOS), LENGTH (VALOR DE DADOS), DATASET (NOME), RIDFLD (AREA DE DADOS)

A cláusula FROM identifica a área de trabalho onde o registro a ser gravado é armazenado. A opção DATASET identifica o arquivo no qual desejamos incluir o registro. A opção RIDFLD especifica a chave do registro que será incluído. LENGTH indica o tamanho do registro.

Exemplo :

WORKING-STORAGE SECTION.
01 WSWORKAREA.
03 RECLEN
03 RECKEY
03 RECDESC.
04 CUSTNO
02 CUSTNAME
02 CUSTADDR
02 CUSTINFO.

PROCEDURE DIVISION.
EXEC CICS HANDLE CONDITION ERROR(100-ERRO)
DUPREC(200-REG-DUP)
END-EXEC.

EXEC CICS WRITE DATASET(‘CUSTMAS’)
INTO (RECDESC) LENGTH(RECLEN)
RIDFLD(RECKEY)
END-EXEC.


BROWSE

O que é pesquisa BROWSE ?

Trata-se de uma busca seqüencial de registros em um grupo de dados organizados (Arquivos VSAM ou Bancos de Dados). Esse é um processo realizado através de alguns comandos separadamente. Utilizando-se desses comandos será possível processar arquivos VSAM, DAM/BDAM e ISAM seqüencialmente. Embora os conceitos gerais e comandos sejam os mesmos para os três métodos de acesso, há algumas diferenças nas técnicas de processamento.

Considerações para arquivos VSAM

Uma pesquisa Browser pode ter início em qualquer registro do arquivo. O ponto de partida pode ser uma chave total ou uma chave genérica. Quando o primeiro comando de pesquisa for acionado, e, a sua chave combinar com a que foi especificada, este então será trazido ao seu programa. Se não existir tal registro, o CICS poderá pesquisar o primeiro registro tendo uma chave maior ou acionará a condição NOTFND, dependendo da opção especificada quando a pesquisa browser iniciou.

Considerações sobre arquivos ISAM

Uma pesquisa Browser pode ser iniciada em qualquer registro num arquivo ISAM. O ponto de partida pode ser através de uma chave de registro, a qual pode ser uma chave completa ou genérica.

Quando o primeiro comando de pesquisar for acionado, o primeiro registro com uma chave igual à fornecida no comando é devolvido para seu programa de aplicação. Se o registro não existir, o primeiro registro cuja chave possua um valor maior será recuperado. Registros indicados para deleção será lidos durante uma pesquisa Browser. Seu programa de aplicação deve ser codificado para reconhecer registros deletados e manipulá-los de maneira apropriada. Uma operação Browser consiste em três procedimentos :

Estabelecimento de posição : Para iniciar uma pesquisa Browser deve-se primeiramente estabelecer a posição no arquivo. Esta etapa identifica para o CICS onde, no arquivo, se quer iniciar a pesquisa seqüencial.

Pesquisa de registros : Uma vez estabelecida a posição, um ou mais comandos são emitidos para pesquisar registros seqüencialmente. À medida que cada registro é pesquisado, ele é processado de acordo com a lógica do programa.

Término do Browser : Os registros são pesquisados e processados até que não mais será necessária qualquer pesquisa seqüencial e indicar para o CICS que a operação está completa.

Outrossim, pode-se reestabelecer a posição a qualquer hora durante uma operação Browser. Pode-se alterar a posição corrente no arquivo, e, opcionalmente, as características da operação Browser. Logo que a posição tenha sido estabelecida, pode-se continuar a pesquisa seqüencial e processamento.

O primeiro comando que vamos examinar irá determinar a localização inicial do arquivo que desejamos percorrer.

EXEC CICS STARTBR DATASET(NOME)
RIDFLD(ÁREA-DE-DADOS)
KEYLENGTH(VALOR-DE-DADOS)
GENERIC
END-EXEC.

Este comando fará com que o FCP solicite ao VSAM que encontre um registro no arquivo cuja chave seja igual ou maior que aquela que foi especificada na opção RIDFLD. Quando a localização do registro tiver sido encontrada, será retornado ao FCP que, por sua vez, informará ao programa. A opção NOTFND só ocorrerá caso não seja encontrado nenhum registro. Uma vez que a localização inicial tenha sido encontrada, precisaremos agora obter os registros, e para isto será usado o comando READNEXT.

EXEC CICS READNEXT DATASET(NOME)
INTO(ÁREA-DE-DADOS)
RIDFLD(ÁREA-DE-DADOS)
LENGTH(ÁREA-DE-DADOS)
KEYLENGTH(VALOR-DE-DADOS)
END-EXEC.

Este comando entregará ao programa o acesso ao registro necessário ao CI (Control Interval). Para obtermos o próximo registro será necessário que novamente o comando READNEXT seja acionado. Todavia, este procedimento não provoca uma nova operação de I/O, pois, o registro obtido virá do bloco de registros. Somente será feita uma nova operação de I/O quando todos os registros deste bloco ou do Control Interval forem obtidos.

Quando obtivermos todos os registros necessários, será o momento de terminarmos a operação de BROWSE. O comando empregado para isso é o ENDBR.

EXEC CICS ENDBR DATASET(NOME) END-EXEC.

Este comando liberará toda a memória associada a esta pesquisa seqüencial, como a área utilizada pelo VSASM

Estabelecimento de Posições

Para estabelecer uma posição inicial em um Browser, utilizamos o comando STARTBR. Este comando especifica o ponto de partida para a operação, porém nenhum registro é pesquisado.

Exemplo :

WORKING-STORAGE SECTION.
01 WSWORKAREA.
02 REGTAM
02 CC-CONTA-S
01 REG-CONTA-S.
03 CC-NOME-S
03 CC-ENDER-S.

PROCEDURE DIVISION.

EXEC CICS HANDLE CONDITION ERROR(100-ERRO-FATAL)
NOTFND(200-SEM-REGISTRO)
END-EXEC.

MOVE ‘1111’ TO CC-CONTA-S.
EXEC CICS STARTBR DATASET(‘CCCONTA’)
GENERIC KEYLENGTH(2)
RIDFLD(CC-CONTA-S)
END-EXEC

EXEC CICS READNEXT DATASET(‘CCCONTA’)
INTO(REG-CONTA-S) LENGTH(REG-TAM)
RIDFLD(CC-CONTA-S) KEYLENGTH(2)
END-EXEC.

MOVE ‘2222’ TO CC-CONTA-S.
EXEC CICS READNEXT DATASET(‘CCCONTA’)
INTO(REG-CONTA-S) LENGTH(REG-TAM)
RIDFLD(CC-CONTA-S) KEYLENGTH(2)
END-EXEC.
150-LER-REGISTRO.

EXEC CICS RESETBR DATASET(‘CCCONTA’)
INTO(REG-CONTA-S) LENGTH(REG-TAM)
RIDFLD(CC-CONTA-S) KEYLENGTH(2)
END-EXEC.
GO TO 150-LER-REGISTRO.

O comando RESETBR provoca o final da operação de BROWSE corrente e inicia outra operação de Browser na localização especificada na opção RIDFLD. Assim como com o comando STARTBR, será necessário emitir um comando READNEXT para obtermos o primeiro registro.

Uma outra característica para os arquivos VSAM, trata-se da possibilidade de lermos arquivos partindo do último para o primeiro. Isto é possível através do comando READPREV.

EXEC CICS READPREV DATASET(NOME)
INTO(ÁREA-DE-DADOS)
RIDFLD(ÁREA-DE-DADOS)
LENGTH(ÁREA-DE-DADOS)
KEY-LENGTH(VALOR-DADOS)
END-EXEC.

Exemplo :

WORKING-STORAGE SECTION.
03 WSWORKAREA.
04 REGTAM
02 CC-CONTA-S
02 REG-CONTA-S.
03 CC-NOME-S
03 CC-ENDER-S
PROCEDURE DIVISION.

EXEC CICS HANDLE CONDITION ERROR(100-ERRO-FATAL)
NOTFND(200-SEM-REGISTRO)
END-EXEC.

MOVE ‘1111’ TO CC-CONTA-S.
EXEC CICS STARTBR DATASET(‘CCCONTA’)
GENERIC KEYLENGTH(2)
RIDFLD(CC-CONTA-S)
END-EXEC//

EXEC CICS READNEXT DATASET(‘CCCONTA’)
INTO(REG-CONTA-S) LENGTH(REG-TAM)
RIDFLD(CC-CONTA-S) KEYLENGTH(2)
END-EXEC.

EXEC CICS READPREV DATASET(‘CCCONTA’)
INTO(REG-CONTA-S) LENGTH(REG-TAM)
RIDFLD(CC-CONTA-S) KEYLENGTH(2)
END-EXEC.
150-LER-REGISTRO.

EXEC CICS RESETBR DATASET(‘CCCONTA’)
INTO(REG-CONTA-S) LENGTH(REG-TAM)
RIDFLD(CC-CONTA-S) KEYLENGTH(2)
END-EXEC.
GO TO 150-LER-REGISTRO.

Podemos observar neste exemplo que todas as opções associadas com este comando são as mesmas para o comando READNEXT. O primeiro READPREV permite ao programa obter o registro que foi indicado pelo comando STARTBR. Se continuarmos a emitir o comando READPREV, iremos eventualmente chegar ao início do arquivo.

Neste caso ocorrerá a condição de exceção ENDFILE, que indicará o início do arquivo. Os arquivos tipo ISAM e BDAM atualmente não têm esta característica disponível. Existem dois tipos para a condição de “fim de arquivo” :

Físico : a condição de fim-de-arquivo é obtida quando um comando READNEXT ou READPREV for emitido após o último registro ter sido encontrado.

Lógico : Ocorre quando um programa de aplicação determinar que nenhuma pesquisa seqüencial adicional é necessária. Isto pode ser feito comparando a chave de cada um dos registros pesquisados com outro valor.

Na primeira vez que o comando READPREV for emitido, o programa permanecerá apontando para o mesmo registro que foi obtido anteriormente através do comando READNEXT. Por isso serão necessários dois comandos READPREV, de modo a obtermos o primeiro registro anterior ao registro posicionado anteriormente. Isto só é válido quando mudamos de READNEXT para READPREV.

Término da pesquisa Browser

Quando for determinado que nenhuma pesquisa seqüencial adicional é requerida, é necessário terminar a operação Browser. Para terminar uma operação Browser, utilizamos o seguinte comando :

EXEC CICS ENDBR
DATASET(NOME)
END-EXEX.

Sendo que em DATASET especificamos o nome do arquivo no qual a pesquisa Browser foi realizada. Não são requeridos outros parâmetros.

Quando uma pesquisa Browser for terminada, todos os recursos com relação à operação são liberados. Uma vez que os recursos do sistema devem ser liberados logo que não forem mais requeridos, emitir o comando ENDBR logo que possível.

Atualização de Registros

Um pesquisa Browser é utilizada normalmente para operações de leitura. Os registros pesquisados, usando comandos de Browser, não podem ser atualizados. Todavia, especificando RIDFLD da pesquisa Browser em um comando READ com a opção UPDATE, pode-se fazer com que um registro seja lido para atualização.

O programa pode fazer as alterações necessárias ao registro e usar o comando REWRITE para substituir o mesmo no arquivo. Após ter sido completada a atualização, o processamento da pesquisa BROWSE pode então ser retomado.

Exemplo :

WORKING-STORAGE SECTION.
05 WSWORKAREA.
06 REGTAM
02 CC-CONTA-S
03 REG-CONTA-S.
03 CC-NOME-S
03 CC-ENDER-S

PROCEDURE DIVISION.

EXEC CICS HANDLE CONDITION ERROR(100-ERRO-FATAL)
NOTFND(200-SEM-REGISTRO)
END-EXEC.

MOVE ‘1111’ TO CC-CONTA-S.

EXEC CICS STARTBR DATASET(‘CCCONTA’)
GENERIC KEYLENGTH(2)
RIDFLD(CC-CONTA-S)
END-EXEC
150-LER-REGISTRO.

EXEC CICS READNEXT DATASET(‘CCCONTA’)
INTO(REG-CONTA-S) LENGTH(REG-TAM)
RIDFLD(CC-CONTA-S) KEYLENGTH(2)
END-EXEC.
IF CC-ENDER-S = SPACES

EXEC CICS READ DATASET(‘CCCONTA’) RIDFLD(CC-CONTA)
INTO(REG-CONTA-S) LENGTH(REG-TAM)
UPDATE ENDE-EXEC.

EXEC CICS REWRITE DATASET(‘CCCONTA’)
FROM (REG-CONTA-S) LENGTH(REG-TAM)
END-EXEC.
GO TO 150-LER-REGISTRO.

Quando o programa tiver examinado a condição (CC-ENDER = SPACES) e identificado que o registro necessita ser atualizado, será necessário emitir um comando READ para atualização, e nesse caso receberá o controle exclusivo. O registro tem que ser atualizado e regravado imediatamente. O controle exclusivo será então liberado. Somente após o comando REWRITE ter sido emitido, o programa poderá emitir o próximo comando READNEXT.

Trata-se de um recurso disponível o qual não deverá ser empregado de forma generalizada, tendo em vista que é uma maneira pouco eficiente. Quando for preciso a exclusão de um registro, seguindo o mesmo raciocínio, o comando REWRITE pode ser substituído pelo comando DELETE.

Exemplo :

WORKING-STORAGE SECTION.
07 WSWORKAREA.
08 REGTAM
02 CC-CONTA-S
04 REG-CONTA-S.
03 CC-NOME-S
03 CC-ENDER-S

PROCEDURE DIVISION.

EXEC CICS HANDLE CONDITION ERROR(100-ERRO-FATAL)
NOTFND(200-SEM-REGISTRO)
END-EXEC.

MOVE ‘1111’ TO CC-CONTA-S.

EXEC CICS STARTBR DATASET(‘CCCONTA’)
GENERIC KEYLENGTH(2)
RIDFLD(CC-CONTA-S)
END-EXEC
150-LER-REGISTRO.

EXEC CICS READNEXT DATASET(‘CCCONTA’)
INTO(REG-CONTA-S) LENGTH(REG-TAM)
RIDFLD(CC-CONTA-S) KEYLENGTH(2)
END-EXEC.
IF CC-ENDER-S = SPACES

EXEC CICS READ DATASET(‘CCCONTA’) RIDFLD(CC-CONTA)
INTO(REG-CONTA-S) LENGTH(REG-TAM)
UPDATE ENDE-EXEC.

EXEC CICS DELETE DATASET(‘CCCONTA’)
FROM (REG-CONTA-S) LENGTH(REG-TAM)
END-EXEC.
GO TO 150-LER-REGISTRO.


CONDIÇÕES DE EXCEÇÃO

Em operações BROWSE é importante observar que as condições de exceção devem ser verificadas. Observe essas condições na tabela abaixo :

CONDICAO DESCRICAO
DSIDERR O nome do DATASET nao foi encontrado na FCT
DUPKEY Apenas para indices alternados dos Datasets VSAM. Indica que as chaves estao duplicadas, iniciar BROWSE
DUPREC Indica que o registro ja existe no arquivo, com a mesma chave
ENDFILE Indica que foi encontrado o final do arquivo em um BROWSE. O READPREV indica o inicio do arquivo
ILOGIC Somente para VSAM. Indica que houve uma condicao que nao pode ser determinada por nenhuma outra condicao de excecao. Quando esta condicao ocorre, o primeiro byte do EIBRCODE tera o codigo de retorno do VSAM e o segundo byte tera o codigo de erro do VSAM. Ambos os codigos sao no formato hexadecimale precisarao ser convertidos para decimal antes de ser pesquisado o seu significado no manual VSAM da IBM
INVREQ Indica que a operacao do arquivo nao foi especificada na FCT para este DATASET
IOERR Indica um erro de operacao I/O
LENGERR Indica que a area reservada para a operacao de entrada nao tem o tamanho sufuciente para receber o registro
NOSPACE Indica que nao ha espaco suficiente no arquivo para receber o registro
NOTFND Indica que nao foi achado o registro cuja chave foi especificada

BASIC MAPPING SUPPORT

O Basic Mapping Support (BMS) é uma interface entre o CICS e os programas de aplicação, cujo objetivo é o de facilitar a programação da apresentação dos dados.

Os dados originados de ou destinados a terminais são facilmente acessados e a formatação é transparente à aplicação. Utilizando-se do BMS, a aplicação não precisa ser modificada para ser executada em outro tipo de terminal, porque o BMS obtém informações a respeito do terminal, interpretando e formatando os dados diferentemente para cada tipo de terminal. Dessa forma, o BMS simplifica a tarefa de programação de comunicação com terminais na rede.

O BMS manipula qualquer conjunto de dados formatados e os interpreta. Porém, ele somente trabalha com conjunto de dados formatados, o que significa dizer que, se tentar trabalhar com dados não formatados, um erro ocorrerá e o procedimento padrão é o término do programa.

Atualmente o BMS é uma interface entre o controle de terminais e o nosso programa. Ele interpretará o conjunto de dados de entrada e formatará o conjunto de dados de saída, e assim o programa de aplicação não ocupa-se com o tipo de terminal físico, pois o BMS se preocupa com isto. Desta forma, o programa de aplicação torna-se independente do equipamento.

O BMS também é usado para definir a forma como a tela aparecerá (Ex. : Títulos, campos de E/S e mensagens). O ato de definição da tela é conhecido como geração de mapas.

Antes que o nosso programa possa trabalhar com os mapas, os mesmo devem, portanto, ser gerados.

O BMS tem comandos simples, porque as informações de formatação são armazenadas separadamente em mapas.

Cada mapa tem duas formas : mapa físico e mapa simbólico.

• O BMS formata a tela para um determinado dispositivo combinado caracteres de controle. O mapa físico indica como fazer isso.

• A descrição simbólica do mapa é a estrutura em código fonte que o programa de aplicação utiliza para referenciar os campos de dados da tela.

Os campos fixos e variáveis são definidos um a um, informando suas características (posição do campo na tela, intensidade, etc.). no programa.

A manipulação destes campos é simples, bastando referenciá-los pelo nome descrito para BMS.

As telas serão definidas através de 3 macros Assembler :

DFHMSD : Define um conjunto de mapas MAP SET que contém um ou mais mapas e descreve as características dos mapas. Um MAP SET é semelhante a uma capa de livro no sentido de que a capa do livro nos dá uma idéia de seu conteúdo.

DFHMDI : Define o mapa dentro de um MAP SET. Um MAP SET pode conter um ou mais mapas, assim como um livro pode ser composto de um mais capítulos. Algumas instalações guardam todos os mapas de uma dada aplicação dentro de um único MAP SET, o que pode facilitar muito a identificação e utilização dos mapas.

DFHMDF : Define individualmente cada campo do mapa. Um mapa pode conter vários campos, do mesmo modo que um capítulo de um livro pode conter várias páginas.

Os mapas físicos

Um mapa físico descreve o formato de exibição para um dado tipo de terminal. O mapa físico tem a forma de uma tabela que inclui a seguinte informação :

• Tamanho e localização dos campos de dados;

• Atributos de campos de dados (protegidos, realçados, por exemplo);

• Constantes (cabeçalhos, informação descritiva); e

• Características dos terminais

Conjunto de mapas

Um conjunto de mapas é um mapa simples ou mapas múltiplos definidos para um tipo de terminal. Os mapas são usualmente agrupados porque todos os mapas do conjunto são usados por uma aplicação ou aplicações relacionadas. Quando é necessário um mapa particular, o programa deve identificar o conjunto de mapas que inclui aquele mapa. Então, quando o primeiro comando que se refere ao mapa e conjunto de mapas é emitido, o CICS carrega o conjunto de mapas para a área de memória dinâmica.

Para o CICS, um conjunto de mapas é tratado como se fosse um programa. Por esta razão, a informação de controle do conjunto de mapas está incluída na PPT.

Se o mesmo formato de exibição for usado para mais de um tipo de terminal, é construído um mapa físico para cada tipo de terminal. Conjuntos de mapas são construídos usando-se um nome genérico (1 a 7 caracteres). O nome genérico é usado no programa de aplicação para identificar o conjunto de mapas necessários para formatar ou analisar uma mensagem. O BMS adiciona um sufixo identificando o tipo de terminal ao nome genérico do conjunto de mapas, permitindo assim a seleção do conjunto de mapas físico apropriado.

Mapas simbólicos

Os mapas simbólicos definem os campos de dados variáveis. O mapa simbólico é copiado para uma área de trabalho do programa. Dessa forma, todos os campos definidos são disponíveis pelo nome do programa. Os dados descritos pelo mapa simbólico podem ser representados em um dos três formatos :

• Formato de CAMPO (FIELD)

O dados é apresentado por item individual. Cada item de dados é precedido por :
- Dois bytes indicando o tamanho do dado ; e
- Um byte definindo o atributo do dado a ser exibido no campo.

O byte de atributo especifica características tais como a intensidade com que o campo é exibido.

• Formato BLOCO

O dado é apresentado como segmentos de uma linha. Cada linha é apresentada na forma em que aparecerá no terminal, incluindo espaços entre os campos. O atributo é definido para cada segmento da linha

• Formato de TEXTO

Como o nome indica, este formato é usado para processamento de texto. O dado é representado como uma corrente não interrompida de caracteres que o BMS divide em segmentos do tamanho de uma linha. O programador pode fazer uma formatação adicional pela inserção de caracteres especiais de formatação nas correntes de dados.

Criação de conjuntos de mapas físicos e simbólicos

A preparação de um mapa é um serviço (job) e, codificar um programa para usar aquele mapa, é outro serviço. Anteriormente vimos que podemos utilizar comandos para nos comunicarmos com o CICS. Comandos são também disponíveis quando se usam funções de entrada/saída do BMS. Contudo, para criar conjuntos de mapas físicos e simbólicos, deve-se usar macro instruções escritas de acordo com as regras da linguagem Assembler.

Todas as macros Assembler começam na coluna 1, e “DFH” começa na coluna 10, sendo as opções colocadas na coluna 16. A ordem das opções não tem importância, podendo ser codificadas em qualquer ordem. Se for necessária mais de uma linha, um caracter de continuação é colocado na coluna 72 e a codificação continua na coluna 16 da próxima linha.

Exemplo :

Mapset DFHMSD TYPE=MAP
,TERM=3270
,LANG=COBOL
,BASE=NAME
,MODE=IN
,CTRL=(PRINT,L40,FREEKB,ALARM,FRSET)
,DATA=FIELD
,TIOAPFX=YES
,STORAGE=AUTO
,COLOR=DEFAULT
,EXTATT=NO
,HILIGTH=OFF
,HTAB=TAB ….
,LDC=MNEMONIC
,OFBFMT=YES
,PS=BASE
,SUFFIX=N
,VTAB=TAB …
,VALIDN=((mustfill) (,mustenter))

Onde temos que :

MAPSET : Nome do MAPSET de 1 a 7 caracteres. Este nome tem que estar na PPT, porque mapas são definidos para serem programas CICS. Um sufixo de um caracter é acrescentado ao nome base com o tipo do terminal ou o operando SUFFIX durante a montagem do MAPSET.

TYPE : DSECT criará a descrição simbólica do mapa, a qual aparecerá no programa de aplicação. MAP especifica o mapa físico que é usado na execução da tarefa e não aparece no programa de aplicação. A opção FINAL é codificada para indicar o fim do MAPSET.

TERM : Define o tipo de terminal associado com o MAPSET.

LANG : Especifica a linguagem na qual o DSET será gerado.

BASE : Permite que uma área de memória seja compartilhada por mais de um MAPSET.

MODE : Indica se o MAPSET é para ser usado para operações de entrada ou saída, ou ainda para ambas.

CTRL : Especifica a gravação do caracter de controle

DATA : Especifica se os dados serão referenciados como campos individuais ou como um bloco.

TIOAPF : Especifica se um prefixo de 12 bytes será acrescentado. Para programas em COMMAND LEVEL ele tem que ser YES.

STORAGE : Especifica se os mapas dentro do MAP SET compartilharão a mesma área de memória ou estariam em áreas separadas, e neste caso colocar AUTO.

COLOR : Especifica a cor padrão para equipamentos coloridos.

EXTATT : Especifica se os atributos estendidos são suportados.

HILIGTH : Especifica o padrão HigLigth (Brilho).

HTAB : Especifica as posições de tabulação para controle horizontal de formulários.

LDC : Especifica o mnemônico para determinar o código do equipamento.

OBFMT : Especifica se a formatação limite de saída é necessária.

PS : Indica se os símbolos de programa são utilizados.

SUFFIX : Indica o caracter a ser anexado no MAPSET.

VTAB : Especifica se as posições de tabulação para controle vertical de formulário.

VALIDN : Especifica se os campos têm que ser preenchidos completamente ou se somente algum dado tem que ser digitado.

Assim sendo, definiremos uma primeira macro para uma tela de exemplo, a qual será a seguinte :

ICMSET DFHMSD TYPE=&DSECT,
TERM=3270, TIOAPFX=YES, LANG=COBOL,
MODE=INOUT,
CTRL=FREEKB,
EXTATT=YES

A próxima parte que necessita ser descrita é o mapa individual dentro do MAPSET :

Map DFHMDI SIZE=(line, colunm)
,LINE=number, NEXT, SAME
,COLUMN=number, NEXT, SAME
,JUSTIFY=(LEFT,FIRST)
,HEADER=YES
,TRAILER=YES
,CTRL=(PRINT,L40,FREEKB,ALARM,FRSET)
L64
L80
HONEOM
,DATA=FIELD
,TIOAPFX=YES
,STORAGE=AUTO
,COLOR DEFAULT
,HILIGHT=OFF
,OBFMT=YES
,PS=BASE
,SUFFIX=N
,VALIDN=((mustfill) (,mustenter))

Map : Nome do mapa de 1 a 7 caracteres, e este não é colocado em qualquer tabela do CICS. O nome do mapa pode ser igual ao nome do MAPSET somente quando existe apenas um mapa dentro do MAPSET.

SIZE : Especifica as dimensões deste mapa.

LINE : Especifica a linha onde será colocado este mapa.

Column : Especifica a coluna onde será colocado este mapa, e estabelece as margens do mapa.

JUSTIFY : Indica a margem à direita (RIGTH) ou à esquerda (LEFT) da coluna. FIRST especifica uma nova página. LAST especifica o fim da página.

HEADER : Permite o uso do mapa quando a condição de OVERFLOW ocorrer.
O mapa aparecerá no topo.

TRAILER : Permite o mapa ser usado quando a condição de OVERFLOW ocorrer. O mapa aparecerá no fim.

A segunda macro definida para a nossa tela será :

ICMSET DFHMSDF TYPE=&DSECT,TERM=3270,TIOPFX=YES,
LANG=COBOL,
MODE=INOUT,
CTRL=FREEKB,
EXTATT=YES
ICMAP DFHMDI SIZE=(24,80),LINE=1,COLUMN=1

Nesta definição, podemos observar que :

1. A tela tem 24 linhas por 80 colunas;
2. O mapa é para ser escrito na tela começando na linha 1, coluna 1;

Todas as telas formatadas têm que conter um mínimo de um byte de atributo. O byte de atributo é usado para definir as características do campo associado com esse byte de atributo. Um atributo tem as seguintes características :

1. Controla as características de todas as posições seguintes na tela até que outro byte de atributo seja encontrado;
2. Ocupa uma posição na tela, mas não pode ser exibido ou impresso e é protegido do operador, exceto se ele acionar a tecla CLEAR;
3. Fica como sendo escrito por um programa de aplicação. Muitas vezes ele é definido através do uso do BMS quando a tela é definida;
4. Pode agir como tabulador.

Na definição dos campos individuais dentro do mapa, temos :

FIELDNAME DFHMDF POS=number, (line, Column)
,ATTRB=(ASKIP,NUM,BRT,DET,IC,FSET)
PROT DRK
UNPROT NORM
,LENGTH=number
,JUSTIFY=(LEFT,BLANK)
,INITIAL=’ ‘
,GRPNAME=user group name
,OCCURS=number
,PICIN=’value’
,PICOUT=’value’
,COLOR=DEFAULT (PINK, BLUE, ETC).
,HILIGTH=OFF (BLINK, REVERSER, ETC.)
,OBFMT=YES
,PS=BASE
,VALIDN=(mustfill) (, mustender)

Temos assim que :

FIELDNAMF : É o nome do campo formado de um a sete caracteres. Este operando somente é necessário quando desejamos para referência, o campo no programa.

POS : Indica a posição do byte de atributo. A posição pode ser colocada como sendo um número relativo a zero ou a linha e coluna indicando esta posição. A indicação de linha e coluna é a mais usada.

ATTRB : Especifica as características do atributo.
LENGTH : Indica o tamanho do campo, sem o byte de atributo.

JUSTIFY : Para os campos numéricos, o padrão é alinhado à direita com preenchimento de zeros à esquerda; para campos não numéricos, o padrão é alinhado à esquerda com preenchimento de brancos à direita.

GRPNAME : Especifica um nome para os campos contíguos.

OCCURS : Especifica que este campo ocorre N vezes. O campo em questão será repetido o número de vezes especificado.

PICIN : Especifica a PICTURE de entrada a ser associada com este campo.

PICOUT : Especifica a PICTURE de saída a ser associada com este campo.

Os operandos a seguir somente são necessários quando desejamos substituir qualquer operando utilizado previamente na Macro DFHMSD :

COLOR : Epecifica a cor padrão para equipamentos coloridos.

OBFMT : Especifica se a formatação limite de saída é necessária.

PS : Indica se os símbolos de programa são utilizados.

VALIDN : Especifica se o campo tem que ser preenchido completamente ou se somente algum dados tem que ser digitado.

HILIGTH : O padrão OFF especifica um não “HIGHLIGTHING” (sem brilho). Blink especifica que o campo ficará piscando. REVERSE indica que o campo será mostrado em vídeo reverso, isto é, caracteres em preto com um fundo branco. UDERLINE indica que um campo deve ser sublinhado. Quando um campo é UNDERLINED, somente o dados é transmitido e os caracteres de sublinha não serão. Esta é uma forma excelente de mostrar ao operador do terminal o tamanho do campo.

Neste momento torna-se interessante fazermos um resumo sobre tudo o que foi visto até aqui :

O BMS atua como uma interface entre os programas de aplicação e o Terminal Control Program (TCP). O BMS prepara a mensagem a ser enviada inserindo os caracteres próprios de controle baseado no tipo de terminal usado. O BMS permite que se escreva os programas sem considerar a posição física dos dados que serão usados pelo programa. O BMS relaciona os rótulos com as posições reais no vídeo através das tabelas chamadas Mapas Simbólicos e Mapas Físicos.

Um mapa ou conjunto de mapas físicos descreve o formato da exibição para um certo tipo de terminal. Deve haver um mapa físico para cada formato e para cada tipo de terminal na rede que usa esse formato. Pode haver um ou mais mapas por tipo de terminal. O programa de aplicação usa o nome genérico para referenciar o conjunto de mapas. O CICS determina o tipo de terminal para o qual a mensagem está sendo transmitida e prepara os caracteres de formatação necessários.

Um mapa simbólico é usado quando o vídeo apresenta dados variáveis que são processados pelo programa de aplicação. A função de um mapa simbólico é definir os campos variáveis de entrada de um terminal ou de saída para um terminal.

As macros instruções descritas de acordo com as regras da linguagem ASSEMBLER são usadas para criar um conjunto de mapas simbólicos ou físicos.

• DFHMSD – Define o conjunto do mapa;
• DFHMDI – Define o mapa individual; e
• DFHMDF – Define cada campo dentro de um mapa

Com exceção do parâmetro TYPE, o mesmo conjunto de macro instruções é usado para criar um conjunto de mapas físicos e seu conjunto de mapas simbólicos associados. Quando for usada a mesma entrada para ambas as operações, os parâmetros que se aplicam são ignorados quando o mapa físico ou o mapa simbólico forem gerados.

Uma das principais vantagens do BMS é que ele permite escrever o programa sem vincular-se às características de terminal de rede.

Formatando dados de Entrada e Saída

Um programa pode emitir comandos de mapeamento de entrada e saída para comunicação com um terminal sob BMS.

Quando se emite um comando de mapeamento de entrada, o TCP lê o dados originados no terminal e leva o dado para uma área de entrada e saída do terminal (TIOA). A mensagem quando recebida pelo TCP referida como uma corrente de dados de modalidade nativa, é composta de :

• Dados modificados entrados no terminal pelo operador ou definidos como modificados no mapa(ATTRB=FSET); e

• Os caracteres de controle que estão espalhados com os dados e que dependem das características de transmissão do terminal.

O BMS remove os caracteres de controle e coloca os dados formatados em uma memória intermediária. Os dados podem ser processados na memória intermediária ou ser levado para a área de trabalho do programa.

Em ambos os casos, o dado é acessado usando-se os rótulos do mapa simbólico. Para se definir uma área na memória com o mapa simbólico, especifica-se o seguinte :

01 MAPA1 COPY MAPSETA

Se isso for especificado na área de trabalho do programa, a área de memória fica disponível para receber qualquer dado localizado num campo definido no mapa.

Tão logo os MAPSETS necessários forem copiados dentro do programa de aplicação, podemos começar com ele. Vamos, então, discutir como enviar um mapa para um terminal. O comando para enviar um mapa para o terminal é :

EXEC CICS SEND MAP(NOME)
MAPSET(NOME)
MAPONLY
ERASE
CURSOR
FROM(ÁREA-DE-DADOS)
LENGTH(VALOR)

O resultado é uma substituição do que foi previamente codificado com a definição do MAPSET e MAP.

Para enviar um mapa para a tela temos que prover o nome do mapa. Em adição, o nome do MAPSET é requerido porque somente o nome do MAPSET está na PPT e ambos os nomes podem ser de até sete caracteres de tamanho. Quando os nomes do MAP e MAPSET são idênticos, a opção MAPSET não necessita ser especificada. Quando a opção MAPSET é omitida, o CICS assume que os nomes do MAP e MAPSET são os mesmos.

EXEC CICS SEND MAP(‘ICMAP’) MAPSET(‘ICMSET’) END-EXEC

As opções FROM e LENGTH são usadas somente se os dados a serem enviados ao terminal residem em outra área que não seja a MAP DSECT.

As opções MAPONLY e DATAONLY são mutuamente exclusivas. Quando a opção MAPONLY é usada, isto significa que somente deve ser enviado o dado padrão onde está localizado no mapa físico e não em qualquer dado do programa da área DSECT. A opção DATAONLY significa enviar somente dados que estão no programa na área DSECT e não usar qualquer dado do mapa físico. Quando nenhuma das opções é especificada, isto significa que devem ser intercalados os

dados dentro do programa na área DSECT com o padrão de dados dentro do mapa físico e enviar todos os dados para o terminal.

É importante saber qual das opções user, porque é essencial transmitir somente os caracteres necessários para tentar otimizar o tempo de resposta. Quando o mapa é inicialmente enviado ao terminal, se o programa de aplicação somente deseja que os dados padrões sejam enviados, então a opção MAPONLY seria utilizada.

Na eventualidade do programa querer enviar somente mensagens para o terminal, isto é, títulos de campos e dados já mostrados, então a opção DATAONLY seria utilizada. Quando os dados padrões e as áreas do programa devem ser enviadas, isto é, enviar um mapa contendo informações sobre um cliente, então nenhuma dessas opções será utilizada.

As opções ERASE e ERASEUP são mutuamente exclusivas. A opção ERASE limpará a tela, colocando-a com LOW-VALUES antes do mapa ser escrito no terminal. É bom usar esta opção quando o mapa é mostrado pela primeira vez.

A opção ERASEUP limpará somente os campos não protegidos na tela e colocará LOW-VALUES neste campos. Esta opção é boa para usar após uma informação ter sido recebida e aceita. Os dados de entrada podem somente necessitar serem limpos para indicar que a operação foi feita com sucesso.

A opção CURSOR é usada quando é necessário substituir o que estava previamente codificado com a opção IC quando o MAPSET/MAP foi definido.

Examinaremos a seguir as várias formas de como o comando SEND poderia ser codificado para enviar informações para o terminal. No exemplo seguinte , vamos procurar mostrar a forma de enviar inicialmente um mapa para a tela do operador após este ter teclado um código para a transação.

Para remover o código da transação entrada pelo operador, a tela necessita ser apagada e o cursor aparecerá no primeiro campo não protegido como especificado quando o mapa foi criado. Somente os dados padrões serão enviados.

Exemplo :

WORKING-STORAGE SECTION.
COPY ICMSET
PROCEDURE DIVISION.
EXEC CICS SEND MAP(‘ICMAP’) MAPSET(‘ICMSET’)
ERASE MAPONLY END-EXEC.

Imaginando a situação onde o envio de uma mapa para o operador que requisitou a informação sobre um cliente em particular, e, tendo em vista que foi teclado na transação : José Silva, o programa lerá o registro de cliente, moverá o conteúdo do registro para o MAP DSECT e então o mapa será enviado para o operador, após a tela ter sido limpa. As opções MAPONLY ou DATAONLY não serão usadas porque iremos margear dados de nosso programa com o padrão no mapa físico.

Assim sendo, teremos :

WORKING-STORAGE SECTION.
COPY ICMSET
01 REGCLI.

……
PROCEDURE DIVISION.
(obtém o registro no cadastro de clientes e move os dados do registro para o MAP DSECT)

EXEC CICS SEND MAP(‘CCMAP’) MAPSET(‘CCSET’) ERASE END-EXEC.

O próximo exemplo ilustrará o método de envio de dados para a tela, a qual já contém um mapa. Este método é normalmente feito quando em uma seção de edição o operador cometeu erros e somente poucos campos necessitam de correção. Não é preciso limpar a tela. A opção CURSOR será utilizada, o que significa que o programa de aplicação indicará onde o cursor deve ser colocado. Como o programa edita os dados de entrada, queremos que o cursor se posicione na primeira ocorrência de um erro.

Durante a programação de edição, sempre que um erro ocorrer será movido o conteúdo menos 1 (-1) para o nome do campo que estava errado com uma letra L anexada a este nome. Este método é chamado de posicionamento simbólico do cursor. É possível que muitos erros sejam encontrados durante a edição e a cada erro seria movido o conteúdo menos 1, para o nome correspondente. Desta forma, se cinco campos estão errados, o valor –1 será movido cinco vezes.

Quando o mapa é escrito na tela, o cursor aparecerá somente no primeiro campo. Antes, na definição do mapa, dissemos que se a opção IC. Durante a execução da tarefa, o inverso acontece. O cursor aparece no primeiro campo devido à forma como o BMS manipula o posicionamento do cursor simbolicamente.

Exemplo :

WORKING-STORAGE SECTION.
COPY CCSET.
PROCEDURE DIVISION.
(Adição dos dados de entrada)

EXEC CICS SEND MAP(‘CCMAP’) MAPSET(‘CCSET’) CURSOR
DATAONLY END-EXEC.

Até este momento, aprendemos as formas de enviar dados ao terminal, uma vez que não tínhamos que nos preocuparmos com a localização física de onde os dados estavam sendo colocados na tela. É desta forma que o BMS nos ajuda. O programa torna-se atualmente independente do equipamento para o qual está enviando dados. Deste modo o BMS é uma interface efetiva entre o programa de aplicação e o programa de controle de terminais

O programa envia uma mensagem contendo dados. O programa BMS recebe a mensagem, insere os caracteres de controle necessários, e, então, o programa de controle de terminais pega a mensagem e envia para a tela.

Recepção de dados formatados

Depois da execução do comando, o BMS coloca todos os itens de dados modificados na área de trabalho definida pelo programa, usando o formato e os rótulos especificados nos mapas simbólico e físico. Os parâmetros e as opções do comando de entrada do BMS são os seguintes :

EXEC CICS RECEIVE MAP(NOME)
MAPSET(NOME)
INTO(ÁREA-DE-DADOS)
TERMINAL[ASIS] FROM(ÁREA-DE-DADOS) LENGTH(VALOR-DE-DADOS)

Onde temos que :

MAP : Especifica o nome do mapa (1-7 caracteres).

MAPSET : Identifica o nome do conjunto de mapas (1-7 caracteres) ao qual pertence este mapa.

INTO : Especifica o nome da área de trabalho na qual os dados serão mapeados. Se o parâmetro é omitido, o BMS coloca os dados na área definida pelo mapa simbólico.

SET : Os dados são processados na memória intermediária.

TERMINAL : Indica que os dados devem ser lidos a partir do terminal e depois mapeados na área de trabalho do programa. A opção ASIS evita a conversão para caixa alta de caracteres em caixa baixa entrados na corrente de dados de entrada. Observar que pode ser especificada a opção TERMINAL ou a opção FROM e LENGTH, mas não as duas. Se nenhuma for codificada, será considerada a opção TERMINAL.

FROM : Indica que os dados devem ser mapeados a partir de outra área de dados no programa. A citada área de dados contém uma corrente de dados na modalidade nativa que já foi lida desde o terminal. O comprimento dessa área de dados é definida pela meia palavra binária identificada no parâmetro LENGTH.

O exemplo a seguir ilustrará a forma para receber dados dentro do programa de aplicação. Aqui é assumido que a tarefa anterior tenha enviado o mapa e que o operador tenha entrado com informações.

WORKING-STORAGE SECTION.
COPY ICMSET.
PROCEDURE DIVISION.
EXEC CICS RECEIVE MAP(‘ICMAP’) MAPSET(‘ICMSET’) END-EXEC.

Os dados de entrada que estão residindo na TIOA antes do comando RECEIVE serão interpretados pelo BMS e movidos para DSECT residindo na Working-Storage Section. A partir do momento em que a TIOA não for mais necessária, ela será liberada.

O exemplo a seguir ilustrará um programa recebendo dados na Linkage Section do programa de aplicação. Novamente é assumido que anteriormente a tarefa tenha enviado um mapa e que o operador tenha entrado com informações.

LINKAGE SECTION.
01 PTRSLST.
03 FILLER
03 MAPPRT
COPY ICMSET.
PROCEDURE DIVISION.

EXEC CICS RECEIVE MAP(‘ICMAP’) MAPSET(‘ICMSET’)
SET(MAPPTR)
END-EXEC.

Na eventualidade de os dados já estarem disponíveis para o programa de aplicação, é necessário movê-los para o MAP DSECT. O exemplo a seguir ilustrará como isso pode ser compatibilizado. As opções FROM e LENGTH são necessárias, e o campo usado como argumento da opção LENGTH tem que ser inicializado. São movidos zeros para o IOPTR porque a área associada com o nome está liberada. Isto nos ajudará a manter a integridade do CICS.

Exemplo :

WORKING-STORAGE SECTION.
01 WSWORKAREA.
02 IOLEN
COPY ICMSET.
LINKAGE SECTION.
01 PTRSLST.
02 FILLER
02 IOPTR
01 IDAREA.
03 FILLER
PROCEDURE DIVISION.

EXEC CICS RECEIVE SET(IOPTR)
LENGTH(IOLEN) END-EXEC.
(processamento das verificações ).

EXEC CICS RECEIVE MAP(‘ICMAP’) MAPSET(‘ICMSET’)
FROM (IOAREA)
LENGTH(IOLEN)
END-EXEC.
MOVE ZEROS TO IOPTR.


Comando COPY ORDENT


O COPY ORDENT solicita a inclusão do mapa simbólico no programa durante a fase de compilação. Nos comandos BMS basta informar os nomes do MAP e MAPSETS a serem utilizados.

Exemplo :

COPY ORDENT

EXE CICS RECEIVE MAP(‘PRIM’)
MAPSET(‘ORDENT’)
MOVE NUM TO TEMP

EXEC CICS SEND MAP(‘SEG’)
MAPSET(‘ORDENT’) END-EXEC.


Construção de página


Uma página é a área de um terminal na qual os dados podem ser exibidos ou impressos de uma só vez. As dimensões da área (número de linhas e de colunas) é especificada para o terminal particular na TCT pelo programador. Esse recurso é muitas vezes usado junto com a pesquisa browser do arquivo. Muitas aplicações de pesquisa BROWSE são destinados a exibir diversos registros de uma vez para cada exame por um operador de terminal. Nestas aplicações, o número de registros a serem exibidos é variável. Na figura abaixo temos, como exemplo, a situação de contas com saldos correspondentes no qual, o título o detalhamento e o número de linhas são criados com uso de mapas separados.

Cada linha de detalhamento da conta é formatado de acordo com um mapa simples, que é empregado repetidamente no programa de aplicação. Por isso, a tela contém somente a quantidade de linhas detalhes correspondentes ao número de contas no arquivo, com salário correspondente. Esta exibição é o resultado de sete pedidos de saída. Se existirem mais salários correspondentes no arquivo que podem ser acomodados em uma página de exibição, são criadas páginas múltiplas. As páginas são usadas até que a mensagem de saída esteja completa e então transmitida ao terminal, página por página.

Até aqui vimos que a construção de páginas é feita através de comandos específicos. Todavia, existem alguns parâmetros adicionais e um comando adicional de saída necessários. As macro instruções de definição de mapa devem ser expandidas para especificarem os mapas múltiplos que serão empregados para formatar as exibições de saída. Os comandos de mapeamento de saída produzidos pelo programa devem também indicar quais mapas múltiplos que estão sendo usados para formatar uma página.


Conceitos de definição de mapas


Alguns mapas podem especificar a posição absoluta enquanto outros podem especificar posições relativas a outros mapas.

O mapa inicial está colocado no alto da página. O mapa de detalhe ocupa a próxima linha disponível a cada vez que ela é usada. O mapa de informação final aparece na parte inferior da página.

Nos exemplos anteriores, cada mapa define uma linha inteira na página. Entretanto, uma linha pode ser definida por mapas múltiplos.

Durante a execução do programa, o BMS mantém contadores e indicadores de localização de linhas e de colunas para controlar o posicionamento horizontal e vertical de dados dentro da página. O programa de aplicação somente tem que apresentar mapas na direção do alto para baixo e da esquerda para a direita.


Definição de MAPAS – Macros


a) Macro DFHMDI – Como a construção de página é realizada pelo uso de uma coleção de mapas individuais definidos dentro de um conjunto de mapas, os parâmetros de construção de página estão especificados na macro DFHMDI. As dimensões de um mapa são definidas pelo parâmetro SIZE, da seguinte forma : SIZE = (Linha, Colunas). Este parâmetro é especificado para a construção de páginas do mesmo modo que para uma exibição de um mapa simples.

Entretanto, como a construção de páginas pode empregar diversos mapas para formatar uma única página, cada página isoladamente terá, preferencialmente, que ter as menores dimensões. Por exemplo, especificando SIZE =(2,30), será definido um mapa que tem duas linhas de comprimento e trinta colunas de largura.


Mapas inicial e de informação final


Uma página pode ser formada inteiramente por linhas de detalhe. Entretanto, se for desejado colocar título e dados no pé da página, como foi mostrado anteriormente, um mapa é definido como inicial e outro como mapa de informação final.

Especificando HEADER = YES, será indicado que o mapa que está sendo definido é um mapa inicial ou de título. Os mapas de título são sempre colocados no topo de uma página, e tipicamente trazem informação do tipo título de exibição e o número de página. Mapas iniciais múltiplos podem ser definidos de modo a serem exibidos numa mesma página.

Como os títulos são sempre colocados no alto de uma página, eles devem ser apresentados para mapeamento antes que qualquer outro dados seja formatado na página. Se um mapa inicial for especificado depois do mapeamento de um dado não inicial, uma nova página é iniciada com o título especificado como o primeiro mapa da página. Um mapa que deve ser usado como mapa de informação final é definido com o parâmetro TRAILER=YES.

Os mapas de informação final podem ser colocados no pé de uma página ou imediatamente após o último mapa detalhe. A colocação depende do parâmetro LINE ou JUSTIFY. Os mapas múltiplos de informação final podem ser exibidos na mesma página. O BMS observa o número de linhas definidos no maior mapa de informação final em um conjunto mapas, e, durante a saída, reserva o número de linhas necessárias para acomodar a maior informação final.

Considerando a situação em que exista dois mapas de informação final, e, estes estejam definidos no mesmo conjunto de mapas, duas linhas serão sempre reservadas na página, pois o mapa maior de informação final exige duas linhas.

Se estes dois mapas de informação final forem exibidos numa mesma página, deve ser definido uma mapa simulado de informação final.

O mapa simulado de informação final não é citado em qualquer dos comandos de mapeamento de saída. Por essa razão, não são necessários campos para defini-lo. Seu único propósito é o de permitir que o BMS calcule o número total de linhas na página que será ocupada pelo mapa de informação final.


Estabelecimento das margens de mapas


O alinhamento de um mapa no topo, no pé esquerdo e à direita de uma página é feito pelo parâmetro, JUSTIFY=(LEFT/RIGTH, FIRST/LAST)

Se nem LEFT ou RIGTH forem especificados, LEFT é assumido. O parâmetro JUSTIFY = FIRST indica que um mapa deve ser posicionado como o primeiro mapa na página. Este parâmetro pode ser especificado para somente um mapa por página. Sempre que um mapa definido como JUSTIFY=FIRST for apresentado para mapeamento uma nova página é iniciada. A colocação de mapas iniciais é definida pelo parâmetro JUSTIFY=FIRST.

Os mapas definidos pelo parâmetro JUSTIFY=LAST são sempre colocados no pé da página. Os mapas de informação final são muitas vezes definidos por JUSTIFY=LAST para forçar este posicionamento. Este parâmetro pode ser especificado para mais de um mapa por página. Entretanto, mapas múltiplos com JUSTIFY=LAST podem ser posicionados somente nos lados da página.


Posicionamento de linha


A linha numa página em que deve começar a formatação de um mapa pode ser especificação do parâmetro, LNE=NÚMERO/NEXT/SAME

A linha especificada pode ser absoluta ou relativa em relação à última linha usada no pedido anterior de saída.

LINE = número indica que o mapa deve começar numa linha de número especificada. Se o operando LINE especificar o número da linha que já foi formatado na página, uma nova página será iniciada.

LINE=NEXT indica que o mapa vai começar na próxima linha disponível na página. Se o operando LINE for omitido, LINE=NEXT é assumido. Se isto for usado para o primeiro mapa numa página o mapeamento começa na linha 1.

LINE=SAME indica que o mapa deve ser formatado na mesma linha de início usada no pedido anterior de saída.


Posicionamento de coluna


A coluna em uma linha na qual deve começar a formatação de um mapa pode ser especificada pela codificação do parâmetro.

COLUMN=NÚMERO/NEXT/SAME

As colunas são contadas a partir do lado esquerdo ou do lado direito da página com base no operando JUSTIFY.

COLUMN=NÚMERO, indica que o mapa deve começar numa coluna especificada a partir do lado esquerdo ou do lado direito da página (máximo 80 colunas).

COLUMN=NEXT indica que o mapa deve começar na próxima coluna disponível.

COLUMN=SAME indica que o mapa deve começar na mesma coluna que o do último mapa contendo um número absoluto de coluna.

*ESTA FOI A COMPILACAO DE UM CURSO DE CICS




TRABALHANDO COM PRINTER DE CICS

Acquire the Printer

- Pegar o nome da printer e a Region da qual ela pertence.

- Geralmente o nome da printer tem 4 letras (XXXX), que o CICS assume como TERMINAL, ou seja, para um Display deve se usar um comando de TERMINAL:

F CICSREGION,CEMT I TER(XXXX - para ver um terminal.

- Ver todos os parametros, mas os principais sao:

Servstatus( Inservice ) -tem que estar inservice, se nao, usar o comando para passar um terminal para 'inservice'

Termstatus( Acquired ) - este status que é exigido quando algume liga para um 'acquire' de uma printer, se nao estiver com este status usar o comando:

f cicsregion,cemt s ter(XXXX)acq - Comando que faz um Aquire do terminal.

Depois verificar se esta do jeito que se necessita.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License