Newsgroup: it.comp.lang.delphi
Titolo: TJvDBUltimGrid e onUserSort

Salve a tutti,
uso TJvDBUltimGrid  delle JEDI VCL per listare una tabella ADO.
Il mio problema è sull'implementazione di un sort che vorrei fare da
me per inserire una logica di ordinamento custom.
La doc. di TJvDBUltimGrid dice di implementare l'evento onUserSort con
un metodo del tipo
procedure TForm1.JvDBUGUserSort(Sender: TJvDBUltimGrid; var
FieldsToSort: TSortFields; SortString: String; var SortOK: Boolean);
Il problema è che non ho idea come implementarlo! Devo fare quna query
io sul DB o cosa?
Ho trovato su un sito un esempio di implementazione che però fa
riferimento a variabile (membri) esterni al metodo. Ve lo riporto qui.
Qualcuno sa darmi una mano?
procedure TForm1.JvDBUGUserSort(Sender: TJvDBUltimGrid;
   var FieldsToSort: TSortFields; SortString: String; var SortOK:
Boolean);
var
 TVSQL : TStringlist;
 SortColumn, sSQL : String;
 Count : integer;
 p : integer;
begin
  TVSQL := TStringList.Create;
  TVSQL.Clear;
  SortColumn := FieldsToSort[0].Name;
  IBDS.Close;
  TVSQL.AddStrings(IBDS.SelectSQL);
  Count := TVSQL.Count;
  sSQL := TVSQL.Strings[Count-1];
  if (Pos('ORDER', sSQL) > 0) or (Pos('order', sSQL) > 0) then
    TVSQL.Strings[Count -1] := '';
  sSQL := Format('ORDER BY %s',[SortString]);
  p := Pos('[', sSQL);
  if p > 0 then
    delete(sSQL,p,1);
  p := Pos(']', sSQL);
  if p > 0 then
    delete(sSQL,p,1);
  TVSQL.Add(sSQL);
  IBDS.SelectSQL.Clear;
  IBDS.SelectSQL.AddStrings(TVSQL);
  IBDS.Open;
  FreeAndNil(TVSQL);
end;
Grazie,
Gp

Sě, devi fare tu la query.
questo č un esempio funzionante:
procedure TfmProvince.grdProvinceUserSort(Sender: TJvDBUltimGrid;
  var FieldsToSort: TSortFields; SortString: String; var SortOK: Boolean);
begin
delete(SortString,pos('[',SortString),1);
delete(SortString,pos(']',SortString),1);
AggiornaDataset(SortString);
SortOk := True;
end;
procedure TfmProvince.AggiornaDataset(S: String);
begin
with dsProvince do
  begin
    Close;
    sql.clear;
    sql.Add('SELECT PROVINCIA.DEN_PROVINCIA, PROVINCIA.COD_PROVINCIA,
REGIONE.DEN_REGIONE ' +
      ' FROM PROVINCIA, REGIONE where PROVINCIA.COD_REGIONE =
REGIONE.COD_REGIONE ' +
      ' ORDER BY ' + S +'');
    Open;
  end;
end;
ciao
Rockio
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 questo è un esempio funzionante:
Ottimo. Grazie!
Aggiungo però un commento: la tua "user sort" prevede che la
TJvDBUltimGrid sia collegata ad una TADOQuery per la quale riscrivi la
SELECT:
with dsProvince do begin
  Close;
  sql.clear;
  sql.Add('SELECT PROVINCIA.DEN_PROVINCIA...
  ...
Ma come la mettiamo se la TJvDBUltimGrid  è associata ad una
TADOTable? Io uso quella poiché:
1. i dati che visualizzo devono essere anche editabili (non vorrei
avere una TADOQuery per la view e una TADOTable per la edit)
2. Uso un classico modello master-details (una TADOTable master sulla
TJvDBUltimGrid1 e un'altra per la TJvDBUltimGrid2 di dettaglio).
In questo caso non posso riscrivere la SELECT e il mio ordinamento non
è ottenibile semplicemente settando i campi "IndexFieldNames" o
simili. Quello che vorrei fare è:
- recuperare le righe dalla TADOTable
- riordinarli io
- passarle la TADOTable riordinata.
Oppure usare la TADOQuery che usi tu ma garantendo che sia
modificabile al pari della TADOTable.
Mi sa che non è possibile. :-(
Gp
la costruzione di una SELECT ex-novo con la clausola ORDER BY
appropriata. Sarebbe invece più carino interrgorare il datasource o il
dataset dello TJvDBUltimGrid, chiedergli la query che lui usa
internamente e aggiungere a quella la ORDER BY appropriata.
Pensi che si possa fare?


 questo è un esempio funzionante:
Ottimo. Grazie!
Aggiungo però un commento: la tua "user sort" prevede che la
TJvDBUltimGrid sia collegata ad una TADOQuery per la quale riscrivi la
SELECT:
with dsProvince do begin
  Close;
  sql.clear;


 Pensi che si possa fare?
č esattamente quello che fa il codice di esempio, a parte il fatto di non
"chiedergli" la query che usa, dato che č il programmatore a scriverla.
ciao
Rockio
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
