86159267-IMS-DB

97
Setembro / 1999 Setemb ro / 1999

Transcript of 86159267-IMS-DB

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 1/97

Setembro / 1999Setembro / 1999

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 2/97

SUMÁRIO

1.0 IMS......................................................................................................

3

2.0 ESTRUTURA HIERÁRQUICA......................................................................................................

3

2.1 Relacionamento dos segmentos............................................................................................

5

3.0 VISÃO LÓGICA - SENSIBILIDADE......................................................................................................

6

4.0 BLOCOS DE CONTROLE......................................................................................................

7

4.1 DBD - Data Base Description......................................................................................................

7

4.2 Descrição das Macros da DBD......................................................................................................10

5.0 PCB - PROGRAM CONTROL BLOCK E PSB-PROGRAM

SPECIFICATION BLOCK......................................................................................................

14

5.1 Descrição das Macros da PCB

- 2 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 3/97

...................................................

...................................................

17

6.0 DMB-DATA MANAGEMENT BLOCK E ACB-ACESS CONTROL BLOCK......................................................................................................

19

6.1 Máscaras da PCB......................................................................................................

19

6.2 Formato da PCB

...................................................

...................................................

20

7.0 PROGRAMAÇÃO......................................................................................................

24

7.1 Códigos de Retorno (STATUS CODE)......................................................................................................

24

7.1.1 Códigos de Retorno......................................................................................................

25

7.2 Formatos de SSA’S...................................................

 ...................................................

35

7.2.1 SSA de qualificação Booleana......................................................................................................

36

7.3 Relacionamento entre PSB-BCB-DBD

37

- 3 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 4/97

7.4 Estrutura do programa de aplicação BATCH

39

7.4.1 Exemplos e Comentários sobre acessos a um

Data Base..................................................................................

46

7.4.1.1 Acesso com “GN” e “GNP”..................................................................................

46

7.4.1.2 Acessos com “GU” - GET Unique..................................................................................

61

7.4.1.3 Exemplo usando DELETE e REPLACE..................................................................................

70

8.0 COMMAND CODES (CC)

77

9.0 ESTRUTURAS DE ARMAZENAMENTO

82

9.1 Tipos de Estruturas

84

9.1.1 HSAM (Hierarchical Seqüencial Acess

Method)................................................................................

84

9.1.2 HISAM (Hierarchical Indexed Seqüencial

Access Method................................................................................

84

- 4 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 5/97

9.1.3 HDAM (Hierarchical Direct Access Method)................................................................................

859.1.4 HIDAM (Hierarchical Indexed Direct

Access Method)................................................................................

85

10.0 ÍNDICE SECUNDÁRIO....................................................................................................

87

10.1 Usando uma chave diferente

87

10.2 Recuperando segmentos baseado em qualifica-

ção de segmentos dependentes

89

11.0 RECOMENDAÇÕES PARA PROGRAMAÇÃO / ANÁLISE....................................................................................................

91

- 5 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 6/97

1.0 IMS

O IMS é um dos sistemas de gerenciamento de banco de dados

mais complexos do mercado, sendo que 50% do seu código fonte

esta relacionado com segurança, privacidade e integridade dos

dados. O IMS foi criado em 1966 para o projeto APOLLO da NASA.

Divide-se em duas partes.

IMS-DC: Responsável pelo controle e execução dos programas

online.

IMS-DB: Também chamado de DL/I , é responsável pela criação e

acesso aos banco de dados.

- 6 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 7/97

2.0 ESTRUTURA HIERÁRQUICA 

A

B E

C1

D1

Segmento: ‘A’ é um,‘B’ é outro segmento.

Tipo de segmento: ‘A’ é um segmento.

‘D’ é um outro tipo de segmento.

Ocorrência de segmento: ‘D1’ é uma ocorrência do segmento

tipo ‘D’.

 Nível de segmento: ‘A’ é nível 1,‘B’, ‘E’ é nível 2

‘C’ é nível 3.

- 7 -

C2

D2

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 8/97

2.1 Relacionamento dos Segmentos

A

B E

C1

D1

Root (Raiz): ‘A’ é o segmento root da estrutura.

Dependentes: ‘C1’, ‘C2’, ‘D1 e ‘D2’ são dependentes do ‘B’.

Pai: ‘A’ é pai dos segmentos.

Filho: ‘B’ e ‘E’ são filhos de ‘A’.

Twin (Gêmeos): ‘C1’ e ‘C2’ são twins.‘D1’ não é twin de ‘D2’ pois pertence a outro

pai.

- 8 -

D2

C2

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 9/97

3.0 VISÃO LÓGICA - SENSIBILIDADE

Visão lógica de um data-base é composta de todos os segmentos

que o programa vai acessar no Data-Base, isto é, todos os

segmentos que são sensíveis ao programa. Esta sensibilidade

pode ocorrer também a nivel de campo.

Estrutura Física

A

B E

C1

D1

 Visão Lógica 1

A

B E

Para essa visão lógica os segmentos sensíveis são A B E

- 9 -

C2

D2

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 10/97

4.0 BLOCOS DE CONTROLE

Vemos agora, os blocos de controle necessários na

formatação de um banco de dados (DBD) e na formatação de

visões lógicas (PCB).

4.1 DBD – Data Base Description

A DBD é usada para definição completa de um banco de

dados. Nela descrevemos todos os seus segmentos, mas não éobrigatório definir todos os campos de cada segmento, apenas

aqueles que os programas utilizarão para acessar o segmento.

Existem 3 tipos de DBD, que se diferem pelo tipo de banco de

dados que definem:

Física Descreve um banco de dados físico, com todos os seus

segmentos obedecendo rigorosamente a estrutura em que

está armazenado fisicamente no disco ou na fita.

Lógica Descreve um banco de dados lógico, que se constitui

na união de dois ou mais bancos de dados físicos.

De Índice Descreve um banco de dados de índice primário, usado

nos métodos de acesso HIDAM, ou índice secundário.

- 10 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 11/97

Exemplo da definição de uma DBD.

*--------------------------------------------------------------------------------------------------------*

* ---> B3002VD1 – DB DE DOCUMENTAÇÃO DE PRODUTOS PRONTOS **--------------------------------------------------------------------------------------------------------*

DBD NAME=B3002VD1, -

ACCESS=(HIDAM,VSAM), -

PASSWD=NO

DATASET DD1=DB3002VD, -

DEVICE=3380, -

SIZE=4096, -

FRSPC=(20,5)*--------------------------------------------------------------------------------------------------------*

* ---> S0003V – SITUAÇÃO DO PERÍODO/PRODUTO *

*--------------------------------------------------------------------------------------------------------*

SEGM NAME=S0003V,PARENT=0,BYTES=(350,50),PTR=TB

FIELD NAME=(CHAVE.SEQ.U),START=03,BYTES=31,TYPE=C

FIELD NAME=COFAB,START=03,BYTES=03,TYPE=C

FIELD NAME=COSEG,START=06.BYTES=01,TYPE=C

FIELD NAME=COAFA,START=125,BYTES=01,TYPE=C

FIELD NAME=COLFA,START=126,BYTES=01,TYPE=C

FIELD NAME=NPROG,START=127,BYTES=06,TYPE=C

LCHILD NAME=(S0003VI,B3002VI1),PTR=INDX

LCHILD NAME=(S0016V,B3003VS1),PTR=INDX

XDFLD NAME=S0016VS,SEGMENT=S006V, -

SRCH=(COFAB,CTCLI,DTPFO,BAUMP), -

SUBSEQ=(/CK0006V)

LCHILD NAME=(S0017V,B3004VS1),PTR=INDX

XDFLD NAME=S0017VS,SEGMENT=S0006V, -

SRCH=(COFAB,BAUMP,DTPFO,CEREP,CTCLI), -

SUBSEQ=(/CK0006V)

LCHILD NAME=(S0265V,B3005VS1),PTR=INDX

XDFLD NAME=S0265VS,SEGMENT=S0003V, -

SRCH=(COFAB,NPROG,COAFA,COLFA), -

EXTRTN=B6408100

- 11 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 12/97

*--------------------------------------------------------------------------------------------------------*

* ---> S0004V – DADOS TÉCNICOS DO PERÍODO *

*--------------------------------------------------------------------------------------------------------*

SEGM NAME=S0004V,PARENT=S0003V,BYTES=64,PTR=NT*--------------------------------------------------------------------------------------------------------*

* ---> S0005V – EQUIPAMENTOS OPCIONAIS (SA'S) *

*--------------------------------------------------------------------------------------------------------*

SEGM NAME=S0005V,PARENT=((S0003V,DBLE)),BYTES=36,PTR=TB

FIELD NAME=(EQOPC.SEQ.U),START=15,BYTES=21,TYPE=C

*--------------------------------------------------------------------------------------------------------*

* ---> S0006V – RELAÇÃO CLI/BM x PEDIDO *

*--------------------------------------------------------------------------------------------------------*

SEGM NAME=S0006V,PARENT=((S0003V,DBLE)),BYTES=52,PTR=TB

FIELD NAME=(TISEG,SEQ,U),START=15,BYTES=01,TYPE=C

FIELD NAME=/CK0006V,START=01,BYTES32,TYPE=C

FIELD NAME=COFAB,START=01,BYTES=03,TYPE=C

FIELD NAME=BAUMP,START=16,BYTES=21,TYPE=C

FIELD NAME=DTPFO,START=37,BYTES=04,TYPE=C

FIELD NAME=CEREP,START=41,BYTES=03,TYPE=C

FIELD NAME=CTCLI,START=44,BYTES=08,TYPE=C

*--------------------------------------------------------------------------------------------------------** ---> S0007V – HISTÓRICO DAS ALTERAÇÕES *

*--------------------------------------------------------------------------------------------------------*

SEGM NAME=S0007V,PARENT=((S0003V,DBLE)),BYTES=50,PTR=TB

*--------------------------------------------------------------------------------------------------------*

* ---> S0008V – OBSERVAÇÕES GERAIS *

*--------------------------------------------------------------------------------------------------------*

SEGM NAME=S0008V,PARENT=((S0003V,DBLE)),BYTES=(158,88), -

PTR=TB

FIELD NAME=(TISEG,SEQ,U),START=17,BYTES=01,TYPE=C

*--------------------------------------------------------------------------------------------------------*

* ---> S0009V – DESDOBRAMENTO DE VEÍCULOS EM AGREGADOS *

*--------------------------------------------------------------------------------------------------------*

SEGM NAME=S0009V,PARENT=((S0003V,DBLE)),BYTES=112,PTR=TB

FIELD NAME=(CHAVE,SEQ,U),START=15,BYTES=03,TYPE=C

DBDGEN

FINISH

END

- 12 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 13/97

4.2 Descrição das Macros da DBD:

 Macros Parâmetros Significados

DBD Macro de identificação de dados.

NAME Identifica o nome do banco de dados.

ACESS Especifica a estrutura que estará armaze-

nada este banco de dados, podendo ser

HSAM, HISAM, HDAM, HIDAM, ou os parâme-

tros chaves abaixo:

INDEX: Descreve o arquivo de índices no

HIDAM ou indica a criação de índi-

ces secundários para HISAM, HDAM ou

HIDAM.

LOGICAL: Indica que este é um banco de

dados lógico, que se constitui

da união de dois ou mais que jáexistem fisicamente.

RMNAME Indica o nome do módulo de randomização,

para bancos de dados HDAM.

DATASET Especificação de dataset para o banco de

dados onde podemos definir até 10

dataset’s, sendo o primeiro e os outros

secundários.

DD1 Define o grupo de dataset’s.

DEVICE Tipo de armazenamento físico que vai

conter o grupo de dataset’s. Exemplo: IBM

3330, 3350.

- 13 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 14/97

 Macros Parâmetros Significados

MODEL Modelo dos discos. Ex.: 3380.

DD2 Usado para HSAM indicando o dataset de

saída eu conterá os campos atualizados.

OVFLW Usado para ISAM (OSAM) ou VSAM (ESDS);

especificando o dataser de OVERFLOW.

BLOCK Usado para HSAM, HISAM, e INDEX especi-ficando o fator de bloco para registros

lógicos.

SIZE Tamanho de bloco físico.

RECORD Usado para HSAM, HISAM, INDEX especifi-

cando o tamanho para registros lógicos.

SCAN Número máximo de cilindros para organi-

zações hierárquicas diretas.

FRSPC Distribuição de espaço livre no dataset

para organização de carga e reorganização.

SEGM Definição de um segmento do banco de dados.

NAME Indica o nome do segmento.

PARENT Indica o seu segmento pai.

FREQ Número máximo de segmentos gêmeos.

- 14 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 15/97

 Macros Parâmetros Significados

BYTES

POINTER

SOURCE

CONPRTN

Tamanho em bytes do segmento.

Tipo de pointer que queremos para o

segmento.

Segmento físico fonte para este segmento.

Usado para banco de dados VSAM, indicando

o nome da rotina de compressão de dados.

LCHILD Indica relacionamento lógico entre seg-

mentos.

NAME Especifica o filho lógico deste segmento.

POINTER Indica o relacionamento entre o pai

lógico e o filho lógico. Os parâmetros

chaves são:

SNLG:Ponteiro de segmento pai para pri-

meira e ultima ocorrência do filho.

DBLE:Dois ponteiros do segmento pai para

a primeira e última ocorrência do

filho.

NONE:Ligação será de forma física pareada.

PAIR Numa relação bidirecional, indica a con-

trapartida do segmento filho lógico.

INDEX

RULES

Campo que servirá de índice.

Fornece opção de inserção para segmentos

filhos lógicos sem campo de seqüência.

- 15 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 16/97

 Macros Parâmetros Significados

FIELD Descreve os campos que poderão ser usados

para acessar este segmento.

NAME Nome do campo. Os parâmetros opcionais

são:

SEQ : Indica o campo chave do segmento.

U : Indica que não poderá haver repe-

tição de chaves deste tipo de

segmento sob um pai.

M : Indica que poderá haver a repe-tição de chaves deste tipo de

segmento sob um pai.

BYTE

START

TYPE

Tamanho em bytes do campo.

Posição em que começa o campo.

Formato do campo, podendo ser: X (hexa),

P (compactado) ou C (alfanumérico).

XDFLD Descreve campo usados por índice secun-

dário.

NAME Nome do campo que é apontado pelo seg-

mento do banco de dados de índice secun-

dário.

SEGMENT

CONST

Indica o segmento que contem o campo que

será indexado.

Indica através de um código um índice

particular secundário.

- 16 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 17/97

 5.0 PCB - PROGRAM CONTROL BLOCK E PSB-PROGRAM SPECIFICATION

BLOCK

A PCB é o bloco de controle que define a visão lógica de um

bando de dados físico para o programa de aplicação. Para cada

banco de dados que o programa vai acessar deve ser feita uma

PCB. Então se um programa de aplicação acessa três bancos de

dados existirão três PCB’s que formarão um outro bloco de

controle chamado PSB. É através da identificação da PSB no JCL

que o DL/I sabe de que forma e quais os bancos de dados que

serão acessados. Pode acontecer de o programa de aplicaçãoquerer acessar o mesmo banco de dados com duas visões lógicas

diferentes, então a PSB desse programa terá duas PCB’s

distintas para o mesmo banco de dados, como vemos no exemplo

abaixo com o DB B3002VD1 (DB - PEDIDO).

TITLE ‘CAPTAÇÃO DE DOCUMENTOS DO SISTEMA V1010’

PRINT NOGEN

*------------------------------------------------------------*

* PCB1 (TP - AISO) *

*------------------------------------------------------------*

PCB TYPE=TP, NAME=AIS00001)

*------------------------------------------------------------*

* PCB2 (TP - B4113000) *

*------------------------------------------------------------*PCB TYPE=TP, NAME=B4113000)

*------------------------------------------------------------*

* PCB3 (DB - CAPTAÇÃO) *

*------------------------------------------------------------*

PCB TYPE=DB, DBDNAME=B3060VDO,PROCOPT=GIR,KEYLEN=09

SENSEG NAM=S0048V, PARENT=0

- 17 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 18/97

*------------------------------------------------------------*

* PC4 (DB - RESUMOS *

*------------------------------------------------------------*

PCB TYPE=DB, DBDNAME=B3000VDO, PROCOPT=GIR,KEYLEN=38

SENSEG NAM=S000IV, PARENT=0

*------------------------------------------------------------*

* PCB 5 (DB - PEDIDO - GIRO) *

*------------------------------------------------------------*

PCB TYPE=DB,DBNAME=B3002VD1,KEYLEN=52

SENSEG NAME=S0003V,PROCOPT=GIRD

SENSEG NAME=S0004V,PARENT=S0003V,PROCOPT=GIR

SENSEG NAME=S0005V,PARENT=S0003V,PROCOPT=GIRD

SENSEG NAME=S0006V,PARENT=S0003V,PROCOPT=GIRD

SENSEG NAME=S0007V,PARENT=S0003V,PROCOPT=GI

SENSEG NAME=S0008V,PARENT=S0003V,PROCOPT=GIRD

*------------------------------------------------------------*

* PCB 6 (DB - PEDIDO - GET) *

*------------------------------------------------------------*

PCB TYPE=DB,DBNAME=B3002VD1,PROCOPT=KEYLEN=52

SENSEG NAME=S0003V

SENSEG NAME=S0004V,PARENT=S0003V

SENSEG NAME=S0005V,PARENT=S0003V

SENSEG NAME=S0006V,PARENT=S0003V

SENSEG NAME=S0007V,PARENT=S0003V

SENSEG NAME=S0008V,PARENT=S0003V

*------------------------------------------------------------*

* PCB 7 (DB - PEDIDO) *

*------------------------------------------------------------*

- 18 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 19/97

PCB TYPE=DB,DBNAME=B3002VD1, KEYLEN=52

SENSEG NAME=S0003V,PROCOPT=GIRD

SENSEG NAME=S0004V,PARENT=S0003V,PROCOPT=GIR

SENSEG NAME=S0007V,PARENT=S0003V,PROCOPT=GI

SENSEG NAME=S0009V,PARENT=S0003V,PROCOPT=GIRD

SENSEG NAME=S0010V,PARENT=S0003V,PROCOPT=GIRD

SENSEG NAME=S0011V,PARENT=S0003V,PROCOPT=GIR

SENSEG NAME=S0012V,PARENT=S0003V,PROCOPT=GIRD

SENSEG NAME=S0013V,PARENT=S0003V,PROCOPT=GIRD

SENSEG NAME=S0014V,PARENT=S0003V,PROCOPT=GIRD

SENSEG NAME=S0015V,PARENT=S0003V,PROCOPT=GIRD

SENSEG NAME=S0072V,PARENT=S0003V,PROCOPT=GIRD

*------------------------------------------------------------** PCB 8 (DB - PEDIDO) **------------------------------------------------------------*

PCB TYPE=DB,DBNAME=B3002VD1,PROCOPT=GIRD,KEYLEN=31SENSEG NAME=S0003V

*------------------------------------------------------------*

* PCB 9 (DB - PLAUSIBILIDADE) **------------------------------------------------------------*PCB TYPE=DB,DBNAME=B3186TODO, PROCOPT=G,KEYLEN=69SENSEG NAME=S0086TSENSEG NAME=S0087T,PARENT=S0086TSENSEG NAME=S0088T,PARENT=S0087T

*------------------------------------------------------------** PSNAME - B4113000 **------------------------------------------------------------*

PSBGEN LANG=COBOL,PSBNAME=B4113000END

- 19 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 20/97

5.1 Descrição das macros da PCB

 MACROS PARÂMETROS SIGNIFICADOS

PCB TYPE Define o tipo da PCB, podendo ser:DB: PCB do tipo banco de dados

TP: PCB do tipo teleprocessamento.

DBDNAME Indica o nome do banco de dados a que

esta PCB está relacionada.

PROCOPT Especifica as operações permitidas

sobre os segmentos referenciados nesta

PCB, podendo ser: G (leitura), D

(deleção), I (inserção), R (alteração),

P (uso do cod. comando D), A (todas as

operações), GO (apenas leitura, L

(carga), LS (carga seqüencial).

KEYLEN Tamanho da maior chave concatenadapossível nesta visão lógica.

PROCSEQ Tamanho da maior chave concatenada

possível nesta visão lógica.

SENSEG Define um segmento sensível a esta

PCB.

NAME Nome do segmento a ser acessado,

devendo ser igual ao descrito na DBD.

PARENT Nome do segmento a ser acessado,

devendo ser igual ao descrito na DBC.

- 20 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 21/97

 MACROS PARÂMETROS SIGNIFICADOS

PROCOPT Especifica as operações permitidas

sobre este segmento, prevalecendo so-

bre o PROCOPT da macro PCB.

SENFLD Define um campo sensível a esta PCB.

NAME Nome do campo a ser acessado, devendo

ser igual ao descrito na DBD.

START Posição que o campo deverá começar na

IO-AREA interna do programa.

REPLACE YES: Campo poderá ter seu valor alte-

rado.

NO: Campo não poderá ser alterado,

prevalecendo sobre a opção PROCOPT.

PSBGEN LANG Informa a linguagem que foi feito o

programa de aplicação que usara esta

PCB. Podendo ser cobol, assembler ouPL/I.

MAXQ Indica o número máximo de chamadas

DL/I com código de comando Q.

CMPAT Indica a utilização da PSB para região

do IMS, BMP ou BATCH.

IOASIZE e

SSASIZE

São utilizados somente em ambiente TP,

especificando o tamanho adicional de

áreas a serem reservadas junto a PSB,

a fim de receber áreas de I/O e

strings de SSA, da região de controle

de TP do IMS.

PSBNAME Nome da PSB a ser catalogada na

biblioteca.

- 21 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 22/97

6.0 DMB-DATA MANAGEMENT BLOCK E ACB-ACESS CONTROL BLOCK

Quando um programa, que acessa o DL/I. vai executar, ocorre o

seguinte: antes de passar os dados para o programa, o DL/I faz

uma “checagem” da PCB com sua respectiva DBD, para verificar

se a PCB está correta. Estando tudo correto, o DL/I, forma o

bloco de controle chamado de DMB, que conterá informações

retidas tanto da PCB quanto da DBD. Portanto é criado um bloco

DMB para cada PCB da PSB do programa. Esse processamento é

realizado sempre que um programa DL/I vai executar. Casoqueiramos economizar tempo de execução, poderemos formar os

blocos DBM de uma PSB uma única vez. Para isso utilizamos o

utilitário ACBGEN que cria esses blocos e com a união deles

forma o bloco ACB, que terá o mesmo nome da PSB. Em tempo de

execução o IMS verifica se já existe uma ACB criada.

6.1 Máscaras da PCB

A PCB constitui-se de um bloco de controle que contém

informações importantes ao programa de aplicação. Para acessar

estas informações o programa define uma máscara na DUMMY

SECTION (ASSEMBLER) ou LINKAGE SECTION (COBOL). Esta área

geralmente é utilizada para verificar o sucesso das operações

feitas com o DL/I. Em um programa ASSEMBLER o endereço das

PCB’s estão nas FULL’s apontadas pelo registrador 1. Estes

endereços estão na mesma ordem da definição feita na PSB.

- 22 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 23/97

6.2. Formato da PCB

CAMPO TAMANHO EM BYTES

Nome da DBD/Terminal lógico.............. 8

Nível do segmento........................ 2

Código de retorno........................ 2

Opções de processamento ................. 4

Reservado ao DL/I ....................... 4

Nome do Segmento ........................ 8

Tamanho da área de retorno da chave ..... 4Número de segmentos sensíveis ........... 4

Área de retorno de chave ................ n

- 23 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 24/97

NOME DA DBD/TERMINAL LÓGICO

Nome da DBD que define o banco de dados que esta PCB faz

referência. No caso de uma TP/PCB, temos o nome do terminal

lógico que acionou a transação.

NÍVEL DO SEGMENTO

Nele é colocado o nível na hierarquia do último segmento

acessado. Campo que poderá ser útil ao programa de aplicação

para saber que segmento recebeu depois de um CALL não foiqualificado.

CÓDIGO DE RETORNO

Para o programador de aplicação este é o mais importante campo

de PCB, pois, através dos diversos códigos de status é que se

verifica o sucesso ou não das operações feitas com o DL/I. As

três categorias principais de código status são:

- CALL BEM SUCEDIDO

- FALHA DE PROGRAMAÇÃO

- ERRO DE I/0

OPÇÕES DE PROCESSAMENTO

Este campo informa as operações que o programa de aplicação

estará autorizado a fazer no banco de dados. São os valores

que estão definidos na PCB.

NOME DO SEGMENTO

Esta área contém o nome do último segmento acessado pelo pro-

grama Campo que poderá ser útil ao programador de aplicação

- 24 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 25/97

para saber que segmento recebeu depois de um call não quali-

ficado.

TAMANHO DA ÁREA DE RETORNO DE CHAVE

Nesta área o IMS coloca o tamanho da chave concatenada do

último segmento acessado; pois a área de retorno de chave (KEY

FEEDBACK AREA) não é limpa a cada chamada.

NÚMERO DE SEGMENTOS SENSÍVEIS

Indica o número de segmentos ao qual o programa tem acesso

dentro de um banco de dados físico.

ÁREA DE RETORNO DE CHAVE (KEY FEEDBACK AREA)

Esta área não tem tamanho predeterminado, ela deve ser

definida de modo a conter a maior chave concatenada possível.

Contém a chave concatenada do último segmento acessado pelo

programa de aplicação. O seu tamanho máximo é de 255 BYTES.

- 25 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 26/97

EXEMPLOS DE CODIFICAÇÃO DE MÁSCARAS

--------------------------------------------------------------

COBOL:

-----

LINKAGE SECTION

01 PCB-A.

03 PCB-DBD PIC X(8).

03 PCB-NIVEL-SEG PIC X(2).

03 PCB-STATUS PIC X(2).03 PCB-OP-PROC PIC X(4).

03 FILLER PIC X(4).

03 PCB-SEGMENTO PIC X(8).

03 PCB-KFA PIC S9(5).

03 PCB-SEGMENTO PIC S9(5).

03 PCB-CHAVE PIC X(NN).

ASSEMBLER:

---------

APCB DS OCLNN

ADBD DS CL8

ANÍVEL DS CL2

ASTATUS DS CL2

APROCOPT DS CL4

DS CLA

ASEGMENT DS CL8

AKFLENG DS XL4

ANROSEG DS XL4

ACHAVE DS CLNN

- 26 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 27/97

7.0 PROGRAMAÇÃO

Neste tópico analisaremos as instruções necessárias para

acessarmos um banco de dados DL/I. O acesso ao banco é feito

por intermedio do DL/I através de CALL onde informamos a

operação a ser executada e o segmento a ser processado. No

retorno do CALL o DL/I atualiza as informações da PCB dando ao

programa condições de saber o resultado.

DL/I é um módulo do IMS/VS que efetua o interface entre aREGION BATCH (Sistema IMS) e o programa de aplicação (COBOL,

PLI., ASSEMBLER, etc..).

 

7.1 Códigos de Retorno (STATUS CODE)

Após qualquer chamada ao DL/I o programa deverá testar o

conteúdo do código de retorno, que foi definido na máscara da

PCB para saber se o call emitido foi bem sucedido ou não.

Existem 5 categorias de códigos de retorno:

1. Indica válidas as condições encontradas no call. O call é

completado.

2. Indica um aviso ou informação de um call bem sucedido. Os

dados são recebidos na IO-AREA. O call é completado.

- 27 -

Programade

Aplicação

Bancode

Dados

 DL/I

 

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 28/97

3. Indica um aviso ou informação de um call bem sucedido. Os

dados não são recebidos na IO-AREA. O call é completado.

4. Indica o uso de especificações impróprias. Se constitui daprincipal categoria. O call não é completado.

5. Indica erro de sistema ou de I/O ocorridos durante a

execução do call. O call não é completado. Contate o

programador.

7.1.1 Códigos de Retorno

CR CAT SIGNIFICADO

AA 4 IMS/VS ignorou este call porque a ALT PCB indicou

um código de transação como destino. O destino

deve ser um terminal lógico.

AB 4 IO AREA necessária para este call não é especi-

ficada.

AC 4 Poderá ocorrer por:

DL/I não achou o nome do segmento enviado na SSA.

A seqüência das SSA’S contradiz com a hierarquia

da PCB.

O call contém duas SSA’S para o mesmo nível.

AD 4 O parâmetro FUNÇÃO do call esta inválido ou:

- Referenciou uma DB PCB num call de

mensagem

- Referenciou um I/O PCB num call

para banco de dados

- Emitiu um GU ou GN usando a ALT PCB

- Referenciou um ALT PCB ou DB PCB

num CHKP CALL.

- 28 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 29/97

CR CAT SIGNIFICADO

AF 4 GSAM detectou registro de tamanho variável invá-

lido.

AH 4 SSA necessária está ausente no call.

AI 5 Erro na abertura dos dados.

AJ 4 Formato de SSA qualificada inválido.

AK 4 Nome do campo na SSA está inválido.

AL 4 Call usando I/O PCB em programa batch.

AM 4 Função do call incompatível com o PROCOPT, com o

segmento, ou com a definição do código detransação.

AO 5 Erro de I/O ISAM, OSAM, BSAM ou VSAM.

AP 4 Mais que 4 parâmetros num call para TP PCB é

inválido.

AT 4 Tamanho da I/O AREA maior que a área reservada,

gerada na ACB.

AU 4 Tamanho total das SSA’S maior que área reservada,

gerada na ACB.

AY 4 Terminal lógico da ALT PCB tem mais que um ter-

minal físico associado as mensagens de entrada.

- 29 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 30/97

AZ 4 Programa conversacional emitiu call PURG para PCB

que não pode ser purgada.

CR CAT SIGNIFICADO

A1 4 Nome do terminal lógico não foi reconhecido pelo

sistema.

A2 4 Ocorre num CHNG call quando não usamos uma ALT

PCB ou usamos uma ALT PCB não modificável.

A3 4 Call emitido para ALT PCB modificável com destino

não fixado.

A4 4 Violação de segurança num ISRT de SPA diferido de

programa para programa através de um call CHNG.

A5 4 O MODNAME foi especificado no segundo ou

subseqüentes CALL’S, ISRT ou PURG.

A6 4 Tamanho dos segmentos inseridos excedeu o tamanho

da SEGSIZE.

A7 4 Número de segmento inseridos excedeu o limite da

SEGNO.

A8 4 ISRT para ALT PCB seguido de ISRT para I/O PCB,

ou vice-versa.

A9 4 IMS/VS ignorou este ISRT porque: Referencia uma

ALT PCB definida com SAMETRN=YES, mas que está

representando um terminal lógico que não é parte

do terminal físico fonte.

B 4 Tamanho inválido especificado na FSA.

- 30 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 31/97

CR CAT SIGNIFICADO

CA 4 CALL emitido com comando inválido, ou o comando

não se aplica a versão do IMS/VS em que ele está

executando.

CB 4 Comando emitido via CALL não permitido para o

módulo AOI (Automatic Operation Interface).

CC 2 Comando foi executado e o IMS/VS retornou

respostas.

CD 4 Comando emitido viola segurança ou o programa de

aplicação não está autorizado a emitir CMD

CALL’S.

CE 2 IMS/VS reeschedulou a mensagem que este CALL GUrecuperou desde o último CALL CMD.

CF 2 Transação na fila antes do IMS/VS ter sido

startado.

CG 2 A mensagem recuperada por este CALL GU é

originada de uma EXIT AOI.

CH 5 IMS/VS ignorou o cmd call emitido porque o

comando A01 detectou erro de sistema. Deve-se

reemitir o cmd CALL.

CI 2 Combinação do CE com o CF.

CJ 2 Combinação do CE com o CG.

- 31 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 32/97

CK 2 Combinação do CF com o CG.

CR CAT SIGNIFICADO

CL 2 Combinação do CE, CF e CG.

CM 3 Comando foi executado, mas não foi produzida

resposta.

DA 4 Campo chave do segmento não pode ser alterado.

DJ 4 PGM emitiu um REPL ou DLET mas o segmento não

está em hold.

DX 4 Regra de deleção violada.

E 4 Dados fornecidos na FSA contradiz com a DBD.

FA 2 Ocorreu erro na MSDB ARITHMETIC OVERFLOW.

FC 4 PGM emitiu um call que não é válido para este

tipo de segmento.

FD 2 Ocorreu DEADLOCK.

FE 4 Programa emitiu um FLD CALL que recebeu um status

code diferente de branco na FSA.

FF 3 Não há espaço na MSDB.

FG 4 Combinação do FE com o FW.

FH 3 DEDB inacessível para este call.

- 32 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 33/97

FI 4 I/O área do programa está numa área que ele não

pode acessar.

CR CAT SIGNIFICADO

FN 4 Num FDL CALL, a FSA contém um nome de campo não

reconhecido.

FP 4 I/O AREA referenciada no call contém dados

decimais compactados ou hexadecimais inválidos.

FR 5 Estourou o limite do buffer especificado para

região.

FS 3 Área da DEDB completa.

FT 4 Muitas SSA’S num call.

FV 3 MSDB verificou uma condição falha.

FW 2 Necessita de mais recursos que o normalmente

permitido.

GA 2 Mudança de tipo de segmento para nível mais

elevado.

GB 1 Fim dos segmentos do banco de dados.

GC 3 Ultrapassou o limite de UNIT-OF-WORK.

GD 1 Call ISRT não possui SSA’S para todos os níveis

ou tem segmento de posição perdida.

GE 1 Segmento não existente para um GET CALL ou num

INSERT CALL o DL/I não achou os pais do segmento

- 33 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 34/97

que o PGM está inserindo.

CR CAT SIGNIFICADO

GG 5 Segmento contém um pointer inválido.

GK 2 Mudança de tipo de segmento no mesmo nível.

GL 4 PGM emitiu um LOG call com inválido código de log.

GP 4 Paternidade não estabelecida para o segmento.

II 3 Segmento já existente para um INSERT CALL.

IX 4 Regra de inserção violada.

LB 1 Segmento já existente na carga de um banco de

dados.

LC 4 Campo chave dos segmentos fora da seqüência.

LD 4 Segmento sem pai na carga de um banco de dados.

LE 4 Seqüência de segmentos irmãos difere a seqüência

da DBD.

NE 3 Segmento não existente par um índice secundário

existente.

NI 1 Segmento duplicado para um único índice

secundário.

NO 5 Erro de I/O ISAM, OSAM, BSAM ou VSAM.

- 34 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 35/97

QC 3 Não existe mais mensagens na fila para este

programa.

CR CAT SIGNIFICADO

QD 3 Não existe mais segmentos para esta mensagens.

QE 4 Programa emitiu um call GN antes de ter emitido

um call GU para acessar uma mensagem.

QF 4 O tamanho do segmento é menor que cinco caracteres.

QH 4 Nome do terminal lógico de saída ou código de

transação não foi reconhecido pelo IMS/VS.

RX 4 Regra de alteração violada.

UC 1 Retorno da UTILITY CONTROL FACILITY. CHECKPOINT.

UR 1 Retorno da UTILITY CONTROL FACILITY. RESTART.

US 1 Retorno da UTILITY CONTROL FACILITY. STOP.

UX 1 Retorno da UTILITY CONTROL FACILITY. CHECKPOINT E

STOP.

V1 4 Tamanho do segmento não está nos limites da

DBDGEN.

XA 4 Programa tentou continuar a conversação passando

a SPA de um programa para outro depois de ter

respondido ao terminal.

XB 4 O programa está passando a SPA para outro

programa mas está tentando responder para o

- 35 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 36/97

terminal de origem.

CR CAT SIGNIFICADO

XC 4 Programa inseriu mensagem com bits no campo ZZ

(reserv.).

XD 1 IMS/VC está terminando um CHECKPOINT FREEZE ou

DUMPQ. Retorna este código para o BMP que emitiu

o call CHKP, ou para um programa batch que emitiu

o call SYNC. Após receber este código o programa

não poderá mais emitir CALL’S.

XE 4 Programa tentou inserir SPA num PCB que contém

EXPRESS=YES.

XF 4 IMS/VS ignorou este insert de SPA porque a ALT

PCB tem destino fixado para um terminal lógico

mas não foi definido ALTRESP=YES na geração daPSB.

XG 4 IMS/VS ignorou este call porque a conversação

corrente requer SPA’S de tamanho fixo e o

programa que vai recebê-la está com diferente ou

não fixo tamanho de SPA.

 

XX 5 Este código poderá indicar numa inicialização:

DBD inválida, insuficiente memória, inválido

block size opção inválida ou erro no GSAM.

X1 5 Erro de sistema. Ocorreu um erro de I/O quando o

IMS/VS estava lendo ou gravando uma SPA.

X2 4 O primeiro ISRT call para uma alt pcb de uma

- 36 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 37/97

conversação não foi para uma SPA. SPA tem que ser

inserida no primeiro ISRT.

CR CAT SIGNIFICADO

X3 4 Programa modificou os primeiros seis bytes da

SPA.

X4 4 Programa inseriu uma SPA para transação não

conversacional.

X5 4 Programa tentou inserir mais que uma vez a mesma

SPA.

X6 4 Um código de transação inválido foi inserido na

SPA.

X7 4 Tamanho da SPA está incorreto. PGM alterou os

primeiros 6 bytes.

X8 5 Erro de sistema ou de I/O na tentativa de

enfileirar uma SPA num código de transação de PCB.

X9 4 O tamanho da SPA é maior que o tamanho

especificado na macro SPAREA da PSB.

1 CALL foi executado sem problemas.

SSA - SEGMENT SEARCH ARGUMENT

- 37 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 38/97

O argumento de pesquisa de segmento serve para indicar para o

DL/I com qual segmento ele deverá processar a função

pedida no call. Os campos usados para se qualificar o

segmento na SSA terão que ser definidos como argumento

de pesquisa na DBD deste banco de dados.

- 38 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 39/97

EXISTEM DOIS TIPOS DE SSA:

SSA NÃO QUALIFICADA:

O programa informa ao DL/I apenas o tipo de segmento que

deseja acessar.

SSA QUALIFICADA:

O programa adiciona uma ou mais qualificações para indicar ao

DL/I a ocorrência do segmento que deseja acessar. Para isso o

programa informa o nome de um campo do segmento mais um valor

que este campo poderá ter, ligados por um operador relacional,

que informa ao DL/I que comparação deverá ser feita para

selecionar o segmento. Para qualificarmos um segmento podemos

usar SSA’S múltiplas, isto é, podemos usar uma SSA por nível,

não sendo por isso obrigatório a definição de todos os níveis.

Para os níveis não definidos no CALL, o DL/I assumirá uma SSA

não qualificada.

7.2 Formatos de SSA’S

SSA NÃO QUALIFICADA:

NOME DO

SEGMENTO

EM

BRANCO

B 1

SSA QUALIFICADA:

- 39 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 40/97

INSTRUÇÃO DE QUALIFICAÇÃO

NOME DO

SEGMENTO (

NOME DO

CAMPO

OPE

REL VALOR )

8 1 8 2 até 255 1

Os operadores relacionais (OPE REL) que podem ser usados são:

EQ ou ‘= ’ ou ‘ =’ - igual a

GE ou ‘>=’ ou ‘=>’ - maior ou igual a

LE ou ‘<=’ ou ‘=<’ - menor ou igual a

GT ou ‘ >’ ou ‘> ’ - maior que

LT ou ‘ <’ ou ‘< ’ - menor que

NE ou ‘ =’ ou ‘= ’ - diferente de

7.2.1 SSA de qualificação Booleana

A SSA de qualificação BOOLEANA é aquela que tem mais de umainstrução de qualificação. Estas instruções de qualificação

são relacionadas pelos operadores lógicos E ou OU. As

instruções de qualificação relacionadas pelo operador lógico E

formam um conjunto de instruções, este conjunto de instruções

é quebrado quando aparece o operador lógico OU. Podemos ter

até 8 conjuntos de instruções de qualificação. Os operadores

lógicos ocupam uma posição entre as instruções de

qualificação. O operador lógico E é representado por + ou &, e

o OU é representado por * ou por |.

NOME DO

SEGMENTO( INSTRUÇÃO DE

QUALIFICAÇÃO* INSTRUÇÃO DE

QUALIFICAÇÃO+ INSTRUÇÃO DE

QUALIFICAÇÃO)

E OU

7.3 Relacionamento entre PSB-PCB-DBD

- 40 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 41/97

Para o interface entre o programa de aplicação e o IMS/VS é

necessário que alguns pontos sejam observados :

- Um comando ‘ENTRY’ especificando as PCB’s para o programa.

- PCB’s para especificar, em tempo de processamento, a

estrutura que se deseja acessar e receber, também, as

informações de retorno do DLI.

- É necessário que exista uma PSB, cuja geração está a cargo

do suporte técnico, sem contar com a DBD que é o início dageração de um Data Base.

- 41 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 42/97

 Program Physical

View View

A PSB (Program Specification Block) – contém os segmentos aos

quais o programa poderá ter acesso, as opções de

processamento, isto é, o que será permitido ao programa, seleitura, inserção, alteração, delação etc.

Para cada programa de aplicação deve existir uma PSB

catalogada e especificada no JCL.

Obs.: Dentro da PSB é especificado uma ou mais PCBs.

Program View Physical View

DL/I

A

B C

PSB

DBD

Programade

Aplicação

PCB

B

A

- 42 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 43/97

7.4 Estrutura do Programa de Aplicação BATCH

ID DIVISION.

.

.

WORKING-STORAGE SECTION

.

.

.

01 FUNÇÃO ...

01 IOAREA ...

01 SSA-A ...

LINKAGE-SECTION.

01 PCB-1 ...

.

.

.

PRODECURE DIVISION.

ENTRY ‘DLITCBL’ USING PCB-1 ... PCB-n.

.

.

.

CALL ‘CBLTDLI’ USING FUNÇÃO

PCB-1

IOAREA

[SSA-1 ... SSA-n].

.

.

.

GOBACK.

- 43 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 44/97

Ao codificarmos um programa COBOL devemos ter o cuidado de:

Na WORKING-STORAGE definir

“IO-AREAS” - Tantas quantas forem os tipos de segmentos que

o programa acessar; estas “IO-AREAS” serão

utilizadas para receber/fornecer dados do/para

o DB.

“SSA’s” - SEGMENT SEARCH ARGUMENT

Serão áreas que conterão os argumentos de pesquisa paradeterminados acessos e/ou níveis de leitura nos

DB’s.

“FUNÇÕES” - Tipos de acesso

. Leitura, deleção, alteração, etc.

Na LINKAGE SECTION:

“PCB” - PROGRAM COMMUNICATION BLOCK

Área da LINKAGE por onde serão

transmitidos/recebidos ao/do IMS os parâmetros

para acesso ao DB.

OBS.: Se o programa acessa mais de um DB há

necessidade de definir mais de uma “PCB”, isto

é, para cada estrutura de DB a ser acessada por

um programa, deve existir uma PCB.

- 44 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 45/97

Na PROCEDURE DIVISION:

O primeiro comando da PROCEDURE DIVISION deveráser um “ENTRY”. Através desse comando ficará

determinado o ponto em que o programa receberá

o controle do IMS. No “ENTRY” deveremos citar,

também, as PCB’s definidas na LINKAGE SECTION.

ENTRY ‘DLITCBL’ USING PCB1, PCB2, ..., PCBN

OBS.: Ao executar um programa com IMS notar que o JCL

é acionado um módulo do IMS, o DFSRRC00; o nomedo programa é informado via PARM.

No “CALL” devemos especificar a função desejada, a PCB

definida, a IO-AREA e o(s) argumento(s) de pesquisa.

CALL ‘CBLTDLI’ USING FUNÇÃO,PCB,IOAREA,SSA’,SSA2, ... SSAN

Os programas com IMS devem terminar com “GOBACK” (devolução do

controle do programa ao IMS).

FUNÇÕES

Com relação às funções, além de algumas raramente utilizadas,

temos:

GU → GET UNIQUE

GN → GET NEXT

GNP → GET NEXT WITHIN PARENT

GHU → GET HOLD UNIQUE

GHN → GET HOLD NEXT

GHNP → GET HOLD NEXT WITHIN PARENT

DLET → DELETE

ISRT → INSERT

REPL → REPLACE

- 45 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 46/97

O comando, ou função “GU” permite acessar randomicamente os

segmentos do DB. Este comando estabelece paternidade ao

segmento acessado.

O comando “GN” permite acessarmos o DB seqüencialmente. O CALL

emitido pode ou não ser promovido de SSA(s). Também este

comando estabelece paternidade ao segmento acessado.

GNP - para emitirmos este comando é preciso que anteriormente

se tenha efetuado um CALL, GU, GN, GHU ou GHN, e este

logicamente tenha sido bem sucedido.O CALL “GNP” acessa (LE) o próximo filho de um “pai”

preestabelecido.

Para se efetuar um “REPL” ou “DLET” é necessário que antes

tenhamos emitido um CALL com “HOLD” (GHU, GHN ou GHNP); este

posiciona o segmento para ser alterado ou deletado.

GHU - Função idêntica à do “GU” com a diferença de manter

em “Hold” o segmento.

GHN - Comando idêntico ao “GN” também com a diferença de

manter o “HOLD”.

GNHP - Idêntico ao GNP - com “HOLD”.

A função “DLET” deleta um (ou mais) segmento do DB (antes

acessado com “HOLD”).

Se um “DLET” for emitido para um segmento ROOT, lógica e

automaticamente os seus filhos também serão deletados; o CALL

com a função “DLET” não pode ser provido de SSA qualificada.

- 46 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 47/97

A função “REPL” altera um (ou mais) segmento (antes acessado

com “HOLD”; não pode ser emitida com SSA qualificada.

O comando “ISRT” permite inserir um (ou mais) segmento no DB.

Os comandos GNP, GHNP, ISRT, REPL e DLET não destroem uma

paternidade preestabelecida, tendo o ISRT uma característica

especial nesse sentido.

SSA - SEGMENT SEARCH ARGUMENT

FORMATO GERAL:

SSA DESQUALIFICADA - SEM COMMAND CODE

NOME SEGMENTO b

SSA QUALIFICADA - SEM COMMAND CODE

NOME SEGMENTO ( QUALIFICAÇÃO(ÕES) P/PESQUISA )

SSA DESQUALIFICADA - SEM COMMAND CODE

NOME SEGMENTO * COMM.CODE b

SSA QUALIFICADA - SEM COMANDO CODE

NOME SEGMENTO * COMM.CODE ( QUALIFICAÇÃO(ÕES)

P/PESQUISA

)

- 47 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 48/97

O campo NOME DO SEGMENTO deve ter 8 posições; se não tiver,

completá-lo com brancos.

Os COMAND CODE(s), se existe(m): devemos codificar um

*(asterisco), na 0ª posição da SSA.

Para iniciarmos uma qualificação codificamos um “(“ - abre

parêntesis, e, da mesma forma, ao terminarmos a(s)

qualificação(ões), codificamos um “)” - fecha parêntesis.

A(s) QUALIFICAÇÃO(ÕES):

Nas 8 primeiras posições da qualificação temos o nome do campo

CHAVE (da DBD);

Nas posições que se seguem codificamos o R.O. (Relational

Operator); em seguida a qualificação propriamente dita (o

argumento de pesquisa. Se termina aí a SSA, colocamos no

último byte o fecha parêntesis “)”. Se não terminar, deverá

ser codificado um operador booleano, uma nova qualificação e

assim por diante.

DESCRIÇÃO DA “PCB”

A “PCB” definida na LINKAGE SECTION, quando iniciamos a

execução do programa, conterá alguns dados da PSB/DBD.

- 48 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 49/97

FORMATO DA PCB (MÁSCARA):

01 PCB-NAME

03 DBD-NAME PIC X (08).

03 LEVEL PIC X (02).

03 STATUS-CODE PIC X (02).

03 PROC-OPTIONS PIC X (04).

03 RESERV-DLI PIC S9 (05) COMP.

03 SEGM-NAME PIC X (08).

03 LENGTH-KEY PIC S9 (05) COMP.

03 SENS-SEGM PIC S9 (05) COMP.03 KEY-FDBK-AREA.

05 XXXXXX

DESCRIÇÃO

TAMANHO DE A  

8 posições 1 8 Nome da DBD (ou nome do DB).

2 posições 9 10 Indicador do nível hierárquico do

segmento.

2 posições 11 12 STATIP - CODE - campo onde retorna os

resultados dos CALL’s.

4 posições 13 16 Opções de processamento (o que é permi-

tido ao programa, com relação ao DB).

4 posições 17 20 Reservado ao DLI.

8 posições 21 28 Área de retorno do nome do segmento

acessado.

4 posições 29 32 Tamanho da área de Feed Back da chave.

4 posições 33 36 Número de segmentos sensitivos.

N posições 37 ... Área de Feed Back da chave (retorno da

chave.

- 49 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 50/97

CONSIDERAÇÕES SOBRE O DLI E A PCB

Um programa COBOL não acessa diretamente o DB. Isto é feito

através do DLI. Sendo assim, quando emitimos um CALL para

acessarmos os segmentos, devemos fornecer parâmetros para o

DLI. Caso o DLI não encontre o elemento que desejamos acessar,

isto é, não existe o segmento no DB, o campo STATUS-CODE da

PCB conterá (após o CALL) um código formado por 2 posições

indicando o resultado da pesquisa efetuada.

Por exemplo: Se emitirmos um CALL “GU” para “LER” umdeterminado segmento e este não existe na Data

Base, o DLI devolverá via PCB o resultado da

pesquisa, no caso um “GE”.

Reforçando: O campo STATUS-CODE informa o resultado do CALL

emitido, e também, na PCB, há a possibilidade de

se verificar até que ponto (em uma hierarquia), o

CALL foi bem sucedido.

Todas as vezes que emitirmos CALL’S em um programa é preciso

que se verifique o conteúdo do STATUS-CODE, destacando que,

via de regra, se o conteúdo for igual a “φ φ ” (spaces) o CALL

foi bem sucedido totalmente.

7.4.1 Exemplos e comentários sobre acessos a um Data Base

7.4.1.1 Acesso com “GN” e “GNP”

Como já vimos anteriormente, cada programa de aplicação possui

a sua PSB.

- 50 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 51/97

Tomemos como base a estrutura dos segmentos abaixo; isso

significa que não importa quantos segmentos mais existem no

DB; a PSB torna sensível apenas os segmentos por ela (PSB)

indicados:

NOME DO DB = DBEX01

ESTRUTURA DO DB (visão lógica)

SEGMENTO ALMOXARIFADO (ROOT)

SEGMENTO ITEM DE ESTOQUE

NOME DO SEGMENTO ALMOXARIFADO: ALMOXAR (DEFINIDO NA DBD)

NOME DO SEGMENTO ITEM DE ESTOQUE: ITESTQ (DEFINIDO NA DBD)NOME DO CAMPO CHAVE DO SEGM. ALMOX: CHALMOX (DEFINIDO NA DBD)

NOME DO CAMPO CHAVE DO SEGM. ITEM ESTOQUE: CHITEM (DEFINIDO NA DBD)

TAMANHO DA KEY ALMOXAR - 5 POSIÇÕES

TAMANHO DA KEY ITESTQ - 6 POSIÇÕES

Convém lembrar que podem existir N segmentos ROOT (almoxari-

fado) cada segmento ROOT poderá ter de 1 a N segmentos Item de

Estoque assim:

- 51 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 52/97

Para nosso exemplo limitaremos o DB em apenas 2 segmentos ROOT

(almoxarifado) e cada ROOT com 3 “filhos”. Seja T,

essa limitação do DB.

T: DESENHO DA PSB:

ALMOXAR 

ITESTQ

IE03 C

IE02 B

IE03 F

IE02 E

ALM02

ALM01ALM01

ALM01ALM01

ALM01

ALM01ALM01

ALM01ALM01

ALM01ALM01

ALM04

ALM03

ALM02

ALM01

(A)IE01

(J)

IE01

(L)IE01

(Z)IE01

ALM01

IE01A

ALM01D

- 52 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 53/97

Se tivermos necessidade de acessar seqüencialmente T poderemos

optar por:

CALL “GN” com SSA desqualificada para os segmentos do nível01-(ROOT)

CALL “GNP” com SSA desqualificada para os segmentos do nível

02-(filhos)

O programa COBOL, com relação às áreas de IMS, será:

WORKING-STORAGE SECTION.

01 AREAS-IMS.

03 GN PIC X(04) VALUE ‘GN’.

03 GNP PIC X(04) VALUE ‘GNP’.

03 SSA-D-ROOT.

05 FILLER PIC X(09) VALUE ‘ALMOXAR’.

03 SSA-D-ITES.

05 FILLER PIC X(09) VALUE ‘ITESTQ’.

03 IO PIC X(09) VALUE ‘ITESTQ’.

05 XXXX

05 --------

--------

- 53 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 54/97

LINKAGE SECTION.

01 PCB-01.

03 FILLER PIC X(010).

03 STATUS-CODE PIC X(002).

03 FILLER PIC X(026).

PROCEDURE DIVISION.

ENTRY ‘DLITCBL’ USING PCB-01

A.

CALL ‘CBLTDLI’ USING GN

PCB-01

IO-AREA-ROOT

SSA-D-ROOT

IF STATUS-CODE NOT EQUAL ‘ ’

IF STATUS-CODE NOT EQUAL ‘GB’DISPLAY MENSAGEMCALL ‘CANCEL’

ELSE

GO TO FIM.

PERFORM TRATA-ALMOXARIFADO.

(Tratamento dos dados acessados do Segmento ALMOX).

- 54 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 55/97

B.

CALL ‘CBLTDL’ USING GNP

PCB-01

IO-AREA-IT

SSA-D-ITES

IF STATUS-CODE NOT EQUAL ‘bb’

IF STATUS-CODE NOT EQUAL ‘GE’

DISPLAY MENSAGEM

CALL ‘CANCEL’

ELSEGO TO A.

PERFORM TRATA-ITEM-ESTOQUE.

(Tratamento dos dados acessados dos segmentos ITEM DE

ESTOQUE)

GO TO B.

FIM.

GOBACK.

COMENTÁRIOS:

Notar que:

1) A SSA desqualificada foi codificada com 9 posições (8

posições para a codificação do nome do segmento e 1 posição

com “ ” que irá caracterizar o fim da SSA desqualificada).

- 55 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 56/97

2) As funções são sempre definidas com 4 posições (tamanho

genérico).

3) As IO-AREAS são definidas de acordo com os Lay-Outs. Se no

Lay-Out existir um Filler no final, este deverá ser definido

pois a movimentação não é como conhecemos (emissor maior que

Receptor Trunca). Nesse caso haverá uma expansão (até

completar o Lay-Out do segmento), estragando conteúdo de

áreas definidas após essa IO-AREA.

4) Nesse nosso exemplo, com relação à PCB, só nos interessará oSTATUS-CODE, razão pela qual foi definido FILLER para os

demais campos.

5) O comando “ENTRY” na Procedure Division é obrigatório para

os programas voltados ao IMS. É neste ponto que o PROGRAMA

recebe o controle do IMS. Notar que a execução do programa

no JCL é:

//STEPX EXEC PGM=DFSRRC00, ...

6) Ao emitirmos o 1º CALL “GN” o programa acessa o segmento

ALM01 (de T), trazendo os dados do segmento para a IO-AREA

especificada no “CALL” (IO-AREA-ROOT); ainda, pelo fato de

ser “GN” é estabelecida paternidade ao segmento acessado;

isto permite que efetuemos CALL’s “GNP” para ler os “FILHOS”

(Nível 02) do ALM01. O STATUS-CODE deverá ser “ ”: isto

significa leitura bem sucedida; caso o STATUS-CODE seja

diferente de “ ” e diferente de “GB” (fim do Data-Base),

salvo instruções especiais da definição do programa,

cancelar o programa com uma mensagem especificando o CALL

onde ocorreu o retorno não previsto.

- 56 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 57/97

Se Ok, são executados os procedimentos para os dados do

segmento ALM01, no perform TRATA-ALMOXARIFADO.

O próximo passo é acessar os segmentos do Nível 02.

O 1º CALL GNP acessará o segmento IE01 (A), trazendo-o para o

IO-AREA-IT (especificada no CALL).

O STATUS-CODE deverá ser, também “ ”: leitura bem sucedida

(notar que neste caso só nos interessa “ ”).

Se o STATUS-CODE for igual a “GE” significa que não existem

mais “Filhos” do  pai estabelecido no CALL “GN”, para serem

acessados.

Lembrando ainda que, até aqui, é pai o SEGM.ALM01.

São efetuados os tratamentos para os dados do segmento IE01(A)

dentro da rotina TRATA-ITEM-ESTOQUE.

Passamos ao 2º CALL “GNP” (notar o GO TO B.); este 2º CALL

acessa o segmento IE02 (B), isto porque o acesso está sendo

feito com “GNP” (GET NEXT WITHIN PARENT - Leia o próximo filho

do pai preestabelecido, cujo pai é o ALM01.

O STATUS-CODE deverá ser “ ” pois existe o segmento a seracessado.

Os procedimentos com relação aos dados do segmento acessado

são feitos via PERFORM.

Partimos para o 3º CALL “GNP”; este acessa o segmento IE03

(C).

- 57 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 58/97

O STATUS-CODE ainda deverá ser “ ”; tratamos os dados através

do Perform.

Volta-se ao ponto B do programa para emitir o 4º CALL “GNP”.

Neste ponto não existe mais nenhum segmento para ser acessado

no nível 02 que seja filho do ALM01, isto é, já acessamos

todos os segmentos do nível 02 que pertencem ao ALM01 (pai

preestabelecido - GN).

O STATUS-CODE neste caso será “GE”, SEGMENT NOT FOUND, sendoentão atendido a GO TO A. para a leitura da próxima ROOT.

O 2º CALL “GN” lê o segmento ALM02, estabelecendo aí a nota

paternidade.

STATUS-CODE ESPERADO = “ ”

TRATAMENTO DOS DADOS DO ALM02

Vamos efetuar de agora em diante os CALL’S para acessar os

segmentos do Nível 02 sob o ALM02.

A seqüência de acesso a estes segmentos, IE01 (D), IE02 (E) e

IE03 (F), é idêntica à seqüência anterior: acessos aos

segmentos IE01 (A), IE02 (B) e IE03 (C), inclusive quando da

emissão do 4º CALL (dentro desta seqüência) o STATUS-CODE será

“GE”, fazendo com que o programa volte ao ponto A.

O passo seguinte é tentar acessar uma próxima ROOT, através do

“GN” (o 3º no caso).

- 58 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 59/97

Como não existem mais segmentos do tipo almoxarifado para

serem lidos, isto é, a leitura atingiu o fim do Data Base, o

STATUS-CODE será “GB”.

De uma maneira geral, salvo exceções descritas nas definições

dos programas, o STATUS-CODE deverá ser = a “ ” para

procedimentos normais, “GB” ou “GE” (dependendo do caso) para

o fim do DB ou de “filhos” e tratamento de segmentos não

encontrados.

Uma maneira de acessar seqüencialmente a mesma configuraçãoseria:

WORKING-STORAGE SECTION.

01 AREAS-IMS.

03 IO-AR-ROOT.

05 PIC

05 PIC

05 PIC

05 PIC

03 IO-AR-IE REDEFINES IO-AR-ROOT.

05 PIC

05 PIC

05 PIC

03 FUNÇÕES.

05 GN PIC X(04) VALUE ‘GN’.

- 59 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 60/97

LINKAGE SECTION.

01 PCB-X1.

03 DBD-NAME PIC X(08).

03 NÍVEL PIC X(02).

03 STATUS-CODE PIC X(02).

03 OPÇÕES PIC X(04).

03 RES-DLI PIC S9 (5) COMP.

03 SEG-NAME PIC X(08).

03 FILLER PIC X(20).

PROCEDURE DIVISION.

ENTRY ‘DLITCBL’ USING PCB-X1.

A.

CALL ‘CBLTDLI’ USING GN

PCB-XI

IO-AR-ROOT

IF STATUS-CODE NOT EQUAL ‘ ’IF STATUS-CODE NOT EQUAL ‘GA’

IF STATUS-CODE NOT EQUAL ‘GB’

DISPLAY MENSAGEM

CALL ‘CANCEL’

ELSE

GO TO FIM.

IF NÍVEL EQUAL ‘01’

PERFORM TRATA-ROOT

VIDE OBS.*

ELSE

PERFORM TRATA-IESTQ.

GO TO A.

GOBACK.

FIM

- 60 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 61/97

OBS.*

Este IF poderia ainda ser da maneira seguinte:

IF SEG-NAME EQUAL ‘ALMOXAR’

PERFORM TRATA-ROOT

ELSE

PERFORM TRATA-IESTQ.

COMENTÁRIOS

Nesta nova maneira de acessar o DB, temos a vantagem de não

emitir CALL’s desnecessários (aqueles com STATUS-CODE = “GE”).

Note-se também a ausência das SSA’s e a única função definida

(GN)

Isso significa que serão lidos todos os segmentos do DB (um a

um), seqüencialmente, lógica/hierarquicamente.

O fato de não definirmos as SSA’s nos obriga a efetuar a

leitura em uma só IO-AREA; isto quer dizer que em um dado

momento não sabemos qual segmento foi lido, podendo ser uma

ROOT ou um dos filhos.

Para contornar, devemos definir uma IO-AREA com o tamanho do

 maior segmento a ser acessado, redefinindo-a de acordo com os

Lay-outs do programa.

Ao optarmos por esta maneira devemos também tomar as atenções

para a codificação da PCB.

Através da PCB temos 2 maneiras de saber que segmento foi

acessado:

1) pelo conteúdo do campo NÍVEL;

2) pelo conteúdo do campo NOME-DO-SEGM.

- 61 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 62/97

Com relação ao STATUS-CODE, passamos a aceitar também, além de

“ ”, “GA” (e em outros casos ‘GK’).

Ao emitirmos o 1º CALL o programa acessa o segmento ALM01; oSTATUS-CODE será “ ”, o NÍVEL da PCB conterá 01 e o SEG-NAME

conterá “ALMOXAR” (nome do segmento constante na DBD). Estes

dados (01 e ALMOXAR) estarão na PCB porque foi acessado o

segmento do tipo almoxarifado no Nível 01 - ROOT.

O tratamento dos dados é feito dentro da rotina do PERFORM

TRATA-ROOT.

Após o PERFORM é atendido o GO TO A. onde voltamos ao CALL GN

para a 2ª leitura.

Nesta 2ª leitura são acessados os dados do segmento IE01 (A)

pertencente ao ALM01.

A opção de se testar o SEG-NAME facilita quando existe mais de

um tipo de segmento em um mesmo nível, ex.:

O STATUS-CODE será “ ”, o NÍVEL = 02 (pois acessamos um

segmento do NÍVEL 02) e o SEG-NAME = ‘ITESTQ’ (nome do

segmento ITEM DE ESTOQUE definido na DBD).

O 3º CALL trará os dados do segmento IE02 (B) para a IO-AREA

especificada.

O STATUS-CODE, o SEG-NAME e o NÍVEL estarão com as mesmas

informações do 2º CALL.

O 4º CALL, idem ao 2º e 3º CALL:

SEGMENTO ACESSADO IE03(C)

Já o 5º CALL trará os dados do segmento ALM02.

- 62 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 63/97

O STATUS-CODE será “GA”, o que significa que a leitura foi

efetuada num nível menor, isto é, o 4º CALL acessou o último

segmento sob o ALM01: o IE03 (C), cujo nível é 02; e agora a

leitura foi feita em um segmento do NÍVEL 01 - ROOT.

O nível da PCB estará com 01 (nível acessado), o SEG-NAME com

“ALMOXAR”.

O próximo CALL - o 6º - acessará o segmento IE01 (D).

O STATUS-CODE, o NÍVEL e o SEG-NAME idênticos ao 2º, 3º e 4º

CALL.

O 7º CALL trará o segmento IE02 (E).

- STATUS-CODE, NÍVEL e SEG-NAME idem ao 6º CALL.

O 8º CALL - SEGM. IE03 (F)

- Idem ao anterior.

O CALL de número 9 não será bem sucedido por não haver mais

segmentos no DB para acessar. O STATUS-CODE = “GB” (fim do

DATA-BASE).

- 63 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 64/97

A opção de se testar o SEG-NAME facilita quando existe mais de

um tipo de segmento em um mesmo nível, ex.:

ANÍVEL 01

B1 C NÍVEL 02

NA SEQÜÊNCIA:

1º CALL GN - STATUS-CODE = “ ” NÍVEL 01

SEG-NAME = A

SEGMENTO ACESSADO = A

2º CALL GN - STATUS-CODE = “ ” NÍVEL 02

SEG-NAME = B

SEGMENTO ACESSADO = B1

3º CALL GN - STATUS-CODE = “ ” NÍVEL 02

SEG-NAME = B

SEGMENTO ACESSADO = B2

B3

B2

B1

- 64 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 65/97

4º CALL GN - STATUS-CODE = “ ” NÍVEL 02

SEG-NAME = B

SEGMENTO ACESSADO = B3

5º CALL GN - STATUS-CODE = “GK” NÍVEL 02

SEG-NAME = C

SEGMENTO ACESSADO = C

7.4.1.2 Acessos com “GU” - GET Unique

Para este tipo de acesso consideremos o DB abaixo:

IE05P

IE04O

IE03N

IE02M

IE04

K

IE03J

IE02I

IE03G

IE02 F

IE04D

IE03C

ALM04

ALM03

ALM02

IE02B

IE01E

IE01H

IE01L

ALM01

IE01A

- 65 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 66/97

1º EXEMPLO

Acessar o segmento ALM03, em seguida acessar seqüencialmenteos segmentos do NÍVEL 02 do ALM03

WORKING-STORAGE SECTION.

01 AREAS-IMS

03 GU PIC X(04) VALUE ‘GU’

03 GNP PIC X(04) VALUE ‘GNP’

03 SSA-Q-ROOT.

05 FILLER PIC X(19) VALUE

‘ALMOXAR(CHALMOXbEQ ‘

05 KEY-ALM PIC X(05).

05 FILLER PIC X(01) VALUE ‘)’.

03 SSA-D-IESTQ.

05 FILLER PIC X(09) VALUE ‘ITESTQ’

03 IO-AR-ROOT.

05 ______

05 ______

03 IO-AR-IESTQ.

05 ______

05 ______

LINKAGE SECTION.

01 PCB-X

03 FILLER PIC X(10).

03 ST-CODE PIC X(02).

03 FILLER PIC X(26).

- 66 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 67/97

PROCEDURE DIVISION.

ENTRY ‘DLITCBL’ USING PCB-X

A.

MOVE ‘ALM03’ TO KEY-ALM.

CALL ‘CBLTDLI’ USING GU

PCB-X

IO-AR-ROOT

SSA-Q-ROOT

IF ST-CODE NOT EQUAL “ ”

IF ST-CODE NOT EQUAL “GE”

DISPLAY MENSAGEM

CALL ‘CANCEL’

ELSE

PERFORM NÃO-ENCONTROU

GO TO C.

PERFORM TRATA-ROOT.

- 67 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 68/97

B.

CALL ‘CBLTDLI’ USING GNP

PCB-X

IO-AR-IESTQ

SSA-D-IESTQ

IF ST-CODE NOT EQUAL “ ”

IF ST-CODE NOT EQUAL “GE”

DISPLAY MENSAGEM

CALL ‘CANCEL’

ELSE

GO TO C.

PERFORM TRATA-IT-ESTQ.

GO TO B.

C.

FIM.

GOBACK.

COMENTÁRIOS:

Sempre que houver necessidade de acessar um determinado

segmento no DB é preciso que se codifique, além dos comandos

já citados e da função a ser utilizada (gu), uma SSA

Qualificada.

- 68 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 69/97

A SSA QUALIFICADA é composta de:

1) As primeiras 8 posições – o nome do segmento (definido na

DBD);

2) A posição seguinte (1 byte) deve conter um “(“ abre

parêntesis;

3) As 8 seguintes o nome do campo que será utilizado para a

pesquisa (nome do campo do DB, este deve constar da DBD);

4) As 2 posições em seguida são para o RO – Relational

Operator, isto é, o tipo de pesquisa que queremos, com

relação à chave informada.

Exemplo:

Se tivermos que acessar um segmento no DB que seja

igual a um determinado argumento devemos codificar

“EQ” ou “b=”.

Os RO são:

EQ ou b= - IGUAL A ...

GE ou > = - MAIOR OU IGUAL A ...

LE ou < = - MENOR OU IGUAL A ...

GT ou b>= - MAIOR QUE ...

GT ou b<= - MENOR QUE ...

>= ou NE - DIFERENTE DE ...

5) As próximas posições são variáveis, de acordo com o tamanho

e formato do campo definido como CHAVE no segmento;

6) A última posição da SSA deve conter um “)” fecha parêntesis.

- 69 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 70/97

Assim:

03 SSA-Q.05 FILLER PIC X(08) VALUE ‘NOME DO SEGM’.

05 FILLER PIC X(01) VALUE ‘(‘.

05 FILLER PIC X(08) VALUE ‘NOME DO CAMPO KEY’.

05 FILLER PIC X(02) VALUE ‘RO’.

05 KEY PIC ----------

05 FILLER PIC X(01) VALUE ‘)’

Na 1ª INSTRUÇÃO do ponto A. do programa existe a movimentação

do argumento de pesquisa para a chave da SSA. Se fosse

necessário acessar outros segmentos ROOT bastaria mover o novo

argumento para a chave da SSA-Q e executar o CALL “GU” (isto

é, voltaríamos ao ponto A.).

O conteúdo do STATUS-CODE logo após o CALL “GU” nos informará

sobre o SUCESSO ou NÃO da pesquisa; poderíamos ter movimentado

para a chave um argumento cujo conteúdo não existisse no DB,

por exemplo, “ALMX1”; nesse caso o ST-CODE seria = “GE” -

SEGMENT NOT FOUND, aí trataríamos na rotina não-encontrou o

que o programa determinasse.

Um STATUS-CODE diferente de “ ” e “GE” seria indício de que

algo não está correto no CALL, daí o DISPLAY e o CALL

“CANCEL”.

Se o ST-CODE = “ ” - CALL BEM SUCEDIDO.

A próxima instrução é o perform TRATA-ROOT, cuja rotina

trataria dos dados acessados do segmento ROOT.

- 70 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 71/97

Em seguida seriam efetuados os CALL’s GNP’s para acessos no

nível 02.

Os CALL’s GNP neste ponto seriam possíveis, pois o comando

“GU” estabeleceu paternidade ao segmento ROOT acessado.

Se emitirmos um CALL GNP sem antes efetuar com sucesso um

CALL, GU, GN ou GHN, (sem paternidade preestabelecida), o

STATUS-CODE seria “GP”.

2º EXEMPLO

Utilizando o programa anterior (codificação) fazer acesso ao

segmento IE03 (G) do ALM02.

Neste caso é preciso que se conheça o conteúdo do campo CHAVE

da ROOT (que é ALM02).

Na codificação da WORK substituiríamos a SSA desqualificada do

NÍVEL 02, para uma SSA qualificada, assim:

03 SSA-Q-ITESTQ.

05 F PIC X(19) VALUE

‘ITESQbb (CHITEMbbEQ’.

05 KEY-IESTQ PIC X(06).

05 F PIC X(01). VALUE ‘)’

- 71 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 72/97

NA PROCEDURE DIVISION

MOVE ‘ALM02’ TO KEY-ALMMOVE ‘IE03-G’ TO KEY-IESTQ.

CALL ‘CBLTDLI’ USING GU

PCB-X

IO-AR-IESTQ

SSA-Q-ROOT

SSA-Q-IESTQ

IF ST-CODE NOT EQUAL “ ”

IF ST-CODE NOT EQUAL “GE”

DISPLAY MENSAGEM

CALL ‘CANCEL’

ELSE

GO TO NÃO-ENCONTROU.

PERFORM TRATA-ITEM-ESTQ.

Para acessarmos um segmento do 2º nível em diante,

randomicamente, sem antes termos acessado um segmento ROOT, é

necessário que se forneça o caminho hierárquico; assim, se

desejarmos ler o segmento IE03-G temos que informar através daSSA-Q-ROOT a chave para, via ROOT, acessar o segmento

indicado.

Se tivéssemos que acessar um segmento do 3º nível teríamos 3

SSA’s qualificadas indicando o caminho, pelos conteúdos das

chaves.

- 72 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 73/97

CONSIDERAÇÕES:

Quando acessamos, no último exemplo codificado, o segmentoIE03-G, poderia ter ocorrido o seguinte:

Não existir o segmento do NÍVEL 02 desejado, mas existir a

ROOT da SSA-Q-ROOT.

Neste caso o STATUS-CODE será “GE” (Segment Not Found). Se

verificarmos o nível da PCB, vermos que contém 01 e o SEG-NAME

= “ALMOXAR”, isto significa que o CALL “GU” foi bem sucedidoaté a busca do segmento ROOT mas não encontrou o segmento item

de estoque desejado.

Também pode ocorrer o caso de não encontrar a ROOT, da mesma

forma o STATUS-CODE será “GE” porém o nível estará com “00”.

Se emitirmos um CALL “GU” ou “GHU” com a SSA da ROOT não

qualificada, isto fará com que a pesquisa se efetue a partir

do 1º segmento do DB (início do DB).

ACESSOS COM “GHU”, “GHN”, “GHNP”, “DLET” E “REPL”

As funções “GHU”, “GHN” e “GHNP” têm as mesmas características

das funções sem “HOLD” em termos de acesso, etc.

A diferença é que a leitura com “HOLD” permite que o(s)

segmento(s) acessado(s) seja(m) alterado(s) ou deletado(s).

NOTA: Só é permitido alterar ou deletar um segmento se este

tenha sido acessado com “HOLD” no CALL imediatamente anterior

(e tenha tido sucesso).

- 73 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 74/97

7.4.1.3 Exemplo usando “DELET”, “REPL” e “ISRT”

Utilizando o DB abaixo:

IE05P

IE04O

IE03N

IE02M

IE04 K

IE03J

IE02I

IE03G

IE02 F

IE04D

IE03C

IE02B

ALM01

ALM02

ALM03

ALM04

IE01A

IE01E

IE01H

IE01L

- 74 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 75/97

DBD - idêntica à do DBEX01

Deletar o segmento IE02-M do ALM04

WORKING-STORAGE SECTION.

01 AREAS-IMS

03 GHU PIC X(04) VALUE ‘GHU’.

03 DLET PIC X(04) VALUE ‘DLET’.

03 REPL PIC X(04) VALUE ‘REPL’.

03 SSA-Q-R.

05 F PIC X(19) VALUE

‘ALMOXARb (CHALMOXbEQ’

05 KEY-ALM PIC X(05).

05 F PIC X(01) VALUE ‘)’.

03 SSA-Q-I.

05 F PIC X(19) VALUE

‘ITESTQbb (CHITEMbbEQ’

05 F PIC X(06).

05 F PIC X(01) VALUE ‘)’.

03 IO-AR-R.

05 ________

05 ________

03 IO-AR-I.

05 ________

05 ________

05 ________

- 75 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 76/97

LINKAGE SECTION.

01 PCB-S.

03 F PIC X(10).03 ST-CD PIC X(02).

03 F PIC X(26).

PROCEDURE DIVISION.

ENTRY ‘DLITCBL’ USING PCB-S.

A.

MOVE ‘ALM04’ TO KEY-ALM.

MOVE ‘IE02-M’ TO KEY-ITE.

CALL ‘CBLTDLI’ USING GHU

PCB-S

IO-AR-I

SSA-Q-R

SSA-Q-I

IF ST-CD NOT EQUAL “ ”

IF ST-CD NOT EQUAL “GE”

DISPLAY MENSAGEM

CALL ‘CANCEL’

ELSE

PERFORM NÃO-ENCONTROU

GO TO ---------

- 76 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 77/97

B.

CALL ‘CBLTDLI’ USING DLET

PCB-SIO-AR-I.

IF ST-CD NOT EQUAL “ ”

DISPLAY MENSAGEM

CALL ‘CANCEL’.

FIM.

GOBACK.

OBS.

A função ‘DLET’ e a ‘IO-AR-R’ são para os exemplos

seguintes.

COMENTÁRIOS:

Para se efetuar um DELETE é necessário que se tenha acessado o

segmento com “H”. Entre o CALL GET HOLD de acesso e o CALL

DELETE podemos ter todo o tipo de processamento necessário

para o programa, cálculos, movimentações, testes, etc.,

exceção feita a outros comandos CALL emitidos com a mesma PCB

do CALL HOLD em questão; se isto acontecer o efeito do “HOLD”

será destruído e, portanto, o “DLET” não será efetuado – o

STATUS-CODE será “DJ”.

- 77 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 78/97

REFORÇANDO:

Entre um CALL “HOLD” e um CALL “DLET” não pode existir outro

CALL ao “DLI” com a mesma PCB do CALL “HOLD”, inclusive o CALL“CHKP” (CHECK-POINT).

As mesmas regras do DLET se aplicam ao REPL.

EXEMPLO DE “REPL”.

Alterar os dados do segmento ALM02.

C. MOVE ‘ALM02’ TO KEY-ALM.

CALL ‘CBLTDLI’ USING GHU

PCB-S

IO-AR-RSSA-Q-R.

IF ST-CD NOT EQUAL “ ”

IF ST-CD NOT EQUAL “GE”

DISPLAY MENSAGEM

CALL ‘CANCEL’

ELSE

PERFORM NÃO-ENCONTROU

GO TO --------

PERFORM ALTERA-SEGMENTO.

CALL ‘CBLTDLI’ USING REPL

PCB-S

IO-AR-R.

IF ST-CD NOT EQUAL “ ”

DISPLAY MENSAGEM

CALL ‘CANCEL’.

- 78 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 79/97

D.

Para um REPLACE basta acessar o segmento com o comando

necessário (de acordo com o programa), GHU, GHN ou GHNP,verificar se a leitura foi bem sucedida através do STATUS-

CODE, em seguida altera-se os dados requeridos pelo programa

na IO-AREA onde o segmento foi lido (no exemplo tais

alterações são feitas dentro da rotina ALTERA-SEGMENTO);

finalmente emite-se o CALL “REPL” testando também o STATUS-

CODE devolvido.

IMPORTANTE:

O CALL “REPL” não permite SSA qualificada, podendo-se

inclusive omitir a SSA. Se desejar fornecer SSA esta tem que

ser desqualificada.

NÃO é permitido alterar a KEY de um segmento.

ACESSOS COM “ISRT” - INSERT

O CALL ISRT pode ser feito a qualquer momento dentro do

programa. Se um segmento ROOT deve ser inserido basta formatar

o segmento na IO-AREA (do segmento) e efetuar o Call INSERT.

EXEMPLO:

PERFORM FORMATA-IO-AREA

CALL ‘CBLTDLI’ USING ISRT

PCB

IO-AREA

SSA-D-ROOT

IF STATUS-CODE NOT EQUAL “ ”

DISPLAY MENSAGEM

CALL ‘CANCEL’.

- 79 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 80/97

OBS.:

Se já existe o segmento que estamos inserindo o STATUS-

CODE será “II”.

A SSA do segmento a ser inserido deve ser desqualificada.

Para se inserir um segmento do Nível 02 é preciso que saibamos

a que ROOT vai pertencer o segmento a ser inserido.

Neste caso devemos ter uma SSA-QUALIFICADA para a ROOT.

E o CALL ficaria:

CALL ‘CBLTDLI’ USING ISRTPCB

IO-AREA

SSA-Q-ROOT

SSA-D-02

IF STATUS-CODE NOT EQUAL “ ”

IF STATUS-CODE NOT EQUAL “II”

IF STATUS-CODE NOT EQUAL “GE”

DISPLAY MENSAGEM

CALL ‘CANCEL’

ELSE

PERFORM ROOT - NÃO - EXISTE

GO TO ------

ELSE

PERFORM SEGM - JÁ - EXISTE

GO TO

OK.

No INSERT acima fornecemos o caminho hierárquico para a inser-

ção do segmento do NÍVEL 02, pela SSA QUALIFICADA da ROOT.

O ISRT tem mais ou menos as características de um “GU”.

- 80 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 81/97

8.0 COMMAND CODES (CC)

Os COMMAND CODES permitem certas facilidades na elaboração de

um programa, por exemplo: estabelecer paternidade em um seg-

mento de Nível 02 ou 03 ou 04 ..., acessado com “GNP”; acessar

2 ou mais segmentos de níveis diferentes em um só CALL; ler o

1º ou o último segmento “FILHO” em um determinado nível; etc.

Estes COMMAND CODES quando necessários devem ser especificados

nas SSA’s (podem existir em número superior a 1 (um) em cada

SSA).

EXEMPLO A:

03 SSA-D.

05 FILLER PIC X(11) VALUE

‘ALMOXARb*F’.

COMMAND CODEINDICAÇÃO DA PRESENÇA DE CC.

ou: (B)

03 SSA-D.

05 FILLER PIC X(08) VALUE

‘ALMOXARb’.

05 CCODE PIC X(02) VALUE

‘*F’.

No 2º exemplo (B) se tivéssemos que emitir um CALL sem o

COMMAND CODE, bastaria mover “ ” para o campo CCODE isto

implicaria em espaço em branco na 9ª posição que é a

característica de SSA DESQUALIFICADA.

- 81 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 82/97

A codificação de um “*” (asterisco), na 9ª posição de uma SSA,

indica a presença de um ou mais COMMAND CODES, tendo da 10ª

posição em diante os COMMAND CODES propriamente ditos.

DESCRIÇÃO DAS FUNÇÕES DOS COMMAND CODES.

F -

Este COMMAND CODE permite:

- Iniciar a pesquisa na primeira ocorrência (1º filho),

do nível indicado na SSA, sob seu pai;

- Voltar atrás numa leitura seqüencial ou não, na

seqüência hierárquica;

- Em CALL’s ISRT, quando não existe chave definida e a

opção para INSERT é HERE (aqui), se for usado o CC ‘F’,

a inserção será feita antes do 1º segmento existente

naquele nível, passando a ser 1ª ocorrência o segmento

inserido.

- Este COMMAND CODE não é aplicável para o Nível 01 -

“ROOT”.

Podemos utilizá-lo em CALL’s:

GN - GHN - GNP - GHNP

L -

- Acessar a última ocorrência do nível especificado na

SSA sob uma ROOT (ou sob um pai).

- Para INSERT (ISRT), cuja regra de inserção seja

“FIRST” ou “HERE” e os segmentos não têm chave

- 82 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 83/97

definida, será inserido como último segmento naquele

nível.

Não aplicável ao nível de ROOT.

D -

Este COMMAND CODE permite trazer para as IO-AREAS

segmentos múltiplos.

Para isso é necessário que exista a opção “P” (PATH), na

PSB definida.

Isto significa que em apenas um CALL seja feito o acesso

em mais de um segmento dentro do caminho hierárquico.

As IO-AREAS que receberão os dados dos segmentos deverão

ser contíguas no programa.

Para “ISRT” permite inserir mais de um segmento de níveis

diferentes, em apenas um CALL.EXEMPLO: ROOT

FILHO → SSA DESQUALIFICADA C/ CC ‘D’

NETO → SSA DESQUALIFICADA

INSERE :FILHO

NETO

N -

Utilizado para não regravar um nível específico.

Somente para CALL “REPL” (REPLACE).

- Quando o “PATH CALL” existe (lendo múltiplos segmentos),

e um determinado segmento do caminho hierárquico, não

precisa ser regravado.

- 83 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 84/97

Q -

Causa o “ENQUEUE” do segmento da SSA.

C -

Utilizado para concatenar chaves em uma SSA.

U -

No nível especificado (SSA), para que seja satisfeito oCALL utilize o segmento obtido (estabelecido), no CALL

anterior (só para o nível onde o “U” foi definido).

Caso não haja posição estabelecida para o segmento

designado a SSA será tratada como não qualificada.

Este COMMAND CODE será ignorado quando:

- Utilizado na SSA do último nível;

- Utilizado numa SSA qualificada;

- Utilizado junto com COMMAND CODE “F” ou “L”;

- Tiver que mudar o “pai” do segmento com “U”.

V -

Características de funcionamento idênticas à do COMMAND

CODE “U”, com a diferença de automaticamente ser aplicado

para todos os níveis superiores.

Todas as regras do CC “U” se aplicam para o CC “V”.

- 84 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 85/97

P -

O COMMAND CODE “P” quando utilizado estabelece paternidade

naquele nível, mesmo que o acesso tenha sido feito com

“GNP” ou “GHNP”.

Se usado em vários níveis num CALL a paternidade será

estabelecida no nível mais baixo (definido).

Se o CALL emitido não for totalmente satisfeito mas o

acesso chegou a ser efetuado até o nível para o qual foi

especificado o “P”, na SSA, a paternidade será aí

estabelecida.

- (HIFEM) NULL COMMAND CODE

- Ignorar a posição (onde é utilizado).

- Simplificar a codificação da SSA.

- 85 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 86/97

9.0 ESTRUTURAS DE ARMAZENAMENTO

Para armazenarmos os segmentos de um banco de dados o IMS nos

oferece quatro tipos de estruturas: HSAM, HISAM, HDAM e HIDAM.

As diferenças entre elas dizem respeito a forma pela qual

representam fisicamente o relacionamento entre o segmento do

banco de dados e o tipo de acesso a um segmento ROOT.

ACESSO SEQÜENCIAL:

No método de acesso seqüencial, os segmentos ficam fisicamente

na seqüência hierárquica, um após o outro, não havendo o uso

de qualquer tipo de pointers.

O DL/I possui dois métodos de acesso seqüencial:

. HSAM :  Acessa segmentos ROOT e dependentes seqüencialmente;

. HISAM: Acessa segmentos ROOT através de um índice e osdependentes seqüencialmente.

As vantagens destes métodos de acesso são:

1. Rapidez na leitura seqüencial, em virtude dos segmentos

estarem justapostos fisicamente;

2. Rapidez no acesso a um segmento ROOT no método de acesso

HISAM através do uso do índice do VSAM (KSDS).

As grandes desvantagens destes métodos de acesso são:

1. O acesso é mais lento para segmentos à direita da

hierarquia;

- 86 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 87/97

2. O HISAM requer freqüentes reorganizadores para recuperar

espaços de registros deletados;

3. O HSAM não permite qualquer tipo de atualização, para issotem que se criar uma nova versão do banco de dados.

 ACESSO DIRETO

No acesso direto os segmentos não estão seqüenciados fisica-

mente e são relacionados hierarquicamente através de pointers.

O acesso direto é conseguido através da rotina de randomização

ou de um banco de dados de índice primário.

O DL/I possui dois métodos de acesso direto:

. HDAM : Utiliza a rotina de randomização para acessar os

segmentos ROOT;

. HIDAM: Utiliza um banco de dados de índice para acessar

diretamente os segmentos ROOT.

As vantagens do acesso direto são:

1. Podemos misturar leitura seqüencial com direta;

2. Os espaços de segmentos deletados são liberados imediata-

mente, não precisando haver freqüentes reorganizações debanco de dados.

Sua grande desvantagem é:

1. Em virtude de os segmentos não estarem seqüenciados

fisicamente, o acesso aos segmentos numa leitura seqüencial

se torna mais lento, por causa do deslocamento mecânico dos

cabeçotes de leitura.

- 87 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 88/97

9.1 Tipos de Estruturas

9.1.1 HSAM (Hierarchical Seqüencial Acess Method).

Os registros se encontram fisicamente como na seqüência hie-

rárquica não sendo possível qualquer tipo de atualização, por

isso um banco de dados HSAM só serve para operações de leitu-

ra. A atualização é feita da mesma forma que um arquivo con-

vencional, isto é, criando-se uma nova versão. Usados geral-

mente para arquivos históricos, estatísticos, auditores, etc.

9.1.2 HISAM (Hierarchical Indexed Seqüencial Access Method).

O acesso a um segmento ROOT é feito pelo índice do VSAM (KSDS)

que contém as chaves dos ROOT’S classificadas juntamente com

os endereços dos seus respectivos segmentos; o acesso aos

dependentes é seqüencial. Composto de duas áreas de armazena-

mento: a PRIMÁRIA e a de OVERFLOW. Na área PRIMÁRIA estão con-tidos todos os segmentos ROOT e um número limitado de depen-

dentes, ficando o resto na área de OVERFLOW. Numa inserção é

respeitado a seqüência hierárquica havendo um deslocamento dos

segmentos que estão após ao incluído. Quando se deleta um seg-

mento é feita uma marca no seu prefixo, e a área não é apro-

veitada para as posteriores inserções. Esses espaços só pode-

rão ser reutilizados depois de uma reorganização, onde serão

eliminadas as áreas dos segmentos que foram deletados logica-

mente. Este método de acesso é recomendável para se fazer pes-

quisas seqüenciais, porque os segmentos estão fisicamente em

ordem hierárquica portanto o tempo que o DL/I levará para

achar os segmentos será pequeno, mas sua performance cai quan-

do são feitas muitas deleções (perda de muito espaço) e inser-

ções (muitos deslocamentos).

- 88 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 89/97

9.1.3 HDAM (Hierarchical Direct Access Method).

Nesta organização o acesso ao segmento ROOT é feita através de

cálculo de endereço com base no valor da chave do segmento.

Estes cálculos, chamados de rotina de randomização, tornam o

acesso ao segmento ROOT mais rápido, por isso o banco de dados

HDAM é muito usado para aplicações online. A ligação entre os

segmentos é feita por pointers e não por seqüência

hierárquica. Por isso numa inserção não há o deslocamento de

segmentos porque ele é incluído em qualquer área disponível eligado com o seu ascendente e com o seu dependente através de

pointers. Além disso, numa deleção, o espaço é liberado para a

inclusão de outros segmentos.

O grande problema de um banco de dados HDAM é que não há

nenhum tipo de classificação nos segmentos ROOT. Por isso é o

único que aceita o uso de chaves múltiplas de ROOT.

9.1.4 HIDAM (Hierarchical Indexed Direct Access Method).

No método de acesso HIDAM o acesso ao segmento ROOT é feito

através de um banco de dados de índice primário, que contém as

chaves dos segmentos ROOT em ordem ascendente com o endereço

dos respectivos segmentos na área de dados. Como no HDAM, a

ligação entre os segmentos é feita através de pointers, entãonão há deslocamentos nas inserções, e nas deleções os espaços

são liberados imediatamente posteriores inclusões de

segmentos. Podemos, com este método de acesso, misturar

leitura seqüencial com a leitura direta, mas a seqüencial se

torna um pouco lenta em virtude de os segmentos não estarem

justapostos fisicamente, havendo assim muito deslocamento dos

cabeçotes dos discos magnéticos.

- 89 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 90/97

. Algumas vezes, a estrutura de um Data-Base não satisfaz

todas as necessidades de uma aplicação.

Para tentarmos resolver este problema dispomos de dois

recursos do IMS:

- ÍNDICE SECUNDÁRIO - RELACIONAMENTO LÓGICO

- 90 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 91/97

10.0 ÍNDICE SECUNDÁRIO

O ÍNDICE SECUNDÁRIO pode ser utilizado para resolver dois

tipos de conflitos de estrutura:

. quando um programa necessitar recuperar um segmento numa

seqüência diferente daquela estabelecida pelo campo chave

do segmento.

. quando um programa necessitar recuperar um segmento baseado

em informações existentes em segmentos dependentes desse.

Para entendermos esses conflitos e como o ÍNDICE SECUNDÁRIO

pode resolvê-los analisaremos dois exemplos que utilizam

originalmente a seguinte estrutura:

ALUNOScód.

alu

nome ende CAMPO CHAVE = Cód. Alu.

CURSOScód.cur

deno data CAMPO CHAVE = Cód. Cur.

10.1 Usando uma chave diferente:

Quando uma aplicação recupera um segmento de um data-base, o

programa identifica o segmento pelo seu campo chave. Mas às

vezes, o programa necessita recuperar o segmento em uma

seqüência diferente daquela estabelecida pelo seu campo chave.

O ÍNDICE SECUNDÁRIO torna isso possível.

Por exemplo, suponha uma aplicação online que consulta um

Data-Base de uma entidade de cursos. Para recuperar o segmento

- 91 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 92/97

de um aluno o programa precisará informar o seu código de ins-

crição na escola. Mas como o programa fará, quando não souber

se uma pessoa está inscrita na escola, e portanto não terá o

seu código de inscrição?

Os segmentos de um mesmo tipo são armazenados na memória na

seqüência estabelecida pelo seu campo chave (no caso, código

de inscrição do aluno). Se o programa tentar recuperar o seg-

mento identificando-o pelo nome do aluno, o DL/I terá que

pesquisar seqüencialmente vários segmentos ALUNO, para locali-

zar o segmento pedido. O DL/I não sabe onde determinado seg-

mento ALUNO se encontra tendo como argumento de pesquisa o

nome do aluno, que não é o campo chave.

Para fazer possível um programa recuperar o segmento aluno

numa seqüência determinada pelo seu campo NOME, teremos que

indexá-lo por esse campo e armazenar o índice num data-base

separado. Esse data-base é chamado de ÍNDICE SECUNDÁRIO.

Então se o programa indicar para o DL/I que ele processe ossegmentos ALUNOS na seqüência hierárquica estabelecida pelo

ÍNDICE SECUNDÁRIO, o DL/I poderá localizar o segmento através

do campo NOME. O DL/I acessa diretamente o ÍNDICE SECUNDÁRIO e

localiza o índice do segmento ALUNO que lhe foi indicado; os

índices estão na ordem de nomes dos alunos. O ÍNDICE é

composto de um POINTER do seu respectivo segmento ALUNO que se

encontra no data-base de dados.

Existem três termos envolvidos no ÍNDICE SECUNDÁRIO:

SEGMENTO POINTER...: Segmento pertencente ao data-base de índi-

ce secundário. Ele é composto do endereço

que aponta para o seu respectivo segmento

no data-base de dados.

SEGMENTO FONTE.....: Segmento que contém o campo que está sendo

indexado. No exemplo, o segmento fonte é o

- 92 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 93/97

segmento ALUNO, pois contém o campo NOME

que está sendo indexado.

SEGMENTO ALVO......: Segmento apontado pelo segmento pointer;este é o segmento que o programa quer

recuperar.

 Nota: No exemplo demonstrado, os segmentos FONTE e ALVO são o

mesmo segmento.

Demonstraremos abaixo, um exemplo onde os segmentos FONTE e

ALVO sejam diferentes:

10.1.2 Recuperando segmentos baseado em qualificação de

segmentos dependentes.

Às vezes um programa necessita recuperar um segmento, mas a

informação que ele contém para qualificar esse segmento se

encontra em segmentos dependentes desse. Por exemplo, suponha

que uma entidade de cursos, que dispõe do data-base utilizado

no exemplo anterior, precise montar um relatório dividido por

cursos contendo os seus respectivos alunos. Se o programa que

processará esse pedido, não utilizar ÍNDICE SECUNDÁRIO, terá

que recuperar todos os segmentos ALUNO, recuperando para cada

aluno todos os seus segmentos CURSO, para verificar se o

determinado aluno realizou o curso que está sendo impresso no

momento.

Mas utilizando o ÍNDICE SECUNDÁRIO, o programa pode tornar

esse processamento bem mais simples. Para isto, teríamos que

indexar o segmento ALUNO pelo campo CÓDIGO do segmento CURSO.

- 93 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 94/97

Quando definirmos o segmento ALUNO na DBD, teremos que infor-

mar o nome do campo (CODCURSO) pelo qual o segmento estará in-

dexado, junto com o nome do segmento (CURSO) que contém o res-

pectivo campo. O programa poderá então requisitar ao DL/I um

segmento ALUNO e qualificar o pedido com o CODCURSO que está

sendo listado pelo programa.

Neste exemplo, o segundo ALUNO é o segmento ALVO, pois é

apontado pelo segmento POINTER do ÍNDICE SECUNDÁRIO. O CURSO é

o segmento FONTE pois contém o campo que o programa utiliza

para qualificar o pedido ao DL/I.

- 94 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 95/97

11.0 RECOMENDAÇÕES PARA PROGRAMAÇÃO/ANÁLISE

1. Usar CALL’s simples. Codificar apenas as qualificações

necessárias à pesquisa.

2. Usar sempre um CALL ou seqüência de CALL’s que permitam o

acesso aos segmentos desejados, pelo menor caminho hierár-

quico.

3. Usar o menor número possível de CALL’s no programa. A cada

CALL que o programa emite, este necessita de tempo do

sistema, e outros recursos.

Como determinar a necessidade de todos os CALL’s:

- usar o COMMAND CODE ‘D’ se estiver recuperando

mais que um segmento no mesmo caminho.

O mesmo se aplica à inserção, alteração e deleção de

segmentos.

- Se o programa recuperar o mesmo segmento mais que uma

vez durante a execução do programa, salvar o segmento em

uma I/O área separada e acessá-lo quando necessário.

- Um ‘GET’ não é necessário antes do ‘ISRT’. Para saber se

o segmento pai existe, emitir um CALL ‘ISRT’ com SSA

QUALIFICADA do pai. Caso ele não exista, o DL/I

devolverá um STATUS-CODE=’ GE’.

- Para acessar segmentos específicos, utilizar SSA’s

QUALIFICADAS ao invés de emitir vários CALL’s e usar a

lógica do programa para encontrar o segmento.

4. Acessar os segmentos na seqüência hierárquica sempre que

possível. Evitar voltar ao início do DB.

- 95 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 96/97

5. Usar o conteúdo da ‘KEY FEEDBACK AREA’ somente se necessá-

rio, pois poderá conter sujeira de acessos anteriores.

6. Observar as diferenças de utilização entre GU e GN:

- GU QUALIFICADO - pesquisa a partir do início do DB.

- GN QUALIFICADO - pesquisa a partir da posição corrente

até o final do DB

7. Usar SSA’S BOOLEANAS, se necessário, para facilitar a

lógica do programa.

8. CALL GN não deve ser usado para DB’s com organização HDAM,

pois o resultado é imprevisível.

9. Se houver necessidade de acessar um DB HDAM com CALL GN é

preciso criar um ÍNDICE SECUNDÁRIO.

10. Na dúvida de um comando, use o DLT0, antes de escrever seu

programa.

11. Analise bem todas as estruturas lógicas para acesso ao seu

DB, para um estudo da necessidade de se criar ÍNDICES

SECUNDÁRIOS.

12. CALL’s GET HOLD devem ser usados somente quando se pretende

atualizar ou cancelar o segmento.

13. CALL’s REPL e DLET devem ser usados imediatamente após um

CALL GET HOLD.

14. Existem ferramentas para medir a performance de um

programa, como o DB MONITOR.

15. Para compartilhar um DB, I.E., acessar via programa BATCH e

on-line, deve-se especificar na PCB, o parâmetro PROCOPT=GO

ou GOT.

- 96 -

7/14/2019 86159267-IMS-DB

http://slidepdf.com/reader/full/86159267-ims-db 97/97