Divida com velocidade

05/07/2017

0

Boa tarde, estou com um banco de dados em Firebird com os seguintes números:
"Venda - 180.000 Registros"
"DetVenda - 500.000 Registros"

Estou usando os compomentes IBDatabase1, IBDatabase1 ( com a propriedade Read Committed marcada) e estou usando IBQuery para inserir os dados conforme abaixo.
Existe alguma forma de melhorar quanto a velocidade a inclusão desse registro?



//Insere os dados na tabela de venda
try
begin
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, 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('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, :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.ParamByName('QCODVENDA').AsInteger := dm.IBVendaCODIGO.Value;
IBQueryDetVenda.ParamByName('QDATA').AsDate := dm.IBVendaDATA.Value;
IBQueryDetVenda.ParamByName('QHORA').asstring := dm.IBVendaHORA.Text;
IBQueryDetVenda.ParamByName('QCODPRODUTO').AsInteger := dm.IBEstoqueCODIGO.Value;
IBQueryDetVenda.ParamByName('QDESCRICAO').AsString := VDescricao;
IBQueryDetVenda.ParamByName('QUN').AsString := dm.IBEstoqueUNIDADE.Text;
IBQueryDetVenda.ParamByName('QNCM').AsString := dm.IBEstoqueCODIGONCM.Text;

if dm.IBClientesUF.text = dm.IBUsuarioUF.text then
begin
IBQueryDetVenda.ParamByName('QCFOP').AsString := dm.IBEstoqueCFOPDENTRO.Text;
end
else
begin
IBQueryDetVenda.ParamByName('QCFOP').AsString := dm.IBEstoqueCFOPFORA.Text;
end;

IBQueryDetVenda.ParamByName('QQUANTIDADE').AsCurrency := CurrencyEdit4.Value;
IBQueryDetVenda.ParamByName('QVALORUNITARIO').AsCurrency := CurrencyEdit1.Value;
IBQueryDetVenda.ParamByName('QSUBTOTAL').AsCurrency := CurrencyEdit4.Value * CurrencyEdit1.Value;
IBQueryDetVenda.ParamByName('QDESCONTO').AsCurrency := CurrencyEdit2.value;
IBQueryDetVenda.ParamByName('QVLRDESCONTO').AsCurrency := (CurrencyEdit4.Value * CurrencyEdit1.Value) - CurrencyEdit3.Value;
IBQueryDetVenda.ParamByName('QVALORTOTAL').AsCurrency := CurrencyEdit3.Value;

if dm.IBEstoquePESOLIQ.Text = '' then
begin
IBQueryDetVenda.ParamByName('QPESOLIQ').AsCurrency := 0;
end
else
begin
IBQueryDetVenda.ParamByName('QPESOLIQ').AsCurrency := dm.IBEstoquePESOLIQ.Value * CurrencyEdit4.Value;
end;

if dm.IBEstoquePESOBRUTO.text = '' then
begin
IBQueryDetVenda.ParamByName('QPESOBRUTO').AsCurrency := 0;
end
else
begin
IBQueryDetVenda.ParamByName('QPESOBRUTO').AsCurrency := dm.IBEstoquePESOBRUTO.Value * CurrencyEdit4.Value;
end;

if dm.IBClientesUF.Text <> dm.IBUsuariouf.Text then
begin
IBQueryDetVenda.ParamByName('QALIQUOTA').AsCurrency := dm.IBEstoqueALIQUOTA_FUF.value;
IBQueryDetVenda.ParamByName('QVALORICMS').AsCurrency := CurrencyEdit3.Value * (dm.IBEstoqueALIQUOTA_FUF.value / 100);
end
else
begin
IBQueryDetVenda.ParamByName('QALIQUOTA').AsCurrency := dm.IBEstoqueALIQUOTA_UF.value;
IBQueryDetVenda.ParamByName('QVALORICMS').AsCurrency := CurrencyEdit3.Value * (dm.IBEstoqueALIQUOTA_UF.Value / 100);
end;

IBQueryDetVenda.ParamByName('QUSUARIO').AsString := FrmPrincipal.edusuariologado.Text;
IBQueryDetVenda.ParamByName('QDATAMODIFICACAO').AsDate := Strtodate(FrmPrincipal.MaskEdit1.Text);
IBQueryDetVenda.ParamByName('QCODLOTE').AsString := edit3.text;
IBQueryDetVenda.ParamByName('QNLOTE').AsString := edNlote.Text;
IBQueryDetVenda.ParamByName('QCOMISSAONORMAL').AsCurrency := dm.IBVendedoresCOMISSAO.Value;
IBQueryDetVenda.ParamByName('QVLRCOMISSAONORMAL').AsCurrency := CurrencyEdit3.Value * (dm.IBVendedoresCOMISSAO.Value / 100);

if dm.IBEstoqueCOMISSAO.Text = '' then
begin
IBQueryDetVenda.ParamByName('QCOMISSAODIFERENCIADA').AsCurrency := 0;
IBQueryDetVenda.ParamByName('QVLRCOMISSAODIFERENCIADA').AsCurrency := 0;
end
else
begin
IBQueryDetVenda.ParamByName('QCOMISSAODIFERENCIADA').AsCurrency := dm.IBEstoqueCOMISSAO.Value;
IBQueryDetVenda.ParamByName('QVLRCOMISSAODIFERENCIADA').AsCurrency :=CurrencyEdit3.Value * (dm.IBEstoqueCOMISSAO.Value / 100);
end;

IBQueryDetVenda.ParamByName('QCODVENDEDOR').AsCurrency := dm.IBVendaCODVENDEDOR.Value;
IBQueryDetVenda.ParamByName('QVENDEDOR').AsString := dm.IBVendaVENDEDOR.Text;
IBQueryDetVenda.ParamByName('QCOMISSAO').AsCurrency := dm.IBVendedoresCOMISSAO.Value;
IBQueryDetVenda.ParamByName('QREF').AsString := dm.IBEstoqueREF.Text;
IBQueryDetVenda.ParamByName('QTAMANHO').AsString := dm.IBEstoqueTAMANHO.Text;
IBQueryDetVenda.ParamByName('QCODCLI').AsInteger := dm.IBVendaCODCLI.value;
IBQueryDetVenda.ParamByName('QCLIENTE').AsString := dm.IBVendaCLIENTE.Text;
IBQueryDetVenda.ParamByName('QCODGRUPO').AsInteger := dm.IBEstoqueCODGRUPO.value;
IBQueryDetVenda.ParamByName('QGRUPO').AsString := VGrupo;
IBQueryDetVenda.ParamByName('QCODSUBGRUPO').AsInteger := dm.IBEstoqueCODSUBGRUPO.value;
IBQueryDetVenda.ParamByName('QSUBGRUPO').AsString := dm.IBEstoqueSUBGRUPO.Text;
IBQueryDetVenda.ParamByName('QCODFORNECEDOR').AsInteger := dm.IBEstoqueCODFORNECEDOR.value;
IBQueryDetVenda.ParamByName('QFORNECEDOR').AsString := dm.IBEstoqueFORNECEDOR.Text;
IBQueryDetVenda.ParamByName('QLUCRO').AsCurrency := CurrencyEdit3.Value - (CurrencyEdit4.Value * dm.IBEstoqueVLRCUSTOFINAL.Value);
IBQueryDetVenda.ParamByName('QVLRCUSTOINCIAL').AsCurrency := dm.IBEstoqueVLRCUSTO.Value;
IBQueryDetVenda.ParamByName('QVLRCUSTO').AsCurrency := dm.IBEstoqueVLRCUSTOFINAL.Value;
IBQueryDetVenda.ParamByName('QVLRTOTALCUSTO').AsCurrency := dm.IBEstoqueVLRCUSTOFINAL.value * CurrencyEdit4.Value;
IBQueryDetVenda.ParamByName('QDIFERENCACUSTO').AsCurrency := (dm.IBEstoqueVLRCUSTOFINAL.value * CurrencyEdit4.Value) - (dm.IBEstoqueVLRCUSTO.value * CurrencyEdit4.Value);
IBQueryDetVenda.ParamByName('QCODCOLABORADOR').AsInteger := dm.IBVendaCODPARCEIRO.Value;
IBQueryDetVenda.ParamByName('QCODBARRAS').AsString := dm.IBEstoqueCODBARRAS.Text;
IBQueryDetVenda.ParamByName('QBASECALCULOICMS').AsCurrency := CurrencyEdit3.Value;
IBQueryDetVenda.ParamByName('QLABORATORIO').AsString := dm.IBEstoqueLABORATORIO
Elviro

Elviro

Responder

Posts

11/07/2017

Roberto Wutke

Cara, uma dica de exemplos reais que tive. Se suas tabelas estiverem sendo linkadas corretamente através das foreign keys, eu te recomendo fazer o uso de clientDataSet, para fazer os inserts e tudo mais, pois assim seria mais simples. Tenta ver algo no forum sobre cadastro Master Detail, vai te ajudar muito. Trabalhava em uma empresa com forma de trabalhar parecida com a sua, e sempre demorava muito... Hoje trabalho em uma empresa que atende supermercados em geral, então 500 mil itens na tabela é facil.... usamos essa forma já conectada ao banco, sempre fazendo as alterações pelo ApplyUpdates do ClientDataSet. Creio que vai te ajudar.

Bons códigos.
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