Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [Delphi] Ordinamento di una tabella

    Salve a tutti e ringraziamenti anticipati a chi mi risponderà ;-)..

    Sto lavorando con FIREBIRD e DELPHI utilizzando i componenti DBEXPRESS, DATACCESS E DATACONTROL.

    Ho visualizzato dei dati presenti nel CLIENTDATASET in una DBGRID e fin qui tutto ok.

    Il problema è che devo visualizzare i dati nell’ordine di inserimento non in ordine alfabetico o di chiave.

    All’inizio avevo pensato di utilizzare come campo di ordinamento la chiave primaria ma questo non andava bene siccome se si desiderava inserire un nuovo record, per esempio, in mezzo alla tabella l’ordinamento saltava (la chiave primaria è intera e si incrementa ad ogni inserimento).

    Avevo allora pensato di inserire nella succitata tabella un ulteriore campo POS; in pratica dopo aver inserito tutti i record che mi servivano, all’interno di un ciclo prendevo il singolo dataset ed inserivo il corrispondente valore di POS così da avere l’ordine di inserimento voluto.
    Per capirci:

    For Pos:=0 to MioClientDATASET.RecordCount do begin
    MioClientDATASET.Edit;
    MioClientDATASET.FieldByName('POS').AsInteger:=Pos ;
    MioClientDATASET.Post;
    MioClientDATASET.Next;
    End;



    Mi sono creato un INDICE nel CLIENTDATASET così da avere l’ordinamento in riferimento al campo POS.

    La cosa effettivamente funziona (non so se esiste un altro metodo piu veloce che a me sfugge), ma il problema è un altro:

    Se in un secondo momento riprendo quella data tabella e la modifico, succede che i miei dati da inserire seguono l’ordine dell’ INDICE e vanno ad inserirsi in testa alla tabella (Il ciclo FOR lo utilizzo dopo aver effettuato tutti gli inserimenti e le modifiche, per cui all’inizio il campo POS ha valore nullo).
    Se nel momento dell’inserimento tolgo l’indice dichiarando:

    MioClientDATASET.IndexName:=’’;

    Allora la tabella cambia l’ordinamento visualizzandomi i dati secondo la chiave primaria e tutto mi sballa.

    Quello che vorrei è avere sempre la tabella nell’ordine di inserimento, modificarla come voglio (Inserendo i dati dove voglio, in coda, in testa o in qualsiasi posizione della tabella) e mantenere l’ordinamento voluto.

    Potete aiutarmi? Se sono fuori strada ed ho scritto codice inutile correggetemi….

    Vi ringrazio per la risposta

    Buona giornata

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da Brendon77
    Se in un secondo momento riprendo quella data tabella e la modifico, succede che i miei dati da inserire seguono l’ordine dell’ INDICE e vanno ad inserirsi in testa alla tabella
    E qual è il problema? Dove dovrebbero andare a posizionarsi tali dati?
    Se si devono posizionare in fondo, attribuisci un valore al campo POS quando viene creato un nuovo record in memoria, affinché equivalga al valore massimo del campo stesso calcolato su tutti i record.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3

    ok

    Grazie per la risposta

    Ma se devo posizionare un Record in mezzo alla tabella mi tocca prendere il valore POS corrispondente alla posizione in tabella, ricalcolarmi (e attibuire ai record successivi)tutti i valori successivi? Praticamente come un inserimento in un vettore? Ci avevo pensato a ma stavo cercando un metodo alternativo.... ma a quanto pare dovrò fare così..

    Grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    170
    Scusami magari sto dicendo una stupidagine ma non potresti risolvere semplicemente memorizzando la data e l'ora di inserimento??? e poi mettere in ordine di data??

    Bhu forse non ho capito bene il problema!

  5. #5

    Grazie

    Grazie per la risposta.. ma utilizzare l'ora e la data non mi permetterebbe di inserire un record in una posizione intermedia nella tabella...


  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da Brendon77
    Ma se devo posizionare un Record in mezzo alla tabella mi tocca prendere il valore POS corrispondente alla posizione in tabella, ricalcolarmi (e attibuire ai record successivi)tutti i valori successivi? Praticamente come un inserimento in un vettore? Ci avevo pensato a ma stavo cercando un metodo alternativo.... ma a quanto pare dovrò fare così..
    Se la tabella deve essere visualizzata per ordine di posizione, comunque, quanto dici dovrà essere fatto prima o poi, o in fase di creazione del record (posizionandolo in un determinata posizione) o in fase di salvataggio (spostandolo dalla prima o dall'ultima).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    170
    Aaaa adesso rileggendo bene ho capito prima ero di fretta.
    Mi sa che il lavoro è quello e non c'è altra possibilità ammeno che potresti fare ...

    per esempio hai

    1
    2
    3
    4
    5
    6


    vuoi inserire tra 3 e 4 metti
    1
    2
    3
    3-1
    3-2
    4
    5
    6

    dai volendo potrbbe essere una soluzione migliore di andare a modificare n valori dopo, il che sarebbe faticoso se fossero migliaia e migliaia di record.
    Bhe spero di essere stato utile ciao!

  8. #8

    Grazie

    Grazie Friend,

    Bhè si potrebbe essere anche questa una soluzione

    Certo che mi sei stato utile...


  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da Valeriodev
    Mi sa che il lavoro è quello e non c'è altra possibilità ammeno che potresti fare ...
    per esempio hai
    1
    2
    3
    4
    5
    6
    vuoi inserire tra 3 e 4 metti
    1
    2
    3
    3-1
    3-2
    4
    5
    6
    dai volendo potrbbe essere una soluzione migliore di andare a modificare n valori dopo, il che sarebbe faticoso se fossero migliaia e migliaia di record.
    Dal mio punto di vista, non adotterei mai questa soluzione, poiché potrebbe rivelarsi un "suicidio" in seguito: avere un campo numerico che denota la posizione di un elemento è sempre il metodo più rapido per ottenere confronti e per determinare con assoluta certezza la posizione ordinale dell'elemento stesso.

    Con una soluzione di questo tipo, supponendo che l'elemento "3-1" debba essere spostato verso l'alto, quale sarebbe il valore da attribuire all'elemento (o al precedente)?

    Per evitare di attribuire una posizione sensata, numerica, sicura a tutti gli elementi evitando un banale ciclo che riassegna le posizioni come si farebbe in un vettore, proprio perché alla fine non si tratta di qualcosa di logicamente distante, ci si trova a fare i conti con un algoritmo che risulta molto più complesso da gestire, poiché la cifra si compone di due elementi, ma potrebbero diventare infiniti e ingestibili.

    Se io volessi - ad esempio - inserire un elemento tra "3-1" e "3-2", cosa diventerebbe? Magari "3-1-1"? E se poi questi elementi vengono spostati, qual è il valore che dovrebbe essere attribuito all'elemento? Virtualmente, se si adotta questo principio, la stringa della posizione potrebbe diventare lunghissima, senza alcun vantaggio apparente, poiché basta attribuire il numero 3 ad un elemento se questo è il terzo, 4 per il quarto e così via.

    In breve, mi sembra una soluzione semplice se applicata ad un singolo caso di inserimento di un solo elemento tra i due, ma diventerebbe la cosa più lenta, inefficace e complessa da gestire di tutte con l'inserimento di più valori e il continuo spostamento di questi, con l'inserimento di nuovi elementi tra di loro.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10

    Ciao

    Ciao e grazie a tutti e due...

    Cmq alla fine ho adottato la soluzione di un ciclo andando a cambiare la posizione dei singoli dataset..... proprio come si fa con un vettore :-).

    Il tutto funziona....

    Ringrazio tutti


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.