سؤال

أنا أبحث عن Access 2007 المكافئ لوظيفة COALESCE الخاصة بـ SQL Server.

في SQL Server يمكنك القيام بشيء مثل:

شخص

John
Steve
Richard

SQL

DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = COALESCE(@PersonList + ',','') + Person
FROM PersonTable

PRINT @PersonList

الذي ينتج:جون، ستيف، ريتشارد

أريد أن أفعل نفس الشيء ولكن في Access 2007.

هل يعرف أحد كيفية دمج صفوف مثل هذه في Access 2007؟

هل كانت مفيدة؟

المحلول

فيما يلي نموذج للوظيفة المحددة من قبل المستخدم (UDF) والاستخدام المحتمل.

وظيفة:

Function Coalsce(strSQL As String, strDelim, ParamArray NameList() As Variant)
Dim db As Database
Dim rs As DAO.Recordset
Dim strList As String

    Set db = CurrentDb

    If strSQL <> "" Then
        Set rs = db.OpenRecordset(strSQL)

        Do While Not rs.EOF
            strList = strList & strDelim & rs.Fields(0)
            rs.MoveNext
        Loop

        strList = Mid(strList, Len(strDelim))
    Else

        strList = Join(NameList, strDelim)
    End If

    Coalsce = strList

End Function

الاستخدام:

SELECT documents.MembersOnly, 
    Coalsce("SELECT FName From Persons WHERE Member=True",":") AS Who, 
    Coalsce("",":","Mary","Joe","Pat?") AS Others
FROM documents;

نسخة ADO، مستوحاة من تعليق onedaywhen

Function ConcatADO(strSQL As String, strColDelim, strRowDelim, ParamArray NameList() As Variant)
   Dim rs As New ADODB.Recordset
   Dim strList As String

   On Error GoTo Proc_Err

       If strSQL <> "" Then
           rs.Open strSQL, CurrentProject.Connection
           strList = rs.GetString(, , strColDelim, strRowDelim)
           strList = Mid(strList, 1, Len(strList) - Len(strRowDelim))
       Else
           strList = Join(NameList, strColDelim)
       End If

       ConcatADO = strList

   Exit Function

   Proc_Err:
       ConcatADO = "***" & UCase(Err.Description)
   End Function

من: http://wiki.lessthandot.com/index.php/Concatenate_a_List_into_a_Single_Field_%28Column%29

نصائح أخرى

أعتقد أن Nz هو ما تبحث عنه، وهو بناء الجملة Nz(variant, [if null value]).إليكم رابط التوثيق: وظيفة نيوزيلندي

---Person--- 
John
Steve
Richard

DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = Nz(@PersonList + ',','') + Person
FROM PersonTable

PRINT @PersonList

على الرغم من أن Nz يقوم بشيء مشابه لـ COALESCE، إلا أنه لا يمكنك استخدامه في Access للقيام بالعملية التي تقوم بها.ليس COALESCE هو الذي يقوم ببناء قائمة قيم الصفوف، بل هو التسلسل في متغير.

لسوء الحظ، هذا غير ممكن داخل استعلام Access الذي يجب أن يكون عبارة SQL واحدة وحيث لا توجد وسيلة للإعلان عن متغير.

أعتقد أنك ستحتاج إلى إنشاء وظيفة من شأنها فتح مجموعة نتائج، والتكرار عليها وتسلسل قيم الصف في سلسلة.

لدمج الصفوف في Access، ربما ستحتاج إلى تعليمات برمجية تبدو كالتالي:

Public Function Coalesce(pstrTableName As String, pstrFieldName As String)

Dim rst As DAO.Recordset
Dim str As String

    Set rst = CurrentDb.OpenRecordset(pstrTableName)
    Do While rst.EOF = False
        If Len(str) = 0 Then
            str = rst(pstrFieldName)
        Else
            str = str & "," & rst(pstrFieldName)
        End If
        rst.MoveNext
    Loop

    Coalesce = str

End Function

ستحتاج إلى إضافة تعليمات برمجية لمعالجة الأخطاء وتنظيف مجموعة السجلات الخاصة بك، وسيتغير هذا قليلاً إذا كنت تستخدم ADO بدلاً من DAO، ولكن الفكرة العامة هي نفسها.

أفهم هنا أن لديك جدول "شخص" يحتوي على 3 سجلات.لا يوجد شيء مشابه لما تصفه في Access.

في الوصول "القياسي" (مجموعة سجلات DAO)، سيتعين عليك فتح مجموعة سجلات واستخدام طريقة getrows للحصول على بياناتك

Dim rs as DAO.recordset, _
    personList as String, _
    personArray() as variant

set rs = currentDb.open("Person")
set personArray = rs.getRows(rs.recordcount)

rs.close

بمجرد حصولك على هذه المصفوفة (ستكون ثنائية الأبعاد)، يمكنك معالجتها لاستخراج "العمود" الذي ستحتاج إليه.قد تكون هناك طريقة ذكية لاستخراج مصفوفة ذات بعد واحد من هذا، بحيث يمكنك بعد ذلك استخدام تعليمات "الانضمام" لتسلسل كل قيمة مصفوفة في سلسلة واحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top