PDA

View Full Version : سوال: شماره رکورد جدید



ali190
جمعه 15 اردیبهشت 1391, 11:47 صبح
باسلام و عرض خسته نباشید
من درر دیتابیسم دو تا جدول دارم
جدولهای Customer و buy
------------------------------------------------------------------------------
فیلدهای جدول Customer :
فیلد ID : فیلد کلید جهت تولید شماره خودکار جهت مشتری ها
فیلد Name : نام مشتری
------------------------------------------------------------------------------
فیلدهای جدول buy :
فیلد mID: فیلد کلید جهت تولید شماره خودکار خرید های مشتری ها
فیلد CustomerID : کد مشتری ها
فیلد Kala : کالاهای خریداری شده توسط مشتری
------------------------------------------------------------------------------
جدول Customer با جدول buy ارتباط یک به چند داره
در واقع جدول Customer پدر جدولBuy هست
حالا مشکل اینجاست من میخوام به محض افزوده شدن یک رکورد جدید در جدول Customer شماره رکورد جدید رو بدست بیارم تا بتونم کالاهاش رو هم همزمان ثبت کنم
با توجه به اینکه قرار هست از این برنامه در شبکه استفاده کنم و رکرودها مدام داره توسط کاربرهای مختلف تو شبکه وارد میشه ، پس مجاز نیستیم که از روشهای غیر معمول برای بدست آوردن رکورد استفاده کنیم (max id و ...)
در واقع میخواهیم بعد از ثبت رکورد شماره آی دی بدست بیاد تا بشه ازش در ثبت رکوردها فرزند استفاده کرد
در VB6 من این کار رو به صورت زیر انجام میدم:

Adodc1.Recordset.AddNew
Adodc1.Recordset.Fields("name") = Me.Text1.Text
Adodc1.Recordset.Update
MsgBox Adodc1.Recordset.Fields("id")
Adodc1.Refresh
همانطور که ملاحظه میکنید بعد از کد Adodc1.Recordset.Update که رکورد جدید رو تو دیتابیس ثبت میکنه شماره ID رکورد جدید بلافاصله اعلام میشه
منتظر راهنمایی شما عزیزان هستم
یاعلی

barnamenevisforme
جمعه 15 اردیبهشت 1391, 12:09 عصر
سلام
من هم مدت ها دنبال یه روش مناسب واسه بدست اوردن شماره رکورد بعدی بودم.ولی متاسفانه موفق نشدم.
یه روش که مجبور شدم استفاده کنم این بود :به محض اینکه در datasource جدول پدر یه فیلد اضافه میکردم(addnew) بلافاصله اونو update میکردم.با این روش id رو به دست می اردم و در فیلد جدول فرزند وارد میکردم.
اگه کاربر همه مراحل رو تایید میکرد که رئال معمولی رو ادامه میدادم،در صورتی که از ثبت اون ریکرد در جدول پدر و به تبع جدول فرزند انصراف میداد،گزینه datasource.canceledit رو برای جدول فرزند اجرا و ریکرد ثبت شده برای جدول پدر رو پاک میکردم.
خدا کنه دوستان یه روش بهتر ارائه کنن تا ما هم ازش استفاده کنیم.
موفق باشید.

ali190
جمعه 15 اردیبهشت 1391, 12:18 عصر
روشتون برام ابهام داره

swallow.pa
جمعه 15 اردیبهشت 1391, 12:30 عصر
بهتره ID بصورت دستی وارد بشه

M.T.P
جمعه 15 اردیبهشت 1391, 12:36 عصر
سلام.
ببینید قطعا فیلد ID پس از اضافه شدن رکورد ، مقدارش مقداره فیلد ID رکورد قبلی بعلاوه یک خواهد بود.
خب شما قبل از کد ثبت با همون MAX مقدار آخرین رکورد ID رو در میارید و بعلاوه یک می کنید و به عنوان
کد مشتری جدید در نظر می گیرید.

ali190
جمعه 15 اردیبهشت 1391, 12:45 عصر
سلام.
ببینید قطعا فیلد ID پس از اضافه شدن رکورد ، مقدارش مقداره فیلد ID رکورد قبلی بعلاوه یک خواهد بود.
خب شما قبل از کد ثبت با همون MAX مقدار آخرین رکورد ID رو در میارید و بعلاوه یک می کنید و به عنوان
کد مشتری جدید در نظر می گیرید.
ببنید من گفتم فیلد ID کد رو خودکار تولید میکنه
Identify=Yes
همیشه کد بعدی +1 نمیشه شماره کد بعدی
مثال میزنم
فرض کنید شما آخرین کدی که در جدول برایفیلد ID تون ثبت شده 400 هست
خوب در این حالت کد بعدی 401 هست ، طبق گفته شما
ولی احتمال داره رکورد اخر شمارش 400 باشه ولی ظرورت نداره شماره بعدی 401 باشه
چون ممکنه بعد از 400 ده تا رکورد اضافه شده باشه و بعد حذف شده باشه
پس در کنتور SQL server آخرین عدد 410 هست و عدد بعدی میشه 411
چون Identify=Yes هست
خودش کنتور میندازه
یه نکته دیگه من با مثالی عرض کردم که این کار رو در VB6 انجام دادم
بدون استفاده از روشهای غیرمعمول
100 در صد باید در دات نت امکان پذیر باشه !
اینطور نیست؟!
یاعلی

فرید نجفلو
جمعه 15 اردیبهشت 1391, 13:40 عصر
سلام
دوستان این کار تو SQL راحت انجام میشه
شما کافیه از Scope_Identity استفاده کنید به این حالت:
INSERT INTO Table1 ([col1],[col2],[col3]) VALUES ('ValCol1','ValCol2','ValCol3'); SELECT Scope_Identity()
در دات نت این دستور رو اجرا کنید
مقدار برگشتی به شما همون عددی هست که ایجاد شد
فقط یادتون باشه SELECT Scope_Identity حتما باید درست بعد از INSERT و در همون دستور اجرا بشه اگه برای مثال اتصال بسته بشه و اونو اجرا کنید با NULL مواجه می شید

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

Imports System.Data.SqlClient
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim cnnstring As New SqlConnection("Data Source=.;Initial Catalog=Test;Integrated Security=True")
Dim command As SqlCommand = New SqlCommand
command.Connection = cnnstring
command.CommandText = "INSERT INTO tblMachine (Col1) VALUES(@Col1);SELECT SCOPE_IDENTITY()"
command.Parameters.AddWithValue("@Col1", Trim(TextBox1.Text))
cnnstring.Open()
Dim Res = command.ExecuteScalar
cnnstring.Close()
MsgBox(Res)
End Sub
End Class




ببنید من گفتم فیلد ID کد رو خودکار تولید میکنه
Identify=Yes
همیشه کد بعدی +1 نمیشه شماره کد بعدی


بله درسته
برای انجام اینکار هم از دستور زیر استفاده کنید
SELECT IDENT_CURRENT ('Table1')
این دستور مقدار کلید بعدی رو که در اولین INSERT بعدی به وجود می یاد رو برمی گردونه