ورود

View Full Version : صفرکردن مقدار فیلد که primary key هستش و از نوعAutoNumber



mohsen22
پنج شنبه 09 خرداد 1392, 16:42 عصر
سلام در اکسس یه فیلد تعریف کرده ام از نوع AutoNumber که primary key هم هستش
این فیلد بعد از حذف و اضافه کردن رکورد مقدار ش افزایش پیدا کرده - چگونه می تونم اونو به صفر بر گردونم ؟
یعنی دوباره از صفر شروع بشه
مرسی

saeed1234n
پنج شنبه 09 خرداد 1392, 19:59 عصر
سلام
در رویداد فرمت یک همچون کد می توانی وارد کنی
که هر بار به هنگام باز شدن فرم قرار بگیرد یا می توان یک کامند باتن تعریف کنی
که با هر بار کلیک بر روی آن کلیه رکوردها از صفر شماره گذاری شوند .

Private Sub Form_Load()
DoCmd.GoToRecord acDataForm, Me.Name, acFirst
no_rec = Me.CurrentRecord
num_rec = DCount("id", "your_tbl")
rad = 0
For i = 1 To num_rec
DoCmd.GoToRecord acDataForm, Me.Name, 4, i
rad = rad + 1
ID = rad
Next
End Sub

mohsen22
پنج شنبه 09 خرداد 1392, 20:52 عصر
مرسی سعید جان . خود اکسس رو نمیتوان دست کاری کرد ؟
کمی راجع به متغیر ها توضیح می فرمایید ؟ (در زبان وی بی)

shahla60
پنج شنبه 09 خرداد 1392, 21:19 عصر
یه کار راحت میتونی انجام بدی
فیلدا پاکش کن و دوباره یکی بساز فقط یه مشکل داره که باید هر جا ازش استفاده کرده تو فرم ها باید پاکش کنی و اینا جایگزین کنی:لبخند:

saeed1234n
پنج شنبه 09 خرداد 1392, 22:04 عصر
با سلام
me.name نام فرمی است که در حال کار بر روی آن هستید
acfirst یکی از آرگومان های ثابت فرمان docmd.gotorecord میباشد که مشخص کننده اولین رکورد از مجموعه رکورد های ما میباشد .

no_rec متغیری از نوع variant میباشد که توسط فرمان currentrecord مقدار دهی میشود و مشخص کننده رکورد جاری میباشد و البته در این کد مانقش ندارد بنده به اشتباه آنرا در اینجا آوردم.

عدد 4 در فرمان( DoCmd.GoToRecord acDataForm, Me.Name, 4, i ) نشان دهنده ثابت عددی آرگومان GOTO میباشد .


ID همان فیلد مورد نظر شما میباشد و your_tbl هم جدولی است که فیلد id در آن قرار دارد .

num_rec متغیری است که تعداد رکوردهای جدول ( your_tbl ) را مشخص می کند .

I متغیری است که به تعداد رکوردهای جدول حلقه را ایجاد می کند .

امیدوارم توضیحاتم ساده و روان بوده باشد .

Abbas Amiri
جمعه 10 خرداد 1392, 00:23 صبح
سلام در اکسس یه فیلد تعریف کرده ام از نوع AutoNumber که primary key هم هستش
این فیلد بعد از حذف و اضافه کردن رکورد مقدار ش افزایش پیدا کرده - چگونه می تونم اونو به صفر بر گردونم ؟
یعنی دوباره از صفر شروع بشه
مرسی

سلام

احتمالا منظور شما شماره گذاری از آخرین مقدار ثبت شده به بعداست .
زمانی که فیلد اتونامبر در فرم داشته باشید ، درصورتی که سعی درتغییر مقدار آن از طریق کد نویسی داشته باشید ، پیغام "You cant't assign a value to this object" دریافت می کنید راه حل پیشنهادی بنده ایجاد یک دکمه فرمان جهت درج رکورد جدید است و درآن تایپ کنید :


Private Sub cmdNew_Click()
Dim NewID As Long
Me.AllowAdditions = True
NewID = Nz(DMax("ID", Me.RecordSource), 0) + 1
CurrentDb.Execute "INSERT INTO " & Me.RecordSource & " (ID) VALUES(" & NewID & ")"
Me.Requery
DoCmd.GoToRecord , , acLast
Me.AllowAdditions = False
End Sub


و باز توصیه میشه خصوصیت Allow Additions فرم رو No قراردهید و Tab Stop فیلد ID رو همچنین .

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

نتیجه گیری :
قید نوع داده AutoNumber رو بزنید و از نوع Number استفاده کنید و در خصوصیت Default Value آن عبارت لازم رو بنویسید .

saeed1234n
جمعه 10 خرداد 1392, 01:26 صبح
آیا شما با فیلد اتونامبر از کدهای بالا جواب گرفتید ؟ در صورت مثبت بودن ، لطفا نمونه آن را قرار دهید .

با سلام
خدمات جناب استاد امیری و دیگر دوستان حاضر در تالار

بله بنده در یکی از برنامه ها اینکار را انجام دادم

این برنامه را ضمیمه کردم .

با تشکر از شما استاد خوبم که هر چه که تا کنون یاد گرفتیم از عنایت شما و اساتید دیگر بوده است .

Abbas Amiri
جمعه 10 خرداد 1392, 11:21 صبح
با سلام
خدمات جناب استاد امیری و دیگر دوستان حاضر در تالار

بله بنده در یکی از برنامه ها اینکار را انجام دادم

این برنامه را ضمیمه کردم .

با تشکر از شما استاد خوبم که هر چه که تا کنون یاد گرفتیم از عنایت شما و اساتید دیگر بوده است .

سوال اصلی ایجادکننده تاپیک در مورد فیلدهای AutoNumber بود در حالی که در مثال شما فیلد ID ازنوع Text بود.

104884

mohsen22
جمعه 10 خرداد 1392, 23:45 عصر
سوال اصلی ایجادکننده تاپیک در مورد فیلدهای AutoNumber بود در حالی که در مثال شما فیلد ID ازنوع Text بود.

104884
بله درسته و متاسفانه هنوز جواب نگرفتم!

mohsen22
جمعه 10 خرداد 1392, 23:46 عصر
یه کار راحت میتونی انجام بدی
فیلدا پاکش کن و دوباره یکی بساز فقط یه مشکل داره که باید هر جا ازش استفاده کرده تو فرم ها باید پاکش کنی و اینا جایگزین کنی:لبخند:

اگه مجبور بشم اینم راه بدی نیست!

Abbas Amiri
شنبه 11 خرداد 1392, 00:17 صبح
اگه مجبور بشم اینم راه بدی نیست!

هرچند بی اهمیت بودن تغییر شناسه رکوردها ، نشان از بی مصرفی آن فیلد هست ولی اگر تعداد رکوردها زیاد است می توانید کلید اصلی و همچنین ایندکس های جدول را حذف کنید و از دوخط کد زیر برای بازنویسی دوباره کدها استفاده کنید . ( کپی از جدول فراموش نشود )



CurrentDb.Execute "ALTER TABLE YourTableName Drop COLUMN FieldIdName "
CurrentDb.Execute "ALTER TABLE YourTableName ADD COLUMN FieldIdName AUTOINCREMENT"



در صورت موفقیت دوباره تنظیمات قبلی مثل پرایمری وکی و ... را برای جدول مربوطه انجام دهید

mohsen22
یک شنبه 12 خرداد 1392, 18:13 عصر
سلام
زمانی که فیلد اتونامبر در فرم داشته باشید ، درصورتی که سعی درتغییر مقدار آن از طریق کد نویسی داشته باشید ، پیغام "You cant't assign a value to this object" دریافت می کنید راه حل پیشنهادی بنده ایجاد یک دکمه فرمان جهت درج رکورد جدید است و درآن تایپ کنید :


Private Sub cmdNew_Click()
Dim NewID As Long
Me.AllowAdditions = True
NewID = Nz(DMax("ID", Me.RecordSource), 0) + 1
CurrentDb.Execute "INSERT INTO " & Me.RecordSource & " (ID) VALUES(" & NewID & ")"
Me.Requery
DoCmd.GoToRecord , , acLast
Me.AllowAdditions = False
End Sub


و باز توصیه میشه خصوصیت Allow Additions فرم رو No قراردهید و Tab Stop فیلد ID رو همچنین .


دوست من ممکنه یه نمونه مثال کوچولو مرقوم بفرمایید ؟

Abbas Amiri
یک شنبه 12 خرداد 1392, 19:01 عصر
دوست من ممکنه یه نمونه مثال کوچولو مرقوم بفرمایید ؟

شما با VB آشنایی دارید براحتی بایستی انجام بدید .

یک باتن در فرم مربوطه ایجاد ودر رویداد Click آن کدهای فوق را کپی کنید .

mohsen22
پنج شنبه 30 خرداد 1392, 13:07 عصر
یک باتن در فرم مربوطه ایجاد ودر رویداد Click آن کدهای فوق را کپی کنید .
هرچند زحمته ولی اگر ممکنه چیزی رو که فرمودین روی این سورس تست کنید .. خیلی ور رفتم نشد که نشد !؟

Abbas Amiri
جمعه 31 خرداد 1392, 18:39 عصر
هرچند زحمته ولی اگر ممکنه چیزی رو که فرمودین روی این سورس تست کنید .. خیلی ور رفتم نشد که نشد !؟

هرچند این بحث بیشتر مربوط به VB.net می شه ، ولی یکی از راههای ایجاد رکورد جدید با شماره ID جدید با استفاده از کدهای زیر انجام پذیره :
این روال مربوط به باتن رکورد جدید هست .


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If d1.Text = "" Then
MsgBox("فیلد نام خالی است")
Exit Sub
End If
Dim rPrev As DataRow
Dim dt As DataTable
Dim i As Int32
Try
dt = DS.Tables("tb_1")
If dt.Rows.Count Then
rPrev = dt.Rows(dt.Rows.Count - 1)
i = rPrev.Item("ID") + 1
Else
i = 1
End If
com = New OleDbCommand("INSERT INTO tb_1(ID,Name) VALUES(" & i & ", '" & d1.Text & "')", Cnn)
com.ExecuteNonQuery()
DA.Update(DS, "tb_1")
DS.Tables("tb_1").Clear()
DA.Fill(DS, "tb_1")
d1.Text = ""
d1.Focus()
Catch ex As Exception
MessageBox.Show(ex.Message, "Error Saving Database", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
DataGridView1.Refresh()
DataGridView1.ClearSelection()
End Sub

mohsen22
جمعه 31 خرداد 1392, 20:57 عصر
مرسی اما نشد ؟! .. کد شما دقیقا اخرین ای دی پرایمری رو اضافه می کنه -- سراغ ای دی که خالی هستش و اشغال نشده نمیره !؟

Abbas Amiri
جمعه 31 خرداد 1392, 22:46 عصر
مرسی اما نشد ؟! .. کد شما دقیقا اخرین ای دی پرایمری رو اضافه می کنه -- سراغ ای دی که خالی هستش و اشغال نشده نمیره !؟

درسته . شما ابتدا باید در خود اکسس برای یکبار شماره ها رو مرتب کنید . راه حل ساده حذف فیلد ID از جدول (ابتدا Primary key را بردارید) و ایجاد مجدد آن بصورت اتونامبر است . بعد از اینکه یکبار جدول را باز کردید DataType فیلد ID رو به Number تغییر دهید . ازاین به بعد در استفاده از برنامه تان مشکلی نخواهد بود.

هرچند از برنامه خودتان هم با کدنویسی میتوان اینکار را کرد . که بنده بعلت عدم تسلط کافی به آن محیط راه حل سریعی نمی توانم ارائه دهم .

mohsen22
جمعه 31 خرداد 1392, 23:04 عصر
این رو تست کردم که با یک بار حذف پرایمری کی در اکسس و ایجاد اون مشکلم حل میشه اما میخواستم با کد نویسی این کار رو انجام بدم که فعلا راه حل پیدا نکردم ...
به هر حال مرسی از کمک شما
دوستان دیگه راه حل ندارند ؟

saeed1234n
جمعه 31 خرداد 1392, 23:20 عصر
این رو تست کردم که با یک بار حذف پرایمری کی در اکسس و ایجاد اون مشکلم حل میشه اما میخواستم با کد نویسی این کار رو انجام بدم که فعلا راه حل پیدا نکردم ...

با سلام
دوست عزیز این کد شاید بدرد شما بخورد

DoCmd.RunSQL "ALTER TABLE [table_name] DROP COLUMN [field_name]"
DoCmd.RunSQL "ALTER TABLE [table_name] ADD COLUMN [field_name] autoincrement;"

mohsen22
پنج شنبه 06 تیر 1392, 20:16 عصر
با سلام
دوست عزیز این کد شاید بدرد شما بخورد
[/CODE]

مرسی اما نشد!