View Full Version : مشکل با sort کلاینت دیتاست
  
baran_2005
سه شنبه 01 تیر 1389, 11:13 صبح
سلام به همه دوستان
برای sort کلاینت دیتاست از خاصیت IndexFieldNames استفاده کردم حالا برای اینکه  به صورت نزولی یا صعودی این عمل انجام شود باید چه کار کنم ؟
pezhvakco
سه شنبه 01 تیر 1389, 12:36 عصر
درود :
1- این پرسش مربوط به این بخش نیست .
2 - برای این کار کافیه ' DESC ' رو به آخر دستورت اضاه کنی .
 
فکر خوش .
baran_2005
سه شنبه 01 تیر 1389, 13:23 عصر
من کد زیر براش نوشتم ولی هنوز برای Sort چندستون مشکل دارم وقتی از IndexFieldNames  استفاده کنم مشکلی نیست ولی از indexField نمیدونم چه جوری استفاده کنم .
procedure TForm3.SortClientDataset(Column: TDBGridColumnItem;grid:tdbadvgrid;ClientDataSet:TC lientDataSet);
var
 andstr:string;
 i:integer;
 NewIndexDef: TIndexDefs;
 IndexName: String;
 IndexOptions: TIndexOptions;
begin
try
  andstr:='';
if grid.DataSource.DataSet.FieldByName(Column.FieldNa me ).FieldKind<>fkData then exit;
  if (grid.DataSource.DataSet.ClassNameIs ('TClientDataSet')=true) then
  begin
    if ClientDataSet.IndexName='' then
      andstr:=''
    else
      andstr:=';';
  ClientDataSet.AddIndex(Column.FieldName+' ASC',Column.FieldName,[ixCaseInsensitive]);
  ClientDataSet.AddIndex(Column.FieldName+' DESC',Column.FieldName,[ixCaseInsensitive,ixDescending]);
//مرتب سازی به صورت صعودی
   if  KeyDataToShiftState(1)=[] then
    begin
       for i:=0 to grid.Columns.Count -1 do
        grid.Columns[i].HeaderFont .Color:=clWhite;
        Column.HeaderFont .Color:=clyellow;
        ClientDataSet.IndexName:=Column.FieldName+' ASC'
    end;
//مرتب سازی نزولی
    if  KeyDataToShiftState(1)=[ssshift] then
    begin
       for i:=0 to grid.Columns.Count-1 do
       grid.Columns[i].headerFont.Color:=clWhite;
       Column.HeaderFont .Color:=$001D9DE2;
      ClientDataSet.IndexName:= Column .FieldName+ ' DESC';
    end;
// مرتب سازی چند ستون با یکدیگر به صورت نزولی
     if  KeyDataToShiftState(1)=[ssctrl,ssshift] then
    begin
       ClientDataSet.IndexName:= ClientDataSet.IndexName+andstr+Column.FieldName+' DESC';
       Column.HeaderFont .Color:=$000A71FC;
    end;
//مرتب سازی چند ستون به صورت صعودی
    if  KeyDataToShiftState(1)=[ssctrl] then
    begin
      ClientDataSet.IndexName:=ClientDataSet.IndexName+a ndstr+Column.FieldName;
       Column.HeaderFont .Color:=clyellow;
    end;
  end;
except on  e:exception do
       ShowMessage (e.Message );
end;
end;
pezhvakco
سه شنبه 01 تیر 1389, 14:41 عصر
میشه دقیقا بگی می خوای چیکار کنی ؟
 
فکر خوش .
baran_2005
سه شنبه 01 تیر 1389, 14:53 عصر
زمانی که Ctrl+Shift و انتخاب چندین ستون موردنظر انتخاب میشود به صورت نزولی ، Ctrl و انتخاب چند ستون مورد نظر صعودی ، Shift به صورت نزولی مرتب سازی شود . 
یک مشکل دیگه هم دارم  من یک مقداری رو به عنوان مانده دو ستون با ردیف قبل محاسبه میکنم زمانی که من مرتب سازی رو انجام میدم چون از کلاینت دیتاست استفاده کردم دیگه adoquary اجرا نمیشود که مقدار مانده من صفر شود و این مقدار اشتباه محاسبه میشه برای این چه کار کنم ؟
 این کد داخل oncalcfield کوئری گذاشتم
if DataSet.Bof then  begin
Temp_remainder :=0;
end;
with DataSet do begin
// ست مانده
  Temp_remainder :=Temp_remainder+FieldByName('BSD1001').AsFloat  -FieldByName('BSD1002').AsFloat ;
  DataSet['remainder']:=FloatToStr(abs(Temp_remainder));
bootshow
سه شنبه 01 تیر 1389, 17:44 عصر
من همیشه از راه حل زیبای استفاده از کامپوننت استفاده میکنم شما رو نمیدونم.
میتونی از ehlib استفاده کنی.الان چک کردم میتونی چند ستون را به هم سورت سعودا یا نزولی بکنی.
داشتم نوشته بالایی رو برات مینوشتم که دیدم شما هم آره.
از کامپوننت tms grid استفاده کردی.خودش خاصیت multiSort داره.اگر tms gridpack را داشته باشی توی دموش سربرگ multisort نمونه کاملشو گزاشته.
Column.FieldName+' ASC' اینو نمیدونم چرا رشته ASC اضافه کردی؟کار میکنه یا نه؟فکر کنم منظور اون دوستمون توی دستورات sql بود.از همون خصوصیت ixDescending استفاده کن.اگر این خصوصیت نباشه بدیهی که سورت ازاونوری میشه.
در هر لحظه فقط یک نام index میتونی بدی.برای اینکار باید چند فیلد را که ایندکس کردی تحت یک نام ذخیره کنی.اگر نام ایندکس جدیدی دادی ایندکس قبلی غیر فعال میشه.
توی مقدار دهی اولیه Temp_remainder مشکل نداره.Temp_remainder بصورت محلیه یا سراسری.معلوم نشد adoquary اجرا میشه یا نه؟!
اینو (DataSet['remainder']) نفهمیدم یعنی چه!!ولی بهتره روی clientdataset دابل کلیک کنی.AddAllField را بزنی و یک فیلد محاسباتی جدید تعریف کنی و در رویداد oncalcfield دستورات زیر را بنویسی.
FieldByName('NewCalcField').AsFloat:=FieldByName(' BSD1001').AsFloat  -FieldByName('BSD1002').AsFloat;
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.