O uso de fórmulas é bastante usado pelos aplicativos do GAS.
Nosso problema aqui é que normalmente as fórmulas são resultados de alguma busca de informações no banco de dados.
Imagine a seguinte situação:
Você tem um grid e nele você coloca o código do produto , descrição ,quantidade e valor, você deseja que ao digitar o código a descrição e o valor aparecam automaticamente,
bem isto é normal numa aplicação windows, porém na WEB este simples processo pode ser muito custoso. Veja que a cada código digitado precisamos ir no servidor, localizar o produto,
pega as informações e atualizar novamente na tela.
Esta sem dúvida seria a pior maneira de fazer isso, então como fazer fórmulas na web com o GAS?
Nós pensamos , vamos deixar uma tabela em memória , que seria a tabela auxiliar de produtos. Mas você já pensou se tivesse 1 milhão de registros ?, inviável né?
Então nossa única solução era tentar ir no servidor o mínimo possível e de forma assyncrona e manter estes dados no cliente, para que através de javascript nós pudessemos
capturar os valores necessários.
A forma que criamos isso foi a seguinte:
1-Criamos uma espécie de tabela auxiliar com as informações que são necessárias para a fórmula, no nosso exempo teria a descrição ,valor e código(para fazer a busca)
2-Disparamos um Evento toda vez que o código é digitado no GRID, desta forma atualizamos a informação desta tabela auxiliar
3-Quando a coluna que recebe a fórmula entra em foco nós pegamos no javascript os valores e motramos nela.
Código abaixo atualiza a tabela auxiliar das formulas
function HandleExitEditMode(sender,cell)
{
var row = gGrid_getRowById(cell);
if (row.IsFilterRow) return;
var selectedcol = gGrid_getGridById(sender).oActiveCell.Column.Key;if (selectedcol == "Codigo")
{
var textFind = row.getCellFromKey("Codigo").getValue();
TableAux(textFind); //aqui vamos atualizar a tabela auxiliar
}
else
{
ShowFormula(null, null, null, "gGridItens");
}
Abaixo a função que dispara o código do servidor trazendo os dados do produto
function TableAux(text){ vgTbAux.RequestItems(text, false);
}
Código que mostra os valores de fórmulas no grid.
function ShowFormula(first, second, third, sender)
{
var gridID = sender;
var grid = gGrid_getGridById(gridID)
var cell = grid.ActiveCell;var row = gGrid_getRowById(cell);
if (row.IsFilterRow) return;
var rowTotal = row.getCellFromKey("Valor").getValue() * row.getCellFromKey("Quantidade_Entrada").getValue();if (typeof(vgTbAux.Items[0]) != "undefined" && (row.getCellFromKey("Valor").getValue() == null || row.getCellFromKey("Valor").getValue() == 0))
{
row.getCellFromKey("Valor").setValue(vgTbAux.Items[0].Value);
}
row.getCellFromKey("Total").setValue(rowTotal.toString());
//atualiza o summary
var rows = grid.Rows;
var vgcell = gGrid_getCellById(row.getCellFromKey("Total").Id);
var column = vgcell.Column;
var colTotal = 0;if (rows.length >= 1)
{
for (var i = 0; i < rows.length; i++)
{
colTotal += rows.getRow(i).getCellByColumn(column).getValue();
}
var vgcell = gGrid_getElementById(row.getCellFromKey("Total").Id);if (vgcell.parentNode.parentNode.nextSibling)
{
var footer = vgcell.parentNode.parentNode.nextSibling.childNodes[0].childNodes[vgcell.cellIndex+1];footer.innerText = gGrid_Mask(gridID, colTotal.toString(), 14,
"$###,###,##0.00");
}
}
}