PDA

View Full Version : تخصیص شماره



elham_gharegozloo
پنج شنبه 07 آذر 1392, 08:00 صبح
یک جدول دارم که شماره فاکتور و تاریخ داره، میخواهم شماره فاکتور تخصیص بدهم بدین صورت که تاریخ رو از سیستم بخونه اگه در آن تاریخ (سال تاریخ مهم است) شماره فاکتور نداشتیم سال تاریخ +1 کنه شماره فاکتور تخصیص بده اگه در اون سال فاکتور داشتیم آخرین شماره فاکتور +1 کنه و تخصیص بده

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

محمد سلیم آبادی
پنج شنبه 07 آذر 1392, 08:48 صبح
این کاری که قصد انجام آن را دارید چندان صحیح نیست به دلایلی که در ادامه خواهم آورد.

اساسی ترین ایرادی که این روش خواهد داشت زمانی بروز پیدا میکند که چند کاربر بصورت همزمان در آن واحد قصد بروزرسانی این جدول رو داشته باشند. در این حالت اگر شما از مکانیزم کنترل همزمانی متعارف یعنی Locking استفاده کنید دو حالت پیش خواهد آمد Deadlock یا Waiting زیاد.

ضمنا بحث تنها به درج داده ها ختم نمی شود. ممکن هست در این بین سطرهایی از جدول حذف شوند و جدول تکه تکه شود و در این حالت آن ترتیبی که شما مدنظر دارید به هم خواهد خورد.

اگر این سوال مربوط به پرسش دانشجویی هست. دلیل طرح این سوال را از مدرس مربوطه جویا شوید. چون در عمل و در پروژه های واقعی چنین کاری نه از نظر بهینه سازی و از نظر Performance توجیه ای ندارد. شما بسادگی می توانید هنگام نمایش این ستون را توسط توابع Ranking بدست بیاورید. Partition کنید بر اساس سال و Order by کنید بر اساس تاریخ.

elham_gharegozloo
پنج شنبه 07 آذر 1392, 09:34 صبح
درست است، میشه جهت جلوگیری از تخصیص شماره تکراری و locking از sp-getapplock استفاده کرد، من مشکل کوئری ایجاد شماره فاکتور رو دارم ممنون میشم راهنمایی کنید.

محمد سلیم آبادی
پنج شنبه 07 آذر 1392, 11:44 صبح
من دقیق متوجه سوال نشدم. میخواهید این ستون به صورت فیزیکی در جدول باشه یا هنگام کوئری گرفتن توسط تابعی که گفتم نمایش داده بشه.

با فرض مورد اول: حتما باید ستون مورد نظر از نوع رشته باشد که عدد 1 را مثلا با سال + می کنید و + در اینجا به معنا الحاق (string concatenating) هست نه جمع جبری.
با تابع year و getdate می توانید سال جاری را بدست بیاورید.
توسط عملگر exists می توانید بررسی کنید که آیا سطری در جدول مرتبط به سال جاری هست یا خیر.
توسط تابع left می توانید چهار کاراکتر اول رشته را بدست آورید.
توسط تابع stuff می توانید چهار کاراکتر اول را حذف کنید تا شماره سطر در هر partition بدست آید.

با فرض مورد دوم:

SELECT *, ROW_NUMBER() OVER(PARTITION BY YEAR(date_column) ORDER BY date_column) AS rnk FROM table_name;