Страница 2 из 4
Re: Вызов процедуры в ard-отчете
Добавлено: 25 мар 2014, 13:33
Руслан
Функция вызывается! Вызываю ее так:
Код: Выделить всё
stmt := sqlAllocStmt;
sqlBindCol(stmt, 1, nresult);
sqlBindParam( stmt, 1, KatsoprNrec );
sqlExecStmt(stmt, 'select top 1 F_INS_EXCLASSVAL (?) from GROUPUSL');
while sqlFetch(stmt) = tsOk do
nresult2:=string(nresult);
sqlFreeStr(stmt);
Но проблема в том, что выполняется только функция и выкидывает из Галактики. Остальной код не выполняется...
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 11:27
Руслан
Делал трейс сессии: выполняется функция, после этого все завершается и убивает сессию Галактики
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 12:36
m0p3e
Для ORACLE у меня не получилось таким образом получить данные. Только через select into.
Вот
здесь описывал.
Попробуйте сделать временную таблицу и получать результат через нее.
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 12:51
Руслан
m0p3e писал(а):Для ORACLE у меня не получилось таким образом получить данные. Только через select into.
Вот
здесь описывал.
Попробуйте сделать временную таблицу и получать результат через нее.
Не совсем понял зачем мне временная таблица... Дело в том, что функция нормально отрабатывает, просто потом после ее выполнения выкидывает из Галактики...
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 13:04
m0p3e
С какой целью вызывается хранимая процедура?
Если ничего не возвращается, то зачем весь этот огород?
Код: Выделить всё
sqlExecDirect('F_INS_EXCLASSVAL(' + #comp(KatsoprNrec) + ')');
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 13:27
Руслан
m0p3e писал(а):С какой целью вызывается хранимая процедура?
Если ничего не возвращается, то зачем весь этот огород?
Код: Выделить всё
sqlExecDirect('F_INS_EXCLASSVAL(' + #comp(KatsoprNrec) + ')');
В хранимке создаю внешние классификаторы и обнуляю внешние атрибуты. Через sqlExecDirect функция не вызывается((((
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 13:34
m0p3e
Руслан писал(а):Через sqlExecDirect функция не вызывается((((
Что происходит? Падает? Что в логе ora? Если не падает и лог пуст, то как определяется что не запускается?
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 13:42
Руслан
Что происходит? Падает? Что в логе ora? Если не падает и лог пуст, то как определяется что не запускается?
Не падает и в логах ничего не пишет. А определяю так, что внешний классификатор не создается, который прописан в функции и должен создаваться.
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 13:50
Den
RAJAH писал(а):Надо посмотреть, что выдаст на сервере
Вы все же проверили непосредственно на сервере БД выполняется она или нет ?
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 13:51
m0p3e
Руслан писал(а):
Не падает и в логах ничего не пишет. А определяю так, что внешний классификатор не создается, который прописан в функции и должен создаваться.
Наверняка ошибка в самой хранимке. Вставьте туда какую-нибудь элементарщину. Типа добавление записи в events.
Код: Выделить всё
INSERT INTO GAL.EVENTS
(
ATL_LASTDATE
,ATL_LASTTIME
,ATL_LASTUSER
,ATL_ORIGINOFFICE
,ATL_OWNER
,TYPEEVENT
,EVENT
)
VALUES
(
GAL.TO_ATLDATE(SYSDATE)
,GAL.TO_ATLTIME(SYSDATE)
,'8000000000000000'
,<номер офиса>
,'8000000000000000'
,1
,"Запуск хранимой процедуры"
);
COMMIT;
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 14:08
Руслан
Кстати у меня ругалось на #comp, мол нет такой функции, поля или метода. Убрал # и нормально скомпилило...
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 14:16
m0p3e
Руслан писал(а):Кстати у меня ругалось на #comp, мол нет такой функции, поля или метода. Убрал # и нормально скомпилило...
Тьфу. Вот так должно быть:
Код: Выделить всё
sqlExecDirect('F_INS_EXCLASSVAL(#comp(' + KatsoprNrec + '))');
Очепяточка вышла
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 14:25
Руслан
Тьфу. Вот так должно быть:
Код: Выделить всё
sqlExecDirect('F_INS_EXCLASSVAL(#comp(' + KatsoprNrec + '))');
Все равно не вызывается так хранимка. Вставка в event не происходит... Дело в том, что функцию у меня получилось вызвать так:
Код: Выделить всё
stmt := sqlAllocStmt;
sqlBindCol(stmt, 1, nresult);
sqlBindParam( stmt, 1, KatsoprNrec );
sqlExecStmt(stmt, 'select top 1 F_INS_EXCLASSVAL (?) from GROUPUSL');
while sqlFetch(stmt) = tsOk do
nresult2:=string(nresult);
sqlFreeStr(stmt);
Но после этого Галактика падала и в логах ничего нет.
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 15:36
m0p3e
Итак.
Создал хранимую процедуру:
Код: Выделить всё
PROCEDURE GAL.S$GATE ( S IN VARCHAR2 ) AS
BEGIN
INSERT INTO GAL.EVENTS
(--ATL_NREC
ATL_LASTDATE
,ATL_LASTTIME
,ATL_LASTUSER
,ATL_ORIGINOFFICE
,ATL_OWNER
,TYPEEVENT
,EVENT
)
VALUES
(
GAL.TO_ATLDATE(SYSDATE)
,GAL.TO_ATLTIME(SYSDATE)
,'8000000000000000'
,313
,'8000000000000000'
,1
,SUBSTR(S,1,100)
);
COMMIT;
END;
Создал ard:
Код: Выделить всё
.form 'ARDGATETEST'
.nameinlist 'Тест вызова хранимой процедуры'
.ard
.begin
sqlExecDirect('GATE('#39 + 'Тест вызова хранимой процедуры из ard' + ''#39 + ')' );
end.
.endform
Скомпилировал. Запустил. Запись появилась.
Вы COMMIT в хранимке своей не забыли случаем? Это не сиквел...
Re: Вызов процедуры в ard-отчете
Добавлено: 26 мар 2014, 16:03
Руслан
Сommit есть. Вот хранимка:
Код: Выделить всё
CREATE OR REPLACE FUNCTION GAL810."S$F_INS_EXCLASSVAL"( KATSOPRNREC VARCHAR2 ) RETURN NUMBER
/*функция создает внешние классификаторы, вставка в таблицу EXCLASSVAL, а также обнуляет внешние атрибуты, если они есть и создает их, если они отсутствуют. Необходимо для загрузки планов продаж*/
AS
Pragma Autonomous_transaction;
cursor mc_nrec is
select katmc.fnrec mc_nrec
from gal810.katmc katmc
where
(KATMC.FKGROUPMC like '40%' or KATMC.FKGROUPMC like '70%')
minus
select katmc.fnrec
from gal810.katmc katmc , gal810.exclassseg exclassseg, gal810.exclassval exclassval
where
1411 = exclassval.fwtable and
141 = EXCLASSVAL.fCLASSCODE and
exclassval.fcrec = katmc.fnrec and
(KATMC.FKGROUPMC like '40%' or KATMC.FKGROUPMC like '70%') and
exclassval.fcclassseg = exclassseg.fnrec;
mc_nrec_rec mc_nrec%Rowtype;
BEGIN
INSERT INTO GAL810.EVENTS
(
ATL_LASTDATE
-- ,ATL_LASTTIME
-- ,ATL_LASTUSER
-- ,ATL_ORIGINOFFICE
-- ,ATL_OWNER
-- ,TYPEEVENT
,EVENT
)
VALUES
(
GAL810.TO_ATLDATE(SYSDATE), 'sdfdfddddfsa'
);
commit;
For mc_nrec_rec In mc_nrec
loop
insert into GAL810.EXCLASSVAL (FWTABLE, FCREC, FCLASSCODE, FCCLASSSEG) values ('1411', mc_nrec_rec.mc_nrec, '141', '8001000000001D16');
commit;
end loop;
update GAL810.ATTRVAL av set AV.FVDOUBLE = 0 where AV.FCATTRNAM = '8001000000000266' and AV.FWTABLE = 1411 and AV.FVDOUBLE <> 0;
commit;
RETURN 8;
END;
Вот ard-отчет:
Код: Выделить всё
.FORM Импорт_плана_продаж_сантехника
.Ard
.GROUP "МАРКЕТИНГ"
Б.var
Бporydok Б : string ; // порядковый номер строки в отчете ( записан в EXCLASSNAME = 133 ...)
znachatr Б: array[1..20] of Бstring ;
attrib Б : array[1..20] of comp Б ;
Бstrn,stn,strk,stk Б ,sch, x: longint ;
Бprizn_yes Б, day1 , mes1 ,god1 , lkol : integer ;
r_dd : date ;
xx1,xx2,xx3,xx6, xx9, xx12, xx15, xx18 , poz , j : longint ;
sXlFileName, mc, kol2, kol4 : string ;
Б Б Б Б Б Б Б Б Б Б Бdek Б1, dek2, dek3 ,mc2 : string ;
.endvar
!
Б.CREATE VIEW Vkatmc
VAR
imy_mc : string ;
AS SELECT *
from katmc
where
((
Vkatmc.imy_mc == katmc.name )) ;
!
.Create view Vexclasseg
as select katmc.name, exclassseg.name
from katmc ,exclassseg
where
((
1411 == exclassval.wtable and
141 == EXCLASSVAL.CLASSCODE and
! 133 == EXCLASSVAL.CLASSCODE and // для тестовой базы
exclassval.crec == katmc.nrec and
exclassval.cclassseg == exclassseg.nrec )) ;
!
.CREATE VIEW Vattrval
VAR
r_recmc : comp;
r_cattrn : comp ;
AS SELECT *
from attrval
where
((
1411 == attrval.wtable and
r_recmc == attrval.crec and
r_cattrn == attrval.cattrnam
));
!
.begin
!
sXlFileName:= ''
Бattrib Б[2] := 0001000000000266h // 'План продаж количество'
! Бattrib Б[5] := 0001000000000218h // 'План сант руб дек2' 00010000000001ABh - на тестовой базе
! Бattrib Б[8] := 0001000000000219h // 'План сант руб дек3' 00010000000001ACh - на тестовой базе
! sXlFileName:=GetFileName('*.xls', ' Выберите исходный файл с планами реализации .xls - файл ');
if(RunInterface('viborxls',sXlFileName)=11)
{
Импорт_плана_продаж_сантехника.fExit ;
Exit;
}
!
end.
!
.begin
var stmt : LongInt;
var stmt_str : LongInt;
var messageErr : longint;
var nresult : word;
var nresult2 : word;
var KatsoprNrec : comp;
KatsoprNrec := 0;
!
! stmt := sqlAllocStmt;
! sqlBindCol(stmt, 1, nresult);
! sqlBindParam( stmt, 1, KatsoprNrec );
! sqlExecStmt(stmt, 'select top 1 F_INS_EXCLASSVAL (?) from GROUPUSL');
! while sqlFetch(stmt) = tsOk do
! nresult2:=string(nresult);
! sqlFreeStr(stmt);
! message (nresult2);
! messageErr := sqlExecute(stmt);
! stmt:=SQLAllocStmt;
! SqlBindParam(stmt, 1, nresult);
! SQLExecStmt(stmt, 'F_INS_SPEC(?)');
sqlExecDirect('F_INS_EXCLASSVAL('#39 + 'Тест вызова хранимой процедуры из ard' + ''#39 + ')' );
end.
!
.begin
! sXlFileName:=GetFileName('*.xlsx', ' Выберите исходный файл с планами реализации .xlsx - файл ');
xlCreateExcelWithTemplate(sXlFileName,false);
!xlOpenNewExcel(false);
!xlOpenWorkbook(sXlFileName);
If (xlIsExcelValid)
xlGetActiveWorkBookName(sXlFileName)
xlGetSheetsCount(lkol)
! xlSetActiveSheet(14)
!
xlGetUsedRange(strn,stn,strk,stk)
sch := strk - strn + 1
!
if xlReadMatrixFromExcel(1,1,sch,19) = true
{
X := 6 ;
xx1 := 1
! xx2 := 2 // порядковый номер
! xx3 := 3
! xx6 := 6
! xx8 := 8
! xx12 := 12
! xx15 := 15
! xx18 := 18
do
{
xlReadFromMatrix(X,xx1, mc) // МЦ
! xlReadFromMatrix(X,xx2, mc2) // название МЦ в Галактике
xlReadFromMatrix(X, 2, dek1) // декада1
! xlReadFromMatrix(X, 5, dek2) // декада2
! xlReadFromMatrix(X, 8, dek3) // декада3
!
if Trim(mc) <> ''
{
Бznachatr Б[2] := dek1
! Бznachatr Б[5] := dek2
! Бznachatr Б[8] := dek3
! message(mc +' '+dek1+' '+ dek2+' '+dek3)
vattrval.r_recmc := 0
if Upcase(Trim(mc)) = 'ПРОЧИЕ ПОКУПАТЕЛИ РБ'
{ vattrval.r_recmc := 00000000000000C2h }
Else
{
Vkatmc.imy_mc := Trim(mc)
if Vkatmc.Getfirst katmc = TsoK
{ vattrval.r_recmc := vkatmc.katmc.nrec
! message ('r_recmc = '+vattrval.r_recmc);
}
}
j := 2
do
{
vattrval.r_cattrn := Бattrib Б[j]
! message (vattrval.r_cattrn);
if vattrval.GetFirst attrval = TsOK
{
Vattrval.attrval.vdouble := БReplace(znachatr Б[J],',' , '.')
Vattrval.Update current attrval ;
! message (Vattrval.attrval.vdouble);
}
j := j + 3
} // end do
while j < 11
} //if Trim(unnn) <> ''
x := x + 1
} // end do
While x <= sch
} // if xlReadMatrixFromExcel(1,1,sch,19) = true
xlKillExcel;
!
end.
Б.endform
!
Б