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

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

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

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

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

تابعی برای جمع آوری مقدار از رکوردست






Field2.IsComplex DAO.Property :

مقدار True(عددی غیر صفر) یا False(برابرصفر) را که نشان دهنده وجود یک دیتا تایپ چند مقداری است را باز می گرداند.... ( multi-valued data type )


Null=No Valid Data

named-argument


Join:

اگرExpression خالی باشد Set Result=Null

Static Values As New Collection

Set Records=CurrentDb.OpenRecordSet....

(dbOpenSnapShot)

CollValues Records , Delimiter , Result

Values.Add Result

Join=Result




CollValues:


ByRef Rec As DAO.RecordSet

ByRef Delimiter

ByRef Result





Dim SubRec As DAO.RecordSet

Dim Value As Variant

'If Rec.RecordCount>0 Then

While Not Rec.EOF

      Value=Rec.Field(0).Value

          If Rec.Fields(0).IsComplex Then

                 Set SubRec=Rec.Fields(0).Value

                 CollValues SubRec , Delimiter , Result

         ElseIf Nz(Value)="" Then

         ElseIf IsEmpty(Result)

              Result=Value

         Else

              Result=Result & Delimiter & Value

         End If

Rec.MoveNext

Wend

'Else

'Result=Null

'End If



















Expression,Domain,Criteria : 

Const SqlMask As String = "Select {0} From {1} {2}"
Const SqlLead As String = "Select "
Const SubMask As String = "({0}) As T"

Const FilterMask As String = "Where {0}"

Dim Sql As String
Dim SqlSub As String
Dim Filter As String


اگر Expression خالی باشد باید فکر چاره ای باشید و همینطور آرگومان های بعدی


اگر Select را در Domain( که نام جدول یا کوئری و یا زبان اس کیو ال ممکن است داخلش نوشته شده باشد ) یافت نتیجتا Domain یک عبارت اس کیو ال است.
If InStr(1, LTrim(Domain), SqlLead, vbTextCompare) = 1 Then 

در اینجا اگر در آرگومان Domain عبارت Select را بیابد متغیر SqlSub می شود جایگزین کردن Domain با {0}

SqlSub = Replace(SubMask, "{0}", Domain)
Else

در غیر اینصورت Domain نام جدول یا کوئری است.

SqlSub = Domain

End If
اگر آرگومان Criteria پر باشد 
If Trim(Criteria) <> "" Then 
ساخت یک شرط را خواهیم داشت . که عبارت داخل Criteria را بجای {0} در FilterMask قرار خواهد داد.
Filter = Replace(FilterMask, "{0}", Criteria)
End If 
حالا ساخت نهایی Sql که باتابع Replace تودرتو یا Nested Replace انجام گرفته و اگر اشتباهی در نوشتار نداشته باشیم خروجی یک عبارت Sql درست خواهد بود.
Sql = Replace(Replace(Replace(SqlMask, "{0}", Expression), "{1}", SqlSub), "{2}", Filter) 

یعنی درواقع در Replace های بالا جای ۲ ۱ ۰ عبارت یا رشته هایی که داخل آرگومان ها هستند  قرار داده شدِس.


Example : 


Expression="[First Name] & ' ' & [Last Name] & '<' & [Email Address] & '>'"

Domain="Tbl1"

Criteria="[Job]='" & [Job] & "'"


Change To Sql :


"Select [First Name] & ' ' [Last Name] & '<' & [Email Address] & '>' From Tbl1 Where [Job]=' & [Job] & '"



با قرار دادن Optional قبل از آرگومان ها می شود آنها را در تابع اختیاری کرد نه اجباری ( Required ).



وقتی دیتا تایپ فیلدی عددی نیست مثل نام بای  از تک کوتیشن بین آنها استفاده کنیم : 

"FirstName='" & Variable1 & "'"

اگر بنویسید :

"FirstName=" & Variable1 & ""

قطعا دچار خطا خواهید شد ، برای دیتا تایپ عددی نیازی به قرار دادن تک کوتیشن ها ندارید.