ايران ويج

نسخه‌ی کامل: درخواست راهنمایی برای به دست آوردن اولین کد آزاد !!!
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام دوستان .

در قسمت ثبت نام برنامه ام قسمتی به نام کد اشتراک وجود داره ، که برای هر مشترک باید یک شماره اختصاصی ( که قبلا ثبت نشده و آزاد هست ) ثبت بشه .

من میخوام کاری کنم که با زدن دکمه X اولین شماره مجاز برای وارد کردن ، به عنوان کد اشتراک به کاربر نمایش داده بشه ( کاری که همه برنامه های حسابداری و ... انجام می دن ) .

در ضمن من از MSado استفاده کردم .

نام جدول : Table1

نام فیلدی که کد اشتراک درش ذخیره میشه : mycode

ممنون .
معمولا تمام سیستم های بانک اطلاعاتی یه فیلد identity دارن که مقدار اون یکتا هست (معمولا از نوع int و AutoNumeric)موقعی که میخواهین کد اشتراک اختصاص بدین میتونین یه select بزنین
کد:
select (max(id)+1)eshterak from table
در اینجا id فیلدidentity و table اسم جدولی هست که میخواهید شماره اشتراک رو از اون بیرون بکشین
نقل قول: عمولا تمام سیستم های بانک اطلاعاتی یه فیلد identity دارن که مقدار اون یکتا هست (معمولا از نوع int و AutoNumeric)

فیلد من AutoNumeric نیست و نمیخوام هم که باشه .
نقل قول: وقعی که میخواهین کد اشتراک اختصاص بدین میتونین یه select بزنین
کد:
select (max(id)+1)eshterak from table
در اینجا id فیلدidentity و table اسم جدولی هست که میخواهید شماره اشتراک رو از اون بیرون بکشین

شما در این روش هر دفعه مقدار آخرین فیلد رو + 1 کردین و به کاربر نمایش میدین .

خودم هم اول خواستم از این روش استفاده کنم ولی این روش تا زمانی جواب میده که :


1 - کاربر رکوردی رو حظف نکرده باشه ، مثلا اگه کاربر بعد از ثبت 20 تا رکورد بیاد رکورد 5 رو حظف کنه و ما از روش فوق برای به دست آوردن شماره آزاد استفاده کنیم دیگه شماره 5 هیچ وقت به کاربر پیشنهاد نمیشه .

2 - کاربر به طور دستی شماره اشتراک رو وارد نکرده باشه ، مثلا کاربر به طور خود سر شماره 21 رو وارد کرده
و تا العان هم 20 تا رکورد تو جدول ثبت شده ، حالا اگه بر روی X کلیک کنه شماره 21 که قبلا ثبت شده به کاربر پیشنهاد میشه .

دوستان یادتون باشه من میخوام با زدن دکمه X اولین شماره آزاد به کاربر پیشنهاد بشه .

ممنون .
با سلام

بهتره بجای اینکه راههای پیچیده درست کنیم ،راههای کوتاه و صحیح رو یاد بگیریم .
کد اشتراک تو دیتابیس به عنوان کلید استفاده میشه یعنی کد باید یکتا باشه .

اگر کسی از لیست حذف شد نباید کد اشتراکش به شخص دیگری داده شود برای همین خاطر بهترین و اصولی ترین راه استفاده از فیلد AutoNumber است .

ولی خوب اگه نمیخواهیین کارتون اصولی باشه میشه اینطوری کار کرد :

وقتی رکوردی حذف میشه کد اونو تو یه فایل و یا یک تیبل ذخیره کنیم و موقع اضافه شدن رکورد جدید کوچکترین عدد رو از فایل یا تیبل بخونیم و بدیم به کد اشتراک
ویا
موقع ثبت یک به یک چک کنیم و اولین کد اشتراک خالی رو پیدا کنیم
ویا
قبل از ثبت اشتراک جدید با یک مرور در کل کدهای اشتراک اولین محل خالی رو پیدا کینم یعنی :یک حلقه از 1 تا بزرگترین عدد اشتراک اگر شمارنده حلقه بغییر از کد اشتراک فعلی بود یعنی اون شماره حلقه میتونه یک کد اشتراک باشه

ویا مدلهای دیگه که من بلد نیستم .
(۱۵-مهر-۱۳۸۸, ۱۳:۳۴:۴۹)1120 نوشته است: [ -> ]فیلد من AutoNumeric نیست و نمیخوام هم که باشه .
در این حالت میتونین از مقدار uniqidentifier استفاده کنین
نقل قول: وقعی که میخواهین کد اشتراک اختصاص بدین میتونین یه select بزنین
کد:
select (max(id)+1)eshterak from table
در اینجا id فیلدidentity و table اسم جدولی هست که میخواهید شماره اشتراک رو از اون بیرون بکشین

شما در این روش هر دفعه مقدار آخرین فیلد رو + 1 کردین و به کاربر نمایش میدین .
[/quote]
خیر من max یعنی بزرگترین عددی که موجود هست رو +1 میکنم نه اخرین
نقل قول: خودم هم اول خواستم از این روش استفاده کنم ولی این روش تا زمانی جواب میده که :

1 - کاربر رکوردی رو حظف نکرده باشه ، مثلا اگه کاربر بعد از ثبت 20 تا رکورد بیاد رکورد 5 رو حظف کنه و ما از روش فوق برای به دست آوردن شماره آزاد استفاده کنیم دیگه شماره 5 هیچ وقت به کاربر پیشنهاد نمیشه .
قطعا هم نباید بشه چون دارین از auto numeric استفاده میکنین
(البته میشه در این شرایط هم خمچین کاری کرد شما یه سلکت تو در تو میزنین که خروجیش 1 رکورد باشه و عددی باشه که بیه id ها نباشه بعد با استفاده از دستور DBCC CHECKIDENT اون شماره رو اضافه میکنین)
نقل قول: 2 - کاربر به طور دستی شماره اشتراک رو وارد نکرده باشه ، مثلا کاربر به طور خود سر شماره 21 رو وارد کرده
و تا العان هم 20 تا رکورد تو جدول ثبت شده ، حالا اگه بر روی X کلیک کنه شماره 21 که قبلا ثبت شده به کاربر پیشنهاد میشه .
مهندس در حالت auto numer کاربر نمیتونه خودش مقدار بده بلکه خود sqlserver مقدار دهی میکنه و اگه شما مقدارتون Auto نباشه با استفاده از( select(max(id)+1 مقداری که پیشنهاد میشه 22 هست نه 21 چون بزرگترین عدد حال حاظر شما 21 هست
نقل قول: کلا روشی که mostafa_bahar گفت بهتر و جوابگو تره .
دوستان یادتون باشه من میخوام با زدن دکمه X اولین شماره آزاد به کاربر پیشنهاد بشه .
ممنون .
شما یه sp مینویسی که max id داخل بانک رو بگیره با یک select چک کنه اگه توشو یک مقدار خالی بود که اونو انتخاب کنه اگه نه مقدار max+1 رو به عنوان خروجی بده

(شما بهتره قبل از زدن پست یه تست میکردین)
نقل قول: اگر کسی از لیست حذف شد نباید کد اشتراکش به شخص دیگری داده شود

حامد جان میشه بگی چرا ؟

نقل قول: خیر من max یعنی بزرگترین عددی که موجود هست رو +1 میکنم نه اخرین

ببخشید منظورم همون بیشترین بود .
مشکلم حل شد . کد رو میزارم بقیه دوستان هم استفاده کنند .


کد:
Private Function LastFreemycode() As Long

Dim i As Long

Call OpenDataBase
    
rs.Open "SELECT mycode FROM Table1 ORDER BY mycode ASC", cn, adOpenStatic, adLockBatchOptimistic
      
If rs.RecordCount = 0 Then
  LastFreemycode = 1
  Call CloseDataBase
  Exit Function
End If
            
i = 1
While rs.EOF = False
If i <> rs.Fields("mycode").Value Then
LastFreemycode = i
Call CloseDataBase
Exit Function
End If
rs.MoveNext
i = i + 1
Wend

LastFreemycode = i
rs.Close

End Function

.
این راه حل برای تراکنشهای کم و رکوردهای پایین خوبه مثلا در رکوردها ی بالا و تعداد دفعات تکرار بالا انجام این کار به سیستم خیلی فشار میاره

همیشه روش های استاندارد بهتر و راحترن
(۱۵-مهر-۱۳۸۸, ۱۷:۲۱:۲۸)1120 نوشته است: [ -> ]حامد جان میشه بگی چرا ؟
فرض کنید یک برنامه برای مدیریت یک کتابخانه نوشتید و اعضا رو به همین روش خودتون اضافه و حذف میکنین و مطمعنن یک لیست هم برای ثبت کتابهای عاریه دارین حالا اگر عضو شماره 4 کتاب شماره 8 رو امانت گرفته باشه و بعدا پس داده باشه و بعد چند روز حذف عضویت کرده باشه و شما یک کاربر جدید رو با کد 4 ثبت کرده باشین دیگه دسترسی به تاریخچه کاربر سخت میشه و بعضی مواقع غیر ممکن .

حالا اگه تاکید بر عدم استفاده از کلید یکتا هستید پس بهتره از روش پیشنهادی یک استفاده کنین یعنی محذوفات رو تو یه لیست ثبت کنین و یا حذف رو منطقی کنین تا بشه بعدا اونو رونویسی کرد .

در ضمن مطالعه این کتاب میتونه مفید باشه :
http://forum.iranled.com/attachment.php?aid=504
(۱۵-مهر-۱۳۸۸, ۱۷:۲۱:۲۸)1120 نوشته است: [ -> ]
نقل قول: اگر کسی از لیست حذف شد نباید کد اشتراکش به شخص دیگری داده شود

حامد جان میشه بگی چرا ؟

نقل قول: خیر من max یعنی بزرگترین عددی که موجود هست رو +1 میکنم نه اخرین

ببخشید منظورم همون بیشترین بود .
مشکلم حل شد . کد رو میزارم بقیه دوستان هم استفاده کنند .


کد:
Private Function LastFreemycode() As Long

Dim i As Long

Call OpenDataBase

rs.Open "SELECT mycode FROM Table1 ORDER BY mycode ASC", cn, adOpenStatic, adLockBatchOptimistic

If rs.RecordCount = 0 Then
LastFreemycode = 1
Call CloseDataBase
Exit Function
End If

i = 1
While rs.EOF = False
If i <> rs.Fields("mycode").Value Then
LastFreemycode = i
Call CloseDataBase
Exit Function
End If
rs.MoveNext
i = i + 1
Wend

LastFreemycode = i
rs.Close

End Function

.

به نظر من این کد می تونه بهتر باشه. حالا خودت نام Ado رو تغییر بده.

کد:
Ado.recordset.movelast
LastFreemycode=ado.recordset.fields("mycode") +1