PDA

View Full Version : انتقال داده های یک SP به یک جدول از طریق SP دوم



khoshblagh
یک شنبه 08 دی 1392, 21:26 عصر
با سلام خدمت دوستان
جهت درج اطلاعات در یک جدول از 2 پروسیجر به این شکل استفاده میشود:
در پروسیجر اول از 3 جدول، اطلاعات خاصی را یکجا استخراج میکند که برای این کار از 2 پارامتر که بازه زمانی خاصی را شامل میشود استفاده میگردد. تا اینجا کار مشکلی نیست.
در مرحله بعد با فشار دکمه ای پروسیجر دوم که در حقیقت فراخوانی پروسیجر اول جهت درج دادهای استخراج شده از پروسیجر اول است اجرا میگردد.
مسئله این است که علیرغم صحت پروسیجر دوم (البته از نظر بنده ) هیچگونه داده ای به جدول مورد نظر منتقل نمیشود.
البته اگر عنصر Execute Option گزینه eoAsynExecute =true باشد درخواست پارامترهای استفاده شده در پروسیجر اولی را مینماید! و اگر eoAsynExecute=false باشد هیچ پیامی خطای صادر نمیشود ولی همانطوری که گفتم داده ای هم به جدول مورد نظر انتقال نمیابد.
سئوال اول : آیا برای اجرای پروسیجر دوم نیازی به تعریف دوباره پارامترهای پروسیجر اولی میباشد؟
سئوال دوم : در صورت منفی بودن سئوال اول چگونه این مشکل برطرف میشود.

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

DROP PROCEDURE [dbo].[usp_ShowKharidFasli_temp]
GO
CREATE PROCEDURE usp_ShowKharidFasli_temp
-- Add the parameters for the stored procedure here
@strAzTarikh char(10),
@strTaTarikh char(10)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
set rowcount 0
-- Insert statements for procedure here
-- SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
SELECT TOP (100) PERCENT dbo.tblAshkhas.Onvan, dbo.tblAshkhas.CodEghtesadi, dbo.tblAshkhas.Nam, dbo.tblAshkhas.Famil, dbo.tblAshkhas.CodMeli,
dbo.tblAshkhas.CodPosti, dbo.tblAshkhas.Adres, dbo.tblAshkhas.ShahrOstan, dbo.tblPayman.ShomarPayman, dbo.tblPayman.TarikhPayman,
dbo.tblGardeshPayman.Shar AS SharSorVaz, dbo.tblPayman.EblaghMablaghAkhar, dbo.tblPayman.MablaghPayman, dbo.tblPayman.MablaghAkhar,
dbo.tblAshkhas.Phon1, dbo.tblGardeshPayman.MablaghTax, dbo.tblGardeshPayman.MablaghTaxAfzodeh, dbo.tblGardeshPayman.TarikhSabtSorVaz,
dbo.tblAshkhas.PishPhon1, dbo.tblGardeshPayman.MablaghKolKar, dbo.tblGardeshPayman.MablaghMasalehPayKar,
dbo.tblGardeshPayman.MablaghSorVazGhabl, dbo.tblGardeshPayman.MablaghJaraem, dbo.tblPayman.Onvan AS OnvanPayman
FROM dbo.tblAshkhas INNER JOIN
dbo.tblPayman ON dbo.tblAshkhas.CodId = dbo.tblPayman.CodPaymankar INNER JOIN
dbo.tblGardeshPayman ON dbo.tblPayman.CodId = dbo.tblGardeshPayman.CodIdPayman
WHERE (dbo.tblGardeshPayman.TarikhSabtSorVaz >= @strAzTarikh) AND (dbo.tblGardeshPayman.TarikhSabtSorVaz <= @strTaTarikh)
ORDER BY dbo.tblGardeshPayman.TarikhSabtSorVaz
END


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
DROP PROCEDURE usp_InsertKharidFasli_temp
GO
CREATE PROCEDURE usp_InsertKharidFasli_temp
--@strAzTarikh char(10),
--@strTaTarikh char(10)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
--SELECT * INTO tblKharidFasli_temp
--FROM usp_ShowKharidFasli_temp

INSERT INTO tblKharidFasli_temp
EXEC usp_ShowKharidFasli_temp
END
GO

از sql2005 و TAdoStoreProce استفاده شده است

hossein_h62
دوشنبه 09 دی 1392, 12:48 عصر
سلام دوست عزیز
در sp دومتون باید پارامترهای مورد نیاز sp اول رو بهش پاس بدید؛ در واقع وقتی پارامتری به sp اول پاس ندید نتیجه سلکتتون خالی هست و خطایی هم بروز نمیده!

khoshblagh
دوشنبه 09 دی 1392, 13:31 عصر
با سلام
در واقع sp اول که اجرا میشود نیتجه را درست به گرید منتقل مینماید. زیرا در مرحله اول هر دو پارامتر با فشار دکمه ای به آن منتقل میشود. ولی در محله بعد که دکمه ای دیگر برای انتقال همان داده ها به جدول مورد نظر فشار داده میشود این مشکل پیش می آید. تصور من این است که چون در مرحله اول پارامترها منتقل شده است دیگر نیازی به تکرار آن نیست. آیا اگر در محله اول پارامترها داده شود آیا برای اجرای sp دوم مجددا باید باز تعریف گردند؟

hossein_h62
دوشنبه 09 دی 1392, 13:42 عصر
در sp دوم شما مجددا sp اول رو دارین اجرا می کنید، پس مجددا نیاز به مقداردهی و ارسال پارامترهاتون دارین.

khoshblagh
دوشنبه 09 دی 1392, 13:57 عصر
البته من یکبار با همین رض دوباره پارامترها را به پروسیجر دوم پاس دادم ولی عملا آنها را نشناخت. این پروسیجر اول است برای دوم هم بعد از تغییر نام پروسیجر همین کار اجرا کردم ولی همانطور که گفتم اثرای نداشت .
114607

hossein_h62
دوشنبه 09 دی 1392, 14:37 عصر
البته من یکبار با همین رض دوباره پارامترها را به پروسیجر دوم پاس دادم ولی عملا آنها را نشناخت. این پروسیجر اول است برای دوم هم بعد از تغییر نام پروسیجر همین کار اجرا کردم ولی همانطور که گفتم اثرای نداشت .
114607
نمیدونم تو پست قبل چکار کردین که خطا داده ولی کاری که باید بکنید اینه که پروسیجر اولتون رو بدون تغییر نگه دارید که میتونید بعنوان نمایش اطلاعات ازش استفاده کنید. در ادامه پروسیجر دوم رو با اضافه کردن دو متغیر که بازه زمانی هستند و مقداردهیش ران کنید، یعنی sp دوم اینجوری میشه :
CREATE PROCEDURE usp_InsertKharidFasli_temp
@strAzTarikh char(10),
@strTaTarikh char(10)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
--SELECT * INTO tblKharidFasli_temp
--FROM usp_ShowKharidFasli_temp

INSERT INTO tblKharidFasli_temp
EXEC usp_ShowKharidFasli_temp @strAzTarikh , @strTaTarikh
END

khoshblagh
دوشنبه 09 دی 1392, 15:21 عصر
114612
نتیجه کار

hossein_h62
دوشنبه 09 دی 1392, 15:34 عصر
دوست عزیز با توجه به روشی که شما رفتید منطق کار همینیه که در پست قبل گفتم، یعنی اگر نتیجه پروسیجر اولتون درست باشه و سلکت رو برگردونه و پروسیجر دوم رو همونجوری که نوشتم تعریف کنید باید جواب بده؛ خودتون کنترل کنید اگر جواب نداد پروسیجرهای اصلاح شدتون رو بزارید تا بررسی بشه.
در ضمن نیازی هم نیست حتما دو تا sp برای اینکار ایجاد کنید و میشه ادغامشون کرد.