Fórum Formulas matematicas em Realtime #15653
12/02/2010
0
Fico no aguardo Jorge Krone
Jorge Silva
Curtir tópico
+ 0Posts
14/02/2010
Wesley Yamazack
O que você pode fazer é criar functions no seu banco de dados, com parametros e passar para elas os respectivos valores, mas assim teria que ter uma formula para cada empresa, e de sua aplicação executar estas functions. Qual BD você usa ? Sabe criar functions no seu BD ?
Ou então criar uma DLL com as formulas, e apenas consumir de sua aplicação, onde qualquer alteração que você tenha de fazer, basta atualizar na DLL, e enviar a mesma para seu cliente.
Isso lhe ajudaria ?
Um abraço
Wesley Y
Gostei + 0
15/02/2010
Jorge Silva
A meta principal e que o usuário defina como seus valores sejam calculados, digitando a formula e salvando em uma tabela, esta formula vai ser utilizada para chegar a um determinado resultado. Podemos tomar como idéia de exemplo uma expressão SQL que digitamos em um TEdit e depois executamos via ComandText de um TClientDataSet e obtendo o resultado desta expressão tudo em tempo de execução. Esta funcionalidade vai ser utilizada praticamente em toda a aplicação para diversos cálculos em diversas telas e se ficar dependendo de um programador ou DBA para toda alteração o processo fica amarrado, estas formulas tem que ficar como uma parametrização simples para o usuário final. A questão é como vincular um texto/valor de um campo ao códigos sem fixar uma quantidade de parâmetros ou operadores pois os campos podem ser somados, subtraidos, divididos ou multiplicados e o resultado ser salvo em outro campo.Qualquer duvida é só falar.
Gostei + 0
16/02/2010
Jorge Silva
Neste caso utilizei os valores 01 e 02 igorando o 03 e ainda inclui um valor fixo (10) subtraido da formula.
resumido seria um esquema assim.
Gostei + 0
17/02/2010
Wesley Yamazack
Vou precisar de um tempo para bolar uma rotina destas ok ? Quanto a imagem não apareceu aqui não, teria como mandar novamente?
Pelo que estou vendo você quer fazer um esquema tipo Excel, certo ?
A1 = Soma(a2:a9)+10*B7. Seria isso?
Um abraço
Wesley Y
Gostei + 0
17/02/2010
Jorge Silva
A1 = Soma(a2:a9)+10*B7
É Exatamente isso em vez de celulas seriam os valores dos campos do DataSet e as operações seriam as basicas(*-+/), neste caso o "A1" Seria a variavel a ser alimentada.
é isso mesmo entendeu a ideia é transferir a resposabilidade da formula para o usuario final. Beleza!!!
Gostei + 0
19/02/2010
Wesley Yamazack
Gostei + 0
19/02/2010
Jorge Silva
Qualquer duvida é só falar
Jorge
Gostei + 0
22/02/2010
Jorge Silva
Como está com o aplicativo ?
Gostei + 0
22/02/2010
Wesley Yamazack
Vou te falar que esta complicado fazer isso, teria como você me mandar um exemplo, do que exatamente você quer, pois achei que fazendo igual ao excel, seria facil, mas esta muito complicado. Não teria como "amarramos" alguma coisa, me manda ai um exemplo pra ficar mais facil.
Um abraço
Wesley Y
Gostei + 0
22/02/2010
Jorge Silva
Eu estava procurando se existe uma função para transformar string em parametro que pode-se se lido pelo codigo fonte mas não encontrei.
exemplo
Em um Tedit digitamos: VTotalItens + VFrete + VSeguro - 10
no codigo teria declaradas todas as variaveis possiveis
Var
XFormula, VTotalItens, VFret, VSegur, LBaseCalculo: String;
Begin
VTotalItens:=strtoint(Edit2.text);
VFrete :=strtoint(Edit3.text);
VSeguro :=strtoint(Edit4.text);
XFormula:=Edit1.text; {Neste momento converter o conteudo do edit1 em formula que seria lido no codigo}
LBaseCalculo:=XFormula; {Onde XFormula seria: VTotalItens + VFrete + VSeguro - 10}
end.
Como no edit1 já estaria todos os nomes das variaveis declaradas a serem utilizadas e as operações matematicas seria como um typecast ou uma conversão. tipo um StrToCodigo ou coisa parecida.
Deu para pegar a ideia ? o problema a ser resolvido é só fazer o sistema entender uma string como parte do código e executa-la.
fico no aguardo
Gostei + 0
24/02/2010
Jorge Silva
Tem boas noticias pra mim ?
Jorge
Gostei + 0
24/02/2010
Wesley Yamazack
Fazer o sistema entender uma string como parte de código é difícil, porque quando vc compilar sua aplicação tudo é transformado de ObjectPascal para Assembler .
O que você quer é complexo, não acho que haja uma solução muito simples para isso, mas vamos a algumas sugestões:
Permitir o usuário digitar a fórmula num campo aberto, por exemplo VALOR_MATERIAIS + IMPOSTO + 50 Depois você iria ter que interpretar essa fórmula percorrendo toda ela e identificando os operadores para realizar as operações matemáticas. Nesse caso você tem o risco do usuário fazer besteira e digitar o nome de um campo errado, comprometendo seu cálculo.
Você pode fornecer para o usuário uma interface para montagem das suas fórmulas, por exemplo, exibe um listBox com as possíveis variáveis e outro com os possíveis operadores e o usuário vai clicando duas vezes em cada um e a medida que ele clica você vai adicionando na fórmula. Nesse caso você também terá que ter a interpretação da fórmula para identificação dos operadores
quanto aos campos seriam só passar no FieldByName do dataset, o campo da fórmula
No caso 2 você você ganha em segurança pois evita que o usuário digite fórmulas mirabolantes que o sistema nção esteja preparado ou digite campos e operadores errados
Há de se lembrar ainda que se houver a possibilidade de inclusão de alíquotas, percentuais, valores, vai aumentar a complexidade destas situações, porém não vejo como fazer o que você deseja de outra forma que não seja a leitura da fórmula, interpretação da mesma para posterior cálculo
Outra complexidade que precisa ser analisada é a ordem de execução, primeiro multiplicação, depois soma, além de possíveis parênteses na fórmula
A forma de armazenar isso no banco vai variar de acordo com suas possibilidades de fórmula
se vai ser por usuário
por empresa
por filial
por contrato
É complexo mas é possível
E infelismente não vejo outra forma senão esta, armazendando a fórmula e interpretando a mesma quando for realizar o cálculo.
Um abraço
Wesley Y
Gostei + 0
24/02/2010
Jorge Silva
A questão de transformar String para código foi só uma idéia, uma possibilidade, pois a formula não pode nem deve ser inserida no momento da compilação, mas foi só uma maneira de ilustrar
O que você quer é complexo, não acho que haja uma solução muito simples para isso, mas vamos a algumas sugestões:
Permitir o usuário digitar a fórmula num campo aberto, por exemplo VALOR_MATERIAIS + IMPOSTO + 50 Depois você iria ter que interpretar essa fórmula percorrendo toda ela e identificando os operadores para realizar as operações matemáticas. Nesse caso você tem o risco do usuário fazer besteira e digitar o nome de um campo errado, comprometendo seu cálculo.
Você pode fornecer para o usuário uma interface para montagem das suas fórmulas, por exemplo, exibe um listBox com as possíveis variáveis e outro com os possíveis operadores e o usuário vai clicando duas vezes em cada um e a medida que ele clica você vai adicionando na fórmula. Nesse caso você também terá que ter a interpretação da fórmula para identificação dos operadores
A questão de erros do usuário é quase certa, mas contornável, pois a responsabilidade seria do próprio usuário e as correções seriam dadas em forma de suporte, a interface para criação de formulas já é a idéia inicial que não foi exposta para não entrar no mérito de duas aplicações uma para escrever e outra para ler, mas lógico que vai ser criado um gerador de formulas para minimizar os erros.
quanto aos campos seriam só passar no FieldByName do dataset, o campo da fórmula
No caso 2 você ganha em segurança pois evita que o usuário digite fórmulas mirabolantes que o sistema não esteja preparado ou digite campos e operadores errados
Há de se lembrar ainda que se houver a possibilidade de inclusão de alíquotas, percentuais, valores, vai aumentar a complexidade destas situações, porém não vejo como fazer o que você deseja de outra forma que não seja a leitura da fórmula, interpretação da mesma para posterior cálculo
Outra complexidade que precisa ser analisada é a ordem de execução, primeiro multiplicação, depois soma, além de possíveis parênteses na fórmula
A forma de armazenar isso no banco vai variar de acordo com suas possibilidades de fórmula
se vai ser por usuário
por empresa
por filial
por contrato
É complexo mas é possível
E infelizmente não vejo outra forma senão esta, armazenando a fórmula e interpretando a mesma quando for realizar o cálculo.
Armazenar a formula é a exatamente a intenção, pois seria inviável toda vez para realização de um calculo redigitar a formula toda, o vinculo vai ser feito de diversas formas vamos tomar como base a seguinte: preencho uma tela com valores(ex: Nota Fiscal), no momento do calculo em um dbLookupcombobox escolho a formula que quero usar, estas formulas já foram cadastradas pelo usuário anteriormente e armazenadas em uma tabela.
agora como seria interpretar Esta formula salva em um campo e gerar um resultado a partir dela.
me dê um exemplo simples que depois programamos as mais complexas. na verdade esta funcionalidade é só uma entre muitas em um sistema bem maior
Obrigado pela atenção.
Jorge
Gostei + 0
24/02/2010
Jorge Silva
Abaixo uma tela utilizada em um ERP produzido e amplamente utilizado
Onde:
Código seria a primary key da formula;
algumas paramentrizações;
o campo formula onde seriam indicados os calculos a serem feitos
note que os valores são indicados por códigos, Exemplo: &1018, &1027
em um determinado momento o codigo da formula (Ex:100,101,102)é indicado e realizada a interpletação da formula gerando um resultado.
Gostei + 0
25/02/2010
Wesley Yamazack
Estou analisando seu chamado, porém devido a complexidade estou levando um pouco de tempo, em breve retornarei com uma resposta, peço que aguarde.
Um abraço
Wesley Y
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)