Вы находитесь на странице: 1из 123

Curso de Visual Dataflex __ byKohl@terra.com.

br Vitria ES - Brazil

Pgina 1

ndice analtico
PARTE I BSICO ........................................................................................... 4 Introduo ...................................................................................................................4 OOP/EOP O que isto ?.........................................................................................4 Uma rpida explicao...........................................................................................4 Usando o Visual Dataflex ............................................................................................9 Introduo .................................................................................................................9 Workspace...............................................................................................................10 AppSrc ................................................................................................................10 Bitmaps ...............................................................................................................10 Data.....................................................................................................................10 DDSrc .................................................................................................................10 Help.....................................................................................................................10 IdeSrc ..................................................................................................................10 Programs .............................................................................................................11 Database Builder .....................................................................................................11 Criando uma workspace.......................................................................................11 Criando os arquivos .............................................................................................12 Dicionrio de Dados ............................................................................................25 Outras funes do Database Builder.....................................................................50 IDE..........................................................................................................................53 Interface com o usurio........................................................................................54 Criando o programa .............................................................................................55 Criando listas de seleo (lookups) ......................................................................56 Criando templates (modelos) ...............................................................................61 Criando views......................................................................................................64 No permitir a alterao de vendedor ...............................................................73 Incluindo novos itens apenas no final da lista...................................................73 Forar a gravao do Pedido quando entrar e sair dos itens ..............................74 Criando relatrios ................................................................................................75 Basic Report ....................................................................................................76 WinPrint ..........................................................................................................81 Crystal Reports ................................................................................................84 PARTE II AVANANDO ............................................................................... 86 A linguagem VDF ......................................................................................................86 Tipos de dados ...........................................................................................................86 Variveis e constantes ...............................................................................................87 Declarao...............................................................................................................87 Variveis locais .......................................................................................................87 Variveis globais .....................................................................................................88 Constantes ...............................................................................................................88

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 2

Expresses..................................................................................................................88 Expresses lgicas...................................................................................................90 COmandos..................................................................................................................90 Comando de atribuio ............................................................................................90 Continuando um comando na prxima linha ............................................................90 Comandos compostos ..............................................................................................90 Comandos condicionais ...........................................................................................91 If..........................................................................................................................91 Case.....................................................................................................................91 Comandos de loop ...................................................................................................92 While...................................................................................................................92 Repeat .................................................................................................................92 For.......................................................................................................................93 Procedimentos e Funes ..........................................................................................93 Procedimentos (Procedures) ....................................................................................93 Declarando Procedures ........................................................................................93 End_Procedure ...............................................................................................94 Executando procedures ........................................................................................94 Funes (Function) ..................................................................................................94 Declarando Funes.............................................................................................94 Chamando uma funo ........................................................................................94 Declarao antecipada .............................................................................................95 Observaes ............................................................................................................95 Classes........................................................................................................................95 Declarando uma classe ............................................................................................95 Propriedades............................................................................................................96 Declarao de propriedades .................................................................................96 Atribuindo valores a uma propriedade..................................................................97 Lendo valores da propriedade ..............................................................................98 Declarando propriedades antecipadamente...........................................................98 Mtodos ..................................................................................................................99 Declarando mtodos Procedure............................................................................99 Declarando mtodos Procedure Set ....................................................................101 Declarando Functions ............................................................................................102 Declarando mtodos antecipadamente ...................................................................102 Eventos..................................................................................................................103 Executando Procedures..........................................................................................103 Executando mtodos Procedure Set .......................................................................104 Chamando mtodos Function.................................................................................105 Mtodos Construtores e Destrutores ......................................................................105 Construct_Object ...............................................................................................105 Destroy_Object..................................................................................................106 Modificando mtodos herdados .............................................................................106 Avanando mensagens.......................................................................................107 Objetos privados....................................................................................................108 Self....................................................................................................................108

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 3

Herana mltipla ...................................................................................................109 Objetos.....................................................................................................................110 Declarao de objeto .............................................................................................110 Declarando novas propriedades .............................................................................110 Declarando novos mtodos ....................................................................................110 Antecipando declaraes de objetos.......................................................................111 Aninhamento de objetos ........................................................................................111 Delegao..............................................................................................................113 Delegao explcita............................................................................................114 Enviando mensagens para objetos..........................................................................115 Enviando uma mensagem para si mesmo ...........................................................115 Enviando uma mensagem para outro objeto .......................................................116 Usando handles de objeto como parmetro ........................................................116 Acesso relativo ao objeto ...................................................................................117 Nomes longos e curtos de objetos ......................................................................118 Outras formas de acessar um objeto ...................................................................119 Programas................................................................................................................120 Usando pacotes......................................................................................................120 Programas simples.................................................................................................120 Pr-compilao......................................................................................................121 Acessando atributos de classes com expresses......................................................121 Lendo propriedades usando expresses..................................................................121 Chamando funes atravs de expresses ..............................................................123

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 4

Parte I Bsico
Introduo
OOP/EOP O que isto ?
Uma rpida explicao
Se voc j programou em algumas linguagens mais fsseis tipo Clipper, Cobol, Basic, Fortran, etc, voc conhece a forma de programao procedural. Um programa deste tipo tem comandos que so executados em seqncia, um aps o outro, a menos que voc especifique algum desvio ou execuo de um bloco de comandos (sub-rotina) ; mas de qualquer forma, a partir do desvio ou do bloco os comandos continuam sendo executados em seqncia. Esta seqncia definida pelo programador e o usurio no tem nenhum tipo de controle sobre o fluxo da execuo. Este estilo de programao bem velho e dominou a informtica durante a era do caracter, quando reinavam os sistemas Unix (sem interface grfica), Novell, DOS e outros. Com o advento da interface grfica, este estilo de programao se tornou invivel, pois num programa existem diversos objetos como janelas, botes, cones e quem determina o que e quando vai ser executado o usurio e seu poderoso mouse. Foi a que nasceu a OOP/EOP (na verdade, elas nasceram antes da interface grfica, seno teria sido impossvel criar as prprias interfaces). Antes de comearmos a falar sobre Visual Dataflex, de extrema importncia que conheamos pelo menos os conceitos mais bsicos de OOP/EOP. Mas o que significam estas siglas ? OOP a abreviatura de Object Oriented Programming ou Programao orientada a objetos. EOP a abreviatura de Event Oriented Programming ou Programao orientada a eventos.

Para comear, no confunda OOP com EOP. A EOP faz parte da OOP, mas a recproca no verdadeira. Vamos esclarecer: Programao orientada a objetos significa trabalhar com classes, objetos, propriedades, encapsulao, mtodos, herana, polimorfismo, ligao. No se desespere: breve esclareceremos todos estes termos. Exemplo de linguagens OOP : Visual Dataflex, Delphi, Java. Programao orientada a eventos significa trabalhar apenas com objetos e os eventos que possam afet-los de alguma forma e aos quais ele pode responder. Exemplo de linguagens EOP : Access, Visual Basic.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Vamos levar estes conceitos para o mundo real.

Pgina 5

Um exemplo de programao procedural poderia ser uma receita de bolo :


1. 2. 3. 4. 5. 6. 7. 8. 9. Pegue uma tigela Separe trigo, ovos, acar, fermento, etc. Jogue tudo dentro da tigela Os ovos esto com casca ? No: v para o passo 7 Sim: tire as cascas e volte ao passo 3 Misture tudo Ponha no forno Divirta-se

Se quisssemos sofisticar muito mais a arte de comer um bolo, poderamos usar a OOP, para fazer mais ou menos assim:
Classe Tigela Vasilhame Propriedade Cor = Azul Propriedade Capacidade = 2 Kg Propriedade Quebra = Verdadeiro FimDaClasse Classe Ingrediente Alimento Propriedade Trigo = Falso Propriedade Ovo = Falso Propriedade Acar = Falso Propriedade Fermento = Falso Propriedade Perecvel = Verdadeiro Evento EstEstragado Execute JoguarNoLixo FimDoEvento Procedimento JogarNoLixo Se existe Lixeira ento Coloque nela Seno Jogue pela janela FimDoProcedimento FimDaClasse Classe AlimentosQueEngordam Alimento Propriedade AumentaColesterol = Verdadeiro Propriedade CausaInfarto = Verdadeiro FimDaClasse Classe ComedorCompulsivo Humano Funo EstGordo recebe Peso retorna Resposta Se Peso maior que 100 kg Resposta = Verdadeiro Seno Resposta = Falso FimDaFuno Evento AoSentirFome

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Execute ComerUmBolo FimDoEvento Procedimento ComerUmBolo Se EstGordo(150 Kg) = Verdadeiro Saia deste Procedimento Seno Execute FazerUmBolo Execute Comer FimDoProcedimento FimDaClasse Objeto JoozinhoPesoPesado ComedorCompulsivo Evento AoFicar15MinutosSemComer Dispare o Evento AoSentirFome FimDoEvento FimDoObjeto Objeto Bolo AlimentosQueEngordam Propriedade Sabor = Jil Propriedade TemGlac = Verdadeira Use Tigela Use Ingrediente Objeto MinhaTigela uma Tigela Cor = Verde FimDoObjeto Objeto Trigo Ingrediente Trigo = Verdadeiro FimDoObjeto Objeto Ovo Ingrediente Ovo = Verdadeiro FimDoObjeto Objeto Acar Ingrediente acar = Verdadeiro FimDoObjeto Objeto Fermento Ingrediente Fermento = Verdadeiro FimDoObjeto Procedimento FazerUmBolo mova Trigo para Tigela mova Ovo para Tigela se CheirouMal dispare EstEstragado mova Acar para Tigela mova Fermento para Tigela misture tudo leve ao forno FimDoProcedimento FimDoObjeto {Bolo} FimDoPrograma.

Pgina 6

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 7

Observe que em OOP, voc no tem uma execuo passo a passo, como em procedural. Voc define vrios objetos, procedimentos, eventos, funes e, dependendo do evento que ocorrer, a coisa comea a funcionar. No nosso exemplo, o evento que iniciaria todo o processo seria AoFicar15MinutosSemComer do objeto JoozinhoPesoPesado. Vamos ento esclarecer os conceitos de OOP. Classe uma construo genrica que define propriedades, mtodos e funes que sero usados por objetos ou outras classes. Toda classe filha de alguma outra classe me, que por sua vez filha de alguma outra, e assim hierarquicamente at chegar a classe mais alta, que seria a matriarca de todas. Em nosso exemplo, definimos vrias classes derivadas de outras, cada uma com seus mtodos e propriedades: Tigela, derivada de Vasilhame; Ingrediente, derivada de Alimento; AlimentosQueEngordam, derivada de Alimentos. Objeto, na teoria OOP, uma instncia de alguma classe e, efetivamente, a forma que temos de interagir com o programa. Um objeto sempre pertence a alguma classe e herda dela todas as suas propriedades e mtodos, alm de poder definir os seus prprios ou redefinir os que foram herdados. Em nosso exemplo criamos vrios objetos : JoozinhoPesoPesado, da classe Humanos; Bolo, da classe Alimentos; Tigela, da classe Vasilhame. Note que o objeto Tigela foi criado dentro do objeto Bolo. Isto uma caracterstica da OOP: um objeto pode conter outros objetos, que por sua vez podem conter outros e assim sucessivamente. Um objeto contido em outro objeto chamado objeto-filho e, conseqentemente, um objeto que contm outro chamado objeto-pai. Observe que isto no acontece com as classes : uma classe nunca contm ou est contida em outra classe. Ela derivada de alguma classe ancestral e poder ser a origem de alguma classe descendente. Propriedade (ou atributo) uma caracterstica de um objeto ou de uma classe. Em nosso exemplo, o objeto Bolo tem duas propriedades, Sabor e TemGlace; a classe Tigela tem as propriedades Cor, Capacidade e Quebra. Encapsulao uma caracterstica da OOP na qual os objetos tm mecanismos internos que ficam totalmente ocultos do usurio. Por isto um objeto muitas vezes considerado uma caixa-preta. Voc utiliza um objeto que faz determinadas coisas dependendo de algum evento ou valor de alguma propriedade, mas no precisa necessariamente saber como ele faz isto. No exemplo, voc pode utilizar o objeto Bolo sem precisar saber em detalhes o que acontece dentro do mtodo FazerOBolo.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 8

Mtodo (ou ao) alguma operao realizada pelo objeto ou pela classe. Em nosso exemplo, a classe ComedorCompulsivo tem os mtodos AoSentirFome e ComerUmBolo. Herana a capacidade que uma classe ou objeto tm de herdar caractersticas e mtodos de sua classe ancestral e, se for o caso, modific-los. No nosso exemplo, o objeto MinhaTigela, definido dentro do objeto Bolo, herdou todas as propriedades de sua classe Tigela (Cor, Capacidade e Quebra) e alterou uma delas (Cor = Verde). Polimorfismo a capacidade que objetos diferentes tm de reagir da sua maneira a um mesmo evento. Por exemplo, para o objeto JoozinhoPesoPesado, o evento AoSentirFome dispara o mtodo ComerUmBolo ; j para um objeto Cavalo, que seria de outra classe, o mesmo evento dispararia o mtodo ComerCapim. Ligao o ato de um objeto ou classe conectar uma ao sua a outro objeto ou classe. No exemplo, o evento ComerUmBolo, da classe ComedorCompulsivo, dispara o evento FazerUmBolo do objeto Bolo.

Os conceitos que acabamos de ver fazem parte de todas as linguagens OOP, mas no das EOP. A EOP trabalha apenas com objetos e eventos e no tem, conseqentemente, nenhum suporte para todas estas outras caractersticas da OOP. Entre as vantagens da OOP sobre a programao procedural, podemos destacar: Objetos podem ser utilizados em vrios projetos diferentes, sem que o programador tenha que se preocupar com sua estrutura interna: ele apenas precisa saber como se comunicar com eles, atravs de suas propriedades ou mtodos. A manuteno do cdigo fica muito mais fcil, pois se voc necessita, por exemplo, alterar alguma caracterstica ou mtodo do objeto, voc far esta mudana apenas nele, sem se preocupar com o restante do programa. Num desenvolvimento em equipe, cada programador precisa se preocupar apenas com a classe ou objeto que est trabalhando e expor aos demais somente o que ele faz e como utiliz-lo. Como dissemos, quem utiliza uma classe ou objeto precisa saber apenas o que ele faz e no como ele faz.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 9

Usando o Visual Dataflex


Introduo
Nosso estudo sobre o VDF ser feito atravs de prtica e teoria. Criaremos uma aplicao comercial para a que a empresa Acme SA possa controlar seus clientes, pedidos, vendedores, estoque, etc. Inicialmente, o sistema ser composto de alguns arquivos, que esto relacionados da seguinte forma :
Sistema

Cliente Pedido Vendedor

Produto

ItemPed

O arquivo Sistema ter um nico registro e trs campos: ProxCliente, ProxVendedor e ProxPedido. Estes campos sero usados para controlar qual o prximo cdigo, respectivamente, do Cliente, Vendedor e Pedido. Os arquivos Cliente, Vendedor e Pedido tero seus cdigos gerados automaticamente pelo sistema, baseado no contedo dos campos do arquivo Sistema. O arquivo Pedido est relacionado com Cliente e Vendedor e o arquivo ItemPed est relacionado com Pedido e Produto. O relacionamento uma tcnica de banco de dados que associa um campo de determinado arquivo (chamado filho) com o campo de outro (chamado pai). Por exemplo, no arquivo Pedido precisamos guardar as informaes do Cliente que fez o pedido e do Vendedor que o efetuou, como nome, endereo, telefone, etc. Se no usssemos relacionamentos, para cada pedido cadastrado teramos que cadastrar todos os dados do cliente e do vendedor dentro do arquivo Pedido. Isto seria uma tremenda redundncia e causaria srios transtornos. Imagine que certo cliente que fez 15 pedidos resolvesse mudar seu nome : alm de fazermos esta alterao no cadastro do cliente, teramos que entrar em todos os 15 pedidos que ele fez e repetir a alterao! Ao invs disto, no arquivo Pedido criamos apenas um campo chamado CodCliente e relacionamos este campo com o campo Codigo do arquivo Cliente. Desta forma, quando um registro do Pedido for lido, pelo CodCliente ele l o arquivo Cliente e busca todas as informaes necessrias, sem duplicao de informaes. Antes de comear, vamos apresentar os primeiros conceitos do VDF.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 10

Workspace
o ambiente de trabalho de uma aplicao. Ela define a estrutura de pastas que compe o projeto, bem como suas chaves no registro do Windows. Toda aplicao em VDF deve obrigatoriamente ter uma workspace. As ferramentas do VDF, como o IDE, Database Builder, Database Explorer e o compilador sempre estaro trabalhando numa workspace. claro que o VDF pode ter um nmero indefinido de workspaces, mas s pode trabalhar com uma de cada vez. Resumindo, a workspace a rea de trabalho de um projeto. Por padro, o VDF cria uma workspace com seis pastas. Voc pode, claro, mudar esta estrutura, mas na prtica ela tem se mostrado muito eficiente e para os propsitos deste treinamento usaremos este padro. As pastas so as seguintes :

AppSrc
Pasta que contm os programas-fonte da aplicao. Nela ficam todos os arquivos criados pelo IDE, como views (*.vw), selection-lists (*.sl), reportviews (*.rv), programas (*.src) e vrios outros. Alm dos arquivos criados pelo IDE, esta pasta pode conter quaisquer outros que faam parte dos fontes do sistema, como menus, tool-bars, fragmentos de cdigo (*.inc), etc.

Bitmaps
Pasta onde ficam as imagens de bitmap utilizadas pela aplicao.

Data
Pasta onde ficam os arquivos de dados (*.dat), ndices (*.k*), nomes de campos (*.tag) e vrios outros que compe a base de dados. mantida pelo Database Builder.

DDSrc
Pasta onde ficam os arquivos de dicionrio de dados (*.DD), mantidos pelo Database Builder. Eles so utilizados pelo IDE e compilados com a aplicao.

Help
Pasta que contm os arquivos de help do sistema.

IdeSrc
Pasta que contm templates e outras informaes do IDE.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 11

Programs
Pasta onde ficam os programas compilados pelo VDF (*.vd5, *.vd6 ou *.vd7, dependendo da verso do Visual Dataflex). Note que um sistema pode ser composto por um ou mais programas, mas ter sempre uma nica workspace.

Database Builder
Criando uma workspace
Execute o Database Builder do menu Iniciar -> Programas -> Visual Dataflex. A seguinte tela ser exibida :

Observe que o Database Builder sempre est com alguma workspace ativa, que exibida em sua barra de ttulo (neste caso, a Order Entry Sample Application, um exemplo que acompanha o VDF). Vamos criar a nossa, que chamaremos de Acme. Selecione File -> New Workspace no menu. Surgir a tela de apresentao do assistente de criao de workspaces. Clique em Next. A prxima tela pede o nome e a descrio da workspace.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 12

O nome informado em Name of new Workspace Area ser gravado no registro do windows, bem como sua estrutura de pastas. Clique em Next.

Nesta tela escolhemos que tipo de estrutura de pastas iremos utilizar: Create a standard workspace : cria a estrutura padro que falamos anteriormente (Appsrc, Bitmap, Data, DDSrc, Help, IdeSrc, Programs) na pasta informada em Name of the workspace directory. Utilizaremos este padro. Create or select a workspace directory : permite que voc informe em quais pastas ficaro os componentes da aplicao. Create an All-in-One directory : criar todos os arquivos numa nica pasta. Select all components directories manually : permite que voc informe cada componente individualmente.

Acrescente ao caminho C:\VDF\Projects\ o nome da aplicao, Acme\. Clique em Next. A prxima tela informa que a workspace foi criada. Clique em OK. A partir de agora, a descrio de nossa workspace aparece na barra de ttulo do Database Builder.

Criando os arquivos
O prximo passo ser criarmos os arquivos que compe o sistema. Observe na barra de status, embaixo direita a descrio : Current filelist C:\Vdf\Projects\Acme\Data\Filelist.cfg. A filelist (lista de arquivos) um arquivo especial do VDF onde ficam armazenadas as informaes sobre todos os arquivos da aplicao, como nmero do arquivo, nome interno, nome externo, nome para usurio, entre outras. A filelist vital numa aplicao VDF

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 13

e sem ela voc no tem acesso a base de dados, portanto lembre-se sempre de inclu-la em seus back-ups. Cada workspace tem obrigatoriamente uma filelist. Inicialmente, criaremos o arquivo Sistema. Este arquivo ter apenas um registro e ser usado internamente pelo sistema, no estando disponvel para o usurio. O arquivo possui as seguintes campos e atributos: Sistema Arquivo n 1 Campo Prox_Cliente Prox_Vendedor Prox_Pedido Tipo Tamanho NUMERIC 6 NUMERIC 6 NUMERIC 6

Atributos Relacionamento

Para criarmos o arquivo Sistema clique em na barra de ferramentas ou selecione File -> New do menu. Surgir a seguinte caixa de dilogo :

Type : Tipo do arquivo, que pode ser Dataflex ou ODBC_Driver File Number : Nmero do arquivo na filelist Rootname : Nome externo do arquivo, que ser gravado na pasta Data

Digite Sistema em Rootname, deixe o restante como est e clique em OK.

Ser exibida a tela de estrutura de arquivos, com a guia Fields ativa.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil -

Pgina 14

Root Name : o nome externo do arquivo, que informamos na tela anterior; Login : para o caso de estarmos utilizando um banco de dados via ODBC, que exige que voc se identifique antes de utiliz-lo; User Name : nome que ser exibido para o usurio; DF Name : nome que ser utilizado internamente, nos programas, quando referenciarmos o arquivo;

Na guia Fields definiremos os atributos do arquivo. Ela possui as seguintes colunas: Name : Nome do campo como Cdigo, Telefone, etc. Pode ter at 15 caracteres, que so transformados em maisculas. No utilize ou acentuao. Os espaos em branco so transformados em _ (sublinhado); Type : Tipo do campo. O VDF aceita os tipos ASCII (campos alfanumricos com at 255 caracteres), NUMERIC (campos numricos inteiros e/ou decimais), DATE (campos de data), OVERLAP (campos que redefinem um conjunto de outros campos, veremos adiante), TEXT (campos texto ou memo) e BINARY (campos binrios que podem conter imagens, ou teclar F4 quando estiver nesta sons, etc). Se voc clicar em coluna ver uma lista das opes.

Length : Tamanho do campo Index : ndice do qual este campo faz parte; Relates to : coluna de outro arquivo ao qual este arquivo est relacionado (veremos adiante, em relacionamentos);

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 15

Clique na primeira clula da coluna Name e vamos entrar com a definio do arquivo, conforme descrevemos anteriormente :

Vamos salvar nosso arquivo, para no perdermos o que j foi estruturado. Clique em dilogo: ou no menu File -> Save, para exibir a seguinte caixa de

Force restructure operation : esta opo utilizada sempre que alguma caracterstica do arquivo for alterada, como criao, excluso ou modificao de campos, tamanhos, ndices ou relacionamentos. O VDF cria um arquivo temporrio, move os dados para este arquivo, grava as alteraes feitas na estrutura e copia os dados de volta. Create DEF : esta opo cria um arquivo texto com a extenso .DEF (no caso, Sistema.DEF) contendo todas as informaes do arquivo e serve apenas para documentao.

Vamos selecionar as duas opes e clicar em OK. Surge uma caixa de dilogo informando que a operao foi bem sucedida (ou no). Clique em OK para prosseguirmos. A prxima guia, Index, utilizada para definirmos ndices. No arquivo Sistema ela no ser utilizada.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Vamos ento para a guia Parameters.

Pgina 16

File Statistics o Max Records : nmero mximo de registros que o arquivo pode ter. Este valor utilizado internamente pelo VDF para alocar rea em disco. importante sempre o definirmos com uma boa folga, pois ao ser ultrapassado, o VDF gerar um erro e teremos que reestruturar o arquivo. Esta uma opo remanescente da poca em que os HDs tinham 5 ou 10 Mb e que espao em disco era uma coisa crnica. No caso do arquivo Sistema, estabelecemos que ele ter apenas um registro, portanto vamos alterar este valor. o Record lenght : o comprimento do registro em bytes. Note que criamos trs campos, cada um com 6 caracteres de tamanho e o total foi 9, quando deveria ser 18. Isto se deve ao fato do VDF armazenar campos numricos de forma compactada (cada dgito ocupa meio byte). o Record Identity : um ndice que usado internamente por alguns drivers de banco de dados como um identificador numrico nico para o registro. Ele deve ter apenas um segmento e ser numrico. Para o driver nativo Dataflex ele no utilizado.

File Settings o Multi user reread : em ambientes multi-usurios, como o Windows, esta opo dever sempre estar marcada. Ela garante o bloqueio correto dos dados quando vrios usurios estiverem acessando o arquivo simultaneamente para incluses, modificaes ou excluses. o Reuse deleted space : quando um registro excludo, ele permanece fisicamente no arquivo e apenas marcado como no disponvel. Com esta opo configurada, o Dataflex reutilizar este espao para um novo registro, economizando rea de HD.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 17

o Header integrity checking : arquivos Dataflex armazenam informaes sobre sua estrutura (campos, ndices e outras) num arquivo especial do tipo Header (no caso, Sistema.HDR). Se o arquivo for danificado por algum crash do sistema operacional (tpico do Windows!), do programa ou mesmo uma queda de energia e esta opo estiver configurada, nenhum programa ou utilitrio do VDF poder acessar este arquivo, at que ele seja recuperado. Por segurana, sempre selecione esta opo. o System file : esta opo indica que o arquivo possui apenas um registro (como o caso do arquivo Sistema), configura o nmero mximo de registros para 1 e faz com que as informaes do registro sejam lidas automaticamente quando a arquivo aberto pelo programa. exatamente o caso do arquivo Sistema, portanto, marque esta opo. Compression o O VDF pode armazenar os dados dos arquivos de forma compactada, poupando espao no HD. Isto eficiente se voc tiver campos tipo TEXT ou BINARY de grande comprimento e que normalmente no so totalmente preenchidos. Quando a compresso utilizada, o VDF coloca os dados compactados num arquivo especial com a extenso .VLD (variable-length data ou dados de tamanho varivel) e o arquivo .DAT passa a ter ponteiros e outras informaes para o arquivo VLD. Esta opo configurada escolhendo um dos modos abaixo:

None : nenhuma compresso ser feita. Fast : usa uma tcnica de compresso em que uma srie de dois ou mais caracteres similares so armazeados como uma representao do nmero de repeties. Por exemplo 100 espaos em branco seriam armazenados como 100 seguido de um espao . Standard : uma substituio simblica baseada na freqncia em que o caracter utilizado no arquivo. Custom : uma substituio simblica baseada numa anlise que o Database Builder faz nos dados do arquivo.Se o arquivo usa este mtodo, ele deve ser periodicamente recomprimido, a medida que seus dados vo sendo alterados.

Transaction type o Uma transao um conjunto de operaes que so feitas num banco de dados e que devem ser totalmente completadas ou

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 18

interrompidas para manter a integridade dos dados. H trs tipos disponveis :


None : no use esta opo, a menos que o arquivo em questo seja utilizado de uma forma muito limitada e sem o dicionrio de dados. Se o arquivo utiliza o dicionrio, ento voc tem que usar pelo menos a opo Client-Atomic. Client-Atomic : este o tipo padro (e nico) quando se utiliza arquivos Dataflex. Transaes deste tipo podem ser abortadas pelo programa e, em certos casos pelo prprio Dataflex. Nenhuma proteo oferecida para travamentos ou outros problemas uma mquina cliente da rede. Se isto ocorrer durante uma transao, parte dela j pode ter sido salva no banco de dados e no poder ser desfeita . Server-Atomic : Oferecem proteo contra problemas na mquina cliente. Se o programa (ou o Windows) trava ou cai enquanto uma transao est sendo executada, todo o processo pode ser desfeito. Suportado por alguns tipos de bancos de dados. Server-Logged : Oferece todos os benefcios da ServerAtomic e mais a capacidade de rollback. O rollback restaura o sistema a uma condio que estava em certo momento. Por exemplo, se uma folha de pagamento comeou a ser processada s 13:00 e algum problema aconteceu s 14:00, voc pode restaurar o sistema ao estado que estava s 13:00 e reiniciar o processo. Este tipo de transao suportado pelos bancos de dados relacionais.

As outras quatro guias (Fields Settings, Methods, Options e Structures) so utilizadas para o dicionrio de dados e sero vistas posteriormente. Para o arquivo Sistema, isto tudo. Salve suas alteraes.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil O prximo arquivo, Cliente, ter a seguinte estrutura : Cliente Arquivo n 2 Campo Cdigo Nome Endereo Bairro CEP Cidade Estado CGC Inscricao Telefone E_Mail LimiteCredito Compras Pagamentos Observacoes

Pgina 19

Atributos Tipo Tamanho ndice NUMERIC 6 1 ASCII 40 2 ASCII 40 ASCII 15 ASCII 9 ASCII 20 ASCII 2 ASCII 18 3 ASCII 18 ASCII 15 ASCII 15 NUMERIC 8,2 NUMERIC 8,2 NUMERIC 8,2 TEXT 512

Relacionamento

Clique em na barra de ferramentas ou selecione File -> New do menu e crie o arquivo Cliente como n 2. Defina seus campos, tipos e tamanhos. No informe os ndices, por enquanto. Ao terminar, clique em ou no menu File -> Save.

Clique na guia Index para criarmos os ndices.

Index Number : nmero do ndice. O Dataflex permite que um arquivo tenha at 15, cada um podendo ser composto por vrios campos. Key Lenght : exibe o tamanho do ndice em bytes. Levels : indica quantos campos compe o ndice.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil -

Pgina 20

Index is a batch index : indica que o ndice no ser atualizado automaticamente nas operaes do arquivo (incluir, alterar, excluir), mas apenas quando executarmos uma re-indexao no arquivo. Isto pode ser til quando temos ndices de pouqussima utilizao e quisermos melhorar o desempenho.

Clique na primeira clula da coluna Name para informarmos o nome do campo que compor o ndice. Voc pode digitar o nome e o VDF far uma busca incremental ou clicar em ou F4 para ver a lista dos campos.

Observe que nesta lista existe um campo que no criamos, Recnum. Este o campo n 0 e criado automaticamente pelo VDF. Este campo numrico seqencial e incrementado pelo VDF para cada registro gravado. Este tambm o ndice n 0, ou seja, mesmo que no definamos qualquer ndice para o arquivo, ele ter pelo menos o ndice 0, que o campo Recnum. Escolha o campo Codigo para nosso ndice n 1. Passe o Index number para 2 e vamos criar nosso segundo ndice, que ser composto pelo Nome e pelo Recnum. Por que utilizar o Recnum ? Porque o campo Nome pode ser repetido para vrios clientes (por exemplo, quantos Jos da Silva existem?) e o VDF no aceita ndices duplicados. Acrescentando o Recnum, que exclusivo, garantimos que no haver duplicidade de ndices (e conseqentemente, um erro). Poderamos utilizar qualquer outro campo que no permitisse duplicao (Codigo, por exemplo) mas o Recnum mais confortvel.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil -

Pgina 21

A opo UC indica que o VDF no considera maisculas e minsculas diferentes na classificao (case insensitive). A opo Desc indica que a classificao ser feita em ordem decrescente. O boto O boto O boto insere um campo onde estiver o cursor. acrescenta um campo ao final da lista. exclui um campo da lista.

Siga os procedimentos anteriores e crie o ndice 3, com os campos CGC e Recnum. Salve suas alteraes. Seguindo os passos anteriores, vamos criar os demais arquivos do projeto. Vendedor Arquivo n 3 Campo Codigo Nome Endereco Bairro CEP Cidade Estado Telefone E_Mail

Atributos Tipo Tamanho ndice NUMERIC 6 1 ASCII 40 2 ASCII 40 ASCII 15 ASCII 9 ASCII 20 ASCII 2 ASCII 15 ASCII 15

Relacionamento

Obs : o ndice 2 formado pelos campos Nome + Recnum Produto Arquivo n 4 Campo Cdigo Descrio Unidade PrecoVenda PrecoCusto EstoqueAtual

Atributos Tipo Tamanho ndice NUMERIC 6 1 ASCII 30 ASCII 2 NUMERIC 6,2 NUMERIC 6,2 NUMERIC 6

Relacionamento

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Pedido Arquivo n 5 Campo Numero Data CodCliente CodVendedor Situao ValorTotal ProxItem Atributos Tipo Tamanho ndice NUMERIC 6 1 DATE NUMERIC 6 NUMERIC 6 ASCII 1 NUMERIC 8,2 NUMERIC 2

Pgina 22

Relacionamento

Cliente.Codigo Vendedor.Codigo

Observe que o arquivo Pedido est relacionado com os arquivos Cliente e Vendedor. Para criarmos o relacionamento do Pedido com o Cliente, clique no , ou em F4 para exibir campo CodCliente e em seguida no boto a tela de relacionamentos :

Na guia que est ativa, Attach to field, uma lista direita mostra os nomes dos arquivos e a lista a esquerda os nomes dos campos do arquivo selecionado. Clique em Cliente. Note que apenas dois campos do arquivo foram exibidos : Codigo e Recnum. Isto ocorre por que a opo Lenght and type must match (tamanho e tipo devem coincidir) est selecionada e num relacionamento, o VDF exige que os campos relacionados sejam do mesmo tipo e tamanho (no caso, NUMERIC de 6 posies). Se voc selecionar Lenght and type will be copied, todos os campos sero exibidos e voc poder selecionar qualquer um, mas os resultados sero imprevisveis (alis, no descobri ainda por que esta opo existe...). A caixa Attempt to synchronize required child & required parent structures deve sempre estar marcada : ela garante que as operaes de incluso, alterao ou excluso de registros nos arquivos pai e filho sero sincronizadas, por exemplo, uma excluso no pai afeta todos os filhos, uma

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil incluso no filho afeta o pai. circunstncias muito especficas.

Pgina 23

Esta caixa s deve ser desmarcada em

A guia Attach to file/field permite que voc crie o relacionamento usando os nmeros de arquivos e campos, ao invs dos nomes. Isto s tem utilidade quando voc est construindo um relacionamento com um arquivo que ainda no existe e ser criado posteriormente. Clique no campo Codigo e em OK para finalizarmos o relacionamento. Repita a operao relacionando o campo CodVendedor com o campo Codigo do arquivo Vendedor.

ItemPed Arquivo n 6 Campo CodPedido Item CodProduto Quantidade VrUnitario VrTotal

Atributos Tipo Tamanho ndice NUMERIC 6 1 NUMERIC 2 1 NUMERIC 6 NUMERIC 6 NUMERIC 8,2 UMERIC 8,2

Relacionamento Pedido.Numero Produto.Codigo

Ao criar o arquivo ItemPed, troque o User name para Item do Pedido. Observe que neste arquivo o ndice 1 composto de dois campos : CodPedido e Item. Alm disto, o arquivo est relacionado com Pedido e Produto. Neste ponto, a parte fsica de nossa base de dados est pronta. Salve todos os arquivos que ainda no o foram. O prximo passo ser o dicionrio de dados. Mas antes, vamos conhecer mais um recurso interessante do VDF e que ser utilizado no dicionrio. Num sistema normalmente precisamos de diversos arquivos contendo apenas Cdigo e Descrio, como Estados do Brasil, unidades de medida, situao do pedido, etc. Normalmente, criaramos estes arquivos no Database Builder e construiramos uma view para cada um, para manter seus dados. Este trabalho seria repetitivo e consumiria recursos da Filelist (lembre-se que o nmero de arquivos que ela pode gerenciar limitado : 255 at a verso 6 e 4098 a partir da verso 7). Para facilitar nosso trabalho , o VDF mantm dois arquivos especiais, CodeMaster e CodeType, especificamente para armazenarmos estas tabelas num nico lugar. Estes arquivos no aparecem na Filelist (apesar de ocuparem um espao nela) e so criados para cada Workspace (verifique na pasta Data de seu projeto).

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 24

Em nosso sistema, criaremos tabelas para os estados brasileiros, unidades de medida s situao dos pedidos e, posteriormente, as usaremos para validar os dados nos respectivos campos. Para criarmos as tabelas, do menu do Database Builder, selecione Workspace > Code-Master maintenance. Ser exibida a seguinte tela :

Type : nome da tabela. Digite ESTADOS. Description : Descrio da tabela. Digite, por exemplo, Siglas e nomes dos estados do Brasil. Comment : qualquer comentrio sobre a tabela.

Clique na coluna Code da grid. Surgir uma mensagem Save New Type Information ? para confirmar a gravao da tabela. Clique em Sim. Code : digite a sigla do estado. Description : digite o nome do estado.

Digite em Code e Description, respectivamente : - ES e Esprito Santo - RJ e Rio de Janeiro - MG e Minas Gerais - SP e So Paulo Clique em ou F5 para limpar os dados e incluirmos outra tabela, unidades dos produtos. Type : UNIDADE Description : Unidade dos produtos

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 25

Confirme a gravao e, nas colunas Code e Description da grid, digite, respectivamente : - UN e Unidade - L e Litro - M e Metro - CX e Caixa - KG e Kilo Clique em ou F5 para limpar os dados e incluirmos outra tabela, situao dos pedidos. Type : SITPED Description : Situao dos pedidos

Confirme a gravao e, nas colunas Code e Description da grid, digite, respectivamente : - P e Pendente - F e Faturado - C e Cancelado Feche a view Code Maintenance.

Dicionrio de Dados
O dicionrio de dados contm todas as regras que devem ser aplicadas ao arquivo de dados. Ele construdo e mantido pelo Database Builder e suas informaes so gravadas num arquivo com o mesmo nome e com extenso .DEF, que fica na pasta DDSrc do projeto. As regras do dicionrio de dados envolvem vrios aspectos, como as caractersticas de cada campo, os mtodos que devem ser aplicados nas operaes de incluso, alterao e excluso, a integridade relacional e muitos outros. Vamos comear pelo arquivo Cliente. No Database Builder, selecione Cliente em na barra de ferramentas, ou clique em -> Open... para exibir a caixa de seleo : ou ainda em File

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 26

Marque o arquivo Cliente e clique Open. O dicionrio de dados trabalhado nas guias Fields Settings, Methods, Options e Structures. Ative a Fields Settings. Todas as configuraes que fizermos nesta guia sero executadas quando o campo selecionado for utilizado em alguma view.

direita temos a lista de campos e esquerda 6 sub-guias, onde configuraremos as opes para cada campo. Observe sempre qual o campo que est selecionado, pois as opes estaro sendo configuradas para ele. A guia Options tem doze opes, que so : Autofind : para campos ndice exclusivo, o VDF pesquisa no arquivo um valor igual ao informado e, se existir, mostra os dados do registro. Se o ndice for composto de vrios campos, coloque o Autofind no ltimo. Autofind GE : para campos ndice, pesquisa um valor igual ou maior ao informado. Capslock : transforma todos os caracteres digitados em maisculas.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil -

Pgina 27

Display only : o valor do campo ser apenas exibido, no permitindo que voc entre nele nem altere seus dados. Find required : para campos ndice, normalmente estrangeiros, exige que um registro seja encontrado, baseado no valor informado, e no sai do campo at a condio ser satisfeita. ForcePut : fora o contedo do campo ser colocado no buffer do registro. Em condies normais, isto s ocorre quando o valor do campo alterado. Key field : indica que o campo chave primria e, portanto, seu valor no poder ser alterado, depois que o registro foi criado. No Enter : No permite entrar no campo. Apesar disto, voc ainda pode mover um valor para ele, o que no ocorre com a opo Display only. No Put : o valor no ser movido para o buffer, mesmo que tenha sido alterado. Retain : o valor permanece no campo, mesmo quando acontece alguma operao em que normalmente ele seria limpo. Retain All : o valor permanece no campo, mesmo que todos os campos da view forem limpos. Required : um valor obrigatrio neste campo, no aceitando valores zero (para campos NUMERIC ou DATE) ou em branco (para os demais tipos). Skip found : No entra no campo se houver um registro ativo. Zero Suppress : coloca brancos num campo NUMERIC se seu valor for zero.

As trs opes do grupo Character Mode Options so vlidas apenas se voc est construindo um dicionrio para ser usado pelo Dataflex modo caracter. Marque as seguintes opes para os seguintes campos : Codigo : Autofind, Key field, No Put. Estado : Capslock. Compras : No Enter. Pagamentos : No Enter.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Vamos para a segunda guia, Validation / Lookup.

Pgina 28

Validation Method : Especifica uma funo com retorno numrico que ser usada para validar o valor do campo. Se a funo retornar zero, o valor ser aceito; se retornar qualquer outro valor, ser exibida uma mensagem de erro e o valor no ser aceito. Clique em para exibir a lista de todas as funes que voc definiu neste dicionrio. Simple Validation : uma seqncia de valores, separados por | e que sero os nicos permitidos para este campo. Se o campo for definido como ComboBox, estes valores sero mostrados como uma lista na view. Range From ... To : uma faixa de valores que o campo pode aceitar, onde From o valor inicial e To o valor final. Validation Error : o nmero e o texto do erro que ser exibido se a validao deste campo falhar. Lookup Object : nome do objeto que exibir uma lista de seleo (Lookup) para este campo (iremos constru-lo posteriormente). Lookup Package : nome externo do objeto lookup.

Configure os seguintes campos e opes nesta guia (certifique-se que o campo esteja selecionado, na lista esquerda) : Codigo : Lookup Object = oClienteSl ; Lookup Package = Cliente.sl. Nome : Lookup Object = oClienteSl ; Lookup Package = Cliente.sl.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 29

Vamos para a prxima guia, Validation Table. Neste ponto, uma boa idia salvar o arquivo (lembre-se do apago!).

Nesta guia ns configuramos tabelas que sero utilizadas para validar os valores do campo. Se na view o campo tiver a opo de prompt (identificado pelo boto ), ser exibido uma lista de seleo. O valor que ser usado na validao o da coluna Value. As tabelas podem ser : None : nenhuma tabela ser usada. Static : ser criada uma tabela fixa, dentro do dicionrio. Informaremos seus valores em Value e Description. Dynamic : Ser utilizada uma das tabelas que criamos em CodeType e CodeMast Ao usar esta opo, informamos o nome da tabela em Type Value e seus valores so automaticamente exibidos. Custom : usa tabelas externas, que no so mantidas pelo Database Builder. Informaremos seu nome externo em Location.

Para as tabelas Static e Dynamic, existem duas caixas de opo : Validate : o valor do campo ser validado pelos valores da tabela. Se esta opo estiver desmarcada, a tabela ser exibida, mas poderemos informar um valor diferente. Blanks : aceita um valor em branco. Title : Ttulo que ser exibido na lista de seleo.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil -

Pgina 30

Advanced : Esta opo abre um editor onde poderemos inserir qualquer codificao para validar a tabela, por exemplo :

Object Name o nome interno o VDF cria para a tabela no dicionrio. Nesta guia, configure o campo Estado com as seguintes opes : - Type : Dynamic - Type Value : ESTADOS A prxima guia a Masks. Aqui ns definimos mscaras de entrada para os campos.

Mask Type : permite escolher uma mscara pr-definida. Existem 4 tipos : Currency (Dinheiro), Numeric, Date e Text. Custom Mask : neste campo, podemos digitar uma mscara especfica, usando-se as regras do VDF. Tecle F1 e voc ver as opes disponveis. O boto mostra as mscaras que esto cadastradas. Add to Repository : Acrescenta uma mscara ao repositrio. Ao clicarmos, surgir uma tela pedindo o nome da mscara. Edit Repository : permite acrescentar, alterar ou excluir mscaras do repositrio.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 31

Clique no campo CEP e em Custom Mask digite #####-###. Esta mscara significa que teremos 5 posies numricas no obrigatrias, o - e mais trs posies. Clique em Add to Repository para gravar esta mscara, digite CEP em Description e clique OK.

Para os campos LimiteCredito, Compras e Pagamentos, selecione a mscara Currency, em Mask Types. Salve o arquivo. A prxima guia a Appearance. Nesta guia podemos associar um componente especfico para cada campo.

Visual Control : Exibe uma lista dos tipos de controles disponveis. o none : nenhum controle especial o dbBitmap : para campos bitmap.
BINARY

serem exibidos como figuras

o dbCheckbox : controle do tipo o dbComboForm : controle do tipo o dbEdit : controle caixa de texto, para campos TEXT o dbForm : controle padro do tipo

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 32

o dbGrid : grade com linhas e colunas tipo o dbSpinForm : controle do tipo Long Label : Este texto ser usado como ttulo do campo, quando ele for colocado em alguma view. Short Label : Este texto ser usado como ttulo do campo quando ele for utilizado em uma coluna de grid.

Obs : Se no for informado Long Label nem Short Label, o VDF usa o nome do campo como ttulo. Para o campo Estado, vamos selecionar o controle dbComboForm. A ltima guia de Fields Settings a Other.

Checkbox : indica se o campo do tipo caixa de seleo. True : se a opo checkbox for selecionada, informe aqui qual valor ser movido para o campo quando ele for marcado, como False : se a opo checkbox for selecionada, informe aqui qual valor ser movido para o campo quando ele for desmarcado. Status Help : informe aqui o texto que ser exibido na barra de status da aplicao quando o usurio entrar neste campo. Defaut Value : informe o valor default que ser exibido no campo quando sofrer uma entrada de dados. Entry Method : funo ou procedimento que ser executado quando o usurio entrar no campo. O boto exibe os nomes dos mtodos criados no dicionrio.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil -

Pgina 33

Exit Method : funo ou procedimento que ser executado quando o usurio sair no campo. O boto exibe os nomes dos mtodos criados no dicionrio. Auto Increment : indica qual campo de qual arquivo ser usado para autoincrementar este campo, sempre que for gravado um novo registro. Ao clicar em ser exibida a lista de arquivos e campos disponveis.

o Display System Files and Related Files Only : se estiver marcada, exibe apenas os arquivos de sistema (aqueles que tem apenas um registro) e os que forem relacionados com este arquivo. o Add to External Files Structure : se o arquivo escolhido no estiver relacionado, ele ser acrescentado lista dos arquivos externos, na guia Structure (que veremos em breve). Short Description : apenas para documentao, escreva uma descrio do campo.

Para o campo Codigo, usaremos a opo Auto Increment, arquivo Sistema, campo ProxCliente. Salve as configuraes feitas at aqui. A prxima guia, Methods, no ser utilizada por enquanto. Voltaremos a ela em breve. Vamos para a guia Options. Antes, uma pequena explicao. Vamos usar como exemplo o arquivo Cliente e o arquivo Pedido. Os dados do Cliente aparecero, basicamente, de duas formas no sistema : uma ser em sua prpria view, com todos os seus campos, onde faremos as operaes de incluso, alterao e excluso e, neste caso, dizemos que ele est sendo o Server da view; a outra forma ser quando ele aparecer na view do Pedido, com apenas alguns campos que permitam a localizao do registro desejado, como cdigo, nome ou CGC e onde no ser permitido que se modifique seus dados, quando ento diremos que ele est sendo foreign (estrangeiro) na view. A guia Options trata

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 34

exatamente deste ltimo caso, ou seja, como os campos de um arquivo se comportaro quando forem estrangeiros.

Key Foreign Field Options : trata das opes para os campos que so a chave primria do arquivo (neste caso, Cliente.Cdigo) : o Auto Find : para localizar o registro. o Find Required : ser obrigatrio que um registro exista. o No Put : para que os dados informados no sejam movidos para o buffer e conseqentemente, alterados.

Indexed Foreign Field Options : trata das opes para os campos que so ndices (no caso, Cliente.Nome e Cliente.CGC) : o Find Required : ser obrigatrio que um registro exista. o No Put : para que os dados informados no sejam movidos para o buffer e conseqentemente, alterados.

Default Foreign Field Options : trata das opes para os demais campos do arquivo : o Display Only : os dados sero apenas exibidos, no podendo ser modificados.

Error Handling : opes que sero usadas em caso de erro, por exemplo, quando um registro obrigatrio no for encontrado. o Standard Error Report Mode : ser usado o tratamento e mensagem de erro padro do VDF. o Custom Error Report Mode : criaremos ou mudaremos a mensagem de erro :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 35

Validation Error No : o nmero da mensagem de erro que ser exibida; Validation Error Text : o texto da mensagem de erro que ser exibida.

Other Settings : o Protect Key Fields : os campos que forem chave primria no podero ser alterados.

Raramente alteraremos estas opes, portanto vamos deixar os valores default e partirmos para a prxima guia, Structures. Salve suas alteraes e feche o arquivo Cliente. Vamos configurar todas as opes que j vimos para os demais arquivos. Para isto, trabalharemos com todos eles abertos simultaneamente. Clique em ou selecione File -> Open... no menu. Na tela de seleo, clique em para marcar todos os arquivos. Clique nas caixas de seleo de Sistema, Cliente e @DataFlex error file para desmarc-los. Clique . em No barra de menus, selecione Window -> Minimize all Windows. Restaure a tela de Vendedor. Vamos configurar seu dicionrio da seguinte forma : Fields Settings o Options

Codigo : Auto Find, Key field, No Put. Estado : Capslock.

o Validation / Lookup Codigo : Lookup Object = oVendedorSl ; Lookup Package = Vendedor.sl Nome : Lookup Object = oVendedorSl ; Lookup Package = o Validation Table Estado : Dynamic, Type Value = ESTADOS. o Mask

CEP

Vendedor.sl

: Custom mask = CEP

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil o Appearance

Estado : dbComboForm

Pgina 36

o Other

Codigo : Auto Increment = Sistema.ProxVendedor

Salve e feche o arquivo Vendedor. Restaure a janela do arquivo Produto e configure as seguintes opes : Fields Settings o Options

Codigo : Auto Find, Key field, Required. Descricao : Required.

o Validation / Lookup Codigo : Lookup Object = oProdutoSl ; Lookup Package = Produto.sl Descricao : Lookup Object = oProdutoSl ; Lookup Package = Produto.sl o Validation Table Unidade : Dynamic, Type Value = UNIDADES. o Mask

PrecoVenda : Mask Type = Currency PrecoCusto : Mask Type = Currency

o Appearance

Unidade : dbComboForm

Salve e feche o arquivo Produto. Restaure a janela do arquivo Pedido e configure as seguintes opes : Fields Settings o Options

Numero : Auto Find, Key field, No Put Data : Required. ValorTotal : No Enter. ProxItem : No Enter.

o Validation / Lookup Numero : Lookup Object = oPedidoSl ; Lookup Package =

Pedido.sl

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 37

Data : Lookup Object = oPedidoSl ; Lookup Package = Pedido.sl

o Validation Table

Situacao : Dynamic, Type Value = SITPED

o Mask

ValorTotal : Mask Type = Currency

o Appearance

Situacao : dbComboForm

o Other

Numero : Auto Increment = Sistema.ProxPedido

Salve suas configuraes e vamos dar mais um passo. Restaure a janela do arquivo ItemPed e configure as seguintes opes : Fields Settings o Options

Item : Auto Find, Key field, No Put Quantidade : Required. VrUnitario : Required VrTotal : No Enter.

o Mask

VrUnitario : Mask Type = Currency VrTotal : Mask Type = Currency

o Other

Item : Auto Increment = Pedido.ProxItem

Salve suas configuraes e feche todos os arquivos que porventura estiverem abertos. Vamos para a ltima guia, Structures. Nesta guia definimos a estrutura de banco de dados para o arquivo, ou seja, quais os arquivos pais que so relacionados, quais os arquivos filhos e quais arquivos que no so pais nem filhos mas fazem parte da estrutura, como os arquivos de sistema. Estas estruturas so de extrema importncia para o IDE conectar adequadamente os objetos dicionrios de dados nas views. Na execuo do programa, esta informao usada para validar os dados e atualizar corretamente todos os arquivos pais e filhos durante incluses, alteraes ou excluses de dados. Durante estas operaes, toda a estrutura validada e, se houver algum erro, a operao cancelada. Isto garante a integridade da base de dados.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 38

Vamos abrir todos os arquivos e verificar suas estruturas. Clique em ou em File -> Open... no menu, clique em , desmarque @Dataflex error file e clique em . Selecione o arquivo Sistema e clique na guia Structures.

Observe que as trs listas (Required Child files, Required Parent Files e Externally Updated files) esto vazias. Isto ocorre por que este arquivo no tem relacionamentos com nenhum outro arquivo. Feche este arquivo e selecione o arquivo Cliente e a guia Structures.

Delete Structure : declara todos os arquivos filhos, e que normalmente, so afetados por uma excluso. o Validate Always : toda a estrutura de arquivos ser verificada sempre que houver uma excluso. o Validate Never : a estrutura nunca ser verificada (a validao est desativada). o Validate Once : a estrutura ser verificada apenas quando o primeiro registro for carregado pela view. Esta opo considera que a estrutura no ser modificada durante a execuo do programa. o Cascade deletes : significa que ao se excluir um registro deste arquivo, todos os registros filhos relacionados tambm sero

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 39

excludos. No caso do Cliente, todos os pedidos deste cliente sero excludos. Se esta opo estiver desmarcada, a excluso no ser permitida se o registro tiver registros filhos. o Clique em para incluir na estrutura todos os arquivos filhos que foram diretamente relacionados. para incluir na estrutura qualquer arquivo definido na o Clique em Filelist, mesmo no sendo relacionado. o Clique em para incluir na estrutura qualquer arquivo, mesmo no estando definido na Filelist. o Clique em para excluir um arquivo da estrutura.

Save Structure : declara todos os arquivos pais, e que normalmente so afetados por uma incluso ou alterao no registro. o Validate Always : toda a estrutura de arquivos ser verificada sempre que houver uma gravao. o Validate Never : a estrutura nunca ser verificada (a validao est desativada). o Validate Once : a estrutura ser verificada apenas quando o primeiro registro for carregado pela view. Esta opo considera que a estrutura no ser modificada durante a execuo do programa. o Clique em para incluir na estrutura todos os arquivos pais que foram diretamente relacionados. o Clique em para incluir na estrutura qualquer arquivo definido na Filelist, mesmo no sendo relacionado. o Clique em para incluir na estrutura qualquer arquivo, mesmo no estando definido na Filelist. o Clique em para excluir um arquivo da estrutura.

Externally Updated Files : declara os arquivos que no so pais nem filhos, mas que so usados pelo dicionrio de dados. No caso do Cliente, o arquivo Sistema utilizado para gerar o Codigo.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 40

o Clique em para definir o modo como o arquivo ser bloqueado nas operaes do dicionrio. A seguinte caixa de dilogo ser exibida :

o Clique em Filelist.

para acrescentar qualquer arquivo, mesmo no o Clique em estando definido na Filelist. o Clique em para remover um arquivo da lista.

Verifique em todos os arquivos se suas estruturas esto configuradas corretamente, como abaixo : Cliente : filhos = Pedido; cascade delete = false; pais = nenhum; externos = Sistema. Vendedor : filhos = Pedido; cascade delete = false; pais = nenhum; externos = Sistema. Produto : filhos = ItemPed; cascade delete = false; pais = nenhum; externos = nenhum.

Lock on All : o arquivo ser bloqueado em todas as operaes de gravao e excluso de registros. Lock on Delete : o arquivo ser bloqueado apenas durante a excluso de registros. Lock on Save : o arquivo ser bloqueado apenas durante as operaes de gravao. Lock on New Save : o arquivo ser bloqueado apenas quando for gravado um novo registro. Lock on New Save + Delete : o arquivo ser bloqueado apenas na incluso de um novo registro ou na excluso. para acrescentar um arquivo que esteja definido na

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil -

Pgina 41

Pedido : filhos = ItemPed; cascade delete = true; pais = Cliente, Vendedor; externos = Sistema.

Salve e feche todos, e vamos para a ltima parte do dicionrio de dados, a guia Methods. At aqui, trabalhamos somente com as caractersticas de cada campo, mas um dicionrio de dados muito mais que isto. Nele criamos as regras de negcio, atravs dos mtodos, para resolver questes como : um pedido s pode ser faturado se o cliente tiver crdito e houver mercadoria em estoque; se um pedido for excludo, seus tens tambm devero ser, evitando registros rfos; se um produto consta em algum pedido, ele no pode ser excludo; quando um tem pedido, ele deve ser subtrado do estoque; para cada tem de pedido, o campo ValorTotal do pedido deve ser atualizado;

Todas estas regras podem ser implementadas no programa, no dicionrio ou em ambos, dependendo de suas necessidades. Mas a implementao no dicionrio muito mais prtica, pois voc ter que programar apenas uma vez num nico lugar e, a partir da, qualquer programa que utilizar este dicionrio estar levando junto todas as suas regras. Vamos ento para a guia Methods. Aqui ns trabalhamos diretamente com o arquivo do dicionrio de dados, (.DD), podendo criar ou modificar qualquer ao que ocorra sobre o arquivo. Em Methods ns efetivamente programaremos, utilizando qualquer cdigo que o VDF reconhea.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Abra o arquivo Cliente e clique na guia Methods.

Pgina 42

O VDF tem vrios eventos pr-definidos que so executados quando alguma operao acontece no arquivo, como ao incluir um registro, ao excluir, ao alterar, etc. Todos estes eventos so sempre executados, independente de termos programado algum ou no. Podemos utilizar o que nos interessa e acrescentar o cdigo necessrio. Alm disto, podemos criar nossos prprios mtodos e associ-los a alguma ao que possa ocorrer sobre os dados. A lista esquerda apresenta os mtodos mais comuns (no todos), separados em duas categorias : Unaugmented Methods so os que no foram utilizados e Implemented Methods so os que j esto em uso no dicionrio. Observe na lista que dois j esto em uso, Define_Fields e Field_Defaults e seu cdigo pode ser visualizado no editor, direita. Estes dois mtodos so criados automaticamente para cada arquivo e raramente iremos modific-los. Observe a sintaxe de criao de uma classe (Cliente_DataDictionary) e dos dois mtodos (procedures). Para o arquivo Cliente, vamos criar a seguinte regra : quando um cliente for excludo, se seu cdigo for o ltimo que foi gravado, iremos reaproveit-lo para o prximo cliente.

Lembre-se que o cdigo do cliente gerado automaticamente, pelo incremento do campo Sistema.ProxCliente, ou seja, cada vez que um novo cliente gravado, o VDF l o valor que est neste campo, soma mais 1, move o valor para o campo Cliente.Cdigo e salva os dois arquivos (Cliente e Sistema), tudo automaticamente. Mas a operao inversa, ns teremos que fazer manualmente. Expanda a lista Unaugmented Methods e d um duplo clique em Delete_Main_File. O cdigo apropriado ser gerado no editor. Este evento executado sempre que um registro for excludo, exatamente o que queremos. No editor, apague a linha comentada Insert code here (insira o cdigo aqui)

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 43

e vamos digitar nossos comandos. Se voc quiser aumentar a rea do editor, clique com o boto direito em algum lugar sobre ele e, no menu suspenso, selecione Popup Editor. Digite o cdigo conforme est na figura :

Vejamos alguns detalhes da linguagem : Os comentrios sempre comeam com // e podem ser colocados em qualquer lugar do cdigo; A linha Forward Send Delete_Main_File significa que o VDF vai executar os comandos que foram definidos para esta procedure na classe DataDictionary (ou em outra mais ancestral) e em seguida executar a nossa seqncia de comandos;
If testa uma condio que est entre parnteses e se for verdadeira, executa os comandos dentro do bloco begin ... end.

Uma condio pode ser to complexa quanto necessrio, podendo ter vrios nveis de parnteses, mas uma linha de comando VDF tem um limite de 255 caracteres. Se voc quiser quebrar a linha, por uma questo de esttica, use ; Alm dos sinais de comparao (= , > , >= , < , <= e <>) voc pode usar os operadores equivalentes (eq , gt , ge , lt , le e ne). Uma condio no precisa estar entre parnteses, mas neste caso voc deve usar os operadores de comparao, no os sinais. Utilizamos Subtract para decrementar o campo, mas poderamos usar o comando Calc Sistema.ProxCliente = Sistema.ProxCliente 1, porm neste caso ns estaramos escrevendo mais; Calc mais utilizado para expresses complexas; tambm poderamos ter utilizado Decrement Sistema.ProxCliente, mas apenas se estivermos trabalhando com campos inteiros.
SaveRecord grava (ou regrava) um registro.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 44

Por enquanto s, para Cliente. Feche o arquivo, salvando suas alteraes e abra o de Vendedor e, em Methods coloque o mesmo cdigo, trocando, obviamente, os campos respectivos pelo do arquivo Vendedor e Sistema.ProxCliente por Sistema.ProxVendedor. Abra o arquivo Pedido e vamos criar as seguintes regras, alm da mesma que criamos para os arquivos anteriores : Se a data do pedido no for informada, coloque a data atual como default;

Vamos criar uma procedure para realizar esta tarefa. Na guia Methods, clique com o boto direito na lista de mtodos que aparecem esquerda e, no menu suspenso, escolha New method. Surgir a tela

Digite o nome do nosso mtodo, mLeDataAtual. Por uma questo de padronizao, sempre comeamos os nomes de procedures com m e de funes com f. Mas voc pode utilizar um outro modelo, se preferir. Clique em OK. Observe que o VDF criou nosso mtodo no editor com apenas uma linha de comentrio. Apague esta linha e insira o seguinte cdigo :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Vamos examinar o cdigo : -

Pgina 45

Ao associarmos um mtodo com um evento de entrada, sada ou validao de um campo, este mtodo recebe duas variveis como parmetros : o nmero do campo (no exemplo, iCampo, do tipo inteiro) e seu valor atual (no exemplo, dData, do tipo data); Por padronizao, sempre iniciamos os nomes de variveis string (cadeia de caracteres) com s, integer (nmero inteiro) com i, real (nmero real) com r, date (data) com d, boolean (lgico) com b, handle (referncia) com h; Dentro da procedure, criamos uma varivel inteira, iMudou;
Field_Changed_State uma propriedade pr-definida que recebe como parmetro o nmero do campo (iCampo) e retorna 0 se o valor do campo

no foi alterado; Fazemos ento o teste : se o valor do campo no foi alterado (iMudou = 0) e o campo est vazio (dData = 0), colocamos a data corrente em dData (Sysdate4 dData) ; Finalmente, configuramos a propriedade Field_Default_Value para o valor que est na varivel dData. Isto significa que se nenhum valor for informado, o valor default ser a data de hoje. Observe que, ao invs de usarmos o nmero do campo (iCampo), poderamos usar seu nome e o comando ficaria assim : Set Field_Default_Value field Pedido.Data to dData.

Falta apenas associar este mtodo com o evento correspondente. Clique na guia Field Settings e na sub-guia Other. Selecione o campo Data e na linha Entry para apresentar a seguinte tela : Method, clique em

Clique em mLeDataAtual e em OK. Agora, sempre que ocorrer o evento de entrada no campo Data, ser disparado mtodo mLeDataAtual.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 46

Clique novamente em Methods, expanda a lista Unaugmented Methods, d um clique duplo em Backout e em Update, para inserir seus respectivos cdigos no editor. Os procedimentos definidos em Update so executados sempre que um registro inserido ou alterado e os procedimentos em Backout so executados quando um registro excludo ou alterado. Usaremos a procedure Update para somar o valor do Pedido em Cliente.Compras e a procedure Backout para subtrair este valor. Veja o cdigo a seguir :

Salve e feche o arquivo Pedido. Abra o arquivo ItemPed e vamos criar as seguintes regras : quando um registro for includo, alterado ou excludo, atualize o campo Pedido.ValorTotal e Produto.Estoque; quando um item for excludo, se ele for o ltimo re-aproveitaremos seu nmero;

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Veja o cdigo :

Pgina 47

Observe como os mtodos Update e Backout fazem operaes exatamente opostas. Vamos criar mais uma regra: - antes de um item ser gravado, verifique se h estoque disponvel em Produto; Para isto, vamos utilizar a funo Validate_Save. Esta funo chamada quando um registro est para ser gravado (novo ou alterado) e se ela retornar um nmero diferente de zero, a operao abortada. Veja o cdigo :

Vamos examin-lo : - Forward Get Validate_Save to iRet executa o que j est definido para ela nas classes ancestrais (Forward) e retorna o valor para iRet.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil -

Pgina 48

Se este valor no for false (Not(iRet)), executaremos um bloco de comandos begin...end. Poderamos tambm testar If (iRet <> 0). Se o estoque no for suficiente, enviamos uma mensagem ao usurio com Send Stop_Box e movemos um valor diferente de zero para iRet (-1, por exemplo). Por fim, a funo retorna o contedo de iRet. Para executarmos uma funo, usamos a sintaxe Get Nome_da_Funo to varivel, pois uma funo sempre retorna algum valor. Para executarmos uma procedure, usamos Send Nome_da_Procedure.

Salve as informaes e vamos criar mais algumas regras : Ao entrarmos no campo VrUnitario, se seu valor for zero, traremos o valor de Produto.PrecoVenda. Ao sairmos dos campos VrUnitario e Quantidade, calcularemos o campo VrTotal.

Vamos criar estes dois mtodos. Na lista de mtodos esquerda, clique com o boto direito, escolha New Method, informe o nome do primeiro, mLePreco e clique em OK. Repita o procedimento e crie o mtodo mCalculaTotal. Observe como fica sua codificao :

Veja o cdigo : Na procedure mCalculaTotal pegamos os valores atuais dos campos ItemPed.Quantidade e ItemPed.VrUnitario e os colocamos em variveis locais (iQuant e nValor) usando a propriedade Field_Current_Value. Alteramos o valor de ItemPed.VrTotal para o produto dos dois valores usando Field_Changed_Value.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil -

Pgina 49

Em mLePreco verificamos se o valor que est no campo zero e, se for, pegamos o preo de venda do Produto com a propriedade File_Field_Current_Value e alteramos o valor do campo com Field_Changed_Value. Executamos mCalculaTotal para atualizarmos a exibio dos valores.

Neste ponto, vale a pena um esclarecimento. Quando trabalhamos com os campos de um arquivo, na verdade estamos manipulando um buffer que o VDF cria em memria, ou seja, variveis virtuais que representam os campos e no diretamente com os campos fsicos que esto gravados em disco. Quando solicitamos uma gravao, o buffer verificado e apenas as variveis que sofreram alteraes so enviadas para o arquivo que, em seguida, gravado. Na verdade, existem dois buffers : - Quando referenciamos os nomes dos campos (come Pedido.ValorTotal ou ItemPed.Quantidade) estamos trabalhando com o buffer do arquivo. - Quando referenciamos as propriedades dos campos, como em Field_Current_Value, estamos trabalhando com o buffer do dicionrio de dados. - Numa gravao, o buffer do dicionrio movido para o buffer do arquivo, que finalmente movido para o arquivo fsico. Por isto, existe uma grande diferena entre estas duas propriedades : Field_Current_Value pega ou move um valor para um campo; Field_Changed_Value move um valor para um campo e avisa ao VDF que

este valor foi alterado, e portanto deve ser movido do buffer para o arquivo. O comando set Field_Changed_Value field ItemPed.VrUnitario to nValor equivale a :
set Field_Current_Value field ItemPed.VrUnitario to nValor set Field_Changed_State field ItemPed.VrUnitario to true

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 50

Por fim, vamos associar os eventos criados aos respectivos campos. Clique na guia Field Settings e na sub-guia Other. Selecione o campo Quantidade e na linha Exit Method, clique em para apresentar a seguinte tela :

Clique em mCalculaTotal e em OK. Assim, sempre que ocorrer um evento de sada deste campo, este mtodo ser executado. , Selecione o campo VrUnitario e na linha Entry Method, clique em selecione mLePreco e OK para executar este mtodo sempre que houver uma entrada neste campo. Ainda com VrUnitario selecionado, clique em , na linha Exit Method, selecione mCalculaTotal e OK para executar este mtodo sempre que houver uma sada deste campo. Lembre-se que VrTotal modificado sempre Quantidade e VrUnitario forem alterados, por isto associamos o evento mCalculaTotal aos dois campos. Por enquanto, isto tudo que faremos no dicionrio de dados. Feche e salve todos os arquivos.

Outras funes do Database Builder


Alm de manter os arquivos e seus dicionrios, o Database Builder tem vrias opes para a administrao da base de dados. A partir do Menu : File o New workspace : cria uma nova wokspace. o Select workspace : muda para outra workspace. o New : cria um novo arquivo. o Open... : abre um arquivo. o Open as... : abre um arquivo que no est na Filelist.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 51

o Open Related... : abre um arquivo e todos os pais relacionados. o Close : fecha o arquivo atual. o Close all : fecha todos os arquivos abertos. o Save : grava as alteraes do arquivo atual. o Printer setup... : configura a impressora. o Load DEF... : cria um arquivo na Filelist a partir de Arquivo.DEF. o Output DEF/FD... : gera os arquivos .DEF e .FD dos arquivos selecionados. Lembre-se que o .DEF serve para documentao e tambm para recriar o arquivo, usando-se a opo acima (muito til no caso de um desastre!) e o .FD utilizado na compilao. Este ltimo, principalmente, deve sempre estar atualizado. o Configure : configura algumas opes do dicionrio e do Database Builder. o Recents workspaces : as ltimas workspaces acessadas. o Recent files : os ltimos arquivos acessados. Report o File definition : gera um relatrio com as definies fsicas dos arquivos selecionados. o Data dictionary : gera um relatrio com todas as configuraes do dicionrio de dados dos arquivos selecionados. o Percentage filled diagram : mostra em grfico o percentual de registros utilizados x nmero mximo de registros definidos. o Check for orphans : verifica todos os arquivos selecionados e indica registros filhos que no tem registros pai. o Check relationships : verifica os relacionamentos entre os arquivos do sistema. o Check for damaged headers : verifica arquivos que esto com seus .HDR danificados. Maintenance o Reindex : recria os ndices dos arquivos selecionados.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 52

o Cleanup : recupera arquivos que apresentaram problemas durante a reindexao. o Attributes : altera os atributos bsicos dos arquivos. o Repair : recupera arquivos que esto danificados (com problemas no header). o Recompress : refaz a compactao de dados, para arquivos que utilizam esta opo. Filelist o Open : abre uma Filelist. o Create empty Filelist : cria uma Filelist vazia. o Save Filelist as : grava a Filelist com outro nome. o Remove entry : remove uma entrada da Filelist, deixando o arquivo intacto. o Erase : apaga os dados de um arquivo o Delete : exclui um arquivo e o retira da Filelist. o New entry : cria uma nova entrada na Filelist, mas no cria o arquivo. o Edit entry : modifica uma entrada na Filelist. o Move entry : muda o nmero de arquivo na Filelist. Vamos verificar como esto os relacionamentos entre as tabelas do sistema. No menu do Database Builder, selecione Report -> Check relationships. Clique , desmarque @Dataflex error file e clique em em . Ser gerado um relatrio com todos os arquivos e as seguintes informaes : Required child file structure : exibe a lista dos arquivos filhos necessrios; Required parent file structure : exibe a lista dos arquivos pais necessrios;

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil -

Pgina 53

Relate from ... Relate to : exibe o relacionamento entre arquivo filho e arquivo pai; Status : tem dois valores o Match : a configurao est correta; o NoMatch : a configurao est errada.

Obviamente, todas as informaes com o Status NoMatch devem ser corrigidas. Por enquanto, isto tudo que faremos no Database Builder. Vamos conhecer o IDE e comearmos a montar a interface com o usurio.

IDE
O IDE (Integrated Development Environment ou Ambiente de Desenvolvimento Integrado) uma das principais ferramentas do VDF. Nele criamos e mantemos a maioria dos componentes da aplicao como programas, janelas (Views), listas de seleo (Selections-Lists ou Lookup-ups), relatrios (Report Views), etc. Atravs dele podemos tambm acessar todas as outras ferramentas como o Database Builder, Database Explorer, Compilador, Debug e Crystal Reports, alm de podermos configurar outras preferncias (como um editor de texto, por exemplo). No decorrer do treinamento, explicaremos e trabalharemos com todas estas opes.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 54

Para executar o IDE, clique em do menu Iniciar -> Programas -> Visual Dataflex. A seguinte tela ser exibida :

Interface com o usurio


Depois de criarmos os arquivos e seus dicionrios, o prximo passo criar as views de entrada de dados, onde os usurios efetivamente trabalharo. Estas views so compostas basicamente de objetos de entrada de dados (DEO, Data Entry Objects) e objetos servidores de dados (DSO, Data Server Objects). Os DEOs so formados por forms, tables, editors, combobox, etc, onde os usurios examinam, selecionam e mantm os dados do banco de dados. Os DSOs controlam o acesso ao banco de dados, utilizando as regras dos dicionrios de dados. Uma aplicao basicamente composta por um programa principal (.src), contendo vrios objetos como menu, barra de status, views , lookups, report views, etc.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 55

Criando o programa
Para criarmos um programa, a partir do menu do IDE selecione File -> New program. A seguinte tela ser exibida :

esquerda, temos a estrutura do programa, com suas vrias reas e a direita temos um editor de texto. A medida que voc clica em alguma rea esquerda, seu cdigo aparece no editor. A estrutura principal do programa (PROGRAM) usa um pacote pr-definido (Use Workspc.pkg), configura algumas propriedades de datas, cria um objeto da classe workspace, usa alguns outros pacotes de help e tem um nico comando, Start_UI, que inicia a aplicao. Vamos fazer uma primeira alterao neste cdigo. Por default do Windows, voc navega de um objeto para outro usando TAB. Queremos que a tecla ENTER faa a mesma funo, pois muitos usurios esto acostumados com este padro. Aps a linha Set WorkspaceName to CURRENT$WORKSPACE, configure a seguinte propriedade : Set kEnter_Next_State to true.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 56

Clique em para salvar o programa. Informe os dados conforme mostra a prxima tela e clique em :

Criando listas de seleo (lookups)


O prximo passo ser criarmos objetos lookups, listas de seleo que o usurio utilizar para selecionar registros. Ns j fizemos referncia a estes objetos no dicionrio, lembra-se ? Para criar uma lookup, clique em New Lookup.

Este objeto formado basicamente de um painel, uma lista e trs botes. Para associ-lo a um dicionrio (ou DDO, Data Dictionary Object), clique com o boto direito em alguma rea do painel (por exemplo, esquerda dos botes) e, no menu suspenso escolha Data Dictionaries.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Clique em .

Pgina 57

Selecione Cliente Data Dictionary e clique em . Responda Sim pergunta Do you wish to make this the main DDO ? (voc deseja que este seja o dicionrio principal) e em seguinda clique em . Clique em Toggle Database Selector. Na caixa a seguir, d um duplo clique em CLIENTE para exibir todos seus campos.

Selecione os campos CODIGO e NOME e arraste-os para qualquer lugar da lista do objeto lookup. Para alterar qualquer caracterstica da lista, clique com o boto direito em qualquer luga dela e selecione Grid Options...

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Main File : o arquivo principal da lista.

Pgina 58

Ordering : a ordem em que os registros sero listados. Na verdade, esta classificao feita durante a execuo, dependendo da coluna que voc selecione e se ela um ndice. Columns : so os campos que compe a lista. Label : o ttulo de cada coluna. Altere o ttulo de Cliente.Cdigo para Cdigo (acentuado). Width : a largura da coluna. Checkbox Column : indica se a coluna um checkbox.

Clique em OK para fechar este dilogo. Clique com o boto direito em algum lugar do painel da lookup e selecione Properties. Altere a propriedade Name para oClienteSl. Por padro, sempre nomeamos objetos comeando com a letra o. Altere a propriedade Label para Lista de Clientes.

Feche esta caixa de dilogo. Nossa lista melhorou de aspecto, mas ainda est com as legendas dos botes em ingls. Como nosso sistema no internacional (ainda), vamos traduzi-las. Clique com o boto direito sobre o boto Cancel e e altere a propriedade Name para oCancelar_bn e seu Label para &Cancelar. O & antecede a letra do label que ser sublinhada, indicando a tecla de atalho para o boto. Com a caixa de propriedades ainda aberta, clique no boto Search... e altere a propriedade Name para oProcurar_bn e seu Label para &Procurar...

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 59

Observe que esta mudana alterou a tecla de atalho (que era S de Search) para P. Para que esta alterao funcione corretamente, clique em para abrir o cdigo do objeto lookup.

O comando On_Key define uma combinao de teclas e que evento ser disparado quando esta combinao for teclada. Vamos alterar Key_Alt+Key_S para Key_Alt+Key_P (de Procurar) e o nome do objeto alvo de oSearch_bn para oProcurar_bn. O mtodo KeyAction produz o mesmo efeito de se dar um clique no boto. Vamos salvar nossa lookup. Clique em e informe os seguintes dados :

Observe que File-Name o nome externo do objeto, ao qual o VDF acrescenta a extenso .sl. Para completar nossa selection-list, vamos acrescentar o campo CGC. Clique em para abrir o Database Selector, selecione o campo CGC e arraste-o para a lista. Observe que surgiu uma barra de rolagem, indicando que os campos ultrapassam a largura da lista. Vamos ento redimensionar nossa lookup para

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 60

exibir todas as colunas sem rolagem. Clique em algum lugar do painel principal e arraste a marca lateral de dimensionamento para aumentar sua largura.

Clique na lista e aumente sua largura at surgir o campo CGC. Diminua um pouco a largura da coluna Nome posicionando o cursor na marca de dimensionamento de colunas e arrastando para a esquerda.

Altere as dimenses at a lookup ficar com a aparncia abaixo :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 61

Por fim, vamos arrastar os botes para a esquerda. Clique no primeiro boto, pressione CTRL e clique no segundo e terceiro para selecionar todos.

Voc pode movimentar os objetos arrastando com o mouse ou usando as setas de direo. Pressionando CTRL e usando as setas, voc redimensiona os objetos selecionados. A lookup dever estar com a seguinte aparncia :

Salve as alteraes e feche o objeto.

Criando templates (modelos)


Vamos criar as lookups para Vendedor, Produto e Pedido. Mas pense o seguinte : em todas elas teremos que alterar os labels de dois botes, modificar o cdigo para corrigir a tecla de atalho e posicion-los esquerda. No seria mais fcil ter um modelo (template) com estas definies e criar as lookups a partir dele ? Para criar um template, crie uma nova lookup e faa as alteraes necessrias nos botes e no cdigo.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 62

No menu, selecione File -> Save as template -> Global. Na caixa de dialgo Salvar, informe Lista_padro para nome do arquivo e clique em Salvar. Um template Global salvo na pasta \VDF\Usr\global\IdeSrc e pode ser utilizado por qualquer aplicao. Um template Local salvo na pasta IdeSrc da aplicao, no nosso caso, \VDF\Projects\Acme\IdeSrc e deve ser usado apenas por ela. Vamos ento criar as demais lookups a partir de nosso template. Clique em New Component. Surge uma caixa de dialgo com quatro guias. Selecione a guia Lookups e nossa lista_padro. Clique em OK.

Foi criado um novo objeto baseado em nosso modelo. Agora basta acrescentar o dicionrio de dados e os campos e salvar. Faa a lookup de Vendedor com esta aparncia:

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 63

No se esquea de alterar o nome do objeto para oVendedorSl. Salve-a e crie a de produtos, conforme o modelo :

Salve-a e crie a dos pedidos. Observe que ao selecionar o DDO Pedido, o VDF trouxe para a lista todos os DDOs relacionados. Isto significa que voc pode usar campos de qualquer um deles para esta lookup. Certifique-se que Pedido o Main DDO.

Nesta lookup, vamos usar os seguintes campos : Pedido.Numero, Pedido.Data, Pedido.ValorTotal, Cliente.Nome e Vendedor.Nome. O objeto deve ficar com a seguinte aparncia :

Salve-a e vamos encerrar as lookups, por enquanto.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 64

Criando views
Vamos para a prxima fase, criar as views para a manuteno dos dados. A primeira ser a do Cliente. Clique em New View. O VDF criou apenas um painel vazio. Clique com o boto direito em algum lugar dele e selecione Properties. Altere o Name para oClienteVw e o Label para Cliente. Abra o Database Selector para incluirmos o DDO. Selecione o dicionrio do Cliente e confirme-o como Main DDO. Selecione Codigo e Nome e arraste-os para o painel. Observe que foram criados dois EntryForms com os respectivos labels. Redimensione o painel para comport-los.

A distncia entre o label e o entryform esto grandes, ento vamos alter-la. Clique com o boto direito no campo Codigo e selecione Properties. Clique com o boto direito na propriedade Label_Justification_Mode e selecione jMode_Right. Isto vai alinhar o label direita do campo. Clique em Label_Col_Offset e altere seu valor para 2. Faa as mesmas alteraes para o campo Nome. direita de cada campo existe um boto . Isto significa que existe uma lookup associada a estes campos (ns definimos isto no dicionrio de dados) e o VDF automaticamente ajustou esta propriedade. Aumente a altura do painel para permitir a incluso de um novo objeto. Clique em Toggle Controls Pallete para exibir a paleta de controles.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 65

Clique na guia Data Containers, clique em dbTabDialog e arraste-a para o painel.

Clique com o boto direito em dbTabPage1 e selecione Properties. Altere a propriedade Name para oInformacoes e TabLabel para Localizao. No Database Selector, selecione Endereco, Bairro, Cep, Cidade e Estado e arraste-os para dentro da TabPage Localizacao. Altere a propriedade Label_Col_Offset de todos os objetos para 2 e Label_Justification_Mode para jMode_Right. Note que o campo Estado foi criado como uma ComboBox, tambm definido no dicionrio de dados. Altere sua propriedade Code_Display_Mode para cb_code_display_code. Esta propriedade define o que vai ser visualizado na ComboBox : cb_code_display_description = mostra a descrio da tabela (no nosso caso o nome do estado); cb_code_display_code = mostra o cdigo da tabela (no caso, a sigla do estado); cb_code_display_both = mostra o cdigo e a descrio.

Note que o valor enviado para o campo ser sempre o cdigo, independente da visualizao. Se o espaamento vertical entre os objetos no estiver igual, selecione todos com CTRL+Click, clique com o boto direito em algum deles, selecione Align -> Top-To-Bottom. Voc pode alinhar os objetos em vrios sentidos : Left (esquerda), Top (em cima), Right (direita), Bottom (em baixo), Top-ToBottom (de baixo para cima) e Left-To-Right (da esquerda para a direita). O alinhamento tambm pode ser feito pela Alignment Pallete, que exibe a paleta :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Sua view deve estar com esta aparncia :

Pgina 66

Clique com o boto direito na guia Localizao e selecione Add Tab Page. Mude sua propriedade TabLabel para Identificao. No Database Selector selecione CGC, Inscricao, Telefone e E_Mail e arraste-os para a TabPage Identificao. Depois de dimensionada e alinhada, sua view estar parecida com esta :

Crie mais uma TabPage, mude sua TabLabel para Valores. No Database Selector, selecione LimiteCredito, Compras e Pagamentos e arraste-os para a TabPage. Sua tela dever ficar como esta :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 67

Adcione mais uma TabPage, mude sua TabLabel para Observaes, selecione Observacoes no Database Selector e arraste-o para a TabPage. Apague o valor de Label do objeto Cliente_Observaes. Clique com o boto direito sobre este objeto, selecione Center -> Horizontally, e em Center -> Vertically para centraliz-lo na TabPage. Veja o modelo :

Por fim, clique com o boto direito sobre a TabPage e altere sua propriedade Rotate_Mode para RM_Rotate. Esta propriedade define como ser a navegao entre as diversas TabPages e o painel principal. As opes podem ser : RM_None = ao sair do ltimo campo da TabPage o foco volta ao painel principal; RM_Ring = ao sair do ltimo campo da TabPage, o foco volta para o primeiro campo da mesma TabPage; RM_Rotate_in_Ring = ao sair do ltimo campo da ltima TabPage, o foco volta para o primeiro campo da primeira TabPage; RM_Rotate = ao sair do ltimo campo da ltima TabPage, o foco volta para o primeiro campo do painel principal.

Salve e feche a view. Vos inclu-la em nosso programa. Se o programa no estiver aberto, clique em File -> Open Program e selecione-o da lista. Clique na pasta VIEWS, dentro . Selecione Cliente (Cliente.vw) da CLIENT AREA. Clique em e clique em OK. Agora podemos compilar e testar nosso programa. Clique em Compile Program. Se no houver nenhum erro, o programa ser compilado e executado.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 68

Observe que o VDF criou uma aplicao completa, com menu, barra de ferramentas, barra de status, etc. claro que todas estas opes podem ser modificadas, mas por ora vamos aceitar o padro. Clique em View -> Cliente para trabalharmos com a view que acabamos de criar.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 69

Clique em Funes no menu e observe todas as opes de manipulao dos registros. Algumas esto sombreadas, pois no se aplicam ao contexto (por exemplo, Exluir, pois no h nenhum registro para excluso). Se seu menu no estiver em portugus, no se preocupe, mais adiante ensinaremos como traduz-lo.

Note que todas as opes tem uma tecla de atalho, o que agiliza a digitao para quem no muito f do mouse. Todas estas opes tambm podem ser acessadas pela barra de ferramentas.

Cadastre e altere os dados de alguns Clientes e observe o comportamento da aplicao. Note que o cdigo gerado automaticamente, como foi definido no dicionrio de dados, e voc no consegue alter-lo (e nem deveria). Exiba a prompt-list e teste seus recursos. Note que quando voc muda de coluna, a ordem de exibio alterada (se a nova coluna for um ndice). Observe tambm que o VDF j incorporou todas as mensagens de confirmao para incluso, alterao e excluso de registros. Tente excluir um registro e voc obter a seguinte mensagem de erro:

Isto ocorreu por que os arquivos filhos do Cliente (Pedido, ItemPed e Produto, que filho de ItemPed) no foram includos na view. No dicionrio de dados ns definimos que a estrutura deve ser verificada antes de uma excluso.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 70

Para corrigir este problema, feche a aplicao, retorne ao IDE e vamos editar a view. Clique em e selecione Cliente.vw. Observe que o VDF exibe os componentes do tipo que est especificado em Type. Abra o Database Selector, clique em , clique em e selecione Pedido e Item do Pedido. Os dicionrios relacionados tambm so trazidos. Clique em , compile a aplicao e teste uma excluso. Tudo deve estar funcionando agora. Feche a aplicao e vamos criar a view de vendedores. Siga o exemplo do cliente e monte uma view como esta :

Observe que para o vendedor no criamos nenhuma TabPage, colocando todos os dados no painel principal. Lembre-se de incluir os dicionrios de dados relacionados, para evitar problemas de validao. Salve e feche a view e inclua-a no programa principal. Compile o programa e teste a aplicao. Vamos criar a view do Produto. Siga os passos anteriores e crie uma view como esta :

Inclua-a no programa principal, compile e teste a aplicao.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 71

Vamos agora criar uma view mais sofisticada : Pedidos e seus itens. Esta view ter uma parte principal, que conter os dados do Pedido e uma grid que conter os itens. Vamos criar a parte principal. No Database Selector, inclua todos os DDOs, menos o do Sistema. Verifique se o Main DDO Pedido. Arraste os campos Numero, Data, Situao e ValorTotal do Pedido para a view. Observe que o campo Situacao est pequeno demais (um bug do VDF). Altere sua propriedade Size para 13,50 e deixe a propriedade Code_Display_Mode com cb_code_display_description pois quremos exibir a descrio da situao, no seu cdigo. Arraste os campos Nome e Codigo do Cliente para a view. Por que no trazer o campo CodCliente do Pedido ? Por que o VDF se encarregar de fazer a ligao necessria, graas ao relacionamento que definimos no dicionrio de dados. Faa o mesmo com os campos Codigo e Nome do Vendedor. Posicione os objetos para que sua view fique como esta :

O VDF determina a ordem de navegao de um objeto para outro na mesma ordem em que eles so includos na View. Isto nem sempre o correto. Para corrigir esta situao, selecione, a partir do menu, Tools -> Tab-Order Definition. Ser exibido um painel com todos os objetos e sua ordem de navegao atual. Para alterar a posio de um objeto, selecione-o e use as setas para moviment-lo. Modifique, se necessrio, para que fiquem da seguinte forma :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Clique em OK para fechar o painel.

Pgina 72

Vamos agora construir a parte dos Itens. Aumente a altura do painel, se necessrio. Abra a palheta de controles, selecione a guia Data, clique e arraste o controle dbGrid para o painel principal.

Clique com o boto direito sobre a grid, selecione Properties e altere Name para oItensPedido. Clique novamente com o boto direito sobre a grid e selecione Grid Options.

Em Main File (arquivo principal) selecione ItemPed e em Ordering (classificao) selecione Index.1. Clique em OK. Abra o Database Selector, expanda Produto, selecione os campos Codigo e Descricao e arraste-os para a grid. Expanda ItemPed, selecione Quantidade, VrUnitario e VrTotal e arraste-os para a grid. Selecione Grid Options novamente e altere os nomes das colunas e reposicione alguns campos para que a grid fique com esta aparncia :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 73

Salve a view, inclua-a no programa, compile e teste. O trabalho bsico est feito. Vamos ento fazer algumas mudanas.
No permitir a alterao de vendedor

Clique em

para abrir o cdigo fonte da view.

Depois que um pedido colocado, no permitiremos que o vendedor seja alterado. Para isto, insira o seguinte cdigo em Vendedor_Cdigo :

Sempre que um novo registro do Pedido for encontrado ou limpo, o DDO envia a mensagem Refresh para todos os DEOs. Aumentamos ento a mensagem para verificar se o pedido novo ou j existe. A propriedade Server retorna o nmero do DDO principal (Pedido). Current_Record retorna o nmero do registro corrente. Se for zero, significa que um registro novo. Se Object_Shadow_State for verdadeiro, o objeto se torna Display_Only. Finalmente, se o objeto tiver o foco e for shadowed movemos o foco para o prximo objeto com Next. O indicador self usado para referenciar o objeto corrente.
Incluindo novos itens apenas no final da lista

Quando voc est numa grid e tecla F10 o VDF insere um registro na posio atual da grid. Mas queremos que todo tem novo seja inserido aps a ltima linha. Para isto, insira o cdigo abaixo no objeto oItensPedido :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 74

A tecla de insero de linha F10 equivale a kAdd_MODE para o VDF; assim, sempre que ela for pressionada ser disparado o mtodo mAcrescentaLinha. Este mtodo move o foco para a ltima linha com End_of_Data e desce para a prxima linha com Down. Se a propriedade Auto_Regenerate_State for verdadeira (o default), sempre que um registro for inserido ou excludo a tabela ser reorganizada. No nosso caso, no precisamos disto, portanto a configuramos para false.
Forar a gravao do Pedido quando entrar e sair dos itens

Considerando que o usurio est armado com um mouse, nada impede que ele v direto aos tens sem informar os dados do pedido. Para evitar isto, insira o cdigo abaixo no objeto oPedidoVw :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 75

A propriedade Should_Save verdadeira sempre que houver uma alterao no DDO. Ento fazemos um teste : se o registro for 0 (ainda no foi gravado) e no houve alteraes (ou seja, o usurio no informou nenhum dado no pedido), disparamos uma mensagem de erro. Caso contrrio, disparamos a mensagem Request_Save_No_Clear que salva o registro sem limpar os dados da view. Aps a gravao, verificamos novamente se houve alteraes e, caso existam, a funo retorna um erro (lembre-se, qualquer retorno diferente de zero equivale a false). V para o objeto oItensPedido e inclua o seguinte cdigo :

Se

propriedade Child_Table_State for verdadeira, a funo Child_Entering ser executada para verificar se os dados do pedido foram corretamente inseridos. Observe a clsula delegate : ela envia uma mensagem ao objeto pai (no caso, oPedidoVw, onde est a funo chamada).

Criando relatrios
No VDF podemos criar relatrios de trs formas : Basic Report : cria relatrios em modo caracter (texto puro), sem usar a impresso do Windows. Normalmente a sada enviada para a porta paralela LPT1. ideal quando se precisa de alta velocidade e baixa qualidade de impresso, como em notas fiscais, boletos, etc. WinPrint : utiliza um pacote integrado ao VDF para produzir relatrios grficos padro Windows, mas de dificlima utilizao pois no possui nenhum utilitrio para a montagem (desenho) do relatrio, necessitando que se informe campo a campo a posio, tipo de fonte, etc.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil -

Pgina 76

Crystal Reports : utiliza o Crystal Reports da Seagate, uma das melhores ferramentas de criao de relatrios do mundo, e que se integra ao VDF. Escolha esta forma para criar relatrios padro Windows, exportar dados para os mais diversos formatos, criar grficos, etc.

Todas as trs formas devem ser encapsuladas numa view especial, a Report View, que possui duas partes distintas : a interface com o usurio, para seleo de registros, destino do relatrio, ordem de classificao, etc; o prprio relatrio.

Basic Report

Inicialmente, vamos criar uma listagem de clientes em Basic Report. Clique em para criar uma Report View. Nossa interface ter basicamente radio buttons para escolher o destino do relatrio, selecionar a ordem de classificao e dois botes, Ok e Cancelar. Abra a paleta de controles, selecione a guia Base Container, clique no controle Radio Group e arraste-o para a view :

Por default, o VDF cria um grupo de trs botes. Clique com o boto direito em RadioGroup1 e selecione Properties. Mude a propriedade Name para oSaida e Label para Enviar para :. Clique em Radio Label 3 e exclua-o, pois s precisamos de dois botes. Para excluir um objeto, selecione-o e clique com o boto direito, escolhendo Delete ou pressione DEL. Selecione Properties de Radio Label 1 e altere o Name para oVideo e Label para Vdeo.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 77

Selecione Properties de Radio Label 2 e altere o Name para oImpressora e Label para Impressora. Sua view dever estar com a seguinte aparncia :

Crie um novo radio group, mude sua propriedade Name para oClassificacao e Label para Classificao. Elimine um dos botes. Altere o Name do primeiro para oNumerica e o Label para Ordem numrica. Altere o Name do segundo boto para oAlfabetica e o Label para Ordem alfabtica. Clique na guia Base da paleta de controles, selecione Line Control e arraste para a view. Posicione e dimensione a linha e a view para que adquira uma aparncia como esta :

Ainda na guia Base da paleta de controles, selecione Buttom e arraste para a view. Mude suas propriedades Name para oOK e Label para &OK. Clique com o boto direio sobre ele e selecione Copy. Clique com o boto direito sobre a view e selecione Paste. O boto foi copiado para a mesma posio. Movimenteo para o lado e mude suas propriedades Name para oCancelar e Label para &Cancelar. Sua view dever estar assim :

Salve a view neste ponto. Informe ClientesBR para Name, Listagem de Clientes(BR) para Description e ClientesBrRv para Object Name.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 78

Vamos ento inserir o cdigo para estes controles. D um duplo clique no objeto oSaida (Enviar para). Observe que o VDF j traz uma procedure prdefinida, Notify_Select_State, que executada sempre que um dos botes for clicado. Para ficar em bom portugus, substitua os defaults iToItem e iFromItem por iItemAtual e iDoItem. Estas variveis guardam respectivamente o boto que est clicado e o anterior. Insira o seguinte cdigo :

Output_Device_Mode uma propriedade utilizada pela Basic Report para

identificar o dispositivo de sada da impresso. Os valores que ela pode assumir so auto-explicativos. Vamos agora inserir o cdigo para oClientesBrRv, o objeto principal.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 79

Criamos uma propriedade que ser usada pelo objeto oClassificacao para indicar qual ordem foi escolhida. Observe que criamos esta propriedade acima da linha verde, ou seja, no incio do cdigo do objeto, pois no local desta linha o VDF criar o cdigo de todos os objetos da view. Experimente abrir o arquivo ClientesBr.rv e voc ver este posicionamento. Definimos as teclas de atalho para os dois botes, com o comando On_Key. A procedure mIniciaRelatorio ser disparada pelo boto OK. Se a opo escolhida foi envi-lo para o vdeo, criamos um arquivo com o comando Make_Temp_File, de extenso TXT e cujo nome armazenado em sNomeArquivo. Este nome criado aleatoriamente pelo VDF e no repetido. Desta forma, se mais de um usurio acessar o relatrio simultaneamente, no corremos o risco de conflitos. Acrescentamos ao nome .\ para garantir que o arquivo ser criado no diretrio corrente. Se a sada for para a impressora, setamos a propriedade Output_Device_Name para a sada padro do Windows, WinLst:. Vamos incluir o cdigo para oClassificacao.

Como os ndices dos botes so baseados em zero, acrescentamos 1 para indicar que 1 ser ordem numrica e 2 ser ordem alfabtica. No boto oOK, acrescente o cdigo :
procedure OnClick send mIniciaRelatorio end_procedure

No boto oCancelar, coloque o cdigo :


procedure OnClick send Request_Cancel end_procedure

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Finalizamos a interface com o usurio, vamos ento criar o relatrio.

Pgina 80

Usamos o pacote DFAllRpt, que define a classe Basic Report, em seguida abrimos o arquivo Cliente e criamos as imagens que sero impressas. Todas comeam com / e aps a ltima finalizamos a seo com /*. Cliente_Cab ser o cabealho, Cliente_Lin o detalhe e Footer ser o rodap de cada pgina. Cada caracter impresso representado por _. Para um campo numrico (Cdigo), o ltimo caracter um ponto. Vamos finalmente criar o objeto relatrio, dentro de ClientesBrRv :
// Criamos um objeto da classe BasicReport Object oClientesBr is a BasicReport // indicamos qual seu arquivo principal Report_Main_File Cliente // propriedade que define o ttulo da caixa de mensagem // que ser exibida // enquanto o relatrio estiver sendo gerado set Report_Title to "Imprimindo listagem de Clientes" // funo disparada antes do relatrio ser gerado function Starting_Main_Report returns integer integer iRet iIndice forward get Starting_Main_Report to iRet // pegamos a ordem de classificao escolhida get pOrdem to iIndice // indicamos ao objeto qual ndice usar Report_Index by iIndice // Colocamos a data atual no campo da imagem. // Cada campo referenciado pelo nome da imagem // e sua seqncia Sysdate4 Footer.1 function_return iRet end_function

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


// Imprime o cabealho. Aps a palavra as aparece // o nome da imagem procedure_section Page_Top as Cliente_Cab integer iPagina // pega o nmero atual da pgina get Page_Count to iPagina // envia este nmero para imagem print iPagina // envia a imagem para a sada do relatrio output_pagecheck end_procedure

Pgina 81

// imprime as linhas do relatrio procedure_section Body as Cliente_Lin // Exibe o cdigo atual no painel que mostrado // enquanto o relatrio est sendo gerado send Update_Status (string(Cliente.Codigo)) // envia os campos para as janelas correspondentes // da imagem print Cliente.Codigo print Cliente.Nome print Cliente.Telefone // envia a imagem para a sada selecionada output_pagecheck end_procedure // imprime o rodap de cada pgina procedure_section Footer as Footer // envia a imagem para a sada selecionada output_pagecheck end_procedure end_object

Salve e feche a report view. Na rvore de estrutura do programa, clique na pasta REPORT, clique em , selecione o relatrio criado e clique em OK. Compile e teste o programa. Observe que agora nosso menu tem mais uma opo, Report.
WinPrint

Para este exemplo, criaremos uma Report View a partir da anterior, pois as opes para o usurio sero as mesmas. Abra a Listagem de Clientes (BR) e no menu selecione File -> Save as e informe ClientesWp para Name, Listagem de Clientes (WP) para Description e ClientesWpRv para Object Name. Selecione as propriedades do objeto ClienteWpRv (o painel principal da report view) e altere seu Label para Listagem de Clientes (WP).

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 82

Vamos acrescentar um terceiro boto que permitir configurar a impressora do Windows. Altere a propriedade Name deste novo boto para oConfigurar e Label para C&onfigurar. No evento OnClick deste boto, acrescente o cdigo:

Pegamos o nmero que identifica o objeto da propriedade Report_Object_ID. Enviamos para este objeto a mensagem DFPrintSetup, definida na classe WinReport e que chama a caixa de configurao de impressoras do Windows. Substitua o cdigo do boto OK por send Run_Report, que ir disparar o relatrio. Seu objeto dever estar parecido com este :

Abra o cdigo de Outer-Component code e retire as imagens, pois o WinReport no utiliza isto. Nesta seo ficar apenas o pacote DFAllRpt e a abertura do arquivo Cliente. Elimine a procedure mIniciaRelatorio e modifique o cdigo do objeto oClientesBr para que fique como este :
// criamos umo objeto da classe WinReport Object oClientesWp is a WinReport Report_Main_File Cliente set Report_Title to "Imprimindo listagem de Clientes"

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Function Starting_Main_Report returns integer integer iRet iIndice forward get Starting_Main_Report to iRet get pOrdem to iIndice Report_Index by iIndice function_return iRet end_function

Pgina 83

procedure_section Page_Top // inicia as definies do cabealho DFBeginHeader DFPageTop // posiciona o alinhamento a esquerda DFHeaderPos HDR_LEFT // cria um quadro em volta do cabealho DFHeaderFrame HDR_MARGINS // seleciona a fonte DFFont "Arial" // seleciona o tamanho da fonte DFFontSize 20 // imprime a linha na posio 0,5 em negrito DFWritelnPos "Listagem de Clientes" 0.5 (FONT_BOLD) DFFont "Times New Roman" DFFontSize 14 // imprime uma linha em branco DFWriteln "" // imprime e permanece na mesma linha DFWritePos "Pg.: " 15 // imprime o contador de pginas DFWritePos "#pagecount#" 16.5 DFWriteln "" DFWritePos "Cdigo" 0.5 (FONT_ITALIC + FONT_BOLD) DFWritePos "Nome" 3 (FONT_ITALIC + FONT_BOLD) DFWritePos "Telefone" 13 (FONT_ITALIC + FONT_BOLD) // finaliza o cabealho DFEndHeader end_procedure procedure_section Body send Update_Status (string(Cliente.Codigo)) DFFont "Times New Roman" DFFontSize 14 // se foram impressas 20 linhas, salta a pgina DFLineCheck 20 DFWritePos Cliente.Codigo 0.5 DFWritePos Cliente.Nome 3 // imprime e salta para a prxima linha DFWritelnPos Cliente.Telefone 13 end_procedure procedure_section Page_Bottom DFFont "Arial" DFFontSize 10 // inicia as definies do rodap DFBeginHeader DFPageBottom // posiciona o alinhamento no centro DFHeaderPos HDR_CENTER // cria um quadro em volta do rodap DFHeaderFrame HDR_MARGINS DFWrite "Impresso em: " (FONT_ITALIC)

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


// imprime a data atual DFWriteln (RptToday(self)) (FONT_ITALIC) // finaliza o rodap DFEndHeader end_procedure end_object

Pgina 84

Como podemos ver, a sintaxe do WinReport muito parecida com a da BasicReport. O grande problema desta classe o posicionamento lateral dos objetos no formulrio, pois os comandos DFWritePos e DFWritelnPos exigem o parmetro posio, que passado na unidade de medida definida no Windows (em nosso caso, centmetros) e este tamanho varia completamente de um tipo ou tamanho de fonte para outro. A soluo seria usar alguma ferramenta de desenho que fornecesse estas medidas e inform-las ao programa, o que convenhamos, dependendo da complexidade do relatrio, vai dar um enorme trabalho. A nica vantagem desta classe sua velocidade e a possibilidade de usarmos qualquer comando VDF dentro do relatrio, o que no acontece nos prximos exemplos.
Crystal Reports

O Crystal Reports a melhor opo para a montagem de excelentes relatrios em modo Windows. Criaremos os relatrios de Vendedor, Produto e Pedidos, mas no entraremos em detalhes da sua construo no Crystal, pois no o objetivo deste curso. Iremos nos concentrar apenas na interface entre o VDF e os relatrios, que j esto criados no diretrio Data de nosso exemplo, com os nomes de Vendedores.rpt, Produtos.rpt e Pedidos.rpt. Voc pode acess-los pelo menu Utilities -> Crystal Reports Writer do IDE. Para executar o relatrio, criamos uma Report View da mesma forma que fizemos anteriormente. Abra a Report View Listagem de Clientes (WP) e salve-a com Name = VendedoresCr, Description = Listagem de Vendedores (CR) e Object Name = VendedoresCrRv. Altere a propriedade Label do objeto VendedoresCrRv para Listagem de
Vendedores (CR).

Exclua o radio group Classificao, pois no o iremos utilizar por enquanto. Exclua tambm o boto Configurar Impressora, pois o Crystal se encarrega disto. Nossa view dever estar com esta aparncia :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 85

Selecione o radio buttom oVideo e mude sua propriedade Status_Help para Envia relatrio para o vdeo. Desta forma, sempre que o usurio clicar neste boto, ter um auxlio na barra de status. Faa da mesma forma com o radio buttom oImpressora e mude o Status_Help para Envia relatrio para a impressora. Ns podemos configurar Helps para praticamente todos os objetos que recebem foco. Abra o fonte de VendedoresCrRv e modifique o cdigo para que fique como este :

E isto tudo que precisamos fazer. Salve a report view, acrescente-a ao programa principal, compile e teste a aplicao. Siga os mesmos passos e monte a report view dos Produtos. Ao salv-la, use Name = oProdutosCr, Description = Listagem de Produtos (CR) e Object Name = ProdutosCrRv. Altere tambm as referncias a Vendedores por Produtos. Salve e inclua a report view a aplicao. Compile e teste. Faa exatamente a mesma coisa para criar a report view dos Pedidos. Neste ponto, temos a primeira fase de nossa aplicao completa !

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 86

Parte II Avanando
A linguagem VDF
Vamos conhecer um pouco mais dos recursos do VDF. A medida que avanarmos, tentaremos sempre que possvel colocar em prtica os novos conhecimentos.

Tipos de dados
Em VDF podemos ter os seguintes tipos de dados: Integer : armazenam valores inteiros na faixa de 2.147.483.647 a +2.147.483.647. Number : armazenam valores numricos simples na faixa de -9999999999999,99999999 a +9999999999999,99999999. Real : armazenam nmeros reais na faixa de +/-1,0 e +/-306. Boolean : armazenam valores True (verdadeiro) ou False (falso). O valor inteiro de True 1 e de False 0. Date : armazenam datas na faixa de 01/01/0001 a 01/01/2500. String : armazenam quaisquer caracteres. Seu tamanho alocado automaticamente at 255 caracteres, mas pode ser utilizado o comando Set_Argument_Size para aumentar este limite para at 2 Gb. Handle : armazenam referncias (ou ponteiro) para um outro identificador, como um objeto. Data File : usado nos registros de arquivos. referenciada por NomeDoArquivo.NomeDoCampo.Podem ser um dos seguintes tipos : o ASCII aceita qualquer tipo de caracter; o Numeric aceita nmeros, o separador decimal e sinal negativo o Date aceita datas, armazenadas em formato Juliano; o Overlap campo lgico que redefine outros campos fsicos. No ocupa espao no arquivo, pois um campo virtual; o Text tambm conhecido como memo, usado para armazenar grandes textos ascii.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 87

o Binary armazena qualquer tipo de dados, em formato binrio. Usado normalmente para imagens e sons.

Variveis e constantes
Declarao
Antes de ser referenciada, uma varivel deve ser declarada, com a seguinte sintaxe :
{tipo} { identificador } { identificador } ... {identificador}

onde {tipo} deve ser um dos que vimos acima (integer, number, real, date, string ou handle) e {identificador} seu nome, com at 255 caracteres. Uma declarao de varivel pode ser feita em qualquer lugar do programa, mas uma boa idia declara-las no incio. Exemplos destas declaraes so :
nteger number real string date handle iNome nNome rNome sNome dNome hNome

Normalmente iniciamos o nome da varivel com uma letra minscula que a identifica. O VDF no faz distino de maisculas e minsculas, mas para facilitar a leitura de nosso cdigo, usamos a notao do camelo, mesclando maisculas com minsculas, como sNomeDaVariavelString. Podemos declarar at oito variveis numa mesma linha, desde que sejam do mesmo tipo, como :
string sNome1 sNome2 sNome3 sNome4 sNome5 sNome6 sNome7 sNome8

O tamanho de uma string alocado dinamicamente, mas voc pode defini-lo ao declarar a varivel, como
string sNomeLongo 255

Quando uma varivel declarada, est em estado nulo, ou seja, tipos integer, number e real contm 0, tipos string contm e tipos date contm 0. No confunda estado nulo com null, que no suportado pelo VDF.

Variveis locais
So declaradas dentro de um procedimento ou funo e s esto acessveis dentro daquele escopo. Uma varivel considerada local se ela for declarada dentro de um bloco Procedure ... End_Procedure ou FunctionEnd_Function. Voc pode declarar o mesmo nome de varivel em

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 88

procedimentos ou funes diferentes. Utilizar variveis locais sempre que possvel uma excelente tcnica de programao OOP e poupa muita memria. Normalmente so declaradas no incio da procedure ou function, como
procedure mFazQualquerCoisa integer iContador string sNome ... end_procedure

Variveis globais
So declaradas fora de procedimentos e funes, normalmente no incio do cdigo e esto disponveis para todo o programa. Esta prtica tem vrias desvantagens, como num programa extenso, onde o programador tem que ter muito cuidado sobre qual o contedo atual da varivel, alm de acabar com a portabilidade de procedimentos e funes, que no podero ser utilizados em outros programas a no ser que voc leve junto a declarao e inicializao das variveis globais. Esta tcnica vai totalmente contra os princpios da OOP, por isto, sempre que possvel, no use variveis globais, mas sim propriedades, que veremos em breve.

Constantes
Uma constante uma varivel somente de leitura e aps declarada, pode ser utilizada da mesma forma que as variveis (desde que no se tente alterar seu valor). So declaradas com a sintaxe
Define {identificador} for {valor}

Onde {identificador} qualquer nome vlido de varivel, mas que normalmente iniciamos com c_ e {valor} qualquer valor tipo integer, number, real, string ou date. Exemplo :
define c_PI define c_Maximo define c_Mestre for 3.14159264 for 100 for Kohl

Expresses
O VDF permite a construo de expresses que qualquer tipo (numricas, cadeia de caracteres, data, etc) nas quais cada elemento, tambm chamado operando) sofre alguma ao de um ou mais operadores. As expresses so construdas entre parnteses , e estes parnteses podem ter um ou mais nveis. Exemplo de expresses:
(((nValor + iQuant) * 3) / 2) (x / y) -nSalario

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 89

Observe que numa expresso unitria (apenas um operando), como a anterior, os parnteses no so necessrios. Os operandos podem ser : Operando Number String Date Constante Varivel Chamada de funo Expresso Os operadores podem ser : Operadores binrios aritmticos + * / Max Min Operador unitrio aritmtico Operadores relacionais (comparao) = <> < > <= >= In Matches Operadores lgicos Not And Or Operadores de caracteres + * Exemplo de expresso :
( (iHora < 7) and not( (sDia = Sbado) and (sDia = Domingo) ) )

Exemplo 325 O Curso 01/12/1959 C_PI SNome Abs(-25) (3*(199/x))

Operao Adio Subtrao Multiplicao Diviso Mximo Mnimo Sinal de menos Igual Diferente Menor que Maior que Menor ou igual a Maior ou igual a Est contido em Comparao de strings com coringas Negao E lgico OU lgico Concatenao Concatena e retira espaos em branco Concatena com um espao simples

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 90

Expresses lgicas
As expresses lgicas retornam um valor verdadeiro (true) ou falso (false). Um inteiro diferente de 0 verdadeiro e igual a zero, falso. As expresses so avaliadas da esquerda para a direita.

COmandos
Comando de atribuio
So utilizados para alterar o contedo de uma varivel. Sua sintaxe :
Move {expresso} to {varivel}

Exemplos de comando de atribuio :


Move Move Move Move Julie (iVal1 * iVal2) (iLinha > 60) (Sqr(2)) to to to to sNome iResultado iFimDePagina nRaiz

Outros comandos de atribuio :


Increment NomeDaVariavel Adiciona 1 ao valor de uma varivel inteira; Decrement NomeDaVariavel Subtrai 1 do valor de uma varivel inteira; Add {expressao} to NomeDaVariavel Adiciona o resultado da expresso

ou um valor especificado ao contedo da varivel;


Subtract {expresso} from NomeDaVariavel subtrai o resultado da

expresso ou um valor especificado do contedo de uma varivel.

Continuando um comando na prxima linha


Uma linha ou seqncia de comandos pode ser quebrada para a prxima linha colocando-se um ; no final dela. O tamanho mximo de uma linha, mesmo estando quebrada, de 1047 caracteres. Exemplo ;
If ( (iDia <> 0) and (iMes < 12) and (iAno > 1988) ; Move iQualquerCoisa to iNada

Comandos compostos
formado por uma seqncia de comandos dentro de um bloco Begin ... End. Um bloco Begin ... End pode conter outros blocos aninhados dentro dele. Exemplos :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Begin Move 158 Move 558 Move (nSalario nDespesas) End Begin Increment iLinha If (iLinha > 60) ; Begin Increment iPagina Move 0 to iLinha End End to nSalario to nDespesas to nDesespero

Pgina 91

Comandos condicionais
So comandos que testam uma condio e, dependendo do resultado, executam seqncias especficas. So os seguintes :

If
Sua sintaxe :
If {expresso lgica} {comandos True} Else {comandos False}

Exemplos :
If (iIdade > 40) ; Move Coroa to sTipo Else Move Razoavel to sTipo If (sLinguagem = Cobol or sLinguagem = Clipper); Begin Move Defasado to sTipo Move Risco de loucura to sCondicao End Else ; If (sLinguagem = VDF) ; Move Melhorado to sTipo

Case
Um exemplo deste comando auto-explicativo :
Case Begin Case sAnimal EQ Gato Move Miau to sSom Case Break Case (sAnimal = Cachorro) Move AuAu to sSom Move 3257 to iPulgas Case Break

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Case Else Move to sSom Case End

Pgina 92

O Case Else opcional.

Comandos de loop
While
Executa uma seqncia de comandos enquanto uma condio for verdadeira. Sua sintaxe :
While {expresso lgica} Comando 1 Comando 2 ... Loop

Exemplo :
While (iMes < 12) Add 1 to iMes Showln iMes Loop

Repeat
Executa uma seqncia de comandos at que uma condio seja verdadeira. Sua sintaxe :
Repeat Comando 1 Comando 2 ... Until {expresso lgica}

Por exemplo :
Repeat Add 1 to iMes Showln iMes Until (iMes < 12)

Parece que os dois comandos fazem a mesma coisa, mas existe uma grande diferena : no lao Repeat um comando executado e depois testada a condio, ou seja, o comando seria executado pelo menos uma vez independente da condio. No lao While o teste feito antes, portanto o comando s seria executado se a condio fosse verdadeira.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 93

For
Este comando usado para executar alguma coisa um nmero fixo de vezes. Esta quantidade de vezes controlada por uma varivel que incrementada a cada lao. Sua sintaxe :
For {VariavelDeControle} from {valor_inicial} to {valor_final} Comando 1 Comando 2 ... Loop

Exemplo :
For iContador from 1 to 12 Add 1 to iQuantidadeMeses Loop

Procedimentos e Funes
So rotinas, ou seja, partes do programa compostos de blocos de comandos que executam alguma funo especfica e podem ser chamadas vrias vezes durante a execuo. A principal diferena entre uma Procedure (procedimento) e uma Function (funo) que a funo retorna um valor aps a execuo. Ambas podem receber valores como parmetros bem como declarar suas prprias variveis.

Procedimentos (Procedures)
Declarando Procedures
A sintaxe bsica para a declarao de uma procedure
Procedure {nome-da-procedure} Global [{tipo 1} {param 1} ...] {declarao de variveis} {comando 1} {comando 2} ... End_Procedure

A declarao de parmetros e variveis opcional. Veja este exemplo :


Procedure mMostraCaracter Global String sMessagem Integer iPosicao iComprimento Move (Length(sMenssagem)) to iComprimento For iPosicao from 1 to (iComprimento - 1) ShowLn (Mid(sMenssagem, 1, iPosicao)) , Loop Showln (Mid(sMenssagem, 1, iPosicao))

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


End_Procedure

Pgina 94

Executando procedures
Depois da procedure ter sido declarada, voc pode execut-la com o comando Send. Sua sintaxe :
Send {nome-da procedure} {param 1} {param 2} ...

Usando nossa procedure, poderamos fazer :


Send mMostraCaracter Frase a ser mostrada Send mMostraCaracter (Mensagem = + sMensagem)

Funes (Function)
Declarando Funes
Uma funo declarada quase da mesma forma que uma procedure, com a diferena que deve ser especificado o parmetro de retorno.
Function {nome-da-funo} Global [{tipo 1} {param 1} ...] returns {tipo} {declarao de variveis} {comando 1} {comando 2} .. Function_Return {valor}. End_Function

Da mesma forma que a procedure, a declarao de parmetros opcional, sendo obrigatrio apenas o parmetro de retorno. Veja um exemplo :
Function fPotencia integer iX integer iY returns integer Integer iRetorno iContador Move 1 to iRetorno For iContador from 1 to iY Move (iX * iRetorno) to iRetorno Loop Function_Return iRetorno End_Function

Chamando uma funo


Uma funo chamada dentro de uma expresso, da seguinte forma :
({nome-da-funo}(param1,param2...))

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil Usando nosso exemplo, poderamos fazer :
Move ( fPotencia(2,8) ) to iResposta

Pgina 95

Declarao antecipada
Se voc precisar referenciar uma procedure ou funtion antes dela ter sido criada, voc deve registr-la, da seguinte forma :
Register_Procedure {nome-da-procedure} Global [{tipo 1} {param 1} ...] Register_Function {nome-da-funo} Global [{tipo 1} {param 1} ...] returns {tipo}

A sintaxe a mesma do cabealho da declarao, apenas acrescentando-se a palavra Register. Com nossos exemplos, faramos assim :
Register_Procedure mMostraCaracter Global String sMessagem Register_Function fPotencia integer iX integer iY returns integer

Observaes
Como vimos, ns podemos declarar procedures e functions globais a toda a aplicao, mas isto vai contra o estilo de programao OOP. Sempre que possvel, o correto declarar mtodos dentro das classes, para no quebrarmos o princpio do encapsulamento.

Classes
Uma classe um tipo estruturado, composto de componentes, como mtodos, propriedades e objetos.

Declarando uma classe


Uma classe declarada da seguinte maneira :
Class {nome_da_classe} is a {SuperClasse} [ Procedure Construct_Object Forward Send Construct_Object {declarao de propriedades} {objetos_privados} End_Procedure [{mtodos}] End_Class

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 96

SuperClasse a classe me, da qual a nome_da_classe derivada, e herda todas suas propriedades e mtodos. Estes mtodos podem ser aumentados, sobrescritos ou cancelados dentro da nova classe. Dentro do mtodo construtor da classe (Procedure Construct_Object) voc pode definir propriedades e objetos privados. O Visual Dataflex tem uma grande quantidade de classes pr-definidas, tambm chamados de packages (*.pkg, ), localizadas na pasta pkg de sua instalao, para implementar a funcionalidade e a interface de sua aplicao com o Windows e o banco de dados. Se houver necessidade, utilize estas classes como superclasses das que voc criar. Por exemplo, imagine que voc precise de um boto com caractersticas que no esto definidas pelo VDF. Criamos uma nova classe :
Class cOK_Botao is a Button End_Class

At aqui, nossa classe cOK_Botao funcionar da mesma forma que sua superclasse Button (que vem com o VDF), pois ela herda todas as suas caractersticas e ns no criamos ou redefinimos nenhum de seus componentes. Por questo de padronizao, sempre iniciamos o nome de uma classe com c.

Propriedades
So elementos de dados definidos na classe e que compe os atributos de uma instncia desta classe. As propriedades podem definir, por exemplo, o tamanho e localizao de um painel, as cores de um label, o arquivo de um dicionrio de dados, etc.

Declarao de propriedades
Uma propriedade declarada com a seguinte sintaxe :
Property {tipo_de_dado} {nome_da_propriedade} {valor_inicial} Tipo_de_dado um dos que so suportados pelo VDF : integer, number, real, date, string, pointer ou handle. Nome_da_propriedade segue as mesmas regras de nomes de variveis e, normalmente, comea com p e o prefixo do tipo

de dado; no final desta apostila, mostramos a conveno de nomeao normalmente usada para todos os tipos. Valor_Inicial ser atribudo propriedade no momento em que ela for declarada. As propriedades so declaradas dentro do mtodo construtor da classe. Vamos incrementar um pouco nossa classe :
Class cOK_Botao is a Button Procedure Construct_Object Forward Send Construct_Object

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Property Integer piContaClique 0 Property String psOcupado Ocupado End_Procedure End_Class

Pgina 97

Criamos duas propriedades, piContaClique e psOcupado, dentro do mtodo Construct_Object. Antes de cri-las, executamos o comando Forward Send Construct_Object, que significa executar o mtodo construtor da superclasse e herdar todas todas suas definies.

Atribuindo valores a uma propriedade


Para atribuir um valor a uma propriedade, usamos o comando Set, que tem a seguinte sintaxe :
Set {nome_da_propriedade} [of {IdObjeto}] to {valor}

Se voc estiver atribuindo um valor a uma propriedade que est definida no objeto corrente, no necessrio referenciar IdObjeto; neste caso, pode-se usar a palavra-chave Self (que significa o objeto corrente) ou no usar nada. Valor pode ser uma constante, varivel ou expresso que seja compatvel com o tipo da propriedade. Vamos colocar em prtica em nossa classe :
Class cOK_Botao is a Button Procedure Construct_Object Forward Send Construct_Object Property Integer piContaClique 0 Property String psOcupado Ocupado Set Label to OK Set Help_Id of Self to C_OKButtonHelp Set (Status_Help(Self)) to Clique em OK para iiciar Set psOcupado to Liberado End_Procedure End_Class

As propriedades Label, Help_Id e Status_Help no foram criadas em nossa classe, mas foram herdadas da superclasse Button (quando usamos Forward Send Construct_Object). Usamos trs formas diferentes de atribuir-lhes um valor, todas produzindo o mesmo resultado. No exemplo, as propriedades foram criadas dentro do mtodo construtor, mas tambm poderiam ser em qualquer outro objeto que fizesse parte da classe. O importante que elas devem estar criadas antes de serem referenciadas. Para atribuir valores a propriedades de outros objetos, voc deve passar o nome ou handle do objeto no comando Set. Por exemplo :
Set Checked_State of oCasado_cb to True Set Maximum_Position of oSpinForm to 100

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 98

Lembre-se : nunca utilize o comando move para atribuir valores a uma propriedade; move s usado para variveis.

Lendo valores da propriedade


Para ler o valor de uma propriedade, usamos o comando Get, que tem a mesma sintaxe de Set :
Get {nome_da_propriedade} [of {IdObjeto]} to nome_da_varivel

As regras so as mesmas do comando Set, ou seja, se a propriedade estiver no objeto corrente, pode-se usar Self (ou no usar nada) para nome_do_objeto e nome_da_varivel deve ser do mesmo tipo de dados da propriedade. Vamos ampliar a nossa classe :
Class cOK_Botao is a Button Procedure Construct_Object Forward Send Construct_Object Property Integer piContaClique 0 Property String psOcupado Ocupado Set Label to OK Set Help_Id of Self to C_OKButtonHelp Set (Status_Help(Self)) to Clique em OK para iiciar Set psOcupado to Liberado End_Procedure Procedure OnClick Integer iConta Get piContaClique to iConta Add 1 to iConta Set piContaClique to iConta Set Label to iConta End_Procedure End_Class

O mtodo OnClick faz parte da classe Button e executado sempre que o usurio clica no boto. Nossa classe herdou este mtodo e o aumentamos para que o boto apresente o nmero de vezes que foi clicado. Da mesma forma que o comando Set, se voc vai ler o valor de uma propriedade de outro objeto, deve referenci-lo :
Get Checked_State of oCasado_cb to bSituacao Get Maximum_Position of oSpinForm to iMaximo

Declarando propriedades antecipadamente


Se uma propriedade precisar ser referenciada antes de sua criao, podemos utilizar os comandos Register_Procedure e Register_Function, como fizemos com os mtodos. Sua sintaxe :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 99

Register_Procedure {nome_da_propriedade} Set {tipo_de_dado} Register_Function {nome_da_propriedade} Returns {tipo_de_dado} Register_Procedure utilizada quando voc usa o comando Set para uma propriedade ainda no declarada e Register_Function utilizada quando voc usa o comando Get para uma propriedade no declarada. Por exemplo : Register_Procedure Set piAltura Integer iVariavel Register_Function piLargura Returns Integer

Mtodos
uma Procedure ou Function que declarada na definio da classe e executa alguma operao especfica. No VDF temos trs tipos de mtodos :
Procedure Procedure Set Function

A Procedure executa operao no objeto, a Procedure Set configura um estado ou atributo do objeto e a Function executa uma operao e retorna um estado ou atributo do objeto. Lembre-se que os mtodos de classe no so como as procedures e functions globais que vimos anteriormente, que so declaradas e chamadas de uma forma diferente e so criadas com objetivos diferentes dos mtodos de uma classe.

Declarando mtodos Procedure


A sintaxe para declarao de Procedures :
Procedure {nome_da_procedure} [{tipo_de_dado1} {parametro1} {tipo_de_dado2} {parametro2} ...] [{declaraes_de_variveis}] {instruo 1} {instruo 2} ... End_Procedure

Se a procedure precisa receber valores, declare parmetros e indique seus tipos de dados (integer, number, date, string, etc); os parmetros so variveis que podem ser usadas normalmente dentro da procedure, onde voc pode declarar outras variveis (locais a procedure) e colocar instrues que sero executadas quando a procedure for chamada. Vamos colocar em prtica em nossa classe :
Class cOK_Botao is a Button Procedure Construct_Object Forward Send Construct_Object Property Integer piContaClique 0 Property String psOcupado Ocupado

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 100

Set Label to OK Set Help_Id of Self to C_OKButtonHelp Set (Status_Help(Self)) to Clique em OK para iiciar Set psOcupado to Liberado End_Procedure Procedure Mensagem String sMensagem Showln A mensagem Showln sMensagem End_Procedure Procedure OnClick Integer iConta Get piContaClique to iConta Add 1 to iConta Set piContaClique to iConta Set Label to iConta Send Mensagem (Voc clicou + String(iConta)) End_Procedure End_Class

A procedure Mensagem recebe um parmetro em sMensagem que exibido na tela. A procedure OnClick passa este valor atravs de uma expresso. Uma procedure executada at encontrar uma End_Procedure, ou em qualquer outro ponto, atravs do comando Procedure_Return. Por exemplo, poderamos modificar nossa classe da seguinte forma :
Class cOK_Botao is a Button Procedure Construct_Object Forward Send Construct_Object Property Integer piContaClique 0 Property String psOcupado Ocupado Set Label to OK Set Help_Id of Self to C_OKButtonHelp Set (Status_Help(Self)) to Clique em OK para iiciar Set psOcupado to Liberado End_Procedure Procedure Mensagem String sMensagem Showln A mensagem Showln sMensagem End_Procedure Procedure OnClick Integer iConta Get piContaClique to iConta Add 1 to iConta If (iConta > 100); Begin Error 400 Voc j clicou demais. Use teclado. Procedure_Return End Set piContaClique to iConta Set Label to iConta Send Mensagem (Voc clicou + String(iConta))

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


End_Procedure End_Class

Pgina 101

Declarando mtodos Procedure Set


Uma procedure set executa operaes e ento configura algum estado ou atributo do objeto. Ela semelhante a configurao de uma propriedade e sua sintaxe :
Procedure Set {nome_da_procedure} [{tipo_de_dado1} {parametro1} {tipo_de_dado2} {parametro2} ...] [{declaraes_de_variveis}] {instruo 1} {instruo 2} ... End_Procedure

Observe que sua estrutura exatamente igual ao de uma Procedure. A diferena esta na forma como ela acessada. Vamos modificar nossa classe para utiliar uma Procedure Set :
Class cOK_Botao is a Button Procedure Construct_Object Forward Send Construct_Object Property Integer Private_ piContaClique 0 Property String psOcupado Ocupado Set Label to OK Set Help_Id of Self to C_OKButtonHelp Set (Status_Help(Self)) to Clique em OK para iiciar Set psOcupado to Liberado End_Procedure Procedure Set piContaClique integer iValor Set Private_ piContaClique to iValor Set Label to iValor End_Procedure Function piContaClique Returns Integer Integer iValor Get Private_ piContaClique to iValor Function_Return iValor End_Function Procedure Mensagem String sMensagem Showln A mensagem Showln sMensagem End_Procedure Procedure OnClick Integer iConta Get piContaClique to iConta Add 1 to iConta If (iConta > 100); Begin

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Error teclado. 400 Voc j clicou

Pgina 102
demais. Use o

Procedure_Return End Set piContaClique to iConta Set Label to iConta Send Mensagem (Voc clicou + String(iConta)) End_Procedure End_Class

Neste exemplo, uma Procedure Set foi definida para cuidar da configurao de uma propriedade interna que registra a quantidade de cliques. Esta procedure tambm connfigurar a legenda do boto. Foi criada uma funo para ler o valor da propriedade interna e retorn-lo.

Declarando Functions
Uma function executa operaes como uma procedure e alm disto, retorna um estado ou atributo do objeto. O mtodo para execut-la semelhante a leitura de uma propriedade. Veja a sintaxe :
Function {nome_da_function} [{tipo_de_dado1} {parametro1} {tipo_de_dado2} {parametro2} ...] Returns {tipo_do_retorno} [{declaraes_de_variveis}] {instruo 1} {instruo 2} ... Function_Return {valor_do_retorno} End_Function

O valor retornado deve ser compatvel com o tipo_de_retorno declarado em Returns. Voc pode definir de nenhum ou quantos parmetros forem necessrios mas o tipo_de_retorno obrigatrio. A execuo da Function termina quando ela encontra o comando Function_Return.

Declarando mtodos antecipadamente


Da mesma forma que acontece co as procedure e functions globais, as locais tambm podem ser declaradas antecipadamente, se for necessrio referenci-las antes de sua implementao. Usamos os mesmos comandos Register_Procedure e Register_Function. Veja a sintaxe :
Register_Procedure {parametro1} {nome_da_procedure} [{tipo_de_dado1} {tipo_de_dado2} {parametro2} ...] Register_Procedure {parametro1} Set {nome_da_procedure} {tipo_de_dado2} ...] [{tipo_de_dado1} {parametro2}

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Register_Function {parametro1} {nome_da_function}

Pgina 103
[{tipo_de_dado1}

{tipo_de_dado2} {parametro2} ...] Returns {tipo_do_retorno}

Ou seja, a sintaxe a mesma da declarao do mtodo, apenas acrescentando-se a palavra Register_. Por exemplo :
Register_Procedure EscrevaUmaLinha Integer x Register_Procedure Set Altura Integer 0 Register_Function Tamanho Returns Integer

Eventos
Eventos so implementaes do mtodo Procedure. Cada classe do VDF executa determinados eventos durante as operaes do programa. Um evento pode ser qualquer ao que o sistema possa identificar, como uma tecla pressionada, um clique ou arrastar do mouse, a gravao de um registro, etc. Ao ocorrer algum evento, podemos intercept-lo e programar os comandos que devem ser executados. Obviamente, cada classe tem seus prprios eventos e voc deve procurar na documentao do VDF o que voc deseja. Na classe que estamos criando, ns interceptamos o evento OnClick, que disparado sempre que o usurio clicar o boto do mouse.

Executando Procedures
Uma procedure executada quando recebe uma mensagem atravz do comando Send. Sua sintaxe :
Send {nome_da_procedure} [of {IdObjeto}] {param1 ... paramN}

Se a procedure estiver na mesma classe ou objeto, IdObjeto desnecessrio. Se a procedure tiver parmetros, estes devero ser passados na mesma quantidade e ordem em que foram deinidos. Parmetros podem ser constantes, variveis ou expresses, desde que sejam do mesmo tipo declarado na procedure. Veja o exemplo :
Class cMeuEditor is an Edit Procedure AcrescentaNome String sNome Get psNome to sNamo Send Append_Text sNome End_Procedure Procedure Construct_Object Forward Send Construct_Object Property String psNome Public Roberto On_Key Key_Alt+Key_N Send AcrescentaNome End_Procedure

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


End_Class

Pgina 104

O exemplo cria uma classe MeuEditor derivada da classe Edit. Seu mtodo construtor define uma tecla de atalho (Alt+N) que executar o mtodo AcrescentaNome, que por sua vez ir ler e acrescentar uma propriedade string ao final do texto, invocando o mtodo Append_Text, herdado da classe Edit. Se voc estiver chamando um mtodo de outro objeto, obrigatrio que voc indique qual este objeto, como em :
Send Beginning_of_Line of oEditor Send Goto_Line of oEditor iNumeroLinha Send Move_Absolute of oEditor 20 5

Executando mtodos Procedure Set


A execuo de uma procedure set simples, ou seja, com apenas um parmetro, exatamente igual a atribuio de valor a uma propriedade. Veja sua sintaxe :
Set {nome_da_procedure} [of {IdObjeto}] to {valor}

Alguns exemplos :
Set Label to Nome do Cliente Set Color to clBtnFace Set Label of oFormEndereco to Endereo do Cliente

Quando uma procedure set possui mais de um parmetro, chamada de complexa e sua sintaxe semelhante. Observe os exemplos :
Set Location to 10 15 Set Size of oFormEndereco to iAltura iLargura

Alguns mtodos procedure set requerem que parmetros especiais sejam passados. Estes parmetros normalmente identificam qual propriedade o mtodo ir configurar, de uma lista ou array. Sua sintaxe :
Set {Nome_da_procedure} [of {IdObjeto}] {id_item} to {valor}

O id_item o ndice de um array e pode ser uma constante, varivel ou expresso que resulte num inteiro. A classe Data_Dictionary, por exemplo, utiliza muito esta sintaxe :
Set {nome_do_mtodo) [of {IdObjeto}] Field {id_do_campo} to {valor}

Onde id_do_campo identifica o nmero do campo no arquivo de dados. Veja estes exemplos :

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Set Field_Current_Value Field Cliente.Nome to Luiz Set Field_Mask Field Cliente.Fone to (##) ####-####

Pgina 105

Outra classe que utiliza esta sintaxe a Array, como neste exemplo :
For iContador from 1 to 9 Set Array_Value iContador to 0 Loop

Chamando mtodos Function


Chamar uma function um complemento da execuo de uma procedure set, ou seja, se utilizamos um mtodo procedure set para configurar uma propriedade, normalmente chamamos uma function para pegar este valor. Uma function chamada atravz do comando Get, com esta sintaxe :
Get {nome_da_function} [of {IdObjeto}] {param1 ... paramN} To {Varivel}

Como nas procedures, os parmetros devem ser do mesmo tipo e estar na mesma ordem em que foram declarados. Se uma function no tiver parmetros, sua sintaxe fica exatamente igual ao de uma propriedade. Alguns exemplos :
Get Can_Delete to bPodeExcluir For iContador from 1 to 10 Get String_Value of oUmArray Loop

iContador to sValor

Get Field_Current_Value of oPedido_DD Field Pedido.Data to dData

Verifique no help do Viausal Dataflex a classe Data_Dictionary e todas suas propriedades e mtodos.

Mtodos Construtores e Destrutores


Construtores e Destrutores so mtodos especializados que controlam a criao e destruio de objetos. So definidos na classe como qualquer outro mtodo, a no ser pelos nomes especficos que os identificam, Construc_Object e Destroy_Object.

Construct_Object
o nome do mtodo construtor de uma classe. Construtores so utilizados para criar propriedades, objetos aninhados e inicializar o objeto. Sua sintaxe :
Procedure Construct_Object {declarao de propriedades} {instrues} Forward Send Construct_Object {outras instrues}

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


End_Procedure

Pgina 106

A primeira ao de um constrututor normalmente chamar o construtor da superclasse para criar e inicializar os atributos que sero herdados. Isto feito com a instruo Forward Send Construct_Object. Veja o exemplo :
Class cMeuEditor is na Edit Procedure Construct_Object Forward Send Construct_Object Property String psNome Public Roberto On_Key Key_Alt+Key_X Send Delete_Data End_Procedure End_Class

Destroy_Object
o nome do mtodo destrutor da classe, que invocado sempre que o objeto est sendo destrudo. Sua sintaxe a mesma do mtodo construtor :
Procedure Destroy_Object {declarao de propriedades} {instrues} Forward Send destroy_Object {outras instrues} End_Procedure

Como o construtor, normalmente sua primeira ao chamar o mtodo destrutor da superclasse atravz da instruo Forward Send Destroy_Object, como neste exemplo :
Class cMeuEditor is na Edit Procedure Construct_Object Forward Send Construct_Object Property String psNome Public Roberto On_Key Key_Alt+Key_X Send Delete_Data End_Procedure Procedure Destroy_Object Send Info_Box Estou me destruindo Forward Send Destroy_Object End_Procedure End_Class

Nunca envie mensagens Construct_Object ou Destroy_Object, pois estes mtodos so executados automaticamente. Se quiser destruir um objeto manualmente, envie a mensagem Request_Destroy_Object.

Modificando mtodos herdados


Um mtodo herdado de uma superclasse pode ser modificado para executar alguma ao diferente na nova classe. Se no for feita nenhuma modificao, os

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 107

mtodos funcionaro como definidos na superclasse. Para se codificar um mtodo herdado deve-se defini-lo com o mesmo nome na nova classe e modificar o que for necessrio. Veja o exemplo :
Class cBotaoMensagem is a Botton Procedure MostraAlgo Send Info_Box Primeira mensagem End_Procedure Procedure OnClick Send MostraAlgo End_procedure End_Class Class cBotaoMensagem2 is a cBotaoMensagem Procedure MostraAlgo Send Info_Box Mensagem 2 End_Procedure End_Class

Neste exemplo a primeira classe cBotaoMensagem, instanciada da classe Button, define um novo mtodo MostraAlgo, que exibe Primeira mensagem quando o boto for clicado. A segunda classe cBotaoMensagem2 herda as duas procedures de cBotaoMensagem, mas redefine a MostraAlgo para exibir Segunda mensagem. Assim, para um objeto da cBotaoMensagem2 ser exibido a segunda mensagem.

Avanando mensagens
Avanar uma mensagem permite que voc aumente um mtodo herdado de forma que ele execute o que foi definido na sua superclasse e mais alguma ao definida na classe. Os trs tipos (Procedure, Procedure Set e Function) podem ser avanados. As mensagens so avanadas com o comando Forward, conforme a seguinte sintaxe :
Forward Send {nome_da_procedure} [{param1 ... paramN}] Forward Set {nome_da_procedure} {valor1...valorN} [{param1...paramN}] to

Forward Get {nome_da_funcao} [{param1...paramN}] to {varivel}

A sintaxe a mesma da execuo, apenas acrescentando o comando Forward. Outra diferena que no se referencia o objeto, pois s avanamos uma mensagem que pertence a superclasse.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 108

Objetos privados
As classes do VDF podem conter objetos aninhados de qualquer outra classe e sempre que uma instncia desta nova classe criada, os objetos aninhados tambm o so. Os objetos aninhados que fazem parte da definio da classe tornam-se atributos privados desta classe. Sempre que um objeto destrudo, seus objetos aninhados tambm o so. Objetos aninhados so declarados no mtodo construtor da classe. Veja o exemplo :
Class cArmazena is a Form Procedure Construct_Object Forward Send Construct_Object Object oArray is an Array End_Object End_Procedure Procedure AcrescentaValor Integer iItem String sValor Get Value to sValor Get Item_Count of oArray to iContador Set Array_Value of oArray iContador to sValor End_Procedure Procedure LimpaArmazeagem Send Delete_Data to oArray End_Procedure Function ArmazenaValor Integer iItem Returns String String sRetorno Get String_Value of oArray iItem to sRetorno Function_Return sRetorno End_Function End_Class

Este exemplo cria uma classe cArmazena derivada de Form, que contm um objeto Array aninhado. Trs mtodos fazem interface com oArray : AcrescentaValor busca o valor do objeto e acrescenta-o a oArray; LimpaArmazenagem limpa os dados de oArray e ArmazenaValor retorna um valor indexado de oArray.

Self
A palavra Self uma referncia ao objeto corrente. Sempre que um comando requer um handle para algum objeto, pode-se usar Self para referenciar o objeto corrente, que aquele que est executando o cdigo neste momento.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 109

Herana mltipla
Cada classe declarada herda automaticamente os componentes de sua superclasse. Mas h circunstncias em que precisamos herdar componentes de outras classes que no fazem parte da hierarquia da nossa classe. No VDF, podemos fazer isto usando o comando Import_Class_Protocol. Sua sintaxe :
Import_Class_Protocol {nome_da_classe_importada}

Isto chamado herana mltipla, conforme mostrado no exemplo abaixo :


Class cMensagem is a Mixin Procedure Define_cMensagem Property String psMensagem End_Procedure Procedure MostraMensagem String sMensagem Get psMensagem to sMensagem Send Info_Box sMensagem End_Procedure End_Class Class cBotaoMensagem is a Button Import_Class_Protocol cMensagem Procedure Construct_Object Forward Send Construct_Object Send Define_cMensagem End_Procedure Procedure OnClick Send MostraMensagem End_procedure End_Class

O exemplo declara duas classes, sendo que a primeira , cMensagem, especificamente designada para ser misturada dentro de outra classe, utilizando a herana mltipla. Estas classes so instancias da classe Mixin e suas subclasses. Nunca instancie objetos diretamente das classes Mixin, pois eles so projetados como blocos para outras classes. A segunda classe, cBotaoMensagem, baseada na classe Button, mas importa os mtodos da classe cMensagem. O VDF permite importar somente os mtodos que so definidos diretamente na classe que est sendo importada e no os da sua superclasse, o que vai um pouco contra a teoria de herana mltipla.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 110

Objetos
Objeto uma instncia de uma classe, um bloco de memria alocado dinamicamente que definido por seu tipo de classe. Para usar a funcionalidade de uma classe, voc deve instanci-la com um ou mais objetos.

Declarao de objeto
Os objetos so declarados pela seguinte sintaxe :
Object {nome_do_objeto} is a {nome_da_classe} {configurao de propriedades} {declarao de mtodos} {declaraes de objetos aninhados} End_Object

Voc pode utilizar quaisquer propriedades e mtodos declarados na classe do objeto ou em suas superclasses. Objetos tambm podem ser aninhados dentro de outros, criando uma hierarquia de objetos filho, pai, av, etc. Veja um exemplo de objeto :
Object oOk is a Button Set Location to 10 30 Set Label to OK End_Object

O exemplo declara o objeto oOK da classe Button, e configura duas das propriedades herdadas da classe. Obviamente, podemos criar novas propriedades e mtodos especficos para este objeto, alm dos herdados.

Declarando novas propriedades


O VDF suporta a criao de propriedades dentro de um objeto. Estas propriedades so exclusivas do objeto que as declarou e no so compartilhadas com outros objetos da mesma classe. Veja o exemplo :
Object oOk is a Button Set Location to 10 30 Set Label to OK Property Integer piContaClique 0 End_Object

Declarando novos mtodos


Alm de propriedades, podemos tambm criar novos mtodos num objeto. Da mesma forma que as propriedades, estes objetos s existem no objeto que os criou e no so compartilhados com objetos da mesma classe. O exemplo a seguir mostra como um mtodo da classe redefinido o objeto:
Object oOk is a Button

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Set Location to 10 30 Set Label to OK Property Integer piContaClique 0 Procedure OnClick Integer iContaClique Forward Send OnClique Get piContaClique to iContaClique Set piContaClique to (iContaClique + 1) End_Procedure End_Object

Pgina 111

Antecipando declaraes de objetos


Se um objeto precisar ser referenciado antes de sua declarao, podemos declar-lo antecipadamente, da mesma forma que fazemos procedures e function. Sua sintaxe :
Register_Object {nome_do_objeto}

Aninhamento de objetos
Como j dissemos, objetos podem ser aninhados uns dentro de outros. Imagine um sistema de faturamento: ele possui uma tela para entrada de dados de Clientes, uma para Vendedores, outra para Pedidos, etc, e cada uma destas telas contm outros objetos como botes, painis, que por sua vez contm objetos label, edit, etc. Vejamos a view de cadastro de cliente da aplicao que fizemos na primeira parte deste curso :

Esta view contm vrios objetos aninhados, conforme pode ser verificado no programa fonte criado pelo IDE (removemos algumas partes repetitivas para que a listagem no fique grande demais):
Object oClienteVw is a dbView Set Label to "Cliente" Set Size to 166 330 Set Location to 7 7 Object Cliente_DD is a Cliente_DataDictionary

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


End_Object // Cliente_DD

Pgina 112

Set Main_DD to (Cliente_DD(self)) Set Server to (Cliente_DD(self)) Object Cliente_Codigo is a dbForm Entry_Item Cliente.Codigo Set Label to "Codigo:" Set Size to 13 42 Set Location to 6 32 Set Label_Col_Offset to 2 Set Label_Justification_Mode to jMode_Right End_Object // Cliente_Codigo Object Cliente_Nome is a dbForm Entry_Item Cliente.Nome Set Label to "Nome:" Set Size to 13 246 Set Location to 21 32 Set Label_Col_Offset to 2 Set Label_Justification_Mode to jMode_Right End_Object // Cliente_Nome Object oInformacoes is a dbTabDialog Set Size to 101 316 Set Location to 44 5 Set Rotate_Mode to RM_Rotate Object TP_Localizaao is a dbTabPage Set Label to "Localizao" Object Cliente_Endereco is a dbForm Entry_Item Cliente.Endereco Set Label to "Endereo:" Set Size to 13 246 Set Location to 4 38 Set Label_Col_Offset to 2 Set Label_Justification_Mode to jMode_Right End_Object // Cliente_Endereco Object Cliente_Bairro is a dbForm Entry_Item Cliente.Bairro Set Label to "Bairro:" Set Size to 13 96 Set Location to 18 38 Set Label_Col_Offset to 2 Set Label_Justification_Mode to jMode_Right End_Object // Cliente_Bairro Object Cliente_Cep is a dbForm Entry_Item Cliente.Cep Set Label to "Cep:" Set Size to 13 60 Set Location to 34 38 Set Label_Col_Offset to 2 Set Label_Justification_Mode to jMode_Right End_Object // Cliente_Cep Object Cliente_Cidade is a dbForm Entry_Item Cliente.Cidade Set Label to "Cidade:" Set Size to 13 126 Set Location to 49 38 Set Label_Col_Offset to 2 Set Label_Justification_Mode to jMode_Right End_Object // Cliente_Cidade Object Cliente_Estado is a dbComboForm

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 113

Entry_Item Cliente.Estado Set Label to "Estado:" Set Size to 13 26 Set Location to 64 38 Set Label_Col_Offset to 2 Set Label_Justification_Mode to jMode_Right Set Code_Display_Mode to cb_code_display_code End_Object // Cliente_Estado End_Object // TP_Localizao

Object TP_Observaoes is a dbTabPage Set Label to "Observaes" Object Cliente_Observacoes is a dbEdit Entry_Item Cliente.Observacoes Set Size to 60 286 Set Location to 12 12 End_Object // Cliente_Observacoes End_Object End_Object End_Object // TP_Observa_es // oInformacoes // oClienteVw

Delegao
Os comandos Send, Set e Get enviam uma mensagem para que o objeto execute o mtodo referrenciado. Se o objeto no tiver uma definio para o mtodo, a mensagem enviada ao objeto pai. Isto repetido at que a mensagem seja resolvida ou at que a mensagem seja enviada para o objeto de nvel mais alto, que se no puder resolve-la, gerar um erro. Este processo de enviar mensagens para objetos de nvel superior chamado delegao. Veja um exemplo que utiliza a delegao :
Object oPainel is a Panel Set Size to 50 70 Procedure Encerrar Send Info_Box Fui ! Send Deactivate End_Procedure Object oBotao1 is a Button Set Location to 15 15 Set Label to Boto 1 Procedure OnClick Send Info_Box Sou o boto 1 Send Encerrar End_Procedure End_Object

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Object oBotao2 is a Button Set Location to 20 20 Set Label to Boto 2 Procedure OnClick Send Info_Box Sou o boto 2 Send Encerrar End_Procedure End_Object End_Object

Pgina 114

Quando clicados, ambos os botes enviam a mensagem Encerrar para o objeto corrente (eles mesmos). Como nenhum boto tem a definio deste mtodo, a mensagem delegada para o objeto pai, oPainel, que ir executa-la.

Delegao explcita
Voc pode delegar explicitamente uma mensagem para o objeto pai usando o comando Delegate. Este comando instrui diretamente o pai do objeto corrente a executar o mtodo, que se no for resolvido, ser delegado ao av e assim por diante. Os trs tipos de mtodos podem usar a delegao explcita (Procedure, Procedure Set e Function), com a seguinte sintaxe :
Delegate Send {nome_do_mtodo} [{param1} ... {paramN}] Delegate Set {nome_do_mtodo} [{valor1...valorN} [{param1}...{paramN}] to

Delegate Get {nome_da_funao} [{param1}...{paramN}] to {varivel}

A sintaxe de delegao a mesma da execuo, apenas acrescentando o comando Delegate. Veja o exemplo de um objeto usando delegao explcita :
Object oPainel is a Panel Set Size to 50 70 Object oBotao1 is a Button Set Location to 15 15 Set Label to Boto 1 Procedure OnClick Send Info_Box Sou o boto 1 Delegate Send Deactivate End_Procedure End_Object

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Object oBotao2 is a Button Set Location to 20 20 Set Label to Boto 2 Procedure OnClick Send Info_Box Sou o boto 2 Delegate Send Deactivate End_Procedure End_Object End_Object

Pgina 115

Neste exemplo, o comando Delegate assegura que a mensagem Deactivate ser enviada ao objeto pai oPainel. Se a mensagem no fosse delegada, ela seria enviada ao objeto corrente, no caso o boto, que desativaria apenas a si mesmo e no ao painel todo.

Enviando mensagens para objetos


Conforme j foi visto, a sintaxe para enviar uma mensagem referencia um objeto (IdObjeto), onde IdObjeto pode ser um handle ou o nome do objeto. H vrias maneiras de se referenciar um objeto.

Enviando uma mensagem para si mesmo


Quando voc no especifica o objeto, uma mensagem enviada para o objeto corrente, que se no puder resolve-la, utilizar a delegao. Nestes casos, podese utilizar a palavra Self, que indica o objeto corrente, como neste exemplo :
Class oBotao is a Button Procedure Construct_Object Forward Send Construct_Objeto Property Integer piConta End_Procedure Procedure FazAlgo Integer iConta Get piConta to iConta Add 1 to iConta Set piConta of Self to iConta End_Procedure Procedure OnClick Send FazAlgo of Self End_Procedure

Pelo fato deste tipo de mensagem ocorrer com muita frequncia, os trechos sublinhados (of Self) podem ser omitidos, pois quando um objeto no referenciado, o VDF assume o objeto corrente.

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 116

Enviando uma mensagem para outro objeto


Quando uma mensagem enviada de um objeto para outro, obrigatria a identificao do objeto receptor (IdObject), que pode ser feita de duas formas : usando-se o nome do objeto ou seu handle (ponteiro que aponta seu endereo na memria). Por exemplo :
Move oNomeDoObjeto to hoHandle Send MinhaMensagem of hoHandle

Ou
Send MinhaMensagem of oNomeDoObjeto

Voc deve estar se perguntando: por que usar a primeira forma se a segunda muito mais fcil? Vamos explicar: Isto uma questo de otimizao. Quando um nome de objeto usado diretamente dentro de uma mensagem, seu handle avaliado cada vez que a mensagem for enviada. Se, ao contrrio, movemos seu handle para uma varivel, a avaliao ser feita apenas uma vez. Dependendo da quantidade de vezes que a mensagem for utilizada, isto pode fazer uma boa diferena no desempenho do programa. Veja um exemplo :
Procedure FazAlgumaCoisa Handle hoArray Integer iConta // forma no otimizada, mais lenta Send Delete_Data of oMeuArray For iConta from 1 to 10000 Set Value of oMeuArray iConta to Teste Loop // forma otimizada, mais rpida Move oMeuArray to hoArray Send Delete_Data of hoMeuArray For iConta from 1 to 10000 Set Value of hoArray iConta to Teste Loop End_Procedure

Usando handles de objeto como parmetro


Em alguns casos, voc pode precisar expressar um handle de objeto como parmetro de uma mensagem. Neste caso, voe deve utilizar o comando Move para mover a ID do objeto para uma varivel, no expressando o nome do objeto explicitamente. Veja no exemplo a maneira correta e a errada de enviar uma mensagem de um objeto a outro :
// maneira correta Procedure Correta Handle hoBotao2

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Move oBotao2 to hoBotao2 Send NotifyButton of oBotao1 hoBotao2 End_Procedure // maneira errada, no ser compilado Procedure Errada Send NotifyButton of oBotao1 oBotao2 End_Procedure

Pgina 117

Acesso relativo ao objeto


O princpio da OOP ensina que um objeto s pode acessar outros objetos que estejam dentro de seu escopo, ou seja, ele mesmo, seus filhos e seus pais. Um objeto no precisa conhecer e nem deve enviar mensagens a objetos netos ou qualquer outro descendente que no seja filho, pois isto quebraria o princpio do encapsulamento, tornando o cdigo mais complicado de ser mantido. Se um objeto precisa se comunicar com outro que esteja fora de seu alcance, sua interface de mensagens deve ser alterada. Ou seja, se um objeto precisa se comunicar com seu neto, sua interface deve ser alterada para que a mensagem seja enviada ao filho (que est ao seu alcance), que por sua vez se encarregar de envi-la ao neto. O mtodo de acesso do Visual Dataflex permite que um objeto acesse todos os que fazem parte de seu escopo, ou seja, esto ao seu alcance. Quando um handle de objeto necessrio, por exemplo, num comando move (move oNomeObjeto to hoNomeObjeto) ou como um argumento de mensagem (send mMinhaMensagem of oNomeObjeto), o VDF executa a seguinte sequncia para encontrar o objeto e retornar sua handle : 1 Procura por objeto um filho. Se no encontrar, 2 - Procura por um objeto irmo, ou seja, filhos de seu pai. Se no encontrar, 3 Procura por objetos filhos de seu av, ou seja, seu pai e tios. Se no encontrar, 4 Continua a procura, subindo a hierarquia (avs, bisavs, etc) e seus respectivos filhos. 5 Se no encontrar nada na hierarquia toda, devolve o valor 0 (zero). Resumindo, o alcance do objeto : - ele mesmo; - seus filhos; - seus ancestrais; - irmos de seus ancestrais Analise a seguinte estrutura e tente visualizar como estes objetos podem se comunicar :
Object oArray1 is na Array End Object Object oArray2 is na Array

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


End Object Object oPainel is a Painel Object oContainer1 is a Container3d Object oBotao1 is a Button End_Object Object oBotao2 is a Button End_Object End_Object // oContainer1

Pgina 118

Object oContainer2 is a Container3d Object oBotao1 is a Button Object oArray1 is an Array End_Object End_Object // oBotao1 Object oBotao2 is a Button Object oArray3 is an Array End_Object End_Object End_Object End_Object // oContainer2

// oPainel

Lembre-se que quando voc envia mensagens para objetos, voc sempre usar o nome relativo (por exemplo, oBotao1). Se o objeto for encontrado, significa que ele est em seu escopo e seu programa est correto, caso contrrio, o objeto est fora de seu alcance e o programa precisa ser corrigido. Este mtodo de acesso relativo de objetos uma das bases do framework do VDF. Este mtodo usado para criar views, criar e conectar estruturas de dicionrios de dados e para criar objetos de entrada de dados aninhados, se conectando apropriadamente.

Nomes longos e curtos de objetos


Os objetos tem dois nomes : um longo e um curto. O curto o nome relativo, que voc utiliza para acess-lo. Este nome fica numa propriedade chamada Object_Label. Voc pode pegar esta propriedade com o comando :
Get Object_Label [of oNomeObjeto] to sVariavel

Exemplos de nomes curtos :


oMeuArray oPainelPrincipal oBotaoCancelar

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 119

O nome longo composto do nome curto e de todos os nomes curtos de seus objetos ancestrais. Este nome fica numa propriedade chamada Name. O nome longo pode ser recuperado com o comando :
Get Name [of oNomeObjeto] to sVariavel

Exemplos de nomes longos :


oPainelCliente.oMeuArray oContainer1.oPainelPrincipal oContainer1.oPainelPrincipal.oBotaoCancelar

Outras formas de acessar um objeto


Se voc observar nos exemplos e pacotes do Visual Dataflex, ver que freqentemente os objetos so acessados pela seguinte sintaxe :
(oNomeDoObjeto(Self)) ou (oNomeDoObjeto(Current_Object))

Esta forma um estilo antigo de codificao que foi substitudo pelos mtodos mais simples que mostramos acima, mas que mantida por questes de compatibilidade com programas escritos em verses anteriores do VDF. Veja as duas formas, antiga e atual :
Send mMensagem of (oMeuObjeto(Self)) Get pPropriedade of (oMeuObjeto(Self)) to sVariavel Move (oMeuObjeto(Self)) to hObjeto

Ou
Send mMensagem of oMeuObjeto Get pPropriedade of oMeuObjeto to sVariavel Move oMeuObjeto to hObjeto

Lembre-se que a forma antiga ser utilizada se voc usar uma expresso para acessar o objeto. Por exemplo, a linha abaixo no ser compilada :
Move (Label(oMeuObjeto)) to sVariavel

O correto :
Move (Label(oMeuObjeto(Self))) to sVariavel

Ou a forma atual :
Move Label of oMeuObjeto to sVariavel

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 120

Programas
Normalmente, a maior parte de um programa em VDF feita de arquivos individuais de cdigo fontes chamados packages (pacotes); eles so a base da programao modular da linguagem e so usados para criar bibliotecas que podem ser inseridas em vrios programas.

Usando pacotes
Os pacotes so includos num programa usando a sintaxe :
Use NomeDoPacote

Onde NomeDoPacote um arquivo de cdigo fonte com a extenso .PKG. Pacotes tambm podem conter outros pacotes e o compilador mantm um controle sobre eles, no permitindo que um pacote j incluso seja novamente reincludo, duplicando assim seu cdigo. Voc tambm pode usar a diretiva #Include para incluir trechos de programa. A nica diferena que neste caso, se o cdigo j tiver sido includo anteriormente em alguma parte do progrma, ele ser reincludo.

Programas simples
Um programa bsico tem a seguinte estrutura :
Use Windows.PKG {Use outros pacotes necessrios} {Declarar variveis globais} {Declarar funes e procedimentos} {Definir um objeto Panel} Start_UI

Neste exemplo, Use Windows.PKG instrui ao compilador para utilizar o pacote de definies bsicas para um programa for Windows. O programa deve definir pelo menos um objeto (no exemplo, Panel) e incluir com Use as definis de classe deste objeto. O comando Start_UI inicia a interface orientada a eventos do usurio; sem este comando, o programa criaria todas as estruturas e sairia sem executar nada. Veja o exemplo de um programa bem simples :
Use Windows.PKG Use DFPanel.PKG

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil


Object oMeuPainel is a Panel Set Label to Curso de Visual Dataflex Set Size to 40 80 End_Object Start_UI

Pgina 121

Pr-compilao
O VDF permite que voc selecione uma seo no incio do programa, que utilizada constantemente, para ser pr-compilada. Os programas que tem esta seo so compilados mais rapidamente, pois ao cdigo pr-compilado acrescentado apenas o restante do programa. Existem duas formas de fazer a pr-compilao : Pacotes pr-compilados : se o comando Use para um pacote pr-compilado for a primeira linha de um programa, o compilador utilizar o cdigo prcompilado. Usando as diretivas de compilao #HEADER ... #ENDHEADER. O cdigo que estiver entre estas diretivas deve estar previamente pr-compilado.

Veja o exemplo :
#HEADER Use Windows.PKG Use DFPanel.PKG #ENDHEADER Object oMeuPainel is a Panel Set Label to Curso de Visual Dataflex Set Size to 40 80 End_Object Start_UI

Acessando atributos de classes com expresses


Lendo propriedades usando expresses
O VDF suporta duas formas de recuperar o valor de uma propriedade de um objeto. A primeira utilizando a sintaxe que vimos anteriormente :
Get pNomeDaPropriedade of oMeuObjeto to sVariavel

A segunda forma utilizar


NomeDaPropriedade(Id_Objeto)

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 122

Onde Id_Objeto deve ser o nome ou handle do objeto e obrigatrio. Se a propriedade estiver no mesmo objeto que enviou a mensagem, Id_Objeto substitudo por Self (ou Current_Object). Veja os exemplos :
Move (Label(Self)) to sLabel Get Label to sLabel // self est implcito Get Label of Self to sLabel // self explcito

Se a mensagem estiver em outro objeto, ele deve ser referenciado usando-se os mtodos de acesso vistos anteriormente, como nos exemplos :
Move (Label(oBotaoCancelar(Self))) to sNome Get Label of oBotaoCancelar to sNome Handle hBotao Move oBotaoCancelar to hBotao Move (Label(hBotao)) to sNome

Observe nos exemplos a seguir, as vrias formas de avaliar uma propriedade com o comando If :
If (Enabled_State(oBotao(Self))) Showln Boto ativado Get Enabled_State of oBotao to bAtivo If bAtivo Showln Boto ativado

Os exemplos a seguir mostram como avaliar vrias propriedades numa mesma expresso, utilizando trs tcnicas diferentes, todas produzindo o mesmo resultado :
// ---< Primeira Forma >----If (Changed_State(oCliente_DD(Self)) and ; (Allow_Update_State(oCliente_DD(Self)) and ; (Find_Mode(oCliente_DD(Self)) = MODE_SAVING)) Send mAtualiza // -------------------------------// ---< Segunda Forma >----Handle hCliente_DD Move oCliente_DD to hCliente_DD If (Changed_State(hCliente_DD) and ; (Allow_Update_State(hCliente_DD) and ; (Find_Mode(hCliente_DD) = MODE_SAVING)) Send mAtualiza // -------------------------------// ---< Terceira Forma >----Handle hCliente_DD Integer iMudou iPodeAtualizar iModo Move oCliente_DD to hCliente_DD Get Changed_State of oCliente_DD to iMudou

Curso de Visual Dataflex __ byKohl@terra.com.br Vitria ES - Brazil

Pgina 123

Get Allow_Update_State of oCliente_DD to iPodeAtualizar Get Find_Mode of oCliente_DD to iModo If (iMudou and iPodeAtualizar and (iModo = MODE_SAVING)) Send mAtualiza // --------------------------------

Chamando funes atravs de expresses


Conforme j vimos, o VDF tem duas maneiras de chamar funes : utilizando o comando Get ou chamar a funo em uma expresso. A maneira de utilizar o mtodo com Get j foi explicada. Com expresses, a sintaxe a seguinte :
NomeDaFuncao(Id_Objeto) [, parmetro 1 ... parmero n]

Se a funo estiver no mesmo objeto, as trs formas a seguir so vlidas :


Move (Calcula_Imposto(Self, nValor)) to nImposto Get Calcula_Imposto nValor to nImposto Get Calcula_Imposto of Self nValor to nImposto

Se a funo pertence a outro objeto, podemos usar uma das trs formas :
Move (Calcula_Imposto(oVendas_DD(Self),nValor) to nImposto Move oVendas_DD to hVendasDD Get (Calcula_Imposto(hVendas_DD, nValor)) to

nImposto

Get Calcula_Imposto of Self nValor to nImposto

As funes tambm podem ser utilizadas em expresses complexas, como :


Move (Calcula_Imposto(oVendas_DD(Self), nImposto nValor) / 100) to

Move (Field_Option(oCliente_DD(Self), iCampo, iOpcao)) to bOpcao Get Field_Option of oCliente_DD iCampo iOpcao to bOpcao

Вам также может понравиться