View Full Version : نوشتن دستور sql در vba
moustafa
جمعه 14 دی 1403, 14:31 عصر
دستور زیر وقتی تکست باکس از نوع رشته است و در صورت خالی بودن همه مقادیر بازکردانده شود را اصلاح فرمائید
set rs = db.openrecordset " select * from tbl1 where( field1 =textbox1 or textbox1 is nu11 )ORDER BY field2"
کد زیر با چند شرط عمل نمیکنه
set rs = db.openrecordset " select * from tbl1 where( field1 like '*" & textbox1 & "*' )ORDER BY field2"
mazoolagh
شنبه 15 دی 1403, 11:55 صبح
این کد پایین
" select * from tbl1 where( field1 =textbox1 or textbox1 is nu11 )ORDER BY field2"
همینجوری 2 اشکال درش دیده میشه:
1- اون null نیست و nu11 هست (به جای l شماره 1 تایپ شده)
2- این که مقدار textbox باید بیاد درون استرینگ
البته بهتره که پرانتز با order هم فاصله داشته باشه - هرچند که خطا نمیگیره.
mazoolagh
شنبه 15 دی 1403, 12:00 عصر
کد زیر با چند شرط عمل نمیکنه
من قبلا یک نمونه برای جستجو گذاشتم،
شاید بتونه به شما کمک کنه:
آموزش: فرم جستجوی پیشرفته (چند شرط،بر اساس همه/هریک از کلمات یا عبارات، انتخاب چند شرط برای یک فیلد و ...) (https://barnamenevis.org/showthread.php?563869-%D9%81%D8%B1%D9%85-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%DB%8C-%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87-(%DA%86%D9%86%D8%AF-%D8%B4%D8%B1%D8%B7%D8%8C%D8%A8%D8%B1-%D8%A7%D8%B3%D8%A7%D8%B3-%D9%87%D9%85%D9%87-%D9%87%D8%B1%DB%8C%DA%A9-%D8%A7%D8%B2-%DA%A9%D9%84%D9%85%D8%A7%D8%AA-%DB%8C%D8%A7-%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA%D8%8C-%D8%A7%D9%86%D8%AA%D8%AE%D8%A7%D8%A8-%DA%86%D9%86%D8%AF-%D8%B4%D8%B1%D8%B7-%D8%A8%D8%B1%D8%A7%DB%8C-%DB%8C%DA%A9-%D9%81%DB%8C%D9%84%D8%AF-%D9%88-))
moustafa
شنبه 15 دی 1403, 23:34 عصر
این کد پایین
" select * from tbl1 where( field1 =textbox1 or textbox1 is nu11 )ORDER BY field2"
همینجوری 2 اشکال درش دیده میشه:
1- اون null نیست و nu11 هست (به جای l شماره 1 تایپ شده)
2- این که مقدار textbox باید بیاد درون استرینگ
البته بهتره که پرانتز با order هم فاصله داشته باشه - هرچند که خطا نمیگیره.
بله null هستش و اشتباه تایپی در اینجاست و در خود کد درست نوشته شده و همین مورد 2 رو اگه ممکن زحمتشو بکشین چون من هر جور تبدیل به رشته کردم نشد که نشد بنابراین با if و بررسی null بودن و کدهای تکراری کار رو دراوردم
Dim db3 As Database
Dim rs3 As Recordset
Set db3 = CurrentDb
If Forms!frmReport!noe_sorat_vaziyat <> "" Then
SQL3 = "SELECT shomare_sorat_vaziyat,shomare_allhesab," & _
"right(EslashInDate(tharikh_havale_gh),len(EslashIn Date(tharikh_havale_gh))-2)," & _
"Switch(noe_sorat_vaziyat=1,'موقت',noe_sorat_va ziyat=2,'قطعي',noe_sorat_vaziyat=3,'تعديل ',noe_sorat_vaziyat=4,'پيش پرداخت')," & _
" mablagh_khazaneh+mablagh_havale+pish_mojodi_jensi+ pish_naghdi as n ," & _
" mablagh_arzesh_afzodeh+mablagh_arzesh_afzodeh_kh+h efze_arzesh_afzode as m," & _
"mablagh_bimeh_karfarma_kh + mablagh_bimeh_karfarma+hefze_bimeh as bk,hefze_khales ," & _
"n+m+bk+hefze_khales as k,mablagh_hosne_kar+mablagh_hosne_kar_kh as hk," & _
"mablagh_arzesh_afzodeh+mablagh_arzesh_afzodeh_kh as m1,hefze_arzesh_afzode," & _
"m,mablagh_bimeh_karfarma_kh + mablagh_bimeh_karfarma as bk1," & _
"mablagh_bimeh_pimankar+mablagh_bimeh_pimankar_kh as bp," & _
"hefze_bimeh,bk1+bp+hefze_bimeh as jb,pishpardakhat_kh+pishpardakhat as pi," & _
"mojodi_jensi_kh+mojodi_jensi as mo,mo+pi+jb+hk+m as ko,k-ko as kp FROM tblmoshakhasat_havale WHERE" & _
"( shomare_gharardad = " & Forms!frmReport!cbxShomareGharardad & _
" and noe_sorat_vaziyat = " & Forms!frmReport!noe_sorat_vaziyat & _
" and ravesh_pardakht like '*" & Forms!frmReport!ravesh_pardakht & "*')ORDER BY shomare_sorat_vaziyat"
Else
SQL3 = "SELECT shomare_sorat_vaziyat,shomare_allhesab," & _
"right(EslashInDate(tharikh_havale_gh),len(EslashIn Date(tharikh_havale_gh))-2)," & _
"Switch(noe_sorat_vaziyat=1,'موقت',noe_sorat_va ziyat=2,'قطعي',noe_sorat_vaziyat=3,'تعديل ',noe_sorat_vaziyat=4,'پيش پرداخت')," & _
" mablagh_khazaneh+mablagh_havale+pish_mojodi_jensi+ pish_naghdi as n ," & _
" mablagh_arzesh_afzodeh+mablagh_arzesh_afzodeh_kh+h efze_arzesh_afzode as m," & _
"mablagh_bimeh_karfarma_kh + mablagh_bimeh_karfarma+hefze_bimeh as bk,hefze_khales ," & _
"n+m+bk+hefze_khales as k,mablagh_hosne_kar+mablagh_hosne_kar_kh as hk," & _
"mablagh_arzesh_afzodeh+mablagh_arzesh_afzodeh_kh as m1,hefze_arzesh_afzode," & _
"m,mablagh_bimeh_karfarma_kh + mablagh_bimeh_karfarma as bk1," & _
"mablagh_bimeh_pimankar+mablagh_bimeh_pimankar_kh as bp," & _
"hefze_bimeh,bk1+bp+hefze_bimeh as jb,pishpardakhat_kh+pishpardakhat as pi," & _
"mojodi_jensi_kh+mojodi_jensi as mo,mo+pi+jb+hk+m as ko,k-ko as kp FROM tblmoshakhasat_havale WHERE" & _
"( shomare_gharardad = " & Forms!frmReport!cbxShomareGharardad & _
" and ravesh_pardakht like '*" & Forms!frmReport!ravesh_pardakht & "*')ORDER BY shomare_sorat_vaziyat"
End If
Set rs3 = db.OpenRecordset(SQL3)
j = rs3.RecordCount + 3
wrk.Sheets("kv").Range("a3").CopyFromRecordset rs3
Set db3 = Nothing
Set rs3 = Nothing
moustafa
شنبه 15 دی 1403, 23:36 عصر
این کد پایین
" select * from tbl1 where( field1 =textbox1 or textbox1 is nu11 )ORDER BY field2"
همینجوری 2 اشکال درش دیده میشه:
1- اون null نیست و nu11 هست (به جای l شماره 1 تایپ شده)
2- این که مقدار textbox باید بیاد درون استرینگ
البته بهتره که پرانتز با order هم فاصله داشته باشه - هرچند که خطا نمیگیره.
بله null هستش و اشتباه تایپی در اینجاست و در خود کد درست نوشته شده و همین مورد 2 رو اگه ممکن زحمتشو بکشین چون من هر جور تبدیل به رشته کردم نشد که نشد بنابراین با if و بررسی null بودن و کدهای تکراری کار رو دراوردم
Dim db3 As Database
Dim rs3 As Recordset
Set db3 = CurrentDb
If Forms!frmReport!noe_sorat_vaziyat <> "" Then
SQL3 = "SELECT shomare_sorat_vaziyat,shomare_allhesab," & _
"right(EslashInDate(tharikh_havale_gh),len(EslashIn Date(tharikh_havale_gh))-2)," & _
"Switch(noe_sorat_vaziyat=1,'موقت',noe_sorat_va ziyat=2,'قطعي',noe_sorat_vaziyat=3,'تعديل ',noe_sorat_vaziyat=4,'پيش پرداخت')," & _
" mablagh_khazaneh+mablagh_havale+pish_mojodi_jensi+ pish_naghdi as n ," & _
" mablagh_arzesh_afzodeh+mablagh_arzesh_afzodeh_kh+h efze_arzesh_afzode as m," & _
"mablagh_bimeh_karfarma_kh + mablagh_bimeh_karfarma+hefze_bimeh as bk,hefze_khales ," & _
"n+m+bk+hefze_khales as k,mablagh_hosne_kar+mablagh_hosne_kar_kh as hk," & _
"mablagh_arzesh_afzodeh+mablagh_arzesh_afzodeh_kh as m1,hefze_arzesh_afzode," & _
"m,mablagh_bimeh_karfarma_kh + mablagh_bimeh_karfarma as bk1," & _
"mablagh_bimeh_pimankar+mablagh_bimeh_pimankar_kh as bp," & _
"hefze_bimeh,bk1+bp+hefze_bimeh as jb,pishpardakhat_kh+pishpardakhat as pi," & _
"mojodi_jensi_kh+mojodi_jensi as mo,mo+pi+jb+hk+m as ko,k-ko as kp FROM tblmoshakhasat_havale WHERE" & _
"( shomare_gharardad = " & Forms!frmReport!cbxShomareGharardad & _
" and noe_sorat_vaziyat = " & Forms!frmReport!noe_sorat_vaziyat & _
" and ravesh_pardakht like '*" & Forms!frmReport!ravesh_pardakht & "*')ORDER BY shomare_sorat_vaziyat"
Else
SQL3 = "SELECT shomare_sorat_vaziyat,shomare_allhesab," & _
"right(EslashInDate(tharikh_havale_gh),len(EslashIn Date(tharikh_havale_gh))-2)," & _
"Switch(noe_sorat_vaziyat=1,'موقت',noe_sorat_va ziyat=2,'قطعي',noe_sorat_vaziyat=3,'تعديل ',noe_sorat_vaziyat=4,'پيش پرداخت')," & _
" mablagh_khazaneh+mablagh_havale+pish_mojodi_jensi+ pish_naghdi as n ," & _
" mablagh_arzesh_afzodeh+mablagh_arzesh_afzodeh_kh+h efze_arzesh_afzode as m," & _
"mablagh_bimeh_karfarma_kh + mablagh_bimeh_karfarma+hefze_bimeh as bk,hefze_khales ," & _
"n+m+bk+hefze_khales as k,mablagh_hosne_kar+mablagh_hosne_kar_kh as hk," & _
"mablagh_arzesh_afzodeh+mablagh_arzesh_afzodeh_kh as m1,hefze_arzesh_afzode," & _
"m,mablagh_bimeh_karfarma_kh + mablagh_bimeh_karfarma as bk1," & _
"mablagh_bimeh_pimankar+mablagh_bimeh_pimankar_kh as bp," & _
"hefze_bimeh,bk1+bp+hefze_bimeh as jb,pishpardakhat_kh+pishpardakhat as pi," & _
"mojodi_jensi_kh+mojodi_jensi as mo,mo+pi+jb+hk+m as ko,k-ko as kp FROM tblmoshakhasat_havale WHERE" & _
"( shomare_gharardad = " & Forms!frmReport!cbxShomareGharardad & _
" and ravesh_pardakht like '*" & Forms!frmReport!ravesh_pardakht & "*')ORDER BY shomare_sorat_vaziyat"
End If
Set rs3 = db.OpenRecordset(SQL3)
j = rs3.RecordCount + 3
wrk.Sheets("kv").Range("a3").CopyFromRecordset rs3
Set db3 = Nothing
Set rs3 = Nothing
moustafa
شنبه 15 دی 1403, 23:42 عصر
من قبلا یک نمونه برای جستجو گذاشتم،
شاید بتونه به شما کمک کنه:
آموزش: فرم جستجوی پیشرفته (چند شرط،بر اساس همه/هریک از کلمات یا عبارات، انتخاب چند شرط برای یک فیلد و ...) (https://barnamenevis.org/showthread.php?563869-%D9%81%D8%B1%D9%85-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%DB%8C-%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87-(%DA%86%D9%86%D8%AF-%D8%B4%D8%B1%D8%B7%D8%8C%D8%A8%D8%B1-%D8%A7%D8%B3%D8%A7%D8%B3-%D9%87%D9%85%D9%87-%D9%87%D8%B1%DB%8C%DA%A9-%D8%A7%D8%B2-%DA%A9%D9%84%D9%85%D8%A7%D8%AA-%DB%8C%D8%A7-%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA%D8%8C-%D8%A7%D9%86%D8%AA%D8%AE%D8%A7%D8%A8-%DA%86%D9%86%D8%AF-%D8%B4%D8%B1%D8%B7-%D8%A8%D8%B1%D8%A7%DB%8C-%DB%8C%DA%A9-%D9%81%DB%8C%D9%84%D8%AF-%D9%88-))
ممنون از شما دیدم و خیلی چیزا یاد گرفتم
moustafa
شنبه 15 دی 1403, 23:50 عصر
این کد پایین
" select * from tbl1 where( field1 =textbox1 or textbox1 is nu11 )ORDER BY field2"
همینجوری 2 اشکال درش دیده میشه:
1- اون null نیست و nu11 هست (به جای l شماره 1 تایپ شده)
2- این که مقدار textbox باید بیاد درون استرینگ
البته بهتره که پرانتز با order هم فاصله داشته باشه - هرچند که خطا نمیگیره.
این یه مورد از تبدیل که کرده بودم و جواب نداد
"
select * from tbl1 where( field1 ='" & textbox1 & "'or " & textbox1 is null & " ) ORDER BY field2"
ظاهرا کیبرد من حرف l رو شبیه 1 میزنه فقط کمی بلندتر بنابراین تایپ اشتباه نیست
mazoolagh
چهارشنبه 19 دی 1403, 12:07 عصر
من هر جور تبدیل به رشته کردم نشد که نشد بنابراین با if و بررسی null بودن و کدهای تکراری کار رو دراوردم
این کد شلوغ و پیچیده ای هست،
اول باید ساده اش کنین.
بجای این که تعداد زیادی ستون رو در select بیارین یک کوئری ساده (بدون where) بسازین و order رو هم در همون کوئری بیارین،
به این ترتیب کد شما به شکل زیر ساده میشه:
SQL3= "SELECT * FROM QueryName"
و بعد بر اساس این که چه شرطهایی باید اعمال بشه در صورت نیاز where رو بهش اضافه کنین.
اون switch هم چیز بدی هست،
بجاش array یا function استفاده کنین.
یک راه دیگه این هست که همون کوئری بالا رو پارامتریک بسازین
و شرطها رو درش با پارامتر پیاده کنین.
و بعد در کد خیلی ساده شرطها رو به کوئری پاس و رکوردست رو از این کوئری بگیرین.
ظاهرا کیبرد من حرف l رو شبیه 1 میزنه فقط کمی بلندتر بنابراین تایپ اشتباه نیست
قطعا اشتباه تایپی هست و اون واقعا یک لاتینه نه حرف l - ربطی به کیبرد نداره
این یه مورد از تبدیل که کرده بودم و جواب نداد
"select * from tbl1 where( field1 ='" & textbox1 & "'or " & textbox1 is null & " ) ORDER BY field2"
همون اشتباه اولیه رو دوباره تکرار کردین - باید اینجوری بنویسین:
"SELECT * FROM tbl1 WHERE (field1 ='" & textbox1 & "' OR '" & textbox1 & "' IS NULL) ORDER BY field2"
یا به طور اصولی تر:
DIM SQL AS STRING
SQL= "SELECT * FROM tbl1 WHERE (field1='@txt' OR '@txt' IS NULL) ORDER BY field2"
SQL= REPLACE(SQL , "@txt" , textbox1)
moustafa
پنج شنبه 20 دی 1403, 10:03 صبح
عرض ادب و احترام
در کدی که گذاشتم عدد یک و حرف انگلیسی ال در کنار هم در کلمه tbl1 وجود دارن شبیه هم ولی ال بزرگتره
DIM SQL AS STRING
SQL= "SELECT * FROM tbl1 WHERE (field1='@txt' OR '@txt' IS NULL) ORDER BY field2"
SQL= REPLACE(SQL , "@txt" , textbox1)
کوئری پارامتریک همینیه که گذاشتین ؟ اگه ممکنه یه نمونه شامل پارامتر رشته ای و پارامتر عددی بذارین .
با سپاس و تشکر فراوان
mazoolagh
شنبه 22 دی 1403, 11:25 صبح
سلام دوباره
در کدی که گذاشتم عدد یک و حرف انگلیسی ال در کنار هم در کلمه tbl1 وجود دارن شبیه هم ولی ال بزرگتره
این کد شماست،
با توجه به این که ادیتور فروم اعداد رو فارسی میکنه کاملا واضح هست داستان:
set rs = db.openrecordset " select * from tbl1 where( field1 =textbox1 or textbox1 is nu11 )ORDER BY field2"
در هر صورت این مورد دیگه تمام شده اس.
کوئری پارامتریک همینیه که گذاشتین ؟ اگه ممکنه یه نمونه شامل پارامتر رشته ای و پارامتر عددی بذارین .
این یک کوئری معمولی هست که با کد ساختیم.
برای نمونه های کوئری پارامتریک،
پارامترهای optional (نادیده گرفتن پارامتر در صورت NULL بودن)،
وروش مقدار دهی اونها با کد،
نمونه زیر رو ببینین:
مشکل در اجرای کوئری با چندین شرط (https://barnamenevis.org/showthread.php?544014)
ariayekta
شنبه 29 دی 1403, 10:03 صبح
از این استفاده کن بدون دردسر اضافه
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.