PDA

View Full Version : سوال: نحوه كنترل يك فيلد توسط فيلد ديگر ؟



Profesorjd
سه شنبه 10 فروردین 1389, 02:49 صبح
با سلام
در يك جدول دو فيلد دارم كه هر دو در جدول ممكن است تكراري باشند ولي چون با جدول ديگر ارتباط پيدا كرده‌اند نبايد در ركورد آن جدول تكراري شود . مثلاً شماره دانشجويي كه در جدول دانشجويان تكراري نبايد باشد ولي ممكن است اين دانشجو چند ترم داشته باشد كه طبيعتاً در جدول ترم تكراري مي‌شود . سئوال من اينجاست كه با اين شرط چگونه از تكرار انتخاب ترم توسط اين دانشجو جلوگيري كنم ؟ توضيح اينكه فقط اين يك مثال ( مانند كتب آموزشي ) بود و اصل قضيه چيز ديگري است . توضيح بيشتر اينكه من در يكي از جداول شماره ترتيب قرار داده‌ام براي ترتيب سطر نوشته‌ها و اين نوشته‌ها مانند نامه به شماره آن وابسته هستند پس اگر شماره نامه 1 باشد و نامه 5 سطر داشته باشد شماره 1 ، 5 بار تكرار مي‌شود و ضمن آن سطور با 1 و 2 و ... شماره گذاري مي‌شوند . حال اگر نامه شماره 2 وارد شود و آنهم 5 سطر داشته باشد طبيعتاً شماره 2 نيز 5 بار تكرار مي‌شود و سطور نيز با 1 و 2 و .. شماره گذاري مي‌شوند و الي آخر .
مشكلم اين است كه چگونه كاري كنم تا در هر نامه از تكرار شماره سطور جلوگيري شود و مثلاً در نامه شماره 1 چندبار شماره سطر 1 يا ... تكرار نشود . البته ببخشيد داستان نويسي كردم چون نمي‌شود اصل برنامه را آپلود كنم مجبور به داستان‌نويسي شدم .

انگوران
سه شنبه 10 فروردین 1389, 09:09 صبح
با توجه به چيزي كه من متوجه شدم شما هم مي تونيد در جدول دوم (مثلاً ترم) شماره دانشجو و ترم رو باهم كليد درنظر بگيرد و يا با تابع dlookup جلوي ورود ترم تكراي رو بگيريد .

Profesorjd
سه شنبه 10 فروردین 1389, 11:14 صبح
با سلام و تشكر
نمي‌شود ! ببينيد من مثال زدم تا متوجه موضوع شويد . در همين جدولي كه هر دو با هم وارد مي‌شوند بايد كنترل شوند . نمي خواهم جلوي ورود مقادير تكراري را بگيرم چون چندين حالت تكراري مي‌شوند ( مانند مثالها )
چون ممكن است هم شماره نامه ( شماره دانشجويي ) تكرار شود و هم شماره سطر ( شماره ترم ) . واضحتر اينكه شماره سطر 1 براي چندين نامه وجود دارد پس شماره سطر 1 تكرار مي‌شود ضمن آن شماره نامه 1 هم تكرار مي‌شود چون براي اين نامه 5 سطر وجود دارد . بنظرم كنترل بايد به گونه‌اي باشد كه اگر شماره نامه = بود نبايد شماره سطر تكراري شود يعني براي نامه شماره 1 نبايد دو سطر با شماره 1 وجود داشته باشد . اميدوارم درست توضيح داده باشم .

انگوران
سه شنبه 10 فروردین 1389, 12:10 عصر
اگه بتونين يه فايل فرضي رو ضميمه كنين بهتر ميشه نظر داد چون توضيح اوليه شما نشون مي ده كه شما مي خواي مثلاً براي شماره دانشوئي 10 ترم يك داشته باشي دوباره براي همين شماره دانشجوئي ترم يك داشته باشي كه معقول به نظر نمي رسه .

چون ممكن است هم شماره نامه ( شماره دانشجويي ) تكرار شود و هم شماره سطر ( شماره ترم ) .
ولي چيزي كه در ادامه گفتين

براي نامه شماره 1 نبايد دو سطر با شماره 1 وجود داشته باشد
به همون روشي كه بالا گفتم يعني شماره نامه و شماره سطر رو باهم كليد در نظر بگيرين مشكل حل ميشه
يه روش سومي رو هم مي تونيد تجربه كنين و اون اينه كه يه فيلد سومي تعريف كنين كه شامل شماره نامه و سطر باشه و فيلد سوم تكراري نباشه .
در نهايت اينكه اگه باز هم نشد يه كم بيشتر توضيح بدين تا بر اساس اون خودم يه فايل نمونه ضميمه كنم و اينجوري پيش بريم .

Profesorjd
سه شنبه 10 فروردین 1389, 13:35 عصر
با سلام و تشكر
به فايل ضميمه دقت نماييد :
1- جدول T_K_Hadaf شامل 4 فيلد است . فيلد Id_Onvan به فيلد ID از جدول T_Onvan كه كليد هست مرتبط مي‌باشد .
2- توضيحات را در جدول T_K_Hadaf‌داده‌ام . دقت فرماييد متوجه مشكلم مي‌شويد
3- بنده مي‌خواهم كاري كنم كه كاربر نتواند با توجه به توضيحات داده شده ، در فيلد Tartib در فرم مربوطه شماره تكراري ( اگر شماره عنوان يكي باشد ) وارد كند . با استفاده از تابع DlookUp با شرايط ذكر شده ، نمي‌شود .

انگوران
چهارشنبه 11 فروردین 1389, 10:06 صبح
دوست عزيز من جدول مربوطه رو بر اساس توضيحاتي كه توي جدول بود درست كردم ولي باز فكر مي كنم چيزي كه توي فرم مد نظرت باشه غير از توضيحات جدول باشه چون من توي فرم جائي فيلد id_onvan رو نديدم .

Profesorjd
چهارشنبه 11 فروردین 1389, 13:09 عصر
با سلام و تشكر
1- ظاهراً با كليد تعريف كردن فيلد Tartib‌در جدول و ايندكس نشدن آن امكان درج شماره سطر تكراري نخواهد بود .
2- فيلد ID_Onvan‌ در فرم قرار ندارد چرا كه فرم F_Onvan از فرم و چند سابفرم (‌بصورت تب پيج) تشكيل شده و بوسيله Relationship به فيلد Id از جدول T_Onvan ارتباط 1 به چند دارد . بنابراين عملاً ارتباط پدر فرزندي بين اين دو فيلد برقرار كه هر عددي در شماره روش جاري (ID) وارد مي‌شود در ID_Onvan جدول مربوطه ( در اين مثال جدول T_K_Hadaf )‌ قرار مي‌گيرد .
3- حالا با توجه به بند 1 امكان درج تكراري نيست ولي به كاربر پيغام دهد كه تكراري وارد شده است
4- از راهنمايي و زحمتي كه كشيده‌ايد تشكر مي‌كنم .

انگوران
چهارشنبه 11 فروردین 1389, 13:31 عصر
شما در رويداد on error فرم مربوطه با عبارت msgbox dataerr ابتدا شماره خطا رو پيدا كن بعد با كدي به شكل زير پيغام مورد نظرت رو نشون بده .

If DataErr = 3022 Then
MsgBox "پيغام مورد نظر"
End If
در ضمن موقعي كه فيلدي كليد بشه بصورت اتومات ايندكس هم ميشه

Profesorjd
چهارشنبه 11 فروردین 1389, 17:51 عصر
با سلام و تشكر
1- منظورم از ايندكس نشدن آن تنظيمات تعريف فيلد ، خصوصيت Index=No مي‌باشد . كه ظاهراً جنابعالي با اين روش مشكل بنده را حل كرده‌ايد ( اگر چنين نيست بفرماييد )
2- در رويداد on error فرم مي‌شود اين پيغام را نوشت ولي بعد از پايان ورود اطلاعات در ركورد . اگر مي‌شد كه قبل از خروج از فيلد ( مثلاً در رويدادهاي After Update يا Before Update فيلد) مانند روش DlookUp و روش " جلوگيري از ورود مقادير تكراري " خيلي بهتر است .
3- براي تكميل كد شما مي‌شود قبل و بعد از كد اخطارهاي Error را False‌ و True كرد
4- مشكل بند 2 حل شود نتيجه به اتمام مي‌رسد .
5- مجدداً تشكر مي‌نمايم
6- بنده اين برنامه (بانك) را تكميل‌تر و بهتر كرده‌ام كه در صورت اتمام آن در صورت درخواست دوستان در سايت قرار خواهم داد . ( دو مشكل دارم كه يكي همين موضوع است و دومي در تاپيك " شروع مجدد برنامه اكسس " درخواست نموده‌ام كه در صورت ياري دوستان تكميل‌تر مي‌شود )

Profesorjd
پنج شنبه 12 فروردین 1389, 01:23 صبح
با سلام و تشكر از جناب انگوران و ديگر اساتيد
لطفاً راهنمايي فرماييد تا مشكل رفع گردد .

انگوران
شنبه 14 فروردین 1389, 10:31 صبح
دوست عزيز فكر كنم با نوشتن تكه كد زير در رويداد exit فيلد رديف در فرم ورود اطلاعات مشكلت حل بشه .

If DLookup("radif", "T_Pevast_B_2", "radif='" & Me.Radif & "'" & "and ID_Onvan=" & Forms!f_onvan_1!ID) Then
MsgBox "اين شماره قبلاً ثبت شده"
cancel=true
End If

Profesorjd
شنبه 14 فروردین 1389, 19:47 عصر
با سلام و تشكر
1- بنده نياز دارم كه فيلد ترتيب تكراري شد پيغام دهد نه فيلد رديف
2- با توجه به فرمايش جنابعالي و نيازم ، كد را در رويداد Before Update قرار دادم ولي ايراد Data type Mismatch in criteria مي‌گيرد .

انگوران
یک شنبه 15 فروردین 1389, 06:55 صبح
اين تكه كد رو هم امتحان كن

If DLookup("tartib", "T_K_Hadaf", "tartib=" & Me.Tartib & "and ID_Onvan=" & Forms!f_onvan_1!ID) Then
MsgBox "اين شماره قبلاً ثبت شده"
End If

Profesorjd
یک شنبه 15 فروردین 1389, 20:59 عصر
سلام و با تشكر
مشكل رفع شد . ايراد از همين يك "'" & تيكه بود .
مجدداً تشكر ميكنم