1
Parte 3
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 Indicadores Exibir 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
8
9 CaracterísticasPode ser utilizado tanto como Janela Mestre ou Janela Detalhe, usando para isto uma ou mais páginas;
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).
9
9 TarefasDefinições dos Preprocessadores Definições das Páginas do Folder Disposição dos widgets nas Páginas
10
9 Definições dos Preprocessadores
&GLOBAL-DEFINE Program thinMaintenance &GLOBAL-DEFINE Version 1.00.00.000 &GLOBAL-DEFINE WindowType Detail &GLOBAL-DEFINE Folder YES &GLOBAL-DEFINE InitialPage 1
&GLOBAL-DEFINE FolderLabels Local Default &GLOBAL-DEFINE page0Widgets btOk btHelp &GLOBAL-DEFINE page1Widgets
11
9 Definições das Páginas do FolderO template inicialmente possui 2 (duas) páginas Pode possuir no máximo 8 (oito) páginas
A Frame principal fPage0 pode ter somente sua altura alterada, obedecendo:
Posicionamento da linha acrescido da altura dos frames das páginas.
12
9 Cada página está relacionada a uma widget framefPage<PageNumber>
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);
A altura é definida através da quantidade de widgets em linha acrescido de 0.25.
14
9 Disposição dos WidgetsQuando for necessário fazer a inclusão de widgets deve-se primeiramente selecionar o frame de trabalho;
16
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;
17
Para widgets dos tipos editores ou list-box ou radio-set, suas alturas devem ser definidas pelo próprio desenvolvedor; 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.
18
20
9 CaracterísticasÉ 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;
21
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).
22
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).
23
9 TarefasDefinições dos Preprocessadores Definições das Páginas do Folder Disposição dos widgets nas Páginas Preparação do Programa de Interface
Página de Layout Página de Seleção Página de Classificação Página de Parâmetros
24
Página de Digitação Página de Impressão Página de Log
Gravação e Validação dos Registros
25
9 Definições dos Preprocessadores&GLOBAL-DEFINE Program thinReport &GLOBAL-DEFINE Version 1.00.00.000 &GLOBAL-DEFINE VersionLayout
&GLOBAL-DEFINE Folder YES &GLOBAL-DEFINE InitialPage 1
&GLOBAL-DEFINE FolderLabels Seleção,Classificação, Parâmetro, Digitação,Impressão
26
&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
27
&GLOBAL-DEFINE page0Widgets btOk ~ btCancel ~ btHelp2 &GLOBAL-DEFINE page1Widgets
&GLOBAL-DEFINE page2Widgets
&GLOBAL-DEFINE page3Widgets rsClassif &GLOBAL-DEFINE page4Widgets lParameter ~
28
&GLOBAL-DEFINE page5Widgets brDigita ~ btAdd ~ btUpdate ~ btDelete ~ btSave ~ btOpen
&GLOBAL-DEFINE page6Widgets rsDestiny ~ btConfigImpr ~ btFile ~
rsExecution &GLOBAL-DEFINE page7Widgets
29
&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
30
&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
31
9 Definições das Páginas do FolderO template inicialmente possui 7 (sete) páginas: fPage0 – Principal fPage1 - Layout fPage2 – Seleção fPage3 - Classificação fPage4 – Parâmetro fPage5 - Digitação fPage6– Impressão fPage7 - Log
32
9 A Frame principal fPage0 pode ter somente sua alturaalterada, obedecendo:
Posicionamento da linha acrescido da altura dos frames das páginas.
9 Cada página está relacionada a uma widget frame fPage<PageNumber>
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);
33
A largura não deve ser alterada (84.43);
A altura é definida através da quantidade de widgets em linha acrescido de 0.25
35
9 Disposição dos WidgetsQuando for necessário fazer a inclusão de widgets deve-se primeiramente selecionar o frame de trabalho;
37
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;
38
Para widgets dos tipos editores ou list-box ou radio-set, suas alturas devem ser definidas pelo próprio desenvolvedor; 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.
39
9 Preparação do Programa de InterfaceVerificar quais páginas é necessário ao programa; Eliminar as frames das páginas desnecessárias;
Em 'Definitions' informar “NO” para os pré-processadores referentes as páginas que não serão utilizadas.
40
&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
41
9 Para utilizar a opção de saída do relatório para o formato RTFinformar em ‘Definitions’ o valor do respectivo préprocessador para YES.
42
9 Página de LayoutEsta página é obrigatória para os programas de Importação e Exportação;
E necessário só é possível alterar a Frame para NO-BOX; 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.
43
9 Página de SeleçãoCriar como 'Database Fields' e convertê-los para variáveis para obter automaticamente os labels, formatos e tamanhos do dicionário de dados;
44
9 Página de ClassificaçãoRedefinir o 'list-items' do radio-set rs-classif , com as opções de classificação de seu relatório;
45
9 Página de ParâmetrosEsta página é obrigatória para programas de Importação e Exportação;
46
9 Página de DigitaçãoEm 'Definitions', corrigir a definição da temp-table de digitação tt-digita inserindo os campos necessários;
Em 'Section Editor', para o objeto browse br-digita adaptar os seguintes gatilhos para a nova definição da temp-table tt-digita e outras necessidades:
47
'Display': define os campos da temp-table a serem apresentados e quais devem ficar habilitados;
'Row-entry': determina valores iniciais para os campos da temp-table na inclusão de novas linhas, exceto quando se trata da primeira linha do browse;
48
Ainda em 'Section Editor', para os botões btAdd e btUpdate, adaptar os seus gatilhos de 'Choose', na linha que aplica um evento 'Entry', sobre o primeiro campo habilitado no browse; Todas as validações do browse brDigita devem ser feitas na procedure piExecute
49
9 Página de ImpressãoEsta página somente deve ser utilizada para programas de Relatório.
50
9 Página de LogEsta página é obrigatória para programas de Importação e Exportação.
Para programas de Exportação, retirar o campo rsAll, o retângulo e o texto Imprime.
51
9 Gravação e Validação dos RegistrosEm 'Definitions' implementar os campos de parâmetros e seleção na definição da temp-table tt-param;
Na procedure 'piExecute', colocar as validações necessárias às opções do usuário para execução do relatório;
52
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.
53
Na procedure 'piExecute', colocar a lógica de gravação dos parâmetros e seleção na temp-table tt-param;
Substituir na chamada do include {report/i-rprun.i} a literal 'XXP/XX9999RP.P' pelo programa que deve imprimir o relatório.
54
9 Programa de Lógica (rp.p)Programa sem interface que contém a lógica de negócio; Todas as validações ou informações com necessidade de intervenção do usuário devem ser tratadas pelo programa .w que o chama.
55
9 Passos:Copiar a definição das temp-tables tt-param e tt-digita do programa de interface (.W) para o programa que deve gerar o relatório (rp.p);
Utilizar um stream padrão definido como STR-RP, para impressão do relatório;
Deve-se passar o parâmetro &stream com o nome da stream para os includes rpcab.i, rpcb80, rpc256.i, rpout.i e i-rpclo.i;
Para programas de Importação e Exportação definir outro stream para a entrada/saída dos dados;
56
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;
Em todos os forms/frames de impressão deve-se colocar a cláusula stream-io;
Para utilizar a funcionalidade de impressão para arquivo RTF definir o préprocessador conforme abaixo:
&GLOBAL-DEFINE RTF YES &SCOPED-DEFINE pagesize N
57
A definição da temp-table tt-param deve ser idêntica a definição da mesma no programa de interface.
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. VIEW STREAM str-rp FRAME f-rodape. END.
58
60
9 CaracterísticasAlgumas das funções são realizadas na própria tela base do programa;
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)
61
9 TarefasDefinições dos Preprocessadores
Definição da Temp-table de Comunicação Queries para os Browses
Instância dos DBOs
Disposição dos widgets nas Páginas Criação do Método openQueries Criação do Método saveParentFields
62
Triggers de Botões Padrão Criação do Método goToRecord
63
9 Definições dos Preprocessadores
&GLOBAL-DEFINE Program thinFormation &GLOBAL-DEFINE Version 1.00.00.000 &GLOBAL-DEFINE First YES
&GLOBAL-DEFINE Prev YES &GLOBAL-DEFINE Next YES &GLOBAL-DEFINE Last YES &GLOBAL-DEFINE GoTo YES &GLOBAL-DEFINE Search YES
64
&GLOBAL-DEFINE UpdateTarget YES &GLOBAL-DEFINE DelTarget YES &GLOBAL-DEFINE AddTarget YES &GLOBAL-DEFINE DelAllTarget YES &GLOBAL-DEFINE AddAllTarget YES
&GLOBAL-DEFINE ttParent ttOrder &GLOBAL-DEFINE hDBOParent hDBOOrder &GLOBAL-DEFINE DBOParentTable Order
&GLOBAL-DEFINE ttTarget ttOrder-Line &GLOBAL-DEFINE hDBOTarget hDBOOrder-Line &GLOBAL-DEFINE DBOTargetTable Order-Line
65
&GLOBAL-DEFINE ttSource ttItem &GLOBAL-DEFINE hDBOSource hDBOItem &GLOBAL-DEFINE DBOSourceTable Item
&GLOBAL-DEFINE page0Fields ttOrder.Order-Num ~ ttOrder.Order-Date ~ ttOrder.Sales-Rep &GLOBAL-DEFINE sourceBrowse brSource
66
9 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
67
9 Para definir o número de registros que devem ser retornados parao browse, deve-se utilizar o preprocessor padrão a seguir:
Número de registros que devem ser retornados no browse Source
NumRowsReturnedSource
Número de registros que devem ser retornados no browse Target
NumRowsReturnedTarget
Descrição Preprocessador
68
9 Definição da Temp-table de Comunicação71
9 Queries para os BrowsesAs queries dos browsers devem ser geradas com um FOR EACH simples na TEMP-TABLE de comunicação da interface.
73
9 Instância do DBOAs criações das instâncias do DBOs (DBO Pai, DBO Origem e DBO Destino) devem ser feitas manualmente, utilizando ou não o recurso de RPC.
Definir as restrições iniciais e a abertura da query do DBO Pai, caso necessário.
74
9 Parâmetros: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;
75
DBOTargetProgram : Nome físico do programa DBO destino (formação)
76
PROCEDURE initializeDBOs:/*--- Verifica se o DBO da tabela Pai já está inicializado ---*/ IF NOT VALID-HANDLE({&hDBOParent}) THEN DO:
{btb/btb008za.i1 C:/Programs/DBOOrder.p}
{btb/btb008za.i2 C:/Programs/DBOOrder.p '' {&hDBOParent}} END.
RUN openQueryStatic IN {&hDBOParent} (INPUT "OrderNum":U).
/*--- Verifica se o DBO da tabela Origem já está inicializado ---*/ IF NOT VALID-HANDLE({&hDBOSource}) THEN DO:
{btb/btb008za.i1 C:/Programs/DBOItem.p }
{btb/btb008za.i2 C:/Programs/DBOItem.p '' {&hDBOSource}} END.
/*---Verifica se o DBO da tabela Formação já está inicializado ---*/ IF NOT VALID-HANDLE({&hDBOTarget}) THEN DO:
{btb/btb008za.i1 C:/Programs/DBOOrder-Line.p }
{btb/btb008za.i2 C:/Programs/DBOOrder-Line.p '' {&hDBOTarget}} END.
RETURN "OK":U. END PROCEDURE.
77
9 Para os widgets da temp-table de comunicação, deve-se utilizar o78
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;
79
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;
80
9 Método OpenQueriesÉ responsável por realizar a ligação entre o DBO Pai e o DBO destino (formação) e abrir a query do DBO Origem;
Para atualizar os dados do browser Destino utiliza o include formation/OpenQueriesTarget.i;
Para atualizar os dados do browser Origem utiliza o include formation/OpenQueriesSource.i;
81
– Traz somente os 40 (quarenta) primeiros registros associados aos browsers.
82
9 formation/openQueriesTarget.iIdentifica o nome da query a ser utilizada para realizar a abertura do DBO Destino
Query
Nome da tabela pai, utilizado para designar o método linkTo<Parent>
Parent
Descrição Parâmetro
83
9 formation/openQueriesSource.iParâmetros a serem utilizados para o método setConstraint{&Description}
ConstraintParameters
O valor YES indica que o browse Origem deve ser atualizado a cada vez que for efetuada navegação na tabela Pai
OpenAlways
Identifica o nome da query a ser utilizada para realizar a abertura do DBO Origem
Query
Descrição Parâmetro
84
PROCEDURE openQueries: {Formation/OpenQueriesTarget.i &Parent="Order" &Query="Order-Num"} {Formation/OpenQueriesSource.i &Query="Item-Num" &OpenAlways="no"} RETURN "OK":U. END PROCEDURE.85
9 Método saveParentFieldsÉ responsável por atualizar a tabela de formação com base nos campos da tabela pai e tabela origem.
86
PROCEDURE saveParentFields:
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.
87
9 Triggers dos Botões PadrãoBotão btUpdateTarget
Nome do programa a ser executado para realizar a alteração de registro da tabela formação.
ProgramTarget
Descrição Parâmetro
ON CHOOSE OF btUdpateTarget IN FRAME fPage1 DO: {masterdetail/UpdateTarget.i
&ProgramTarget="C:/Programs/MaintenanceNoNavigationOrder.w"} END.
88
9 Triggers dos Botões PadrãoBotã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.
89
9 Método goToRecordÉ responsável pela função de Vá Para da tabela pai, disparada pelo botão btGoTo e pelo menu miGoTo.
90
9 ParâmetrosNome 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
91
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.
92
…
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.
93
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.