عدم استفاده از AutoNumber در فیلدهای ID
بسیای از دوستان احتمالا برای راحتی کار جهت فیلدهای 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 نامگذاری کرده ام و از کد میان ستاره ها استفاده میکنم
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
ازآنجا که در بسیاری از جدوال جهت شناسه از نامهای غیر ID استفاده میشود ، وهمچنین در تابع DMax حتما باید نام فیلد ذکر گردد ، با روش فوق می توان به هرفیلد با هرنام ودر هرجای جدول دسترسی داشت.
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
بنده هم طرفدار اخلاقیات هستم واز نصیحتتان ممنون . اما لطفا توضیح دهید منظورتان محل استفاده از تابع است یا پست سوم.
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
آقای Zero Defect فکر می کنم مطالب بیان شده در پست شماره 4 ، خواننده را دچار سوء تفاهم می کند لطفا تجدید نظر نمایید.
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
سلام
جسارتا خدمت دوستان عرض كنم بنده از اين روش استفاده ميكنم در صورت امكان معايب اين روش رو توضيح بدين
در Defult Value فيلد مورد نظر اين كد رو قرار ميدم
=Nz(DMax("Field Name";"Table Name");0)+1
در اين كد به جاي 0 هر عدد دلخواه مورد نياز كه بخوام از اون عدد شمارش شروع بشه رو قرار ميدم
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
با سلام
ببخشید جسارت نباشه خدمت اساتیدمحترم.
ولی اصولا استفاده از دیتا تایپ اتونامبر (یا فیلد ID) جهت کلید اصلی مخالف قواعد نرمال سازی پایگاه داده است. شاید در 100 جدول شما یکبار مجبور بشید از فیلدی با این مشخصات به عنوان کلید اصلی استفاده کنید. که البته اون هم دیگه اینهمه بحث نیاز نداره.
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
اگر شما از ديدگاه اموزشي به اين مطلب نگاه كنيد متوجه ميشين كه براي افرادي كه تازه شروع به كار كردن و مدام با اين مسئله روبرو هستن كه نميدونن بايد در برنامه براي يك ستون عددي افزايشي بايد از اتونامبر استفاده كنن يا كد نويسي كنن بسيار مفيده و ضمنا راهكارهاي مختلفي هم براي انجام كارهاي مشابه معرفي ميشه
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
از این کد استفاده کنید تا برای همیشه بی نیاز شوید البته این حالت برای فرم هایی خوبه که در حالت single form هستند :
On Error Resume Next
If Form.NewRecord Then
LBLCurrec.Caption = "..."
Else
LBLCurrec.Caption = CurrentRecord()
End If
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
سلام آقای امیری
میخواستم اولا خواهش کنم یک نمونه از این مدل آی دی سازی آپلود کنید و در ادامه سوال من این است که این مدل مربوط به تیبل است یا فرم که در قسمت current فرم کد را باید وارد کرد؟!
اساسا ID را روی جذول تغییر می دهد؟ یا خیر؟
دوما-اگر من بخواهم آی دی بسازم که علاوه بر عدد مقدار حرف پیشوند داشته باشد در کجای کد شما باید اصلاح شود؟
مشروح دلیل این کار را خدمتتان در انتها پست عرض می کنم
سوما-آیا حالتی وجود دارد که این پیشوند که در دوما روی آن بحث شد برگرفته از مقدار فیلدی در رکوردی در جدول دیگر این دیتا بیس باشد؟
دلیل این کار این است که من این دیتا بیس را به چند کاربر مختلف می دهم و میخواهم همه گرفته شده را در یک جدول اپند کنم و آیدی جدول اپند شده جدید خود محتوای یک سلکت لیست دیگر است که آن هم اپند شده است و تجمیع است و نباید آیدی بعد از اپند تجمیع شود و باید بر حسب هر کاربر باقی بماند.
مثال: گروه الف نیرو هایی با آیدی الف-1 و الف-2 را دارد و گروه ب نیروهایی با آیدی ب-1 ب-2 را از سلکت لیست انتخاب نیروی انسانی گروه انتخاب می کند که این سلکت لیست از کوئری متصل به تیبل نیرو انسانی ها منشا می گیرد. می خواهم وقتی این دو جدول (گروه و نیرو انسانی) را از هر دو کاربر می گیرم و تجمیع می کنم سلکت لیست ها و انتخاب هاشان خراب نشود!!!
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
آقای امیری
خودم قسمت اولا رو متوجه شدم،لطفا راجع به آی دی سازی کاستومایز شده که می شود پیشوندی متناسب با محتوای رکورد دیگر جدول دیگر افزود راهنمایی کنید
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
نقل قول:
نوشته شده توسط
ahmadrezaahmad
آقای امیری
خودم قسمت اولا رو متوجه شدم،لطفا راجع به آی دی سازی کاستومایز شده که می شود پیشوندی متناسب با محتوای رکورد دیگر جدول دیگر افزود راهنمایی کنید
به پست زیر مراجعه کنید
درج سال در شماره نامه و ریست شدن شماره در سال جدید
1 ضمیمه
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
ضمیمه 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 اش بگیرد!!!اگر محتوا فارسی باشد مشکلی پیش می آید؟
ممنون!!!
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
نقل قول:
نوشته شده توسط
ahmadrezaahmad
ضمیمه 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
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
سلام واقعا متشکرم
حالا سوالم اینه اگه بخوای این پیشوند آیدی عنصر سطر یک فیلد یک جدول دیگر با شد چگونه اونو صدا می زنیم!؟
مثلا به جای ID = NewCode("hava")
چیزی باشد که مثلا بگوید :
ID = NewCode(tbl_group.group_name.recordser1)
یعنی اساسا یک عنصر در سطر ایکس و فیلد ایگرگ و جدول زد رو چجوری می شه صدا زد؟
مرسی
نقل قول: عدم استفاده از AutoNumber در فیلدهای ID
نقل قول:
نوشته شده توسط
ahmadrezaahmad
سلام واقعا متشکرم
حالا سوالم اینه اگه بخوای این پیشوند آیدی عنصر سطر یک فیلد یک جدول دیگر با شد چگونه اونو صدا می زنیم!؟
مثلا به جای
ID = NewCode("hava")
چیزی باشد که مثلا بگوید :
ID = NewCode(tbl_group.group_name.recordser1)
یعنی اساسا یک عنصر در سطر ایکس و فیلد ایگرگ و جدول زد رو چجوری می شه صدا زد؟
مرسی
در این مورد می توانید از دستور DLookup استفاده کنید :
ID = NewCode(DLookup("group_name", "tbl_group","ID=5"))
بجای قسمت شرط آن عبارت مناسب را بنویسید