PDA

View Full Version : "یا" در query



mina1363
سه شنبه 13 مرداد 1388, 11:34 صبح
سلام دوستان
برای سرچ در برنامه ام کاربر 4 فیلد برای انتخاب و جستجو داره که یا میتونه همه 4 موضوع رو انتخاب کنه و مقدار بده یا یکیشونو یا 2 تا یا 3 تا و اگر بخواهم کل حالات ممکن رو در نظر بگیرم میشه 13 حالت و اگر بخواهم برای هر کدام تک تک query بنویسم منطقی نیست من در query ام در storeprocedure از INTERSECT بین حالات مختلفم استفاده کردم و چون این sp 4 تا پارامتر داره وقتی که کاربر فقط یکی از مقادیر رو ارسال میکنه اجرا نمیشه میگه بقیه پارامترها مقدار دهی نشده اند باید چکارکنم که بتونم با یه sp تمامی حالاتم رو در نظر بگیرم و درست هم اجرا بشه؟
پیشاپیش ممنونم

بهنام بهمنی
سه شنبه 13 مرداد 1388, 13:17 عصر
شما باید شرط WHERE تان را با توجه به پارامترها بسازی مثلا به شکل زیر




Str = '1=1'
if @prm1 <>'' then Str=Str+ ' and ' + Col1=@prm1
...



حالا می تونی رشته بالا را بعنوان پارامتر where استفاده کنی
شرط 1=1 رو برای این قرارا دادم که لازم نباشه مرتبا بابت and خالی بودن یا نبودن رشته رو چک کنم

mina1363
سه شنبه 13 مرداد 1388, 14:51 عصر
ممنونم دوست عزیز
میشه بگید تغییرات لازم روی query رو بر اساس کواری زیر چه طوری اعمال کنم؟


(select * from Document
where DocDetails=@docdtl and Creditor=@creditor and Debtor=@debtor)
INTERSECT
(select * from Document
WHERE DocDetails=@docdtl and FacNum=@facnum and Creditor=@creditor)

بهنام بهمنی
سه شنبه 13 مرداد 1388, 15:22 عصر
به کدی شبیه کد زیر تغییر کند



Declare @WhereStr nvarchar(1000)
set @WhereStr= ' Where 1=1 '
If @docdtl<>'' then @WhereStr = @WhereStr + ' and DocDetails = ' + @docdtl
If @creditor<>'' then @WhereStr = @WhereStr + ' and Creditor = ' + @creditor
...
Exec(' Select * From Document'+ @WhereStr)

mina1363
جمعه 16 مرداد 1388, 12:45 عصر
دوست عزیز بهنام بهمنی
من این کدی که شما گفتید رو تو sql کپی کردم و اجرا گرفتم ولی error میده که Incorrect Syntax near the keyword 'then' حالا چه جوری این ارور رو رفع کنم؟

mina1363
شنبه 17 مرداد 1388, 06:09 صبح
دوست عزی اگر پاسخم را بدید واقعا ممنون میشم
لطف میکنید

ASKaffash
شنبه 17 مرداد 1388, 08:01 صبح
سلام
باید از Dynamic SQL استفاده شود:
اگر جدول T1 با فیلدهای A1 و A2 قرار است مشروط شوند به مثال ذیل دقت کنید


Create Proc MyDynamic
@A1 BigInt=Null,
@A2 Bigint=Null
As
Declare @Cmd nVarchar(4000),@Where nVarchar(4000)
Set @Where=''
Set @Cmd='Select * From T1'
if Not @A1 Is Null
Set @Where='A1>'+Convert(Varchar(20),@A1)
if Not @A2 Is Null Begin
if @Where<>''
Set @Where=@Where+' and '
Set @Where=@Where+'A2<'+Convert(Varchar(20),@A2)
End
if @Where<>''
Set @Cmd=@Cmd+' Where '+@Where ('+@Where)
Exec(@Cmd)

mina1363
شنبه 17 مرداد 1388, 11:25 صبح
دوست عزیز ASKaffash من باجایگذاری پارامترها و نام table خودم این رو اجرا کردم ولی هیچ خروجی نداره ارور هم نداره در حالی که توی جدولم بر اساس این پارامترها رکورد موجود است حالا باید چکار کنم؟

بهنام بهمنی
شنبه 17 مرداد 1388, 11:47 صبح
sp را که نوشته اید با exec می توانید در داخل sql اجرا کنید ,روی آن راست کلیک کرده و گزینه Execute Stored Procedure را انتخاب کنیددر منوی ظاهر شده پارامترها را مقدار داده و آنرا اجرا کنید
در داخل sp توصیه می کنم مقدار اولیه Where را 1=1 دهید تا مرتبا لازم نباشد چک کنید که آیا لغت and را اضاف کنید و یا نه

ASKaffash
شنبه 17 مرداد 1388, 13:25 عصر
سلام
لطفا کد اصلاح شده را قرار دهید

mina1363
شنبه 17 مرداد 1388, 14:33 عصر
ALTER Proc MyDynamic
@Office BigInt=Null,
@MoeCode Bigint=Null
As
Declare @Cmd nVarchar(4000),@Where nVarchar(4000)
Set @Where=''
Set @Cmd='Select * From Moein'
if Not @Office Is Null
Set @Where='OfficeID>'+Convert(nVarchar(50),@Office)
if Not @MoeCode Is Null Begin
if @Where<>''
Set @Where=@Where+' and '
Set @Where=@Where+'MoeCode<'+Convert(nVarchar(50),@MoeCode)
End
if @Where<>''
Set @Cmd=@Cmd+' Where '+@Where
Exec(@Cmd)

البته باید بگم که این کد را در VisualStudio در StoredProceture نوشتم

ASKaffash
شنبه 17 مرداد 1388, 15:14 عصر
سلام
کد درست است :
اگر بنویسید:
MyDynamic باید همه رکوردها رانشان دهد
اگر بنویسید:
MyDynamic 1 با فرض اینکه OfficeID@ بزرگتر از یک وجود داده باید درست عمل کند
و با دو پارامتر هم همینطور
کد ارائه شده در یک جدول T1 تست کامل شده

mina1363
شنبه 17 مرداد 1388, 15:32 عصر
ببخشید این MyDynamic و MyDynamic 1 رو که میگید کجا باید بنویسم؟

بهنام بهمنی
شنبه 17 مرداد 1388, 16:31 عصر
در تالار مرتبط با زبان برنامه نویسی تان راجع به فراخوانی sp جستجو کنید

ASKaffash
یک شنبه 18 مرداد 1388, 08:01 صبح
سلام
مثلا در C# :


SqlConnection C = new SqlConnection("Data Source=.;Initial Catalog=Test2008;Integrated Security=True");
C.Open();
DataTable DT = new DataTable();
new SqlDataAdapter("MyDynamic", C).Fill(DT);
this.dataGridView1.DataSource = DT;

mina1363
یک شنبه 18 مرداد 1388, 18:38 عصر
ممنونم از توجهتون
باز هم با کد نویسی خروجی نداره

mina1363
سه شنبه 20 مرداد 1388, 06:20 صبح
دوستان کسی نظری نداره؟ باز هم با کد نویسی خروجیی نداره

mina1363
پنج شنبه 22 مرداد 1388, 08:33 صبح
سلام دوستان
مشکلش حل شد حالا اجرا میشه ولی فقط وقتی بهش مقدار عددی میدم خروجی داره ولی وقتی مقدار غیر عددی برای ستونهای غیر عددی میدم میگه :


Invalid column name 'قفغقغ'.

که 'قفغقغ' مقدار غیر عددی من در دیتا بیس است
اینم دستورش است:


ALTER PROCEDURE sp_Search

@docdtl nvarchar(150)=null,
@facnum nvarchar(50)=null,
@creditor nvarchar(50)=null,
@debtor nvarchar(50)=null,
@office int
AS
DECLARE @Cmd nvarchar(4000), @Where nvarchar(4000)
set @Where=''
set @Cmd='select * from Document'
if NOT @docdtl Is NULL
set @Where='DocDetails ='+convert(nvarchar(150),@docdtl)
if NOT @facnum Is NULL begin
if @Where <>''
set @Where=@Where+' and '
set @Where=@Where+'FacNum ='+@facnum
END
if Not @creditor Is Null Begin
if @Where <>''
set @Where=@Where+' and '
set @Where=@Where+'Creditor ='+@creditor
End
if Not @debtor Is Null Begin
if @Where<>''
set @Where=@Where+' and '
set @Where=@Where+'Debtor ='+@debtor
End
if @Where <>''
set @Cmd=@Cmd+' where '+@where
Exec(@Cmd)

RETURN
حالا باید چکار کنم؟