PDA

View Full Version : در صورت خالی بودن sub form رکورد حذف شود



هادی2020
چهارشنبه 16 مرداد 1387, 21:53 عصر
چطور می شه دو فرم که با هم در ارتباط هستند و یکی از این دو ساب فرم دیگری است در صورتی که ساب فرم دارای رکوردی نباشد رکورد مورد نظر از فرم اصلی پاک شود
مثلا بعد از رفتن به رکورد قبلی یا بعدی این کار صورت گیرد

مهدی قربانی
چهارشنبه 16 مرداد 1387, 23:56 عصر
سلام
دوست عزيز در نمونه ترتيبي داده شده تا بعد از انتخاب مقدار از كامبو در صورتيكه ركورد متناظرش در سابفرم موجود نباشه ركورد جاري حذف مي شه .

هادی2020
پنج شنبه 17 مرداد 1387, 14:59 عصر
مرسی ولی این به کارم نمی یاد بزار اینطور بگم می خواهیم یه فاکتور صادر کنیم اگه کاربراقلام فاکتور را وارد کند (وارد کردن آنها در ساب فرم) در صورتی که نام فرد را در فرم اصلی وارد نکرده باشد وقتی که به رکورد قبلی یا بعدی می رود اخطاری را به کاربر نشان داده و اگر روی بله کلیک کرد فاکتور پاک شود

Ali_Fallah
پنج شنبه 17 مرداد 1387, 17:33 عصر
فکرکنم این برنامه همان
چیزی باشه که دوستمون می خواست
----------------------------------------
ضمن عرض تبریک بمناسبت انتخاب شدن آقای قربانی به عنوان مدیر بخش و با عرض معذرت از ایشان
امیدوارم که ایشان بعد از مدتی خسته نشده و این انجمن را رها نکنند...

سعیدمرزبان
پنج شنبه 17 مرداد 1387, 19:42 عصر
با سلام می شه توضیحات بیشتر بدید ؟

Ali_Fallah
پنج شنبه 17 مرداد 1387, 19:46 عصر
کدامیک از ما توضیح بدهد ؟
با نقل قول مشخص کنید...

مهدی قربانی
جمعه 18 مرداد 1387, 21:19 عصر
مرسی ولی این به کارم نمی یاد بزار اینطور بگم می خواهیم یه فاکتور صادر کنیم اگه کاربراقلام فاکتور را وارد کند (وارد کردن آنها در ساب فرم) در صورتی که نام فرد را در فرم اصلی وارد نکرده باشد وقتی که به رکورد قبلی یا بعدی می رود اخطاری را به کاربر نشان داده و اگر روی بله کلیک کرد فاکتور پاک شود

سلام
خوب بهتر بود سئوال اول رو كاملتر مطرح مي كرديد تا جواب مرتبط تقديم شما مي شد به هر حال فكر ميكنم نمونه اصلاح شده توسط دوست خوبمون Ali_Fallah پاسخ سئوال شما باشه .
موفق باشيد .

مهدی قربانی
جمعه 18 مرداد 1387, 21:28 عصر
ضمن عرض تبریک بمناسبت انتخاب شدن آقای قربانی به عنوان مدیر بخش و با عرض معذرت از ایشان
امیدوارم که ایشان بعد از مدتی خسته نشده و این انجمن را رها نکنند...
سلام
ممنون از ابراز لطف شما ، به بهانه پاسخ فرمايش شما عرض مي كنم كه براي بنده چيزي تغيير نكرده الا مسئوليت بيشتر در راستاي خدمتگزاري به دوستان بخش Access و اميدوارم اولاً لياقتش رو داشته باشم و ثانياً در اين مسير هم تنها نباشم قدر مسلم يكي از جنبه هاي ترغيب بنده ، فعال بودن و مساعدت همه دوستان عزيز بخصوص دوستان زبردست و ماهر در اين بخشه مجدداً از عنايت شما و همه دوستان تشكر مي كنم .

mohammadgij
شنبه 19 مرداد 1387, 10:11 صبح
مي توني توي دكمه هات اين دستور رو بنويسي




If Me.SubformName.Form.RecordsetClone.RecordCount =0 Then

Docmd.RunSql"Delete From TableName" Where key=" & me.Key.value & "
End If

هادی2020
شنبه 19 مرداد 1387, 21:36 عصر
میخواستم ببینم دستور sql قبلی مشکلی نداره

mohammadgij
دوشنبه 21 مرداد 1387, 08:47 صبح
چرا مشكل داره شرمنده.




If Me.SubformName.Form.RecordsetClone.RecordCount =0 Then

Docmd.RunSql"Delete From TableName Where key=" & me.Key.value & "
End If


راستي من نگفتم چون شما ميدوني كه اسم جدول و نام فيلدهاي خودت رو بايد جايگزين كني

هادی2020
سه شنبه 22 مرداد 1387, 15:30 عصر
وقتی از این دستور استفاده می کنم داخل فیلد های مروط به فرم اصلی عبارت #Deleted را می نویسه! انگار یه بار دیگه باید فرم رفرش بشه باید چیکار کنم؟

مهدی قربانی
سه شنبه 22 مرداد 1387, 15:38 عصر
سلام
اين كد رو در ادامه كدهاي قبلي اضافه كنيد :

Form_FormeName.Referesh
بجاي FormName نام فرم اصلي رو قرار بديد .

هادی2020
سه شنبه 22 مرداد 1387, 15:43 عصر
دوست عزیز مرسی ولی نمی دونم باید این کد را کجا بنویسم باید جایی قرار بگیره که وقتی به رکورد قبلی یا بعدی میرم بعدا چک کنه که آیا ساب فرم خالی هستش یا نه


If Me.SubformName.Form.RecordsetClone.RecordCount =0 Then

Docmd.RunSql"Delete From TableName Where key=" & me.Key.value & "
End If

مهدی قربانی
سه شنبه 22 مرداد 1387, 15:57 عصر
منظورتون قرار گرفتن كديه كه بنده تقديم كردم يا كل كد ( عمليات حذف )

هادی2020
سه شنبه 22 مرداد 1387, 16:01 عصر
دستور حذف منظورمه خوب البته دستور شما می تونه بعد از حذف اجرا بشه ولی بعد از اجرای دستور حذف روی رفرش فرم مشکل می گیره من از اکسس 2003 استفاده می کنم

مهدی قربانی
سه شنبه 22 مرداد 1387, 17:13 عصر
سلام
عذر مي خوام ، املاي من اشكال داشت بجاي Referesh عبارت Refresh رو جايگزين كنيد .
در مورد كد حذف هم اگر نمونه بذاريد فكر مي كنم بهتر باشه .

هادی2020
سه شنبه 22 مرداد 1387, 18:33 عصر
دوست عزیز سوالم اینکه دستور زیر را در چه رویدادی باید قرار دهم من میخوام وقتی داده های فرم اصلی و ساب فرم را وارد کردم مثلا وقتی که به رکورد قبلی یا بعدی میره این دستور را چک کند


If Me.SubformName.Form.RecordsetClone.RecordCount =0 Then

Docmd.RunSql"Delete From TableName Where key=" & me.Key.value & "
End If

مهدی قربانی
سه شنبه 22 مرداد 1387, 19:00 عصر
در فرم اصلي يك يك كامبو از نوع سوم ( مطابق نمونه فايلي كه در اوايل همين تاپيك تقديم شد ) ايجاد كنيد كه در اصل عمليات انتخاب ركورد از اون طريق صورت بگيره و بعد در رخداد After Update‌ اون از كدهاي مورد نظرتون استفاده كنيد يا اينكه با حذف Navigation Botton و بستن Mouse Wheel چندتا كامد باتون براي پيمايش ركوردها ايجاد كنيد و كد رو در On click اونها قرار بديد ، اگر موفق نشديد نمونه فايلتون رو اينجا بذاريد تا اقدام بشه .

abdoreza57
دوشنبه 27 آذر 1391, 18:35 عصر
با سلام ضمن عرض ارادت خدمت تمام اساتید گرامی شاید این تاپیک تاریخش منقضی شده ولی
من از کدی که دوست عزیزمون فرمودند برای حذف رکورد استفاده میکردم منتها چند اشکال بوجود میاد که خیلی وقته نتونستم جوابی برای این مشکل پیدا کنم :
1) هنگام حذف رکورد همانطور که یکی از دوستانمون هم اشاره کردند یه ایراد وجود داره که البته توصیه شد از کد رفرش استفاده بشه منتها علی رقم اون باید فرم باز و بسته هم بشه !!
2) پیغام حذف رکورد را نمیشه فارسی کرد !!
3) اغلب موارد تو نمونه های مشابه خطا میده و تا رسیدن به نتیجه مطلوب کلافه میشی !!
4) دقیقا عنوان نشد این کد کجا بایست اضافه بشه : After Insert فرم ؟ یا On Close ساب فرم؟ یا On Close فرم

شاید دوستان بتونند راه حل بهتری هم ارائه کنند (برای رسیدن به خدا بی نهایت راه وجود داره .. !!!!!)

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

Abbas Amiri
سه شنبه 28 آذر 1391, 22:28 عصر
ین مورد را برای زمانی میخوام که تو فرمی اطلاعات مشتری را وارد کنم ولی اگه لیست اقلام برای مشتری خالی بود این فاکتور حذف بشه با سلام
در فایل اصلاح شده زیر درهنگام بسته شدن فرم و همچنین رفتن به رکورد دیگر عملیات پرسش وحذف انجام میگیرد.

abdoreza57
چهارشنبه 29 آذر 1391, 00:22 صبح
ضمن عرض سلام و ارادت خدمت دوست عزیزم و تشکر بابت وقتی که به این موضوع اختصاص دادید

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

در ضمن آقای امیری مشکلی که تو این روش وجود داشت هنوز به طور کامل مرتفع نشده :..
1) پس از ثبت اطلاعات فرم با وارد شدن به زیر فرم این پیغام صادر میشه که خوشایند نیست
2) هنگام حذف رکورد عبارتDelete#روی فیلدها باقی میمونه
3)خطای غیر منتظره داره مثلا بدون استفاده از موس و با زدن کلید تایید از کیبورد هیچ اتفاقی نمی افته !

کلا میشه بفرمایید بهترین روشی که برای این مورد شما پیشنهاد میکنید چی هست ؟ امیدوارم بازم یه راهکار نوی داشته باشید

خدا نگهدار

Abbas Amiri
چهارشنبه 29 آذر 1391, 18:16 عصر
در ضمن آقای امیری مشکلی که تو این روش وجود داشت هنوز به طور کامل مرتفع نشده :..
1) پس از ثبت اطلاعات فرم با وارد شدن به زیر فرم این پیغام صادر میشه که خوشایند نیست
2) هنگام حذف رکورد عبارتDelete#روی فیلدها باقی میمونه
3)خطای غیر منتظره داره مثلا بدون استفاده از موس و با زدن کلید تایید از کیبورد هیچ اتفاقی نمی افته !

سلام
باتوجه به فرم موجود درفایل فوق جهت پیمایش در رکوردها و ایجاد رکوردجدید اجبار به استفاده از Navigation Buttons فرم بود . و دراین حالت بعضی ار رویدادها در دسترس نیست : مثلا زمانی که که ازیک رکورد به رکورد دیگر بدون تغییرات حرکت میکنید ، هیچ رخدادی حادث نمیشود . (چناچه ازسابفرم رکوردی را حذف کنید ، خصوصیت Dirty فرم اصلی تغییری نمیکند و بنابراین هنگام حرکت به رکوردهای دیگر رخداد Form_BeforeUpdate تحریک نمیشود)
چنانچه درطراحی فرم از باتن های جداگانه جهت اعمال فوق استفاده شود بهتر میتوان موارد مورد نیاز را کنترل کرد

abdoreza57
چهارشنبه 29 آذر 1391, 22:37 عصر
سلام و تشکر بابت راهنماییتون

متاسفانه ایده عملی به ذهنم نمیرسه ضمن اینکه دقیقا به علل مشکل اشاره فرمودید در صورت امکان پیشنهادتون را به پس از اعمال ضمیمه کنید یا لااقل یه گرا بدید
تنها فکری که به ذهن یک مبتدی امی تو این مورد میرسه استفاده از رکوردست و آنبوند هست منتها چطور نمیدونم !!!...

مشتاق راهکار خوبتون هستم

Abbas Amiri
پنج شنبه 30 آذر 1391, 20:47 عصر
باسلام
فایل زیر همان فرم قبلی را بااستفاده از کلیدهای حرکت بین رکوردها وتقریبا بدون اشکال ، اصلاح کرده است

abdoreza57
پنج شنبه 30 آذر 1391, 22:22 عصر
سلام ضمن تشکر

شرمنده خطایی به کد میگیره و آرگومان DoCmd.SearchForRecord شناسایی نمیشه
میشه دلیلش را بفرمایید

Abbas Amiri
پنج شنبه 30 آذر 1391, 22:41 عصر
خطایی به کد میگیره و آرگومان DoCmd.SearchForRecord شناسایی نمیشه
میشه دلیلش را بفرمایید احتمالا شما ازورژن قبل از 2007 استفاده میکنید . برای رفع این مشکل چند سطر اول فانکشن خاطی را به شکل زیر اصلاح کنید


Private Function DeleteEmptyFactor(Optional i As String = "") As VbMsgBoxResult
Dim sSQL As String, ans As VbMsgBoxResult, rs As DAO.Recordset
ans = vbIgnore
If Len(i) Then
CurrentID = i
End If

If DCount("*", "Table2", "id='" & CurrentID & "'") = 0 Then
'DoCmd.SearchForRecord , , , "id='" & CurrentID & "'"
Set rs = Me.RecordsetClone
rs.FindFirst "id='" & CurrentID & "'"
Me.Bookmark = rs.Bookmark
Set rs = Nothing
ans = MsgBox("ÏÑ ÝǘÊæÑÌÇÑí åí ãæÑÏí ÞíÏ äÔÏå ÇÓÊ . ãÇíá Èå ÍÐÝ Âä åÓÊíÏ¿", _
vbYesNoCancel + vbExclamation)

abdoreza57
جمعه 01 دی 1391, 12:06 عصر
سلام و ممنون خیلی عالی بود
این انسانیت و فروتنی با هیچ قاعده و اصول مادی قابل توجیح نیست لذت پاداش معنوی این کارقطعا برایتان لذت بحش تر از هر چیزی است موفق و پیروز باشید...


1) تو رکورد جدید وقتی بر روی باتون جدید یا رکوردهای قبل یا بعد کلیک میکنیم عملیات DeleteEmptyFactor فعال میشه و به رکورد قبل که به درستی هم وارد شده برمیگرده و آماده حذف رکورد میشه این عمل تا پایان رکوردها ادامه پیدا میکنه !
فکر کنم در این صورت باید عملیات متوقف میشد که پیش بینی نشده
2) زیر فرم هنوز کنترل نمیشه من New Line in Field را قرار دادم جواب نمیده چند راهکار دیگه را همم تست کردم نشد : میتونید ببنید در صورتی که اطلاعات اولیه فرم پر شد با دوبار اینتر به زیر فرم و از آنجا بدون خطا به رکورد بعدی از فرم اصلی یعنی جدید میره !! اگه بشه کاری کرد بعد از زیرفرم به باتون جدید بره خوب میشد یا نمیدونم یه راه دیگه که قطعا خودتون صلاح میدونید این مشکل راحل کنید خوب میشد
3)تو قسمت باز شدن فرم قید کردید DoCmd.GoToRecord , , acLast
DoCmd.GoToRecord , , acFirst میشه معنی این کار را کمی توضیح بدید

به هر حال بابت لطفی که فرمودید ممنون
به ساعت لوگینتون وقتی چشمم خورد صادقانه میگم هم حس غرور داشتم بابت چنین سرمایه هایی که تو کشورمون داریم و خیلی غبطه خوردم بابت چنین دید وسیعی که دارید

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

Abbas Amiri
جمعه 01 دی 1391, 16:02 عصر
) زیر فرم هنوز کنترل نمیشه من New Line in Field را قرار دادم جواب نمیده چند راهکار دیگه را همم تست کردم نشد : میتونید ببنید در صورتی که اطلاعات اولیه فرم پر شد با دوبار اینتر به زیر فرم و از آنجا بدون خطا به رکورد بعدی از فرم اصلی یعنی جدید میره !! اگه بشه کاری کرد بعد از زیرفرم به باتون جدید بره خوب میشد یا نمیدونم یه راه دیگه که قطعا خودتون صلاح میدونید این مشکل راحل کنید خوب میشد

درفرم اصلی کد زیر را قراردهید


Private Sub zir_Exit(Cancel As Integer)
cmdNew.SetFocus
End Sub




3)تو قسمت باز شدن فرم قید کردید DoCmd.GoToRecord , , acLast
DoCmd.GoToRecord , , acFirst میشه معنی این کار را کمی توضیح بدید

این قسمت فقط جهت آپدیت شدن تکست باکس شماره رکوردهاست



) تو رکورد جدید وقتی بر روی باتون جدید یا رکوردهای قبل یا بعد کلیک میکنیم عملیات DeleteEmptyFactor فعال میشه و به رکورد قبل که به درستی هم وارد شده برمیگرده و آماده حذف رکورد میشه این عمل تا پایان رکوردها ادامه پیدا میکنه !

به این مورد برخوردنکردم . فقط یک مسئله هست چنانچه مقدار ID تغییر داده شود ومستقیما دکمه جدید فشرده شود درنتیجه بدون اینکه کلیدخارجی سابفرم تغییر پیداکند ، تابع حذف فعال میشود وچون شرط حذف صادق است بنابراین پیغام نمایش داده میشود
برای حل این موضوع در روال ID_AfterUpdate به صورت زیرتغییرکند


Private Sub ID_AfterUpdate()
If Not IsNull(ID) Then
CurrentID = ID
Me.Refresh
Else
CurrentID = ""
End If

End Sub

abdoreza57
جمعه 01 دی 1391, 17:42 عصر
سلام


به این مورد برخوردنکردم . شرمنده ولی همانطور که عرض کردم تو فرم اصلی اگه دوبار روی باتون cmdNew کلیک کنید و یا وقتی تو رکورد جدید هستیم بدون وارد کردن اطلاعات بخواهیم از فرم خارج شویم متوجه عرایضم خواهید شد نمیدونم شاید به ورژن آفیس مربوط باشه؟! اگه اینطوره چکار کنیم؟


اگه بشه کاری کرد بعد از زیرفرم به باتون جدید بره خوب میشدچون تو فرمهای Continuous Forms کد cmdNew.SetFocus جواب نخواهد داد راهی وجود داره یا خیر؟
با اصلاح همین موارد میتونه نمونه خوبی برای سایر دوستانمون هم باشه

یا علی

Abbas Amiri
شنبه 02 دی 1391, 18:51 عصر
با سلام
پس ازاصلاح موارد پستهای قبل ، فایل زیر آماده شد.( مسائل وریزه کاریهای سابفرم بحث خودش را دارد)
ضمن اینکه هیچ کس از روز اول کدنویس حرفه ای نیست، اگر کمی برنامه نویسی VBA اکسس بلد باشید با آزمون وخطا به نتیجه میرسد . واگر رهرو این راهید ، بالاخره باید طی شود