No evento SQL Connect 2007 (www.sqlconnect.com.br), ministrei uma palestra
sobre o poder do PSQL no Firebird. PSQL é a abreviação de Procedural SQL, ou seja, a linguagem de stored procedures e triggers do Firebird. Um dos exemplos apresentados mostrava a simulação de auto-refresh em aplicações feitas em Delphi acessando bancos Firebird. O exemplo foi criado originalmente para a primeira edição do FDD (Firebird Developers Day). Em 2005, foi melhorado e complementado, para ser apresentado na Conferência Internacional de Firebird, realizada em Praga. O exemplo mostrado no SQL Connect é justamente o que foi utilizado em Praga.
Praticamente todos os programadores já devem ter passado pela situação onde
muitos usuários (em rede) estão acessando, em um mesmo momento, as informações de uma mesma tabela, inserindo ou alterando os registros. O problema é que a maioria dos componentes de acesso a dados do Delphi “bufferiza” as informações na memória, o que é bom para a performance, mas impede que as alterações feitas pelos outros usuários sejam refletidas automaticamente, fazendo com que cada usuário tenha que atualizar os dados exibidos através de um refresh (geralmente clicando no respectivo botão no DBNavigator), quando quiser ter certeza de que as informações apresentadas na tela são as mais atuais.
O exemplo apresentado faz uso dos EVENTOS do Firebird para “avisar” as
aplicações que alguém mudou (alterou, inseriu ou apagou) alguma informação de uma determinada tabela. A aplicação Delphi captura esse evento, ou seja, é “avisada” sobre a alteração, e através de rotinas especificas verifica se deve ou não atualizar (refresh) as informações que estão sendo apresentadas na tela do usuário, para que ele possa ver as mudanças feitas pelos outros.
Entre as verificações que devem ser feitas, estão:
Alterações produzidas pelo próprio usuário devem ser ignoradas.
Se a tabela estiver sendo editada, ou seja, o usuário está manipulando informação, então o refresh deve ser abortado. Devemos ficar atentos para evitar gargalos de performance e afogamento do servidor ou da rede. Lembre-se que umrefresh em servidores SQL significa fazer um re-fetch, ou seja, trazer todas as informações do servidor para o cliente novamente.
A aplicação apresentada utiliza os componentes do IBO (InterBase Objects
– www.firebase.com.br/fb/IBO.php) para acesso aos dados. Outros componentes, como o IBX, UIB, etc. também oferecem componentes específicos para trabalhar com os eventos do Firebird. Infelizmente a Borland/CodeGear não disponibiliza um componente para eventos no seu driver dbExpress. Usuários dodbExpress acabam tendo que criar uma conexão secundária com o banco, usando outro componente de acesso que permita manipulação de eventos, a fim de receber as notificações enviadas pelo Firebird.
Os slides da apresentação podem ser vistos na 11ª edição da revista DB
FreeMagazine (www.dbfreemagazine.com.br) – download gratuito. O código dos exemplos e o banco de dados estão disponíveis para download no site da FireBase, mais especificamente em http://www.firebase.com.br/fb/downloads.php?id=274 . No arquivo podem ser vistos outros exemplos de procedures apresentadas na mesma palestra.