PDA

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



saeedgoodboy
یک شنبه 25 اسفند 1392, 11:40 صبح
سلام دوستان
من به تازگی برنامه نویسی در محیط .net رو شروع کردم و در حال تهیه یک نرم افزار برای محل کارم هستم . این برنامه جهت بانک اطلاعاتی مشتریان هست و یکی از قابلیت هایی که برای این برنامه در نظر گرفتیم قرعه کشی های ماهیانه ست . مشتری های نسبت به خرید خود به ازای هر 10.000 تومن یک پوینت دریافت میکنند که این کار باید شانس افرادی را که خرید بیشتری دارند رو در قرعه کشی بالا ببرد .
البته تمامی table ها جهت ذخیره سازی مشتری ها و مبالغ فاکتور انجام شده و در حال استفاده هستیم و فقط این مورد باقی مانده .
برای روشن تر شدن موضوع به مثال زیر توجه کنین :
شخص A با 5.000.000 تومان خرید = 500 پوینت
شخص B با 1.600.000 تومان خرید = 160 پوینت
شخص C با 20.000.000 تومان خرید = 2000 پوینت
شخص D با 700.000 تومان خرید = 70 پوینت

با توجه به تعداد پوینت های هر شخص چطوری میتونم به صورت رندوم یک شخص رو انتخاب کنم ؟

محمد آشتیانی
یک شنبه 25 اسفند 1392, 18:10 عصر
سلام
این مسئله رو به روش های زیادی میشه پیاده سازی کرد ، یه راه ساده که الان به نظرم میرسه اینه

شما یه جدول برای قرعه کشی ایجاد کن ، به نظرم میرسه حداقل 4 تا فیلد لازم داری
1- آیدی شخصی که تو قرعه کشی شرکت داده میشه مثلا CustomerID
2- ماه قرعه کشی - Month
3- شروع شماره سریال ها - SerialBegin
4- پایان شماره سریال ها - SerialEnd

با توجه به صورت مسئله ای که گفتی ، تو هرماه تعداد پوینت های هر شخص مشخصه ، طبق مثال خودت من جدول فرضی که گفتمو پر میکنم




SerialEnd
SerialBegin
Month
CustomerID


500
1
1
100


660
501
1
101


2660
661
1
102


2730
2661
1
103



تا اینجا ساختن و پر کردن همچین جدولی نباید مسئله ای داشته باشه ، تو مرحله بعد شما یه عدد تصادفی تو بازه مجموع امتیازات مشتریا تولید میکنی با توجه به اون عدد تصادفی - تو مثال خودت بازه اعداد تصادفی بین یک تا 2730 میشه ، با یه کوئری Select ساده از جدولی که گفتم میتونی مشتری برنده رو پیدا کنی



SELECT * FROM YourTable
WHERE (SerialBegin <= RandomNumber) and (SerialEnd >= RandomNumber) and (Month = 1)



* RandomNumber همون عدد تصادفی هست که تولید کردی


امیدوارم کمک کنه / موفق باشید

saeedgoodboy
سه شنبه 27 اسفند 1392, 18:07 عصر
سلام
این مسئله رو به روش های زیادی میشه پیاده سازی کرد ، یه راه ساده که الان به نظرم میرسه اینه

شما یه جدول برای قرعه کشی ایجاد کن ، به نظرم میرسه حداقل 4 تا فیلد لازم داری
1- آیدی شخصی که تو قرعه کشی شرکت داده میشه مثلا CustomerID
2- ماه قرعه کشی - Month
3- شروع شماره سریال ها - SerialBegin
4- پایان شماره سریال ها - SerialEnd

با توجه به صورت مسئله ای که گفتی ، تو هرماه تعداد پوینت های هر شخص مشخصه ، طبق مثال خودت من جدول فرضی که گفتمو پر میکنم




SerialEnd
SerialBegin
Month
CustomerID


500
1
1
100


660
501
1
101


2660
661
1
102


2730
2661
1
103



تا اینجا ساختن و پر کردن همچین جدولی نباید مسئله ای داشته باشه ، تو مرحله بعد شما یه عدد تصادفی تو بازه مجموع امتیازات مشتریا تولید میکنی با توجه به اون عدد تصادفی - تو مثال خودت بازه اعداد تصادفی بین یک تا 2730 میشه ، با یه کوئری Select ساده از جدولی که گفتم میتونی مشتری برنده رو پیدا کنی



SELECT * FROM YourTable
WHERE (SerialBegin <= RandomNumber) and (SerialEnd >= RandomNumber) and (Month = 1)



* RandomNumber همون عدد تصادفی هست که تولید کردی


امیدوارم کمک کنه / موفق باشید

ممنون از توضیحات عالی ت
میشه لطفا منو راهنمای کنی که چطوری یک عدد رندوم بین اون بازه تولید کنم و مثلا در یک label یا textbox نمایش بدم ؟

saeedgoodboy
سه شنبه 27 اسفند 1392, 18:34 عصر
سلام
این مسئله رو به روش های زیادی میشه پیاده سازی کرد ، یه راه ساده که الان به نظرم میرسه اینه

شما یه جدول برای قرعه کشی ایجاد کن ، به نظرم میرسه حداقل 4 تا فیلد لازم داری
1- آیدی شخصی که تو قرعه کشی شرکت داده میشه مثلا CustomerID
2- ماه قرعه کشی - Month
3- شروع شماره سریال ها - SerialBegin
4- پایان شماره سریال ها - SerialEnd

با توجه به صورت مسئله ای که گفتی ، تو هرماه تعداد پوینت های هر شخص مشخصه ، طبق مثال خودت من جدول فرضی که گفتمو پر میکنم




SerialEnd
SerialBegin
Month
CustomerID


500
1
1
100


660
501
1
101


2660
661
1
102


2730
2661
1
103



تا اینجا ساختن و پر کردن همچین جدولی نباید مسئله ای داشته باشه ، تو مرحله بعد شما یه عدد تصادفی تو بازه مجموع امتیازات مشتریا تولید میکنی با توجه به اون عدد تصادفی - تو مثال خودت بازه اعداد تصادفی بین یک تا 2730 میشه ، با یه کوئری Select ساده از جدولی که گفتم میتونی مشتری برنده رو پیدا کنی



SELECT * FROM YourTable
WHERE (SerialBegin <= RandomNumber) and (SerialEnd >= RandomNumber) and (Month = 1)



* RandomNumber همون عدد تصادفی هست که تولید کردی


امیدوارم کمک کنه / موفق باشید

ممنون از توضیحات عالی ت
یک راهنمایی دیگه لازم دارم تا کار رو تموم کنم .
این دستور رو نتونستم وارد کنم . راستش با دستور select کار نکردم .
الان عدد تصادفی م رو در label1 تولید کردم . نام tabel م در دیتابیس lottery هست

میشه لطفا کد کامل دستوری رو که طبق جدولی که دادی و من هم تولیدش کردم بهم بدی . طبق جدول بالا اگر عدد 550 در بیاد باید شخص با کد 101 برنده اعلام بشه .
اسم این شخص رو در textbox1 بزارم .
مرسی بابت راهنمایی های خوبت

محمد آشتیانی
چهارشنبه 28 اسفند 1392, 02:33 صبح
سلام
خواهش میکنم
برای تولید عدد تصادفی تو یه محدوده مشخص ( مثلا از یک تا 2730)



Dim Rnd As New Random()
Dim RndNum As Integer = Rnd.Next(1, 2731)


و اما کوئری SELECT هیچ نکته خاصی نداره ، متوجه نشدم مشکل کجاست



موفق باشید

saeedgoodboy
چهارشنبه 28 اسفند 1392, 10:42 صبح
فکر کنم این دستور select مربوط به Sql میشه . من دستورات در Vb.net رو طبق شرایطی که تو پست قبلی گفتم احتیاج دارم .
من میخوام خروجی رو از اطلاعات داخل دیتا بیس در vb.net داشته باشم :لبخندساده:

محمد آشتیانی
چهارشنبه 28 اسفند 1392, 11:30 صبح
سلام
درسته کوئری SELECT مربوط به Sql هست ، اما خب از توی ویژوال استودیو ازش استفاده کن ، پس برنامه شما چطوری داره با دیتابیس کار میکنه؟

اول اینو به بالای فرمت اضافه کن



Imports System.Data
Imports System.Data.SqlClient


بعدم این کدا رو هرجا که میخوای اطلاعات رو بگیری بنویس (مثلا تو رویداد کلیک Button)



Dim SqlCon As New SqlConnection
Dim SqlCmd As New SqlCommand
Dim SqlDR As SqlDataReader
Dim Table As New DataTable

SqlCon.ConnectionString = "Data Source=127.0.0.1;Initial Catalog=DBName;Persist Security Info=True;User ID=sa;Password=1"
SqlCon.Open()

SqlCmd.Connection = SqlCon
SqlCmd.CommandText = "SELECT CustomerID FROM Lottery WHERE SerialBegin = @Serial AND SerialEnd = @Serial AND Month = @Month"
SqlCmd.Parameters.AddWithValue("@Serial", CInt(Label1.Text))
SqlCmd.Parameters.AddWithValue("@Month", CInt(TextBox1.Text))
SqlDR = SqlCmd.ExecuteReader

Table.Load(SqlDR)

Dim Winner As Integer = CInt(Table.Rows(0).Item(0).ToString)

SqlDR.Close()
SqlCon.Close()



چند نکته:
1- Connection String رو بر اساس تنظیمات سرور خودت تغییر بده
2- من فرض کردم نوع داده همه فیلد ها int هست
3- فرض شده عدد تصادفی رو تو Label1 نمایش دادی
4- فرض شده ماه قرعه کشی رو توی TextBox1 وارد کردی
5- در آخر شماره فرد برنده رو توی یه متغیر به اسم Winner میریزه

البته میتونی کوئری رو جوری تغییر بدی که اسم طرفم بیاره ، چون بنده ساختار دیتابیس شما رو نمیدونستم تا همینجا رو قبول بفرمائید.


موفق باشید.

saeedgoodboy
چهارشنبه 28 اسفند 1392, 12:50 عصر
سلام
درسته کوئری SELECT مربوط به Sql هست ، اما خب از توی ویژوال استودیو ازش استفاده کن ، پس برنامه شما چطوری داره با دیتابیس کار میکنه؟

اول اینو به بالای فرمت اضافه کن



Imports System.Data
Imports System.Data.SqlClient


بعدم این کدا رو هرجا که میخوای اطلاعات رو بگیری بنویس (مثلا تو رویداد کلیک Button)



Dim SqlCon As New SqlConnection
Dim SqlCmd As New SqlCommand
Dim SqlDR As SqlDataReader
Dim Table As New DataTable

SqlCon.ConnectionString = "Data Source=127.0.0.1;Initial Catalog=DBName;Persist Security Info=True;User ID=sa;Password=1"
SqlCon.Open()

SqlCmd.Connection = SqlCon
SqlCmd.CommandText = "SELECT CustomerID FROM Lottery WHERE SerialBegin = @Serial AND SerialEnd = @Serial AND Month = @Month"
SqlCmd.Parameters.AddWithValue("@Serial", CInt(Label1.Text))
SqlCmd.Parameters.AddWithValue("@Month", CInt(TextBox1.Text))
SqlDR = SqlCmd.ExecuteReader

Table.Load(SqlDR)

Dim Winner As Integer = CInt(Table.Rows(0).Item(0).ToString)

SqlDR.Close()
SqlCon.Close()



چند نکته:
1- Connection String رو بر اساس تنظیمات سرور خودت تغییر بده
2- من فرض کردم نوع داده همه فیلد ها int هست
3- فرض شده عدد تصادفی رو تو Label1 نمایش دادی
4- فرض شده ماه قرعه کشی رو توی TextBox1 وارد کردی
5- در آخر شماره فرد برنده رو توی یه متغیر به اسم Winner میریزه

البته میتونی کوئری رو جوری تغییر بدی که اسم طرفم بیاره ، چون بنده ساختار دیتابیس شما رو نمیدونستم تا همینجا رو قبول بفرمائید.


موفق باشید.

واقعا ممنون
فقط این ارور رو بهم میده117150

saeedgoodboy
چهارشنبه 28 اسفند 1392, 12:52 عصر
این هم تصویر table در دیتا بیس117151

saeedgoodboy
چهارشنبه 28 اسفند 1392, 12:54 عصر
data type تمامی فیلد ها به غیر از ID همه nvarchar(50) هستن

محمد آشتیانی
چهارشنبه 28 اسفند 1392, 13:01 عصر
سلام
من شرمندم ، تو کوئری جدیدی که نوشتم همه رو مساوی گذاشته بودم
ضمنا حداقل Type فیلدهای SerialBegin و SerialEnd و Dateرو int بزار

این کد اصلاح شده (به جز کانکشن استرینگ)



Dim SqlCon As New SqlConnection
Dim SqlCmd As New SqlCommand
Dim SqlDR As SqlDataReader
Dim Table As New DataTable

SqlCon.ConnectionString = "Data Source=127.0.0.1;Initial Catalog=DBName;Persist Security Info=True;User ID=sa;Password=1"
SqlCon.Open()

SqlCmd.Connection = SqlCon
SqlCmd.CommandText = "SELECT User_id FROM Lottery WHERE SerialBegin <= @Serial AND SerialEnd >= @Serial AND Date = @Date"
SqlCmd.Parameters.AddWithValue("@Serial", CInt(Label1.Text))
SqlCmd.Parameters.AddWithValue("@Date", CInt(TextBox8.Text))
SqlDR = SqlCmd.ExecuteReader

Table.Load(SqlDR)

If Table.Rows.Count > 0 Then
Dim Winner As String = Table.Rows(0).Item(0).ToString
Else
'رکوردی برگردانده نشده
End If

SqlDR.Close()
SqlCon.Close()

saeedgoodboy
چهارشنبه 28 اسفند 1392, 13:56 عصر
واقعا عالی بود .ممنونم... خدا بهت اجر بده :لبخندساده:
یک سری تنظیمات لازم داره که اگر بازم به مشکل خوردم حتما مزاحمت میشم

saeedgoodboy
چهارشنبه 28 اسفند 1392, 14:37 عصر
این ارور چه معنی میده ؟
117157

محمد آشتیانی
چهارشنبه 28 اسفند 1392, 14:52 عصر
فکر کنم SqlCMD و SqlDR رو تو فرم Public تعریف کردی ، برا همینه که دوباره اجازه نمیده متغیر تعریف بشه
البته با توجه به این تصویر حدس میزنم که اینجوری باشه