بازدید: ۵۴٢٨

برقراری ارتباط با ورودی یک کمبوباکس که در لیست قرار ندارد(آموزش پیشرفته اکسس)

بازگشت به صفحه اصلی آموزش پیشرفته اکسس

اصولا این حالت زمانی رخ می دهد که به جای انتخاب یک گزینه از فهرست کمبوباکس، کاربر بطور دستی در یک ورودی گزینه ای را تایپ می کند که جز گزینه های موجود در لیست نیست. این حالت با اجرای یک قسمت کوچک از کد VBA در هنگام رخداد رویداد NOT IN LIST کمبوباکس کار می کند. دستور مربوطه رکورد جدیدی را ایجاد می کند که حاوی ورودی کاربر در جدولی می باشد که فهرست کمبوباکس براساس آن است.

برای این منظور بهتر است به مثال کمبوباکس در فرم Products نگاهی بیاندازیم. در این مثال از کمبوباکس برای ورود اطلاعات فیلد Category رکورد Product استفاده می شود. منبع رکورد (Record Source) فرم tblProducts است. همچنین منبع سطر (Row Source) کمبوباکس tblCategory است.

 

برقراری ارتباط با ورودی یک کمبوباکس که در لیست قرار ندارد

شکل1: فرم Products به همراه یک کمبوباکس بر روی فیلد Category.

 

همانطور که در شکل 1 مشاهده می کنید، فیلد Category از یک کمبوباکس به همراه فهرستی از دسته بندی های موجود استفاده می کند. این دسته بندی ها در یک جدول جداگانه به نام tblCategory ذخیره می شوند که مقدار خصوصیت ROW SOURCE کمبوباکس است. همانطور که مشاهده می کنید، سه نوع دسته بندی وجود دارد(Office Equipment، Office Furniture و Stationery). حال اگر کاربر بخواهد رکورد محصول جدیدی را ایجاد کند چه اتفاقی می افتد؟(بعنوان مثال برای یک بسته نرم افزاری). هیچ دسته بندیی برای Software(نرم افزار) وجود ندارد، به همبن دلیل هنگامی که کاربر نام محصول را وارد می کند (مثلا Access 2010) ، نمی تواند دسته بندی مناسبی را از لیست موجود انتخاب کند.

اکنون زمان مناسبی برای بیان خصوصیت LIMIT TO LIST کمبوباکس است(این خصوصیت در برگه DATA صفحه خصوصیت ها قرار دارد). هنگامی که بر روی YES تنظیم شده باشد(همانند مثال ما)، معمولا اکسس پیغام خطایی به شرح زیر نمایش می دهد :

THE TEXT YOU ENTERED IS NOT AN ITEM IN THE LIST

سپس از کاربر می خواهد تا گزینه ای از بین گزینه های موجود انتخاب کند یا مطابق با یکی از گزینه های موجود متن خود را تایپ کند.

 

برقراری ارتباط با ورودی یک کمبوباکس که در لیست قرار ندارد

شکل2: پیغام پیش فرضی که در زمان نبود گزینه ای در لیست نمایش داده می شود.

 

اگرچه هنگامی که LIMIT TO LIST بر روی YES تنظیم می شود، اکسس ابتدا رویداد NOT IN LIST را اجرا می کند. اینکار باعث می شود تا پیغام استاندارد را به کمک کدنویسی با پیغام دلخواه ما جایگزین کند. در این کدنویسی این فرصت به کاربر داده می شود تا دسته بندی جدیدی را به جدولی که منبع سطر (Row Source) لیست کمبوباکس است، اضافه کند.

 

Private Sub ctlCategory_NotInList(NewData As String, Response As Integer)
On Error GoTo myError
    
    Dim rst As DAO.Recordset
        
    Set rst = CurrentDb.OpenRecordset("tblCategory", dbOpenDynaset)
    
        If vbYes = MsgBox("This Entry is not in list. Do you wish to add " _
                & NewData & " as a new category?", _
                vbYesNoCancel + vbDefaultButton2, _
                "New Category") Then
                
            rst.AddNew
                rst!categoryName = NewData
            rst.Update
            
            Response = acDataErrAdded
            
        Else
        
            Response = acDataErrContinue
            
        End If
       
leave:
 
    If Not rst Is Nothing Then
        rst.Close: Set rst = Nothing
    End If
    
    Exit Sub
    
myError:
   
    MsgBox "Error " & Err.Number & ": " & Error$
    Resume leave
    
End Sub

 

برای وارد کردن این دستور در ویرایشگر VB کافی است بر روی علامت سه نقطه که در سمت راست ON NOT IN LIST (در برگه EVENTS صفحه Property کمبوباکس) قرار دارد، کلیک کنید. سپس گزینه CODE BUILDER را از کادر مکالمه CHOOSE BUILDER انتخاب کنید.

 

برقراری ارتباط با ورودی یک کمبوباکس که در لیست قرار ندارد

شکل 3: برگه EVENTS مربوط به صفحه PROPERTY.

 

دستور فوق چه کاری انجام می دهد؟ خط اول دستور بطور خودکار زمانی توسط اکسس ایجاد می شود که ویرایشگر VBA از طریق خط  ON NOT IN LIST صفحه خصوصیت باز می شود. دو عدد آرگومان به نام های NewData و Response در بین یک جفت کروشه قرار دارند. اولین آرگومان حاوی مقدار دسته بندی جدیدی است که اخیرا توسط کاربر بعنوان یک متغیر رشته ای وارد شده است. آرگومان دوم به نحوه برخورد و مواجه اکسس با رویداد Not In List ارتباط دارد. مقدار پیش فرض آن صفر است که نشان دهنده اجرای روش استاندارد آن است به عبارتی دیگر پیغام خطا را نمایش داده و مانع افزودن داده های جدید توسط کاربر می شود.

خطوط سه و چهار دستور به متغیر شیء rst مربوط می شوند که نشان دهنده یک رکوردست DAO مبتنی بر tblCategory است که منبع سطر (ROW SOURCE) فهرست کمبوباکس ما است. در ابتدا متغیر شیء  rst ، در دستور Dim تعریف می شود سپس با استفاده از متد openrecordset شی database در tblCaegory قرار داده می شود.

خط پنجم دستورات فوق، به پیغام دلخواهی مربوط می شود که در زمانی که کاربر گزینه ای را وارد می کند و در لیست نیست نمایش داده می شود. تابع msgbox پیغامهای ما را نمایش می دهد همچنین با استفاده از آن تابع می توانید مشخص می کند که چه دکمه هایی ارائه می شوند، چه دکمه هایی پیش فرض هستند و نیز عنوان آنها چه باشد. حال اگر کاربر بر روی Yes کلیک کند دستور فوق به دستور زیر تقسیم می شود که در آن حالت یک رکورد دسته بندی جدید نیز اضافه می شود.

این رکورد دسته بندی جدید با استفاده از متد addNew از شیء Recordset اضافه می شود. سپس فیلد CategoryName بر روی مقدار متغیر NewData تنظیم می شود(به عبارتی دیگر مقدار دسته بندی جدیدی که توسط کاربر وارد شده و توسط اکسس بعنوان یک پارامتر در sub قرار داده می شود). سپس رکورد جدید با استفاده از متد Update شی Recordset در tblCategory ذخیره می شود.

خط بعدی دستور، مقدار نگه داشته شده در متغیر response را از طریق ثابت acDataErrAdded تغییر می دهد ( که توسط اکسس بصورت پارامتری در خط اول sub قرار داده شده است). انجام اینکار به اکسس می گوید که داده های جدید می تواند به فهرست کمبوباکس اضافه شوند و پیغام خطای پیش فرض Not In List نمایش داده نشود. همچنین از فهرست کمبوباکس یک فرم پرس و جوی جدد می سازد تا داده های جدید به سرعت نمایش داده شوند.

اگر کاربر بر روی دکمه دستوری CANCEL یا NO که در بالا ذکر شد کلیک کند برنامه به قسمت دستور Else ارجاع داده می شود که در آن به اجرای خط دستور برنامه ادامه می دهد تا مقدار نگه داشته شده در متغیر Response را از طریق ثابت ACDataErrContinue تغییر دهد. اینکار باعث می شود تا اکسس داده های جدیدی را به فهرست کمبوباکس اضافه نکند ولی بدون نمایش پیغام پیش فرض Not In List به کار خود ادامه دهد.

بعد از دستور End If، اجرای برنامه یکبار دیگر انجام می شود. آخرین قسمت از دستور (قبل از قسمت مربوط به خطای برنامه) مربوط به بستن شی رکورد ست  rst است که مقدار آن را مجددا بر روی  nothing تنظیم می کند. سپس اجرای برنامه با استفاده از دستور Exit Sub به اتمام می رسد.  

بازگشت به صفحه اصلی آموزش پیشرفته اکسس

طراحی سایت و سئو توسط ضابط