ورود

View Full Version : درخواست راهنمایی برای به دست آوردن اولین کد آزاد !!!



butterfly8528
سه شنبه 14 مهر 1388, 22:14 عصر
سلام دوستان .

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

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

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

نام جدول : Table1

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

ممنون .

mostafa_bahar
چهارشنبه 15 مهر 1388, 09:00 صبح
سلام شما ابتدا باید مشخص کنید که x کجا زده شود
بعد از زدن x باید بانک و فیلتر کنید به یک شرط غیر ممکن که تمتا رکورد های بانک بیاید بعد دستور sort براساس شماره اشتراک و در آخر یک حلقه while تا آخر بانک که فیلد شماره اشترا ک و با یک عدد که داخل یک متغیر ریختین چک کند اگر برابر نبود به بیرون حلقه پرش کنید و عدد و نمایش بدین شماره اشتراک از یک عددی که شما دوست دارید شروع می شود و در شرط آن عددو یکی یکی افزایش دهید تا عددی که در بانک نیست پیدا شود اگر نشود بگو کد بزارم

powerboy2988
چهارشنبه 15 مهر 1388, 09:07 صبح
شما مي توني اول يك مقدار به اون فيلدي كه مقدارش يونيك هست بدي..
و در دكمه x بياي هر دفعه به اون مقدار اوليه فيلدت يك واحد(يا هر چي كه خودت دوست داري) اضافه كني...
واسه اينكارت 2تا كار مي توني انجام بدي...
1- هر دفعه آخرين عدد اين فيلد رو بخوني و بهش مقدار دلخواه رو اضافه كني و بهش بدي
2- مي دوني مقدار اوليت چقدره و هر دفعه اضافش كني

روش دوم سريعتر چون يك مرحله فراخوني از ديتابيس رو نداري
روش اول بهتره چون كدت دايناميك ميشه

يك نمونه كه از روش اول استفاده شده رو داست مي زارم


Adc_Coach.MoveLast
LastID = Adc_Coach.Fields(1)
txtId.Text = Val(Trim(LastID)) + 1

butterfly8528
چهارشنبه 15 مهر 1388, 11:21 صبح
سلام .


سلام شما ابتدا باید مشخص کنید که x کجا زده شود

منظور من از X دکمه ای هست که کنار تکست کد اشتراک گزاشتم ، که کاربر با زدن این دکمه اولین شماره آزاد ممکن رو در تکست میبینه .


بعد از زدن x باید بانک و فیلتر کنید به یک شرط غیر ممکن که تمتا رکورد های بانک بیاید بعد دستور sort براساس شماره اشتراک و در آخر یک حلقه while تا آخر بانک که فیلد شماره اشترا ک و با یک عدد که داخل یک متغیر ریختین چک کند اگر برابر نبود به بیرون حلقه پرش کنید و عدد و نمایش بدین شماره اشتراک از یک عددی که شما دوست دارید شروع می شود و در شرط آن عددو یکی یکی افزایش دهید تا عددی که در بانک نیست پیدا شود

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



اگر نشود بگو کد بزارم

دستت درد نکنه نمونه کد بزار برسی کنیم .





شما مي توني اول يك مقدار به اون فيلدي كه مقدارش يونيك هست بدي..
و در دكمه x بياي هر دفعه به اون مقدار اوليه فيلدت يك واحد(يا هر چي كه خودت دوست داري) اضافه كني...
واسه اينكارت 2تا كار مي توني انجام بدي...
1- هر دفعه آخرين عدد اين فيلد رو بخوني و بهش مقدار دلخواه رو اضافه كني و بهش بدي
2- مي دوني مقدار اوليت چقدره و هر دفعه اضافش كني




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

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

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

کلا روشی که mostafa_bahar گفت بهتر و جوابگو تره .

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

ممنون .

powerboy2988
چهارشنبه 15 مهر 1388, 11:27 صبح
خودم هم اول خواستم از این روش استفاده کنم ولی این روش تا زمانی جواب میده که :

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

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

کلا روشی که mostafa_bahar گفت بهتر و جوابگو تره .

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

ممنون .[/quote]

آره ولي تو دنياي واقعي اون كد 5 ماله كسي يا چيزي بوده كه ازش استفاده كرده..
شما ممكنه از كد 5 الان استفاده كني و ازش چند تا گزارش بگيري و تو تراكنش هات ازش استفاده كني... بعد از مدتي شما كد 5 رو حذف مي كني ... و مي خواي يك ركورد جديد ايجاد كني اگر 5 رو بهش بدي به نظرت تو فعل و انفعالات دچار مشكل نميشين!!!!

mostafa_bahar
چهارشنبه 15 مهر 1388, 11:30 صبح
DataEnvironment1.rsksorat.Filter = "id <> '-8'"
DataEnvironment1.rsksorat.Sort = "id"
i = 1
While DataEnvironment1.rsksorat.EOF = False
If i <> DataEnvironment1.rsksorat.Fields("id").Value Then
GoTo l
End If
DataEnvironment1.rsksorat.MoveNext
i = i + 1
Wend
l:
Label11.Caption = i
موفق باشی

powerboy2988
چهارشنبه 15 مهر 1388, 11:35 صبح
سلام .




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

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

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

کلا روشی که mostafa_bahar گفت بهتر و جوابگو تره .

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

ممنون .

آره ولي تو دنياي واقعي اون كد 5 ماله كسي يا چيزي بوده كه ازش استفاده كرده..
شما ممكنه از كد 5 الان استفاده كني و ازش چند تا گزارش بگيري و تو تراكنش هات ازش استفاده كني... بعد از مدتي شما كد 5 رو حذف مي كني ... و مي خواي يك ركورد جديد ايجاد كني اگر 5 رو بهش بدي به نظرت تو فعل و انفعالات دچار مشكل نميشين!!!!

butterfly8528
چهارشنبه 15 مهر 1388, 12:18 عصر
آره ولي تو دنياي واقعي اون كد 5 ماله كسي يا چيزي بوده كه ازش استفاده كرده..
شما ممكنه از كد 5 الان استفاده كني و ازش چند تا گزارش بگيري و تو تراكنش هات ازش استفاده كني... بعد از مدتي شما كد 5 رو حذف مي كني ... و مي خواي يك ركورد جديد ايجاد كني اگر 5 رو بهش بدي به نظرت تو فعل و انفعالات دچار مشكل نميشين!!!!

نه فکر نمیکنم مشکلی پیش بیاد .

ببینید من کد زیر رو استفاده می کنم ولی اکثرا اشتباه میکنه و همش یک عدد رو نمایش میده .


Private Function LastFreemycode() As Long

Dim i As Long
Dim PreV As Long

Call OpenDataBase

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

If rs.RecordCount = 1 Then
LastFreemycode = rs.Fields("mycode").Value + 1
Call CloseDataBase
Exit Function
End If

PreV = rs.Fields("mycode").Value
For i = 2 To rs.RecordCount
If rs.Fields("mycode").Value <> (PreV + 1) Then
LastFreemycode = PreV + 1
Call CloseDataBase
Exit Function
End If
PreV = rs.Fields("mycode").Value
If rs.EOF = False Then rs.MoveNext
Next

LastFreemycode = PreV
rs.Close

End Function


مشکل کد های بالا چیه ؟

powerboy2988
چهارشنبه 15 مهر 1388, 12:22 عصر
1- ديتابيس رو هم اگر بزاري ممنون ميشم
2-چرا اون اين خط commandType رو مشخص نكرددين؟


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

butterfly8528
چهارشنبه 15 مهر 1388, 14:23 عصر
شرمنده حجم دیتابیس زیاده .

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



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



فقط یک سوال باقی می مونه : حلقه به کار رفته تو کد بالا ممکنه 3000 بار تکرار بشه تا شماره آزاد رو به دست بیاره ، به نظر شما با توجه به مشکلات DoEvents ، از DoEvents برای جلوگیری از هنگ کردن سیستم تو حلقه استفاده کنم یا نه ؟

دوستان لطفا این سوال رو با دقت و آگاهی و اگه ممکنه از روی تجربه جواب بدید .

خیلی ممنون .

vbhamed
چهارشنبه 15 مهر 1388, 19:04 عصر
سلام

به نظر من يك كار ديگه انجام بدي مشكل حلقه بزرگ رو هم نداري

1 - يك جدول در ديتابيس ايجاد كن كه فقط يك فيلد كد داشته باشه
2 - هر ركوردي از جدول اصلي حذف كردي، كدش رو تو جدول تك فيلدي اضافه كن

3 - حالا موقع ثبت ركورد جديد در جدول اصلي كارهاي زير رو براي بدست آوردن كد جديد انجام بده :

الف - 3 اگر در جدول تك فيلدي ركوردي وجود داشت مي نيمم مقدار فيلد كد رو بدست بيار
و به عنوان كد جديد استفاده كن، ضمن اينكه اون مقدار رو از جدول تك فيلدي بايد حذف كني

ب - 3 اگر در جدول تك فيلدي مقداري وجود نداشت ماكزيمم مقدار فيلد كد از جدول اصلي
رو بدست بيار و بهش يكي اضافه كن و به عنوان كد جديد استفاده كن


براي بدست آوردن مينيمم مقدار از دستور زير استفاده كن


Select Min(Code) As NewCode From Table_OneField
msgbox Adodc1.Recordeset!NewCodeو براي ماكزيمم از جدول اصلي


Select Max(Code) As MaxCode From Tbl_Main
msgbox Adodc1.Recordeset!MaxCode

HjSoft
چهارشنبه 15 مهر 1388, 20:24 عصر
من خيلي گيج شدم ، من خودم براي تعيين آخرين كد از Addnew استفاده مي كنم و هيچ مشكلي نداره يعني rst.addnew رو مي زنم مقدار Id رو در يك رشته ميريزم بعد rst رو مي بندم و add رو لغو مي كنم ، اينطوري آخرين شماره Id بدست مياد ‌، البته اگر درست متوجه شده باشم .

vbhamed
پنج شنبه 16 مهر 1388, 05:48 صبح
من خيلي گيج شدم ، من خودم براي تعيين آخرين كد از Addnew استفاده مي كنم و هيچ مشكلي نداره يعني rst.addnew رو مي زنم مقدار Id رو در يك رشته ميريزم بعد rst رو مي بندم و add رو لغو مي كنم ، اينطوري آخرين شماره Id بدست مياد ‌، البته اگر درست متوجه شده باشم .

سلام

اولا اينكه اگر AddNew رو كنسل كنيد ديگه اون شماره Id سوخت مي كنه و براي AddNew بعدي يك شماره ديگه مي ده

دوم اينكه قرار اولين شماره آزاد برگرده نه آخرين شماره
مثلا اگر 5 تا ركورد داشته باشيم، ركورد 2 رو حذف كنيم حالا موقع اضافه كردن شماره جديد بايد عدد 2 رو بده نه 6