Всем 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