PDA

View Full Version : مشکل در دستور Select(max(abs(id)) sql



kurdistan132
جمعه 11 اردیبهشت 1394, 11:24 صبح
سلام دوستان.من از دستور زیر برای ایجاد شماره فاکتور استفاده میکنم.

Select max(abs(id)) from tblF

شماره هارو به ترتیب میده اما زمانی که جریان برق یهویی قطع بشه و دوباره سیستم راه اندازی بشه موقع اجرای دوباره برنامه شماره مثلأ از ۳۰۰ میپره رو ۱۰۰۵۶۰ و قاطی میشه.دلیلش چی میتونه باشه ؟ راه حل ؟

SabaSabouhi
شنبه 12 اردیبهشت 1394, 09:12 صبح
سلام دوستان.من از دستور زیر برای ایجاد شماره فاکتور استفاده میکنم.

Select max(abs(id)) from tblF

شماره هارو به ترتیب میده اما زمانی که جریان برق یهویی قطع بشه و دوباره سیستم راه اندازی بشه موقع اجرای دوباره برنامه شماره مثلأ از ۳۰۰ میپره رو ۱۰۰۵۶۰ و قاطی میشه.دلیلش چی میتونه باشه ؟ راه حل ؟

سلام
من تو پست‌های متعددی این رو نوشتم که: ستون Id فقط و فقط کلید اصلی هست، برای مقاصد دیگه ازش استفاده نکنید.
دوست من، شما یه ستون با عنوان InvoiceNumber بگیر، و هنگام ذخیره کردن آخرین مقدار رو بگیر و یکی بهش اضافه کن.
Identity شرایط و اصول خودش رو داره که به هیچ عنوان با شرایط و اصول شماره فاکتور برابری نمی‌کنه.
1. اگه به هر دلیل Transaction شما Rollback بشه، مقدار تخصیص شده به اون سطر ثبت نشده، می‌سوزه و دوباره استفاده نمی‌شه.
این باعث می‌شه که توالی شما به هم بریزه.
2. شماره فاکتور در اغلب شرکت‌ها در هر سال مالی از 1 شروع می‌شه. این رو شما می‌تونی با گرفتن یک ستون برای سال مالی، و
ایجاد یک اندیس یکتا برای ترکیب سال مالی و شماره فاکتور به راحتی کنترل کنی. اما با Id چه‌کاری می‌تونی انجام بدی؟

اجازه بده هر چیزی سرجای خودش باشه و وظیفه‌ی خودش رو انجام بده.

صبا صبوحی

pezhvakco
یک شنبه 13 اردیبهشت 1394, 17:06 عصر
Select max(abs(id)) from tblF
چرا ABS رو بکار بردین .


موقع اجرای دوباره برنامه شماره مثلأ از ۳۰۰ میپره رو ۱۰۰۵۶۰ و قاطی میشه
یعنی بیش ترین شماره اون ستون ID در جدول 299 است و خروجی کد دستور شما 100560 است .

این طور نمیشه چون یه قطع و وصل برق چه کار داره با داده های جدول ها .

FastCode
یک شنبه 13 اردیبهشت 1394, 18:02 عصر
از ۳۰۰ میپره رو ۱۰۰۵۶۰ و قاطی میشه

execution plan?

reza_ali202000
شنبه 26 اردیبهشت 1394, 22:48 عصر
این max میاد نوع Id رو میگیره.
یعنی مثلا اگه int باشه میاد توی جداول سیستمی و غیر سیستمی بانک اطلاعاتیتون بزرگترین نوع داده رو برمیگردونه.
یعنی عملا نوع داده و مقدار داده جابجا میشه.
بهترین راه کار اینه که :
select top 1 id from tbl1 order by desc
میاد اخرین id رو میگیره و بعد میتونین حالا یا اون id رو با یک جمع کنین یا هر کار دیگه ای که خاستین.