یک عدد صحیح را برمی گرداند که نشان دهنده شماره فایل بعدی موجود برای استفاده توسط عبارت Open است.
FreeFile [ (rangenumber) ]
آرگومان اختیاری rangenumber متغیری است که محدوده از جائیکه شماره فایل آزادبعدی بازگشت داده می شود را مشخص می نماید. 0 را ( پیش فرض ) برای بازگشت شماره فایل در محدوده 1 و 255 ، 1را برای بازگشت شماره فایل در محدوده 256 و 511 مشخص کنید.
اجازه می دهد سیستم شماره ای برای فایل بعدی که باز میشود را رزرو نماید.( تحت Vba )
کد زیر در پنج فایل تکست لوپ میزند و رشته ی This is a sample را در هر کدام از آنها می نویسد.
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
'SetDlgItemTextA : Sets 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
برنامه ها توابع را از Windowse User برای اجرای عملیاتی مثل ایجاد یا مدیریت پنجره ها ، دریافت پیام های پنجره ( که کاربر وارد می کند مثل رویدادهای کیبورد و ماوس ، اما همچنین اعلان هایی از سیستم عملیاتی ) ، مشاهده متن در یک پنجره و مشاهده جعبه های پیام فراخوانی می نمایند.
Sub StopClock() KillTimer 0, lTimerID lTimerID = 0 End Sub
'DECIMAL :1×16^(2)+1×16^(1)+3×16^(0)=275
'HEXADECIMAL : &H113
case WM_TIMER '&H113Right-Click در سنتر :
void mouse_event( [in] DWORD dwFlags, [in] DWORD dx, [in] DWORD dy, [in] DWORD dwData, [in] ULONG_PTR dwExtraInfo );
dwFlags :
MOUSEEVENTF_RIGHTUP=&H10
تنظیم موقعیت کرسر در وسط صفحه :
SendInput Function : "User32.Dll"
Private Declare PtrSafe Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length AsLongPtr)
Private Declare PtrSafe Function SendInput Lib "user32" (ByVal nInputs As LongPtr, pInputs As Any, ByVal cbSize As LongPtr) As LongPtr
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
Maybe Comm=FreeFile Used
Occurs when the user rolls the mouse wheel in Form view, Split Form view, Datasheet view, Layout view, PivotChart view, or PivotTable view.
زمانی اتفاق می افتد که کاربر غلطک ماوس را می گرداند در حالت نمایش فرم هایی که قید کرده.
expression.MouseWheel (Page, Count)
برای پیمایش در رکوردها در فرم با غلطک ماوس از پارامتر Count این رویداد و اکشن GotoRecord استفاده کنید برای تحت فشار قراردادن کاربر برای ذخیره کردن دیتا قبل از پیمایش از not Me.Dirty استفاده کنید.
پارامتر Count شماره لیست های که در Scroll view می بینید ( یعنی 200 رکورد در فرم کانتینیوس دارید ولی هر بار که غلطک را می گردانید آن تعداد که قابل view ی شما است را برمی گرداند فرضا شما در کنترل Scroll بعد از رولیدن یا چرخاندن 20 رکورد می بینید Count را 20 به شما می دهد و پارامتر Page هم Page Number ).
استفاده از پارامتر Count و اکشن GotoRecord
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 Function
MouseWheel ( Page , Count ) در اکسس
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 ) ) استفاده بنمائید.
لطفا نظرسنجی فراموش نشود
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 آن تغییر نماید.
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)
برای ساب کلاس کردن پنجره در 32 بیت :
Paint
event and write code to rotate the text.این رویداد زمانی رخ می دهد که کاربر مقداری در قسمت تکست باکس کمبو باکس وارد نماید و آن در لیست کمبو باکس نباشد.
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 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
برای عدم نمایش پیغام ها مبنی بر اضافه کردن به جدول یا از این کار مطمئنید از دستورات اکشن کوئری مثل SetWarnings استفاده کنید و آنرا خاموش یا Off کنید یا به False تنظیم کنید.
مطالب با توجه به جستجوی عبارات قرار داده خواهد شد
در تصویر زیر پراپرتی شیت کمبو باکس تب دیتا نمایش داده شده که RowSource تایپی است گزینه های خودتون و از جدول گرفته نشده و در این موارد RowSourceType باید Value List انتخاب شود وگرنه با خطا مواجه می شوید ویژگی limit to list نیز روی No تنظیم شده پس خطای NotInList ندارید و List Edits نیز روی No است که نمی توانید مقادیر لیست باکس کمبو باکس را ویرایش کنید .
لطفا نظر سنجی فراموش نشود
فیلد با تایپ Yes/No ایجاد کرده اید و می خواهید بصورت چک باکس ( acCheckBox ) یا کمبو باکس ( acComboBox ) نمایش داده شود، لذا از این ویژگی مربوطه در نمای دیزای استفاده می کنید .
CurrentDb
TableDefs
Fields
Properties
در نمای دیزاین جدول در فیلدها حتی با دیتا تایپ Attachment ، پراپرتی بنام Caption وجود دارد لذا نام فارسی را در آن قرار دهید تا سرستون ها به فارسی نمایش داده شود و از نامگذاری نام فیلد به فارسی جدا خودداری نمائید چون اکسس یونیکد فارسی را پشتیبانی نمی کند و به مشکل برخواهید خورد حتی هنگام باز کردن فرم. در کوئری هم از فارسی نوشتن نام فیلد یا ستون ها پرهیز کنید اگر مشاهده کنید آنجا هم پراپرتی شیت و ویژگی Caption برای نوشتن به فارسی وجود دارد.
لطفا نظرسنجی فراموش نشود
در زیر کلاس ماژول 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 در فیلدهای تکست مقدار دهید.لینک زیر تعداد را به تفصیل بیان می کند.
دوستان لطف کنید در نظر سنجی که در منوی باز شو وجو دارد شرکت کنید.
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 پرهیز کنید.
برای باز شدن فایلی چه اکسل چه اکسس چه عکس از 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.Flushstream.Read(3) 'skip BOMstream.Position = 0 stream.Type = 1 'binary utfStr = stream.Readstream.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 بارگزای فایل مشخص شده از دیسک
خطاهای زیادی وجود دارد ولی متداول ترینش ذکر شده و بسیار است در صورت تجربه خطاهای دیگر با ذکر مثال و رفعش در زیر مطلب نظر کامنت بگذارید.
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)
برای رفع خطا یک 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 ) مجاز نیستند !
لطفا دوستان نظر سنجی فراموش نشود !!! در منوی باز شو موجوده متشکرم.
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 قابل مشاهده نیست.
The following code example darkens the BackColor property by 75%.
مثال زیر تیرگی 75 درصدی ویژگی BackColor است.
Me.ctl.BackShade=25
ساخت تریگری که بعد از ویرایش فیلد 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 یا 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 بودن تعداد رکوردهای اضافه ، آپدیت یا حذف شده را نمایش خواهد داد.
مثلا در اکسس برای گرفتن تعداد رکوردهایی که حاصل موفقیت آمیز اکشن کوئری ها هستند از ویژ گی زیر استفاده می شود البته به موضوع تریگر ربطی ندارد ولی برای فراگیران اکسس مطلب جالبی است.
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 SQL, data 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 دسترسی شما به دستکاری ساختار پایگاه داده را فراهم می سازد.
پایگاه های داده در اکسس از چهار شئ تشکیل شده : جداول ، پرس و جو ها ، فرم و گزارشات . این اشیاء با هم به شما اجازه می دهند تا داده های خود را هر طور که می خواهید وارد ، ذخیره ، تجزیه و تحلیل و جمع آوری کنید.
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:
بخاطر اینکه شئ AccessObject متعلق است به یک شئ موجود لذا نمی توان شئ های AccessObject جدید ساخت یا آنرا حذف کرد.برای ارجاع به یک شئ AccessObject در یک مجموعه با شماره ترتیبی یا تنظیم ویژگی Name خودش از شکل های نوشتاری که در بالا اشاره شد استفاده شود.
مطالب بر اساس آنچه جستجو و به این بلاگ ختم شده بیان خواهد شد
دوستان لطفا در نظر سنجی که در منوی باز شو وجود دارد شرکت نمائید
لینک زیر داکیومنت آفیس برای تغییر نام آبجکت ها در دیتابیس اکسس CopyObject هم برای کپی کردن.
office/vba/api/access.docmd.rename
expression.Rename (NewName, ObjectType, OldName)
سه آرگومان دارد اولی نام جدید دومی نام آبجکت با پیشوند ac مثل acForm یا acTable و سومی نام قدیمی شئ مورد نظر
کپی آبجکت مورد نظر از یک دیتابیس به دیتابیس دیگر با اکشن کپی آبجکت در ویژوال بیسیک.
expression.CopyObject (DestinationDatabase, NewName, SourceObjectType, SourceObjectName)
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 (ObjectType, ObjectName, InNavigationPane)
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 است.
داکیومنت آفیس را مطالعه، لذت برده و با دوستانتان به اشتراک بگذارید.
دوستان اکسسی عزیز لطفا در نظر سنجی که در منوی بازشو است شرکت کرده و در صورت لزوم در زیر هر مطلب پیامتان را در ج کنید
اگر چک باکس باشد از 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 کردید اطمینان حاصل کنید چون باعث می شود درست کار نکند و زحماتتان به باد رود !!! مخصوصا دستکارس در دیزاین آبجکت ها )
Data Macro
آپدیت فیلد اتومات در جدول
Macro Action :
The SetLocalVar action creates a temporary variable and set it to a specific value.
ایجاد متغیر موقت و تنظیم به مقدار مشخص
در Vba به TempVars مراجعه شود
پروسیجور یا دستورالعمل ذخیره شده در Sql که می توان در هر جا مورد استفاده قرار داد.
در زیر پروسیجور SelectAllCustomers با پارامترهایی تعریف شده
از لینک بالا کپی شد یک store procedure به نام GetCarDesx_Para که پارامتری بنام CID را میگیرید و در Select کوئری که جوین شده است قرار داده و خروجی می دهد.
با دستور insert into داده ها را به فیلدهای ساخته شده (با Create table ) اضافه نموده.
SELECT * FROM Car;
ایجاد جدول CarDescription با Create Table و اضافه کردن داده به فیلدهای آن با دستور insert into
SELECT * FROM CarDescription;
در زیر store procedure با نام GetCarDesc تعریف شده و با EXEC فراخوانی شده مشخص است که این پروسیجور Description را بر اساس CarID در کنار فیلدهای جدول Car نمایش می دهد.
EXEC GetCarDesc;
در عبارت 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;
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 زد.
برای اجرای 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”.