Fórum Muita Lentidão na minha rotina. Acesso BD.. #242860

13/07/2004

0

Olá...
Preciso de uma ajudinha...

Criei uma rotina para gerar notas fiscais no programa aqui da empresa fiz o teste com 64 notas fiscais e demorou uns 10 minutos...Muito lento...Quando o programa for emitir todas as notas então, que são quase 1000, vai levar o dia inteiro.

Essa rotina verifica se o numero da nota existe...Depois verifica se é iss retido ou não...Depois verifica o tipo de serviço..Tudo isso é gravado em uma tabela (Notas Emitidas).

Segue abaixo o código...
Se alguém puder me ajudar a melhorar isso...

Valeu!



# Inicio do Código

procedure TFormImpressaoNF.BitBtn1Click(Sender: TObject);
var
Inicio, Registros :Integer;
Total, Valor_ISSQN: Double;
begin
IBQuery2.Close;
IBQuery2.SQL.Clear;
IBQUery2.SQL.Add(´Select* from notasfiscaisemitidas where numeronotaEmitida =:Nota´);
IBQUery2.ParamByName(´Nota´).AsString :=(EditNumeroInicial.Text);
IBQuery2.Prepare;
IBQuery2.Open;

if IBQuery2.RecordCount <> 0 then
begin
MessageDlg(´Já foi emitida Alguma Nota Fiscal com essa numeração. Por favor insira outro numero para a nota.´,Mtinformation,[mbOk],0);
EditNumeroInicial.SetFocus;
end
else
begin
Inicio :=(StrToInt(EditNumeroInicial.Text)-1);
DBGrid1.Visible :=False;
DBGrid2.Visible :=True;

BitBtn1.Enabled :=False;
BitBtn3.Enabled :=True;

DmFaturas.IBQueryNotasFiscais.Open;
DmFaturas.IBQueryContratos.First;
While not DmFaturas.IBQueryContratos.Eof do
begin
Valor_ISSQN :=(strToFloat(DmFaturas.IBQueryContratosVALORPARCELAS.AsString)* 5 /(100));
DmFaturas.IBQueryNotasFiscais.Append;
DmFaturas.IBQueryNotasFiscaisDataEmissao.AsString :=MKEditDataEmissao.Text;

if PanelDataVencimento.Visible =True then DmFaturas.IBQueryNotasFiscaisDataVencimento.AsString :=MaskEdit1.Text else DmFaturas.IBQUeryNotasFiscaisDataVencimento.AsString :=DmFaturas.IBQueryContratosDia_Vencimento.AsString +´/´+ (MaskEdit2.Text);

DmFaturas.IBQueryNotasFiscaisCodigoCliente.AsString :=DmFaturas.IBQueryContratosCodigoCliente.AsString;
DmFaturas.IBQUeryNotasFiscaisNumeroContrato.AsString :=DmFaturas.IBQueryContratosNumeroContrato.ASString;
Inicio :=((Inicio)+1);
DmFaturas.IBQueryNotasFiscaisNumeroNota.AsString :=IntToStr(Inicio);
DmFaturas.IBQueryNotasFiscaisdescricaoNATUREZAOP.AsString :=DBLookUpCombobox1.Text;

//===================== ISS Não Retido =======================//

if DmFaturas.IBQueryContratosISS_Retido.AsString = ´NAO´ then
begin
DmFaturas.IBQueryNotasFiscaisVALOR.AsString :=DmFaturas.IBQueryContratosVALORPARCELAS.AsString;
DmFaturas.IBQueryNotasFiscaisISSQN.AsString :=´5,00´;
DmFaturas.IBQueryNotasFiscaisVALORISSQN.AsString :=FormatFloat(´#,,0.00´,abs(Valor_ISSQN));
DmFaturas.IBQueryNotasFiscaisISS_RETIDO.AsString :=´´;
DmFaturas.IBQueryNotasFiscaisVALORISS_RETIDO.AsString :=´´;
DmFaturas.IBQueryNotasFiscaisTOTAL_NOTA.AsString := DmFaturas.IBQueryContratosVALORPARCELAS.AsString;
end;

//===================== ISS Retido =======================//

if DmFaturas.IBQueryContratosISS_Retido.AsString = ´SIM´ then
begin
DmFaturas.IBQueryNotasFiscaisVALOR.AsString :=DmFaturas.IBQueryContratosVALORPARCELAS.AsString;
DmFaturas.IBQueryNotasFiscaisISSQN.AsString :=´0,00´;
DmFaturas.IBQueryNotasFiscaisVALORISS_RETIDO.AsString :=FormatFloat(´#,,0.00´,abs(strToFloat(DmFaturas.IBQueryContratosVALORPARCELAS.AsString))* 5 /(100));
DmFaturas.IBQueryNotasFiscaisISS_RETIDO.AsString :=´ISSQN Retido cfe LEI 8468/02.´;
DmFaturas.IBQueryNotasFiscaisTOTAL_NOTA.AsString :=FormatFloat(´,,0.00´,abs(StrToFloat(DmFaturas.IBQueryContratosVALORPARCELAS.AsString)) - (Valor_ISSQN));
DmFaturas.IBQueryNotasFiscaisVALORISSQN.AsString :=´0,00´;
end;

DmFaturas.IBQueryNotasFiscaisOBSERVACOES.AsString :=Memo1.Text;


if (DmFaturas.IBQueryContratosTipo_SERVICO.AsString = ´TELEMIDIA´){ and
(DmFaturas.IBQueryFaturasParcelado.AsString = ´N´)} then DmFaturas.IBQueryNotasFiscaisDESCRICAO.AsString :=´Referente ao pagamento de servico de espera telefonica personalizado.´;

if (DmFaturas.IBQueryContratosTipo_SERVICO.AsString = ´STUDIO´) then DmFaturas.IBQueryNotasFiscaisDESCRICAO.AsString :=´Referente ao pagamento de servico de Studio.´+´ ´;

if (DmFaturas.IBQueryContratosTipo_SERVICO.AsString = ´EXTRA´) then DmFaturas.IBQueryNotasFiscaisDESCRICAO.AsString :=´Referente ao pagamento de servico extra de Studio.´+´ ´;

DmFaturas.IBQueryNotasFiscais.Post;
DmFaturas.IBQueryContratos.Next;

end;
DmFaturas.IBQueryNotasFiscais.Close;
DmFaturas.IBQueryNotasFiscais.SQL.Clear;
DmFaturas.IBQueryNotasFiscais.SQL.Add(´Select* from NotasFiscais order by NumeroNota´);
DmFaturas.IBQueryNotasFiscais.Prepare;
DmFaturas.IBQueryNotasFiscais.Open;

DSNotasFiscais.DataSet.First;
DSNotasFiscais.DataSet.Last;
DSNotasFiscais.DataSet.First;
Registros := (DmFaturas.IBQueryNotasFiscais.RecordCount);
Label10.Caption :=´Foram geradas ´+(IntToStr(Registros))+´ notas para impressão.´;

IBQUeryTotal.Close;
IBQUeryTotal.Open;
Total := StrToFloat(IBQUeryTotalSUM.AsString);
Label9.Caption :=´Valor Total das Notas: R$ ´+FormatFloat(´#,,0.00´,(Total));
end;
end;

Fim do Código


José Alves

José Alves

Responder

Posts

14/07/2004

Fava

Olá Marcos,

Não tive tempo de avaliar todo seu código mas basicamente a lentidão nos acessos ao Interbase (e qualquer outro banco de dados) está relacionado com os parametros que você coloca na clausula ´Where´.

Se não existe indice para os argumentos informados o banco de dados passa a fazer ´table scan´ (pesquisa sequencial na tabela) e isso degrada em muito a performance.

Analise cada SQL que você fez e verifique se fazem acesso por indice.


Responder

Gostei + 0

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

Aceitar