|  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 какой-то глюк? | 
|  |