PDA

View Full Version : سوال: نگهداري اطلاعات كوئري Detail وقتي توسط فيلد ID به كوئري Master ريليشن دارد قبل از پست كوئري Master



ar_mokhtari
سه شنبه 22 اردیبهشت 1388, 10:35 صبح
سلام به همه همكاران عزيز
من دارم با Delphi7 و بانك SqlServer2000 برنامه اي مينويسم كه داراي يك فرم Invoice (فاكتور فروش) هست. همونطور كه در تاپيك مشابه ملاحظه فرموديد در بانك يك Table به نام Invoice براي مشخصات كلي فاكتور و يك Table به نام InvoiceItems براي مشخصات اقلام فاكتور طراحي كردم و توسط يك فيلد بنام InvoiceID كه در هر دو Table موجود هست به هم RelationShip هستند. (InvoiceID در جدول Invoice كليد نيز ميباشد).
حالا توي فرم كوئري Master كه Invoice باشه Insert ميكنه و بعد از اون كوئري Detail كه InvoiceItem باشه شروع ميكنه به دريافت اطلاعات اولين ركورد اطلاعات و در پايان وقتي ميخوام Postش كنم به فيلد كليد كوئري Master گير ميده. يعني من اينطور برداشت كردم كه وقتي Detail ميخواد پست بشه چون هنوز فيلد متناظرش توي Master پر نشده ايراد ميگيره. اينرو وقتي RelationShip رو برداشتم و درست پست كرد متوجه شدم.
بنده تازه كار هستم اگر سطح سوال پائين هست ببخشيد.

vcldeveloper
سه شنبه 22 اردیبهشت 1388, 13:44 عصر
آیا در داخل دلفی هم بین این دو ارتباط Master\Details برقرار کردید؟ در ضمن، متن پیام خطا را هم قرار بدید.

ar_mokhtari
سه شنبه 22 اردیبهشت 1388, 14:45 عصر
خير، چطور ميتونم در داخل دلفي بين Master/Detail ارتباط برقرار كنم؟ من براي تشخيص InvoiceID فاكتور اصلي قبل از پست كردن كوئري Detail كد نوشتم:
with DataSet do begin
FieldByName('InvoiceItemsID').AsInteger:=AutoNo('I nvoiceItems','InvoiceItemsID');
FieldByName('InvoiceID').AsInteger:=srcInvoice.Dat aSet.FieldByName('InvoiceID').AsInteger;
end;//with
اين تنها ارتباط بين آنهاست.
متن پيغام خطاي دلفي هم :
Project [ProjectName.exe] raised exception class EoleException with message 'Insert statement confilicted with COLUMN FOREIGN KEY constraint 'FK_InvoiceItems_Invoice'.The conflict occurred in database 'DBName', 'Invoice', column'InvoiceID''. Process stopped. Use step or run to continue.

vcldeveloper
سه شنبه 22 اردیبهشت 1388, 18:37 عصر
می تونید برای جدول Detail از یک AdoTable استفاده کنید، و خصوصیات MasterSource و MasterFields آن را تنظیم کنید.
MasterSource باید به DataSourceایی اشاره کند که به جدول Master متصل هست. MasterFields هم فیلد مربوط به جدول Master در جدول Detail را مشخص میکنه.

با انجام این تنظیمات، دلفی خودش ارتباط Master\Details را حفظ می کند، و نیازی به کد نویسی شما نیست.

البته اگر بجای AdoTable از AdoQuery هم برای اتصال به جدول Detail استفاده کنید، می توان با تنظیم خصوصیت DataSource آن، و استفاده از Parameter در Query به نتیجه مشابهی رسید، که چون پیچیدگی اش از روش قبلی بیشتر هست، و در اکثر موارد AdoTable برای جدول Detail کفایت میکنه، من این روش را توضیح نمیدم. اگر علاقه مند بودید، در راهنمای دلفی برای خصوصیت TAdoQuery.DataSource در این مورد توضیح داده شده.

ar_mokhtari
یک شنبه 27 اردیبهشت 1388, 13:26 عصر
من مشكلم حل شد:
من از TADOQuery استفاده كردم و يك پارامتر از نوع Int كه بعد از اسكرول كوئري Master ، ‏InvoiceID رو از Masterميخوند و معادلش رو توي كوئري Detail‌ بر ميگردوند. اينكار باعث اين ميشد كه وقتي فاكتورهاي مختلف رو ميبينيد اطلاعات اقلام مربوط به همان فاكتور فقط نمايش ميشود.
حالا اشكال كارم در اين بود كه كوئري Detail رو بايد خاصيت LockTypeش رو ltBatchOptimistic ميگذاشتم. در غير اينصورت هنگام پست كوئري Detail كه اول بايد پست بشه پيغام خطايي كه شرحش بالا هست رو مشاهده ميفرمائيد. از همه دوستان كه توجه كردند ممنون.