Calculo direto no Select

MySQL

17/02/2014

Olá a todos!

Estou com uma dúvida no MySQL e na pesquisa não encontrei nenhuma luz para essa dúvida.

Ocorre que preciso realizar um calculo de fórmulas definidas pelo usuario do sistema.

Criei 4 colunas que se destinam aos operadores + - * / e outras 4 colunas que se destinam ao valor para compor essa formula:


OPERADOR_1 = pode ser + - * ou /
OPERADOR_2 = pode ser + - * ou /
OPERADOR_3 = pode ser + - * ou /
OPERADOR_4 = pode ser + - * ou /

e 4 campos para valores

VALOR_1
VALOR_2
VALOR_3
VALOR_4

Essa tabela destina-se a inserir formulas pelo usuário, por exemplo:

100 * 12 / 10 + 100 - 20

Espero ter sido calor em minha solicitação. Abraços a todos!
Marcelo Pereira

Marcelo Pereira

Curtidas 0

Respostas

Marisiana Battistella

Marisiana Battistella

17/02/2014

Bom dia Marcelo!
Acho que não ficou bem claro pra mim, vc pretende armazenar a fórmula na tabela ou o resultado da fórmula?
GOSTEI 0
Marcelo Pereira

Marcelo Pereira

17/02/2014

Bom dia Marcelo!
Acho que não ficou bem claro pra mim, vc pretende armazenar a fórmula na tabela ou o resultado da fórmula?


Bom dia! preciso na verdade que o usuário abasteça essa tabela com as equações pertinetes a certos indicadores. Por exemplo:

Valor Apple = 300 / 3 * 120

O fato é que preciso que esse resultado seja gerado via SELECT no MySQL, só que os operadores da equação podem ser variados, de acordo com a necessidade do cliente.

Por isso imaginei criar uma coluna para cada valor e operador.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

17/02/2014

Mas vc não tem como prever o tamanho da fórmula que ele vai informar? Porque pode ser q uma contenha 3 operadores, outra 5, assim por diante.
Então, acredito que vai ficar difícil criar uma coluna pra cada valor.
Não seria melhor armazenar a fórmula como uma string em uma única coluna?
GOSTEI 0
Marcelo Pereira

Marcelo Pereira

17/02/2014

Mas vc não tem como prever o tamanho da fórmula que ele vai informar? Porque pode ser q uma contenha 3 operadores, outra 5, assim por diante.
Então, acredito que vai ficar difícil criar uma coluna pra cada valor.
Não seria melhor armazenar a fórmula como uma string em uma única coluna?


Nesse caso felizmente existe uma limitação sim, e esta em 4 valores para até 3 operadores. O MySQL não reconhece um SELECT para os valores e os operadores empregados.

Ex: SELECT valor_1 operador_1 valor_2 FROM My_tabela - nesse caso ele deve reconhecer o operador inserido na coluna.

normalmente o MySQL aceita somente assim: SELECT valor_1 * valor_2 FROM My_tabela

Alguma luz?
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

17/02/2014


Ex: SELECT valor_1 operador_1 valor_2 FROM My_tabela - nesse caso ele deve reconhecer o operador inserido na coluna.


Nesse caso que vc exemplificou, não está faltando concatenar os valores?

Vi neste link que no mysql se utilizar a função concat [url]http://paposql.blogspot.com.br/2011/11/concatenando-campos-no-mysql.html[/url]
GOSTEI 0
Marcelo Pereira

Marcelo Pereira

17/02/2014


Ex: SELECT valor_1 operador_1 valor_2 FROM My_tabela - nesse caso ele deve reconhecer o operador inserido na coluna.


Nesse caso que vc exemplificou, não está faltando concatenar os valores?

Vi neste link que no mysql se utilizar a função concat [url]http://paposql.blogspot.com.br/2011/11/concatenando-campos-no-mysql.html[/url]


Essa formula só precisa retornar o resultado. Ex: 300 / 3 * 10 = 1000. minha dificuldade é que o MySQL retorne apenas esse total levando em consideração os operadores inseridos nas colunas.
GOSTEI 0
Fabiano Carvalho

Fabiano Carvalho

17/02/2014

Coloque o valor do calculo em uma varivel e execute essa variavel.
nao sei fazer em mysql só em sql server.
Mas a ideia é essa.
GOSTEI 0
Alex Lekao

Alex Lekao

17/02/2014

Me interessei pelo Post... rsrsr

Vc quer que o resultado seja uma formula nao um calculo, certo?

Nesse caso acredito que vc tera que usar a concatenacao conforme a Marisiana indicou.

A ultima informacao que eh o resultado do calculo na formula tambem eh uma coluna?

Se for a concatenacao ja resolvera, caso contrario teria que fazer como o Fabiano sugeriu, pegar os conteudos e armazenar em uma variavel e fazer o calculo para apresentar o resultado.

Mas de qqr forma acredito que havera um outro problema que sera a ordem dos operadores para se encontrar o resultado esperado, acredito que podera influenciar tbm no exito do que vc quer.

Bom, espero ter ajudado.

Abraco.

Alex - Lekao
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

17/02/2014

Se ele precisa utilizar a fórmula para realizar o cálculo, acredito q só conseguirá fazendo da forma que o Fabiano sugeriu.

Vou compartilhar minha idéia...
Ele pode armazenar as informações na tabela da forma sugerida e para realizar o cálculo ele teria que pegar todos os registros de um determinado id e atribuir o valor de cada coluna para variáveis diferentes. A ordem dos valores e dos operadores na hora que ele for montar a fórmula deverá obedecer a ordem das colunas da tabela, conforme ele definiu: VALOR_1, OPERADOR_1, VALOR_2, OPERADOR_2, VALOR_3,....

Em seguida, cria uma estrutura de controle verificando as possibilidades de operadores armazenados:

OPERADOR_1 = pode ser + - * ou /
OPERADOR_2 = pode ser + - * ou /
OPERADOR_3 = pode ser + - * ou /
OPERADOR_4 = pode ser + - * ou /

Não sei se minha lógica está correta...
GOSTEI 0
Alex Lekao

Alex Lekao

17/02/2014

Acredito que sim.

Mas achei meio complicado o que esta querendo fazer.

Pq vc for colocar soma subtracao e divisao juntos as ordens das operacoes sao feitas na ordem correta pelo banco independente de que posicao sejam colocadas, alem que se quiser calcular alguma primeiro tera que colocar com parenteses.

Achei meio complicado isso viu.

Vou acompanhar o post para ver o que resolve. rsrsr
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

17/02/2014

Pra dar certo ele teria q sempre armazenar a fórmula na ordem correta que deverá ser executada.
Por exemplo: 100 * 12 / 10 + 100 - 20
Será resolvida como (((100 * 12) / 10) +100 ) - 20 = 200
Ele teria que ir lendo os valores na ordem das colunas e resolvendo utilizando um acumulador que no final conterá o resultado.
Não poderá inverter a ordem de resolução pois é uma fórmula pré-definida (pelo menos foi isso que entendi)...
GOSTEI 0
Alex Lekao

Alex Lekao

17/02/2014

Sim.

Se for pre-definida sim, tem que estar fixo.

Mas ele havia postado alguma coisa de que o usuario informaria alguma coisa, nao lembro exatamente o que.

Se isso por acaso mudar o padrao, ja era, vai dar errado. rsrs

Aqui ja fiz alguns relatorios com formulas pre definidas, coloquei informacao na chamada do relatorio que alguns campos sao obrigatorios e o pessoal consegue nao informar ou informar errado... rsrsr

entao... acho que uma hora vai dar problema. rsrsr

sou pessimista nesse caso... rsrsr
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

17/02/2014

Não sei se é a melhor forma de fazer....
Mas pensei nessa alternativa, porque não teria lógica ele armazenar cada membro que compõe a fórmula em colunas separadas se não for pra utilizar dessa forma.
Porque, se além de tudo isso, ele tiver que verificar a ordem que a fórmula deverá ser resolvida, ele teria que armazenar parenteses, etc...
Caso contrário ele poderia armazenar a fórmula toda em uma única coluna....
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

17/02/2014

Mas está certo em ser pessimista, porque a gente tem q imaginar todas as possibilidades....
Tentei contribuir, não sei se ajudei, confundi, ou só atrapalhei... =D
GOSTEI 0
Alex Lekao

Alex Lekao

17/02/2014

sim...

acabaria voltando a uma das sugestoes do inicio. rsrsr

mas tudo vai depender da logica de programacao q ele vai usar e ai ja eh "misterio"... rsrsr

eu sou extremamente pessimista qdo se trata de usuario... rsrsr

mas vc com certeza ajudou.

GOSTEI 0
Marisiana Battistella

Marisiana Battistella

17/02/2014

Tem que ser né?! Porque se existir uma única possibilidade do usuário fazer errado, pode crer que ele vai fazer... rsrsrs
GOSTEI 0
Alex Lekao

Alex Lekao

17/02/2014

Nossa...

e como conseguem ne???

eu vivencio isso quase todos os dias... rsrsr

GOSTEI 0
Marisiana Battistella

Marisiana Battistella

17/02/2014

Aham, as vezes é inacreditável... =D
GOSTEI 0
POSTAR