PDA

View Full Version : یک مشکل در before post



maisam57
سه شنبه 30 آبان 1385, 12:53 عصر
سلام دوستان
من معمولا توی هر فرم بانکامو میگذاشتم و از before post بانک جهت ذخیره محتوای یه edit.text استفاده میکردم
حالا همه بانکارو توی یه datamodule قراردادم چطوری میتونم از before post بانکم استفاده کنم اگر هم مستقیما این کاررو بکنم هر وقت که بانک قراره هر کجای برنامه ذخیره کنه before post ارجاع داده بشه محتوای edit.text توی بانک ذخیره نمیشه من میخوام توی یه فرم اینکار انجام بشه اونم فرم ثبت ولی فرم ویرایش هم ثبت داره و ممکنه مشکل پیش بیاد
ممنون میشم اگه راهنمایی بکنید
با تشکر فراوان

maisam57
سه شنبه 30 آبان 1385, 13:03 عصر
منظوز من وارد کردن این کد بود میخواستم ببینم که چکار باید بکنم


adotable1.fieldbyname('code').asstring:=edit1.text

--------------------
در beforepost

sarvestan
سه شنبه 30 آبان 1385, 13:45 عصر
استفاده از این متد کار با ADO به صورت عمومی توصیه نمی شود ( مگر برای کارهای عمومی و یکسان برای ADO)
بجای این کار هر کجا که می خواهید متد POST را فراخوانی کنید، خودتان مقدار Edit را در متغیر مربوطه قرار دهید و نه در متد BeforePost در ADO

maisam57
سه شنبه 30 آبان 1385, 13:58 عصر
ممنون از شما
یعنی اینکه مقدار فیلد رو در یک متغیر قرار بدم
بعدمیخواستم ببینم چطوری توی جدول ثبت بشه
یعنی از کدام event استفاده کنم
با تشکر

sarvestan
سه شنبه 30 آبان 1385, 17:03 عصر
یک سوال!!! :متعجب:
شما کجا متد post را فراخوانی میکند؟

mzjahromi
سه شنبه 30 آبان 1385, 19:23 عصر
همونطوری که دوستمون گفتن این کار توصیه نمیشه ولی میتونی متد BeforPost رو بیاری توی فرم مورد نظرت و هنگاه ورود به فرم بنویسی


Datamodule1.Table1.Beforpost:=FunctionName;

و موقع خروج بنویسی


Datamodule1.Table1.Beforpost:=Nil;

ولی باز هم میگم جدولی که چند جا ازش استفاده میشه جالب نیست این کار رو بکنی
سعی کن برای درج در بانک از Insert SQL استفاده کنی

ghabil
سه شنبه 30 آبان 1385, 20:29 عصر
اتفاقا استفاده از این متدها توصیه میشه چون پشت اینها سیاست جمع کردن منطق برنامه در یکجا هست که موجب میشه در حالتهای محتلف آدم چیزی رو فراموش نکنه.
اما باید ازشون درست استفاده کنی مثلا تو این سناریو که گفتی: تو یک فیلد داری که باید زمان Insert مقدار دهی بشه نه زمان پست ، پس اگر Mandentory نیست میتونی بزاریش توی AfterInsert و اگر هست میتونی توی BeforPost ، ستیت دیتاست رو تست کنی


if DataSet.State = [dsInsert] then...

اما برای بدست آوردن مقداری که باید توش قرار بدی راه درستت اینه که یک Property تعریف کنی توی دیتاماژول :


property MyFieldData: String; read GetMyFieldData;

حالا توی اون ، شرایط مختلفی که ممکنه برای گرفتن مقدار این فیلد بیاد رو پیش بینی کنی :



function GetMyFieldData:String;
begin
if Screen.ActiveForm is TDataEntryFrom1 then
Result := (Screen.ActiveForm as TDataEntryFrom1).EdField.Text
else if Screen.ActiveForm is TDataEntryFrom2 then
Result := (Screen.ActiveForm as TDataEntryFrom2).EdField2.Text
else raise Exception.Create('Undetermind state for my field');
یا ممکنه بجای خطا دادن یک مقدار دیفالت بدی یا هر کار دیگه ای...
end;


بعد هم راحت بگی



if DataSet.State = [dsInsert] then DataSet.FieldByName := MyFieldData;


این میشه یک کد تمیز.

babak869
جمعه 26 مرداد 1386, 23:36 عصر
توجه :
برای دوستانی که میخوان از روش بالا استفاده کنند و کلا کسانی که میخوان از حالتهای مختلف دیتاسورس با خبر بشن برای اشتفاده از کدهای بالا توجه داشته باشید که حتما یونیت db رو به برنامه اضافه کنید . یعنی :



uses db;


موفق باشید

SYNDROME
شنبه 27 مرداد 1386, 14:22 عصر
با سلام
البته می توانی از Tagخود ADOهم استفاده کنی.
مثلا زمانی که ADO.Tagبرابر 1 بود کد شما اجرا شود.




IF adotable1.Tag = 1 Then
Adotable1.fieldbyname('code').asstring:=edit1.text ;

موفق باشید