Difference between Mysql queries - Delphi

Asked

Viewed 231 times

0

Good afternoon, I’m doing routine to close the inventory both in SPED and Sintegra, but is giving difference in the sum of the two. I’m using date as reference 31/12/2018. I’m using the same query but in different ways, in which the correct value would be sintegra, and sped is giving the most, where am I missing? Follows my codes:

CODE OF SINTEGRA:

procedure TFSintegraTela.PopulaCDSEstoqueRegistro74(pDataFim: TDate);
var
    SQL, DataEstoque : String;
begin
    CDSEstoque.Filtered := False;
    CDSEstoque.Filter := '';
    DataEstoque := FormatDateTime('yyyy-mm-dd',pDataFim);

    SQL := 'SELECT M.ID_PRODUTO,A.NOME_PRODUTO, A.NCM, SUM(M.QUANTIDADE) AS QTDADE, SUM(M.VALOR_TOTAL) AS CUSTO_TOTAL, '+
    '(SUM(M.VALOR_TOTAL) / SUM(M.QUANTIDADE)) AS CUSTO_UNI, B.SIGLA AS UND '+
    'FROM movimento_produto M '+
    'INNER JOIN produto A ON (A.ID = M.ID_PRODUTO) '+
    'INNER JOIN unidade_produto B ON (B.ID = A.ID_UNIDADE) '+
    'WHERE (M.DATA_MOVIMENTO <= '+QuotedStr(DataEstoque)+') '+
    'GROUP BY M.ID_PRODUTO ORDER BY A.NOME_PRODUTO;' ;

    QueryEstoque.Close;
    QueryEstoque.SQLConnection := TDBExpress.getConexao;
    QueryEstoque.SQL.Text := SQL;
    QueryEstoque.Open;
    CDSEstoque.Active :=True;
    CDSEstoque.First;

    if RadioEstoques.ItemIndex = 0 then
    begin
        CDSEstoque.Filtered := False;
        CDSEstoque.Filter := 'QTDADE > 0';
        CDSEstoque.Filtered := True;
    end
    else
        CDSEstoque.Filtered := False;
    end;
end;

At the end he returns to me: Rows: 5; 396 Total value of the inventory: 623,837.97

SPED CODE:

procedure PopulaCDSBlocoH(pDataFim: TDate);
var
    SQL, DataEstoque: String;
    cdsTemp: TClientDataSet;
begin
    CDSEstoque := TSQLQuery.Create(nil);
    DataEstoque := FormatDateTime('yyyy-mm-dd', pDataFim);

    SQL := 'SELECT M.ID_PRODUTO, A.NOME_PRODUTO, A.NCM, SUM(M.QUANTIDADE) AS QTDADE, ' +
   'SUM(M.VALOR_TOTAL) AS CUSTO_TOTAL, '+
   '(SUM(M.VALOR_TOTAL) / SUM(M.QUANTIDADE)) AS CUSTO_UNI, B.SIGLA AS UND '+
   'FROM movimento_produto M '+
   'INNER JOIN produto A ON (A.ID = M.ID_PRODUTO) '+
   'INNER JOIN unidade_produto B ON (B.ID = A.ID_UNIDADE) '+
   'WHERE (M.DATA_MOVIMENTO <= '+QuotedStr(DataEstoque)+') '+
   'AND M.QUANTIDADE > 0 GROUP BY M.ID_PRODUTO ORDER BY A.NOME_PRODUTO';

   CDSEstoque.SQLConnection := TDBExpress.getConexao;
   CDSEstoque.SQL.Text := SQL;
   CDSEstoque.Open;
   CDSEstoque.First;

end;

At the end he returns to me: Rows: 6.996 Total inventory value: 1,449,628.17

2 answers

2

Simplifying the two queries we have the following:

SELECT M.ID_PRODUTO,
       A.NOME_PRODUTO,
       A.NCM,
       SUM(M.QUANTIDADE) AS QTDADE,
       SUM(M.VALOR_TOTAL) AS CUSTO_TOTAL,
       SUM(M.VALOR_TOTAL) / SUM(M.QUANTIDADE) AS CUSTO_UNI,
       B.SIGLA AS UND
  FROM movimento_produto M
 INNER JOIN produto A ON A.ID = M.ID_PRODUTO
 INNER JOIN unidade_produto B ON B.ID = A.ID_UNIDADE
 WHERE M.DATA_MOVIMENTO <= :DATAESTOQUE
 GROUP BY M.ID_PRODUTO
 ORDER BY A.NOME_PRODUTO;


SELECT M.ID_PRODUTO,
       A.NOME_PRODUTO,
       A.NCM,
       SUM(M.QUANTIDADE) AS QTDADE,
       SUM(M.VALOR_TOTAL) AS CUSTO_TOTAL,
       SUM(M.VALOR_TOTAL) / SUM(M.QUANTIDADE) AS CUSTO_UNI,
       B.SIGLA AS UND
  FROM movimento_produto M
 INNER JOIN produto A ON A.ID = M.ID_PRODUTO
 INNER JOIN unidade_produto B ON B.ID = A.ID_UNIDADE
 WHERE M.DATA_MOVIMENTO <= :DATAESTOQUE
   AND M.QUANTIDADE > 0
 GROUP BY M.ID_PRODUTO
 ORDER BY A.NOME_PRODUTO;

The difference between the two is the comparison of WHERE M.QUANTIDADE > 0. So what we can conclude is that maybe there are some records with the field QUANTIDADE NULL or 0.

-1

I find this sum command confusing. I prefer to assemble the structure and then loop, storing the sum in a variable.

Soma := 0;
While not dataset.eof do
Begin
    Soma ;= soma + campodataset ;
    Dataset.next;
End ;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.