PDA

View Full Version : شماره جا افتاده دریک فیلد id



moustafa
شنبه 15 بهمن 1384, 14:47 عصر
من یک فیلد id دارم که شمارهای ان پشت سرهم یعنی 1و2و3و4 حالا باچه دستوری میتوان شماره که جا افتاده رااز این فیلدپیدا کرد مثلا 10و11و12و13و15و16و17و19
همانطور که ملاحظه میکنید شماره 14و18 جا افتاده
من یه سری قیض دارم که شمارهای ان ردیف با قدر نسبت 1
اطلاعات دریک جدول مستقیما واردمی شود
حالا بنوعی یک رکورد حذف می شه یا در شرط کوئری قرار نمیگره درحالی که شماره باید پشت سرهم باشند

Elham_gh
شنبه 15 بهمن 1384, 15:09 عصر
دوست عزیز
از فیلد Identity نمی توانید بدین شکل استفاده اطلاعاتی بکنید. برای این منظور باید فیلد دیگری در جدولتان در نظر بگیرید. فیلدهای Identity جهت Unique سازی رکوردها و ارتباط بین جداولتان کاربرد دارند.

moustafa
شنبه 15 بهمن 1384, 18:00 عصر
خانم الهام -ق ضمن تشکر ازراهنمائیتون
من متوجه پاسخ جنابعالی نشدم یا منظورم نتوانستم خوب بروسنم
ببیبن من یک ستون دارم که اعداد هستند حالا یه ستون جدید تشکیل می دهم که اطلاعات ان از رکورد بعدی پر می شود(رکورد دوم به رکورداول -سوم به دوم -چهارم به سوم و........
حالا اگر این دوستون را ازهم کسر کنیم درستون جدید اکثر رکودها عدد 1 میشوند الا انهای که پرش داشته اند حالا اگر در کوئری درناحیه کریتیا<>1 راواردکنیم واجرا کنیم به جواب می رسیم
حالا سوال من اینه که ستون دوم راچچوری تشکیل بدم
ستون سوم = ستون دوم ستون اول
1 71 - 70
(اطلاعات یک فیلدازرکورددوم چگونه الحاق بشه به فیلدمجاور در همان جدول )

shayan_delphi
شنبه 15 بهمن 1384, 21:42 عصر
من یک فیلد id دارم که شمارهای ان پشت سرهم یعنی 1و2و3و4 حالا باچه دستوری میتوان شماره که جا افتاده رااز این فیلدپیدا کرد
خوب مقدار هر سلول را با شماره رکورد مقایسه کن.مثلا مقدار سلول چهاردهم باید 14 باشه اگه نبود یعنی جا افتاده.
از دستور Insert into میتونی برای اضافه کردن اون رکورد استفاده کنی.

AminSobati
شنبه 15 بهمن 1384, 21:55 عصر
خانم قدوسی منظورشون این بود که اساسا استفاده از فیلد Identity برای داشتن ترتیب (یا همینطور Rank) در جدول، کار صحیحی نیست و صرفا برای تولید عدد یونیک به کار میره (موافقم).
اما اگر به هر دلیلی شما باید ترتیبی رو در جدول نگهداری کنید و نیاز پیدا کردین که Gapها رو شناسایی کنید، یکی از این دو راه رو به کار ببرید:
1) با یک حلقه جدول رو از بالا تا پایین طی کنید و Gapها رو کشف کنید (توصیه نمیکنم)
2) روش دوم که بهتره این هست که یک بار، جدولی با ترتیب صحیح اعداد بسازید و ازش کمک بگیرید در Join. به این شکل اعداد جا افتاده بدست میاد. این جدول کمکی رو به هر روشی (مثلا Loop) میتونین پر کنین. در این مثال، من دستی این جدول رو برای اطلاعات با حجم کم میسازم:


CREATE TABLE MainTab(
MyNumbers INT
)
GO

-- We skip: 3,6,7 and 8
INSERT MainTab VALUES(1)
INSERT MainTab VALUES(2)
INSERT MainTab VALUES(4)
INSERT MainTab VALUES(5)
INSERT MainTab VALUES(9)
INSERT MainTab VALUES(10)
INSERT MainTab VALUES(11)
GO

CREATE TABLE Helper(
Sequence INT PRIMARY KEY)
GO

-- Insert the correct sequence:
INSERT Helper VALUES(1)
INSERT Helper VALUES(2)
INSERT Helper VALUES(3)
INSERT Helper VALUES(4)
INSERT Helper VALUES(5)
INSERT Helper VALUES(6)
INSERT Helper VALUES(7)
INSERT Helper VALUES(8)
INSERT Helper VALUES(9)
INSERT Helper VALUES(10)
INSERT Helper VALUES(11)
INSERT Helper VALUES(12)
GO

-- Now detect the gaps:
SELECT H.Sequence
FROM MainTab M
RIGHT JOIN Helper H
ON M.MyNumbers=H.Sequence
WHERE M.MyNumbers IS NULL
AND H.Sequence < (SELECT MAX(MyNumbers) FROM MainTab)

M.kavyani
شنبه 15 بهمن 1384, 23:47 عصر
خانم قدوسی منظورشون این بود که اساسا استفاده از فیلد Identity برای داشتن ترتیب (یا همینطور Rank) در جدول، کار صحیحی نیست و صرفا برای تولید عدد یونیک به کار میره (موافقم).

با سلام
پس چه کاری رو پیش نهاد میکنید؟

moustafa
یک شنبه 16 بهمن 1384, 01:10 صبح
متشکر از راهنمائی استاد محترم اقای ثباتی
عرض کنم که من مطلب را بد ادا کردم منظور من از فیلد id یعنی اینکه فیلدی بنام id (ردیف) نه ازنوعidentity
دوست محترم شایان دلفی منظور منو خوب فهمیدند ولی مشکل اینه که اگر ماتعداد مثلا 200 رکورد راحذف کنیم حال شماره رکوردهابا تعداد رکوردها برابر می شود مثلا ما8956 رکورد داریم ولی دران رکوردهای با شمار ه9120 و... موجود می باشند
حالا اگه بخواهم یه مثال بزنم اینطو عنوان می کنم که من یک جلد دسته چک 100 برگی دارم که
ازشماره 98600 شروع وبه شماره 98699 ختم می شود حالا وقتی تمام چکها صادر گردید به هنگام مغایرت گیری متوجه میشوم که تعدادی از چکها به دلیلی ثبت نشدن حالا باید صد برگ چک را تک تک کنترل کنم یا بطریقی شمارهای که پرش داشته اند
حالا تجسم کنید من 100000 رکورددارم مشابه دستچک بالا بیام یک یک انها راکنترل کنم ؟؟؟!!!

AminSobati
یک شنبه 16 بهمن 1384, 23:17 عصر
برای پیدا کردن اعدادی جا افتادن، روشی که توضیح دادم مشکلش چیه

M.kavyani
یک شنبه 16 بهمن 1384, 23:29 عصر
خانم قدوسی منظورشون این بود که اساسا استفاده از فیلد Identity برای داشتن ترتیب (یا همینطور Rank) در جدول، کار صحیحی نیست و صرفا برای تولید عدد یونیک به کار میره (موافقم).

با سلام
پس چه کاری رو پیش نهاد میکنید؟ میخواهم لیستی درست کنم که به ترتیب شماره اشخاص برن و از انبار جنس هایشان را تحویل بگیرند. چه شیوه ای پشنهاد میکند. من همین روش رو در پیش گرفتم ولی شما میگید که درست نیست.
آقای ثباتی منتظر پاسخ هستم.

AminSobati
دوشنبه 17 بهمن 1384, 00:14 صبح
اگر صرفا ترتیب (مثلا اعداد کوچک به بزرگ) مد نظرتون هست، استفاده از Idenitity اشکالی نداره. منظور من این بود که اگر میخواهید این ترتیب همیشه حفظ بشه و با حذف یک عدد، مجددا اعداد جا به جا بشن به شکلی که این فضا پر بشه، Identity مشکل ساز خواهد بود و تنها راهش، کنترل این روال به صورت دستی هست. در مثالی که مطرح کردید، اگر یک نفر از لیست حذف بشه، به هر حال ترتیب به هم نمیخوره و کسی جلو تر از کس دیگه جنسش رو از انبار تحویل نمیگیره (پس Identity مشکل ساز نیست). اما اگر قرار باشه مجددا این اعداد مرتب بشن تا فضای خالی بینشون نباشه، Identity برای این منظور ساخته نشده. مگر اینکه فیلد Identity رو حذف کنین و مجددا اضافه کنین تا اعداد پشت سر هم تولید کنه ولی این عمل اصلا جالب نیست چون کل جدول رو Lock میکنه و تا زمانیکه کارش تموم نشه، Lock برداشته نمیشه.

moustafa
دوشنبه 17 بهمن 1384, 02:34 صبح
اقای ثباتی راه حل شما مشکلی نداشت چون ان دو دوست محترم (خانم قدوسی و اقای شایان دلفی ) نیز وقت گذاشتن خواستم مسئله روشنتر بشه اگر ایده جدیدی داشتند ارائه نمایند
بازهم از بذل عنایات جنابعالی کمال تشکر رادارم

M.kavyani
دوشنبه 17 بهمن 1384, 11:52 صبح
اگر صرفا ترتیب (مثلا اعداد کوچک به بزرگ) مد نظرتون هست، استفاده از Idenitity اشکالی نداره. منظور من این بود که اگر میخواهید این ترتیب همیشه حفظ بشه و با حذف یک عدد، مجددا اعداد جا به جا بشن به شکلی که این فضا پر بشه، Identity مشکل ساز خواهد بود و تنها راهش، کنترل این روال به صورت دستی هست. در مثالی که مطرح کردید، اگر یک نفر از لیست حذف بشه، به هر حال ترتیب به هم نمیخوره و کسی جلو تر از کس دیگه جنسش رو از انبار تحویل نمیگیره (پس Identity مشکل ساز نیست). اما اگر قرار باشه مجددا این اعداد مرتب بشن تا فضای خالی بینشون نباشه، Identity برای این منظور ساخته نشده. مگر اینکه فیلد Identity رو حذف کنین و مجددا اضافه کنین تا اعداد پشت سر هم تولید کنه ولی این عمل اصلا جالب نیست چون کل جدول رو Lock میکنه و تا زمانیکه کارش تموم نشه، Lock برداشته نمیشه.

پس به این نتیجه میرسیم برای اینکه بخواهیم در جدول ترتیب داشته باشیم و نخواهیم که این ترتیب هرگز به هم بخوره باید فیلدی معمولی از نوع Decimal در نظر بگیریم بدون استفاده از Identity.

منظورتون رو درست متوجه شدم؟:خجالت:

AminSobati
دوشنبه 17 بهمن 1384, 18:24 عصر
اینکه هرگز به هم نخوره منظورتون چیه؟ به هر حال Delete شاید داشته باشین؟

M.kavyani
دوشنبه 17 بهمن 1384, 23:39 عصر
اینکه هرگز به هم نخوره منظورتون چیه؟ به هر حال Delete شاید داشته باشین؟
با سلام
مطمئنا" Delete داریم. ولی به صورت دستی مجبوریم که اعداد رو sort کنیم دیگه. به عبارتی رکورد ها رو به تعداد Delete به بالا شیفت بدیم.
این تو ذهنم میگذره. نمی دونم کار درستی هست یا نه. چون لیستی رو که میخواهم ایجاد کنم باید به ترتیب باشد و در انها Gap یا عدد جا افتاده وجود نداشته باشد.

AminSobati
دوشنبه 17 بهمن 1384, 23:49 عصر
فیلد Identity قابل Update نیست. ضمنا اگر از SQL Server 2005 استفاده میکنید، میتونین به راحتی موقع گزارش گیری Rank بدین، به جای اینکه این Rank رو واقعا در جدول نگهداری کنین

M.kavyani
دوشنبه 17 بهمن 1384, 23:54 عصر
فیلد Identity قابل Update نیست. ضمنا اگر از SQL Server 2005 استفاده میکنید، میتونین به راحتی موقع گزارش گیری Rank بدین، به جای اینکه این Rank رو واقعا در جدول نگهداری کنین

ممنون
متوجه منظورتون شدم.
در پناه حق موفق و کامروا باشید