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