شماره فاکتور منحصر به فرد
سلام و خسته نباشید
سیستم هایی که مینویسیم چون تحت شبکه هست و چندین کاربر قراره باهاش کار کنن، یه جا پیش میاد که دو یا چند کاربر به صورت همزمان میخوان اطلاعات رو ثبت کنن(مثل صدور فاکتور و...) که باید سیستم به هرکدوم یه شماره فاکتور جدا بده
برای مثال وقتی کاربرفرم مخصوص به صدور فاکتور رو باز میکنه اتومات یه شماره دریافت میکنه(برای مثال 1070). حالا اگه به طور همزمان یک کاربر دیگه فرم صدور فاکتور رو باز کنه دوباره شماره 1070 رو دریافت میکنه، در صورتی که ش 1070 قبلا توسط کاربر اول گرفته شده بود و هنوز فاکتور رو ثبت نکرده، و الان کاربر دوم هم شماره 1070 میگیره و وقتی هردو کاربر اقدام به ثبت کنند در دیتا بیس دوتا فاکتور مجزا داریم و با یک شماره فاکتور.
در خیلی از سیستم ها دیدم که وقتی یکی میخواد یه سند ثبت کنه با بقیه کاربران هماهنگ میکنه که کسی در حال ثبت نباشه چون شماره فاکتور تکراری میشه و سیستم قادر نیست به کاربران به طور همزمان شماره فاکتور منحصر به فرد بده. این مشکل چگونه باید برطرف بشه که ده ها کاربر به طور هزمان بتونند اقدام به ثبت فاکتور کنند و مشکلی پیش نیاد و سیستم به طور همزمان به کاربران شماره سند یا فاکتور منحصر به فرد بده یعنی میخوام تمام شماره هایی که سیستم میده قابل مدیریت باشه
و اینکه اگه کاربری شماره سند یا فاکتور گرفت و بنا به دلایلی اقدام به ثبت نکرد، اون شماره دوباره توسط کاربر دیگری بتونه گرفته شه و شماره سوخت نشه
این موارد بالا رو در سیستم ها دیدم که میگم
اگه کسی سناریو برای این موضوع داره و یا راه حل رو میدونه ممنون میشم توضیح بده
6 پاسخ
پس هر باری که میخواد برنامه اتومات شماره سند بده باید با این دستور چک کنیم که اگه شماره سندی بود که detail، نداشت اون شماره رو برای کاربر بفرستیم
دستور Minus برای oracle هست و توی sql از عبارت expect استفاده میشه.
تو master تمام شماره سندها رو دارین.
تو detail جزئیات سند ها که foreign key از جدول master داره که همون شماره سنده.
حالا هر شماره سندی که تو master باشه که تو detail نباشه یعنی اون شماره سندهایی که خالی هستن و باید مجدد تخصیص داده بشه.
بله
ولی من تاکید می کنم از روش 2 استفاده کنید.
وقتی دکمه ثبت رو زد شماره اختصاص پیدا کنه.
پیشنهاد من در کل استفاده از سناریوی (1) هست.
1- خیلی بهتر و راحت تره
2- استاندارد تره
3- خوانایی برنامه بالاتره
4- شفافیت در دیتابیس بیشتره
5- تعداد QUERY کمتری برای ثبت اطلاعات نیاز دارین.
6- ردیف سندهاتون ترتیبشون رو از دست نمیده.
7- جدول master همیشه حاوی اطلاعاتی هست که در جدول detail هست واینطوری integrity حفظ میشه.
کاری رو که خود engine دیتابیس به راحتی انجام میده چرا باید دستی ایجادش کرد.بزاریم خودش هوشمندانه تر کارهاشو بکنه
مهندس جان با دستورات بالا شماره 2 و 4 خالی میمونه و با دستور except همین دوتا شماره را به دست میاریم
خب با این شماره ها چیکار کنیم
اگه میشه یه توضیحی بدید
به جای دستور except میشه از دستور MINUS استفاده کرد؟
معمولا دو تا سناریو برای تولید شماره سند وجود داره:
1- در ابتدای درخواست صدور سند
2- در انتهای ثبت کلیه موارد و آیتم های سند
اگر از روش 1 استفاده کنید کاربر اگر در بین راه انصراف را بزند شماره تخصیص داده شده بدون detail می مونه.
اگر از روش 2 استفاده کنید کلیه شماره سندها حاوی detail هستن و ترتیب خودشونو حفظ می کنن.
راهکار رفع معضل روش 1:
یه query از جدول Master می زنید با field مربوط به شماره سند و یک query به جدول detail با همون فیلد خارجی از شماره سند.
بین این دوتا query از عبارت except استفاده کنید تا minus دو تا جدولدر بیاد.
اینطوری شماره سندهای رو دارین که براشون detail ثبت نشده.
sort کنید و مجدد استفاده کنید.
create table #master ( id1 int ) create table #detail ( fk_id1 int, Sname nvarchar(1) ) insert into #master (id1) values (1) insert into #master (id1) values (2) insert into #master (id1) values (3) insert into #master (id1) values (4) insert into #master (id1) values (5) insert into #detail (fk_id1,Sname) values (1,'a') insert into #detail (fk_id1,Sname) values (3,'b') insert into #detail (fk_id1,Sname) values (5,'c') select #master.id1 from #master except select #detail.fk_id1 from #detail