ورود

View Full Version : آموزش: کپی فیلد multi-valued به جدول دیگر



mazoolagh
چهارشنبه 11 مهر 1403, 13:54 عصر
این تاپیک به نوعی در تکمیل تاپیک زیر هست:
append کردن اطلاعات فیلدهای مشترک دو جدول متفاوت با کد (barnamenevis.org) (https://barnamenevis.org/showthread.php?589637-append-%DA%A9%D8%B1%D8%AF%D9%86-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D9%81%DB%8C%D9%84%D8%AF%D9%87%D8%A7%DB%8C-%D9%85%D8%B4%D8%AA%D8%B1%DA%A9-%D8%AF%D9%88-%D8%AC%D8%AF%D9%88%D9%84-%D9%85%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A8%D8%A7-%DA%A9%D8%AF)
که در اونجا به طور مفصل در مورد چگونگی اضافه کردن رکوردهای جدید (غیرتکراری) از جدول(های) دیگه
به یک جدول مرجع بحث شده و خوندنش پیشنهاد میشه.

فیلد multivalued چیزی هست که حتما باید ازاون دوری کنین!
بجاش از جدول های مرتبط استفاده کنین و برای یک اینترفیس فریبنده،
که خیلی راحت با روشهای متعارف قابل ساخت هست،
خودتون رو به دردسر نندازین.

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

mazoolagh
چهارشنبه 11 مهر 1403, 14:11 عصر
یک جدول Students رو در نظر بگیرین
که یک فیلد به نام Courses از نوع multivalued داره:

156143

هدف این هست که دیتا این جدول به یک جدول خالی Students_New با ساختار یکسان کپی بشه.

در حالت عادی کافی هست یک کوئری ساده مثل این رو اجرا کنیم:
INSERT INTO Students_New ( StudentID, FullName, Courses )
SELECT StudentID, FullName, Courses
FROM Students

که اینجا نمیشه :

An INSERT INTO query cannot contain a multi-valued field
156144

دلیلش این هست که فیلد multi-valued در واقع یک جدول هست،
پس ناچار هستیم به همین شکل با اون رفتار کنیم.

mazoolagh
چهارشنبه 11 مهر 1403, 14:22 عصر
به همین رو ناچار از رکوردست و VBA کمک میگیریم،
که دست ما رو برای هر نوع عملیات پیچیده باز نگه میداره:

Option Compare Database
Option Explicit


Sub Export()
Dim DBS As Database
Set DBS = CurrentDb
Dim rsS As Recordset
Dim rsSN As Recordset
Dim rsMVS As Recordset2
Dim rsMVSN As Recordset2
Set rsS = DBS.OpenRecordset("Students", dbOpenForwardOnly, dbReadOnly)
Set rsSN = DBS.OpenRecordset("Students_New", , dbAppendOnly)
Dim i As Integer
Do Until rsS.EOF
Set rsMVS = rsS("Courses").Value
rsSN.AddNew
rsSN("StudentID") = rsS("StudentID")
rsSN("FullName") = rsS("FullName")
Set rsMVSN = rsSN("Courses").Value
Do Until rsMVS.EOF
rsMVSN.AddNew
rsMVSN("Value") = rsMVS("Value")
rsMVSN.Update
rsMVS.MoveNext
Loop
rsSN.Update
Debug.Print rsS(0)
DoEvents
rsS.MoveNext
Loop

rsS.Close
rsSN.Close
Set rsS = Nothing
Set rsSN = Nothing
Set rsMVS = Nothing
Set rsMVSN = Nothing
Set DBS = Nothing


End Sub

اینجا فقط به چگونگی کپی دیتا این نوع فیلد پرداخته شد،
برای مباحث فرعی از قبیل :
تشخیص یکی بود فیلدها و ساختار اونها
و زمانی که ساختار جدول مبدا و مقصد یک نباشه و ...
در همون تاپیک مورد اشاره در پست شماره یک ادامه بدین.

mazoolagh
چهارشنبه 11 مهر 1403, 14:30 عصر
دیتابیس نمونه

moustafa
چهارشنبه 11 مهر 1403, 20:43 عصر
به همین رو ناچار از رکوردست و VBA کمک میگیریم،
که دست ما رو برای هر نوع عملیات پیچیده باز نگه میداره:

Option Compare Database
Option Explicit


Sub Export()
Dim DBS As Database
Set DBS = CurrentDb
Dim rsS As Recordset
Dim rsSN As Recordset
Dim rsMVS As Recordset2
Dim rsMVSN As Recordset2
Set rsS = DBS.OpenRecordset("Students", dbOpenForwardOnly, dbReadOnly)
Set rsSN = DBS.OpenRecordset("Students_New", , dbAppendOnly)
Dim i As Integer
Do Until rsS.EOF
Set rsMVS = rsS("Courses").Value
rsSN.AddNew
rsSN("StudentID") = rsS("StudentID")
rsSN("FullName") = rsS("FullName")
Set rsMVSN = rsSN("Courses").Value
Do Until rsMVS.EOF
rsMVSN.AddNew
rsMVSN("Value") = rsMVS("Value")
rsMVSN.Update
rsMVS.MoveNext
Loop
rsSN.Update
Debug.Print rsS(0)
DoEvents
rsS.MoveNext
Loop

rsS.Close
rsSN.Close
Set rsS = Nothing
Set rsSN = Nothing
Set rsMVS = Nothing
Set rsMVSN = Nothing
Set DBS = Nothing


End Sub

اینجا فقط به چگونگی کپی دیتا این نوع فیلد پرداخته شد،
برای مباحث فرعی از قبیل :
تشخیص یکی بود فیلدها و ساختار اونها
و زمانی که ساختار جدول مبدا و مقصد یک نباشه و ...
در همون تاپیک مورد اشاره در پست شماره یک ادامه بدین.

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

moustafa
چهارشنبه 11 مهر 1403, 20:45 عصر
استاد فرقRecordset باRecordset2در چیه ؟

mazoolagh
پنج شنبه 12 مهر 1403, 17:57 عصر
فرقRecordset باRecordset2در چیه ؟

اینجا هیچی - فقط برای تحریک حس کنجکاوی خواننده و بررسی میزان دقت در مطلب آوردم،
میتونستیم برای این کد همه رکوردست ها رو از همون نوع recordset تعریف کنیم و مشکلی هم پیش نمیومد.

ولی در واقع recordset2 یک فرق با recordset داره
که داشتن یک پراپرتی دیگه به نام ParentRecodset هست:

156146


156147
یعنی اگر رکوردست شما value یک فیلد complex مثل multi-valued یا attachment باشه،
و ما در کد نیاز به کار روی parentrecordset اون (وقتی که این recordset2 باز هست) داریم،
باید از این نوع استفاده کنیم - وگرنه نیازی نیست.

برای کار با فیلدهای attachment (اون ها هم complex هستن ولی فیلدهای بیشتری نسبت به multi-valued دارن)
میتونین تاپیک زیر ببینین:

سوال: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form) (barnamenevis.org) (https://barnamenevis.org/showthread.php?539924-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%81%D8%B1%D9%85-%D9%85%D9%86%D9%88-%D8%A7%D8%B5%D9%84%DB%8C-%D9%BE%D9%88%DB%8C%D8%A7-%D8%AF%D8%B1-%D8%A7%DA%A9%D8%B3%D8%B3-(Dynamic-Form))