AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.09.2003, 09:27   #1  
Diman is offline
Diman
Участник
Сотрудники Microsoft Dynamics
 
166 / 35 (2) +++
Регистрация: 27.06.2003
Адрес: Москва
Вызов хранимой процедуры
Всем Hello!
Что -то не могу получить данные из SP.
Cвойство класса CalledFrom = Server
Axapta говорит: Ошибка ODBC. Недопустимое использование курсора.
Через Analizer нормально работает.
А без использования процедуры нельзя - очень долго запрос выполняется.
Помогите пожалуйста разобраться.

PHP код:

Str parseQuery
()
{
    
Str SQLQuery "EXEC dbo.sp_BSL_Account20    ";

    
SQLQuery +="'tst','01/02/2003','02/02/2003'";

    return 
SQLQuery;
}


/****************************************************/
 
public void run()
{

    
Connection conn;
    
Statement Stmt;
    
ResultSet rslt;

    
int start_t;
    
LedgerTrans tblLedgerTrans;
    
InventTrans tblInventTrans;
    
BSL_LockSPAccount tblLocksSP;
    ;

    
super();

    
start_t timenow();
    
conn = new UserConnection();
    
Stmt conn.createStatement();

    
ttsBegin;
        
select forupdate tblLocksSP;
        
tblLocksSP.UserId CurUserId ( );
        
tblLocksSP.insert();

        
/*Вызов процедуры*/
         
rslt Stmt.executeQuery(this.parseQuery());

         while(
rslt.next())
        {
           
w(strfmt("%1    %2     %3",rslt.getReal(1),rslt.getString(2),rslt.getString(3)) );
        }

    
tblLocksSP.delete();
    
ttsCommit;
    
Stmt.close();
    
rslt.close();
    
info(strfmt("Затрачено время %1 с.",timenow()-start_t));


Собственно процедура:

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  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Стандартный баг. Надо вставить в начало процедуры 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  
Diman is offline
Diman
Участник
Сотрудники Microsoft Dynamics
 
166 / 35 (2) +++
Регистрация: 27.06.2003
Адрес: Москва
Спасибо, но Axapta все-равно ругается такой же ошибкой.
Старый 16.09.2003, 13:55   #4  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Должно работать.
PHP код:
static void Job4(Args _args)
{

    
Connection conn;
    
Statement Stmt;
    
ResultSet rslt;

    
int start_t;
    
LedgerTrans tblLedgerTrans;
    
InventTrans tblInventTrans;
    
//BSL_LockSPAccount tblLocksSP;

Str parseQuery()
{
    
Str SQLQuery "EXEC sp_BSL_Account20    ";

    
//SQLQuery +="'tst','01/02/2003','02/02/2003'";
    
SQLQuery +="'tst','20030201','20030202'";

    return 
SQLQuery;
}

    ;

    
//super();

    
start_t timenow();
    
conn = new UserConnection();
    
Stmt conn.createStatement();

    
ttsBegin;
        
//select forupdate tblLocksSP;
        //tblLocksSP.UserId = CurUserId ( );
        //tblLocksSP.insert();

        /*Âûçîâ ïðîöåäóðû*/
         
rslt Stmt.executeQuery(parseQuery());

         while(
rslt.next())
        {
           
info(strfmt("%1    %2     %3",rslt.getReal(1),rslt.getString(2),rslt.getString(3)) );
        }

    
//tblLocksSP.delete();
    
ttsCommit;
    
Stmt.close();
    
rslt.close();
    
info(strfmt("Çàòðà÷åíî âðåìÿ %1 ñ.",timenow()-start_t));


PHP код:
SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

ALTER  PROCEDURE sp_BSL_Account20 
    
@dataAreaId         varchar(255), -- Компания для расчета
    
@fromDateVarchar     varchar(255), -- Дата начала (строкапериода расчета
    
@toDateVarchar         varchar(255) -- Дата конца (строкапериода расчета

AS

set nocount on
set ansi_warnings off

if object_id('BSL_Account20'is not null 
    DROP TABLE BSL_Account20

SELECT LEDGERTRANS
.ACCOUNTNUM,LEDGERTRANS.AMOUNTMSTLEDGERTRANS.TRANSDATELEDGERTRANS.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 SumResultAccountNumSource FROM BSL_Account20 GROUP BY AccountNumSource
Старый 16.09.2003, 16:43   #5  
Diman is offline
Diman
Участник
Сотрудники Microsoft Dynamics
 
166 / 35 (2) +++
Регистрация: 27.06.2003
Адрес: Москва
2 Vadik
Должно, а не работает.
А какая у тебя версия Axapta?
У меня 2.5
Изображения
 
Старый 16.09.2003, 17:27   #6  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
3.0 SP1
Странно это.. А запрос-то нормально отработал? В профайлере его в RPC:Completed видно?
Старый 17.09.2003, 10:24   #7  
Diman is offline
Diman
Участник
Сотрудники Microsoft Dynamics
 
166 / 35 (2) +++
Регистрация: 27.06.2003
Адрес: Москва
Да, выполняется.
Результат:
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 какой-то глюк?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вызов метода базового класса Eldar9x DAX: Программирование 15 22.03.2008 19:10
Вызов экспортируемой функции DLL Jabberwocky DAX: Программирование 8 12.09.2006 17:20
SQL Profiler не показывает процедуры!SOS! naomy DAX: Программирование 13 28.09.2005 14:33
Хранимые процедуры и производительность vey DAX: Администрирование 13 17.06.2005 10:56
Как результат выполнения хранимой процедуры поместить в Grid? Yuri Safronov DAX: Программирование 1 28.08.2002 12:38
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:36.