View Full Version : فیلد AutoInc و Master/Details
Mohammad_Mnt
پنج شنبه 03 فروردین 1385, 14:15 عصر
فیلد کلید من توی جدول مستر یه فیلد autoInc است و در جدول دیتیلز یه فیلد Integer . چکار کنم که موقع اضافه کردن یه رکود به جدول مستر ، فیلد مقدار کلید من توی جدول دیتیلز برای تمام رکوردهای مرتبط ، همون مقدار autoInc توی جدول مستر بشه ؟
jafari1
جمعه 04 فروردین 1385, 01:16 صبح
MasterSorce جدولی که detail است را data sorce جددول 1 و Master field آنرا فیلد مشترک بگذارید
Mohammad_Mnt
جمعه 04 فروردین 1385, 14:23 عصر
همین کار رو کرده ام ولی یک مشکل پیش می آد :
تا وقتی که رکورد توی جدول مستر Post نشه ، مقدار فیلد AutoInc مشخص نمی شه و قبل از این که رکورد توی جدول مستر بخواد ذخیره بشه ، رکوردهای جدول دیتیلز ذخیره می شن
DataMaster
جمعه 04 فروردین 1385, 20:14 عصر
من فکر می کنم حتی اگه فیلد شما از نوع AutoInc نبود با توجه به این مطلب که گفتید ابتدا رکورد Detail ذخیره میشه در حالت های دیگه هم به مشکل بر می خورید
چون ابتدا باید همیشه رکورد Master درج شده باشه تا بتونی Detail رو درج کنی
Mohammad_Mnt
شنبه 05 فروردین 1385, 13:54 عصر
راه حل چیه ؟
jafari1
شنبه 05 فروردین 1385, 19:11 عصر
با سلام
من هم مشکل شما را دارم لکن با post کردن بعد ازرویداد AfterInsert جدول مستر مشکل حل میشود
Mohammad_Mnt
یک شنبه 06 فروردین 1385, 11:16 صبح
من 8 تا فیلد Not Null دارم ، نمی تونم بدون اطلاعات لازم Post کنم !!!
mzjahromi
یک شنبه 06 فروردین 1385, 13:35 عصر
ظاهرا تو شرایطی که شما دارین نمی تونین از MasterDetail استفاده کنین. چون
1-فیلدهای AutoInc تا قبل از اینکه Post بشن معلوم نیست مقدارشون چقدره
2- همیشه تو جداول Master Detail اول باید Master وارد بشه نه Detail
mehranFX
یک شنبه 06 فروردین 1385, 13:50 عصر
می شه عزیزم
یه تراکنش بازکن، بعد جدول مستر رو با مقادیر پیش فرض برای فیلدهای NotNull پر کن سپس Post کن و مقدار Auto Inc بدست آمده بعد از Post رو در Detail استفاده کن نهایتاً اگر نخواستی این رکورد ذخیره بشه تراکنش رو Rollback کن !
Mohammad_Mnt
یک شنبه 06 فروردین 1385, 16:16 عصر
مشکل این جاست که من از DataAware ها استفاده می کنم و این منطقی نیست که مثلا beginTransaction را توی BeforePost و CommitTransaction را توی AfterPost بذارم .
یه راه حل دیگه :
حالا من فیلد را از حالت AutoInc در آوردم و همون Integer کردم . توی MSSQL تا زمانی که رکورد جدول مستر پست نشه اجازه نمی ده که رکورد دیتیلز مرتبط با اون پست بشه .
توی دلفی این قضیه کاملا برعکسه ، اول رکوردهای دیتیلز پست می شن و بعد رکورد مستر .
برای همین خطا پیش می آد و رکوردها ثبت نمی شن .
mehranFX
یک شنبه 06 فروردین 1385, 19:06 عصر
مشکل این جاست که من از DataAware ها استفاده می کنم و این منطقی نیست که مثلا beginTransaction را توی BeforePost و CommitTransaction را توی AfterPost بذارم .
یه راه حل دیگه :
حالا من فیلد را از حالت AutoInc در آوردم و همون Integer کردم . توی MSSQL تا زمانی که رکورد جدول مستر پست نشه اجازه نمی ده که رکورد دیتیلز مرتبط با اون پست بشه .
توی دلفی این قضیه کاملا برعکسه ، اول رکوردهای دیتیلز پست می شن و بعد رکورد مستر .
برای همین خطا پیش می آد و رکوردها ثبت نمی شن .
محمد جان روش ذکر شده رو بنده در حداقل یکی دو تا برنامه نسبتا بزرگ بکار بردم و هیچ مشکلی هم راجع به SQL Server وجود نداره . مطلقاًً نیاز نیست این قدر خودت رو به رویداد های DataSet مقید کنی بعد از عمل Post می تونی Commit کنی و نیازی به استفاده از رویداد نیست و ... به همان روشی که گفتم حتی با وجود فیلد Auto Inc مشکل ات حل می شه !!!
Mohammad_Mnt
یک شنبه 06 فروردین 1385, 23:13 عصر
1 ) مهران جان ، مشکل محل قرار گیری Brgin,Commit,RollBack است . این ها رو توی کدوم Event ها قرار بدم ( من دارم از DataAware ها استفاده می کنم ها )
2 ) راه حل این مشکل چیه ؟ فیلدهای کلید من Integer و NotNull هستند . توی MSSQL تا زمانی که رکورد جدول مستر پست نشه اجازه نمی ده که رکورد دیتیلز مرتبط با اون پست بشه .
توی دلفی این قضیه کاملا برعکسه ، اول رکوردهای دیتیلز پست می شن و بعد رکورد مستر .
برای همین خطا پیش می آد و رکوردها ثبت نمی شن .
mehranFX
دوشنبه 07 فروردین 1385, 07:14 صبح
) مهران جان ، مشکل محل قرار گیری Brgin,Commit,RollBack است . این ها رو توی کدوم Event ها قرار بدم ( من دارم از DataAware ها استفاده می کنم ها ) به هیچ Event خاصی نیاز نیست ، قبل از Append عمل آغاز تراکنش رو انجام بده. و عمل Post در یک Try ... Except ... end قرار بده حالا به این شکل:
try
DM.ADOCon.BeginTrans;
DM.Table1.Append;
DM.Table1.fieldByName('SomeField').Asinteger:=1;
DM.Envelops.Post;
DM.ADOCon.CommitTrans;
except
DM.ADOCon.RollbackTrans;
end
) راه حل این مشکل چیه ؟ فیلدهای کلید من Integer و NotNull هستند . توی MSSQL تا زمانی که رکورد جدول مستر پست نشه اجازه نمی ده که رکورد دیتیلز مرتبط با اون پست بشه .
توی دلفی این قضیه کاملا برعکسه ، اول رکوردهای دیتیلز پست می شن و بعد رکورد مستر .
برای همین خطا پیش می آد و رکوردها ثبت نمی شن به هیچ عنوان چیزی برعکس نیست تست کن متوجه میشی که دقیقاً در دلفی هم تا رکورد جدول مستر رو نساخته باشی دیتیل تو ثبت نخواهد شد مگر برای رکوردهای مستری که قبلاً ثبت شده باشند. ضمنا فیلد های Not Null در جداول ات رو با مقادیر معتبر پیش فرض پرُ کُن !!!
mzjahromi
دوشنبه 07 فروردین 1385, 11:03 صبح
یه تراکنش بازکن، بعد جدول مستر رو با مقادیر پیش فرض برای فیلدهای NotNull پر کن سپس Post کن و مقدار Auto Inc بدست آمده بعد از Post رو در Detail استفاده کن نهایتاً اگر نخواستی این رکورد ذخیره بشه تراکنش رو Rollback کن !
چون طبق گفته خودشون از DataAware استفاده میکنن. اگر بخوان به روش شما عمل کنن باید مثلا هنگام ورود به فرم تراکنش رو شروع کنن و هنگام تثبیت نهائی اون رو قطعی کنن. که این روش زیاد جالب به نظر نمیرسه.
یه راه حل دیگه :
حالا من فیلد را از حالت AutoInc در آوردم و همون Integer کردم . توی MSSQL تا زمانی که رکورد جدول مستر پست نشه اجازه نمی ده که رکورد دیتیلز مرتبط با اون پست بشه .
توی دلفی این قضیه کاملا برعکسه ، اول رکوردهای دیتیلز پست می شن و بعد رکورد مستر .
خوب همونطور که دوستمون گفتن رکورد Master رو با یه سری مقادیر پیش فرض ایجاد کنید و در آخر مقادیرش رو به روز رسانی کنید.
یا اینکه از جداول موقت استفاده کنید
mehranFX
دوشنبه 07 فروردین 1385, 11:53 صبح
چون طبق گفته خودشون از DataAware استفاده میکنن. اگر بخوان به روش شما عمل کنن باید مثلا هنگام ورود به فرم تراکنش رو شروع کنن و هنگام تثبیت نهائی اون رو قطعی کنن. که این روش زیاد جالب به نظر نمیرسه.
متاسفانه متوجه منظورت نشدم !!!
Mohammad_Mnt
دوشنبه 07 فروردین 1385, 13:04 عصر
فرض کنید من یک فاکتور فروش دارم . هنگام ورود اطلاعات ، هر دو جدول مستر و دیتیلز در حالت Insert هستند و شماره فاکتور می تونه تغییر کنه .
اگه من توی MSSQL جدول مستر را با دیتیلز مرتبط کنم ، دیگه نمی تونم عمل Post را توی دلفی انجام بدم و خطا پیش می آد
متاسفانه متوجه منظورت نشدم !!!
یعنی من از DBGrid و DBNavigator استفاده می کنم که Post و Delete و ... را اتوماتیک صدا میزنه
mzjahromi
دوشنبه 07 فروردین 1385, 16:18 عصر
اگه من توی MSSQL جدول مستر را با دیتیلز مرتبط کنم ، دیگه نمی تونم عمل Post را توی دلفی انجام بدم و خطا پیش می آد
دوستمون گفتن که
شما بیا اول Master رو Insert کن با یه مقادیر پیش فرض
آخر سر مقادیر Master رو اصلاح کن.
Mohammad_Mnt
دوشنبه 07 فروردین 1385, 17:21 عصر
چطوری آخه ! کاربر روی دکمه + کلیک می کنه و یه رکورد Insert می شه . حالا من کجا باید این کاری که گفتین را انجام بدم ؟ ( یه نگاه به عکس بندازین )
mzjahromi
دوشنبه 07 فروردین 1385, 17:36 عصر
متاسفانه من از فرم چیزی نفهمیدم
یعنی ترتیب کارهائی که کاربر باید انجام بده مشخص نیست
mehranFX
دوشنبه 07 فروردین 1385, 19:02 عصر
مشکل تو اینه که به شدت وابسته به ساختار استاندارد تعریف شده در دلفی هستی ، نمونه اش هم اینکه آیا نیازی هست که حتما از DBNavigator استفاده کنی ؟ من که فکر نمیکنم . این کنترل یک کنترل خوب ولی در عین حال دارای محدودیت هستش و به نظر من به درد کار حرفه ای نمی خوره (آقا این نظر منه پس کسی کَل کَل راه نندازه !).
Mohammad_Mnt
دوشنبه 07 فروردین 1385, 20:47 عصر
متاسفانه من از فرم چیزی نفهمیدم
این فاکتور فروش یه کارخانه سنگبری است . اون کادر Details مربوط به آیتم های اون فاکتور است . آیتم ها از طریق یه DBGrid نشون داده می شن و از طریق DBEditBox ها ویرایش می شن . Navigator وسطی مربوط به آیتم ها و Navigator پایینی مربوط به کل فاکتور است . البته این فرم کامل نیست .
آیا نیازی هست که حتما از DBNavigator استفاده کنی
اگه استفاده نکنم چطور Insert,Delete کنم یا به رکوردهای قبلی و بعدی برم ؟
mehranFX
دوشنبه 07 فروردین 1385, 22:14 عصر
اگه استفاده نکنم چطور Insert,Delete کنم یا به رکوردهای قبلی و بعدی برم ؟
حرفا میزنی ها !!!!!!!!! یه بار کل متد های یک DataSet رو مرور کن ببین چی دستگیرت می شه؟
Mohammad_Mnt
سه شنبه 08 فروردین 1385, 20:38 عصر
مهران جون ، آخرش مجبورم همون کارهای 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
یه کار دیگه ، اگه شما بخوای فرم ورود اطلاعات یه فاکتور فروش رو به صورت مستر / دیتیلز بنویسی از اول چه کار می کنی ؟
mehranFX
سه شنبه 08 فروردین 1385, 21:19 عصر
یه کار دیگه ، اگه شما بخوای فرم ورود اطلاعات یه فاکتور فروش رو به صورت مستر / دیتیلز بنویسی از اول چه کار می کنی ؟
دقیقآً همان کاری که گفتم رو می کنم . این کد رو هم می تونی در هر رویدادی ازجمله FormShow
Or Button Click استفاده کنی .خوش باشی!
Mohammad_Mnt
پنج شنبه 17 فروردین 1385, 20:34 عصر
من می خوام از DBEdit و DBCheckBox و .... استفاده کنم . این که شما نوشتین :
DM.Table1.fieldByName('SomeField').Asinteger:=1;
در صورتی است که از این کنترل ها استفاده نشه . همون طور که می دونی این کنترل ها مستقیما روی خود فیلد کار می کنن .
mehranFX
پنج شنبه 17 فروردین 1385, 21:13 عصر
من می خوام از DBEdit و DBCheckBox و .... استفاده کنم . این که شما نوشتین :
DM.Table1.fieldByName('SomeField').Asinteger:=1;
در صورتی است که از این کنترل ها استفاده نشه . همون طور که می دونی این کنترل ها مستقیما روی خود فیلد کار می کنن .
در صورتی که از کنترلهای مذکور استفاده می کنی فقط نیاز داری عمل Insert و Post رو انجام بدی باقیش با خود دلفی . خوش باشی !!!
Mohammad_Mnt
جمعه 18 فروردین 1385, 00:18 صبح
پس چطوری این کارها رو بین BeginTransaction و CommitTransaction قرار بدم ؟
mehranFX
جمعه 18 فروردین 1385, 10:03 صبح
پس چطوری این کارها رو بین BeginTransaction و CommitTransaction قرار بدم ؟
قبل از عمل Append شروع بهBeginTrans کن وبعد از Post هم Commit کن دیگه!!!
mzjahromi
جمعه 18 فروردین 1385, 10:22 صبح
قبل از عمل Append شروع بهBeginTrans کن وبعد از Post هم Commit کن دیگه!!!
برای درج درون یک جدول که تراکنش کاربردی نداره. تراکنش زمانی کاربرد داره که اطلاعات شما بیش از یک رکورد باشه یا رکوردها درون بیش از یک جدول باشه و بخواهید یا همه باشن یا هیچ کدام نباشن
پس چطوری این کارها رو بین BeginTransaction و CommitTransaction قرار بدم ؟شما اگه اطلاعاتتون شرایط فوق رو دارن باید ساختاری رو درنظر بگیرید که احتاجاتتون رو براورده کنه نه ساختاری که راحت تر باشید و شما تنها کسی هستید که میدونید چی می خواهید و هدفتون و شرایطتون چیه. ولی یه کار میتونید بکنید.
هنگام درج اولین رکورد Detail تراکنش رو شروع کنید و پس از درج آخرین رکورد اون رو قطعی کنید و در صورت انصراف کاربر اون رو RollBack کنید ولی کلا این روش زیاد جالب نیست. من پیشنهاد می کنم از یک جدول موقت استفاده کنید و در انتها با یک ترا کنش اطلاعات رو به جدول اصلی منتقل کنید.
اگر از BDE استفاده میکنید خاصیت Catched Update هم کمک زیادی به شما می کنه.
mehranFX
جمعه 18 فروردین 1385, 10:34 صبح
هنگام درج اولین رکورد Detail تراکنش رو شروع کنید و پس از درج آخرین رکورد اون رو قطعی کنید و در صورت انصراف کاربر اون رو RollBack کنید ولی کلا این روش زیاد جالب نیست. من پیشنهاد می کنم از یک جدول موقت استفاده کنید و در انتها با یک ترا کنش اطلاعات رو به جدول اصلی منتقل کنید. 100% مخالفم !!!
شما زمانی از تراکنش استفاده میکنید که در چند جدول دارید عملیات انجام میدهید و این جداول یک ارتباط منطقی با هم دارند ؛ایضاًً در مورد مشکل ایشان این ارتباط یک ارتباط Master/Detailsهست نهایتاً به نظر این حقیر زمانی شما یک تراکنش رو آغاز می کنید که یک رکورد در جدول Master درج می کنید و زمانی این تراکنش رو قطعی میکنید که تمام درج های مورد نظر شما در جداول Details انجام شده باشه و نهایتاً بخواهید کل تراکنش های بر روی این جداول اعمال وقطعی بشه لذا فکر نمی کنم تا زمانی که یک رکورد Master هنوز وجودش قطعی نشده لازم باشه رکوردهای Detail قطعی بشوند . نکته دیگه اینکه اگه از ترکیب ADO/SQL SERVER استفاده میکنی باید بدونی که SQL Server از Nested Transactions (تراکنش های تو در تو)پشتیبانی نمیکند. خوش باشی!!!
mzjahromi
جمعه 18 فروردین 1385, 11:12 صبح
قبل از عمل Append شروع بهBeginTrans کن وبعد از Post هم Commit کن دیگه!!!
100% مخالفم !!!
شما زمانی از تراکنش استفاده میکنید که در چند جدول دارید عملیات انجام میدهید و این جداول یک ارتباط منطقی با هم دارند
ولی کلا این روش زیاد جالب نیست.
همیشه شرایط متفاوتی وجود داره . بعضی اوقات برای کار روی یک جدول تک هم به تراکنش نیاز داریم
maryammb66
سه شنبه 23 فروردین 1390, 14:07 عصر
مشکل من اینه که می خوام تو کد نویسی از mastersource ,master field استفاده کنم ولی نمی دونم چطوری باید کدش رو بنویسم !
لطفا کمکم کنید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.