PDA

View Full Version : سوال: ادغام چند رکورد با فرمت تکست



majid_labbeiky
چهارشنبه 19 اردیبهشت 1397, 10:17 صبح
با سلام خدمت دوستان عزیز

چطور میتونم چند رکورد رو که فرمت تکست داره با هم ادغام کنم؟؟

توی فایل پیوست

توی کوئری گروپ کردم . میخوام مقادیری که توی یه کارتن هست رو در یک ردیف جلو کارتن قرار بده
148130

میخوام به این صورت تبدیل بشه
148131

mazoolagh
پنج شنبه 20 اردیبهشت 1397, 07:46 صبح
اول باید یک تابع پابلیک بنویسین که شماره کارتن رو دریافت کنه و لیست پیوسته رو برگردونه
بعد در همون کوئری که روی شماره کارتن گروه بندی کردین از این تابع استفاده کنین

majid_labbeiky
چهارشنبه 26 اردیبهشت 1397, 12:25 عصر
ببخشید امکانش هست روی فایل پیوست زحمتشو بکشین؟

mazoolagh
شنبه 29 اردیبهشت 1397, 12:03 عصر
چند مورد در فایل پیوستی هست که باید اصلاح کنین:
1- اسامی فیلدها رو فارسی انتخاب کردین - اینکار بعدها و بخصوص در کدنویسی باعث دردسر میشه.
اسامی باید حتما با حروف انگلیسی باشه بجاش میتونین از caption استفاده کنین.
2- تمام فیلدها از نوع string هست. مقادیر عددی باید رو باید در فیلد عدد ذخیره کنین.
3- فیلدهایی مثل شماره کارتن که بعدها باهاش کارهایی مثل گروهبندی و سورت دارین باید ایندکس بشن.
4- برای یک سری از کارها مثل همین موردی که اینجا هست از فیلد calculated استفاده کنین.
جدول اصلاح شده اینجوری میشه:
148202
یک فیلد calculated به اسم ItemX اضافه کردم که در محاسبات بعدی راحتتر باشیم.
دقت کنید چون فرمت بندی استفاده میکنیم نوع فیلد باید حتما LONG TEXT و فرمت اون هم RICH TEXT باشه.
148203

با این حساب جدول شما اینجوری میشه:

148204

اگر دقت کنین نام کالا به رنگ قرمز و توپر هست تا بعدا که محتویات کنار هم میاد نتیجه خوانا باشه.
شما میتونین سلیقه خودتون رو بکار ببرین یا کلا فرمت بندی رو حذف کنین.

mazoolagh
شنبه 29 اردیبهشت 1397, 12:11 عصر
حالا میریم سروقت کد - یک ماجول بسازین و این کد رو درش کپی کنین:
Option Compare Database
Option Explicit
Dim RS As Recordset
Public Function BoxItems(ByVal BoxNumber As Long, _
Optional ByVal Separator As String = " / ") As String
On Error GoTo Error_Handler
Set RS = CurrentDb.OpenRecordset("SELECT ItemX FROM Boxes WHERE BoxNumber=" & BoxNumber)
If RS.EOF Then
BoxItems = ""
Else
BoxItems = RS(0)
RS.MoveNext
Do While Not RS.EOF
BoxItems = BoxItems + Separator + RS(0)
RS.MoveNext
Loop
End If
Exit Function
Error_Handler:
BoxNumber = "Error " & Err.Number & " : " & Err.Description
End Function


کد نکته خاصی نداره. تابع
BoxItems شماره کارتن رو میگیره و یک لیست پیوسته از محتویات اون میسازه.
فقط یک پارامتر اختیاری داریم که میتونین بعنوان جداکننده مقادیر ازش استفاده کنین.
بصورت پیشفرض از / استفاده کردیم.

mazoolagh
شنبه 29 اردیبهشت 1397, 12:17 عصر
حالا یک کوئری میسازیم و نتیجه رو تست میکنیم:
148205
در اینجا هم فیلدItemsAll رو از نوع LONG TEXT و با فرمت RICH TEXT انتخاب میکنیم.

و این هم نتیجه نهایی:
148206

mazoolagh
شنبه 29 اردیبهشت 1397, 12:37 عصر
در نهایت یک نکته لازم هست گفته بشه:
عملیات از این دست اگر تعداد رکوردها کم باشه و گزارش ها هم با فاصله زمانی زیاد نیاز باشه چندان مهم نیست وگرنه زمان محاسبه سربار زیادی داره.
اگر اینجور باشه باید تمام عملیات هنگام ورود دیتا انجام بشه تا گزارش ها سریع ساخته بشن.

Mehr@ban
شنبه 29 اردیبهشت 1397, 17:46 عصر
واقعا باید تشکر کرد از شما
توضیحات کامل همراه با جزییات دقیق!

علاوه بر کمک به سرانجام رسیدن درخواست شروع کننده تاپیک، کلی مطالب دیگه هم آموزش داده میشه!
خداقوت