PDA

View Full Version : سوال: چگونه سابقه رکوردهای حذف شده را نگهداری نماییم ؟



narpco
شنبه 15 شهریور 1399, 22:57 عصر
چگونه سابقه رکوردهای حذف شده را نگهداری نماییم ؟
دوستان و اساتید محترم با سلام و عرض ادب
اطلاعات اولیه :
در یک برنامه یک جدول داریم بنام tbl_main و فرم مربوط به آن هم موجود هست
که در آن بصورت عادی نام نام خانوادگی و سن و اینکه جنسیت فرد مرد هست یا خیر درج میشود

جدول دیگری داریم دقیقا مشابه جدول اول بنام tbl_main_deleted_records و فرم مربوطه که بتوانیم فقط اطلاعات داخل این جدول را مشاهده کنیم بدون هیچگونه امکان تغییرات در اطلاعات جدول دوم.

سئوال و درخواست :
میخواهیم وقتی در -جدول اول -رکوردی را پاک می کنیم

1-رکورد مربوطه با همه اطلاعاتش به داخل جدول دوم کپی شود
2- رکورد مربوطه کامل از جدول اول پاک شود

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

و اینکه اگر سواد بنده در طراحی جداول یاری نکرده یا موردی رو در رابطه با id رکوردها باید رعایت کنیم ممنون میشم اعمال بفرمایید.

بسیار سپاسگزار می شوم در این امر بنده را راهنمایی فرمایید ...

فایل پروژه پیوست می باشد

eb_1345
یک شنبه 16 شهریور 1399, 00:14 صبح
سلام
از کدهای زیر استفاده کن !


DoCmd.RunSQL "INSERT INTO tbl_main_deleted_records ( ID, iname, fname, age, [is man?] ) SELECT tbl_main.ID, tbl_main.iname, tbl_main.fname, tbl_main.age, tbl_main.[is man?] FROM tbl_main WHERE (ID=" & ID & ")"
DoCmd.RunSQL "DELETE * FROM tbl_main WHERE (ID=" & ID & ")"
Me.Requery

narpco
یک شنبه 16 شهریور 1399, 08:25 صبح
سلام
از کدهای زیر استفاده کن !


DoCmd.RunSQL "INSERT INTO tbl_main_deleted_records ( ID, iname, fname, age, [is man?] ) SELECT tbl_main.ID, tbl_main.iname, tbl_main.fname, tbl_main.age, tbl_main.[is man?] FROM tbl_main WHERE (ID=" & ID & ")"
DoCmd.RunSQL "DELETE * FROM tbl_main WHERE (ID=" & ID & ")"
Me.Requery




سلام دوست من ....
. بسیار سپاس از محبت و سرعت عمل شما ....:تشویق::تشویق::تشویق::تشوی :برقرار باشید

narpco
یک شنبه 16 شهریور 1399, 10:59 صبح
سلام کد فوق رو روی همون فایل پیوست شده تست کردم و جواب داد و بسیار هم ممنون

مشکل دیگه ای باهاش برخورد کردم زیاد بودن تعداد فیلد هایی است که در دیتا بیس واقعی باید منتقل بشن ( 50 عدد در یک جدول )
هر چی هم سعی کردم با _ & بهم بچسبونم نشد من متن کد واقعی رو میزارم ممنون میشم راهنمایی بفرمایید
نام جدول اول tbl_incomeTOP نام جدولی که اطلاعات پاک شده بهش منتقل میشه tbl_incomeTOP_deleted record

بجای id هم incomeTOP_KOL_id داریم که خاصیت نامبر داره و عدد تعریف شده نه اتو نامبر

طول خط وی بی جوابگوی خطوط در این حد و بهم چسبیده نیست .....پرانتز ها گویا جابجا نشان داده میشه ولی درست نوشته شده (در متن زیر)
در دستورات sql نمیشه گفت همه فیلد های جدول مبدا رو بردار و به جدول مقصد منتقل کن ؟ با علامت *


فایل اکسس پروژه به پیوست است
فایل اکسل حاوی همه فیلد ها به سه طریق مورد نیاز پیوست می باشد

بسیار سپاسگزارم
لینک دانلود فایلهای پیوست
http://s14.picofile.com/file/8407675484/159.zip.html
(http://s14.picofile.com/file/8407675484/159.zip.html)









DoCmd.RunSQL "INSERT INTO tbl_incomeTOP_deleted record (incomeTOP_KOL_id,incomeTOP_typeName,incomeTOP_moe en_idA,incomeTOP_moeen_idB,incomeTOP_moeen_idC,inc omeTOP_vaziat,incomeTOP_memberpicpath,incomeTOP_us ername,incomeTOP_time,incomeTOP_date,incomeTOP_mem ber,incomeTOP_incomeName,incomeTOP_YEAR,incomeTOP_ ONVAN,incomeTOP_mablaghADAD,incomeTOP_takhfif,inco meTOP_MANDE1,incomeTOP_sodorjavaz,incomeTOP_MANDE2 ,incomeTOP_haghSabtOtagh,incomeTOP_jamekol,incomeT OP_jamekol,incomeTOP_jamekol3,incomeTOP_mablaghHOR OF,incomeTOP_toman,incomeTOP_incomeMethod,incomeTO P_peygiriETC,incomeTOP_checkNO,incomeTOP_checksarR esid,
incomeTOP_checknameBank,incomeTOP_checkSahebName,i ncomeTOP_tozih,sanadbank,sanadSahmeotagh,sanadDara madsaleaval,sanadDARAMADJAVAZ,sandDaramadSalianeh, sanadALALHESAB,sanadHEBE,sanadSAYER,
sanadBES_OTGH,jameBED,jameBES,MOGHAYERATbedbes,txt _sanadSAYER,incomeTOP_dateSABT,mahNO,salNO,bedehka ran,sanadTXT_BIST, )

SELECT
tbl_incomeTOP.incomeTOP_KOL_id,tbl_incomeTOP.incom eTOP_typeName,tbl_incomeTOP.incomeTOP_moeen_idA,tb l_incomeTOP.incomeTOP_moeen_idB,tbl_incomeTOP.inco meTP_moeen_idC,tbl_incomeTOP.incomeTOP_vaziat,tbl_ incomeTOP.incomeTOP_memberpicpath,tbl_incomeTOP.in comeTOP_username,tbl_incomeTOP.incomeTOP_time,tbl_ incomeTO.incomeTOP_date,tbl_incomeTOP.incomeTOP_me mber,tbl_incomeTOP.incomeTOP_incomeName,tbl_income TOP.incomeTOP_YEAR,tbl_incomeTOP.incomeTOP_ONVAN,t bl_incomeOP.incomeTOP_mablaghADAD,tbl_incomeTOP.in comeTOP_takhfif,tbl_incomeTOP.incomeTOP_MANDE1,tbl _incomeTOP.incomeTOP_sodorjavaz,tbl_incomeTOP.inco meTOP_MANDE,tbl_incomeTOP.incomeTOP_haghSabtOtagh, tbl_incomeTOP.incomeTOP_jamekol,tbl_incomeTOP.inco meTOP_jamekol2,tbl_incomeTOP.incomeTOP_jamekol3,tb l_incomeTOP.incomeTOP_mablaghHOROF,tbl_incomeTOP.i ncomeTOP_toman,tbl_incomeTOP.incomeTOP_incomeMetho d,tbl_incomeTOP.incomeTOP_peygiriETC,tbl_incomeTOP .incomeTOP_checkNO,tbl_incomeTOP.incomeTOP_checksa rResid,tbl_incomeTOP.incomeTOP_checknameBank,tbl_i ncomeTOP.incomeTOP_checkSahebName,tbl_incomeTOP.in comeTOP_tozih,tbl_incomeTOP.sanadbank,tbl_incomeTO P.sanadSahmeotagh,tbl_incomeTOP.sanadDaramadsaleav al,tbl_incomeTOP.sanadDARAMADJAVAZ,tbl_incomeTOP.s andDaramadSalianeh,tbl_incomeTOP.sanadALALHESAB,tb l_incomeTOP.sanadHEBE,tbl_incomeTOP.sanadSAYER,tbl _incomeTOP.sanadBES_OTGH,tbl_incomeTOP.jameBED,tbl _incomeTOP.jameBES,tbl_incomeTOP.MOGHAYERATbedbes, tbl_incomeTOP.txt_sanadSAYER,tbl_incomeTOP.incomeT OP_dateSABT,tbl_incomeTOP.mahNO,tbl_incomeTOP.salN O,tbl_incomeTOP.bedehkaran,tbl_incomeTOP.sanadTXT_ BIST,
FROM tbl_incomeTOP WHERE (( incomeTOP_KOL_id =" & ( incomeTOP_KOL_id & ")"

Mehr@ban
یک شنبه 16 شهریور 1399, 11:30 صبح
سلام
من یک پیشنهاد دیگه دارم
اینکه شما با افزودن یک چک باکس به جدول خودتون با عنوان Deleted و با مقدار پیشفرض False، در فرم هاتون این فیلتر یا شرط رو بذارین که فقط اطلاعاتی رو نشون بده که مقدار این فیلد برابر با False باشه.
و برای دکمه حذف هم بجای حذف رکورد، این دستور رو بنویسید که فیلد Deleted مربوط به اون رکورد رو از False به True تغییر بده.
اینجوری دیگه نیازی به ساخت جدول جدید و انتقال اطلاعات نیست! و تمامی کارها در همون جدول اول انجام میشه.

در این حالت شما رکوردی رو حذف نمیکنید، بلکه با استفاده از فیلتر یا شرط، فقط اون رو نمایش نمیدین
که دوتا امتیاز داره:

به سرعت و راحتی قابل بازیابی هست.
به سرعت و راحتی قابل حذف دائمی هست.

امیدوارم که بتونید ایده های خوبی بگیرید.

narpco
یک شنبه 16 شهریور 1399, 11:32 صبح
سلام
من یک پیشنهاد دیگه دارم
اینکه شما با افزودن یک چک باکس به جدول خودتون با عنوان Deleted و با مقدار پیشفرض False، در فرم هاتون این فیلتر یا شرط رو بذارین که فقط اطلاعاتی رو نشون بده که مقدار این فیلد برابر با False باشه.
و برای دکمه حذف هم بجای حذف رکورد، این دستور رو بنویسید که فیلد Deleted مربوط به اون رکورد رو از False به True تغییر بده.
اینجوری دیگه نیازی به ساخت جدول جدید و انتقال اطلاعات نیست! و تمامی کارها در همون جدول اول انجام میشه.

در این حالت شما رکوردی رو حذف نمیکنید، بلکه با استفاده از فیلتر یا شرط، فقط اون رو نمایش نمیدین
که دوتا امتیاز داره:

به سرعت و راحتی قابل بازیابی هست.
به سرعت و راحتی قابل حذف دائمی هست.

امیدوارم که بتونید ایده های خوبی بگیرید.


ممنون از راهنمایی منطقی شما ..بسیار ممنونم
مشکل اینه که برنامه نوشته شده و در محل های زیادی درحال کار هست
در ورژن جدید بدلایل فنی نیاز هست جداول جدا باشه و جدول رکوردهای پاک شده به جایی وصل نباشه ....

نکته دیگه این که برای خودم هم چالش شده که اگر روزی طول کد زیاد بود مثل بالا ....واقعا باید چیکار کرد؟ :))

بازم ممنون از شما

narpco
یک شنبه 16 شهریور 1399, 11:41 صبح
نکته مهم اینه که کدی که دوست عزیزمون

eb_1345 (https://barnamenevis.org/member.php?424036-eb_1345)
https://barnamenevis.org/images/statusicon/user-offline.png
نوشتن کد بسیارخوبیه و جواب میده ....و کار میکنه بدون مشکل

ولی مشکل در سواد بنده است که نتونستم درست در برنامه خودم بصورت واقعی بکار بگیرمش :لبخندساده::لبخندساده::لبخن ساده:

padide55
یک شنبه 16 شهریور 1399, 14:53 عصر
نکته مهم اینه که کدی که دوست عزیزمون

eb_1345 (https://barnamenevis.org/member.php?424036-eb_1345)

https://barnamenevis.org/images/statusicon/user-offline.png
نوشتن کد بسیارخوبیه و جواب میده ....و کار میکنه بدون مشکل

ولی مشکل در سواد بنده است که نتونستم درست در برنامه خودم بصورت واقعی بکار بگیرمش :لبخندساده::لبخندساده::لبخن ساده:

دوست عزیز
به روش خود اکسس عمل کنید

اول یک کوئری Append درست کنید که داده هایی که قراره حذف بشه رو به تیبل بک اپ حذف انتقال بده .
سپس یک کوئری Dellet درست کنید که داده های مورد نظر حذف بشه .

نمونه بگذارید .لطفا.

padide55
یک شنبه 16 شهریور 1399, 15:02 عصر
دوست عزیز
به روش خود اکسس عمل کنید

اول یک کوئری Append درست کنید که داده هایی که قراره حذف بشه رو به تیبل بک اپ حذف انتقال بده .
سپس یک کوئری Dellet درست کنید که داده های مورد نظر حذف بشه .

نمونه بگذارید .لطفا.

ببخشید . نمونه شما رو ندیده بودم. اصلاح شد.

narpco
یک شنبه 16 شهریور 1399, 15:36 عصر
ببخشید . نمونه شما رو ندیده بودم. اصلاح شد.

دوست گرامی بسیار ممنونم از وقتی که گذاشتید

مشکل ما در کد نویسی به دلیل تعداد بالای فیلدها ایجاد شده و من نتونستم حلش کنم (البته با روشی که دوست عزیزمون با کد sql فرموده بودن ) که عرض کردم مشکل از کد نیست از بی سوادی بنده در زمینه sql هستش ...

قطعا روشی که حضرتعالی میفرمایید سریعتر و با اکسس و امکاناتش سازگار تر است

منتها جسارتا فایل رو اشتباه برداشتید

فایل و جداولی که باهشون مشکل داریم در لینک زیر میباشد.

http://s14.picofile.com/file/8407675484/159.zip.html (http://s14.picofile.com/file/8407675484/159.zip.html)

بسیار ممنونم

eb_1345
یک شنبه 16 شهریور 1399, 18:38 عصر
طول خط وی بی جوابگوی خطوط در این حد و بهم چسبیده نیست .....پرانتز ها گویا جابجا نشان داده میشه ولی درست نوشته شده (در متن زیر)
در دستورات sql نمیشه گفت همه فیلد های جدول مبدا رو بردار و به جدول مقصد منتقل کن ؟ با علامت *



سلام
در نمونه جدید کدهای زیر رو جایگزین کدهای قبلی کن :


DoCmd.RunSQL "INSERT INTO [tbl_incomeTOP_deleted record] SELECT * FROM tbl_incomeTOP WHERE (incomeTOP_KOL_id=" & incomeTOP_KOL_id & ")"
DoCmd.RunSQL "DELETE * FROM tbl_incomeTOP WHERE (incomeTOP_KOL_id=" & incomeTOP_KOL_id & ")"
Me.Requery

narpco
یک شنبه 16 شهریور 1399, 18:45 عصر
سلام برادر کدی دیده نمیشه !!! شماره خط ها دیده میشه منتها داخل کادر سفید کدی نیست

eb_1345
یک شنبه 16 شهریور 1399, 18:55 عصر
سلام برادر کدی دیده نمیشه !!! شماره خط ها دیده میشه منتها داخل کادر سفید کدی نیست
چند لحظه ای در حال اصلاح کدها بودم، در پست قبل ارسال شد ،

eb_1345
یک شنبه 16 شهریور 1399, 19:08 عصر
نکته دیگه این که برای خودم هم چالش شده که اگر روزی طول کد زیاد بود مثل بالا ....واقعا باید چیکار کرد؟ :))


برای اینجور موقع ها کدها رو بقول معروف باید بشکنی . بطوریکه در آخر هر خط از سه علامت _ & " و در ابتدای خط بعدی از علامت " استفاده کنی
به کدهای زیر زیر توجه بفرما !


sql = "SELECT TblAccVoucher.IDOrder, TblAccVoucher.voucherRowNum," & _
"TblAccVoucher.VoucherNum, TblMainAccVoucher.FieldSelect, TblAccVoucher.AccGroupsCode," & _
"TblAccVoucher.GnrlAccCode , TblAccVoucher.LedgerAccCode, TblAccVoucher.DetailedAccCode,"
"TblAccVoucher.ArticleDesc, TblAccVoucher.Debit, TblAccVoucher.Credit," & _

narpco
یک شنبه 16 شهریور 1399, 20:01 عصر
دوست عزیز

eb_1345 (https://barnamenevis.org/member.php?424036-eb_1345)

https://barnamenevis.org/images/statusicon/user-online.png

کد ها رو چک کردم و کامل کار می کنه و عالی .....

بسیار هم ممنون شما هستم

در مورد کد " & _ که فرمودیه بودین
متاسفانه مشخص شده تو سیستمی که من باهاش اموزش دیدم کلا محبت کردن و این رو کامل نفرموده بودن من فکر می کردم
_& کافیه

کاش میدونستبم مرجع اموزشی درست کجاست که بریم و ویدئو های اموزشی شون رو بخریم .....



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

انشالله در پناه حق برقرار و پایدار باشید .....:تشویق::تشویق::تشویق::تشوی ق:


من اگر به مشکلی خوردم در مورد این کد ها و خطایی دیدم حتما اطلاع میدم ....

narpco
یک شنبه 16 شهریور 1399, 20:38 عصر
سلام مجدد این کدی که محبت فرمودین در خط
Me.Requery

خطای 3167 میده

چه راهنمایی میفرمایید



اگر بجای requary

Application.SetOption "Auto compact", True

استفاده کنیم ....درسته یا غلطه ؟

eb_1345
یک شنبه 16 شهریور 1399, 21:23 عصر
سلام مجدد این کدی که محبت فرمودین در خط
Me.Requery

خطای 3167 میده

چه راهنمایی میفرمایید



اگر بجای requary

Application.SetOption "Auto compact", True

استفاده کنیم ....درسته یا غلطه ؟


قاعدتاً نباید چنین خطائی صادر شود
علی ایحال برای رد کردن این خطا در ابتدای کد ها کد On Error Resume Next وارد کن ببین بدون خطا عملیات انجام میشه یا نه
اگر باز هم خطا صادر شد بجای اون خط آخر ( کد اسکیول حذف و Me.Requery ) از دستور زیر استفاده کن



DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdDeleteRecord



ضمناً دستور Application.SetOption "Auto compact", True مربوط به کامپکت کردن (فشرده سازی)دیتابیس است که در حالت True چک باکس مربوطه تیک دار و انتخاب میشود و در حالت false این تیک برداشته میشود . در این مورد به تصویر ضمیمه توجه بفرما!

eb_1345
یک شنبه 16 شهریور 1399, 21:32 عصر
ضمناً برای عمل حذف هم از دو خط دستور زیر هم میتونید استفاده کنید



DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70

و برای عدم نمایش پیغام های اکسس در ابتدای کدها از دستور DoCmd.SetWarnings False و در انتهای کدها از همین دستور با true استفاده کن (DoCmd.SetWarnings True)

padide55
دوشنبه 17 شهریور 1399, 08:27 صبح
دوست گرامی بسیار ممنونم از وقتی که گذاشتید

مشکل ما در کد نویسی به دلیل تعداد بالای فیلدها ایجاد شده و من نتونستم حلش کنم (البته با روشی که دوست عزیزمون با کد sql فرموده بودن ) که عرض کردم مشکل از کد نیست از بی سوادی بنده در زمینه sql هستش ...

قطعا روشی که حضرتعالی میفرمایید سریعتر و با اکسس و امکاناتش سازگار تر است

منتها جسارتا فایل رو اشتباه برداشتید

فایل و جداولی که باهشون مشکل داریم در لینک زیر میباشد.

http://s14.picofile.com/file/8407675484/159.zip.html (http://s14.picofile.com/file/8407675484/159.zip.html)

بسیار ممنونم

نمونه اصلاح شده با کوئری خود اکسس

http://s14.picofile.com/file/8407683142/real_test3.zip.html


البته چون کوئری اجرا میشه یک سوال اکشن کوئری میپرسه . برای حذفش باید : اکشن کوئری رو غیرفعال کنید . اینترنت سرچ کنید اکشن کوئری .
(http://s14.picofile.com/file/8407683142/real_test3.zip.html)

narpco
دوشنبه 17 شهریور 1399, 09:04 صبح
دوستان عزیز و گرامی جناب آقایان :

eb_1345 (https://barnamenevis.org/member.php?424036-eb_1345)
https://barnamenevis.org/images/statusicon/user-offline.png
padide55 (https://barnamenevis.org/member.php?263869-padide55)
https://barnamenevis.org/images/statusicon/user-offline.png


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

ماننده همیشه بهترین های زمین و آسمان را برای شما عزیزان آرزومندم ...
ارادتمند ..:قلب::قلب::قلب::قلب:



انشالله در بحث های دیگر هم درخدمت شما عزیزان بزرگوار باشیم ....برقرار باشید

narpco
یک شنبه 23 شهریور 1399, 13:53 عصر
دوستان نکته مهمی که در این بحث فراموش کردم این بود که :

اگر کد رکورد پاک شده تکراری باشه چی میشه
عملا در کد اس کیو ال که بالا هست ...اینطوری میشه که اگر مثلا شما کد 255 رو قبلا پاک کرده باشید ....و دوباره سند جدید کد 255 ثبت کرده باشید و دوباره سند 255 رو پاک کنید
وقتی به جدول کد های پاک شده مراجعه می کنید روکوردی رو ملاحضه می کنید که حاوی اطلاعات اولین باری است که سند 255 پاک شده ...یعنی اینکه بار دوم که سند 255 رو پاک می کنیم را در نظر نمی گیره و اگر رکوردی با شماره تکراری حذف کنید همون بار اول رو نگه میداره و دفعات بعدی رو در جدول رکورهای پاک شده وارد نمی کنه

باید در اینجا کنترلی داشته باشیم که بگه
در جدول مقصد کنترل کن
اگر رکوردی با شماره مساوی با شماره کد رکوردی که میخوای پاک کنی وجود داشت ....آنگاه
رکورد قبلی رو در جدول مقصد پاک کن
سپس روکورد جدید رو بجای اون ثبت کن

کد واقعی ما به این شرح است



DoCmd.RunSQL "INSERT INTO [tbl_incomeTOP_deleted record] SELECT * FROM tbl_incomeTOP WHERE (incomeTOP_KOL_id=" & incomeTOP_KOL_id & ")"

باید کنترل رو به این دستور اضافه کنیم

نکته مهم در جدول مبدا و مقصد فیلد id بصورت autonumber وجود ندارد که حداقل به تغییر id مشکل حل بشه



بسیار ممنون میشم راهنمایی بفرمایید
با سپاس

padide55
یک شنبه 23 شهریور 1399, 14:07 عصر
دوستان نکته مهمی که در این بحث فراموش کردم این بود که :

اگر کد رکورد پاک شده تکراری باشه چی میشه
عملا در کد اس کیو ال که بالا هست ...اینطوری میشه که اگر مثلا شما کد 255 رو قبلا پاک کرده باشید ....و دوباره سند جدید کد 255 ثبت کرده باشید و دوباره سند 255 رو پاک کنید
وقتی به جدول کد های پاک شده مراجعه می کنید روکوردی رو ملاحضه می کنید که حاوی اطلاعات اولین باری است که سند 255 پاک شده ...یعنی اینکه بار دوم که سند 255 رو پاک می کنیم را در نظر نمی گیره و اگر رکوردی با شماره تکراری حذف کنید همون بار اول رو نگه میداره و دفعات بعدی رو در جدول رکورهای پاک شده وارد نمی کنه

باید در اینجا کنترلی داشته باشیم که بگه
در جدول مقصد کنترل کن
اگر رکوردی با شماره مساوی با شماره کد رکوردی که میخوای پاک کنی وجود داشت ....آنگاه
رکورد قبلی رو در جدول مقصد پاک کن
سپس روکورد جدید رو بجای اون ثبت کن

کد واقعی ما به این شرح است



DoCmd.RunSQL "INSERT INTO [tbl_incomeTOP_deleted record] SELECT * FROM tbl_incomeTOP WHERE (incomeTOP_KOL_id=" & incomeTOP_KOL_id & ")"

باید کنترل رو به این دستور اضافه کنیم

نکته مهم در جدول مبدا و مقصد فیلد id بصورت autonumber وجود ندارد که حداقل به تغییر id مشکل حل بشه



بسیار ممنون میشم راهنمایی بفرمایید
با سپاس
سلام
در روش کوئری هر دو رونگه میداره .
میتونم یک کوئری دیگه درست کنم که اول کد رو چک کنه . بود حذف کنه و ادامه طبق همون روش .

narpco
یک شنبه 23 شهریور 1399, 17:21 عصر
سلام و سپاس از شما
من یک فایل شبیه سازی کردم
بسیار ممنون میشم روی این فایل جدید تست بزنید ..ممنونم

http://s15.picofile.com/file/8408140434/delete_test.rar.html

دانلود فایل از لینک بالا

eb_1345
یک شنبه 23 شهریور 1399, 17:21 عصر
دوستان نکته مهمی که در این بحث فراموش کردم این بود که :

اگر کد رکورد پاک شده تکراری باشه چی میشه
عملا در کد اس کیو ال که بالا هست ...اینطوری میشه که اگر مثلا شما کد 255 رو قبلا پاک کرده باشید ....و دوباره سند جدید کد 255 ثبت کرده باشید و دوباره سند 255 رو پاک کنید
وقتی به جدول کد های پاک شده مراجعه می کنید روکوردی رو ملاحضه می کنید که حاوی اطلاعات اولین باری است که سند 255 پاک شده ...یعنی اینکه بار دوم که سند 255 رو پاک می کنیم را در نظر نمی گیره و اگر رکوردی با شماره تکراری حذف کنید همون بار اول رو نگه میداره و دفعات بعدی رو در جدول رکورهای پاک شده وارد نمی کنه

باید در اینجا کنترلی داشته باشیم که بگه
در جدول مقصد کنترل کن
اگر رکوردی با شماره مساوی با شماره کد رکوردی که میخوای پاک کنی وجود داشت ....آنگاه
رکورد قبلی رو در جدول مقصد پاک کن
سپس روکورد جدید رو بجای اون ثبت کن

کد واقعی ما به این شرح است



DoCmd.RunSQL "INSERT INTO [tbl_incomeTOP_deleted record] SELECT * FROM tbl_incomeTOP WHERE (incomeTOP_KOL_id=" & incomeTOP_KOL_id & ")"

باید کنترل رو به این دستور اضافه کنیم

نکته مهم در جدول مبدا و مقصد فیلد id بصورت autonumber وجود ندارد که حداقل به تغییر id مشکل حل بشه



بسیار ممنون میشم راهنمایی بفرمایید
با سپاس

سلام
کدهای زیر رو جایگزین کدهای قبلی کن


If DCount("incomeTOP_KOL_id", "tbl_incomeTOP_deletedrecord", "incomeTOP_KOL_id=" & incomeTOP_KOL_id & "") > 0 Then
DoCmd.RunSQL "DELETE * FROM tbl_incomeTOP_deletedrecord WHERE (incomeTOP_KOL_id=" & incomeTOP_KOL_id & ")"
End If
DoCmd.RunSQL "INSERT INTO [tbl_incomeTOP_deletedrecord] SELECT * FROM tbl_incomeTOP WHERE (incomeTOP_KOL_id=" & incomeTOP_KOL_id & ")"
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70


ضمناً از جدول دوم فاصله rercord از نام جدول حذف کن .! آن را بصورت tbl_incomeTOP_deletedrecord در بیاور
فایل جدیدی هم که فرستادی ندیدم

narpco
یک شنبه 23 شهریور 1399, 17:49 عصر
http://s15.picofile.com/file/8408140434/delete_test.rar.html

عرض کردم بوده تو این لینک هست ..بسیار ممنونم

فاصله بین نام جدول ؟!؟ عجب سووووتی :))) چشم درست می کنم

narpco
یک شنبه 23 شهریور 1399, 18:09 عصر
سلام مجدد کداتون رو تست کردم صحیح کار می کرد و مشکل تکراری بودن کد و ذخیره اخرین سند حذف شده یا کد تکراری هم حل شد ....خیلی زحمت کشیدید بسیار ممنونم

فقط اگر زمان داشتین ممنون میشم توضیحی در مورد این دو خط کد بدین ممنون یا لینکی که اموزش این داستان باشه ممنونم
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70

narpco
یک شنبه 23 شهریور 1399, 18:45 عصر
معنیش این کد ها هستن ؟

Access 7 Menu System

DoCmd.DoMenuItem
RunCommand


acFormBar, acEditMenu, 2
acCmdCopy


acFormBar, acEditMenu, 5
acCmdPasteAppend


acFormBar, acEditMenu, 6
acCmdDeleteRecord


acFormBar, acEditMenu, 8
acCmdSelectRecord


acFormBar, acEditMenu, 10
acCmdFind


acFormBar, acEditMenu, 12, 4
acCmdRecordsGoToNew


acFormBar, acEditMenu, acCopy
acCmdCopy


acFormBar, acEditMenu, acPaste
acCmdPaste


acFormBar, acEditMenu, acUndo
acCmdUndo


acFormBar, acFile, acSaveForm
acCmdSave


acFormBar, acRecordsMenu, 0, 2
acCmdAdvancedFilterSort


acFormBar, acRecordsMenu, 2
acCmdApplyFilterSort


acFormBar, acRecordsMenu, 5
acCmdRefresh


acFormBar, acRecordsMenu, acSaveRecord
acCmdSaveRecord


acFormBar, 7, 6
acCmdSizeToFit


1, 3, 3
acCmdNewObjectReport


3, acEditMenu, acPaste
acCmdPaste







چرا از این کد ها استفاده می کنیم ؟

eb_1345
یک شنبه 23 شهریور 1399, 19:10 عصر
سلام مجدد کداتون رو تست کردم صحیح کار می کرد و مشکل تکراری بودن کد و ذخیره اخرین سند حذف شده یا کد تکراری هم حل شد ....خیلی زحمت کشیدید بسیار ممنونم

فقط اگر زمان داشتین ممنون میشم توضیحی در مورد این دو خط کد بدین ممنون یا لینکی که اموزش این داستان باشه ممنونم
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70


DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70


همانطور که در پست های 17 و 18 اشاره کردم از دو خط کد فوق برای حذف رکورد جاری استفاده میشود . این کد ها در نسخه های قدیمی اکسس توسط ویزارد اکسس برای حذف رکورد ایجاد میشد . این کد با دستور DoCmd شروع شده یعنی به اکسس دستور میده که از منوبار بخش مربوط به فرم و از آن قسمت منوی Edit و .... را انتخاب کن . و اگر اشتباه نکنم آن شماره ها هم مربوط به شماره زیر منوئی های که مربوط به انتخاب و خذف رکورد فرم جاری می باشد . در هرحال این کدها مربوط به نسخه های قدیمی است و شاید استفاده کردن از آنها منسوخ شده باشد ولی این کدها در نسخه های جدید هم همچنان کاربرد دارند.
در یکی از پست های قبل اشاره کرده بودی که در هنگان حذف رکورد از کد me.Requery خطا صادر میشود که پیشنهاد دادم از این دو خط کد یا دوخط کد پست شماره 17 برای حذف رکورد استفاده شود .
در کد اسکیوال حذف رکورد بصورت DoCmd.RunSQL "DELETE * FROM tablename عمل حذف انجام میشود ولی فرم ریفرش نمیشود و برای ریفرش رکوردها باید از me.Requery استفاده شود و این دستور me.Requery باعث میشود بعد از حذف رکورد رکوردست به رکورد اول منتقل شود .
امتیاز این دوخط کد یا دوخط کد پست شماره 17 نسبت به کد اسکیوال حذف رکورد و بعد دستور me.Requery این است که بعد از حذف رکورد ها رکوردست به رکورد اول منتقل نمی شود . بعبارتی با آن دستور قبلی وقتی شما اقدام به حذف مثلا رکورد پنجم می کردی با فرمان me.Requery به رکورد اول منتقل میشد ولی با کدها فوق بعد از حذف ، رکورد بعدی اگر موجود باشد به نمایش در خواهد . یعنی وقتی رکورد پنجم را حذف می کنی رکورد ششم نمایش داده میشود

narpco
دوشنبه 24 شهریور 1399, 09:14 صبح
سپاس از شما و زمانی که برای ما اختصاص میدین .....:تشویق::تشویق::تشویق:

eb_1345
سه شنبه 25 شهریور 1399, 15:06 عصر
سلام
ببخشید من فراموش کردم کد RunCommand acCmdDeleteRecord برای حذف کردن رکورد بهت پیشنهاد بدهم .
این خط کد رو جایگزین کدهای قبلی زیر کن !


DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70