ورود

View Full Version : insert کردن در یک جدول وابسته



sima_gh7
جمعه 18 شهریور 1384, 01:36 صبح
من دو تا جدول درserver sql دارم که بوسیله یک کلید اصلی با هم در ارتباطند ، که این فیلد در یکی از جدولها به عنوان فیلد identity هست .
در جدول اول فیلد id فیلد identity و همینطور به عنوان کلید اصلی است و در جدول دوم فیلدهای id و name با هم کلید اصلی هستند و id کلید خارجی است .اطلاعات مربوط به این جداول در یک فرم در دلفی توسط کاربر وارد میشن . برای insert اطلاعات به جدول اول مشکلی نیست ، ولی برای وارد کردن اطلاعات در جدول دوم نمی دونم چطور قبل از post کردن اطلاعات به جداول ، فیلد id جدول دوم رو به فیلد id جدول اول ارجاع بدم ، و اطلاعات مربوط به فیلد name( مربوط به id جدید) که توسط کاربر در یک DBComboBox قرار گرفتند را در جدول دوم وارد کنم (که بسته به تعداد name هایی که کاربر در DBComboBox وارد کرده باید رکورد جدید به جدول دوم اضافه بشه ).
البته من از یک ADOquery استفاده کردم و کد زیر رو در ویژگی sql اون نوشتم :
SELECT * From project , office
که project و office به ترتیب جدولهای اول ودوم هستند .

vcldeveloper
جمعه 18 شهریور 1384, 04:00 صبح
اگه می خواید از از طریق دستور SQL اطلاعات این دو جدول رو بدست بیارید، باید این ارتباط رو در دستور SQL هم مشخص کنید. مثلا:


SELECT * FROM Project, Office WHERE Project.ID = Office.ID

دستور شما در بالا هیچ ارتباطی بین دو جدول برقرار نمیکنه. در صورت استفاده از Join در update یا Insert کردن اطلاعات مشکلی ندارید، اما ممکنه در هنگام Delete کردن رکوردها به مشکل بر بخوردید که می تونید قبل از هر عمل Delete با استفاده از پراپرتی Unique Table جدولی رو که باید عمل حذف روش انجام بشه، مشخص کنید:


ADOQuery1.Properties['Unique Table'].Value := 'Your_Table_Name';


راه حل آسونتر استفاده از امکانات دلفی برای ساختن یک رابطه Master/Detail هست:
شما می تونید از دوتا DataSet استفاده کنید. یکی برای جدول اول و یکی هم برای جدول دوم. یک DataSource هم برای اتصال به جدول اول لازم هست. حالا می تونید در Properties Inspector برای DataSource دوم (Detail)، خصوصیت MasterSource را روی اسم DataSouce ایی که به DataSet اول وصل هست، تنظیم کنید و در خصوصیت MasterField دو فیلد id از هر دو جدول را انتخاب کنید تا دلفی یک ارتباط Master/Detail برای شما بوجود بیاره.
بعد از انجام این کار، دلفی عملیات Scroll, Insert و Update جدول Detail را کنترل می کنه، یعنی با حرکت بر روی رکوردهای Master، رکوردهای مربوطه در Detail نمایش داده میشند و با Insert یک رکورد در جدول Master، رکوردهای Detail خالی میشند. با Insert یک رکورد در جدول Detail مقدار فیلد id با توجه به رکورد جاری در جدول Master بصورت خودکار توسط دلفی در رکورد جدید درج میشه.

sima_gh7
جمعه 18 شهریور 1384, 15:26 عصر
فرمایش شما درسته ولی مشکل من اینه که قبل از اینکه اطلاعات به جدول اول post بشه ، باید اطلاعات رو به جدول دوم post کنم . که با توجه به اینکه هنوز رکورد مربوطه در جدول اول درج نشده error ، SqlServerمیده

m-khorsandi
شنبه 19 شهریور 1384, 08:12 صبح
درود

ببینید شما اگه پیاده سازی جداولتون و RelationShip ها رو در SQL Server کامل انجام انجام داده باشید مسلما" با چنین مشکلی روبرو میشید، اگه بعضی از اطلاعاتی که در جدول Master قرار میگیره وابسته هست به جدول Detail شما میتونید همون روند معمول یعنی قرار دادن اطلاعات در جدول Master و بعد Detail رو انجام بدید و برای جدول Detail یه Trigger بنویسید.

یا اینکه یک رکورد به صورت رزرو وارد جدول Master کنید و PK اون رو نگه دارید و از PK اون برای جدول Detail استفاده کنید و بعد از تکمیل اطلاعات جدول Detail سراغ جدول Master برید که PK اون رو قبلا" نگه داشتید و ....

ولی من راه اول رو پیشنهاد میکنم.