Você está na página 1de 39

Manual de Referncia

Customizaes

Abril/1999

No homologado

Copyright 1998 DATASUL S.A. Todos os direitos reservados. Nenhuma parte deste documento pode ser copiada, reproduzida, traduzida ou transmitida por qualquer meio eletrnico ou mecnico, na sua totalidade ou em parte, sem a prvia autorizao escrita da DATASUL S.A., que reserva-se o direito de efetuar alteraes sem aviso prvio. A DATASUL S.A no assume nenhuma responsabilidade pelas conseqncias de quaisquer erros ou inexatides que possam aparecer neste documento. DATASUL S.A. Av. Santos Dumont, 831, Joinville, SC, CEP 89.222-900

ndice
ndice.................................................................................................................i CAPTULO 1 Introduo.................................................................................1 CAPTULO 2 Application Program Interface - API........................................2 External Program Call.....................................................................................6

CAPTULO 1

Introduo
Definio O produto Datasul EMS Framework, possui duas tecnologias criadas para facilitar as customizaes, visando padroniza-las e principalmente facilita-las, sem necessitar de conhecimento da Base de Dados e seus relacionamentos. Desta forma garantindo tambm que o acesso e entrada de dados sejam feitos de maneira correta e precisa..

CAPTULO 2

Application Program Interface API


Definio Basicamente, um programa que recebe parmetros especficos e executa uma determinada tarefa no Datasul EMS Framework . Esta tarefa pode ser: uma atualizao, um programa que retorne infromaes, que realize um clculo, que gere um grfico. uma interface aberta para as funes de negcio do produto.

Exemplos

Efetuar a contabilizao de um lote de lanamentos provindos de um sistema remoto; Gerar movimentos de estoque para um item ou movimentos de Material/MOB /GGF para uma ordem de produo; Extrair saldos em estoque de determinados itens;

Esquema de Funcionamen to

Entrada

External Program Call

A partir da chamada de uma API e entrada dos devidos parmetros ou de dados para uma atualizao, podem ocorrer trs situaes: Tipos a API pode fazer um acesso ao produto Datasul EMS Framework, e receber uma resposta que podem ser dados lidos da base ou o resultado de alguma funo, este repassada para o programa chamador. a API pode fazer uma extrao de dados, gerando um grfico, um relatrio ou uma consulta. a API pode realizar uma funo, por exemplo de eliminao de dados e retornar se a execuo foi correta OK ou incorreta NOK.

Convencional - executa a API passando parmetros e obtendo resultados. com Mtodos - instancia a API e dispara os seus mtodos (procedures internas ou functions).

Documenta o

Toda API criada pela Datasul possui um padro que est documentado e a partir dele que so criadas quaisquer APIs; Os componentes podem ser: Objetivo: O que vai ser gerado pela API, quando deve ser utilizada, para que funo ; Os parmetros de entrada e sada tambm possuem sua definio, o que devem passar para a API e o que podem retornar; Em caso de ocorrncia de erro, quais as mensagens de erro podem ser retornadas para o programa chamador; As documentaes de APIs esto no diretrio docapi, com o nome da api mais a extenso .doc;

--- Exemplo
So passados como parmetros para a API os atributos e dados para montagem do grfico e devolvido uma temp-table com os possveis erros.

A include {UTP/UTAPI001.I} contm as definies das temp-tables e essa deve ser inclusa no programa gerador de grficos. A exibio do grfico feita atravs da execuo da API, UTP/UTAPI001.P; Exemplo:

API para Gerao de Grficos (v.003)


Nome Fsico: utp\utapi001.p Nome do Include com a definio dos Parmetros: utp\utapi001.i Verso de Integrao: 003 Objetivo: Criao de grficos.

Parmetros de Entrada:
Temp-table tt-atributos: Na Temp-Table tt-atributos so definidas as caractersticas gerais de apresentao do grfico.

Vantagens

As APIs possuem parmetros de entrada bem definidos e processos que so executados de maneira correta sobre o produto; As APIs so bem documentadas e executam tarefas de acordo com o objetivo, funcionando para seus usurio como uma caixa preta, ou seja, estes no precisam saber de que forma o processo executado, apenas que, sendo realizadas as entradas corretas, a API executa o processo esperado de maneira transparente; As integraes entre mdulos do produto Datasul EMS Framework so realizadas atravs das APIs, portanto este o caminho natural para que customizadores integrem outras solues com o produto; A tecnologia empregada e as regras de negcio de uma API podem evoluir fazendo com que o cliente usufrua destes benefcios sem a necessidade de reescrever1 seus programas;

Quando houver alguma alterao da interface da API esta verifica se o programa chamador est de acordo com a nova interface, em caso negativo, emitida uma mensagem informando que o programa deve ser revisto.

External Program Call

Portanto, o que as APIs fornecem uma maior facilidade, rapidez e produtividade no desenvolvimento de customizaes;

External Program Call


Definio So chamadas a programas desenvolvidos pelo usurio, em pontos pr-definidos do produto, possibilitando a sua adaptao e integrao com outras aplicaes. Constituem-se num aperfeioamento das Sadas X existentes no produto MAGNUS I.00, pois os pontos de chamada esto ligados a eventos da interface com o usurio, eventos da base de dados (gravao e eliminao de registros) ou em pontos estratgicos em programas de atualizao e clculo. Basicamente, uma maior integrao possibilitada, porque atravs das EPCs pode-se interagir com a interface do produto, com a lgica de aplicao e com os eventos de dicionrio de dados. Com exceo do ltimo tipo de chamada (pontos estratgicos) as demais chamadas no precisam ser solicitadas para a Datasul, pois j se encontram disponveis no produto. Alm de que as chamadas em eventos da base de dados reduzem a necessidade de chamadas em programas de atualizao.

Aplicao Especfica

UPC API

Datasul EMS framework

Objetivos

possibilitar a customizao e integrao do produto Datasul-EMS pelos usurios, respectivamente, de uma forma padronizada e controlada; possibilitar localizaes do Datasul-EMS que no devem ser incorporadas ao produto standard pela prpria Datasul;

External Program Call

possibilitar ao usurio a administrao de suas customizaes, identificando atravs do Datasul-EMS, quais programas e tabelas do produto possuem customizao; possibilitar a administrao de integraes desenvolvidas por usurios da Datasul sobre o produto Datasul-EMS; Customizao Clientes - Necessidades especficas e especialistas User Program Call - UPC

Tipos de EPCs

Integrao Parceiros - Integraes com outros softwares Application Partner Program Call APPC

UPC + APPC = EPC

EPCs na Interface de Programas

Atravs do procedimento de Manuteno de Programas do DatasulEMS (men/men012aa.w), mdulo Menu, o usurio pode determinar o caminho e o nome fsico do programa a ser chamado nas UPCs de um determinado programa do produto. Conforme a tela a seguir:

Exemplo :

Alterar as caractersticas das telas: labels, formatos, cores, posicionamento, tabulao. Implementar novos campos, novos botes com chamada para subprogramas.

Parmetros

Tanto o programa UPC quanto o programa APPC recebem os seguintes parmetros:


Parmetro p-ind-event p-ind-object p-wgh-object p-wgh-frame p-cod-table p-row-table I/O Input Input Input Input Input Input Tipo de Dado Character Character Handle Widget-handle Character Rowid Contedo Indicador de Evento Indicador de Objeto Handle do objeto corrente Handle do frame corrente Nome da tabela corrente Rowid do registro corrente da tabela

Pode retornar ao programa que o chamou, atravs do recurso RETURNVALUE, o valor NOK indicando que o evento que disparou o programa EPC no deve ser aplicado, isto viabiliza, por exemplo, validaes do usurio a serem executadas no evento VALIDATE, que se encontrarem problemas podem evitar a confirmao da tela, e consequentemente a atualizao de registros. Dica: Para saber os eventos que esto chamando a EPC e o valor dos parmetros no momento da chamada, pode-se testar fazendo um programa EPC como o exemplo a seguir:
*******************************************************************/ def def def def def def def input param p-ind-event input param p-ind-object input param p-wgh-object input param p-wgh-frame input param p-cod-table input param p-row-table var c-objeto as char no-undo. as as as as as as char char handle widget-handle char rowid no-undo. no-undo. no-undo. no-undo. no-undo. no-undo.

assign c-objeto = entry(num-entries(p-wgh-object:private-data, "~/"), p-wgh-object:private-data, "~/"). message "EVENTO" p-ind-event skip "OBJETO" p-ind-object skip "NOME OBJ" c-objeto skip "FRAME" p-wgh-frame skip "TABELA" p-cod-table skip "ROWID" string(p-row-table) view-as alert-box.

External Program Call

Pontos de Chamada Smart Os pontos de chamada ficam ligados a eventos da interface, estes eventos no representam necessariamente eventos Progress, mas sim pontos, chamados de ADM-Events, dentro da estrutura de SmartObjects. para SmartViewers existem chamadas EPC nos seguintes eventos:
SRC Smart.i Smart.i Record.i Record.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i Tableio.i LocalEstrutura UIB Adm-initialize Adm-initialize Adm-display-fields Adm-display-fields Adm-enable-fields Adm-enable-fields Adm-disable-fields Adm-disable-fields Adm-add-record Adm-add-record Adm-reset-record Adm-reset-record Adm-cancel-record Adm-cancel-record Adm-assign-record Adm-assign-statement Adm-assign-statement Adm-assign-statement Adm-end-update Adm-end-update Adm-delete-record Adm-delete-record Include include/i-epc018.i include/i-epc001.i include/i-epc023.i include/i-epc006.i include/i-epc004.i include/i-epc021.i include/i-epc005.i include/i-epc022.i include/i-epc028.i include/i-epc011.i include/i-epc012.i include/i-epc029.i include/i-epc013.i include/i-epc030.i include/i-epc002.i include/i-epc019.i include/i-epc020.i include/i-epc003.i include/i-epc010.i include/i-epc027.i include/i-epc015.i include/i-epc032.i Trata Retorno ? No No No No No No No No No No No No No No Sim Sim Sim Sim No No Sim Sim

Evento BEFORE-INITIALIZE INITIALIZE BEFORE-DISPLAY DISPLAY ENABLE AFTER-ENABLE DISABLE AFTER-DISABLE BEFORE-ADD ADD UNDO AFTER-UNDO CANCEL AFTER-CANCEL VALIDATE AFTER-VALIDATE BEFORE-ASSIGN ASSIGN END-UPDATE AFTER-END-UPDATE DELETE AFTER-DELETE

para SmartBrowsers devem haver chamadas EPC nos seguintes eventos:


SRC Brschnge.i Brschnge.i Smart.i Smart.i Record.i Record.i Local value-changed value-changed adm-initialize adm-initialize adm-open-query adm-open-query Include include/i-epc016.i include/i-epc033.i Include/i-epc034.i Include/i-epc017.i Include/i-epc035.i Include/i-epc036.i Trata Retorno ? No No No No No No

Evento VALUE-CHANGED AFTER-VALUE-CHANGED BEFORE-INITIALIZE INITIALIZE BEFORE-OPEN-QUERY AFTER-OPEN-QUERY

Evento

para Containers devem haver chamadas EPC nos seguintes eventos:


SRC smart.i smart.i smart.i smart.i Local adm-initialize adm-initialize adm-enable adm-enable Include Include/i-epc024.i Include/i-epc007.i Include/i-epc025.i Include/i-epc008.i Trata Retorno ? No No No No

BEFORE-INITIALIZE INITIALIZE BEFORE-ENABLE ENABLE

BEFORE-DISABLE DISABLE CHANGE-PAGE AFTER-CHANGE-PAGE DESTROY

smart.i smart.i Containr.i Containr.i smart.i

adm-disable adm-disable adm-change-page adm-change-page adm-destroy

Include/i-epc026.i Include/i-epc009.i Include/i-epc014.i Include/i-epc031.i include/i-epc100.i

No No No No No

No caso do EMS 5, os pontos de chamada esto nos seguintes eventos:


Evento INITIALIZE DISPLAY ENABLE VALIDATE ASSIGN BEFORE_DELETE AFTER_DELETE Local Depois do view da frame Depois do display da frame Depois do enable da frame Depois da chamada da pi de validao Depois da pi de assign dos campos Antes de eliminar o registro Depois de eliminar o registro Trata Retorno ? No No No Sim Sim Sim Sim

Exemplos

Criar um boto novo em uma window para chamar um subprograma a partir deste;
def def def def def def input input input input input input param param param param param param p-ind-event p-ind-object p-wgh-object p-wgh-frame p-cod-table p-row-table as as as as as as char char handle widget-handle char rowid no-undo. no-undo. no-undo. no-undo. no-undo. no-undo.

def var wh-button as widget-handle no-undo. def var c-objeto as char no-undo. assign c-objeto = entry(num-entries(p-wgh-object:privatedata, "~/"), p-wgh-object:private-data, "~/"). if p-ind-event = "INITIALIZE" and p-ind-object = "CONTAINER" then do: create button wh-button assign frame = p-wgh-frame width = 4 height = 1.25 row = 1.26 label = "teste" col = 65 sensitive = yes visible = yes triggers: ON CHOOSE PERSISTENT RUN upc/testeupc1.p. end triggers. end.

External Program Call

11

Obs. O evento utilizado para o boto criado, deve necessariamente chamar um subprograma com persistent run e em caso de parmetros, utilizam-se variveis globais.
Criar um widget novo em uma viewer;
def def def def def def input input input input input input param param param param param param p-ind-event p-ind-object p-wgh-object p-wgh-frame p-cod-table p-row-table as as as as as as char char handle widget-handle char rowid no-undo. no-undo. no-undo. no-undo. no-undo. no-undo.

def new global def new undo. def new undo. def var

shared var wh-button as widget-handle no-undo. global shared var wh-fill as widget-handle noglobal shared var tx-label c-objeto as char no-undo. as widget-handle no-

assign c-objeto = entry(num-entries(p-wgh-object:privatedata, "~/"), p-wgh-object:private-data, "~/"). if p-ind-event = "BEFORE-INITIALIZE" and p-ind-object = "VIEWER" and c-objeto = "v24ad098.w" then do: create button wh-button assign frame = p-wgh-frame width = 18 height = 1 label = "Assistncia Tcnica" row = 3.7 col = 67 visible = yes sensitive = no triggers: ON CHOOSE PERSISTENT RUN upc/demoupc1.p. end triggers. create text tx-label assign frame = p-wgh-frame format = "x(17)" width = 6.2 screen-value = "Perfil Marketing:" row = 2.8 col = 59.5 fgcolor = 1 visible = yes. create fill-in wh-fill assign frame = p-wgh-frame side-label-handle = tx-label:handle

format width height row col bgcolor fgcolor label visible sensitive end.

= = = = = = = = = =

"x(20)" 12 0.88 2.7 71 1 15 "Perfil Marketing:" yes no.

if p-ind-event = "ENABLE" and p-ind-object = "VIEWER" and c-objeto = "v24ad098.w" then do: assign wh-button:sensitive = yes wh-fill:sensitive = yes. end. if p-ind-event = "DISABLE" and p-ind-object = "VIEWER" and c-objeto = "v24ad098.w" then do: assign wh-button:sensitive = no wh-fill:sensitive = no. end.

Encontrar o handle de um widget;


def def def def def def input input input input input input param param param param param param p-ind-event p-ind-object p-wgh-object p-wgh-frame p-cod-table p-row-table as as as as as as char char handle widget-handle char rowid no-undo. no-undo. no-undo. no-undo. no-undo. no-undo.

def new undo. def new undo. def new undo. def new undo. def var def var

global shared var wh-button global shared var wh-fill global shared var tx-label global shared var h_campo

as widget-handle noas widget-handle noas widget-handle noas widget-handle no-

c-objeto as char no-undo. h_frame as widget-handle no-undo.

assign c-objeto = entry(num-entries(p-wgh-object:privatedata, "~/"), p-wgh-object:private-data, "~/"). if p-ind-event = "DISPLAY" and p-ind-object = "VIEWER" and c-objeto = "v24ad098.w" then do:

External Program Call

13

DO : ASSIGN h_Frame = p-wgh-frame:FIRST-CHILD. /* pegando o Field-Group */ ASSIGN h_Frame = h_Frame:FIRST-CHILD. /* pegando o 1o. Campo */ message h_frame:name view-as alert-box. DO WHILE h_Frame <> ? : if h_frame:type <> "field-group" then do: IF h_Frame:NAME = "nome-mic-reg" THEN DO : assign h_campo = h_Frame. leave. END. ASSIGN h_Frame = h_Frame:NEXT-SIBLING. end. else do: assign h_frame = h_frame:first-child. end. END. END. end.

Dica: Para descobrir o nome de um campo em uma tela, pode-se utilizar o comando <Ctrl-Alt-4> sobre o campo desejado. Este comando retorna o nome do campo e da tabela a que ele pertence. Acessar o valor de um widget;

Aps encontrar o handle do campo desejado, utilizando a lgica do item III, fazer o seguinte:
assign c-valor = h-campo:screen-value.

Obs. Lembre-se, em caso da varivel ou campo de tabela que vai receber o valor do widget no ser do tipo character, o valor do screenvalue deve ser transformado para este tipo, pois o screen-value do campo sempre character. Alterar o valor de um widget; Aps encontrar o handle do campo desejado, utilizando a lgica do item III, fazer o seguinte:
assign h-campo:screen-value = Novo Valor.

Lembre-se que mesmo para campos no character, deve-se utilizar (aspas), pois o valor do screen-value sempre character.

Ocultar um widget em uma viewer;

Aps encontrar o handle do campo desejado, utilizando a lgica do item III, fazer o seguinte: assign h-campo:visible = no.
Criar uma viewer dinamicamente;
/* Parameter Definitions ****************************************************/ define input parameter p-ind-event as character. define input parameter p-ind-object as character. define input parameter p-wgh-object as handle. define input parameter p-wgh-frame as widget-handle. define input parameter p-cod-table as character. define input parameter p-row-table as rowid. /* Global Variable Definitions **********************************************/ define new global shared var adm-broker-hdl as handle noundo. define new global shared var h-folder as handle noundo. define new global shared var h-viewer as handle noundo. /* Variable Definitions *****************************************************/ define var c-folder as character no-undo. define var c-objects as character no-undo. define var h-object as handle no-undo. define var i-objects as integer no-undo. define var l-record as logical no-undo initial no. define var l-group-assign as logical no-undo initial no. /* Main Block ************************************************************* **/ if p-ind-event = "INITIALIZE" and p-ind-object = "CONTAINER" then do: RUN get-link-handle IN adm-broker-hdl (INPUT p-wghobject, INPUT "PAGESOURCE":U, OUTPUT c-folder). assign h-folder = widget-handle(c-folder) no-error. if valid-handle(h-folder) then do:

External Program Call

15

RUN create-folder-page IN h-folder (INPUT 5, INPUT "Pag. 05":U). RUN create-folder-label IN h-folder (INPUT 5, INPUT "Pag. 05":U). RUN select-page IN p-wgh-object (INPUT 5). RUN init-object IN p-wgh-object (INPUT "nome externo da nova viewer ":U, /* Nome do Objeto Viewer */ INPUT p-wgh-frame, INPUT "Layout = ":U, OUTPUT h-viewer). RUN set-position IN h-viewer ( 7.10, 5.00). RUN get-link-handle IN adm-broker-hdl (INPUT p-wghobject, "CONTAINER-TARGET":U, objects). do i-objects = 1 to num-entries(c-objects): assign h-object = widget-handle(entry(i-objects, cobjects)). if index(h-object:private-data, "qry") <> 0 and verificar se e a query principal */ not l-record then do: assign l-record = yes. /* Voc deve INPUT OUTPUT c-

"Record":U,

RUN add-link IN adm-broker-hdl (INPUT h-object, INPUT INPUT h-viewer).

end.

if index(h-object:private-data, "vwr") <> 0 and /* Voce deve verificar se e a viewer principal */ not l-group-assign then do: assign l-group-assign = yes. RUN add-link IN adm-broker-hdl (INPUT h-object, INPUT "GroupAssign":U, end. end. RUN dispatch IN h-viewer ("initialize":U). RUN select-page IN p-wgh-object (INPUT 1). INPUT h-viewer).

end.

end.

Chamar o zoom para um campo criado dinamicamente;


def def def def def def input input input input input input param param param param param param p-ind-event p-ind-object p-wgh-object p-wgh-frame p-cod-table p-row-table as as as as as as char char handle widget-handle char rowid no-undo. no-undo. no-undo. no-undo. no-undo. no-undo.

def new global shared var wh-fill undo. def new global shared var tx-label undo. def var c-objeto as char no-undo.

as widget-handle noas widget-handle no-

assign c-objeto = entry(num-entries(p-wgh-object:privatedata, "~/"), p-wgh-object:private-data, "~/"). if p-ind-event = "BEFORE-INITIALIZE" and p-ind-object = "VIEWER" and c-objeto = "v24ad098.w" then do: create text tx-label assign frame = p-wgh-frame format = "x(17)" width = 6.2 screen-value = "Perfil:" row = 2.8 col = 59.5 fgcolor = 1 visible = yes. create fill-in wh-fill assign frame = p-wgh-frame format = "x(10)" side-label-handle = tx-label:handle width = 10 height = 0.88 row = 2.8 col = 65 bgcolor = 1 fgcolor = 15 visible = yes sensitive = no triggers: ON F5 PERSISTENT RUN upc-curso/zoomupc.p. end triggers. end. if p-ind-event = "ENABLE" and p-ind-object = "VIEWER"

External Program Call

17

and c-objeto = "v24ad098.w" then do: assign wh-fill:sensitive = yes. end. if p-ind-event = "DISABLE" and p-ind-object = "VIEWER" and c-objeto = "v24ad098.w" then do: assign wh-fill:sensitive = no. end.

Para o programa de zoom, que vai chamar um zoom construido no padro do EMS 2.0, deve-se fazer o seguinte:
def var def new def new undo. def new def new wh-pesquisa as widget-handle. global shared var l-implanta as logical init no. global shared var wh-fill as widget-handle noglobal shared var wh-window as handle no-undo. global shared var adm-broker-hdl as handle no-undo.

{include/zoomvar.i &prog-zoom=inzoom/z01in172.w &proghandle=wh-window &campohandle=wh-fill &campozoom=it-codigo}

Pontos de Chamada ThinTemplate Os pontos de chamada ficam ligados a eventos da interface, estes eventos no representam necessariamente eventos Progress, mas sim pontos estratgicos, dentro da estrutura do ThinTemplate. A chamada da EPC feita por intermdio da include method/svc/custom/custom.i, e nenhuma das chamadas de EPC em interface trata retorno de erro. para ThinMaintenance existem chamadas EPC nos seguintes eventos:
Evento BEFORE-ADD AFTER-ADD BEFORE-CANCEL AFTER-CANCEL BEFORE-COPY AFTER-COPY BEFORE-DELETE AFTER-DELETE BEFORE-ASSIGN AFTER-ASSIGN BEFORE-UNDO AFTER-UNDO BEFORE-CONTROL-TOOL-BAR Mtodo Padro ADDRECORD ADDRECORD CANCELRECORD CANCELRECORD COPYRECORD COPYRECORD DELETERECORD DELETERECORD SAVERECORD SAVERECORD UNDORECORD UNDORECORD CONTROLTOOLBAR

AFTER-CONTROL-TOOL-BAR BEFORE-DESTROY-INTERFACE AFTER-DESTROY-INTERFACE BEFORE-DISABLE AFTER-DISABLE BEFORE-DISPLAY AFTER-DISPLAY BEFORE-ENABLE AFTER-ENABLE BEFORE-INITIALIZE AFTER-INITIALIZE BEFORE-SAVE-FIELDS AFTER-SAVE-FIELDS BEFORE-CHANGE-PAGE AFTER-CHANGE-PAGE

CONTROLTOOLBAR DESTROYINTERFACE DESTROYINTERFACE DISABLEFIELDS DISABLEFIELDS DISPLAYFIELDS DISPLAYFIELDS ENABLEFIELDS ENABLEFIELDS INITIALIZEINTERFACE INITIALIZEINTERFACE SAVEFIELDS SAVEFIELDS CHANGEPAGE CHANGEPAGE

para ThinMaintenanceNoNavigation existem chamadas EPC nos seguintes eventos:


Evento BEFORE-ADD AFTER-ADD BEFORE-COPY AFTER-COPY BEFORE-ASSIGN AFTER-ASSIGN BEFORE-DESTROY-INTERFACE AFTER-DESTROY-INTERFACE BEFORE-DISABLE AFTER-DISABLE BEFORE-DISPLAY AFTER-DISPLAY BEFORE-ENABLE AFTER-ENABLE BEFORE-INITIALIZE AFTER-INITIALIZE BEFORE-SAVE-FIELDS AFTER-SAVE-FIELDS BEFORE-CHANGE-PAGE AFTER-CHANGE-PAGE Mtodo Padro ADDRECORD ADDRECORD COPYRECORD COPYRECORD SAVERECORD SAVERECORD DESTROYINTERFACE DESTROYINTERFACE DISABLEFIELDS DISABLEFIELDS DISPLAYFIELDS DISPLAYFIELDS ENABLEFIELDS ENABLEFIELDS INITIALIZEINTERFACE INITIALIZEINTERFACE SAVEFIELDS SAVEFIELDS CHANGEPAGE CHANGEPAGE

para ThinMasterDetail existem chamadas EPC nos seguintes eventos:


Evento BEFORE-DELETE AFTER-DELETE BEFORE-CONTROL-TOOL-BAR AFTER-CONTROL-TOOL-BAR BEFORE-DESTROY-INTERFACE AFTER-DESTROY-INTERFACE BEFORE-DISPLAY AFTER-DISPLAY Mtodo Padro DELETERECORD DELETERECORD CONTROLTOOLBAR CONTROLTOOLBAR DESTROYINTERFACE DESTROYINTERFACE DISPLAYFIELDS DISPLAYFIELDS

External Program Call

19

BEFORE-INITIALIZE AFTER-INITIALIZE BEFORE-VALUE-CHANGED AFTER-VALUE-CHANGED BEFORE-CHANGE-PAGE AFTER-CHANGE-PAGE BEFORE-OPEN-QUERY AFTER-OPEN-QUERY

INITIALIZEINTERFACE INITIALIZEINTERFACE APPLYVALUECHANGED APPLYVALUECHANGED CHANGEPAGE CHANGEPAGE OPENQUERY OPENQUERY

para ThinFormation existem chamadas EPC nos seguintes eventos:


Evento BEFORE-CONTROL-TOOL-BAR AFTER-CONTROL-TOOL-BAR BEFORE-DESTROY-INTERFACE AFTER-DESTROY-INTERFACE BEFORE-DISPLAY AFTER-DISPLAY BEFORE-INITIALIZE AFTER-INITIALIZE BEFORE-CHANGE-PAGE AFTER-CHANGE-PAGE Mtodo Padro CONTROLTOOLBAR CONTROLTOOLBAR DESTROYINTERFACE DESTROYINTERFACE DISPLAYFIELDS DISPLAYFIELDS INITIALIZEINTERFACE INITIALIZEINTERFACE CHANGEPAGE CHANGEPAGE

para ThinFormationNoNavigation existem chamadas EPC nos seguintes eventos:


Evento BEFORE-DESTROY-INTERFACE AFTER-DESTROY-INTERFACE BEFORE-DISPLAY AFTER-DISPLAY BEFORE-INITIALIZE AFTER-INITIALIZE Mtodo Padro DESTROYINTERFACE DESTROYINTERFACE DISPLAYFIELDS DISPLAYFIELDS INITIALIZEINTERFACE INITIALIZEINTERFACE

para ThinReport existem chamadas EPC nos seguintes eventos:


Evento BEFORE-DESTROY-INTERFACE AFTER-DESTROY-INTERFACE BEFORE-DISABLE AFTER-DISABLE BEFORE-ENABLE AFTER-ENABLE BEFORE-INITIALIZE AFTER-INITIALIZE Mtodo Padro DESTROYINTERFACE DESTROYINTERFACE DISABLEFIELDS DISABLEFIELDS ENABLEFIELDS ENABLEFIELDS INITIALIZEINTERFACE INITIALIZEINTERFACE

para ThinWindow existem chamadas EPC nos seguintes eventos:


Evento BEFORE-DESTROY-INTERFACE Mtodo Padro DESTROYINTERFACE

AFTER-DESTROY-INTERFACE BEFORE-DISPLAY AFTER-DISPLAY BEFORE-ENABLE AFTER-ENABLE BEFORE-INITIALIZE AFTER-INITIALIZE BEFORE-CHANGE-PAGE AFTER-CHANGE-PAGE

DESTROYINTERFACE DISPLAYFIELDS DISPLAYFIELDS ENABLEFIELDS ENABLEFIELDS INITIALIZEINTERFACE INITIALIZEINTERFACE CHANGEPAGE CHANGEPAGE

para ThinZoom existem chamadas EPC nos seguintes eventos:


Evento BEFORE-VALUE-CHANGED AFTER-VALUE-CHANGED BEFORE-DESTROY-INTERFACE AFTER-DESTROY-INTERFACE BEFORE-INITIALIZE AFTER-INITIALIZE BEFORE-CHANGE-PAGE AFTER-CHANGE-PAGE Mtodo Padro APPLYVALUECHANGED APPLYVALUECHANGED DESTROYINTERFACE DESTROYINTERFACE INITIALIZEINTERFACE INITIALIZEINTERFACE CHANGEPAGE CHANGEPAGE

Exemplos

Criar um widget novo em uma frame;


def def def def def def input input input input input input param param param param param param p-ind-event p-ind-object p-wgh-object p-wgh-frame p-cod-table p-row-table as as as as as as char char handle widget-handle char rowid no-undo. no-undo. no-undo. no-undo. no-undo. no-undo.

DEF NEW GLOBAL SHARED VAR wh-button AS WIDGET-HANDLE NO-UNDO. DEF NEW GLOBAL SHARED VAR wh-fill AS WIDGET-HANDLE NO-UNDO. DEF NEW GLOBAL SHARED VAR tx-label AS WIDGET-HANDLE NO-UNDO. IF p-ind-event = "AFTER-INITIALIZE" THEN DO: CREATE BUTTON wh-button ASSIGN FRAME = p-wgh-frame WIDTH = 15 HEIGHT = 1 LABEL = "TESTE" ROW = 4 COL = 10 FONT = 1 VISIBLE = YES SENSITIVE = NO TRIGGERS: ON CHOOSE PERSISTENT RUN epc/trigbotao.p. END TRIGGERS. CREATE TEXT tx-label

External Program Call

21

ASSIGN FRAME FORMAT WIDTH SCREEN-VALUE ROW COL VISIBLE FONT

= = = = = = = =

p-wgh-frame "x(40)" 15 "Comentrio:" 2 10 YES 1. = = = = = = = = = = = p-wgh-frame tx-label:HANDLE "x(20)" 40 0.88 1.7 18.5 "Comentrio:" YES NO 1.

CREATE FILL-IN wh-fill ASSIGN FRAME SIDE-LABEL-HANDLE FORMAT WIDTH HEIGHT ROW COL LABEL VISIBLE SENSITIVE FONT END. IF

p-ind-event = "BEFORE-ENABLE" THEN DO: ASSIGN wh-button:SENSITIVE = YES wh-fill:SENSITIVE = YES.

END. IF END. p-ind-event = "BEFORE-DISABLE" THEN DO: ASSIGN wh-button:SENSITIVE = NO wh-fill:SENSITIVE = NO.

Obs:No evento (trigger) do boto criado deve-se chamar um subprograma com persistent run e nesse no utilizar parmetros, apenas variveis globais.
Encontrar o handle de um widget;
def def def def def def input input input input input input param param param param param param p-ind-event p-ind-object p-wgh-object p-wgh-frame p-cod-table p-row-table as as as as as as char char handle widget-handle char rowid no-undo. no-undo. no-undo. no-undo. no-undo. no-undo.

DEF NEW GLOBAL SHARED VAR h-campo AS WIDGET-HANDLE NO-UNDO. DEF VAR h-objeto AS WIDGET-HANDLE NO-UNDO.

If

p-ind-event = BEFORE-INITIALIZE THEN DO: DO: assign h-objeto = p-wgh-frame:FIRST-CHILD. assign h-objeto = h-objeto:FIRST-CHILD. do while valid-handle(h-objeto): IF h-objeto:TYPE <> "field-group" THEN DO: IF h-objeto:NAME = "nome-mic-reg" THEN DO: ASSIGN h-campo = h-objeto. Leave. END. assign h-objeto = h-objeto:NEXT-SIBLING. END. ELSE DO: Assign h-objeto = h-objeto:first-child. END. end. END.

END.

Habilitar o folder;

Somente possvel habilitar o folder se o programa utilizar as pginas fPage0 e fPage1.


def def def def def def input input input input input input param param param param param param p-ind-event p-ind-object p-wgh-object p-wgh-frame p-cod-table p-row-table as as as as as as char char handle widget-handle char rowid no-undo. no-undo. no-undo. no-undo. no-undo. no-undo.

DEF NEW GLOBAL SHARED VAR h-fpage1 AS HANDLE NO-UNDO. DEF NEW GLOBAL SHARED VAR h-folder AS HANDLE NO-UNDO. DEF VAR h-frame AS HANDLE NO-UNDO. IF p-ind-event = "BEFORE-INITIALIZE" THEN DO: DO: assign h-frame = p-wgh-frame:FIRST-CHILD. assign h-frame = h-frame:FIRST-CHILD. do while valid-handle(h-frame): IF h-frame:TYPE <> "field-group" THEN DO: IF h-frame:NAME = "fPage1" THEN DO: ASSIGN h-fpage1 = h-frame. END. assign h-frame = h-frame:NEXT-SIBLING. END. ELSE DO: LEAVE.

External Program Call

23

end. END.

END.

RUN utp/thinFolder.w PERSISTENT SET h-folder. RUN setProgramParent IN h-folder (INPUT p-wgh-object). RUN setOCX IN h-folder (INPUT p-wgh-object:GETSIGNATURE("control_load":U) <> "":U) NO-ERROR. RUN initializeFolders IN h-folder (INPUT p-wgh-frame, INPUT STRING(h-fpage1), INPUT "Cadastro", INPUT 1, INPUT ?, INPUT ?, INPUT ?, INPUT ?). RUN setFolder IN h-folder (INPUT 1). END.

Inserir uma frame;

Somente possvel inserir uma frame quando o folder estiver habilitado.


def def def def def def input input input input input input param param param param param param p-ind-event p-ind-object p-wgh-object p-wgh-frame p-cod-table p-row-table as as as as as as char char handle widget-handle char rowid no-undo. no-undo. no-undo. no-undo. no-undo. no-undo.

DEF NEW GLOBAL SHARED VAR h-fpage2 AS WIDGET-HANDLE NO-UNDO. DEF VAR h-objeto IF AS HANDLE NO-UNDO.

p-ind-event = "AFTER-INITIALIZE" THEN DO: CREATE FRAME h-fPage2 ASSIGN COL ROW WIDTH HEIGHT NAME SIDE-LABELS SENSITIVE OVERLAY BGCOLOR BOX THREE-D = = = = = = = = = = = 3.57 6.38 84.43 5.88 "fpage2" YES YES YES ? NO YES.

assign h-objeto = p-wgh-object.

do while valid-handle(h-objeto): if h-objeto:FILE-NAME = "utp/thinFolder.w" then LEAVE. assign h-objeto = h-objeto:NEXT-SIBLING. end. RUN setFolder IN h-objeto (INPUT 1) . RUN insertFolder IN h-objeto (INPUT INPUT INPUT INPUT End. ?, p-wgh-frame, h-fPage2, "Ref Call").

Chamar o zoom para um campo criado dinamicamente;


def def def def def def input input input input input input param param param param param param p-ind-event p-ind-object p-wgh-object p-wgh-frame p-cod-table p-row-table as as as as as as char char handle widget-handle char rowid no-undo. no-undo. no-undo. no-undo. no-undo. no-undo.

Def new global shared var tx-label as widget-handle no-undo. Def new global shared var wh-fill as widget-handle no-undo. /*encontrar o handle da frame onde deseja criar o campo*/ IF p-ind-event = "AFTER-INITIALIZE" THEN DO: CREATE TEXT tx-label ASSIGN FRAME FORMAT WIDTH SCREEN-VALUE ROW COL VISIBLE FONT = = = = = = = = h-fPage2 /*handle da frame*/ "x(40)" 15 "Comentrio:" 2 10 YES 1. = = = = = = = = = = h-fPage2 tx-label:HANDLE "x(20)" "comentario" 40 0.88 1.7 18.5 "Comentrio:" YES

CREATE FILL-IN wh-fill ASSIGN FRAME SIDE-LABEL-HANDLE FORMAT NAME WIDTH HEIGHT ROW COL LABEL VISIBLE

External Program Call

25

epc/epczoom.p.

SENSITIVE = NO FONT = 1 TRIGGERS: ON "F5":U PERSISTENT RUN epc/epczoom.p. ON "MOUSE-SELECT-DBLCLICK":U PERSISTENT RUN END TRIGGERS.

END. IF END. IF END.

WH-FILL:LOAD-MOUSE-POINTER("image/lupa.cur":U). p-ind-event = "BEFORE-ENABLE" THEN DO: ASSIGN wh-fill:SENSITIVE = YES.

p-ind-event = "BEFORE-DISABLE" THEN DO: ASSIGN wh-fill:SENSITIVE = NO.

Para o programa de zoom, que vai chamar um zoom construdo no padro ThinTemplate, deve-se fazer o seguinte:
DEF NEW GLOBAL SHARED VAR wh-fill AS WIDGET-HANDLE NO-UNDO.

DEF VAR hProgramZoom AS HANDLE NO-UNDO. {method/zoomFields.i &ProgramZoom="spp/sp0008a.w" &FieldZoom1="rep-name" &frame1="fPage2" &fieldHandle1=wh-fill}

Buscar registro corrente/atualizar registro de uma DBO;


def def def def def def DEF DEF DEF DEF input input input input input input NEW NEW NEW NEW param param param param param param p-ind-event p-ind-object p-wgh-object p-wgh-frame p-cod-table p-row-table SHARED SHARED SHARED SHARED VAR VAR VAR VAR wh-fill tx-label h-fPage1 h-bo as as as as as as AS AS AS AS char char handle widget-handle char rowid WIDGET-HANDLE WIDGET-HANDLE WIDGET-HANDLE HANDLE no-undo. no-undo. no-undo. no-undo. no-undo. no-undo. NO-UNDO. NO-UNDO. NO-UNDO. NO-UNDO.

GLOBAL GLOBAL GLOBAL GLOBAL

{spbo/bosp001.i tt-Customer} DEF VAR h-objeto AS HANDLE DEF VAR c-comments AS CHAR NO-UNDO. NO-UNDO.

/*encontrar o handle da frame onde deseja criar o campo*/ IF p-ind-event = "AFTER-INITIALIZE" THEN DO: CREATE TEXT tx-label ASSIGN FRAME FORMAT WIDTH SCREEN-VALUE ROW COL VISIBLE FONT = = = = = = = = h-fPage1 /*handle da frame*/ "x(40)" 15 "Comentrio:" 2 10 YES 1.

CREATE FILL-IN wh-fill ASSIGN FRAME = h-fPage1 SIDE-LABEL-HANDLE = tx-label:HANDLE FORMAT = "x(20)" NAME = "comentario" WIDTH = 40 HEIGHT = 0.88 ROW = 1.7 COL = 18.5 LABEL = "Comentrio:" VISIBLE = YES SENSITIVE = NO FONT = 1 TRIGGERS: ON "F5":U PERSISTENT RUN epc/epczoom.p. ON "MOUSE-SELECT-DBLCLICK":U PERSISTENT RUN epc/epczoom.p. END TRIGGERS. WH-FILL:LOAD-MOUSE-POINTER("image/lupa.cur":U). assign h-objeto = p-wgh-object. do while valid-handle(h-objeto): if h-objeto:FILE-NAME = "spbo/bosp001.p" then do: ASSIGN h-bo = h-objeto. LEAVE. END. assign h-objeto = h-objeto:NEXT-SIBLING. end. IF VALID-HANDLE(wh-fill) AND valid-handle(h-bo) THEN DO: RUN GetCharField IN h-bo (INPUT "comments", OUTPUT c-comments). ASSIGN wh-fill:SCREEN-VALUE = c-comments.

END.

END.

External Program Call

27

IF END. IF END. IF

p-ind-event = "BEFORE-ENABLE" THEN DO: Assign wh-fill:SENSITIVE = YES. p-ind-event = "BEFORE-DISABLE" THEN DO: Assign wh-fill:SENSITIVE = NO. p-ind-event = "BEFORE-DISPLAY" and VALID-HANDLE(wh-fill) AND VALID-HANDLE(h-bo) THEN DO: RUN GetCharField IN h-bo (INPUT "comments", OUTPUT c-comments). ASSIGN wh-fill:SCREEN-VALUE = c-comments. p-ind-event = "AFTER-ASSIGN" and VALID-HANDLE(wh-fill) AND VALID-HANDLE(h-bo) THEN DO: RUN GetRecord IN h-bo (OUTPUT TABLE tt-Customer). FIND FIRST tt-Customer EXCLUSIVE-LOCK NO-ERROR. ASSIGN tt-Customer.comments = wh-fill:SCREEN-VALUE . RUN SetRecord IN h-bo (INPUT TABLE tt-Customer).

END. IF

END.

RUN UpdateRecord IN h-bo.

Pontos de Chamada DBO A chamada da EPC feita por intermdio da include method/dboupd.i. Todas as chamadas de EPC em DBO tratam retorno de erro. Na EPC de DBO possvel executar todos os mtodos disponveis na DBO, pois o parmetro passado o handle da DBO. para as DBOs existem chamadas EPC nos seguintes eventos:
Evento BeforeCreateRecord AfterCreateRecord BeforeDeleteRecord AfterDeleteRecord BeforeUpdateRecord AfterUpdateRecord Mtodo Padro CREATERECORD CREATERECORD DELETERECORD DELETERECORD UPDATERECORD UPDATERECORD

Exemplos

Atualizar campo(s) de um registro via EPC de DBO;

{include/i-epc200.i} /*Definio tt-EPC*/ {spbo/bosp001.i tt-Customer} /*Definio Temp-table DBO*/ DEF INPUT PARAM p-ind-event AS CHAR NO-UNDO. DEF INPUT-OUTPUT PARAM TABLE FOR tt-epc. DEF VAR h-BO IF AS HANDLE NO-UNDO.

p-ind-event = "BeforeUpdateRecord" THEN DO: FIND FIRST tt-epc WHERE tt-epc.cod-event = p-ind-event AND tt-epc.cod-parameter = "OBJECT-HANDLE" NO-LOCK NO-ERROR. IF AVAIL tt-epc THEN DO: ASSIGN h-bo = WIDGET-HANDLE(tt-epc.val-parameter). RUN getRecord IN h-bo (OUTPUT TABLE tt-customer). FIND FIRST tt-customer EXCLUSIVE-LOCK NO-ERROR. ASSIGN tt-customer.Address2 = "Rua sem nome". END. RUN setRecord IN h-bo (INPUT TABLE tt-customer).

END.

Validar campo(s) de um registro via EPC de DBO (Gerao de erro);


{include/i-epc200.i} /*Definio tt-EPC*/ {spbo/bosp001.i tt-Customer} /*Definio Temp-table DBO*/ DEF INPUT PARAM p-ind-event AS CHAR NO-UNDO. DEF INPUT-OUTPUT PARAM TABLE FOR tt-epc. DEF VAR h-BO IF AS HANDLE NO-UNDO.

p-ind-event = "AfterUpdateRecord" THEN DO: FIND FIRST tt-epc WHERE tt-epc.cod-event = p-ind-event AND tt-epc.cod-parameter = "OBJECT-HANDLE" NO-LOCK NO-ERROR. IF AVAIL tt-epc THEN DO: ASSIGN h-bo = WIDGET-HANDLE(tt-epc.val-parameter). RUN getRecord IN h-bo (OUTPUT TABLE tt-customer). FIND FIRST tt-customer NO-LOCK NO-ERROR. IF tt-customer.comments = "" THEN DO: CREATE tt-epc. ASSIGN tt-epc.cod-event = "ERROR" tt-epc.cod-parameter = "EPC-ERROR"

External Program Call

29

ser preenchido.". END. END. END.

tt-epc.val-parameter = "O campo comentrio deve

EPCs em Gatilhos de Dicionrios de Dados

As External Program Calls esto disponveis em gatilhos (triggers) de dicionrio de dados, nos gatilhos de WRITE (gravao) e DELETE (eliminao) das tabelas:
EPCs em Gatilhos de WRITE

Para as UPCs, atravs do procedimento de Manuteno de Tabelas do Datasul-EMS, mdulo Bsico (btb/btb006aa.w), o usurio pode determinar o caminho e o nome fsico do programa de customizao a ser executado no gatilho de WRITE de uma determinada tabela do produto. (tabela: tab_dic_dtsul atributo: nom_prog_upc_gat_write).

Para as APPCs, tambm na tabela tab_dic_dtsul, o usurio pode determinar o caminho e o nome fsico do programa de integrao a ser executado no gatilho de WRITE atravs do atributo nom_prog_appc_gat_write.

Ponto de Chamada
Evento WRITE Local final do gatilho Include include/i-epc101.i Trata Retorno ? Sim

Parmetros
Parmetro p-table p-old-table I/O buffer buffer Tipo de Dado buffer de registro buffer de registro Contedo Buffer do registro aps as alteraes Buffer do registro antes das alteraes

Pode retornar ao gatilho que o chamou, atravs do recurso RETURNVALUE, o valor NOK indicando que o evento no deve ser aplicado, retornando o erro ao programa que disparou o gatilho. Assim, possvel atravs de uma EPC, evitar que um registro de uma determinada tabela seja atualizado, e interromper um processamento. EPCs em Gatilhos de DELETE

Atravs do procedimento de Manuteno de Tabelas do Banco de Dados, mdulo Bsico, o usurio pode determinar o caminho e o nome fsico do programa a ser chamado na UPC dos gatilhos de DELETE de uma determinada tabela do produto. (tabela: tab_dic_dtsul atributo:nom_prog_upc_gat_delete), veja o exemplo:

Para as APPCs o atributo nom_prog_appc_gat_delete na tabela de tab_dic_dtsul deve determinar o caminho e o nome fsico do programa a ser chamado na APPC dos gatilhos de DELETE de uma determinada tabela do produto.
Ponto de Chamada

Evento DELETE

Local aps validaes e antes da eliminao em cascata

Include include/i-epc102.i

Trata Retorno ? Sim

External Program Call

31

Parmetros

Parmetro p-table

I/O Buffer

Tipo de Dado buffer de registro

Contedo Buffer do registro que ser eliminado

Pode retornar ao gatilho de DELETE que o chamou, atravs do recurso RETURN-VALUE, o valor NOK indicando que o evento no deve ser aplicado, retornando erro ao programa que disparou o gatilho. Assim, possvel atravs de uma EPC, evitar que um registro de uma determinada tabela seja eliminado, pois possui relacionamentos com outros desenvolvimentos especficos, por exemplo. EPCs em Pontos Estratgicos de Programas H situaes para customizaes e integraes que no so possveis de ser resolvidas atravs de EPCs na interface de programas ou em gatilhos de dicionrio de dados, ento so implementados chamadas EPCs em pontos estratgicos dentro da lgica destes programas do Datasul EMS Framework. Este tipo de EPC somente pode ser implementada em programas que no possuam interface com o usurio, quando no h forma de contornar a necessidade com a utilizao de EPCs de dicionrio de dados. Da mesma forma que para as EPCs de interface de programas, o usurio deve definir o nome e o caminho do programa EPC a ser executado atravs dos atributos nom_prog_upc e nom_prog_appc respectivamente para UPC e APPC. Assim, para viabilizar uma EPC ,por exemplo no programa de clculo do preo mdio (cep/ce0401rp.p), o usurio deve cadastrar o subprograma, onde foi implementada a chamada EPC, na tabela de programas prog_dtsul. Caso houver outra situao de customizao, que no seja possvel de ser resolvida atravs de EPCs, se prope: a construo de um sucinto programa que seja o SETUP da customizao para cada um de seus clientes (caso for parceiro). Este programa, a princpio limparia o contedo dos campos: prog_dtsul.nom_prog_upc e tab_dic_dtsul.nom_prog_upc e aps faria o registro das customizaes daquele cliente. aplicar o programa SETUP de determinado cliente na base sempre que for realizar um teste com o ambiente daquele cliente.

Sugesto:

Parmetros
Parmetro p-ind-event tt-epc I/O Input i-o Tipo de Dado Character temp-table Contedo indicador de evento temporary table com trs atributos: cod-event (character) indicador de evento, sempre o mesmo valor que p-ind-event; cod-parameter (character) cdigo do parmetro indicando o que significa o valor do parmetro; val-parameter (character) valor do parmetro.

Os valores dos parmetros p-ind-event, tt-epc.cod-event e ttepc.cod-parameter so definidos em ingls e sem espaos em branco entre as palavras, substituindo os espaos em branco pelo caracter trao (-), pois o produto internacional e o idioma ingls mundialmente aceito. Qualquer um dos tipos de EPC pode retornar ao programa chamador, atravs do recurso RETURN-VALUE, o valor NOK indicando que o processamento seja interrompido/cancelado para aquela interao, ou ainda tenha outro efeito definido sobre o programa chamador.
Exemplo:

no fonte de um programa sem interface do produto EMS 2.0, a chamada EPC poderia ser implementada da seguinte forma:
/* Include i-epc200.i: Definio Temp-Table tt-epc e dos programas de EPCs */ {include/i-epc200.i XX9999} for each item no-lock: for each tt-epc where tt-epc.cod-event = "Single-Point". delete tt-epc. end. /* Include i-epc200.i2: Criao de registro para TempTable tt-epc */ {include/i-epc200.i2 &CodEvent='"Single-Point"' &CodParameter='"item.it-codigo"' &ValueParameter="item.it-codigo"} /* Include i-epc200.i2: Criao de registro para TempTable tt-epc */ {include/i-epc200.i2 &CodEvent='"Single-Point"' &CodParameter='"item rowid"' &ValueParameter="string(rowid(item))"}

External Program Call

33

/* Include i-epc201.i: Chamada do programa de EPC */ {include/i-epc201.i "Single-Point"} if return-value = "NOK" then /* Exemplo de tratamento de retorno */ undo, leave. end.

J o programa de customizao/integrao teria o seguinte tratamento como base o seguinte cdigo fonte:
/* Include i-epc200.i: Definio Temp-Table tt-epc */ {include/i-epc200.i1} def input param p-ind-event as char no-undo. def input-output param table for tt-epc. for each tt-epc no-lock where tt-epc.cod-event = p-ind-event: /* Exemplo de uso dos parmetros */ disp tt-epc. end.

Localizao de Programas Especficos

Objetivo

Especificar a localizao para armazenamento de programas customizados por terceiros.


Implementao

Esta localizao deve ser feita a partir de um diretrio raiz que deve ter o nome da empresa que desenvolveu o programa especfico. Os diretrios dos mdulos e os nomes dos programas, podem ter o mesmo nome de programas Datasul. A diferena fica na chamada destes programas, isto , para executar um programa especfico e seus sub-programas e includes, deve-se identificar na chamada destes, o nome do diretrio especfico, identificando assim, estes programas como no Datasul. Este diretrio raiz no deve estar sob o diretrio do produto, isto , no deve ser includo no diretrio do produto Datasul instalado e, sim, em um diretrio de instalao prprio. No cadastro destes programas no menu, deve-se ter o nome da empresa que criou o especfico, mais o nome do programa como a chave de identificao. Ainda no cadastro de programas, ser necessrio colocar o nome

da empresa que construiu o especfico antes do <diretrio>/<programa> desejado como nome externo. Para finalizar, o PROPATH deve conter sempre o diretrio do produto Datasul em primeiro lugar, isto , antes do diretrio onde esto os especficos. Para encontrar os programas do especfico, basta adicionar ao PROPATH, o diretrio anterior ao nome da empresa que desenvolveu o especfico, aps o diretrio do produto Datasul.
Exemplo

Caso a empresa XYZ desenvolva programas para o mdulo APP, a localizao dos programas especficos desenvolvidos devem ficar em: C:\EMS20POR\... C:\<diretrio>\XYZ\APP\AP0101.W Para executar programas Datasul, fazer:
RUN APP\AP0101.W

Para cadastrar o programa no menu, fazer: Programa : XYZ/AP0101 Nome externo : XYZ/APP/AP0101.W Para cadastrar uma UPC, fazer: Programa : XYZ/APP/AP0101.P O PROPATH fica:
PROPATH = "c:\<datasul>;c:\<diretrio>;..."

Obs.: O diretrio XYZ est debaixo de c:\<diretrio> Considerae s Gerais a partir do momento que uma EPC for cadastrada para um programa ou gatilho, sempre que for executado este programa ou gatilho feita a chamada para a EPC. Sendo assim, se a EPC estiver cadastrada de forma incorreta ou no existir, vai ser gerado um erro Progress, (<programa> was not found (293)). nos programas chamados pelas EPCs, em gatilhos de dicionrio de dados, no deve ser solicitado qualquer interao do usurio, ou apresentado qualquer tipo de tela (frame) ou caixa de mensagem;

External Program Call

35

deve ser feito ainda uma documentao de como construir os programas EPC, alm do descrito acima, e acompanhar a documentao do produto para o usurios. Desaconselhamos que sejam retirados quaisquer objetos(browser, viewer) de um programa do Datasul EMS utilizando EPCs. Deve-se tomar cuidado com eventos para objetos do produto Datasul EMS Framework, quando se desejar criar um novo evento para um destes objetos, deve-se contatar o mdulo, pois pode-se estar sobrepondo um evento que importante para o produto.

Chamar uma EPC de uma trigger de write;


define input parameter buffer p-table for item no-undo. define input parameter buffer p-old-table for item no-undo. Find cust-table where cust-table.it-codigo = p-table.it-codigo then If not available cust-table then do: create cust-table. buffer-copy p-table cust-table. end.

Chamar uma EPC de uma trigger de delete;


define input parameter buffer p-table for item no-undo.

find cust-table where cust-table.it-codigo = p-table.it-codigo then If not available cust-table then do: create cust-table. buffer-copy p-table cust-table. end.

Como acertar TAB-ORDER em uma EPC

Para acertar o tab-order em uma DPC, pode ser feito da seguinte forma: Por exemplo, imagine a seguinte frame:

A: B: C:

[ [ [

] ] ]

Um programa de customizao deve inserir o fill-in D, que est ao lado de A. Portanto, quando for teclado TAB no fill-in A, ele dever posicionar-se no fill-in D.
varD:MOVE-AFTER-TAB-ITEM(varA:HANDLE).

Tambm, existe o mtodo para mover o fill-in anterior, neste caso:


varD:MOVE-BEFORE-TAB-ITEM(varA:HANDLE).