کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی
کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی

تغییر پراپرتی DisplayControl ( نمایش کنترل ) فیلدی از جدول مشخص شده




CurrentDb.TableDefs("Cost Down TableX9").Fields("Select").Properties("DisplayControl") = acCheckBox



در کد بالا به زبان ساده آدرس نویسی شده از کالکشن و متد و پراپرتی استفاده شده و مشخص کرده که پراپرتی DisplayControl فیلد Select در جدول TableX9 را از نوع CheckBox قرار بده



دوستان عزیز لطفا نظر سنجی فراموش نشود.




ایجاد پراپرتی در جدول



TableDefs.CreatePropert Methods


CreateProperty(NameTypeValueDDL)



دوستان عزیز لطفا اگر مطلبی کمکتون میکنه یا براتون مفیده لطفا لایک و نظر بدهید در نظرسنجی هم شرکت کنید.


مثال زیر ماژولی است که می توانید در استاندارد ماژول برنامتون اضافه کنید البته اگر بار دوم اجرا بشود چون ساخته شده ارور ران می شود ( اجرا ). یک فیلد از نوع Yes/No ایجاد میکند و خاصیت نمایش کنترل را بصورت چک باکس تنظیم میکند.برای انجام و ایجاد باید دیتابیس را به دیتابیس جاری تنظیم نمایید با 

Set dbs=CurrentDb 

اگر دیتا بیس دیگری باشد باید از OpenDataBase استفاده بنمائید.سپس جدول دیتابیس جاری را به tdf تنظیم کرده و در آخر ایجاد فیلدبا نامی که پارامتر دوم  فانکشن یعنی StrFieldName مشخص کرده.بعد از ایجاد کردن فیلد مورد نظرتون پراپرتی فیلد را تنظیم نموده 




Public Sub CreateYesNoField(strTableName As String, _
	strFieldName As String)

    Dim dbs As DAO.Database
    Dim tdf As DAO.TableDef
    Dim fld As DAO.Field
    Dim prop As DAO.Property
  Set dbs = CurrentDb
(Set tdf= dbs.TableDefs(strTableName
Set fld = tdf.CreateField(strFieldName,dbBoolean
ساختن و اضافه کردن فیلد :
tdf.Fields.Append fld
Set prop=dbs.CreateProperty("DisplayControl
	dbInteger, acCheckBox)

    
اضاف کردن پراپرتی به مجموعه پراپرتی های شی :
    fld.Properties.Append prop
پاک کردن از حافظه موقت :
Set prop = Nothing Set fld = Nothing Set tdf = Nothing Set dbs = Nothing End Sub






تغییر کپشن یک فیلد از یک جدول



تغییر پراپرتی کپشن یک فیلد از جدول مشخص شده با استفاده از کالکشن TableDefs ، حدس بزنید و زیر این یادداشت نظر بدهید

 

TableDefs collection contains all stored TableDef objects in a database (Microsoft Access workspaces only)


مجموعه TableDefs حاوی تمام اشیا TableDef ذخیره شده در یک دیتا بیس است.


اگر فیلد مورد نظر پراپرتی کپشن نداشته باشد اکسس اروری را ران می کند و چنانچه این قابلیت اضافه شدن را داشته باشد با CreateProperty میشود این خاصیت را به آن فیلد اضافه کرد مثلا فیلد تاریخ کپشن نمی تواند داشته باشد پس سعی در اضافه کردن نداشته باشید

ذخیره در اکسس


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



اگر این عمل چیزی نیست که شما دنبالش هستید.پیشنهاد میکنم از حالت اتصال به فرم خارج کنید و خاصیت رکورد سورس را Blank بگذارید ( اگر در رکورد سورس چیزی هست پاک کنید ) سپس از کنترل هایی که با Tools می سازید استفاده کنید ( منظور از فیلدهای جدول یا منبع فرم استفاده نکنید ) و بالطبع باید برنامه نویسی برای اضافه کردن به جدول یا ویرایش یا حتی حذف آنها بکار ببرید.


انتخاب دیگر که تمایل به انجامش را داشته باشید این است که از رویداد BeforeUpdate فرم برای اینکه از کاربران بپرسند آیا میخواهند تغییرات ذخیره شود استفاده کنید


اگر نگرانی اصلی شما اضافه شدن بطور ناگهانی رکوردهای جدید است خاصیت Allow Addition را به false تنظیم کنید و رکورد جدید را بصورت برنامه نویسی شده ایجاد نمائید.


در زیر کدی نوشته شده که در سینگل فرم از کاربر می پرسد که میخواهد رکورد حاضر را ذخیره کند یا خیر اگر خیر باشد پارامتر کنسل True می شود و در نتیجه تا زمانیکه Escape را نزنید از رکورد خارج نمیشود امتحان  بنمائید !

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim intAns As Integer
intAns = MsgBox("Are you sure you want to save this record?", vbQuestion + vbYesNo, "Save Record")
If intAns = vbNo Then Cancel = 1
End Sub











آبجکت فرم



Form object is a member of the Forms collection, which is a collection of all currently open forms. Within the Forms collection, individual forms are indexed beginning with zero. You can refer to an individual Form object in the Forms collection either by referring to the form by name, or by referring to its index within the collection.

شی form عضوی از کالکشن یا مجموعه forms است که محل جمع آوری تمام فرم هایی است که بازشده اند ، داخل این مجموعه forms فرم های تکی وجود دارند که ایندکس گذاری شده اند و با صفر شروع می شوند.شی فرم تکی در مجموعه forms یا با ارجاع به فرم از طریق اسم یا ایندکسشون انجام می پذیرد.

If you want to refer to a specific form in the Forms collection, it's better to refer to the form by name because a form's collection index may change. If the form name includes a space, the name must be surrounded by brackets ([ ]).

نکته خیلی مهم :

اگر می خواهید به فرم خاصی در مجموعه forms ارجاع بدهید بهتر است توسط نامش باشد چرا که ایندکس آن می تواند تغییر پیدا کند.اگر اسم فرم شامل Space باشد ( فضای خالی بین اسم باشد ) اسم فرم می بایست توسط براکت احاطه شده باشد.

Each Form object has a Controls collection, which contains all controls on the form. You can refer to a control on a form either by implicitly or explicitly referring to the Controls collection. Your code will be faster if you refer to the Controls collection implicitly.

هر شی آبجکت یک مجموعه کنترل هایی دارد که محتوی تمام کنترل ها در فرم است. شما می توانید به یک کنترل در فرم یا بطور ضمنی یا صریح ارجاع بدهید.کد شما سریعتر عمل خواهد کرد اگر بصورت ضمنی به مجموعه کنترل ها ارجاع دهید.


Forms!OrderForm.ctlSubForm.Form!Controls.NewData

فرم Order که سابفرم ctlSubform دارد و کنترل NewData در آن است که به این کنترل ارجاع داده شده.


AllForms!formnameAllForms!OrderForm
AllForms![form name]AllForms![Order Form]
AllForms("formname")AllForms("OrderForm")
AllForms(index)AllForms(0)


تشریح یکی از خاصیت های مربوطه ( RecordSoutce ) : 


The next example changes a form's record source to a single record in the Customers table, depending on the company name selected in the cmboCompanyName combo box control. The combo box is filled by an SQL statement that returns the customer ID (in the bound column) and the company name. The CustomerID has a Text data type.

مثال پائین منبع رکورد فرم  در جدول Custom را  به رکورد منفرد تغییر میدهد طبق نام شرکت که در کنترل کمبو باکس cmbocompanyname انتخاب شود.کنترل کمبو توسط زبان اس کیو ال پر شده و آیدی مشتری  نام شرکت را بر می گرداند.دیتا تایپ آیدی مشتری از نوع تکست است.


Sub cmboCompanyName_AfterUpdate()

Dim strNewRecord As String 

strNewRecord = "SELECT * FROM Customer  Where   CustomerID='" & Me!cmboCompanyName.Value & "'" 

 Me.RecordSource = strNewRecord 

End Sub







AllForms.Item property


خاصیت آیتم از آبجکت AllForms در اکسس : 


The Item property returns a specific member of a collection either by position or by index. Read-only AccessObject.




فوکس به کنترل یا سابفرم



You can use the SetFocus method to move the focus to a subform, which is a type of control. You can also move the focus to a control on a subform by using the SetFocus method twice, moving the focus first to the subform and then to the  control on the subform.



شما می توانید برای انتقال فوکس به سابفرم که نوعی از کنترل  هست از روش SetFocus استفاده نمائید همچنین می توانید فوکس را به یک کنترل در سابفرم با بکارگیری دوبار از این متد ببرید. انتقال فوکس اول به سابفرم و سپس به کنترل موجود در آن.



سوالات


فراگیران عزیز سوالات در زمینه  اکسس را در نظرات همین یادداشت بنویسید تا سایر دوستان نیز در جوابگویی کمک کنند  و خواهشا در نظر سنجی نیز شرکت بفرمائید.



سوال اکسسی



دوستان اکسسی یک  کوئری ( یا پرس و جو از جدولی ) را طبق درخواست (  در ادامه ) بنویسید و در نظرات این یادداشت قید کنید که جمع گروه خاصی رو پشت سرهم نمایش بدهد ،  فرضا در جدول  سه رکورد A  می سازید با قیمت های ۱۲۰۰۰   ۱۸۰۰۰ ۲۳۰۰۰ و چهار رکورد B با قیمت های ۸۰۰۰  ۴۵۰۰  ۱۴۳۰۰ ۸۷۰۰ ... کوئری باید طوری نوشته شود که جمع فعلی را با قبلی زده و مانند ذیل بشود.


A  12000

A  12000+18000

A  12000+18000+23000

B  8000

B  8000+4500

B  8000+4500+14300

B  8000+4500+14300+8700


از ساب کوئری استفاده کنید وکد را در نظرات بنویسید تا دیگران هم طریقه استفاده از SubQuery را فرابگیرند ... اجرکم عندا...



ShellAndWait



ا ول باز کردن فرآیند

دوم اجرای اپلیکیشن

سوم منتظر برای اعلام اتمام فرآیند

چهارم بستن پنجره


Option Compare Database
Option Explicit

Public Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, _
ByVal dwProcessId As Long) As Long
ByVal bInheritHandle As Long, _

(ByVal hProcess As Long, lpExitCode As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32" _

Public Const PROCESS_QUERY_INFORMATION = &H400
Public Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
Dim hProcess As Long
Public Const STATUS_PENDING = &H103&

Public Function checkShell(Optional procID As Long)

Dim processID As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, processID)
Dim exitCode As Long

'processID = procID
processID = Shell("c:\windows\notepad.exe")

Do
MsgBox "The shelled process " & processID & " has ended."
Call GetExitCodeProcess(hProcess, exitCode)
DoEvents
Call CloseHandle(hProcess)
Loop While exitCode = STATUS_PENDING
End Function





ShellExecuteInfo


Once your application has located a file object, the next step is often to act on it in some way. For instance, your application might want to launch another application that allows the user to modify a data file. If the file of interest is an executable, your application might want to simply launch it


اقدام بعدی بعد از قرار گرفتن فایل اغلب برای عمل کردن روی آن است مثلا اپلیکیشن شما می تواند درخواست لانچ یا پرتاب کردن اپلیکیشن دیگری را داده و به کاربر اجازه اصلاح داده های آن سند که در اپلیکیشنش باز شده را بدهد ( Word یک اپلیکیشن است و سند آن با پسوند Doc و Docx در آن باز میشود جهت ویرایش یا اضافه کردن ) . اگر فایل مورد نظر شما اجرایی باشد اپلیکیش شما به راحتی آنرا پرتاب میکند ( باز  )









ShellExecuteA


عملی را روی فایل خاصی انجام میدهد.


مثل Edit ، Open یا Explore ، Print  و جنس آن از نوع String است.


طبق روش زیر برای ویندوز ۶۴ بیت قبل از فانکشن PtrSafe قرار گرفته بغیر از hWnd که نمایانگر پنجره است و nShowCmd که نمایانگر نمایش پنجره در وضعیت هایی است و از نوع عددی ( Long ) هستند بقیه پارامترها از نوع String می باشند.


#If VBA7 Then
    Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If



lpFile specifies a document file, lpParameters should be NULL.


اگر lpFile سندی را مشخص کند lpParameters نمی تواند Null باشد.


The flags that specify how an application is to be displayed when it is opened. If lpFile specifies a document file,


nShow مشخص میکند چگونه یک اپلیکیشن زمانیکه باز میشود نمایش داده شود اگر lpFile یک فایلی مثل Word را مشخص نماید.


If the function succeeds, it returns a value greater than 32. If the function fails, it returns an error value that indicates the cause of the failure. 


اگر تابع درست انجام شود یک مقداری بزرگتر از ۳۲ را برمی گرداند می توانید با Msgbox در اکسس ببینید و اگر Fail دهد یا درست انجام نشود مقداری که علت انجام نشدنش باشد را نشان می دهد فرضا اگر دسترسی به فایل نداشته باشیم.


Example:
FileName = "C:\Documents and Settings\All Users\Start Menu\Programs\Microsoft Office\Microsoft Office Word 2003.lnk"

iRet = ShellExecute(GetDesktopWindow, "open", FileName, vbNullString, vbNullString, vbNormalFocus)
If lRet = 5 Then
    MsgBox "Access Denied" & vbCrLf & "Try pointing directely to the program EXE", , ""
End If



مثال بالا که از سایت گرفته شده نمایانگر این است که اگر دسترسی به فایلی امکانپذیر نبود بعلت محدودیت از طرف ادمین جعبه پیامی را باز کرده و به شما اعلام می نماید. ( GetDeskTopWindow یک هندل است که می بایست تابع آنرا در Module اضافه کنید در اینترنت تابع مورد نظر موجود است حتما از CloseHandle استفاده کنید.


ConstantValueDescription
vbHide0Window is hidden and focus is passed to the hidden window.
vbNormalFocus1Window has focus and is restored to its original size and position.
vbMinimizedFocus2Window is displayed as an icon with focus.
vbMaximizedFocus3Window is maximized with focus.
vbNormalNoFocus4Window is restored to its most recent size and position. The currently active window remains active.
vbMinimizedNoFocus6Window is displayed as an icon. The currently active window remains active.