Вызов процедуры в ard-отчете

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Руслан
Местный житель
Сообщения: 294
Зарегистрирован: 01 ноя 2011, 14:03
Контактная информация:

Re: Вызов процедуры в ard-отчете

Сообщение Руслан »

Функция вызывается! Вызываю ее так:

Код: Выделить всё

		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);
Но проблема в том, что выполняется только функция и выкидывает из Галактики. Остальной код не выполняется...
Руслан
Местный житель
Сообщения: 294
Зарегистрирован: 01 ноя 2011, 14:03
Контактная информация:

Re: Вызов процедуры в ard-отчете

Сообщение Руслан »

Делал трейс сессии: выполняется функция, после этого все завершается и убивает сессию Галактики
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Вызов процедуры в ard-отчете

Сообщение m0p3e »

Для ORACLE у меня не получилось таким образом получить данные. Только через select into.
Вот здесь описывал.
Попробуйте сделать временную таблицу и получать результат через нее.
Руслан
Местный житель
Сообщения: 294
Зарегистрирован: 01 ноя 2011, 14:03
Контактная информация:

Re: Вызов процедуры в ard-отчете

Сообщение Руслан »

m0p3e писал(а):Для ORACLE у меня не получилось таким образом получить данные. Только через select into.
Вот здесь описывал.
Попробуйте сделать временную таблицу и получать результат через нее.
Не совсем понял зачем мне временная таблица... Дело в том, что функция нормально отрабатывает, просто потом после ее выполнения выкидывает из Галактики...
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Вызов процедуры в ard-отчете

Сообщение m0p3e »

С какой целью вызывается хранимая процедура?
Если ничего не возвращается, то зачем весь этот огород?

Код: Выделить всё

 sqlExecDirect('F_INS_EXCLASSVAL(' + #comp(KatsoprNrec) + ')');
Руслан
Местный житель
Сообщения: 294
Зарегистрирован: 01 ноя 2011, 14:03
Контактная информация:

Re: Вызов процедуры в ard-отчете

Сообщение Руслан »

m0p3e писал(а):С какой целью вызывается хранимая процедура?
Если ничего не возвращается, то зачем весь этот огород?

Код: Выделить всё

 sqlExecDirect('F_INS_EXCLASSVAL(' + #comp(KatsoprNrec) + ')');
В хранимке создаю внешние классификаторы и обнуляю внешние атрибуты. Через sqlExecDirect функция не вызывается((((
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Вызов процедуры в ard-отчете

Сообщение m0p3e »

Руслан писал(а):Через sqlExecDirect функция не вызывается((((
Что происходит? Падает? Что в логе ora? Если не падает и лог пуст, то как определяется что не запускается?
Руслан
Местный житель
Сообщения: 294
Зарегистрирован: 01 ноя 2011, 14:03
Контактная информация:

Re: Вызов процедуры в ard-отчете

Сообщение Руслан »

Что происходит? Падает? Что в логе ora? Если не падает и лог пуст, то как определяется что не запускается?
Не падает и в логах ничего не пишет. А определяю так, что внешний классификатор не создается, который прописан в функции и должен создаваться.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Вызов процедуры в ard-отчете

Сообщение Den »

RAJAH писал(а):Надо посмотреть, что выдаст на сервере

Код: Выделить всё

exec S$F_INS_EXCLASSVAL 0

Вы все же проверили непосредственно на сервере БД выполняется она или нет ?
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Вызов процедуры в ard-отчете

Сообщение 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;
Руслан
Местный житель
Сообщения: 294
Зарегистрирован: 01 ноя 2011, 14:03
Контактная информация:

Re: Вызов процедуры в ard-отчете

Сообщение Руслан »

Кстати у меня ругалось на #comp, мол нет такой функции, поля или метода. Убрал # и нормально скомпилило...
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Вызов процедуры в ard-отчете

Сообщение m0p3e »

Руслан писал(а):Кстати у меня ругалось на #comp, мол нет такой функции, поля или метода. Убрал # и нормально скомпилило...
Тьфу. Вот так должно быть:

Код: Выделить всё

sqlExecDirect('F_INS_EXCLASSVAL(#comp(' + KatsoprNrec + '))');
Очепяточка вышла :)
Руслан
Местный житель
Сообщения: 294
Зарегистрирован: 01 ноя 2011, 14:03
Контактная информация:

Re: Вызов процедуры в ard-отчете

Сообщение Руслан »

Тьфу. Вот так должно быть:

Код: Выделить всё
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);
Но после этого Галактика падала и в логах ничего нет.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Вызов процедуры в ard-отчете

Сообщение 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 в хранимке своей не забыли случаем? Это не сиквел...
Руслан
Местный житель
Сообщения: 294
Зарегистрирован: 01 ноя 2011, 14:03
Контактная информация:

Re: Вызов процедуры в ard-отчете

Сообщение Руслан »

С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
!
 Б
Ответить