PDA

View Full Version : فیلد ثابت یا رکورد تکراری



Sheerkoshan
یک شنبه 20 فروردین 1385, 20:32 عصر
با سلام
یه جدول از اشخاص کارمند یک اداره با کد ایندکس , یک جدول از ماموران بازرسی با کد ایندکس داریم حالا میخواهیم بازرسان فرمهایی مثلا فرم 1 هنگام بازرسی از عملکرد آن کارمندان پرکرده در جدولی سومی وارد کنیم حالا سوال
ایتم های فرم1 که مثلا حدود 50 سوال است که برای هر کارمند پر میشود چگونه بکار گرفته شود ؟
1- هر سوال یک فیلد جدول سوم گردد
2- تمام سوالات رکوردهای یک جدول چهارمی باشد به اضافه فیلد پاسخ ها و این جدول بعنوان subform در یک فرم بکار رود و بعد از ورود پاسخها , پاسخها به جدول سوم apply شود .

3- یه راه بهتر که شما پیشنهاد بدید .............

متشکرم

MMAASS
یک شنبه 20 فروردین 1385, 23:18 عصر
سوالها برای همه اشخاص و همیشه ثابت هستند؟ یا نسبت به افراد مختلف فرق دارن و نیز امکان اضافه شدن آنها هم هست؟

Sheerkoshan
دوشنبه 21 فروردین 1385, 09:44 صبح
با سلام
عرض کردم سوالات فرم برای همه یکسان است

MMAASS
دوشنبه 21 فروردین 1385, 22:36 عصر
برای سوالها و پاسخها باید دو جدول در نظر بگیرین :
یکی برای اطلاعاتی که تکرار نمی شن مانند زمان بازرسی - بازرس - شخص بازرسی شونده و آیتمهای دیگه که من در جریانشون نیستم + یک کد یکتا (کلید)
و یکی دیگه هم برای اطلاعاتی که تکرار می شن مانند سوالها و جواب ها + کد خارجی (همون کلیدی که در جدول اصلی بود)
فقط باید یک جدول جدا برای سوالها طرح کنین و در اون همه سوالها رو وارد کنین و براش یه کد به عنوان کلید بذارین تا توی اون جدول (جدول سوالهای هر شخص) از این کد استفاده بشه.

Sheerkoshan
سه شنبه 22 فروردین 1385, 11:58 صبح
دوست من
آیا منظورتون اینه که سوالات که تکرار میشن و قرار است در یک جدول مجزا قرار گیرند , رکوردهای جدول مذبور باشند ویا فیلد های مجزا که هرکدام کلید یگانه بگیرند ؟
مشکلم هم از اول همین بود . خودم سوالات را ثابت و به عنوان فیلدهای یک جدول طراحی کردم اما در یه برنامه مشابه دیدم سوالات فرم را بصورت رکورد های جدول قرار داده . برای همین در طراحی و الگوریتم برنامه خودم دچار شک شدم که این دوست چگونه از جدول سوالات (سوالات رکورد قرار گرفته نه فیلد ) در برنامه استفاده کرده برای همین به دوستان این فوروم پناه آوردم تا بهترین راه حل را بدست بیاورم .
از محبت شما متشکرم و منتظر پاسخ شما هستم .
برنامه قرار است شکایات را ثبت ودر صورت مثبت بودن رای یک نمره منفی منظور کند و از طرفی فرم ها و پرسشنامه هایی باید توسط بازرسان تکمیل و نمرات داده شده در آخر جمع گردد و در نهایت نمرات منفی شکایات را از نمرات اکتسابی از فرمها و پرسشنامه ها کسر کند و امتیاز نهایی بدست آید به اضافه یه عالمه گزارش , نمودار و ........

امیدوارم واضح بیان کرده باشم

MMAASS
یک شنبه 27 فروردین 1385, 22:05 عصر
سوالات باید به عنوان رکورد برای یک جدول درنظر گرفته بشن. مثل طراحی همون برنامه ایی که دیدین. این طور مزیتهای زیادی داره.
و در یه جدول دیگه یه فیلد باید باشه برای سوال (که کد سوال مربوطه در جدول قبل ذخیره میشه) و یک فیلد هم برای جواب .
اگه چیزهای دیگه هم دارین باید براش فیلد درنظر بگیرین. البته کلید هم فراموش نشه.

معذرت می خوام که جوابتون یه مقدار طول کشید.
امیدوارم به جوابتون رسیده باشین.

Sheerkoshan
دوشنبه 28 فروردین 1385, 19:35 عصر
دوست با صفا
اگه سوالات پرسشنامه رو توی یه جدول جدا بریزم اونوقت موقع ذخیره برای هرفرد کل سوالات با جواباش باید ذخیره بشه یعنی اگه 1000 نفر داشته باشم و 200 سوال رکوردهای جدولم به 200000 می رسه ؟
اگه منظورتون رو درست نگرفتم لطفا یه کم روشنتر توضیح بدید ممنون می شم

MMAASS
جمعه 01 اردیبهشت 1385, 21:16 عصر
دوست عزیز منظورم رو درست متوجه شدین.
اما یادتون باشه که برای هر شخص به جای هر سوال (یا همه سوالها) کد سوالها ذخیره می شه.
در ضمن شما با زیاد شدن رکوردهای جدول مشکلی دارین؟

Sheerkoshan
جمعه 01 اردیبهشت 1385, 22:23 عصر
دوست عزیز ضمن تشکر از بذل توجه حضرتعالی باید عرض کنم توی این قسمت واقعا مشکل دارم . من جدولی دارم که توی اون نمرات بدست آمده از سوالات ارزشیابی باید ثبت گردد یعنی برای هر فرد بازرسی شونده که یک کد یونیک دارد نمره هر سوال مشخص باشد تا بتوان در صورت لزوم آنرا فراخوانی و اصلاح نمود . از طرفی سوالات فرمها (حدود 150 سوال ) باید به قول حضرتعالی به عنوان رکورد در جدول دیگری قرار گیرد تا کاربر بتواند در سوالات تغییر اصلاح یا حتی کم و زیاد کند . یعنی ممکن است به تعداد سوالات اضافه و یا از آن کم گردد . حال سوالم اینست اگر سوالات در جدولی دیگر باشد (که در آن سوالات رکوردند چگونه نمرات مقابل آن به جدول اصلی منتقل شوند . واقعا گیج شده ام یه نگاهی به نمونه ارسالی بیاندازید .
منتظر می مانم با تشکر فراوان

MMAASS
شنبه 02 اردیبهشت 1385, 11:28 صبح
سلام دوست عزیز
چون برنامه شما با اکسس پروجکت بود متاسفانه من نتوانستم به جداول شما دست پیدا کنم. یعنی بانک شما بدون جدول بود و فقط فرمها قابل رویت بود.
اما سعی می کنم یه نمونه برای شما ارسال کنم.

Sheerkoshan
شنبه 02 اردیبهشت 1385, 14:15 عصر
دوست من خیلی لطف می کنید من سوالات ارزشیابی را به فرمهای الف ب ج تقسیم کردم با ملاکها و ارزیابهای مختلف که با انتخاب هر کدام از فرمها سوالات ویژه آن فرم به نمایش در می آید . به این نتیجه رسیدم که هر سوال با ملاک خاص باید به صورت رکورد جدول ارزشیابی قرار گیرد تا بتوان مقایسه ها در گزارشات را به راحتی انجام داد . اما حالا باید سوالات و پاسخهای آنها را یکی یکی وارد کنم . آیا راهی است که سوالات یک فرم را یکجا با پاسخهایش به عنوان رکورد های جدول با زدن یک دگمه ثبت کنم ؟

MMAASS
دوشنبه 04 اردیبهشت 1385, 14:47 عصر
سلام دوست عزیز
همون طور که به شما قول داده بودم براتون یه نمونه آماده کردم.
برنامه زیر رو یه نگاهی کنید ببینید این همون چیزی است که می خواهید؟ :متفکر: یا من درست متوجه منظور شما نشدم .
من این برنامه رو آماده کردم و اینجا گذاشتم فقط یکی دو تا اشکال کوچیک داره که در صورتی که از نظر عملکرد مطابق میلتونه بقیش هم قابل حله. :چشمک:
امیدوارم اون چیزی باشه که دنبالش هستین.
فقط یه چیزی برنامه رو باز که کردین فرم "Bazrasi_Asli" رو باز کنید و اطلاعات رو وارد کنید.

Sheerkoshan
دوشنبه 04 اردیبهشت 1385, 19:34 عصر
دوست عزیز از محبت شما نهایت تشکر را دارم واقعا جالب بود یه روشی جز آنکه خودم عمل کرده بودم فقط یه اشکال دارد . اولا اولین رکوردها که باید ثبت شوند سوالات یکی یکی باید اضافه شوند دوما اگر بازرسی مثلا فرم الف را در طول سال پرکند و هر دفعه قسمتی از سوالات فرم را مجبور باشد ثبت کند , موقع فراخوانی سوالات فقط سوالاتی در subform مشاهده می شود که قبلا ثبت شده باشد . و این کار را کمی مشکل می کند .
دوست من یه فکر دیگر به سرم زد البته اگر شما بفرمایید که شدنی هست یا نه .
ما مثلا 2 جدول داریم یکی اشخاصی که باید ارزشیابی شوند و دوم جدول سوالات . حال اگر بتوانیم بازدن یک دگمه و یا یک تکه کد از این دو جدول , جدول سومی ساخته شود که در یک رکورد خود در ازاء هر کد یونیک (فرد ارزشیابی شونده) یک کد سوال و بقیه فیلدهای لازم را دارا باشد .
یعنی اینکه ما می خواهیم با وارد کردن 200 سوال برای هر فرد (مثلا 100 نفر) حدود 20000 رکورد ثبت کنیم خوب این رکورد را در ابتدا با ترکیب دو جدول انجام می دهیم و با فراخوانی سوالات بخصوصی نمرات آنها را وارد می کنیم . اگر این کار شدنی باشد خیلی بهتر است . حالا شما بفرمایید آیا چنین کاری ممکن هست یا خیر ؟
منتظر نظر حضرتعالی هستم چون شدیدا گیر گرده ام .
در ضمن یه لطفی هم بکن در مورد آدرس دادن توی criteria در query در AccessProject وقتی می خوایم آدرس یه مثلا کومبوباکس توی یه فرم رو بدیم چه کنیم . توی کوری های اکسس این کار را راحت انجام می دادم . ولی .....
forms]![myform]![mycombo] or [forms]![myform]![mycombo] is null]

MMAASS
سه شنبه 05 اردیبهشت 1385, 10:29 صبح
اولا اولین رکوردها که باید ثبت شوند سوالات یکی یکی باید اضافه شوند
من منظور شما رو از این قسمت متوجه نشدم یعنی اینکه کاربر خودش سوالها رو انتخاب کنه؟ (مثلا تو یه کامبو باکس همه سوالات مربوط به هر فرم باشه و کاربر از اونجا بتونه سوالها رو انتخاب کنه؟ منظورتون اینه؟)
آخه گفته بودین :

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

دوما اگر بازرسی مثلا فرم الف را در طول سال پرکند و هر دفعه قسمتی از سوالات فرم را مجبور باشد ثبت کند , موقع فراخوانی سوالات فقط سوالاتی در subform مشاهده می شود که قبلا ثبت شده باشد . و این کار را کمی مشکل می کند .

شما نگران چی هستین؟ نگران سوالاتی که بعدن ممکنه به فرم اضافه بشن؟ کاری نداره می شه اونا رو ادیت کرد و اضافه.
اما خودتون گفتین که :

با سلام

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

دوست من یه فکر دیگر به سرم زد البته اگر شما بفرمایید که شدنی هست یا نه .
ما مثلا 2 جدول داریم یکی اشخاصی که باید ارزشیابی شوند و دوم جدول سوالات . حال اگر بتوانیم بازدن یک دگمه و یا یک تکه کد از این دو جدول , جدول سومی ساخته شود که در یک رکورد خود در ازاء هر کد یونیک (فرد ارزشیابی شونده) یک کد سوال و بقیه فیلدهای لازم را دارا باشد .
یعنی اینکه ما می خواهیم با وارد کردن 200 سوال برای هر فرد (مثلا 100 نفر) حدود 20000 رکورد ثبت کنیم خوب این رکورد را در ابتدا با ترکیب دو جدول انجام می دهیم و با فراخوانی سوالات بخصوصی نمرات آنها را وارد می کنیم . اگر این کار شدنی باشد خیلی بهتر است . حالا شما بفرمایید آیا چنین کاری ممکن هست یا خیر ؟

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

در ضمن یه لطفی هم بکن در مورد آدرس دادن توی criteria در query در AccessProject وقتی می خوایم آدرس یه مثلا کومبوباکس توی یه فرم رو بدیم چه کنیم . توی کوری های اکسس این کار را راحت انجام می دادم . ولی .....
forms]![myform]![mycombo] or [forms]![myform]![mycombo] is null]
چشم این مورد رو هم چک میکنم و کدش رو براتون می ذارم. چون من معمولا با اکسس پروجکت کار نمی کنم در ضمن تا به کدی هم مطمئن نباشم اینجا نمی ذارم. پس بعد از اینکه به جواب رسیدم حتما بهتون اطلاع می دم.

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

Sheerkoshan
سه شنبه 05 اردیبهشت 1385, 10:38 صبح
واقعا متشکرم این کارو روی برنامم پیاده میکنم و اشکالاتمو به عرضتون می رسونم

Sheerkoshan
سه شنبه 05 اردیبهشت 1385, 16:52 عصر
دوست من وقتی بیشتر دقت کردم متوجه شدم کار شما کار جالبی بود . سعی می کنم روش فکر کنم و مشکلاتمو حل کنم فقط یه چیز .... اونم اینکه اگر شما اشتباها پرسشنامه ای را در دودفعه متفاوت زمانی باBazrasiID متفاوت ثبت کنی اونوقت این فراخوانی سوالات بدون اینکه ایراد بگیره و یا javab قبلی رو نشون بده که شما متوجه بشین این امتیازات قبلا وارد شده , رکوردهای جدید رو می پذیره و اینجای کار عیب مهمیه به نظرتون چیکار می تونیم بکنیم ؟
بازم تشکر می کنم از بذل توجه شما

MMAASS
سه شنبه 05 اردیبهشت 1385, 22:30 عصر
دوست من وقتی بیشتر دقت کردم متوجه شدم کار شما کار جالبی بود . سعی می کنم روش فکر کنم و مشکلاتمو حل کنم فقط یه چیز .... اونم اینکه اگر شما اشتباها پرسشنامه ای را در دودفعه متفاوت زمانی باBazrasiID متفاوت ثبت کنی اونوقت این فراخوانی سوالات بدون اینکه ایراد بگیره و یا javab قبلی رو نشون بده که شما متوجه بشین این امتیازات قبلا وارد شده , رکوردهای جدید رو می پذیره و اینجای کار عیب مهمیه به نظرتون چیکار می تونیم بکنیم ؟
بازم تشکر می کنم از بذل توجه شما
دوست عزیز من فکر نمی کنم وارد کردن شماره BazrasId یا چیزی مثل این توسط کاربر کار صحیحی باشه بلکه شما می تونی این فیلد رو AutoNumber بگیری تا برای هر رکورد یک کلید یکتا ساخته بشه. در ضمن اگه بازم یه کمی دقت کرده باشی من اصلا روی این جنبه های برنامه و انتخاب فیلدها و مسائل این چنینی که مطرح کردین کار نکردم بلکه فقط هدفم ارائه یک شمای کلی بود. من حتی برای فیلد تاریخ هم از دیتا تایپ تکست استفاده کردم چه برسه به بقیه جزئیات.
اینکه کاربر هم نتونه یک پرسشنامه رو دوبار ثبت کنه باز هم کار راحتی است و شما می تونین با کلید (یا ایندکس یکتا) کردن فیلدهای شخص بازرسی شونده و تاریخ این مسئله رو پیاده کنین. باز هم به منطق برنامتون بستگی داره که خودتون بیشتر از من در جریانش هستین.
اما بازم می گم هر کمکی که ازم بربیاد انجام می دم.

Sheerkoshan
سه شنبه 05 اردیبهشت 1385, 23:25 عصر
دوست عزیز باز هم تشکر می کنم .
اولا اگر در مورد این این خط str = "Insert Into Bazrasi_Jozeyat (BazrasiId , karmandid , SoalId) Select " & Me.BazrasiId & Me.KarmandId & ",SoalId From Soalat" برام خیلی ساده توضیح بدی این کوتیشن کاما و اندساین چه کاری توی دستورات sql می دهند واقعا ممنون می شم .
دوم اینکه به فکرم رسید که همینطور که فرمودین بیام با اضافه کردن یه فیلد karmandid به جدول jozeyat و کلید قرار دادن آن و تغییرات در کوری entekhabsoal و subform این مشکل رو حل کنم . توی تکه خط بالا که شما برای فرم اصلی نوشته بودید قسمت & Me.KarmandId را اضافه کردم اما موقع اجرا Error می ده .
Number of query items and field destination isn't same یه همچین اروری . در صورتی که این فیلد را هم به جدول اضافه کردم هم به کوری ولی نمی دونم چرا ارور می گیره ؟
اگر تکه ای که اضافه کردم ایراد دارد لطفا گوشزد فرمایید . متشکر می شوم .

MMAASS
چهارشنبه 06 اردیبهشت 1385, 09:29 صبح
دوست عزیز باز هم تشکر می کنم .
خواهش میکنم ، امیدوارم که بتونم کمکی بکنم.

اولا اگر در مورد این این خط str = "Insert Into Bazrasi_Jozeyat (BazrasiId , karmandid , SoalId) Select " & Me.BazrasiId & Me.KarmandId & ",SoalId From Soalat" برام خیلی ساده توضیح بدی این کوتیشن کاما و اندساین چه کاری توی دستورات sql می دهند واقعا ممنون می شم .
کوتیشن در SQL برای نگهداری عبارات بکار میره. یعنی وقتی بخواهیم از یه مقدار استرینگی تو SQL استفاده کنیم باید اون رو بین سینگل کوتیشن بذاریم (البته با دابل کوتیشن هم کار می کنه).
کاما که حکم "و" خودمون است ... و .. در SQL به صورت …,… نوشته می شود.
اند ساین که جز کد SQL نیست و برای الصاق رشته ها در VB بکار رفته من برای اینکه بتونم قسمتهای مختلف رو به هم کانکیت کنم و بعد به SQL پاس بدم از این علامت استفاده کردم. با اند ساین تکه تکه یه رشته رو بهم وصل می کنم.


دوم اینکه به فکرم رسید که همینطور که فرمودین بیام با اضافه کردن یه فیلد karmandid به جدول jozeyat و کلید قرار دادن آن و تغییرات در کوری entekhabsoal و subform این مشکل رو حل کنم .
دوست عزیز من کی گفتم فیلد karmandid رو به جدول jozeyat اضافه کنید.؟؟؟؟؟؟؟؟؟؟؟ :متعجب: فیلد BazrasiId که توی هر دو جدول است نشون می ده که سوالها مربوط به کدوم کارمندن. مثلا اگه تو جدول Bazrasi_Jozeyat تمام رکوردهایی رو پیدا کنی که فیلد BazrasiId شون برابر 1 باشه اونوقت یه رکورد تو جدول Bazrasi_Asli داری که فیلد BazrasiId ش 1 است و این رکورد بیانگر این است که سوالها رو چه کسی از کی پرسیده .

توی تکه خط بالا که شما برای فرم اصلی نوشته بودید قسمت & Me.KarmandId را اضافه کردم اما موقع اجرا Error می ده .
Number of query items and field destination isn't same یه همچین اروری . در صورتی که این فیلد را هم به جدول اضافه کردم هم به کوری ولی نمی دونم چرا ارور می گیره ؟
اگر تکه ای که اضافه کردم ایراد دارد لطفا گوشزد فرمایید . متشکر می شوم .
چشم!
کد رو به این صورت اصلاح کنین :

str = "Insert Into Bazrasi_Jozeyat (BazrasiId , karmandid , SoalId) Select " & Me.BazrasiId & "," & Me.KarmandId & ",SoalId From Soalat"
اگه بین Me.BazrasiId و Me.KarmandId تیکه ی "," رو اضافه نکنی اونها به هم می چسبن و یکی می شن و در این حال شما دو مقدار خواهید داشت و وقتی که می خواهید در سه فیلد جدول Insert کنی یه مقدار کم دارید و با error روبرو می شی. اما وقتی که بینشون "," میذاری اونا دو مقدار میشن و بهم نمی چسبن این طوری دیگه به تهداد فیلدها مقدار ورودی هم داری.

امیدوارم که توضیحاتم بد نبوده باشه. و بتونم منظورم رو بیان کرده باشم. :متفکر:

Sheerkoshan
چهارشنبه 06 اردیبهشت 1385, 18:24 عصر
دوست بسیار عزیز من بازم سلام

حق با شما بود اضافه کردن karmandid به jozeyat مشکلی رو حل نکرد چون من اونرو با soalid کلید قرار دادم گفتم حتما موقع پذیرش رکورد جدید که تکراری باشه error ی بگیره ولی ...
حالا اومدم و این تکه کد رو برای کنترل رکورد تکراری بعد از اجرای اون خط sql قرار دادم :
If DLookup("karmandid", "Bazrasi_Jozeyat", "[karmandid]=" & Me.KarmandId.Text) Then
If DLookup("soalid", "Bazrasi_Jozeyat", "[soalid]=" & Me.Bazrasi_Jozeyat_Subform.SoalId.Text) Then

MsgBox "این سوال قبلا پاسخ داده شده است", vbCritical, ""
اما متاسفانه جواب نداد و ارور داد .
به نظرتون چیکار کنیم که وقتی برای یه کارمند یه سوال تکراری که قبلا جواب دادیم انتخاب شد , پیام بده .
بازم متشکرم

smhr53
سه شنبه 19 اردیبهشت 1385, 20:17 عصر
با سلام
می خواهم در فرمی که ایجاد کرده ام در یک فیلد مثلا نام و نام خانوادگی اگر نام و نام خانوادگی مشابهی وارد شد برنامه به من اعلام کند که این نام و نام خانوادگی تکراری است و لیستی از نام و نام های خانوادگی مشابه را برای من لیست کند
اگر امکان این کار هست لطفا به صورت کامل و با جزئیات توضیح دهید
با تشکر