איך יוצרים שרשור טקסט באקסס
-
איך יוצרים שרשור טקסט באקסס?
אני מדבר על שרשור אנכי, בעצם סוג של שאילתת GROUP BY אבל במקום SUM לכתוב TEXTJOIN או משהו כזה.יש אפשרות לעשות את זה בשאילתה? או אולי יש אפשרות להעלות את הנתונים לאובייקט ולעבוד על זה בVBA טהור ואח"כ לכתוב בחזרה בטבלה?
הכיוון המעשי היחידי לפתרון שמצאתי לזה עד עכשיו הוא ליצור פונקציה עם משתנים סטטיים. זה עבד אבל לא היה שייך - לפעולה אחת של שרשור מטבלה הייתי צריך ליצור טבלה זמנית וכ11 שאילתות מקוננות...
-
@גגד לענ"ד הכי יעיל זה על ידי VBA כפי שציינת, לעבור על ה- RecordSet ולשרשר את ערכי השדה.
יש פונקציה מפורסמת שכתובה מזה שנים לצורך הזה, בשם ConcatRelated.
אמנם כאן יש מישהו שכתב אלגוריתם בשם DJoin, שיעיל יותר, בעיקר בקריאות מרובות כי הוא משתמש בקאשינג.
בכל מקרה, אני ממליץ לך להשתמש כמה שפחות בקריאות כגון אלו, כי הם בזבזניות, ולשמור טבלת עזר עם השדה המשורשר, ולבצע הכנסה והסרה לשדה המשורשר ישירות לפי הצורך. -
הוצרכתי להעלות רמה...
אני צריך לשרשר אנכית כנ"ל אבל בשאילתה רקורסיבית.
לדוגמה יש לי טבלה
מזהה, שם, אבא
1, אברהם,
2, יצחק, 1
3, יעקב, 2
4, ראובן, 3
4, שמעון, 3
5, לוי, 3
6, חנוך, 4
7, פלוא, 4
8, חצרון, 4
9, כרמי, 4ואני צריך תוצאה כזו בשאילתה:
אברהם אבא של יצחק אבא של יעקב אבא של (ראובן אבא של (חנוך, פלוא, חצרון, כרמי), שמעון, לוי)יש אפשרות מובנית או שצריך להמציא את הגלגל מהתחלה?
תודה רבה מראש!עריכה:
באמת השאלה נחלקת ל2.- איך לקבל את הסבא הראשון - שעל כל 9 השורות אוכל להציג את אברהם.
- ואיך לשרשר כמו שכתבתי - שיצא בשאילתה נתונים מקוננים (הסדר יוצא מעין קבצי JSON והשורות בשאילתה מחולקות לפי משתמש וכד').
תודה רבה!
-
לגבי השאלה הראשונה מצאתי את זה:
https://stackoverflow.com/questions/763016/is-it-possible-to-create-a-recursive-query-in-access/32161506#32161506שיפרתי את הקוד שכתוב שם.
אחרי הביצוע של
Add a reference to the Microsoft Scripting Runtime (Tools -> References...).
ושינוי שם מזהה ל'ID' ושינוי שם השדה המפנה לID האב ל 'ParentId'
זה עובד מצוין (כמובן כמו שהוא כתב - אם יש לולאה אין סופית זו עדיין בעיה).Public Function TreeRoot_Value(ID As Long, TableName As String, NameFieldForReturn As String) As Variant Dim Temp As Long Temp = TreeRoot(ID, TableName) If Temp <> 0 Then TreeRoot_Value = DLookup("[" & NameFieldForReturn & "]", "[" & TableName & "]", "[ID] = " & Temp) End Function Public Function TreeRoot(ID As Long, TableName As String) As Long If Not ifTableExists(TableName) Then Exit Function Dim dict As Scripting.Dictionary If dict Is Nothing Then Set dict = New Scripting.Dictionary ' Requires Microsoft Scripting Runtime Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset(TableName, dbOpenForwardOnly, dbReadOnly) Do Until rs.EOF dict.Add (rs!ID), (rs!ParentId) rs.MoveNext Loop Set rs = Nothing End If TreeRoot = ID Do While dict(TreeRoot) <> 0 ' Note: short version for dict.item(TreeRoot) TreeRoot = dict(TreeRoot) Loop End Function Private Function ifTableExists(TableName As String) As Boolean ifTableExists = DCount("[Name]", "MSysObjects", "[Name] = '" & TableName & "'") = 1 End Function
-
@גגד אמר באיך יוצרים שרשור טקסט באקסס:
ואני צריך תוצאה כזו בשאילתה:
אברהם אבא של יצחק אבא של יעקב אבא של (ראובן אבא של (חנוך, פלוא, חצרון, כרמי), שמעון, לוי)@גגד האם מדובר רק תוצאה אחת בלבד? כי מההמשך נראה שאתה צריך 9 תוצאות
אם מדובר על שורה אחת בלבד חשבתי ללכת על אופציה של שאילתה מסוימת שצריך לנסות לעבד אותה, ופשוט לשרשר את כל השאילתה מהתחלה לסוף לטקסט.
-
-
-
-