ajuda para melhorar o código (delphi)

26/05/2020

0

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;
Emanuel Gonçalves

Emanuel Gonçalves

Responder

Post mais votado

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;

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

02/06/2020

Emanuel Gonçalves

Obrigado Emerson.

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:
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;
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar