Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Narciso - Dicembre 31, 2012, 12:54:32 pm

Titolo: compare date.... non funziona bene
Inserito da: Narciso - Dicembre 31, 2012, 12:54:32 pm
SAlve,
non so perche' ma non risco ad ordinare le date in una stringgrid....

in OnComparecells metto il seguente codice.....

ShortDateFormat:='dd/mm/yyyy';
case acol of
0,1:result :=trunc(strtointdef(stringgrid1.cells[acol,arow],0)-strtointdef(stringgrid1.cells[bcol,brow],0));
5..12:result:=trunc(strtofloatdef(stringgrid1.cells[acol,arow],0)-strtofloatdef(stringgrid1.cells[bcol,brow],0));
3: result :=comparedate(StrToDate(stringgrid1.Cells[ACol,ARow]),StrToDate(stringgrid1.Cells[BCol,BRow]));
else result:=comparetext(stringgrid1.cells[acol,arow],stringgrid1.cells[bcol,brow]);
end;
if stringgrid1.SortOrder = soDescending then
    result := -result;


il risultato che dà è questo...

31/12/2012
31/12/2012
07/01/2013
06/01/2013
06/01/2013
06/01/2013
06/01/2013
06/01/2013

come vedete non considera l'anno..... come mai?

Gia' che ci sono :BUON ANNOOOOOOOOOOOOOOOOOOO


Titolo: Re:compare date.... non funziona bene
Inserito da: Stilgar - Dicembre 31, 2012, 02:58:11 pm
Scusa Narciso, ma compareDate ... da che unit è esportata?
L'ho trovata solo in amigados.pp ... ma nemmeno con un prototipo di chiamata corretto ...
Codice: [Seleziona]
FUNCTION CompareDates(const date1 : pDateStamp;const date2 : pDateStamp) : LONGINT;
BEGIN
  ASM
    MOVE.L  A6,-(A7)
    MOVE.L  date1,D1
    MOVE.L  date2,D2
    MOVEA.L _DOSBase,A6
    JSR -738(A6)
    MOVEA.L (A7)+,A6
    MOVE.L  D0,@RESULT
  END;
END;
Titolo: Re:compare date.... non funziona bene
Inserito da: Legolas - Dicembre 31, 2012, 03:56:39 pm
E' in dateutils  ;)
Titolo: Re:compare date.... non funziona bene
Inserito da: bonmario - Dicembre 31, 2012, 04:00:22 pm

il risultato che dà è questo...

31/12/2012
31/12/2012
07/01/2013
06/01/2013
06/01/2013
06/01/2013
06/01/2013
06/01/2013


Sembra quasi che ti sta facendo un ordinamento considerandole delle stringhe.

Ciao, Mario
Titolo: Re:compare date.... non funziona bene
Inserito da: Stilgar - Dicembre 31, 2012, 04:09:27 pm
Narciso, le date in delphi e freepascal sono una specie di numero a virgola mobile.
I numeri decimali sono il tempo e gli interi sono la data effettiva.
Questa è una premessa da fare per capire il codice delle funzioni che ti allego.
Codice: [Seleziona]
Function CompareDate(const A, B: TDateTime): TValueRelationship;
begin
  If SameDate(A,B) then
    Result:=EQualsValue
  else if A<B then
    Result:=LessThanValue
  else
    Result:=GreaterThanValue;
end;

Function SameDate(const A, B: TDateTime): Boolean; inline;
begin
  Result:=Trunc(A)=Trunc(B);
end; 
Come suggerisce bonmario, sembra che la compare avvenga tra stringhe e non numeri.
Nelle funzioni non viene messa nessuna logica o algoritmi classici per la gestione delle date. Fanno un banale "compare" numerico
Titolo: Re:compare date.... non funziona bene
Inserito da: nomorelogic - Dicembre 31, 2012, 04:11:31 pm
scusate ma ordinare come stringa con il formato "YYYYMMDD" vi fa schifo? ;)
Titolo: Re:compare date.... non funziona bene
Inserito da: Narciso - Gennaio 01, 2013, 05:26:27 pm
in effetti il comparedate l'ho preso dal dateutils.....
ma come potete notare funziona male....

Mi faro' le funzioni adatte da solo..... prendendo spunto da quelle di Stilgar

Titolo: Re:compare date.... non funziona bene
Inserito da: Legolas - Gennaio 01, 2013, 07:36:07 pm
Uhm... Ho provato a mettere tre tedit e un  tbutton su un form per vedere se in effetti comparedate non funziona:


Codice: delphi [Seleziona]

procedure TForm1.Button1Click(Sender: TObject);
begin
  // shortdateformat è deprecato
  DefaultFormatSettings.ShortDateFormat:='dd/mm/yyyy';
  case CompareDate(strtodate(edit1.Text), strtodate(Edit2.Text)) of
   -1: edit3.Text:='data1 < data2';
    0: edit3.Text:='data1 = data2';
    1: edit3.Text:='data1 > data2';
  end;
end;   


Mi pare che funziona come dovrebbe  ???
L'errore a questo punto potrebbe essere da qualche altra parte.
Titolo: Re:compare date.... non funziona bene
Inserito da: Stilgar - Gennaio 01, 2013, 10:13:20 pm
Narciso, riesci a pubblicare il progettino che ti sta facendo rognare?
Legolas ha trovato che le funzioni funzionano (battutona d'inizio anno).
PS:
Il codice che ho messo sono di DateUtils ... non le ho mica inventate io ;)
Io farei tutto un altro giro.
Titolo: Re:compare date.... non funziona bene
Inserito da: Narciso - Gennaio 02, 2013, 07:05:26 pm
A quale progetto ti riferisci? Ne ho due o tre per i polpastrelli! :)

Titolo: Re:compare date.... non funziona bene
Inserito da: Stilgar - Gennaio 02, 2013, 08:27:28 pm
Emmm, quello legato a questo post?
Titolo: Re:compare date.... non funziona bene
Inserito da: Narciso - Gennaio 03, 2013, 07:56:25 am
MICA HO CAPITO.....
vuoi che ti pubblichi il codice della ruotine di ordinamento....( ma quella gia' l'ho messa).. oppure vuoi l'exe..... cosa intendi per pubblicare il progetto?
L'intero lpj? Bho?
Titolo: Re:compare date.... non funziona bene
Inserito da: Stilgar - Gennaio 03, 2013, 10:17:17 am
Per riuscire a capire bene il problema, e quale sia il problema dell'ordinamento, avendo tutti i sorgenti è più facile aiutarti.
Sempre che non ci siano problemi di "copyright" o clausole di riservatezza che verrebbero infrante. ;)
Titolo: Re:compare date.... non funziona bene
Inserito da: Legolas - Gennaio 03, 2013, 10:35:08 am
Basta un esempio minimo che mostri il problema: una stringgrid con delle date e la procedura per ordinarli in un onClick di un button
Titolo: Re:compare date.... non funziona bene
Inserito da: Narciso - Gennaio 03, 2013, 12:44:21 pm
Ok.. ecco l'esempio... come vedrete, cliccando la fixed cell di una colonna... i dati vengono ordinati... bene.. tranne che per le date.....

Titolo: Re:compare date.... non funziona bene
Inserito da: bonmario - Gennaio 03, 2013, 12:54:36 pm
Basta modificare
Codice: [Seleziona]
  2:result:=comparedate(strtodate(stringgrid1.cells[acol,arow]),strtodate(stringgrid1.cells[acol,arow]));

in
Codice: [Seleziona]
  2:result:=comparedate(strtodate(stringgrid1.cells[acol,arow]),strtodate(stringgrid1.cells[bcol,brow]));

e a me funziona.

Ciao, Mario
Titolo: Re:compare date.... non funziona bene
Inserito da: Stilgar - Gennaio 03, 2013, 01:22:57 pm
eh eh ... prova a mettere questo pezzo di codice e dimmi se funziona ;) Sembrano uguali .. lo so :D
Codice: [Seleziona]
2:result:=comparedate(strtodate(stringgrid1.cells[acol,arow]),strtodate(stringgrid1.cells[bcol,brow]));
Titolo: Re:compare date.... non funziona bene
Inserito da: Stilgar - Gennaio 03, 2013, 01:27:27 pm
Uffa Mario, mi hai rovinato lo scherzo ... vabbè, il codice che ha postato Narciso aveva un'errore grossolano,  di quelli che è difficile trovare.
Ho ricontrollato il primo codice che aveva postato. Quello aveva gli indici giusti, a questo punto nin zo ..
Titolo: Re:compare date.... non funziona bene
Inserito da: Narciso - Gennaio 03, 2013, 04:41:58 pm
che figuracciaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Titolo: Re:compare date.... non funziona bene
Inserito da: bonmario - Gennaio 03, 2013, 09:04:40 pm
Scusate, ma oggi è stata una giornataccia e sono più rimbambito del solito ...
Il problema era quello che ho trovato oppure c'è ancora?

Ciao, Mario
Titolo: Re:compare date.... non funziona bene
Inserito da: Stilgar - Gennaio 03, 2013, 10:07:14 pm
Bonmario, sembra di sì ;)
Titolo: Re:compare date.... non funziona bene
Inserito da: Narciso - Gennaio 03, 2013, 10:14:53 pm
Allora, il problema dell'esempio era quello li'.... avevo dimenticato di cambiare l'indicazione delle celle di confronto...
il problema del programma mio.. da cui era nato il problema invece consisteva nel fatto che la cella in cui c'era la data da ordinare conteneva uno spazio prima del numero.. quindi non veniva considerata una data valida........

Eh succede che si perda tempo con le caxxate.......
Titolo: Re:compare date.... non funziona bene
Inserito da: Stilgar - Gennaio 03, 2013, 10:20:31 pm
Ma va? Sono proprio le cazzate che ti fanno perdere i sentimenti. Appena le trovi ti dai pure delle mazzate sugli zebedei ;)
Titolo: Re:compare date.... non funziona bene
Inserito da: bonmario - Gennaio 04, 2013, 08:27:17 am
Ok, perfetto !!!

P.S. Io, anche per questo motivo, i dati in griglia li espongo sempre con il font courier e, a volte mentre sto facendo i miei test, racchiusi tra doppi apici !!!

Ciao, Mario
Titolo: Re:compare date.... non funziona bene
Inserito da: Narciso - Gennaio 04, 2013, 11:54:41 am
pure il comando trim..... risulta utile
Titolo: Re:compare date.... non funziona bene
Inserito da: Stilgar - Gennaio 04, 2013, 12:04:09 pm
Oppure usare i file di log non è una brutta abitudine.
In questo modo puoi "loggare" i dati che stai smenando e vedere cosa il programma elabora.
Basta tenerli puliti e non esplode il file system ;)