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

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

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

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

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

تابع FreeFile در دستور Open



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


FreeFile [ (rangenumber) ]

آرگومان اختیاری rangenumber متغیری است که محدوده از جائیکه شماره فایل آزادبعدی بازگشت داده می شود را مشخص می نماید. 0 را ( پیش فرض ) برای بازگشت شماره فایل در محدوده 1 و 255 ، 1را برای بازگشت شماره فایل در محدوده 256 و 511 مشخص کنید.

 اجازه می دهد سیستم شماره ای برای فایل بعدی که باز میشود را رزرو نماید.( تحت Vba )


کد زیر در پنج فایل تکست لوپ میزند و  رشته ی This is a sample را در هر کدام از آنها می نویسد.

Dim MyIndex, FileNumber
For MyIndex = 1 To 5 ' Loop 5 times.
FileNumber = FreeFile ' Get unused file' number.
Open "TEST" & MyIndex For Output As #FileNumber ' Create file name.
Write #FileNumber, "This is a sample." ' Output text.
Close #FileNumber ' Close file.
Next MyIndex



Hook و UnHook کردن پنجره برای مدیریت پیام های ویندوزی



Hook نقطه ای در مکانیزم مدیریت پیام سیستم است که در آن یک برنامه می تواند یک برنامه فرعی برای نظارت بر رفت و آمد پیام  در سیستم نصب کند و انواع خاصی از پیام ها را قبل از رسیدن به رویه ( Procedure )پنجره هدف پردازش نماید.



1- استفاده از تابع SetWindowsHookExA برای ویندوز 64 بیتی یا Vba7 این تابع 3 آرگومان دارد اولی یه ثابت است مثل WH_CBT=5 ( نصب یک رویه زنجیری که اعلان ها را دریافت می نماید CBTProc ) یا WH_MOUSE=7  ( نصب یک رویه که پیام های Mouse را مانیتور می کند MouseProc) دومین آرگومان یک تابع CallBack است وبا AddressOf  و نام تابع مشخص میگردد ، سومی hmod که Null است و چهارمین آرگومان شناسه یک Thread است که تابع GetCurrentThreadId  را در آن قرار می دهیم.( شناسه ی Thread یا رشته ای که با یک رویه Hook قرار است در ارتباط باشد.برای اپلیکیشن های دسکتاپ اگر این پارامتر صفر باشد رویه هوک مرتبط میشود با تمام Thread های در حال اجرا در دسکتاپ مشابه در زمان فراخوانی Thread )


2-درآمدن از زنجیره ی هوک با تابع UnHookWindowsHookEx که حتما باید انجام گیرد.


دقیقا توابع ویندوزی ( نوشتاری ) به حروف کوچک و بزرگ حساسند یا باید در کتابخانه مذکور موجود باشند.فرضا kernel32 باشد ولی user32 نوشته شود.اینها همه باعث خطا می شود.



Function HookWnd()

hhk=SetWindowsHookExA(WH_CBT,AddressOf CBTProc,0&,GetCurrentThreadId)

End Sub


Function CBTProc(Byval Msg As Long,Byval wParam As LongPtr,Byval lParam As LongPtr) As LongPtr

if Msg=5

'SetDlgItemTextASets the title or text of a control in a dialog box.

UnHookWindowsHookEx hhk

End if

CBTProc=False

End Function


CallNextHookEx :

Passes the hook information to the next hook procedure in the current hook chain. A hook procedure can call this function either before or after processing the hook information.


LRESULT CallNextHookEx( [in, optional] HHOOK hhk, [in] int nCode, [in] WPARAM wParam, [in] LPARAM lParam );


Calling CallNextHookEx is optional, but it is highly recommended; otherwise, other applications that have installed hooks will not receive hook notifications and may behave incorrectly as a result. You should call CallNextHookEx unless you absolutely need to prevent the notification from being seen by other applications.


فراخوانی CallNextHookEx انتخابی است اما به شدت توصیه میشود ، در غیر اینصورت سایر برنامه هایی که hook یا قلاب ها را نصب کرده اند ( رویه های فرعی ) اعلان های hook را دریافت نخواهند کرد و ممکن است نتیجه نادرستی داشته باشند.بایستی این تابع فراخوانی شود ، مگر اینکه کاملا لازم باشد از مشاهده اعلان توسط سایر برنامه ها جلوگیری کنید.


'تغییر ویژگی پنجره مشخص شده 

LONG_PTR SetWindowLongPtrA( [in] HWND hWnd, [in] int nIndex, [in] LONG_PTR dwNewLong );

'SubClass Window

Public PreWnd As LongPtr

Public IsSubclassed As Boolean


Function SubClassWnd()

PrevWnd=SetWindowLongPtrA (hWnd,GWLP_WNDPROC,AddressOf WNDProc)

End Function


Function UnSubClassWnd()

if Not IsSubClassed Then 

SetWindowLongPtrA (hWnd,GWLP_WNDPROC,PrevWnd)

IsSubClassed=True

Me.Caption=SubClassed

Else

IsSubClassed=False

End If 

End Function


گرفتن نام کلاس پنجره با تابع زیر 

نام کلاس  جعبه پیام ویندوزی  32770# است

int GetClassNameA( [in] HWND hWnd, [out] LPSTR lpClassName, [in] int nMaxCount );

lpClassName:

variable  Buffer=String(35,vbNullChar)

nMaxCount:

Len(Buffer)

lRet=GetClassNameA(hWnd,Buffer,Len(Buffer)

If the function succeeds, the return value is the number of characters copied to the buffer, not including the terminating null character.

اگر تابع موفق عمل کند ، مقدار برگشتی ( integer : عدد صحیح ) عددی از کاراکترهای کپی شده به بافر است .بخاطر همین در بالا کاراکترهای خالی در حافظه موقت ایجاد شد

Char=Left(Buffer,lRet)


ارسال پیام به کنترل دیالوگ باکس :


SendDlgItemMessageA( [in] HWND hDlg, [in] int nIDDlgItem, [in] UINT Msg, [in] WPARAM wParam, [in] LPARAM lParam


HANDLE LoadImageA( [in, optional] HINSTANCE hInst, [in] LPCSTR name, [in] UINT type, [in] int cx, [in] int cy, [in] UINT fuLoad

fuLoad:LR_LOADFROMFILE=&H10


BM_SETIMAGE : &HF7 : 15×16+7=247

یک تصویر جدید ( icon یا bitmap ) را با باتن مرتبط می کند

wParam : IMAGE_BITMAP Or IMAGE_ICON

lParam : hBitmap Or hLoadImage Or HICON

h:Handle To



HICON LoadIconA( [in, optional] HINSTANCE hInstance, [in] LPCSTR lpIconName );


IDI_APPLICATION=32512
IDI_HAND=32513
IDI_QUESTION=32514
IDI_ASTERISK=32516


LoadIconA 0&,IDI_APPLICATION




USER32
Programs call functions from Windows USER to perform operations such as creating and managing windows, receiving window messages (which are mostly user input such as mouse and keyboard events, but also notifications from the operating system), displaying text in a window, and displaying message boxes.



برنامه ها توابع را از Windowse User برای اجرای عملیاتی مثل ایجاد یا مدیریت پنجره ها ، دریافت پیام های پنجره ( که کاربر وارد می کند مثل رویدادهای کیبورد و ماوس ، اما همچنین اعلان هایی از سیستم عملیاتی ) ، مشاهده متن در یک پنجره و مشاهده جعبه های پیام فراخوانی می نمایند.



UINT_PTR SetTimer( [in, optional] HWND hWnd, [in] UINT_PTR nIDEvent, [in] UINT uElapse, [in, optional] TIMERPROC lpTimerFunc );


BOOL KillTimer( [in, optional] HWND hWnd, [in] UINT_PTR uIDEvent );


'no timer callback
Private IDT_TIMER1 As Long
Private IDT_TIMER2 As Long

Sub StopClock()
 
    KillTimer 0, lTimerID
    lTimerID = 0
 
End Sub
 

SetTimer hwnd,IDT_TIMER1,10000,NULL
SetTimer hwnd,IDT_TIMER2,300000,NULL


Select Case Msg

'DECIMAL :1×16^(2)+1×16^(1)+3×16^(0)=275

'HEXADECIMAL : &H113

case WM_TIMER  '&H113
     Select Case wParam
         case IDT_TIMER1
            'process the 10-second timer
            'return 0
        case IDT_TIMER2
           'process the five-minute timer
           'return 0
End Select
End Select


















تابع ویندوزی Mouse_Event برای Right Click در صفحه


Right-Click  در سنتر : 


right-click the "center" of your webbrowser 


mouse_event


void mouse_event( [in] DWORD dwFlags, [in] DWORD dx, [in] DWORD dy, [in] DWORD dwData, [in] ULONG_PTR dwExtraInfo );


dwFlags : 

MOUSEEVENTF_RIGHTDOWN=&H8

MOUSEEVENTF_RIGHTUP=&H10


تنظیم موقعیت کرسر در وسط صفحه : 


SetCursorPos(CInt(WebBrowser1.Width / 2), CInt(WebBrowser1.Height / 2))

انجام کلیک راست در مختصات x و y

mouse_event(MOUSEEVENTF_RIGHTDOWN, CInt(WebBrowser1.Width / 2), CInt(WebBrowser1.Height / 2), 0, 0)

mouse_event(MOUSEEVENTF_RIGHTUP, CInt(WebBrowser1.Width / 2), CInt(WebBrowser1.Height / 2), 0, 0)



SendInput Function  :  "User32.Dll"



Private Declare PtrSafe Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As
LongPtr)
Private Declare PtrSafe Function SendInput Lib "user32" (ByVal nInputs As LongPtr, pInputs As Any, ByVal cbSize As LongPtr) As LongPtr




UINT SendInput(
[in] UINT cInputs,
[in] int cbSize
[in] LPINPUT pInputs,


mouseinput


typedef struct tagMOUSEINPUT {
  LONG      dx;
  LONG      dy;
  DWORD     mouseData;
  DWORD     dwFlags;
  DWORD     time;
  ULONG_PTR dwExtraInfo;
} MOUSEINPUT, *PMOUSEINPUT, *LPMOUSEINPUT;


If dwFlags contains MOUSEEVENTF_WHEEL, then mouseData specifies the amount of wheel movement. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is defined as WHEEL_DELTA, which is 120.


اگر Flag حاوی MOUSEEVENTF_WHEEL باشد ، mouseData مقدار جابجایی غلطک را مشخص می نماید. مقدار مثبت نمایانگر چرخیدن یا رولیدن به سمت جلو است و مقدار منفی برگشت به عقب . 



Type pt As POINTAPI

X As Long

Y As Long

End Type



Type MOUSEINPUT

X As Long

Y As Long

MouseData As Long

dwFlags  As Long

dwExtractInfo As LongLong

End Type


Type  inputt As INPUT

type As Long

cc(0 to 20) As Byte

'mi As MOUSEINPUT

'ki As KEYBOARDINPUT

End Type


Type : INPUT_MOUSE=0 

Type : INPUT_KEYBOARD=1

















Open StateMent



Maybe Comm=FreeFile Used


Open "COMFILE" For Binary Access Read Write As #1 
receiveBuff="@@@@@@@@@@"

Sleep 100
Debug.Print "Looking For incoming Msg"
On Error Resume Next
Do While True
receive = receiveBuff
Input #1, receive
If receive= receiveBuff Then Exit Do 
Debug.Print receive
Loop 
On Error GoTo 0
Debug.Print "Looking again...."
On Error Resume Next 
Do While True 
receive= receiveBuff
Input #1, receive
If receive= receiveBuff Then Exit Do 
Debug.Print receive
Loop
On Error GoTo 0
Debug.Print "Finished...Close ComFile"
 Close #1






پیمایش با غلطک ماوس در رکوردهای فرم





Occurs when the user rolls the mouse wheel in Form view, Split Form view, Datasheet view, Layout view, PivotChart view, or PivotTable view.

زمانی اتفاق می افتد که کاربر غلطک ماوس را می گرداند در حالت نمایش فرم هایی که قید کرده. 

Syntax  (  نوشتاری ) 

expression.MouseWheel (PageCount)




برای پیمایش در رکوردها در فرم با غلطک ماوس از  پارامتر Count این رویداد و اکشن  GotoRecord استفاده کنید برای تحت فشار قراردادن کاربر برای ذخیره کردن دیتا قبل از پیمایش از  not Me.Dirty استفاده کنید.


پارامتر Count شماره لیست های که در Scroll view می بینید ( یعنی  200 رکورد در فرم کانتینیوس دارید ولی هر بار که غلطک را می گردانید آن تعداد که قابل view ی شما است را برمی گرداند فرضا شما در کنترل Scroll بعد از رولیدن یا چرخاندن 20 رکورد می بینید Count را 20 به شما می دهد و پارامتر Page هم Page Number ).


استفاده از پارامتر Count و اکشن GotoRecord


If (Count < 0) And (Me.CurrentRecord > 1) Then
DoCmd.GoToRecord , , acPrevious
End If

استفاده از پارامتر Page :  مثال زیر چنانچه به Page بعد انتقال پیدا کردید پیامی را در مسیج باکس نمایش می دهد

Private Sub Form_MouseWheel( _ ByVal Page As Boolean, ByVal Count As Long)
If Page = True Then MsgBox "You've moved to another page."
End If
End Sub



برای جلوگیری  از پیمایش در رکوردها در فرم توسط MouseWheel :  ( یک Dll است که با Vb6 نوشته شده و یا حتی نسخ بالاتر ، یک کلاس ماژول و یک استاندارد ماژول دارد که با WithEvents دسترسی به Event آبجکت فراهم می شود..... Hook کردن پنجره فرم و ارسال پیام ویندوزی WM_MOUSEWHEEL برای کنسل کردن پیمایش یا رولیدن.




تمام  موارد گفته شده در داکیومنت آفیس وجود دارد و بر گرفته از آنجاست  ، غیر از Hook کردن پنجره برای ارسال پیام ها به Parent آنها که مایکروسافت آفیس این کار را هرگز توصیه نکرده و نخواهد کرد شما هم سعی در انجام اینکار بعلت Conflict ها و از بین بردن دیتابیستون نداشته باشید.




لطفا در نظر سنجی شرکت کنید









نوشتن کلاس ماژول و استاندارد ماژول در اکسس


Class Module Name : clsmMouseWheel


Private frm As Object

Private intCancel As Integer


Public Event MouseWheel(Cancel As Integer)

' Because Form is object use set

Public Property Set Form(frmm As Object)

Set frm=frmm

End Property


Public Property Get MouseWheelCancel() As Integer

MouseWheelCancel=intCancel

End Property


Public Sub RaiseMouseWheel()

RaiseEvent MouseWheel(intCancel)

End Sub


در استاندارد ماژول ، متغیری به صورت Public تعریف می شود که در تمام رویه ها بتوان استفاده کرد حتی در سایر استاندارد ماژول ها ( یعنی در تمام رویدادهای فرم و گزارش می توان از این متغیر استفاده کرد حتی  در کنترل تکست باکس یا قسمت تکست باکس کنترل کمبو باکس مثل ایجاد TempVars .... و این متغیر به کلاس ماژول ساخته شده متصل می شود.نام استاندارد ماژول را MouseWheel می نامیم



Public cMouse As clsmMouseWheel



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


Private WithEvents clsMouseWheel As MouseWheel.clsmMouseWheel


باید متغیر های WithEvents را بعنوان متغیرهای آبجکت اعلام کنید تا بتوانند نمونه های کلاس را پذیرش کنند . با این حال نمی توان آنها را بعنوان Object اعلام کرد . باید آنها را به عنوان کلاس خاصی که می تواند رویدادها را مطرح کند ، اظهار نمائید.


شئ هایی که از روی کلاس ساخته می‌شوند را یک نمونه (Instance) از آن کلاس می‌نامند.


WithEvents مشخص میکند که یک یا چند متغیر عضو اعلام شده به نمونه ای از یک کلاس اشاره می کند که می تواند رویدادها را افزایش دهد.


فرضا می خواهید رویدادهایی ( رویدادها را می دانید ) که برای کنترل webbrowser وجود دارد را اجرا کنید با WithEvents  متغیری را تعریف می کنید که به آن کلاس ماژول متصل شود و بعد یک رویه می نویسید.


در رویداد لود فرم باید متغیر تعریف شده بالا را به کلاس ماژول نوشته شده تنظیم کرد 

Set clsMouseWheel=New MouseWheel.clsmMouseWheel

Set clsMouseWheel.Form=Me

در اینجا می توان تابعی که در استاندارد ماژول تعریف کردید را اجرا کنید مثل 

clsMouseWheel.SubMsgForm

در رویداد کلوز فرم : 

فرضا اجرای تابعی از استاندارد ماژول مثلا برای قطع زنجیره ارتباطی

Set clsMouseWheel.Form=nothing

Set clsMouseWheel=Nothing


Private Sub clsMouseWheel_MouseWheel(Cancel As Integer)

Msgbox " Hello"

Cancel=True

End Sub










hook کردن یا به زنجیر کشیدن پنجره برای ارسال پیام های ویندوزی 



برای hook کردن پنجره از تابع SetWindowLongPtrA استفاده کنید


HookForm :

SetWindowLongPtrA

oldWndProc

frm.hwnd  GWL_WNDPROC AddressOf WndProc

Set Mouse=Me


برای قطع اتصال به پنجره باید Unhook کرد با استفاده از همان تابع  ( البته از توابع SetWindowsHookA برای تنظیم این زنجیره و قطع آن با UnHookWindowsHookEx استفاده می کنند.) که در پارامتر lparam تابع oldWndProc جایگزین می شود.


تابعی هم برای پارامتر دوم تابع SetWindowLongPtrA  می نویسید که اینجا wndProc نامیده شده یا می توانید نام آنرا WindowsHook بگذارید . که شامل چهار آرگومان hwnd Msg wParam lParam است.اولی هندل پنجره را مشخص میکند که دیتاتایپ آن در ویندوز 64 بیت LongPtr است 


Public Function WndHookProc(ByVal hWnd As LongPtr,ByVal wParam As LongPtr,ByVal lParam As LongPtr) As Long

Select Case Msg

           Case WM_MOUSEWHEEL

WndHookProc=CallWindowProc(oldWndProc,hWnd,Msg,wParam,lParam)

         Case Else

WndHookProc=CallWindowProc(oldWndProc,hWnd,Msg,wParam,lParam)

End Select

End Function





MouseWheel ( Page , Count )        در اکسس

 





جستجوی فایل با تابع ویندوزی SearchTreeForFile

 


Dll : Dbghelp


BOOL IMAGEAPI SearchTreeForFile( [in] PCSTR RootPath, [in] PCSTR InputPathName, [out] PSTR OutputPathBuffer );


جواب  تابع اگر Fail ندهد True است  به Bool که در اول آمده دقت کنید ( Boolean ) دیتا تایپ تمام آرگومان ها از نوع رشته ای است.



این تابع فایلی را که توسط پارامتر InputPathName مشخص شده است ، از مسیرمشخص شده در پارامتر RootPath جستجو میکند.حداکثر عمق مسیری که در RootPath مجاز است 32 فهرست است. هنگامی که تابع فایل را در شاخه دایرکتوری پیدا می کند ، مسیر کامل فایل را در بافر مشخص شده توسط پارامتر OutputPathBuffer قرار می دهد.


RootPath="C:"

InputPatName="txt1.txt"

OutputPathBuffer=Buffer


VbNullChar را می توانید در متغیر تعریف شده  با نام Buffer از نوع رشته ای با تابع String پر کنید. (  OutputPathBuffer یک نشانگر است به Buffer )


بعد برای گرفتن مقدار نوشته شده در متغیر Buffer با تابع یاد شده ،  از توابع Instr ( برای یافتن تعداد کارکتر نوشته شده در بافر که در پشت اولین NullChar است ) و Left ( برای گرفتن کاراکتر از سمت چپ با طول مشخص ( با  instr ) ) استفاده بنمائید.




لطفا نظرسنجی فراموش نشود











گرفتن هندل Webbrowser



Public Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" ( _ ByVal hwnd As LongPtr, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long


Public Declare PtrSafe Function EnumChildWindows Lib "user32" ( _ ByVal hWndParent As LongPtr, _ ByVal lpEnumFunc As LongPtr, _ ByVal lParam As LongPtr) As Long



برای گرفتن نام کلاس زیر پنجره ها یا Child Window که درون Parent Window هستند از تابع GetClassNameA استفاده می شود ( فرضا در پنجره ویندوزی  32770# باتن ها یک Child Window هستند ) در ویدوز 64 بیت یک ptrsafe قبل از عبارت Function نیاز است و دقیقا نام تابع به حروف کوچک و بزرگ حساس هستند یعنی اگر بنویسید getClassNameA با خطا مواجه خواهید شد. 


در تابع ویندوزی زیر hWnd میشود Form.hWnd که خوشبختانه اکسس این پراپرتی رو تعبیه کرده و WNDENUMPROC هم بدین شکل اعلام میشود AddressOf CallBackEnumWindowsProc.


BOOL  EnumChildWindows( [in, optional] HWND hWndParent, [in] WNDENUMPROC lpEnumFunc, [in] LPARAM lParam );


تابع EnumWindowsProc اگر برابر یک باشد در پنجره ها لوپ می زند و hWnd آنرا ارائه می نماید  اگر در تابع صفر بگذارید متوقف میشود و لوپ تعطیل میشود


BOOL CALLBACK EnumWindowsProc( _In_ HWND   hwnd, _In_ LPARAM lParam );


EnumWindowsProc=1


در این تابع که یک CallBack  است با GetClassNameA نام کلاس پنجره را میگیرید. این تابع را ملاحظه کنید ، آرگومان دوم lpClassName از نوع رشته ای است پس شما یک متغیر با نام Buffer بسازید و در آن vbNullChar یا هر کارکتر دیگری بنویسید مثل (Buffer$=String(255,vbNullChar و جای آن آرگومان می گذارید که نام کلاس درون این بافر قرار داده می شود شما می توانید طول رشته را بجای 255 مثلا 64 بگذارید . زمان اجرای GetClassName داخل بافر نام کلاس درج می گردد شما 255 بایت یا کاراکتر( Null )  ایجاد کردید قطعا نام کلاس خیلی کمتر از 255 بایت است و بقیه همان NullChar است پس با تابع Instr دنبال NullChar می گردید که بعد از نام کلاس قرار گرفته و تعداد کارکتر پشت اولین NullChar یافته شده را با این تابع میگیرید منهای یک می کنید که تعداد کاراکتر کلاس بدون آن کاراکتر Null بدست آید سپس با تابع Left آنرا از $Buffer استخراج می کنید . 


کنترل webbrowser که یک اکتیو ایکس است برای باز کردن internet explorer در آن پس نام کلاس هم برگرفته از آن است.








کنترل WebBrowser یک Wrapper یا پوشش است با نام Shell Embedding و حاوی internet Explorer_Server . می توان با فراخوانی توابع Api با نام FindWindowEx از کتابخانه user32 هندل ویندو یا hwnd آنرا دریافت کنید و  برای هندل interner Explorer_Server که یک ClassName است باید در پنجره های Child این پوشش  لوپ بزنید.


نحوه اظهار توابع API در ویندوز 32 و 64 بیت متفاوت هست یک خطا در اظهار یا حتی مغایرت در  دیتا تایپ باعث هنگ کردن خواهد شد.



تابع SetDlgItemTexA 


عنوان یا تکست یک کنترل در دیالوگ باکس را تنظیم می کند فرضا کنترل باتن به نام Yes یا هر Caption دیگری که دارد.


سه آرگومان دارد اولی هندلی به دیالوگ باکس که حاوی کنترل است ، دومی ID دیتا تایپ int و سومی از نوع String که حاوی text است که می خواهید به پنجره کنترل بفرستید که Caption آن تغییر نماید.

























#32770



DO

h=FindWindow("#32770","Choose file")

DOEvents

Loop Until h


editbox=FindWindowEx(x,0&,"ComboBoxEx32",VbNullString).


SendMessage by string

handle  windows msg:WM_SETTEXT  0& maybe ByVal Text


برای Hook کردن پنجره : 


در Form_Load 




Public Function WindowProc(ByVal hwnd As Long, _ ByVal uMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Select Case uMsg

Case WM_LBUTTONDOWN

If ............ Then

WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)

End If 
 Case Else 
 WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End Select
End Function













SubClass A Window



برای  ساب کلاس کردن پنجره در 32 بیت : 


Constants used with Windows APIs
Private Const GWL_WNDPROC = -4

Private mHwnd As LongPtr
Public mOldWndProc As LongPtr

Private Sub Comman4_Click()
mHwnd = FindWindowA(vbNullString, Me.Caption)
SetHook
End Sub

Private Sub Form1_Close()
RemoveHook
End Sub

Private Sub SetHook()
mOldWndProc = SetWindowLongPtrA(mHwnd, GWL_WNDPROC, VBA.CLngPtr(AddressOf NewWndProc))
End Sub

Private Sub RemoveHook()
SetWindowLongPtrA mHwnd, GWL_WNDPROC, mOldWndProc
End Sub

Public Function NewWndProc(ByVal hwnd As LongPtr, _
ByVal uMsg As Long, _
ByVal wParam As LongPtr, _
ByVal lParam As LongPtr) As LongPtr

'On Error Resume Next

NewWndProc = CallWindowProcA(mOldWndProc, hwnd, uMsg, wParam, lParam)
End Function

Unfortunately, you cannot rotate text in a WinForms label. If you really want to do it, you have to handle the Paint event and write code to rotate the text.




برای چرخش متن در گزارش از اکتیوایکس ها استفاده می شود ( و دارای Property ها یا Event هااست البته اگر سازنده تعبیه کرده باشد ) که بصورت کنترل acCustomControl است بنابراین بدون کمک از آنها نمی توان تکست را به درجه ای که می خواهید بچرخانید اکسس فقط چرخش در حالت ۹۰ درجه  Vertical دارد..... پس کنترل اکتیو ایکس رو در گزارشات می بایست اضافه کنید بجای لیبل و از پراپرتی های آن استفاده نمائید 

WM_PAINT : 

Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type


Public Type PAINTSTRUCT
hDc As Long
fErase As Boolean
rcPaint As RECT
End Type

WindowProc(hwnd,uMsg,wParam,lParam) 

Dim ps As PAINTSTRUCT
Dim hDC,hBrushAs LongPtr

Select Case uMsg
   case WM_DESTROY
          PostQuitMessage(0)
         SelectObject hDC,hOldBrush
         DeleteObject hBrush
         WindowProc=0 ' False
   case WM_PAINT
hdc = BeginPaint(hwnd, &ps)
hBrush=CreateSolidBrush(Rgb)
hOldBrush=SelectObject(hDC,hBrush)
FillRect(hdc, &ps.rcPaint, hBrush)
EndPaint hwnd, &ps
WindowProc=0
End Select
WindowProc=DefWindowProc(hwnd, uMsg, wParam, lParam)






توابع API به حروف بزرگ و کوچک حساسند پس اگر فرضا تابع CreateCompatibleDc ارور Not Find در DLL مربوطه دریافت خواهید کرد چرا ؟ چون DC است نه Dc


















رویداد NotInList کنترل کمبو باکس و رویداد Onchange



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



The NotInList event occurs when the user enters a value in the text box portion of comb box that isn't in the combo box list.

رویداد NotInList زمانی اتفاق می افتد که کاربر مقداری را در قسمت تکست باکس کمبوباکس  وارد نماید  که در لیست کمبو باکس نیست.


Private Sub object_NotInList(NewData As String, Response As Integer)

Object   The name of a combo box control.

نام کنترل کمبو باکس است

NewData   A string that Microsoft Access uses to pass the text the user entered in the text box portion of the combo box to the event procedure.

رشته ای که مایکروسافت اکسس برای پاس دادن متن که کاربر وارد کرده در قسمت تکست باکس کمبو  به رویه رویداد استفاده می شود.

Response   The setting indicates how the NotInList event was handled. The Response argument can be one of the following intrinsic constants:

این تنظیم نشان می دهد چگونه  رویداد NotInList اداره شود.آرگومان Response می تواند یکی از ثابت های زیر باشد.

Constant Description

acDataErrDisplay (Default) Displays the default message to the user. You can use this when you don't want to allow the user to add a new value to the combo box list.

پیش فرض acDataErrDisplay است و پیام پیش فرض را به کاربر نمایش می دهد.می توان زمانی استفاده کرد که کاربر اجازه اضافه کردن مقدار جدید به لیست کمبو نداشته باشد.

acDataErrContinue Doesn't display the default message to the user. You can use this when you want to display a custom message to the user. For example, the event procedure could display a custom dialog box asking if the user wanted to save the new entry. If the response is Yes, the event procedure would add the new entry to the list and set the Response argument to acDataErrAdded. If the response is No, the event procedure would set the Response argument to acDataErrContinue.

acDataErrContinue پیام پیش فرض را به کاربر نمایش نخواهد داد.زمانی استفاده می شود که بخواهید پیام خودتان را به کار نمایش دهید.

acDataErrAdded Doesn't display a message to the user but enables you to add the entry to the combo box list in the NotInList event procedure. After the entry is added, Microsoft Access updates the list by requerying the combo box. Microsoft Access then rechecks the string against the combo box list, and saves the value in the NewData argument in the field the combo box is bound to. If the string is not in the list, then Microsoft Access displays an error message.


acDataErrAdded پیامی به کاربر نمایش نمیدهد اما شما را قادر می سازد که در لیست کمبو باکس داده ای را وارد کنید.بعد از اینکه ورودی اضافه شد مایکروسافت اکسس لیست را با Requery کردن کمبو باکس به روز رسانی می کند. سپس مایکروسافت اکسس دوباره  رشته مقابل لیست کمبو باکس را بررسی می کند و مقدار در آرگومان New Data در فیلدی که باند شده ذخیره می شود.اگر رشته در لیست نباشد مایکروسافت اکسس خطایی را نمایش می دهد.


پس وقتی شما ورودی به تکست باکس کمبو می دهید ( رشته ای وارد می کنید ) مقدار آرگومان New Data می شود ورودی شما می توانید با Dlookup آنرا در جدول و فیلد مورد نظر چک کنید اگر وجود نداشت به کاربر پیام دهید در جدول وجود نداردو undo کنید.


Dlookup(New Data,"نام جدول")



When the LimitToList property is set to Yes and the combo box list is dropped down, Access selects matching values in the list as the user enters characters in the text box portion of the combo box, even if the AutoExpand property is set to No. If the user presses Enter or moves to another control or record, the selected value appears in the combo box. In this case, the NotInList event will not fire. To allow the NotInList event to fire, the user should not drop down the combo box list.


زمانیکه ویژگی LimitToList به Yes تنظیم می شود و لیست کمبو باکس ، Drop Down یا به پائین باز می شود ( لیست کشویی ) اکسس بمحض ورود هر کاراکتر آنرا با لیست انتخاب شو انطباق میدهد حتی اگر ویژگی AutoExpand به No تنظیم شده باشد.( جهت جستجو در خود کمبو باکس AutoExpand را حتما تنظیم کنید و SetFocus هم فراموش نشود ) اگر کاربر کلید Enter را بفشارد و یا به کنترل یا رکورد دیگر برود ( منتقل شود - حرکت کند - مکان نما را به آنجا ببرد ) مقدار وارد شده در کمبو باکس ظاهر می شود. در این مورد رویداد NotInList اجرا نمی شود. برای اجازه دادن به اجرای این رویداد کاربر نبایست لیست کمبو باکس را یه پائین بکشد.


ویژگی Onchange در تکست باکس :


This property is helpful for programmatically changing the action that Microsoft Access takes when an event is triggered. For example, between event calls you may want to change an expression's parameters, or switch from an event procedure to an expression or macro, depending on the circumstances under which the event was triggered.

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

The Change event occurs when the contents of a text box or the text portion of a combo box changes. It also occurs when you move from one page to another page in a tab control.

رویداد Change زمانی رخ می دهد که محتویات یک تکست باکس یا قسمت تکست کمبو باکس تغییر کند. همچنین زمان حرکت از یک Page به Page دیگر در کنترل تب ( tab control ) .



لطفا نظر سنجی فراموش نشود








دستور Insert into یا کوئری اپند با استفاده از عبارات Sql در موتور پایگاه داده اکسس



شکل نوشتاری بدین صورت است : 

Insert Into  TableName ( Fields ,,,n) Values (Number,'Text')


داخل Values نمی توان از Select Query استفاده کرد


همانطور که اشاره شد بعد از insert into نام جدول درج میگردد حتما Space رعایت شود بعد داخل پرانتز نام فیلدهای جدول قید میگردد اگر چند فیلد باشد با جداکننده -> ,  از هم جدا می شوند و بعد Values تایپ شده و داخل آن مقادیر هر فیلد قید میگردد اگر عددی نباشد مثل متن باید داخل تک کوتیشن قرار گیرد مثل 'Ali' یا 'S12334' یا '1234 ' ( درسته که عددی می  بینید ولی به Space قبل از 1234 توجه کنید - پس متنی است ) وگرنه خطای نوشتاری بوقوع خواهد پیوست. فیلد با تایپ Date مقدارش بین دو نردبان  یا #  قرار می گیرد. فیلد با دیتاتایپ MultiValued یا Attachmant را در این عبارات بکار نبرید ( در صورت اضافه کردن به این فیلدها با دیتاتایپ یاد شده با خطا مواجه خواهید شد ) چون باید Parent آنها در حال ویرایش درآید و بعد آنها را Manipulate یا دستکاری کرد ( مثل حذف ، برداشتن تیک ، اضافه کردن ) .  رکوردستی که در حالت Edit تنظیم شده و هیچ رکوردی ندارد باعث ایجاد خطای No Current Record می شود پس سعی نکنید در رکوردستی که رکوردی ندارد ویرایش انجام دهید در همین مطالب Run time error را جستجو کنید کامل درباره خطاهای مرسوم توضیح داده شده.



مثال درباره کوئری Append با استفاده از عبارت Sql به نام Insert Into : 


زمان اضافه کردن رکوردی به جدول 1  ، Desc جدول  2 با توجه به PartNo در جدول 2 با inner join گرفته شده و در فیلد Desc جدول 1 درج میگردد سعی کنید قبل از اضافه کردن به جدول PartNo چک شود که در جدول 2 باشد یا کمبوباکس تعبیه کنید که PatNo ها لیست شود و اگر انتخاب نشد خطا بدهد که برای اجرای کوئری اپند کمبو باکس Null نمی گیرد. ( در کمبو باکس خاصیت limit to list را برای Yes قرار بدهید ضمنا Event یا رویدادی وجود دارد ( NotInlist ) می توانید خطای انگلیسی " در لیست وجود ندارد" را به پیام خودتان تغییر دهید.در ضمن ویژگی List Edits را تنظیم کنید که نشود به کمبود باکس اضافه کرد یا آنرا ویرایش کرد .


Table1 :

ID         PartNo  Desc

201       3020    Filter

202      3020    Filter

203     3021    Booster


Table 2 : 

PartNo       Desc  

3020            Filter

3021           Booster


strSql="Insert Into Table1 (ID,PartNo,Desc)" &  _

"Values (" & Me.ID & "," & Me.PartNo & ",'" & _

Dlookup("Desc","Table2","PartNo=" & Me.PartNo) & "')"


چون نمی توان در Values از Select Query استفاده کرد لذا از Dlookup برای گرفتن Desc از جدول 2 استفاده شد.


Docmd.RunSql strSQL


کد اس کیو ال زیر کل جدول New Customers را به جدول Customers اپند می کند 


Insert Into Customers Select * From New Customers


اپند کردن داده های ستون 1 و .... با شرط به ستون های 1 و ....  جدول با نام Table2 


INSERT INTO table2 (column1column2column3,...)
  SELECT column1column2column3, ...
FROM table1 WHERE condition;





برای عدم نمایش پیغام ها مبنی بر اضافه کردن به جدول یا از این کار مطمئنید از دستورات اکشن کوئری مثل SetWarnings استفاده کنید و آنرا خاموش یا Off کنید یا به False تنظیم کنید.




مطالب با توجه به جستجوی عبارات قرار داده خواهد شد 


در تصویر زیر پراپرتی شیت کمبو باکس تب دیتا نمایش داده شده که RowSource تایپی است گزینه های خودتون و از جدول گرفته نشده و در این موارد RowSourceType باید Value List انتخاب شود وگرنه با خطا مواجه می شوید ویژگی limit to list نیز روی No تنظیم شده پس خطای NotInList ندارید و List Edits نیز روی No است که نمی توانید مقادیر لیست باکس کمبو باکس را ویرایش کنید .





لطفا نظر سنجی فراموش نشود










ویژگی DisplayControl برای نمایش کنترل Yes/No در حالت چک باکس یا کمبو باکس




فیلد با تایپ Yes/No ایجاد کرده اید و می خواهید بصورت چک باکس ( acCheckBox ) یا کمبو باکس ( acComboBox ) نمایش داده شود، لذا از این ویژگی مربوطه در نمای دیزای استفاده می کنید .


CurrentDb

TableDefs

Fields

Properties


access.accontroltype


در نمای دیزاین جدول در فیلدها حتی با دیتا تایپ Attachment ،  پراپرتی بنام Caption وجود دارد لذا نام فارسی را در آن قرار دهید تا سرستون ها به فارسی  نمایش داده شود و از نامگذاری نام فیلد به فارسی جدا خودداری نمائید چون اکسس یونیکد فارسی را پشتیبانی نمی کند و به مشکل برخواهید خورد حتی هنگام باز کردن فرم. در کوئری هم از فارسی نوشتن نام فیلد یا ستون ها پرهیز کنید اگر مشاهده کنید آنجا هم پراپرتی شیت و ویژگی Caption برای نوشتن به فارسی وجود دارد.



لطفا نظرسنجی فراموش نشود



















نوشتن کلاس ماژول



Private varPropertyName As Variant 

Property Get PropertyName() As Variant 
    If IsObject(varPropertyName) Then 
        Set PropertyName = varPropertyName 
    Else 
        PropertyName = varPropertyName 
    End If 
End Property 


Property Set PropertyName(rData As Variant) 
    Set varPropertyName = rData 
End Property 





در زیر کلاس ماژول clsStudent تعریف شده که نمره ای را می گیرد و رتبه ای را بر می گرداند. پراپرتی Let حداقل یک آرگومان می گیرد و الزامیست. با Let یک مقدار به پراپرتی اختصاص یافته همانطور که می ببینید محاسباتی انجام شده و در dblStuMarks قرار داده شده و با Get مقدار این پراپرتی را گرفته یعنی Marks را معادل dblStuMarks قرار داده و این متغیر را در تابع Grade استفاده کرده.


Private dblStuMarks As Double


Public Property Let Marks(iMarks As Double)
dblStuMarks = (iMarks / 80) * 100
End Property

Public Property Get Marks() As Double
Marks = dblStuMarks
End Property



Public Function Grade() As String
Dim strGrade As String

If dblStuMarks >= 80 Then strGrade = "A"
ElseIf dblStuMarks >= 60 Then
strGrade = "B"
ElseIf dblStuMarks >= 40 Then
strGrade = "C"
Else
strGrade = "Fail"
End If
Grade = strGrade
End Function






Sub clsStudentRun()
Dim iStudent As clsStudent
Set iStudent = New clsStudent
'Dim iStudent As New clsStudent
MsgBox iStudent.Marks
MsgBox iStudent.Grade

End Sub



کلاس ماژول تعریف شده یِ زیر 


* Property Get. Returns the value of a property.

* Property Let. Assigns a value to the property.

* Property Set. Sets the value of an object property.

پراپرتی Get مقدار پراپرتی را بر می گرداند.

پراپرتی Let یک مقدار به پراپرتی تخصیص می دهد

پراپرتی Set مقدار یک پراپرتی Object را تنظیم می کند


Private employee As Employee

Public Property Get NewEmployee() As Variant

NewEmployee = employee

End Property

Public Property Set NewEmployee(ByVal vNewValue As Employee)

employee = vNewValue

End Property





در زیر دو کلاس ماژول تعریف شده  یکی با نام clsCar و دیگری clsMotorCars که مقادیری را می گیرد و محاسباتی را برمی گرداند.




Class Module Named clsCar


Private varCar As clsMotorCars


Public Property Set Car(objCar As clsMotorCara)

Set varCar=objCar

End Property


Public Property Get Car() As MotorCar

Set Car=varCar

End Proprty



Class Module named clsMotorCars


Private strColor As String
Private strName As String
Private dMG As Double

Property Let Color(clr As String)
strColor = clr
End Property

Property Get Color() As String
Color = strColor
End Property

Property Let Name(nm As String)
strName = nm
End Property

Property Get Name() As String
Name = strName
End Property

Property Let Mileage(milesGallon As Double)
dMG = milesGallon
End Property

Property Get Mileage() As Double
Mileage = dMG
End Property

Function FuelBudget(FuelCost As Double, Distance As Double) As Double
FuelBudget = (Distance / Mileage) * FuelCost
End Function


Sub propSetCars()


Dim dDist As Double
Dim dCost As Double

Dim ownCar As clsCar
Set ownCar = New clsCar

Set ownCar.Car = New clsMotorCars

ownCar.Car.Color = "Yellow"
ownCar.Car.Name = "Ford"
ownCar.Car.Mileage = 50
dDist = InputBox("Enter Distance in miles, covered by car in a month")
dCost = InputBox("Enter Cost of Fuel per gallon")

Msgbox ownCar.Car.FuelBudget(dDist, dCost)


End Sub














فیلد تکست در اکسس دسکتاپ و محدودیت های کاراکتری و تعداد آبجکت در اکسس



Long Text    In .accdb files, the Long Text field works the same as the Memo field of old. That is, it can store up to about a gigabyte of text, even though controls on forms and reports can only display the first 64,000 characters. You can set Long Text fields to display Rich Text, which includes formatting like bold and underline.


در فایل های accdb فیلد LongText شبیه فیلد  قدیمی Memo عمل می نماید و می تواند تا یک گیگابایت تکست ذخیره کند . اگر چه در کنترل های فرم و گزارش فقط می توان 64000 کاراکتر اول را مشاهده نمود . می توان فیلد های تکست را برای نمایش Rich Text به Long Text تنظیم نمود که  متن آنها را درشت یا Bold  و یا خط زیر آنها بکشید ( UnderLine ).




Short Text    In .accdb files, the Short Text field works the same as the Text field in earlier versions. It stores up to 255 characters.


در فایل های اکسس فیلد Short Tet مثل فیلد Text در نسخه های قبل تر عمل می کند و تا 255 کاراکتر می گیرد.



تعداد آبجکت ها مثل فرم و گزارش یا تعداد فیلدها در جدول در دیتابیس اکسس محدودیت دارند فرضا هر جدول فقط 255 فیلد در خود جای می دهد هر چقدر تعداد فیلدها و تعداد Space بیشتر باشد فضای بیشتری در دیتابیس اشغال می کنند حتما برای Size در فیلدهای تکست مقدار دهید.لینک زیر تعداد را به تفصیل بیان می کند.


office/access-specifications




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









خواندن (از) یا نوشتن (در) فایل تکست با آبجکت ADO STREAM یا vbscript



CreateObject : ADODB.STREAM


With AdoStream

.Charset="UTF-8"

.Type=2 'text

.Open

.WriteText "xcfg"

.SaveToFile "D:\C.txt",2

Str=.ReadText

End With

AdoStream.Close

Set AdoStream=Nothing


.LoadFromFile FileName



طریقه دیگر نوشتن یا خواندن یا اضافه کردن به فایل تکست  : 


Create Object : Scripting.FileSystemObject

Set Object to Fso Variable

With Fso

در متد باز کردن تکست عدد یکی از Mode ها در آرگومان قرار گیرد و همینطور در Create یا فایل موجود است یعنی True یا False است و پیش فرض False می باشد.

.OpenTextFile FileName,Mode(Read:1,Write:2,Append to End:8),Create(True or False )

نوشتن در فایل تکست اگر Mode هشت باشد به انتهای آن اضافه می کند.البته یونیکد فارسی پشتیبانی نمی شود

.Write "xcfgjj"

.Close

End With


این آبجکت FileSystemObject متد CreateTextFile نیز دارد برای ساخت فایل تکست.


The OpenAsTextStream method provides the same functionality as the OpenTextFile method of the FileSystemObject. In addition, the OpenAsTextStream method can be used to write to a file


متد OpenAsTextStream مثل OpenTextFile است دقیقا آرگومانهاش و نوشتاری تابع بعلاوه اینکه این متد می تواند روی هر فایلی بنویسید.( Write)


The AtEndOfStream property applies only to TextStream files that are open for reading; otherwise, an error occurs.


ویژگی AtEndOfStream فقط به فایل های TextStream قابل اعمال است که برای Reading باز می شوند در غیر اینصورت خطا اتفاق می افتد.چک می کند که در انتهای فایل Stream است یا خیر اگر باشد True را بر می گرداند.


Set ObjFile=ObjFso.OpenTextFile(FileName,1,0)

Do While ObjFile.AtEndOfStream <> True

ret=ObjFile.ReadLine

Loop

str=ObjFile.ReadAll

ObjFile.Close



فرض کنید یک فایل تکست تهیه شده در آن سطرهایی درج شده و هر سطر شامل چندین فیلد است با جداکننده مثل سمی کالن  ( برای تکست در فایل تکست دو کوتیشن قرار داده شده که با دستور insert into به راحتی به جدول اضافه شوند و خطا نگیرید) ، سطرها می شود همان رکوردشما هر سطرهم با Enter از هم جدا شده اند حال می خواهید فایل تکست خوانده شود و اطلاعات هر سطر را به جدول اضافه کند. لذا با دو متد بالا می توانید فایل تکست را باز کنید با تابع Split اول سطرها جدا شوند ( جدا شونده می شود vbrclf )  بعد  با همین تابع Split یا هر تابعی که نوشتید آیتم های هر سطر  که آنهم با سمی کالن جدا شده اند را بگیرید .  شماره فیلدها در جدول از صفر شروع می شود و به تعداد کل منهای یک ختم می شود . اگر قراره که تکراری نگیره خوب ID رو پرایمری کی کنید در جدول تا قبول نکنه .


Text File :

1200,'Mike','London'

1201,'Jefer','London'


Table : 

ID,SurName,City




Preserve copies the elements from the old array to the new array. It is possible to resize an array without losing the existing values by using the Preserve keyword. When you use Preserve you can only change the size of the upper bound (not the lower bound).


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


تصویر زیر نمونه ای از یک جداکننده است ، البته نام تابع باید Separator باشد ولی تابع Split همین عمل را انجام میدهد احتیاج به نوشتن چنین تابعی نیست.




برای اضافه کردن تکست ، حتما  باید بین دو کوتیشن باشد وگرنه اکسس خطا می دهد. با اجرای کوئری اپند زیر با توجه باینکه فایل تکست منطبق بر تعداد فیلد در جدول است به راحتی به جدول اضافه می شوند و اگر ID که پرایمری کردید تکراری بود به جدول اضافه نمی شود. ( فیلد های MultiValued و یا Attachment را نمی توان در کوئری Append و Make Table استفاده کرد منجر به خطا می شود.) 


StrSQL="Insert Into TableName (ID,SurName,City) Values (" & Str & ")"



میشود که تابع تصویر را گسترش داد که بغیر از آرگومان های گرفتن رشته و جداکننده که اجباریست ، تعداد کل آرایه و مقدار هر کدوم بصورت انتخابی اضافه شوند مثلا


Function Separator(S As String,Delim As String,Optional GetTotalNumber As Boolean,Optional  Num As Long) 


یا کلاس ماژولی نوشت که GetString ویژگیهایی مثل Counter و ... باشد که در همه جا بتوانید استفاده کنید البته یادآوری می کنم تابع Split در اکسس و جداسازی وجود دارد.









Set ColItms=Objwinmgmts.ExecQuery ( _

"Select * From Win32_OperatingSystem")

ObjItms In ColItms



SerialNumber




لیست فیلدها در فیلد Attachment



بعلت حجیم شدن دیتابیس از بکار بردن فیلد Attachment پرهیز کنید.


برای باز شدن فایلی چه اکسل چه اکسس چه عکس از FollowHyperLink استفاده کنید


Application.FollowHyperLink  "مسیرو نام فایل"


Fields List :



کالمن FileData  در فیلدی با دیتا تایپ Attachment  (  مثل  تصویر زیر فیلد با نام image  که Child است و Parent ، جدول ) - داده ها باینری هستند ! نه تکست چندین بار عنوان کردم 


به قول شخصی خودم فیلدی است ( FileData ) در فیلد دیگر ( Image )



شئ ADO STREAM برای خواندن ، نوشتن و مدیریت یک جریانی از داده های باینری یا تکست استفاده می شود.یک Stream Object از سه طریق می تواند حاصل شود : از یک URL که به سندی اشاره می کند ، یک فولدر ، یا یک شئ رکورد (  Record Object )


لینک زیر ویژگیها ، متدها و رویدادهای Stream Object ذکر شده


از Charset مثل تنظیم روی "UTF-8"  زمانی استفاده می شود که بخواهید متنی رو از فرضا Ansi به کاراکترهای  یونیکد UTF-8 تبدیل کنید.



Set stream = CreateObject("ADODB.Stream")
stream.Open stream.Type = 2 'text
stream.Charset = "utf-8"
stream.Position = 0 stream.WriteText str stream.Flush
stream.Read(3) 'skip BOM
stream.Position = 0 stream.Type = 1 'binary utfStr = stream.Read
stream.Close




ado-api/stream-object-properties-methods-and-events


Set Rs=CreateObject("ADODB.Recordset")

Rs.Edit

Set StreamObj=CreateObject("ADODB.Stream")

StreamObj=adTypeBinary

StreamObj.Open

Stream.LoadFromFile FileName

Rs.Fields("FieldName").Value=StreamObj.Read

Rs.Update

Rs.Close



SaveToFile   اضافه کردن فایل به دیسک

LoafFromFile بارگزای فایل مشخص شده از دیسک









Run time error یا خطای حین اجرا در اکسس ( نکات محدودیتی اکسس )


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


Error 7961

یعنی ماژول نوشته شده در دیتابیس موجود نیست اکسس کارایی که برنامه برای جایی نوشتن و حالا یا پولشو ندادن یا بیرونش کردن معمولا این کارها رو انجام میدن پس اگه برنامه می نویسید یا کلا ببندینش یا پولشو بگیرید


Erro 3021 : No Current Record

عملی انجام می دهید روی جدولی که رکوردی ندارد دوست من انجام نده ، Recordset خالیه بعد از متد Edit استفاده میکنی ؟ باید از AddNew بهره ببری عَزیزُم.


برای دستکاری داده در رکوردست حتما باید Parent را در حال ویرایش قرار داد وگرنه خطا می دهد و م تد Update را هم باید بکار ببرید.حتما رکوردست را ببندید و از حافظه موقت خالی کنید چون باز باشد فضای  اضافی اشغال می کند.


Error 2059

آبجکت یا شئ ایجاد شده ،  یا وجود خارجی ندارد یا باید نامش را چک کنید که موجود باشد در ضمن صد بار گفتم اسم جداول ، فرم ها که آبجکت هستند رو فارسی ننویسید !!! بین نام هاتون Space نگذارید یا آندرلاین بهشون بدید یا زمان فراخوانیشون داخل براکت بگذارید.


Error 2110

کنترل مورد نظر فوکس نمی گیره مثل label پس سعی بیهوده به خرج ندهید.


Error 2113

اشتباه در ورودی دیتا تایپ مثلا دیتا تایپ عددیه شما تکست میخواهید وارد کنید یا پارامتر عددی شما علاقه دارید متنی مقدار بدید یا اندازش بیشتر از میزان مجازه . خب نکن برادر من چه کاریه هر چی یه قانونی داره!


Error 2136

یکسری ویژگیهای یک کنترل همانطور که گفته شد در نمای دیزاین اون آبجکت مثل فرم یا گزارش قابل تنظیمه و نمی تونید مستقیما در نمای فرم ویو تغییر بدید پس وقتی در نمای دیزاین قابل تنظیمه شما اگر فایل رو accde بکنید در نتیجه دسترسی به محیط دیزاین یا رفتن بهش رو ندارید چون قفله و در آخر اون ویژگیتون هم توسط کد وی بی می خواد انجام بشه ولی متاسفانه راه نیمیده !!!


Error 2147

ساخت یا حذف کنترل ها در نمای دیزاین صورت می گیره پس در نمای فرم ویو شما نمی توانید با CreateControl کار کنید و اگر فایل به accde تبدیل شه به بن بست خواهید خورد چون نمای دیزاین بسته خواهد شد.


Error 2164

نمی توان کنترلی که فوکس دارد را غیر فعال کرد


Error 2165

نمی توان کنترل فوکس شده را پنهان کرد. لیبل فوکس نمی گیرد


Error 2166

نمی توان کنترلی که تغییرات ذخیره نشده یا بعبارتی Dirty=True است را قفل کرد منظورم lock است دادا !!!


Error 2167

رکورد در این لحظه قابل ذخیره نیست زمانی اتفاق میوفته که فرد دیگری روی همون رکورد باشه ... چون اکسس قفلش  میکنه .


Error 2197

نمی توان ویژگی SourceObject کنترل سابفرم را به رشته ای با طول صفر تنظیم کرد وقتی در حال مشاهده فرم اصلی هستیم و این ویژگی را نمی توان در نمای دیزاین ، دیتاشیت ویو یا پرینت ویو به رشته ای با طول صفر ("") تنظیم نمود دوستان گلم جزو قوانینشه عزیزان !!!


این ویژگی یعنی SourceObject مال زمانیه که کنترل سابفرم رو از نوع دیتا شیت قرار می دید و در فرم اصلیتون فرضا شروطی دارید و هر کدوم در کوئری جداگانه انجام میشه و میخواهید بعد از اعمال کوئری مربوطه در این سابفرم نمایش داده شه یا ویویی ازش داشته باشید.


Error 3022

زمانیه که شما جدولتون پرایمری کی داره خب معلومه که نباید تکراری بگیره اگه خیلی علاقه دارید به تکرای بودن کلید رو از جدول بردارید.


Error 3122

سعی در اجرای کوئری دارید که دارای Expression مشخص شده ای نیست.



توابع Aggregate محاسباتی روی یک ستون داده انجام میدن و مقداری رو بر می گردونن.اکسس واریانت های مختلفی از این توابع شامل Sum یا Count ارائه می کند.



پس زمانیکه قصد دارید سام یا کانت بگیرید از فیلد یا  فیلدهایی و کل فیلدها قراره نمایش داده شه حتما از group by  استفاده کنید وگرنه با این خطا مواجه می شوید.



Group by [Project Name]



مثال دیگر : 


متن ارور چیه ؟ سعی کردید!!! یک کوئری اجرا کنید که عبارت BalanceDate مشخص شده بعنوان قسمتی از تابع aggregate قرار ندارد.


You tried to execute a query that does not include the specified expression "BalanceDate" as part of an aggregate function. (Error 3122)


SELECT RunningBalance.BalanceDate, Sum(Nz(Transactions!Deposit,0)-Nz(Transactions!Withdrawal,0)) AS DepWith
FROM RunningBalance LEFT JOIN Transactions ON RunningBalance.BalanceDate = Transactions.TransDate
ORDER BY RunningBalance.BalanceDate


برای رفع خطا یک Group By قبل از Order By ( مرتب کردن ) لازم دارد.


در بالا در دل کار گروه بندی وجود داره در فیلدها یعنی تاریخ بالانس مشخصا در رکوردهایی با هم فرق میکنه و یکی نیست پس وقتی Sum می زنید باید اول کوئری گروه بندی شه بر اساس تاریخ بعد برای هر گروه سام بزنه اینهم بخاطر تابع نوشته شدست که کار sum و count یا کلا تابع aggregate اینطوریاس !!! اگه sum نزنید هیچ مشکلی بوجود نمیاد و کل رکوردها رو دارید یا اگر فقط یک فیلد رو Sum بگیرید و فیلدهای  غیر عددی که داده های مختلف داخلش هست در گریدتون تیک show رو بردارید هم خطا نمدید کلی سامش رو براتون میگیره که لذت ببرید تنها در یک رکورد 


حتی ممکنه کوئری های تو در تو بنویسید داخل  یک کوئری  و این خطا رو دریافت کنید چرا چون باز تو یکیشون رعایت نکردید Group By کردنش رو و باید ببینید کدام سلکت کوئری هست که  خلاف تابع aggregate عمل کردید و در نهایت اصلاحش کنید تا کوئریتون اجراشه و خلاص شید 


Error 3127

یه فیلد اشتباهی در inser into قرار دادید یا اینکه موجود نیست البته همون چیزی که نوشتید رو بهتون در خطا میده فرضا

insert into (IDD,Desc) Values (280,'Descript')

بعد کاشف بعمل میاد که فیلد ID در جدول وجود داره نه IDD


Error 3129 ~ 3135

خطای نوشتاریه مثلا در insert into که کوئری اپند است یه کوتیشن کم گذاشتید برای مقادیر متنی ،  یا خطای نوشتاری در From یا join کردن و حتی در Group by یا having دارید یا دستورات و عبارات Sql می نویسید که غیر از update delete ویا select است یا مثلا بعد از From  فاصله نذاشتید یا جابجا در نوشتتون قرارش دادید خب معلومه خطای Syntax یا نوشتاری می گیرید در Dlookup هم همینطوره تقدم و تاخر یا نذاشتن کوتیشن یا نوشتن حرف اضافه غیر از اون فرمی که تعریف شده باعث خطا می شد.


Error 3151

زمانیکه برای اتصال به sql server از ODBC استفاده می کنید و ارتباط با شبکه ای فایل sql srver در اون  قرار داره قطع میشه .


Error 3162

سعی می کنید که یک مقدار Null به متغیری که دیتا تایپش Variant نیست تخصیص دهید.

A Variant can also contain the special values Empty, Error, Nothing, and Null.

Null مقدار ندارد برای اینکه بفهمید ComboBox که Null نمی گیرد Null است یا خیر از تابع IsNull استفاده کنید.


Error  3169

موتور دیتابیس اکسس نمی تواند دستور Sql را اجرا کند بدلیل اینکه حاوی فیلدی است با دیتا تایپ غیرمعتبر. موتور اکسس فقط می تواند عبارات Sql  تعریف شده در DDL را اجرا کند پس سعی نکنید دستورات دیگر Sql Server که در آن موجود نیست را بکار ببرید.


Error 3196

دیتابیس توسط کاربر دیگری در حال استفاده است موقعی که در شبکه Share کردید ولی بصورت Exclusively باز شده .


Error 3197

دو نفر در حال ویرایش یک داده در یک زمان هستند و موتور دیتابیس اکسس این فرآیند را متوقف می کند.


Error 3200

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

enforce referential integrity



Error 3201

قادر به اضافه یا تغییر رکورد نیستید چرا ؟ چون در جدول فیلدی دارید که ویژگی Required آن Yes است و نباید خالی رها شود عزیزان دل ! 


Error 3270

پراپرتی پیدا نشد وقتی از پراپرتی استفاده می کنید که به دیتابیس اضافه نشده مثل AllowByPassKey با این خطا مواجه خواهید شد.


Error 3356

تلاش  دارید دیتابیسی را باز کنید که یوزری در یک ماشین دیگری بصورت اختصاصی یا Exclusively باز کرده باید صبر کنید تا دیتابیس را ببندد.


Error 3360

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


Error 3361

اعمال Union در ساب کوئری مجاز نیست پس استفاده نکنید


Error 3368

RelationShip می بایست بر روی همان فیلد با دیتا تایپ یکسان اعمال گردد.وقتی ارور رو دریافت می کنید دیتا تایپ ها رو چک کنید زمانیکه ارتباط بین جداول می سازید که پرایمری کی دارند اتفاق می افتد.


زمانیکه ارتباط برقراز میکنید که یک به بی نهایت شود جدول مادر نباید تکراری داشته باشد وگرنه قانون یکپارچگی رو بهم میزنه و ارتباط ایجاد نمیکنه.


Error 3415

رشته باطول صفر فقط برای فیلد Text یا Memo معتبر است.


Error 3824

کوئری insert into نمی تواند حا ی فیلد Multi-Valued باشد پس نمی توان به فیلدی که چند انتخابی است  مقداری اضافه کرد.حتی در union query هم نمی توان از فیلد Multi-Valued استفاده کرد.


Error 3852

نمی توان MultiValued که رکوردست Parent اَش در حالت ویرایش نیست را Update یا به روز رسانی کرد . برای قرار دادن رکوردست Parent  در حالت ویرایش از متد AddNew یا Edit استفاده کنید.


دوستان هم خطا رو اعلام می کنه و هم راهنمایی


Error 3959

Calculated Columns در عبارات Select Into ( برای انجام Make Table ) مجاز نیستند ! 










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










ایجاد سایه در رنگ theme در ویژگی BackColor ( کنترل Image )


Image Control : 



The BackShade property contains a numeric expression that can be used to darken the theme color in the BackColor property. The default value of the BackShade property is 100, which is neutral, and does not change the theme color.

ویژگی BackShade حاوی  عبارت عددی که می تواند برای تیره کردن رنگ تم در ویژگی BackColor بکار برده شود.مقدار پیش فرض این ویژگی 100 است.

To darken the color, first determine the percentage by which to darken from 1 to 100, and then subtract that value as a whole number from 100 and use the remainder. For example, to darken the theme color by 75%, subtract 75 from 100 and use the remainder, which is 25.

برای تیره کردن رنگ ، اول درصد تیرگی از 1 تا 100 را تعیین کنید و سپس آن مقدار را از 100 کم کنید و باقیمانده را استفاده کنید. برای مثال 75% تیرگی : 75 را از 100 که مقدار کل است کم کنید و مقدار باقیمانده از 100 که 25 است را استفاده کنید 

This property is not surfaced in the property sheet.

این ویژگی در برگه پراپرتی نیست خب چون مربوط به BackColor است احتمالا در Proprties sheet قابل مشاهده نیست.

Example

The following code example darkens the BackColor property by 75%.

مثال زیر تیرگی 75 درصدی  ویژگی BackColor است.

Me.ctl.BackShade=25





Teigger در Sql



Create Trigger [dbo].[Trg_Update] On [dbo].[myTable]
After Update 
As Begin
Update myTable Set ModifyDateTime = GETDATE()
Where myTable.id = (Select d.id from deleted d)
End


ساخت تریگری که بعد از ویرایش فیلد ModifyDateTime پر می شود  البته با شرط id 


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


CREATE TRIGGER [dbo].[after_update] ON [dbo].[MYTABLE]
AFTER UPDATE
AS
BEGIN
    DECLARE @ID INT

    SELECT @ID = D.ID
    FROM inserted D

    UPDATE MYTABLE
    SET mytable.CHANGED_ON = GETDATE()
        ,CHANGED_BY = USER_NAME(USER_ID())
    WHERE ID = @ID
END




Inserted and Deleted Tables in SQL
  1. If any record is being inserted into the main table, a new entry, of the record being created, is also inserted into the INSERTED table.
  2. If any record is being deleted from the main table, an entry of the record is being deleted, is inserted into the DELETED table.


جداول inserted یا Deleted در SQL  : 


1-اگر رکوردی در جدول اصلی insert یا Delete شود ، یک ورودی جدید از رکورد در حال ایجاد یا حذفی  نیز در جدول  Deleted ، Inserted درج میشود . اینها برای مواردی هستند که شما میخواهید Update در همان ردیف انجام شود نه کل ستون پس نیاز به id دارید !!!


SET NOCOUNT ON/OFF statement controls the behavior in SQL Server to show the number of affected rows in the T-SQL query.



عبارت Set NOCOUNT ON/OFF برای نمایش یا عدم نمایش ردیف های متاثر از تغییر در کوئری T-SQL یعنی زمان ON بودن تعداد رکوردهای اضافه ، آپدیت یا حذف شده را نمایش خواهد داد.



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


Database.RecordsAffected property

















اصلاح دیزاین جدول در اکسس یا اصلاح فیلد تایپ



ALTER TABLE : 


Modifies the design of a table after it has been created with the CREATE TABLE statement.


دیزاین یک جدول ایجاد شده با CREATE TABLE را تغییر می دهد . ALTER COLUMN نیز برای اصلاح دیتا تایپ فیلد استفاده می شود. ( در نمای SQL )



ALTER TABLE table {ADD {COLUMN field type[(size)] [NOT NULL] [CONSTRAINT index] | ALTER COLUMN field type[(size)] | CONSTRAINT multifieldindex} | DROP {COLUMN field I CONSTRAINT indexname} }


DROP هم برای حذف ستون یا فیلد مورد نظر استفاده میشه ، حذف فیلد یا ستون با دیتا تایپ AutoNumber باعث خطا می شود ( برای حذف این ستون  می بایست اول دیتا تایپ را تغییر دهید مثلا به Number یا Text ، اگر Primary Key دارد آنهم بایستی برداشته شود و بعد Drop Column yourfield   استفاده شود )


ALERT نام جدول DROP COLUMN نام فیلد


برای اضافه یا اصلاح فیلد نوع یا تیپ AutoNumber در اکسس از Counter استفاده بنمائید.(دوپارامتر دارد اولی از چه عددی شروع شود و دومی چند تا چند تا)


برای Reset شماره های AutoNumber  زمانیکه یکسری اعداد بخاطر حذف رکوردهایی lost شده می توان با همان Alter Column دیتا تایپ را به Number تغییر داد و سپس دوباره آنرا با Counter ، دیتا تایپ AutoNumber کنید میشه ؟!!!  خیر امکانپذیر نیست


در Vba متد خاصی برای  اصلاح دیتا تایپ فیلد وجود ندارد کاری که می کنید این است : با CreateField یک فیلد جدید بسازید بعد با UpdateQuery مقادیر را به آن انتقال دهید ( Set NewField=OlfField )  سپس فیلد قدیمی (  OldField )  را حذف  و شئ TableDef را Refresh کنید. ( حتما برای تنظیم اشیاء و کاربردشون از Set استفاده کنید چون باید متغیر تعریفی مثل tdf  به کالکشن TableDefs متصل و بتواند از متدها و ویژگیهای آن بهره ببرد ) اگر از Set استفاده نکنید مطمئنا پیام خطائی صادر و از ادامه کار جلوگیری می کند.



نحوه اجرای دستورات Sql هم با RunSql یا از کالکشن دیتابیس متد Execute . لینک database-execute



The Microsoft Access database engine does not support the use of CREATE TABLE, or any of the DDL statements, with non-Microsoft Access database engine databases. Use the DAO Create methods instead.


موتور دیتابیس اکسس استفاده از Create Table یا هر یک از عبارات Data Definition Language ( DDL ) را با دیتابیس  های موتور دیتابیس غیر اکسس پشتیبانی نمی کند.به جای آن از روش های Dao Create بهره ببرید.


In the context of SQLdata definition or data description language (DDL) is a syntax for creating and modifying database objects such as tables,


در مفاد SQL یا Structural Query Language ، این DDL یک علم نوشتاری است برای ایجاد یا اصلاح اشیاء پایگاه داده مثل جداول 



Dim tdf As Dao.TableDef

Dim fld As Dao.Field

Dim prp As Dao.Property ( no use properties to ger property name )


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

Set tdf=CurrentDb.CreateQueryDef("")

StrSQL="Select Distinct id,desc from table1"

Docmd.RunSql StrSQL


Docmd.OpenQeury QueryName


This method is only available in the Access database environment. See the OpenView or OpenStoredProcedure methods if you are using the Access Project environment (.adp).


متد بالا برای باز کردن کوئری فقط در محیط پایگاه داده اکسس است ،  متد OpenView یا OpenStore را مشاهده کنید چنانچه از محیط پروژه اکسس با پسوند adp استفاده می کنید.


-------------------------

For Each fld In tdf.Fields

For Each prp in fld.Properties

-------------------------


Data Access Objects (DAO) enable you to manipulate the structure of your database 


DAO دسترسی شما به دستکاری ساختار پایگاه داده را فراهم می سازد.



Databases in Access are composed of four objects: tables, queries, forms, and reports. Together, these objects allow you to enter, store, analyze, and compile your data however you want

پایگاه های داده در اکسس از چهار شئ تشکیل شده : جداول ، پرس و جو ها ، فرم و گزارشات . این اشیاء با هم به شما اجازه می دهند تا داده های خود را هر طور که می خواهید وارد ، ذخیره ، تجزیه و تحلیل و جمع آوری کنید.


access.accessobject


Because an AccessObject object corresponds to an existing object, you can't create new AccessObject objects or delete existing ones. To refer to an AccessObject object in a collection by its ordinal number or by its Name property setting, use any of the following syntax forms:

  • AllForms (0)
  • AllForms ("name")
  • AllForms ![ name ]


بخاطر اینکه شئ AccessObject متعلق است به یک شئ موجود لذا نمی توان شئ های AccessObject جدید ساخت یا آنرا حذف کرد.برای ارجاع به یک شئ AccessObject در یک مجموعه با شماره ترتیبی  یا تنظیم ویژگی Name  خودش  از شکل های نوشتاری که در بالا اشاره شد استفاده شود.


مطالب بر اساس آنچه جستجو و به این بلاگ ختم شده بیان خواهد شد 



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















تغییر نام آبجکت ها در اکسس ( جدول ، کوئری ، فرم و ... )



لینک زیر داکیومنت آفیس برای تغییر نام آبجکت ها در دیتابیس اکسس CopyObject هم برای کپی کردن.


office/vba/api/access.docmd.rename


expression.Rename (NewNameObjectTypeOldName)


سه آرگومان دارد اولی نام جدید دومی نام آبجکت با پیشوند ac مثل acForm یا acTable و سومی نام قدیمی شئ مورد نظر


کپی آبجکت مورد نظر از یک دیتابیس به دیتابیس دیگر با اکشن کپی آبجکت در ویژوال بیسیک.


expression.CopyObject (DestinationDatabaseNewNameSourceObjectTypeSourceObjectName)



You can use the DeleteObject method to delete a specified database object.

If you leave the ObjectType and ObjectName arguments blank (the default constant, acDefault, is assumed for ObjectType), Access deletes the object selected in the Database window. To select an object in the Database window, you can use the SelectObject action or SelectObject method with the InDatabaseWindow argument set to Yes (True).


استفاده از اکشن DeleteObject در ویژوال بیسیک برای حذف آبجکت دیتابیس مشخص شده.


اگر آرگومان های  ObjectType و ObjectName را خالی بگذارید ( ثابت پیش فرض acDefault است که برای ObjectType انجام میشود ) ، اکسس آبجکت انتخاب شده در دیتابیس را انتخاب می کند آخ آخ آخ !!! برای انتخاب آبجکت در پنجره دیتابیس می توان از اکشن SelectObject یا متد  SelectObject استفاده نمود با تنظیم آرگومان InDatabaseWindow به Yes یا True.


expression.SelectObject (ObjectTypeObjectNameInNavigationPane)


InNavigationPane : 


Use True to select the object in the Database window. Use False (0) to select an object that's already open. If you leave this argument blank, the default (False) is assumed.


استفاده از True برای انتخاب آبجکت در پنجره دیتابیس . کاربرد False برای انتخاب آبجکتی که باز شده . اگر این آرگومان خالی باشد،پیش فرض False است.



داکیومنت آفیس را مطالعه،  لذت برده و با دوستانتان به اشتراک بگذارید.



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















SetOption جهت تنظیم مقادیر options در دیالوگ باکس Access Options مثل تغییر رفتن به رکورد دیگر یا خاموش کردن پیام های کوئری اپند


اگر چک باکس باشد از True و False استفاده می شود


Selection Behavior یا رفتار انتخاب در چک باکس


Application.SetOption "Selection Behavior", 1


آیتم زیر انتقال بعد از زدن اینتر اگر مقدار آرگومان دوم یک باشد وقتی در فیلد جدول اینتر بزنید به فیلد بعدی می رود بستگی به tab order دارد ولی اگر 2 باشد بعد از زدن اینتر به رکورد بعدی می روید.البته بعضی از آیتم ها مثل تغییر ریبون نیازمند بستن دیتابیس است و مستقیما اعمال نمی شود!!!


Application.SetOption("Move After Enter", 1) ' to set it to move to the next control

Application.SetOption("Move After Enter", 2) ' to set it to move to the next record


وقتی کوئری اپند را اجرا می کنید یا رکورد یا رکوردهایی را با کوئری delete حذف می کنید پیغام های اکسس مبنی بر اینکه مایلید یا خیر و ... نمایان می شود برای اینکه دیگر نمایش داده نشود در دیالوگ باکس Options تیک چک  موارد زیر باید برداشته شوند.معادل SetWarnings هستند 


Application.SetOption "Confirm Action Queries", 0 Application.SetOption "Confirm Document Deletions", 0 Application.SetOption "Confirm Record Changes", 0


برای compact  کردن در لحظه از SetOption یا سایر روش ها مستقیما نمی توان عمل کرد و دیتابیس را compact نخواهد کرد چرا چون اکسس اگر مشاهده کنید یک فایل دیگر با پسوند lccdb در کنار آن می سازد و قفل می شود و اجازه چنین کاری در این حالت داده نخواهد شد. خودش هم اگر می بینید گزینه ای در دیالوگ باکس با عنوان compact on close دارد مطمئن باشید که این compact را در دیتابیس دیگر که بسته است انجام می دهد و آنرا با دیتابیس شما عوض میکند بطوریکه ما کاربران از درک آن عاجز خواهیم بود. ( نکته  : زمانیکه دیتابیس باز است وقتی می خواهید عمل split انجام دهید حتما از بسته بودن اکسسی که share کردید اطمینان حاصل کنید چون باعث می شود درست کار نکند و زحماتتان به باد رود !!!  مخصوصا دستکارس در دیزاین آبجکت ها )



set-options-from-visual-basic










تریگر در اکسس ( ماکروهایی که اتومات اجرا می شوند )




Data Macro 


آپدیت فیلد اتومات در جدول 


after-insert-macro-event


Macro Action : 


The SetLocalVar action creates a temporary variable and set it to a specific value.


ایجاد متغیر موقت و تنظیم به مقدار مشخص


در Vba به TempVars مراجعه شود





Store Procedure در SQL


پروسیجور یا دستورالعمل ذخیره شده در Sql که می توان در هر جا مورد استفاده قرار داد.


در زیر پروسیجور SelectAllCustomers با پارامترهایی تعریف شده 



CREATE PROCEDURE SelectAllCustomers @City nvarchar(30), @PostalCode nvarchar(10)
AS
SELECT * FROM Customers WHERE City = @City AND PostalCode = @PostalCode
GO;

نحوه فراخوانی :

EXEC SelectAllCustomers City = "London", PostalCode = "WA1 1DP";

create_procedure


stored-procedure-in-sql


از لینک بالا کپی شد یک store procedure به نام GetCarDesx_Para که پارامتری بنام CID  را میگیرید و در Select کوئری که جوین شده است قرار داده و خروجی می دهد.


با دستور insert into داده ها را به فیلدهای ساخته شده (با Create table ) اضافه نموده.

SELECT * FROM Car;

Output:

StoredProcedureInSQL_1

ایجاد جدول CarDescription با Create Table و اضافه کردن داده به فیلدهای آن با دستور insert into


SELECT * FROM CarDescription;

Output:

StoredProcedureInSQL_2

در زیر store procedure با نام GetCarDesc تعریف شده و با EXEC فراخوانی شده مشخص است که این پروسیجور Description را بر اساس CarID در کنار فیلدهای جدول Car نمایش می دهد.


EXEC GetCarDesc;

Output:

StoredProcedureInSQL_3


در عبارت Sql زیر دو جدول را بهم جوین کرده یکی جدول کار با Alias یا مستعار C و دیگری CD بطوریکه داده ی  فیلد CarID این دو جدول با هم مطابقت داشته باشند ( اگه تکست باشه حتی یک space اضافی باعث عدم تطابق خواهد شد ، پس فقط رکوردهایی که دارای دو داده مشابه باشند می آید مثل A اشتراک B که مشترک ها خروجیست )  و در آخر گفته این پروسیجور پارامتر با فیلد CarID مورد تطابق قرار گیرد یعنی اگر پیدا کرد لیست کند در جدول 


CREATE PROCEDURE GetCarDesc_Para (@CID INT)

As

BEGIN

SET NOCOUNT ON

SELECT C.CarID,C.CarName,CD.CarDescription  FROM 

Car C

INNER JOIN CarDescription CD ON C.CarID=CD.CarID

WHERE C.CarID=@CID

END

To execute it :

EXEC GetCarDesc_Para 201;

Output:

StoredProcedureInSQL_4



Using Store Procedure In Access ( ADO )


calling-a-stored-procedure-with-a-command


You can use Access as a front-end application and then link to tables in a back-end server, such as SQL Server


لینک زیر : می توان از Access بعنوان یک برنامه front-end استفاده نمود و سپس پیوندی به جداول در سرور back-end مثل sql server زد.


create-a-pass-through-query


برای اجرای store procedure  ساخته شده می توان استفاده نمود لینک زیر داکیومنت آفیس

vba/api/access.docmd.openstoredprocedure



در کد زیر یک کوئری موقت یا Temporary در دیتابیس اکسس ایجادشده و بعد کانکت شده به sql و سپس اجرای store procedure یا دستورالعمل ذخیره شده در sql سرور


With db.CreateQueryDef("")
.Connect = db.TableDefs("ODBC;DATABASE=OurDB;UID=test1;PWD=password;DSN=OMBudget Prod SQL04;").Connect
.sql = "exec Update_UserPermissions 'Username', 'Department'"
.ReturnsRecords = False 'this will avoid error 3065
.Execute dbFailOnError
End With


البته connect بالا توصیه نمیشود چون اگر کسی بتواند اکسس شما را از جای دیگر هک کند با همین کانکت می تواند پسورد اس کیوال را تصرف نموده و تریگرها یا ساختار جداول را دستکاری یا حذف نماید.پس می توانید از شئ ADODB استفاده نمائید و کانکشن استرینگ بسازید آنرا Open کرده و کامند خود را اجرا کنید.


تعریف شی ارتباط ADO : 


برای ایجاد یک ارتباط باز به یک منبع داده استفاده می شود.که باید در محیط VBE اکسس DLL مربوطه تیک بخورد تا دسترسی به متدها یا ویژگیها برای کد نویسی راحتتر ،  ایجاد نماید.


The ADO Connection Object is used to create an open connection to a data source


connectionstring :


stConnect = "ODBC;DRIVER=SQL Server;SERVER=" & stServer & ";DATABASE=" & stDatabase & ";UID=" & stUsername & ";PWD=" & stPassword





Don’t forget the instance name!

When connecting to a SQL Server Express database, you must include the instance name along with the server name. For example, the default instance name when installing Express is “SQLExpress”, if you’re connecting to a server called “DEVServer” than the server portion of your connection string should be: “DEVServerSQLExpress”.