ajuda para melhorar o código (delphi)
boa tarde, o código que segue está funcionando mais a ideia é trocar a condição (if then) para somar os valores dos grupos de produtos sem amarrar da forma como está
eu tenho como exemplo parte do código, usando a String ''010101'' a lógica fica presa de modo que se um dia eu tiver que mudar esse código ou acrescentar um novo código eu vou precisar fazer isso em todo o sistema.
if CDS_ResumidoGrupo_Prod.Value = ''010101'' then
tot_grupo01 := tot_grupo01 + CDS_ResumidoValor_Total.Value;
---------------------------------------------------------------
procedure TfrmProcVendasECF.ACtConfirmaExecute(Sender: TObject);
var i, hora : integer;
unid, hora_str, grupo_prod : String;
segundo_arg : boolean;
vltotal, tot_grupo01, tot_grupo11,tot_grupo22, tot_grupo10, tot_grupo20, tot_grupo90 : Double;
begin
inherited;
if not ChBDetalhado.Checked then
begin
CDS_Resumido.Active := False;
FDVendasECF.Active := False;
CDS_ResumidoQuant_Total.ReadOnly := False;
CDS_ResumidoValor_Total.ReadOnly := False;
FDVendasECF.Active := False;
FDVendasECF.SQL.Clear;
FDVendasECF.SQL.Add(''SELECT EXTRACT(HOUR FROM M_DATA_ECF) as Hora, GRUPO_PRODUTO, SUM(I_QUANTIDADE) AS Quant_Total, SUM(I_VALORTOTAL) AS Valor_Total'');
FDVendasECF.SQL.Add(''from G_ECFITENS'');
FDVendasECF.SQL.Add(''left join G_ECFMOVIM ON M_CHAVE = I_CHAVE '');
FDVendasECF.SQL.Add(''left join PRODUTOS ON CODIGO_PRODUTO = I_CODPROD AND UNIDADE_PRODUTO = M_UNIDADE_POSTO'');
FDVendasECF.SQL.Add(''where M_DATA_MOVIM BETWEEN :dataini and :datafim'');
FDVendasECF.SQL.Add(''and M_UNIDADE_POSTO = :unid'');
FDVendasECF.SQL.Add(''Group by EXTRACT(HOUR FROM M_DATA_ECF), GRUPO_PRODUTO'');
FDVendasECF.SQL.Add(''Order by EXTRACT(HOUR FROM M_DATA_ECF), GRUPO_PRODUTO'');
FDVendasECF.ParamByName(''dataini'').Value := DtEditDataIni.Date;
FDVendasECF.ParamByName(''datafim'').Value := DtEditDatafim.Date;
FDVendasECF.ParamByName(''unid'').Value := Copy(CbCodUnid.Text, 1, 2);
FDVendasECF.Active := True;
CDS_Resumido.CreateDataSet;
vltotal := 0;
FDVendasECF.First;
while not FDVendasECF.Eof do
begin
grupo_prod := FDVendasECF.FieldByName(''Grupo_Produto'').Value;
CDS_Resumido.Append;
segundo_arg := true;
hora := FDVendasECF.FieldByName(''Hora'').Value + 1;
CDS_ResumidoHora.Value := FormatFloat(''00'', FDVendasECF.FieldByName(''Hora'').Value)+'':00 a ''+FormatFloat(''00'', hora)+'':00'';
if hora_str = CDS_ResumidoHora.Value then
begin
CDS_ResumidoHora.Value := '''';
segundo_arg := false;
end;
FDLerGrupoProd.Close;
FDLerGrupoProd.ParamByName(''grupo'').Value := FDVendasECF.FieldByName(''Grupo_Produto'').Value;
FDLerGrupoProd.open;
CDS_ResumidoGrupo_Prod.Value := FDVendasECF.FieldByName(''Grupo_Produto'').Value;
CDS_ResumidoNomeGrupo.Value := FDLerGrupoProdDESCRICAO_GRUPO.Value;
CDS_ResumidoQuant_Total.Value := FDVendasECF.FieldByName(''Quant_Total'').Value;
CDS_ResumidoValor_Total.Value := FDVendasECF.FieldByName(''Valor_Total'').Value;
CDS_Resumido.Post;
if segundo_arg then
hora_str := CDS_ResumidoHora.Value;
vltotal := vltotal + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = ''010101'' then
tot_grupo01 := tot_grupo01 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = ''111111'' then
tot_grupo11 := tot_grupo11 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = ''101010'' then
tot_grupo10 := tot_grupo10 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = ''202020'' then
tot_grupo20 := tot_grupo20 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = ''222222'' then
tot_grupo22 := tot_grupo22 + CDS_ResumidoValor_Total.Value;
FDVendasECF.Next;
end;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Valor_Total'').AsString := '''';
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Grupo_Prod'').Value := ''G. 010101'';
CDS_Resumido.FieldByName(''Valor_Total'').Value := tot_grupo01;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Grupo_Prod'').Value := ''G. 111111'';
CDS_Resumido.FieldByName(''Valor_Total'').Value := tot_grupo11;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Grupo_Prod'').Value := ''G. 101010'';
CDS_Resumido.FieldByName(''Valor_Total'').Value := tot_grupo10;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Grupo_Prod'').Value := ''G. 222222'';
CDS_Resumido.FieldByName(''Valor_Total'').Value := tot_grupo22;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Grupo_Prod'').Value := ''G. 202020'';
CDS_Resumido.FieldByName(''Valor_Total'').Value := tot_grupo20;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Grupo_Prod'').Value := ''T. GERAL'';
CDS_Resumido.FieldByName(''Valor_Total'').Value := vltotal;
CDS_Resumido.Post;
DBGrid_vendasECF.DataSource := DS_Resumido;
CDS_ResumidoQuant_Total.ReadOnly := True;
CDS_ResumidoValor_Total.ReadOnly := True;
CDS_Resumido.First;
end;
eu tenho como exemplo parte do código, usando a String ''010101'' a lógica fica presa de modo que se um dia eu tiver que mudar esse código ou acrescentar um novo código eu vou precisar fazer isso em todo o sistema.
if CDS_ResumidoGrupo_Prod.Value = ''010101'' then
tot_grupo01 := tot_grupo01 + CDS_ResumidoValor_Total.Value;
---------------------------------------------------------------
procedure TfrmProcVendasECF.ACtConfirmaExecute(Sender: TObject);
var i, hora : integer;
unid, hora_str, grupo_prod : String;
segundo_arg : boolean;
vltotal, tot_grupo01, tot_grupo11,tot_grupo22, tot_grupo10, tot_grupo20, tot_grupo90 : Double;
begin
inherited;
if not ChBDetalhado.Checked then
begin
CDS_Resumido.Active := False;
FDVendasECF.Active := False;
CDS_ResumidoQuant_Total.ReadOnly := False;
CDS_ResumidoValor_Total.ReadOnly := False;
FDVendasECF.Active := False;
FDVendasECF.SQL.Clear;
FDVendasECF.SQL.Add(''SELECT EXTRACT(HOUR FROM M_DATA_ECF) as Hora, GRUPO_PRODUTO, SUM(I_QUANTIDADE) AS Quant_Total, SUM(I_VALORTOTAL) AS Valor_Total'');
FDVendasECF.SQL.Add(''from G_ECFITENS'');
FDVendasECF.SQL.Add(''left join G_ECFMOVIM ON M_CHAVE = I_CHAVE '');
FDVendasECF.SQL.Add(''left join PRODUTOS ON CODIGO_PRODUTO = I_CODPROD AND UNIDADE_PRODUTO = M_UNIDADE_POSTO'');
FDVendasECF.SQL.Add(''where M_DATA_MOVIM BETWEEN :dataini and :datafim'');
FDVendasECF.SQL.Add(''and M_UNIDADE_POSTO = :unid'');
FDVendasECF.SQL.Add(''Group by EXTRACT(HOUR FROM M_DATA_ECF), GRUPO_PRODUTO'');
FDVendasECF.SQL.Add(''Order by EXTRACT(HOUR FROM M_DATA_ECF), GRUPO_PRODUTO'');
FDVendasECF.ParamByName(''dataini'').Value := DtEditDataIni.Date;
FDVendasECF.ParamByName(''datafim'').Value := DtEditDatafim.Date;
FDVendasECF.ParamByName(''unid'').Value := Copy(CbCodUnid.Text, 1, 2);
FDVendasECF.Active := True;
CDS_Resumido.CreateDataSet;
vltotal := 0;
FDVendasECF.First;
while not FDVendasECF.Eof do
begin
grupo_prod := FDVendasECF.FieldByName(''Grupo_Produto'').Value;
CDS_Resumido.Append;
segundo_arg := true;
hora := FDVendasECF.FieldByName(''Hora'').Value + 1;
CDS_ResumidoHora.Value := FormatFloat(''00'', FDVendasECF.FieldByName(''Hora'').Value)+'':00 a ''+FormatFloat(''00'', hora)+'':00'';
if hora_str = CDS_ResumidoHora.Value then
begin
CDS_ResumidoHora.Value := '''';
segundo_arg := false;
end;
FDLerGrupoProd.Close;
FDLerGrupoProd.ParamByName(''grupo'').Value := FDVendasECF.FieldByName(''Grupo_Produto'').Value;
FDLerGrupoProd.open;
CDS_ResumidoGrupo_Prod.Value := FDVendasECF.FieldByName(''Grupo_Produto'').Value;
CDS_ResumidoNomeGrupo.Value := FDLerGrupoProdDESCRICAO_GRUPO.Value;
CDS_ResumidoQuant_Total.Value := FDVendasECF.FieldByName(''Quant_Total'').Value;
CDS_ResumidoValor_Total.Value := FDVendasECF.FieldByName(''Valor_Total'').Value;
CDS_Resumido.Post;
if segundo_arg then
hora_str := CDS_ResumidoHora.Value;
vltotal := vltotal + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = ''010101'' then
tot_grupo01 := tot_grupo01 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = ''111111'' then
tot_grupo11 := tot_grupo11 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = ''101010'' then
tot_grupo10 := tot_grupo10 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = ''202020'' then
tot_grupo20 := tot_grupo20 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = ''222222'' then
tot_grupo22 := tot_grupo22 + CDS_ResumidoValor_Total.Value;
FDVendasECF.Next;
end;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Valor_Total'').AsString := '''';
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Grupo_Prod'').Value := ''G. 010101'';
CDS_Resumido.FieldByName(''Valor_Total'').Value := tot_grupo01;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Grupo_Prod'').Value := ''G. 111111'';
CDS_Resumido.FieldByName(''Valor_Total'').Value := tot_grupo11;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Grupo_Prod'').Value := ''G. 101010'';
CDS_Resumido.FieldByName(''Valor_Total'').Value := tot_grupo10;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Grupo_Prod'').Value := ''G. 222222'';
CDS_Resumido.FieldByName(''Valor_Total'').Value := tot_grupo22;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Grupo_Prod'').Value := ''G. 202020'';
CDS_Resumido.FieldByName(''Valor_Total'').Value := tot_grupo20;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName(''Grupo_Prod'').Value := ''T. GERAL'';
CDS_Resumido.FieldByName(''Valor_Total'').Value := vltotal;
CDS_Resumido.Post;
DBGrid_vendasECF.DataSource := DS_Resumido;
CDS_ResumidoQuant_Total.ReadOnly := True;
CDS_ResumidoValor_Total.ReadOnly := True;
CDS_Resumido.First;
end;
Emanuel Gonçalves
Curtidas 0
Melhor post
Emerson Nascimento
26/05/2020
crie uma tabela ou um parâmetro no sistema ou um arquivo ini ou ainda uma chave no registro do sistema operacional para gravar o conteúdo que precisa.
algo assim:
[code=delphi]procedure TfrmProcVendasECF.ACtConfirmaExecute(Sender: TObject);
var
i, hora : integer;
unid, hora_str, grupo_prod : String;
segundo_arg : boolean;
// vltotal, tot_grupo01, tot_grupo11,tot_grupo22, tot_grupo10, tot_grupo20, tot_grupo90 : Double;
vltotal: Double;
elemtot: integer;
totais: array of array[0..1] of variant;
// grupos: string; // se usar parâmetro, ini ou registro
// listagrp: TStringList; // se usar parâmetro, ini ou registro
function ScanTotais(strGrupo: string): integer;
var i: integer;
retorno: integer;
begin
retorno := -1;
for i := Low(totais) to High(totais) do
if totais[i,1] = strGrupo then
begin
retorno := i;
exit;
end;
result := retorno;
end;
begin
inherited;
// ***********************************************************************
// se estiver usando parâmetro, ini ou registro, use este trecho
// ***********************************************************************
{ grupos := LeGrupos('chavetal'); // aqui deve retornar algo como '010101/111111/101010/202020/222222/';
listagrp := TStringList.Create;
listagrp.Delimiter := '/'; // barra será o delimitador
listagrp.StrictDelimiter := True; // somente a barra será delimitador
listagrp.DelimitedText := grupos;
for i := 0 to listagrp.Count-1 do
if listagrp[i] > '' then
begin
SetLength(totais, Length(totais)+1);
SetLength(totais[High(totais)],2);
totais[High(totais),0] := listagrp[i];
totais[High(totais),1] := 0;
end; }
// ***********************************************************************
// fim parâmetro, ini ou registro
// ***********************************************************************
// ***********************************************************************
// se estiver usando tabela, use este trecho
// ***********************************************************************
// tabela com somente o campo GRUPO, onde cada registro será um grupo a ser destacado no resumo
tabgrupos.First;
while not tabgrupos.Eof do
begin
SetLength(totais, Length(totais)+1);
totais[High(totais),0] := tabgruposGRUPO.AsString;
totais[High(totais),1] := 0;
tabgrupos.Next;
end;
// ***********************************************************************
// fim tabela
// ***********************************************************************
if not ChBDetalhado.Checked then
begin
CDS_Resumido.Active := False;
FDVendasECF.Active := False;
CDS_ResumidoQuant_Total.ReadOnly := False;
CDS_ResumidoValor_Total.ReadOnly := False;
FDVendasECF.Active := False;
FDVendasECF.SQL.Clear;
FDVendasECF.SQL.Add('SELECT EXTRACT(HOUR FROM M_DATA_ECF) as Hora, GRUPO_PRODUTO, SUM(I_QUANTIDADE) AS Quant_Total, SUM(I_VALORTOTAL) AS Valor_Total');
FDVendasECF.SQL.Add('from G_ECFITENS');
FDVendasECF.SQL.Add('left join G_ECFMOVIM ON M_CHAVE = I_CHAVE ');
FDVendasECF.SQL.Add('left join PRODUTOS ON CODIGO_PRODUTO = I_CODPROD AND UNIDADE_PRODUTO = M_UNIDADE_POSTO');
FDVendasECF.SQL.Add('where M_DATA_MOVIM BETWEEN :dataini and :datafim');
FDVendasECF.SQL.Add('and M_UNIDADE_POSTO = :unid');
FDVendasECF.SQL.Add('Group by EXTRACT(HOUR FROM M_DATA_ECF), GRUPO_PRODUTO');
FDVendasECF.SQL.Add('Order by EXTRACT(HOUR FROM M_DATA_ECF), GRUPO_PRODUTO');
FDVendasECF.ParamByName('dataini').Value := DtEditDataIni.Date;
FDVendasECF.ParamByName('datafim').Value := DtEditDatafim.Date;
FDVendasECF.ParamByName('unid').Value := Copy(CbCodUnid.Text, 1, 2);
FDVendasECF.Active := True;
CDS_Resumido.CreateDataSet;
vltotal := 0;
FDVendasECF.First;
while not FDVendasECF.Eof do
begin
grupo_prod := FDVendasECF.FieldByName('Grupo_Produto').Value;
CDS_Resumido.Append;
segundo_arg := true;
hora := FDVendasECF.FieldByName('Hora').Value + 1;
CDS_ResumidoHora.Value := FormatFloat('00', FDVendasECF.FieldByName('Hora').Value)+':00 a '+FormatFloat('00', hora)+':00';
if hora_str = CDS_ResumidoHora.Value then
begin
CDS_ResumidoHora.Value := '';
segundo_arg := false;
end;
FDLerGrupoProd.Close;
FDLerGrupoProd.ParamByName('grupo').Value := FDVendasECF.FieldByName('Grupo_Produto').Value;
FDLerGrupoProd.open;
CDS_ResumidoGrupo_Prod.Value := FDVendasECF.FieldByName('Grupo_Produto').Value;
CDS_ResumidoNomeGrupo.Value := FDLerGrupoProdDESCRICAO_GRUPO.Value;
CDS_ResumidoQuant_Total.Value := FDVendasECF.FieldByName('Quant_Total').Value;
CDS_ResumidoValor_Total.Value := FDVendasECF.FieldByName('Valor_Total').Value;
CDS_Resumido.Post;
if segundo_arg then
hora_str := CDS_ResumidoHora.Value;
vltotal := vltotal + CDS_ResumidoValor_Total.Value;
{
if CDS_ResumidoGrupo_Prod.Value = '010101' then
tot_grupo01 := tot_grupo01 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = '111111' then
tot_grupo11 := tot_grupo11 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = '101010' then
tot_grupo10 := tot_grupo10 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = '202020' then
tot_grupo20 := tot_grupo20 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = '222222' then
tot_grupo22 := tot_grupo22 + CDS_ResumidoValor_Total.Value;
}
elemtot := ScanTotais(CDS_ResumidoGrupo_Prod.AsString);
if elemtot >= 0 then
totais[elemtot,1] := totais[elemtot,1] + CDS_ResumidoValor_Total.AsFloat;
FDVendasECF.Next;
end;
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Valor_Total').AsString := '';
CDS_Resumido.Post;
{
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 010101';
CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo01;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 111111';
CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo11;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 101010';
CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo10;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 222222';
CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo22;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 202020';
CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo20;
CDS_Resumido.Post;
}
for i := Low(totais) to High(totais) do
begin
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Grupo_Prod').AsString := 'G. '+totais[i,0];
CDS_Resumido.FieldByName('Valor_Total').AsFloat := totais[i,1];
CDS_Resumido.Post;
algo assim:
[code=delphi]procedure TfrmProcVendasECF.ACtConfirmaExecute(Sender: TObject);
var
i, hora : integer;
unid, hora_str, grupo_prod : String;
segundo_arg : boolean;
// vltotal, tot_grupo01, tot_grupo11,tot_grupo22, tot_grupo10, tot_grupo20, tot_grupo90 : Double;
vltotal: Double;
elemtot: integer;
totais: array of array[0..1] of variant;
// grupos: string; // se usar parâmetro, ini ou registro
// listagrp: TStringList; // se usar parâmetro, ini ou registro
function ScanTotais(strGrupo: string): integer;
var i: integer;
retorno: integer;
begin
retorno := -1;
for i := Low(totais) to High(totais) do
if totais[i,1] = strGrupo then
begin
retorno := i;
exit;
end;
result := retorno;
end;
begin
inherited;
// ***********************************************************************
// se estiver usando parâmetro, ini ou registro, use este trecho
// ***********************************************************************
{ grupos := LeGrupos('chavetal'); // aqui deve retornar algo como '010101/111111/101010/202020/222222/';
listagrp := TStringList.Create;
listagrp.Delimiter := '/'; // barra será o delimitador
listagrp.StrictDelimiter := True; // somente a barra será delimitador
listagrp.DelimitedText := grupos;
for i := 0 to listagrp.Count-1 do
if listagrp[i] > '' then
begin
SetLength(totais, Length(totais)+1);
SetLength(totais[High(totais)],2);
totais[High(totais),0] := listagrp[i];
totais[High(totais),1] := 0;
end; }
// ***********************************************************************
// fim parâmetro, ini ou registro
// ***********************************************************************
// ***********************************************************************
// se estiver usando tabela, use este trecho
// ***********************************************************************
// tabela com somente o campo GRUPO, onde cada registro será um grupo a ser destacado no resumo
tabgrupos.First;
while not tabgrupos.Eof do
begin
SetLength(totais, Length(totais)+1);
totais[High(totais),0] := tabgruposGRUPO.AsString;
totais[High(totais),1] := 0;
tabgrupos.Next;
end;
// ***********************************************************************
// fim tabela
// ***********************************************************************
if not ChBDetalhado.Checked then
begin
CDS_Resumido.Active := False;
FDVendasECF.Active := False;
CDS_ResumidoQuant_Total.ReadOnly := False;
CDS_ResumidoValor_Total.ReadOnly := False;
FDVendasECF.Active := False;
FDVendasECF.SQL.Clear;
FDVendasECF.SQL.Add('SELECT EXTRACT(HOUR FROM M_DATA_ECF) as Hora, GRUPO_PRODUTO, SUM(I_QUANTIDADE) AS Quant_Total, SUM(I_VALORTOTAL) AS Valor_Total');
FDVendasECF.SQL.Add('from G_ECFITENS');
FDVendasECF.SQL.Add('left join G_ECFMOVIM ON M_CHAVE = I_CHAVE ');
FDVendasECF.SQL.Add('left join PRODUTOS ON CODIGO_PRODUTO = I_CODPROD AND UNIDADE_PRODUTO = M_UNIDADE_POSTO');
FDVendasECF.SQL.Add('where M_DATA_MOVIM BETWEEN :dataini and :datafim');
FDVendasECF.SQL.Add('and M_UNIDADE_POSTO = :unid');
FDVendasECF.SQL.Add('Group by EXTRACT(HOUR FROM M_DATA_ECF), GRUPO_PRODUTO');
FDVendasECF.SQL.Add('Order by EXTRACT(HOUR FROM M_DATA_ECF), GRUPO_PRODUTO');
FDVendasECF.ParamByName('dataini').Value := DtEditDataIni.Date;
FDVendasECF.ParamByName('datafim').Value := DtEditDatafim.Date;
FDVendasECF.ParamByName('unid').Value := Copy(CbCodUnid.Text, 1, 2);
FDVendasECF.Active := True;
CDS_Resumido.CreateDataSet;
vltotal := 0;
FDVendasECF.First;
while not FDVendasECF.Eof do
begin
grupo_prod := FDVendasECF.FieldByName('Grupo_Produto').Value;
CDS_Resumido.Append;
segundo_arg := true;
hora := FDVendasECF.FieldByName('Hora').Value + 1;
CDS_ResumidoHora.Value := FormatFloat('00', FDVendasECF.FieldByName('Hora').Value)+':00 a '+FormatFloat('00', hora)+':00';
if hora_str = CDS_ResumidoHora.Value then
begin
CDS_ResumidoHora.Value := '';
segundo_arg := false;
end;
FDLerGrupoProd.Close;
FDLerGrupoProd.ParamByName('grupo').Value := FDVendasECF.FieldByName('Grupo_Produto').Value;
FDLerGrupoProd.open;
CDS_ResumidoGrupo_Prod.Value := FDVendasECF.FieldByName('Grupo_Produto').Value;
CDS_ResumidoNomeGrupo.Value := FDLerGrupoProdDESCRICAO_GRUPO.Value;
CDS_ResumidoQuant_Total.Value := FDVendasECF.FieldByName('Quant_Total').Value;
CDS_ResumidoValor_Total.Value := FDVendasECF.FieldByName('Valor_Total').Value;
CDS_Resumido.Post;
if segundo_arg then
hora_str := CDS_ResumidoHora.Value;
vltotal := vltotal + CDS_ResumidoValor_Total.Value;
{
if CDS_ResumidoGrupo_Prod.Value = '010101' then
tot_grupo01 := tot_grupo01 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = '111111' then
tot_grupo11 := tot_grupo11 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = '101010' then
tot_grupo10 := tot_grupo10 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = '202020' then
tot_grupo20 := tot_grupo20 + CDS_ResumidoValor_Total.Value;
if CDS_ResumidoGrupo_Prod.Value = '222222' then
tot_grupo22 := tot_grupo22 + CDS_ResumidoValor_Total.Value;
}
elemtot := ScanTotais(CDS_ResumidoGrupo_Prod.AsString);
if elemtot >= 0 then
totais[elemtot,1] := totais[elemtot,1] + CDS_ResumidoValor_Total.AsFloat;
FDVendasECF.Next;
end;
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Valor_Total').AsString := '';
CDS_Resumido.Post;
{
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 010101';
CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo01;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 111111';
CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo11;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 101010';
CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo10;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 222222';
CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo22;
CDS_Resumido.Post;
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 202020';
CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo20;
CDS_Resumido.Post;
}
for i := Low(totais) to High(totais) do
begin
CDS_Resumido.Append;
CDS_Resumido.FieldByName('Grupo_Prod').AsString := 'G. '+totais[i,0];
CDS_Resumido.FieldByName('Valor_Total').AsFloat := totais[i,1];
CDS_Resumido.Post;
GOSTEI 1
Mais Respostas
Emanuel Gonçalves
26/05/2020
Obrigado Emerson.
No final o cliente pediu outras coisas e foi preciso modificar, mais uma vez obrigado e desculpa a demora
No final o cliente pediu outras coisas e foi preciso modificar, mais uma vez obrigado e desculpa a demora
crie uma tabela ou um parâmetro no sistema ou um arquivo ini ou ainda uma chave no registro do sistema operacional para gravar o conteúdo que precisa.
algo assim:
algo assim:
procedure TfrmProcVendasECF.ACtConfirmaExecute(Sender: TObject); var i, hora : integer; unid, hora_str, grupo_prod : String; segundo_arg : boolean; // vltotal, tot_grupo01, tot_grupo11,tot_grupo22, tot_grupo10, tot_grupo20, tot_grupo90 : Double; vltotal: Double; elemtot: integer; totais: array of array[0..1] of variant; // grupos: string; // se usar parâmetro, ini ou registro // listagrp: TStringList; // se usar parâmetro, ini ou registro function ScanTotais(strGrupo: string): integer; var i: integer; retorno: integer; begin retorno := -1; for i := Low(totais) to High(totais) do if totais[i,1] = strGrupo then begin retorno := i; exit; end; result := retorno; end; begin inherited; // *********************************************************************** // se estiver usando parâmetro, ini ou registro, use este trecho // *********************************************************************** { grupos := LeGrupos('chavetal'); // aqui deve retornar algo como '010101/111111/101010/202020/222222/'; listagrp := TStringList.Create; listagrp.Delimiter := '/'; // barra será o delimitador listagrp.StrictDelimiter := True; // somente a barra será delimitador listagrp.DelimitedText := grupos; for i := 0 to listagrp.Count-1 do if listagrp[i] > '' then begin SetLength(totais, Length(totais)+1); SetLength(totais[High(totais)],2); totais[High(totais),0] := listagrp[i]; totais[High(totais),1] := 0; end; } // *********************************************************************** // fim parâmetro, ini ou registro // *********************************************************************** // *********************************************************************** // se estiver usando tabela, use este trecho // *********************************************************************** // tabela com somente o campo GRUPO, onde cada registro será um grupo a ser destacado no resumo tabgrupos.First; while not tabgrupos.Eof do begin SetLength(totais, Length(totais)+1); totais[High(totais),0] := tabgruposGRUPO.AsString; totais[High(totais),1] := 0; tabgrupos.Next; end; // *********************************************************************** // fim tabela // *********************************************************************** if not ChBDetalhado.Checked then begin CDS_Resumido.Active := False; FDVendasECF.Active := False; CDS_ResumidoQuant_Total.ReadOnly := False; CDS_ResumidoValor_Total.ReadOnly := False; FDVendasECF.Active := False; FDVendasECF.SQL.Clear; FDVendasECF.SQL.Add('SELECT EXTRACT(HOUR FROM M_DATA_ECF) as Hora, GRUPO_PRODUTO, SUM(I_QUANTIDADE) AS Quant_Total, SUM(I_VALORTOTAL) AS Valor_Total'); FDVendasECF.SQL.Add('from G_ECFITENS'); FDVendasECF.SQL.Add('left join G_ECFMOVIM ON M_CHAVE = I_CHAVE '); FDVendasECF.SQL.Add('left join PRODUTOS ON CODIGO_PRODUTO = I_CODPROD AND UNIDADE_PRODUTO = M_UNIDADE_POSTO'); FDVendasECF.SQL.Add('where M_DATA_MOVIM BETWEEN :dataini and :datafim'); FDVendasECF.SQL.Add('and M_UNIDADE_POSTO = :unid'); FDVendasECF.SQL.Add('Group by EXTRACT(HOUR FROM M_DATA_ECF), GRUPO_PRODUTO'); FDVendasECF.SQL.Add('Order by EXTRACT(HOUR FROM M_DATA_ECF), GRUPO_PRODUTO'); FDVendasECF.ParamByName('dataini').Value := DtEditDataIni.Date; FDVendasECF.ParamByName('datafim').Value := DtEditDatafim.Date; FDVendasECF.ParamByName('unid').Value := Copy(CbCodUnid.Text, 1, 2); FDVendasECF.Active := True; CDS_Resumido.CreateDataSet; vltotal := 0; FDVendasECF.First; while not FDVendasECF.Eof do begin grupo_prod := FDVendasECF.FieldByName('Grupo_Produto').Value; CDS_Resumido.Append; segundo_arg := true; hora := FDVendasECF.FieldByName('Hora').Value + 1; CDS_ResumidoHora.Value := FormatFloat('00', FDVendasECF.FieldByName('Hora').Value)+':00 a '+FormatFloat('00', hora)+':00'; if hora_str = CDS_ResumidoHora.Value then begin CDS_ResumidoHora.Value := ''; segundo_arg := false; end; FDLerGrupoProd.Close; FDLerGrupoProd.ParamByName('grupo').Value := FDVendasECF.FieldByName('Grupo_Produto').Value; FDLerGrupoProd.open; CDS_ResumidoGrupo_Prod.Value := FDVendasECF.FieldByName('Grupo_Produto').Value; CDS_ResumidoNomeGrupo.Value := FDLerGrupoProdDESCRICAO_GRUPO.Value; CDS_ResumidoQuant_Total.Value := FDVendasECF.FieldByName('Quant_Total').Value; CDS_ResumidoValor_Total.Value := FDVendasECF.FieldByName('Valor_Total').Value; CDS_Resumido.Post; if segundo_arg then hora_str := CDS_ResumidoHora.Value; vltotal := vltotal + CDS_ResumidoValor_Total.Value; { if CDS_ResumidoGrupo_Prod.Value = '010101' then tot_grupo01 := tot_grupo01 + CDS_ResumidoValor_Total.Value; if CDS_ResumidoGrupo_Prod.Value = '111111' then tot_grupo11 := tot_grupo11 + CDS_ResumidoValor_Total.Value; if CDS_ResumidoGrupo_Prod.Value = '101010' then tot_grupo10 := tot_grupo10 + CDS_ResumidoValor_Total.Value; if CDS_ResumidoGrupo_Prod.Value = '202020' then tot_grupo20 := tot_grupo20 + CDS_ResumidoValor_Total.Value; if CDS_ResumidoGrupo_Prod.Value = '222222' then tot_grupo22 := tot_grupo22 + CDS_ResumidoValor_Total.Value; } elemtot := ScanTotais(CDS_ResumidoGrupo_Prod.AsString); if elemtot >= 0 then totais[elemtot,1] := totais[elemtot,1] + CDS_ResumidoValor_Total.AsFloat; FDVendasECF.Next; end; CDS_Resumido.Append; CDS_Resumido.FieldByName('Valor_Total').AsString := ''; CDS_Resumido.Post; { CDS_Resumido.Append; CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 010101'; CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo01; CDS_Resumido.Post; CDS_Resumido.Append; CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 111111'; CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo11; CDS_Resumido.Post; CDS_Resumido.Append; CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 101010'; CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo10; CDS_Resumido.Post; CDS_Resumido.Append; CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 222222'; CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo22; CDS_Resumido.Post; CDS_Resumido.Append; CDS_Resumido.FieldByName('Grupo_Prod').Value := 'G. 202020'; CDS_Resumido.FieldByName('Valor_Total').Value := tot_grupo20; CDS_Resumido.Post; } for i := Low(totais) to High(totais) do begin CDS_Resumido.Append; CDS_Resumido.FieldByName('Grupo_Prod').AsString := 'G. '+totais[i,0]; CDS_Resumido.FieldByName('Valor_Total').AsFloat := totais[i,1]; CDS_Resumido.Post; end; CDS_Resumido.Append; CDS_Resumido.FieldByName('Grupo_Prod').Value := 'T. GERAL'; CDS_Resumido.FieldByName('Valor_Total').Value := vltotal; CDS_Resumido.Post; DBGrid_vendasECF.DataSource := DS_Resumido; CDS_ResumidoQuant_Total.ReadOnly := True; CDS_ResumidoValor_Total.ReadOnly := True; CDS_Resumido.First; end;
GOSTEI 0