Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Capturar em um select o valor de soma de coluna feito em outro select


Lazaruz

Pergunta

   Será que estou fazendo certo?

                              //Objetivo : fazer update de um resultado de uma soma anteriormente feita  na mesma tabela.
                                //tbresult é uma tabela normal criada em tempo de execução.
                                //Tem 3 registros com ocorrencias de idNC = 27 na tabela tbresult
                                //Criei uma tabela temporaria so para armazenamento de valor da soma porque SQLite não declara procedure.

procedure TfLISTA.calcula(Sender: TObject);
begin

                           //CRIO A TABELA VIRTUAL TEMPORARIA QUE USO SO PARA ARMAZENAR A SOMA:
         Dtm.ZQryResult.sql.clear;
         Dtm.ZQryResult.sql.add('CREATE TEMP TABLE IF NOT EXISTS tbtempor(totcoluna FLOAT); ');
         Dtm.ZQryResult.ExecSQL;

                                   
       with Dtm.ZQryResult do          //Faco tudo nesta  nesta Query
       begin;

                close;
                                      //FACO A SOMA CRIANDO UM CAMPO ALIAS
                sql.clear;
                sql.add('SELECT id,idNC, SUM(valorX)   AS  total    FROM   tbresult WHERE idNC = 27 ;');
                open; //Ok
 
                                        //ARMAZENO A SOMA NA TBTEMPORARIA:

                sql.clear;                                                                     //VALUES(totcoluna)
                sql.add('INSERT OR REPLACE INTO tbtempor VALUES(SELECT total FROM tbresult WHERE idNC = 27); ');
                ExecSQL; //Ok com um valor fixo ex...values(1234)  mas com a expressao do sub select acima não vem nada


                  //TENTO FAZER UPDATE DO RESULTADO DA SOMA  (que já deve esta na tbtempor)    NA COLUNA TOTAL(já existente e não virtual e nem como alias)     DA    TBRESULT

                sql.clear;                         
                sql.add('UPDATE tbresult SET total = (SELECT totcoluna FROM tbtempor) WHERE idNC = 27;');
                ExecSQL;
        


                      //SELECT DE VISUALIZACAO NO GRID
                sql.clear;
                sql.add('select * from tbresult; ');
                open;

 

         
        end;//QueryResult
      
end;//Procedur


           //RESUMINDO: Se eu colocar um valor VALUES(1234) O GRID TRAZ
                        MAS SE EU COLOCAR: VALUES(SELECT total FROM tbresult WHERE idNC = 27) na TBTEMPOR,  
                        não VEM NADA.

 

 

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Bem.... então eu mesmo respondo a questão:

procedure TfLISTA.calcula(Sender: TObject);
begin

                //CRIO A TABELA VIRTUAL TEMPORARIA QUE USO SO PARA ARMAZENAR A SOMA:
    Dtm.ZQryResult.sql.clear;
    Dtm.ZQryResult.sql.add('CREATE TEMP TABLE IF NOT EXISTS tbtempor(totcoluna FLOAT); ');
         Dtm.ZQryResult.ExecSQL;

                                   
       with Dtm.ZQryResult do          //Faco tudo nesta  nesta Query
       begin;

                close;

-----------------------------------------------ELIMINO  O BLOCO ABAIXO------------------------------------------------

 Não é nescessário porque eu faço a soma aonde eu preciso (no caso na inclusao da tbtempor)

                                                                 e o campo alias não servira para pegar de outro select.


                                      //FACO A SOMA CRIANDO UM CAMPO ALIAS total
       //   sql.clear;
       //  sql.add('SELECT id,idNC, SUM(valorX)   AS  total    FROM   tbresult WHERE idNC = 27 ;');
      //   open;
 

-------------------------------------FACO A SOMA AQUI MESMO COM valorX-------------------------------------------


                                         //ARMAZENO A SOMA NA TBTEMPORARIA:

 sql.clear;                                                                 
sql.add('INSERT OR REPLACE INTO   tbtempor  (totcoluna)   VALUES ((SELECT SUM(valorX)   FROM   tbresult WHERE idNC = 27)); ');


  ----------------FAÇO UPDATE  NA COLUNA TOTAL JÁ EXISTENTE  NA  TBRESULT --------------------

  sql.clear;                         
 sql.add('UPDATE tbresult SET total = (SELECT totcoluna FROM tbtempor) WHERE idNC = 27;');
                ExecSQL;
        

---------------------------------- OK  AGORA É SÓ VISUALIZAR --------------------------------------------------------------
                                                    //SELECT DE VISUALIZACAO NO GRID
                sql.clear;
                sql.add('select * from tbresult; ');
                open;

      
        end;//QueryResult
      
end;//Procedur


           //RESUMINDO:  Um campo criado como ALIAS não serviria para calculo porque ele só processa no próprio select ativo.

   Para quem esta iniciando como eu fica ai a dica do erro.
 

Editado por Lazaruz
gramatica
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...