Curso de VDF

March 27, 2018 | Author: AlmeidaRicardo | Category: Class (Computer Programming), Method (Computer Programming), Computer File, Data Compression, Data


Comments



Description

Curso de Visual Dataflex __ [email protected] – Vitória – ES - Brazil Página 1 Índice analítico PARTE I – BÁSICO ........................................................................................... 4 Introdução ...................................................................................................................4 OOP/EOP – O que é isto ?.........................................................................................4 Uma rápida explicação...........................................................................................4 Usando o Visual Dataflex ............................................................................................9 Introdução .................................................................................................................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 Dicionário de Dados ............................................................................................25 Outras funções do Database Builder.....................................................................50 IDE..........................................................................................................................53 Interface com o usuário........................................................................................54 Criando o programa .............................................................................................55 Criando listas de seleção (lookups) ......................................................................56 Criando templates (modelos) ...............................................................................61 Criando views......................................................................................................64 Não permitir a alteração de vendedor ...............................................................73 Incluindo novos itens apenas no final da lista...................................................73 Forçar a gravação do Pedido quando entrar e sair dos itens ..............................74 Criando relatórios ................................................................................................75 Basic Report ....................................................................................................76 WinPrint ..........................................................................................................81 Crystal Reports ................................................................................................84 PARTE II – AVANÇANDO ............................................................................... 86 A linguagem VDF ......................................................................................................86 Tipos de dados ...........................................................................................................86 Variáveis e constantes ...............................................................................................87 Declaração...............................................................................................................87 Variáveis locais .......................................................................................................87 Variáveis globais .....................................................................................................88 Constantes ...............................................................................................................88 Curso de Visual Dataflex __ [email protected] – Vitória – ES - Brazil Página 2 Expressões..................................................................................................................88 Expressões lógicas...................................................................................................90 COmandos..................................................................................................................90 Comando de atribuição ............................................................................................90 Continuando um comando na próxima linha ............................................................90 Comandos compostos ..............................................................................................90 Comandos condicionais ...........................................................................................91 If..........................................................................................................................91 Case.....................................................................................................................91 Comandos de loop ...................................................................................................92 While...................................................................................................................92 Repeat .................................................................................................................92 For.......................................................................................................................93 Procedimentos e Funções ..........................................................................................93 Procedimentos (Procedures) ....................................................................................93 Declarando Procedures ........................................................................................93 End_Procedure ...............................................................................................94 Executando procedures ........................................................................................94 Funções (Function) ..................................................................................................94 Declarando Funções.............................................................................................94 Chamando uma função ........................................................................................94 Declaração antecipada .............................................................................................95 Observações ............................................................................................................95 Classes........................................................................................................................95 Declarando uma classe ............................................................................................95 Propriedades............................................................................................................96 Declaração de propriedades .................................................................................96 Atribuindo valores a uma propriedade..................................................................97 Lendo valores da propriedade ..............................................................................98 Declarando propriedades antecipadamente...........................................................98 Métodos ..................................................................................................................99 Declarando métodos Procedure............................................................................99 Declarando métodos Procedure Set ....................................................................101 Declarando Functions ............................................................................................102 Declarando métodos antecipadamente ...................................................................102 Eventos..................................................................................................................103 Executando Procedures..........................................................................................103 Executando métodos Procedure Set .......................................................................104 Chamando métodos Function.................................................................................105 Métodos Construtores e Destrutores ......................................................................105 Construct_Object ...............................................................................................105 Destroy_Object..................................................................................................106 Modificando métodos herdados .............................................................................106 Avançando mensagens.......................................................................................107 Objetos privados....................................................................................................108 Self....................................................................................................................108 Curso de Visual Dataflex __ [email protected] – Vitória – ES - Brazil Página 3 Herança múltipla ...................................................................................................109 Objetos.....................................................................................................................110 Declaração de objeto .............................................................................................110 Declarando novas propriedades .............................................................................110 Declarando novos métodos ....................................................................................110 Antecipando declarações de objetos.......................................................................111 Aninhamento de objetos ........................................................................................111 Delegação..............................................................................................................113 Delegação explícita............................................................................................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 parâmetro ........................................................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é-compilação......................................................................................................121 Acessando atributos de classes com expressões......................................................121 Lendo propriedades usando expressões..................................................................121 Chamando funções através de expressões ..............................................................123 mas de qualquer forma. A EOP faz parte da OOP. ícones e quem determina o que e quando vai ser executado é o usuário e seu poderoso mouse. Cobol. Programação orientada a eventos significa trabalhar apenas com objetos e os eventos que possam afetá-los de alguma forma e aos quais ele pode responder. Um programa deste tipo tem comandos que são executados em seqüência. Mas o que significam estas siglas ? • • OOP é a abreviatura de Object Oriented Programming ou Programação orientada a objetos. Delphi. Exemplo de linguagens OOP : Visual Dataflex. a partir do desvio ou do bloco os comandos continuam sendo executados em seqüência. . Vamos esclarecer: Programação orientada a objetos significa trabalhar com classes. a menos que você especifique algum desvio ou execução de um bloco de comandos (sub-rotina) . botões. Basic. Antes de começarmos a falar sobre Visual Dataflex. Não se desespere: breve esclareceremos todos estes termos. Para começar. é de extrema importância que conheçamos pelo menos os conceitos mais básicos de OOP/EOP. propriedades.br – Vitória – ES . Este estilo de programação é bem velho e dominou a informática durante a “era do caracter”. Java. este estilo de programação se tornou inviável. herança. Com o advento da interface gráfica. um após o outro.com.Curso de Visual Dataflex __ byKohl@terra. objetos. métodos. Exemplo de linguagens EOP : Access. encapsulação. quando reinavam os sistemas Unix (sem interface gráfica). etc. você conhece a forma de programação procedural. polimorfismo. ligação. DOS e outros. Esta seqüência é definida pelo programador e o usuário não tem nenhum tipo de controle sobre o fluxo da execução.Brazil Página 4 Parte I – Básico Introdução OOP/EOP – O que é isto ? Uma rápida explicação Se você já programou em algumas linguagens mais “fósseis” tipo Clipper. EOP é a abreviatura de Event Oriented Programming ou Programação orientada a eventos. senão teria sido impossível criar as próprias interfaces). elas nasceram antes da interface gráfica. Visual Basic. mas a recíproca não é verdadeira. Novell. Fortran. Foi aí que nasceu a OOP/EOP (na verdade. não confunda OOP com EOP. pois num programa existem diversos objetos como janelas. etc. Pegue uma tigela Separe trigo.br – Vitória – ES . 4. Jogue tudo dentro da tigela Os ovos estão com casca ? Não: vá para o passo 7 Sim: tire as cascas e volte ao passo 3 Misture tudo Ponha no forno Divirta-se Se quiséssemos sofisticar muito mais a arte de comer um bolo. fermento. 6. Página 5 Um exemplo de programação procedural poderia ser uma receita de bolo : 1. 8. 9.com. 3. 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 ÉAçúcar = Falso Propriedade ÉFermento = Falso Propriedade Perecível = Verdadeiro Evento EstáEstragado Execute JoguarNoLixo FimDoEvento Procedimento JogarNoLixo Se existe Lixeira então Coloque nela Senão Jogue pela janela FimDoProcedimento FimDaClasse Classe AlimentosQueEngordam é Alimento Propriedade AumentaColesterol = Verdadeiro Propriedade CausaInfarto = Verdadeiro FimDaClasse Classe ComedorCompulsivo é Humano Função EstáGordo recebe Peso retorna Resposta Se Peso é maior que 100 kg Resposta = Verdadeiro Senão Resposta = Falso FimDaFunção Evento AoSentirFome . ovos. 7. açúcar.Brazil Vamos levar estes conceitos para o “mundo real”. 2.Curso de Visual Dataflex __ byKohl@terra. 5. poderíamos usar a OOP. com. Página 6 .br – Vitória – ES .Curso de Visual Dataflex __ [email protected] Execute ComerUmBolo FimDoEvento Procedimento ComerUmBolo Se EstáGordo(150 Kg) = Verdadeiro Saia deste Procedimento Senão Execute FazerUmBolo Execute Comer FimDoProcedimento FimDaClasse Objeto JoãozinhoPesoPesado é 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 Açúcar é Ingrediente Éaçúcar = Verdadeiro FimDoObjeto Objeto Fermento é Ingrediente ÉFermento = Verdadeiro FimDoObjeto Procedimento FazerUmBolo mova Trigo para Tigela mova Ovo para Tigela se CheirouMal dispare EstáEstragado mova Açúcar para Tigela mova Fermento para Tigela misture tudo leve ao forno FimDoProcedimento FimDoObjeto {Bolo} FimDoPrograma. da classe Alimentos. como em procedural. além de poder definir os seus próprios ou redefinir os que foram herdados. o objeto Bolo tem duas propriedades. e assim hierarquicamente até chegar a classe mais alta.br – Vitória – ES . • Classe é uma construção genérica que define propriedades. é uma instância de alguma classe e. Ela é derivada de alguma classe ancestral e poderá ser a origem de alguma classe descendente. Capacidade e Quebra. procedimentos. Em nosso exemplo. que por sua vez podem conter outros e assim sucessivamente. cada uma com seus métodos e propriedades: Tigela. que seria a “matriarca” de todas. Objeto. Vamos então esclarecer os conceitos de OOP. No exemplo. Note que o objeto Tigela foi criado dentro do objeto Bolo. na teoria OOP. da classe Humanos. você pode utilizar o objeto Bolo sem precisar saber em detalhes o que acontece dentro do método FazerOBolo. a classe Tigela tem as propriedades Cor. um objeto que contém outro é chamado objeto-pai. o evento que iniciaria todo o processo seria AoFicar15MinutosSemComer do objeto JoãozinhoPesoPesado. Isto é uma característica da OOP: um objeto pode conter outros objetos. a coisa começa a funcionar. efetivamente. derivada de Alimentos. Você define vários objetos. eventos. Toda classe é “filha” de alguma outra classe “mãe”. Um objeto contido em outro objeto é chamado objeto-filho e. dependendo do evento que ocorrer. definimos várias classes derivadas de outras. Observe que isto não acontece com as classes : uma classe nunca contém ou está contida em outra classe. Por isto um objeto muitas vezes é considerado uma “caixa-preta”. Um objeto sempre pertence a alguma classe e herda dela todas as suas propriedades e métodos. derivada de Alimento.Curso de Visual Dataflex __ byKohl@terra. da classe Vasilhame.Brazil Página 7 Observe que em OOP. funções e.com. conseqüentemente. Tigela. que por sua vez é filha de alguma outra. Em nosso exemplo. você não tem uma execução passo a passo. AlimentosQueEngordam. Propriedade (ou atributo) é uma característica de um objeto ou de uma classe. derivada de Vasilhame. Ingrediente. Você utiliza um objeto que faz determinadas coisas dependendo de algum evento ou valor de alguma propriedade. Em nosso exemplo criamos vários objetos : JoãozinhoPesoPesado. Sabor e TemGlace. métodos e funções que serão usados por objetos ou outras classes. No nosso exemplo. Encapsulação é uma característica da OOP na qual os objetos têm mecanismos internos que ficam totalmente ocultos do usuário. • • • . Bolo. mas não precisa necessariamente saber como ele faz isto. a forma que temos de interagir com o programa. para o objeto JoãozinhoPesoPesado. a classe ComedorCompulsivo tem os métodos AoSentirFome e ComerUmBolo. dispara o evento FazerUmBolo do objeto Bolo. Por exemplo. sem se preocupar com o restante do programa. o mesmo evento dispararia o método ComerCapim. que seria de outra classe. por exemplo. sem que o programador tenha que se preocupar com sua estrutura interna: ele apenas precisa saber como se comunicar com eles. 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. da classe ComedorCompulsivo. quem utiliza uma classe ou objeto precisa saber apenas o que ele faz e não como ele faz. herdou todas as propriedades de sua classe Tigela (Cor. nenhum suporte para todas estas outras características da OOP. Herança é a capacidade que uma classe ou objeto têm de herdar características e métodos de sua classe ancestral e. A EOP trabalha apenas com objetos e eventos e não tem. podemos destacar: • Objetos podem ser utilizados em vários projetos diferentes. No exemplo. • • • Os conceitos que acabamos de ver fazem parte de todas as linguagens OOP. Num desenvolvimento em equipe. através de suas propriedades ou métodos.com. já para um objeto Cavalo. o evento AoSentirFome dispara o método ComerUmBolo . você fará esta mudança apenas nele. definido dentro do objeto Bolo. o evento ComerUmBolo. Capacidade e Quebra) e alterou uma delas (Cor = Verde). pois se você necessita.Curso de Visual Dataflex __ byKohl@terra. A manutenção do código fica muito mais fácil.br – Vitória – ES . Ligação é o ato de um objeto ou classe conectar uma ação sua a outro objeto ou classe. modificá-los. o objeto MinhaTigela. No nosso exemplo. conseqüentemente. alterar alguma característica ou método do objeto. Em nosso exemplo. Entre as vantagens da OOP sobre a programação procedural. mas não das EOP.Brazil • Página 8 Método (ou ação) é alguma operação realizada pelo objeto ou pela classe. Como dissemos. se for o caso. • • . Polimorfismo é a capacidade que objetos diferentes têm de reagir da sua maneira a um mesmo evento. para cada pedido cadastrado teríamos que cadastrar todos os dados do cliente e do vendedor dentro do arquivo Pedido. Inicialmente. Antes de começar. que estão relacionados da seguinte forma : Sistema Cliente Pedido Vendedor Produto ItemPed O arquivo Sistema terá um único registro e três campos: ProxCliente. Desta forma. . etc. pelo CodCliente ele lê o arquivo Cliente e busca todas as informações necessárias. quando um registro do Pedido for lido. endereço. Criaremos uma aplicação comercial para a que a empresa Acme SA possa controlar seus clientes.com. sem duplicação de informações.br – Vitória – ES . Vendedor e Pedido. vendedores. respectivamente. pedidos. como nome. no arquivo Pedido criamos apenas um campo chamado CodCliente e relacionamos este campo com o campo Codigo do arquivo Cliente. no arquivo Pedido precisamos guardar as informações do Cliente que fez o pedido e do Vendedor que o efetuou. O relacionamento é uma técnica de banco de dados que associa um campo de determinado arquivo (chamado filho) com o campo de outro (chamado pai). o sistema será composto de alguns arquivos. baseado no conteúdo dos campos do arquivo Sistema. ProxVendedor e ProxPedido. Os arquivos Cliente. Isto seria uma tremenda redundância e causaria sérios transtornos. Vendedor e Pedido terão seus códigos gerados automaticamente pelo sistema. teríamos que entrar em todos os 15 pedidos que ele fez e repetir a alteração! Ao invés disto. do Cliente.Brazil Página 9 Usando o Visual Dataflex Introdução Nosso estudo sobre o VDF será feito através de prática e teoria. Se não usássemos relacionamentos. O arquivo Pedido está relacionado com Cliente e Vendedor e o arquivo ItemPed está relacionado com Pedido e Produto. etc. Estes campos serão usados para controlar qual o próximo código.Curso de Visual Dataflex __ byKohl@terra. Imagine que certo cliente que fez 15 pedidos resolvesse mudar seu nome : além de fazermos esta alteração no cadastro do cliente. estoque. Por exemplo. vamos apresentar os primeiros conceitos do VDF. telefone. vw). IdeSrc Pasta que contém templates e outras informações do IDE. programas (*. o VDF cria uma workspace com seis pastas. selection-lists (*.br – Vitória – ES .Brazil Página 10 Workspace É o ambiente de trabalho de uma aplicação. É mantida pelo Database Builder. Resumindo. como menus. reportviews (*. Nela ficam todos os arquivos criados pelo IDE.DD).com. mas na prática ela tem se mostrado muito eficiente e para os propósitos deste treinamento usaremos este padrão. mas só pode trabalhar com uma de cada vez.src) e vários outros. Toda aplicação em VDF deve obrigatoriamente ter uma workspace. . tool-bars. É claro que o VDF pode ter um número indefinido de workspaces. bem como suas chaves no registro do Windows.dat). Você pode. a workspace é a área de trabalho de um projeto. As ferramentas do VDF. mudar esta estrutura.inc). nomes de campos (*. como o IDE. Database Builder. fragmentos de código (*. Database Explorer e o compilador sempre estarão trabalhando numa workspace. mantidos pelo Database Builder. As pastas são as seguintes : AppSrc Pasta que contém os programas-fonte da aplicação. DDSrc Pasta onde ficam os arquivos de dicionário de dados (*. Bitmaps Pasta onde ficam as imagens de bitmap utilizadas pela aplicação.tag) e vários outros que compõe a base de dados.rv).Curso de Visual Dataflex __ byKohl@terra. como views (*. Help Pasta que contém os arquivos de help do sistema.k*). etc. Data Pasta onde ficam os arquivos de dados (*. esta pasta pode conter quaisquer outros que façam parte dos fontes do sistema.sl). Além dos arquivos criados pelo IDE. índices (*. Eles são utilizados pelo IDE e compilados com a aplicação. é claro. Por padrão. Ela define a estrutura de pastas que compõe o projeto. br – Vitória – ES . A seguinte tela será exibida : Observe que o Database Builder sempre está com alguma workspace ativa. é a “Order Entry Sample Application”.vd5. um exemplo que acompanha o VDF). Note que um sistema pode ser composto por um ou mais programas.com. Clique em Next.vd6 ou *. Vamos criar a nossa.Brazil Página 11 Programs Pasta onde ficam os programas compilados pelo VDF (*.vd7. Selecione File -> New Workspace no menu. que é exibida em sua barra de título (neste caso. Surgirá a tela de apresentação do assistente de criação de workspaces. dependendo da versão do Visual Dataflex). A próxima tela pede o nome e a descrição da workspace. . Database Builder Criando uma workspace Execute o Database Builder do menu Iniciar -> Programas -> Visual Dataflex. mas terá sempre uma única workspace.Curso de Visual Dataflex __ byKohl@terra. *. que chamaremos de “Acme”. como número do arquivo. embaixo à direita a descrição : Current filelist C:\Vdf\Projects\Acme\Data\Filelist. A partir de agora. Observe na barra de status.Curso de Visual Dataflex __ byKohl@terra. Clique em Next. bem como sua estrutura de pastas.com.cfg. nome interno. nome para usuário. A filelist (lista de arquivos) é um arquivo especial do VDF onde ficam armazenadas as informações sobre todos os arquivos da aplicação.Brazil Página 12 O nome informado em Name of new Workspace Area será gravado no registro do windows. Create an All-in-One directory : criará todos os arquivos numa única pasta. A próxima tela informa que a workspace foi criada. Utilizaremos este padrão. Programs) na pasta informada em Name of the workspace directory. Data. Help. • • • Acrescente ao caminho C:\VDF\Projects\ o nome da aplicação. A filelist é vital numa aplicação VDF . a descrição de nossa workspace aparece na barra de título do Database Builder. Acme\.br – Vitória – ES . Select all components directories manually : permite que você informe cada componente individualmente. nome externo. Bitmap. Create or select a workspace directory : permite que você informe em quais pastas ficarão os componentes da aplicação. Criando os arquivos O próximo passo será criarmos os arquivos que compõe o sistema. Nesta tela escolhemos que tipo de estrutura de pastas iremos utilizar: • Create a standard workspace : cria a estrutura padrão que falamos anteriormente (Appsrc. Clique em Next. DDSrc. IdeSrc. Clique em OK. entre outras. 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. Cada workspace tem obrigatoriamente uma filelist.Brazil Página 13 e sem ela você não tem acesso a base de dados.br – Vitória – ES . com a guia Fields ativa. . deixe o restante como está e clique em OK. que pode ser Dataflex ou ODBC_Driver File Number : Número do arquivo na filelist Rootname : Nome externo do arquivo. Surgirá a seguinte caixa de diálogo : - Type : Tipo do arquivo.Curso de Visual Dataflex __ byKohl@terra. criaremos o arquivo Sistema. Este arquivo terá apenas um registro e será usado internamente pelo sistema. que será gravado na pasta Data Digite Sistema em Rootname. Inicialmente.com. não estando disponível para o usuário. Será exibida a tela de estrutura de arquivos. portanto lembre-se sempre de incluí-la em seus back-ups. Login : para o caso de estarmos utilizando um banco de dados via ODBC. quando referenciarmos o arquivo. O VDF aceita os tipos ASCII (campos alfanuméricos com até 255 caracteres). Se você clicar em coluna verá uma lista das opções. Telefone. - - Length : Tamanho do campo Index : Índice do qual este campo faz parte.br – Vitória – ES . NUMERIC (campos numéricos inteiros e/ou decimais). User Name : nome que será exibido para o usuário. que exige que você se identifique antes de utilizá-lo. Pode ter até 15 caracteres. TEXT (campos texto ou memo) e BINARY (campos binários que podem conter imagens. Os espaços em branco são transformados em _ (sublinhado). que são transformados em maiúsculas. Ela possui as seguintes colunas: Name : Nome do campo como Código. veremos adiante). DF Name : nome que será utilizado internamente. Type : Tipo do campo. ou teclar F4 quando estiver nesta sons.com. OVERLAP (campos que redefinem um conjunto de outros campos. que informamos na tela anterior. etc. em relacionamentos). Não utilize ‘ç’ ou acentuação.Curso de Visual Dataflex __ byKohl@terra. DATE (campos de data). nos programas. Relates to : coluna de outro arquivo ao qual este arquivo está relacionado (veremos adiante. . etc). - Na guia Fields definiremos os atributos do arquivo.Brazil - Página 14 Root Name : é o nome externo do arquivo. grava as alterações feitas na estrutura e copia os dados de volta. move os dados para este arquivo.DEF (no caso.br – Vitória – ES . . Clique em diálogo: ou no menu File -> Save. tamanhos. Sistema. A próxima guia. exclusão ou modificação de campos. conforme descrevemos anteriormente : Vamos salvar nosso arquivo.DEF) contendo todas as informações do arquivo e serve apenas para documentação. é utilizada para definirmos índices. Surge uma caixa de diálogo informando que a operação foi bem sucedida (ou não). Index.Curso de Visual Dataflex __ [email protected]. para não perdermos o que já foi estruturado. O VDF cria um arquivo temporário. Clique em OK para prosseguirmos. - Vamos selecionar as duas opções e clicar em OK. como criação. Create DEF : esta opção cria um arquivo texto com a extensão .Brazil Página 15 Clique na primeira célula da coluna Name e vamos entrar com a definição do arquivo. índices ou relacionamentos. para exibir a seguinte caixa de - Force restructure operation : esta opção é utilizada sempre que alguma característica do arquivo for alterada. No arquivo Sistema ela não será utilizada. br – Vitória – ES . Esta é uma opção remanescente da época em que os HD´s tinham 5 ou 10 Mb e que espaço em disco era uma coisa crônica. quando deveria ser 18. o VDF gerará um erro e teremos que reestruturar o arquivo. No caso do arquivo Sistema. portanto vamos alterar este valor.Brazil Vamos então para a guia Parameters. o Dataflex reutilizará este espaço para um novo registro. pois ao ser ultrapassado. Note que criamos três campos. Página 16 - File Statistics o Max Records : número máximo de registros que o arquivo pode ter. Ele deve ter apenas um segmento e ser numérico. o Reuse deleted space : quando um registro é excluído. cada um com 6 caracteres de tamanho e o total foi 9. como o Windows. economizando área de HD. o Record Identity : é um índice que é usado internamente por alguns drivers de banco de dados como um identificador numérico único para o registro. É importante sempre o definirmos com uma boa folga. estabelecemos que ele terá apenas um registro.Curso de Visual Dataflex __ byKohl@terra. Este valor é utilizado internamente pelo VDF para alocar área em disco. ele permanece fisicamente no arquivo e é apenas marcado como não disponível. esta opção deverá sempre estar marcada. o Record lenght : é o comprimento do registro em bytes.com. - File Settings o Multi user reread : em ambientes multi-usuários. . Ela garante o bloqueio correto dos dados quando vários usuários estiverem acessando o arquivo simultaneamente para inclusões. modificações ou exclusões. Com esta opção configurada. Isto se deve ao fato do VDF armazenar campos numéricos de forma compactada (cada dígito ocupa meio byte). Para o driver nativo Dataflex ele não é utilizado. DAT passa a ter ponteiros e outras informações para o arquivo VLD. Compression o O VDF pode armazenar os dados dos arquivos de forma compactada. índices e outras) num arquivo especial do tipo Header (no caso. Isto é eficiente se você tiver campos tipo TEXT ou BINARY de grande comprimento e que normalmente não são totalmente preenchidos. Se o arquivo for danificado por algum crash do sistema operacional (típico do Windows!).Brazil Página 17 o Header integrity checking : arquivos Dataflex armazenam informações sobre sua estrutura (campos. Sistema. marque esta opção.VLD (variable-length data ou dados de tamanho variável) e o arquivo .Curso de Visual Dataflex __ byKohl@terra. ele deve ser periodicamente recomprimido.Se o arquivo usa este método. a medida que seus dados vão sendo alterados.br – Vitória – ES . configura o número máximo de registros para 1 e faz com que as informações do registro sejam lidas automaticamente quando a arquivo é aberto pelo programa. É exatamente o caso do arquivo Sistema. Esta opção é configurada escolhendo um dos modos abaixo:   None : nenhuma compressão será feita. Custom : é uma substituição simbólica baseada numa análise que o Database Builder faz nos dados do arquivo. Por segurança. até que ele seja recuperado. sempre selecione esta opção.HDR). do programa ou mesmo uma queda de energia e esta opção estiver configurada. Por exemplo 100 espaços em branco seriam armazenados como 100 seguido de um espaço . o VDF coloca os dados compactados num arquivo especial com a extensão . poupando espaço no HD. nenhum programa ou utilitário do VDF poderá acessar este arquivo.com. portanto. o System file : esta opção indica que o arquivo possui apenas um registro (como é o caso do arquivo Sistema). - Transaction type o Uma transação é um conjunto de operações que são feitas num banco de dados e que devem ser totalmente completadas ou       . Fast : usa uma técnica de compressão em que uma série de dois ou mais caracteres similares são armazeados como uma representação do número de repetições. Standard : é uma substituição simbólica baseada na freqüência em que o caracter é utilizado no arquivo. Quando a compressão é utilizada. Este tipo de transação é suportado pelos bancos de dados relacionais. Se o arquivo utiliza o dicionário. Por exemplo.com.br – Vitória – ES . se uma folha de pagamento começou a ser processada às 13:00 e algum problema aconteceu às 14:00. isto é tudo. você pode restaurar o sistema ao estado que estava às 13:00 e reiniciar o processo. a menos que o arquivo em questão seja utilizado de uma forma muito limitada e sem o dicionário de dados. . Options e Structures) são utilizadas para o dicionário de dados e serão vistas posteriormente. Server-Atomic : Oferecem proteção contra problemas na máquina cliente. O rollback restaura o sistema a uma condição que estava em certo momento. Se o programa (ou o Windows) trava ou cai enquanto uma transação está sendo executada. Suportado por alguns tipos de bancos de dados. Server-Logged : Oferece todos os benefícios da ServerAtomic e mais a capacidade de rollback. Transações deste tipo podem ser abortadas pelo programa e. em certos casos pelo próprio Dataflex. então você tem que usar pelo menos a opção Client-Atomic. As outras quatro guias (Fields Settings. Para o arquivo Sistema. parte dela já pode ter sido salva no banco de dados e não poderá ser desfeita . todo o processo pode ser desfeito. Methods. Nenhuma proteção é oferecida para travamentos ou outros problemas uma máquina cliente da rede. Se isto ocorrer durante uma transação. Salve suas alterações. Há três tipos disponíveis :         None : não use esta opção.Brazil Página 18 interrompidas para manter a integridade dos dados. Client-Atomic : este é o tipo padrão (e único) quando se utiliza arquivos Dataflex.Curso de Visual Dataflex __ byKohl@terra. tipos e tamanhos. - . Defina seus campos. clique em ou no menu File -> Save. Ao terminar.Brazil O próximo arquivo.2 TEXT 512 Relacionamento Clique em na barra de ferramentas ou selecione File -> New do menu e crie o arquivo Cliente como nº 2. Não informe os índices. O Dataflex permite que um arquivo tenha até 15.br – Vitória – ES . terá a seguinte estrutura : Cliente – Arquivo nº 2 Campo Código Nome Endereço Bairro CEP Cidade Estado CGC Inscricao Telefone E_Mail LimiteCredito Compras Pagamentos Observacoes Página 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. Clique na guia Index para criarmos os índices. cada um podendo ser composto por vários campos.com.Curso de Visual Dataflex __ byKohl@terra. Cliente. Key Lenght : exibe o tamanho do índice em bytes. por enquanto.2 NUMERIC 8. Levels : indica quantos campos compõe o índice. - Index Number : número do índice. Poderíamos utilizar qualquer outro campo que não permitisse duplicação (Codigo. que será composto pelo Nome e pelo Recnum. garantimos que não haverá duplicidade de índices (e conseqüentemente. Este é o campo nº 0 e é criado automaticamente pelo VDF. Este campo é numérico seqüencial e é incrementado pelo VDF para cada registro gravado.com. mesmo que não definamos qualquer índice para o arquivo. . quantos José da Silva existem?) e o VDF não aceita índices duplicados. mas apenas quando executarmos uma re-indexação no arquivo.br – Vitória – ES . Este também é o índice nº 0. Passe o Index number para 2 e vamos criar nosso segundo índice.Curso de Visual Dataflex __ [email protected] - Página 20 Index is a batch index : indica que o índice não será atualizado automaticamente nas operações do arquivo (incluir. alterar. por exemplo) mas o Recnum é mais ‘confortável’. Acrescentando o Recnum. que é exclusivo. Você pode digitar o nome e o VDF fará uma busca incremental ou clicar em ou F4 para ver a lista dos campos. Recnum. Clique na primeira célula da coluna Name para informarmos o nome do campo que comporá o índice. Por que utilizar o Recnum ? Porque o campo Nome pode ser repetido para vários clientes (por exemplo. um erro). excluir). ou seja. que é o campo Recnum. Isto pode ser útil quando temos índices de pouquíssima utilização e quisermos melhorar o desempenho. Observe que nesta lista existe um campo que não criamos. ele terá pelo menos o índice 0. Escolha o campo Codigo para nosso índice nº 1. Brazil - Página 21 A opção UC indica que o VDF não considera maiúsculas e minúsculas diferentes na classificação (case insensitive). Salve suas alterações. Seguindo os passos anteriores. com os campos CGC e Recnum.Curso de Visual Dataflex __ byKohl@terra. acrescenta um campo ao final da lista. vamos criar os demais arquivos do projeto. O botão O botão O botão insere um campo onde estiver o cursor. exclui um campo da lista.br – Vitória – ES .2 NUMERIC 6. - Siga os procedimentos anteriores e crie o índice 3. A opção Desc indica que a classificação será feita em ordem decrescente.2 NUMERIC 6 Relacionamento .com. 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 Código Descrição Unidade PrecoVenda PrecoCusto EstoqueAtual Atributos Tipo Tamanho Índice NUMERIC 6 1 ASCII 30 ASCII 2 NUMERIC 6. br – Vitória – ES . alteração ou exclusão de registros nos arquivos pai e filho serão sincronizadas.Curso de Visual Dataflex __ byKohl@terra. A caixa Attempt to synchronize required child & required parent structures deve sempre estar marcada : ela garante que as operações de inclusão. não descobri ainda por que esta opção existe. NUMERIC de 6 posições). Clique em Cliente. Isto ocorre por que a opção Lenght and type must match (tamanho e tipo devem coincidir) está selecionada e num relacionamento.. uma lista à direita mostra os nomes dos arquivos e a lista a esquerda os nomes dos campos do arquivo selecionado.Brazil Pedido – Arquivo nº 5 Campo Numero Data CodCliente CodVendedor Situação ValorTotal ProxItem Atributos Tipo Tamanho Índice NUMERIC 6 1 DATE NUMERIC 6 NUMERIC 6 ASCII 1 NUMERIC 8. mas os resultados serão imprevisíveis (aliás.com. Note que apenas dois campos do arquivo foram exibidos : Codigo e Recnum. Attach to field.Codigo Observe que o arquivo Pedido está relacionado com os arquivos Cliente e Vendedor. clique no . Para criarmos o relacionamento do Pedido com o Cliente. ou em F4 para exibir campo CodCliente e em seguida no botão a tela de relacionamentos : Na guia que está ativa. Se você selecionar Lenght and type will be copied. uma exclusão no pai afeta todos os filhos. por exemplo.2 NUMERIC 2 Página 22 Relacionamento Cliente.. todos os campos serão exibidos e você poderá selecionar qualquer um. uma .Codigo Vendedor. o VDF exige que os campos relacionados sejam do mesmo tipo e tamanho (no caso.). Normalmente. Estes arquivos não aparecem na Filelist (apesar de ocuparem um espaço nela) e são criados para cada Workspace (verifique na pasta Data de seu projeto). Neste ponto. unidades de medida. a parte “física” de nossa base de dados está pronta. o arquivo está relacionado com Pedido e Produto. ao invés dos nomes. Este trabalho seria repetitivo e consumiria recursos da Filelist (lembre-se que o número de arquivos que ela pode gerenciar é limitado : 255 até a versão 6 e 4098 a partir da versão 7). CodeMaster e CodeType. etc. Isto só tem utilidade quando você está construindo um relacionamento com um arquivo que ainda não existe e será criado posteriormente.Codigo Ao criar o arquivo ItemPed. o VDF mantém dois arquivos especiais.2 Relacionamento Pedido. Num sistema normalmente precisamos de diversos arquivos contendo apenas Código e Descrição. Além disto. situação do pedido. Página 23 Esta caixa só deve ser desmarcada em A guia Attach to file/field permite que você crie o relacionamento usando os números de arquivos e campos. para manter seus dados. Salve todos os arquivos que ainda não o foram. . Para facilitar nosso trabalho .2 UMERIC 8. Repita a operação relacionando o campo CodVendedor com o campo Codigo do arquivo Vendedor. troque o User name para Item do Pedido.Numero Produto. Mas antes.com. vamos conhecer mais um recurso interessante do VDF e que será utilizado no dicionário. especificamente para armazenarmos estas tabelas num único lugar. 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.Brazil inclusão no filho afeta o pai. criaríamos estes arquivos no Database Builder e construiríamos uma view para cada um.Curso de Visual Dataflex __ byKohl@terra. O próximo passo será o dicionário de dados. como Estados do Brasil.br – Vitória – ES . Observe que neste arquivo o índice 1 é composto de dois campos : CodPedido e Item. Clique no campo Codigo e em OK para finalizarmos o relacionamento. circunstâncias muito específicas. - Clique na coluna Code da grid. unidades de medida s situação dos pedidos e. respectivamente : .br – Vitória – ES . Digite. unidades dos produtos.Brazil Página 24 Em nosso sistema. por exemplo. Surgirá uma mensagem Save New Type Information ? para confirmar a gravação da tabela. do menu do Database Builder. Clique em Sim.SP e São Paulo Clique em ou F5 para limpar os dados e incluirmos outra tabela.Curso de Visual Dataflex __ byKohl@terra. selecione Workspace > Code-Master maintenance. Description : digite o nome do estado. criaremos tabelas para os estados brasileiros.MG e Minas Gerais . posteriormente. Para criarmos as tabelas. Siglas e nomes dos estados do Brasil.com.RJ e Rio de Janeiro . Code : digite a sigla do estado. Digite em Code e Description. Comment : qualquer comentário sobre a tabela. as usaremos para validar os dados nos respectivos campos. Será exibida a seguinte tela : - Type : nome da tabela. Digite ESTADOS.ES e Espírito Santo . Type : UNIDADE Description : Unidade dos produtos . Description : Descrição da tabela. nas colunas Code e Description da grid.. nas colunas Code e Description da grid. digite.UN e Unidade . selecione Cliente em na barra de ferramentas.C e Cancelado Feche a view Code Maintenance. digite. Ele é construído e mantido pelo Database Builder e suas informações são gravadas num arquivo com o mesmo nome e com extensão . para exibir a caixa de seleção : ou ainda em File .F e Faturado .com. situação dos pedidos.CX e Caixa . Type : SITPED Description : Situação dos pedidos Confirme a gravação e. que fica na pasta DDSrc do projeto.M e Metro .Brazil Página 25 Confirme a gravação e.L e Litro . No Database Builder. ou clique em -> Open. Vamos começar pelo arquivo Cliente. As regras do dicionário de dados envolvem vários aspectos.br – Vitória – ES . alteração e exclusão. os métodos que devem ser aplicados nas operações de inclusão. como as características de cada campo. respectivamente : . Dicionário de Dados O dicionário de dados contém todas as regras que devem ser aplicadas ao arquivo de dados.DEF.P e Pendente . respectivamente : .Curso de Visual Dataflex __ byKohl@terra.. a integridade relacional e muitos outros.KG e Kilo Clique em ou F5 para limpar os dados e incluirmos outra tabela. Capslock : transforma todos os caracteres digitados em maiúsculas.br – Vitória – ES . mostra os dados do registro. Todas as configurações que fizermos nesta guia serão executadas quando o campo selecionado for utilizado em alguma view. Methods. pesquisa um valor igual ou maior ao informado. Se o índice for composto de vários campos. o VDF pesquisa no arquivo um valor igual ao informado e. A guia Options tem doze opções. Observe sempre qual o campo que está selecionado.Brazil Página 26 Marque o arquivo Cliente e clique Open. O dicionário de dados é trabalhado nas guias Fields Settings.com. onde configuraremos as opções para cada campo. pois as opções estarão sendo configuradas para ele. Autofind GE : para campos índice. se existir. que são : Autofind : para campos índice exclusivo. À direita temos a lista de campos e à esquerda 6 sub-guias. - - .Curso de Visual Dataflex __ byKohl@terra. Options e Structures. Ative a Fields Settings. coloque o Autofind no último. mesmo que tenha sido alterado. No Put : o valor não será movido para o buffer. - - - - - - - - - As três opções do grupo Character Mode Options são válidas apenas se você está construindo um dicionário para ser usado pelo Dataflex modo caracter. Pagamentos : No Enter. No Put.Brazil - Página 27 Display only : o valor do campo será apenas exibido. Compras : No Enter. exige que um registro seja encontrado. depois que o registro foi criado. baseado no valor informado. Find required : para campos índice. Retain : o valor permanece no campo. portanto. Retain All : o valor permanece no campo. Key field. normalmente estrangeiros. o que não ocorre com a opção Display only. mesmo quando acontece alguma operação em que normalmente ele seria limpo. Em condições normais. Marque as seguintes opções para os seguintes campos : Codigo : Autofind. Key field : indica que o campo é chave primária e. Estado : Capslock. você ainda pode mover um valor para ele. seu valor não poderá ser alterado. não permitindo que você entre nele nem altere seus dados. não aceitando valores zero (para campos NUMERIC ou DATE) ou em branco (para os demais tipos). Zero Suppress : coloca brancos num campo NUMERIC se seu valor for zero. Apesar disto.com.br – Vitória – ES . ForcePut : força o conteúdo do campo ser colocado no buffer do registro. e não sai do campo até a condição ser satisfeita. . Required : um valor é obrigatório neste campo. No Enter : Não permite entrar no campo. isto só ocorre quando o valor do campo é alterado.Curso de Visual Dataflex __ byKohl@terra. Skip found : Não entra no campo se houver um registro ativo. mesmo que todos os campos da view forem limpos. Validation / Lookup. Range From .sl. o valor será aceito.Curso de Visual Dataflex __ byKohl@terra. Validation Error : o número e o texto do erro que será exibido se a validação deste campo falhar. separados por | e que serão os únicos permitidos para este campo. . Lookup Package : nome externo do objeto lookup. será exibida uma mensagem de erro e o valor não será aceito.com. Se o campo for definido como ComboBox. Lookup Package = Cliente. na lista à esquerda) : Codigo : Lookup Object = oClienteSl . To : uma faixa de valores que o campo pode aceitar. Simple Validation : uma seqüência de valores.br – Vitória – ES . Se a função retornar zero. Página 28 - Validation Method : Especifica uma função com retorno numérico que será usada para validar o valor do campo. estes valores serão mostrados como uma lista na view. - - - - - Configure os seguintes campos e opções nesta guia (certifique-se que o campo esteja selecionado.Brazil Vamos para a segunda guia. Lookup Package = Cliente. Clique em para exibir a lista de todas as funções que você definiu neste dicionário. Nome : Lookup Object = oClienteSl . se retornar qualquer outro valor.. Lookup Object : nome do objeto que exibirá uma lista de seleção (Lookup) para este campo (iremos construí-lo posteriormente)..sl. onde From é o valor inicial e To o valor final. Informaremos seus valores em Value e Description. O valor que será usado na validação é o da coluna Value. Informaremos seu nome externo em Location. Nesta guia nós configuramos tabelas que serão utilizadas para validar os valores do campo. é uma boa idéia salvar o arquivo (lembre-se do apagão!). Dynamic : Será utilizada uma das tabelas que criamos em CodeType e CodeMast Ao usar esta opção. - . Validation Table. Title : Título que será exibido na lista de seleção. Se esta opção estiver desmarcada. dentro do dicionário.br – Vitória – ES .Brazil Página 29 Vamos para a próxima guia.Curso de Visual Dataflex __ byKohl@terra. Blanks : aceita um valor em branco. mas poderemos informar um valor diferente. Static : será criada uma tabela fixa. Neste ponto. Se na view o campo tiver a opção de prompt (identificado pelo botão ). existem duas caixas de opção : Validate : o valor do campo será validado pelos valores da tabela. As tabelas podem ser : None : nenhuma tabela será usada. que não são mantidas pelo Database Builder. informamos o nome da tabela em Type Value e seus valores são automaticamente exibidos. a tabela será exibida. será exibido uma lista de seleção.com. Custom : usa tabelas externas. - - Para as tabelas Static e Dynamic. - - - .com. podemos digitar uma máscara específica. configure o campo Estado com as seguintes opções : . Numeric.Curso de Visual Dataflex __ byKohl@terra. usando-se as regras do VDF. O botão mostra as máscaras que estão cadastradas. Ao clicarmos. surgirá uma tela pedindo o nome da máscara. por exemplo : Object Name é o nome interno o VDF cria para a tabela no dicionário. alterar ou excluir máscaras do repositório. Existem 4 tipos : Currency (Dinheiro). Custom Mask : neste campo. - Mask Type : permite escolher uma máscara pré-definida. Tecle F1 e você verá as opções disponíveis.Type : Dynamic . Add to Repository : Acrescenta uma máscara ao repositório.Brazil - Página 30 Advanced : Esta opção abre um editor onde poderemos inserir qualquer codificação para validar a tabela. Edit Repository : permite acrescentar. Date e Text.br – Vitória – ES . Nesta guia.Type Value : ESTADOS A próxima guia é a Masks. Aqui nós definimos máscaras de entrada para os campos. digite CEP em Description e clique OK. - Visual Control : Exibe uma lista dos tipos de controles disponíveis. Salve o arquivo.Curso de Visual Dataflex __ byKohl@terra. o none : nenhum controle especial o dbBitmap : para campos bitmap. A próxima guia é a Appearance.com.br – Vitória – ES . BINARY serem exibidos como figuras o dbCheckbox : controle do tipo o dbComboForm : controle do tipo o dbEdit : controle caixa de texto.Brazil Página 31 Clique no campo CEP e em Custom Mask digite #####-###. Para os campos LimiteCredito. Clique em Add to Repository para gravar esta máscara. selecione a máscara Currency. o “-“ e mais três posições. Compras e Pagamentos. para campos TEXT o dbForm : controle padrão do tipo . em Mask Types. Nesta guia podemos associar um componente específico para cada campo. Esta máscara significa que teremos 5 posições numéricas não obrigatórias. como False : se a opção checkbox for selecionada.Curso de Visual Dataflex __ byKohl@terra. o VDF usa o nome do campo como título. Para o campo Estado. - Checkbox : indica se o campo é do tipo caixa de seleção. Entry Method : função ou procedimento que será executado quando o usuário entrar no campo. informe aqui qual valor será movido para o campo quando ele for marcado. 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 aplicação quando o usuário entrar neste campo. - Obs : Se não for informado Long Label nem Short Label. Defaut Value : informe o valor default que será exibido no campo quando sofrer uma entrada de dados. quando ele for colocado em alguma view. vamos selecionar o controle dbComboForm. Short Label : Este texto será usado como título do campo quando ele for utilizado em uma coluna de grid.com.Brazil Página 32 o dbGrid : grade com linhas e colunas tipo o dbSpinForm : controle do tipo Long Label : Este texto será usado como título do campo. O botão exibe os nomes dos métodos criados no dicionário. True : se a opção checkbox for selecionada. A última guia de Fields Settings é a Other.br – Vitória – ES . Short Description : apenas para documentação. escreva uma descrição do campo. de duas formas no sistema : uma será em sua própria view. arquivo Sistema. o Add to External Files Structure : se o arquivo escolhido não estiver relacionado. ele será acrescentado à lista dos arquivos externos. com todos os seus campos. Para o campo Codigo. alteração e exclusão e. onde faremos as operações de inclusão. Vamos para a guia Options.br – Vitória – ES . campo ProxCliente. O botão exibe os nomes dos métodos criados no dicionário. Methods.Curso de Visual Dataflex __ [email protected] - Página 33 Exit Method : função ou procedimento que será executado quando o usuário sair no campo. A guia Options trata . neste caso. - o Display System Files and Related Files Only : se estiver marcada. A próxima guia. exibe apenas os arquivos de sistema (aqueles que tem apenas um registro) e os que forem relacionados com este arquivo. Voltaremos a ela em breve. Salve as configurações feitas até aqui. Os dados do Cliente aparecerão. quando então diremos que ele está sendo foreign (estrangeiro) na view. como código. usaremos a opção Auto Increment. Ao clicar em será exibida a lista de arquivos e campos disponíveis. a outra forma será quando ele aparecer na view do Pedido. Vamos usar como exemplo o arquivo Cliente e o arquivo Pedido. com apenas alguns campos que permitam a localização do registro desejado. dizemos que ele está sendo o Server da view. Auto Increment : indica qual campo de qual arquivo será usado para autoincrementar este campo. uma pequena explicação. Antes. basicamente. na guia Structure (que veremos em breve). não será utilizada por enquanto. nome ou CGC e onde não será permitido que se modifique seus dados.com. sempre que for gravado um novo registro. Cliente. o Custom Error Report Mode : criaremos ou mudaremos a mensagem de erro : . por exemplo. alterados. como os campos de um arquivo se comportarão quando forem estrangeiros. o No Put : para que os dados informados não sejam movidos para o buffer e conseqüentemente. - Default Foreign Field Options : trata das opções para os demais campos do arquivo : o Display Only : os dados serão apenas exibidos. o Standard Error Report Mode : será usado o tratamento e mensagem de erro padrão do VDF. não podendo ser modificados. - Key Foreign Field Options : trata das opções para os campos que são a chave primária do arquivo (neste caso.Código) : o Auto Find : para localizar o registro.Curso de Visual Dataflex __ byKohl@terra. Cliente. - Error Handling : opções que serão usadas em caso de erro.CGC) : o Find Required : será obrigatório que um registro exista. o Find Required : será obrigatório que um registro exista. o No Put : para que os dados informados não sejam movidos para o buffer e conseqüentemente.Brazil Página 34 exatamente deste último caso. ou seja. - Indexed Foreign Field Options : trata das opções para os campos que são índices (no caso.br – Vitória – ES . quando um registro obrigatório não for encontrado.Nome e Cliente. alterados.com. Estado : Capslock. Restaure a tela de Vendedor. - Other Settings : o Protect Key Fields : os campos que forem chave primária não poderão ser alterados. Key field. em No barra de menus. Salve suas alterações e feche o arquivo Cliente. selecione Window -> Minimize all Windows. Structures. trabalharemos com todos eles abertos simultaneamente.Curso de Visual Dataflex __ byKohl@terra. Lookup Package = o Validation Table Estado : Dynamic. Cliente e @DataFlex error file para desmarcá-los. Clique . Clique nas caixas de seleção de Sistema. Vamos configurar seu dicionário da seguinte forma : Fields Settings o Options     Codigo : Auto Find. Clique em ou selecione File -> Open. Para isto. no menu. Type Value = ESTADOS.com. Na tela de seleção. Validation Error Text : o texto da mensagem de erro que será exibida. Vamos configurar todas as opções que já vimos para os demais arquivos.Brazil   Página 35 Validation Error No : o número da mensagem de erro que será exibida.br – Vitória – ES . Raramente alteraremos estas opções. No Put. Lookup Package = Vendedor.sl Nome : Lookup Object = oVendedorSl . o Mask   CEP         Vendedor. portanto vamos deixar os valores default e partirmos para a próxima guia..sl : Custom mask = CEP .. clique em para marcar todos os arquivos. o Validation / Lookup Codigo : Lookup Object = oVendedorSl . sl       .sl Descricao : Lookup Object = oProdutoSl . Key field. Restaure a janela do arquivo Pedido e configure as seguintes opções : Fields Settings o Options         Numero : Auto Find.Curso de Visual Dataflex __ byKohl@terra. ValorTotal : No Enter.ProxVendedor Salve e feche o arquivo Vendedor. Lookup Package =   Pedido. ProxItem : No Enter. o Validation / Lookup Numero : Lookup Object = oPedidoSl . Lookup Package = Produto.br – Vitória – ES . No Put Data : Required. Required. o Validation / Lookup Codigo : Lookup Object = oProdutoSl .Brazil o Appearance   Estado : dbComboForm Página 36 o Other   Codigo : Auto Increment = Sistema. Lookup Package = Produto. Key field. Restaure a janela do arquivo Produto e configure as seguintes opções : Fields Settings o Options     Codigo : Auto Find.sl o Validation Table Unidade : Dynamic. Descricao : Required.com. o Mask     PrecoVenda : Mask Type = Currency PrecoCusto : Mask Type = Currency o Appearance   Unidade : dbComboForm Salve e feche o arquivo Produto. Type Value = UNIDADES. Na execução do programa. ou seja.Brazil   Página 37 Data : Lookup Object = oPedidoSl .sl o Validation Table   Situacao : Dynamic. Isto garante a integridade da base de dados. Structures. esta informação é usada para validar os dados e atualizar corretamente todos os arquivos pais e filhos durante inclusões. quais os arquivos filhos e quais arquivos que não são pais nem filhos mas fazem parte da estrutura. se houver algum erro. Lookup Package = Pedido. Estas estruturas são de extrema importância para o IDE conectar adequadamente os objetos dicionários de dados nas views.ProxPedido Salve suas configurações e vamos dar mais um passo. VrUnitario : Required VrTotal : No Enter. Restaure a janela do arquivo ItemPed e configure as seguintes opções : Fields Settings o Options         Item : Auto Find. . como os arquivos de sistema. alterações ou exclusões de dados. quais os arquivos pais que são relacionados.ProxItem Salve suas configurações e feche todos os arquivos que porventura estiverem abertos. Durante estas operações.com. No Put Quantidade : Required. Type Value = SITPED o Mask   ValorTotal : Mask Type = Currency o Appearance   Situacao : dbComboForm o Other   Numero : Auto Increment = Sistema. a operação é cancelada.Curso de Visual Dataflex __ byKohl@terra. toda a estrutura é validada e. Nesta guia definimos a estrutura de banco de dados para o arquivo. Vamos para a última guia. Key field.br – Vitória – ES . o Mask     VrUnitario : Mask Type = Currency VrTotal : Mask Type = Currency o Other   Item : Auto Increment = Pedido. desmarque @Dataflex error file e clique em . Clique em ou em File -> Open.Brazil Página 38 Vamos abrir todos os arquivos e verificar suas estruturas. o Cascade deletes : significa que ao se excluir um registro deste arquivo.. o Validate Always : toda a estrutura de arquivos será verificada sempre que houver uma exclusão.br – Vitória – ES . o Validate Never : a estrutura nunca será verificada (a validação está desativada). Selecione o arquivo Sistema e clique na guia Structures.. clique em .com. são afetados por uma exclusão. Esta opção considera que a estrutura não será modificada durante a execução do programa. Feche este arquivo e selecione o arquivo Cliente e a guia Structures. todos os registros filhos relacionados também serão . - Delete Structure : declara todos os arquivos filhos. o Validate Once : a estrutura será verificada apenas quando o primeiro registro for carregado pela view. Isto ocorre por que este arquivo não tem relacionamentos com nenhum outro arquivo. Required Parent Files e Externally Updated files) estão vazias.Curso de Visual Dataflex __ byKohl@terra. Observe que as três listas (Required Child files. e que normalmente. no menu. com. o Clique em para incluir na estrutura todos os arquivos pais que foram diretamente relacionados. mesmo não sendo relacionado. . No caso do Cliente. a exclusão não será permitida se o registro tiver registros filhos. mesmo não estando definido na Filelist. o Validate Never : a estrutura nunca será verificada (a validação está desativada). mas que são usados pelo dicionário de dados. o Clique em para excluir um arquivo da estrutura. No caso do Cliente. o Validate Once : a estrutura será verificada apenas quando o primeiro registro for carregado pela view. para incluir na estrutura qualquer arquivo definido na o Clique em Filelist. o Clique em para incluir na estrutura qualquer arquivo. o arquivo Sistema é utilizado para gerar o Codigo. mesmo não sendo relacionado. mesmo não estando definido na Filelist. todos os pedidos deste cliente serão excluídos. Se esta opção estiver desmarcada. o Clique em para incluir na estrutura todos os arquivos filhos que foram diretamente relacionados. o Validate Always : toda a estrutura de arquivos será verificada sempre que houver uma gravação. - Externally Updated Files : declara os arquivos que não são pais nem filhos. Esta opção considera que a estrutura não será modificada durante a execução do programa. Save Structure : declara todos os arquivos pais. o Clique em para incluir na estrutura qualquer arquivo. e que normalmente são afetados por uma inclusão ou alteração no registro. o Clique em para incluir na estrutura qualquer arquivo definido na Filelist. o Clique em para excluir um arquivo da estrutura.br – Vitória – ES .Curso de Visual Dataflex __ [email protected] Página 39 excluídos. pais = nenhum. Lock on Delete : o arquivo será bloqueado apenas durante a exclusão de registros. externos = Sistema. cascade delete = false. Produto : filhos = ItemPed. externos = nenhum.Brazil Página 40 o Clique em para definir o modo como o arquivo será bloqueado nas operações do dicionário. pais = nenhum. cascade delete = false. Vendedor : filhos = Pedido. Verifique em todos os arquivos se suas estruturas estão configuradas corretamente. o Clique em para remover um arquivo da lista. Lock on New Save + Delete : o arquivo será bloqueado apenas na inclusão de um novo registro ou na exclusão. Lock on Save : o arquivo será bloqueado apenas durante as operações de gravação. como abaixo : Cliente : filhos = Pedido. cascade delete = false. mesmo não o Clique em estando definido na Filelist. para acrescentar um arquivo que esteja definido na . Lock on New Save : o arquivo será bloqueado apenas quando for gravado um novo registro.br – Vitória – ES . para acrescentar qualquer arquivo. - -           Lock on All : o arquivo será bloqueado em todas as operações de gravação e exclusão de registros. pais = nenhum.Curso de Visual Dataflex __ byKohl@terra. externos = Sistema.com. A seguinte caixa de diálogo será exibida : o Clique em Filelist. ele deve ser subtraído do estoque. cascade delete = true. pois você terá que programar apenas uma vez num único lugar e. seus ítens também deverão ser. qualquer programa que utilizar este dicionário estará levando junto todas as suas regras. Nele criamos as regras de negócio. Vendedor.Brazil - Página 41 Pedido : filhos = ItemPed. Mas a implementação no dicionário é muito mais prática. Vamos então para a guia Methods. a guia Methods. se um produto consta em algum pedido. se um pedido for excluído. através dos métodos. pais = Cliente. ele não pode ser excluído. evitando registros órfãos. mas um dicionário de dados é muito mais que isto. . quando um ítem é pedido. utilizando qualquer código que o VDF reconheça. Até aqui. dependendo de suas necessidades. no dicionário ou em ambos. para resolver questões como : um pedido só pode ser faturado se o cliente tiver crédito e houver mercadoria em estoque. a partir daí.Curso de Visual Dataflex __ byKohl@terra. - - Todas estas regras podem ser implementadas no programa. Em Methods nós efetivamente programaremos. podendo criar ou modificar qualquer ação que ocorra sobre o arquivo.DD). para cada ítem de pedido.br – Vitória – ES . Aqui nós trabalhamos diretamente com o arquivo do dicionário de dados.com. Salve e feche todos. trabalhamos somente com as características de cada campo. externos = Sistema. e vamos para a última parte do dicionário de dados. o campo ValorTotal do pedido deve ser atualizado. (. etc. Mas a operação inversa. o VDF lê o valor que está neste campo. à direita. Estes dois métodos são criados automaticamente para cada arquivo e raramente iremos modificá-los.ProxCliente. independente de termos programado algum ou não. Este evento é executado sempre que um registro for excluído. Para o arquivo Cliente. exatamente o que queremos.Brazil Abra o arquivo Cliente e clique na guia Methods. Expanda a lista Unaugmented Methods e dê um duplo clique em Delete_Main_File.com. O código apropriado será gerado no editor. Observe na lista que dois já estão em uso. vamos criar a seguinte regra : quando um cliente for excluído. cada vez que um novo cliente é gravado. Além disto. Lembre-se que o código do cliente é gerado automaticamente. iremos reaproveitá-lo para o próximo cliente. pelo incremento do campo Sistema. tudo automaticamente. podemos criar nossos próprios métodos e associá-los a alguma ação que possa ocorrer sobre os dados. como ao incluir um registro.br – Vitória – ES .Curso de Visual Dataflex __ [email protected]ódigo e salva os dois arquivos (Cliente e Sistema). separados em duas categorias : Unaugmented Methods são os que não foram utilizados e Implemented Methods são os que já estão em uso no dicionário. ou seja. Podemos utilizar o que nos interessa e acrescentar o código necessário. Página 42 O VDF tem vários eventos pré-definidos que são executados quando alguma operação acontece no arquivo. ao excluir. nós teremos que fazer manualmente. apague a linha comentada Insert code here (insira o código aqui) . se seu código for o último que foi gravado. move o valor para o campo Cliente. Observe a sintaxe de criação de uma classe (Cliente_DataDictionary) e dos dois métodos (procedures). A lista à esquerda apresenta os métodos mais comuns (não todos). ao alterar. soma mais 1. No editor. Define_Fields e Field_Defaults e seu código pode ser visualizado no editor. Todos estes eventos são sempre executados. gt .br – Vitória – ES . Digite o código conforme está na figura : Vejamos alguns detalhes da linguagem : Os comentários sempre começam com “//” e podem ser colocados em qualquer lugar do código. Além dos sinais de comparação (= .Brazil Página 43 e vamos digitar nossos comandos. lt . le e ne).Curso de Visual Dataflex __ byKohl@terra. Se você quiser aumentar a área do editor. não os sinais. mas neste caso você deve usar os operadores de comparação. mas uma linha de comando VDF tem um limite de 255 caracteres.ProxCliente – 1. Calc é mais utilizado para expressões complexas. < . - - - . - - - Uma condição pode ser tão complexa quanto necessário. podendo ter vários níveis de parênteses.com. clique com o botão direito em algum lugar sobre ele e. no menu suspenso. Uma condição não precisa estar entre parênteses. selecione Popup Editor.. > . use . >= . end. executa os comandos dentro do bloco begin . mas poderíamos usar o comando Calc Sistema. 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 seqüência de comandos. SaveRecord grava (ou regrava) um registro. If testa uma condição que está entre parênteses e se for verdadeira.ProxCliente. <= e <>) você pode usar os operadores equivalentes (eq .ProxCliente = Sistema. ge . porém neste caso nós estaríamos escrevendo mais. por uma questão de estética.. mas apenas se estivermos trabalhando com campos inteiros. também poderíamos ter utilizado Decrement Sistema. Se você quiser quebrar a linha. Utilizamos Subtract para decrementar o campo. clique com o botão direito na lista de métodos que aparecem à esquerda e. Surgirá a tela Digite o nome do nosso método. Feche o arquivo. sempre começamos os nomes de procedures com “m” e de funções com “f”. coloque a data atual como default. Abra o arquivo Pedido e vamos criar as seguintes regras.Curso de Visual Dataflex __ [email protected]. se preferir. obviamente. trocando. mLeDataAtual. além da mesma que criamos para os arquivos anteriores : Se a data do pedido não for informada.com. em Methods coloque o mesmo código. para Cliente. Observe que o VDF criou nosso método no editor com apenas uma linha de comentário. no menu suspenso. Apague esta linha e insira o seguinte código : . Por uma questão de padronização. os campos respectivos pelo do arquivo Vendedor e Sistema.ProxCliente por Sistema.br – Vitória – ES . Clique em OK. Na guia Methods. Vamos criar uma procedure para realizar esta tarefa. escolha New method.Brazil Página 44 Por enquanto é só. Mas você pode utilizar um outro modelo. salvando suas alterações e abra o de Vendedor e. sempre que ocorrer o evento de entrada no campo Data. Por padronização. sempre iniciamos os nomes de variáveis string (cadeia de caracteres) com “s”. do tipo data). criamos uma variável inteira. iMudou. poderíamos usar seu nome e o comando ficaria assim : Set Field_Default_Value field Pedido. o valor default será a data de hoje. colocamos a data corrente em dData (Sysdate4 dData) . será disparado método mLeDataAtual. do tipo inteiro) e seu valor atual (no exemplo. - Falta apenas associar este método com o evento correspondente. este método recebe duas variáveis como parâmetros : o número do campo (no exemplo.br – Vitória – ES . Field_Changed_State é uma propriedade pré-definida que recebe como parâmetro o número do campo (iCampo) e retorna 0 se o valor do campo - - não foi alterado. Agora. Dentro da procedure. date (data) com “d”.com. . boolean (lógico) com “b”. clique em Clique em mLeDataAtual e em OK. Isto significa que se nenhum valor for informado. saída ou validação de um campo. handle (referência) com “h”. Fazemos então o teste : se o valor do campo não foi alterado (iMudou = 0) e o campo está vazio (dData = 0). Observe que. Selecione o campo Data e na linha Entry para apresentar a seguinte tela : Method. iCampo. dData. ao invés de usarmos o número do campo (iCampo). configuramos a propriedade Field_Default_Value para o valor que está na variável dData.Data to dData.Brazil Vamos examinar o código : - Página 45 Ao associarmos um método com um evento de entrada. Clique na guia Field Settings e na sub-guia Other.Curso de Visual Dataflex __ byKohl@terra. Finalmente. integer (número inteiro) com “i”. real (número real) com “r”. Veja o código a seguir : Salve e feche o arquivo Pedido. Usaremos a procedure Update para somar o valor do Pedido em Cliente. se ele for o último re-aproveitaremos seu número. quando um item for excluído.Estoque. para inserir seus respectivos códigos no editor. atualize o campo Pedido. Os procedimentos definidos em Update são executados sempre que um registro é inserido ou alterado e os procedimentos em Backout são executados quando um registro é excluído ou alterado.Curso de Visual Dataflex __ [email protected] – Vitória – ES . Abra o arquivo ItemPed e vamos criar as seguintes regras : quando um registro for incluído. - .com.ValorTotal e Produto.Brazil Página 46 Clique novamente em Methods. alterado ou excluído. expanda a lista Unaugmented Methods.Compras e a procedure Backout para subtrair este valor. dê um clique duplo em Backout e em Update. antes de um item ser gravado. a operação é abortada. Vamos criar mais uma regra: . Veja o código : Vamos examiná-lo : . vamos utilizar a função Validate_Save. Para isto. verifique se há estoque disponível em Produto.Forward Get Validate_Save to iRet executa o que já está definido para ela nas classes ancestrais (Forward) e retorna o valor para iRet.br – Vitória – ES .com.Brazil Veja o código : Página 47 Observe como os métodos Update e Backout fazem operações exatamente opostas.Curso de Visual Dataflex __ byKohl@terra. . Esta função é chamada quando um registro está para ser gravado (novo ou alterado) e se ela retornar um número diferente de zero. Observe como fica sua codificação : Veja o código : Na procedure mCalculaTotal pegamos os valores atuais dos campos ItemPed. a função retorna o conteúdo de iRet. se seu valor for zero.PrecoVenda...com. traremos o valor de Produto. Se o estoque não for suficiente. clique com o botão direito. por exemplo). Para executarmos uma procedure.br – Vitória – ES .end. - - - Salve as informações e vamos criar mais algumas regras : Ao entrarmos no campo VrUnitario. Na lista de métodos à esquerda.Quantidade e ItemPed. Por fim. calcularemos o campo VrTotal. Para executarmos uma função.VrUnitario e os colocamos em variáveis locais (iQuant e nValor) usando a propriedade Field_Current_Value. usamos Send Nome_da_Procedure. mLePreco e clique em OK. Repita o procedimento e crie o método mCalculaTotal. - Vamos criar estes dois métodos. pois uma função sempre retorna algum valor. Ao sairmos dos campos VrUnitario e Quantidade. usamos a sintaxe Get Nome_da_Função to variável. enviamos uma mensagem ao usuário com Send Stop_Box e movemos um valor diferente de zero para iRet (-1. escolha New Method. Alteramos o valor de ItemPed.VrTotal para o produto dos dois valores usando Field_Changed_Value.Curso de Visual Dataflex __ [email protected] - Página 48 Se este valor não for false (Not(iRet)). executaremos um bloco de comandos begin. Poderíamos também testar If (iRet <> 0). informe o nome do primeiro. - . Quantidade) estamos trabalhando com o buffer do arquivo. pegamos o preço de venda do Produto com a propriedade File_Field_Current_Value e alteramos o valor do campo com Field_Changed_Value. Quando solicitamos uma gravação. em seguida.Quando referenciamos os nomes dos campos (come Pedido.ValorTotal ou ItemPed.VrUnitario to true . na verdade estamos manipulando um buffer que o VDF cria em memória.Quando referenciamos as propriedades dos campos. vale a pena um esclarecimento. ou seja. existem dois buffers : . .br – Vitória – ES .Numa gravação. estamos trabalhando com o buffer do dicionário de dados. Field_Changed_Value move um valor para um campo e avisa ao VDF que este valor foi alterado.Curso de Visual Dataflex __ [email protected] to nValor equivale a : set Field_Current_Value field ItemPed. o buffer do dicionário é movido para o buffer do arquivo. Quando trabalhamos com os campos de um arquivo. - Neste ponto. Na verdade. O comando set Field_Changed_Value field ItemPed. que finalmente é movido para o arquivo físico. e portanto deve ser movido do buffer para o arquivo.com. Por isto. se for.Brazil - Página 49 Em mLePreco verificamos se o valor que está no campo é zero e. Executamos mCalculaTotal para atualizarmos a exibição dos valores. existe uma grande diferença entre estas duas propriedades : Field_Current_Value pega ou move um valor para um campo. .VrUnitario to nValor set Field_Changed_State field ItemPed. o buffer é verificado e apenas as variáveis que sofreram alterações são enviadas para o arquivo que. como em Field_Current_Value. variáveis virtuais que representam os campos e não diretamente com os campos físicos que estão gravados em disco. é gravado. sempre que ocorrer um evento de saída deste campo. . Assim. clique em . Ainda com VrUnitario selecionado.Curso de Visual Dataflex __ byKohl@terra. .com..Brazil Página 50 Por fim.br – Vitória – ES .. clique em selecione mLePreco e OK para executar este método sempre que houver uma entrada neste campo. o Select workspace : muda para outra workspace. por isto associamos o evento mCalculaTotal aos dois campos. Feche e salve todos os arquivos. o Database Builder tem várias opções para a administração da base de dados.. Selecione o campo Quantidade e na linha Exit Method. isto é tudo que faremos no dicionário de dados. o Open. este método será executado. vamos associar os eventos criados aos respectivos campos. : abre um arquivo que não está na Filelist. A partir do Menu : File o New workspace : cria uma nova wokspace. na linha Exit Method. selecione mCalculaTotal e OK para executar este método sempre que houver uma saída deste campo.. Clique na guia Field Settings e na sub-guia Other. : abre um arquivo. o Open as. Outras funções do Database Builder Além de manter os arquivos e seus dicionários. o New… : cria um novo arquivo. Selecione o campo VrUnitario e na linha Entry Method. clique em para apresentar a seguinte tela : Clique em mCalculaTotal e em OK. Lembre-se que VrTotal é modificado sempre Quantidade e VrUnitario forem alterados. Por enquanto. o Check for orphans : verifica todos os arquivos selecionados e indica registros filhos que não tem registros pai. : gera os arquivos .. o Output DEF/FD. o Check for damaged headers : verifica arquivos que estão com seus .DEF.DEF e ..Curso de Visual Dataflex __ [email protected] dos arquivos selecionados. : cria um arquivo na Filelist a partir de Arquivo. o Close : fecha o arquivo atual. o Data dictionary : gera um relatório com todas as configurações do dicionário de dados dos arquivos selecionados. : abre um arquivo e todos os pais relacionados.HDR danificados.. o Check relationships : verifica os relacionamentos entre os arquivos do sistema.Brazil Página 51 o Open Related.. o Printer setup. usando-se a opção acima (muito útil no caso de um desastre!) e o . o Save : grava as alterações do arquivo atual. o Percentage filled diagram : mostra em gráfico o percentual de registros utilizados x número máximo de registros definidos. o Load DEF. o Close all : fecha todos os arquivos abertos.. Maintenance o Reindex : recria os índices dos arquivos selecionados.br – Vitória – ES . o Recent files : os últimos arquivos acessados. Report o File definition : gera um relatório com as definições físicas dos arquivos selecionados. deve sempre estar atualizado. principalmente. o Configure : configura algumas opções do dicionário e do Database Builder. : configura a impressora. . o Recents workspaces : as últimas workspaces acessadas.com. Este último.DEF serve para documentação e também para recriar o arquivo.. Lembre-se que o ..FD é utilizado na compilação. o Create empty Filelist : cria uma Filelist vazia. - . o Erase : apaga os dados de um arquivo o Delete : exclui um arquivo e o retira da Filelist. o Attributes : altera os atributos básicos dos arquivos. o Repair : recupera arquivos que estão danificados (com problemas no header). para arquivos que utilizam esta opção. o Recompress : refaz a compactação de dados. o Move entry : muda o número de arquivo na Filelist. desmarque @Dataflex error file e clique em em . Filelist o Open : abre uma Filelist. o New entry : cria uma nova entrada na Filelist. mas não cria o arquivo.br – Vitória – ES .com. o Remove entry : remove uma entrada da Filelist. Vamos verificar como estão os relacionamentos entre as tabelas do sistema. o Edit entry : modifica uma entrada na Filelist. Required parent file structure : exibe a lista dos arquivos pais necessários. Clique . o Save Filelist as : grava a Filelist com outro nome. deixando o arquivo intacto.Curso de Visual Dataflex __ byKohl@terra. No menu do Database Builder.Brazil Página 52 o Cleanup : recupera arquivos que apresentaram problemas durante a reindexação. selecione Report -> Check relationships. Será gerado um relatório com todos os arquivos e as seguintes informações : Required child file structure : exibe a lista dos arquivos filhos necessários. . Vamos conhecer o IDE e começarmos a montar a interface com o usuário. Por enquanto. Status : tem dois valores o Match : a configuração está correta. além de podermos configurar outras preferências (como um editor de texto. - Obviamente. por exemplo). isto é tudo que faremos no Database Builder. Debug e Crystal Reports. janelas (Views).. Compilador.Brazil - Página 53 Relate from . Database Explorer. etc. o NoMatch : a configuração está errada.Curso de Visual Dataflex __ byKohl@terra. Através dele podemos também acessar todas as outras ferramentas como o Database Builder.br – Vitória – ES . explicaremos e trabalharemos com todas estas opções. Relate to : exibe o relacionamento entre arquivo filho e arquivo pai. Nele criamos e mantemos a maioria dos componentes da aplicação como programas. IDE O IDE (Integrated Development Environment ou Ambiente de Desenvolvimento Integrado) é uma das principais ferramentas do VDF. relatórios (Report Views).com. todas as informações com o Status NoMatch devem ser corrigidas. listas de seleção (Selections-Lists ou Lookup-ups).. No decorrer do treinamento. . Estas views são compostas basicamente de objetos de entrada de dados (DEO. report views. Os DSO’s controlam o acesso ao banco de dados. tables. utilizando as regras dos dicionários de dados. clique em do menu Iniciar -> Programas -> Visual Dataflex. Uma aplicação basicamente é composta por um programa principal (. Os DEO’s são formados por forms.br – Vitória – ES . Data Entry Objects) e objetos servidores de dados (DSO. A seguinte tela será exibida : Interface com o usuário Depois de criarmos os arquivos e seus dicionários. Data Server Objects). barra de status. selecionam e mantém os dados do banco de dados. views . etc. editors.Brazil Página 54 Para executar o IDE. onde os usuários efetivamente trabalharão. etc. onde os usuários examinam.src). combobox. o próximo passo é criar as views de entrada de dados. contendo vários objetos como menu.Curso de Visual Dataflex __ byKohl@terra. lookups.com. pkg). Após a linha Set WorkspaceName to CURRENT$WORKSPACE. você navega de um objeto para outro usando TAB. usa alguns outros pacotes de help e tem um único comando. A seguinte tela será exibida : À esquerda.Brazil Página 55 Criando o programa Para criarmos um programa. . Vamos fazer uma primeira alteração neste código. que inicia a aplicação. com suas várias áreas e a direita temos um editor de texto. configura algumas propriedades de datas. cria um objeto da classe workspace.br – Vitória – ES . Queremos que a tecla ENTER faça a mesma função. configure a seguinte propriedade : Set kEnter_Next_State to true. A estrutura principal do programa (PROGRAM) usa um pacote pré-definido (Use Workspc. seu código aparece no editor. Start_UI. pois muitos usuários estão acostumados com este padrão. Por default do Windows.Curso de Visual Dataflex __ byKohl@terra. A medida que você clica em alguma área à esquerda.com. a partir do menu do IDE selecione File -> New program. temos a estrutura do programa. lembra-se ? Para criar uma lookup. à esquerda dos botões) e. Informe os dados conforme mostra a próxima tela e clique em : Criando listas de seleção (lookups) O próximo passo será criarmos objetos lookups. Nós já fizemos referência a estes objetos no dicionário. uma lista e três botões. . listas de seleção que o usuário utilizará para selecionar registros. Este objeto é formado basicamente de um painel. no menu suspenso escolha Data Dictionaries. Para associá-lo a um dicionário (ou DDO. clique com o botão direito em alguma área do painel (por exemplo.Curso de Visual Dataflex __ [email protected] Página 56 Clique em para salvar o programa.br – Vitória – ES . clique em New Lookup.com. Data Dictionary Object). Na caixa a seguir. dê um duplo clique em CLIENTE para exibir todos seus campos. clique com o botão direito em qualquer luga dela e selecione Grid Options. Clique em Toggle Database Selector.. Página 57 Selecione Cliente Data Dictionary e clique em .Curso de Visual Dataflex __ [email protected] – Vitória – ES ..com. Selecione os campos CODIGO e NOME e arraste-os para qualquer lugar da lista do objeto lookup.Brazil Clique em . . Para alterar qualquer característica da lista. Responda Sim à pergunta Do you wish to make this the main DDO ? (você deseja que este seja o dicionário principal) e em seguinda clique em . Página 58 Ordering : é a ordem em que os registros serão listados. - - Clique em OK para fechar este diálogo. Altere o título de Cliente. Clique com o botão direito em algum lugar do painel da lookup e selecione Properties. Com a caixa de propriedades ainda aberta. esta classificação é feita durante a execução. O & antecede a letra do label que será sublinhada. Altere a propriedade Label para Lista de Clientes. Por padrão. indicando a tecla de atalho para o botão. e altere a propriedade Name para oProcurar_bn e seu Label para &Procurar. dependendo da coluna que você selecione e se ela é um índice. mas ainda está com as legendas dos botões em inglês. Nossa lista melhorou de aspecto.com. Checkbox Column : indica se a coluna é um checkbox.br – Vitória – ES . Columns : são os campos que compõe a lista.. Clique com o botão direito sobre o botão Cancel e e altere a propriedade Name para oCancelar_bn e seu Label para &Cancelar. clique no botão Search. . Width : é a largura da coluna. vamos traduzi-las. Feche esta caixa de diálogo.Código para Código (acentuado).Curso de Visual Dataflex __ byKohl@terra. Como nosso sistema não é internacional (ainda). Label : é o título de cada coluna... sempre nomeamos objetos começando com a letra “o”. Na verdade. Altere a propriedade Name para oClienteSl.Brazil Main File : é o arquivo principal da lista.. indicando que os campos ultrapassam a largura da lista. ao qual o VDF acrescenta a extensão .com. Vamos então redimensionar nossa lookup para . Para que esta alteração funcione corretamente. O comando On_Key define uma combinação de teclas e que evento será disparado quando esta combinação for teclada. Clique em e informe os seguintes dados : Observe que File-Name é o nome externo do objeto. Observe que surgiu uma barra de rolagem. vamos acrescentar o campo CGC.Curso de Visual Dataflex __ byKohl@terra. clique em para abrir o código do objeto lookup. 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. Clique em para abrir o Database Selector. selecione o campo CGC e arraste-o para a lista. Para completar nossa selection-list. O método KeyAction produz o mesmo efeito de se dar um clique no botão.sl.Brazil Página 59 Observe que esta mudança alterou a tecla de atalho (que era “S” de Search) para “P”. Vamos salvar nossa lookup.br – Vitória – ES . com. Clique em algum lugar do painel principal e arraste a marca lateral de dimensionamento para aumentar sua largura. Diminua um pouco a largura da coluna Nome posicionando o cursor na marca de dimensionamento de colunas e arrastando para a esquerda.br – Vitória – ES . Clique na lista e aumente sua largura até surgir o campo CGC.Brazil Página 60 exibir todas as colunas sem rolagem.Curso de Visual Dataflex __ byKohl@terra. Altere as dimensões até a lookup ficar com a aparência abaixo : . Não seria mais fácil ter um modelo (template) com estas definições e criar as lookups a partir dele ? Para criar um template.Brazil Página 61 Por fim.com. Produto e Pedido. pressione CTRL e clique no segundo e terceiro para selecionar todos. crie uma nova lookup e faça as alterações necessárias nos botões e no código.br – Vitória – ES . Você pode movimentar os objetos arrastando com o mouse ou usando as setas de direção. A lookup deverá estar com a seguinte aparência : Salve as alterações e feche o objeto. você redimensiona os objetos selecionados. vamos arrastar os botões para a esquerda.Curso de Visual Dataflex __ byKohl@terra. Pressionando CTRL e usando as setas. . Criando templates (modelos) Vamos criar as lookups para Vendedor. Clique no primeiro botão. modificar o código para corrigir a tecla de atalho e posicioná-los à esquerda. Mas pense o seguinte : em todas elas teremos que alterar os labels de dois botões. br – Vitória – ES . Um template Global é salvo na pasta \VDF\Usr\global\IdeSrc e pode ser utilizado por qualquer aplicação. Surge uma caixa de dialógo com quatro guias. \VDF\Projects\Acme\IdeSrc e deve ser usado apenas por ela. informe Lista_padrão para nome do arquivo e clique em Salvar. Um template Local é salvo na pasta IdeSrc da aplicação. selecione File -> Save as template -> Global. Faça a lookup de Vendedor com esta aparência: . Clique em OK.com. Vamos então criar as demais lookups a partir de nosso template. Na caixa de dialógo Salvar. Agora basta acrescentar o dicionário de dados e os campos e salvar.Brazil Página 62 No menu. Foi criado um novo objeto baseado em nosso modelo.Curso de Visual Dataflex __ byKohl@terra. no nosso caso. Selecione a guia Lookups e nossa lista_padrão. Clique em New Component. Certifique-se que Pedido é o Main DDO. O objeto deve ficar com a seguinte aparência : Salve-a e vamos encerrar as lookups.com. . Pedido. Nesta lookup. Cliente. Salve-a e crie a de produtos.Numero. conforme o modelo : Salve-a e crie a dos pedidos.Nome.Data. o VDF trouxe para a lista todos os DDO´s relacionados.ValorTotal.Brazil Página 63 Não se esqueça de alterar o nome do objeto para oVendedorSl. por enquanto. Observe que ao selecionar o DDO Pedido.Curso de Visual Dataflex __ [email protected] e Vendedor.br – Vitória – ES . Pedido. vamos usar os seguintes campos : Pedido. Isto significa que você pode usar campos de qualquer um deles para esta lookup. Isto vai alinhar o label à direita do campo. A distância entre o label e o entryform estão grandes. Clique em New View.Brazil Página 64 Criando views Vamos para a próxima fase. Clique em Toggle Controls Pallete para exibir a paleta de controles. Altere o Name para oClienteVw e o Label para Cliente. À direita de cada campo existe um botão .br – Vitória – ES . Isto significa que existe uma lookup associada a estes campos (nós definimos isto no dicionário de dados) e o VDF automaticamente ajustou esta propriedade. criar as views para a manutenção dos dados.Curso de Visual Dataflex __ byKohl@terra. Selecione Codigo e Nome e arraste-os para o painel. Selecione o dicionário do Cliente e confirme-o como Main DDO. então vamos alterá-la. Clique em Label_Col_Offset e altere seu valor para 2. Aumente a altura do painel para permitir a inclusão de um novo objeto. A primeira será a do Cliente. Clique com o botão direito no campo Codigo e selecione Properties. Clique com o botão direito em algum lugar dele e selecione Properties. O VDF criou apenas um painel vazio.com. Clique com o botão direito na propriedade Label_Justification_Mode e selecione jMode_Right. Abra o Database Selector para incluirmos o DDO. . Faça as mesmas alterações para o campo Nome. Redimensione o painel para comportá-los. Observe que foram criados dois EntryForms com os respectivos labels. Note que o campo Estado foi criado como uma ComboBox. Cep. Right (direita). 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. O alinhamento também pode ser feito pela Alignment Pallete. Bottom (em baixo). clique em dbTabDialog e arraste-a para o painel.br – Vitória – ES . que exibe a paleta : .Curso de Visual Dataflex __ byKohl@terra. Esta propriedade define o que vai ser visualizado na ComboBox : • • • cb_code_display_description = mostra a descrição da tabela (no nosso caso é o nome do estado). Clique com o botão direito em dbTabPage1 e selecione Properties.Brazil Página 65 Clique na guia Data Containers. Altere a propriedade Name para oInformacoes e TabLabel para Localização. também definido no dicionário de dados. Você pode alinhar os objetos em vários sentidos : Left (esquerda). selecione todos com CTRL+Click. independente da visualização. Bairro. selecione Endereco. Top (em cima). No Database Selector. Note que o valor enviado para o campo será sempre o código. Top-ToBottom (de baixo para cima) e Left-To-Right (da esquerda para a direita). cb_code_display_both = mostra o código e a descrição. selecione Align -> Top-To-Bottom.com. a sigla do estado). cb_code_display_code = mostra o código da tabela (no caso. Se o espaçamento vertical entre os objetos não estiver igual. clique com o botão direito em algum deles. Altere sua propriedade Code_Display_Mode para cb_code_display_code. Curso de Visual Dataflex __ byKohl@terra. Depois de dimensionada e alinhada. Inscricao. Telefone e E_Mail e arraste-os para a TabPage Identificação. Compras e Pagamentos e arraste-os para a TabPage. Mude sua propriedade TabLabel para Identificação. No Database Selector. sua view estará parecida com esta : Crie mais uma TabPage.com. No Database Selector selecione CGC.Brazil Sua view deve estar com esta aparência : Página 66 Clique com o botão direito na guia Localização e selecione Add Tab Page. mude sua TabLabel para Valores.br – Vitória – ES . Sua tela deverá ficar como esta : . selecione LimiteCredito. Agora podemos compilar e testar nosso programa. As opções podem ser : • • • • RM_None = ao sair do último campo da TabPage o foco volta ao painel principal. dentro . Clique com o botão direito sobre este objeto. o programa será compilado e executado. Selecione Cliente (Cliente. Se o programa não estiver aberto. Clique em Compile Program. Vãos incluí-la em nosso programa. . Se não houver nenhum erro. Veja o modelo : Por fim. clique com o botão direito sobre a TabPage e altere sua propriedade Rotate_Mode para RM_Rotate.br – Vitória – ES . Salve e feche a view. Clique em e clique em OK.com. RM_Rotate_in_Ring = ao sair do último campo da última TabPage. Esta propriedade define como será a navegação entre as diversas TabPages e o painel principal. selecione Observacoes no Database Selector e arraste-o para a TabPage. Apague o valor de Label do objeto Cliente_Observações. RM_Rotate = ao sair do último campo da última TabPage. o foco volta para o primeiro campo da mesma TabPage. RM_Ring = ao sair do último campo da TabPage. e em Center -> Vertically para centralizá-lo na TabPage.vw) da CLIENT AREA. selecione Center -> Horizontally. mude sua TabLabel para Observações. o foco volta para o primeiro campo da primeira TabPage.Brazil Página 67 Adcione mais uma TabPage. Clique na pasta VIEWS. o foco volta para o primeiro campo do painel principal. clique em File -> Open Program e selecione-o da lista.Curso de Visual Dataflex __ byKohl@terra. Clique em View -> Cliente para trabalharmos com a view que acabamos de criar. etc. barra de ferramentas. com menu.Curso de Visual Dataflex __ [email protected] Página 68 Observe que o VDF criou uma aplicação completa. É claro que todas estas opções podem ser modificadas. mas por ora vamos aceitar o padrão. barra de status.com. .br – Vitória – ES . . como foi definido no dicionário de dados.Brazil Página 69 Clique em Funções no menu e observe todas as opções de manipulação dos registros. Exiba a prompt-list e teste seus recursos. Todas estas opções também podem ser acessadas pela barra de ferramentas. Algumas estão sombreadas. Exluir. Observe também que o VDF já incorporou todas as mensagens de confirmação para inclusão. Se seu menu não estiver em português.Curso de Visual Dataflex __ byKohl@terra. pois não se aplicam ao contexto (por exemplo.br – Vitória – ES . Note que o código é gerado automaticamente. não se preocupe. que é filho de ItemPed) não foram incluídos na view. pois não há nenhum registro para exclusão). a ordem de exibição é alterada (se a nova coluna for um índice). No dicionário de dados nós definimos que a estrutura deve ser verificada antes de uma exclusão. ItemPed e Produto. Note que todas as opções tem uma tecla de atalho. Note que quando você muda de coluna. e você não consegue alterá-lo (e nem deveria). Tente excluir um registro e você obterá a seguinte mensagem de erro: Isto ocorreu por que os arquivos filhos do Cliente (Pedido. o que agiliza a digitação para quem não é muito fã do mouse. alteração e exclusão de registros. mais adiante ensinaremos como traduzí-lo. Cadastre e altere os dados de alguns Clientes e observe o comportamento da aplicação.com. Curso de Visual Dataflex __ [email protected] – Vitória – ES - Brazil Página 70 Para corrigir este problema, feche a aplicação, 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 dicionários relacionados também são trazidos. Clique em , compile a aplicação e teste uma exclusão. Tudo deve estar funcionando agora. Feche a aplicação e vamos criar a view de vendedores. Siga o exemplo do cliente e monte uma view como esta : Observe que para o vendedor não criamos nenhuma TabPage, colocando todos os dados no painel principal. Lembre-se de incluir os dicionários de dados relacionados, para evitar problemas de validação. Salve e feche a view e inclua-a no programa principal. Compile o programa e teste a aplicação. 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 aplicação. Curso de Visual Dataflex __ [email protected] – Vitória – ES - Brazil Página 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 DDO´s, menos o do Sistema. Verifique se o Main DDO é Pedido. Arraste os campos Numero, Data, Situação 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 descrição da situação, não seu código. Arraste os campos Nome e Codigo do Cliente para a view. Por que não trazer o campo CodCliente do Pedido ? Por que o VDF se encarregará de fazer a ligação necessária, graças ao relacionamento que definimos no dicionário de dados. Faça 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 navegação de um objeto para outro na mesma ordem em que eles são incluídos na View. Isto nem sempre é o correto. Para corrigir esta situação, selecione, a partir do menu, Tools -> Tab-Order Definition. Será exibido um painel com todos os objetos e sua ordem de navegação atual. Para alterar a posição de um objeto, selecione-o e use as setas para movimentá-lo. Modifique, se necessário, para que fiquem da seguinte forma : Curso de Visual Dataflex __ [email protected] – Vitória – ES - Brazil Clique em OK para fechar o painel. Página 72 Vamos agora construir a parte dos Itens. Aumente a altura do painel, se necessário. Abra a palheta de controles, selecione a guia Data, clique e arraste o controle dbGrid para o painel principal. Clique com o botão direito sobre a grid, selecione Properties e altere Name para oItensPedido. Clique novamente com o botão direito sobre a grid e selecione Grid Options. Em Main File (arquivo principal) selecione ItemPed e em Ordering (classificação) 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 aparência : o DDO envia a mensagem Refresh para todos os DEO´s. significa que é um registro novo. A propriedade Server retorna o número do DDO principal (Pedido).Brazil Página 73 Salve a view. Aumentamos então a mensagem para verificar se o pedido é novo ou já existe. Current_Record retorna o número do registro corrente. Mas queremos que todo ítem novo seja inserido após a última linha. Depois que um pedido é colocado. Para isto. se o objeto tiver o foco e for shadowed movemos o foco para o próximo objeto com Next. Se for zero. Se Object_Shadow_State for verdadeiro. Vamos então fazer algumas mudanças. insira o código abaixo no objeto oItensPedido : . inclua-a no programa. Para isto.com. compile e teste. insira o seguinte código em Vendedor_Código : Sempre que um novo registro do Pedido for encontrado ou limpo.Curso de Visual Dataflex __ byKohl@terra. Incluindo novos itens apenas no final da lista Quando você está numa grid e tecla F10 o VDF insere um registro na posição atual da grid. O trabalho básico está feito. Finalmente.br – Vitória – ES . Não permitir a alteração de vendedor Clique em para abrir o código fonte da view. o objeto se torna Display_Only. O indicador self é usado para referenciar o objeto corrente. não permitiremos que o vendedor seja alterado. sempre que um registro for inserido ou excluído a tabela será reorganizada. sempre que ela for pressionada será disparado o método mAcrescentaLinha.Curso de Visual Dataflex __ byKohl@terra. não precisamos disto. assim. Este método move o foco para a última linha com End_of_Data e desce para a próxima linha com Down.Brazil Página 74 A tecla de inserção de linha F10 equivale a kAdd_MODE para o VDF. Forçar a gravação do Pedido quando entrar e sair dos itens Considerando que o usuário está armado com um mouse.com. No nosso caso.br – Vitória – ES . insira o código abaixo no objeto oPedidoVw : . nada impede que ele vá direto aos ítens sem informar os dados do pedido. Se a propriedade Auto_Regenerate_State for verdadeira (o default). portanto a configuramos para false. Para evitar isto. br – Vitória – ES .com. a função Child_Entering será executada para verificar se os dados do pedido foram corretamente inseridos. verificamos novamente se houve alterações e. Caso contrário. oPedidoVw. - . mas é de dificílima utilização pois não possui nenhum utilitário para a montagem (desenho) do relatório. disparamos a mensagem Request_Save_No_Clear que salva o registro sem limpar os dados da view. caso existam. tipo de fonte.Brazil Página 75 A propriedade Should_Save é verdadeira sempre que houver uma alteração no DDO.Curso de Visual Dataflex __ byKohl@terra. o usuário não informou nenhum dado no pedido). Normalmente a saída é enviada para a porta paralela LPT1. Vá para o objeto oItensPedido e inclua o seguinte código : Se propriedade Child_Table_State for verdadeira. como em notas fiscais. sem usar a impressão do Windows. disparamos uma mensagem de erro. Então fazemos um teste : se o registro for 0 (ainda não foi gravado) e não houve alterações (ou seja. a função retorna um erro (lembre-se. WinPrint : utiliza um pacote integrado ao VDF para produzir relatórios gráficos padrão Windows. etc. etc. necessitando que se informe campo a campo a posição. boletos. É ideal quando se precisa de alta velocidade e baixa qualidade de impressão. Após a gravação. a Criando relatórios No VDF podemos criar relatórios de três formas : Basic Report : cria relatórios em modo caracter (texto puro). qualquer retorno diferente de zero equivale a false). Observe a clásula delegate : ela envia uma mensagem ao objeto pai (no caso. onde está a função chamada). e que se integra ao VDF. ordem de classificação. escolhendo Delete ou pressione DEL. Todas as três formas devem ser encapsuladas numa view especial. Ok e Cancelar. Clique com o botão direito em RadioGroup1 e selecione Properties. Clique em para criar uma Report View. etc. criar gráficos. Clique em Radio Label 3 e exclua-o. que possui duas partes distintas : a interface com o usuário. - Basic Report Inicialmente. Nossa interface terá basicamente radio buttons para escolher o destino do relatório. selecione a guia Base Container. Mude a propriedade Name para oSaida e Label para Enviar para :. clique no controle Radio Group e arraste-o para a view : Por default. etc. . destino do relatório. Selecione Properties de Radio Label 1 e altere o Name para oVideo e Label para Vídeo. a Report View. selecionar a ordem de classificação e dois botões. vamos criar uma listagem de clientes em Basic Report. pois só precisamos de dois botões. Para excluir um objeto. Escolha esta forma para criar relatórios padrão Windows. exportar dados para os mais diversos formatos. para seleção de registros. selecione-o e clique com o botão direito.Brazil - Página 76 Crystal Reports : utiliza o Crystal Reports da Seagate. o próprio relatório.com. o VDF cria um grupo de três botões.br – Vitória – ES . uma das melhores ferramentas de criação de relatórios do mundo.Curso de Visual Dataflex __ byKohl@terra. Abra a paleta de controles. Mude suas propriedades Name para oOK e Label para &OK.br – Vitória – ES . Informe ClientesBR para Name. Altere o Name do primeiro para oNumerica e o Label para Ordem numérica. Listagem de Clientes(BR) para Description e ClientesBrRv para Object Name. . selecione Line Control e arraste para a view.Brazil Página 77 Selecione Properties de Radio Label 2 e altere o Name para oImpressora e Label para Impressora. Clique na guia Base da paleta de controles. Elimine um dos botões. O botão foi copiado para a mesma posição. selecione Buttom e arraste para a view. Sua view deverá estar assim : Salve a view neste ponto.Curso de Visual Dataflex __ byKohl@terra. Clique com o botão direito sobre a view e selecione Paste. mude sua propriedade Name para oClassificacao e Label para Classificação. Movimenteo para o lado e mude suas propriedades Name para oCancelar e Label para &Cancelar. Altere o Name do segundo botão para oAlfabetica e o Label para Ordem alfabética.com. Sua view deverá estar com a seguinte aparência : Crie um novo radio group. Posicione e dimensione a linha e a view para que adquira uma aparência como esta : Ainda na guia Base da paleta de controles. Clique com o botão direio sobre ele e selecione Copy. br – Vitória – ES . Notify_Select_State. Os valores que ela pode assumir são auto-explicativos. Insira o seguinte código : Output_Device_Mode é uma propriedade utilizada pela Basic Report para identificar o dispositivo de saída da impressão.com. substitua os defaults iToItem e iFromItem por iItemAtual e iDoItem.Brazil Página 78 Vamos então inserir o código para estes controles. Estas variáveis guardam respectivamente o botão que está clicado e o anterior. que é executada sempre que um dos botões for clicado. Dê um duplo clique no objeto oSaida (Enviar para). Para ficar em bom português.Curso de Visual Dataflex __ byKohl@terra. . o objeto principal. Vamos agora inserir o código para oClientesBrRv. Observe que o VDF já traz uma procedure prédefinida. Como os índices dos botões são baseados em zero. no início do código do objeto. Vamos incluir o código para oClassificacao. com o comando On_Key. Acrescentamos ao nome “. Definimos as teclas de atalho para os dois botões. pois no local desta linha o VDF criará o código de todos os objetos da view.Curso de Visual Dataflex __ byKohl@terra. criamos um arquivo com o comando Make_Temp_File. não corremos o risco de conflitos. Desta forma. setamos a propriedade Output_Device_Name para a saída padrão do Windows.\” para garantir que o arquivo será criado no diretório corrente. WinLst:.com. coloque o código : procedure OnClick send Request_Cancel end_procedure . Se a saída for para a impressora. acrescentamos 1 para indicar que 1 será ordem numérica e 2 será ordem alfabética. No botão oOK.br – Vitória – ES . A procedure mIniciaRelatorio será disparada pelo botão OK. ou seja. Observe que criamos esta propriedade acima da “linha verde”. Se a opção escolhida foi enviá-lo para o vídeo. Experimente abrir o arquivo ClientesBr. se mais de um usuário acessar o relatório simultaneamente.rv e você verá este posicionamento. acrescente o código : procedure OnClick send mIniciaRelatorio end_procedure No botão oCancelar.Brazil Página 79 Criamos uma propriedade que será usada pelo objeto oClassificacao para indicar qual ordem foi escolhida. de extensão TXT e cujo nome é armazenado em sNomeArquivo. Este nome é criado aleatoriamente pelo VDF e não é repetido. Cliente_Cab será o cabeçalho.1 function_return iRet end_function . Para um campo numérico (Código). Todas começam com / e após a última finalizamos a seção com /*. Página 80 Usamos o pacote DFAllRpt. Cada caracter impresso é representado por “_”.br – Vitória – ES .Brazil Finalizamos a interface com o usuário. // Cada campo é referenciado pelo nome da imagem // e sua seqüência Sysdate4 Footer.com.Curso de Visual Dataflex __ byKohl@terra. Cliente_Lin o detalhe e Footer será o rodapé de cada página. que define a classe Basic Report. vamos então criar o relatório. Vamos finalmente criar o objeto relatório. o último caracter é um ponto. em seguida abrimos o arquivo Cliente e criamos as imagens que serão impressas. 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 título da caixa de mensagem // que será exibida // enquanto o relatório estiver sendo gerado set Report_Title to "Imprimindo listagem de Clientes" // função disparada antes do relatório ser gerado function Starting_Main_Report returns integer integer iRet iIndice forward get Starting_Main_Report to iRet // pegamos a ordem de classificação escolhida get pOrdem to iIndice // indicamos ao objeto qual índice usar Report_Index by iIndice // Colocamos a data atual no campo da imagem. Codigo print Cliente.Nome print Cliente. selecione o relatório criado e clique em OK. WinPrint Para este exemplo. Compile e teste o programa. Na árvore de estrutura do programa. Report.Codigo)) // envia os campos para as janelas correspondentes // da imagem print Cliente. criaremos uma Report View a partir da anterior. pois as opções para o usuário serão as mesmas.Brazil // Imprime o cabeçalho.com. Listagem de Clientes (WP) para Description e ClientesWpRv para Object Name.br – Vitória – ES . 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. clique na pasta REPORT.Telefone // envia a imagem para a saída selecionada output_pagecheck end_procedure // imprime o rodapé de cada página procedure_section Footer as Footer // envia a imagem para a saída selecionada output_pagecheck end_procedure end_object Salve e feche a report view. Observe que agora nosso menu tem mais uma opção. Abra a Listagem de Clientes (BR) e no menu selecione File -> Save as e informe ClientesWp para Name. clique em . . Após a palavra as aparece // o nome da imagem procedure_section Page_Top as Cliente_Cab integer iPagina // pega o número atual da página get Page_Count to iPagina // envia este número para imagem print iPagina // envia a imagem para a saída do relatório output_pagecheck end_procedure Página 81 // imprime as linhas do relatório procedure_section Body as Cliente_Lin // Exibe o código atual no painel que é mostrado // enquanto o relatório está sendo gerado send Update_Status (string(Cliente. No evento OnClick deste botão. pois o WinReport não utiliza isto. que irá disparar o relatório. definida na classe WinReport e que chama a caixa de configuração de impressoras do Windows.br – Vitória – ES . Altere a propriedade Name deste novo botão para oConfigurar e Label para C&onfigurar. Seu objeto deverá estar parecido com este : Abra o código de Outer-Component code e retire as imagens.com.Curso de Visual Dataflex __ byKohl@terra. acrescente o código: Pegamos o número que identifica o objeto da propriedade Report_Object_ID. Substitua o código do botão OK por send Run_Report. Enviamos para este objeto a mensagem DFPrintSetup.Brazil Página 82 Vamos acrescentar um terceiro botão que permitirá configurar a impressora do Windows. Elimine a procedure mIniciaRelatorio e modifique o código 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" . Nesta seção ficará apenas o pacote DFAllRpt e a abertura do arquivo Cliente. 5 (FONT_ITALIC + FONT_BOLD) DFWritePos "Nome" 3 (FONT_ITALIC + FONT_BOLD) DFWritePos "Telefone" 13 (FONT_ITALIC + FONT_BOLD) // finaliza o cabeçalho DFEndHeader end_procedure procedure_section Body send Update_Status (string(Cliente. salta a página DFLineCheck 20 DFWritePos Cliente.5 DFWriteln "" DFWritePos "Código" 0.: " 15 // imprime o contador de páginas DFWritePos "#pagecount#" 16.br – Vitória – ES .com.5 em negrito DFWritelnPos "Listagem de Clientes" 0.5 DFWritePos Cliente.Curso de Visual Dataflex __ [email protected] (FONT_BOLD) DFFont "Times New Roman" DFFontSize 14 // imprime uma linha em branco DFWriteln "" // imprime e permanece na mesma linha DFWritePos "Pág.Nome 3 // imprime e salta para a próxima linha DFWritelnPos Cliente.Telefone 13 end_procedure procedure_section Page_Bottom DFFont "Arial" DFFontSize 10 // inicia as definições 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) .Codigo 0.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 Página 83 procedure_section Page_Top // inicia as definições do cabeçalho DFBeginHeader DFPageTop // posiciona o alinhamento a esquerda DFHeaderPos HDR_LEFT // cria um quadro em volta do cabeçalho DFHeaderFrame HDR_MARGINS // seleciona a fonte DFFont "Arial" // seleciona o tamanho da fonte DFFontSize 20 // imprime a linha na posição 0.Codigo)) DFFont "Times New Roman" DFFontSize 14 // se foram impressas 20 linhas. mas não entraremos em detalhes da sua construção no Crystal. Nossa view deverá estar com esta aparência : . Altere a propriedade Label do objeto VendedoresCrRv para Listagem de Vendedores (CR). criamos uma Report View da mesma forma que fizemos anteriormente. pois não o iremos utilizar por enquanto. Crystal Reports O Crystal Reports é a melhor opção para a montagem de excelentes relatórios em modo Windows. pois os comandos DFWritePos e DFWritelnPos exigem o parâmetro posição. Produtos. que já estão criados no diretório Data de nosso exemplo. Você pode acessá-los pelo menu Utilities -> Crystal Reports Writer do IDE. Exclua também o botão Configurar Impressora.Brazil // imprime a data atual DFWriteln (RptToday(self)) (FONT_ITALIC) // finaliza o rodapé DFEndHeader end_procedure end_object Página 84 Como podemos ver. O grande problema desta classe é o posicionamento lateral dos objetos no formulário. centímetros) e este tamanho varia completamente de um tipo ou tamanho de fonte para outro. vai dar um enorme trabalho. Para executar o relatório.rpt.com. A solução seria usar alguma ferramenta de desenho que fornecesse estas medidas e informá-las ao programa. o que convenhamos. com os nomes de Vendedores.rpt e Pedidos. pois o Crystal se encarrega disto. A única vantagem desta classe é sua velocidade e a possibilidade de usarmos qualquer comando VDF dentro do relatório. Iremos nos concentrar apenas na interface entre o VDF e os relatórios. Description = Listagem de Vendedores (CR) e Object Name = VendedoresCrRv. o que não acontece nos próximos exemplos.br – Vitória – ES . que é passado na unidade de medida definida no Windows (em nosso caso. dependendo da complexidade do relatório. pois não é o objetivo deste curso. a sintaxe do WinReport é muito parecida com a da BasicReport. Produto e Pedidos.rpt. Abra a Report View Listagem de Clientes (WP) e salve-a com Name = VendedoresCr. Criaremos os relatórios de Vendedor. Exclua o radio group Classificação.Curso de Visual Dataflex __ byKohl@terra. Faça exatamente a mesma coisa para criar a report view dos Pedidos. acrescente-a ao programa principal.Curso de Visual Dataflex __ byKohl@terra. Compile e teste. Desta forma. Salve a report view. Siga os mesmos passos e monte a report view dos Produtos. Altere também as referências a Vendedores por Produtos. Neste ponto. terá um auxílio na barra de status. Abra o fonte de VendedoresCrRv e modifique o código para que fique como este : E isto é tudo que precisamos fazer. Description = Listagem de Produtos (CR) e Object Name = ProdutosCrRv. use Name = oProdutosCr. Ao salvá-la. Nós podemos configurar Helps para praticamente todos os objetos que recebem foco. Salve e inclua a report view a aplicação.Brazil Página 85 Selecione o radio buttom oVideo e mude sua propriedade Status_Help para Envia relatório para o vídeo. compile e teste a aplicação. Faça da mesma forma com o radio buttom oImpressora e mude o Status_Help para Envia relatório para a impressora.com.br – Vitória – ES . sempre que o usuário clicar neste botão. temos a primeira fase de nossa aplicação completa ! . 483. Não ocupa espaço no arquivo. Data File : usado nos registros de arquivos. Date : armazenam datas na faixa de 01/01/0001 a 01/01/2500. o Text – também conhecido como memo.147.483. Number : armazenam valores numéricos simples na faixa de -9999999999999.147.Brazil Página 86 Parte II – Avançando A linguagem VDF Vamos conhecer um pouco mais dos recursos do VDF. Boolean : armazenam valores True (verdadeiro) ou False (falso). tentaremos sempre que possível colocar em prática os novos conhecimentos. pois é um campo “virtual”.com.99999999 a +9999999999999. A medida que avançarmos. mas pode ser utilizado o comando Set_Argument_Size para aumentar este limite para até 2 Gb.Curso de Visual Dataflex __ [email protected] – Vitória – ES . Real : armazenam números reais na faixa de +/-1. O valor inteiro de True é 1 e de False é 0. armazenadas em formato Juliano. como um objeto.99999999.647 a +2.Podem ser um dos seguintes tipos : o ASCII – aceita qualquer tipo de caracter. String : armazenam quaisquer caracteres. o Numeric – aceita números. Handle : armazenam referências (ou ponteiro) para um outro identificador. o separador decimal e sinal negativo o Date – aceita datas. É referenciada por NomeDoArquivo. o Overlap – campo lógico que redefine outros campos físicos. usado para armazenar grandes textos ascii. Seu tamanho é alocado automaticamente até 255 caracteres.647.NomeDoCampo.0 e +/-306. - - - - - . Tipos de dados Em VDF podemos ter os seguintes tipos de dados: Integer : armazenam valores inteiros na faixa de –2. em formato binário. uma variável deve ser declarada. como sNomeDaVariavelString. Podemos declarar até oito variáveis numa mesma linha. ou seja.com.. Exemplos destas declarações são : nteger number real string date handle iNome nNome rNome sNome dNome hNome Normalmente iniciamos o nome da variável com uma letra minúscula que a identifica. com a seguinte sintaxe : {tipo} { identificador } { identificador } . mesclando maiúsculas com minúsculas.br – Vitória – ES . tipos string contém “” e tipos date contém 0. End_Procedure ou Function…End_Function. Variáveis e constantes Declaração Antes de ser referenciada. number. com até 255 caracteres. Uma variável é considerada local se ela for declarada dentro de um bloco Procedure ... que não é suportado pelo VDF. number e real contém 0. Uma declaração de variável pode ser feita em qualquer lugar do programa. string ou handle) e {identificador} é seu nome. usamos a “notação do camelo”. real. date. 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 variável. Usado normalmente para imagens e sons.Brazil Página 87 o Binary – armazena qualquer tipo de dados. {identificador} onde {tipo} deve ser um dos que vimos acima (integer. mas é uma boa idéia declara-las no início. como string sNomeLongo 255 Quando uma variável é declarada. desde que sejam do mesmo tipo..Curso de Visual Dataflex __ byKohl@terra. está em estado nulo. mas para facilitar a leitura de nosso código. Você pode declarar o mesmo nome de variável em . Variáveis locais São declaradas dentro de um procedimento ou função e só estão acessíveis dentro daquele escopo. tipos integer. O VDF não faz distinção de maiúsculas e minúsculas. Não confunda estado nulo com null. além de acabar com a portabilidade de procedimentos e funções. não use variáveis globais. pode ser utilizada da mesma forma que as variáveis (desde que não se tente alterar seu valor).br – Vitória – ES . que não poderão ser utilizados em outros programas a não ser que você leve junto a declaração e inicialização das variáveis globais. string ou date. que veremos em breve. real. e estes parênteses podem ter um ou mais níveis. etc) nas quais cada elemento. Esta técnica vai totalmente contra os princípios da OOP. cadeia de caracteres. data.. Exemplo de expressões: (((nValor + iQuant) * 3) / 2) (x / y) -nSalario . mas que normalmente iniciamos com “c_” e {valor} é qualquer valor tipo integer. normalmente no início do código e estão disponíveis para todo o programa. mas sim propriedades.Curso de Visual Dataflex __ byKohl@terra. end_procedure Variáveis globais São declaradas fora de procedimentos e funções. como procedure mFazQualquerCoisa integer iContador string sNome . Exemplo : define c_PI define c_Maximo define c_Mestre for 3. também chamado operando) sofre alguma ação de um ou mais operadores.14159264 for 100 for “Kohl” Expressões O VDF permite a construção de expressões que qualquer tipo (numéricas. Utilizar variáveis locais sempre que possível é uma excelente técnica de programação OOP e poupa muita memória. Normalmente são declaradas no início da procedure ou function. As expressões são construídas entre parênteses . number. onde o programador tem que ter muito cuidado sobre qual o conteúdo atual da variável. por isto. sempre que possível.. Constantes Uma constante é uma variável somente de leitura e após declarada.Brazil Página 88 procedimentos ou funções diferentes. São declaradas com a sintaxe Define {identificador} for {valor} Onde {identificador} é qualquer nome válido de variável. Esta prática tem várias desvantagens. como num programa extenso.com. Curso de Visual Dataflex __ [email protected]. Os operandos podem ser : Operando Number String Date Constante Variável Chamada de função Expressão Os operadores podem ser : Operadores binários aritméticos + * / Max Min Operador unitário aritmético Operadores relacionais (comparação) = <> < > <= >= In Matches Operadores lógicos Not And Or Operadores de caracteres + * Exemplo de expressão : ( (iHora < 7) and not( (sDia = “Sábado”) and (sDia = “Domingo”) ) ) Exemplo 325 “O Curso” 01/12/1959 C_PI SNome Abs(-25) (3*(199/x)) Operação Adição Subtração Multiplicação Divisão Máximo Mínimo Sinal de menos Igual Diferente Menor que Maior que Menor ou igual a Maior ou igual a Está contido em Comparação de strings com coringas Negação E lógico OU lógico Concatenação Concatena e retira espaços em branco Concatena com um espaço simples . os parênteses não são necessários.Brazil Página 89 Observe que numa expressão unitária (apenas um operando). como a anterior.br – Vitória – ES . COmandos Comando de atribuição São utilizados para alterar o conteúdo de uma variável. Um inteiro diferente de 0 é verdadeiro e igual a zero..br – Vitória – ES . As expressões são avaliadas da esquerda para a direita. Decrement NomeDaVariavel – Subtrai 1 do valor de uma variável inteira.. Um bloco Begin . End pode conter outros blocos aninhados dentro dele.. mesmo estando quebrada.Curso de Visual Dataflex __ byKohl@terra.” no final dela. End. If ( (iDia <> 0) and (iMes < 12) and (iAno > 1988) . Exemplo . é de 1047 caracteres.com. Add {expressao} to NomeDaVariavel – Adiciona o resultado da expressão ou um valor especificado ao conteúdo da variável. Move iQualquerCoisa to iNada Comandos compostos É formado por uma seqüência de comandos dentro de um bloco Begin .. Continuando um comando na próxima linha Uma linha ou seqüência de comandos pode ser quebrada para a próxima linha colocando-se um “. falso. Sua sintaxe é : Move {expressão} to {variável} Exemplos de comando de atribuição : Move Move Move Move “Julie” (iVal1 * iVal2) (iLinha > 60) (Sqr(2)) to to to to sNome iResultado iFimDePagina nRaiz Outros comandos de atribuição : Increment NomeDaVariavel – Adiciona 1 ao valor de uma variável inteira. O tamanho máximo de uma linha.Brazil Página 90 Expressões lógicas As expressões lógicas retornam um valor verdadeiro (true) ou falso (false). Exemplos : . Subtract {expressão} from NomeDaVariavel – subtrai o resultado da expressão ou um valor especificado do conteúdo de uma variável. dependendo do resultado.Brazil Begin Move 158 Move 558 Move (nSalario – nDespesas) End Begin Increment iLinha If (iLinha > 60) .Curso de Visual Dataflex __ byKohl@terra. 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 . São os seguintes : If Sua sintaxe é : If {expressão lógica} {comandos True} Else {comandos False} Exemplos : If (iIdade > 40) .com.br – Vitória – ES . executam seqüências específicas. 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 . If (sLinguagem = “VDF”) . Begin Increment iPagina Move 0 to iLinha End End to nSalario to nDespesas to nDesespero Página 91 Comandos condicionais São comandos que testam uma condição e. Comandos de loop While Executa uma seqüência de comandos enquanto uma condição for verdadeira.br – Vitória – ES .com. Sua sintaxe é : While {expressão lógica} Comando 1 Comando 2 .. . Until {expressão lógica} 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 diferença : no laço Repeat um comando é executado e depois é testada a condição. o comando seria executado pelo menos uma vez independente da condição. Sua sintaxe é : Repeat Comando 1 Comando 2 .Brazil Case Else Move “” to sSom Case End Página 92 O Case Else é opcional. ou seja.. portanto o comando só seria executado se a condição fosse verdadeira.Curso de Visual Dataflex __ byKohl@terra.. No laço While o teste é feito antes. Loop Exemplo : While (iMes < 12) Add 1 to iMes Showln iMes Loop Repeat Executa uma seqüência de comandos até que uma condição seja verdadeira.. iPosicao)) . ou seja..com. End_Procedure A declaração de parâmetros e variáveis é opcional.Curso de Visual Dataflex __ byKohl@terra. 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 Funções São rotinas. Veja este exemplo : Procedure mMostraCaracter Global String sMessagem Integer iPosicao iComprimento Move (Length(sMenssagem)) to iComprimento For iPosicao from 1 to (iComprimento . 1. partes do programa compostos de blocos de comandos que executam alguma função específica e podem ser chamadas várias vezes durante a execução..] {declaração de variáveis} {comando 1} {comando 2} . Procedimentos (Procedures) Declarando Procedures A sintaxe básica para a declaração de uma procedure é Procedure {nome-da-procedure} Global [{tipo 1} {param 1} .br – Vitória – ES . A principal diferença entre uma Procedure (procedimento) e uma Function (função) é que a função retorna um valor após a execução. Esta quantidade de vezes é controlada por uma variável que é incrementada a cada laço. 1. iPosicao)) “.Brazil Página 93 For Este comando é usado para executar alguma coisa um número fixo de vezes.” Loop Showln (Mid(sMenssagem... Ambas podem receber valores como parâmetros bem como declarar suas próprias variáveis..1) ShowLn (Mid(sMenssagem.. .. Function_Return {valor}. com a diferença que deve ser especificado o parâmetro 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 função Uma função é chamada dentro de uma expressão. Function {nome-da-função} Global [{tipo 1} {param 1} .param2. poderíamos fazer : Send mMostraCaracter “Frase a ser mostrada” Send mMostraCaracter (“Mensagem = “ + sMensagem) Funções (Function) Declarando Funções Uma função é declarada quase da mesma forma que uma procedure. Sua sintaxe é : Send {nome-da procedure} {param 1} {param 2} . End_Function Da mesma forma que a procedure.. você pode executá-la com o comando Send.Brazil End_Procedure Página 94 Executando procedures Depois da procedure ter sido declarada...Curso de Visual Dataflex __ byKohl@terra. sendo obrigatório apenas o parâmetro de retorno. da seguinte forma : ({nome-da-função}(param1. Usando nossa procedure.] returns {tipo} {declaração de variáveis} {comando 1} {comando 2} .com. a declaração de parâmetros é opcional.)) .br – Vitória – ES ... da seguinte forma : Register_Procedure {nome-da-procedure} Global [{tipo 1} {param 1} . Com nossos exemplos.Brazil Usando nosso exemplo.] Register_Function {nome-da-função} Global [{tipo 1} {param 1} .br – Vitória – ES . apenas acrescentando-se a palavra Register. composto de componentes.com. Classes Uma classe é um tipo estruturado. poderíamos fazer : Move ( fPotencia(2..] returns {tipo} A sintaxe é a mesma do cabeçalho da declaração. Sempre que possível. você deve registrá-la.8) ) to iResposta Página 95 Declaração antecipada Se você precisar referenciar uma procedure ou funtion antes dela ter sido criada.Curso de Visual Dataflex __ byKohl@terra. como métodos... para não quebrarmos o princípio do encapsulamento.. o correto é declarar métodos dentro das classes. faríamos assim : Register_Procedure mMostraCaracter Global String sMessagem Register_Function fPotencia integer iX integer iY returns integer Observações Como vimos. mas isto vai contra o estilo de programação OOP. nós podemos declarar procedures e functions globais a toda a aplicação. Declarando uma classe Uma classe é declarada da seguinte maneira : Class {nome_da_classe} is a {SuperClasse} [ Procedure Construct_Object Forward Send Construct_Object {declaração de propriedades} {objetos_privados} End_Procedure [{métodos}] End_Class . propriedades e objetos. Curso de Visual Dataflex __ [email protected] – Vitória – ES - Brazil Página 96 SuperClasse é a classe mãe, da qual a nome_da_classe é derivada, e herda todas suas propriedades e métodos. Estes métodos podem ser aumentados, sobrescritos ou cancelados dentro da nova classe. Dentro do método construtor da classe (Procedure Construct_Object) você pode definir propriedades e objetos privados. O Visual Dataflex tem uma grande quantidade de classes pré-definidas, também chamados de packages (*.pkg, ), localizadas na pasta pkg de sua instalação, para implementar a funcionalidade e a interface de sua aplicação 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 botão com características que não estão 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 características e nós não criamos ou redefinimos nenhum de seus componentes. Por questão de padronização, sempre iniciamos o nome de uma classe com c. Propriedades São elementos de dados definidos na classe e que compõe os atributos de uma instância desta classe. As propriedades podem definir, por exemplo, o tamanho e localização de um painel, as cores de um label, o arquivo de um dicionário de dados, etc. Declaração de propriedades Uma propriedade é declarada com a seguinte sintaxe : Property {tipo_de_dado} {nome_da_propriedade} {valor_inicial} Tipo_de_dado é um dos que são suportados pelo VDF : integer, number, real, date, string, pointer ou handle. Nome_da_propriedade segue as mesmas regras de nomes de variáveis e, normalmente, começa com p e o prefixo do tipo de dado; no final desta apostila, mostramos a convenção de nomeação normalmente usada para todos os tipos. Valor_Inicial será atribuído à propriedade no momento em que ela for declarada. As propriedades são declaradas dentro do método 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 __ [email protected] – Vitória – ES - Brazil Property Integer piContaClique 0 Property String psOcupado “Ocupado” End_Procedure End_Class Página 97 Criamos duas propriedades, piContaClique e psOcupado, dentro do método Construct_Object. Antes de criá-las, executamos o comando Forward Send Construct_Object, que significa executar o método construtor da superclasse e herdar todas todas suas definições. 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, não é necessário referenciar IdObjeto; neste caso, pode-se usar a palavra-chave Self (que significa o objeto corrente) ou não usar nada. Valor pode ser uma constante, variável ou expressão que seja compatível com o tipo da propriedade. Vamos colocar em prática 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 não foram criadas em nossa classe, mas foram herdadas da superclasse Button (quando usamos Forward Send Construct_Object). Usamos três formas diferentes de atribuir-lhes um valor, todas produzindo o mesmo resultado. No exemplo, as propriedades foram criadas dentro do método construtor, mas também 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 __ [email protected] – Vitória – ES - Brazil Página 98 Lembre-se : nunca utilize o comando move para atribuir valores a uma propriedade; move só é usado para variáveis. 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_variável As regras são as mesmas do comando Set, ou seja, se a propriedade estiver no objeto corrente, pode-se usar Self (ou não usar nada) para nome_do_objeto e nome_da_variável 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 método OnClick faz parte da classe Button e é executado sempre que o usuário clica no botão. Nossa classe herdou este método e o aumentamos para que o botão apresente o número 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 criação, podemos utilizar os comandos Register_Procedure e Register_Function, como fizemos com os métodos. Sua sintaxe é : Curso de Visual Dataflex __ [email protected]. etc).] [{declarações_de_variáveis}] {instrução 1} {instrução 2} . End_Procedure Se a procedure precisa receber valores. string. Por exemplo : Register_Procedure Set piAltura Integer iVariavel Register_Function piLargura Returns Integer Métodos É uma Procedure ou Function que é declarada na definição da classe e executa alguma operação específica. os parâmetros são variáveis que podem ser usadas normalmente dentro da procedure. onde você pode declarar outras variáveis (locais a procedure) e colocar instruções que serão executadas quando a procedure for chamada. Declarando métodos Procedure A sintaxe para declaração de Procedures é : Procedure {nome_da_procedure} [{tipo_de_dado1} {parametro1} {tipo_de_dado2} {parametro2} .. No VDF temos três tipos de métodos : Procedure Procedure Set Function A Procedure executa operação no objeto.. Lembre-se que os métodos de classe não são como as procedures e functions globais que vimos anteriormente.br – Vitória – ES . number.. declare parâmetros e indique seus tipos de dados (integer. Vamos colocar em prática em nossa classe : Class cOK_Botao is a Button Procedure Construct_Object Forward Send Construct_Object Property Integer piContaClique 0 Property String psOcupado “Ocupado” .. que são declaradas e chamadas de uma forma diferente e são criadas com objetivos diferentes dos métodos de uma classe. date. a Procedure Set configura um estado ou atributo do objeto e a Function executa uma operação e retorna um estado ou atributo do objeto.Brazil Página 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 não declarada e Register_Function é utilizada quando você usa o comando Get para uma propriedade não declarada. através do comando Procedure_Return. ou em qualquer outro ponto.com. A procedure OnClick passa este valor através de uma expressão.Brazil Página 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 parâmetro em sMensagem que é exibido na tela. Por exemplo. Begin Error 400 “Você já clicou demais.br – Vitória – ES . poderíamos 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). Use teclado.” Procedure_Return End Set piContaClique to iConta Set Label to iConta Send Mensagem (“Você clicou “ + String(iConta)) o .Curso de Visual Dataflex __ byKohl@terra. Uma procedure é executada até encontrar uma End_Procedure. ] [{declarações_de_variáveis}] {instrução 1} {instrução 2} . Begin . A diferença esta na forma como ela é acessada.Brazil End_Procedure End_Class Página 101 Declarando métodos Procedure Set Uma procedure set executa operações e então configura algum estado ou atributo do objeto. 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)... Ela é semelhante a configuração de uma propriedade e sua sintaxe é : Procedure Set {nome_da_procedure} [{tipo_de_dado1} {parametro1} {tipo_de_dado2} {parametro2} .com..br – Vitória – ES . End_Procedure Observe que sua estrutura é exatamente igual ao de uma Procedure..Curso de Visual Dataflex __ byKohl@terra. .. A execução da Function termina quando ela encontra o comando Function_Return.] [{tipo_de_dado1} {parametro2} .Brazil Error teclado..] Register_Procedure {parametro1} Set {nome_da_procedure} {tipo_de_dado2} . O método para executá-la é semelhante a leitura de uma propriedade. Veja a sintaxe : Function {nome_da_function} [{tipo_de_dado1} {parametro1} {tipo_de_dado2} {parametro2} .br – Vitória – ES . Veja a sintaxe : Register_Procedure {parametro1} {nome_da_procedure} [{tipo_de_dado1} {tipo_de_dado2} {parametro2} .. Declarando Functions Uma function executa operações como uma procedure e além disto..Curso de Visual Dataflex __ byKohl@terra. Foi criada uma função para ler o valor da propriedade interna e retorná-lo. Declarando métodos antecipadamente Da mesma forma que acontece co as procedure e functions globais. Function_Return {valor_do_retorno} End_Function O valor retornado deve ser compatível com o tipo_de_retorno declarado em Returns.. Usamos os mesmos comandos Register_Procedure e Register_Function. Você pode definir de nenhum ou quantos parâmetros forem necessários mas o tipo_de_retorno é obrigatório. Esta procedure também connfigurará a legenda do botão.. 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.com.] Returns {tipo_do_retorno} [{declarações_de_variáveis}] {instrução 1} {instrução 2} . uma Procedure Set foi definida para cuidar da configuração de uma propriedade interna que registra a quantidade de cliques.. as locais também podem ser declaradas antecipadamente.” 400 “Você já clicou Página 102 demais. retorna um estado ou atributo do objeto. se for necessário referenciá-las antes de sua implementação. 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 . Ao ocorrer algum evento. desde que sejam do mesmo tipo declarado na procedure. paramN} Se a procedure estiver na mesma classe ou objeto. um clique ou arrastar do mouse. Um evento pode ser qualquer ação que o sistema possa identificar. Cada classe do VDF executa determinados eventos durante as operações do programa. Sua sintaxe é : Send {nome_da_procedure} [of {IdObjeto}] {param1 .] Returns {tipo_do_retorno} Ou seja. Por exemplo : Register_Procedure EscrevaUmaLinha Integer x Register_Procedure Set Altura Integer 0 Register_Function Tamanho Returns Integer Eventos Eventos são implementações do método Procedure.. Executando Procedures Uma procedure é executada quando recebe uma mensagem atravéz do comando Send.Brazil Register_Function {parametro1} {nome_da_function} Página 103 [{tipo_de_dado1} {tipo_de_dado2} {parametro2} . que é disparado sempre que o usuário clicar o botão do mouse. Obviamente. a gravação de um registro. estes deverão ser passados na mesma quantidade e ordem em que foram deinidos.Curso de Visual Dataflex __ byKohl@terra.. variáveis ou expressões. Se a procedure tiver parâmetros.br – Vitória – ES . como uma tecla pressionada.com. a sintaxe é a mesma da declaração do método. cada classe tem seus próprios eventos e você deve procurar na documentação do VDF o que você deseja. Parâmetros podem ser constantes. podemos interceptá-lo e programar os comandos que devem ser executados. IdObjeto é desnecessário. apenas acrescentando-se a palavra Register_. etc.. nós interceptamos o evento OnClick. Na classe que estamos criando.. é exatamente igual a atribuição de valor a uma propriedade.Curso de Visual Dataflex __ byKohl@terra. Observe os exemplos : Set Location to 10 15 Set Size of oFormEndereco to iAltura iLargura Alguns métodos procedure set requerem que parâmetros especiais sejam passados.br – Vitória – ES . de uma lista ou array. é obrigatório que você indique qual é este objeto. Se você estiver chamando um método de outro objeto. A classe Data_Dictionary. 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 “Endereço do Cliente” Quando uma procedure set possui mais de um parâmetro.com. Estes parâmetros normalmente identificam qual propriedade o método irá configurar. que por sua vez irá ler e acrescentar uma propriedade string ao final do texto. utiliza muito esta sintaxe : Set {nome_do_método) [of {IdObjeto}] Field {id_do_campo} to {valor} Onde id_do_campo identifica o número do campo no arquivo de dados. Seu método construtor define uma tecla de atalho (Alt+N) que executará o método AcrescentaNome. por exemplo. como em : Send Beginning_of_Line of oEditor Send Goto_Line of oEditor iNumeroLinha Send Move_Absolute of oEditor 20 5 Executando métodos Procedure Set A execução de uma procedure set simples. invocando o método Append_Text. com apenas um parâmetro.Brazil End_Class Página 104 O exemplo cria uma classe MeuEditor derivada da classe Edit. ou seja. Veja estes exemplos : . variável ou expressão que resulte num inteiro. herdado da classe Edit. 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. é chamada de complexa e sua sintaxe é semelhante. Construct_Object É o nome do método construtor de uma classe. Construc_Object e Destroy_Object. ou seja. normalmente chamamos uma function para pegar este valor. se utilizamos um método procedure set para configurar uma propriedade. sua sintaxe fica exatamente igual ao de uma propriedade.. Se uma function não tiver parâmetros.br – Vitória – ES .Data to dData Verifique no help do Viausal Dataflex a classe Data_Dictionary e todas suas propriedades e métodos. com esta sintaxe : Get {nome_da_function} [of {IdObjeto}] {param1 . Métodos Construtores e Destrutores Construtores e Destrutores são métodos especializados que controlam a criação e destruição de objetos.com. objetos aninhados e inicializar o objeto. Construtores são utilizados para criar propriedades. São definidos na classe como qualquer outro método. Sua sintaxe é : Procedure Construct_Object {declaração de propriedades} {instruções} Forward Send Construct_Object {outras instruções} .Brazil Set Field_Current_Value Field Cliente.. a não ser pelos nomes específicos que os identificam.Curso de Visual Dataflex __ byKohl@terra. os parâmetros devem ser do mesmo tipo e estar na mesma ordem em que foram declarados. 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.Fone to “(##) ####-####” Página 105 Outra classe que utiliza esta sintaxe é a Array.Nome to “Luiz” Set Field_Mask Field Cliente. como neste exemplo : For iContador from 1 to 9 Set Array_Value iContador to 0 Loop Chamando métodos Function Chamar uma function é um complemento da execução de uma procedure set. Uma function é chamada atravéz do comando Get. paramN} To {Variável} Como nas procedures. Se quiser destruir um objeto manualmente.Brazil End_Procedure Página 106 A primeira ação de um constrututor normalmente é chamar o construtor da superclasse para criar e inicializar os atributos que serão herdados. 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 método destrutor da classe. 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. Isto é feito com a instrução Forward Send Construct_Object.com. que é invocado sempre que o objeto está sendo destruído. os .br – Vitória – ES . normalmente sua primeira ação é chamar o método destrutor da superclasse atravéz da instrução Forward Send Destroy_Object. pois estes métodos são executados automaticamente. Modificando métodos herdados Um método herdado de uma superclasse pode ser modificado para executar alguma ação diferente na nova classe. Sua sintaxe é a mesma do método construtor : Procedure Destroy_Object {declaração de propriedades} {instruções} Forward Send destroy_Object {outras instruções} End_Procedure Como o construtor. envie a mensagem Request_Destroy_Object. Se não for feita nenhuma modificação.Curso de Visual Dataflex __ byKohl@terra. apenas acrescentando o comando Forward.valorN} [{param1. define um novo método MostraAlgo.paramN}] to Forward Get {nome_da_funcao} [{param1. paramN}] Forward Set {nome_da_procedure} {valor1. As mensagens são avançadas com o comando Forward. Outra diferença é que não se referencia o objeto. pois só avançamos uma mensagem que pertence a superclasse.Curso de Visual Dataflex __ byKohl@terra. Avançando mensagens Avançar uma mensagem permite que você aumente um método herdado de forma que ele execute o que foi definido na sua superclasse e mais alguma ação definida na classe. 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.....com. A segunda classe cBotaoMensagem2 herda as duas procedures de cBotaoMensagem. instanciada da classe Button.. Assim.. que exibe “Primeira mensagem” quando o botão for clicado. para um objeto da cBotaoMensagem2 será exibido a segunda mensagem.br – Vitória – ES .Brazil Página 107 métodos funcionarão como definidos na superclasse.paramN}] to {variável} A sintaxe é a mesma da execução. Os três tipos (Procedure. Procedure Set e Function) podem ser avançados. Para se codificar um método herdado deve-se defini-lo com o mesmo nome na nova classe e modificar o que for necessário. .. conforme a seguinte sintaxe : Forward Send {nome_da_procedure} [{param1 .. mas redefine a MostraAlgo para exibir “Segunda mensagem”. LimpaArmazenagem limpa os dados de oArray e ArmazenaValor retorna um valor indexado de oArray. Sempre que um comando requer um handle para algum objeto. que contém um objeto Array aninhado.com. Três métodos fazem interface com oArray : AcrescentaValor busca o valor do objeto e acrescenta-o a oArray. 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.Brazil Página 108 Objetos privados As classes do VDF podem conter objetos aninhados de qualquer outra classe e sempre que uma instância desta nova classe é criada. os objetos aninhados também o são. Objetos aninhados são declarados no método construtor da classe. pode-se usar Self para referenciar o objeto corrente. . Sempre que um objeto é destruído.br – Vitória – ES .Curso de Visual Dataflex __ byKohl@terra. Self A palavra Self é uma referência ao objeto corrente. Os objetos aninhados que fazem parte da definição da classe tornam-se atributos privados desta classe. seus objetos aninhados também o são. que é aquele que está executando o código neste momento. sendo que a primeira . cBotaoMensagem. mas importa os métodos da classe cMensagem. No VDF. cMensagem.com. pois eles são projetados como blocos para outras classes.Brazil Página 109 Herança múltipla Cada classe declarada herda automaticamente os componentes de sua superclasse. 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. podemos fazer isto usando o comando Import_Class_Protocol. Mas há circunstâncias em que precisamos herdar componentes de outras classes que não fazem parte da hierarquia da nossa classe. O VDF permite importar somente os métodos que são definidos diretamente na classe que está sendo importada e não os da sua superclasse. A segunda classe. Nunca instancie objetos diretamente das classes Mixin.Curso de Visual Dataflex __ byKohl@terra. utilizando a herança múltipla. é especificamente designada para ser “misturada” dentro de outra classe. Sua sintaxe é : Import_Class_Protocol {nome_da_classe_importada} Isto é chamado herança múltipla. Estas classes são instancias da classe Mixin e suas subclasses.br – Vitória – ES . é baseada na classe Button. . o que vai um pouco contra a teoria de herança múltipla. br – Vitória – ES . O exemplo a seguir mostra como um método da classe é redefinido o objeto: Object oOk is a Button . 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 métodos Além de propriedades. 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.Curso de Visual Dataflex __ byKohl@terra. Declarando novas propriedades O VDF suporta a criação de propriedades dentro de um objeto. pai. Objetos também podem ser aninhados dentro de outros. Para usar a funcionalidade de uma classe. um bloco de memória alocado dinamicamente que é definido por seu tipo de classe. Estas propriedades são exclusivas do objeto que as declarou e não são compartilhadas com outros objetos da mesma classe. Da mesma forma que as propriedades. etc.Brazil Página 110 Objetos Objeto é uma instância de uma classe.com. e configura duas das propriedades herdadas da classe. podemos também criar novos métodos num objeto. além dos herdados. criando uma hierarquia de objetos filho. podemos criar novas propriedades e métodos específicos para este objeto. Obviamente. estes objetos só existem no objeto que os criou e não são compartilhados com objetos da mesma classe. avô. você deve instanciá-la com um ou mais objetos. Declaração de objeto Os objetos são declarados pela seguinte sintaxe : Object {nome_do_objeto} is a {nome_da_classe} {configuração de propriedades} {declaração de métodos} {declarações de objetos aninhados} End_Object Você pode utilizar quaisquer propriedades e métodos declarados na classe do objeto ou em suas superclasses. etc. que por sua vez contém objetos label. outra para Pedidos. Vejamos a view de cadastro de cliente da aplicação que fizemos na primeira parte deste curso : Esta view contém vários objetos aninhados. da mesma forma que fazemos procedures e function. e cada uma destas telas contém outros objetos como botões. etc.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 Página 111 Antecipando declarações de objetos Se um objeto precisar ser referenciado antes de sua declaração.com. edit. Sua sintaxe é : Register_Object {nome_do_objeto} Aninhamento de objetos Como já dissemos. Imagine um sistema de faturamento: ele possui uma tela para entrada de dados de Clientes.br – Vitória – ES . objetos podem ser aninhados uns dentro de outros.Curso de Visual Dataflex __ byKohl@terra. uma para Vendedores. painéis. conforme pode ser verificado no programa fonte criado pelo IDE (removemos algumas partes repetitivas para que a listagem não 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 . podemos declará-lo antecipadamente. com.br – Vitória – ES .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.Curso de Visual Dataflex __ [email protected] 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_Localizaçao is a dbTabPage Set Label to "Localização" Object Cliente_Endereco is a dbForm Entry_Item Cliente.Brazil End_Object // Cliente_DD Página 112 Set Main_DD to (Cliente_DD(self)) Set Server to (Cliente_DD(self)) Object Cliente_Codigo 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 .Endereco Set Label to "Endereço:" 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.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.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. Curso de Visual Dataflex __ [email protected] – Vitória – ES - Brazil Página 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_Localização Object TP_Observaçoes is a dbTabPage Set Label to "Observações" 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 Delegação Os comandos Send, Set e Get enviam uma mensagem para que o objeto execute o método referrenciado. Se o objeto não tiver uma definição para o método, 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 nível mais alto, que se não puder resolve-la, gerará um erro. Este processo de enviar mensagens para objetos de nível superior é chamado delegação. Veja um exemplo que utiliza a delegação : 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 “Botão 1” Procedure OnClick Send Info_Box “Sou o botão 1” Send Encerrar End_Procedure End_Object Curso de Visual Dataflex __ [email protected] – Vitória – ES - Brazil Object oBotao2 is a Button Set Location to 20 20 Set Label to “Botão 2” Procedure OnClick Send Info_Box “Sou o botão 2” Send Encerrar End_Procedure End_Object End_Object Página 114 Quando clicados, ambos os botões enviam a mensagem Encerrar para o objeto corrente (eles mesmos). Como nenhum botão tem a definição deste método, a mensagem é delegada para o objeto pai, oPainel, que irá executa-la. Delegação explícita 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 método, que se não for resolvido, será delegado ao avô e assim por diante. Os três tipos de métodos podem usar a delegação explícita (Procedure, Procedure Set e Function), com a seguinte sintaxe : Delegate Send {nome_do_método} [{param1} ... {paramN}] Delegate Set {nome_do_método} [{valor1...valorN} [{param1}...{paramN}] to Delegate Get {nome_da_funçao} [{param1}...{paramN}] to {variável} A sintaxe de delegação é a mesma da execução, apenas acrescentando o comando Delegate. Veja o exemplo de um objeto usando delegação explícita : Object oPainel is a Panel Set Size to 50 70 Object oBotao1 is a Button Set Location to 15 15 Set Label to “Botão 1” Procedure OnClick Send Info_Box “Sou o botão 1” Delegate Send Deactivate End_Procedure End_Object Curso de Visual Dataflex __ [email protected] – Vitória – ES - Brazil Object oBotao2 is a Button Set Location to 20 20 Set Label to “Botão 2” Procedure OnClick Send Info_Box “Sou o botão 2” Delegate Send Deactivate End_Procedure End_Object End_Object Página 115 Neste exemplo, o comando Delegate assegura que a mensagem Deactivate será enviada ao objeto pai oPainel. Se a mensagem não fosse delegada, ela seria enviada ao objeto corrente, no caso o botão, que desativaria apenas a si mesmo e não 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á várias maneiras de se referenciar um objeto. Enviando uma mensagem para si mesmo Quando você não especifica o objeto, uma mensagem é enviada para o objeto corrente, que se não puder resolve-la, utilizará a delegação. 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 frequência, os trechos sublinhados (of Self) podem ser omitidos, pois quando um objeto não é referenciado, o VDF assume o objeto corrente. é obrigatória a identificação do objeto receptor (IdObject).br – Vitória – ES . seu handle é avaliado cada vez que a mensagem for enviada. Dependendo da quantidade de vezes que a mensagem for utilizada.Brazil Página 116 Enviando uma mensagem para outro objeto Quando uma mensagem é enviada de um objeto para outro. Neste caso. 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 fácil? Vamos explicar: Isto é uma questão de otimização. Veja um exemplo : Procedure FazAlgumaCoisa Handle hoArray Integer iConta // forma não otimizada.Curso de Visual Dataflex __ byKohl@terra. Se. Veja no exemplo a maneira correta e a errada de enviar uma mensagem de um objeto a outro : // maneira correta Procedure Correta Handle hoBotao2 . Quando um nome de objeto é usado diretamente dentro de uma mensagem. voe deve utilizar o comando Move para mover a ID do objeto para uma variável. a avaliação será feita apenas uma vez. mais lenta Send Delete_Data of oMeuArray For iConta from 1 to 10000 Set Value of oMeuArray iConta to “Teste” Loop // forma otimizada. isto pode fazer uma boa diferença no desempenho do programa. ao contrário.com. que pode ser feita de duas formas : usando-se o nome do objeto ou seu handle (ponteiro que aponta seu endereço na memória). movemos seu handle para uma variável. não expressando o nome do objeto explicitamente. você pode precisar expressar um handle de objeto como parâmetro de uma mensagem. mais rápida 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 parâmetro Em alguns casos. Procura por um objeto irmão. Resumindo. tornando o código mais complicado de ser mantido. pois isto quebraria o princípio do encapsulamento. .ele mesmo. ou seja. Se não encontrar. ou seja. subindo a hierarquia (avós.br – Vitória – ES . 2 . num comando move (move oNomeObjeto to hoNomeObjeto) ou como um argumento de mensagem (send mMinhaMensagem of oNomeObjeto). 3 – Procura por objetos filhos de seu avô. sua interface deve ser alterada para que a mensagem seja enviada ao filho (que está ao seu alcance).Brazil Move oBotao2 to hoBotao2 Send NotifyButton of oBotao1 hoBotao2 End_Procedure // maneira errada.seus ancestrais. . seus filhos e seus pais. Um objeto não precisa conhecer e nem deve enviar mensagens a objetos netos ou qualquer outro descendente que não seja filho. o VDF executa a seguinte sequência para encontrar o objeto e retornar sua handle : 1 – Procura por objeto um filho. sua interface de mensagens deve ser alterada. Ou seja. se um objeto precisa se comunicar com seu neto. ou seja. não será compilado Procedure Errada Send NotifyButton of oBotao1 oBotao2 End_Procedure Página 117 Acesso relativo ao objeto O princípio da OOP ensina que um objeto só pode acessar outros objetos que estejam dentro de seu escopo.Curso de Visual Dataflex __ byKohl@terra. seu pai e tios. por exemplo. Se um objeto precisa se comunicar com outro que esteja fora de seu alcance. estão ao seu alcance. bisavós. O método de acesso do Visual Dataflex permite que um objeto acesse todos os que fazem parte de seu escopo. devolve o valor 0 (zero). etc) e seus respectivos filhos. que por sua vez se encarregará de enviá-la ao neto. Se não encontrar. 4 – Continua a procura. 5 – Se não encontrar nada na hierarquia toda. .seus filhos. ou seja. Se não encontrar.irmãos 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 .com. filhos de seu pai. o alcance do objeto é : . Quando um handle de objeto é necessário. ele mesmo. Você pode pegar esta propriedade com o comando : Get Object_Label [of oNomeObjeto] to sVariavel Exemplos de nomes curtos : oMeuArray oPainelPrincipal oBotaoCancelar . Este nome fica numa propriedade chamada Object_Label. o objeto está fora de seu alcance e o programa precisa ser corrigido. Nomes longos e curtos de objetos Os objetos tem dois nomes : um longo e um curto. caso contrário. que você utiliza para acessá-lo. significa que ele está em seu escopo e seu programa está correto. se conectando apropriadamente. oBotao1). Este método de acesso relativo de objetos é uma das bases do framework do VDF.Curso de Visual Dataflex __ byKohl@terra. O curto é o nome relativo.com. Se o objeto for encontrado. você sempre usará o nome relativo (por exemplo.br – Vitória – ES . criar e conectar estruturas de dicionários de dados e para criar objetos de entrada de dados aninhados.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 Página 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. Este método é usado para criar views. Por exemplo.oBotaoCancelar Outras formas de acessar um objeto Se você observar nos exemplos e pacotes do Visual Dataflex.com. O nome longo pode ser recuperado com o comando : Get Name [of oNomeObjeto] to sVariavel Exemplos de nomes longos : oPainelCliente. verá que freqüentemente os objetos são acessados pela seguinte sintaxe : (oNomeDoObjeto(Self)) ou (oNomeDoObjeto(Current_Object)) Esta forma é um estilo antigo de codificação que foi substituído pelos métodos mais simples que mostramos acima.Curso de Visual Dataflex __ byKohl@terra. a linha abaixo não 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 .br – Vitória – ES . Veja as duas formas. mas que é mantida por questões de compatibilidade com programas escritos em versões anteriores do VDF.oPainelPrincipal. Este nome fica numa propriedade chamada Name.Brazil Página 119 O nome longo é composto do nome curto e de todos os nomes curtos de seus objetos ancestrais.oMeuArray oContainer1. 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 expressão para acessar o objeto.oPainelPrincipal oContainer1. A única diferença é que neste caso.PKG . não permitindo que um pacote já incluso seja novamente reincluído. se o código já tiver sido incluído anteriormente em alguma parte do progrma.PKG instrui ao compilador para utilizar o pacote de definições básicas para um programa for Windows. O comando Start_UI inicia a interface orientada a eventos do usuário. Usando pacotes Os pacotes são incluídos num programa usando a sintaxe : Use NomeDoPacote Onde NomeDoPacote é um arquivo de código fonte com a extensão . O programa deve definir pelo menos um objeto (no exemplo.Curso de Visual Dataflex __ [email protected] Use DFPanel. Use Windows. Panel) e incluir com Use as definiçõs de classe deste objeto. eles são a base da programação modular da linguagem e são usados para criar bibliotecas que podem ser inseridas em vários programas. duplicando assim seu código. ele será reincluído.com. Você também pode usar a diretiva #Include para incluir trechos de programa. o programa criaria todas as estruturas e sairia sem executar nada.PKG. sem este comando.PKG {Use outros pacotes necessários} {Declarar variáveis globais} {Declarar funções e procedimentos} {Definir um objeto Panel} Start_UI Neste exemplo.Brazil Página 120 Programas Normalmente.br – Vitória – ES . a maior parte de um programa em VDF é feita de arquivos individuais de código fontes chamados packages (pacotes). Pacotes também podem conter outros pacotes e o compilador mantém um controle sobre eles. Veja o exemplo de um programa bem simples : Use Windows. Programas simples Um programa básico tem a seguinte estrutura : Use Windows. Brazil Object oMeuPainel is a Panel Set Label to “Curso de Visual Dataflex” Set Size to 40 80 End_Object Start_UI Página 121 Pré-compilação O VDF permite que você selecione uma seção no início do programa.PKG Use DFPanel. Os programas que tem esta seção são compilados mais rapidamente. que é utilizada constantemente.. Usando as diretivas de compilação #HEADER . para ser pré-compilada.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 expressões Lendo propriedades usando expressões O VDF suporta duas formas de recuperar o valor de uma propriedade de um objeto. - Veja o exemplo : #HEADER Use Windows.Curso de Visual Dataflex __ [email protected]. A primeira é utilizando a sintaxe que vimos anteriormente : Get pNomeDaPropriedade of oMeuObjeto to sVariavel A segunda forma é utilizar NomeDaPropriedade(Id_Objeto) .br – Vitória – ES . pois ao código pré-compilado é acrescentado apenas o restante do programa. #ENDHEADER. O código que estiver entre estas diretivas deve estar previamente pré-compilado. Existem duas formas de fazer a pré-compilação : Pacotes pré-compilados : se o comando Use para um pacote pré-compilado for a primeira linha de um programa. o compilador utilizará o código précompilado.. Id_Objeto é substituído por Self (ou Current_Object). utilizando três técnicas diferentes. 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.br – Vitória – ES . (Allow_Update_State(hCliente_DD) and . as várias formas de avaliar uma propriedade com o comando If : If (Enabled_State(oBotao(Self))) Showln “Botão ativado” Get Enabled_State of oBotao to bAtivo If bAtivo Showln “Botão ativado” Os exemplos a seguir mostram como avaliar várias propriedades numa mesma expressão. todas produzindo o mesmo resultado : // ---< Primeira Forma >----If (Changed_State(oCliente_DD(Self)) and . ele deve ser referenciado usando-se os métodos de acesso vistos anteriormente. (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 .com. (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 . Se a propriedade estiver no mesmo objeto que enviou a mensagem.Brazil Página 122 Onde Id_Objeto deve ser o nome ou handle do objeto e é obrigatório.Curso de Visual Dataflex __ byKohl@terra. Veja os exemplos : Move (Label(Self)) to sLabel Get Label to sLabel // self está implícito Get Label of Self to sLabel // self explícito Se a mensagem estiver em outro objeto. parâmetro 1 . como : Move (Calcula_Imposto(oVendas_DD(Self). a sintaxe é a seguinte : NomeDaFuncao(Id_Objeto) [. nValor)) to nImposto Get Calcula_Imposto nValor to nImposto Get Calcula_Imposto of Self nValor to nImposto Se a função pertence a outro objeto.com. nValor)) to nImposto Get Calcula_Imposto of Self nValor to nImposto As funções também podem ser utilizadas em expressões complexas.. iOpcao)) to bOpcao Get Field_Option of oCliente_DD iCampo iOpcao to bOpcao . iCampo. nImposto nValor) / 100) to Move (Field_Option(oCliente_DD(Self).Brazil Página 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 funções através de expressões Conforme já vimos.Curso de Visual Dataflex __ byKohl@terra.. o VDF tem duas maneiras de chamar funções : utilizando o comando Get ou chamar a função em uma expressão. Com expressões. A maneira de utilizar o método com Get já foi explicada. podemos usar uma das três formas : Move (Calcula_Imposto(oVendas_DD(Self). parâmero n] Se a função estiver no mesmo objeto.nValor) to nImposto Move oVendas_DD to hVendasDD Get (Calcula_Imposto(hVendas_DD. as três formas a seguir são válidas : Move (Calcula_Imposto(Self.br – Vitória – ES .
Copyright © 2024 DOKUMEN.SITE Inc.