Diferença entre consultas MySQL - Delphi
Boa tarde, estou fazendo rotina pra fechamento do inventário tanto no SPED como Sintegra, porém está dando diferença no somatório dos dois. Estou usando data como referência 31/12/2018.
Estou usando a mesma consulta mas de formas diferentes, no qual o valor correto seria o do sintegra, e do sped está dando a mais, onde será que estou errando? Segue meus códigos:
CÓDIGO DO 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;
Ao final ele me retorna:
Rows: 5;396
Valor total do inventário: 623.837,97
CÓDIGO DO SPED:
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;
Ao final ele me retorna:
Rows: 6.996
Valor total do inventário: 1.449,628,17
Estou usando a mesma consulta mas de formas diferentes, no qual o valor correto seria o do sintegra, e do sped está dando a mais, onde será que estou errando? Segue meus códigos:
CÓDIGO DO 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;
Ao final ele me retorna:
Rows: 5;396
Valor total do inventário: 623.837,97
CÓDIGO DO SPED:
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;
Ao final ele me retorna:
Rows: 6.996
Valor total do inventário: 1.449,628,17
Wellisson Ribeiro
Curtidas 0
Respostas
Hélio Devmedia
08/02/2019
Welisson tudo bem?
Eu analisei bem os seus sqls e com certeza existe algo bem errado:
A primeira observação é que o segundo SQL tem um "AND" no where e quando tem AND ele nunca pode retornar uma quantidade maior do que o sql que não tem AND, somente menor. Assim peço que faça uma conferencia na postagem para ver se você não inverteu o total dos resultados para cada SQL.
Caso esteja correto e você não inverteu os sqls, o problema então é um erro ou corrompimento na base que está causando uma leitura errada dos registros. Assim você deve usar o Gfix ou backup/restore para corrigir a base.
Espero ter ajudado. Um forte abraço e fique com Deus.
Eu analisei bem os seus sqls e com certeza existe algo bem errado:
A primeira observação é que o segundo SQL tem um "AND" no where e quando tem AND ele nunca pode retornar uma quantidade maior do que o sql que não tem AND, somente menor. Assim peço que faça uma conferencia na postagem para ver se você não inverteu o total dos resultados para cada SQL.
Caso esteja correto e você não inverteu os sqls, o problema então é um erro ou corrompimento na base que está causando uma leitura errada dos registros. Assim você deve usar o Gfix ou backup/restore para corrigir a base.
Espero ter ajudado. Um forte abraço e fique com Deus.
GOSTEI 0