Newsgroup: it.comp.lang.delphi
Titolo: Muovere i record

Ciao a tutti,
vorrei implementare due tasti ("muovi su" e "muovi giù") che non fanno
altro che muovere dei record all'interno di un tclientdataset per
avere un ordinamento a mio piacimento dei record stessi. Sembra un
cavolata ma non trovo il comando per realizzarlo... Ho trovato solo la
procedura MoveBy che però sposta il focus  :-(
Grazie,
Dario

iaio ha scritto:

Vediamo se ho capito:
Vuoi ordinare i record nel tuo CDS in base alle tue esigenze?
Un idea potrebbe essere quella di mettere un campo 'ORDINA' e crearci un 
indice, poi con 2 bottoncini (muovi su e muovi giu') e qualche riga di 
codice muovi i tuoi record ricalcolando il campo 'ORDINA'
^_Goblin_^
-- 
Ibis et redibis non morieris in bello
http://goblinland.myminicity.com/

 ^_Goblin_^
La tua idea è valida ma purtroppo non posso agire così... ti posto il
codice che sto scrivendo
(ma che purtroppo non funziona al meglio!):
procedure TFrmDocumento.suClick(Sender: TObject);
var r,i: integer;
    a: array[0..10] of variant;
begin
  r := Righe.RecNo;
  if r > 1 then begin
    // salva nell'array i valori del record
    for i:=0 to Length(a)-1 do
      a[i] := Righe.Fields[i].AsVariant;
    Righe.Delete;
    if r = Righe.RecordCount then
     Righe.Prior;
    Righe.InsertRecord([ a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a
[9],a[10] ] );
  end;
end;
procedure TFrmDocumento.SpostaGiuClick(Sender: TObject);
var r,i: integer;
    a: array[0..10] of variant;
begin
  r := Righe.RecNo;
  if r < Righe.RecordCount then begin
    // salva nell'array i valori del record
    for i:=0 to Length(a)-1 do
      a[i] := Righe.Fields[i].AsVariant;
    Righe.Delete;
    if r = Righe.RecordCount then
      Righe.AppendRecord([ a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a
[8],a[9],a[10] ])
    else
      Righe.InsertRecord([ a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a
[8],a[9],a[10] ]);
  end;
end;
Il problema del codice postato è che dopo un po' che ci si gioca non
funziona più,
come se perdesse il puntamento.  :-(
Se qualcuno ha voglia di aiutarmi a completarlo al meglio è ben
accetto!!!
Grazie, ciao
Dario

A che pro?
A.

 
mmm io farei tutto molto pi� semplice ... (IMHO)
mettiamo qualche "paletto"
1: Il campo 'ordina' � di tipo INTEGER
2: tutti i nuovi record inseriti sono appesi con il valore di ordina+1
3: C'e' un indice attivo nel campo ORDINA
4: 2 componenti TSpeedButton 'UP' con TAG=1 e 'Down' con TAG=0
detto ci�, ho riunito i metodi UP & Down in un unico blocco onclick.
Procedure TForm1.Muovi(Sender: TObject);
Var oBook: TBookmark;
     x, y: Integer;
begin
   ds2.DisableControls;  // evito lo sfarfallio
   try
    oBook := ds2.GetBookmark;  // mi salvo la posizione
    x := ds2.FieldByName('ORDINA').AsInteger;  // mi salvo il valore
    case (Sender as TSpeedButton).Tag of   // muovo il puntatore del 
record in base alla selezione
      0: ds2.Next;  // bottone Down
      1: ds2.Prior; // bottone UP
    end;
    y := ds2.FieldByName('ORDINA').AsInteger;  // vecchio valore
    SalvaPosizione(x);  // scrivo la nuova posizione
    ds2.GotoBookmark(oBook); // ritorno al punto di partenza
    SalvaPosizione(y);      // nuovo valore
   finally
     ds2.EnableControls;  // riabilito i controlli
     ds2.FreeBookmark(oBook); // libero memoria
   end;
end;
procedure TForm1.SalvaPosizione(nPos: Integer);
begin
    ds2.Edit;
    ds2.FieldByName('ORDINA').AsInteger := nPos;
    ds2.Post;
end;
Ovviamente � solo un punto di partenza migliorabile
^_Goblin_^

 A.
Il mio TClientDataSet chiamato Righe è una fattura e vorrei quindi
poter lasciare all'utente la libertà di ordinare i record a suo
piacimento...
Dario

 piacimento...
secondo me ti stai spiegando molto male, non si capisce cosa significa 
"ordinamento".
Secondo me, tu vuoi dare la possibilitï¿œ allutente di ordinare *sulla 
griglia* le righe della fattura, che non significa affatto 
"ordinamento" di campi come avevi scritto prima..
Per fare quello che forse ho capito, devi aggiungere un campo numerico 
chiamato "posizione" alla tabella delle righe fattura, non lo mostrerai 
ma dentro ci scrivi il numero di posizione della riga nella griglia.
Quando l'utente preme il tasto su, tu fa un update sul record 
aggiornando il campo "posizione", sia per il record che vuoi alzare che 
anche per quello che vuoi abbassare.
Per ordinarli infine e' sufficente fare una "order by" sul campo 
posizione.
spero di essermi spiegato chiaramente..
ciao
PS: questa tecnica era quella utilizzata dal gestionale zucchetti G1 
sul quale ho lavorato a lungo per farne delle customizzazioni.
Il campo posizioneriga facilita non poco le stampe e l'editing della 
fattura.
-- 
Morde

 Morde
Si in effetti il mio ordinamento riguarda più la griglia che i record
in tabella... mi scuso
per non esser stato chiaro. Ho postato in risposta a Gobli in codice
che ora ho prodotto:
hai suggerimenti per migliorarlo?
Grazie, Dario