PDA

View Full Version : سوال: ثبت یک فیلد از طریق یک فیل مشابه



hf.farhadi
پنج شنبه 29 اردیبهشت 1390, 12:18 عصر
با سلام خدمت دوستان و اساتید گرامی
من یه برنامه ای برای یه کارگاه تولیدی نوشتم که توی یه جدول به نام story form تعداد محصول تولید شده رو ثبت میکنه .
نحوه کار به این صورت است که در حین تولید محصولهایی که از نظر بخش کنترل دارای مشکل هست را بعنوان بازنگری مجدد از محصول سالم ، جداسازی میکنند
تا تعداد محصول ضایعات جداسازی شده و مابقی محصول سالم را به بخش تولید کننده عودت میدهند.

این قسمت از محصول رو در جدولی بنام test ثبت میکنم .

حالا مشکلم اینجاست که وقتی تعداد محصول بازنگری مجدد بعنوان ضایعات محسوب میشود و در فرم test در فیلد Jzayeat آن را وارد میکنیم .
میخواهم این مقدار در فرم story form در فیلد Jzayeat به صورت اتوماتیک وارد شود .

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

چطوری میتونم این کار رو انجام بدم . ممنون میشم راهنمایی کنید

hf.farhadi
جمعه 30 اردیبهشت 1390, 13:16 عصر
با سلام
دوستان لطفاً راهنمایی کنید

hf.farhadi
شنبه 31 اردیبهشت 1390, 22:45 عصر
دوستان عزیز
یعنی این مشکل راه حلی نداره ؟؟؟؟؟

hf.farhadi
یک شنبه 01 خرداد 1390, 19:50 عصر
دوستان لطفاً راهنمایی کنین بهش خیلی نیاز دارم

hf.farhadi
دوشنبه 02 خرداد 1390, 23:14 عصر
دوستان عزیز
جهت تکمیل برنامم به این کار نیاز دارم لطفاً راهنمایی کنید

hf.farhadi
دوشنبه 06 شهریور 1391, 14:47 عصر
دوستان و اساتید گرامی
من همچنان در پی رفع این مشکل هستم . ممنون میشم راهنمایی کنین

Abbas Amiri
دوشنبه 06 شهریور 1391, 18:47 عصر
برای تغییر مقدار ضایعات در فرم Story form از کد زیر میتوانید استفاده کنید.


sSQL = "UPADTE [Story form] SET Jzayeat = " & Me.Jzayeat & _
" WHERE [Date] = " & Me.Date & " AND Shift = '" & Me.Shift & _
"' AND oprator = '" & Me.Oprator & "'"


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

hf.farhadi
دوشنبه 06 شهریور 1391, 23:44 عصر
با سلام آقای امیری عزیز و تشکر بابت عنایتی که فرمودین
طبق معمول تاپیکهایی که به بن بست میخورن توسط شما بزرگوار گشایش پیدا میکنه خدا خیرتون بده


sSQL = "UPADTE [Story form] SET Jzayeat = " & Me.Jzayeat & _
" WHERE [Date] = " & Me.Date & " AND Shift = '" & Me.Shift & _
"' AND oprator = '" & Me.Oprator & "'"

این کد رو میخوام در رویداد Lost Focus فیلد Jzayeat فرم Test استفاده کنم . یعنی میخوام به محض وارد کردن تعداد ضایعات در فرم Test ، فیلد Jzayeat در فرم StoryForm آبدیت بشه . ولی موفق نشدم



وبرای جلوگیری از اشتباه بهترین کار تغییر کنترلهای شیفت واپراتور به کمبو است . من در برنامه اصلیم از کمبو استفاده کردم و اون رو محدود به جدولی که مقادیر معینی دارند کرده ام . اما روشی که فرمودین

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

Abbas Amiri
سه شنبه 07 شهریور 1391, 00:11 صبح
این کد رو میخوام در رویداد Lost Focus فیلد Jzayeat فرم Test استفاده کنم . یعنی میخوام به محض وارد کردن تعداد ضایعات در فرم Test ، فیلد Jzayeat در فرم StoryForm آبدیت بشه . ولی موفق نشدم با دستور CurrentDb.Execute sSQL

چطوری باید محدود به تاریخ انتخاب شده بکنم (با توجه به لینک شدن کمبو به جدول مقادیر معین شده)فرم وهمچنین کنترلهای آنرا Unbound کنید و یک باتن جهت ذخیره ایجاد وعملیات ثبت را باکدانجام دهید(همراه با آپدیت ضایعات در جدول اصلی)
در روال AfterUpdate تاریخ هم مقدار Shift.RowSource را تعیین کنید


Shift.RowSource="SELECT Shift FROM [Story form] WHERE Date=" & Me.Date

واگر در هرشیفت چند اپراتور باشند مشابه آنرا برای اپراتور نسبت به شیفت وتاریخ انجام دهید

Abbas Amiri
چهارشنبه 08 شهریور 1391, 01:10 صبح
از طریق اصلاح نمونه پیوست راهنمایی بفرمایین امیدوارم موردنظرتان باشد.

hf.farhadi
چهارشنبه 08 شهریور 1391, 14:35 عصر
جناب امیری عزیز
بسیار بسیار ممنونم عالی بود
یه موردی که هست اینه که در بعضی مواقع در چندین مرحله در یک شیفت ،فرم ضایعات در جدول Test تکمیل میشه .(یعنی بخش کنترل امکان داره چندین مرحله در یک شیفت از یک خط محصول تولید شده رو برای بازنگری کنار بزاره)
اما در جدو ل StoryForm برای هر شیفت یک فرم تکمیل میشه پس به ناچار جعبه های ضایعات شده در جدول Test رو باید جمع کنیم و نتیجه رو در فیلد ضایعات فرم StoryForm نشون بدیم

برای این منظور چه تغییراتی با ید در کد زیر اعمال کنم تا نتیجه بگیرم .

sSQL = "UPDATE Storyform SET Jzayeat = " & Me.Jzayeat & _
" WHERE [Date] = " & Me.Date & " AND Shift = '" & Me.shift & _
"' AND oprator = '" & Me.oprator & "'"
CurrentDb.Execute sSQL

ممنون

Abbas Amiri
جمعه 10 شهریور 1391, 01:31 صبح
عقیده من اینست که هر راهی که جواب بدهد وخودتان انجام داده باشید برای شما بهترین کار است .
میشه در رویداد AfterUpdate اپراتور جمع ضایعات ثبت شده جهت (تاریخ - شیفت - اپراتور) انتخاب شده را با تابع Dmax بدست آورده ودرهنگام ذخیره با مقدار فعلی جمع و درجدول اصلی آپدیت شود.

hf.farhadi
جمعه 10 شهریور 1391, 20:42 عصر
استاد امیری ممنون وسپاسگذار

در یه جایی و مخصوصاً برای پیمایش و Edit اطلاعات من از فرم باند شده استفاده کردم
یه مشکل با این فرمهای آنباند دارم که نمیدونم برای Edit و پیمایش ما بین رکورد های جدول چیکار باید کرد

Abbas Amiri
جمعه 10 شهریور 1391, 23:02 عصر
کارکردن با فرمهای Unbound کمی سخت تر است و ملاحظات خاصی را میطلبد ، حتی درفرم ساده ای مثل فرم test شما ومخصوصا در حالت Edit . ولی مزیت های زیادی دارد . نمونه اصلاح شده زیر جهت مبتدیان میتواند نکات آموزشی دربرداشته باشد

hf.farhadi
جمعه 10 شهریور 1391, 23:19 عصر
ممنونم استاد
من یکی که خیلی مونده تا به سرعت و دقت شما بتونم کد نویسی کنم (البته ما قطره ایم شما ماشاا... دریا ):گیج::متفکر:

Abbas Amiri
جمعه 10 شهریور 1391, 23:29 عصر
بله باید یک رکورد ست ایجاد کنید و باتن های پیشمایش ایجاد وروال های مربوط به آنها رابنویسید . سرچ کنید در تالارهم پیدامیشود
ولی برای شما به روش فوق راحت تراست

Abbas Amiri
شنبه 11 شهریور 1391, 01:12 صبح
فقط مشکل بابت برگرداندن پیام به کاربر در مواقعی که شرایط برای آبدیت کردن محیا نیست رو دارم . مثلاً وقتی یکی از شرطهایی که در پست 1 ذکر شده محیا نمیشه و مثلاً کاربر نام اپراتور را در یکی از فرمها اشتباه وارد کرده . یا مثلاً برای اینکه متوجه بشیم عمل آبدیت به درستی انجام شده .یه پیام برگردونیم
اگر دقت کرده باشید در روال AfterUpdate های کنترلها ، کنترلهای بعدی را فیلتر کرده ایم یعنی کاربر انتخاب دیگری به غیر از کمبوهای فیلترشده ندارد . فرض میکنیم درجدول Storyform در تاریخ D سه شیفت A,B,C داریم ، زمانی که تاریخ D را تایپ میکنیم این سه شیفت در کمبو شیفت بار میشوند . حالا اگر دروزD و درشیفت B دو اپراتور X,Y داشته باشیم ، دراینجا در کمبو اپراتور فقط نام این دو بار میشود .
اگر منظور شمارا گرفته باشم پس جای هیچ اشتباهی بخاطر استفاده ازکمبوها باقی نخواهد ماند.

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

hf.farhadi
شنبه 11 شهریور 1391, 19:38 عصر
با سلام

اگر دقت کرده باشید در روال AfterUpdate های کنترلها ، کنترلهای بعدی را فیلتر کرده ایم یعنی کاربر انتخاب دیگری به غیر از کمبوهای فیلترشده نداردمن در برنامم برای هر کنترل یه جدول ساختم و مقادیر محدود به همون جدول هست و در صورتی که اشتباه تایپی بروز کند یه پیام به کاربر برمیگردونه که این گزینه موجود نیست و در صورت تایید به همون جدول اضافه میشه .

منظورم اینه که به فرض مثال یه کنترلی مثل شیفت کاری ، فیلتر شده و مقادیر A,B,c رو در خودش داره ، چون کاربری که فرم Test رو تکمیل میکنه با کاربر StoryForm فرق میکنه ، کاربر فرمStoryForm شیفت رو A انتخاب میکنه و فرم تکمیل میشه ،
سپس کاربر Test برای مشخصات همون محصول و شیفت، مقدار B رو انتخاب میکنه ، چون این مقدار فیلتر شده در کمبو موجود است کاربر متوجه اشتباه خودش نمیشه

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


امیدوارم تونسته باشم منظورم رو برسونم

Abbas Amiri
شنبه 11 شهریور 1391, 21:55 عصر
احتمالا نکته ای وجود دارد که من به آن توجه نکرده ام . بیاییم پروسه را با مثالی تحلیل کنیم
ابتدا تاریخ 91/05/05 را درج میکنیم
92200
4 رکورد درجدول storyform فیلتر میشوند و در کمبو شیفت مقادیر B,A,C را خواهیم داشت . حالا در کمبوشیفت مقدار B را انتخاب میکنیم
92201
حالا دورکورد داریم ودر کمبو اپراتور نامهای امیری ورحیمی را خواهیم داشت . وکاربر یکی ازآنهارا انتخاب خواهد کرد .
واین به این یعنی است که بغیر ازموارد ثبت شده درجدول storyform انتخاب دیگری نمیتوان کرد

hf.farhadi
شنبه 11 شهریور 1391, 23:34 عصر
با سلام استاد گرامی ،
نکته همین جاست : که اول فرم Test تکمیل میشه و در همون شیفت باید تعیین تکلیف شود و پس از مشخص شدن تعداد تولید سالم و ضایعات در شیفت بعد فرم StoryForm تکمیل میشه پس نمیتوان به مقادیر این جدول اکتفا کرد

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

حالا دورکورد داریم ودر کمبو اپراتور نامهای امیری ورحیمی را خواهیم داشت . وکاربر یکی ازآنهارا انتخاب خواهد کرد .کاربر احتمال دارد که امیری و یا رحیمی را انتخاب کند و چون تعداد اپراتورها در حدود 50 نفر در شیفت میباشد. پس بعد از فیلتر شدن ،به دلیل بالا بودن تعداد اپراتورها ، احتمال اشتباه کاربر نیز بالا میرود این رویه در مورد انتخاب شماره برنامه نیز حکم میکند.

اگه شما لطف کنید و یک شرط برای کدی که قبلاً مرحمت کردین بزارین فکر کنم بشه تا حدی کنترل کرد (البته به کد شما من فیلد Nplan رو هم اضافه کردم که در این پروسه باید چک بشه)

sSQL = "UPDATE Storyform SET Jzayeat =" & Me.Jzayeat & _
" WHERE [Date] = " & Me.Date & " AND Shift = '" & Me.shift & _
"' AND oprator = '" & Me.oprator & "' AND Nplan = '" & Me.nplan & "'"

MsgBox " با موفقیت آبدیت شد", vbExclamation + vbMsgBoxRight, "توجه"
CurrentDb.Execute sSQL

سپاس فراوان

Abbas Amiri
شنبه 11 شهریور 1391, 23:51 عصر
متاسفانه پروسه کاری شما برای من کاملا جانیفتاده است . اگرمیتوانید بصورت شفاف ومرحله به مرحله عنوان کنید

Abbas Amiri
یک شنبه 12 شهریور 1391, 18:15 عصر
درحقیقت مرحله چهار قبل از مرحله سه شروع میشود وبعدا تکمیل میشود. وشما میخواهید زمانی که تعداد ضایعات را وارد میکنید چک شود "تاریخ ،شیفت ، نام کاربر وتعداد درجدول story form وجود داردیا نه " .

hf.farhadi
یک شنبه 12 شهریور 1391, 18:26 عصر
درحقیقت مرحله چهار قبل از مرحله سه شروع میشود وبعدا تکمیل میشود. وشما میخواهید زمانی که تعداد ضایعات را وارد میکنید چک شود "تاریخ ،شیفت ، نام کاربر وتعداد درجدول story form وجود داردیا نه " .
دقیقاً همین است استاد
البته میخوام تاریخ ،شیفت ، نام اپراتور و Nplan (یا شماره برنامه) چک شود که درجدول story form وجود داردیا نه . اگه وجود دارد آبدیت بشه و در غیر اینصورت یه پیام عدم موفقیت برگردونه

Abbas Amiri
یک شنبه 12 شهریور 1391, 19:03 عصر
در این صورت کافیست کدهای زیر راجایگزین کنید و کدهای فیلتر کردن در AfterUpdate ها را هم بردارید چون زمانی که میخواهید رکوردجدید اضافه کنید فقط ازمقادیر قبلی جدول storyForm میتوانید استفاده کنید


Private Sub cmdSave_Click()
Dim fld As DAO.Field, rs As DAO.Recordset
Dim sSQL As String, IsMatchStoryForm As Boolean
If Nz(Jzayeat, 0) = 0 Then
MsgBox "ãÞÏÇÑ ãÔÎÕ äÔÏå ÇÓÊ."
Exit Sub
End If
If IsNull(codeFID) Then
sSQL = "test"
Else
sSQL = "[Date] = " & Me.Date & " AND Shift = '" & Me.shift & _
"' AND oprator = '" & Me.oprator & "' AND Nplan = '" & Me.nplan & "'"
IsMatchStoryForm = CBool(DCount("*", "storyform", sSQL))
If Not IsMatchStoryForm Then
MsgBox "عدم تطبیق"
Exit Sub
End If
sSQL = "SELECT * FROM test WHERE codeFID=" & codeFID
End If
Set rs = CurrentDb.OpenRecordset(sSQL)
With rs
If IsNull(codeFID) Then
.AddNew
Else
.Edit
End If
For k = 1 To cboSelect.ColumnCount - 1
.Fields(k) = Me.Controls(rs.Fields(k).Name)
Next
.Update
End With
Set rs = Nothing
sSQL = "UPDATE Storyform SET Jzayeat = " & Nz(DSum("Jzayeat", "test", strCriteria), 0) & _
" WHERE [Date] = " & Me.Date & " AND Shift = '" & Me.shift & _
"' AND oprator = '" & Me.oprator & "' AND Nplan = '" & Me.nplan & "'"
CurrentDb.Execute sSQL
ClearFields
End Sub

Abbas Amiri
دوشنبه 13 شهریور 1391, 13:23 عصر
ازکد زیر استفاده کنید . ضمنا کدهایی که مربوط به حالت Unbound هست را میتوانید حذف کنید.


Private Sub Jzayeat_LostFocus()
Dim sFilter As String
Me.Requery
sFilter = "[Date] = " & Me.Date & " AND Shift = '" & Me.shift & _
"' AND oprator = '" & Me.oprator & "' AND Nplan = '" & Me.nplan & "'"
If DCount("*", "storyForm", sFilter) = 0 Then
MsgBox "عدم تطبیق"
Exit Sub
End If
End Sub

hf.farhadi
دوشنبه 13 شهریور 1391, 14:27 عصر
با سلام

من کد فوق رو جایگزین کردم ولی نمیدونم چرا کد کار نمیکنه و عمل آبدیت انجام نمیشه

Abbas Amiri
دوشنبه 13 شهریور 1391, 20:11 عصر
سلام
کد قبلی فقط شرط یکسان بودن فیلدها در دوجدول را چک میکند.

hf.farhadi
دوشنبه 13 شهریور 1391, 23:30 عصر
من مجدداً از کد زیر برای چک کردن دو جدول و آبدیت کردن آنها استفاده کردم ولی خطای تصویر زیر رو گرفت

Private Sub Jzayeat_LostFocus()
Dim sFilter As String
sSQL = "UPDATE Storyform SET Jzayeat =" & Me.Jzayeat & _
" WHERE [Date] = " & Me.Date & " AND Shift = '" & Me.shift & _
"' AND oprator = '" & Me.oprator & "' AND Nplan = '" & Me.nplan & "'"

MsgBox " ÈÇ ãæÝÞ?Ê ÂÈÏ?Ê ÔÏ", vbExclamation + vbMsgBoxRight, "ÊæÌå"
CurrentDb.Execute sSQL

Me.Requery
sFilter = "[Date] = " & Me.Date & " AND Shift = '" & Me.shift & _
"' AND oprator = '" & Me.oprator & "' AND Nplan = '" & Me.nplan & "'"
If DCount("*", "storyForm", sFilter) = 0 Then
MsgBox "ÚÏã ÊØÈ?Þ"
Exit Sub
End If
End Sub

Abbas Amiri
دوشنبه 13 شهریور 1391, 23:40 عصر
این مربوط به فیلد nplanID در StoryForm است که در اینجا nplan آمده است . یک فرم ساده تر برا ی test بنام test1در فایل خودتان ایجاد کردم

hf.farhadi
دوشنبه 13 شهریور 1391, 23:58 عصر
استاد امیری عزیز ، دنیا رو شاد شاد و شادی رو دنیا دنیا براتون آرزومندم ،:تشویق:

همون چیزی رو که میخواستم شد. مجدداً بابت زحماتی که کشیدین سپاسگذاری میکنم و بابت اذیتهایی که کردیم پوزش میخوام

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