PDA

View Full Version : مبتدی: بررسی رکورد تکراری قبل از ارسال اطلاعات



mahmooddavoodi
پنج شنبه 12 شهریور 1394, 11:23 صبح
134881
سلام به همه اساتید عزیز..به کمک بعضی از اساتید تونستم یه بانک درست کنم که نیمه کاره مونده تقاضا دارم راهنمایی کنید. توضیح اینکه در یک فرم یک لیست باکس دارم که مولتی سلکت هست و چند فیلد دیگه هم هست..با انتخاب چندتا اسم (مثلا علی ومحمد) از لیست باکس و فشردن دکمه درج اطلاعات، به تعداد انتخاب ها از لیست باکس، توی یک جدول جدید رکورد درست میشه که اطلاعات موجود روی فرم با هریک از اسم های لیست باکس جداگانه یک رکورد میشن.مثلا اطلاعات موجود در فرم یک بار به علی اختصاص داده میشه و یک رکورد ایجاد میشه و یک بار به محمد اختصاص داده میشه و یک رکورد دیگه ایجاد میشه.
اما مشکل: باهر بار که دکمه روی فرم کلیک میشه رکورد ایجاد میشه در نتیجه رکوردهای تکراری درست میشه..میخوام قبل از ایجاد رکورد در جدول مقصد ، بررسی کنه که تکراری نباشه و در صورت تکراری بودن پیغام بده و از ایجاد رکورد تکراری جلوگیری کنه.. با تشکر

mahmooddavoodi
شنبه 14 شهریور 1394, 10:13 صبح
سلام به همه اساتید معظم..بنده شخصا تجربه خیلی خوبی توی این سایت از توجه اساتید به مشکلاتم دارم ولی نمی دونم چرا جدیدا بعد از در خواست راهنمایی باید یه پست خواهش و التماس هم بزارم.البته اینو بگم که اصلا خودمو طلبکار نمی دونم و توجه دوستان رو از روی بزرگواری می دونم..اما چون همیشه لطف داشتید آدم انتظار داره بازم لطف کنید..بازم ممنونم بخصوص از آقای امیری عزیز

abas1388
شنبه 14 شهریور 1394, 11:40 صبح
سلام به همه اساتید معظم..بنده شخصا تجربه خیلی خوبی توی این سایت از توجه اساتید به مشکلاتم دارم ولی نمی دونم چرا جدیدا بعد از در خواست راهنمایی باید یه پست خواهش و التماس هم بزارم.البته اینو بگم که اصلا خودمو طلبکار نمی دونم و توجه دوستان رو از روی بزرگواری می دونم..اما چون همیشه لطف داشتید آدم انتظار داره بازم لطف کنید..بازم ممنونم بخصوص از آقای امیری عزیز


سلام دوست عزیز !
فکر کنم تاپیک زیر را دقیقاً یکبار از اول مرور بفرمائید جواب سوالت می رسید .
یک نصیحت دوستانه :
سعی کنید در درخواست راهنمائی و کمک از شخص خاصی نام نبرید که این کار ممکن است دو پیامد در پی داشته باشد .
1- آن شخص در معذورات اخلاقی قرار بگیرد و علیرغم میل باطنی (به دلایل مختلف ) مجبور به پاسخ دادن شود .
2- بی انگیزگی و حس ... در دیگران ایجاد گردد .
موفق باشید

http://barnamenevis.org/showthread.php?206652-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AF%D9%83%D9%85%D9%87-%D8%AA%D8%B4%D9%83%D8%B1-%D8%8C-%D8%AC%D9%87%D8%AA-%D8%AF%D9%84%DA%AF%D8%B1%D9%85%D9%8A-%D9%88-%D8%AA%D8%B4%D9%88%D9%8A%D9%82

mahmooddavoodi
شنبه 14 شهریور 1394, 12:20 عصر
سلام به شما استاد گرامی.ممنون از توجه شما به تاپیک بنده یه نکته عرض کنم و اون این که تاپیکی رو که گفتین مطالعه کردم و ربطشو با خودم پیدا نکردم و اگه منظورتون تشکره من همیشه تشکر کردم از کسانی که بهم جواب دادن و اگر منظورتون طولانی بودن جوابه که توی همون تاپیک آقای قربانی اشاره کردند که گاهی یک جواب دو سه روز زمان می بره،پس هستند اساتیدی که برای جواب دادن وقت میزارن هر چند که شاید شما موافق نباشین. گرچه جواب سوال من نباید اونقدر سخت باشه چون آقای محمدصالح الگوریتمشو گفتند ولی من نتونستم انجام بدم
http://barnamenevis.org/showthread.php?505581-ورود-اطلاعات-در-چند-رکورد-به-صورت-همزمان&highlight=%D9%88%D8%B1%D9%88%D8%AF+%D9%87%D9%85%D8 %B2%D9%85%D8%A7%D9%86+%DA%86%D9%86%D8%AF+%D8%B1%DA %A9%D9%88%D8%B1%D8%AF


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

mahmooddavoodi
یک شنبه 15 شهریور 1394, 11:36 صبح
با سلام مجدد .. دوستان اگر کسی میتونه لطفا جواب سوال بنده رو بده (پست اول در همین تاپیک) متشکرم

Abbas Amiri
یک شنبه 15 شهریور 1394, 12:51 عصر
با سلام مجدد .. دوستان اگر کسی میتونه لطفا جواب سوال بنده رو بده (پست اول در همین تاپیک) متشکرم

سلام
دوست عزیر همان طور که آقای abbas1388 به درستی تذکر دادند ، بهتر است از شخص خاصی نام نبرید و فقط تقاضای خودتان را مطرح کنید ، همان پست دومتان باعث شد تا برای شما راه حلی ننویسم ، چون این طور نگرش جفای به دیگر دوستانی است که حتی بیش از بنده در تالار اقدام به راهنمایی و ارائه راه حل می کنند.
برای موضوع مورد بحث شما ، باید کد دانشجو را هم به جدول Table1 انتقال دهید چون ممکن است نام تکراری وجود داشته باشد .
در آن صورت می توانید با تابع DCount از وجود کد مورد نظر در جدول مقصد مطلع شوید و انتقال جهت آن کد انجام نشود .
یک راه دیگر هم میتوانید یک فیلد Yes/No به جدول 3 اضافه کنید و در هنگامانتقال نام دانشجو مقدار آنرا ُYes کنید . البته در این حالت باید در RowSource لیست باکس فقط رکوردهایی که چک نخورده اند نمایش داده شوند.

mahmooddavoodi
یک شنبه 15 شهریور 1394, 13:13 عصر
با تشکر از جناب استاد امیری..مجددا باید بگم که منظورم از نام بردن از حضرتعالی اصلا اون چیزی نبود که شما فکر کردین و در واقع به اون نکاتی که آقای abbas1388 گفتند توجه نداشتم و ای کاش شما به جای اینکه جواب منو ندین اشکال کارم رو می گفتین.بالاخره آدمیزاد جایزالخطاست.من باز هم از همه اساتیدی که قبل از شما بودن و اساتیدی که در حال حاضر بزرگواری می کنن و جواب می دن تشکر می کنم و خیلی خوشحالم که شماها علاوه بر مباحث فنی به ارزشهای اخلاقی هم توجه دارین.. من راه حل شما رو انجام می دم ولی اگه نشد بازم مزاحم میشم.متشکرم

alirezabahrami
یک شنبه 15 شهریور 1394, 13:17 عصر
با سلام مجدد .. دوستان اگر کسی میتونه لطفا جواب سوال بنده رو بده (پست اول در همین تاپیک) متشکرم

سلام
از کد زیر در ایونت AfterUpdate لیست باکس استفاده کن !


Dim strname As String
strname = esm.Column(0)
If Len(DLookup("nam", "Table1", "nam = '" & strname & "'") > 0) Then
Me.esm.Selected(0) = False
MsgBox "!äÇã ÇäÊÎÇÈ ÔÏå ʘÑÇÑí ÇÓÊ ", vbOKOnly + vbInformation, "!ÊæÌå"
Exit Sub
End If

mahmooddavoodi
یک شنبه 15 شهریور 1394, 14:15 عصر
سلام
از کد زیر در ایونت AfterUpdate لیست باکس استفاده کن !


Dim strname As String
strname = esm.Column(0)
If Len(DLookup("nam", "Table1", "nam = '" & strname & "'") > 0) Then
Me.esm.Selected(0) = False
MsgBox "!äÇã ÇäÊÎÇÈ ÔÏå ʘÑÇÑí ÇÓÊ ", vbOKOnly + vbInformation, "!ÊæÌå"
Exit Sub
End If



خیلی عالی بود متشکرم..کد شما باعث میشه اگه بخوام دوباره از لیست، اسم تکراری انتخاب کنم پیغام بده ولی اگه روی دکمه درج اطلاعات مجدد کلیک کنم پیغام نمی ده و اطلاعات تکراری باز هم وارد میشه

alirezabahrami
یک شنبه 15 شهریور 1394, 14:49 عصر
خیلی عالی بود متشکرم..کد شما باعث میشه اگه بخوام دوباره از لیست، اسم تکراری انتخاب کنم پیغام بده ولی اگه روی دکمه درج اطلاعات مجدد کلیک کنم پیغام نمی ده و اطلاعات تکراری باز هم وارد میشه
سلام
چنانچه میدانستم جناب امیری در حال تهیه و ارسال پاسخ شما است از ارسال پاسخ خودداری می کردم چرا که راهکاری که ایشان ارائه دادند منطقی می باشد .
از طریق نام بطور دقیق نمیتوانید اطمینان کنید که نامی که در لیست باکس انتخاب می کنید قبلاً در جدول ثبت شده یا نه ؛ به فرض اگر اسم علی به صورت علي در جدول ثبت شده باشد ودر لیست باکس بصورت علی وارد شده باشد در اینجا پیغام تکراری بودن نام صادر نمی شود .
علی ایحال چنانچه در کدهای قبلی بجای کد Me.esm.Selected(0) = False از کد Me.esm.Selected(esm.ListIndex) = False
استفاده کنید در همان مرحله سلکت کردن لیست باکس در صورت تکراری بودن نام اجازه انتخاب مجدد به شما داده نمیشود .البته بهتر است این کد را بعد از پیغام فارسی درج نمائید .

ضمناً کدهای زیر را جایگزین کدهای درج شده در رویداد Command7_Click کن !


Set db = CurrentDb
Dim rst As Recordset
Dim sql As String
sql = "SELECT * FROM Table1"
Set rst = CurrentDb.OpenRecordset(sql, dbOpenDynaset)
For i = 0 To esm.ListCount
If esm.Selected(i) Then
If Len(DLookup("nam", "Table1", "nam = '" & esm.Column(0) & "'") > 0) Then
MsgBox " نام " & esm.ItemData(i) & " قبلاً ثبت شده", vbOKOnly + vbInformation, "!توجه"
Me.esm.Selected(i) = False
End If
End If
Next i
For i = 0 To esm.ListCount - 1
If esm.Selected(i) Then
With rst
.AddNew
.Fields("ostad").Value = ostadd()
.Fields("clas").Value = class()
.Fields("nam").Value = Forms!form1!esm.Column(0, i)
.Update
End With
End If
Next i


ببخشید من الآن مشغول یک کار دیگه هستم و درست تست نکردم ببینم کدها درسته یا نه ؟
مشکلی داشت بگو تا انشاءالله سر فرصت اصلاح شود .
یا علی

mahmooddavoodi
یک شنبه 15 شهریور 1394, 23:27 عصر
جناب آقای بهرامی خیلی متشکرم..کدها درست کار می کنه..

mahmooddavoodi
دوشنبه 16 شهریور 1394, 08:42 صبح
135052
سلام مجدد..در نمونه قبلی فقط فیلد نام از لیست باکس انتخاب و به table1منتقل می شد و برای جلوگیری از تکرار نیز فقط فیلد نام بررسی می شد در نتیجه اگر دو نفر، هم اسم باشند نفر دوم به جدول منتقل نمی شود.بر اساس کد دانشجویی نیز مشکلش اینه که یک دانشجو ممکنه در چند دوره شرکت داشته باشه و لازم باشه چندبار وارد جدول بشه..در نمونه جدید همه فیلدهای لیست باکس به table1 منتقل میشه ..میخوام اگه بشه قبل از ارسال اطلاعات به table1 همه فیلدها (کل رکورد) از نظر تکراری بودن بررسی بشن..
متشکرم

alirezabahrami
دوشنبه 16 شهریور 1394, 23:25 عصر
135052
سلام مجدد..در نمونه قبلی فقط فیلد نام از لیست باکس انتخاب و به table1منتقل می شد و برای جلوگیری از تکرار نیز فقط فیلد نام بررسی می شد در نتیجه اگر دو نفر، هم اسم باشند نفر دوم به جدول منتقل نمی شود.بر اساس کد دانشجویی نیز مشکلش اینه که یک دانشجو ممکنه در چند دوره شرکت داشته باشه و لازم باشه چندبار وارد جدول بشه..در نمونه جدید همه فیلدهای لیست باکس به table1 منتقل میشه ..میخوام اگه بشه قبل از ارسال اطلاعات به table1 همه فیلدها (کل رکورد) از نظر تکراری بودن بررسی بشن..
متشکرم
سلام
نمونه اصلاح شده را بررسی کن !
یا علی

mahmooddavoodi
سه شنبه 17 شهریور 1394, 11:37 صبح
جناب آقای بهرامی از این بهتر نمی شد..اگه باز مشکلی بود مزاحمتون میشم..متشکرم

mahmooddavoodi
سه شنبه 17 شهریور 1394, 11:51 صبح
یه مشکل هنوز هست..اگه ملاحظه کنید ردیف 283 و 287 در table1 تکراری هستند..و هر دو فیلد با زدن دکمه درج اطلاعات، منتقل شده به table1

mahmooddavoodi
سه شنبه 17 شهریور 1394, 13:17 عصر
سلام ببخشید که من مشکلات رو جدا جدا میگم.علاوه بر مشکلی که در پست قبل گفتم مشکل دیگه اینه که توی نمونه ای که زحمت کشیدید دو فیلد کد و دوره بررسی میشه در حالی که یک اسم با یک کد و یک دوره اشکالی نداره که تکرار بشه بلکه لازمه که تکرار بشه چون یک نفر با کد و دوره یکسان ممکنه چندتا کلاس شرکت کنه..قبلا هم که گفتم کل رکورد بررسی بشه منظورم همین بود.درواقع فیلدهای لیست باکس تکرار پذیر هستند.اونی که نباید تکراری باشه شرکت دانشجوی X در کلاسY هست..بطور مثال علی علوی با کد 110 دوره الف در کلاس تحلیل شرکت کرده و دوباره علی علوی با کد110 دوره الف در کلاس بررسی شرکت کرده. پس مجموع اطلاعات فردی به اضافه کلاس و استاد نباید تکراری باشه.متشکرم

alirezabahrami
سه شنبه 17 شهریور 1394, 14:58 عصر
سلام ببخشید که من مشکلات رو جدا جدا میگم.علاوه بر مشکلی که در پست قبل گفتم مشکل دیگه اینه که توی نمونه ای که زحمت کشیدید دو فیلد کد و دوره بررسی میشه در حالی که یک اسم با یک کد و یک دوره اشکالی نداره که تکرار بشه بلکه لازمه که تکرار بشه چون یک نفر با کد و دوره یکسان ممکنه چندتا کلاس شرکت کنه..قبلا هم که گفتم کل رکورد بررسی بشه منظورم همین بود.درواقع فیلدهای لیست باکس تکرار پذیر هستند.اونی که نباید تکراری باشه شرکت دانشجوی X در کلاسY هست..بطور مثال علی علوی با کد 110 دوره الف در کلاس تحلیل شرکت کرده و دوباره علی علوی با کد110 دوره الف در کلاس بررسی شرکت کرده. پس مجموع اطلاعات فردی به اضافه کلاس و استاد نباید تکراری باشه.متشکرم
سلام
1- در نمونه ، عنوان کلاس بررسی موجود نیست
2- با الگو گرفتن از کدهای فایل نمونه ، خودت آیتم کلاس و استاد را هم به شرط DLookup اضافه کن !
یا علی

mahmooddavoodi
سه شنبه 17 شهریور 1394, 19:37 عصر
سلام
1- در نمونه ، عنوان کلاس بررسی موجود نیست
2- با الگو گرفتن از کدهای فایل نمونه ، خودت آیتم کلاس و استاد را هم به شرط DLookup اضافه کن !
یا علی

سلام این کارا رو که گفتین انجام دادم..اما مشکل اصلی اونیه که توی سه پست قبل گفتم اجازه بدین ماجرای مشکل رو اینجوری تعریف کنم:
1- از کومبوی دوره نام دوره(مثلا الف) رو انتخاب کنید
2-ردیف اول از لیست باکس رو انتخاب کنید
3- بر روی درج اطلاعات کلیک کنید.(اطلاعات ردیف اول به table1 منتقل میشه).
4-از کومبوی دوره نام دوره دیگه ای (مثلا ب) رو انتخاب کنید.
5-ردیف اول از لیست باکس رو انتخاب کنید.(بر روی درج اطلاعات کلیک نکنید).
6- حالا مجددا دوره الف رو انتخاب کنید.(ملاحظه می کنید که ردیف اول هنوز در حالت سلکت باقی مونده)
7- بر روی درج اطلاعات کلیک کنید(اطلاعات ردیف اول با وجود این که تکراریه ذوباره به table1 منتقل میشه)
من برای حل این مشکل کد Me.esm.Selected(esm.ListIndex + 1) = False رو به ایونت AfterUpdate کومبوی دوره اضافه کردم.. اما فکر می کنم خیلی منطقی نباشه..

alirezabahrami
سه شنبه 17 شهریور 1394, 20:59 عصر
من برای حل این مشکل کد Me.esm.Selected(esm.ListIndex + 1) = False رو به ایونت AfterUpdate کومبوی دوره اضافه کردم.. اما فکر می کنم خیلی منطقی نباشه..
سلام
وقتی ازلیست کمبو دوره را عوض می کنید منطقی است که لیست باکس از حالت انتخاب خارج شود و شما برای اینکار می توانید :
Call ClearList(Me.esm) را جایگزین Me.esm.Selected(esm.ListIndex + 1) = False کنید !

یا علی

mahmooddavoodi
چهارشنبه 18 شهریور 1394, 00:05 صبح
سلام
بعنوان مثال ردیف اول و دوم از لیست باکس رو جهت انتقال سلکت میکنم (تا اینجا مشکلی پیش نمیاد) ردیف سوم رو که سلکت میکنم پیغام میده که ردیف سوم قبلا منتقل شده و وقتی ok می کنم ردیف سوم از حالت سلکت خارج میشه ولی ردیف یک و دو هنوز در حالت سلکت هست..قاعدتا باید با کلیک دکمه درج اطلاعات،ردیف یک و دو به table1 منتقل بشه ولی وقتی کلیک میشه پیغام ثبت تکراری میده در حالی که تکراری نیستند..

alirezabahrami
چهارشنبه 18 شهریور 1394, 09:15 صبح
سلام
بعنوان مثال ردیف اول و دوم از لیست باکس رو جهت انتقال سلکت میکنم (تا اینجا مشکلی پیش نمیاد) ردیف سوم رو که سلکت میکنم پیغام میده که ردیف سوم قبلا منتقل شده و وقتی ok می کنم ردیف سوم از حالت سلکت خارج میشه ولی ردیف یک و دو هنوز در حالت سلکت هست..قاعدتا باید با کلیک دکمه درج اطلاعات،ردیف یک و دو به table1 منتقل بشه ولی وقتی کلیک میشه پیغام ثبت تکراری میده در حالی که تکراری نیستند..
سلام
ببخشید بنده خیلی فرصت امتحان کردن کامل کدها را ندارم به همین لحاظ خودت امتحان کن تا انشاءالله بطور کامل ایرادات برطرف شود .
در DLookup رویداد Command7 در تیکه کد :



"cod = '" & esm.Column(3) & "'

بجای عدد 3 از I استفاده کن .
ضمناً لازم است در همین رویداد در ابتدای کدها برای چک کردن انتخاب ردیف های لیست باکس از کد زیر استفاده کنید :



If esm.ItemsSelected.Count = 0 Then
MsgBox "ÑÏíÝí ÇÒ áíÓÊ ÇäÊÎÇÈ äÑÏíÏå ", vbInformation, "ÎØÇ"
Exit Sub
End If

متن پیغام ردیفی از لیست انتخاب نگردیده می باشد
یا علی