16.09.2003, 09:27 | #1 |
Участник
|
Вызов хранимой процедуры
Всем Hello!
Что -то не могу получить данные из SP. Cвойство класса CalledFrom = Server Axapta говорит: Ошибка ODBC. Недопустимое использование курсора. Через Analizer нормально работает. А без использования процедуры нельзя - очень долго запрос выполняется. Помогите пожалуйста разобраться. PHP код:
CREATE PROCEDURE sp_BSL_Account20 @dataAreaId varchar(255), -- Компания для расчета @fromDateVarchar varchar(255), -- Дата начала (строка) периода расчета @toDateVarchar varchar(255) -- Дата конца (строка) периода расчета AS IF EXISTS (SELECT name FROM sysobjects WHERE name = 'BSL_Account20') DROP TABLE BSL_Account20; SELECT LEDGERTRANS.ACCOUNTNUM,LEDGERTRANS.AMOUNTMST, LEDGERTRANS.TRANSDATE, LEDGERTRANS.VOUCHER, (SELECT MAX(InventTrans.TransRefId) FROM InventTrans WHERE (InventTrans.Voucher = LedgerTrans.Voucher AND InventTrans.DateFinancial = LedgerTrans.TransDate) OR (InventTrans.VoucherPhysical = LedgerTrans.Voucher AND InventTrans.DatePhysical = Ledgertrans.TransDate)) AS Source INTO BSL_Account20 FROM LEDGERTRANS WHERE ((LEDGERTRANS.ACCOUNTNUM = ' 20.110' OR LEDGERTRANS.ACCOUNTNUM = ' 20.120' OR LEDGERTRANS.ACCOUNTNUM = ' 20.130' OR LEDGERTRANS.ACCOUNTNUM = ' 20.210' OR LEDGERTRANS.ACCOUNTNUM = ' 20.220' OR LEDGERTRANS.ACCOUNTNUM = ' 20.310' OR LEDGERTRANS.ACCOUNTNUM = ' 20.320' OR LEDGERTRANS.ACCOUNTNUM = ' 20.410' OR LEDGERTRANS.ACCOUNTNUM = ' 20.420') AND (LEDGERTRANS.TransDate <= @toDateVarchar AND LEDGERTRANS.TransDate >= @fromDateVarchar)) AND (LEDGERTRANS.DataAreaId = @dataAreaId); CREATE INDEX i_AccountNum ON BSL_Account20 (AccountNum); CREATE INDEX i_LedgerTrans ON BSL_Account20 (Source); SELECT SUM (AmountMST) AS SumResult, AccountNum, Source FROM BSL_Account20 GROUP BY AccountNum, Source; GO |
|
16.09.2003, 11:27 | #2 |
Модератор
|
Стандартный баг. Надо вставить в начало процедуры SET NOCOUNT ON
alter PROCEDURE sp_BSL_Account20 @dataAreaId varchar(255), -- Компания для расчета @fromDateVarchar varchar(255), -- Дата начала (строка) периода расчета @toDateVarchar varchar(255) -- Дата конца (строка) периода расчета AS set nocount on set ansi_warnings off IF EXISTS (SELECT name FROM sysobjects WHERE name = 'BSL_Account20') DROP TABLE BSL_Account20; Зачем подзапрос SELECT MAX()? GROUP BY чем не устраивает? Зачем даты передавать строкой? Да еще такой - '01/02/2003'? Объявите их как datetime, не мучайте оптимизатор, передавайте их как '20030201', '20030202', и будет всем щастье. По крайней мере, у меня после этих исправлений запрос работает |
|
16.09.2003, 13:30 | #3 |
Участник
|
Спасибо, но Axapta все-равно ругается такой же ошибкой.
|
|
16.09.2003, 13:55 | #4 |
Модератор
|
Должно работать.
PHP код:
PHP код:
|
|
16.09.2003, 16:43 | #5 |
Участник
|
2 Vadik
Должно, а не работает. А какая у тебя версия Axapta? У меня 2.5 |
|
16.09.2003, 17:27 | #6 |
Модератор
|
3.0 SP1
Странно это.. А запрос-то нормально отработал? В профайлере его в RPC:Completed видно? |
|
17.09.2003, 10:24 | #7 |
Участник
|
Да, выполняется.
Результат: declare @P1 int set @P1=0 declare @P2 int set @P2=2 declare @P3 int set @P3=8193 declare @P4 int set @P4=0 exec sp_cursoropen @P1 output, N'EXEC dbo.sp_BSL_Account20 ''ist'',''20030201'',''20030202''', @P2 output, @P3 output, @P4 output select @P1, @P2, @P3, @P4 Набросал на C++ программку, которая использует этот DSN - отработала нормально. Мож у Axapta какой-то глюк? |
|