Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Customizaç o Spa
Customizaç o Spa
Personalizaciones
Abril/2003
Copyright © 2009 TOTVS S.A. Todos los derechos reservados.
Ninguna parte de este documento puede ser copiada, reproducida, traducida o
transmitida por cualquier medio electrónico o mecánico, en su totalidad o en
parte, sin la prévia autorización escrita de TOTVS S.A., que se reserva el
derecho de efectuar alteraciones sin aviso prévio. TOTVS S.A no asume
ninguna responsabilidad por las consecuencias de cualesquiera errores o
inexactitudes que puedan aparecer en este documento.
TOTVS S.A.
Av. Santos Dumont, 831, Joinville, SC, CP 89.222-900
i
Índice
Índice................................................................................................................. i
CAPÍTULO 1 Introducción..................................................................1
CAPÍTULO 1
Introducción
CAPÍTULO 2
OK / NOK
Saída
Entrada
API
Acesso Extração
de dados
Datasul-EMS
Documentación
Tipos
Toda API creada por Datasul tiene un estándar que está documentado y a partir
de él que son creadas cualesquiera APIs;
Los componentes pueden ser:
Objetivo: Lo que va a ser generado por API, cuando debe ser utilizada,
para que función;
Los parámetros de entrada y salida también tienen su definición, lo que
deben pasar para la API y lo que pueden retornar;
En caso de ocurrencia de error, cuales mensajes de error pueden ser
retornados al programa llamador;
Las documentaciones de APIs están en el directorio docapi, con el nombre
de la api más la extensión .doc;
--- Ejemplo
Parámetros de Entrada:
Temp-table tt-atributos:
En Temp-Table tt-atributos son definidas las características generales de
presentación del gráfico.
Las APIs poseen parámetros de entrada bien definidos y procesos que son
ejecutados de manera correcta sobre el producto;
Las APIs son bien documentadas y ejecutan tareas de acuerdo al objetivo,
funcionando para sus usuarios como una caja negra, o sea, estos no
necesitan saber de que forma el proceso es ejecutado, sólo que, siendo
realizadas las entradas correctas, la API ejecuta el proceso esperado de
manera transparente;
Las integraciones entre módulos del producto Datasul EMS Framework
son realizadas a través de las APIs, por eso este es el camino natural para
que personalizadores integren otras soluciones con el producto;
La tecnología empleada y las reglas de negocio de una API pueden evoluir
haciendo con que el cliente usufrua de estos beneficios sin la necesidad de
reescribir1 sus programas;
Por eso, lo que las APIs proveen es una facilidad más grande, rapidez y
productividad en el desarrollo de personalizaciones;
1
Cuando haya alguna modificación de la interfaz de la API, esta verifica si el
programa llamador está de acuerdo a la nueva interfaz, en caso negativo, es emitido un
mensaje informando que el programa debe ser revisado.
Objetivos
Definición
Personalización
Clientes - Necesidades específicas y especialistas
User Program Call - UPC
Integración
Socios - Integraciones con otros softwares
Application Partner Program Call – APPC
UPC + APPC = EPC
Ejemplo :
Alterar las características de las pantallas: labels, formatos, colores,
posicionamiento, tabulación.
Implementar nuevos campos, nuevos botones con llamada para
subprogramas.
Parámetros
Tanto el programa UPC cuanto el programa APPC reciben los siguientes
parámetros:
Parámetro I/O Tipo de Dato Contenido
p-ind-event Input Character Indicador de Evento
p-ind-object Input Character Indicador de Objeto
p-wgh-object Input Handle Handle de objeto corriente
p-wgh-frame Input Widget-handle Handle de frame corriente
p-cod-table Input Character Nombre de tabla corriente
p-row-table Input Rowid Rowid de registro corriente de tabla
Observación: En el caso del container ser una ventaja de reporte, este sólo
presenta llamada para epc en los eventos change-page, before-initialize,
before-enable, enable e initialize.
Crear un botón nuevo en una window para llamar un subprograma a partir de este;
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 frame = p-wgh-frame
width = 4
height = 1.25
row = 1.26
label = "prueba"
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.
xternal Program Call 11
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 = "Asistencia Técnica"
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 = "x(20)"
width = 12
height = 0.88
row = 2.7
col = 71
bgcolor = 1
fgcolor = 15
label = "Perfil Marketing:"
visible = yes
sensitive = no.
end.
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.
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. /* buscando
Field-Group */
ASSIGN h_Frame = h_Frame:FIRST-CHILD. /* buscando 1º
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.
/* 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)).
end.
end.
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"
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}
AFTER-DISABLE DISABLEFIELDS
BEFORE-DISPLAY DISPLAYFIELDS
AFTER-DISPLAY DISPLAYFIELDS
BEFORE-ENABLE ENABLEFIELDS
AFTER-ENABLE ENABLEFIELDS
BEFORE-INITIALIZE INITIALIZEINTERFACE
AFTER-INITIALIZE INITIALIZEINTERFACE
BEFORE-SAVE-FIELDS SAVEFIELDS
AFTER-SAVE-FIELDS SAVEFIELDS
BEFORE-CHANGE-PAGE CHANGEPAGE
AFTER-CHANGE-PAGE CHANGEPAGE
AFTER-DESTROY-INTERFACE DESTROYINTERFACE
BEFORE-INITIALIZE INITIALIZEINTERFACE
AFTER-INITIALIZE INITIALIZEINTERFACE
BEFORE-CHANGE-PAGE CHANGEPAGE
AFTER-CHANGE-PAGE CHANGEPAGE
END.
DO:
assign h-objeto = p-wgh-frame:FIRST-CHILD.
assign h-objeto = h-frame: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 la carpeta:
Sólo es posible habilitar la carpeta si el programa usa las páginas fPage0 y
fPage1.
def input param p-ind-event as char no-undo.
xternal Program Call 21
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.
FONT = 1.
WH-FILL:LOAD-MOUSE-POINTER("image/lupa.cur":U).
END.
END.
{method/zoomFields.i &ProgramZoom="spp/sp0008a.w"
&FieldZoom1="rep-name"
&frame1="fPage2"
&fieldHandle1=wh-fill}
{spbo/bosp001.i tt-Customer}
WH-FILL:LOAD-MOUSE-POINTER("image/lupa.cur":U).
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.
Ejemplos
Punto de Llamada
Parámetros
de una EPC, evitar que un registro de una determinada tabla sea actualizado, e
interrumpir un procesamiento.
Punto de Llamada
Parámetros
Parámetros
Ejemplo:
en la fuente de un programa sin interfaz del producto EMS 2.0, la
llamada EPC podría ser implementada de la siguiente forma:
Implementación
Esta ubicación debe ser hecha a partir de un directorio raíz que debe
tener el nombre de la empresa que desarrolló el programa específico. Los
directorios de los módulos y los nombres de los programas pueden tener el
mismo nombre de programas Datasul.
La diferencia queda en la llamada de estos programas, o sea, para
ejecutar un programa específico y sus subprogramas e includes, se debe
identificar en su llamada, el nombre del directorio específico, identificando así,
estos programas como no Datasul.
Este directorio raíz no debe estar bajo el directorio del producto, o sea,
no debe ser incluido en el directorio del producto Datasul instalado y, sí, en un
directorio de instalación propio.
En el registro de estos programas en el menú, se debe tener el nombre
de la empresa que creó el específico, además del nombre del programa como
la clave de identificación. Aún en el registro de programas, será necesario
poner el nombre de la empresa que construyó el específico antes del
<directorio>/<programa> deseado como nombre externo.
Para finalizar, el PROPATH debe contener siempre el directorio del
producto Datasul en primer lugar, o sea, antes del directorio donde están los
específicos. Para encontrar los programas del específico, basta añadir al
PROPATH, el directorio anterior al nombre de la empresa que desarrolló el
específico, después del directorio del producto Datasul.
Ejemplo
Si la empresa XYZ desarrolla programas para el módulo APP, la
ubicación de los programas específicos desarrollados deben quedar en:
C:\EMS20POR\...
C:\<directorio>\XYZ\APP\AP0101.W
PROPATH queda:
PROPATH = "c:\<datasul>;c:\<directorio>;..."
Obs: Directorio XYZ está abajo de c:\<directorio>
Consideraciones Generales
A partir del momento en que una EPC es registrada para un programa o gatillo,
siempre que es ejecutado este programa o gatillo es hecha la llamada para la
EPC.
Siendo así, si la EPC está registrada de forma incorrecta o no existe, va a ser
generado un error Progress, (<programa> was not found (293)).
en los programas llamados por las EPCs, en gatillos de diccionario de
datos, no debe ser solicitado cualquier interacción del usuario, o
presentado cualquier tipo de pantalla (frame) o caja de mensaje;
debe ser hecho aún una documentación de como construir los programas
EPC, además de lo descrito arriba, y acompañar la documentación del
producto para los usuarios.
Desaconsejamos que sean retirados cualesquiera objetos (browser, viewer)
de un programa de Datasul EMS usando EPCs.
Se debe tomar cuidado con eventos para objetos del producto Datasul
EMS Framework, cuando se desea crear un nuevo evento para uno de
estos objetos, se debe contactar el módulo, pues se puede estar
sobreponiendo un evento que es importante para el producto.
A: [ ]
B: [ ]
C: [ ]
varD:MOVE-AFTER-TAB-ITEM(varA:HANDLE).
varD:MOVE-BEFORE-TAB-ITEM(varA:HANDLE).