| 
			
			 | 
		#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  | 
| 
	
 | 
| 
			
			 | 
		#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', и будет всем щастье. По крайней мере, у меня после этих исправлений запрос работает  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Спасибо, но  Axapta все-равно ругается такой же ошибкой.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Модератор 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Должно работать.  
		
		
		
		
		
		
		
	PHP код: 
	
			
	PHP код: 
	
			
	 | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			2 Vadik 
		
		
		
			Должно, а не работает. А какая у тебя версия Axapta? У меня 2.5  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Модератор 
		
			
	 | 
	
	
	
		
		
		
		 
			
			3.0 SP1 
		
		
		
		
		
		
		
	Странно это.. А запрос-то нормально отработал? В профайлере его в RPC:Completed видно?  | 
| 
	
 | 
| 
			
			 | 
		#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 какой-то глюк?  | 
| 
	
 |