|
Utilizando expressões em DEOs

Com certeza você já deve ter visto a tela
acima ao desenvolver com o Visual DataFlex. Entretanto são
poucos os desenvolvedores que se atentam para o poder da
opção Expression or Variable. Você
conhece esta opção?
Este pequeno artigo irá mostrar como esta poderosa
opção pode ser utilizada.
Ela só pode ser usada em objetos data-aware, ou
seja, dbForm, dbComboForm, dbSpinForm, dbGrid, etc. Ao marcar
a opção Expression or Variable, em vez de
escolhermos um arquivo e campo para ser exibido no DEO,
colocamos o nome de uma variável ou uma expressão,
cujo valor deverá ser exibido no DEO.
Até aí muito intuitivo! O que não
é muito intuitivo é: Quando o valor será
atualizado?
O valor do DEO que utiliza uma expressão ou variável
será atualizado da mesma maneira que seria atualizado
se estivesse com um arquivo e campo, ou seja, quando o DDO
Server solicitar a atualização do DEO devido
a uma limpeza de tela, gravação ou pesquisa
de registro.
Vamos demonstrar o funcionamento desta opção
através do desenvolvimento de um recurso muito útil.
Abra o Studio e selecione a Workspace Order.
Abra a View Order.vw:

Arraste um dbForm para a View. Posicione-o ao lado esquerdo
do Order Total.

O objetivo deste Form será exibir a quantidade de
itens do pedido, ou seja, a soma do valor dos campos da
coluna Quantity.
Muitos desenvolvedores gastam várias horas tentando
ler e somar "manualmente" de formas muito mais
trabalhosas. A forma mais usada é redefinir a Entry_Display
da dbGrid e, a cada passagem, acumular o valor em uma propriedade
ou variável global. O problema é que a dbGrid
só lerá os registros necessários para
preencher o espaço disponível na tela. Por
isto, é um lugar contra-indicado para fazer este
acúmulo.
Já a opção de usar uma expressão
é a melhor forma, pois sempre que o pedido for salvo
ou posicionado, a expressão será avaliada.
Melhor ainda: quando esta expressão for avaliada,
o registro acabou de ser posicionado e, portanto, podemos
consultar a informação diretamente do buffer
do registro DataFlex, se necessário.
Sendo assim, o que temos que fazer é criar a função
abaixo dentro do objeto dbForm (antes da linha verde) e
chamá-la a partir da expressão:
Function TotalItens Returns Integer
Integer iTotalItens iRec
If (OrderHea.Order_number
> 0) Begin
// Se há um pedido posicionado
// Guardando o Recnum do registro
posicionado para restaurar
Move Orderdtl.Recnum To iRec
Clear Orderdtl
Move OrderHea.Order_number To
Orderdtl.Order_number
Find Ge Orderdtl.Order_number
While (Found And Orderdtl.Order_number
= Orderhea.Order_number)
Move (Orderdtl.Qty_ordered
+ iTotalItens) To iTotalItens
Find Gt Orderdtl.Order_number
Loop
// Reposicionando o arquivo Orderdtl
Clear Orderdtl
Move iRec To Orderdtl.Recnum
Find Eq Orderdtl By Recnum
End
Function_Return iTotalItens
End_Function
Finalizando, abra a janela de propriedade e acrescente
a seguinte expressão para o dbForm:

Pronto! Agora é só testar...

|