PDA

Visualizza la versione completa : [DELPHI] Visualizzare totale fattura su DBGrid


francesco171173
06-08-2010, 14:33
Ho la seguente situazione:

oggetto tquery filtrato per visualizzare le righe di una particolare vendita (campo numco2 univoco)

oggetto tupdate agganciato alla tquery che mi consente di modificare i dati.

oggetto dbgrid che visualizza i dati (articolo,quantita,valore,sconti,Valore Totale) per ogni riga

come faccio a calcolare il valore totale di tutte le righe, al volo , cioe se modifico dei dati nel dbgrid ??? (Totale vendita)

Dovete considerare che ancora non ho effettuato ApplyUpdate della query e la vorrei fare solamente al momento della chiusura della vendita.

Attualmente scorro tutto il dbgrid ogni volta che c'e' una modifica e mi calcolo il totale....ed è troppo pesante....

Aiutatemi
Grazie

francesco171173
06-08-2010, 14:34
ho dimenticato di dirvi che sto utilizzando il delphi 7

Grazie

LeleFT
06-08-2010, 15:35
Originariamente inviato da francesco171173
ho dimenticato di dirvi che sto utilizzando il delphi 7

Grazie

Aggiornato il titolo della discussione.

Ciao. :ciauz:

it9qbd
05-01-2011, 01:48
Ciao, ho il tuo stesso problema....
in effetti se ci sono molti record diventa troppo lento !!!
Come hai risolto, puoi darmi un consiglio ???

Grazie.

alka
05-01-2011, 11:36
Utilizzando il componente TClientDataSet (tenendo conto anche di quanto obsoleto sia il BDE), c'è la possibilità di definire campi aggregati.

Si veda ad esempio questo articolo (http://edn.embarcadero.com/article/29272) per una trattazione completa.

Non sono al corrente se queste funzionalità sono disponibili anche per il BDE.

Di certo, la lentezza potrebbe anche essere derivante dalla pesantezza intrinseca alla complessità eccessiva del BDE rispetto a soluzioni e architetture più recenti, come dbExpress.

it9qbd
05-01-2011, 15:32
Grazie per la tempestività!
Proverò appena possibile, comunque sto utilizzando in prova, absolute DB, che è un'alternativa al vecchio BDE, non necessita di installazioni particolari e quindi possibilità di avere sempre tutto ovunque anche su pendrive.
:ciauz:

alka
10-01-2011, 10:22
Originariamente inviato da it9qbd
Proverò appena possibile, comunque sto utilizzando in prova, absolute DB, che è un'alternativa al vecchio BDE, non necessita di installazioni particolari e quindi possibilità di avere sempre tutto ovunque anche su pendrive.


Non conosco questo DB, ad ogni modo prova ad approfondirne le caratteristiche leggendo la documentazione relativa: magari contiene funzionalità avanzate che ti permettono di ottenere quanto chiedi senza ricorrere ad altri componenti.

Ciao! :ciauz:

deleted_29
10-01-2011, 11:17
Originariamente inviato da it9qbd
Grazie per la tempestività!
Proverò appena possibile, comunque sto utilizzando in prova, absolute DB, che è un'alternativa al vecchio BDE, non necessita di installazioni particolari e quindi possibilità di avere sempre tutto ovunque anche su pendrive.
:ciauz:
lo uso da anni per applicazioni commerciali, magari posso darti qualche idea.
---
Riguardo a componenti "strani"... no, è identico a BDE (e questo è il suo bello), a parte il flushbuffers che è stato spostato inspiegabimente dalle tabelle al db.
---
Per far qualcosa del genere ti dò un suggerimento che magari farà inorridire i "benpensanti", ma che funziona

Una una tkbmemtable temporanea.
prima seleziona le righe che ti interessano con una query "normale"
ABSXSQL(absqryoneshot,'select ...');

poi li carichi tutti in un colpo in una tkbmemtable (non usare quelle di ABS, sono più lente)

memTbltabella.LoadFromDataSet(absqryoneshot,[mtcpoStructure,mtcpoProperties]);

Aggancia il datasource a memtbltabella, e lì la griglia.

Ora puoi "smucinare" come vuoi (tra l'altro se "esci" ti basta cancellare emptytable la tabella in memoria, non alteri il db nè abortisci la transazione, il che è bene)

----
Quando invece vuoi AGGIUNGERE sul db fisico in un colpo solo
fai qualcosa del tipo

absdb.starttransaction;
with memtbltabella do
begin
First;
while not eof do
begin

absTbl.Append;
for j:=0 to FieldDefs.count-1 do
begin
s:=uppercase(fielddefs[j].Name);
// evita i campi autoincrementanti, se li hai
if s<>'SER' then
abstbl.fieldbyname(s).asstring:=fieldbyname(s).ass tring;
end;

absTbl.post;
flusha(i_tipodatabase);
Next;
end;

end;
absdb.commit(false);


Se invece modifichi è uguale -> solo che prima devi fare il
locate (o la query) del record che vuoi cambiare

------
non dimenticare di mettere un disablecontrols/enablecontrols (prima di calcolare le somme), e di riposizionarti nella riga della griglia (o salvando prima la chiave e poi rifacendo il locate, oppure con metodi "strani" col moveby)


sono un po' di corsa, se ti servono dettagli chiedi pure

Loading