PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum SQL(consulta em 2 tabs-a soma elouqueceu!) #203549

30/12/2003

0

Olá a todos!
Feliz Ano Novo!

Estou com o seguinte problema em um relatório...

Eu tenho uma tabela de itens e uma tabela de lançamentos.
A tabela de lançamentos recebe os itens através de um dbLookupComboBox.
Nem todos os itens são lançados no mês e quando faço a consulta para o relatório ele exibe somente os itens lançados e seus respectivos valores.
Até ai tudo bem...
   ADOQuery.Close;
   ADOQuery.SQL.Clear;
   ADOQuery.SQL.Add(´SELECT ENTRADAS, TIPOENTRADA, ITEMENTRADA, ITEM, VALOR´);
   ADOQuery.SQL.Add(´From ItemEntrada,LancEntrada´);
   ADOQuery.SQL.Add(´Where ITEM = ITEMENTRADA´);
   ADOQuery.SQL.Add(´Order By ENTRADAS,TIPOENTRADA´);
   ADOQuery.Open;

{ITEM e VALOR são campos da tabela LancEntrada}


O que venho tentando fazer sem resultado positivo é exibir todos os itens da tebela de itens que não tenham sido lançados sem valor ou com valor zerado.

Usei esta cláusula do sql, que até exibe todos os itens (mesmo não lançados), mas o somatório enlouqueceu!
...
   ADOQuery.SQL.Add(´Where ITEM = ITEMENTRADA or ITEM <> ITEMENTRADA´);
...


Para cada item não lançado o valor associado deveria ser ZERO ou nenhum, mas o que aparece é o somatório de todos os itens lançados.
ex.:
lancei CERVEJA, e COCACOLA (2,00 e 2,50(entrada manual de valor))
não lancei GARANÁ.
resultado:
CERVEJA 2,00
COCACOLA 2,50
GARANÁ 4,50 (deveria ser 0,00 ou vazio)

O relatório que estou fazendo é agrupado e utiliza RAVE via código.
segue detalhe do código...

Var SomaTotal : Double;
    SomaENTRADA, SomaTIPO, SomaITEM : Double;
    iENTRADA  : String;
    iTIPO    : String;
    iITEM    : String;
Begin
   SomaTotal := 0;

   ADOQuery.Close;
   ADOQuery.SQL.Clear;
   ADOQuery.SQL.Add(´SELECT ENTRADAS, TIPOENTRADA, ITEMENTRADA, ITEM, VALOR´);
   ADOQuery.SQL.Add(´From ItemEntrada,LancEntrada´);
   ADOQuery.SQL.Add(´Where ITEM = ITEMENTRADA or ITEM <> ITEMENTRADA´);
   ADOQuery.SQL.Add(´Order By ENTRADAS,TIPOENTRADA´);
   ADOQuery.Open;

   While not ADOQuery.Eof do Begin
      // Grupo por ENTRADAS
      SomaENTRADA := 0;
      iENTRADA := ADOQuery.FieldByName(´ENTRADAS´).AsString;
      RvSystemRelatorios.BaseReport.PrintCenter(iENTRADA,10);
      NextLine(RvSystemRelatorios);
      While (iENTRADA=ADOQuery.FieldByName(´ENTRADAS´).AsString) 
               and (not ADOQuery.Eof) do Begin
         // Grupo por TIPO
         SomaTIPO := 0;
         iTIPO := ADOQuery.FieldByName(´TIPOENTRADA´).AsString;
         RvSystemRelatorios.BaseReport.PrintLeft(iTIPO,1);
         While (iTIPO= ADOQuery.FieldByName(´TIPOENTRADA´).AsString) 
                 and (iENTRADA=ADOQuery.FieldByName(´ENTRADAS´).AsString) 
                 and (not ADOQuery.Eof) do Begin
         // Grupo por ITEM
            SomaITEM := 0;
            iITEM := ADOQuery.FieldByName(´ITEMENTRADA´).AsString;
            While (iITEM = ADOQuery.FieldByName(´ITEMENTRADA´).AsString) 
                     and (iTIPO = ADOQuery.FieldByName(´TIPOENTRADA´).AsString) 
                     and (iENTRADA = ADOQuery.FieldByName(´ENTRADAS´).AsString) 
                     and (not ADOQuery.Eof) do Begin
              SomaITEM   := SomaITEM + ADOQuery.FieldByName(´VALOR´).asFloat;
              SomaTIPO   := SomaITEM  + SomaTIPO;
              SomaENTRADA  := SomaITEM  + SomaENTRADA;
              SomaTotal  := SomaITEM  + SomaTotal;
              ADOQuery.Next;
            End;
        // Total do Grupo ITEM
        //RvSystemRelatorios.BaseReport.PrintRight( FormatFloat(´#,0.00´,SomaITEM),15.8);
        End;
         // Total do Grupo TIPO
         RvSystemRelatorios.BaseReport.PrintRight( FormatFloat(´,0.00´,SomaITEM),15.8);
         NextLine(RvSystemRelatorios);
      End;
      // Total do Grupo ENTRADAS
      RvSystemRelatorios.BaseReport.PrintRight( FormatFloat(´SubTotal - R$ ,0.00´,SomaENTRADA),19.5);
      NextLine(RvSystemRelatorios);
   End;

   // Imprime o Total Geral de Saídas
   With RvSystemRelatorios.BaseReport do Begin
      GotoFooter;
      PrintLeft( ´Total Geral´,MarginLeft);
      PrintRight( FormatFloat(´,0.00´,SomaTotal),19);
   End;
End;


O que fazer??
desde já obrigado por toda ajuda!!


Douglas Bitencourt

Douglas Bitencourt

Responder

Posts

30/12/2003

Douglas Bitencourt

SOBE


Responder

Gostei + 0

30/12/2003

Douglas Bitencourt

SOBE


Responder

Gostei + 0

30/12/2003

Douglas Bitencourt

vou tentar me expressar melhor...

como faço para vizualizar os registros lançados e não lançados em um relatório?

tabela 1 : ITENS (entradas,tipoentrada,itementrada)
tabela 2 : lancamentos (data,item, qnt,valor)

um dblookupcombobox pega os valores de itementrada(tabela 1) e coloca em item (tabela 2).

ex.: lancei 5 itenentrada na tabela 2

preciso exibir estes 5 itens da tabela 2 e mais os 15 restantes da tabela 1
pegando os valores dos 5 itens e nenhum valor para os demais.

é possível isso?
senão, de que outra forma fazer?

já tentei master/detail mas dá erro com dblookupcombobox.

preciso de ajuda...

obrigado.

Douglas.


Responder

Gostei + 0

31/12/2003

Douglas Bitencourt

solução para este tipo de problema...

por Adenilton Rodrigues

http://lib.seven.com.br/ampliar.asp?codcat=&codartigo=270
http://lib.seven.com.br/ampliar.asp?codcat=&codartigo=751


Responder

Gostei + 0

03/01/2004

Douglas Bitencourt

solução para a consulta SQL

   with ADOQuery do begin
     Close;
     SQL.Clear;
     SQL.Add(´SELECT I.TABELA1,..., L.TABELA2,...,´);
     SQL.Add(´FROM TABELA2 as L´);
     SQL.Add(´LEFT JOIN TABELA1 as I ON I.CAMPO = L.CAMPO´);
     Open;
   end;


Comentário de Adenilton Rodrigues...

Essa query é muito interessante porque ela substitui suas duas queries por uma única. Pois ela retorna um conjunto com todos os registros da tabela1 com ou sem lancamentos existentes na tabela2. Melhor explicando: Suponha que voce tenha a Tabela Funcionarios e Dependentes: Se voce usar um Right Join, serão retornados todos os funcionarios com dependentes. Aqueles sem dependentes não serão listados. É a mesma técnica que você utilizou na primeira querie. Já com o Left Join serão listados todos os funcionarios com ou sem dependentes. ... Pra facilitar consulte esses dois artigos que escrevi. Vai facilitar sua vida. ... http://lib.seven.com.br/ampliar.asp?codcat=&codartigo=751 http://lib.seven.com.br/ampliar.asp?codcat=&codartigo=270


Ainda tem uma questão pendente, com relação a limitar a consulta a um intervalo de datas específico ou uma data específica, pois se usar a cláusula WHERE para condicionar a consulta por uma data, o resultado é somente os itens que tenham uma data referente à cláusula where e o objetivo é ´todos os itens lançados e NÃO lançados no período´ indicado na cláusula where.

Os testes continuam e assim que tiver a resposta posto aki no forum.

sds

Douglas.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar