دمج الصفوف/سلسلة الصفوف
-
01-07-2019 - |
سؤال
أنا أبحث عن 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
بمجرد حصولك على هذه المصفوفة (ستكون ثنائية الأبعاد)، يمكنك معالجتها لاستخراج "العمود" الذي ستحتاج إليه.قد تكون هناك طريقة ذكية لاستخراج مصفوفة ذات بعد واحد من هذا، بحيث يمكنك بعد ذلك استخدام تعليمات "الانضمام" لتسلسل كل قيمة مصفوفة في سلسلة واحدة.