Revista MSDN Magazine Edição 8
Clique aqui para ler todos os artigos desta edição

As Novidades do Visual FoxPro 9.0 Beta

O Visual FoxPro sempre foi conhecido como uma ferramenta que procura atender às necessidades mais urgentes dos desenvolvedores. A cada nova versão, são incorporados recursos valiosos ao produto, geralmente resultantes do “feedback” da comunidade de usuários. O Visual FoxPro 9.0, a nova versão da ferramenta cujo lançamento está previsto para o último trimestre de 2004, continua honrando essa tradição e trará recursos que tornarão os desenvolvedores ainda mais produtivos e capazes de entregar soluções mais poderosas e flexíveis.

Muitas são as novidades desta nova versão, e várias delas já poderão ser testadas na versão Beta, a ser disponibilizada publicamente na primeira metade de Junho/2004. Sendo assim, tentarei melhorar a leitura deste artigo organizando-o em tópicos correspondentes a cada principal área de destaque do Visual FoxPro 9.0 Beta. Falarei das melhorias no acesso e manipulação de dados; Ambiente Integrado de Desenvolvimento (IDE); Interface de Usuário e Relatórios. Além disso, também procurarei citar questões importantes de interoperabilidade, como integração com o .NET e manipulação de documentos XML.

Acesso e Manipulação de Dados

Um dos grandes diferenciais do VFP sempre foi o suporte nativo à linguagem SQL. Esse suporte foi bastante melhorado no VFP 9.0 Beta através da adição de mais recursos do padrão ANSI-92. Alguns deles são mostrados na Listagem 1 (todos os exemplos são baseados no database Northwind, distribuído com o VFP).

Listagem 1. Seleção do total de pedidos por cliente usando subqueries nas cláusulas FROM e SELECT.

        *--
        *-- Total dos pedidos por cliente (usando sub-query na cláusula FROM)
        *--
        SELECT Cust.CustomerID, Cust.CompanyName, Soma.SomaPedidos ;
        FROM Customers Cust LEFT JOIN ;
        ( ;
        SELECT CustomerID, ;
        SUM(I.Quantity * I.UnitPrice) as SomaPedidos ;
        FROM Orders P INNER JOIN OrderDetails I ;
        ON P.OrderId = I.OrderId ;
        GROUP BY CustomerID ;
        ) as Soma ;
        ON Soma.CustomerID = Cust.CustomerID
        *--
        *-- Total dos pedidos por cliente (usando sub-query na cláusula SELECT)
        *--
        SELECT Cust.CustomerID, Cust.CompanyName, ;
        ( ;
        SELECT SUM(I.Quantity * I.UnitPrice);
        FROM Orders P INNER JOIN OrderDetails I ;
        ON P.OrderId = I.OrderId ;
        WHERE P.CustomerID = Cust.CustomerID ;
        ) as SomaPedidos ;
        FROM Customers Cust
        

As consultas da Listagem 1 realizam o mesmo trabalho: obter o total dos pedidos por cliente. Entretanto, elas ilustram duas novas possibilidades do comando SELECT-SQL no VFP 9.0 Beta: a utilização de “subqueries” (consultas aninhadas) nas cláusulas SELECT e FROM. Outras melhorias incluem:

  • Múltiplas subqueries aninhadas;
  • Subqueries na cáusula WHERE, no formato: [ ALL | ANY | SOME] (Subquery);
  • Subqueries na cláusula SET em comandos UPDATE-SQL;
  • UNION em construções INSERT INTO ... SELECT ...;

Além das melhorias funcionais na sintaxe do SQL, o VFP 9.0 Beta conta ainda com as seguintes novidades em relação ao acesso a dados:

  • Novos tipos de dados: VARCHAR, VARBINARY e BLOB para o armazenamento de valores em colunas de tamanho variável e tipos binários puros;
  • Nova função CAST() para conversão dinâmica de dados;
  • Novo índice binário para fontes de dados nativas, que pode ser aplicado para colunas bi valoradas sem o efeito colateral causado nas versões anteriores do VFP (onde esse procedimento prejudicava a performance em cenários de acesso remoto;
  • Possibilidade de retornar um cursor a partir de stored procedures em um Database Container (DBC) que sejam acessadas através do novo OLEDB Provider do VFP 9.0 Beta;
  • Novas funções MAKETRANSACTABLE() e ISTRANSACTABLE(), que permitem habilitar e controlar transações em tabelas DBF livres, ou seja, sem necessidade de haver um DBC.

XML e Integração com o .NET

A versão anterior do Visual FoxPro, o VFP 8.0, foi sem dúvida responsável por um grande avanço na área de interoperabilidade e integração com o .NET Framework. O VFP 9.0 Beta traz várias melhorias em algumas das classes que desempenham um importante papel nesta integração: XMLAdapter, XMLTable e XMLColumn.

O suporte à geração de documentos XML hierárquicos, ou seja, documentos cujos dados relacionam-se entre si e cuja relação é determinada pelo aninhamento dos elementos dentro do mesmo (por exemplo, o relacionamento pai/filho) foi bastante melhorado nesta versão. Agora é possível determinar a forma como os diversos elementos do documento XML deverão estar aninhados. Isso proporciona enorme flexibilidade ao gerar documentos XML a partir de fontes de dados nativas e exportá-los para outras aplicações, ou ainda, para importar documentos com vocabulários diversos a fim de transformá-los mais facilmente em cursores nativos para manipulação no ambiente do VFPM.

O código da Listagem 2 apresenta um pequeno exemplo que ilustra a geração de um documento onde os itens pertencentes aos dados dos pedidos de venda estarão aninhados dentro dos elementos dos clientes correspondentes. A Figura 1 mostra o documento XML resultante da execução do código (neste, caso o esquema XSD foi omitido por razões de limitação de espaço).

Listagem 2. Exemplo de geração de um documento XML hierárquico que relaciona três tabelas.

        LOCAL loXA as XMLAdapter
        LOCAL loBrowser as InternetExplorer.Application
        LOCAL loExcecao as Exception
        LOCAL lcCliente as String
        TRY
        CLOSE DATABASES ALL
        *-- Abre as tabelas Orders e OrderDetails do database Northwind
        OPEN DATABASE _Samples + "Northwind\Northwind"
        *-- Vamos selecionar os dados do cliente CENTC
        lcCliente = "CENTC"
        *-- Seleciona o registro do cliente 'CENTC'
        SELECT CustomerID, CompanyName ;
        from Customers ;
        WHERE CustomerID = m.lcCliente INTO CURSOR Clientes READWRITE
        *-- Seleciona os pedidos do cliente
        SELECT OrderId, CustomerID, OrderDate ;
        FROM Orders ;
        WHERE CustomerID = m.lcCliente INTO CURSOR Pedidos READWRITE
        *-- Seleciona os itens dos pedidos
        SELECT I.OrderID, I.ProductId, I.UnitPrice, I.Quantity ;
        FROM OrderDetails I LEFT JOIN Orders P;
        ON I.OrderID = P.OrderID ;
        WHERE P.CustomerID = m.lcCliente INTO CURSOR Itens READWRITE
        *--
        *-- Estabelece um relacionamento entre os cursores.
        *-- Isto será importante mais tarde quando formos serializar
        *-- o documento XML através do método XMLAdapter.ToXML()
        *--
        SELECT Itens
        INDEX ON OrderID TAG OrderID
        SELECT Pedidos
        INDEX ON CustomerID TAG CustomerID
        SET RELATION TO OrderID INTO Itens IN Pedidos
        SET RELATION TO CustomerID INTO Pedidos IN Clientes
        *--
        *-- Configura o objeto XMLAdapter
        *--
        loXA = CREATEOBJECT("XMLAdapter")
        *-- Indica que o aninhamento será respeitado no documento XML final
        loXA.RespectNesting = .T.
        *-- Adiciona as tabelas à coleção Tables
        loXA.AddTableSchema("Clientes")
        loXA.AddTableSchema("Pedidos")
        loXA.AddTableSchema("Itens")
        *-- Gera um documento XML a partir das tabelas
        loXA.ToXML("\PedidosItens.Xml",,.T.)
        *-- usa o navegador para apresentar os dados do XML
        loBrowser = CREATEOBJECT("InternetExplorer.Application")
        loBrowser.Navigate("\PedidosItens.Xml")
        loBrowser.Visible = .T.
        CATCH TO loExcecao
        MESSAGEBOX("Erro: " + TRANSFORM(loExcecao.ErrorNo) + ". " + loExcecao.Message)
        FINALLY
        IF USED("Clientes")
        USE IN Clientes
        ENDIF
        IF USED("Itens")
        USE IN Itens
        ENDIF
        IF USED("Pedidos")
        USE IN Pedidos
        ENDIF
        CLOSE DATABASES ALL
        STORE Null to loXA, loBrowser
        ENDTRY
        
Documento XML hierárquico relacionando três tabelas.
Figura 1. Documento XML hierárquico relacionando três tabelas.

Ambiente Integrado de Desenvolvimento

Um grande benefício oferecido aos desenvolvedores VFP a cada nova versão do produto consiste nas ferramentas de produtividade, como a Code Referentes, Toolbox, Task Pane e muitas outras. O VFP 9.0 Beta acrescenta uma nova ferramenta, chamada Data Explorer (Figura 2), disponível através da Task Pane ou da aplicação “DataExplorer.App” no diretório-raiz do VFP. A Data Explorer apresenta uma interface bastante completa para os bancos de dados existentes nos servidores SQL Server e fontes de dados nativas ou disponíveis através de OLEDB Providers. Uma vez configurada, a conexão dará acesso às tabelas, stored procedures, funções e vários outros objetos da fonte de dados em questão.

Nova ferramenta Data Explorer do Visual FoxPro 9.0 Beta
Figura 2. Nova ferramenta Data Explorer do Visual FoxPro 9.0 Beta

O mais empolgante de tudo isso é que o código-fonte dessas ferramentas está totalmente disponível para o desenvolvedor, o que permite estender ainda mais as suas funcionalidades e aprender a efetuar várias tarefas interessantes no Visual FoxPro.

No que se refere aos editores de código, O VFP 9.0 Beta suporta compilação em background no momento da edição do código. A sintaxe da instrução corrente é destacada para indicar se existem problemas com a formação da mesma.

A janela de propriedades também recebeu melhorias e conta agora com uma nova guia chamada “Favorites” (favoritos), que permite separar os PEMs de acordo com o gosto do desenvolvedor. Agora, você também pode configurar as fontes e cores de cada tipo de PEM apresentado (Figura 3).

 Nova Janela de Propriedades: nova guia “Favorites”; configuração de cores, fontes e a propriedade _MemberData.
Figura 3. Nova Janela de Propriedades: nova guia “Favorites”; configuração de cores, fontes e a propriedade _MemberData.

Como você pode notar na Figura 3, a nova guia “Favorites” pode receber diversos itens e, além disso, permite mudar a apresentação dos nomes desses itens, como foi feito com a propriedade customizada “MinhaPropriedade”. Nas versões anteriores do VFP, as propriedades e métodos incluídos pelo desenvolvedor eram apresentados em letras minúsculas. No VFP 9.0 Beta, você pode especificar como deseja que elas sejam apresentadas. Todo esse nível de customização é possível através da adição de uma propriedade especial denominada “_MemberData” (Figura 3). Essa propriedade pode conter um documento XML com um vocabulário especial que determinará diversas configurações dos itens da Property Window, permitindo até que você especifique uma ação a ser executada quando ocorrer um duplo clique sobre uma propriedade ou método customizado - ótimo para um Builder, não é mesmo? A Listagem 3 mostra um documento XML simples que pode ser usado como conteúdo da propriedade _MemberData.

Listagem 3
Listagem 3. Exemplo de um documento XML que pode ser usado na propriedade _MemberData

Interface Gráfica de Usuário

  • Os formulários podem ser “docáveis” (ancoráveis) e incorporados uns aos outros, como já acontecia em algumas janelas da IDE das versões anteriores;
  • Agora, o controle TextBox suporta a funcionalidade de “autocomplete” (Figura 4), que habilita a apresentação dos valores anteriormente digitados no campo através de uma lista de seleção. Esse recurso assemelha-se ao existente na Barra de Endereços do navegador Internet Explorer e sua arquitetura abre uma grande gama de possibilidades para customização;
    Controle TextBox
    Figura4. O controle TextBox agora suporta “autocomplete”.
  • Os controles podem ser ancorados em relação ao seu container, o que evita a necessidade de escrever código para seus eventos “Resize” para rearranjá-los no formulário toda vez que este for redimensionado;
  • Uma outra melhoria que deverá agradar aos veteranos e certamente evitará muitas dúvidas dos iniciantes é que agora é possível mudar o foco para um novo objeto a partir de um método associado ao evento “Valid”. Isso mesmo! Você não leu errado! Isto é possível no VFP 9.0 Beta. Você só precisa estar atento para não utilizar mais o método SetFocus(), mas sim a cláusula RETURN seguida de uma referência ao objeto para o qual você deseja dirigir o foco. Por exemplo: RETURN This.Parent.txtCodigo;
  • Os controles “Line” e “Shape” suportam a montagem de polígonos e curvas através de coordenadas cartesianas que você pode passar para a nova propriedade “PolyPoints”. Essas coordenadas serão interpretadas como pontos de uma reta ou como determinadores de uma curva de Bézier se a propriedade “LineSlant” possuir o valor “S” ou “s”;
  • É possível definir a figura a ser apresentada em um controle “Image” simplesmente atribuindo o conteúdo binário desta para a nova propriedade “PictureVal” do controle. Obviamente, a fonte de dados para esta propriedade pode ser um campo de uma tabela que suporte conteúdo binário, tal como GENERAL NOCPTRANS, ou o novo tipo BLOB. A linha a seguir mostra como esta atribuição pode ser feita diretamente a partir do conteúdo binário de um arquivo em disco.
    
                    Thisform.imgFoto.PictureVal = FILETOSTR("MinhaFoto.Jpg")
                    

Report Designer

Certamente esta é a área que mais foi melhorada nesta nova versão do Visual FoxPro. As ferramentas do Report Designer foram praticamente reescritas, e o que é melhor: por meio de código VFP e compiladas em aplicações nativas. Na realidade, a Microsoft criou uma nova arquitetura para o subsistema de relatórios do VFP 9.0 Beta, o que proporcionará maior flexibilidade e poder para o desenvolvedor.

Temos novidades tanto nas ferramentas de tempo de projeto quanto nas funcionalidades de tempo de execução. Neste último caso, a Microsoft incorporou o conceito de “Listeners. Os “Listeners” são objetos que podem “ouvir” os eventos de saída da renderização de um relatório. Existem “listeners” padrões que já vêm com o produto e os quais podemos estender através de herança, criando nossos próprios listeners customizados e utilizando-os isoladamente ou em cadeia (para que possam ser usados em conjunto). A classe-base “ReportListener” pode ser utilizada facilmente para emitir relatórios já existentes, como mostra a Listagem 4:

Listagem 4. Os relatórios podem ser emitidos através de um ou mais Listeners.

        oListener = CREATEOBJECT("ReportListener")
        oListener.ListenerType = 1
        REPORT FORM MeuReport.Frx OBJECT oListener
        

É importante ressaltar que a classe ReportListener possui uma série de PEMs que permitem manipular a forma como o relatório será emitido. Um dos Listeners padrão, o XMLListener, é capaz de gerar uma representação da saída do relatório em formado XML, o que pode facilitar a transmissão deste relatório para outras plataformas ou mesmo a sua transformação para HTML através de XSLT, por exemplo.

Recursos da Linguagem

As construções WITH ...ENDWITH e FOR... EACH agora suportam Intellisense. Este era um pedido antigo dos usuários, desde que estes comandos foram introduzidos no VFP. (Veja a Figura 5).

 A construção WITH ... ENDWITH agora suporta Intellisense.
Figura 5. A construção WITH ... ENDWITH agora suporta Intellisense.

Como tradicionalmente acontece a cada nova versão do Visual FoxPro, alguns limites também foram superados no VFP 9.0 Beta, tais como:

  • Os arrays agora podem ter até 2 GB em itens – o limite anterior era de 64 KB;
  • O nível máximo de aninhamento de procedimentos aumentou para 64.000. O limite anterior era de 128 níveis;
  • Os arquivos de programa não têm mais a limitação de tamanho de 64 KB.

Tablet PC

No Visual FoxPro 9.0 Beta, foram incorporadas novas funcionalidades para o trabalho com TabletPCs. A nova propriedade “DisplayOrientation” indica qual a orientação de vídeo do dispositivo, e a nova função ISPEN() identifica se o usuário interagiu com a aplicação através de uma caneta ou não.

Conclusão

Neste artigo, procurei abordar as melhorias mais significativas que serão incluídas na próxima versão do Visual FoxPro. Diante do grande número de novos recursos e da dificuldade de abordarmos todos eles em um único artigo, sugiro que você busque mais informações em outros artigos, fóruns de discussão, blogs e, obviamente, no Visual FoxPro Developer Center, na MSDN. Ken Levy, o VS Data Product Manager, tem publicado uma série de artigos sobre as novidades da nova versão neste site.