PDA

View Full Version : اصول استفاده از IF



Rasool-GH
جمعه 18 آذر 1390, 17:23 عصر
سلام خدمت همه دوستان
من برای کلیک روی یک باتون در VB کد نوشتم که داخل اون از چند دستور IF استفاده شده
مشکل من اینه که وقتی شرط If برقرار نیست بازهم دستورات داخل اون اجرا میشه
لطفا راهنمایی کنین که من چکار کنم ؟

Abbas Amiri
جمعه 18 آذر 1390, 18:36 عصر
نتیجه اینکه شرط را درست ننوشته اید

Rasool-GH
جمعه 18 آذر 1390, 19:21 عصر
سلام اقای امیری
شرمنده که کامل ننوشتم

Private Sub Text4_LostFocus()
If Not IsNull(Text1) Then
[Text4] = DLookup("F1", "Table1", "ID=" & "Text1")
Else
If Not IsNull(Text3) Then
[Text4] = DLookup("F1", "Table1", "F2=" & "Text3")
Else
[Text4] = ""
End If
End If
End Sub

و به این شکل هم نوشتم


Private Sub ،Text4_LostFocus()
If Not IsNull(Text1) Then
[Text4] = DLookup("F1", "Table1", "ID=" & "Text1")
End If
If Not IsNull(Text3) Then
[Text4] = DLookup("F1", "Table1", "F2=" & "Text3")
Else
[Text4] = ""
End If
End Sub


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

Abbas Amiri
جمعه 18 آذر 1390, 20:03 عصر
توضیح دهید کنترلهای فوق با داشتن چه مقدارهایی ، این اتفاق می افتد

Rasool-GH
جمعه 18 آذر 1390, 20:36 عصر
سلام این نمونه رو برسی کنید

من نیاز دارم که هم از داخل فرم سرچ یک کد رو وارد فرم اصلی کنم و هم اینکه مستقیما در فرم اصلی یک کد رو تایپ کنم

Abbas Amiri
جمعه 18 آذر 1390, 20:47 عصر
دقیق بگویید کجا ، چه چیز ، چطور

Rasool-GH
جمعه 18 آذر 1390, 21:04 عصر
داخل باکس کد عیب دابل کلیک کنید وارد فرم سرچ میشید یکی ازمعایب رو دابل کلیک کنید کد عیب و شرح عیب وارد فرم میشه و مشکلی نیست
ولی اگر کد عیب رو مستقیم وارد باکس کنید و به باکس بعدی برید کد پاک میشه و شرح عیب هم خالی میشه . این چیزیه که من نمیخوام. من میخوام که وقتی کد عیب رو تایپ میکنم با رفتن به باکس بعدی شرح عیب نمایش داده بشه

Abbas Amiri
جمعه 18 آذر 1390, 21:40 عصر
این قسمت را جایگزین کنید


Private Sub codeeyb_LostFocus()
If Nz(ideyb, "") <> "" Then
[codeeyb] = DLookup("f5", "tavanir", "id=" & ideyb)
[sharh] = DLookup("f1", "tavanir", "id=" & "ideyb") & " / " & DLookup("f2", "tavanir", "id=" & "ideyb") & " / " & DLookup("f3", "tavanir", "id=" & "ideyb") & " / " & DLookup("f4", "tavanir", "id=" & "ideyb")
Else
If Not IsNull(codeeyb) Then
[sharh] = DLookup("f1", "tavanir", "f5='" & codeeyb & "'") & " / " & DLookup("f2", "tavanir", "f5='" & codeeyb & "'") & " / " & DLookup("f3", "tavanir", "f5='" & codeeyb & "'") & " / " & DLookup("f4", "tavanir", "f5='" & codeeyb & "'")
Else
[sharh] = ""
End If
End If
End Sub

Rasool-GH
جمعه 18 آذر 1390, 21:47 عصر
با تشکر فراوان
براتون امکان داره که توضیح بدین به چه دلیل این مشکل به وجود اومده بود
؟
مشکل از کجا بود ؟ شرط درست نبود یا من در جای اشتباهی استفاده کرده بودم

Abbas Amiri
جمعه 18 آذر 1390, 22:08 عصر
مشکل خط 7 بود توجه کنید ("id=" & "ideyb") شما ID را با عبارت داخل کوتیشن مقایسه گرده اید نه با کنترلی با این اسم درضمن چون DataType آن تکست است بایستی (کنترل/متغیر) مورد مقایسه در کوتیشن قرارگیرد دقت کنید این دوحالت باهم فرق میکند وشما نباید اشتباه کنید . البته خط 4 هم مشکل دارد وچون به آن ارجاعی نمی شود ، مشخص نمی شود

Rasool-GH
جمعه 18 آذر 1390, 22:12 عصر
بسیار ممنون
دلیل این که کد If Nz(ideyb, "") <> "" Then رو قرار دادید چی ؟

Abbas Amiri
جمعه 18 آذر 1390, 23:27 عصر
حتما دقت کرده اید که همیشه شرط برقرار بود ، دلیل اینست که تقریبا همیشه مقدار تکست "" یا VbNullString است نه Null . برای همین با این دستور هم مقدار Null وهم مقدار "" تست می شوند

Rasool-GH
شنبه 19 آذر 1390, 14:47 عصر
سلام
من این دو مقدار رو یکی فرض میکردم و ممنون از توضیح شما
حالا چند سوال پیش میاد
1. ما با چه دستوری میتونیم مقدار یک (باکس / متغییر ) رو Null قرار بدیم و ضمنا چند نوع مقدار Null داریم ؟ (به جز دو موردی که ذکر کردین)


مشکل خط 7 بود توجه کنید ("id=" & "ideyb") شما ID را با عبارت داخل کوتیشن مقایسه گرده اید نه با کنترلی با این اسم درضمن چون DataType آن تکست است بایستی (کنترل/متغیر) مورد مقایسه در کوتیشن قرارگیرد دقت کنید این دوحالت باهم فرق میکند وشما نباید اشتباه کنید . البته خط 4 هم مشکل دارد وچون به آن ارجاعی نمی شود ، مشخص نمی شود

2. مطابق گفته بالا اگر نیاز باشه که مقدار یک باکس با فرمت تکست رو مقایسه کنیم چکار باید بکنیم .

If Nz(ideyb, "") <> "" Then
[codeeyb] = DLookup("f5", "tavanir", "id=" & ideyb)
[sharh] = DLookup("f1", "tavanir", "id=" & "ideyb") & " / " & DLookup("f2", "tavanir", "id=" & "ideyb") & " / " & DLookup("f3", "tavanir", "id=" & "ideyb") & " / " & DLookup("f4", "tavanir", "id=" & "ideyb")
Else
If Not IsNull(codeeyb) Then
[sharh] = DLookup("f1", "tavanir", "f5='" & codeeyb & "'") & " / " & DLookup("f2", "tavanir", "f5='" & codeeyb & "'") & " / " & DLookup("f3", "tavanir", "f5='" & codeeyb & "'") & " / " & DLookup("f4", "tavanir", "f5='" & codeeyb & "'")
Else
[sharh] = ""
End If
End If

3. در خط 2 از "id=" & ideyb استفاده کردین در حالی که در خط 3 از "id=" & "ideyb" و در خط 7 از "f5='" & codeeyb & "'" ممنون میشم اگه یه مقدار موضوع رو باز کنید

Abbas Amiri
شنبه 19 آذر 1390, 18:47 عصر
درخط 3 هیچ تغییری ندادم وخود شما بعنوان تمرین آنرا اصلاح کنید. در خط 2 ID از نوع نامبر است پس احتیاجی به کوتیشن ندارد.در خط 7 F5 از نوع Text است پس مقدار مقایسه در کوتیشن قرار میگیرد
ضمنا مقدار "" برابر Null نیست واصطلاحا رشته خالی نام دارد ودر VB fبا ثابت VbNullString شناخته می شود اطلاعات بیشتر درمورد Null :
http://office.microsoft.com/en-us/access-help/what-is-a-null-value-in-access-HA001056283.aspx

Rasool-GH
شنبه 19 آذر 1390, 19:11 عصر
من از توضیحات شما این نتیجه رو گرفتم که کلا 2 نوع مقدار Null داریم
1. "" یا VbNullString
2. Null
برای مقایسه اونها در شرط IF باید از رابطه ای مثل If Nz(ideyb, "") <> "" Then استفاده کنیم که هر دو نوع Null چک بشه
برای ادرس دادن در تابع DLookup درصورتی که (کنترل/متغیر) ما از نوع عدد باشه از عبارتی مثل "FieldName=" & ControlName میشه استفاده کرد ولی اگر از نوع تکست باشه باید از این "FieldName='" & ControlName & "'" استفاده بشه
در صورت اشتباه بودن لطفا اصلاح بفرمایید

Abbas Amiri
شنبه 19 آذر 1390, 19:24 عصر
قسمت دوم صحیح است ولی بنده عرض کردم( "" <> Null) "" کاملا مشخص است که یک رشته خالی است ولی Null تنها به معنی خالی نیست ،به معنی داده تعریف نشده ، نامشخص هم می باشد . علت استفاده از If Nz(ideyb, "") <> "" Then این است که چون فیلد شما از نوع Text است ومقدار Default آن "" می باشد ونیز ممکن است دربرنامه مقدار آن برابر نول گردد دراینحالت با این دستور می گوییم { اگر مقدار متغیر(درصورت نول بودن مساوی "" شود) برابر "" باشد } امیدوارم متوجه شده باشید

Rasool-GH
شنبه 19 آذر 1390, 19:40 عصر
یک مورد دیگه هم هست که اگه روشن بشه خیلی خوبه
"FieldName='" & ControlName & "'"
در عبارت بالا که در تیپ اصلی به شکل زیر هست
"FieldName=1"
مطابق استاندارد Access ما برای مقدار دهی به وسیله کاربر از کد زیر استفاده میکنیم (به شرط اینکه متغیر عددی باشه)
"FieldName=" & ControlName
حالا که متغیر از نوع تکست هست باید از کد زیر استفاده بشه (که اشتباه هست)
"FieldName=" & "ControlName "
ولی به دلیل اینکه در کد بالا عبارت "ControlName " معنی کنترلی با این نام رو نمیده و با مقدار معادل داخل کوتیشن اشتباه گرفته میشه باید به صورت
"FieldName='" & ControlName & "'"
نوشته بشه .لطفا توضیح بدین که علائم رنگی با چه استاندارد و بر چه اساس به کد اضافه میشه
o( "FieldName='" & ControlName & "'" )o

Rasool-GH
شنبه 19 آذر 1390, 19:43 عصر
من کاملا متوجه فرمایش شما و معنی شرط شدم فقط خواستم که اخرین مطلب هم به صورت یک پست اموزشی برای سایر بازدید کننده ها باشه و هم اینکه اگه اشتباهی در برداشت بنده بوده اصلاح بشه
به هر حال ممنون از شما که وقت میزارین و با حوصله و حسن نیت جواب میدین

Abbas Amiri
شنبه 19 آذر 1390, 20:12 عصر
فقط در یک مورد درست نبود : که دوخط بعد درست می باشد ومعمولا خط سوم استفاده می شود



"FieldName=" & "ControlName "

"FieldName=" & "'ControlName'"
"FieldName='ControlName'"