Curso de Progress
- Usando DDK + UPC
1|Página
Copyright 2011
ALX Consultoria e Treinamentos
–
Todos os direitos reservados para o autor desta obra.
Toda ou qualquer parte desta publicação não poderá ser reproduzida ou transmitida por qualquer meio, seja este eletrônico, mecânico, mecânico, de fotocópia, de gravação ou outros sem prévia autorização.
Progress, Appbuilder, Openedge são Marcas Registradas da Progress – Software Corporation EUA Datasul EMS é Marca Registrada da Totvs Corporation Algumas partes deste Tutorial foram retiradas do tutorial Dominando o Progress escrito por Marcio Brener Costa
Curso de Progress
- Usando DDK + UPC
2|Página
INDICE DDK Templates ............................................. .................................................................... ............................................. ........................ ..4 Instalando a DDK ....................................................... .............................................................................. .................................... ............. 4 Como construir Tela de Vá Para ........................................... .................................................................. .......................... ... 10 Como construir Tela de Pesquisa ....................... ............................................. ............................................. ....................... 11 Como construir CustomBrowserZoomWizard CustomBrowserZoomWizard ............................................. .................................................... ....... 12 Como construir Tela de Cadastro .......................................... ................................................................. .......................... ... 14 Como construir Viewer .............................. .................................................... ............................................. .............................. ....... 15 Como construir Query ................................... ......................................................... ............................................. .......................... ... 16 Como construir Tela de Consulta ....................... ............................................. ............................................. ....................... 16 Como construir Tela Pai x Filho – Atualiza Filho ......................... ................................................ ....................... 18 Como construir CustomBrowser Inclui/Modifica Inclui/Modifica ............................................. ................................................ ... 20 Como construir Cadastro Inclui/Modifica Inclui/Modifica Filho ........................... .................................................. ....................... 22
Desenvolvendo UPCs ............................................ ................................................................... ..................................... ..............25 25 Como cadastrar uma UPC no EMS ............................................ .................................................................. ...................... 25 Entendendo Entendendo pontos de Criação ............................................. .................................................................... .......................... ... 27 Como construir UPC Criação de Campos ............................................ .......................................................... .............. 28 Como construir UPC Criação de Campos/Botões Campos/Botões ............................ ............................................... ................... 30 Como construir UPC Criação de Extensão de Tabela .......................................... .......................................... 32 Como construir UPC com outros tipos de campos ...................................... ............................................. ....... 34
Curso de Progress
- Usando DDK + UPC
3|Página
DDK TEMPLATES Instalando a DDK Clique no ícone SETUP.EXE que se encontra na pasta de instalação da DDK e siga as instruções na tela.
Curso de Progress
- Usando DDK + UPC
4|Página
Curso de Progress
- Usando DDK + UPC
5|Página
Após a instalação dos arquivos em seus diretórios, devem ser feitos alguns ajustes: Abrir o arquivo de inicialização do Progress, progress.ini e alterar o propath para que passe a chamar o diretório de templates logo após o diretório do produto como exemplo na figura abaixo: Conforme o exemplo deve-se garantir que outros dois diretórios estejam registrados, o \gui e o \src, nesta ordem, colocar abaixo do diretório ddk o diretório onde está instalado o seu produto EMS ou HR.
Curso de Progress
- Usando DDK + UPC
6|Página
Configurar arquivos de bibliotecas .pl IMPORTANTE: DESABILITAR ANTIVIRUS ANTES DE EXECUTAR ESTE PROCEDIMENTO
Os templates DDK GUI fazem uso de alguns arquivos específicos do Progress que se encontram dentro de bibliotecas (arquivos.pl). Deve-se executar os passos descritos abaixo, extraindo o conteúdo dessas bibliotecas. Abra o prompt de comando e vá até o diretório de instalação do Progress No diretório c:\OpenEdge\Progress executar set path= c:\OpenEdge\Progress \bin;%path set dlc= c:\OpenEdge\Progress
No diretório c:\OpenEdge\Progress \src executar extractpl
.pl ,onde é o nome do arquivo .pl. O extractpl deve ser executado para cada arquivo .pl.
Curso de Progress
- Usando DDK + UPC
7|Página
Configurar o AppBuilder para trabalhar com os templates Acessar o AppBuilder utilizando este .ini alterado no item 2.1; Acessar o menu da Palette e optar por use-custom; Selecionar os arquivos *.cst do diretório de instalação dos templates: Para DDK GUI selecione os arquivos progress.cst, smart.cst, thintemplates.cst e dbo.cst; Acessar options no menu e optar por save palette.
Curso de Progress
- Usando DDK + UPC
8|Página
Curso de Progress
- Usando DDK + UPC
9|Página
Como construir Tela de Vá Para Est o Ut za o
Nome F s co
Dialog VaPara
Masters/d-vapara.w
Importante: Verifique também as instruções apresentadas pela template que pode conter informações adicionais.
em New, selecionar o template acima;
escolher a tabela que o programa deverá consultar;
Curso de Progress
- Usando DDK + UPC
10 | P á g i n a
Escolher os campos que devem existir na tela do Vá para:
Ajustar os campos na tela;
salvar o SmartDialog com o nome definido para o programa "Vá Para".
Observação: O template irá gerar automaticamente a TRIGGER GO da janela que faz todo o tratamento necessário para o programa Sugestão: Para que os campos sejam exibidos no tamanho adequado (altura 0.88) você deve alterar as seguintes propriedades: 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.
Como construir Tela de Pesquisa Importante: Verifique também as instruções apresentadas pela template que pode conter informações adicionais.
Est o ut za o
Nome F s co
W n ow Pesqu sa
Masters w-pesqui.w
selecionar o estilo relacionado na tabela acima; é necessário utilizar um SmartBrowser para cada classificação do programa de Pesquisa, onde a ordem das colunas no browser deve ser a ordem de classificação, para todos os SmartBrowsers que devem estar colocados no programa de Pesquisa, seguir os seguintes passos: verificar se já existe um SmartBrowser com os dados necessários para a pesquisa e se eles devem estar na mesma ordem da classificação desejada. Caso não exista, criar um novo utilizando o estilo CustomBrowserZoom Wizard; instanciar o SmartBrowser no SmartFolder;
Curso de Progress
- Usando DDK + UPC
11 | P á g i n a
criar um SmartLink do tipo STATE, tendo como Source o SmartBrowser recém instanciado e como Target, THIS-PROCEDURE; recomenda-se que cada SmartBrowser das diferentes páginas do SmartFolder tenha o mesmo tamanho; redimensionar o SmartFolder e a SmartWindow de acordo com os objetos nela instanciados;
alterar os labels das páginas dos folders através do Instance Atributes;
salvar a SmartWindow com o nome definido para o programa pesquisa. Source _ rowse _ o
er
L n Type STATE
Target THIS-PROCEDURE
PATE
THIS-PROCEDURE
Como construir um CustomBrowser Zoom Wizard
Est o Ut za o Nome F s co Custom Browser Zoom W zar Masters w rwzoo.w selecionar o estilo relacionado na tabela acima; seguir os passos do Wizard observando que o browse deve exibir apenas os registros que estejam entre os limites estabelecidos pelo usuário para isso na definição da query do browse, deve-se obedecer aos seguintes itens: na página where, deve-se entrar com a seguinte condição: . >= fi-ini- and . <= fi-fin-
Curso de Progress
- Usando DDK + UPC
12 | P á g i n a
Onde: .: é o campo da tabela ao qual deseja-se estabelecer limites, e, fi-ini-campo e fi-fin-campo são os fill-ins que o usuário irá entrar com a faixa de valores
Obs.: A condição pode obedecer a valores de mais campos bastando adicioná-la. Exemplo: . >= . >= . >= . >=
fi-ini- and fi-ini- and fi-ini- and fi-ini- ...
depois de concluída a definição do browse, o nome, tipo, formato e tamanho dos fill-in´s para faixa de valores devem ser alterados de modo que se tornem compatíveis com os campos utilizados na condição anterior. na trigger do botão bt-confirma, as ocorrências dadas por c-inicial e c-final devem ser alteradas para fi-ini-campo e fi-fin-campo respectivamente. Exemplo: assign input frame {&frame-name} c-inicial c-final. Para: assign input frame {&frame-name} fi-ini-cust-num fi-fin-cust-num.
salvar o browse seguindo as normas de nomenclatura.
Curso de Progress
- Usando DDK + UPC
13 | P á g i n a
Como construir Tela de Cadastro Est o Usa o Cadastro Simples
Nome F s co Masters/w-cadsim.w
Importante: Verifique também as instruções apresentadas pela template que pode conter informações adicionais.
em Arquivo | Novo, selecionar um dos estilos relacionados acima, de acordo com o tipo de Cadastro Simples que se deseja construir;
verificar se já existe uma SmartQuery para a tabela que se deseja construir um Cadastro Simples. Caso não exista, criar uma nova utilizando o estilo CustomQuery Wizard; instanciar a SmartQuery na página 0 da Window Cadastro Simples e aceitar as sugestões de SmartLinks do Wizard; verificar se já existe um programa de vá para e um programa de pesquisa para a tabela que se deseja construir um Cadastro Simples. Caso não existam, eles devem ser criados; acessar os atributos de instância da SmartQuery e informar no atributo "Programa Pesquisa" o nome do programa de pesquisa da tabela e no atributo "Programa Vá para" o nome do programa de Vá para da tabela;
criar um SmartLink do tipo STATE, tendo como Source: p-navega e como Target: SmartQuery; criar um SmartLink do tipo STATE, tendo Source: p-exihel e como Target: SmartQuery; verificar se já existe uma SmartViewer com os atributos da tabela que devem ser editados. Caso não exista, criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field;
Curso de Progress
- Usando DDK + UPC
14 | P á g i n a
instanciar a SmartViewer na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard; redimensionar a SmartWindow de acordo com os objetivos que foram colocados nela. Ter o cuidado para que a SmartViewer fique centralizada na SmartWindow; salvar a SmartWindow com o nome definido para o Cadastro Simples;
Lista de Links: Source _p-ca s m _p-ca s m h_p-navega _p-navega _query _p-ex e
L n Type STATE TABLEIO NAVIGATION STATE RECORD STATE
target _p-exi e _viewer h_query _query _viewer _query
Como construir viewers Est o Ut za o Custom Viewer com AutoField
Nome F s co Masters/vieweraf.w
em Arquivo | Novo, selecionar o estilo citado acima; de acordo com os objetos a serem instanciados na viewer, seguir a técnica correspondente:
Padrão;
Sem campos de tabela;
Só com campos chave;
na dialog que se abrirá logo após a seleção do template, selecionar a(s) tabela(s) a serem utilizadas na viewer; na janela após a seleção da(s) tabela(s), selecionar os campos a serem utilizados; a seguir pode ou não ser apresentada uma mensagem questionando se a viewer deve suportar chaves estrangeiras, caso aconteça, clicar em Cancel; se a viewer for utilizada em um cadastro do tipo simples, no início da procedure local-assign-records é necessário substituir a linha contendo: {include/i-valid.i}
por estas a seguir: if not frame {&frame-name}:validate() then return 'ADM-ERROR':U.
Curso de Progress
- Usando DDK + UPC
15 | P á g i n a
Como construir uma Query
Est o Ut za o Nome F s co Custom Query Wizard Masters/wquery.w em Arquivo | Novo, selecionar o estilo relacionado acima;
seguir os passos indicados pelo Wizard atentando para que, se a viewer não contiver cláusula where, em query definitions seja assinalado o toggle box Index Reposition;
Como construir Tela de Consulta Est o Ut za o W n ow Consu ta S mp es
Nome F s co Masters w-consim.w
Importante: Verifique também as instruções apresentadas pela template que pode conter informações adicionais.
em Arquivo | Novo, selecionar o estilo relacionado acima;
Curso de Progress
- Usando DDK + UPC
16 | P á g i n a
verificar se já existe uma SmartQuery para a tabela que se deseja construir a Consulta Simples. Caso não exista, criar uma nova utilizando o estilo CustomQuery Wizard; instanciar a SmartQuery na página 0 da Window Consulta Simples e aceitar as sugestões de SmartLinks do Wizard; verificar se já existe um programa de vá para e um programa de pesquisa para a tabela que se deseja construir a Consulta Simples. Caso não existam, eles devem ser criados; acessar os atributos de instância da SmartQuery e informar no atributo "Programa Pesquisa" o nome do programa de pesquisa da tabela e no atributo "Programa Vá para" o nome do programa de Vá para da tabela;
criar um SmartLink do tipo STATE, tendo como Source: p-navega e como Target: SmartQuery; criar um SmartLink do tipo STATE, tendo como Source: p-exihel e como Target: SmartQuery; verificar se já existe uma SmartViewer com os atributos da tabela que devem ser editados. Caso não exista, criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field; instanciar a SmartViewer na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard; redimensionar a altura da SmartWindow de acordo com os objetos que foram colocados nela. Ter o cuidado para que a SmartViewer fique centralizada na SmartWindow; salvar a SmartWindow com o nome definido para o Cadastro Simples;
Lista de Links Source _p-navega _p-navega _query h_p-exihel
L n Type NAVIGATION STATE RECORD STATE
Curso de Progress
Target _query _query _viewer h_query
- Usando DDK + UPC
17 | P á g i n a
Como construir Tela Pai x Filho Atualiza Filho Est o Ut za o Window Cadastro Pai x Filho - Filho
Nome F s co Masters/w-adf.w
Importante: Verifique também as instruções apresentadas pela template que pode conter informações adicionais.
selecionar o estilo relacionado na tabela acima;
verificar se já existe uma SmartQuery para a tabela pai. Caso não exista, criar uma nova utilizando o estilo CustomQuery Wizard; instanciar a SmartQuery na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard; verificar se já existe um programa de "Vá para" e um programa de pesquisa para a tabela pai. Caso não existam, eles devem ser criados; acessar os atributos de instância da SmartQuery e informar no atributo "Programa Pesquisa" o nome do programa de pesquisa da tabela pai e no atributo "Programa VáPara" o nome do programa de Vá Para da tabela pai;
criar um SmartLink do tipo Target: SmartQuery;
STATE, tendo como Source: p-navega e como
criar um SmartLink do tipo STATE, tendo como Source: p-exihel e como Target: SmartQuery; verificar se já existe uma SmartViewer com os atributos da tabela pai que devem estar expostos na página 0 da SmartWindow, ou seja, acima do folder. Caso não exista, criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field, na Pergunta sobre foreign Keys clicar em OK; instanciar a SmartViewer na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard;
Curso de Progress
- Usando DDK + UPC
18 | P á g i n a
alterar ou excluilr os labels das páginas dos folders através do Instance Atributes; verificar se já existe um SmartBrowser para a tabela filho. Caso não exista, criar um novo utilizando o estilo CustomBrowser Inclui/Modifica; colocar o SmartBrowser na página correspondente do folder, aceitando os links indicados pelo Wizard;
acessar os atributos de instância do SmartBrowser e informar o nome do programa de atualização da tabela filha. Se este programa não existir, deve ser criado utilizando-se o template Cadastro Inclui/Modifica Filho;
Curso de Progress
- Usando DDK + UPC
19 | P á g i n a
criar um SmartLink de Record, tendo como Source: SmartQuery e como Target: SmartBrowser recém instanciado no folder; salvar a SmartWindow com o nome definido para o Cadastro Pai x Filho.
Lista de Links Source _ o er _p-ex e h_p-navega _p-navega _query _query h_p-exihel
Link Type PAGE STATE NAVIGATION STATE RECORD RECORD STATE
Target THIS-PROCEDURE THIS-PROCEDURE h_query _query _viewer _ rowser1 h_query
Como construir um CustomBrowser Inclui/Modifica Est o Ut za o Nome F s co Window Inclui/Modifica Pai Master/w-incmdp.w
selecionar o estilo relacionado na tabela acima;
seguir os passos do Wizard, observando que:
deve-se indicar uma tabela externa, essa tabela deve ser a mesma tabela utilizada na query do Cadastro PaiXFilho em que o browser deve ser utilizado;
Curso de Progress
- Usando DDK + UPC
20 | P á g i n a
a query deve conter a tabela dos registros filhos que irão ser exibidos no Cadastro PaiXFilho. Exemplo de query do browser:
toggle-box "Indexed-Reposition" deve ser marcado; em "Options", a coluna "Returned" do browse, deve conter o valor "Fields Used" e o toggle-box "Sort-ByPhrase" deve ser marcado;
Curso de Progress
- Usando DDK + UPC
21 | P á g i n a
após a criação do browse com a ajuda do Wizard, salvar o browse de acordo com as normas de nomenclatura.
Como construir um Cadastro Inclui/Modifica Filho Est o Ut za o Nome F s co W n ow Inc u Mo ca F o Master w-incmo3.w selecionar o estilo relacionado na tabela acima;
se os campos a serem inclusos/modificados couberem em uma única viewer, o cadastro deve ser do tipo Simples, devendo-se eliminar o folder da SmartWindow.
verificar se já existem uma SmartQuery para a tabela que se deseja construir o Cadastro Inclui/Modifica Filho. Caso não exista, criar uma nova utilizando o estilo CustomQuery Wizard, na pergunta sobre foreign Keys clicar no CANCEL; instanciar a SmartQuery na página 0 (zero) da Window; verificar se já existe uma SmartViewer com os atributos da tabela a serem editados. Caso não exista, criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field;
Observação Para os campos do tipo fill- in’s, deve ser observado se o mesmo possue tri gger de "LEAVE"/"VALUE-CHANGED".
instanciar a SmartViewer na SmartWindow ou na página correspondente do folder no caso de um cadastro complexo, e aceitar as sugestões de SmartLinks do Wizard; criar um SmartLink de TABLEIO, tendo como Source: THIS-PROCEDURE e como Target: SmartViewer recém instanciada;
na Local-Initialize da window, devem ser substituídas as ocorrências de "", pelo nome da viewer que contém o(s) campo(s) chave(s) da tabela. Exemplo: run pi-atualiza-parent in h_v06pd001 (input v-row-parent). Curso de Progress
- Usando DDK + UPC
22 | P á g i n a
nas triggers de Choose dos botões de 'Ok' e 'Salvar', substituir as ocorrências de "" pelo handle da viewer que contém o campo chave da tabela; Exemplo: {include/okfil.i h_v06pd001}
na procedure pi-reposiciona da window, substituir a ocorrência "" pelo nome da query utilizada no cadastro; Exemplo: RUN pi-reposiciona-query IN h-q06pd001 (input v-row-table).
na SmartViewer que possuir a chave da tabela, deve ser criada uma localcreate-record e após o run dispatch deve ser inserida a seguinte lógica: find where rowid () = v-row-parent no-lock no-error. if available then do: assign . = .. end.
Onde: : deve ser substituído pelo nome da tabela pai da tabela que se esta utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query do Cadastro PaiXFilho que deve chamar este programa : deve ser substituído pelo nome da tabela que deve estar sendo utilizada no cadastro : deve ser substituído pelo nome do campo chave da tabela pai que estabelece relacionamento com a tabela que deve estar sendo utilizada no cadastro /* Code placed here will execute PRIOR to standard behavior. */ /* Dispatch standard ADM method. RUN dispatch IN THIS-PROCEDURE ( INPUT 'create-record':U ). /* Code placed here will execute AFTER standard behavior. find order where rowid ( order ) = v-row-parent no-error. if available order then assign order-line.order-num =
*/
order.order-num.
Se desejar preencher automaticamente os campos chave da tabela pai na viewer para inclusão:
Na SmartViewer que possuir a chave da tabela, deve ser criada uma localadd-record, e após o run dispatch deve ser inserida a seguinte lógica: def buffer for . find where rowid() = v-row-parent no-lock no-error. if avail then assign .:screen-value in frame {&frame-name} = string(.). else assign .:screen-value in frame {&frame- name} = “”.
Curso de Progress
- Usando DDK + UPC
23 | P á g i n a
Onde: : deve ser substituído pelo nome que se deseja dar ao buffer da tabela pai. : deve ser substituído pelo nome da tabela pai da tabela que se está utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query do Cadastro PaiXFilho que deve chamar este programa. : deve ser substituído pelo nome da tabela que está sendo utilizada no cadastro. : deve ser substituído pelo nome do campo chave da tabela pai que estabelece relacionamento com a tabela que deve estar sendo utilizada no cadastro. /* Code placed here will execute PRIOR to standard behavior. */ /* Dispatch standard ADM method. */ RUN dispatch IN THIS-PROCEDURE (INPUT 'add-record':U ). /* Code placed here will execute AFTER standard behavior.
*/
def buffer b-customer for customer . find b-customer where rowid( b-customer ) = v-row-parent no-lock no-error. if avail b-customer then assign order.cust-num:screen-value in frame {&frame-name} = string( bcustomer.cust-num ). else assign order.cust-num:screen-value in frame {&frame-name} = "".
Nas propriedades do campo chave da tela, desmarcar o check enable para que o campo fique desabilitado e seja preenchido automaticamente:
Lista de Links (Uma Viewer): Source THIS-PROCEDURE _query
Curso de Progress
Link Type TABLEIO RECORD
Target _viewer _viewer
- Usando DDK + UPC
24 | P á g i n a
DESENVOLVENDO UPCS Como cadastrar uma UPC no EMS Crie um arquivo usando o editor no diretório de treinamento com o seguinte conteúdo e salve o arquivo: /* Definição dos Parametros Padrão */
DEFINE INPUT PARAMETER p-ind-event AS CHARACTER NO-UNDO. /* Evendo do programa Datasul */ DEFINE INPUT PARAMETER p-ind-object AS CHARACTER NO-UNDO. /* Objeto */ DEFINE INPUT PARAMETER p-wgh-object AS HANDLE NO-UNDO. /* Widget do Objeto */ DEFINE INPUT PARAMETER p-wgh-frame AS WIDGET-HANDLE NO-UNDO. /* Frame do Objeto */ DEFINE INPUT PARAMETER p-cod-table AS CHARACTER NO-UNDO. /* Nome da Tabela */ DEFINE INPUT PARAMETER p-row-table AS ROWID NO-UNDO. /* Rowid da Tabela */ MESSAGE "Estou na UPC" VIEW-AS ALERT-BOX. No Datasul EMS abra no módulo de Tecnologia, Menu, o programa Manutenção de Programa – MEN012AA e localize através do programa de pesquisa ou va-para, por exemplo o programa CD0181 – Manutenção de País
Curso de Progress
- Usando DDK + UPC
25 | P á g i n a
Clique no botão alteração e vá até o campo Programa UPC, neste campo insira o caminho completo da UPC criada a funcionar com o programa (ver exemplo na figura abaixo).
Vamos testar se a UPC foi realmente cadastrada, abra o programa CD0181 – Manutenção de Pais, se tudo estiver correto receberemos varias mensagens conforme a figura abaixo.
Curso de Progress
- Usando DDK + UPC
26 | P á g i n a
Entendendo pontos de Criação Crie um arquivo com as linhas de comando abaixo e cadastre-a no programa CD0181 e execute o programa. /* Definição dos Parametros Padrão */ DEFINE INPUT PARAMETER p-ind-event AS CHARACTER NO-UNDO. /* Evendo do programa Datasul */ DEFINE INPUT PARAMETER p-ind-object AS CHARACTER NO-UNDO. /* Objeto */ DEFINE INPUT PARAMETER p-wgh-object AS HANDLE NO-UNDO. /* Widget do Objeto */ DEFINE INPUT PARAMETER p-wgh-frame AS WIDGET-HANDLE NO-UNDO. /* Frame do Objeto */ DEFINE INPUT PARAMETER p-cod-table AS CHARACTER NO-UNDO. /* Nome da Tabela */ DEFINE INPUT PARAMETER p-row-table AS ROWID NO-UNDO. /* Rowid da Tabela */ RUN pi-exibe-param. /* Mostra tempo de execução os pontos usando a procedure pi-exibe-param */ /* Procedure para demonstrar em tempo de execução do programa os pontos de criação */ PROCEDURE pi-exibe-param: MESSAGE "Evento........: " p-ind-event SKIP "Objeto........: " p-ind-object SKIP "Handle Objeto.: " p-wgh-object SKIP "Frame.........: " p-wgh-frame:NAME SKIP "Tabela........: " p-cod-table SKIP "Rowid.........: " STRING(p-row-table) SKIP VIEW-AS ALERT-BOX INFO BUTTONS OK. END PROCEDURE.
Curso de Progress
- Usando DDK + UPC
27 | P á g i n a
Ao executar o programa com a UPC acima varias mensagens serão apresentadas, estes são os pontos de criação de códigos para as upcs com estes dados podemos criar um código baseado geralmente no Evento e Objeto, são nestes pontos que tratamos campos, criamos campos, botões, salvamos dados, excluímos, enfim o funcionamento da upc depende do uso correto do ponto, cada ação do programa corresponde a um ponto diferente.
Como construir uma UPC Criação de Campos Crie um arquivo com as linhas de comando abaixo e cadastre-a no programa CD0181 e execute o programa. /* Definição dos Parametros Padrão */ DEFINE INPUT PARAMETER p-ind-event AS CHARACTER NO-UNDO. /* Evendo do programa Datasul */ DEFINE INPUT PARAMETER p-ind-object AS CHARACTER NO-UNDO. /* Objeto */ DEFINE INPUT PARAMETER p-wgh-object AS HANDLE NO-UNDO. /* Widget do Objeto */ DEFINE INPUT PARAMETER p-wgh-frame AS WIDGET-HANDLE NO-UNDO. /* Frame do Objeto */ DEFINE INPUT PARAMETER p-cod-table AS CHARACTER NO-UNDO. /* Nome da Tabela */
Curso de Progress
- Usando DDK + UPC
28 | P á g i n a
DEFINE INPUT PARAMETER p-row-table AS ROWID NO-UNDO.
/* Rowid da Tabela */
/* Definição de variaveis de fill-in botoes etc... */ DEFINE NEW GLOBAL SHARED VAR wh-tx-lingua AS WIDGET-HANDLE NO-UNDO. DEFINE NEW GLOBAL SHARED VAR wh-f-lingua AS WIDGET-HANDLE NO-UNDO. IF p-ind-event = "BEFORE-DISPLAY" AND p-ind-object = "VIEWER" THEN DO: /* Cria Texto para usar de Label no campo */ CREATE TEXT wh-tx-lingua ASSIGN FRAME = p-wgh-frame FORMAT = "x(7)" WIDTH =7 SCREEN-VALUE = "Lingua :" ROW = 5.55 COL = 55.5 VISIBLE = YES. /* Cria campo do tipo Fill-in */ CREATE FILL-IN wh-f-lingua ASSIGN FRAME = p-wgh-frame NAME = "Campo" DATA-TYPE = "character" FORMAT = "X(10)" WIDTH = 15 HEIGHT = 0.88 ROW = 5.4 COL = 61 VISIBLE = YES SENSITIVE = NO. END. /* habilita campo wh-f-lingua */ ELSE IF p-ind-event = "AFTER-ENABLE" AND p-ind-object = "VIEWER" THEN DO: ASSIGN wh-f-lingua:SENSITIVE = YES. END. /* desabilita campo wh-f-lingua */ ELSE IF p-ind-event = "AFTER-DISABLE" AND p-ind-object = "VIEWER" THEN DO: ASSIGN wh-f-lingua:SENSITIVE = NO. END.
Observem que o campo criado estará disponível na Tela.
Curso de Progress
- Usando DDK + UPC
29 | P á g i n a
Como construir uma UPC Criação de Campos/Botão Crie um arquivo com as linhas de comando abaixo, esta upc sera usada para ser executada a partir do botão criado na upc principal. MESSAGE "Estou executando o Botao NOVO" VIEW-AS ALERT-BOX.
Crie um arquivo com as linhas de comando abaixo e cadastre-a no programa CD0181 e execute o programa. /* Definição dos Parametros Padrão */ DEFINE INPUT PARAMETER p-ind-event AS CHARACTER NO-UNDO. /* Evendo do programa Datasul */ DEFINE INPUT PARAMETER p-ind-object AS CHARACTER NO-UNDO. /* Objeto */ DEFINE INPUT PARAMETER p-wgh-object AS HANDLE NO-UNDO. /* Widget do Objeto */ DEFINE INPUT PARAMETER p-wgh-frame AS WIDGET-HANDLE NO-UNDO. /* Frame do Objeto */ DEFINE INPUT PARAMETER p-cod-table AS CHARACTER NO-UNDO. /* Nome da Tabela */ DEFINE INPUT PARAMETER p-row-table AS ROWID NO-UNDO. /* Rowid da Tabela */ /* Definição de variaveis de fill-in botoes etc... */ DEFINE NEW GLOBAL SHARED VAR wh-tx-lingua AS WIDGET-HANDLE NO-UNDO. DEFINE NEW GLOBAL SHARED VAR wh-f-lingua AS WIDGET-HANDLE NO-UNDO. DEFINE NEW GLOBAL SHARED VAR wh-bt-novo AS WIDGET-HANDLE NO-UNDO. IF p-ind-event = "BEFORE-DISPLAY" AND p-ind-object = "VIEWER" THEN DO: /* Cria Texto para usar de Label no campo */ CREATE TEXT wh-tx-lingua ASSIGN FRAME = p-wgh-frame FORMAT = "x(7)" WIDTH =7 SCREEN-VALUE = "Lingua :" ROW = 5.55 COL = 55.5 VISIBLE = YES. /* Cria campo do tipo Fill-in */ CREATE FILL-IN wh-f-lingua
Curso de Progress
- Usando DDK + UPC
30 | P á g i n a
ASSIGN FRAME NAME DATA-TYPE FORMAT WIDTH HEIGHT ROW COL VISIBLE SENSITIVE
= p-wgh-frame = "Campo" = "character" = "X(10)" = 15 = 0.88 = 5.4 = 61 = YES = NO.
CREATE BUTTON wh-bt-novo ASSIGN ROW = 1.4 COLUMN = 56 WIDTH = 4 HEIGHT = 1 FRAME = p-wgh-frame SENSITIVE = YES VISIBLE = YES LABEL = "" TOOLTIP = "Clique aqui!!!!!!!!!!". wh-btn:LOAD-IMAGE("image/bt_green.gif"). ON CHOOSE OF wh-bt-novo PERSISTENT RUN "C:\Curso DDK-UPC\upc-ex-botao.p". END. /* habilita campo wh-f-lingua */ ELSE IF p-ind-event = "AFTER-ENABLE" AND p-ind-object = "VIEWER" THEN DO: ASSIGN wh-f-lingua:SENSITIVE = YES. END. /* desabilita campo wh-f-lingua */ ELSE IF p-ind-event = "AFTER-DISABLE" AND p-ind-object = "VIEWER" THEN DO: ASSIGN wh-f-lingua:SENSITIVE = NO. END.
Curso de Progress
- Usando DDK + UPC
31 | P á g i n a
Como construir UPC Criação de Extensão de Tabela 1 - Crie a extensão da tabela desejada no banco de dados especifico, respeitando os campos chaves e únicos da tabela principal. Neste exemplo criaremos uma tabela usando como chave o campo nome-pais da tabela pais, criaremos uma tabela de extensão chamada es-pais com os campos nome-pais e língua. Banco: especifico Tabela: es-pais Campos: nome-pais / língua
2 - Crie um arquivo com as linhas de comando abaixo e cadastre-a no programa CD0181 e execute o programa. /* DefiniþÒo dos Parametros PadrÒo */ DEFINE INPUT PARAMETER p-ind-event AS CHARACTER NO-UNDO. /* Evendo do programa Datasul */ DEFINE INPUT PARAMETER p-ind-object AS CHARACTER NO-UNDO. /* Objeto */ DEFINE INPUT PARAMETER p-wgh-object AS HANDLE NO-UNDO. /* Widget do Objeto */ DEFINE INPUT PARAMETER p-wgh-frame AS WIDGET-HANDLE NO-UNDO. /* Frame do Objeto */ DEFINE INPUT PARAMETER p-cod-table AS CHARACTER NO-UNDO. /* Nome da Tabela */ DEFINE INPUT PARAMETER p-row-table AS ROWID NO-UNDO. /* Rowid da Tabela */ /* DefiniþÒo de variaveis de fill-in botoes etc... */ DEFINE NEW GLOBAL SHARED VAR wh-tx-lingua AS WIDGET-HANDLE NO-UNDO. DEFINE NEW GLOBAL SHARED VAR wh-f-lingua AS WIDGET-HANDLE NO-UNDO. DEFINE NEW GLOBAL SHARED VAR wh-bt-novo AS WIDGET-HANDLE NO-UNDO. IF p-ind-event = "BEFORE-DISPLAY" AND p-ind-object = "VIEWER" THEN DO:
Curso de Progress
- Usando DDK + UPC
32 | P á g i n a
/* Cria Texto para usar de Label no campo */ CREATE TEXT wh-tx-lingua ASSIGN FRAME = p-wgh-frame FORMAT = "x(7)" WIDTH =7 SCREEN-VALUE = "Lingua :" ROW = 5.55 COL = 55.5 VISIBLE = YES. /* Cria campo do tipo Fill-in */ CREATE FILL-IN wh-f-lingua ASSIGN FRAME = p-wgh-frame NAME = "Campo" DATA-TYPE = "character" FORMAT = "X(10)" WIDTH = 15 HEIGHT = 0.88 ROW = 5.4 COL = 61 VISIBLE = YES SENSITIVE = NO. CREATE BUTTON wh-bt-novo ASSIGN ROW = 1.55 COLUMN = 80 WIDTH = 4 HEIGHT = 1 FRAME = p-wgh-frame SENSITIVE = YES VISIBLE = YES LABEL = "" TOOLTIP = "Clique aqui!!!!!!!!!!". wh-bt-novo:LOAD-IMAGE("image/bt_green.gif"). ON CHOOSE OF wh-bt-novo PERSISTENT RUN "C:\Curso DDK-UPC\exemplos\upc-ex-botao.p". /*procura na tabela es-pais o valor do atributo nome-pais conforme ref da ID-ROW da tabela pais*/ FIND FIRST pais NO-LOCK WHERE ROWID(pais) = p-row-table NO-ERROR. IF AVAIL pais THEN DO: /* nome-pais desc-lingua */ FIND FIRST es-pais WHERE es-pais.nome-pais = pais.nome-pais NO-ERROR. IF AVAIL es-pais THEN DO: ASSIGN wh-f-lingua:SCREEN-VALUE = es-pais.lingua. END. IF NOT AVAIL es-pais THEN DO: ASSIGN wh-f-lingua:SCREEN-VALUE = "". END. END. END. /* habilita campo wh-f-lingua */ ELSE IF p-ind-event = "AFTER-ENABLE" AND p-ind-object = "VIEWER" THEN DO: ASSIGN wh-f-lingua:SENSITIVE = YES. END.
Curso de Progress
- Usando DDK + UPC
33 | P á g i n a
/* desabilita campo wh-f-lingua */ ELSE IF p-ind-event = "AFTER-DISABLE" AND p-ind-object = "VIEWER" THEN DO: ASSIGN wh-f-lingua:SENSITIVE = NO. END. /* Trata a inclusao do registro com valor especifico na tabela de extensao */ ELSE IF p-ind-event = "ASSIGN" AND p-ind-object = "VIEWER" THEN DO: FIND FIRST pais NO-LOCK WHERE ROWID(pais) = p-row-table NO-ERROR. FIND FIRST es-pais WHERE es-pais.nome-pais = pais.nome-pais NO-ERROR. IF AVAIL es-pais THEN DO: ASSIGN es-pais.lingua = wh-f-lingua:SCREEN-VALUE. END. ELSE DO: CREATE es-pais. ASSIGN es-pais.nome-pais = pais.nome-pais es-pais.lingua = wh-f-lingua:SCREEN-VALUE. END. END.
Como construir UPC com outros tipos de campos Crie um arquivo com as linhas de comando abaixo e cadastre-a no programa CD0181 e execute o programa. /* DefiniþÒo dos Parametros PadrÒo */ DEFINE INPUT PARAMETER p-ind-event AS CHARACTER NO-UNDO. /* Evendo do programa Datasul */ DEFINE INPUT PARAMETER p-ind-object AS CHARACTER NO-UNDO. /* Objeto */ DEFINE INPUT PARAMETER p-wgh-object AS HANDLE NO-UNDO. /* Widget do Objeto */ DEFINE INPUT PARAMETER p-wgh-frame AS WIDGET-HANDLE NO-UNDO. /* Frame do Objeto */ DEFINE INPUT PARAMETER p-cod-table AS CHARACTER NO-UNDO. /* Nome da Tabela */ DEFINE INPUT PARAMETER p-row-table AS ROWID NO-UNDO. /* Rowid da Tabela */ /* DefiniþÒo de variaveis de fill-in botoes etc... */ DEFINE NEW GLOBAL SHARED VAR wh-tx-lingua AS WIDGET-HANDLE NO-UNDO. DEFINE NEW GLOBAL SHARED VAR wh-f-lingua AS WIDGET-HANDLE NO-UNDO.
Curso de Progress
- Usando DDK + UPC
34 | P á g i n a
DEFINE NEW GLOBAL SHARED VAR wh-bt-novo AS WIDGET-HANDLE NO-UNDO. DEFINE NEW GLOBAL SHARED VAR wh-tg-mercosul AS WIDGET-HANDLE NO-UNDO. DEFINE NEW GLOBAL SHARED VAR wh-tx-moeda AS WIDGET-HANDLE NO-UNDO. DEFINE NEW GLOBAL SHARED VAR wh-cb-moeda AS WIDGET-HANDLE NO-UNDO. IF p-ind-event = "BEFORE-DISPLAY" AND p-ind-object = "VIEWER" THEN DO: /* Cria Texto para usar de Label no campo */ CREATE TEXT wh-tx-lingua ASSIGN FRAME = p-wgh-frame FORMAT = "x(7)" WIDTH =7 SCREEN-VALUE = "Lingua :" ROW = 5.55 COL = 55.5 VISIBLE = YES. /* Cria campo do tipo Fill-in */ CREATE FILL-IN wh-f-lingua ASSIGN FRAME = p-wgh-frame NAME = "Campo" DATA-TYPE = "character" FORMAT = "X(10)" WIDTH = 15 HEIGHT = 0.88 ROW = 5.4 COL = 61 VISIBLE = YES SENSITIVE = NO. CREATE BUTTON wh-bt-novo ASSIGN ROW = 1.55 COLUMN = 80 WIDTH = 4 HEIGHT = 1 FRAME = p-wgh-frame SENSITIVE = YES VISIBLE = YES LABEL = "" TOOLTIP = "Clique aqui!!!!!!!!!!". wh-bt-novo:LOAD-IMAGE("image/bt_green.gif"). ON CHOOSE OF wh-bt-novo PERSISTENT RUN "C:\Curso DDK-UPC\exemplos\upc-ex-botao.p". CREATE TOGGLE-BOX wh-tg-mercosul ASSIGN FRAME = p-wgh-frame HEIGHT-CHARS = 0.83 ROW = 1.16 COL = 59 SENSITIVE = NO VISIBLE = YES TOOLTIP = "Integrante Mercosul?" LABEL = "Integrante Mercosul?" WIDTH = 20. CREATE TEXT wh-tx-moeda ASSIGN FRAME = p-wgh-frame FORMAT = "x(7)" WIDTH =7 SCREEN-VALUE = "Moeda :" ROW = 3.43 COL = 64 VISIBLE = YES.
Curso de Progress
- Usando DDK + UPC
35 | P á g i n a
CREATE COMBO-BOX wh-cb-moeda ASSIGN FRAME = p-wgh-frame WIDTH = 15 ROW = 3.33 COL = 70 INNER-LINES = 4 FORMAT = "x(25)" LIST-ITEMS = "Real,Dolar,Euro,Guarani" VISIBLE = YES SENSITIVE = NO. /*procura na tabela es-pais o valor do atributo nome-pais conforme ref da ID-ROW da tabela pais*/ FIND FIRST pais NO-LOCK WHERE ROWID(pais) = p-row-table NO-ERROR. IF AVAIL pais THEN DO: /* nome-pais desc-lingua */ FIND FIRST es-pais WHERE es-pais.nome-pais = pais.nome-pais NO-ERROR. IF AVAIL es-pais THEN DO: ASSIGN wh-f-lingua:SCREEN-VALUE = es-pais.lingua wh-tg-mercosul:CHECKED = es-pais.mercosul wh-cb-moeda:SCREEN-VALUE = es-pais.moeda. END. IF NOT AVAIL es-pais THEN DO: ASSIGN wh-f-lingua:SCREEN-VALUE = "" wh-tg-mercosul:CHECKED = NO wh-cb-moeda:SCREEN-VALUE = "". END. END. END. /* habilita campo wh-f-lingua */ ELSE IF p-ind-event = "AFTER-ENABLE" AND p-ind-object = "VIEWER" THEN DO: ASSIGN wh-f-lingua:SENSITIVE = YES wh-tg-mercosul:SENSITIVE = YES wh-cb-moeda:SENSITIVE = YES. END. /* desabilita campo wh-f-lingua */ ELSE IF p-ind-event = "AFTER-DISABLE" AND p-ind-object = "VIEWER" THEN DO: ASSIGN wh-f-lingua:SENSITIVE = NO wh-tg-mercosul:SENSITIVE = NO wh-cb-moeda:SENSITIVE = NO. END. /* Trata a inclusao do registro com valor especifico na tabela de extensao */ ELSE IF p-ind-event = "ASSIGN" AND p-ind-object = "VIEWER" THEN DO: FIND FIRST pais NO-LOCK WHERE ROWID(pais) = p-row-table NO-ERROR. FIND FIRST es-pais WHERE es-pais.nome-pais = pais.nome-pais NO-ERROR. IF AVAIL es-pais THEN DO: ASSIGN es-pais.lingua = wh-f-lingua:SCREEN-VALUE es-pais.mercosul = wh-tg-mercosul:CHECKED es-pais.moeda = wh-cb-moeda:SCREEN-VALUE. END. ELSE DO:
Curso de Progress
- Usando DDK + UPC
36 | P á g i n a