Ir para conteúdo
  • Cadastre-se

dev botao

Inserindo registro no detvenda com mais de 1.000.000 de registros


Ver Solução Respondido por Juliomar Marchetti,
  • Este tópico foi criado há 1056 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Bom dia pessoal, estava revendo meu código de inclusão de item no detvenda, atualmente meu banco conta com mais de 1.000.000 de registros nessa tabela, estou usando o Firebird com o IBX. Estou vendo uma forma de melhorar e otimizar o tempo de inclusão desse registro, caso tenham alguma ideia agradeço a ajuda! Segue abaixo o código

 

                IBQueryDetVenda.Close;
                IBQueryDetVenda.sql.Clear;
                IBQueryDetVenda.SQL.Add('insert into DETVENDA');
                IBQueryDetVenda.SQL.Add('(CODVENDA, DATA, HORA, CODPRODUTO, DESCRICAO, UN, NCM, CFOP,');
                IBQueryDetVenda.SQL.Add('QUANTIDADE, VALORUNITARIO, SUBTOTAL, DESCONTO, VLRDESCONTO,');
                IBQueryDetVenda.SQL.Add('VALORTOTAL, PESOLIQ, PESOBRUTO, ALIQUOTA, VALORICMS, USUARIO,');
                IBQueryDetVenda.SQL.Add('DATAMODIFICACAO, CODLOTE, NLOTE, DTVENCIMENTOLOTE, DTFABBRICACAOLOTE, COMISSAONORMAL, VLRCOMISSAONORMAL,');
                IBQueryDetVenda.SQL.Add('COMISSAODIFERENCIADA, VLRCOMISSAODIFERENCIADA, CODVENDEDOR, VENDEDOR,');
                IBQueryDetVenda.SQL.Add('COMISSAO, REF, TAMANHO, CODCLI, CLIENTE, CODGRUPO, GRUPO, CODSUBGRUPO,');
                IBQueryDetVenda.SQL.Add('SUBGRUPO, CODFORNECEDOR, FORNECEDOR, LUCRO, VLRCUSTOINCIAL, VLRCUSTO,');
                IBQueryDetVenda.SQL.Add('VLRTOTALCUSTO, DIFERENCACUSTO, CODCOLABORADOR, CODBARRAS, BASECALCULOICMS,');
                IBQueryDetVenda.SQL.Add('LABORATORIO, TOTALPESOLIQUIDO, TOTALPESOBRUTO, VOLUMES, QUANTVOLUMES,');
                IBQueryDetVenda.SQL.Add('ALIQ_NAC, VLRALIQ_NAC, CODCOBRADOR, COBRADOR, CODMUNICIPIO, CEST, PROMOCAO, CSTNOTAFISCAL, PIS, COFINS, CODANP, CSOSN, VLRCUSTOMEDIO,');
                IBQueryDetVenda.SQL.Add('CODORIGEMMERCADORIA, CST, CODCHAVETAMANHOSDETVENDA, FAMILIA, CODGRADE, DESCRICAOGRADECOR)');
                IBQueryDetVenda.SQL.Add('values');
                IBQueryDetVenda.SQL.Add('(:QCODVENDA, :QDATA, :QHORA, :QCODPRODUTO, :QDESCRICAO, :QUN, :QNCM, :QCFOP,');
                IBQueryDetVenda.SQL.Add(':QQUANTIDADE, :QVALORUNITARIO, :QSUBTOTAL, :QDESCONTO, :QVLRDESCONTO,');
                IBQueryDetVenda.SQL.Add(':QVALORTOTAL, :QPESOLIQ, :QPESOBRUTO, :QALIQUOTA, :QVALORICMS, :QUSUARIO,');
                IBQueryDetVenda.SQL.Add(':QDATAMODIFICACAO, :QCODLOTE, :QNLOTE, :QDTVENCIMENTOLOTE, :QDTFABBRICACAOLOTE, :QCOMISSAONORMAL, :QVLRCOMISSAONORMAL,');
                IBQueryDetVenda.SQL.Add(':QCOMISSAODIFERENCIADA, :QVLRCOMISSAODIFERENCIADA, :QCODVENDEDOR, :QVENDEDOR,');
                IBQueryDetVenda.SQL.Add(':QCOMISSAO, :QREF, :QTAMANHO, :QCODCLI, :QCLIENTE, :QCODGRUPO, :QGRUPO, :QCODSUBGRUPO,');
                IBQueryDetVenda.SQL.Add(':QSUBGRUPO, :QCODFORNECEDOR, :QFORNECEDOR, :QLUCRO, :QVLRCUSTOINCIAL, :QVLRCUSTO,');
                IBQueryDetVenda.SQL.Add(':QVLRTOTALCUSTO, :QDIFERENCACUSTO, :QCODCOLABORADOR, :QCODBARRAS, :QBASECALCULOICMS,');
                IBQueryDetVenda.SQL.Add(':QLABORATORIO, :QTOTALPESOLIQUIDO, :QTOTALPESOBRUTO, :QVOLUMES, :QQUANTVOLUMES,');
                IBQueryDetVenda.SQL.Add(':QALIQ_NAC, :QVLRALIQ_NAC, :QCODCOBRADOR, :QCOBRADOR, :QCODMUNICIPIO, :QCEST, :QPROMOCAO, :QCSTNOTAFISCAL, :QPIS, :QCOFINS, :QCODANP, :QCSOSN, :QVLRCUSTOMEDIO,');
                IBQueryDetVenda.SQL.Add(':QCODORIGEMMERCADORIA, :QCST, :QCODCHAVETAMANHOSDETVENDA, :QFAMILIA, :QCODGRADE, :QDESCRICAOGRADECOR)');
                IBQueryDetVenda.ParamByName('QCODVENDA').AsInteger := DM.IBVendaCODIGO.AsInteger;
                IBQueryDetVenda.ParamByName('QDATA').AsDate := DM.IBVendaDATA.AsDateTime;
                IBQueryDetVenda.ParamByName('QHORA').AsString := TimeToStr(now);
                IBQueryDetVenda.ParamByName('QCODPRODUTO').AsInteger := DM.IBEstoqueCODIGO.Value;
                IBQueryDetVenda.ParamByName('QDESCRICAO').AsString := VDescricao;
                IBQueryDetVenda.ParamByName('QUN').AsString := DM.IBEstoqueUNIDADE.AsString;
                IBQueryDetVenda.ParamByName('QNCM').AsString := DM.IBEstoqueCODIGONCM.AsString;
                IBQueryDetVenda.ParamByName('QCODVENDEDOR').AsCurrency := DM.IBVendaCODVENDEDOR.AsInteger;
                IBQueryDetVenda.ParamByName('QVENDEDOR').AsString := DM.IBVendaVENDEDOR.AsString;
                IBQueryDetVenda.ParamByName('QCOMISSAO').AsCurrency := VComissaoVendedor;
                IBQueryDetVenda.ParamByName('QREF').AsString := DM.IBEstoqueREF.AsString;
                IBQueryDetVenda.ParamByName('QTAMANHO').AsString := DM.IBEstoqueTAMANHO.AsString;
                IBQueryDetVenda.ParamByName('QCODCLI').AsInteger := DM.IBVendaCODCLI.AsInteger;
                IBQueryDetVenda.ParamByName('QCLIENTE').AsString := DM.IBVendaCLIENTE.AsString;
                IBQueryDetVenda.ParamByName('QCODGRUPO').AsInteger := DM.IBEstoqueCODGRUPO.AsInteger;
                IBQueryDetVenda.ParamByName('QGRUPO').AsString := VGrupo;
                IBQueryDetVenda.ParamByName('QCODSUBGRUPO').AsInteger := DM.IBEstoqueCODSUBGRUPO.AsInteger;
                IBQueryDetVenda.ParamByName('QSUBGRUPO').AsString := DM.IBEstoqueSUBGRUPO.AsString;
                IBQueryDetVenda.ParamByName('QCODFORNECEDOR').AsInteger := DM.IBEstoqueCODFORNECEDOR.AsInteger;
                IBQueryDetVenda.ParamByName('QFORNECEDOR').AsString := DM.IBEstoqueFORNECEDOR.AsString;
                IBQueryDetVenda.ParamByName('QLUCRO').AsCurrency := CurrencyEdit3.Value - (CurrencyEdit4.Value * DM.IBEstoqueVLRCUSTOFINAL.AsCurrency);
                IBQueryDetVenda.ParamByName('QVLRCUSTOINCIAL').AsCurrency := DM.IBEstoqueVLRCUSTO.AsCurrency;
                IBQueryDetVenda.ParamByName('QVLRCUSTO').AsCurrency := DM.IBEstoqueVLRCUSTOFINAL.AsCurrency;
                IBQueryDetVenda.ParamByName('QVLRTOTALCUSTO').AsCurrency := DM.IBEstoqueVLRCUSTOFINAL.AsCurrency * CurrencyEdit4.Value;
                IBQueryDetVenda.ParamByName('QDIFERENCACUSTO').AsCurrency := (DM.IBEstoqueVLRCUSTOFINAL.AsCurrency * CurrencyEdit4.Value) - (DM.IBEstoqueVLRCUSTO.AsCurrency * CurrencyEdit4.Value);
                IBQueryDetVenda.ParamByName('QCODCOLABORADOR').AsInteger := DM.IBVendaCODPARCEIRO.AsInteger;
                IBQueryDetVenda.ParamByName('QCODBARRAS').AsString := DM.IBEstoqueCODBARRAS.AsString;
                IBQueryDetVenda.Prepare;
                IBQueryDetVenda.ExecSQL;
                //Insere os dados na tabela de venda

 

 

          //Somar os valores na tabela de venda
          try
          begin
            IBQuery1.DisableControls;
            IBQuery1.close;
            IBQuery1.SQL.Clear;
            IBQuery1.SQL.Add('SELECT  sum(VLRTOTALCUSTO), Count(DESCRICAO), Sum(QUANTIDADE), Sum(VLRDESCONTO), Sum(TOTALPESOLIQUIDO), Sum(TOTALPESOBRUTO), Sum(VLRALIQ_NAC), Sum(VALORTOTAL), Sum(SUBTOTAL), Sum(VLRACRESCIMO)  FROM DETVENDA');
            IBQuery1.SQL.ADD('WHERE CODVENDA =  ' + QuotedStr(edcodvenda.Text) + '');
            IBQuery1.Prepare;
            IBQuery1.open;
            DM.IBVenda.Edit;
            DM.IBVendaSUBTOTALCUSTO.AsString := floattostr(IBQuery1.fields[0].asfloat);
            DM.IBVendaTOTALCUSTO.Text := floattostr(IBQuery1.fields[0].asfloat);
            DM.IBVendaITENS.AsString := floattostr(IBQuery1.fields[1].asfloat);
            DM.IBVendaVOLUMES.AsString := floattostr(IBQuery1.fields[2].asfloat);
            DM.IBVendaVLRDESCONTO.AsString := floattostr(IBQuery1.fields[3].asfloat);
            DM.IBVendaPESOLIQ.AsString := floattostr(IBQuery1.fields[4].asfloat);
            DM.IBVendaPESOBRUTO.AsString := floattostr(IBQuery1.fields[5].asfloat);
            DM.IBVendaVLRTOTALALIQ_NAC.AsString := floattostr(IBQuery1.fields[6].asfloat);
            DM.IBVendaVALORTOTAL.AsString := floattostr(IBQuery1.fields[7].asfloat);
            DM.IBVendaSUBTOTAL.AsString := floattostr(IBQuery1.fields[8].asfloat);
            DM.IBVendaVLRACRESCIMO.Text := floattostr(IBQuery1.fields[9].asfloat);
            DM.IBVendaSENHALIBERACAO.Clear;
            DM.IBVendaUSUARIOSENHALIBERACAO.Clear;
            DM.IBVendaVALORTOTAL.AsCurrency := (DM.IBVendaSUBTOTAL.AsCurrency - IBQuery1.fields[3].asfloat) + DM.IBVendaVLRACRESCIMO.AsCurrency;
            DM.ibvenda.Post;
            IBQuery1.EnableControls;
            DM.IBTransaction1.CommitRetaining;
          end;
          except
          begin
            ShowMessage('Não foi possível somar itens da venda!');
            Close;
          end;
          end;
          //Somar os valores na tabela de venda
 

  • Moderadores
  • Solution
Postado

Primeiro erro usar IBX com firebird, explicação IBX é para interbase que se distanciou muito do Firebird.

use FireDAC ou outra opção Zeos ou Devart

o gds32.dll e o fbclient.dll estão muito, mas muito distante e dai tu não usa os recursos que eles tem para comunicar o client com o servidor

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado
39 minutos atrás, Juliomar Marchetti disse:

Primeiro erro usar IBX com firebird, explicação IBX é para interbase que se distanciou muito do Firebird.

use FireDAC ou outra opção Zeos ou Devart

o gds32.dll e o fbclient.dll estão muito, mas muito distante e dai tu não usa os recursos que eles tem para comunicar o client com o servidor

Obrigado Juliomar, vou ajustar essa rotina e usar o Unidac para teste e logo postarei os resultados!

  • Curtir 1
Postado

Boa tarde Juliomar, fiz os testes com o mesmo banco, inserindo quatro registros numa venda, segue abaixo os resultados em tempo. Usando o servidor (Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz com 8BG) e o terminal que fez a inserção (Intel(R) Core(TM) i3-7100U CPU @ 2.40GHz com 4GB).

Usei o seguinte formato para gravar o tempo 

 t := GetTickCount();
 t := GetTickCount() - t;
  //ShowMessage(FormatFloat(',0 milisegundos', t));
 Label23.Caption := 'Tempo de resposta : ' +  FormatFloat(',0 milisegundos', t);
 

Unidac                IBX

969                     234

984                     216

953                     234

938                     203

 

 

Deixo aqui o registro desse primeiro teste, assim podemos enriquecer nossos conhecimentos num fórum sempre construtivo !

Postado (editado)
5 minutos atrás, Élviro Cavalcanti disse:

Boa tarde Juliomar, fiz os testes com o mesmo banco, inserindo quatro registros numa venda, segue abaixo os resultados em tempo. Usando o servidor (Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz com 8BG) e o terminal que fez a inserção (Intel(R) Core(TM) i3-7100U CPU @ 2.40GHz com 4GB).

Usei o seguinte formato para gravar o tempo 

 t := GetTickCount();
 t := GetTickCount() - t;
  //ShowMessage(FormatFloat(',0 milisegundos', t));
 Label23.Caption := 'Tempo de resposta : ' +  FormatFloat(',0 milisegundos', t);
 

Unidac                IBX

969                     234

984                     216

953                     234

938                     203

 

 

Deixo aqui o registro desse primeiro teste, assim podemos enriquecer nossos conhecimentos num fórum sempre construtivo !

tente usar RETURNING no insert, assim vc não precisa fazer outro SELECT para gravar a venda

ex:

INSERT INTO DETVENDA
...
RETURNING VLRTOTALCUSTO, DESCRICAO, QUANTIDADE, VLRDESCONTO, TOTALPESOLIQUIDO, TOTALPESOBRUTO, VLRALIQ_NAC, VALORTOTAL, SUBTOTAL


e trocque:
IBQueryDetVenda.ExecSQL;
por:
IBQueryDetVenda.Open;
IBQueryDetVenda.First;
While Not IBQueryDetVenda.EOF Do
Begin
...
//faz a soma aki
IBQueryDetVenda.Next;
end;

 

Editado por datilas
  • Curtir 2
Postado
Em 04/01/2022 at 15:21, datilas disse:

tente usar RETURNING no insert, assim vc não precisa fazer outro SELECT para gravar a venda

ex:

INSERT INTO DETVENDA
...
RETURNING VLRTOTALCUSTO, DESCRICAO, QUANTIDADE, VLRDESCONTO, TOTALPESOLIQUIDO, TOTALPESOBRUTO, VLRALIQ_NAC, VALORTOTAL, SUBTOTAL


e trocque:
IBQueryDetVenda.ExecSQL;
por:
IBQueryDetVenda.Open;
IBQueryDetVenda.First;
While Not IBQueryDetVenda.EOF Do
Begin
...
//faz a soma aki
IBQueryDetVenda.Next;
end;

 

Boa tarde, realmente o tempo diminuiu quase pela metade, vou continuar revisando os códigos e verificar se estou fazendo sql sem necessidade, agradeço a ajuda!

  • Curtir 1
  • Este tópico foi criado há 1056 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...