PDA

View Full Version : نوشتن یک کد در رویداد لود همه فرمها در اکسس



CSharpLovers
چهارشنبه 25 آبان 1401, 23:39 عصر
سلام به همه دوستان.
یک دیتابیس داریم با حدود 600 فرم . فرمها که باز میشن همشون به جدولهای مختلف وصل هستند و اولین رکورد جدول رو نمایش میدن . میخوایم کدی برای هر فرم بنویسیم در رویداد لود شدن فرم که وقتی فرم لود میشه به آخرین رکورد جدول بره و یک رکورد جدید ایجاد بشه .
این هم کدش :

DoCmd.GoToRecord acDataForm, "form1", acLast

حالا مسئله اینجاست که نوشتن این کد در رویداد on load یا همون Form_Load این 600 تا فرم بسیار وقت گیر هست .
آیا میشه یک ماکرو نوشت که وقتی هر فرم باز میشه به صورت اتوماتیک این کار انجام بشه ؟ یک رکورد جدید برای ثبت ایجاد کنه و در اولین رکورد نباشه .
یا مثلا راهی هست که این کد مربوطه رو برای همه فرمها ایجاد کنیم ؟

eb_1345
پنج شنبه 26 آبان 1401, 07:29 صبح
..................................

mazoolagh
پنج شنبه 26 آبان 1401, 18:28 عصر
همین که 600 فرم دارین یعنی طراحی شما از پایه اشکال داره!
تعداد فرم های یک اپ اکسس متعارف نباید از 30-40 تا بیشتر باشه،
برای جدول ها هم زیر 50 تا هست معمولا،
و تعدا کل ابجکتها هم زیر 150 تا.

با این وجود و با همه این موارد؛
پرسش شما پاسخ داره!

mazoolagh
پنج شنبه 26 آبان 1401, 18:32 عصر
اول باید یک ماجول بسازین و کدی که قرار هست در onload همه فرمها استفاده بشه رو اونجا پیاده کنین:
PUBLIC FUNCTION GLOBAL_ONLOAD(FORMNAME AS STRING)
DOCMD.GOTORECORD ACDATAFORM , FORMNAME , ACNEWREC
END FUNCTION

mazoolagh
پنج شنبه 26 آبان 1401, 18:40 عصر
حالا یک روتین مینویسین که در اون فرمها یکی یکی در حالت design باز و کد onload برای اون تعریف و بعد save میشه:
DIM FORM_OBJECT AS OBJECT
DIM FRM AS FORM
DIM FORM_NAME AS STRING
FOR EACH FORM_OBJECT IN CURRENTPROJECT.ALLFORMS
FORM_NAME= FORM_OBJECT.NAME
DOCMD.OPENFORM FORM_NAME , ACDESIGN , , , , ACHIDDEN
SET FRM= FORMS(FORM_NAME)
FRM.ONLOAD= REPLACE("=GLOBAL_ONLOAD(""@FORMNAME"")" , "@FORMNAME" , FORM_NAME)
DOCMD.CLOSE ACFORM , FORM_NAME , ACSAVEYES
NEXT

این روتین یکبار اجرا بشه کافیه، هرچند که اجرای چندباره اون هم مشکل (یا تاثیر) نداره!

eb_1345
پنج شنبه 26 آبان 1401, 22:49 عصر
درود بر استاد mazoolagh (https://barnamenevis.org/member.php?9893-mazoolagh) عزیز !
با اجازتون من در کد های شما تغییراتی ایجاد کردم که ماحصل اون در نمونه ضمیه قرار دادم
اما توضیح در خصوص تغییرات :
بجای ماژول


PUBLIC FUNCTION GLOBAL_ONLOAD(FORMNAME AS STRING)
DOCMD.GOTORECORD ACDATAFORM , FORMNAME , ACNEWREC
END FUNCTION




ماژول زیر رو بدون آرگومان ایجاد کردم


Public Function NewRec()
DoCmd.GoToRecord , , acNewRec
End Function

بعد در سابروتینی که فرم ها در حالت دیزاین بازمیشن و کد اجرای انتقال به رکورد جدید درج میشه من OnLoad فرم رو مساوی عبارت "=NewRec()" قرار دادم . با این کار در واقع بجای ایجاد سابروتین Private Sub Form_Load()
مستقیماً در همون قسمت OnLoad ماژول =NewRec() درج و فراخوانی میشه .
ضمناً با توجه به اینکه در اجرای اولیه از کد DOCMD.Close acForm, frm, acSaveYes که مربوط به بستن فرمها در حالت دیزاین میباشه ایراد گرفته میشد بنده برای بستن فرم ها از ماژول زیر استفاده کردم:


Public Function CloseAllForms()
Dim lngLoop As Long
For lngLoop = (Forms.Count - 1) To 1 Step -1
DoCmd.Close acForm, Forms(lngLoop).Name, acSaveYes
Next lngLoop
End Function



وبالاخره درج همه کد بصورت یکجا :


Public Function CloseAllForms()
Dim lngLoop As Long
For lngLoop = (Forms.Count - 1) To 1 Step -1
DoCmd.Close acForm, Forms(lngLoop).Name, acSaveYes
Next lngLoop

End Function
Public Function NewRec()
DoCmd.GoToRecord , , acNewRec
End Function

Public Sub EventNewRec()
On Error Resume Next
Dim Frm_Name As String
Dim frm As Form
Dim obj As AccessObject, dbs As Object
Set dbs = Application.CurrentProject
For Each obj In dbs.AllForms
If obj.Name <> "FMain" Then
Frm_Name = obj.Name
DoCmd.OpenForm Frm_Name, acDesign, , , , acHidden
Set frm = Forms(obj.Name)
frm.OnLoad = "=NewRec()"
CloseAllForms
' DOCMD.Close acForm, frm, acSaveYes
End If
Next obj
End Sub


ناگفته پیداست که با یک بار اجرای کد ماژول EventNewRec در رخداد کلیک کمند باتن فرم اصلی کد انتقال به رکورد جدید برای همیشه در قسمت OnLoad همه فرم ها درج میشه بنابراین با اجرای اولیه ماژول فوق دیگه نیازی به اجرای اون در دفعات بعد نمیباشه و میشه اون رو حذف کرد.
ارادتمند : بهرامی

mazoolagh
چهارشنبه 02 آذر 1401, 11:04 صبح
درود بر mazoolagh (https://barnamenevis.org/member.php?9893-mazoolagh) عزیز !
من در کد های شما تغییراتی ایجاد کردم که ماحصل اون در نمونه ضمیه قرار دادم
اما توضیح در خصوص تغییرات :
...
...
ارادتمند : بهرامی

درود بر شما جناب بهرامی گرامی،
بسیار ممنون از اصلاح و بهینه کردن کد و توضیحات گسترده و گویا،
من همیشه از مطالب مفید شما و دیگر دوستان خوشه چینی میکنم.

CSharpLovers
جمعه 11 آذر 1401, 19:10 عصر
درود بر استاد بهرامی و mazoolagh (https://barnamenevis.org/member.php?9893-mazoolagh) عزیز . بسیار عالی .
صمیمانه از شما اساتید تشکر میکنم و آرزو دارم روز به روز بر علم و دانش شما افزوده شود و همیشه در پناه نور و عشق الهی باشید .
:قلب::قلب::تشویق::تشویق: