PDA

View Full Version : مشکل در تابع dlookup



amir zahed
پنج شنبه 18 مهر 1392, 07:58 صبح
سلم دوستان
من تو فایلم از dlookup استفاده کردم که دو تا شرط گرفته
حالا میخوام چند شرطی و یک شرطی رو با این تابع بنویسم اما به مشکل برخوردم
دوستان عزیز یه فایل پیوست گذاشتم
میخوام فیلد تحصیلات بر اساس مدرک تحصیلی عدد رو بهم نشون بده
ممنون میشم راهنمایی کنید
موفق باشید

mmbguide
پنج شنبه 18 مهر 1392, 13:25 عصر
سلام

اول از همه من پیشنها میکنم یک جدول بسازید که به هر ردیف یک کد منحصر به فرد صحیح اختصاص بدید. میتونید از Autonumber یا از یک مقدار Integer استفاده کنید و این فیل رو بصورت PrimaryKey تعریف کنید. حالا هر وقت که می خواهید از دستور dlooup استفاده کنید، در قسمت Criteria مربوط به دستور از مقدار کلید اون ردیف استفاده کنید.
من هر وقت از شرط هایی که نام فارسی دارند استفاده مکنم دچار مشکل میشم ولی با تخصیص یک کد منحصر به فرد دیگه به مشکل بر نمیخورید.

حالا من به جدول Table2 یک فیلد Autonumber با نام ID اضافه کردم و در فرم برنامه در Control Source مربوط به TextBox عبارت زید رو نوشتم

=DLookUp("[tahsili]","Table2","[id]=1")

شما میتونید بجای عدد 1 هر عدد دیگه ای رو قرار بدید و یا این عدد رو از جای دیگه بدست بیارید.

amir zahed
جمعه 19 مهر 1392, 21:06 عصر
سلام
ممنون از راهنمایی شما
با این کد فقط همون چیزی که تو شرط میاری برات میاره
من میخوام از توی یه جدول ردیف متناظر با اون رو برام بیاره
مثلاً یه جدول داریم که چهار تا ستون داره و 4 تا ردیف
میخوام با توجه به چیزی که در text box میزنم ردیف متناظر با اون ردیف رو برام بیاره
مثلا اگه ستون دوم ردیف سوم عدد 5 هست با تابع dlookup برام بیاره

mmbguide
جمعه 19 مهر 1392, 22:32 عصر
من داستان رو اینطوری فهمیدم:
فرض میکنیم شما یک فرمی دارید که به صورت countinuous یا با قرار دادن یک Subform اطلاعاتی تعداد 5 نفر از پرسنل رو نمایش میده و شما روی رکورد 3 کلیک کرده اید. حالا شما میخواهید با کلید رو یک دکمه "مثلا جزئیات پرسنل" اطلاعات جزئی اون شخص رو ببنید. این اطلاعات جزئی خودش در یک فرم جداگانه نمایش داده میشه و شما می خواهید این اطلاعات مربوط به شخصی باشه که در فرم قبلی روی رکورد مربوط به اون شخص کلیک کرده بودید.

با فرض درست بودن سناریو:

1- شما یک فرم continous و یا بصورت subform بسازید تا لیست نفرات نمایش داده بشود. پیشنهاد من اینه که جدول پرسنل یا دانش آموزان رو طوری طراحی کنید که یک کلید منحصر بفرد برای هر ردیف داشته باشند و یا حداقل یک فیلد Autonumber داشته باشه و نام اون مثلا ID باشه.
2-فرم دوم خود رو آماده کنید تا اطلاعات پرسنلی با جزئیات نمایش داده بشه. پیشنهاد میکنم قسمت source فرم رو از یک query استفاده کنید. در واقع اون query اطلاعات جدول پرسنل هستش.
3- query ساخته شده رو در نمای طراحی باز کنید و در قسمت Criteria مربوط به فیلد ID عبارت زیر رو بنویسید:

Forms!frmPersonnel!ID.value

4- اگر دوست ندارید که در فرم اصلی فیلد ID نمایش داده نشه میتونید Visible اون رو NO قرار دهید. با این حال مشکلی در گرفتن مقدار این فید برای query پیش نمیاد.

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

mmbguide
جمعه 19 مهر 1392, 22:37 عصر
البته کد Dlookup رو هم میشه اینطور نوشت

=DLookUp("[tahsili]","Table2","[id]=Forms!frmPersonnel!ID.value

درواقع شرط dlookup مقدار ID مربوط به اون ردیفی هستش که الان روی اون کلیک کرده اید.

amir zahed
شنبه 20 مهر 1392, 08:29 صبح
با سلام و تشكر از شما دوست عزيز براي پاسختون به اين تايپيك
منظورم رو تو يك مثال پيوست كردم.
تشكر از وقتي كه براي پاسخ گذاشتيد
موفق باشي

mmbguide
شنبه 20 مهر 1392, 14:03 عصر
سلام دوباره

اول عرض کنم که خود من هم زیاد حرفه ای نیستم. دوم این که امیدوارم ناراحت نشید.

1- موضوع اینه که اولا از نظر طراحی جداول شما ایراد دارند. به این دلیل که هیچ رابطه یا Relation بین اونها برقرار نیست. چون تعداد نفرات مشص شده در جدول دوم مربوط به یک واحد تعریف شده در جدول شماره 1 است. پس بهتره که همیشه بین اونها ارتباط برقرار باشه.

2- ایراد اساسی دیگه در طراحی فرم بود. مقادیر combobox شما بصورت دستی پر شده بودند که چون مقداری هستند قابل تغییر که ممکنه کم یا زیادتر بشوند، پس باید مقدار خودشون رو از جدول و یا یک query بگیرند. در زمان اضافه کردن combobox در فرم از ویزاد استفاده کنید و جدول مورد نظر رو به عنوان منبع داده براش معرفی کنید.

جدا از مورد شماره 1، مورد دوم رو انجام بدید و در قسمت AfterUpdate اون کد زیر رو بنویسید

Me.Text6.Value = DLookup("[fani]", "Table2", "[ID]=tedad.value")

حالا برای اینکه در textbox اخر مقدار 3 نمایش داده بشه و معیار اون، انتخاب گزینه فنی و بعد تعداد نفرات باشه، باشد حتما بین جداول ارتباط برقرار باشه. در غیر اینصورت فقط با انتخاب تعداد نفرات مختلف، عدد مربوط به اون فقط نمایش داده میشه.

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

mmbguide
شنبه 20 مهر 1392, 14:27 عصر
نمونه رو باز کنید و تغییرات رو بررسی بفرمایید

amir zahed
شنبه 20 مهر 1392, 15:31 عصر
سلام دوست عزيز
ممنون از راهنماييتون
دقيقا همون چيزي كه من ميخواستم رو نوشتيد
جالب بود
ممنون از توجهتون
اينطوري ميتونم تو table 2 هر چقدر كه ميخوام قسمت وارد كنم
بازم ممنون و متشكر
موفق باشي

amir zahed
چهارشنبه 24 مهر 1392, 11:01 صبح
سلام دوست عزیز
ممنون از پاسختون

الان 2تا مشکلی دارم.
1- تو جدول اصلیم (main) میخوام اون فبلدی که تو فرم پر میکنم نشون داده بشه اما id رو نشون میده
مثلاً میخوام تو sarparast 1 نشون بده کارگری یا فنی یا ..... اما الان میاد id رو میخونه و تو جدولم نشون میده
2- من چهار فیلد میخوام از این داشته باشم. (sarparast1,2,3,4 ) . اما فقط یکی از اونا را میشه تو after update نوشت کدشو. بقیه رو اجرا نمیکنه.چرا؟
یعنی فقط یک after update میشه تو هر فرم طراحی کرد؟
ممنون

mmbguide
چهارشنبه 24 مهر 1392, 12:17 عصر
سلام

خوب متوجه منظورتون نشدم. اگه امکان داره نمونه فایل بذارید. ممنون

amir zahed
پنج شنبه 25 مهر 1392, 22:07 عصر
سلام دوست عزیز
ببخشید به اینترنت دستریب نداشتم نتونستم زود جواب بدم
نمونه فابل رو گذاشتم
تو جدول table 3 فیلد اشتغال رو با یه کوئری پر کردم
اما بحای کلمه میاد id هم ردیف اونو میاره
ممنون111964

mmbguide
جمعه 26 مهر 1392, 00:03 صبح
سلام دوست گرامی

واقعیت اینه که اساس طراحی جداول ایراد داره.
سعی میکنم یک فایل نمونه بسازم و براتون ارسال کنم.
یک ایراد بزرگ اینه که مثلا اگه شما میخواهید کلمه در فیلد اشتغال در جدول 3 ذخیره بشه پس چرا نوع فیلد اشتغال تو جدول 3 از نوع عددیه؟
در ضمن برای بروز رسانی یک جدول توسط query، توجه داشته باشید که اکسس باید دنبال یک چیز در جدول 3 پیدا کنه که با شرط شما در criteria مطابق کنه، بعد از اون فیلدهای دیگه رو بروزرسانی کنه.

پیشنها میکنم:
1- بین تمام جداول ارتباط برقرار کنید
2- برای خود اشغال یک جدول بسازید که حداقل دارای دو فیلد باشه: شماره و عنوان اشتغال
3- جدول اشتغال رو به تمام جداولی که نیاز دارید ارش استفاده کنید لینک کنید

mmbguide
جمعه 26 مهر 1392, 00:35 صبح
سلام دوباره


به جدول اضافه شده و ارتباط اون با تمام جداول دقت کن (خوبی این کار اینه که اگه عنوان اشتغال بخواد عوض بشه این تغییرات بصورت خودکار در تمام جداول اعمال میشه و حتی میتونه توسط کاربر انجام بشه ولی حالت قبلی باید تمام جداول و فرم ها در نمای طراحی باز بشند و این عنوان ها رو اصلاح کنی و این کار رو کاربر عادی نمیتونه انجام بده و هربار تغییراتی بخواد باید شما رو صدا بزنه)
فرم اصلی هم تغییراتی داره حتما بررسی کن
شرط query رو هم اصلاح کردم حتما توجه کن


اگه سوالی بود بپرس

amir zahed
جمعه 26 مهر 1392, 21:16 عصر
سلام دوست عزیز
من فابل رو دیدم. اما هیچ رکوردی تو جدول 3 نمیشینه
من توسط فرم داده ها رو پر میکنم و کوئری رو اجرا میکنم. اما هیچ رکوردی تو جدول 3 نمیشینه

mmbguide
جمعه 26 مهر 1392, 21:47 عصر
سلام

دوست من علت اینکه هیچ رکوردی نمیشینه برای اینه که Query شما از نوع Update بوده. یعنی شرطی رو که دادین میره میگرده اون رکورد ها رو پیدا میکنه و اگه پیدا کرد تعداد نفرات رو بروز رسانی میکنه. به همین سادگی

mmbguide
جمعه 26 مهر 1392, 21:56 عصر
شما باید از Append Query استفاده کنید. چیز پیچیده ای نیست میتونی به راهتی این کارو انجام بدی