ورود

View Full Version : مشکل با sort کلاینت دیتاست



baran_2005
سه شنبه 01 تیر 1389, 10:13 صبح
سلام به همه دوستان
برای sort کلاینت دیتاست از خاصیت IndexFieldNames استفاده کردم حالا برای اینکه به صورت نزولی یا صعودی این عمل انجام شود باید چه کار کنم ؟

pezhvakco
سه شنبه 01 تیر 1389, 11:36 صبح
درود :
1- این پرسش مربوط به این بخش نیست .
2 - برای این کار کافیه ' DESC ' رو به آخر دستورت اضاه کنی .

فکر خوش .

baran_2005
سه شنبه 01 تیر 1389, 12: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, 13:41 عصر
میشه دقیقا بگی می خوای چیکار کنی ؟

فکر خوش .

baran_2005
سه شنبه 01 تیر 1389, 13: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, 16: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;