PDA

View Full Version : خطای Divide by zero در View



shayan_delphi
یک شنبه 14 آبان 1385, 21:27 عصر
سلام
من در یک View یک فیلد محاسباتی دارم که از تقسیم یک عدد بر یک پارامتر بدست می آید،
اگر پارامتر صفر باشد،خطای Divide by zero رخ می دهد.
برای رفع مشکل چه راه حلی دوستان پیشنهاد می کنند؟
در ضمن از دستور SET ARITHABORT و یک دستور مشابه دیگر هم در QA استفاده کردم نتوانستم از بروز خطا جلوگیری کنم.دلیلش چیه؟

Kamyar.Kimiyabeigi
دوشنبه 15 آبان 1385, 11:06 صبح
خوب هر عدد تقسیم بر صفر بینهایت میشه و error Divide by zero میده شما باید کنترل کنید پارامتری که در مخرج قرار میگیره صفر نباشه همین

AminSobati
دوشنبه 15 آبان 1385, 14:33 عصر
SET ARITHABORT OFF
GO
SET ANSI_WARNINGS OFF
GO
create table t10(
c1 int)
GO
insert t10 values(1)
insert t10 values(0)
insert t10 values(2)
GO
select 5/ c1 from t10

shayan_delphi
دوشنبه 15 آبان 1385, 22:35 عصر
ممنون از اینکه جواب دادید ولی
اولا این پارامتر مجاز هست که صفر بشه و در اون صورت باید چطور مشکل را حل کنم؟
ثانیا آقای ثباتی من عرض کردم در View یک فیلد محاسباتی با این ویژگی دارم.
و دستور SET ARITHABORT OFF را هم در QA می نویسم عمل نمی کند و در VIew هم که نشد بنویسم.

AminSobati
سه شنبه 16 آبان 1385, 12:30 عصر
- مجاز بودن اینکه فیلد شما میتونه صفر باشه، مشکل تقسیم بر صفر رو حل نمیکنه! به نظرتون چه عددی باید به شما برگرده در این حالت؟

- در View غیر از Query چیز دیگه نمیشه نوشت. لذا Select رو در SP قرار بدین و قبلش SETهای لازم رو انجام بدین. اگر از Client مستقیما Select میفرستین این کار اصولی نیست، حداقل قبل از Select هم SET کنین

- اینکه در QA عمل نمیکنه دقیقا یعنی چی؟ کدی که براتون نوشتم موقع تقسیم بر صفر Null میده و بقیه رکوردها درست جواب میدن

shayan_delphi
سه شنبه 16 آبان 1385, 22:10 عصر
-این پارامتر،کارکرد پرسنل هست که خارج قسمت یک کسر شده و ممکن کارکرد شخص صفر باشه.
-دستور Set را در QA با یک مثال نوشتم ولی برای حالت تقسیم بر صفر NUll نداد و همون خطا را گرفت
حتما باید در Sp بنویسم؟

AminSobati
سه شنبه 16 آبان 1385, 22:15 عصر
- خوب زمانی که کارکرد شخص صفر باشه، بازهم تقسیم باید انجام بشه؟ در دنیای کاغذ (غیر اتوماسیون) چه تصمیمی در این موارد گرفته میشه؟

- الزاما SP نمیخواد، نمیدونم چرا این کد برای شما کار نکرده!

majid_afra222
چهارشنبه 17 آبان 1385, 12:44 عصر
سلام
آقای ثباتی درست میگن که در view بجز یه select ساده چیزی نمیشه نوشت، ولی چرا از دستورات ساده استفاده نمی کنید. یکی از اون دستورات ساده CASE هستش.
اینم یه مثال :


DECLARE @int1 INT
DECLARE @int2 INT
SET @int1 = 10
SET @int2 = 0
SELECT CASE @int2 WHEN 0 THEN 0
ELSE @int1 / @int2
END

shayan_delphi
چهارشنبه 17 آبان 1385, 22:08 عصر
چون این تقسیم در یک عبارت هست با صفر بودن کارکرد حاصل تقسیم در عبارت صفر شده و بقیه فرمول محاسبه می شود.
-آقا مجید من مشکلم در view هست و دستور که شما لطف کردید نوشتید مسئله را برطرف نمی کنه.

majid_afra222
چهارشنبه 17 آبان 1385, 22:20 عصر
چون این تقسیم در یک عبارت هست با صفر بودن کارکرد حاصل تقسیم در عبارت صفر شده و بقیه فرمول محاسبه می شود.
-آقا مجید من مشکلم در view هست و دستور که شما لطف کردید نوشتید مسئله را برطرف نمی کنه.
سلام،
منظور این بود که از case برای بررسی عدد کسر تقسیم استفاده کنی و اگه صفر نبود تقسیم کنی و اگه صفر بود هر کار دیگه ای که داری.
کدی رو که نوشتی اینجا قرار بده تا شاید بشه درستش کرد.