PDA

View Full Version : آموزش: آموزش DataMacro



AbbasSediqi
جمعه 29 دی 1396, 00:43 صبح
با سلام مجدد

شرمنده که مطلب تکراری اما فکر کردم که این مطلب رو به صورت جداگانه قرار بدم بهتره



5 مقوله است که همه رو میشه به راحتی انجام داد


Insert , Update (Edit) , Delete در یک Table و مقوله پنجم هم همین موارد در Table دیگریست


- مایکروسافت از Access 2007 به بعد قابلیت قدیمی ای رو که البته در اکسس تازگی داشت به فایل هاش اضافه کرد



این قابلیت همون SQLFunction هستش که در اکسس به عنوان DataMacro شناخته میشه


- بسیار هم قدرتمنده و ضریب خطای کمی داره و کد نویسی رو در این موارد بسیار کم میکنه



و اما Datamacro کجاست


147482

147483


دیتا ماکرو رو از اینجا میتونید ایجاد کنید

اما توضیح :


AfterInsert : همون طور که از اسمش مشخصه این حالت کارش اینه که بعد از هر ایجاد رکورد جدید بیاد و ماکرو ای رو که براش تعریف کردید اجرا کنه
AfterUpdate: همون طور که از اسمش مشخصه این حالت کارش اینه که بعد از هر تغییر در رکورد های قبلی بیاد و ماکرو ای رو که براش تعریف کردید اجرا کنه
AfterDelete: همون طور که از اسمش مشخصه این حالت کارش اینه که بعد از هر حذف رکورد بیاد و ماکرو ای رو که براش تعریف کردید اجرا کنه


BeforeDelete : همون طور که از اسمش مشخصه این حالت کارش اینه که قبل از هر حذف رکورد بیاد و ماکرو ای رو که براش تعریف کردید اجرا کنه


و اما BeforeChange : کارش اینه که قبل از هر تغییری بیاد و ماکرو ای رو که براش تعریف کردید رو اجرا کنه

خوب بریم سراغ ایجاد یه دیتا ماکرو :

برای همین روی Create Named Macro کلیک کنید



147484


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



147485

AbbasSediqi
جمعه 29 دی 1396, 00:45 صبح
همون طور که تصویر بالا مشاهه میکنید دارای سه بخشه

بخش بالایی سمت چپ که مربوطه Parameters

بخش پایینب سمت چپ مربوطه به ماکرو

بخش سمت راست منوی درختی همون سمت چپ پایینه



از اینجا به بعد خیلی مهم میشه


Parameters : پارامتر ها همون دریافتی های دیتا ماکرو هستن یعنی برای اینکه به دیتا ماکرو بتونید چیزی ارسال کنید باید براش پارامتر تعیین کنید و بعد با استفاده از پارمترهای تعیین شده برای دیتا ماکرو هرچی خواستید ارسال کنید

به زبون ساده تر مثل یه متغییر میمونه برای یک فانکشن که باید برای اینکه فانکشن کارش رو انجام بده متغغیر رو بهش بدید


خوب حالا بر روی CeateParameter در قسمت سمت چپ بالا کلیک کنید

147486



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




147487




هر پارامتر شامل دو بخشه

اول اسم
دوم توضیح که برای خودتون که بدونید این پارامتر چیه

AbbasSediqi
جمعه 29 دی 1396, 00:52 صبح
بعد از ساختن یک پارامتر حالا نوبت ایجاد یک Action هستش

فرض کنید میخواهید یک رکورد جدید ایجاد کنید ولی میخواهید تکراری نباشه

من تو این تیبل دو تا Field بیشت ندارم الان ID و Name

فرض کنید میخواهیم یک نام جدید ایجاد کنیم ولی تکراری نباشه

خوب برای این کار به ترتیب این کار ها رو انجام میدیم

از منوی Action باید LookUp A Record In رو انتخاب کنید




147495




بعد از انتخاب این Action مثل شکل زیر میشه


147496




خوب میریم سراغ شماره 1 :

Required : در اینجا مشخص میکنیم در کدوم Table این کار انجام بشه


نکته بسیار مهم :

مهم نیست در کدوم تیبل در حال ساخت دیتا ماکرو هستید

چون در هر کاری در دیتا ماکرو باید تیبل هدف رو مشخص کنید

خوب من یه تیبل بیشتر ندارم و اون رو انتخاب میکنم

خوب میریم سراغ شماره 2 :

در اینجا بهش میگیم بگرد ببین داده ای شبیه به این داری

خوب به این شکل وارد مکنیم



[Name]=[NameParameter]






خوب حالا میریم سراغ شماره 3 :

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

خوب اول بهش میگم یه ارور نشون بده

بنابراین RaiseError رو از منوی Action همین Lookup انتخاب کنید

دقت کیند به عکس

یه شماره در Error Number وارد کنید ودر Error Description متنی رو که میخواهید نمایش بده

بعد از این از همون منوی Action باید StopMacro رو انتخاب کنید





147497



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





147498





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

اما بعد باید از منوی Action همین SetField رو انتخاب کنید




147499



حالا در مقابل Name نام Field رو بنویسید که اینجا میشه [Name]
در مقابل Value هم نام Parameter رو که ایجاد کردید بنویسید که میشه [NameParameter]

بعذ اگه خواستید یه پیام هم مثل قبل برای ایجاد کنید



147500




خوب ابتدای کار تموم شد و حالا ذخیره میکنیم و براش یه اسم در نظر میگیریم

من اسمش رو میذارم Insert

AbbasSediqi
جمعه 29 دی 1396, 00:53 صبح
خوب حالا میریم سراغ فراخواین این Datamacro

اول یه فرم بسازید و در اون یه Textbox ایجاد کنید و Button

بعد بر روی OnClick این button کلیک کرده و MacroBuilder رو انتخاب کنید

در منوی ماکرو از منوی Action باید Run DataMacro رو انتخاب کنید

از منوی کشوی مقابل MacroName ماکرو ساخته شده رو انتخاب کنید

میبینید که پارامتر ساخته شده رو ایجاد کرد و ازتون درخواست میکنه

در مقابل پارامتر NameParameter هم [Text2] که در اینجا سام Textbox ساخته شده منه رو انتخاب میکنیم

حالا فراخوانی شد

اما نکته در هنگام استفاده از OnRaiseError در دیتا ماکرو باید کار زیر رو هم انجام بدید

بر روی OnError فرم کلیک کنید و MacroBuilder رو انتخاب کنید

بعد از منوی Action باید If رو انتخاب کنید

در مقابل if بنویسید



Error(1234) & Error(1)


که یعنی اگر ارور شماره 1234 و ارور 1 که من به عنوان شماره در دیتا ماکرو قرا دادم بوجود اومد چی کار کنه

بعد از منوی کشویی زیر if باید onerror رو انتخاب و فقط از منوی کشویی مقابل Go to آیتم next رو انتخاب کنید و بعد ذخیره کنید

AbbasSediqi
جمعه 29 دی 1396, 00:53 صبح
این هم نمونه کار

AbbasSediqi
جمعه 29 دی 1396, 00:55 صبح
و اما عزیزانی که در محیط vba برنامه نویسی میکنن در فراخوانی DataMacro ممکن دچار مشکل بشن

فراخوانی دیتا ماکرو در vba درای دو شرطه

اول داده ست شده با هر پارامتر باید با نوع داده وارد شده با Field اصلی برابر باشه

یعنی مثلا اگر فیلدی داشته باشید که از نوع عدد باشه و بعد بخواهید با دیتا ماکرو تغییر یا اضافه کنید بهش باید حتما داده وارد شده عددی باشه

و اما اگه داده string باشه قضیه فرق میکنه باید قبل و بعد داده """" رو اضافه کنید

نکته دوم باید قبل از اجرای دیتا ماکرو تمامی پارامتر ها رو هم ست کنید

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






Public Function SetDataMacro(DataMacroName As String, Parameters, ParameterValue)
Dim i As Integer
i = 0
For Each Item In Parameters
If IsNumeric(ParameterValue(i)) = True Then
DoCmd.SetParameter Item, ParameterValue(i)
Else
DoCmd.SetParameter Item, """" & ParameterValue(i) & """"
End If
i = i + 1
Next
DoCmd.RunDataMacro DataMacroName
End Function



رای فراخواین این فانکش هم باید مقدار رو به صورت Array وارد کنید

دقت کنید در داده وارد شده باید index پارامتر و ParameterValue باهم برابر باشند

یعنی اگر پارامتر در Array با Index شماره 0 باشه داده برابر هم باید در ParameterValue دارای Index 0 باشه




SetDataMacro "Commodity.Update", Array("IDParameters", "AvailableParameters"), _
Array(Me.cmb_Search.Column(0, Me.cmb_Search.ListIndex), _
Me.cmb_Available.Value)



سوالی بود در خدمتم

mazoolagh
پنج شنبه 05 بهمن 1396, 09:45 صبح
بخش فنی مبحث رو که آقای صدیقی الحق و الانصاف سنگ تمام گذاشتن و کامل هست.

چند چیز در باره data macro هست که بد نیست در موردش بیشتر تبادل نظر بشه و از تجربیات هم استفاده کنیم:

اول اینکه دیتامکرو استفاده کنیم یا کد vba بنویسیم؟
نظر خودم این هست که پاسخ به ماهیت کار برمیگرده. اگر دیتابیسی داریم که عملیات مربوط به insert/delete/update به صورت متمرکز انجام میشه قطعا بهتره کد vba بنویسیم چون دستمون باز هست و عملیاتی که در دیتامکرو میتونیم انجام بدیم محدود هست.
ولی اگر این عملیاتی که گفته شد غیر متمرکز هست (فرضا چند فرم مختلف برای کارهای یکسان داریم) نگهداری و یکسان کردن کد در همه اونها مشکل هست و در این حالت بهتره دیتامکرو استفاده کنیم.
البته این بصورت عام هست و پاسخ ممکنه در شرایط خاص تغییر کنه.

دویم اینکه اصلا به چه دردی میخوره؟ چه لزومی هست که یک عملیاتی حتما داغ داغ در زمان insert/update/delete انجام بشه.
خب، یک مثال خوب رو خود آقای صدیقی آوردن (جلوگیری از ثبت دیتا تکراری) که حتما باید قبل از Insert کنترل بشه.
اما موضوع مهمتر زمان هست. وقتی ورود یا ویرایش اطلاعات (بصورت دستی و نه بصورت batch مثلا با کوئری) انجام میدیم زمان مسئله مهمی نیست و دیتابیس هم عملا بی بار هست. ولی وقت گزارش گیری و محاسبه totalها یا عملیات روی فیلدهای text زمان نمود پیدا میکنه.
دیتامکرو اینجا به کمک میاد (البته با vba هم میشه با توجه به مورد اول) : فرض کنید سیستم حسابداری یا فروش یا انبار داریم که در همه اینها موقع گزارشگیری نیاز به total روی فیلدهای عددی داریم. خب، خیلی ساده میتونیم در جدول کل، فیلد جمع رو خودمون اضافه کنیم و در جدول جزء ماکروهایی بنویسیم که با توجه به نوع عملیات insert/update/delete فیلد جمع در جدول کل رو بروز رسانی کنه. حالا در موقع گزارشگیری نیاز به Total گرفتن رو جزء نیست و مستقیم میشه از کل total رو بلافاصله داشت.

مسئله زمان روی فیلدهای string خیلی بیشتر نمود داره: فرض کنین قرار هست در اسامی دنبال "نیک آبادی" یا "مؤسس" یا "علیرضا" بگردین.
اول اینکه ممکنه "ک" و "ی" در سیستم کاربر با اونچه که در دیتابیس هست فرق داشته باشه. همچنین مطمئن نیستیم که تایپیست "نیک ابادی" یا "موسس" یا "علی رضا" ثبت کرده باشه. اینجا کافی هست که یک فیلد دیگه (مخفی از دید کاربر) به جدول اضافه کنیم و ماکروهایی بنویسیم که در لحظه ثبت یا ویرایش نام، اطلاعات فیلد اصلی رو پردازش و در این فیلد ذخیره کنه؛ بصورت "نیکابادی" و "موسس" و "علیرضا". بالطبع برای جستجو هم همین پردازش روی عبارت انجام میشه و جستجو هم برای این فیلد انجام میشه و نه فیلد اصلی.
در اینصورت بجای اینکه هنگام جستجو برای هر رکورد یک بار پردازش نام رو انجام بدیم و بعد like بگیریم مستقیما like میگیریم و روی رکوردهای زیاد راحت تا صدبرابر صرفه جویی زمان داریم.

مورد سوم میتونه ساخت کلید از روی مقادیر فیلدها باشه : مثلا بخشی از تاریخ + کد شهر + کد ناحیه + کد ...