فیلد کلید من توی جدول مستر یه فیلد autoInc است و در جدول دیتیلز یه فیلد Integer . چکار کنم که موقع اضافه کردن یه رکود به جدول مستر ، فیلد مقدار کلید من توی جدول دیتیلز برای تمام رکوردهای مرتبط ، همون مقدار autoInc توی جدول مستر بشه ؟
فیلد کلید من توی جدول مستر یه فیلد autoInc است و در جدول دیتیلز یه فیلد Integer . چکار کنم که موقع اضافه کردن یه رکود به جدول مستر ، فیلد مقدار کلید من توی جدول دیتیلز برای تمام رکوردهای مرتبط ، همون مقدار autoInc توی جدول مستر بشه ؟
MasterSorce جدولی که detail است را data sorce جددول 1 و Master field آنرا فیلد مشترک بگذارید
همین کار رو کرده ام ولی یک مشکل پیش می آد :
تا وقتی که رکورد توی جدول مستر Post نشه ، مقدار فیلد AutoInc مشخص نمی شه و قبل از این که رکورد توی جدول مستر بخواد ذخیره بشه ، رکوردهای جدول دیتیلز ذخیره می شن
من فکر می کنم حتی اگه فیلد شما از نوع AutoInc نبود با توجه به این مطلب که گفتید ابتدا رکورد Detail ذخیره میشه در حالت های دیگه هم به مشکل بر می خورید
چون ابتدا باید همیشه رکورد Master درج شده باشه تا بتونی Detail رو درج کنی
با سلام
من هم مشکل شما را دارم لکن با post کردن بعد ازرویداد AfterInsert جدول مستر مشکل حل میشود
من 8 تا فیلد Not Null دارم ، نمی تونم بدون اطلاعات لازم Post کنم !!!
ظاهرا تو شرایطی که شما دارین نمی تونین از MasterDetail استفاده کنین. چون
1-فیلدهای AutoInc تا قبل از اینکه Post بشن معلوم نیست مقدارشون چقدره
2- همیشه تو جداول Master Detail اول باید Master وارد بشه نه Detail
You never know what you can do until you try
می شه عزیزم
یه تراکنش بازکن، بعد جدول مستر رو با مقادیر پیش فرض برای فیلدهای NotNull پر کن سپس Post کن و مقدار Auto Inc بدست آمده بعد از Post رو در Detail استفاده کن نهایتاً اگر نخواستی این رکورد ذخیره بشه تراکنش رو Rollback کن !
مشکل این جاست که من از DataAware ها استفاده می کنم و این منطقی نیست که مثلا beginTransaction را توی BeforePost و CommitTransaction را توی AfterPost بذارم .
یه راه حل دیگه :
حالا من فیلد را از حالت AutoInc در آوردم و همون Integer کردم . توی MSSQL تا زمانی که رکورد جدول مستر پست نشه اجازه نمی ده که رکورد دیتیلز مرتبط با اون پست بشه .
توی دلفی این قضیه کاملا برعکسه ، اول رکوردهای دیتیلز پست می شن و بعد رکورد مستر .
برای همین خطا پیش می آد و رکوردها ثبت نمی شن .
محمد جان روش ذکر شده رو بنده در حداقل یکی دو تا برنامه نسبتا بزرگ بکار بردم و هیچ مشکلی هم راجع به SQL Server وجود نداره . مطلقاًً نیاز نیست این قدر خودت رو به رویداد های DataSet مقید کنی بعد از عمل Post می تونی Commit کنی و نیازی به استفاده از رویداد نیست و ... به همان روشی که گفتم حتی با وجود فیلد Auto Inc مشکل ات حل می شه !!!نوشته شده توسط Mohammad_Mnt
1 ) مهران جان ، مشکل محل قرار گیری Brgin,Commit,RollBack است . این ها رو توی کدوم Event ها قرار بدم ( من دارم از DataAware ها استفاده می کنم ها )
2 ) راه حل این مشکل چیه ؟ فیلدهای کلید من Integer و NotNull هستند . توی MSSQL تا زمانی که رکورد جدول مستر پست نشه اجازه نمی ده که رکورد دیتیلز مرتبط با اون پست بشه .
توی دلفی این قضیه کاملا برعکسه ، اول رکوردهای دیتیلز پست می شن و بعد رکورد مستر .
برای همین خطا پیش می آد و رکوردها ثبت نمی شن .
به هیچ Event خاصی نیاز نیست ، قبل از Append عمل آغاز تراکنش رو انجام بده. و عمل Post در یک Try ... Except ... end قرار بده حالا به این شکل:) مهران جان ، مشکل محل قرار گیری Brgin,Commit,RollBack است . این ها رو توی کدوم Event ها قرار بدم ( من دارم از DataAware ها استفاده می کنم ها )
try
DM.ADOCon.BeginTrans;
DM.Table1.Append;
DM.Table1.fieldByName('SomeField').Asinteger:=1;
DM.Envelops.Post;
DM.ADOCon.CommitTrans;
except
DM.ADOCon.RollbackTrans;
end
به هیچ عنوان چیزی برعکس نیست تست کن متوجه میشی که دقیقاً در دلفی هم تا رکورد جدول مستر رو نساخته باشی دیتیل تو ثبت نخواهد شد مگر برای رکوردهای مستری که قبلاً ثبت شده باشند. ضمنا فیلد های Not Null در جداول ات رو با مقادیر معتبر پیش فرض پرُ کُن !!!) راه حل این مشکل چیه ؟ فیلدهای کلید من Integer و NotNull هستند . توی MSSQL تا زمانی که رکورد جدول مستر پست نشه اجازه نمی ده که رکورد دیتیلز مرتبط با اون پست بشه .
توی دلفی این قضیه کاملا برعکسه ، اول رکوردهای دیتیلز پست می شن و بعد رکورد مستر .
برای همین خطا پیش می آد و رکوردها ثبت نمی شن
چون طبق گفته خودشون از DataAware استفاده میکنن. اگر بخوان به روش شما عمل کنن باید مثلا هنگام ورود به فرم تراکنش رو شروع کنن و هنگام تثبیت نهائی اون رو قطعی کنن. که این روش زیاد جالب به نظر نمیرسه.یه تراکنش بازکن، بعد جدول مستر رو با مقادیر پیش فرض برای فیلدهای NotNull پر کن سپس Post کن و مقدار Auto Inc بدست آمده بعد از Post رو در Detail استفاده کن نهایتاً اگر نخواستی این رکورد ذخیره بشه تراکنش رو Rollback کن !
خوب همونطور که دوستمون گفتن رکورد Master رو با یه سری مقادیر پیش فرض ایجاد کنید و در آخر مقادیرش رو به روز رسانی کنید.یه راه حل دیگه :
حالا من فیلد را از حالت AutoInc در آوردم و همون Integer کردم . توی MSSQL تا زمانی که رکورد جدول مستر پست نشه اجازه نمی ده که رکورد دیتیلز مرتبط با اون پست بشه .
توی دلفی این قضیه کاملا برعکسه ، اول رکوردهای دیتیلز پست می شن و بعد رکورد مستر .
یا اینکه از جداول موقت استفاده کنید
You never know what you can do until you try
متاسفانه متوجه منظورت نشدم !!!چون طبق گفته خودشون از DataAware استفاده میکنن. اگر بخوان به روش شما عمل کنن باید مثلا هنگام ورود به فرم تراکنش رو شروع کنن و هنگام تثبیت نهائی اون رو قطعی کنن. که این روش زیاد جالب به نظر نمیرسه.
فرض کنید من یک فاکتور فروش دارم . هنگام ورود اطلاعات ، هر دو جدول مستر و دیتیلز در حالت Insert هستند و شماره فاکتور می تونه تغییر کنه .
اگه من توی MSSQL جدول مستر را با دیتیلز مرتبط کنم ، دیگه نمی تونم عمل Post را توی دلفی انجام بدم و خطا پیش می آد
یعنی من از DBGrid و DBNavigator استفاده می کنم که Post و Delete و ... را اتوماتیک صدا میزنهمتاسفانه متوجه منظورت نشدم !!!
دوستمون گفتن کهاگه من توی MSSQL جدول مستر را با دیتیلز مرتبط کنم ، دیگه نمی تونم عمل Post را توی دلفی انجام بدم و خطا پیش می آد
شما بیا اول Master رو Insert کن با یه مقادیر پیش فرض
آخر سر مقادیر Master رو اصلاح کن.
You never know what you can do until you try
چطوری آخه ! کاربر روی دکمه + کلیک می کنه و یه رکورد Insert می شه . حالا من کجا باید این کاری که گفتین را انجام بدم ؟ ( یه نگاه به عکس بندازین )
متاسفانه من از فرم چیزی نفهمیدم
یعنی ترتیب کارهائی که کاربر باید انجام بده مشخص نیست
You never know what you can do until you try
مشکل تو اینه که به شدت وابسته به ساختار استاندارد تعریف شده در دلفی هستی ، نمونه اش هم اینکه آیا نیازی هست که حتما از DBNavigator استفاده کنی ؟ من که فکر نمیکنم . این کنترل یک کنترل خوب ولی در عین حال دارای محدودیت هستش و به نظر من به درد کار حرفه ای نمی خوره (آقا این نظر منه پس کسی کَل کَل راه نندازه !).
این فاکتور فروش یه کارخانه سنگبری است . اون کادر Details مربوط به آیتم های اون فاکتور است . آیتم ها از طریق یه DBGrid نشون داده می شن و از طریق DBEditBox ها ویرایش می شن . Navigator وسطی مربوط به آیتم ها و Navigator پایینی مربوط به کل فاکتور است . البته این فرم کامل نیست .متاسفانه من از فرم چیزی نفهمیدم
اگه استفاده نکنم چطور Insert,Delete کنم یا به رکوردهای قبلی و بعدی برم ؟آیا نیازی هست که حتما از DBNavigator استفاده کنی
حرفا میزنی ها !!!!!!!!! یه بار کل متد های یک DataSet رو مرور کن ببین چی دستگیرت می شه؟اگه استفاده نکنم چطور Insert,Delete کنم یا به رکوردهای قبلی و بعدی برم ؟
مهران جون ، آخرش مجبورم همون کارهای navigator رو خودم انجام بدم دیگه !!!
اصلا این کدی که نوشتی رو توی هیچ Event ای نمیشه گذاشت !!!
try
DM.ADOCon.BeginTrans;
DM.Table1.Append;
DM.Table1.fieldByName('SomeField').Asinteger:=1;
DM.Envelops.Post;
DM.ADOCon.CommitTrans;
except
DM.ADOCon.RollbackTrans;
end
یه کار دیگه ، اگه شما بخوای فرم ورود اطلاعات یه فاکتور فروش رو به صورت مستر / دیتیلز بنویسی از اول چه کار می کنی ؟
دقیقآً همان کاری که گفتم رو می کنم . این کد رو هم می تونی در هر رویدادی ازجمله FormShowیه کار دیگه ، اگه شما بخوای فرم ورود اطلاعات یه فاکتور فروش رو به صورت مستر / دیتیلز بنویسی از اول چه کار می کنی ؟
Or Button Click استفاده کنی .خوش باشی!
من می خوام از DBEdit و DBCheckBox و .... استفاده کنم . این که شما نوشتین :
DM.Table1.fieldByName('SomeField').Asinteger:=1;
در صورتی است که از این کنترل ها استفاده نشه . همون طور که می دونی این کنترل ها مستقیما روی خود فیلد کار می کنن .
در صورتی که از کنترلهای مذکور استفاده می کنی فقط نیاز داری عمل Insert و Post رو انجام بدی باقیش با خود دلفی . خوش باشی !!!نوشته شده توسط Mohammad_Mnt
پس چطوری این کارها رو بین BeginTransaction و CommitTransaction قرار بدم ؟
قبل از عمل Append شروع بهBeginTrans کن وبعد از Post هم Commit کن دیگه!!!نوشته شده توسط Mohammad_Mnt
برای درج درون یک جدول که تراکنش کاربردی نداره. تراکنش زمانی کاربرد داره که اطلاعات شما بیش از یک رکورد باشه یا رکوردها درون بیش از یک جدول باشه و بخواهید یا همه باشن یا هیچ کدام نباشنقبل از عمل Append شروع بهBeginTrans کن وبعد از Post هم Commit کن دیگه!!!
شما اگه اطلاعاتتون شرایط فوق رو دارن باید ساختاری رو درنظر بگیرید که احتاجاتتون رو براورده کنه نه ساختاری که راحت تر باشید و شما تنها کسی هستید که میدونید چی می خواهید و هدفتون و شرایطتون چیه. ولی یه کار میتونید بکنید.پس چطوری این کارها رو بین BeginTransaction و CommitTransaction قرار بدم ؟
هنگام درج اولین رکورد Detail تراکنش رو شروع کنید و پس از درج آخرین رکورد اون رو قطعی کنید و در صورت انصراف کاربر اون رو RollBack کنید ولی کلا این روش زیاد جالب نیست. من پیشنهاد می کنم از یک جدول موقت استفاده کنید و در انتها با یک ترا کنش اطلاعات رو به جدول اصلی منتقل کنید.
اگر از BDE استفاده میکنید خاصیت Catched Update هم کمک زیادی به شما می کنه.
You never know what you can do until you try
100% مخالفم !!!هنگام درج اولین رکورد Detail تراکنش رو شروع کنید و پس از درج آخرین رکورد اون رو قطعی کنید و در صورت انصراف کاربر اون رو RollBack کنید ولی کلا این روش زیاد جالب نیست. من پیشنهاد می کنم از یک جدول موقت استفاده کنید و در انتها با یک ترا کنش اطلاعات رو به جدول اصلی منتقل کنید.
شما زمانی از تراکنش استفاده میکنید که در چند جدول دارید عملیات انجام میدهید و این جداول یک ارتباط منطقی با هم دارند ؛ایضاًً در مورد مشکل ایشان این ارتباط یک ارتباط Master/Detailsهست نهایتاً به نظر این حقیر زمانی شما یک تراکنش رو آغاز می کنید که یک رکورد در جدول Master درج می کنید و زمانی این تراکنش رو قطعی میکنید که تمام درج های مورد نظر شما در جداول Details انجام شده باشه و نهایتاً بخواهید کل تراکنش های بر روی این جداول اعمال وقطعی بشه لذا فکر نمی کنم تا زمانی که یک رکورد Master هنوز وجودش قطعی نشده لازم باشه رکوردهای Detail قطعی بشوند . نکته دیگه اینکه اگه از ترکیب ADO/SQL SERVER استفاده میکنی باید بدونی که SQL Server از Nested Transactions (تراکنش های تو در تو)پشتیبانی نمیکند. خوش باشی!!!
قبل از عمل Append شروع بهBeginTrans کن وبعد از Post هم Commit کن دیگه!!!100% مخالفم !!!
شما زمانی از تراکنش استفاده میکنید که در چند جدول دارید عملیات انجام میدهید و این جداول یک ارتباط منطقی با هم دارندهمیشه شرایط متفاوتی وجود داره . بعضی اوقات برای کار روی یک جدول تک هم به تراکنش نیاز داریمولی کلا این روش زیاد جالب نیست.
You never know what you can do until you try
مشکل من اینه که می خوام تو کد نویسی از mastersource ,master field استفاده کنم ولی نمی دونم چطوری باید کدش رو بنویسم !
لطفا کمکم کنید