PDA

View Full Version : sort کردن ClientDataSet در حالت Master / Detail



hamid1tarkesh
شنبه 28 دی 1387, 15:49 عصر
با سلام خدمت دوستان گرامی

برای Sort کردن ClientDataSet در حالت عادی از تابع زیر استفاده می کنم که مشکلی پیش نمی یاد.

function SortCustomClientDataSet(DataSet: TCustomClientDataSet;
const FieldName: String): Boolean;
var
i: Integer;
IndexDefs: TIndexDefs;
IndexName: String;
IndexOptions: TIndexOptions;
Field: TField;
begin
try
Result := False;
Field := DataSet.Fields.FindField(FieldName);

if Field = nil then Exit;

if (Field is TObjectField) or (Field is TBlobField) or
(Field is TAggregateField) or (Field is TVariantField)
or (Field is TBinaryField) then Exit;

if IsPublishedProp(DataSet, 'IndexDefs') then
IndexDefs := GetObjectProp(DataSet, 'IndexDefs') as TIndexDefs
else
Exit;
if IsPublishedProp(DataSet, 'IndexName') then
IndexName := GetStrProp(DataSet, 'IndexName')
else
Exit;

IndexDefs.Update;


if IndexName = FieldName + 'A'
then
begin
IndexName := FieldName + 'D';
IndexOptions := [ixDescending];
end
else
begin
IndexName := FieldName + 'A';
IndexOptions := [];
end;

for i := 0 to Pred(IndexDefs.Count) do
begin
if IndexDefs[i].Name = IndexName then
begin
Result := True;
Break
end; //if
end; // for

if not Result then
begin
DataSet.AddIndex(IndexName, FieldName, IndexOptions);
Result := True;
end; // if not
//Set the index
SetStrProp(DataSet, 'IndexName', IndexName);
except
end;
end;در این کد از خاصیت Index مربوط به ClientDataSet استفاده شده.
اما حالا اگر بخواهیم از دوتا ClientDataSet به صورت Master / Detail استفاده کنیم ، عمل Sort روی master درست انجام میشه ولی روی Detail همه رکورد ها رو محو میکنه و از دید کاربر پنهان میشه.

دلیل محو شدن رکورد ها هم این هست که زمانی که از Master/Detail استفاده میشه ، ایندکسی روی فیلد های ارتباط دهنده دو CleintDataSet ایجاد میشه که به خصوصیت IndexFieldNames نسبت داده میشه. که با تغییر آین Index دیگه هیچ رکوردی رو نشون نمی ده.

خوب حالا راه حل چیه ؟
چه جوری میشه یک جدول Detail رو Sort کنم . آیا روش دیگه ای هم برای Sort کردن CleintDataSet هست ؟

مرسی از همکاری شما