Beruflich Dokumente
Kultur Dokumente
Customizações
Agosto/2012
Copyright © 2009 TOTVS S.A. Todos os direitos reservados.
Nenhuma parte deste documento pode ser copiada, reproduzida, traduzida ou
transmitida por qualquer meio eletrônico ou mecânico, na sua totalidade ou em
parte, sem a prévia autorização escrita da TOTVS S.A., que reserva-se o
direito de efetuar alterações sem aviso prévio. A TOTVS S.A não assume
nenhuma responsabilidade pelas conseqüências de quaisquer erros ou
inexatidões que possam aparecer neste documento.
TOTVS S.A.
Av. Santos Dumont, 831, Joinville, SC, CEP 89.222-900
i
Índice
Índice................................................................................................................. i
CAPÍTULO 1 Introdução...........................................................................1
CAPÍTULO 1
Introdução
CAPÍTULO 2
OK / NOK
Saída
Entrada
API
Acesso Extração
de dados
Datasul-EMS
Documentação
Tipos
Toda API criada pela Datasul possui um padrão que está documentado e a
partir dele que são criadas quaisquer APIs;
Os componentes podem ser:
Objetivo: O que vai ser gerado pela API, quando deve ser utilizada, para
que função ;
Os parâmetros de entrada e saída também possuem sua definição, o que
devem passar para a API e o que podem retornar;
Em caso de ocorrência de erro, quais as mensagens de erro podem ser
retornadas para o programa chamador;
As documentações de APIs estão no diretório docapi, com o nome da api
mais a extensão .doc;
--- Exemplo
Parâmetros de Entrada:
Temp-table tt-atributos:
Na Temp-Table tt-atributos são definidas as características gerais de
apresentação do gráfico.
1
Quando houver alguma alteração 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.
Objetivos
Definição
Customização
Clientes - Necessidades específicas e especialistas
User Program Call - UPC
Integração
Parceiros - Integrações com outros softwares
Application Partner Program Call – APPC
UPC + APPC = EPC
Permissão de Uma APPC pode ser implementada em qualquer cliente, porem o cliente não
Implem pode desenvolver uma APPC. Para implementar uma APPC é necessário que o
entaçã responsável pelo modulo onde a APPC será implementada solicite e autorize a
o implementação da APPC no cliente.
Para implantação de uma APPC é necessário possuir uma rotina para popular o
campo APPC
Exemplo :
Alterar as características das telas: labels, formatos, cores,
posicionamento, tabulação.
Implementar novos campos, novos botões com chamada para sub-
programas.
Parâmetros
Tanto o programa UPC quanto o programa APPC recebem os seguintes
parâmetros:
Criar um botão novo em uma window para chamar um subprograma a partir deste:
def input param p-ind-event as char no-undo.
def input param p-ind-object as char no-undo.
def input param p-wgh-object as handle no-undo.
def input param p-wgh-frame as widget-handle no-undo.
def input param p-cod-table as char no-undo.
def input param p-row-table as rowid no-undo.
if p-ind-event = "INITIALIZE"
and p-ind-object = "CONTAINER" then do:
create button wh-button
assign &IF "{&aplica_facelift}" = "YES" &THEN
FLAT-BUTTON = YES
&ENDIF
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.
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.
def var c-objeto as char no-undo.
if p-ind-event = "INITIALIZE"
and p-ind-object = "VIEWER"
and c-objeto = "'v24ad098.w'" then do:
end.
if p-ind-event = "ADD"
and p-ind-object = "VIEWER"
and c-objeto = "'v24ad098.w'" then do:
end.
if p-ind-event = "ENABLE"
and p-ind-object = "VIEWER"
and c-objeto = "v24ad098.w" then do:
assign wh-button:sensitive = yes
xternal Program Call 13
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.
if p-ind-event = "DISPLAY"
and p-ind-object = "VIEWER"
and c-objeto = "v24ad098.w" then do:
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:
Após encontrar o handle do campo desejado, utilizando a lógica do
item III, fazer o seguinte:
assign c-valor = h-campo:screen-value.
/* 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-wgh-
object,
INPUT "PAGE-
SOURCE":U,
OUTPUT c-folder).
assign h-folder = widget-handle(c-folder) no-error.
do i-objects = 1 to num-entries(c-objects):
assign h-object = widget-handle(entry(i-objects, c-
objects)).
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
xternal Program Call 17
col = 59.5
fgcolor = 1
visible = yes.
if p-ind-event = "ENABLE"
and p-ind-object = "VIEWER"
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.
{include/zoomvar.i &prog-zoom=inzoom/z01in172.w
&proghandle=wh-window
&campohandle=wh-fill
&campozoom=it-codigo}
WIDTH = 15
SCREEN-VALUE = "Comentário:"
ROW = 2
COL = 10
VISIBLE = YES
FONT = 1.
END.
DO:
assign h-objeto = p-wgh-frame:FIRST-CHILD.
do while valid-handle(h-objeto):
IF h-objeto:TYPE <> "field-group" THEN DO:
IF h-objeto:NAME = "cod_pais" 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.
MESSAGE STRING(h-campo:NAME) VIEW-AS ALERT-BOX.
END.
END.
&IF "{&aplica_facelift}" = "YES" &THEN
wh-button:LOAD-IMAGE-UP("image/toolbar/ccmail.bmp").
wh-button:LOAD-IMAGE("image/toolbar/ccmail.bmp").
&ELSE
wh-button:LOAD-IMAGE-UP("image/ccmail.bmp").
wh-button:LOAD-IMAGE("image/ccmail.bmp").
&ENDIF
Habilitar o folder:
xternal Program Call 25
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.
END.
end.
END.
End.
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.
END.
end.
END.
END.
WH-FILL:LOAD-MOUSE-POINTER("image/lupa.cur":U).
END.
END.
{method/zoomFields.i &ProgramZoom="spp/sp0008a.w"
&FieldZoom1="rep-name"
&frame1="fPage1"
&fieldHandle1=wh-fill}
{spbo/bosp001.i tt-Customer}
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.
/* ver observação sobre o NEXT-SIBLING no fim deste exemplo */
END.
ELSE DO:
LEAVE.
END.
end.
END.
END.
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.
Ponto de Chamada
Parâmetros
Ponto de Chamada
Sugestão:
Parâmetros
Caso houver outra situação de customização, que não seja possível de ser
resolvida através de EPC´s, se propõe:
a construção de um sucinto programa que seja o SETUP da customização
para cada um de seus clientes (caso for parceiro). Este programa, a
princípio limparia o conteúdo dos campos: ‘prog_dtsul.nom_prog_upc’ e
‘tab_dic_dtsul.nom_prog_upc’ e após faria o registro das customizações
daquele cliente.
aplicar o programa SETUP de determinado cliente na base sempre que for
realizar um teste com o ambiente daquele cliente.
Parâmetros
xternal Program Call 35
Exemplo:
no fonte de um programa sem interface do produto EMS 2.0, a
chamada EPC poderia ser implementada da seguinte forma:
END.
EMPTY TEMP-TABLE tt-epc.
create tt-epc.
ASSIGN tt-epc.cod-event = "pontoCustom02"
tt-epc.cod-parameter = "atributo"
tt-epc.val-parameter = tabela.atributo.
{include/i-epc202.i1 "piPontoCustom02" "pontoCustom02"}
IF tabela.atributo = "x" THEN DO:
/*condicao de erro*/
{include/i-epc202.i2} /*retira procedure persistente da memoria*/
RETURN "NOK".
END.
{include/i-epc202.i2} /*retira procedure persistente da memoria*/
RETURN "OK".
/*FIM*/
Sugestão:
PROCEDURE piPontoCustom02:
DEFINE INPUT PARAM vPontoCustom AS CHAR NO-UNDO.
DEFINE INPUT-OUTPUT PARAM TABLE FOR tt-epc.
FOR EACH tt-epc WHERE tt-epc.cod-event = vPontoCustom NO-LOCK:
MESSAGE "piPontoCustom02 "
tt-epc.cod-parameter
tt-epc.val-parameter
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
END.
Exemplo:
Observação:
A include não trata a consistência dos parâmetros. Cabe ao programa
chamador validar se os parâmetros estão adequados, sob pena de ocorrerem
erros em tempo de execução se os parâmetros estiverem inconsistentes.
Esta técnica só se aplica aos produtos Datasul EMS 2.06B (ou maiores), EMS
Start, HCM 2.10 (ou maiores) e HCM Start.
Exemplo:
no fonte do programa a ser alterado, inserir o código abaixo.
O ponto onde o código deve ser inserido varia. Em programas
criados no UIB deve ser no main-block, antes da include principal
do main-block. Em programas definidos na mão (todo o código
xternal Program Call 39
Implementação
Esta localização deve ser feita a partir de um diretório raiz que deve ter
o nome da empresa que desenvolveu o programa específico. Os diretórios dos
módulos e os nomes dos programas, podem ter o mesmo nome de programas
Datasul.
A diferença fica na chamada destes programas, isto é, para executar um
programa específico e seus sub-programas e includes, deve-se identificar na
chamada destes, o nome do diretório específico, identificando assim, estes
programas como não Datasul.
Este diretório raiz não deve estar sob o diretório do produto, isto é, não
deve ser incluído no diretório do produto Datasul instalado e, sim, em um
diretório de instalação próprio.
No cadastro destes programas no menu, deve-se ter o nome da empresa
que criou o específico, mais o nome do programa como a chave de
identificação. Ainda no cadastro de programas, será necessário colocar o nome
da empresa que construiu o específico antes do <diretório>/<programa>
desejado como nome externo.
Para finalizar, o PROPATH deve conter sempre o diretório do produto
Datasul em primeiro lugar, isto é, antes do diretório onde estão os específicos.
Para encontrar os programas do específico, basta adicionar ao PROPATH, o
diretório anterior ao nome da empresa que desenvolveu o específico, após o
diretório do produto Datasul.
Exemplo
Caso a empresa XYZ desenvolva programas para o módulo APP, a
localização dos programas específicos desenvolvidos devem ficar em:
C:\EMS20POR\...
C:\<diretório>\XYZ\APP\AP0101.W
O PROPATH fica:
PROPATH = "c:\<datasul>;c:\<diretório>;..."
Obs.: O diretório XYZ está debaixo de c:\<diretório>
Considerações Gerais
A: [ ]
B: [ ]
C: [ ]
varD:MOVE-AFTER-TAB-ITEM(varA:HANDLE).
varD:MOVE-BEFORE-TAB-ITEM(varA:HANDLE).