[firebase-br] sql demorando muito

Paulo Portella pportellaa.firebase em gmail.com
Sáb Jun 18 12:57:51 -03 2011


Vou postar algumas observações, segue:
> bom dia a todos estou om um pequeno problema que é mais ou menos assim,
> tenho uma rotina de estorno que faz o seguine
Aqui, no lista-delphi, no NDDV tambem.?
Rsssssssss

> SELECT DISTINCT R.CODCLIENTE, C.NOME, R.FAT_NUM,
> R.VLRECEBIDO, R.NUMDOC,R.LANCAMENTO FROM CONTASRECEBIDAS R
> INNER JOIN CLIENTE C
> ON R.CODCLIENTE = C.CODIGO
> WHERE RECEBIMENTO BETWEEN :DT1 AND :DT2

Pense (novamente Pense) em fazer seus SELECTs da seguinte forma:

  SELECT DISTINCT
   R.CODCLIENTE,
   C.NOME,
   R.FAT_NUM,
   R.VLRECEBIDO,
   R.NUMDOC,
   R.LANCAMENTO
  FROM
   CONTASRECEBIDAS R
   LEFT OUTER JOIN CLIENTE C ON (C.CODIGO = R.CODCLIENTE)
// Eh o Cliente que tem que ser comparado ao ContasReceber)
  WHERE
   RECEBIMENTO BETWEEN :DT1 AND :DT2

// Não vou discutir, acreditarei que o campo eh DATE

Assim, fica mais "limpo" pra quem for ler, conseguir "compreender" o que 
se refere.
> e a chamada é da seguinte forma aqui recebos registros de da tabela contas
> recebidas
> Estorno.close;
> Estorno.Params.ParamByName('DT1').AsDate := dte1.Date;
> Estorno.Params.ParamByName('DT2').AsDate := dte2.Date;
> Estorno.Open;
Estorno é o que? SqlQuery? SqlDataSet? é o que afinal?
(apesar que não interessa tanto saber, vi lá embaixo, mas não custa nada 
"cutucar" hehehehe)

> dbgrid1.DataSource := DsEstorno;
>
Sem comentários -> fazer DAtasource a um dbGrid em modo runtime?
humpft.!!
> para pegar o valor semelhante na tabela de contas receber que será alterado
> tenho esta senteça
>
> procedure TF_Estorno.receber;
> begin
> f_dmm.Geral.close;
> f_dmm.Geral.CommandText := 'SELECT * FROM CONTASRECEB WHERE NUMDOC = :PDOC';
MAIUSCULO, POR FAVOR.!!!!!!!!!

> f_dmm.Geral.Params.ParamByName('PDOC').AsString := Estornonumdoc.Text;
AsString ou Text?  quem está recebendo quem aqui?
> f_dmm.Geral.Open;

> Edit1.Text := f_dmm.Geral.FieldByName('FAT_NUM').AsString;
> Edit2.Text := CurrToStr(f_dmm.Geral.FieldByName('vlrtotal').AsCurrency);
> Edit3.Text := CurrToStr(f_dmm.Geral.FieldByName('vlrecebido').AsCurrency);
> Edit4.Text := CurrToStr(f_dmm.Geral.FieldByName('vlrestante').AsCurrency);
> Edit5.Text := CurrToStr(Estorno.FieldByName('vlrecebido').AsCurrency);
> end;
>
>
> e para estornar tenho a seguinte sentença
>
> procedure TF_Estorno.estorno_receber;
> begin
> f_dmm.Geral.Close;
> f_dmm.Geral.CommandText := 'UPDATE CONTASRECEB SET FAT_NUM  = :PFAT,
> VLRECEBIDO = VLRECEBIDO - :PREC,'+
> ' VLRESTANTE = VLRESTANTE + :PREST, STATUS =:PS';
> f_dmm.Geral.Params.ParamByName('PFAT').AsString := Edit1.Text;
> f_dmm.Geral.Params.ParamByName('PREC').AsCurrency := StrToCurr(Edit5.text);
> f_dmm.Geral.Params.ParamByName('PREST').AsCurrency := StrToCurr(Edit5.text);
> f_dmm.Geral.Params.ParamByName('PS').AsString := 'P';
> f_dmm.Geral.Execute;
>   Estorno.Delete;
Cade a "condição" WHERE nesse seu SQL ?
Fazendo esse código ele vai Atualizar os campos FAT_NUM, VLRRECEBIDO, 
VLRRESTANTE, STATUS de praticamente todos os registros na sua tabela 
CONTASRECEB.

Não vai???
>   Estorno.ApplyUpdates(0);
> end;
ApplyUpdate pra cada linha de Estorno movimentado?
Repense melhor em fazer essa "atualização" baseado em uma "Transação", 
assim, caso aconteça ""algum problema"" você terá a chance de "voltar" o 
que era antes sem correr o risco de fazer MERDAS.

Um abraço.




Mais detalhes sobre a lista de discussão lista