PDA

View Full Version : آموزش: عدم استفاده از AutoNumber در فیلدهای ID



Abbas Amiri
جمعه 02 دی 1390, 16:23 عصر
بسیای از دوستان احتمالا برای راحتی کار جهت فیلدهای ID یا شناسه جداول از دیتاتایپ AutoNumber استفاده می کنند . درحالی که از شماره های جاافتاده که ایجاد می شوند ناراضی هستند روشی که اکثر کاربران استفاده می کنند نوشتن حداکثر چند خط کد واستفاده از یک خط برای درج مقدار ID جدید است
کافیست در روال Form_Current مانند زیر عمل کنید


Private Sub Form_Current()
If IsNull(MyIDField) Then
MyIDField = NewID(Me.RecordSource)
End If
End Sub



تابع NewID را در یک ماژول کپی کنید وهرزمان رکورد جدیدی ایجاد می شود آنرا صدا بزنید .اگر اولین فیلد جدولتان همان ID آن است به آرگومان دوم نیاز نیست ولی درغیر اینصورت شماره فیلد در جدول(اینکه فیلد موردنظر چندمین فیلد درجدول است)که از صفر شروع می شود الزامی است



Public Function NewID(TableName As String, Optional FieldIdx As Integer = 0) As Long
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset(TableName)
If rs.RecordCount Then
rs.MoveLast
NewID = CLng(rs.Fields(FieldIdx).Value) + 1
Else
NewID = 1
End If
rs.Close
Set rs = Nothing
'************************************************* *******
'NewID = Nz(DMax("ID", TableName), 0) + 1
'************************************************* ********
End Function



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

Abbas Amiri
جمعه 02 دی 1390, 20:45 عصر
ازآنجا که در بسیاری از جدوال جهت شناسه از نامهای غیر ID استفاده میشود ، وهمچنین در تابع DMax حتما باید نام فیلد ذکر گردد ، با روش فوق می توان به هرفیلد با هرنام ودر هرجای جدول دسترسی داشت.

Abbas Amiri
جمعه 02 دی 1390, 23:31 عصر
بنده هم طرفدار اخلاقیات هستم واز نصیحتتان ممنون . اما لطفا توضیح دهید منظورتان محل استفاده از تابع است یا پست سوم.

مهدی د
شنبه 03 دی 1390, 21:14 عصر
آقای Zero Defect (http://barnamenevis.org/member.php?154818-Zero-Defect) فکر می کنم مطالب بیان شده در پست شماره 4 ، خواننده را دچار سوء تفاهم می کند لطفا تجدید نظر نمایید.

Rasool-GH
یک شنبه 04 دی 1390, 06:47 صبح
سلام
جسارتا خدمت دوستان عرض كنم بنده از اين روش استفاده ميكنم در صورت امكان معايب اين روش رو توضيح بدين
در Defult Value فيلد مورد نظر اين كد رو قرار ميدم

=Nz(DMax("Field Name";"Table Name");0)+1

در اين كد به جاي 0 هر عدد دلخواه مورد نياز كه بخوام از اون عدد شمارش شروع بشه رو قرار ميدم

Mohammad_chz
یک شنبه 04 دی 1390, 16:17 عصر
با سلام

ببخشید جسارت نباشه خدمت اساتیدمحترم.
ولی اصولا استفاده از دیتا تایپ اتونامبر (یا فیلد ID) جهت کلید اصلی مخالف قواعد نرمال سازی پایگاه داده است. شاید در 100 جدول شما یکبار مجبور بشید از فیلدی با این مشخصات به عنوان کلید اصلی استفاده کنید. که البته اون هم دیگه اینهمه بحث نیاز نداره.

Rasool-GH
دوشنبه 05 دی 1390, 11:11 صبح
اگر شما از ديدگاه اموزشي به اين مطلب نگاه كنيد متوجه ميشين كه براي افرادي كه تازه شروع به كار كردن و مدام با اين مسئله روبرو هستن كه نميدونن بايد در برنامه براي يك ستون عددي افزايشي بايد از اتونامبر استفاده كنن يا كد نويسي كنن بسيار مفيده و ضمنا راهكارهاي مختلفي هم براي انجام كارهاي مشابه معرفي ميشه

ARData
دوشنبه 05 دی 1390, 11:14 صبح
از این کد استفاده کنید تا برای همیشه بی نیاز شوید البته این حالت برای فرم هایی خوبه که در حالت single form هستند :
On Error Resume Next
If Form.NewRecord Then
LBLCurrec.Caption = "..."
Else
LBLCurrec.Caption = CurrentRecord()
End If

ahmadrezaahmad
شنبه 29 تیر 1392, 17:43 عصر
سلام آقای امیری
میخواستم اولا خواهش کنم یک نمونه از این مدل آی دی سازی آپلود کنید و در ادامه سوال من این است که این مدل مربوط به تیبل است یا فرم که در قسمت current فرم کد را باید وارد کرد؟!
اساسا ID را روی جذول تغییر می دهد؟ یا خیر؟

دوما-اگر من بخواهم آی دی بسازم که علاوه بر عدد مقدار حرف پیشوند داشته باشد در کجای کد شما باید اصلاح شود؟
مشروح دلیل این کار را خدمتتان در انتها پست عرض می کنم

سوما-آیا حالتی وجود دارد که این پیشوند که در دوما روی آن بحث شد برگرفته از مقدار فیلدی در رکوردی در جدول دیگر این دیتا بیس باشد؟


دلیل این کار این است که من این دیتا بیس را به چند کاربر مختلف می دهم و میخواهم همه گرفته شده را در یک جدول اپند کنم و آیدی جدول اپند شده جدید خود محتوای یک سلکت لیست دیگر است که آن هم اپند شده است و تجمیع است و نباید آیدی بعد از اپند تجمیع شود و باید بر حسب هر کاربر باقی بماند.
مثال: گروه الف نیرو هایی با آیدی الف-1 و الف-2 را دارد و گروه ب نیروهایی با آیدی ب-1 ب-2 را از سلکت لیست انتخاب نیروی انسانی گروه انتخاب می کند که این سلکت لیست از کوئری متصل به تیبل نیرو انسانی ها منشا می گیرد. می خواهم وقتی این دو جدول (گروه و نیرو انسانی) را از هر دو کاربر می گیرم و تجمیع می کنم سلکت لیست ها و انتخاب هاشان خراب نشود!!!

ahmadrezaahmad
یک شنبه 30 تیر 1392, 17:24 عصر
آقای امیری
خودم قسمت اولا رو متوجه شدم،لطفا راجع به آی دی سازی کاستومایز شده که می شود پیشوندی متناسب با محتوای رکورد دیگر جدول دیگر افزود راهنمایی کنید

Abbas Amiri
یک شنبه 30 تیر 1392, 17:38 عصر
آقای امیری
خودم قسمت اولا رو متوجه شدم،لطفا راجع به آی دی سازی کاستومایز شده که می شود پیشوندی متناسب با محتوای رکورد دیگر جدول دیگر افزود راهنمایی کنید

به پست زیر مراجعه کنید

درج سال در شماره نامه و ریست شدن شماره در سال جدید (http://barnamenevis.org/showthread.php?376948-%D8%AF%D8%B1%D8%AC-%D8%B3%D8%A7%D9%84-%D8%AF%D8%B1-%D8%B4%D9%85%D8%A7%D8%B1%D9%87-%D9%86%D8%A7%D9%85%D9%87-%D9%88-%D8%B1%DB%8C%D8%B3%D8%AA-%D8%B4%D8%AF%D9%86-%D8%B4%D9%85%D8%A7%D8%B1%D9%87-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-%D8%AC%D8%AF%DB%8C%D8%AF)

ahmadrezaahmad
دوشنبه 31 تیر 1392, 12:20 عصر
107740سلام
ممنونم
من لینک شما رو دیدم و کدش رو رفتم توابعش رو از help آفیس آنالیز کردم و سعی کردم با مدل خودم تطبیق بدم ولی ارور می ده،فایل رو براتون می زارم و همچنین کد رو لطفا ایراد کار رو بگید بهم:

Function NewCode(yr As String) As String
K = Nz(DMax("ID", "list", Mid("id", 2, 1)), "yr" & "-" & "-00")
j = Split(K, "-")
N = Val(j(1)) + 1
NewCode = j(0) & "-" & Format(N, "00")
End Function


و در فرم این مدلی صد زدم:

Private Sub Form_Current()
ID = NewCode(hava)

End Sub


مدلی که می خوام ایدی سازی کنه اینه :مثلا با صدا زدن(NewCode(hava :
hava01
hava02
hava03 و..
را بسازد!!

****اگر مشکل کدم را فهمیدی و این نیاز حل شد،می خوام بدونم آیا راهی هست که این کلمه hava رو از رکورد اول جدول دیگری با نام tbl_group و فیلد group_name اش بگیرد!!!اگر محتوا فارسی باشد مشکلی پیش می آید؟
ممنون!!!

Abbas Amiri
دوشنبه 31 تیر 1392, 23:10 عصر
107740سلام
ممنونم
من لینک شما رو دیدم و کدش رو رفتم توابعش رو از help آفیس آنالیز کردم و سعی کردم با مدل خودم تطبیق بدم ولی ارور می ده،فایل رو براتون می زارم و همچنین کد رو لطفا ایراد کار رو بگید بهم:

Function NewCode(yr As String) As String
K = Nz(DMax("ID", "list", Mid("id", 2, 1)), "yr" & "-" & "-00")
j = Split(K, "-")
N = Val(j(1)) + 1
NewCode = j(0) & "-" & Format(N, "00")
End Function


و در فرم این مدلی صد زدم:

Private Sub Form_Current()
ID = NewCode(hava)

End Sub


مدلی که می خوام ایدی سازی کنه اینه :مثلا با صدا زدن(NewCode(hava :
hava01
hava02
hava03 و..
را بسازد!!

****اگر مشکل کدم را فهمیدی و این نیاز حل شد،می خوام بدونم آیا راهی هست که این کلمه hava رو از رکورد اول جدول دیگری با نام tbl_group و فیلد group_name اش بگیرد!!!اگر محتوا فارسی باشد مشکلی پیش می آید؟
ممنون!!!

از تابع زیر استفاده کنید


Function NewCode(prefix As String) As String
K = Nz(DMax("ID", "list", "Left(id," & Len(prefix) & ")='" & prefix & "'"), prefix & "00")
N = Val(Right(K, Len(K) - Len(prefix))) + 1
NewCode = prefix & Format(N, "00")
End Function

ahmadrezaahmad
سه شنبه 01 مرداد 1392, 10:13 صبح
سلام واقعا متشکرم
حالا سوالم اینه اگه بخوای این پیشوند آیدی عنصر سطر یک فیلد یک جدول دیگر با شد چگونه اونو صدا می زنیم!؟
مثلا به جای ID = NewCode("hava")
چیزی باشد که مثلا بگوید :
ID = NewCode(tbl_group.group_name.recordser1)
یعنی اساسا یک عنصر در سطر ایکس و فیلد ایگرگ و جدول زد رو چجوری می شه صدا زد؟
مرسی

Abbas Amiri
سه شنبه 01 مرداد 1392, 19:21 عصر
سلام واقعا متشکرم
حالا سوالم اینه اگه بخوای این پیشوند آیدی عنصر سطر یک فیلد یک جدول دیگر با شد چگونه اونو صدا می زنیم!؟
مثلا به جای ID = NewCode("hava")
چیزی باشد که مثلا بگوید :
ID = NewCode(tbl_group.group_name.recordser1)
یعنی اساسا یک عنصر در سطر ایکس و فیلد ایگرگ و جدول زد رو چجوری می شه صدا زد؟
مرسی

در این مورد می توانید از دستور DLookup استفاده کنید :



ID = NewCode(DLookup("group_name", "tbl_group","ID=5"))




بجای قسمت شرط آن عبارت مناسب را بنویسید