PDA

View Full Version : مشكل در كار با Sp



sempaisaleh
دوشنبه 02 تیر 1393, 11:02 صبح
با سلام خدمت دوستان
من يه sp نوشتم و تو دلفي با adostorproce بهش متصل شدم ولي وقتي مي خوام تو برنامه به پارامتر ها دوباره مقدار بدم هيچ جوابي نمياره. به نشر ميرسه كه وقتي توي جواب بدست آمده دوباره select دوم زده ميشه.
اين از sp

CREATE PROCEDURE AA (
@L1_CODE Varchar(6),@L1_CODE2 Varchar(6),
@SND_DATE char(8),@SND_DATE2 char(8) , @Mandeh Int,
@ACC_YEAR Int ) as


select * from (
Select
L1_CODE,L1_Name,L2_CODE,L2_Name,A.L3_CODE,a.L3_Nam e,
Case when Sum(Mandeh)>0 Then Sum(Mandeh) Else 0 End As MBed ,
Case when Sum(Mandeh)<0 Then -1*Sum(Mandeh) Else 0 End As MBes
From
a_vw_article a Left Outer Join A_Acc_cd3 Cd3 On a.L3_Code=Cd3.l3_code
Left Outer Join A_L3Type L3 On Cd3.L3Type_cd=L3.L3Type_cd
Where
(acc_year = 1392 ) and
( (@L1_CODE is null) Or ( (L1_CODE<=@L1_CODE2) And (L1_CODE>=@L1_CODE) ) ) and
( (@SND_DATE is null) Or ( (SND_DATE<=@SND_DATE2) And (SND_DATE>=@SND_DATE) ) )
Group By L1_CODE,L1_Name,L2_CODE,L2_Name,a.L3_CODE,a.L3_Nam e
Having (@Mandeh Is Null Or ABS(Sum(Mandeh))>@Mandeh)
) kk
Order By L1_CODE
GO



اينم از كد فراخواني دوباره:

ADOStoredProc1.Close;
ADOStoredProc1.ConnectionString:='Provider=SQLOLED B.1;Password=xxxxxxx;Persist Security Info=True;User ID=sa;Initial Catalog=TadbirAsak91;Data Source=192.168.2.1';
ADOStoredProc1.ProcedureName:='AA;1';
ADOStoredProc1.Parameters.ParamByName('@L1_CODE'). Value := '115';
ADOStoredProc1.Parameters.ParamByName('@L1_CODE2') .Value := '115';
ADOStoredProc1.Parameters.ParamByName('@SND_DATE') .Value := '91/01/01';
ADOStoredProc1.Parameters.ParamByName('@SND_DATE2' ).Value := '91/10/31';
ADOStoredProc1.Parameters.ParamByName('@Mandeh').V alue := '1';
ADOStoredProc1.Parameters.ParamByName('@ACC_YEAR') .Value := '1391';
ADOStoredProc1.Active:=true;
ADOStoredProc1.ExecProc;
ADOStoredProc1.Open;

pezhvakco
دوشنبه 02 تیر 1393, 16:25 عصر
سلام
بهتره قوانین نوشتن و اجرای SP را بخونین مانند

With Recompile
Set NoCount On

برای اجرای این نوع SP که خروجی ار نوع جدول داره، همون دستور Open را فقط اجرا کنید .

یوسف زالی
جمعه 06 تیر 1393, 03:39 صبح
With Recompile
Set NoCount On


الان اینا چه ربطی به سوال داشت؟
از طرفی چه ربطی به قوانین نوشتن اس پی داره؟

pezhvakco
جمعه 06 تیر 1393, 09:40 صبح
With Recompile
Set NoCount On


الان اینا چه ربطی به سوال داشت؟
از طرفی چه ربطی به قوانین نوشتن اس پی داره؟

شما که مدیر هستین => بگین :

1 - اگر همه نوشته من رو می خوندین، می دیدین که در آخرش روش اجرای روش فراخوانی SP رو برای حالت گزارشی نوشتم

2 - With Recompile در چه مواردی بکار می آید (می کن در مواردی که SP دارای دستور شرطی متغییر است یه کارایی داره)

3 - Set NoCount On چطور سرعت اجرا رو برای این حالت SP ها افزایش میده

4 -
ADOStoredProc1.Active:=true;
ADOStoredProc1.ExecProc;
ADOStoredProc1.Open;
روش بکار گیری هر کدام از این فرمان ها چگونه است و بکار بردن همه این ها با هم چه مشکلاتی دارد

5 - خیلی ناراحتین نوشته من رو حذف بفرمایید و خودتان پاسخ درست بدهید ؟

یوسف زالی
جمعه 06 تیر 1393, 12:57 عصر
شما که مدیر هستین => بگین

:

بی خود جو الکی ندید. من از اون آدمهایی که شما فکر می کنید نیستم.



5 - خیلی ناراحتین نوشته من رو حذف بفرمایید و خودتان پاسخ درست بدهید ؟

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




1 - اگر همه نوشته من رو می خوندین، می دیدین که در آخرش روش اجرای روش فراخوانی SP رو برای حالت گزارشی نوشتم

جواب شما و توضیحاتتون در رابطه با "قوانین نوشتن اس پی" هیچ ارتباطی با هم ندارند.
دلیل سوالهای من هم همینه.



2 - With Recompile در چه مواردی بکار می آید (می کن در مواردی که SP دارای دستور شرطی متغییر است یه کارایی داره)



Indicates that the Database Engine does not cache a plan for this procedure and the procedure is compiled at run time.

همونطور که می بینید، این دستور اتفاقا شدیدا روی سرعت تاثیر منفی می گذاره. توصیه می کنم نگاهی به مستندات خود اس کیو ال بندازید.



3 - Set NoCount On چطور سرعت اجرا رو برای این حالت SP ها افزایش میده



When SET NOCOUNT is ON, the count is not returned.

این دستور RowAffected یا Row Count رو Return می کنه یا اون رو خاموش می کنه. همین.
این طور هم نیست که شما در همه جاها خصوصا در گزارشات به این دستور و return اون نیازی نداشته باشید.

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

sempaisaleh
شنبه 21 تیر 1393, 10:53 صبح
با سلام مشکل از اینجاست که وقتی sp رو فراخوانی میکنم و به SND_DATE1,2 مقدار میدم جواب درست بدست میاد ولی وقتی جستجوی بعدی رو بدون بستن برنامه میزم و SP رو دوباره فراخوانی میکنم انگار روی همین فیلتری که انجام شده دوباره فیلتر میکنه و جواب درست بدست نمی آید(اگر بازه جدید در بازه قبلی نباشه). کسی میتونه راهنمایی کنه؟
اینم از SP:

CREATE PROCEDURE AA (
@L1_CODE Varchar(6),@L1_CODE2 Varchar(6),
@SND_DATE char(8),@SND_DATE2 char(8) , @Mandeh Int,
@ACC_YEAR Int ) as


select * from (
Select
L1_CODE,L1_Name,L2_CODE,L2_Name,A.L3_CODE,a.L3_Nam e,
Case when Sum(Mandeh)>0 Then Sum(Mandeh) Else 0 End As MBed ,
Case when Sum(Mandeh)<0 Then -1*Sum(Mandeh) Else 0 End As MBes
From
a_vw_article a Left Outer Join A_Acc_cd3 Cd3 On a.L3_Code=Cd3.l3_code
Left Outer Join A_L3Type L3 On Cd3.L3Type_cd=L3.L3Type_cd
Where
(acc_year = 1392 ) and
( (@L1_CODE is null) Or ( (L1_CODE<=@L1_CODE2) And (L1_CODE>=@L1_CODE) ) ) and
( (@SND_DATE is null) Or ( (SND_DATE<=@SND_DATE2) And (SND_DATE>=@SND_DATE) ) )
Group By L1_CODE,L1_Name,L2_CODE,L2_Name,a.L3_CODE,a.L3_Nam e
Having (@Mandeh Is Null Or ABS(Sum(Mandeh))>@Mandeh)
) kk
Order By L1_CODE
GO
نحوه فراخوانی هم بدین صورت نوشتم:

ADOStoredProc1.Close;
ADOStoredProc1.ConnectionString:='Provider=SQLOLED B.1;Password=xxxxxxx;Persist Security Info=True;User ID=sa;Initial Catalog=TadbirAsak91;Data Source=192.168.2.1';
ADOStoredProc1.ProcedureName:='AA;1';
ADOStoredProc1.Parameters.ParamByName('@L1_CODE'). Value := '115';
ADOStoredProc1.Parameters.ParamByName('@L1_CODE2') .Value := '115';
ADOStoredProc1.Parameters.ParamByName('@SND_DATE') .Value := '91/01/01';
ADOStoredProc1.Parameters.ParamByName('@SND_DATE2' ).Value := '91/10/31';
ADOStoredProc1.Parameters.ParamByName('@Mandeh').V alue := '1';
ADOStoredProc1.Parameters.ParamByName('@ACC_YEAR') .Value := '1391';
ADOStoredProc1.Active:=true;
ADOStoredProc1.ExecProc;
ADOStoredProc1.Open;

کجای کار ایراد داره؟

یوسف زالی
شنبه 21 تیر 1393, 11:31 صبح
مگر قرار نشد یا active کنید یا exe ؟