ضمن سلام
در اولین بخش این مبحث , لازمه که مقداری در خصوص برنامه نویسی VBA در محیط Access توضیحاتی رو عرض کنم
هدف از ایجاد VBA به عنوان یک محیط توسعه , در اختیار گذاشتن امکانات زیر بوده :
- سفارشی سازی برنامه متناسب با نیازهای خودتون
- امکان انجام کارها و عملیاتی که خیلی از اونها به صورت استاندارد در داخل Access گنجونده نشدن و یا به صورتی که جوابگوی تمامی سطوح کاری باشن , دیده نشدن .
در این محیط به شما امکان کد نویسی یا همون برنامه نویسی داده میشه .
توضیح : Access در عمل دارای دو بخش برنامه نویسی و برنامه سازی هستش که عملاً خیلی از کاربرها فقط اقدام به برنامه سازی توسط اون میکنن .
بد نیست تعریفی هم در خصوص Reference داشته باشم .
اجازه بدید مفهوم عمومیش رو با یه مثال ساده توضیح بدم .
فرض کنید که به کتابخونه محلتون مراجعه می کنید و یه کتاب رو به امانت میگیرید و به کمک اون کتاب یکسری از مشکلاتتون رو حل می کنید .
برای تهیه یه کتاب زحمتهای زیادی کشیده میشه , از شب بیداریهای نوشتنش گرفته تا مقوله چاپ و دردسرهای اون , ولی شما عملاً بدون متحمل شدن هیچ یک از اون مشکلات , از چکیده کل اون زحمات , یعنی همون کتابی که به امانت گرفتید استفاده می کنید .
در بخش References در واقع شما لیستی از این کتابها , که در نقش کتابهای مرجع هستند رو در اختیار دارید .
این فایلهای Dll ( عموماً از نوع Dll و یا همون Dynamic link library ) همون کتابهای فرضی شما هستند .
معمولاً شامل کدهایی از پیش نوشته شدن که قابلیت استفاده و به اشتراک گذاری کدها رو , در برنامه های دیگه در اختیار شما قرار میدن .
این کار عموماً با فراخوانی توابع موجود در داخل اونها به انجام میرسه .
اتصال به اونها معمولاً به راحتی و با حداقل کد نویسی امکان پذیره .
این مرجعها عملاً ممکنه توسط توسعه دهنده هایی مختلف و شرکتهایی متفاوت عرضه شده باشن .
مشکل دقیقاً از همینجا شروع میشه .
راه ارتباطی با این مراجع از طریق توابعی هست که در داخل اونها وجود داره و هر تابعی هم نامی و احتمالاً نیازمند پارامترهایی .
هیچ الزام و تضمینی وجود نداره که نامهایی کاملاً متفاوت در داخل Dll های تولید شده توسط شرکتهای مختلف , در نظر گرفته شده باشه .
ممکنه که دو تابع کاملاً همنام در داخل دو رفرنس وجود داشته باشه , در این حالت اکسس در هنگام استفاده از تابع مورد نظر شما دچار خطا میشه , که پیامد اون میتونه یک خطای منطقی در اجرای برنامه و یا یک خطای منجر به توقف اجرا بوده باشه .
به طور مثال دو Reference زیر رو که عمومیت دارن مثال میزنم
رفرنسهای DAO و ADO . عملاً از طریق این رفرنسها شما امکان اتصال به زیر مجموعه های Database رو دارید .
به کدهای زیر دقت کنید , من در این کدها قصد دارم که یک متغیر از نوع رکورد ست رو تعریف کنم منتها در اولی منظورم رکورد ستی از نوع DAO و در دومی رکورد ستی از نوع ADO هستش .
در این روش یک نوع معارفه غیر متعارف و غیر استاندارد رو استفاده میکنم .
Dim rstDAO_Sample As Recordset
Dim rstADO_Sample As Recordset
با این تعریف عملاً امکان دسترسی به زیر دستورهای ADO و DAO رو برای دو رکورد ست تعریف شده دارم .
مشکل چیه !؟
شاید مشکلی در ظاهر وجود نداشته باشه ولی متاسفانه حالا تقدم و تاخر رفرنسهای موجود در داخل لیست میتونه مساله ساز بشه .
Access در حالت استاندارد شروع میکنه به جستجو به دنبال دستور ( فقط نگیم تابع ) صادر شده , اون هم بر اساس نام دستور . به اولین رفرنسی که برسه و اون دستور در داخلش قرار داشته باشه اقدام به اجرای اون میکنه .
بعضی دستورات هستن که تشابه اسمی دارن ولی پارامترهایی مختلف و یا پیش نیازهایی متفاوت رو طلب میکنن . در این حالت متاسفانه Access با این روش تست و بازرسی ناقص خودش , منجر به بروز یک خطا میشه ( از نوع Run Time و یا logical )
ولی به دور از انصافه که تمام تقصیر رو به گردن Access بندازیم !
راه حل جلوگیری از این مشکل رو سعی میکنم در مبحث بعدی مورد نقد و بررسی قرار بدیم .
پس تا اون روز
خدا نگهدار