PDA

View Full Version : انتقال رکوردهای حاوی فیلد Attachments



hamid-nice
یک شنبه 19 آبان 1392, 18:12 عصر
با سلام
همانطور که می دانیم Make Table Query ها فایلهای دارای فیلد های Multi value را ساپورت نمی کنند بنابراین نمی توان رکورد هایی که دارای فیلد های Attachment یا Yes/No را به این روش برای ایجاد یک کپی از جدول استفاده کرد
حال دوستان در صورتی که راهکاری برای این منظور دارند ارایه نمایند ممنون می شویم.
با تشکر

hamid-nice
یک شنبه 19 آبان 1392, 18:27 عصر
با سلام
یک نمونه ای در زیر ضمیمه کردم کهشاید مفید باشه
در ضمن لینکی از مایکروسافت برای آموزش این مساله در زیر گذاشتم فقط من متوجه نشدم که Issues.AssignedTo.Value را چطور ایجاد کرده اگه کسی متوجه شد لطفا بیان کنه
http://office.microsoft.com/en-us/access-help/using-multivalued-fields-in-queries-HA010149297.aspx
با تشکر

Abbas Amiri
یک شنبه 19 آبان 1392, 22:04 عصر
با سلام
یک نمونه ای در زیر ضمیمه کردم کهشاید مفید باشه
در ضمن لینکی از مایکروسافت برای آموزش این مساله در زیر گذاشتم فقط من متوجه نشدم که Issues.AssignedTo.Value را چطور ایجاد کرده اگه کسی متوجه شد لطفا بیان کنه
http://office.microsoft.com/en-us/access-help/using-multivalued-fields-in-queries-HA010149297.aspx
با تشکر

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


Function AppendRecordsWithAttach(SourceSQL As String, DestTable As String) As Boolean
Dim rsDest As Recordset2, rsSource As Recordset2
Dim fld As Field
Dim i As Integer
Set rsDest = CurrentDb.OpenRecordset(DestTable)
Set rsSource = CurrentDb.OpenRecordset(SourceSQL)
If rsDest.Fields.Count <> rsSource.Fields.Count Then
MsgBox "Source and destination Table's structure is different", vbCritical
Exit Function
End If
For i = 0 To rsSource.Fields.Count - 1
If rsSource.Fields(i).Type <> rsDest.Fields(i).Type Then
MsgBox "Source and destination Table's structure is different", vbCritical
Exit Function
End If
Next

With rsSource
.MoveLast: .MoveFirst
Do Until .EOF
rsDest.AddNew
For Each fld In .Fields
If fld.Type <> dbAttachment Then
rsDest.Fields(fld.Name) = .Fields(fld.Name)
Else
AppendAttachFields rsDest, rsSource, fld.Name
End If
Next
rsDest.Update
.MoveNext
Loop
End With
End Function

Private Function AppendAttachFields(rstDest As Recordset2, rstSource As Recordset2, fldAttachName As String)
On Error GoTo ErrAppendAttachments
Dim rsAttachDest As DAO.Recordset2, rsAttachSource As DAO.Recordset2
Dim frmName As String, fld As Field
Set rsAttachDest = rstDest.Fields(fldAttachName).Value
Set rsAttachSource = rstSource.Fields(fldAttachName).Value
On Error GoTo ErrAppendAttachments
If rsAttachSource.RecordCount Then rsAttachSource.MoveFirst
Do While Not rsAttachSource.EOF
rsAttachDest.AddNew
rsAttachDest.Fields("filedata") = rsAttachSource.Fields("filedata")
rsAttachDest.Fields("FileName") = rsAttachSource.Fields("FileName")
rsAttachDest.Update
rsAttachSource.MoveNext
Loop
ExitAppendAttachments:
Set rsAttachDest = Nothing
Set rsAttachDest = Nothing
Exit Function
ErrAppendAttachments:
MsgBox "ÎØÇí ÔãÇÑå " & Err.Number & vbCr & Err.Description
GoTo ExitAppendAttachments

End Function

hamid-nice
یک شنبه 19 آبان 1392, 22:31 عصر
با سلام و تشکر
برای لینکه بهتر متوجه شویم که این توابع چگونه باید استفاده کنیم لطفا در نمونه زیر موارد را اعمال فرمایید
با این توابع می شه کار append و Make table query انجام داد اگه ممکنه در فایل زیر نمونه درست کنید
با تشکر

Abbas Amiri
یک شنبه 19 آبان 1392, 22:42 عصر
با سلام و تشکر
برای لینکه بهتر متوجه شویم که این توابع چگونه باید استفاده کنیم لطفا در نمونه زیر موارد را اعمال فرمایید
با این توابع می شه کار append و Make table query انجام داد اگه ممکنه در فایل زیر نمونه درست کنید
با تشکر

تابع فوق در نمونه پست 2 آزمایش شد

hamid-nice
دوشنبه 20 آبان 1392, 00:05 صبح
با سلام و تشکر
واقعا کارت عالی بود ، دستت درد نکنه
برای تنها یک رکورد خاص چگونه عمل کنیم ؟ در واقع اگر بخواهیم شرطی کنیم هم با این تابع امکان دارد ؟
با تشکر فراوان

Abbas Amiri
سه شنبه 21 آبان 1392, 18:29 عصر
با سلام و تشکر
واقعا کارت عالی بود ، دستت درد نکنه
برای تنها یک رکورد خاص چگونه عمل کنیم ؟ در واقع اگر بخواهیم شرطی کنیم هم با این تابع امکان دارد ؟
با تشکر فراوان

همانطور که در پست 3 عرض کردم
برای Source از یک عبارت SELECT کوئری هم می توانید استفاده کنید می توانید انجام دهید.

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

hamid-nice
یک شنبه 26 آبان 1392, 14:53 عصر
با سلام
جناب استاد امیری عزیز
گاهی نیاز هست که در کوئری ها فیلدهای محاسباتی ایجاد کنیم و مخصوصا زمانی که تعداد این فیلده زیاد می شود مساله بشتر اهمیت پیدا می کند لذا نمی توان از Append استفاده کرد زیرا از یکسان نبودن ساختار کوئری و جدول مورد append شدن ایراد میگیره لذا خواهشمند ام که یک تابعی برای MakeTable Query ابداع فرمایید تا فیلد های Attachment را ساپورت نماید زیرا به مایکروسافت هم امیدی نیست:تشویق::چشمک:
با تشکر فراوان

Abbas Amiri
یک شنبه 26 آبان 1392, 18:17 عصر
با سلام
جناب استاد امیری عزیز
گاهی نیاز هست که در کوئری ها فیلدهای محاسباتی ایجاد کنیم و مخصوصا زمانی که تعداد این فیلده زیاد می شود مساله بشتر اهمیت پیدا می کند لذا نمی توان از Append استفاده کرد زیرا از یکسان نبودن ساختار کوئری و جدول مورد append شدن ایراد میگیره لذا خواهشمند ام که یک تابعی برای MakeTable Query ابداع فرمایید تا فیلد های Attachment را ساپورت نماید زیرا به مایکروسافت هم امیدی نیست:تشویق::چشمک:
با تشکر فراوان


در فایل پست 5 تغییراتی داده شد . اول اینکه محدودیت برابری تعداد فیلدها برداشته شد یعنی بیشتر نبودن تعداد فیلدهای منبع نسبت به مقصد مهم است
همچنین دو احتمال جهت فیلدهای منبع و مقصد درنظر گرفته شد :
1 - موقعیت فیلدها نظیر به نظیر باشد ولی نام فیلدها مهم نباشد .
2 - نام فیلدها یکسان باشد ولی مکان فیلدها مهم نباشد.

به همین جهت هنگام فراخوانی تابع AppendRecordsWithAttach به پارامتر سوم بایستی مقدار ByName و یا ByIndex داده شود

hamid-nice
دوشنبه 27 آبان 1392, 10:52 صبح
با سلام
جناب امیری عزیز هنوز نمی توان از آن به منظورMake Table Query استفاده نمود
اگر زحمت بکشید و آن را طوری تغییر دهید که علاوه بر دو مورد مهم افزوده شده فوق این مورد که تعداد فیلدها هم یکسان نباشد یعنی اگر در جدول 1 فیلدی باشد که در جدول2 نباشد هم ایراد از یکسان نبودن تعداد فیلدها نگیرد فکر کنم که تابع بسیار کاملتری حاصل شده و حتی به منظور Make table Query هم قابل بهره برداری شود (چرا که می توان برای ایجاد یک جدول در ابتدا با دستورات دیگری و سپس append کردن آنها به این مهم دست یافت )
در حال حاضر اگر تعداد فیلدهای جداول یکسان نباشد خطا می گیرد و بنابراین برای query هایی که فیلدهای محاسباتی دارند قابل استفاده نیست و این استفاده از این تابع را فعلا خیلی محدود نموده که انشالله با رفع مورد ذکر شده استفاده از این تابع به صورت فراگیرتری در خواهد آمد)
در ضمن در تابع فوق به جای ByIndex یا ByName چیزی باید نوشت یا خیر ؟
با سپاس فراوان

Abbas Amiri
سه شنبه 28 آبان 1392, 00:50 صبح
با سلام
جناب امیری عزیز هنوز نمی توان از آن به منظورMake Table Query استفاده نمود
اگر زحمت بکشید و آن را طوری تغییر دهید که علاوه بر دو مورد مهم افزوده شده فوق این مورد که تعداد فیلدها هم یکسان نباشد یعنی اگر در جدول 1 فیلدی باشد که در جدول2 نباشد هم ایراد از یکسان نبودن تعداد فیلدها نگیرد فکر کنم که تابع بسیار کاملتری حاصل شده و حتی به منظور Make table Query هم قابل بهره برداری شود (چرا که می توان برای ایجاد یک جدول در ابتدا با دستورات دیگری و سپس append کردن آنها به این مهم دست یافت )
در حال حاضر اگر تعداد فیلدهای جداول یکسان نباشد خطا می گیرد و بنابراین برای query هایی که فیلدهای محاسباتی دارند قابل استفاده نیست و این استفاده از این تابع را فعلا خیلی محدود نموده که انشالله با رفع مورد ذکر شده استفاده از این تابع به صورت فراگیرتری در خواهد آمد)
در ضمن در تابع فوق به جای ByIndex یا ByName چیزی باید نوشت یا خیر ؟
با سپاس فراوان

این هم فایل MakeTable :

hamid-nice
سه شنبه 28 آبان 1392, 12:49 عصر
این هم فایل MakeTable :
با سلام بسیار عالی انجام دادید و به این ترتیب پرونده Make Table را به خوبی بستید :کف::تشویق:
اما پرونده Append Query هنوز باز هست:خجالت:
تنها دو مساله دیگه هم به دست توانمند شما انجام شود که مساله خیلی عالی می شود
1- در فایل ضمیمه دو جدول به خاطر نداشتن فیلد یکسان قابل Append نیستند اگه بشه کاری کرد که به این مساله گیر ندهد و اونهایی را که یکسان هستند را فقط Append کنه مشکل حل است یا هر صورتی که شما صلاح می دانید
2- البته این شاید زمانگیر باشد ولی از آنجا که به توانایی شما ایمان داریم سوال را مطرح می کنم که : امکان انتخابی فیلدها باشد یعنی اگر بخواهیم فقط اطلاعات دو فیلد Append شود در حالی که اطلاعات قبلی یعنی جدول حذف نشود که دوباره ساخته شود بلکه به اطلاعات قبلی افزوده شود در ضمن اینکه به یکسان نبودن Index ها نیز گیر ندهد چرا که گاهی از فیلد primary key به فیلد با نام مشابه ولی قابل داشتن مقادیر تکراری Append می کنیم برای افزودن اطلاعات از جداول دیگر
خلاصه زحمت مایکروسافت افتاده گردنه شما:کف:
با تشکر فراوان

Abbas Amiri
سه شنبه 28 آبان 1392, 22:28 عصر
با سلام بسیار عالی انجام دادید و به این ترتیب پرونده Make Table را به خوبی بستید :کف::تشویق:
اما پرونده Append Query هنوز باز هست:خجالت:
تنها دو مساله دیگه هم به دست توانمند شما انجام شود که مساله خیلی عالی می شود
1- در فایل ضمیمه دو جدول به خاطر داشتن فیلد یکسان قابل Append نیستند اگه بشه کاری کرد که به این مساله گیر ندهد و اونهایی را که یکسان هستند را فقط Append کنه مشکل حل است یا هر صورتی که شما صلاح می دانید
2- البته این شاید زمانگیر باشد ولی از آنجا که به توانایی شما ایمان داریم سوال را مطرح می کنم که : امکان انتخابی فیلدها باشد یعنی اگر بخواهیم فقط اطلاعات دو فیلد Append شود در حالی که اطلاعات قبلی یعنی جدول حذف نشود که دوباره ساخته شود بلکه به اطلاعات قبلی افزوده شود در ضمن اینکه به یکسان نبودن Index ها نیز گیر ندهد چرا که گاهی از فیلد primary key به فیلد با نام مشابه ولی قابل داشتن مقادیر تکراری Append می کنیم برای افزودن اطلاعات از جداول دیگر
خلاصه زحمت مایکروسافت افتاده گردنه شما:کف:
با تشکر فراوان
نمونه پست 11 با تغییرات اندک که اضافه کردن آرگومان blnAppend است در ضمیمه درج شد . چنانچه مقدار این متغیر True باشد اطلاعات جدید اضافه خواهد شد.
نگران ایندکسها و PK نباشید . تنها ارث بری فیلدها نوع و سایز آنهاست

hamid-nice
سه شنبه 28 آبان 1392, 22:39 عصر
این مساله را نیز بسیار عالی حل نمودید
اما هنوز مساله یکسان نبودن تعداد فیلدها در دو جدول باقی مانده و در اینصورت خطا می گیرد
آیا امکان حل این مساله وجود دارد ؟
با تشکر

Abbas Amiri
سه شنبه 28 آبان 1392, 22:57 عصر
این مساله را نیز بسیار عالی حل نمودید
اما هنوز مساله یکسان نبودن تعداد فیلدها در دو جدول باقی مانده و در اینصورت خطا می گیرد
آیا امکان حل این مساله وجود دارد ؟
با تشکر

کاملا امکان پذیر است باید قسمت Append کردن فیلدها رو مشابه پست 9 و به روش ByIndex انجام دهید.

hamid-nice
سه شنبه 28 آبان 1392, 23:07 عصر
اگر منظورتان استفاده از همان ضمیمه پست 9 هست که نمی شود زیرا وقتی تعداد فیلد جدول 1 بیشتر باشد پیغام زیر رامیدهد
The number if field in the source greater than target
hگر منظورتان استفاده از پست آخر است که قسمت Index حزف شده است
به هرحال متوجه نشدم لطفا تابع یا نمونه یا توضیح بیشتری بفرمایید
با تشکر

Abbas Amiri
سه شنبه 28 آبان 1392, 23:13 عصر
اگر منظورتان استفاده از همان ضمیمه پست 9 هست که نمی شود زیرا وقتی تعداد فیلد جدول 1 بیشتر باشد پیغام زیر رامیدهد
The number if field in the source greater than target

درسته که بابرنامه نویسی خیلی کارها میشود کرد ولی درجایی که نسبت به روش دستی کار سریعتر و راحت تر انجام شود .
برای منظور شما جدول مورد نظر را با حداکثر فیلدهای مورد نیاز بسازید و بعد از همان روش ByIndex استفاده کنید نباید مشکلی بوجود بیاید

hamid-nice
سه شنبه 28 آبان 1392, 23:24 عصر
درسته که بابرنامه نویسی خیلی کارها میشود کرد ولی درجایی که نسبت به روش دستی کار سریعتر و راحت تر انجام شود .
برای منظور شما جدول مورد نظر را با حداکثر فیلدهای مورد نیاز بسازید و بعد از همان روش ByIndex استفاده کنید نباید مشکلی بوجود بیاید
متاسفانه امکان انجام این مساله به طور دستی در برنامه ام وجود ندارد و بسیاری از اینها در بین عملیاتی باید بدون دخالت کاربر صورت گیرد

دوست گرامی لطفا نمونه ضمیمه را ملاحظه فرمایید خطا می گیرد
اگر می شود لطفا اصلاح شده آنرا ضمیمه فرمایید تا سریعتر متوجه راهکارتان شوم زیرا هنوز نتونستم با توابع فوق آنرا حل کنم
در این نمونه همانطور که فرمودید از Byindex استفاده کرده ام ولی جواب نمی دهد!
باتشکر

Abbas Amiri
چهارشنبه 29 آبان 1392, 00:19 صبح
متاسفانه امکان انجام این مساله به طور دستی در برنامه ام وجود ندارد و بسیاری از اینها در بین عملیاتی باید بدون دخالت کاربر صورت گیرد

دوست گرامی لطفا نمونه ضمیمه را ملاحظه فرمایید خطا می گیرد
اگر می شود لطفا اصلاح شده آنرا ضمیمه فرمایید تا سریعتر متوجه راهکارتان شوم زیرا هنوز نتونستم با توابع فوق آنرا حل کنم
در این نمونه همانطور که فرمودید از Byindex استفاده کرده ام ولی جواب نمی دهد!
باتشکر

فرض می کنیم شما حداکثر 10 فیلد در جدول مقصد دارید . هر تعداد فیلد که قصد دارید به در هر رکورد به جدول مقصد اضافه کنید بایستی حتما تطابق نوع با فیلدهای متناظر (از نظر شماره فیلد) با جدول مبدا داشته باشد .

در فایل فوق شما قصد دارید فیلد پنجم را که از نوع تکست است به نوع نامبر نسبت دهید و این غیر ممکن است . مگر اینکه در کوئری از (VAL(FieldName استفاده کرده باشید.

فکر می کنم شما هنوز درست منظورتان را نرسانده اید.

hamid-nice
چهارشنبه 29 آبان 1392, 01:09 صبح
منظور من این است که تابع شما می آید از لحاظ نوع وسایز بررسی می کند و فایلهای مشابه را Append میکند حال اگر فیلدی را نیابد که در جدول دوم با مشخصات فیلدی در جدول اول مشابهت داشته باشد خطا می گیرد
من میگم اگه بتوان در تابع شما تغییری داد که تمام فیلد های مشابه را Append کند و اگر فیلدی بود که مشابهت فوق را نیافت از Append آن صرف نظر کند نه اینکه خطا بدهد مساله حل می شود
لزوم اینکار چیست ؟
فرض کنید شما جدول اصلی دارید و یک کوئری از جدول مشابه دیگری ساخته اید که فیلد محاسباتی دارد و تنها چند تا از فیلدهای جدول را در آن قرار داده اید
حال می خواهید اطلاعات فیلد محاسباتی را به فیلدی مشابه از نظر نوع و سایز در جدول اصلی منتقل کنیم اما تعداد فیلد های کوئری و جدول اصلی یکسان نیست در اینجا تابع شما به جای اینکه آن فیلدهای مشابه را Append کند و از Append کردن فیلدهای ناهماهنگ و نابرابر بودن تعداد فیلدهای کوئری و جدول اصلی صرف نظر کند کلا انجام عملیات را متوقف می کند
نمونه ساده زیر را ملاحظه کنید در این نمونه اگر فقط فیلد NWD را در کوئری حذف کنیم با اینکه تعداد فیلدها در کوئری و جدول متفاوت است به خوبی عمل Append صورت می گیرد ولی اگر این فیلد را در کوئری قرار بدهیم خطا می گیرد در صورتی که من می خواهم از این فیلد صرف نظر کند و به Append کردن دو فیلد دیگر بپردازد
با تشکر

Abbas Amiri
چهارشنبه 29 آبان 1392, 23:14 عصر
منظور من این است که تابع شما می آید از لحاظ نوع وسایز بررسی می کند و فایلهای مشابه را Append میکند حال اگر فیلدی را نیابد که در جدول دوم با مشخصات فیلدی در جدول اول مشابهت داشته باشد خطا می گیرد
من میگم اگه بتوان در تابع شما تغییری داد که تمام فیلد های مشابه را Append کند و اگر فیلدی بود که مشابهت فوق را نیافت از Append آن صرف نظر کند نه اینکه خطا بدهد مساله حل می شود
لزوم اینکار چیست ؟
فرض کنید شما جدول اصلی دارید و یک کوئری از جدول مشابه دیگری ساخته اید که فیلد محاسباتی دارد و تنها چند تا از فیلدهای جدول را در آن قرار داده اید
حال می خواهید اطلاعات فیلد محاسباتی را به فیلدی مشابه از نظر نوع و سایز در جدول اصلی منتقل کنیم اما تعداد فیلد های کوئری و جدول اصلی یکسان نیست در اینجا تابع شما به جای اینکه آن فیلدهای مشابه را Append کند و از Append کردن فیلدهای ناهماهنگ و نابرابر بودن تعداد فیلدهای کوئری و جدول اصلی صرف نظر کند کلا انجام عملیات را متوقف می کند
نمونه ساده زیر را ملاحظه کنید در این نمونه اگر فقط فیلد NWD را در کوئری حذف کنیم با اینکه تعداد فیلدها در کوئری و جدول متفاوت است به خوبی عمل Append صورت می گیرد ولی اگر این فیلد را در کوئری قرار بدهیم خطا می گیرد در صورتی که من می خواهم از این فیلد صرف نظر کند و به Append کردن دو فیلد دیگر بپردازد
با تشکر

نمونه زیر را ببینید: درصورت مغایرت فقط پیغام مناسب نمایش داده خواهد شد که می توانید آنرا حذف کنید

hamid-nice
چهارشنبه 29 آبان 1392, 23:39 عصر
با سلام
بسیار عالی انجام شد و دقیقا منظورم همین بود
یک مساله دیگر هم باقی مانده و مساله انتخابی فیلدهای مورد Append است به این معنی که فرضا یک کوئری با تعدادی فیلد که عینا در جدولی هست و تعدادی هم محاسباتی است فرضا 4 فیلد عینا در جدول مورد Append هست اما فقط می خواهیم 2 تا از فیلد ها از این 4 تا را ، به جدول مورد نظر append کنیم و بقیه صرف نظر شوند
با تابع کنونی از فیلد های محاسباتی و دیگری که در کوئری و در جدول یکی نیست به خوبی صرف نظر می شود ولی تمام فیلد های مشابه Append می شوند آیا با همین تابع می شود این کار را انجام داد یا نیاز به تعریف تابعی است که در آنها نام فیلد هایی که می خواهیم ، قابل تعیین و معرفی به تابع باشند
البته اگر در تابع بتوان برای انتخابی شدن فیلد ها نام هر فیلد به همراه نام منبع آن (جدول یا کوئری ذکر شود بسیار عالی می شود چرا که دیگر حتی محدود به مشترک بودن نام فیلدها نخواهد بود و می توان هر فیلد دلخواهی را از یک جدول یا کوئری به هر فیلد در جدول مورد نظر Append نمود یعنی تنها وابستگی نوع فیلد می شود که ضرورتا طبیعی خواهد بود
فکر کنم حل این مساله پرونده Append Query را هم مثل Make Table Query به خوبی ببند و کار آن کامل شود
با تشکر بسیار

Abbas Amiri
چهارشنبه 29 آبان 1392, 23:56 عصر
با سلام
بسیار عالی انجام شد و دقیقا منظورم همین بود
یک مساله دیگر هم باقی مانده و مساله انتخابی فیلدهای مورد Append است به این معنی که فرضا یک کوئری با تعدادی فیلد که عینا در جدولی هست و تعدادی هم محاسباتی است فرضا 4 فیلد عینا در جدول مورد Append هست اما فقط می خواهیم 2 تا از فیلد ها از این 4 تا را ، به جدول مورد نظر append کنیم و بقیه صرف نظر شوند
با تابع کنونی از فیلد های محاسباتی و دیگری که در کوئری و در جدول یکی نیست به خوبی صرف نظر می شود ولی تمام فیلد های مشابه Append می شوند آیا با همین تابع می شود این کار را انجام داد یا نیاز به تعریف تابعی است که در آنها نام فیلد هایی که می خواهیم ، قابل تعیین و معرفی به تابع باشند
البته اگر در تابع بتوان برای انتخابی شدن فیلد ها نام هر فیلد به همراه نام منبع آن (جدول یا کوئری ذکر شود بسیار عالی می شود چرا که دیگر حتی محدود به مشترک بودن نام فیلدها نخواهد بود و می توان هر فیلد دلخواهی را از یک جدول یا کوئری به هر فیلد در جدول مورد نظر Append نمود یعنی تنها وابستگی نوع فیلد می شود که ضرورتا طبیعی خواهد بود
فکر کنم حل این مساله پرونده Append Query را هم مثل Make Table Query به خوبی ببند و کار آن کامل شود
با تشکر بسیار

با یک مثال توضیح می دهم

If AppendRecordsWithAttach("SELECT id,fName,0,image FROM Table1", "Table2") Then

در عبارت بالا بجای نام فیلد lName عدد صفر در کوئری قرار داده ایم . در اینحالت چون دیتاتایپ عدد صفر و فیلد lName متفاوت است مقداری نمی گیرد .

مهم درج فیلدها ست . باز هم بطور مثال اگر در یک جدول 10 فیلدی قصد درج فیلدهای 1و2و4و5و7 را داریم بایستی برای فیلدهای های میانه هم یک عبارت قرار دهیم تا هر فیلد درسر جای خودش بنشیند

اگر چه می توان یک آرگومان ParamArray هم به تابع اضافه کرد و در آن شماره فیلدهای مورد نظر را درج کرد و براساس آنها فیلدهای کوئری در جای مناسب قراربگیرد و کار اص.لی همان است که در خطوط بالا عرض کردم

hamid-nice
یک شنبه 03 آذر 1392, 01:54 صبح
با سلام
دو تا مشکلی در تابع MAke Table Query پیش آمده :
1- فیلد های از نوع نامبر که از نوع Decimal را ساپورت نمی کنه و errror میده ، در صورتی که تابع Append این مشکل را نداره
2- وقتی در جدول سورس رکوردی وجود نداره یک پیغام برای نبود رکورد می آید چه طور کاری کنیم که این پیغام نیاد
با تشکر

Abbas Amiri
دوشنبه 04 آذر 1392, 17:59 عصر
با سلام
دو تا مشکلی در تابع MAke Table Query پیش آمده :
1- فیلد های از نوع نامبر که از نوع Decimal را ساپورت نمی کنه و errror میده ، در صورتی که تابع Append این مشکل را نداره
2- وقتی در جدول سورس رکوردی وجود نداره یک پیغام برای نبود رکورد می آید چه طور کاری کنیم که این پیغام نیاد
با تشکر

مشکل مزبور مربوط به اشکال DAO و ساخت فیلد Decimal است . که این یک عیب زنتیکه . راه حل رو میدونم ولی انرژی و وقت میخواد .
باید در تابع ساخت جدول ، ابتدا فیلدهای غیر decimal ساخته پس از آن جدول به دیتابیس اضافه و در نهایت با استفاده از دستورات ADOX اقدام به اضافه کردن فیلد Decimal کرد.

hamid-nice
دوشنبه 04 آذر 1392, 18:20 عصر
مشکل دوم را چگونه می شه حل کرد ؟ در مورد مشکل اول روش کار می کنید و منتظر باشیم ؟
با تشکر

hamid-nice
سه شنبه 05 آذر 1392, 23:47 عصر
با سلام
لطفا به ضمیمه نگاه کنید هنگام Append خطا می گیره ؟ چطور می شه این مساله را برطرف نمود ؟
با تشکر

Abbas Amiri
چهارشنبه 06 آذر 1392, 18:20 عصر
با سلام
لطفا به ضمیمه نگاه کنید هنگام Append خطا می گیره ؟ چطور می شه این مساله را برطرف نمود ؟
با تشکر

خطوط مربوط به خطا را پاک کنید

If rsSource.Fields(i).Type <> rsDest.Fields(i).Type Then
MsgBox "Source and target field's data type are different", vbCritical
'Exit Function
End If

hamid-nice
چهارشنبه 06 آذر 1392, 19:32 عصر
با تشکر
این کار را انجام دادم و دیگه پیغام خطا نمیاد ولی مساله اینه که فقط فیلد m را Append می کنه و فیلد Z را که در کوئری هم نام فیلد Z در جدول هست تنظیم شده ولی مقادیر فیلد Z از Query به فیلد Z در جدول Append نمی شه، چطور می شه این مساله را نیز حل کرد ؟
با تشکر

Abbas Amiri
چهارشنبه 06 آذر 1392, 19:44 عصر
با تشکر
این کار را انجام دادم و دیگه پیغام خطا نمیاد ولی مساله اینه که فقط فیلد m را Append می کنه و فیلد Z را که در کوئری هم نام فیلد Z در جدول هست تنظیم شده ولی مقادیر فیلد Z از Query به فیلد Z در جدول Append نمی شه، چطور می شه این مساله را نیز حل کرد ؟
با تشکر

برای فیلد Z عبارت Z: CLng(Nz(DMax("[ID]";"Table2");0)) رابکار برید

hamid-nice
چهارشنبه 06 آذر 1392, 20:01 عصر
با تشکر
اگه فیلد Z در جدول از نوع Decimal باشه باید به جای CLng از CDec استفاده کنیم ؟ چطور باید بنویسیم ؟
با تشکر

Abbas Amiri
چهارشنبه 06 آذر 1392, 20:02 عصر
با تشکر
اگه فیلد Z در جدول از نوع Decimal باشه باید به جای CLng از CDec استفاده کنیم ؟ چطور باید بنویسیم ؟
با تشکر

از CDec استفاده کنید

hamid-nice
چهارشنبه 06 آذر 1392, 20:35 عصر
از CDec استفاده کنید
متاسفانه قبول نمی کنه ، نمی دونم چطور باید تنظیمش کنم؟
اگه ممکنه روی نمونه ضمیمه اصلاح بفرمایید
باتشکر

hamid-nice
شنبه 09 آذر 1392, 15:48 عصر
با سلام
نمونه پست قبل قابل اصلاح هست ؟
با تشکر

Abbas Amiri
یک شنبه 10 آذر 1392, 00:25 صبح
با سلام
نمونه پست قبل قابل اصلاح هست ؟
با تشکر
دیتا تایپ دسیمال هم از آن دسته موضوعاتیه که مشکل سازه . قسمتی از کدها رو که در زیر آمده تغییر دهید:

With rsSource
.MoveLast: .MoveFirst
Do Until .EOF
rsDest.AddNew

For i = 0 To .Fields.Count - 1
Set fld = .Fields(i)
If fld.Type <> dbAttachment Then
rsDest.Fields(fld.Name) = .Fields(fld.Name)
Else
AppendAttachFields rsDest, rsSource, fld.Name
End If

Next

rsDest.Update
.MoveNext
Loop
End With

hamid-nice
یک شنبه 10 آذر 1392, 00:41 صبح
برای مورد APPEND درست شد خیلی عالی بود :تشویق::تشویق:

اما برای MAKE TABLE QUERY هنوز خطا می گیره
با اجازه در نمونه زیر برای تشخیص بهتر نام تابع را برای MAKE TABLE Query در نمونه اصلیتان به صورت MakeTabledRecordsWithAttach تغییر دادم ضمیمه کردم و نمونه ای را برای نشان دادن این خطا ضمیمه کردم که در صورت جایگزینی دستورات آخرین پستتان هم جواب نمی دهد
انشالله این را هم اصلاح بفرمایید
با تشکر فراوان

hamid-nice
پنج شنبه 14 آذر 1392, 21:44 عصر
جناب امیری لطفا فایل پست قبل را بررسی و اصلاح نمایید
با تشکر

Abbas Amiri
پنج شنبه 14 آذر 1392, 21:59 عصر
جناب امیری لطفا فایل پست قبل را بررسی و اصلاح نمایید
با تشکر

در یک تاپیک دیگه عرض کردم که راه حل داره ولی وقت وانرژی میخواد . انشاله در آینده نزدیک .

hamid-nice
سه شنبه 22 بهمن 1392, 18:53 عصر
با سلام
جناب استاد امیری
لطفا به فایل ضمیمه نگاه کنید مشکل خاصی در هنگام Append کردن یک کوئری محاسباتی به یک جدول پیش می آید یعنی
1- اطلاعات را Append نمی کند
2- بی شمار رکورد خالی تولید می کند که اگر اکسس را متوقف نکنید تا میلیونها رکورد و بشتر از اینها تولید می کند
لطفا بررسی فرمایید اشکال در کجاست ؟
با تشکر

Abbas Amiri
سه شنبه 22 بهمن 1392, 22:59 عصر
با سلام
جناب استاد امیری
لطفا به فایل ضمیمه نگاه کنید مشکل خاصی در هنگام Append کردن یک کوئری محاسباتی به یک جدول پیش می آید یعنی
1- اطلاعات را Append نمی کند
2- بی شمار رکورد خالی تولید می کند که اگر اکسس را متوقف نکنید تا میلیونها رکورد و بشتر از اینها تولید می کند
لطفا بررسی فرمایید اشکال در کجاست ؟
با تشکر

احتمالا مشکل از کوئری هست .

SELECT IIf(([Forms]![Form2]![Text0] Is Not Null),[Gheimat kol]<=[Forms]![Form2]![Text0],[id] Is Not Null) AS Expr1, table1.[gheimat kol]
FROM table1
WHERE (((IIf(([Forms]![Form2]![Text0] Is Not Null),[Gheimat kol]<=[Forms]![Form2]![Text0],[id] Is Not Null))<>False) AND (Not (table1.[gheimat kol]) Is Null));


سعی کنید عبارت SQL آنرا در فرم و با استفاده از متغیر بجای عبارت IIf بسازید . من که با عبارت IIf(([Forms]![Form2]![Text0] Is Not Null),[Gheimat kol]<=[Forms]![Form2]![Text0],[id] Is Not Null) نتوانستم ارتباط برقرار کنم

hamid-nice
سه شنبه 22 بهمن 1392, 23:55 عصر
استاد گرامی
وقتی با کوئری اپند خود اکسس اینکار را با همین کوئری انجام می دهم کاملا درست عمل می کنه در ضمن اینکه جوابهای کوئری هم صحیح هست لذا فکر نکنم اشکال از کوئری باشه ؟
غیر از این هست ؟
با تشکر