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

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

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

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

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

رویداد 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 ) مجاز نیستند ! 










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










تبدیل پیکسل به پونیت و پوینت به اینج




1 PX = 0.75 PT

12 PX = 9 PT 


یک پوینت برابر یک هفتاد و دوم اینچ است اگر با توابعی مختصات   Screen را بدست آوردید ( به پیکسل ) به pt تبدیل و برای تبدیل به اینچ از روش زیر استفاده کنید.


One point is equal to 1/72 of an inch


Note that all dimensions retrieved by GetSystemMetrics are in pixels.


GetSystemMetrics nIndex  '  Lib "User32" 

SM_CXSCREEN=0   عرض  به پیکسل در 0.0104  به اینج

SM_CYSCREEN=1  ارتفاع به پیکسل در  0.0104  به اینچ 



(1÷72)×0.75=0.0104166667

12px × 0.0104166667=0.125 in

0.125 in × 25.4 = 3.175 mm

0.125 in × 2.54 = 0.3175 cm


پس یک پیکسل حدودا برابر با 0.0104 اینچ و 0.264 میلیمتر است.









ایجاد سایه در رنگ 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