PDA

View Full Version : Edit در حالت CanModify نبودن دیتاست



یوسف زالی
دوشنبه 11 اردیبهشت 1391, 19:15 عصر
سلام دوستان.
آقا ما یک کامپوننتی نوشتیم برای گرید که دارای سرجمع هست.
همه چیز خوب و خوشه و حتی اعداد سرجمع از GetText دیتاست تبعیت می کنند.
اون قسمت رو به این شکل نوشتم:

GetTextProc := Self.Columns[i].Field.OnGetText;
if CanModify and Assigned(GetTextProc) then
try
OldReadOnly := Self.Columns[i].Field.ReadOnly;
Self.Columns[i].Field.ReadOnly := false;
Edit;
Self.Columns[i].Field.Value := TextField;
GetTextProc(Self.Columns[i].Field, TextField, true);
Cancel;
Self.Columns[i].Field.ReadOnly := OldReadOnly;
except
end;

حالا مشکل بزرگ اینه که دیتاست هایی که در حالت CanModify نیستند به هیچ وجه اجازه اصلاح موقتی یکی از فیلدهاشونو نمی دن.
این مساله حالا دردسر ساز شده برام.
دوستان لطفا در این باره کمک بفرمایید تا این مشکل باقی مونده هم تموم شه.

خلاصه مشکل:
اصلاح موقتی یک فیلد در دیتاست بدون Post کردن اون، در دیتاست های ReadOnly شده.
خیلی ممنون می شم سریع به دادم برسید!

tiphooo
سه شنبه 12 اردیبهشت 1391, 01:05 صبح
این کدی که شما نوشتید ربطی به سوال دارد یا خیر؟
چون این کد که مشکلی ندارد.فقط به نظر من که شایدجابجایی مقدار فیلد Readonly از روی متغیر OldReadonly کار اضافه ای باشد
چون مادمی که Canmodify است پس قاعدتا Readonly آنها False است و بلعکس
و یکی دیگر اینکه شما دیتاست را به صورت کلی Readonly کرده اید یا فیلد به فیلد؟
و اینکه چه اصراری دارید که مقدار TextField را دو بار به پروسیجر بفرستید مگر نه اینکه تابع GetTextProc که نوشتید عملا مقدار TextField را دارد و اگر در انجا نیاز به برسی دارد همین مقدار کافیست ونیازی به انتصاب آن به مقدار فیلد نیست؟
و اینکه اگر Canmodify در دلفی هم True باشد در دیتابیس کماکان می شود تغییرات را اعمال کرد شما یک Transaction بنویسید و مقدار فیلد را تغییر بدهید و در پایان Rollback کنید
در کل سورس تابع GetTextProc اگر موجود بود شاید بهتر می شد بررسی کرد

یوسف زالی
سه شنبه 12 اردیبهشت 1391, 08:09 صبح
ببینید،
کد ربط به سوال داره.
ReadOnly برای فیلد ها باید تک تک بررسی یشه. برای اینکه مثلا فیلدی AutoInc باشه در حالت نرمال اجازه ادیت ندارید.
ReadOnly بودن دیتاست مثلا در حالت LockType = ltReadOnly می تونه اتفاق بیفته اما ممکنه فیلدی در حالت ltOptimistic هم به صورت موردی ReadOnly باشه.


چون مادمی که Canmodify است پس قاعدتا Readonly آنها False است و بلعکس
اشتباهه. دلیلش رو بالا عرض کردم.
مقدار TextField دوبار پاس نمی شه. اون یک رشته هست برای گرفتن خروجی از GetText. مقدار قبلیش باید در Value فیلد قرار داده بشه. در GetText این متغیر مقدار خروجی رو می گیره و در نهایت به خروجی می ره. فرقی نمی کنه کد درونش چی باشه. شما فرض کن جدا کردن سه رقم سه رقم اعداد هست.
اگر CanModify مقدار true داشته باشه اصلا نمی شه edit کرد. حتی اگر post نشه.
تست کنید می بینید.
تراکنشی که گفتید سمت دلفی هست؟ چون تمام این اتفاقات قراره در کامپوننت دلفی اتفاق بیفته.
این هم سورس تابع:

procedure TMainDM.SpLoansSelectTotalPriceLONGetText(Sender: TField;
var Text: String; DisplayText: Boolean);
begin
if not Sender.DataSet.IsEmpty then
Text := Get_SeparatedFormatBy(IsNull(Sender.Value, 0), true);
end;


تابع SeparatedFormatBy یک عدد دریافت می کنه و یک رشته پس می ده.

tiphooo
چهارشنبه 13 اردیبهشت 1391, 00:35 صبح
به نظر من شما از سایر خصوصیات فیلد برای این کار استفاده کنید خصوصیت Value در صورتی که فیلد ReadOnly باشد قابل تغییر نیست ولی خصوصیت CustomConstraint کاری به ReadOnly بودن فیلد نداشته و حتی برای فیلدهای AutoNumber هم قابل تعریف است
البته این خصوصیات مربوط به فیلد است نه رکورد ولی با توجه به درخواست شما و با توجه به اینکه قبل از فراخوانی تابعتان این مقدار را می توانید تغییر دهید پس ینابراین به ازاء رکوردها این خصوصیت تغییر می کند. و دیگر نیازی هم به بردن دیتاست به حالت Edit نیست
کد مثال شما به صورت زیر در می اید

GetTextProc := Self.Columns[i].Field.OnGetText;
if CanModify and Assigned(GetTextProc) then
try
Self.Columns[i].Field.CustomConstraint := TextField;
GetTextProc(Self.Columns[i].Field, TextField, true);
except
end;

و در قسمت تابع SpLoansSelectTotalPriceLONGetText

if not Sender.DataSet.IsEmpty then
Text := Get_SeparatedFormatBy(IsNull(Sender.CustomConstrai nt, 0), true);

البته نوع خصوصیت CustomConstraint رشته می باشد که در صورت نیاز می توان از تغییر نوعها استفاده کرد
یک خاصیت دیگر DefaultExpresion است که می توانید از آن استفاده کنید

یوسف زالی
چهارشنبه 13 اردیبهشت 1391, 09:53 صبح
بله ممنون. اما مشکلی که وجود داره اینه که دیگه نمی شه این کامپوننت رو یونیورسال دونست.
تشکر از زحمتت

tiphooo
چهارشنبه 13 اردیبهشت 1391, 11:52 صبح
اگر شما قصد نوشتن کامپوننت دارید که دیگه لازم نیست از این خصوصیت استفاده کنید یک خصوصیت جدید دیگه شبیه همین به کلاس TCustomDBGrid اضافه کنید
لازم نیست که در لیست خصوصیتها هم نمایش داده بشه

یوسف زالی
چهارشنبه 13 اردیبهشت 1391, 13:08 عصر
نگرفتید.
قرار هست سرجمع ها طبق GetText های دیتاستی که به گرید وصل هست رفتار کنه.
شما که نمی دونی چه کدی قراره در GetText نوشته بشه و با کدوم خصیصه از فیلد داره کار می شه.
در حال حاضر همه چیز خوبه. اما تنها مشکل باقی مونده رو عرض کردم.