PDA

View Full Version : آموزش: DataMacro در جداول لینک شده



mazoolagh
دوشنبه 15 دی 1399, 14:04 عصر
1- برای آموزش دیتامکرو تاپیک زیر رو ببینید:
آموزش: آموزش DataMacro (barnamenevis.org) (https://barnamenevis.org/showthread.php?545694-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-DataMacro)

2- در سمت FrontEnd به Named Macro ها در سمت BackEnd دسترسی ندارین، بنابراین باید کارها رو در سمت FE انجام بدین.

3- اگر در دیتامکروها از User Defined Functions استفاده کرده باشین، بعد از split کردن جدول باید اون توابع رو در سمت FE نگه دارین تا مکرو بهش دسترسی داشته باشه.
توابعی که در BE باشند فقط در همونجا قابل دسترس هستن و چون بطور منطقی دسترسی مستقیم کاربر به BE بسته است، نیازی به اونها ندارید مگر زمانی که خودتون مستقیم با دیتا در BE سروکار داشته باشین.

mazoolagh
دوشنبه 15 دی 1399, 14:10 عصر
در مثالی که آورده میشه یک جدول به شکل زیر داریم:
152828
که فیلدهای Created , LastEdit , Row باید توسط دیتامکرو پر بشن.
فیلد Row از نوع شمارنده است و باید با اضافه شدن هر رکورد جدید خودکار محاسبه بشه و در صورت حذف هر رکورد تمامی Rowهای بعد از اون باید خودکار اصلاح بشن.
فیلد Created زمان insert رکورد با تاریخ و ساعت فعلی پر میشه.
فیلد LastEdit زمان ویرایش فیلد Comments رو نشون میده.

mazoolagh
دوشنبه 15 دی 1399, 14:12 عصر
قبل از هر چیز یک تابع برای محاسبه خودکار Row مینویسیم:
Public Function MaxRow() As Long
MaxRow = Nz(DMax("Row", "Comments"), 0)
End Function

mazoolagh
دوشنبه 15 دی 1399, 14:17 عصر
سورس مکرو Before Change
152829

mazoolagh
دوشنبه 15 دی 1399, 14:18 عصر
سورس مکرو After Delete
152830

mazoolagh
دوشنبه 15 دی 1399, 14:22 عصر
طراحی فرم:
152831

mazoolagh
دوشنبه 15 دی 1399, 14:26 عصر
چون همه عملیات در Backend انجام میشه کدهای فرم جمع و جور و کم است:
Option Compare Database
Option Explicit

Private Sub NewComment_AfterUpdate()
If Trim(Nz(Me.NewComment, "")) = "" Then Exit Sub
Echo False
With Me.Recordset
.AddNew
!Comment = Me.NewComment
.Update
End With
Me.NewComment = ""
Echo True
End Sub

Private Sub Btn_Create_Click()
Dim i, MaxRow As Integer
MaxRow = Nz(DMax("Row", "Comments"), 0)
Echo False
With Me.Recordset
For i = 1 To 10
.AddNew
!Comment = "Comment " & (i + MaxRow)
.Update
Next
End With
Echo True
End Sub

Private Sub Btn_Clear_Click()
Echo False
Me.Recordset.MoveLast
DoCmd.RunSQL "DELETE FROM Comments"
Me.Requery
Echo True
End Sub

mazoolagh
دوشنبه 15 دی 1399, 14:29 عصر
این مکرو فقط با هدف آموزش اجرای یک تابع در مکرو استفاده شده و تماما با کد VBA قابل جایگزینی است:
152832

mazoolagh
دوشنبه 15 دی 1399, 14:32 عصر
فراموش نمیکنیم که توابعی که توسط دیتامکرو نیاز است باید در سمت Frontend هم باشن:
Option Compare Database
Option Explicit

Public Function MaxRow() As Long
MaxRow = Nz(DMax("Row", "Comments"), 0)
End Function

Public Function SetEcho(x As Boolean)
Echo x
End Function

mazoolagh
دوشنبه 15 دی 1399, 14:37 عصر
یادتون باشه باید جدول رو لینک کنین!