PDA

View Full Version : یک خطا در فانکشن ها



mzjahromi
چهارشنبه 08 آذر 1385, 11:26 صبح
این مجموعه کد رو ببینید


while len(@PS)>0
begin
if (Len(@rv)>0)
set @rv=substring(@PS,Len(@PS)-2,3)+','+@rv
else
set @rv=substring(@PS,Len(@PS)-2,3)
set @PS=substring(@PS,1,Len(@PS)-3)
end


یک رشته عددی رو میگیره و سه رقم سه رقم جدا میکنه
حالا تو یه شرایطی این خطا رو میده
invalid length parameter passed to the substring function
به نظرتون خطا روی کدوم خط هست و واسه چیه و چطوری رفع میشه
این کد همه جا درست کار میکنه ولی یه بار روی یه سری اطلاعات ارور داده

h_baqery
چهارشنبه 08 آذر 1385, 12:03 عصر
احتمالا در تعریف پارامتر rv طول پارامترتون مثلا 6 بوده و در اون سری اطلاعات برخی مقادیر طولشون از 6 بیشتر بوده .

اگر کد تابع رو کامل بگزارید بهتر می شه نظر داد ویا اون شرایطی رو که خطا داده رو بیشتر تشریح کنید .

mzjahromi
چهارشنبه 08 آذر 1385, 12:10 عصر
CREATE FUNCTION format( @Price bigint, @f varchar(12) )
RETURNS varchar(20) AS
BEGIN
declare @PS varchar(20),@Ps1 varchar(5),@RV varchar(20)
declare @i int
set @ps=str(@Price)
while len(@PS)>0
begin
if (Len(@rv)>0)
set @rv=substring(@PS,Len(@PS)-2,3)+','+@rv
else
set @rv=substring(@PS,Len(@PS)-2,3)
set @PS=substring(@PS,1,Len(@PS)-3)
end
return @rv
END



احتمالا در تعریف پارامتر rv طول پارامترتون مثلا 6 بوده و در اون سری اطلاعات برخی مقادیر طولشون از 6 بیشتر بوده .

تحت هیچ شرایطی طولها از 20 بیشتر نمیشه

ویا اون شرایطی رو که خطا داده رو بیشتر تشریح کنید .
شرایط رو نمی دونم
یه کوئری هست که این تو یه رنج از اطلاعات این خطا رو میده و نمیدونم اون رنج چه مشکلی رو داره که این خطا رو میده

h_baqery
چهارشنبه 08 آذر 1385, 12:18 عصر
این سینتکس شما یه end کم داره .

توی اون رنجی که خطا می ده یه select بزنید ببینید len(str(price))>20 هست یا نه.

h_baqery
چهارشنبه 08 آذر 1385, 13:23 عصر
مشکل کاملا مشخص است . وقتی مقدار پارامتر سوم برای substring منفی شود این پیغام خطا رو میگیرید . و این هم در شرایطی پیش می آید که پارامتر قیمت شما طولش مضربی از 3 نباشد و در سه رقم آخر مثلا دو یا یک رقم بماند پشت ویرگول و وقتی از دو کم بشه منفی می شه و خطا می ده .

mzjahromi
چهارشنبه 08 آذر 1385, 13:27 عصر
مشکل کاملا مشخص است . وقتی مقدار پارامتر سوم برای substring منفی شود این پیغام خطا رو میگیرید . و این هم در شرایطی پیش می آید که پارامتر قیمت شما طولش مضربی از 3 نباشد و در سه رقم آخر مثلا دو یا یک رقم بماند پشت ویرگول و وقتی از دو کم بشه منفی می شه و خطا می ده .
مشکل رو برطرف کردم و یه چیزی شبیه به همین بود ولی نه برای طولهای با مضرب غیر از 3
برای اعدادی که منفی بودن و منفی تک میافتاد
اما در عجبم که چرا برای اعدادی که تک میافتن این اتفاق نمی افتاد

mzjahromi
چهارشنبه 08 آذر 1385, 13:34 عصر
برای اینا جواب داده(ایرادهای شکلی رو بی خیال شین اونا حل میشه)
Expr1
0
0
0
-3,700,000
-1,020,000
-,942,000
-,635,000
-2,195,000
-7,262,000
-4,031,000
-,270,000
-6,868,000
-5,462,000
-3,850,000
-3,287,000
-3,484,000
-4,767,000
-3,793,000
-8,385,000
-5,764,000
-2,548,000
-2,493,000
-3,270,000
-1,970,000
-3,693,000
-5,410,000
-7,700,000
-2,576,000
-,295,000
-2,247,000
-1,488,000
-4,060,000
-4,088,000
0
0
و برای مثبت همینها
ولی برای این جواب نمیده
-107553000

دلیل؟؟؟؟
کد رو اصلاح کردم ولی دلیلش رو میخواهم

h_baqery
چهارشنبه 08 آذر 1385, 13:44 عصر
این عدد تنها فرقی که داره اینه که طولش بیش از 8 تا است و من هم که کد شما رو تست کردم با اعدادی که طولشون بیش از 8 بود این پیغام رو می داد ،‌قبل از قسمتی که پارامتر ps رو کم می کنید مقدارطول پارامتر ps رو print کردم و دیدم که منفی می شه و بعد پیغام میده .

mzjahromi
چهارشنبه 08 آذر 1385, 13:53 عصر
دلیل این که این اعداد رو چاپ کردم هم همین بود که بگم برای خیلی از اونا منفی میشه ولی ارور نمیده. اینکه از 9 تا بیشتر میشه
هر چی هست از همینه
چون برای اینم جواب نداد
1107697800
اگر از منفی شدن هست(که هست) پس چرا برای طولهای کوچکتر جواب میده؟

h_baqery
چهارشنبه 08 آذر 1385, 14:11 عصر
شما این کد رو اجرا کنید و پارامتر قیمت رو یکی یکی اضافه کنید . می بینید که به خاطر منفی شدن پارامتر سوم در substring آخره .


declare @PS varchar(20),@Ps1 varchar(5),@RV varchar(20),@price bigint
set @price = 123456789
declare @i int
set @ps=str(@Price)
while len(@PS)>0
begin
print Len(@PS)-3
if (Len(@rv)>0)
set @rv=substring(@PS,Len(@PS)-2,3)+','+@rv
else
set @rv=substring(@PS,Len(@PS)-2,3)
set @PS=substring(@PS,1,Len(@PS)-3)
end
print @rv

وقتی از 9 رقم بیشتر شد خودتون باید stop کنید.

h_baqery
چهارشنبه 08 آذر 1385, 16:05 عصر
طول رشته شما چون از bigint به رشته تبدیل شده . حتی اگر یک رقم هم باشد طول اولیه اون 10 است .
شاید دلیلش این باشه .