Académique Documents
Professionnel Documents
Culture Documents
Construção de Programas
Novembro/2009
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
CAPÍTULO 1
Conceitos
Comportamento
Interface Lógica Dados
CAPÍTULO 2
Construindo o thinMaintenance
Vale ressaltar que toda a exemplificação será feita utilizando o banco de dados
Sports.
Tarefas
A seguir é apresentada a lista de tarefas para desenvolvimento do programa.
Preprocessor Descrição
Program Nome do programa - Formato (XX9999)
Version Versão do programa – Formato (9.99.99.999)
Folder O valor YES indica que o programa terá folder
InitialPage Indica em qual página o programa irá iniciar
FolderLabels Descrição de cada uma das páginas do folder
First O valor YES indica que o programa possui a função de
posicionamento no primeiro registro
Prev O valor YES indica que o programa possui a função de
posicionamento no registro anterior
Next O valor YES indica que o programa possui a função de
posicionamento no próximo registro
Last O valor YES indica que o programa possui a função de
posicionamento no último registro
GoTo O valor YES indica que o programa possui a função de
Vá Para
Search O valor YES indica que o programa possui a função de
Pesquisa
Add O valor YES indica que o programa possui a função de
inclusão
Copy O valor YES indica que o programa possui a função de
cópia
Update O valor YES indica que o programa possui a função de
alteração
Delete O valor YES indica que o programa possui a função de
eliminação
Undo O valor YES indica que o programa possui a função de
desfazer
Cancel O valor YES indica que o programa possui a função de
cancelamento
Save O valor YES indica que o programa possui a função de
gravação
ttTable Nome da temp-table utilizada para comunicação com o
DBO
HDBOTable Nome da variável que contém o handle do DBO
DBOTable Nome da tabela principal do DBO
page0KeyFields Nome dos campos chaves que estão na frame fPage0
PageNFields Nome dos campos que estão nas frames fPageN, N
indica o número da página, podendo variar de 0 até 8
EnableMaxButton Caso definido com o valor YES, o template mantém o
botão de maximizar da janela habilitado. O padrão dos
6
Preprocessor Descrição
templates é manter este botão desabilitado.
Temp-Table de Criar a temp-table que é utilizada para realizar a comunicação com o DBO. E
Comunicação deve estar disponível para inclusão de campos em tela.
Para tanto deve-se utilizar o menu Tools | Procedure Settings, botão:
Instância do DBO A criação da instância do DBO deve ser feita manualmente, utilizando ou não
o recurso de RPC. Logo após deve-se definir as restrições iniciais e a abertura
da query caso necessário.
A instância do DBO é feita no método initializeDBOs.
A seguir existe uma tabela que possui o nome dos parâmetros e suas
descrições:
Parâmetro Descrição
DBOProgram Nome físico do programa DBO
Description Identifica o nome da constraint a ser utilizada
inicialmente
Query Identifica o nome da query a ser utilizada para realizar a
abertura inicial do DBO
CAPÍTULO 2 Construindo o thinMaintenance 9
RETURN "OK":U.
END PROCEDURE.
RETURN "OK":U.
END PROCEDURE.
10
Disposição dos Quando for necessário fazer a inclusão de widgets (sejam campos ou widgets
widgets nas comuns) deve-se primeiramente selecionar o frame de trabalho. Para tanto usa-
páginas se o botão:
Após a inclusão dos campos, ou widgets comuns, devem ser feitas algumas
alterações de suas propriedades. Estas são descritas a seguir:
devem estar dispostos em linha, e caso necessário em colunas;
para widgets do tipo fill-in, sua altura deve ser de 0.88;
para widgets dos tipos combo-box, suas alturas devem ser de 1.00;
para widgets dos tipos editores ou list-box ou radio-set, suas alturas devem
ser definidas pelo próprio desenvolvedor;
para os widgets que fazem parte do índice único e suas descrições, devem
ser dispostos no retângulo rtKeys;
a linha na qual os widgets que estão na primeira linha do retângulo rtKeys,
deve ser 2.83; os demais devem estar a distância de 1.00 do widget
anterior;
a linha na qual os widgets que estão na primeira linha dos frames das
páginas, deve ser 1.17; os demais devem estar a distância de 1.00 do
widget anterior.
A seguir existe uma tabela que possui o nome dos parâmetros e suas
descrições:
Parâmetro Descrição
<c|d|i> Indica o tipo de variável (c = character, d = decimal, i =
integer)
<campo N> nomes dos campos a serem inclusos na frame de Vá
Para
<Tabela> nome da tabela a ser utilizado para definir o título da
frame de Vá Para
RETURN NO-APPLY.
END.
SIZE 35 BY 1.42
BGCOLOR 7.
RETURN NO-APPLY.
END.
&ELSE
RUN goToKey IN {&hDBOTable} (INPUT iCustNum).
IF RETURN-VALUE = "NOK":U THEN DO:
RUN utp/ut-msgs.p (INPUT "SHOW":U,
INPUT 2,
INPUT "Customer":U).
RETURN NO-APPLY.
END.
&ENDIF
Considerações
Quando é construído um programa utilizando o template thinMaintenance
necessita-se realizar a implementação de lógicas auxiliares, tais como:
programa de pesquisa de chave estrangeira;
referência para campos de chave estrangeira.
Para tanto, deve-se utilizar o capítulo de Técnicas.
CAPÍTULO 3
Construindo o thinMasterDetail
Vale ressaltar que toda a exemplificação será feita utilizando o banco de dados
Sports.
Tarefas
A seguir é apresentada a lista de tarefas para desenvolvimento do programa.
Preprocessor Descrição
Next O valor YES indica que o programa possui a função de
posicionamento no próximo registro
Last O valor YES indica que o programa possui a função de
posicionamento no último registro
GoTo O valor YES indica que o programa possui a função de
Vá Para
Search O valor YES indica que o programa possui a função de
Pesquisa
AddParent O valor YES indica que o programa possui a função de
inclusão de pai
CopyParent O valor YES indica que o programa possui a função de
cópia de pai
UpdateParent O valor YES indica que o programa possui a função de
alteração de pai
DeleteParent O valor YES indica que o programa possui a função de
eliminação de pai
AddSonN O valor YES indica que o programa possui a função de
inclusão de filho N, N indica o número da página,
podendo variar de 1 até 8
CopySonN O valor YES indica que o programa possui a função de
cópia de filho N, N indica o número da página,
podendo variar de 1 até 8
UpdateSonN O valor YES indica que o programa possui a função de
alteração de filho N, N indica o número da página,
podendo variar de 1 até 8
DeleteSonN O valor YES indica que o programa possui a função de
eliminação de filho N, N indica o número da página,
podendo variar de 1 até 8
ttParent Nome da temp-table pai (principal) utilizada para
comunicação com o DBO
hDBOParent Nome da variável que contém o handle do DBO pai
(principal)
DBOParent Nome da tabela principal do DBO pai (principal)
DBOParentDestroy Valor ou nome da variável lógica que contém flag
indicando se o DBO pai deve ser destruído ao final da
execução do programa, o valor lógica YES indica
destruição
ttSonN Nome da temp-table filha N (secundária) utilizada para
comunicação com o DBO, N indica o número da
página, podendo variar de 1 até 8
22
Preprocessor Descrição
hDBOSonN Nome da variável que contém o handle do DBO filho N
(secundário), N indica o número da página, podendo
variar de 1 até 8
DBOSonN Nome da tabela principal do DBO filho N (secundário),
N indica o número da página, podendo variar de 1 até
8
DBOSonNDestroy Valor ou nome da variável lógica que contém flag
indicando se o DBO filho N deve ser destruído ao final
da execução do programa, o valor lógica YES indica
destruição
page0Fields Nome dos campos da temp-table pai (principal) que
estão na frame fPage0
pageNBrowse Nome do browser que está na frame fPageN, N indica
o número da página, podendo variar de 1 até 8
EnableMaxButton Caso definido com o valor YES, o template mantém o
botão de maximizar da janela habilitado. O padrão dos
templates é manter este botão desabilitado.
Para definir o número de registros que devem ser retornados para o browse,
deve-se utilizar os preprocessors padrão descritos anteriormente e acrescentar
o preprocessor padrão a seguir:
Preprocessor Descrição
NumRowsReturned Número de registros que devem ser retornados no
browse
&GLOBAL-DEFINE AddParent NO
&GLOBAL-DEFINE CopyParent NO
&GLOBAL-DEFINE UpdateParent NO
&GLOBAL-DEFINE DeleteParent NO
&GLOBAL-DEFINE AddSon1 NO
&GLOBAL-DEFINE CopySon1 NO
&GLOBAL-DEFINE UpdateSon1 NO
&GLOBAL-DEFINE DeleteSon1 NO
&GLOBAL-DEFINE DetailSon1 YES
Temp-Table de Criar as temp-tables que são utilizadas para realizar a comunicação com os
Comunicação DBOs. E devem estar disponíveis para inclusão de campos em tela.
Para tanto deve-se utilizar o menu Tools | Procedure Settings, botão:
Instâncias do As criações das instâncias do DBOs (DBO Pai e DBOs Filho) devem ser feitas
DBOs manualmente, utilizando ou não o recurso de RPC. Logo após deve-se definir
as restrições iniciais e a abertura da query do DBO Pai, caso necessário.
26
Parâmetro Descrição
DBOParentProgram Nome físico do programa DBO pai (principal)
Description Identifica o nome da constraint a ser utilizada
inicialmente para o DBO pai (principal)
Query Identifica o nome da query a ser utilizada para realizar
a abertura inicial do DBO pai
DBOProgramSonN Nome físico do programa DBO filho N, N indica o
número da página, podendo variar de 1 até 8
RETURN "OK":U.
END PROCEDURE.
RETURN "OK":U.
END PROCEDURE.
Disposição dos Quando for necessário fazer a inclusão de widgets (sejam campos, widgets
widgets nas comuns ou browses) deve-se primeiramente selecionar o frame de trabalho.
páginas Para tanto usa-se o botão:
Após a inclusão dos campos, ou widgets comuns, devem ser feitas algumas
alterações de suas propriedades. Estas são descritas a seguir:
devem estar dispostos em linha, e caso necessário em colunas;
para widgets do tipo fill-in, sua altura deve ser de 0.88;
para widgets dos tipos combo-box, suas alturas devem ser de 1.00;
para widgets dos tipos editores ou list-box ou radio-set, suas alturas devem
ser definidas pelo próprio desenvolvedor;
para os widgets que fazem parte da temp-table Pai, devem ser dispostos no
retângulo rtParent;
a linha na qual os widgets que estão na primeira linha do retângulo rtKeys,
deve ser 2.83; os demais devem estar a distância de 1.00 do widget
anterior.
Para os widgets que apresentam os valores dos DBOs Filho (browsers e botões
padrão que são Incluir, Copiar, Alterar, Eliminar e Detalhar), devem ser feitas
algumas alterações de suas propriedades. Estas são descritas a seguir:
os nomes dos botões padrões devem seguir a nomenclatura:
btAddSon<PageNumber> (Incluir), btCopySon<PageNumber>
(Copiar), btUpdateSon<PageNumber> (Alterar),
btDeleteSon<PageNumber> (Eliminar) e
btDetailSon<PageNumber> (Detalhar);
a largura dos botões padrão deve ser 10.00;
a altura dos botões padrão deve ser 1.00;
CAPÍTULO 3 Construindo o thinMasterDetail 31
{masterdetail/OpenQueriesSon.i &Parent="Customer"
&Query="OrderNum"
&PageNumber="1"}
RETURN "OK":U.
32
END PROCEDURE.
Quando o programa
{masterdetail/OpenQueriesSon.i
&Parent="Customer"
&Query="OrderNum"
&PageNumber="1"
&QueryConstraint="2"
&ConstraintParameters="iCust-Num"}
RETURN "OK":U.
END PROCEDURE.
Triggers de botões
padrão
CAPÍTULO 3 Construindo o thinMasterDetail 33
RETURN NO-APPLY.
END.
Parameters:
Notes:
---------------------------------------------------------------------*/
RETURN NO-APPLY.
END.
&ELSE
RUN goToKey IN {&hDBOTable} (INPUT iCustNum).
IF RETURN-VALUE = "NOK":U THEN DO:
RUN utp/ut-msgs.p (INPUT "SHOW":U,
CAPÍTULO 3 Construindo o thinMasterDetail 39
INPUT 2,
INPUT "Customer":U).
RETURN NO-APPLY.
END.
&ENDIF
Considerações
Quando é construído um programa utilizando o template thinMasterDetail
necessita-se realizar a implementação de lógicas auxiliares, tais como:
programa de pesquisa de chave estrangeira;
referência para campos de chave estrangeira.
Para tanto, deve-se utilizar o capítulo de Técnicas.
CAPÍTULO 4
Construindo o thinMaintenanceNoNavigation
Vale ressaltar que toda a exemplificação será feita utilizando o banco de dados
Sports.
42
Tarefas
A seguir é apresentada a lista de tarefas para desenvolvimento do programa.
Preprocessor Descrição
indica o número da página, podendo variar de 0 até 8
Mas caso o programa seja utilizado para manutenir uma tabela filho, deve-se
utilizar os preprocessors padrão descritos na tabela a seguir:
Preprocessor Descrição
Program Nome do programa – Formato (XX9999)
Version Versão do programa – Formato (9.99.99.999)
Folder O valor YES indica que o programa terá folder
InitialPage Indica em qual página o programa irá iniciar
FolderLabels Descrição de cada uma das páginas do folder
ttTable Nome da temp-table filho (principal) utilizada para
comunicação com o DBO filho (principal)
44
Preprocessor Descrição
hDBOTable Nome da variável que contém o handle do DBO filho
(principal)
DBOTable Nome da tabela principal do DBO filho (principal)
ttParent Nome da temp-table pai (secundária) utilizada para
comunicação com o DBO pai (secundário)
DBOParent Nome da tabela principal do DBO pai (secundário)
page0KeyFields Nome dos campos chaves da temp-table filho (principal)
que estão na frame fPage0
page0ParentFields Nome dos campos da temp-table pai (secundária) que
estão na frame fPage0
pageNFields Nome dos campos da temp-table filho (principal) que
estão nas frames fPageN, N indica o número da página,
podendo variar de 0 até 8
Temp-Table de Criar a temp-table que é utilizada para realizar a comunicação com o DBO. E
Comunicação deve estar disponível para inclusão de campos em tela.
Para tanto deve-se utilizar o menu Tools | Procedure Settings, botão:
Mas caso o programa seja utilizado para manutenção de tabelas filho, devem-
se criar as temp-tables tanto para as tabelas filho como para a tabela pai.
A tela a seguir exibe as definições de temp-tables para um programa de
manutenção de tabelas filho:
CAPÍTULO 4 Construindo o thinMaintenanceNoNavigation 47
Parâmetros para Como este template é utilizado para estilos diferentes de manutenção. Deve-se
executação do definir os parâmetros como o estilo utilizado.
programa Se o programa for usado para a manutenção de uma tabela pai, deve-se definir
os parâmetros a seguir para o programa:
/* Parameters Definitions --- */
DEFINE INPUT PARAMETER prTable AS ROWID NO-UNDO.
DEFINE INPUT PARAMETER pcAction AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER phCaller AS HANDLE NO-UNDO.
Parâmetro Descrição
valor para o parâmetro
pcAction Indica a ação a ser tomada pelo programa, podendo ter
os valores: Add = Inclusão, Copy = Cópia e Update =
Alteração
phCaller Handle do programa executor
Mas se o programa for usado para a manutenção de uma tabela filho, deve-se
definir os parâmetros a seguir para o programa:
/* Parameters Definitions --- */
DEFINE INPUT PARAMETER prTable AS ROWID NO-UNDO.
DEFINE INPUT PARAMETER prParent AS ROWID NO-UNDO.
DEFINE INPUT PARAMETER pcAction AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER phCaller AS HANDLE NO-UNDO.
DEFINE INPUT PARAMETER piSonPageNumber AS INTEGER NO-UNDO.
RETURN "OK":U.
END PROCEDURE.
Como o template possui estilos diferentes, este método somente deve ser
mantido no caso do programa ser utilizado para a manutenção de registro de
tabela filho.
Disposição dos Quando for necessário fazer a inclusão de widgets (sejam campos ou widgets
widgets nas comuns) deve-se primeiramente selecionar o frame de trabalho. Para tanto usa-
páginas se o botão:
CAPÍTULO 4 Construindo o thinMaintenanceNoNavigation 51
Após a inclusão dos campos, ou widgets comuns, devem ser feitas algumas
alterações de suas propriedades. Estas são descritas a seguir:
devem estar dispostos em linha, e caso necessário em colunas;
para widgets do tipo fill-in, sua altura deve ser de 0.88;
para widgets dos tipos combo-box, suas alturas devem ser de 1.00;
para widgets dos tipos editores ou list-box ou radio-set, suas alturas devem
ser definidas pelo próprio desenvolvedor;
para os widgets que fazem parte do índice único e suas descrições, devem
ser dispostos no retângulo rtKeys;
a linha na qual os widgets que estão na primeira linha do retângulo rtKeys,
deve ser 1.17; os demais devem estar a distância de 1.00 do widget
anterior;
a linha na qual os widgets que estão na primeira linha dos frames das
páginas, deve ser 1.17; os demais devem estar a distância de 1.00 do
widget anterior.
Considerações
Quando é construído um programa utilizando o template
thinMaintenanceNoNavigation necessita-se realizar a implementação de
lógicas auxiliares, tais como:
programa de pesquisa de chave estrangeira;
CAPÍTULO 4 Construindo o thinMaintenanceNoNavigation 53
CAPÍTULO 5
Construindo o thinZoom
Vale ressaltar que toda a exemplificação será feita utilizando o banco de dados
Sports.
56
Tarefas
A seguir é apresentada a lista de tarefas para desenvolvimento do programa.
Preprocessor Descrição
e sem limitação de número de campos. N indica o
número da página, podendo variar de 1 até 8. Neste pré-
processador é necessário informar o nome da base de
dados + nome da tabela + nome do campo. Ex:
sports.customer.cust-num
FieldsAnyKeyPageN Os valores YES e NO, separados por “,”, indicarão quais
campos conterão o evento de ANYKEY. N indica o
número da página, podendo variar de 1 até 8
TtTableN Nome da temp-table N utilizada para comunicação com
o DBO N, N indica o número da página, podendo variar
de 1 até 8
HDBOTableN Nome da variável que contém o handle do DBO N, N
indica o número da página, podendo variar de 1 até 8
DBOTableN Nome da tabela principal do DBO N, N indica o número
da página, podendo variar de 1 até 8
PageNBrowse Nome do browser N que está na frame fPageN, N indica
o número da página, podendo variar de 1 até 8
&GLOBAL-DEFINE InitialPage 1
&GLOBAL-DEFINE FolderLabels Cust-Num,Name
&GLOBAL-DEFINE FieldsAnyKeyPage7
&GLOBAL-DEFINE FieldsAnyKeyPage8
Temp-Table de Criar as temp-tables que são utilizadas para realizar a comunicação com os
Comunicação DBOs. E devem estar disponíveis para a criação dos browsers.
Para tanto deve-se utilizar o menu Tools | Procedure Settings, botão:
Queries para os A query do browser deve ser gerada com um FOR EACH simples na TEMP-
browses TABLE de comunicação da interface. Em cada página do Zoom.
60
Faixas de Entrada As faixas para entrada de valores com as quais o usuário final define os
registros a serem exibidos nos browsers devem ser compatíveis com as
restrições existentes no programa DBO.
A construção das faixas pode ser feita de forma automática, basta o
preenchimento dos pré-processadores Range, FieldsRangePageN e
FieldsAnyKeyPageN que estão explicados na tabela do tópico Preprocessors.
Caso o desenvolvedor opte por criar as faixas manualmente, deve utilizar as
regras a seguir:
incluir widgets compatíveis com as restrições existentes nos DBOs;
caso utilize-se fill-ins, devem possuir a altura 0.88, somente o primeiro
deve possuir label e devem utilizar as imagens: image/im-fir.bmp e
image/im-las.bmp para indicar a faixa inicial e final caso necessário;
CAPÍTULO 5 Construindo o thinZoom 61
Instâncias do As criações das instâncias do DBOs devem ser feitas manualmente, utilizando
DBOs ou não o recurso de RPC. Logo após deve-se definir as restrições iniciais caso
necessário.
As instâncias dos DBOs são feitas na seção Main Block do programa.
A seguir existe uma tabela que possui o nome dos parâmetros e suas
descrições:
Parâmetro Descrição
DBOProgram Nome físico do programa DBO
Description Identifica o nome da constraint a ser utilizada
inicialmente para o DBO
RETURN "OK":U.
END PROCEDURE.
RETURN "OK":U.
END PROCEDURE.
Disposição dos Quando for necessário fazer a inclusão de widgets (sejam campos, widgets
widgets nas comuns ou browses) deve-se primeiramente selecionar o frame de trabalho.
páginas Para tanto usa-se o botão:
{zoom/OpenQueries.i &Query="CustNum"
&PageNumber="1"}
{zoom/OpenQueries.i &Query="Name"
&PageNumber="2"}
RETURN "OK":U.
END PROCEDURE.
{zoom/OpenQueries.i &Query="CustNum"
&PageNumber="1"
&QueryNumber="1"}
{zoom/OpenQueries.i &Query="Name"
&PageNumber="2"
&QueryNumber="2"}
RETURN "OK":U.
END PROCEDURE.
WHEN 2 THEN
/*--- Seta Constraints para o DBOTable2 ---*/
RUN setConstraintName IN {&hDBOTable2}
(INPUT fnIniRangeCharPage(INPUT 2, INPUT 1),
68
RETURN "OK":U.
END PROCEDURE.
Função Descrição
formato decimal, recebe como parâmetro o número
da página e o número da posição do campo na faixa
automática.
WHEN 2 THEN
&IF DEFINED(DBOVersion) <> 0 &THEN
/*--- Seta Constraints para o DBOTable2 ---*/
RUN setConstraint1 IN {&hDBOTable2}
(INPUT fnIniRangeCharPage(INPUT 2, INPUT 1),
INPUT fnEndRangeCharPage(INPUT 2, INPUT 1)).
&ELSE
/*--- Seta Constraints para o DBOTable2 ---*/
RUN setConstraintName IN {&hDBOTable2}
(INPUT fnIniRangeCharPage(INPUT 2, INPUT 1),
INPUT fnEndRangeCharPage(INPUT 2, INPUT 1)).
&ENDIF
70
END CASE.
RETURN "OK":U.
END PROCEDURE.
Exemplo de código:
PROCEDURE returnFieldsPage1:
/*-----------------------------------------------------------------
Purpose: Retorna valores dos campos da página 1
Parameters: recebe nome do campo
retorna valor do campo
Notes:
-----------------------------------------------------------------*/
RETURN "OK":U.
END PROCEDURE.
Triggers de botões Para os botões padrão existem métodos ou includes padrão que precisam ser
padrão definidos.
Inicialmente todos os botões já estão com valores prefixados, somente
necessitanto serem alterados em alguns casos.
A seguir existe uma tabela que possui a identificação das triggers, dos
parâmetros e suas descrições:
Trigger de Choose para o botão btImplant<PageNumber>:
Parâmetro Descrição
ProgramImplant Nome do programa de implantação a ser executado
para realizar a inclusão de novos registro
PageNumber Indica o número da página associado ao botão
CAPÍTULO 6
Construindo o thinWindow
Vale ressaltar que toda a exemplificação será feita utilizando o banco de dados
Sports.
Tarefas
A seguir é apresentada a lista de tarefas para desenvolvimento do programa.
CAPÍTULO 6 Construindo o thinWindow 75
Observação Para os campos do tipo fill-in’s, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opções acima, deve ser efetuado o registro para o WebEnabler, conforme técnica Como registrar
campo do tipo Fill-in para o WebEnabler do Manual de Padrões.
O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que
possuírem a lupa como cursor do mouse, ou que possuírem um botão de zoom na sua direita.
Portanto não é necessário efetuar o registro para esses fill-ins.
Disposição dos Quando for necessário fazer a inclusão de widgets (sejam campos ou widgets
widgets nas comuns) deve-se primeiramente selecionar o frame de trabalho. Para tanto usa-
páginas se o botão:
Considerações
Quando é construído um programa utilizando o template thinWindow
necessita-se realizar a implementação de lógicas auxiliares, tais como:
programa de pesquisa de chave estrangeira;
referência para campos de chave estrangeira.
Para tanto, deve-se utilizar o capítulo de Técnicas.
79
CAPÍTULO 7
Construindo o thinReport
Vale ressaltar que toda a exemplificação será feita utilizando o banco de dados
Sports.
Características As características deste são:
é uma janela do tipo detalhe, isto é, sem menu de barra e moldura,
simulando uma caixa de diálogo;
o botão 'Executar' tem como função executar toda a parametrização
realizada nos Folders;
o botão 'Fechar' do frame sai da tela;
o botão 'Ajuda' é responsável por chamar o help do programa;
Seleção: tudo que é faixa;
Classificação: Radio-set com as opções;
Parâmetros: com exceção da faixa, as outras informações que o usuário
digita;
Digitação: browse updatable.
o gerenciamento das páginas do folder é feito pelo programa
objects/thinFolder.w;
uma das opções de saída do relatório é o formato RTF (Rich Text Format).
faz uso do sistema de tradução de .R, bastando para tanto identificar as
strings que não devem ser traduzidas com :U (Exemplo: "CHOOSE":U).
Observação: O identificador :T no início de alguns comentários, é usado para a
tradução dos fontes dos templates para outros idiomas. Este identificador não
afeta em nada a funcionalidade do programa.
Tarefas
A seguir é apresentada a lista de tarefas para desenvolvimento do programa.
Observar o que são tarefas para programas de Relatório, Importação e
Exportação.
Preprocessors Inicialmente devem ser definidos os valores dos preprocessors padrões do
programa.
CAPÍTULO 7 Construindo o thinReport 81
Preprocessor Descrição
Page4Fields Lista de variáveis disponíveis na página 4
Page5Fields Lista de variáveis disponíveis na página 5
Page6Fields Lista de variáveis disponíveis na página 6
Page7Fields Lista de variáveis disponíveis na página 7
Page8Fields Lista de variáveis disponíveis na página 8
&GLOBAL-DEFINE PGLAY NO
&GLOBAL-DEFINE PGSEL YES
&GLOBAL-DEFINE PGCLA YES
&GLOBAL-DEFINE PGPAR YES
&GLOBAL-DEFINE PGDIG YES
&GLOBAL-DEFINE PGIMP YES
&GLOBAL-DEFINE PGLOG NO
rsExecution
&GLOBAL-DEFINE page7Widgets
&GLOBAL-DEFINE page8Widgets
&GLOBAL-DEFINE page0Text
&GLOBAL-DEFINE page1Text
&GLOBAL-DEFINE page2Text
&GLOBAL-DEFINE page3Text
&GLOBAL-DEFINE page4Text text-entrada
&GLOBAL-DEFINE page5Text
&GLOBAL-DEFINE page6Text text-destino text-modo
&GLOBAL-DEFINE page7Text
&GLOBAL-DEFINE page8Text
&GLOBAL-DEFINE page1Fields
&GLOBAL-DEFINE page2Fields cIniField cEndField
&GLOBAL-DEFINE page3Fields
&GLOBAL-DEFINE page4Fields cInputFile
&GLOBAL-DEFINE page5Fields
&GLOBAL-DEFINE page6Fields cFile
&GLOBAL-DEFINE page7Fields
&GLOBAL-DEFINE page8Fields
Observação Para os campos do tipo fill-in’s, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opções acima, deve ser efetuado o registro para o WebEnabler, conforme técnica Como registrar
campo do tipo Fill-in para o WebEnabler do Manual de Padrões.
O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que
possuírem a lupa como cursor do mouse, ou que possuírem um botão de zoom na sua direita.
Portanto não é necessário efetuar o registro para esses fill-ins.
Disposição dos Quando for necessário fazer a inclusão de widgets (sejam campos ou widgets
widgets nas comuns) deve-se primeiramente selecionar o frame de trabalho. Para tanto usa-
páginas se o botão:
{report/MainBlock.i}
ASSIGN cModelRtf:SCREEN-VALUE IN FRAME fpage6 =
SEARCH("<pasta>\<modelo.rtf>").
onde:
<pasta> = sub-pasta aonde se encontra o arquivo de modelo no propath
<modelo.rtf> = arquivo que contém o modelo no formato rtf
Página de Layout Somente faz-se necessário alterar a página de Layout nos casos onde não se
desejar o box da frame. Para tanto, deve-se acessar as propriedades da frame e
selecionar a opção NO-BOX. Esta página é obrigatória para os programas de
Importação e Exportação.
Criar um arquivo que contenha o layout de importação, nos padrões do
Produto Datasul-EMS.Este arquivo tem o seguinte nome e path:
LAYOUT/LOXX9999.001..
Página de Seleção 1. A sugestão é criar como 'Database Fields' e após convertê-los para
variáveis para obter automaticamente os labels, formatos e tamanhos do
dicionário de dados.
2. Corrigir os 'initial values' das variáveis de inicial e final.
Página de Log Esta página é obrigatória para programas de Importação e Exportação. Para
programas de Relatório não utilizar esta página. Para programas de
Exportação, retirar o campo rsAll, o retângulo e o texto Imprime.
Gravação e 1. Em 'Definitions' implementar os campos de parâmetros e seleção na
validação dos definição da temp-table tt-param.
parâmetros 2. Na procedure 'piExecute', colocar as validações necessárias às opções do
usuário para execução do relatório no local indicado pelo comentário,
lembrando que elas devem apresentar uma mensagem de erro cadastrada,
posicionar na página com problemas, colocando o focus no campo com
problemas.
Exemplo if input frame f-pg-par i-nr-nivel > 19 then do:
run SetFolder IN hFolder (INPUT 2).
run utp/ut-msgs.p (input "show",
input 73,
input " ").
apply 'entry' to i-nr-nivel in frame f-pg-par.
return error.
end.
Dicas para criação O programa de execução do relatório (rp.p) é um programa procedural sem
do programa RP.P qualquer tipo de interface com o usuário, exceto pela própria
de Relatório impressão/visualização do relatório e pela caixa de acompanhamento de
execução (ut-acomp/ut-perc) quando necessário. Da mesma forma, nenhum
programa chamado a partir de um rp.p não deve possuir qualquer tipo de
interface. Todas as validações ou informações com necessidade de intervenção
do usuário devem ser tratadas pelo programa .w que o chama.
90
3. Nas seleções, ao invés de utilizar a palavra "à", para dar idéia de faixa,
substituí-la pelos caracteres "|< >|" semelhantes as imagens utilizadas na
tela de seleção, e que não necessitam ser traduzidos.
4. Em todos os forms/frames de impressão deve-se colocar a cláusula stream-
io.
5. Para utilizar a funcionalidade de impressão para arquivo RTF:
5.1. definir o préprocessador conforme abaixo:
&GLOBAL-DEFINE RTF YES
5.2. definir o préprocessador abaixo setando o tamanho da página:
&SCOPED-DEFINE pagesize N
N é o número de linhas por página e por default seu valor é 42.
Este número deve ser ajustado para cada relatório conforme o tamanho
do modelo RTF que vai ser utilizado. Caso este tamanho não esteja
correto ocorrerá problema na quebra da página.
5.3. a definição da temp-table tt-param deve ser idêntica a definição da
mesma no programa de interface.
5.4. condicionar o VIEW das frames de cabeçalho/rodapé no início do
programa, para que quando o destino for para RTF as mesmas não
sejam apresentadas. Segue exemplo abaixo:
IF tt-param.destino <> 4 THEN DO:
VIEW STREAM str-rp FRAME f-cabec.
CAPÍTULO 7 Construindo o thinReport 91
/* recebimento de parâmetros */
DEFINE INPUT PARAMETER raw-param AS RAW NO-UNDO.
92
CREATE tt-param.
RAW-TRANSFER raw-param TO tt-param.
/* definição de variáveis */
DEFINE VARIABLE h-acomp AS HANDLE NO-UNDO.
/* corpo do relatório */
IF tt-param.classifica = 1 THEN DO:
FOR EACH order WHERE
order.sales-rep = tt-param.sales-rep AND
94
Order.Sales-Rep
Order.Ship-Date
Order.Carrier WITH FRAME f-customer.
DOWN STREAM str-rp WITH FRAME f-customer.
END.
END.
/* recebimento de parâmetros */
def input parameter raw-param as raw no-undo.
def input parameter TABLE for tt-raw-digita.
create tt-param.
RAW-TRANSFER raw-param to tt-param NO-ERROR.
{include/i-rpvar.i}
return "Ok":U.
/* recebimento de parâmetros */
def input parameter raw-param as raw no-undo.
def input parameter TABLE for tt-raw-digita.
create tt-param.
RAW-TRANSFER raw-param to tt-param NO-ERROR.
return "Ok":U.
100
Considerações
Quando é construído um programa utilizando o template thinReport necessita-
se realizar a implementação de lógicas auxiliares, tais como:
programa de pesquisa de chave estrangeira;
referência para campos de chave estrangeira. Para tanto, deve-se utilizar o
capítulo de Técnicas.
CAPÍTULO 7 Construindo o thinReport 101
&endif
SIZE 40 BY .88
BGCOLOR 15 NO-UNDO.
Após a definição da variável text-destino(“DEFINE VARIABLE text-
destino AS CHARACTER”) inserir o seguinte código:
DEFINE VARIABLE text-ModelRtf AS CHARACTER FORMAT
"X(256)":U INITIAL "Modelo:"
VIEW-AS TEXT
SIZE 10 BY .67 NO-UNDO.
Após a definição da variável text-modo(“DEFINE VARIABLE text-
modo AS CHARACTER”) inserir o seguinte código:
DEFINE VARIABLE text-rtf AS CHARACTER FORMAT
"X(256)":U INITIAL "Rich Text Format(RTF)"
VIEW-AS TEXT
SIZE 16 BY .67 NO-UNDO.
Após a definição do retângulo rect-9 (“DEFINE RECTANGLE
RECT-9”) inserir o seguinte código:
DEFINE RECTANGLE rect-rtf
EDGE-PIXELS 2 GRAPHIC-EDGE NO-FILL
SIZE 46.14 BY 3.21.
l-habilitaRtf = NO
&endif
.
end.
when "2":U then do:
assign cFile:sensitive = yes
cFile:visible = yes
btFile:visible = yes
btConfigImpr:visible = no
&IF "{&RTF}":U = "YES":U &THEN
l-habilitaRtf:sensitive = YES
&endif
.
end.
when "3":U then do:
assign cFile:visible = no
cFile:sensitive = no
btFile:visible = no
btConfigImpr:visible = no
&IF "{&RTF}":U = "YES":U &THEN
l-habilitaRtf:sensitive = YES
&endif
.
&IF "{&RTF}":U = "YES":U &THEN
IF VALID-HANDLE(hWenController) THEN DO:
ASSIGN l-habilitaRtf:sensitive = NO
l-habilitaRtf:SCREEN-VALUE IN FRAME
fPage6 = "No"
l-habilitaRtf = NO.
END.
&endif
END.
106
end case.
end.
&IF "{&RTF}":U = "YES":U &THEN
RUN pi-habilitaRtf.
&endif
END.
CAPÍTULO 8
Construindo o thinFormation
Vale ressaltar que toda a exemplificação será feita utilizando o banco de dados
Sports.
Tarefas
A seguir é apresentada a lista de tarefas para desenvolvimento do programa.
Preprocessor Descrição
DelTarget O valor YES indica que o programa possui a função de
retirar na tabela formação
DelAllTarget O valor YES indica que o programa possui a função de
retirar todos na tabela formação
UpdateTarget O valor YES indica que o programa possui a função de
alteração na tabela formação
ttParent Nome da temp-table pai utilizada para comunicação com
o DBO
HDBOParent Nome da variável que contém o handle do DBO pai
DBOParentTable Nome da tabela principal do DBO pai
ttSource Nome da temp-table origem utilizada para cominicação
com o DBO
HDBOSource Nome da variável que contém o handle do DBO origem
DBOSourceTable Nome da tabela principal do DBO origem
ttTarget Nome da temp-table destino (formação) utilizada para
comunicação com o DBO
HDBOTarget Nome da variável que contém o handle do DBO destino
DBOTargetTable Nome da tabela principal do DBO destino
Page0Fields Nome dos campos da temp-table pai (principal) que
estão na frame fPage0
SourceBrowse Nome do browser Origem
TargetBrowse Nome do browser Destino (formação)
Para definir o número de registros que devem ser retornados para o browse,
deve-se utilizar os preprocessors padrão descritos anteriormente e acrescentar
o preprocessor padrão a seguir:
Preprocessor Descrição
NumRowsReturnedSource Número de registros que devem ser retornados
no browse
NumRowsReturnedTarget Número de registros que devem ser retornados
no browse
Temp-Table de Criar as temp-tables que são utilizadas para realizar a comunicação com os
Comunicação DBOs. E devem estar disponíveis para inclusão de campos em tela.
Para tanto deve-se utilizar o menu Tools | Procedure Settings, botão:
Queries para os As queries dos browsers devem ser geradas com um FOR EACH simples na
browses TEMP-TABLE de comunicação da interface.
114
Instâncias do As criações das instâncias do DBOs (DBO Pai, DBO Origem e DBO Destino)
DBOs devem ser feitas manualmente, utilizando ou não o recurso de RPC. Logo após
deve-se definir as restrições iniciais e a abertura da query do DBO Pai, caso
necessário.
As instâncias dos DBOs são feitas no método initializeDBOs.
A seguir existe uma tabela que possui o nome dos parâmetros e suas
descrições:
Parâmetro Descrição
DBOParentProgram Nome físico do programa DBO pai (principal)
Description Identifica o nome da constraint a ser utilizada
inicialmente para o DBO pai (principal)
Query Identifica o nome da query a ser utilizada para realizar
a abertura inicial do DBO pai
CAPÍTULO 8 Construindo o thinFormation 115
Parâmetro Descrição
DBOSourceProgram Nome físico do programa DBO origem
DBOTargetProgram Nome físico do programa DBO destino (formação)
RETURN "OK":U.
END PROCEDURE.
/*-----------------------------------------------------------------
Purpose: Inicializa DBOs
Parameters:
Notes:
-----------------------------------------------------------------*/
RETURN "OK":U.
END PROCEDURE.
Após a inclusão dos campos, ou widgets comuns, devem ser feitas algumas
alterações de suas propriedades. Estas são descritas a seguir:
devem estar dispostos em linha, e caso necessário em colunas;
para widgets do tipo fill-in, sua altura deve ser de 0.88;
para widgets dos tipos combo-box, suas alturas devem ser de 1.00;
para widgets dos tipos editores ou list-box ou radio-set, suas alturas devem
ser definidas pelo próprio desenvolvedor;
para os widgets que fazem parte da temp-table Pai, devem ser dispostos no
retângulo rtParent;
Observação Para os campos do tipo fill-in’s, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opções acima, deve ser efetuado o registro para o WebEnabler, conforme técnica Como registrar
campo do tipo Fill-in para o WebEnabler do Manual de Padrões.
O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que
possuírem a lupa como cursor do mouse, ou que possuírem um botão de zoom na sua direita.
Portanto não é necessário efetuar o registro para esses fill-ins.
Método O método openQueries é responsável por realizar a ligação entre o DBO Pai
openQueries e o DBO destino (formação) e abrir a query do DBO Origem. Para tanto é feito
o uso dos includes formation/OpenQueriesTarget.i para atualizar os
dados do browser Destino e formation/OpenQueriesSource.i para
atualizar os dados do browser Origem.
118
formation/openQueriesSource.i
Parâmetro Descrição
Query Identifica o nome da query a ser utilizada para
realizar a abertura do DBO Origem
ConstraintParameters Parâmetros a serem utilizados para o método
setConstraint{&Description}
OpenAlways O valor YES indica que o browse Origem deve ser
atualizado a cada vez que for efetuada navegação na
tabela Pai
/*----------------------------------------------------------------------
Purpose: Atualiza browsers
Parameters:
Notes:
----------------------------------------------------------------------*/
{Formation/OpenQueriesTarget.i &Parent="Order"
&Query="Order-Num"}
{Formation/OpenQueriesSource.i &Query="Item-Num"
&OpenAlways="no"}
RETURN "OK":U.
END PROCEDURE.
CAPÍTULO 8 Construindo o thinFormation 119
formation/openQueriesSource.i
Parâmetro Descrição
QueryConstraint Número que identifica a query e constraint, a ser
utilizado para passagem de parâmetro para o método
openQuery e para a definição do método
setConstraint{&QueryConstraint}
ConstraintParameters Parâmetros a serem utilizados para o método
setContraint{&QueryConstraint}
OpenAlways O valor YES indica que o browse Origem deve ser
atualizado a cada vez que for efetuada navegação na
tabela Pai
{Formation/OpenQueriesTarget.i &QueryConstraint="1"
&ConstraintParameters=ttOrder.Order-Num}
{Formation/OpenQueriesSource.i &QueryConstraint="1"
&OpenAlways="no"}
RETURN "OK":U.
END PROCEDURE.
120
/*-----------------------------------------------------------------
Purpose: Salva valores dos campos da tabela formação ({&ttTarget})
com base nos campos da tabela pai ({&ttParent}) e tabela
origem ({&ttSource})
Parameters:
-----------------------------------------------------------------*/
assign {&ttTarget}.order-num = {&ttParent}.order-num
{&ttTarget}.item-num = {&ttSource}.item-num
{&ttTarget}.qty = 1
{&ttTarget}.Price = {&ttSource}.price.
RETURN "OK":U.
END PROCEDURE.
Triggers de botões Para os botões padrão existem métodos ou includes padrão que precisam ser
padrão definidos.
Inicialmente todos os botões já estão com valores prefixados, somente
necessitanto serem alterados em alguns casos.
A seguir existe uma tabela que possui a identificação das triggers, dos
parâmetros e suas descrições:
Trigger de Choose para o botão btUpdateTarget :
Parâmetro Descrição
ProgramTarget Nome do programa a ser executado para realizar a
alteração de registro da tabela formação
BGCOLOR 8.
DEFINE RECTANGLE rtGoToButton
EDGE-PIXELS 2 GRAPHIC-EDGE
SIZE 35 BY 1.42
BGCOLOR 7.
DEFINE VARIABLE rGoTo AS ROWID NO-UNDO.
DEFINE VARIABLE iOrder-Num LIKE ttOrder.Order-Num NO-UNDO.
DEFINE FRAME fGoToRecord
iOrder-Num AT ROW 1.21 COL 15 COLON-ALIGNED
btGoToOK AT ROW 2.63 COL 2.14
btGoToCancel AT ROW 2.63 COL 13
rtGoToButton AT ROW 2.38 COL 1
SPACE(0.28)
WITH VIEW-AS DIALOG-BOX KEEP-TAB-ORDER SIDE-LABELS NO-UNDERLINE
THREE-D SCROLLABLE FONT 1 TITLE "Vá Para Order"
DEFAULT-BUTTON btGoToOK CANCEL-BUTTON btGoToCancel.
RETURN NO-APPLY.
END.
RETURN NO-APPLY.
124
END.
&ELSE
RUN goToKey IN {&hDBOTable} (INPUT iOrderNum).
IF RETURN-VALUE = "NOK":U THEN DO:
RUN utp/ut-msgs.p (INPUT "SHOW":U,
INPUT 2,
INPUT "Order":U).
RETURN NO-APPLY.
END.
&ENDIF
Considerações
Quando é construído um programa utilizando o template thinFormation
necessita-se realizar a implementação de lógicas auxiliares, tais como:
programa de pesquisa de chave estrangeira;
referência para campos de chave estrangeira.
Para tanto, deve-se utilizar o capítulo de Técnicas.
CAPÍTULO 9
Construindo o thinFormationNoNavigation
thinFormationNoNavigation:
CAPÍTULO 9 Construindo o thinFormationNoNavigation 127
Vale ressaltar que toda a exemplificação será feita utilizando o banco de dados
Sports.
Tarefas
A seguir é apresentada a lista de tarefas para desenvolvimento do programa.
Preprocessor Descrição
com o DBO
HDBOSource Nome da variável que contém o handle do DBO origem
DBOSourceTable Nome da tabela principal do DBO origem
ttTarget Nome da temp-table destino (formação) utilizada para
comunicação com o DBO
HDBOTarget Nome da variável que contém o handle do DBO destino
DBOTargetTable Nome da tabela principal do DBO destino
Page0Fields Nome dos campos da temp-table pai (principal) que
estão na frame fPage0
SourceBrowse Nome do browser Origem
TargetBrowse Nome do browser Destino (formação)
Temp-Table de Criar as temp-tables que são utilizadas para realizar a comunicação com os
Comunicação DBOs. E devem estar disponíveis para inclusão de campos em tela.
Para tanto deve-se utilizar o menu Tools | Procedure Settings, botão:
Instâncias do As criações das instâncias do DBOs (DBO Pai, DBO Origem e DBO Destino)
DBOs devem ser feitas manualmente, utilizando ou não o recurso de RPC. Logo após
deve-se definir as restrições iniciais e a abertura da query do DBO Pai, caso
necessário.
As instâncias dos DBOs são feitas no método initializeDBOs.
A seguir existe uma tabela que possui o nome dos parâmetros e suas
descrições:
Parâmetro Descrição
DBOParentProgram Nome físico do programa DBO pai (principal)
Description Identifica o nome da constraint a ser utilizada
inicialmente para o DBO pai (principal)
Query Identifica o nome da query a ser utilizada para realizar
a abertura inicial do DBO pai
CAPÍTULO 9 Construindo o thinFormationNoNavigation 131
Parâmetro Descrição
DBOSourceProgram Nome físico do programa DBO origem
DBOTargetProgram Nome físico do programa DBO destino (formação)
RETURN "OK":U.
END PROCEDURE.
/*-----------------------------------------------------------------
Purpose: Inicializa DBOs
Parameters:
Notes:
-----------------------------------------------------------------*/
RETURN "OK":U.
END PROCEDURE.
Após a inclusão dos campos, ou widgets comuns, devem ser feitas algumas
alterações de suas propriedades. Estas são descritas a seguir:
devem estar dispostos em linha, e caso necessário em colunas;
para widgets do tipo fill-in, sua altura deve ser de 0.88;
para widgets dos tipos combo-box, suas alturas devem ser de 1.00;
para widgets dos tipos editores ou list-box ou radio-set, suas alturas devem
ser definidas pelo próprio desenvolvedor;
para os widgets que fazem parte da temp-table Pai, devem ser dispostos no
retângulo rtParent;
Observação Para os campos do tipo fill-in’s, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opções acima, deve ser efetuado o registro para o WebEnabler, conforme técnica Como registrar
campo do tipo Fill-in para o WebEnabler do Manual de Padrões.
O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que
possuírem a lupa como cursor do mouse, ou que possuírem um botão de zoom na sua direita.
Portanto não é necessário efetuar o registro para esses fill-ins.
Método O método openQueries é responsável por realizar a ligação entre o DBO Pai
openQueries e o DBO destino (formação) e abrir a query do DBO Origem. Para tanto é feito
o uso dos includes formationNoNavigation/OpenQueriesTarget.i
para atualizar os dados do browser Destino e
formationNoNavigation/OpenQueriesSource.i para atualizar os
dados do browser Origem.
134
A seguir existe uma tabela que possui o nome dos parâmetros e suas
descrições:
formationNoNavigation/openQueriesTarget.i
Parâmetro Descrição
Parent Nome da tabela pai, utilizado para designar o método
linkTo<Parent>
Query Identifica o nome da query a ser utilizada para
realizar a abertura do DBO Destino
formationNoNavigation/openQueriesSource.i
Parâmetro Descrição
Query Identifica o nome da query a ser utilizada para
realizar a abertura do DBO Origem
ConstraintParameters Parâmetros a serem utilizados para o método
setConstraint{&Description}
OpenAlways O valor YES indica que o browse Origem deve ser
atualizado a cada vez que for efetuada navegação na
tabela Pai
/*----------------------------------------------------------------------
Purpose: Atualiza browsers
Parameters:
Notes:
----------------------------------------------------------------------*/
{FormationNoNavigation/OpenQueriesTarget.i &Parent="Order"
&Query="Order-Num"}
{FormationNoNavigation/OpenQueriesSource.i &Query="Item-Num"
&OpenAlways="no"}
CAPÍTULO 9 Construindo o thinFormationNoNavigation 135
RETURN "OK":U.
END PROCEDURE.
formationNoNavigation/openQueriesSource.i
Parâmetro Descrição
QueryConstraint Número que identifica a query e constraint, a ser
utilizado para passagem de parâmetro para o método
openQuery e para a definição do método
setConstraint{&QueryConstraint}
ConstraintParameters Parâmetros a serem utilizados para o método
setContraint{&QueryConstraint}
OpenAlways O valor YES indica que o browse Origem deve ser
atualizado a cada vez que for efetuada navegação na
tabela Pai
{Formation/OpenQueriesTarget.i &QueryConstraint="1"
&ConstraintParameters=ttOrder.Order-Num}
{Formation/OpenQueriesSource.i &QueryConstraint="1"
136
&OpenAlways="no"}
RETURN "OK":U.
END PROCEDURE.
/*-----------------------------------------------------------------
Purpose: Salva valores dos campos da tabela formação ({&ttTarget})
com base nos campos da tabela pai ({&ttParent}) e tabela
origem ({&ttSource})
Parameters:
-----------------------------------------------------------------*/
assign {&ttTarget}.order-num = {&ttParent}.order-num
{&ttTarget}.item-num = {&ttSource}.item-num
{&ttTarget}.qty = 1
{&ttTarget}.Price = {&ttSource}.price.
RETURN "OK":U.
END PROCEDURE.
Triggers de bot ões Para os botões padrão existem métodos ou includes padrão que precisam ser
padrão definidos.
Inicialmente todos os botões já estão com valores prefixados, somente
necessitanto serem alterados em alguns casos.
A seguir existe uma tabela que possui a identificação das triggers, dos
parâmetros e suas descrições:
Trigger de Choose para o botão btUpdateTarget :
Parâmetro Descrição
ProgramTarget Nome do programa a ser executado para realizar a
alteração de registro da tabela formação
END.
Considerações
Quando é construído um programa utilizando o template
thinFormationNoNaviagation necessita-se realizar a implementação de lógicas
auxiliares, tais como:
programa de pesquisa de chave estrangeira;
referência para campos de chave estrangeira.
Para tanto, deve-se utilizar o capítulo de Técnicas.
CAPÍTULO 10
Técnicas
Introdução Neste estão informações para que o desenvolvedor possa implementar novas
funcionalidades em seus programas construídos com os thinTemplates.
Vale ressaltar que toda a exemplificação será feita utilizando o banco de dados
Sports.
Override de métodos
Em muitas situações faz-se necessária a customização de métodos básicos
(àqueles definidos internamente nos includes padrão), a fim de facilitar este
tipo de customização foi desenvolvida esta técnica.
A técnica consiste em executar 2 (dois) métodos, sendo chamados no ponto
inicial e final de um método básico. A seguir está listada uma tabela com os
métodos que possuem override:
Método Descrição
saveFields Grava alterações feitas pelo usuário final na temp-table
de comunicação
thinMaintenance e thinMaintenanceNoNavigation
displayFields Atualiza dados da temp-table de comunicação em tela
thinMaintenance, thinMasterDetail e thinMaintenanceNoNavigation
displayWidgets Exibe widgets em tela
ThinWindow
DisableFields Desabilita campos em tela
thinMaintenance , thinMaintenanceNoNavigation e thinReport
enableFields Habilita campos em tela
thinMaintenance , thinMaintenanceNoNavigation e thinReport
enableWidgets Habilita widgets em tela
140
Método Descrição
ThinWindow
controlToolBar Seta estado dos botões/menus principais do programa
thinMaintenance e thinMasterDetail
destroyInterface Destrói programa e os DBOs principais
thinMaintenance, thinMasterDetail, thinMaintenanceNoNavigation, thinZoom ,
thinWindow e thinReport
initializeInterface Inicializa programa
thinMaintenance, thinMasterDetail, thinMaintenanceNoNavigation, thinZoom ,
thinWindow e thinReport
ChangePage Troca de página
thinMaintenance, thinMasterDetail, thinMaintenanceNoNavigation, thinZoom e
thinWindow
Para tanto deve-se utilizar uma nomenclatura específica para a definição dos
métodos de override. A seguir é exibida a regra de nomenclatura:
<before/after><nome-do-método-básico>
Exemplo de override do método displayFields:
PROCEDURE beforeDisplayFields:
/*-----------------------------------------------------------------
Purpose: Override do método displayFields (before)
Parameters:
Notes:
-----------------------------------------------------------------*/
RETURN "OK":U.
END PROCEDURE.
PROCEDURE afterDisplayFields:
/*-----------------------------------------------------------------
Purpose: Override do método displayFields (after)
Parameters:
Notes:
-----------------------------------------------------------------*/
RETURN "OK":U.
END PROCEDURE.
Parâmetro Descrição
RunMethod Indica a linha de comando, que contém a chamada a
um método do programa de pesquisa
A variável hProgramZoom contém o handle do
programa de pesquisa
EnableImplant Os valores YES e NO indicam se o botão Implantar
será habilitado ou não.
Além disso, deve-se setar o cursor do mouse para lupa, para tanto deve-se
utilizar a lógica a seguir na sessão Main Block do programa:
/*--- Seta cursor do mouse para lupa, quando estiver posicionado
sobre o fill-in ---*/
ttCustomer.Sales-Rep:LOAD-MOUSE-POINTER("image/lupa.cur":U)
IN FRAME fPage2.
Parâmetro Descrição
em conjunto com os parâmetros FieldZoomN,
FieldScreenN e FrameN
RunMethod Indica a linha de comando, que contém a chamada a
um método do programa de pesquisa
A variável hProgramZoom contém o handle do
programa de pesquisa
EnableImplant Os valores YES e NO indicam se o botão Implantar
será habilitado ou não.
Além disso, deve-se setar o cursor do mouse para lupa, para tanto deve-se
utilizar a lógica a seguir na sessão Main Block do programa:
/*--- Seta cursor do mousr para lupa, quando estiver posicionado
sobre o fill-in ---*/
ttCustomer.Sales-Rep:LOAD-MOUSE-POINTER("image/lupa.cur":U) IN
FRAME fPage2.
Parâmetro Descrição
quando deseja-se fazer mais de uma chamada ao
include)
RETURN "OK":U.
END PROCEDURE.
IF VALID-HANDLE(hDBOSalesRep)
RUN destroy IN hDBOSalesRep.
CAPÍTULO 10 Técnicas 149
RETURN "OK":U.
END PROCEDURE.
Parâmetro Descrição
goToKey, N indica um número que pode variar de 1 até
10
FieldNameN Indica o nome do campo a ser retornado pelo programa
DBO, N indica um número que pode variar de 1 até 10
VariableN Indica o nome da variável que deve receber o valor
retornado pelo programa DBO, N indica um número
que pode variar de 1 até 10
ExcludeVars Indica se as variáveis utilizadas pelo include devem ser
ou não definido, este é um parâmetro opcional
(normalmente é utilizado em procedure internas
quando deseja-se fazer mais de uma chamada ao
include)
{method/ReferenceFields.i
&HandleDBOLeave="hDBOSalesRep"
&KeyValue1="pcSales-Rep"
&FieldName1="Rep-Name"
&Variable1="cRep-NameAux"}
RETURN cRep-NameAux.
END FUNCTION.
Parâmetro Descrição
VariableHandle Identifica o nome da variável handle que conterá o
handle do programa DBO
Query Nome da query a ser utilizada para a abertura de query
inicial do programa DBO
IF VALID-HANDLE(hDBOSalesRep)
RUN destroy IN hDBOSalesRep.
RETURN "OK":U.
END PROCEDURE.
{method/ReferenceFields.i
&HandleDBOLeave="hDBOSalesRep"
&FindMethod="findSales-Rep"
&KeyValue1="pcSales-Rep"
&FieldName1="Rep-Name"
&Variable1="cRep-NameAux"}
RETURN cRep-NameAux.
END FUNCTION.
Exemplo de código:
PROCEDURE afterDisplayFields:
/*-----------------------------------------------------------------
Purpose: Override do método displayFields (after)
Parameters:
Notes:
-----------------------------------------------------------------*/
RETURN "OK":U.
END PROCEDURE.
RETURN "OK":U.
END PROCEDURE.
{method/ShowMessage.i2}
Caso seja necessário que o Utilitário funcione como uma janela modal, deve-
se utilizar o parâmetro &Modal com valor YES, conforme modelo a seguir:
{method/ShowMessage.i2 &Modal="YES"}
{method/ShowMessage.i3}
RETURN "OK":U.
END PROCEDURE.
Utilização de OCX
Quando for necessária a utilização de OCX com thinTemplates é necessário
que todas as FRAMEs existentes no programa tenham a opção NO-BOX
selecionada. Veja a imagem a seguir:
160
CAPÍTULO 10 Técnicas 161
Método Descrição
SetImage Coloca uma imagem na aba do folder, em fez de um
label
SetFolder Posiciona uma página do thinFolder
GetCurrentFolder Retorna a página corrente do Folder
SetEnabled Permite habilitar/desabilitar uma página do thinFolder
InsertFolder Inclui dinamicamente uma nova página no thinFolder
DeleteFolder Elimina dinamicamente uma página do thinFolder
Usando os A seguir está a descrição do que pode ser feito com os recursos avançados do
Recursos thinFolder:
Considerações:
Hfolder : variável handle que representa o thinFolder.
Primeiro parâmetro: identifica qual página a ser posicionada no Folder.
CAPÍTULO 10 Técnicas 163
Considerações:
HFolder: variável handle que representa o thinFolder.
<VAR> : variável do tipo inteiro que recebe o valor referente a página
corrente do folder.
Habilitando/Desabilitando páginas.
Uma página pode ser desabilitada e habilitada novamente usando o método
setEnabled. O exemplo a seguir desabilita a página 2 e em seguida habilita a
página 1:
RUN setEnabled IN hFolder (INPUT 2, INPUT FALSE).
RUN setEnabled IN hFolder (INPUT 1, INPUT TRUE).
Considerações:
- hFolder: variável handle que representa o thinFolder.
- Primeiro parâmetro: identifica a página a ser habilitada/desabilitada.
- Segundo parâmetro: indica se a página será habilitada (TRUE) ou
desabilitada (FALSE).
INPUT “image/ii-pag1”).
Considerações:
- hFolder: variável handle que representa o thinFolder.
- Primeiro parâmetro: identifica a página a ter a aba alterada para imagem.
- Segundo parâmetro: indica a imagem que será utilizada quando a página
estiver selecionada.
- Terceiro parâmetro: indica a imagem que será utilizada quando a página
não estiver selecionada.
Considerações:
- hFolder: variável handle que representa o thinFolder.
- Primeiro parâmetro: identifica a página a ser eliminada.
Considerações:
- hFolder: variável handle que representa o thinFolder.
- Primeiro parâmetro: identifica a posição onde a nova página será incluída.
Um valor ? insere a página após todas as outras. Um valor numérico inclui
CAPÍTULO 10 Técnicas 165
PROCEDURE BeforeInitializeInterface :
/*----------------------------------------------------------------------
Purpose:
Parameters: <none>
Notes:
----------------------------------------------------------------------*/
END PROCEDURE.
Requisitos Para desenvolver para o produto Datasul 10, é necessário possuir um server do
gerenciador de licenças instalado e o foundation precisa estar inicializado.
Configurações É preciso alterar a include que possui a versão dos bancos de dados (i_dbvers.i)
inserindo o banco EMSFND. Para isso deve ser alterado a include include/i_dbvers.i
encontrada na expedição do produto para inserir a definição do préprocessador do
banco EMSFND conforme exemplo abaixo.
/* Preprocessadores que identificam os bancos do Produto
Foundation */ &GLOBAL-DEFINE emsfnd_version 1.01
Nota O codigo do módulo a ser informado deve fazer parte dos módulos contratados que estao
disponiveis na licença enviada para o cliente.
Exemplo:
&IF "{&EMSFND_VERSION}" >= "1.00" &THEN
{include/i-license-manager.i CT0301D MCT}
&ENDIF
Sendo,
Nota O codigo do módulo a ser informado deve fazer parte dos módulos contratados que estao
disponiveis na licença enviada para o cliente.
Exemplo:
&IF "{&EMSFND_VERSION}" >= "1.00" &THEN
{include/i-license-manager.i CT0301D MCT}
&ENDIF