Sexta, Junho 05, 2020

A macro DFHMDF define os atributos sobre a tela. É necessario uma macro DFHMDF para cada atributo da tela.

Como exemplo, suponhamos que na coluna 10 de uma tela desejamos criar uma caixa de texto para digitar o codigo do produto. A caixa de texto terá ‘a sua esquerda um literal descritivo do campo. A linha 10 terá o seguinte aspecto:

0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 

x C O D I G O D O P R O D U T O x _ _ _ _ _ x

Note na ilustração que criamos 3 atributos representados pelas letras (x). O codigo BMS para esta linha terá 3 macros DFHMDF:

DFHMDF  POS=(10,3),INITIAL=´CODIGO DO PRODUTO’,... CODPROD

DFHMDF POS=(10,21),....

DFHMDF POS=(10,27, LENGTH=0,..... 

A sintaxe da macro DFHMDF é:

campo DFHMDF argumentos

Campo (na coluna 1) é opcional, e informa o nome do campo nos casos em que ele deve aparecer no programa Cobol.

Os argumentos da macro DFHMDF podem ser:

POS=posição,

Define a localização do campo na tela. Esta será a posição ocupada pelo atributo descrito. Pode ser informada em um dos formatos:

POS=numero,

deslocamento do campo na tela. Ex.: POS=81,

O atributo do campo esta na linha 2 coluna 2.

(Para linha=1 e coluna = 1, POS=0)

ou

POS=(linha,coluna),

Ex.: POS=(2,2),

O atributo do campo esta na linha 2 coluna 2.

LENGTH=comprimento, 

Este é o comprimento do campo, não incluindo o atributo. Os campos podem ter comprimento máximo de 256 caracteres. Quando o comprimento de um campo faz com que ele ultrapasse a coluna 80 da linha (overflow), o campo continuará na linha seguinte. Se o overflow ocorrer na última linha o campo, ele continuará na linha 1.

Pode-se definir um campo de comprimento zero se a macro DFHMDF não tiver label (campo sem nome). Este pseudo-campo não aparecerá na área copy da tela, e servirá somente para criar um atributo limitador para o campo anterior da tela.

LENGTH=comprimento, Ex.: LENGTH=4,

ATTRB=(proteção,brilho,acesso),

Este argumento define as características do atributo do campo. Os valores permitidos em cada opção do argumento, todos opcionais, são:

ATTRB=(proteção, ASKIP, – Campo protegido. O cursor não parará neste campo com o uso ta tecla TAB.
PROT, – O campo será protegido, isto é, será bloqueado para digitação.
UNPROT, – Campo desprotegido, aceitando digitação normal.
UNPROT,NUM – Campo desprotegido somente para teclas numéricas.
brilho, NORM – Campo com brilho normal.
BRT – Campo com brilho intenso.
DRK – Campo invisível.
acesso), FSET – O campo deve ter o atributo MDT sempre ligado (ON). O terminal transmite seu conteúdo para o programa Cics, mesmo que o operador não altere o campo.
IC – O cursor deve ser colocado neste campo.

INITIAL=literal,

Esta clausula (opcional), define o conteúdo inicial do campo. Literal deve ser definido com aspas simples. Ex.:

INITIAL=literal, Ex.: INITIAL=’XYZ’,

PICIN=mascara,

PICIN define o formato da PICTURE que sera gerada na area COBOL do mapa de entrada da tela. 

PICIN=mascara, Ex.:  PICIN=’999999V99’,

Por ex., para a linha do mapa BMS:

VALOR    DFHMDF POS=(5,10),PICIN=’999999V99’,LENGTH=8,

Sera gerada o fonte COBOL:

        03  VALOR       PIC 999999V99.  

 PICOUT=mascara,

PICOUT define o formato da PICTURE que sera gerada na area COBOL do mapa de saida da tela. 

PICOUT=mascara, Ex.: PICOUT=’$$$$$9,99’, 

Por ex., para a linha do mapa BMS:

VALOR    DFHMDF POS=(5,10),PICOUT=’$$$$$9,99’,

Sera gerada o fonte

        03  VALOR       PIC $$$$$9,99.  

Os parametros a seguir são de uso pouco frequente:

JUSTIFY=(posição,preenchimento),

  • JUSTIFY define como o terminal posicionará os dados no campo durante a digitação. O argumento posição pode ser RIGHT ou LEFT, e o preenchimento pode ser BLANK ou ZERO.
  • JUSTIFY=(LEFT,), alinha os dados à esquerda do campo.
  • JUSTIFY=(RIGHT,), alinha os dados à direita do campo.
  • JUSTIFY=(,BLANK), preenche as posições não digitadas do campo com espaços.
  • JUSTIFY=(,ZERO), preenche as posições não digitadas do campo com zeros.

 GRPNAME=nome,

O argumento GRPNAME serve para agrupar sub-campos de um campo, como por exemplo, o dia, mês e ano formando uma data. Para se criar sub-campos, use macros DFHMDF para criar cada um dos sub-campos. Todas as macros DFHMDF dos sub-campos devem ter o argumento GRPNAME com o mesmo nome, que será usado como identificação do grupo. Somente o primeiro sub-campo pode ter o argumento ATTRB, os outros sub-campos vão usar o ATTRB do primeiro sub-campo. Ex.:

DD DFHMDF POS=(5,10), GRPNAME=DATA,ATTRB=(BRT)
MM DFHMDF POS=(5,13), GRPNAME=DATA
AA DFHMDF POS=(5,16), GRPNAME=DATA

A sintaxe desta macro é

 

Mapa DFHMDI argumentos

Mapa (Na coluna 1) é o nome da tela. Este nome será usado nos programas para leitura e gravação da tela. 

Os argumentos da macro DFHMDI podem ser:

SIZE=(linhas,colunas),

Define o tamanho da tela em numero de linhas e colunas.

SIZE=(linhas, Total de linhas da tela.
colunas), Total de colunas da tela.

CTRL=(PRINT,length,FREEKB,ALARM,FRSET), 

Identico a macro DFHMSD. Se usado na macro DFHMDI ele substitui (Overrides) os mesmos argumentos da DFHMSD.

CTRL=(PRINT,length,FREEKB,ALARM,FRSET) Idem macro DFHMSD

Os argumentos seguintes são de uso pouco frequente. Servem para se desenhar varias telas sobre o terminal:

LINE=posição,

Indica a linha do terminal onde deve ser posicionada esta tela. Posição pode ser um dos 3 valores:

  • Numero – Um literal numérico indica a posição absoluta da linha.
  • NEXT – A tela deve ser colocada na próxima linha disponível.
  • SAME – A tela que a tela deve ser colocada na mesma linha da tela anterior.

COLUNN=posição,

Indica a coluna do terminal onde deve ser posicionada a tela. Posição pode ser qualquer dos valores descritos em LINE.

FIELDS=NO,

Informa que esta tela não tem campos.

 

As telas do Mainframe são escritas em uma linguagem fonte chamada BMS. O mapa BMS para descrever uma tela deve ser codificado usando a sintaxe do Assembler do Mainframe. Nesta sintaxe, cada comando é uma macro de Assembler, cujas regras gerais são:

  • Label da macro – Da coluna 1 à coluna 8 do editor(opcional).
  • Nome das macros – A partir da coluna 10.
  • Argumentos da macro - A partir da coluna 16 até a coluna 71.
  • Os argumentos devem ser separados por vírgula. Não deve haver espaços entre argumentos.
  • Havendo um espaço na área de comandos, todo o texto restante da linha é considerado comentário.
  • Um caracter na coluna 72 indica continuação da linha. A continuação deve se iniciar na coluna 16 da próxima linha.
  • A ultima linha do fonte deve ter a palavra END na coluna 10.

O mapa BMS é formado pela combinação de 3 macros:

DFHMSD – Define um conjunto de telas (Mapset).

DFHMDI – Define uma tela.

DFHMDF – Define um campo de tela.

O fonte de um mapa BMS deve ter uma macro DFHMSD definindo o mapset, uma macro DFHMDI para cada tela do mapset, e após cada macro DFHMDI deverá haver uma macro DFHMDF para cada campo da tela. Encerrar o mapa BMS com uma macro:

DFHMSD  TYPE=FINAL

Um mapa BMS terá o seguinte aspecto:

MAPSET DFHMSD ....
TELA1 DFHMDI ....
CAMPO

DFHMDF

DFHMDF

....
------------------ ------------- ....
TELA2

DFHMDI

DFHMDF

....
CAMPO DFHMDF ....
------------------ ------------- ....
  DFHMSD TYPE=FINAL
  END  

Depois de escrito o fonte da tela, deve-se compila-lo e esta compilação gerará:

  • Um modulo objeto da tela usado pelo TCP (Terminal control program) para gerar os comandos de tela no protocolo 3270.
  • Uma área copy (book) com os campos da tela para ser inserida no programa Cobol.

 

A sintaxe desta macro é

 

Label DFHMSD argumentos

O Label desta macro define o nome do mapset. Ele deverá ser usado nos programas dentro dos comandos de leitura e gravação da tela.

Os argumentos do comando devem ser separados por virgula e podem ser:

TYPE=tipo,

Este deve ser o primeiro argumento da macro. Tipo pode ser DSECT ou MAP.

TYPE=DSECT, Indica que deve ser gerada uma area copy para ser inserida nos programas Cobol.
TYPE=MAP, Indica que deve ser gerado um modulo objeto do mapset, com o nome do label da macro, para uso do Cics.

MODE=mode,

MODE=IN, As telas serão de INPUT (entrada de dados).
MODE=OUT, As telas serão de OUTPUT (saída de dados).
MODE=INOUT, As telas serão de INPUT e OUTPUT.

 

LANG=linguagem,

LANG=ASM, a linguagem do programa Cics é Assembler.
LANG=COBOL, a linguagem do programa Cics é Cobol.

STORAGE=AUTO,

STORAGE=AUTO, As áreas de INPUT e OUTPUT das telas usarão a mesma área de memória (serão geradas com a clausula REDEFINES).

CTRL=(PRINT,length,FREEKB,ALARM,FRSET),

Este argumento define varias características do terminal para onde a tela deve ser enviada. Todas estas características são opcionais, e são descritas abaixo.

CTRL=(PRINT, O terminal é uma impressora remota.
length, Quando o terminal for impressora, contem o comprimento da linha podendo ser: L40, L64, L80 ou HONEOM. (HONEOM indica um comprimento padrão definido no Cics).
FREEKB, Libera automaticamente o teclado quando uma tela é enviada ao terminal. No sistema 3270 os teclados ficam bloqueados enquanto a tela esta sendo tratada pelo Cics.
ALARM, Aciona o alarme do terminal no envio da tela.
FRSET), Muda as tags MDT de todos os atributos dos campos desprotegidos para OFF antes de enviar a tela para o terminal.

 

TIOAPFX=YES,

Este argumento deve ser usado sempre quando o programa Cics for escrito em Command Level. 

TIOAPFX=YES, Cria um campo FILLER de 12 posições no inicio da área copy da tela (usado internamente pelo Cics).

TYPE=FINAL

TYPE=FINAL Esta deve ser a ultima linha de um mapa BMS.

 

Cada um dos comandos acima possui um conjunto especifico de condições de retorno. Por exemplo o comando:

EXEC CICS READ(CLIENTE)  RIDFLD(CODCLI) END-EXEC

Pode retornar situações como:

Erro Código do erro
Registro não encontrado NOTFND
Arquivo não está aberto NOTOPEN
Erro na leitura IOERR
Arquivo desconhecido FILENOTFOUND

 

Para tratar estes retornos em Command Level, deve-se programar antes dos comandos, (no exemplo acima antes do EXEC CICS READ), um comando HANDLE CONDITION que tem como sintaxe:

 

EXEC CICS HANDLE CONDITION condição paragrafo … END-EXEC.

Este comando define para o Cics os paragrafos para onde a execução do programa será desviada para cada uma das condições. Ex.:

        EXEC CICS HANDLE CONDITION

                 NOTFND(EMITIR-ERRO-NÃO-EXISTE)

                 NOTOPEN(ABRIR-ARQUIVO)

                 IOERR(EMITIR-ERRO-LEITURA)

                 FILENOTFOUND(ERRO-ARQUIVO-DESCONHECIDO)

       END-EXEC. 

O programador deve então criar os parágrafos mencionados acima contendo as ações a serem tomadas em cada caso. Quando for executado o comando EXEC CICS READ, se acontecer um dos retornos acima o programa será automaticamente desviado para o parágrafo correspondente (O Cics executa um comando GO TO para o parágrafo).

Não é necessário programar todas as condições de retorno dos comandos usados no programa. No entanto, se algum comando retornar uma condição não programada, o Cics provocará imediatamente um fim anormal do programa (ABEND).

Após a execução de uma instrução de HANDLE CONDITION, a associação dos parágrafos com as condições programadas será efetuada para todos os comandos Cics posteriores até que um novo HANDLE CONDITION altere esta associação.

Existe uma condição genérica (ERROR) que substitui todas as condições não programadas pelos HANDLE CONDITION. Por exemplo, se no programa colocarmos o comando:

EXEC CICS HANDLE CONDITION ERROR(ROT-ERRO-GERAL) END-EXEC

Apos a execução do comando acima, qualquer retorno não programado por um HANDLE CONDITION será desviado para ROT-ERRO-GERAL.

A instrução:

EXEC CICS IGNORE CONDITION condição END-EXEC.

Determina que o Cics não deverá tomar nenhuma atitude se ocorrer a condição acima ocorrer (não haverá termino anormal do programa – ABEND – e também o programa não será desviado para um parágrafo de tratamento do retorno). No entanto a condição ficará registrada no campo EIBRESP da area EIB (Veja area EIB no capitulo seguinte).

Para se anular os efeitos de um comando HANDLE CONDITION, escreve-se no ponto conveniente do programa a instrução HANDLE CONDITION omitindo o paragrafo. Ex.:

 EXEC CICS HANDLE CONDITION NOTFND END-EXEC.

Subcategorias

ABEND code

CICS - Customer Information Control Syst…

CICS significa Sistema de Controle de Informações do Cliente (Customer Information Control System), ou simplesmente CICS®, é um monitor de transações utilizado inicialmente nos sistemas operacionais z/OS e z/VSE dos...

Command Level

O Command Level é um conjunto de comandos usados em programas COBOL ou ASSEMBLER para fazer a interação com os módulos do Cics (PCP, TCP, FCP etc.). A sintaxe básica...

Construção de um mapa BMS

As telas do Mainframe são escritas em uma linguagem fonte chamada BMS. O mapa BMS para descrever uma tela deve ser codificado usando a sintaxe do Assembler do Mainframe. Nesta...

DFHMDF

A macro DFHMDF define os atributos sobre a tela. É necessario uma macro DFHMDF para cada atributo da tela. Como exemplo, suponhamos que na coluna 10 de uma tela desejamos criar...

DFHMDI

A sintaxe desta macro é   Mapa DFHMDI argumentos Mapa (Na coluna 1) é o nome da tela. Este nome será usado nos programas para leitura e gravação da tela.  Os argumentos da macro...

DFHMSD

A sintaxe desta macro é   Label DFHMSD argumentos O Label desta macro define o nome do mapset. Ele deverá ser usado nos programas dentro dos comandos de leitura e gravação da tela. Os...

EXEC CICS ABEND

ABEND   O comando ABEND encerra uma tarefa de forma anormal.   O CICS libera o armazenamento principal associado à tarefa finalizada; opcionalmente, você pode obter um despejo de transação desse armazenamento.   A chamada do...

EXEC CICS ADDRESS

Descrição: ADDRESS ​​acessa as seguintes áreas: O elemento do ambiente de controle de acesso (ACEE) A área de comunicação disponível para o programa invocado (COMMAREA) A área de trabalho comum (CWA) O bloco de interface...

EXEC CICS ASSIGN

O comando ASSIGN obtém valores de fora do ambiente local do programa de aplicativo. Os dados obtidos dependem das opções especificadas. Você pode especificar até 16 opções em um comando...

EXEC CICS BIF DEEDIT

Descrição O BIF DEEDIT fornece a função incorporada DEEDIT. Ele especifica que caracteres alfabéticos e especiais são removidos de um campo de dados EBCDIC e os dígitos restantes alinhados à direita...

EXEC CICS HANDLE ABEND

HANDLE ABEND   Condições: NOTAUTH, PGMIDERR (apenas PROGRAMA)   Descrição Use o comando HANDLE ABEND para ativar, cancelar ou reativar uma saída para processamento de finalização anormal. Você pode suspender o comando usando os comandos...

EXEC CICS HANDLE CONDITION

Descrição Use o comando HANDLE CONDITION para especificar o rótulo para o qual o controle deve ser passado se ocorrer uma condição. Você deve incluir o nome da condição e, opcionalmente,...

EXEC CICS IGNORE CONDITION

Use o comando IGNORE CONDITION para especificar que nenhuma ação será executada se ocorrer uma condição (ou seja, o controle retornará à instrução após o comando que falhou na execução...

EXEC CICS READ

READ lê um registro de um arquivo em um sistema local ou remoto.   Para comandos UPDATE e não UPDATE, você deve identificar o registro a ser recuperado pelo campo de identificação...

EXEC CICS RECEIVE MAP

O comando EXEC CICS RECEIVE MAP lê a tela enviada pelo terminal.  A sintaxe básica deste comando é:        EXEC CICS RECEIVE           MAP(nome-do-mapa)        ...

EXEC CICS SEND MAP

O comando EXEC CICS SEND MAP envia a tela para o terminal.  Existem 2 formas basicas para este comando: A primeira é usada no inicio do processamento para enviar para o...

Retorno dos comandos

Cada um dos comandos acima possui um conjunto especifico de condições de retorno. Por exemplo o comando: EXEC CICS READ(CLIENTE)  RIDFLD(CODCLI) END-EXEC Pode retornar situações como: Erro Código do erro Registro não encontrado NOTFND Arquivo não está...