Escolar Documentos
Profissional Documentos
Cultura Documentos
O sistema operativo presente nestas máquinas é, na maioria das vezes, o OS400. Este
sistema contém um sistema gestor de bases de dados integrado assim como diversos
compiladores,editores e outras aplicações. O AS/400 suporta várias linguagens de
programação como o Java, C, SQL, Assembly, COBOL, PHP, etc.
Será construída uma pequena aplicação onde constarão exemplos das matérias
tratadas em cada capítulo. A aplicação que vamos construir permitirá gerir um
conjunto de lojas e respectivos clientes. No último capitulo encontra-se um conjunto
de ficheiros de texto com todo o código criado ao longo do tutorial.
Modelo de Dados
AS/400 Capítulo 2: Comandos
Para navegar no sistema AS/400 é necessário conhecer alguns comandos. Os
comandos têm uma sintaxe simples que o poderão ajudar, por exemplo, a relembrar
comandos esquecidos.
==> ______________________
Por baixo do prompt pode encontrar a lista das teclas de função ativas neste menu.
Escreva MAJOR na opção 'MENU' e pressione Enter. Isto seria o mesmo que escrever
na linha de comandos: GO MAJOR. Este comando mostra-lhe o conjunto dos grupos
de comandos mais importantes em AS/400.
A palavra “Mais...” no fim da listado lado direito indica-lhe que existem linhas que não
estão visíveis, pode vê-las carregando na tecla Page Down ou movendo o scroll do
rato para baixo.
Coloque agora o cursor em cima de qualquer uma das opções da lista e pressione
F1.Aparece uma janela com a ajuda relativa a essa opção. Esta funcionalidade
encontra-se disponível em grande parte dos menus e utilitários (pressione F3 para
fechar a janela de ajuda).
Para selecionar uma das opções basta escrever no prompt o número que lhe
corresponde.
Verbo Significado
Quando não souber o nome exato de um comando pode escrever GO VERB onde
encontra uma listagens dos comandos organizada por tipo de utilidade.
CRTLIB DEMO
A sua biblioteca está criada.
Todos os objetos que criar vão ser colocados por defeito na sua CURLIB.
Paras e colocar na biblioteca DEMO escreva:
CHGCURLIB DEMO
Sempre que se quiser referir à biblioteca onde se encontra presentemente pode usar
tanto o nome da biblioteca como a palavra CURLIB.
Se quiser alterar a sua biblioteca de abertura no sistema, para não ter que fazer
sempre CHGCURLIB ao iniciar a sessão, pode executar o comando:
Caso execute este comando, sempre que iniciar uma sessão AS/400 irá ser colocado
por defeito na biblioteca DEMO.
Note que se não mudar a sua biblioteca de abertura e no início da sessão não fizer
CHGCURLIB poderão surgir erros de compilação caso use no código um ficheiro cuja
biblioteca não esteja explicitamente definida.
Lista de bibliotecas
DSPLIBL
Para prosseguir com esta secção já deve ter criado a biblioteca DEMO e definido-a
como a sua CURLIB.
É assim iniciada uma sessão SQL numa aplicação AS/400. Esta aplicação reconhece a
sintaxe da maioria dos comandos SQL comuns (CREATE, INSERT, DELETE, SELECT,
DROP, etc).
STRSQL
Criar uma tabela com SQL
A partir da linha de comandos SQL vamos criar a tabela CLIENTES e inserir alguns
registos. Vamos supor que os numeros de telefone só poderão ter no máximo 9
dígitos.
CREATE LIBRARY DEMO/CLIENTS( id_cli numeric(10) PRIMARY KEY, name_cli char(50), birth_cli date, phone_cli
numeric(9) )
Se quiser ver mais linhas de comando pode carregar em Page Down ou mover o scroll
do rato para baixo. Ao fazê-lo o prompt move-se para cima no ecrã dando mais
espaço a novas linhas.
Faça:
Pode ver que a tabela foi criada, o nome das colunas e também que não tem nenhum
registo. Vamos então inserir alguns registos.
Funções básicas
Se está familiarizado com o SQL deve estar familiarizado com estas funções.
Function Description
Funções numéricas
Function Description
LOG10(N)
CURDATE()
CURTIME()
DATE(D)
Converte uma string que contém uma representação de uma data/hora
num valor no formato data/hora.
DATE(T)
Pode usar ficheiros físicos para definir tabelas, criar código executável, etc. Vamos ver
agora os aspectos básicos necessários para trabalhar com ficheiros.
Após a criação de uma tabela em SQL vamos criar as restantes com código DDS.
Os ficheiros de sources são ficheiros que podem ter vários membros. Cada membro
representa o código fonte de um objeto executável ou um objeto executável.
Podemos dizer que um ficheiro de sources é uma espécie de pasta onde organizamos
os vários ficheiros com o código propriamente dito e com os respectivos objetos
executáveis (isto depois de se terem compilado os ficheiros fonte).
Vamos agora usar o utilitário PDM que nos ajuda a criar o código fonte e compilá-lo. O
PDM utiliza o editor de texto SEU (Source Entry Utility), que mais à frente veremos
como utilizar.
STRPDM
Ecrã do PDM
Escolha a opção '3. Work with members', pois vamos criar alguns membros do
ficheiro QDDSSRC. A opção 2 permite trabalhar com objetos executáveis e a 1 com
bibliotecas.
O menu seguinte pede-lhe o nome do ficheiro com que pretende trabalhar e a
biblioteca onde este se encontra. Insira QDDSSRC no ficheiro e DEMO na biblioteca.
Note que apesar de no PDM estar a ver ficheiro de uma dada biblioteca não está
necessariamente colocado dentro dela. Pode estar na biblioteca DEMO1 a ver
ficheiros da biblioteca DEMO2, por exemplo.
Criar ficheiro de sources
Deve-lhe surgir o menu onde pode encontrar todas as opções para trabalhar com os
membros do ficheiro.
Vamos então criar o nosso primeiro membro. Carregue em F6 (como pode ver nas
opções em baixo “F6=Create”). Escreva os dados como vê na imagem em baixo:
Criar um membro
Ecrã do SEU:
Ecrã do SEU
A linguagem DDS e RPG são linguagens posicionais o que significa que cada elemento
têm uma linha e coluna específica onde deve ser colocado. No entanto, o SEU dá uma
ajuda a colocar cada opção no seu lugar. Se colocar o cursor numa linha qualquer e
carregar F4 aparecer-lhe-á um prompt como o da figura seguinte onde puderá por os
valores diretamente e o SEU faz a colocação de cada campo no sítio correto. Se quiser
fechar o prompt carregue F12.
Vamos começar por definir o ficheiro SHOPS como está em baixo e de seguida
apresenta-se detalhadamente as instruções linha a linha.
UNIQUE R
SHOPR
ID_SHP 10P
NAME_SHP 25A
MANAGER_SH 50A K ID_SHP
Linha 1
Linha 2
Definição do tipo de registo do ficheiro. O tipo de registo serve para identificar todas
os campos do ficheiro, vamos ver um exemplo do seu uso mais à frente nos display
files. Insira uma nova linha como explicado anteriormente e carrega em F4
novamente. A letra 'R' deve constar no campo Name Type e SHOPR no Name.
Linhas 3, 4 e 5
Linha 6
Definição do campo chave, com 'K' no Name Type e o nome do campo exactamente
como foi definido acima no campo Name. Para definir mais que uma chave basta
definir uma linha começada por 'K' para cada uma das chaves.
Quando tiver o seu ficheiro completo carregue em F3 para sair e confirme que quer
guardar as alterações.
Funções úteis DDS
Se quiser usar alguma destas funções deve colocá-la no campo functions.
CHECK
•CHECK(AB): Permite que o campo tenha o valor nulo. (Allow Blank).
•CHECK(ME): Obriga a que seja inserido um valor no campo (Mandatory Enter).
•CHECK(MF): Obriga a que todos os caracteres do campo sejam preenchidos
(Mandatory Fill).
COMP
DATFMT
•*ISO: yyyy-mm-dd
•*EUR: dd.mm.yyyy
•*USA: mm/dd/yyyy
•*MDY: mm/dd/yy
•*DMY: dd/mm/yy
•*YMD: yy/mm/dd
TIMFMT
•*ISO: hh.mm.ss
•*EUR: hh.mm.ss
•*USA: hh:mm AM/PM
•*HMS: hh:mm:ss
RANGE
Exemplos:
•Para um campo numérico: RANGE(4 9)
•Para um campo não numérico: RANGE('4' '9')
VALUES
Permite especificar todos os valores válidos num campo.
Exemplo:
•Para um campo numérico: VALUES(4 5 6 7 8 9)
•Para um campo não numérico: VALUES('a' 'b' 'c' 'd')
DFT
REFFLD
Define que um campo está a referenciar outro de outra tabela. Nestes casos não se
define nem o tipo de dados nem o comprimento e coloca-se um 'R' no campo Ref do
prompt.
Exemplo:
Compilação de ficheiros
Para criar o objeto que vai realmente guardar os dados (como já foi dito atrás, este
ficheiro guarda só o código fonte) escolha a opção '14-Compilar' para o ficheiro que
acabou de criar.
Listagem do ficheiro
Este tutorial não vai incidir sobre a análise dos ficheiros resultantes da compilação,
mas se se quiser aventurar e tentar analisar os ficheiros pode fazê-lo escrevendo o
comando WRKSPLF (Work Spool File) no prompt. As mensagens mais importantes da
compilação aparecem usualmente no final do ficheiro com o mesmo nome que o
ficheiro que acabou de compilar (a compilação mais recente aparece mais abaixo na
lista).
Agora verifique se existe na lista um membro com o nome SHOPS (o mesmo que deu
ao membro com o código fonte).
Tem agora toda a informação necessária para conseguir criar ficheiros DDS. Crie o
ficheiro CARDS e MOVEMENTS, usando os nomes que são dados no modelo de dados,
pois vamos usá-los mais a frente. Quanto terminar, ou se surgir alguma dúvida, pode
consultar os ficheiros com o resultado final.
O RPG, tal como o DDS, é uma linguagem posicional, apesar de na sua versão 4 existir
lugar para um formato livre que dentro de algumas restrições permite a colocação do
código em qualquer coluna/linha.
Dentro do código RPG existem vários tipos de expecificações possíveis. Todas seguem
uma ordem pela qual devem aparecer no ficheiro e todas têm funções diferentes.
Cada letra da expecificação representa a letra que deve ser colocada na posição inicial
de cada linha. Segue-se a listagem das especificações segundo a ordem pela qual
devem aparecer no ficheiro.
Especificação H (header)
Especificação F (file)
Definição dos ficheiros usados e de como são usados no programa. Opções possíveis
na especificação F (para ver ao pormenor o que cada um dos campos representa
coloque o cursor no campo e carregue em F1):
Especificação F
Especificação D (definition)
Especificação D
Especificação C
Nesta especificação define-se o código que o programa vai executar. Apenas existe
um formato livre para esta especificação (o código pode estar em qualquer posição),
mas para isso deve-se delimitar o código livre com free end-free uma posição a seguir
ao início da linha. No formato livre não se usa o 'C' no início da linha.
= (comparação e atribuição), +, -, *, /, >, >=, <, <=, <>, NOT, AND, OR.
Expressões Condicionais
if condição;
//código else;
if
outra-condição; …
endif;
endif;
Ciclo do-while
doW condição;
// código endDo;
Criação e definição do ficheiro RPG
Vamos criar agora um programa que vai mostrar no ecrã o número de cartões que
tem o cliente com ID = 1.
Deve inserir alguns registos na tabela CARDS associados ao cliente 1. Faça-o a partir
do STRSQL.
Como não vamos precisar de abrir explicitamente nenhuma tabela, não vamos ter
nenhuma linha da especificação F.
Vamos ter que definir uma variável com o nome count, que vai guardar o número de
cartões do cliente. Coloque a letra 'd' na primeira coluna do SEU e carregue F4 para
ver os pormenores. Esta vai ser uma variável simples (no campo Declaration Type
deve estar 's') do tipo numérico com 5 dígitos de comprimento e zero casas decimais.
Inicie a variável a 0 com a ajuda da função INZ(valor-inicial) no campo Keywords.
Conseguiu criar a variável com a ajuda do prompt? Se não, pode ver o resultado final
mais à frente.
Tente criar os seguintes pontos com atenção a que em formato livre pode identar o
código da maneira que preferir e tem que colocar sempre um ponto e vírgula no final
de todas as linhas (entre o /free /end-free) e cada linha dentro do formato livre deve
começar pelo menos na posição 3 do SEU (na coluna seguinte á barra do /free).
•Inicie (/free) e finalize (/end-free) o bloco de código em linhas separadas,
começando na 2º coluna do SEU.
•Mostre o conteúdo da variável count. Para mostrar valores no ecrã usa-se a
função dsply, cuja sintaxe é: dsply valor.
•Na última linha, antes do /end-free, deve ativar o indicador de fim de código
*inlr (in last row) como activo: *inlr = *on; .
Se compilar agora este codigo (opção 14 do PDM) e a compilação for bem sucedida
chame o programa a partir do prompt:
call DEMO/COUNTCARDS
dsply 0
Podem aparecer vários valores (de eventos anteriores), mas o que lhe interessa é
sempre o que está na linha mais em baixo.
Para fazer consultas e alterações a tabelas vamos usar código SQL, pois já deve saber
usá-lo, mas note que é possível fazer consultas a tabelas usando código especifico do
RPG.
c/EXEC SQL c+
instrução-SQL c/END-EXEC
Repare que eu escrevi instrução e não instruções. Isso é porque em cada EXEC só
pode existir uma função SQL, mas vamos ver um exemplo melhor mais à frente.
Sendo assim teríamos (escreva o código seguinte no final do ficheiro, depois do /end-
free):
c/EXEC SQL c+
SELECT COUNT(*) INTO :count FROM DEMO/CARDS c+
WHERE CLIENT_CRD = 1 c/END-
EXE
Para poder organizar melhor o código vamos colocar esta instrução SQL dentro de
uma subrotina. Uma subrotina é uma espécie de função que não recebe parâmetros,
nem devolve nenhum valor, mas pode alterar valores definidos a nível global do
programa. Dentro da subrotina pode ter código em formato livre, formato fixo e
instruções EXEC.
Fora do bloco /free vou definir a subrotina getNrCards e colocar la dentro o código do
EXEC SQL. Pode usar a ajuda do prompt (F4) para situar corretamente as palavras.
Para agora conseguir executar este bloco de código preciso invocar a subrotina
dentro do bloco /free principal:
Não se esqueça que isto tem de estar antes de fazer o display da variável.
Tente agora compilar e correr novamente. Obteve o mesmo resultado? Se sim,
certifique-se que o cliente 1 existe e que este tem registos associados na tabela
CARDS (e que todo o tutorial até aqui está corretamente concluído!). Se mesmo assim
não resultar verifique se o seu código está completamente correto:
Dcount s 5P 0 INZ(0)
*------------------------------------------------* /free
exSr
getNrCards; dsply count;
*inlr = *on;
/end-free
*------------------------------------------------*
c getNrCards begsr
c/EXEC SQL
c+ SELECT COUNT(*) INTO :count FROM DEMO/CARDS
c+ WHERE CLIENT_CRD = 1
c/END-EXEC
c endsr
Uma das vantagens dos módulos é permitir a reutilização do código, visto que o
mesmo módulo pode ser utilizado por mais que um programa.
Defina uma variável do tipo data que vai guardar o valor da data de aniversário -
chame-lhe birth. Define também uma variável numérica para guardar a idade
retornada - chame-lhe age.
Vamos construir um cursor para correr a tabela de clientes. Para isso temos que ter 4
sub-rotinas para as seguintes funções:
OPEN CURSOR1
CLOSE CURSOR1
Agora na parte principal do programa vamos ter que chamar a subrotina para
declarar e depois para abrir o cursor, dentro de um ciclo fazer o fetch do cursor e
depois fechar o cursor. Pode fazer o ciclo da seguinte maneira:
exSr fetchCursor; dow
sqlcod <> 100; …
Ou:
dow sqlstt = '00000';
exSr fetchCursor;
… enddo;
As variáveis sqlcod e sqlstt guardam o estado que resulta da última instrução de SQL.
O sqlstt = '00000' representa sucesso, enquanto que o sqlcod = 100 indica que a
instrução não retornou nenhuns dados.
Vamos deixar este módulo assim e passar agora ao módulo com o procedimento que
calcula a idade e no final fazemos a ligação entre os dois.
Na primeira linha deste ficheiro deve constar HNOMAIN,a partir da 1º coluna do SEU,o
que significa que este módulo não vai ser um módulo principal.
Procedimentos
Vamos ver agora como funciona a declaração de procedimentos e a passagem de
parâmetros.
Linha 1
Linha 3
Linha 7
Dage S 3P 0
PCALC_AGE B EXPORT
dCALC_AGE PI 3i 0
Db_date D /free
age
= %diff (%date() : b_date : years); return age;
/end-free
P E
Linha 6
A função %date() retorna a data actual do sistema. A função diff faz a diferença entre
as duas datas (%date() e b_date) em anos (*years). Repare que existem dois pontos (:)
a separar cada valor - este é o separador de parâmetros utilizado em RPG, como
temos por exemplo a vírgula em C++, Java, etc. Se quiser saber mais informações
sobre manipulação de datas em RPG consulte este site.
Linha 7
Portanto, no ficheiro CALC_AGE vamos ter que definir estas linhas (podem estar antes
ou depois da variável age). Repare que no protótipo está a definir o tipo de retorno e
o parâmetro recebido. Estes valores têm de coincidir com os que indicamos no início
do procedimento.
*
HNOMAIN
*
Dage S 3P 0
DCALC_AGE PR 3i 0 Db_date D
*
PCALC_AGE B
EXPORT dCALC_AGE PI 3i 0
Db_date D
/free
age = %diff
(%date() : b_date : *years); return age;
/end-free
P E
Dbirth s d
Dage s 3i 0
/free
exsr declareCursor;
exsr openCursor;
exsr fetchCursor;
dsply age;
exsr fetchCursor; enddo;
Compilação de módulos
Compile os dois módulos, mas tenha no entanto atenção pois um módulo não é
compilado da mesma forma que outro ficheiro qualquer. Um módulo é compilado
com a opção 15 do PDM 'Create Module'. Depois da compilação bem sucedida faça a
ligação entre os módulos e teste o programa. Vamos ver a seguir como interligar os
módulos.
Neste capítulo vamos mostrar-lhe como pode criar menus e ecrãs em AS/400.
São ficheiros definidos em DDS que permitem criar menus e ecrãs no AS/400 para
interacção com os utilizadores. Os display files são constituídos por vários registos
que correspondem a diferentes partes do ecrã (definidas pelo programador). Estas
partes podem ou não sobrepor-se.
O utilitário SDA permite “desenhar” o que queremos que apareça no ecrã e o utilitário
encarrega-se de gerar o código DDS. Vamos em seguida criar um ecrã com a ajuda do
SDA e depois vamos analisar as partes mais relevantes do código gerado, para ficar
com uma ideia da estruturação do código, pois existem situações em que é mais fácil
fazer uma alteração manipulando o código.
Vamos neste capitulo criar um ecrã que nos mostrará os dados de um cliente.
Para abrir o SDA escreva na linha de comando STRSDA. Vai lhe surgir este ecrã:
STRSDA
Escolha a opção 1 e coloque os dados como vê na figura abaixo, onde o source file é
onde o ficheiro vai ser guardado (deve ser QDDSSRC, pois o código destes ficheiros é,
como ja disse antes, DDS). Member refere-se ao nome que vamos dar ao membro do
ficheiro.
Criar ficheiro
Prima Enter. Vai lhe surgir um novo ecrã. Adicione um registo ao ficheiro da maneira
que pode ver na próxima imagem:
Agora deve especificar de que tipo vai ser este registo, neste caso será RECORD:
Adicionar registo
Após o Enter aparece-lhe um ecrã vazio. Nesse ecrã puderá desenhar o registo do
topo do ecrã da figura seguinte.
Note que quando escreve uma string deve colocar plicas a delimitá-la, pois senão
cada palavra vai equivaler a um campo isolado. Colocando as plicas a string pode ser
manipulada como uma única unidade no ecrã.
A função *USER vai mostrar no ecrã o nome do utilizador. Existem outras funções
deste género como *DATE (mostra a data actual do sistema), *TIME (mostra a hora
actual do sistema) *SYSNAME (mostra o nome do sistema).
Mover um campo
Mover um campo
Centrar um campo
Prima F3 para terminar a edição deste ecrã. Escolha a opção 1 para guardar as
alterações:
Centrar um campo
Crie agora outro registo com o nome BOTTOM, da mesma forma que criou o registo
TOP.
Quando abrir o ecrã de edição do registo prima F9. Vai lhe aparecer este ecrã:
Aqui pode selecionar os registos que deseja visualizar ao mesmo tempo que edita o
registo BOTTOM (repare que no STATUS do registo diz “In use”). Só pode selecionar no
máximo 3 registos. Deve selecioná-los com números sequenciais de 1 a 3. Selecione o
campo TOP e prima Enter.
Criar o registo Bottom
Desenhe o registo como vê na figura seguinte. Faça a linha com o auxílio da tecla
Underscore. Prima Enter.
Alterar propriedades
Aparece-lhe o ecrã seguinte. Coloque um 'Y' na opção Colors, pois vamos alterar a cor
de visualização do campo.
Dê Enters até regressar ao ecrã de desenho. O campo aparece agora com a cor azul.
Saia da edição deste registo (F3) e guarde o seu trabalho.
Crie um novo registo, MIDDLE, da mesma forma que criou o BOTTOM e o TOP.
Adicionar campos
Utilizar campos de tabelas
Vamos agora selecionar os campos da tabela Clients para pudermos mostrar no ecrã.
Prima F10. No menu que lhe surge deve selecionar o registo da tabela Clients para
output, opção 3, pois neste exemplo só desejamos mostrar os dados. Se desejar fazer
o input de dados ou input/output selecione entre as opções a que lhe convier. Escreva
no menu o que vê na imagem em baixo e prima Enter no final.
Selecionar a tabela
Pode ver que agora em baixo aparece uma mensagem com o nome de todos os
campos precedidos de um número. Para pudermos colocar os campos no ecrã
devemos colocar o número do campo que desejamos precedido de um &, como pode
ver na figura seguinte. Tenha atenção, pois se der um Enter antes de selecionar os
campos todos, a ordem numérica deles vai-se alterar.
Coloque Y na opção Overlay without erasing. Esta opção permite-lhe mostrar este
registo no ecrã simultaneamente com outros. Prima Enter até voltar ao menu com os
registos e active esta opção para os restantes dois registos.
Prima Enter até voltar ao menu dos registos. Prima F3 e guarde o ficheiro.
Pode ver o código do membro que acabou de criar indo ao ficheiro de source
QDDSSRC e abrindo o membro com o nome SHW_CLI. No início do ficheiro deve ter
algo deste género:
A DSPSIZ(24 80 *DS3)
A CF03(03 'Exit')
Estas opções afetam todo o ficheiro. Deve acrescentar nesta área uma linha que vai
mais à frente permitir renomear os indicadores no ficheiro plain (acrescente, por
exemplo, a seguir à linha com DSPSIZ):
A INDARA
A R TOP A OVERLAY
A 1 65USER A 3
27'Client Details:'
Estas linhas estão a definir apenas o registo TOP. Repare que aparece a opção
OVERLAY, que tínhamos definido no SDA. A palavra USER está colocada no ecrã na
linha 1 coluna 65.
Está definida a referência ao campo da tabela CLIENTS, a coluna (23) e linha (8) onde
está posicionado o campo, o tipo de leitura à tabela é para output: o ID_CLI é o nome
que este campo tem, é igual ao campo correspondente na tabela CLIENTS.
Compile o ficheiro com a opção 14, quando fechar o membro, para as alterações se
tornarem efectivas.
Agora para conseguir “correr” este ecrã tem que criar um membro plain que vai tratar
de mostrar o conteúdo do display file no ecrã. Consulte o ficheiro QplainSRC.SHW_CLI
para ver como este ficheiro deve ser definido. Este ficheiro está bastante comentado
assim pode perceber melhor a sua estrutura. Tente criar este ficheiro e corra-o. O
resultado deve ser o seguinte:
Se carregar Enter:
Com subfiles pode criar display files com listagens. Vamos ver como isso é feito.
Um subfile é um display file onde podemos criar uma listagem de valores e processar
alterações feitas sobre a lista. A listagem de membros que encontra no PDM é um
exemplo de um subfile.
Vamos neste capitulo criar um subfile que lista todos os cartões de um determinado
cliente dado o seu ID. Para nos facilitar a manipulação de várias tabelas vamos criar
uma view com campos que precisamos para a nossa subfile. No STRSQL:
Bottom record
Crie o registo TOP com a seguinte aparência:
TOP record
Vamos criar agora a subfile propriamente dita. Crie um novo registo chamado LIST,
mas este deve ser do tipo SFL e não RECORD como temos feito até aqui:
Este campo cria outro registo além do subfile, que é o registo de controlo. Este registo
é uma espécie de cabeçalho da lista.
Agora vai lhe surgir um menu com algumas opções. Vamos ver quais é que vai ter que
activar:
Options
Estes indicadores vão nos depois permitir manipular o estado do subfile a partir do
código em RPG.
Prima Enter para voltar ao menu anterior. Seleccione a opção Subfile display layout.
Options
Prima Enter para voltar ao menu anterior. Selecione Select Record Keyword:
Options
Agora escolha a opção Overlay keywords, para definirmos o overlay deste registo:
Options
Selecione a opção Overlay without erasing:
Options
Finish Options
Abra o registo SFLCTL, por defeito o registo LIST já aparece visível no ecrã. Selecione
também os registo BOTTOM e TOP, com os números 2 e 3 (o 1 já esta associado ao
LIST).
Open records
Selecting fields
Coloque também os títulos dos campos que vão constar no subfile e uma linha
separadora.
Columns description
Vamos agora adicionar algumas propriedades ao campo de ID do cliente.
Vamos adicionar um indicador a este campo, que vai ficar activo no caso de não se
conseguir obter nenhum registo para mostrar a partir do número de cliente dado
(quer seja um número não existente, ou o cliente não tenha cartões associados).
Opção Error Messages:
Error Messages
Feche agora este registo e abra o registo LIST, selecione para visualização o registo
TOP e BOTTOM (F9).
Para criar um campo de input para as opções escreva +i na posição que vê na imagem
seguinte. Dê um Enter.
Selecting a table
Provavelmente vão lhe aparecer os campos repetidos duas vezes, porque o SDA volta
a mostrar o registo para I/O que já tinha carregado para o SFLCTL. Deve selecionar os
campos que estão mais à direita, pois são os últimos selecionados. Tenha atenção
porque se selecionar o campo errado vai ter um campo que lhe permite o input além
do output.
E o resultado final:
Final Result
Não se esqueça de activar o indicador 03 a nível global para o F3=Exit funcionar. No
menu com a listagem dos registos prima F14 (mais pormenores consulte o capítulo
sobre display files).
Não se esqueça de colocar a palavra chave INDARA ao nível global deste membro,
como fez no capítulo do display file.
A R SFLCTL SFLCTL(LIST) A
SFLSIZ(9999) A
SFLPAG(0009) A OVERLAY
A 30 SFLDSP A 31
SFLDSPCTL
A 35 SFLCLR A 33
SFLEND(*MORE) A 4 8'Client
Nr.' A ID_CLI R B 4
19REFFLD(CLICARD/ID_CLI DEMO/CLICARD) A 90 ERRMSG('No Data
Found') A 6 4'Op.'
A 6 12'Card Nr.' A 6
27'Shop Nr.' A 6 42'Shop
Name' A 7
2'__________________________________- A
___________________________________- A
__________' A RRN 4S 0H
SFLRCDNBR(CURSOR)
E no registo list altere o nome do campo de input para opções para OPTION, deve
estar com o nome FLD001, ou algo semelhante.
Executar o subfile
Tem agora que criar o membro plain para poder executar a subfile. Consulte o
ficheiro QplainSRC.SHW_SFL para mais pormenores sobre como deve estar
estruturado este ficheiro.