PDA

View Full Version : سوال: مشكل با اين پروسيجر



majidmir
پنج شنبه 06 خرداد 1389, 13:49 عصر
سلام
يه ورسيجر نوشتم كه فاكتور رو محاسبه كنه الان يه مشكل كوچيك دارم . مشكلم اينه كه بعد از محاسبه ء هزينه اونو نميدونم بايد چطوري توي برنامه insert كنم در حالي كه اون متغير رو هم تعريف كردم ؟‌:متفکر: اين هم كد



CREATE PROCEDURE M_K_Kharid_INSERT
@cod as int,
@codkala as int,
@codmoshtari as int ,
@noaekharid as nchar(10),
@takhfif as money,
@date1 as datetime
/*متغير هايي جهت انجام عمليات مشتق*/
AS
declare @price as money
/* جهت جلوگيري از ورود مقادير تكراري */
if (select count(*) from kharidmoshtari where (cod=@cod and @codkala=codkala and @codmoshtari=codmoshtari and @noaekharid=noaekharid and @takhfif=takhfif and @date1=date1))=0
begin
-----------------------------------------------------------------
--محاسبه هزينه فاكتور
select kharidmoshtari.tedad,sum(kala.ghamatfo*kharidmosht ari.tedad)as price,kharidmoshtari.cod from kala join kharidmoshtari
on
kala.cod=kharidmoshtari.codkala
group by kharidmoshtari.tedad,kala.ghamatfo,kharidmoshtari. cod
-- به اين خط گير ميده ؟
price=@price
-----------------------------------------------------------------
insert into kharidmoshtari (codkala,codmoshtari,noaekharid,takhfif,date1,pric e1) values(@codkala,@codmoshtari,@noaekharid,@takhfif, @date1,@price)
return 1
end
else
return 0
GO


یادداشت:
برای قرار دادن کد همیشه بایستی از تگ کد یا تک source استفاده کرد. نه نقل قول.

محمد سلیم آبادی
پنج شنبه 06 خرداد 1389, 14:16 عصر
CREATE PROCEDURE M_K_Kharid_INSERT
@cod as int,
@codkala as int,
@codmoshtari as int ,
@noaekharid as nchar(10),
@takhfif as money,
@date1 as datetime
AS
declare @price as money
if (select count(*) from kharidmoshtari where (cod=@cod and @codkala=codkala and @codmoshtari=codmoshtari and @noaekharid=noaekharid and @takhfif=takhfif and @date1=date1))=0
begin
insert into kharidmoshtari (codkala,codmoshtari,noaekharid,takhfif,date1,pric e1)
select @codkala,@codmoshtari,@noaekharid,@takhfif, @date1, sum(kala.ghamatfo*kharidmoshtari.tedad) as price
from kala
join kharidmoshtari
on kala.cod=kharidmoshtari.codkala
group by kharidmoshtari.tedad, kala.ghamatfo, kharidmoshtari.cod

return 1
end
else
return 0
GO

majidmir
پنج شنبه 06 خرداد 1389, 14:48 عصر
سلام دوست عزيز من اين پروسيجر رو الان كه تحليل كردم چند قسمتش واسم نااشناست مشه توضيح بديد چكار كرديد

1- value اين تابع چطوري مقدار گرفته در حالي كه اصلا ننوشتيد ؟
2- مقدار price چطوري مقدار دهي شده است ‌؟

اگه ميشه يه توضيح كامل بديد ببينم چكار كرديد‌؟

محمد سلیم آبادی
پنج شنبه 06 خرداد 1389, 14:50 عصر
دوست عزيز ايني كه نوشتي values نداره ؟
مشه بيشتر در موردش توضيح بدي ؟
برای درج از چند Syntax متفاوت می شود استفاده کرد. یکی از آنها که استاندارد زبان SQL هست دارای VALUES می باشد.

من از دستور INSERT INTO SELECT برای درج استفاده کرده ام.

majidmir
پنج شنبه 06 خرداد 1389, 15:15 عصر
ميشه از syntax ‌
insert into value استفاده كني اونجوري قابل فهم تر هستش

majidmir
پنج شنبه 06 خرداد 1389, 15:38 عصر
با اين تفاسير دستور update رو بايد اينطوري بنويسم ؟‌
CREATE PROCEDURE M_K_Kharid_UPDATE
@cod as int,
@codkala as int,
@codmoshtari as int ,
@noaekharid as nchar(10),
@takhfif as money,
@date1 as datetime
AS
declare @price as money
/*ايا چنين ركوردي وجود دارد ؟ */
if (select count(*) from kharidmoshtari where @cod=cod)>0
begin
/* جهت جلوگيري از ورود مقادير تكراري */
if (select count(*) from kharidmoshtari where (cod=@cod and @codkala=codkala and @codmoshtari=codmoshtari and @noaekharid=noaekharid and @takhfif=takhfif and @date1=date1))=0
begin

update kharidmoshtari set codkala,codmoshtari,noaekharid,takhfif,date1,price 1

select @codkala,@codmoshtari,@noaekharid,@takhfif, @date1, sum(kala.ghamatfo*kharidmoshtari.tedad) as price
where cod=@cod
from kala
join kharidmoshtari
on kala.cod=kharidmoshtari.codkala
group by kharidmoshtari.tedad, kala.ghamatfo, kharidmoshtari.cod

return 1
end
end
else
return 0
GO

كه خطا ميده و موقعي كه اينجوري هم مينويسم بازم خطا ميده ؟‌:عصبانی++:
CREATE PROCEDURE M_K_Kharid_UPDATE
@cod as int,
@codkala as int,
@codmoshtari as int ,
@noaekharid as nchar(10),
@takhfif as money,
@date1 as datetime
AS
declare @price as money
/*ايا چنين ركوردي وجود دارد ؟ */
if (select count(*) from kharidmoshtari where @cod=cod)>0
begin
/* جهت جلوگيري از ورود مقادير تكراري */
if (select count(*) from kharidmoshtari where (cod=@cod and @codkala=codkala and @codmoshtari=codmoshtari and @noaekharid=noaekharid and @takhfif=takhfif and @date1=date1))=0
begin

update kharidmoshtari set codkala=@codkala,codmoshtari=@codmoshtari,noaekhar id=@noaekharid,takhfif=@takhfif,date1=@date1,price 1

select @codkala,@codmoshtari,@noaekharid,@takhfif, @date1, sum(kala.ghamatfo*kharidmoshtari.tedad) as price
where cod=@cod
from kala
join kharidmoshtari
on kala.cod=kharidmoshtari.codkala
group by kharidmoshtari.tedad, kala.ghamatfo, kharidmoshtari.cod

return 1
end
end
else
return 0
GO

محمد سلیم آبادی
پنج شنبه 06 خرداد 1389, 19:47 عصر
شما نیاز دارین مقدار مورد نظری که با Query بدست میاورین را به متغیر که قبلا تعریف کردین انتساب بدین. تا بعدا در ماده ی VALUES عبارت INSERT بتوانید استفاده کنید (یا در عبارت UPDATE)، یعنی این شکلی:

DECLARE @Price MONEY
SET @Price = (SELECT sum FROM t) --d


INSERT INTO Table (Price) VALUES(@Price)--d

UPDATE table
SET price = @price
WHER .... -d

محمد سلیم آبادی
پنج شنبه 13 خرداد 1389, 13:09 عصر
این کد update را امتحان کردین؟

update kharidmoshtari
set codkala=@codkala,
codmoshtari=@codmoshtari,
noaekhar id=@noaekharid,
takhfif=@takhfif,
date1=@date1,
price 1 =
(select sum(kala.ghamatfo*kharidmoshtari.tedad)
where cod=@cod
from kala
join kharidmoshtari
on kala.cod=kharidmoshtari.codkala
group by kharidmoshtari.tedad, kala.ghamatfo, kharidmoshtari.cod)

البته نام ستون price 1 را باید داخل [] قرار بدین تا مشکلی بوجود ندارد. از طرفی بهتره این نام به نام price_1 تغییر نام کند تا کمی استاندارد بشود.

majidmir
پنج شنبه 13 خرداد 1389, 14:33 عصر
این کد update را امتحان کردین؟

update kharidmoshtari
set codkala=@codkala,
codmoshtari=@codmoshtari,
noaekhar id=@noaekharid,
takhfif=@takhfif,
date1=@date1,
price 1 =
(select sum(kala.ghamatfo*kharidmoshtari.tedad)
where cod=@cod
from kala
join kharidmoshtari
on kala.cod=kharidmoshtari.codkala
group by kharidmoshtari.tedad, kala.ghamatfo, kharidmoshtari.cod)البته نام ستون price 1 را باید داخل [] قرار بدین تا مشکلی بوجود ندارد. از طرفی بهتره این نام به نام price_1 تغییر نام کند تا کمی استاندارد بشود.
سلام
دوست عزيز از راهنمايهاي خيلي خوبتون كمال تشكر رو دارم !:لبخندساده:
مشكل من اينه كه ميخواهم دستور select با دستور insert OR update قاطي نشه و به صورت جدا جدا استفاده بشن و بتونم مقدار price رو در يه متغير بريزم و از اون متغير براي مقدار دهي ها استفاده كنم

محمد سلیم آبادی
پنج شنبه 13 خرداد 1389, 14:59 عصر
مقدار price رو در يه متغير بريزم و از اون متغير براي مقدار دهي ها استفاده كنم
در مورد این موضوع که قبلا اشاره کرده بودم!
پست 7 را نخواندین؟ ابتدا یک متغیر تعریف می کنید از نوع price ای که کوئری محاسبه می کنه. سپس با کمک یک دستوری شبیه به این مقدار برگردانده شده توسط کوئری را به متغیر انتساب میدین سپس از مقدار این متغیر در دستوراتی چون insert و Update استفاده می کنید:

SET @price =
(select sum(kala.ghamatfo*kharidmoshtari.tedad)
where cod=@cod
from kala
join kharidmoshtari
on kala.cod=kharidmoshtari.codkala
group by kharidmoshtari.tedad, kala.ghamatfo, kharidmoshtari.cod)
--OR
SELECT @price = sum(kala.ghamatfo*kharidmoshtari.tedad)
where cod=@cod
from kala
join kharidmoshtari
on kala.cod=kharidmoshtari.codkala
group by kharidmoshtari.tedad, kala.ghamatfo, kharidmoshtari.cod)


امید وارم که مشکلتان حل بشه!