Newsgroup: it.comp.lang.delphi
Titolo: Totale colonna

Ciao a tutti, volevo porvi una domanda.
Volevo ottenere la somma di una colonna di una tabella Paradox e
visualizzare tale contenuto in un Edit.
Quello che ho fatto è questo:
//Calcola il totale
  DataMod.Query_BAG.First;
  Tot:=0;
  while not DataMod.Query_BAG.Eof do
  begin
    Tot :=Tot+(DataMod.Query_BAGTOT_ORE.AsDateTime);
    DataMod.Query_BAG.Next;
  end;
  Edit_ORETOT.Text:=FormatDateTime('hh:nn',Tot);
end;
Purtroppo, quando supero le 24 ore, la Edit torna a "zero". Esempio:
Tot 21.00 ore ---> Testo nell'Edit 21.00;
Tot 28.00 ore ---> Testo nell'Edit 04.00;
Cosa posso fare? Grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio
news:bd93um$8sr$1...@news.newsland.it...


Cosa posso fare?
Innanzitutto è sbagliato che tu memorizzi delle quantità (numero di
ore/minuti) in formato date-time.  Per questo tipo di applicazione
devi usare valori interi.  Adesso sei obbligato a memorizzare, mano
mano che leggi un record, a trasformare tutto in minuti e memorizzarlo
in variabili intere.  La visualizzazione nell'EditBox dovrai gestirla
a mano.
-- 
Andrea Laforgia - a.laforgia(at)
libero.it
"There are three kinds of people in this world; 
 those who are good at maths and those who aren't".

Suggerimento:
metti nella public del datamdoule una cosa del tipo:
function GetTotaleOre: integer (???)
che avrà come codice questo:
begin
   Query_BAG.First;
   Tot:=0;
   while not Query_BAG.Eof do
   begin
     Tot :=Tot+(Query_BAGTOT_ORE.AsDateTime);
     Query_BAG.Next;
   end;
 end;
Poi, nel tuo form metti la assegnazione:
procedure TTuoForm.MostraTotale;
begin
  edTotale.Text := IntToStr(DataMod.GetTotaleOre)
end;
In questo modo sposti la logica dal form al data module.
Infine, nomi significativi aumentano la comprensione durante la lettura del
codice.
Bye
A


Ciao,
per logica, ha ragione il sistema.
Io credo che dovresti trasformare il tutto in numeri e non in ore e minuti.
Ti ho fatto un esempio poi tu devi adattarlo alle tue esigenze
// nelle maskedit da 1 a 4 ho memorizzato degli orari
procedure TForm1.RxSpeedButton1Click(Sender: TObject);
Var
Minuti    : real;
IntMinuti : real;
difMinuti : real;
begin
    minuti :=(strtoint(copy(MaskEdit1.Text,4,2))+
              strtoint(copy(MaskEdit2.Text,4,2))+
              strtoint(copy(MaskEdit3.Text,4,2))+
              strtoint(copy(MaskEdit4.Text,4,2)));
 intminuti :=int((strtoint(copy(MaskEdit1.Text,4,2))+
              strtoint(copy(MaskEdit2.Text,4,2))+
              strtoint(copy(MaskEdit3.Text,4,2))+
              strtoint(copy(MaskEdit4.Text,4,2)))/60);
 difminuti :=((minuti-(intminuti*60))/100);
 CEMinuti.Text:=FormatCurr('0.00',minuti);
 CEintMinuti.Text:=FormatCurr('0.00',intminuti);
 CEdifMinuti.Text:=FormatCurr('0.00',difminuti);
    CurrencyEdit1.Text:=FormatCurr('0.00',
                                   (strtoint(copy(MaskEdit1.Text,1,2))+
                                    strtoint(copy(MaskEdit2.Text,1,2))+
                                    strtoint(copy(MaskEdit3.Text,1,2))+
                                    strtoint(copy(MaskEdit4.Text,1,2)))+
                                    intminuti+difMinuti)
end;
///////////////////////////////
Ciao
--
MaoSw
Reporter Professional srl
support...@reporterprofessional.it

 Tot 28.00 ore ---> Testo nell'Edit 04.00;
function GetTotHoursMin: double;
begin
  qry.First;
  while not qry.EOF do begin
    Result := Result + qry_FieldTempo.AsDateTime;
    qry.Next;
  end;
  Result := Result * 24;    // parte intera = ore;
  Result := Int(Result) + Frac(Result) * 60 / 100;
end;
EditTotTime.Text := Format("%05.2f", GetTotTime);