Vous êtes sur la page 1sur 30

1

Layout de Telas

TIPOS DE TELAS
Janela Mestre
 Base dos programas chamados a partir do menu
 Menu de barra, régua de botões no topo da janela que disponibilizam as funções existentes
naquele programa, e possuem moldura (resizeable).
 Ex: Tela de um programa de cadastro.

Janela Detalhe (filhas)


 Chamadas a partir de janelas mestre
 Realização de funções de um programa.
 Não possuem menu de barra, régua de botões fica na parte de baixo da tela
 Não possuem moldura (resize = no).
 Exemplo: Tela de um programa de zoom.

Caixas de Diálogo
 Interface modal = funções de grande risco aos sistemas.
 Régua de botões na parte de baixo da caixa.
 Exemplo: Programa de Cálculo do Preço Médio.
Observação Não é aconselhável salvar uma Dialog com uma Window aberta. Quando isto é feito, é
possível que o menu da Window seja copiado para a Dialog eliminando-o. Caso isto aconteça é
necessário recriar a Dialog e o menu da Window.

OBJETOS

Combo-boxes
Ver capítulo Como implementar campos indicadores com view-as combo-box nas telas.- TECNICAS

Retângulos
 Agrupar a chave de acesso das telas, agrupar campos de um mesmo assunto, emoldurar itens de
radio-set e emoldurar editores que necessitem de label.

Botões
 Botões com label: altura: 1,00; largura: 10, 15 ou 20 unidades;
 Representarem ações: verbos no infinitivo. (Cancelar, Incluir... ).
 'OK': confirma e sai da tela;
 'Cancelar': não confirma e sai da tela;

Fill-in´s
 Altura de 0,88

Frames(Telas)
 Título das telas: UT-9000.i, não necessita intervenção do programador;
 Máximo 90 colunas – tamanho fixo.
 Máximo 17 linhas - tamanho variável.
 "Property Sheet" da janela no UIB, nos campos "Width" e "Height";
 Mesmas dimensões utilizadas para as propriedades MAX-WIDTH-CHARS e MIN-WIDTH-CHARS
(altura máxima e mínima) e MAX-HEIGHT-CHARS e MIN-HEIGHT-CHARS (largura máxima e mínima)
Com isso as janelas podem possuir a moldura dada pela propriedade RESIZEABLE. O include WIN-
SIZE.I faz estas atribuições.

Radio-Sets
 Não possuiem labels (retângulo)
 Horizontais (<4) ou verticais (>4 <7)
 Mais de 7 itens - combo-boxes.
Ver capítulo Como implementar campos indicadores com view-as radio-set nas telas.- TECNICAS

Editores
 Não possui label.
 Propriedades (Property Sheet): RETURN-INSERTED
 Fonte "2"

CONSIDERAÇÕES SOBRE OS SMARTOBJECTS

SmartBrowser
 Objeto Procedure
 Recupera e visualiza dados, utilizando um browse.
 Nome padrão do Browse não deve ser modificado.
 Manter tamanho

SmartViewer
 Procedure object
 Visualiza os campos da base de dados
 Preenche registros da base de dados
 Distanciamento de uma linha (antes e após).

SmartQuery
 Contém uma base de dados query.
 Preenche registros para outro SmartObjects
 Pode responder de navegação de um SmartPanel.
Recomendações
 Na tela de características da "Query Builder", em "Options", o campo "Returned" deve
ser alterado de "All Fields" para "Fields Used".
Observação: :T em comentários - tradução dos fontes dos templates para outros idiomas.

CAPÍTULO 5 Estilos

CADASTRO SIMPLES

Características
 Todas as funções, exceto zoom e 'vá para', realizadas na tela base do programa;
 Campos alinhados formando colunas
 Tabulação de cima para baixo – coluna a coluna
 menu de barra  todos os botões
 Novas funções: botões (régua de botões no topo) e itens no menu de barra
 Alterar: não permite alterar a chave
 Eliminar: confirmação
 Menu de barra:
Arquivo Ajuda

Primeiro Ctrl-Home Conteúdo


Anterior Ctrl-Left Sobre
Próximo Ctrl-Right
Último Ctrl-End
Vá Para Ctrl-T
Pesquisa Ctrl-F5
Incluir Ctrl-Ins
Copiar Ctrl-C
Alterar Ctrl-A
Eliminar Ctrl-Del
Desfazer Ctrl-U
Cancelar Ctrl-F4
Salvar Ctrl-S
Imprimir Ctrl-P
Sair Ctrl-X

CADASTRO COMPLEXO

Características
 Menu de barra: igual cadastro simples
 Folders: campos não couberem em uma viewer.

CADASTRO SIMPLES/COMPLEXO - ATUALIZA

Características
 menu de barra: apenas Atualizar
 COMPLEXO: tem folders

PAI X FILHOS – ATUALIZA FILHO


Características
 Folder: selecionar browsers de tabelas filho;
 Manutenção apenas da tabela filho;
 Incluir/Modificar: chamam janelas semelhantes ao Cadastro S/C sem a régua

MANUTENÇÃO DE FILHOS

Características
 Sem painéis, folders ou não;
 Chamado através de um pai x filho;
 Inclusão/Alteração;
 Funções dos botões

PAI X FILHOS – ATUALIZA AMBOS


Caraterísticas
 Igual Atualiza Filho, mas atualiza registro pai (botões da régua)
 Incluir/Modificar/Copiar: também chamam janelas semelhantes ao Cadastro sem a régua

MANUTENÇÃO DE PAIS

Caraterísticas
 Igual manutenção filho, porem altera o pai.
 Tem função copiar

CONSULTA CADASTRAL SIMPLES

Características
 Apenas para consulta
 Apenas zoom e do 'Vá para' não realizadas na tela base do programa
 Menu = botões

CONSULTA CADASTRAL COMPLEXA


Características
 Mesmas características Consulta Simples, mas tem um 'Folder'

CONSULTA RELACIONAMENTO

Características
 Relacionamentos de uma tabela pai
 Cada página um relacionamento (filho).
 Brower: botão detalhar  consulta tabela filho (duplo-clique ou <space> no Browser)
 Acima do folder/retângulo  principais campos da tabela

RELATÓRIOS, CÁLCULOS E FECHAMENTOS


Características
 Janela tipo detalhe, sem barra emoldurada, simulando caixa de diálogo
 Botão Executar: executa parametrização realizada nos Folders
Seleção: tudo que é faixa;
Classificação: Radio-set com as opções;
Parâmetros: outras informações;
Digitação: browse updatable.
 A seguir, estão demonstrados os folders de Seleção, Classificação, Parâmetros e Digitação

PARÂMETROS ÚNICOS

Características
 Tipo detalhe: sem menu de barra e moldura - caixa de diálogo
 Função dos botões

PARÂMETROS MÚLTIPLOS
 Mesmas regras dos Cadastros Simples ou Complexo
Exemplo: Parâmetros por estabelecimento.

FORMAÇÃO
Características
 Navegação: programa independente
 Botão Incluir () adiciona ao browser de formação informação de 2 tabelas;
 Botão Deletar () remove dados.
 Botão Modifica: atualização dos atributos (Cadastro sem a régua).

FORMAÇÃO SEM NAVEGAÇÃO

Características
 Não possui navegação – dependente
 Chamado por um programa que possua Browser Formação.

IMPORTAÇÃO
Características
 Janela tipo detalhe
 Executar: dispara a importação parametrizada nos folders
 Layout: layout do arquivo
Editar – através de um editor de texto
 Seleção: faixa de registros
 Parâmetros: nome do arquivo de entrada (registros a serem importados)
 Log: nome do arquivo de saída
 A seguir estão demonstrados os folders de Layout, Seleção e Parâmetros:

EXPORTAÇÃO

Características
 Janela tipo detalhe
 Executar : dispara a exportação parametrizada nos folders.
 Seleção: faixa dos registros que serão exportados;
 Parâmetros: nome do arquivo de saída
 Log: determinação de modo de execução do mesmo.
 A seguir são mostrados os folders de Layout, Seleção e Parâmetros:

ZOOM DE TABELAS
Características
 Janela do tipo detalhe
 Default-button: 'OK'
 Implantar: chama o programa de cadastro da tabela (pode estar desabilitado)
 Botões específicos: ao lado do ‘Implantar
 aplicação do valor inicial e final definido pelo usuário
 Folder: opção de classificação.
Label do campo: [valor inicial] ............... [valor final].
 Não literais para denominar inicial e final.
Observação Verificar se cada folder tem um browser diferente ou não, se isto for necessário
inverter a ordem dos campos, conforme a classificação.
 Não tem os botões de INÍCIO e de FIM  teclado: "HOME" e "END"

VÁ-PARA

Características
 Reposicionamento rápido do registro corrente
 Conhecimento da chave do registro
 Caixa de diálogo com botões de 'Ok' e 'Cancelar' e 'Ajuda'
 default-button: OK
Observação Não salvar uma Dialog com uma Window aberta. (Possível que o menu da Window
seja copiado para a Dialog eliminando-o).

DIGITAÇÃO RÁPIDA
Características
 Tipo Detalhe
 default-button - 'Ok'
 Páginas iniciais: informações genéricas
 Última página: browser.

PAINÉIS

 Painéis padrão utilizados para navegação.

FUNÇÕES

Relatórios Relacionados

Características
 Browser: lista relatórios relacionados ao programa
 Executar - chama o relatório selecionado

Consultas Relacionadas
Características
 Browser que lista todas as consultas relacionadas
 Executar: chama a consulta selecionada

Construção de Programas utilizando os Estilos e suas Técnicas

Observação
 Campos fill-in’s: trigger de "LEAVE"/"VALUE-CHANGED" e sem lupa ou bt de zoom
trigger de "ENTRY".
 Registro para o WebEnabler

CADASTRO SIMPLES

1) Selecionar o estilo:
Cadastro Simples  Masters/w-cadsim.w
Cadastro Simples – Alteração  Masters/w-cadsi2.w
Cadastro Simples – Inclusão  Masters/w-cadsi3.w

2) Verificar se já existe smartQuery para a tabela.


2.1 – se não – criar nova query usando o CustomQueryWizard
2.2 Instanciar a SmartQuery na pág. 0 e aceitar smartLink

3) Verificar se existe vá-para e programa de pesquisa.


3.1 – Se não existe, criar.
3.2 No atributos de instância Query – informar "Programa Pesquisa" e "Programa Vá”

4) Criar SmartLink tipo STATE. Source: p-navega. Target: SmartQuery;


5) Criar SmartLink tipo STATE. Source: p-exihel. Target: SmartQuery;

6) Verificar se existe SmartViewer.


6.1 Se não existir, criar (estilo CustomViewer com Auto-Field)
6.2 Instanciar a SmartViewer na pág0 e aceitar link
6.3 Redimensionar Window – Viewer centralizada.

7) Salvar SmartWindow.

LISTA DE LINKS

Tem três painéis (navega, cadsim e exihelp)

Source Link Type target

h_p-cadsim STATE h_p-exihel


h_p-cadsim TABLEIO h_viewer
h_p-navega NAVIGATION h_query
h_p-navega STATE h_query
h_query RECORD h_viewer
h_p-exihel STATE h_query

CADASTRO COMPLEXO

Passos 1 a 6 – igual cadastro simples. Diferença: instanciar várias viewers (page0 e folders).
 Verificar o nome do estilo

8) Criar SmartLink tipo GROUP-ASSIGN. Source: SmartViewer principal. Target: SmartViewer


secundárias.

9) Renomear label das páginas (propriedades do folder)

10) Salvar.

LISTA DE LINKS
Source Link Type Target

h_folder PAGE THIS-


PROCEDURE
h_p-cadsim STATE h_p-exihel
h_p-cadsim TABLEIO h_viewer-l
h_p-navega NAVIGATION h_query
h_query RECORD h_viewer-1
h_query RECORD h_viewer-2
h_query RECORD h_viewer-3
h_query RECORD h_viewer-4
h_viewer-1 GROUP-ASSIGN h_viewer-2
h_viewer-1 GROUP-ASSIGN h_viewer-3
h_viewer-1 GROUP-ASSIGN h_viewer-4
h_p-exihel STATE h_query
h_p-navega STATE h_query

CADASTRO PAI X FILHO – ATUALIZA FILHO

 Window Cadastro Pai x Filho – Filho  masters/w-adf.w


 Passos 1 a 6 – igual cadastro simples.

7) Verificar se existe SmartBrowser para a tabela filho.


7.1 Se não existir – cria novo (estilo CustomBrowser Inclui/Modifica);
7.2 Colocar o Browser na pág do folder, aceitando os links
7.3 Informar programa atualizaFilho. (Atributos de instância do SmartBrowser).
8) Criar SmartLink tipo Record. Source: SmartQuery. Target: SmartBrowser

9) Se necessário, incluir botões de parâmetro e seleção para a tabela do SmartBrowser.

10) Salvar a smartWindow.

LISTA DE LINKS

Source Link Type Target

h_folder PAGE THIS-


PROCEDURE
h_p-exihel STATE THIS-
PROCEDURE
h_p-navega NAVIGATI h_query
ON
h_p-navega STATE h_query
h_query RECORD h_viewer
h_query RECORD h_browser1
h_query RECORD h_browser2
h_p-exihel STATE h_query

CADASTRO INCLUI/MODIFICA FILHO


1) Selecionar o estilo: Window Inclui/Modifica Filho  Masters/w-incmo3.w

2) Se os campos couberem em uma viewer  eliminar o folder da SmartWindow;


Senão  mais viewers (páginas do folder).

3) Verificar se já existe smartQuery para a tabela.


3.1 – se não – criar nova query usando o CustomQueryWizard
3.2 Instanciar a SmartQuery na pág. 0 e aceitar smartLink

4) Para cada viewer  Verificar se existe SmartViewer.


4.1 Se não existir, criar (estilo CustomViewer com Auto-Field)
4.2 Instanciar a SmartViewer na pág0 e aceitar link
4.3 Redimensionar Window – Viewer centralizada.

4) Criar SmartLink tipo TABLEIO. Source: THIS-PROCEDURE. Target: SmartViewer;

5) Se o cadastro for do tipo complexo:


5.1 Criar SmartLink tipo group-assign. Source: a viewer principal. Target: demais viewers;

6) Incluir após o Dispatch padrão na Local-Initialize: {include/i-inifld.i}

7) Atribuir pág. 1 como pág. inicial do programa.


7.1 Procedure Properties na janela do UIB  Propertie Pages  Startup on Page: valor 1.
8) Local-Initialize da window: substituir "<viewer_principal>" pelo nome da viewer

9) Botões de 'Ok' e 'Salvar': substituir "<handle da viewer principal>" pelo handle da viewer

10) Procedure pi-reposiciona: substituir "<query-name>" pelo nome da query

11) Na SmartViewer principal  criar local-create-record


11.1 Após run dispatch: (como se fosse um saveParentFields
11.1.1 Find na tabela pai com o rowid (v-row-parent)
11.1.2 Se avail tabela pai, salva chave pai na tabela filho.

12) Se desejar preencher os campos chave da tabela pai na viewer para inclusão:
12.1 Na SmartViewer principal: criar local-display-fields e local-add-record
12.2 Após o run dispatch:
12.2.1 Define buffer para a tabela pai
12.2.1 Find no buffer da tabela pai com o rowid (v-row-parent)
12.2.2 Se avail buffer, salva screen-value da tabela filho com a chave do buffer
Se não = “”.

13) Se desejar preencher seqüencialmente campo chave tabela filho:


13.1 SmartViewer Principal: criar local-add-record  após dispatch:
13.1.1 Define buffer para a tabela filho.
13.1.2 Procura buffer onde chave pai = pai.chave pai.
13.1.3 Se disponível, atualiza com a chave do buffer + 1
Se não = 1

LISTA DE LINKS
Uma Viewer
Source Link Type Target
THIS-PROCEDURE TABLEIO h_viewer
h_query RECORD h_viewer

Lista de Links (Mais de uma Viewer):


Source Link Type Target
h_query RECORD h_viewer1
THIS-PROCEDURE TABLEIO h_viewer1
h_viewer1 GROUP-ASSIGN h_viewer2
h_viewer1 GROUP-ASSIGN h_viewer3
h_query RECORD h_viewer2
h_query RECORD h_browser3

CADASTRO PAI X FILHO – ATUALIZA AMBOS


1) Selecionar o estilo:
Window Cadastro Pai x Filho - Ambos  Masters/w-paiamb.w

2) Verificar se já existe smartQuery para a tabela pai.


2.1 – se não – criar nova query usando o CustomQueryWizard
2.2 Instanciar a SmartQuery na pág. 0 e aceitar smartLink

3) Verificar se existe programa de Cadastro Inclui/Modifica Pai para Pai


3.1 Se não exister, criar (template Cadastro Inclui/Modifica Pai)

4) Verificar se existe vá-para e programa de pesquisa.


4.1 – Se não existe, criar.
4.2 No atributos de instância Query – informar "Programa Pesquisa" e "Programa Vá” e o nome
do programa de Inclui/Modifica/Copia da tabela pai

5) Criar SmartLink tipo STATE. Source: p-navega. Target: SmartQuery;

6) Criar SmartLink tipo STATE. Source: p-cadpai. Target: SmartQuery;

7) Criar SmartLink tipo STATE. Source: p-exihel. Target: SmartQuery;

8) Verificar se existe SmartViewer para a tabela pai;


8.1 Se não existir, criar (estilo CustomViewer com Auto-Field)
8.2 Instanciar a SmartViewer na pág0 e aceitar link

9) Para todos SmartBrowsers:


9.1 Se não existirem  Criar - CustomBrowser Inclui/Modifica;
9.2 Instanciar o SmartBrowser, aceitando os links;
9.3 Acessar atributos e informar: programa de atualização abela filha. (Se não existir, deve
criar).

10) Se necessário, incluir botões de Seleção e/ou Parâmetros para a tabela do SmartBrowser.

LISTA DE LINKS

Source Link Type Target

h_folder PAGE THIS-PROCEDURE


p-cadpai TABLEIO h_viewer
p-cadpai STATE h_query
h_p_exihel STATE h_query
h_p-navega NAVIGATION h_query
h_p-navega STATE h_query
h_query RECORD h_viewer
h_query RECORD h_browse1
h_query RECORD h_browse2

CADASTRO INCLUI/MODIFICA PAI


1) Selecionar o estilo: Window IncluiModifica Pai  Master/w-incmdp.w

 Passos 2 a 10  Igual programa Inclui/Modifica Filho

LISTA DE LINKS

Uma Viewer
Source Link Type Target
THIS-PROCEDURE TABLEIO h_viewer
h_query RECORD h_viewer

Mais de uma Viewer


Source Link Type Target
h_query RECORD h_viewer1
THIS-PROCEDURE TABLEIO h_viewer1
h_viewer1 GROUP-ASSIGN h_viewer2
h_viewer1 GROUP-ASSIGN h_viewer3
h_query RECORD h_viewer2
h_query RECORD h_viewer3

INCLUI/MODIFICA
1) Selecionar o estilo: Window IncluiModifica Pai  Master/w-incmdp.w

Seguir os passos do Wizard. Obs:

2) Indicar tabela externa: tabela pai.

3) Query deve conter a tabela filha.

4) "Indexed-Reposition" marcado.

5) “Options" coluna "Returned" = "Fields Used";


 toggle-box "Sort-ByPhrase" = marcado

CustomBrowser ZOOM WIZARD

1) Selecionar o estilo: Custom Browser Zoom Wizard  Masters/wbrwzoo.w

Seguir os passos do Wizard:

2) Exibir apenas registros entre os limites  página where:


<Tabela>.<Campos> >= fi-ini-<campo> and <Tabela>.<Campos> <= fi-fin-<campo>

3) Alterar fill-ins faixa: nome (mesmo usado na query), tipo, formato, tamanho e valor inicial
3.1 Database fields  indicar o campo  dialog Dictionary Defaults  desmarcar os toogle-boxes
Label e Database Variable;

4) Se forem adicionados  copiar Image-1 e Image-2

5) Trigger bt-confirma: trocar c-inicial e c-final para nome dos campos.

6) Pode ser necessário traduzir utilizando ut-liter.

CONSULTA SIMPLES
1) Selecionar o estilo:
Window Consulta Simples  Masters/w-consim.w

 Passos 2 a 7  Igual cadastro simples.

LISTA DE LINKS
Source Link Type Target
h_p-navega NAVIGATION h_query
h_p-navega STATE h_query
h_query RECORD h_viewer
h_p-exihel STATE h_query

Source Link Type Target CONSULTA COMPLEXA


h_folder PAGE THIS-PROCEDURE 1) Selecionar o estilo: Window Consulta
h_p-navega NAVIGATION h_query Complexa  Masters/w-concom.w
h_query RECORD h_viewer1  Igual cadastro complexo
h_query RECORD h_viewer2 LISTA DE LINKS
h_query RECORD h_viewer3
h_query RECORD h_viewer4
h_viewer-1 GROUP-ASSIGN h_viewer-2
h_viewer-1 GROUP-ASSIGN h_viewer-3
h_viewer-1 GROUP-ASSIGN h_viewer-4
h_p-exihel STATE h_query
h_p-navega STATE h_query
CONSULTA RELACIONAMENTOS
1) Selecionar o estilo: Window Consulta Relacionamento  Masters/w-conrel.w

Passos 2 a 6  Igual cadastro simples

7) Repetir os seguintes passos para os SmartBrowsers:


7.1 – Se não existir, criar (CustomBrowser Consulta)
7.2 - Botão "Detalhar": chamar programa de consulta - detalhar:
1º Consulta cadastral do filho
2º Consulta relacionamento do filho
3º Consulta cadastral de uma tabela associativa ao filho;
7.3 Implantar técnica de reposicionamento automático com base nas variáveis globais
7.4 Atributos de instancia do Browser  informar nome do programa

8) Criar SmartLink tipo Record. Source: SmartQuery. Target: SmartBrowser;

LISTA DE LINKS

Source Link Type Target


h_folder PAGE THIS-PROCEDURE
h_p-exihel STATE THIS-PROCEDURE
h_p-navega NAVIGATION h_query
h_p-navega STATE h_query
h_query RECORD h_viewer
h_query RECORD h_browse1
h_query RECORD h_browse2
h_p-exihel STATE h_query

RELATÓRIOS
1) Não gerados pelo DataViewer - estilo Window Relatórios/Cálculos/Fechamentos (w-relat.w)
2) Não utiliza SmartObjects
3) Constituído por dois programas : .w e rp.p
4) Páginas do relatório (obs: igual Thin, porém sem Layout e Log  só as de rel)
5) Traduções automáticas – exceto list-items do combo-box

Interface
1) Verificar quais páginas são desnecessárias, eliminar as freames, eliminar n (nº pág.
Desnecessárias) imagens com as "orelhas" mais a direita, renomeando as remanescentes e limpar
conteúdo preprocessadores

Página de Seleção
1) Colocar fill-ins de inicial e final. Sugestão: criar como 'Database Fields' e converter para variáveis
2) Corrigir 'initial values'
3) Retirar queries que o UIB queira associar a frame.

Página de Classificação
1) Redefinir o 'list-items' com as opções de classificação do relatório. Se necessário, adicionar mais.
Pagina de Parâmetros
1) Colocar as variáveis necessárias na representação desejada
2) Labels de retângulo devem ser fill-in´s view-as text, e o seu valor deve ser informado no seu
initial e private-data. As propriedades 'Display' e 'Enable' devem ser retiradas.
Página de Digitação
1) Definitions  corrigir a definição da temp-table

2) Section Editor  objeto browse br-digita, adaptar gatilhos para a nova definição da tt-digita
2.1 Display: campos apresentados/habilitados.
2.2 Row-entry: valores iniciais na inclusão de novas linhas
2.3 Row-leave: salva as alterações feitas pelo usuário.

3) bt-inserir e bt-alterar: aplica evento 'Entry' sobre o primeiro campo habilitado no browse;

4) Validações  procedure pi-executar no local indicado;

5) Opcionalmente, os gatilhos de 'leave' e zoom.

Página de Impressão
 Não é necessário qualquer função adicional.

Gravação e validação dos parâmetros


1) Definitions  campos de parâmetros e seleção na definição da tt-param.
2) Validações na pi-executar: apresentar a mensagem e foco no campo.
3) Pi-executar: gravar campos da parâmetro e seleção.
4) Alterar o nome do programa chamado pelo relatório.

Formato RTF
 Não é necessário alteração na interface.
 Se não desejar que o relatório possua essa funcionalidade:
1) &GLOBAL-DEFINE RTF NO
2) Pág. Impressão: remover os componentes e reposicionar campos.

Programa RP.P de Relatório


 Procedural sem qualquer tipo de interface (exceto visualização do relatório e caixa de
acompanhamento de execução)
 Explica toda a execução de um relatório  Perguntar para a Queli

Módulo JOB EXECUTION  Pergutar para a Queli, há diversas informações


 Menu de Tecnologia: agilizar execução periódica de listas de programas
 Cadastro de Parâmetros e Digitações (JE0101): programas utilizados em uma lista de disparo.

FORMAÇÃO

1) Selecionar o estilo: Window Formação  Masters/ w-forma.w

 Passos 2 a 6 do cadastro simples.

3) Se não existir SmartBrowser : criar (CustomBrowser Wizard)


3.1 Caiba no lado esquerdo da window formação;
3.2 Trigger de MOUSE-SELECT-DOUBLE-CLICK: RUN NEW-STATE(INPUT 'incluir-browse':U).
3.3 Instanciar o Browser do lado esquerdo

4) Criar SmartLink do tipo STATE. Source: SmartBrowser. Target: THIS-PROCEDURE.

5) Se não existe SmartBrowser com a tabela de formação: criar (CustomBrowser Formação);


5.1 Tabela externa: tabela utilizada na SmartQuery do programa de Formação;
5.2 Retirar comentários da PI-ADD-BROWSE e substituir os dados:
tabela-1: tabela de navegação
tabela-2: tabela do Browser Fonte
tabela-formação: tabela do SmartBrowser formação
5.3 Instanciar do lado direito.
5.4 Atributos de instancia  Programa Atributo: modificação do registro de formação.
6) Criar SmartLink tipo STATE. Source: SmartBrowser formação. Target: THIS-PROCEDURE.

7) procedure STATE-CHANGED, trigger botão "(>)" e trigger botão "(<)": substituir os comantarios.

LISTA DE LINKS
Source Link Type Target
h_browse-formação STATE THIS-PROCEDURE
h_p-exihel STATE h_query
h_p-navega NAVIGATION h_query
h_p-navega STATE h_query
h_query RECORD h_viewer
h_query RECORD h_browse-formação
THIS PROCEDURE STATE h_browse-fonte

FORMAÇÃO SEM NAVEGAÇÃO


1) Selecionar o estilo  Window Formação sem Navegação
2) Dependente  CustomBrowser Formação Filho.
3) Não utiliza SmartObjects
4) Seguir a ordem das tarefas.
5) Jamais eliminar include padrão.

Seqüência
1. Criar browse origem:
2. Definir query;
3. Definir campos para display.
4. Colocar campos da tabela pai.
5. Criar browse destino:
6. criar uma temp-table (definitions) com os atributos da tabela destino.
7. definir query (relacionando esta com a tabela pai) para a temp-table  freeform;
8. definir campos para display.
9. Pré-processor  nome da tabela pai;
10. local-initialize: lógica para carregar a temp-table com os registros da tabela de destino.
11. Criar funções e procedures internas:
12. criar função para mostrar o registro da tabela pai (pi-show-master-record);
13. criar inclusão no browse destino:
14. Procedure pi-ins - lê os registros selecionados verifica se o registro pode ser incluído, através
da função is-create-allowed, e caso a inclusão seja permitida executa a procedure pi-add-to-
target;
15. Função is-create-allowed - valida se o registro não existe ainda no browse destino, ou realiza
outras regras de negócio que verificam se a inclusão é valida retorna um status que indica o
resultado dos testes;
16. Procedure pi-add-to-target - realiza o create e o assign no browse destino (temp-table);
17. criar eliminação do browse destino:
18. Procedure pi-del - lê os registros selecionados e para cada um deles executa regras de
negócio que verificam se a eliminação é permitida (através da função is-delete-allowed) e
realiza a eliminação quando permitida pela função através da procedure pi-delete-from-
target (elimina da temp-table).
19. criar uma procedure interna (pi-commit) que transfira os registros da temp-table para a
tabela de destino, esta procedure é chamada pelo evento choose do botão 'Ok':

Como construir um Browse Formação Filho


1) Estilo: CustomBrowser Formação Filho
 Utilizar o wizard, atentando para o seguinte:
2) deve ser informada a tabela externa;
3) Cláusula Options: Coluna Returned: Fields Used;
Desmarcar as opções Key-Phrase e SortBy-Phrase.
Index-reposition setado

PROGRAMA DE IMPORTAÇÃO
1) Estilo Importação/Exportação (variação de relatório).
2) Páginas: Layout, Seleção, Parâmetro e Log.
3) Seleção e Log  igual relatório padrão.
4) Pode impirmir Todos ou somente registros rejeitados (com erro).

Página de Layout
1)'Main Block': include {include/i-imvrf.i}  informar nome do programa e versão do layout.
2) Criar arquivo de layout.

Pagina de Parâmetros
 Diferenças:
1) bt-arquivo-entrada: pode adicionar terceiro parâmetro na include i-imarq.i : filtros. Se não
informar  padrão *.lst e todos os tipos de arquivos.
END.

Página de Log
Não existem tarefas.

Gravação e validação dos parâmetros


 Igual relatório

Dicas para criação do Programa RP.P de Importação


 (Verificar com a Queli – acho que não cai).

PROGRAMA DE EXPORTAÇÃO
Diferenças entre Importação

Página de Parâmetros
 Mudar private-data e o initial do label "Arquivo de Entrada" do retângulo para "Arquivo de Saída".

Página de Log
 Remover o retângulo, o label e o radio-set com as opções "Todos" e "Rejeitados". Reposicionar.

Gravação e validação dos parâmetros


 Procedure 'pi-executar': substituir código de validação do arquivo de entrada:

Dicas para criação do Programa RP.P de Exportação


 (Verificar com a Queli – acho que não cai).

PROGRAMA DE PESQUISA
 Window Pesquisa
 Um SmarBrowser para cada classificação. Ordem das colunas = ordem de classificação.

Para todos os SmartBrowsers, seguir os seguintes passos:


1) Se não existir Browser com a ordem e dados desejados, criar (CustomBrowserZoom Wizard)
2) Tnstanciar o SmartBrowser no SmartFolder
3) Criar SmartLink do tipo STATE. Source: SmartBrowser. Target: THIS-PROCEDURE.

LISTA DE LINKS
Source Link Type Target
h_browse STATE THIS-PROCEDURE
h_folder PATE THIS-PROCEDURE

PROGRAMA VÁ-PARA
1) Estilo Dialog VaPara
2) Selecionar a tabela e os campos.
3) Ajustar os campos na tela;
 Gera automáticamente a TRIGGER GO
 Sugestão: campos exibidos na altura adequada:
1. No AppBuilder Acessar Options - Preferences
2. Selecionar o folder Grid Units
3. Alterar a opção Layout Units para Pixel
4. Preencher os campos com valor 1
Ou alterar o tamanho dos campos manualmente

PROGRAMA DE DIGITAÇÃO RÁPIDA


1) Estilo Window Digitação Rápida
2) Criar e instanciar uma CustomViewerDigita (utilização de variáveis e não DBFields).
3) Criar e instanciar um CustomBrowserDigita (deve utilizar temp-table

BROWSE DE DIGITAÇÃO
1) Estilo CustomBrowserDigita
2) Alterar definição da temp-table. Não eliminar o campo "line”.
3) Alterar trigger de open_query, substituindo a cláusula <temp-table>
3) Alterar trigger de display, substituindo as cláusulas <campo1> <campo2>.
4) Alterar pi-salva-rel para gravar todos os valores do browse.
5) Pi-busca-valor: nome das variáveis da viewer que deseja retornar o valor destas para o browse.
6) Validações na pi-salva-rel
7) Pi-cria-registro: a leitura dos registros da temp-table e criados os registros na tabela física.

QUERY
1) Estilo Custom Query Wizard
2 ) Seguir os passos do wizard: se viewer não contiver cláusula where  assinalar Index Reposition;
 Desabilitar SortBy-Phrase, Key-Phrase

VIEWERS
1) Estilo Custom Viewer com AutoField
 Padrão: ao menos um campo não chave.
 Sem campos de tabela:
 Só com campos chave:

Padrão
1) Selecionar tabelas e campos.

2) Questão: deve suportar chaves estrangeiras: “cancel”

3) Se for cadastro simples: local-assign-records, substituir: {include/i-valid.i} por:


if not frame {&frame-name}:validate() then
return 'ADM-ERROR':U.

4) Alterar a altura

5) Desmarcar “enable” para atributos chaves e em Advanced, marcar '{&ADM-CREATE-FIELDS}';

6) Primeiro atributo na linha 1.17  espaçamento 1. Alterar altura do retângulo rt-key

7) Alterar linha inicial do retângulo rt-mold para a altura do rt-key + 1.25;

8) Se não forem colocados atributos chave: eliminar o retângulo rt-key; mover demais campos.

9) Colocar demais objetos. Tornar desabilitados e, em Advanced, marcar '{&ADM-MODIFY-FIELDS}'.

10) Customizar LOCAL-INITIALIZE para inicializar objetos. (Labels, itens para combo-boxes e radio-
sets, etc)  Antes do dispatch padrão.

11) LOCAL-ENABLE-FIELDS: comentar “if-adm-new-record=yes then";


12) LOCAL-DISPLAY-FIELDS: customizada  valor da variável seja exibido.
13) Definir a altura (demais para a minha cabeça decorar os valores).

14) Propriedades da frame  'Tab Order'  'Left-to-Right By Columns';

Sem campos de tabela


 Não vinculado a uma base de dados valores alterados em tempo de execução.
1) Cancelar a tela de seleção de tabelas.

2) Fazer a alteração no assign-records para cadastro simples.

3) Method-Library: include i-auxtab.i

4) Definir uma tabela externa;

5) Inserir os objetos. Desabilitar.

6) Colocar os campos nos preprocessadores:


Tipo de Objetos Preprocessador Finalidade
Chaves Adm-create-fields Habilitados somente
na criação.
Outras variáveis Adm-modify-fields Habilitados no ADD,
Adm-assign-fields COPY e MODIFY.

7) Customizar LOCAL-INITIALIZE para inicializar objetos. (Labels, itens para combo-boxes e radio-
sets, etc)  Antes do dispatch padrão.

8) LOCAL-DISPLAY-FIELDS: customizada  valor da variável seja exibido.

9) LOCAL-ENABLE-FIELDS: comentar “if-adm-new-record=yes then" e dispatch padrão ;


9.1 Viewer principal, incluir: RUN notify ('enable-fields, GROUP-ASSIGN-TARGET':U).

10) LOCAL-DISABLE-FIELDS: comentar o dispatch padrão; inserir as seguintes linhas:


&if defined(ADM-CREATE-FIELDS) &then
disable {&ADM-CREATE-FIELDS} with frame {&frame-name}.
&endif
10.1 Caso seja uma viewer principal colocar:
RUN notify ('disable-fields, GROUP-ASSIGN-TARGET':U).

11) LOCAL-ASSIGN-STANTEMENT: objetos terão seus valores salvos: comentar o dispatch padrão;
inserir a lógica de gravação dos valores das variáveis.

12) Alterar alturas e tamanhos, tabulaçãio.

Viewer só com campos chave


1) Selecionar as tabela a serem utilizadas na viewer
2) Questão chaves estrangeiras  cancel.
3) Method-Library: include i-auxtab.i.
4) Desabilitar todos os campos da tela (pré-processadores conforme acima):

5) LOCAL-INITIALIZE: inicializações.
LOCAL-DISPLAY-FIELDS: exibir valores.
LOCAL-ENABLE-FIELDS: customizações.
LOCAL-ASSIGN-RECORD: salvar campos.
6) Alterar alturas e tabulação.

VALIDAÇÕES
 Conferir entradas de dado fornecidas pelo usuário: evitar informações errôneas.

Validações na Navegação de Registro


 Habilitar ou desabilitar botões
 Cuidado: cada vez que o usuário navegar  Performance

Validações Antes da Alteração


 Permitir ou não alteração do registro
 Melhora performance.
 Local-Enable-Fields: condição.
Observação: Técnica evitada: usuário tenta alterar e a mensagem irá interrompe-lo.

Validações em Entrada de Dados


 Sempre no momento de sua confirmação.
 Apresentar uma mensagem (ut-msgs.p) posicionar o foco.

Validações em Cadastro Simples


 Antes do dispatch da procedure Local-assign-record da Viewer.

Validações em Cadastro Complexo


 Procedures pi-validate das Viewers.

Validações para Window Relatório


 Validações das páginas de Parâmetros, Seleção e Classificação: pi-executar, após o
comentário.
 Browse de Digitação: evento Row-Leave do browse.
 Validação da Página de Impressão: Template se encarrega de confirmar os valores para essa
página.

Validações em Triggers de Dicionário de Dados


 Pode acarretar mau funcionamento nos templates: replicadas nos programas.

API’S
 Recebe parâmetros para realizar alguma tarefa (atualização, retornar informações).
 Visa facilitar a customização e a integração dos módulos.
 Sempre executada através de outro programa.
 Evitar duplicidade de código. Mantendo atualizadas.
 Outros módulos: independência dos aplicativos.
 Customizações.
 Cliente e outros módulos não precisam conhecer detalhes do módulo.

Funcionamento
 Receber parâmetros e executar uma açãos.
 Não deve ter tratamento com tela.
 INPUT-OUTPUT PARAMETER TEMP-TABLE: única forma de comunicação de dados com a API.
 Pode usar mais de uma tabelas temporária.
 NÃO utilizar variáveis globais.
 Retorno da API RETURN-VALUE: OK ou NOK;
INPUT-OUTPUT PARAMETER TEMP-TABLE: pode retornar mensagem de erro ou
temp-table de retorno.
 Nomenclatura: XXAPI999.P.
 Definição temp-tables: include  nome igual ao .p
 Controle p/ versão de integração cod-versao-integracao: fixa, programador controla.
- Programa chamador passa versão como param entrada, API faz consistência (diferente da
versão do programa).
 Retorno de erros: - retornar na própria tt de entrada
- tt de erros com cód do erro e descrição.
- msg cadastrada no cad mensagens.
 Documentação: - modulo responsável: nome físico, versão, objetivo, parâmetros de entrada e
saída, include com definição da tt, validações e a ações.
- manual do modulo deve conter relação de todas apis.

TÉCNICAS

Alterar o caracter de senha


 Fill-in do tipo blank ou informação não pode ser visualizada.
1) Inserir a include  {include/i-win.i}
2) Rodar o procedimento SendMessageA. Parâmetros: atributo hWnd do fill-in, valor
{&EM_SetPasswordChar}, caracter (*), 0 (zero).

****** PARA TODAS AS TECNICAS ABAIXO ******


1) Inserir a include  {include/i-win.i}
2) Definir h-prog as handle e rodar o programa ut-utils.p persistente.

4) Eliminar o programa ut-utils.p (delete procedure).


Obs: Executar o último procedimento  sistema pode ficar sem recursos e travar.

Alterar o diretório corrente


 Mudar o diretório em tempo de execução.
3) Rodar o procedimento SetCurrentDir passando onovo caminho do diretório corrente.

Alterar ou criar uma variável de ambiente


 Seta uma variável de ambiente do WINDOWS e não DOS.
3) Rodar procedimento SetEnv. Parâmetros: variável que será criada, valor da variável

Dar foco a qualquer objeto


3) Rodar procedimento ApplyFocus. Parâmetro: hWnd do objeto.

Deixar uma janela sempre visível


3) Rodar procedimento SetTopMost. Parâmetros: atributo hWnd da window, valor yes se deve ficar
sempre visível.

Executar um aplicativo do Windows


3) Rodar o procedimento Execute. Parâmetros: caminho do programa, parâmetros p/ o programa.
3.1 Retorno "Ok"  operação feita com sucesso  then message "A operação foi feita com
sucesso".

Obter as coordenadas do mouse


 Verificar se o mouse está dentro de determinada região da janela no momento do clique.
 Trigger de Select-Mouse-Click
3) Rodar o procedimento GetMousePos. Parâmetros: handle da window, variável integer (retorna
coordenada X), variável integer (retorna coordenada Y).

Obter o diretório corrente


3)Rodar o procedimento GetCurrentDir. Parâmetro: variável char (retorna diretório).

Obter o diretório de sistema do Windows


3)Rodar o procedimento GetSysDir. Parâmetro: variável char (retorna diretório do sistema).

Oter o diretório do Windows


3) Rodar o procedimento GetWinDir. Parâmetro: variável char (retorna diretório).

Obter o nome do computador


3) Rodar o procedimento GetComputerName. Parâmetro: variável char (retorna nome).
Obter o valor de uma variável de ambiente
3) Rodar o procedimento GetEnv. Parâmetros: variável de ambiente que deseja-se saber o valor, :
variável char (retorna valor variável).

Transformar uma janela em barra de ferramentas


 Implementar uma janela que esteja sempre visível e que contenha funções de ferramentas
(funções que não estejam ligadas a nenhum objeto ou programa).
 Verificar se é possível deixar a barra de ferramentas sempre visível
3) Rodar o procedimento AddPaletteStyle. Parâmetros: atributo hWnd da janela.

***** FIM *****

Desabilitar Radio-Buttons
 Sintaxe normal: DISABLE(label-do-RB).
 Porem o label muda para cada idioma, então:
 IF nome-rs:DISABLE(ENTRY(X,(nome-rs:RADIO-BUTTONS IN FRAME {&FRAME-NAME}))) THEN.
Onde:
X =2 * (entrada desejada)-1. ("string", 1, "string", 2).

Correção Ortográfica em Editores


 Botão ao lado direito superior (sem label; 4,00 x 1,25; Help:"Corretor ortográfico").
 def var log: l-control-spell
 Local-display-fields (SmartViewer) ou local-initialize da (SmartWindow): após Dispatch:
- i-inispl.i  parâmetro: nome do botão
 MAIN-BLOCK: i-spell.i  Parâmetro: nome Editor, nome do botão

Executar programas que são janelas


 Executar um programa (.w) a partir de um outro programa que já é uma janela
 def var h-programa as handle no-undo.
 Programa executado de forma persistente.
 If valid-handle(h-programa) then
run dispatch in h-programa ('initialize').
 Podem-se executar outros procedimentos (antes ou depois de sua inicialização)

Habilitar ou desabilitar botões em painéis


 Criadas procedures para habilitar/desabilitar
 Necessário link STATE entre painel e Window
 Local-initialize: depois do run-dispatch:
 RUN enable-<função> in <handle do painel> (Input <logical>).
<função>: inclui, elimina, modifica, cópia, zoom, etc...
<logical>: "yes" habilita e "no" desabilita.

Campos indicadores com view-as combo-box nas telas


 Propriedades avançadas do combo-box marcar os 'Custom lists',
 Retirar a propriedade Enable.
 Local-initialize: antes dispatch: assign <combo-box>:list-items in frame {&frame-name} =
{XXINC/I99XX999.I 03}.
 depois dispatch: assign <variavel-combo-box>:screen-value in frame {&frame-name} =
{XXINC/I99XX999.I 04 <tabela>.<campo>}.

Gravação do conteúdo do combo-box


 Cadastro simples - após dispatch da local-assign-record
- assign <tabela>.<campo> = {XXINC/I99XX999.I 06 <variável-combo-box>}.
 Cadastro Complexo - após o dispatch da local-assign-statement
- assign input frame {&frame-name} <variável-combo-box> <tabela>.<campo> =
{XXINC/I99XX999.I 06 <variável-combo-box>}.

Obs: se não fizer parte da chave primária: local-assign-record. Chave: local-create-record.

Campos indicadores com view-as radio-set nas telas


 Definir as variáveis c-lista e i-cont.
 Local-initialize - antes dispatch: lógica que prepara o "list-items".
do i-cont = 1 to num-entries({XXINC/I99XX999.I 03}):
assign c-lista = c-lista + entry(i,{XXINC/I99XX999.I 03}) + "," + string(i-cont) + ",".
end.
assign c-lista = substring(c-lista,1,lenght(c-lista) - 1).
assign <variavel-radio-set>:radio-buttons in frame {&frame-name} = c-lista.
 Consulta: mostrar apenas a descrição. var:screen-value in frame = {XXINC/I99XX999.I 04
<tabela-campo>}.

Campos indicadores num SmartBrowser


 Campo calculado  entry(valor,"lista") @ c-tipo
 assign c-lista-tipo = {adind/i02ad049.i 03}
Onde: {3}  lista itens separados por tipo.
 Entry(conta.tipo, c-lista-tipo) @ c-tipo

Mensagens para o usuário

 Chamar o programa utp/ut-cdmsg.p e criar a mensagem (para específicos).


 Mostrar a mensagem: run utp/ut-msgs.p (input "show") OU
utp/ut-msgs.p (input "msg", ou help) e dar o display.
input 1234,
input "").

Tooltip em um determinado botão


 Botão deve possuir help: include padrão alterada para copiar o help

Acompanhamento (UT-ACOMP)
run utp/ut-acomp.p persistent set h-prog.
run pi-inicializar in h-prog(input "Importando arquivos").
run pi-acompanhar in h-prog(input string(item.it-codigo)).
run pi-finalizar in h-prog.

Campos de referência para campos chave estrangeira


Obs: campo de referencia é a descrição. Ex: nome do emitente no cadastro de nota fiscal.
 Criar fill-in ao lado do campo com zoom.
 local-display-fields, antes do dispatch: valor inicial para o campo (find na tabela).
 Gatilho de leave do campo com zoom:
{include/leave.i &tabela=state
&atributo-ref=state-name
&variavel-ref=c-state-name
&where="state.state = input frame {&frame-name} customer.state"}
<tabela>: tabela que possui a chave estrangeira;
<atributo-ref>: campo de referência da tabela da chave estrangeira;
<variavel-ref>: variável criada para receber o campo de referência;
<where>: cláusula where para localizar o registro na tabela de referência;

Zoom
A partir de:
 Campo chave estrangeira;
 Variável;
 Campo chave estrangeira cujo nome não coincide com o nome do campo no browse de pesquisa
Sintaxe:
{include/zoomvar.i &prog-zoom=diretório/programa
&campo=variavel/tabela.atributo
&campozoom=nome-atributo
[&frame=nome-frame]
[&browse=nome-browse]
[&parametros="run pi-procedure in wh-pesquisa".]}
Onde:
<prog-zoom>: programa de zoom
<campo>: campo/variável na viewer. Formato tabela.campo
<campozoom>:campo do zoom de onde o valor é buscado. Sem informar tabela.
<frame>: quando o frame é diferente de {&frame-name}
<browse>: zoom é acionado a partir de uma coluna de um browse
<parâmetros>: procedure do zoom, que recebe os parâmetros.

Chamada de zoom com passagem de parâmetros:


 No programa de zoom: procedure que recebe e trata (parâmetro input).
Chama pi-seta-inicial nos browser, repassando o param
 Nos browsers, cria a pi-seta-inicial e usa a variavel para abertura da query

 Zoom chamado  Executa o conteúdo &parâmetros  chama pi-seta-inicial (passando um valor


de sistema  Procedure Envia para o browse  recebe o valor e atribui à variável de filtro utilizada
para abrir a query.
 Alterar o ponteiro do mouse para todos os campos.

thinZoom
{method/ZoomFields.i &ProgramZoom="nome do programa"
&FieldZoomN="nome do campo que retorna"
&FieldScreenN="nome do campo ou variável"
&FrameN="frame"
&RunMethod="run procedure in hProgramZoom"
&EnableImplant="yes/no"}
Onde:
<FieldZoomN>: nome do campo que deve ser
<FieldScreenN>: nome do campo (variável) que deve receber o valor
<EnabledImplant>: botão Implantar será habilitado ou não;

Implementar Botão de Filtro em Zoom


 Se precisar reabrir as querys do browse  choose do botão: RUN notify IN this-procedure

Reposicionamento Automático do Browser de Zoom


 Somente nas variáveis inicial com tipo de dado caracter ou inteiro.
 Criar gatilho de evento ANY-KEY na variável inicial, com a include i-anykey. Preprocessador
&variável nome da variável inicial de faixa:
 Gatilho p ara o evento TAB: i-tab.i. Preprocessador &variavel
 Gatilho para o evento BACK-TAB: i-tab.i &variavel

Como utilizar "functions" no UIB


Desde o início da utilização da versão 8.2 do Progress, foi possível notar uma nova section no UIB. A
section functions veio para facilitar a implementação de rotinas de cálculo que antes eram confusas
de serem utilizadas e esta técnica deve demonstrar este recurso.
Implementação
ao entrar em section functions do UIB, é questionado o nome da nova função e o tipo de dado que é
retornado por ela. Para nome da função foi determinado que é utilizado o seguinte padrão:
fn-"nome que qualifica a função". Quanto ao retorno da função, deve ser colocado o tipo de dado
que a função retorna no final de sua execução. Exemplo:

Depois de ter criado a função, deve ser declarado os valores a serem transferidos para ela,
conforme exemplo abaixo. Para que a função retorne o valor calculado por ela, devem ser retiradas
as "" do comando RETURN e acrescentado no seu lugar o nome da variável que possui o valor a ser
retornado para quem chamou a função.
Exemplo
RETURNS DECIMAL
(input de-valor as decimal):  valor transferido
/*------------------------------------------------------------
Purpose:
Notes:
-------------------------------------------------------------*/
assign de-valor = (de valor + 1000).  lógica da função
Return de-valor.  valor retornado da função
END FUNCTION.
Esta função é muito útil para os campos calculados de browsers. Antes era necessário utilizar ON-
FIND TABELA no MAIN-BLOCK do programa para calcular o valor de um campo que possuía uma
lógica mais complexa (Exemplo: pesquisa em outras tabelas). Agora basta seguir a seguinte
sintaxe: fn-nome da função (valor a ser transferido) na expressão de um calculated field para
utilizar uma função e atribuir o valor retornado a uma outra variável do browser. Exemplo:

Neste exemplo, temos que a função "fn-valor" está sendo acionada utilizando o valor do campo
banco.vl-lim-aplic. Conforme a expressão do calculated field, o valor retornado da função é
mostrado na variável de soma-aplic do browser.
Observação Recomenda-se que não sejam utilizadas temp-tables. Na versão 8.2A do Progress, a
utilização de tabelas temporárias dentro de funções está causando SYSTEM ERROR (130).

Como construir um browse com ordenação por coluna


Objetivo
Esta técnica deve ser usada sempre que for preciso construir um browse que terá ordenação por
coluna.
Implementação
criar um browse e definir todos os campos que serão utilizados para ordenação com a propriedade
enable marcada;

inicializar o atributo READ-ONLY de todos os campos que serão utilizados para ordenação como YES:
ASSIGN Customer.Name:READ-ONLY IN BROWSE {&BROWSE-NAME} = TRUE
Customer.City:READ-ONLY IN BROWSE {&BROWSE-NAME} = TRUE.
marcar o atributo column-searching do browse;

na trigger START-SEARCH do browse inserir o seguinte:


DEFINE VARIABLE columnHandle AS HANDLE NO-UNDO.

ASSIGN columnHandle = {&BROWSE-NAME}:CURRENT-COLUMN.


APPLY 'END-SEARCH' TO {&BROWSE-NAME}.

CASE columnHandle:NAME:
WHEN 'Name' THEN
OPEN QUERY {&BROWSE-NAME}
FOR EACH Customer NO-LOCK BY Customer.Name.
WHEN 'City' THEN
OPEN QUERY {&BROWSE-NAME}
FOR EACH Customer NO-LOCK BY Customer.City.
END CASE.

Como contar a quantidade de registros numa tabela


Objetivo
Esta técnica deve ser utilizada quando for necessário contar a quantidade de registros numa tabela,
usando uma condição (cláusula WHERE) ou não.
Implementação
Primeiramente define-se a variável que receberá a quantidades de registros. Depois a técnica de
mini-flexibilização para o tipo de banco de dados é usada para separar o código para banco
PROGRESS do código para banco ORACLE ou SQL Server, acessado através do DataServer.
Para banco PROGRESS o comando é:
SELECT COUNT(*) INTO <var> FROM <tabela>
WHERE <condição>.
Exemplo
Para os outros bancos use o include “include/i-count.p”, descrito no item I-COUNTDS.I do cap. 6
deste manual.
{include/i_dbtype.i}
DEFINE VARIABLE iCount AS INTEGER NO-UNDO.
&IF "{&mgadm_dbtype}" = "progress" &THEN
SELECT COUNT(*) INTO iCount FROM cheque-pend
WHERE cod-banco > 20.
&ELSE
{include/i-countds.i &BANCO=mgadm
&TABELA="cheque-pend"
&COND="where cod-banco > 20"
&DEST=iCount}
&ENDIF
Objetivo

Objetivo
Utilizando ZOOM na página de digitação
Está técnica tem como objetivo fazer algumas adptações no zoom na página de digitação.
Ao utilizar ZOOM nos campos de um browser de digitação deveremos fazer algumas alterações na
trigger do botão inserir, antes e após a execução do método INSERT-ROW.
Editar o botão inserir e acrescentar os seguintes pontos em comentário abaixo ao código do
programa.

ON CHOOSE OF bt-inserir IN FRAME f-pg-dig /* Inserir */


DO:
assign bt-alterar:SENSITIVE in frame f-pg-dig = yes
bt-retirar:SENSITIVE in frame f-pg-dig = yes
bt-salvar:SENSITIVE in frame f-pg-dig = yes.

if num-results("br-digita") > 0 then


DO:

/*Criado pela Técnica Zoom na pagina de digitação*/


APPLY "ROW-LEAVE" TO br-digita IN FRAME f-pg-dig.

br-digita:INSERT-ROW("after") in frame f-pg-dig.

/*Criado pela Técnica Zoom na pagina de digitação*/


DEFINE VAR hColuna AS WIDGET-HANDLE NO-UNDO.
ASSIGN hColuna = br-digita:GET-BROWSE-COLUMN(2).
hColuna:EDIT-CLEAR().
ASSIGN hColuna = br-digita:GET-BROWSE-COLUMN(1).
hColuna:EDIT-CLEAR().
/*Criado pela Técnica Zoom na pagina de digitação*/

END.
else do transaction:
create tt-digita.
open query br-digita for each tt-digita.
apply "entry" to tt-digita.cdn_cargo in browse br-digita.
end.
END.

Observação No evento do ROW-LEAVE é executado o CREATE-RESULT-LIST, que é um método do


browse responsavel por sincronizar os dados do browse com a query. Com isso os dados das linhas
anteriores não serão perdidos no momento da exclusão da linha atual.
No método edit-clear obtermos o handle da coluna, para que o valor da segunda coluna não se
repita na nova linha.

Vous aimerez peut-être aussi