PDA

View Full Version : ارتباط بین دو جدول از طریق داده یکسان عددی



khoshblagh
جمعه 13 تیر 1393, 16:09 عصر
با سلام خدمت دوستان
تصور کنید در یک بانک 2 جدول داریم که یکی جدول اصلی(مستر) که فرضا مشخصات یک چک و مبلغ آن ثبت و در جدول فرعی(دیتل) تعدادی اسم افراد و سهم هر کدام از مبلغ اصلی ثبت میشود. حال اگر قبلا جدول اصلی که مشخصات چک در آن ثبت میشود ثبت میشد و بعدا سراغ جدول فرعی برای ثبت جزئیات میرفتیم براحتی با فیلد ID یکتا (auto number) جدول اصلی به عنوان رابط مسئله حل میشد. در حالیکه هر دو جدول اصلی و فرعی همزمان با داده های مرتبط پر میشوند، پس ID تولید شده قبلی وجود ندارد که بتوان از آن استفاده نمود. به نظر شما چگونه میتوان یک ID یکتا برای این دو جدول به طور همزمان ایجاد کرد؟ متشکرم.

pezhvakco
جمعه 13 تیر 1393, 18:28 عصر
سلام

در حالیکه هر دو جدول اصلی و فرعی همزمان با داده های مرتبط پر میشوند، پس ID تولید شده قبلی وجود ندارد که بتوان از آن استفاده نمود
فکر نمی کنم هر دو جدول همزمان داده ها را وارد نمایند و خود پایگاه داده یه صف برای انجام کارها دارد .

بر فرض هم که این طور باشد، شما می توانین پیش از انجام اضافه کردن ردیف جدید در جدول اصلی، مقدار بیش ترین ID موجود را بگیر و یکی به آن اضافه و با این شناسه کار کن .

khoshblagh
جمعه 13 تیر 1393, 19:15 عصر
با تشکر از پاسختان. منظور من از همزمان این بود که اول اطلاعات جدول مستر وارد ایت باکسها میشود و بدون ثبت در بانک نسبت به ثبت اطلاعات جدول دوم در یک دیبی گیرید اقدام میشود. راستش من هم به این نتیجه رسیدم که شما فرمودید، ولی فکر کردم ممکن است راه بهتری وجود داشته باشد.به خصوص با توجه به اینکه این برنامه در شبکه میباشد ممکن است بین زمانی که ID به روش بالا ایجاد و اطلاعات ثبت نهایی گردد، شخص دیگری به همین روش اقدام نماید که در این صورت مشکلی در زمان ثبت برای ثبت دومین نفر پیش آید.

یوسف زالی
شنبه 14 تیر 1393, 02:16 صبح
مقدار بیش ترین ID موجود را بگیر و یکی به آن اضافه و با این شناسه کار کن

اگر قرار بر این بود که Identity خود جدول موجوده.
این روش اشتباهه. احتمال خیلی زیادی وجود داره که هدر یک سند منتسب بشه به یکی دیگه. حتی اگر تمام احتمالات رو می نیمم کنید. حتی تراکنش هم جوابگو نیست.

شما اول معین کنید که دارید تو دلفی کد کوئری می زنید یا این که این امکان رو دارید که از اس پی استفاده کنید؛
اگر در اس پی هست بهترین راهش استفاده از XML هست.

روشهای زیادی برای این کار موجوده،
- بدون استفاده از Identity، کد یونیکی مثلا از روی GUID تهیه کرده و اینسرت رو انجام بدید.
- از Identity@@ استفاده کنید.
- اول هدر خالی درج کنید، دیتیل بزنید و آخر هدر رو آپدیت کنید..

تمام این کارها هم می باید تراکنش باشند.
بهترین روش دومیه هست.

pezhvakco
شنبه 14 تیر 1393, 09:16 صبح
اول اطلاعات جدول مستر وارد ایت باکسها میشود و بدون ثبت در بانک نسبت به ثبت اطلاعات جدول دوم در یک دیبی گیرید اقدام میشود.

شما داده ها رو چه زمانی وارد جدول های پایگاه داده می کنین .
در اون زمان می توانین مقدار جدید ترین شناسه (اگر ستون Identity داشته باشین) رو از جدول اصلی بدست بیارین(اگه عملیات وارد کردن ردیف جدید در جدول اصلی رو با SP انجام دهید) و سسپ در ادامه هروقت خواستین داده های جدول دوم را ذخیره کنید (مهم نیست پشت سر ذخیره داده در جدول اصلی باشه) ، این مقدار را وارد نمایید.

برای بدست آوردن آخرین Identity می تونین با دستور Scope_Identity کار کنید که می گن بهتره از دو دستور : @@Identityو ident_Current است .

راهنمایی : http://www.dotnettips.info/post/1381/identity-%D9%88-%D9%85%D8%A8%D8%A7%D8%AD%D8%AB-%D9%85%D8%B1%D8%A8%D9%88%D8%B7%D9%87-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-%D9%86%D8%AD%D9%88%D9%87-%D8%A8%D8%AF%D8%B3%D8%AA-%D8%A7%D9%88%D8%B1%D8%AF%D9%86-%D9%85%D9%82%D8%A7%D8%AF%DB%8C%D8%B1-identity

یوسف زالی
شنبه 14 تیر 1393, 10:31 صبح
در اون زمان می توانین مقدار جدید ترین شناسه (اگر ستون Identity داشته باشین) رو از جدول اصلی بدست بیارین(اگه عملیات وارد کردن ردیف جدید در جدول اصلی رو با SP انجام دهید)

بدون استفاده از اس پی هم می تونید این کار رو کنید.