1
Parte 1
2
Parte 1 9 Conceitos 9 Características 9 ThinMaintenance 9 ThinMasterDetail Parte 2 9 ThinMaintenanceNoNavigation 9 ThinZoom Parte 3 9 ThinWindow 9 ThinReport3
9 ThinFormation Parte 4 9 ThinFormationNoNavigation 9 Técnicas Override de MétodosPesquisas de Chaves Estrangeiras
Pesquisas de Chaves Estrangeiras em Browses Pesquisas de Chaves Estrangeiras com SmartZoom Referências para Chaves Estrangeiras
4
Campos IndicadoresExibir Mensagens de Erro
Reposicionamento Automático do Browser de Zoom Utilização de OCX
Override de eventos do browse no template MasterDetail e Zoom
5
6
9 A arquitetura dos thinTemplates foi definida com o objetivo de separar a camada de lógica de apresentação (interface com o usuário) da camada de lógica da aplicação (regras de negócio).
9 Os thinTemplates, somente executam as regras de negócio contidas nos DBOs. E, assim, podem ser utilizados sem conexão com os bancos de dados.
7
Interface thinTemplates Lógica DBO Dados8
9 Independência de banco de dados
9 Alta performance, podendo o DBO ser executado através do recurso de RPC
9 Normalmente utiliza temp-tables para comunicação com o DBO
9 Normalmente executados de forma persistente
9 Facilidade de customização, pois toda a lógica de interface encontra-se em um único programa
9
11
9 Características
Normalmente todas as funções, com exceção da Pesquisa, são realizadas na própria tela base do programa
Pode ser utilizado tanto para consulta como para manutenção, usando para isto uma ou mais páginas
12
O gerenciamento das páginas do folder é feito pelo programaobjects/thinFolder.w
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)
13
9 Tarefas
Definições dos Preprocessadores
Definição da Temp-table de Comunicação Instância do DBO
Definições das Páginas do Folder Disposição dos widgets nas Páginas Criação do Método goToRecord Triggers de Botões Padrão
14
9 Definições dos Preprocessadores
&GLOBAL-DEFINE Program thinMaintenance &GLOBAL-DEFINE Version 1.00.00.000 &GLOBAL-DEFINE Folder YES
&GLOBAL-DEFINE InitialPage 1
15
&GLOBAL-DEFINE First YES&GLOBAL-DEFINE Prev YES &GLOBAL-DEFINE Next YES &GLOBAL-DEFINE Last YES &GLOBAL-DEFINE GoTo YES &GLOBAL-DEFINE Search YES
16
&GLOBAL-DEFINE Add YES&GLOBAL-DEFINE Copy YES &GLOBAL-DEFINE Update YES &GLOBAL-DEFINE Delete YES &GLOBAL-DEFINE Undo YES &GLOBAL-DEFINE Cancel YES &GLOBAL-DEFINE Save YES
&GLOBAL-DEFINE ttTable ttCustomer &GLOBAL-DEFINE hDBOTable hDBOCustomer &GLOBAL-DEFINE DBOTable Customer
17
&GLOBAL-DEFINE page0KeyFields ttCustomer.Cust-Num&GLOBAL-DEFINE page0Fields ttCustomer.Name &GLOBAL-DEFINE page1Fields ttCustomer.Address
~ ttCustomer.Address2 ~ ttCustomer.City ~ ttCustomer.State ~ ttCustomer.Country &GLOBAL-DEFINE page2Fields ttCustomer.Balance
~
ttCustomer.Sales-Rep
18
Para retirar os botões de Consultas Relacionadas e RelatóriosRelacionados, o desenvolvedor deve incluir o preprocessor padrão referente ao botão que deseja retirar.
&GLOBAL-DEFINE ExcludeBtQueryJoins YES &GLOBAL-DEFINE ExcludeBtReportsJoins YES
19
9 Definição da Temp-table de Comunicação
22
9 Instância do DBO
A criação da instância do DBO deve ser feita manualmente, utilizando ou não o recurso de RPC.
23
9 Parâmetros:
DBOProgram: Nome físico do programa
DBODescription: 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
24
PROCEDURE initializeDBOs:
/*-
--Purpose: Inicializa DBOs Parameters:
Notes:
---*/
/*--- Verifica se o DBO já está inicializado ---*/ IF NOT VALID-HANDLE({&hDBOTable}) THEN DO:
{btb/btb008za.i1 C:/Programs/DBOCustomer.p YES} {btb/btb008za.i2 C:/Programs/DBOCustomer.p '' {&hDBOTable}}
END.
/*--- Abre query CustNum do DBO ---*/
RUN openQueryStatic IN {&hDBOTable} (INPUT "CustNum":U) NO-ERROR.
RETURN "OK":U. END PROCEDURE.
25
9 Definições das Páginas do Folder
O template inicialmente possui 2 (duas) páginas Pode possuir no máximo 8 (oito) páginas
Sem as páginas fPage0 e fPage1 não é possível a inicializar o folder em tempo de execução (EPC)
26
9 A Frame principal fPage0 pode ter somente sua altura alterada, obedecendo:
Posicionamento da linha acrescido da altura dos frames das páginas.
9 Cada página está relacionada a uma widget frame fPage<PageNumber>
27
9 Devem estar posicionados na coluna 3.50;
9 A linha na qual devem estar posicionados fica a 1.45 abaixo do último widget da frame principal (fPage0);
9 A largura não deve ser alterada (84.43);
9 A altura é definida através da quantidade de widgets em linha acrescido de 0.25
29
9 Disposição dos Widgets
Quando for necessário fazer a inclusão de widgets deve-se primeiramente selecionar o frame de trabalho;
31
9 Para os widgets da temp-table de comunicação, deve-se utilizar o botão a seguir:
32
9 Alterar as propriedades dos widgtes inseridos:
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;
33
Para widgets dos tipos editores ou list-box ou radio-set, suasalturas 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.
34
A linha na qual os widgets que estão na primeira linha dosframes das páginas, deve ser 1.17; os demais devem estar a distância de 1.00 do widget anterior.
35
9 Método goToRecord
É responsável pela função de Vá Para da tabela pai, disparada pelo botão btGoTo e pelo menu miGoTo.
36
9 Parâmetros
Nome da tabela a ser utilizado para definir o título da frame de Vá Para
<Tabela>
Nomes dos campos a serem inclusos na frame de Vá Para
<campo N>
Indica o tipo de variável (c = character, d = decimal, i = integer)
<c|d|i>
Descrição Parâmetro
37
PROCEDURE goToRecord:…
DEFINE VARIABLE iCust-Num LIKE ttCustomer.Cust-Num NO-UNDO. DEFINE FRAME fGoToRecord
iCust-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 Customer" DEFAULT-BUTTON btGoToOK CANCEL-BUTTON btGoToCancel. …
38
…ON "CHOOSE":U OF btGoToOK IN FRAME fGoToRecord DO: ASSIGN iCustNum.
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").
RETURN NO-APPLY. END.
… END.
ENABLE iCust-Num btGoToOK btGoToCancel WITH FRAME fGoToRecord.
39
9 Triggers dos Botões Padrão Botão btSearch
Nome do programa a ser executado para realizar a pesquisa de registros
ProgramZoom
Descrição Parâmetro
ON CHOOSE OF btSearch IN FRAME fPage0 /* Search */ OR CHOOSE OF MENU-ITEM miSearch IN MENU mbMain DO:
{method/ZoomReposition.i
&ProgramZoom="C:/Programs/Zoom.w "} END.
40
42
9 Características
Algumas das funções são realizadas na própria tela base do programa;
Pode ser utilizado tanto para consulta como para manutenção, usando para isto uma ou mais páginas;
43
Cada uma das páginas é utilizada para identificar os diferentesfilhos associados a tabela principal do programa;
O gerenciamento das páginas do folder é feito pelo programa objects/thinFolder.w
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)
44
9 Tarefas
Definições dos Preprocessadores
Definição da Temp-table de Comunicação Instância dos DBOs
Definições das Páginas do Folder Disposição dos widgets nas Páginas Criação do Método openQueriesSon Triggers de Botões Padrão
45
9 Definições dos Preprocessadores
&GLOBAL-DEFINE Program thinMasterDetail &GLOBAL-DEFINE Version 1.00.00.000
&GLOBAL-DEFINE Folder YES &GLOBAL-DEFINE InitialPage 1 &GLOBAL-DEFINE FolderLabels Order
46
&GLOBAL-DEFINE First YES&GLOBAL-DEFINE Prev YES &GLOBAL-DEFINE Next YES &GLOBAL-DEFINE Last YES &GLOBAL-DEFINE GoTo YES &GLOBAL-DEFINE Search YES
47
&GLOBAL-DEFINE AddParent YES&GLOBAL-DEFINE CopyParent YES &GLOBAL-DEFINE UpdateParent YES &GLOBAL-DEFINE DeleteParent YES
&GLOBAL-DEFINE AddSon1 YES &GLOBAL-DEFINE CopySon1 YES &GLOBAL-DEFINE UpdateSon1 YES &GLOBAL-DEFINE DeleteSon1 YES
48
&GLOBAL-DEFINE ttParent ttCustomer&GLOBAL-DEFINE hDBOParent hDBOCustomer &GLOBAL-DEFINE DBOParentTable Customer &GLOBAL-DEFINE DBOParentDestroy YES
&GLOBAL-DEFINE ttSon1 ttOrder &GLOBAL-DEFINE hDBOSon1 hDBOOrder &GLOBAL-DEFINE DBOSon1Table Order &GLOBAL-DEFINE DBOSon1Destroy YES
&GLOBAL-DEFINE page0Fields ttCustomer.Cust-Num ~
ttCustomer.Name &GLOBAL-DEFINE page1Browse brSon1
49
9 Quando o programa for utilizado para consulta, deve-se acrescentar o preprocessor padrão a seguir:
O valor YES indica que o programa possui a função de detalhe de filho N, N indica o número da página, podendo variar de 1 até 8 DetailSonN
Descrição Preprocessador
50
9 Para definir o número de registros que devem ser retornados para o browse, deve-se utilizar o preprocessor padrão a seguir:
Número de registros que devem ser retornados no browse
NumRowsReturned
Descrição Preprocessador
51
9 Para retirar os botões de Consultas Relacionadas e Relatórios Relacionados, o desenvolvedor deve incluir o preprocessor padrão referente ao botão que deseja retirar.
&GLOBAL-DEFINE ExcludeBtQueryJoins YES &GLOBAL-DEFINE ExcludeBtReportsJoins YES
52
9 Definição da Temp-table de Comunicação
55
9 Instância do DBO
As criações das instâncias do DBOs (DBO Pai e DBOs Filho) devem ser feitas manualmente, utilizando ou não o recurso de RPC .
56
9 Parâmetros:
DBOProgram: Nome físico do programa DBO pai
DBODescription: Identifica o nome da constraint a ser utilizada inicialmente para o DBO pai
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
57
PROCEDURE initializeDBOs:
/*--- Verifica se o DBO já está inicializado ---*/ IF NOT VALID-HANDLE({&hDBOParent}) THEN DO:
{btb/btb008za.i1 C:/Programs/DBOCustomer.p YES} {btb/btb008za.i2 C:/Programs/DBOCustomer.p '' {&hDBOParent}}
END.
/*--- Abre query CustNum do DBO ---*/
RUN openQueryStatic IN {&hDBOParent} (INPUT "CustNum":U) NO-ERROR.
/*--- Verifica se o DBO já está inicializado ---*/ IF NOT VALID-HANDLE({&hDBOSon1}) THEN DO:
{btb/btb008za.i1 C:/Programs/DBOOrder.p YES}
{btb/btb008za.i2 C:/Programs/DBOOrder.p '' {&hDBOSon1}} END.
RETURN "OK":U. END PROCEDURE.
58
9 Definições das Páginas do Folder
O template inicialmente possui 2 (duas) páginas Pode possuir no máximo 8 (oito) páginas
Sem as páginas fPage0 e fPage1 não é possível a inicializar o folder em tempo de execução (EPC)
59
9 A Frame principal fPage0 pode ter somente sua altura alterada, obedecendo:
Posicionamento da linha acrescido da altura dos frames das páginas.
9 Cada página está relacionada a uma widget frame fPage<PageNumber>
60
Devem estar posicionados na coluna 3.50;A linha na qual devem estar posicionados fica a 1.45 abaixo do último widget da frame principal (fPage0);
A largura não deve ser alterada (84.43);
62
9 Disposição dos Widgets
Quando for necessário fazer a inclusão de widgets deve-se primeiramente selecionar o frame de trabalho;
64
9 Para os widgets da temp-table de comunicação, deve-se utilizar o botão a seguir:
65
9 Alterar as propriedades dos widgtes inseridos:
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;
66
Para widgets dos tipos editores ou list-box ou radio-set, suasalturas 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.
67
9 Devem ser alteradas as propriedades dos widgets dos DBOs Filhos:
os nomes dos botões padrões devem seguir a nomenclatura: btAddSon<PageNumber> (Incluir)
btCopySon<PageNumber> (Copiar) btUpdateSon<PageNumber> (Alterar) btDeleteSon<PageNumber> (Eliminar) btDetailSon<PageNumber> (Detalhar)
68
A largura dos botões padrão deve ser 10.00;A altura dos botões padrão deve ser 1.00; A fonte dos browsers deve ser 2;
A largura dos browsers deve ser 82.00; A altura dos browsers deve ser 8.00;
A claúsula BY dos browsers deve ser a mesma utilizada na query do DBO Filho.
69
9 Método OpenQueriesSon
É responsável por realizar a ligação entre o DBO Pai e os DBOs Filho.
Para tanto é feito o uso do include
masterdetail/OpenQueriesSon.i para atualizar os dados dos browsers filho.
Traz somente os 40 (quarenta) primeiros registros associados aos browsers filho.
70
9 Parâmetros
Número da página, utilizado para designar o nome de alguns widgets, tais como btAddSon<PageNumber>, btCopySon<PageNumber> etc
PageNumber
Identifica o nome da query a ser utilizada para realizar a abertura dos DBOs filho
Query
Nome da tabela pai, utilizado para designar o método linkTo<Parent>
Parent
Descrição Parâmetro
71
PROCEDURE openQueriesSon: {masterdetail/OpenQueriesSon.i &Parent="Customer" &Query="OrderNum" &PageNumber="1"} RETURN "OK":U. END PROCEDURE.72
9 Triggers dos Botões Padrão Botão btAdd
Nome do programa a ser executado para realizar a inclusão de registro da tabela pai
ProgramName
Descrição Parâmetro
ON CHOOSE OF btAdd IN FRAME fPage0 OR
CHOOSE OF MENU-ITEM miAdd IN MENU mbMain DO: RUN addRecord IN THIS-PROCEDURE
(INPUT "C:/Programs/MaintenanceNoNavigationCustomer.w":U). END.
73
9 Triggers dos Botões Padrão Botão btCopy
Nome do programa a ser executado para realizar a cópia de registro da tabela pai
ProgramName
Descrição Parâmetro
ON CHOOSE OF btCopy IN FRAME fPage0 OR
CHOOSE OF MENU-ITEM miCopy IN MENU mbMain DO: RUN copyRecord IN THIS-PROCEDURE
(INPUT "C:/Programs/MaintenanceNoNavigationCustomer.w":U). END.
74
9 Triggers dos Botões Padrão Botão btUpdate
Nome do programa a ser executado para realizar a alteração de registro da tabela pai
ProgramName
Descrição Parâmetro
ON CHOOSE OF btUpdate IN FRAME fPage0 OR
CHOOSE OF MENU-ITEM miUpdate IN MENU mbMain DO: RUN updateRecord IN THIS-PROCEDURE
(INPUT "C:/Programs/MaintenanceNoNavigationCustomer.w":U). END.
75
9 Triggers dos Botões Padrão
Botão btAddSon<PageNumber>
Nome do programa a ser executado para realizar a inclusão de registro da tabela filho.
ProgramSon
Número da página, utilizado para designar o nome de alguns widgets, tais como
btAddSon<PageNumber>, btCopySon<PageNumber> etc ProgramNumber
Descrição Parâmetro
76
ON CHOOSE OF btAddSon1 IN FRAME fPage1 DO:{masterdetail/AddSon.i
&ProgramSon="C:/Programs/MaintenanceNoNavigationOrder.w" &PageNumber="1"}
77
9 Triggers dos Botões Padrão
Botão btCopySon<PageNumber>
Nome do programa a ser executado para realizar a cópia de registro da tabela filho.
ProgramSon
Número da página, utilizado para designar o nome de alguns widgets, tais como
btAddSon<PageNumber>, btCopySon<PageNumber> etc ProgramNumber
Descrição Parâmetro
78
ON CHOOSE OF btCopySon1 IN FRAME fPage1 DO:{masterdetail/CopySon.i
&ProgramSon="C:/Programs/MaintenanceNoNavigationOrder.w" &PageNumber="1"}
79
9 Triggers dos Botões Padrão
Botão btUpdateSon<PageNumber>
Nome do programa a ser executado para realizar a alteração de registro da tabela filho.
ProgramSon
Número da página, utilizado para designar o nome de alguns widgets, tais como
btAddSon<PageNumber>, btCopySon<PageNumber> etc ProgramNumber
Descrição Parâmetro
80
ON CHOOSE OF btUdpateSon1 IN FRAME fPage1 DO:{masterdetail/UpdateSon.i
&ProgramSon="C:/Programs/MaintenanceNoNavigationOrder.w" &PageNumber="1"}
81
9 Triggers dos Botões Padrão
Botão btDeleteSon<PageNumber>
Número da página, utilizado para designar o nome de alguns widgets, tais como btAddSon<PageNumber>, etc PageNumber
Descrição Parâmetro
ON CHOOSE OF btDeleteSon1 IN FRAME fPage1 DO: {masterdetail/DeleteSon.i
&PageNumber="1"} END.
82
9 Triggers dos Botões Padrão
Botão btDetailSon<PageNumber>
Nome do programa a ser executado para realizar a vizualização dos detalhes do registro da tabela filho ProgramSon
Número da página, utilizado para designar o nome de alguns widgets, tais como btAddSon<PageNumber>, btCopySon<PageNumber> etc
ProgramNumber
Descrição Parâmetro
83
ON CHOOSE OF btDetailSon1 IN FRAME fPage1 DO:{masterdetail/DetailSon.i
&ProgramSon="C:/Programs/MaintenanceNoNavigationOrder.w" &PageNumber="1"}
84
9 Triggers dos Botões Padrão Botão btSearch
Nome do programa a ser executado para realizar a pesquisa de registros.
ProgramZoom
Descrição Parâmetro
ON CHOOSE OF btSearch IN FRAME fPage0 /* Search */ OR CHOOSE OF MENU-ITEM miSearch IN MENU mbMain DO:
{method/ZoomReposition.i
&ProgramZoom="C:/Programs/Zoom.w "} END.
85
9 Método goToRecord
É responsável pela função de Vá Para da tabela pai, disparada pelo botão btGoTo e pelo menu miGoTo.
86
9 Parâmetros
Nome da tabela a ser utilizado para definir o título da frame de Vá Para
<Tabela>
Nomes dos campos a serem inclusos na frame de Vá Para
<campo N>
Indica o tipo de variável (c = character, d = decimal, i = integer)
<c|d|i>
Descrição Parâmetro
87
PROCEDURE goToRecord:…
DEFINE VARIABLE iCust-Num LIKE ttCustomer.Cust-Num NO-UNDO. DEFINE FRAME fGoToRecord
iCust-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 Customer" DEFAULT-BUTTON btGoToOK CANCEL-BUTTON btGoToCancel. …
88
…ON "CHOOSE":U OF btGoToOK IN FRAME fGoToRecord DO: ASSIGN iCustNum.
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").
RETURN NO-APPLY. END.
… END.
ENABLE iCust-Num btGoToOK btGoToCancel WITH FRAME fGoToRecord.
89
Este material é de propriedade da DATASUL S.A., sendo proibida a sua reprodução em qualquer meio, total ou parcial, sem aprovação por escrito. Todos os direitos estão reservados. A informação contida aqui é confidencial
e não pode ser utilizada fora da empresa ou das franquias que fazem parte da nossa rede, não podendo ser divulgada para clientes, parceiros ou outra empresa ou indivíduo sem o prévio consentimento de um diretor da
DATASUL S.A. As opiniões expressas aqui estão sujeitas a modificação sem aviso prévio.