Fórum ApplyUpdate(0) está lendo no While, podem me ajudar ? #330085

26/09/2006

0

Antes deu apresentar o código, irei relatar o que está acontecendo. Delphi 7, Banco FireBird 1.5, componentes SQLDataset+ClientDataSet+DataSetProvider+DataSource. O programa em desenvolvimento, tem como função criar Boletos, estou alimentando 2 tabelas ´GUIA´ e ´TITULOS´.
A tabela GUIA fica com as informações básicas do Boleto já a tabela TITULO recebe algumas informacoes da GUIA como o ID_GUIA, ID_CEDENTE. A tabela TITULOS recebe um autoincremento sem Triggers, uso StoredProcedure e Generation pra setar ao Indice Primário o valor.
Oque ocorre é que são mais de 500 Clientes pra alimentar na tabela TITULOS onde os mesmos tem cada um 12 BOLETOS. Vamos ao código:

[color=red:8c0aa52688] ProgressBar1.Position:= 0;
ProgressBar2.Position:= 0;
CtC:= 0;
CDStitulos.Open;
CDSselcliente.First;
CDSselcliente.DisableControls;
CDStitulos.DisableControls;
IniciaTransacao;
LBstc.Caption:= ´Cadastrando cliente 1 de ´+IntToStr(CDSselcliente.RecordCount);
Update;
// ******* Inicia Loop pro Cadastro dos Títulos por Cliente ******* //
while not CDSselcliente.Eof do begin
// ******* Verifica qual o Tipo de Contribuição ´MS´ ou ´AS´ ******* //
if (RGTipoContrib.ItemIndex=0)or(RGTipoContrib.ItemIndex=1) then begin
// ******* Preenchendo Dados do Cliente e Títulos ******* //
Venc:= StrToDate(EditDataEmissao.Text);
DecodeDate(Venc,Ano,Mes,Dia);
Venc:= EncodeDate(Ano,Mes,Dia);
DiaFx:=Dia;
for CtT := 1 to StrToInt(EditQtdeBoleto.Text) do
begin
// ******* Retornando o Código da Guia no Banco de Dados ******* //
Screen.Cursor:= crSQLWait;
LBstb.Caption:= ´Cadastrando Boletos, aguarde...´;
Update;
DecodeDate(Venc+30,Ano,Mes,Dia); // Quebra e Incrementa 30 dias ao Vencimento
Venc:= EncodeDate(Ano,Mes,DiaFx); // Aloca na variável ´Venc´ a nova data para o Vencimento
SQLSPret_numero.Prepared:= True;
SQLSPret_numero.ParamByName(´IN_TABELA´).AsString:=´titulos´;
SQLSPret_numero.ExecProc;
{ ShowMessage(´ID-Guia...: ´+CDSguiasID_GUIA.AsString+#13+
´ID-Titulo.: ´+SQLSPret_numero.ParamByName(´OUT_ID_CODIGO´).AsString+13+
´ID-Cliente: ´+CDSselclienteOUT_ID_CLIENTE.AsString+13+
´ID-Cedente: ´+CDScedentesID_CEDENTE.AsString);
} CDStitulos.Append;
CDStitulosID_GUIA.AsInteger:= CDSguiasID_GUIA.AsInteger;
CDStitulosID_TITULO.AsInteger:= SQLSPret_numero.ParamByName(´OUT_ID_CODIGO´).AsInteger;
CDStitulosID_CLIENTE.AsInteger:= CDSselclienteOUT_ID_CLIENTE.AsInteger;
CDStitulosID_CEDENTE.AsInteger:= CDScedentesID_CEDENTE.AsInteger;
CDStitulosVALOR_DOC.AsCurrency:= EditValor.Value;
CDStitulosVALOR_DESC.AsCurrency:= 0;
CDStitulosVALOR_ABTO.AsCurrency:= 0;
CDStitulosVALOR_MORA.AsCurrency:= 0;
CDStitulosVALOR_DESP.AsCurrency:= 0;
CDStitulosNOSSO_NUMERO.Value:= ´´;
CDStitulosDATA_DOC.Value:= StrToDate(EditDataEmissao.Text);
CDStitulosDATA_VENC.Value:= Venc;
CDStitulosPARCELA_TITULO.AsInteger:= CtT;
CDStitulosREF_TITULO.Value:=FormatDateTime(´mm/yyyy´,Venc);
CDStitulosEXE_TITULO.Value:=FormatDateTime(´yyyy´,Venc);
CDStitulosTITULO_PG.AsString:=´N´;
if RGTipoContrib.ItemIndex=0 then
CDStitulosTIPO_GUIA.AsString:= ´MS´ else
if RGTipoContrib.ItemIndex=1 then
CDStitulosTIPO_GUIA.AsString:= ´AS´ else
if RGTipoContrib.ItemIndex=2 then
CDStitulosTIPO_GUIA.AsString:= ´ED´ else
if RGTipoContrib.ItemIndex=3 then
CDStitulosTIPO_GUIA.AsString:= ´AD´ else
if RGTipoContrib.ItemIndex=4 then
CDStitulosTIPO_GUIA.AsString:= ´ES´;
CDStitulosMSG_BOL_1.AsString:= Trim(EditMsg1.Text);
CDStitulosMSG_BOL_2.AsString:= Trim(EditMsg2.Text);
CDStitulosMSG_BOL_3.AsString:= Trim(EditMsg3.Text);
CDStitulos.Post;
Application.ProcessMessages;
ProgressBar2.Position := Trunc((CtT * 100) div StrToInt(EditQtdeBoleto.Text));
Update;
Screen.Cursor:= crDefault;
end; // For
end; // If
CDStitulos.ApplyUpdates(-1);
CDSselcliente.Next;
Inc(CtC,1);
LBstb.Caption:= ´Cadastrado !!!´;
LBstc.Caption:= ´Cadastrando cliente ´+IntToStr(Ctc)+´ de ´+IntToStr(CDSselcliente.RecordCount);
ProgressBar1.Position := Trunc((CtC * 100) div CDSselcliente.RecordCount);
ProgressBar2.Position:= 0;
LBstb.Caption:= ´Ainda estou no While !!!´;
Application.ProcessMessages;
Update;
end; // While
CommitTransacao;
ProgressBar1.Position:= 0;
ProgressBar2.Position:= 0;
CDSselcliente.EnableControls;
CDStitulos.EnableControls;
CDScedentes.close;
CDStitulos.Close;
CDSguias.Close;
LBstb.Caption:= ´Cadastrado.´;
LBstc.Caption:= ´Cadastrado ´+IntToStr(Ctc)+´ Cliente(s).´;
Update;
ShowMessage(´Processo foi concluído com sucesso !!!´+#13+
´Número de Clientes Registrados: ´+FormatFloat(´,0´,CtC));
CDSselcliente.First;
SBGerarBoletos.Enabled:= True;
Screen.Cursor:= crDefault;
end;[/color:8c0aa52688]

A minha reclamação é que nos 10 primeiros registros gravados na tabela TITULOS, são rápidos, mas conseguentemente fazendo alguns testes cheguei numa conclusão que ele demora pra fazer o ApplyUpdades(0). Então tudo fica devagar depois dos 10 primeiros registros. Está levando mais de 30 min pra concluir tudo, gostaria de saber se é normal ou tem como melhorar tanto no código como no relacionamento pra ficar mais rápido.

Obrigado !!!!!!!!


Reinaldocnj

Reinaldocnj

Responder

Posts

26/09/2006

Macario

Ola.


Nao e a solucao pura mas vamos la.


Evite o uso desnecessario de [b:83f5d6d4b2]RecordCount[/b:83f5d6d4b2], obtenha o valor uma unica vez e armazene em uma variavel.


Existe a necessidade de efetuar o [b:83f5d6d4b2]ApplyUpdates[/b:83f5d6d4b2] a cada registro?
Voce pode tratar todos os registros em memoria e apenas no final, efetuar o [b:83f5d6d4b2]ApplyUpdates[/b:83f5d6d4b2].

Voce tem rotinas [b:83f5d6d4b2]´ocultas´ [/b:83f5d6d4b2]que tambem podem estar onerando o processamento.

O que faz [b:83f5d6d4b2]IniciaTransacao[/b:83f5d6d4b2]?

O que faz a [b:83f5d6d4b2]SQLSPret_numero.ExecProc[/b:83f5d6d4b2].

Quando se utiliza [b:83f5d6d4b2]Midas[/b:83f5d6d4b2], podemos ter o controle da transacao, que pode ser iniciado quando for feita a aplicacao do [b:83f5d6d4b2]ApplyUpdates[/b:83f5d6d4b2].



[]´s
8)


Responder

Gostei + 0

26/09/2006

Marco Salles

eu não li todo o seu codigo , mas rapidamente passei o olho no que o Macario propos e grafei

Existe a necessidade de efetuar o ApplyUpdates a cada registro? Voce pode tratar todos os registros em memoria e apenas no final, efetuar o ApplyUpdates.


a cada applyUpdates , voce esta se comunicando com o banco

Quando se utiliza Midas, podemos ter o controle da transacao, que pode ser iniciado quando for feita a aplicacao do ApplyUpdates.


para uma tabela e principalmente em aplicaçoes desktop , voce pode dispensar o uso de Transaçoes ao usar a midas

no seu caso acho que o uso de uma estrutura como esta resumidamente postada aqui em baixo ,pode dar um efeito melhor


var erro:=True Try erro:=True inicar a transação while //seu codigos dar O post fim do While erro:=False; except tratar o erro dar finally se não houveerro then dar apllyupdates dar o commit end;


mais ou menos a estrutura e essa .

boa sorte


Responder

Gostei + 0

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

Aceitar