86159267-IMS-DB
-
Upload
robson-rodrigues-freitas -
Category
Documents
-
view
36 -
download
0
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 -