CftClub.ru
Клуб специалистов ЦФТ-Банк

Перегрузка Дистрибутивного функционала через расширение

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих
Предыдущая тема :: Следующая тема  
Автор Сообщение
MVZ
Участник со стажем


Вступление в Клуб: 14.03.2023
СообщениеСр Мар 22, 2023 09:55   Перегрузка Дистрибутивного функционала через расширение Ответить с цитатой
Полезность: Нет оценки
Коллеги добрый день,

подскажите пожалуйста есть-ли какая-либо возможность перегрузить (i.e. переписать на свою вместо штатной) функцию созданную в дистрибутиве.

Пример:
Есть задача изменить список шаблонов формирующийся при печати в OOXML. Данный функционал достаточно неплохо реализован самим CFT однако его работа не удовлетворяет конечных пользователей. Для этих целей на дистрибутивную форму была создана форма с расширением, частично проблема была решена, но когда дело коснулось более серьезных изменений начались проблемы, а именно:
для того чтобы решить свою задачу мне нужно чтобы вместо дистрибутивной функции описанной в операции в секции "Локальные описания" дистрибутивного модуля вызывалась моя функция, с тем же именем описанная уже в расширении. Что я не делал единственный вариант к которому я пришел это полностью копировать код разработчиков и модифицировать его под свои нужды, однако в этом случае код будет исполняться два раза один раз когда отработает штатных механизм, а второй раз, когда уже будет работать моя реализация - что совсем неприемлемо.
Кроме того я хотел бы понять как можно из расширения менять содержимое переменных дистрибутивного метода а так же ставить свои отладочные сообщения.


Заранее извиняюсь за глупые вопросы,
С Уважением,
Максим.

P.S.

Если эти механизмы где-то описаны пожалуйста ткните пальцем я с удовольствием почитаю
CSmaster
Участник со стажем


Вступление в Клуб: 24.09.2021
СообщениеСр Мар 22, 2023 11:04    Ответить с цитатой
Полезность: Нет оценки
Есть один грязный хак в теле расширения, чтобы вызывался свой код, вместо дистрибутивного (в своём коде натыкать отладку, скопировать, подправить или оставить нужный дистр код):
Код:

begin
   iDummy := 1;
   if iDummy = 1 then
      --Здесь расположить альтернативный код
      return;
   end if;

   &BASE$SETVARS;
   &BASE$EXECUTE;
end;
MVZ
Участник со стажем


Вступление в Клуб: 14.03.2023
СообщениеЧт Мар 23, 2023 06:20    Ответить с цитатой
Полезность: Нет оценки
CSmaster пишет:
Есть один грязный хак в теле расширения, чтобы вызывался свой код, вместо дистрибутивного (в своём коде натыкать отладку, скопировать, подправить или оставить нужный дистр код):
Код:

begin
   iDummy := 1;
   if iDummy = 1 then
      --Здесь расположить альтернативный код
      return;
   end if;

   &BASE$SETVARS;
   &BASE$EXECUTE;
end;


Спасибо большое, но код отрабатывает с ошибкой

PLP-METHOD_S_FUNC: Операция [] должна возвращать результат.

пробывал изменить вот на такое return &BASE$EXECUTE;

но что-то подсказывает что в этом случае управление будет передано в родительский вызов...

Я хочу внести немного конкретики в данную проблему. Мне нужно пересортировать список шаблонов заведенный в справочнике Печатные формы->Сервис печати->Шаблоны сервиса->Добавить депозитный договор->Шаблоны сервиса
При печати из Депозиты Физ лиц->Печать в Word(OOXML) выходит форма где снизу перечисляются вышеописанные шаблоны, однако их сортировка не удовлетворяет требованиям, поэтому мне нужно их пересортировать.

Я попробовал реализовать нужный порядок сортировки через ре-организацию переменной V_PRINT_FORMS которая содержит список шаблонов - не помогло, так в этом случае рушится еще что-то. Я создал промежуточную переменную в цикле присвоил нужные индексы нужным шаблонам и по окончании эту буферную переменную засовываем обратно в базовую итог формы просто не генерируются на экран

Мои вопросы:
1.есть-ли штатные методы работы с массивами (функции add, sort, delete)
2. неужели мне нужно тащить с дистрибутива в свое расширение весь код и далее его модифицировать и если да то куда его вставить что бы исключить вызов дистрибутивного кода. Форма о которой идет речь содержит код не только в теле но и в локальный объявлениях тоже?

Заранее благодарен,
С Уважением,
Максим

P.S.

Попробывал тупо перекопировать весь код из дистрибутивного метода, без всякий изменений - получилась какая-та ерунда...
чувсвую себя полным болваном...

P.S. 2

Еще одна странность...
вот нашел я кривой способ повилять на результат без попыток перегрузки дистрибутива, то есть я просто и довольно тупо сортирую(если можно так выразиться массив), а потом его результат запихиваю в штатную переменную
Код:
for i in 1..V_PRINT_FORMS.count loop
      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Анкета-заявление на открытие картсчета и выпуск карты' then
         V_PRINT_FORMS_BUF(1) := V_PRINT_FORMS(i);         
      end if;
      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = ' Анкета-заявление текущий счет' then
         V_PRINT_FORMS_BUF(2)             := V_PRINT_FORMS(i);         
         idx                         := idx +1;
      end if;      
      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Сведения о клиенте - физическом лице' then
         V_PRINT_FORMS_BUF(3)             := V_PRINT_FORMS(i);         
         idx                         := idx +1;
      end if;
      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Заявление на перечисление МСП' then
         V_PRINT_FORMS_BUF(4)             := V_PRINT_FORMS(i);         
         idx                         := idx +1;
      end if;
            
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Анкета-заявление на открытие вклада' then
         V_PRINT_FORMS_BUF(5)             := V_PRINT_FORMS(i);      
         idx                         := idx +1;
      end if;      
      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Анкета-заявление на открытие дополнительной карты' then
         V_PRINT_FORMS_BUF(6)             := V_PRINT_FORMS(i);         
         idx                         := idx +1;
      end if;
         
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Заявление на перечисление ПЕНСИИ' then
         V_PRINT_FORMS_BUF(7)             := V_PRINT_FORMS(i);      
         idx                         := idx +1;
      end if;      
      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Образцы подписей' then
         V_PRINT_FORMS_BUF(8)             := V_PRINT_FORMS(i);         
         idx                         := idx +1;
      end if;      
      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Печать договора "Депозита до востребования"' then
         V_PRINT_FORMS_BUF(9)             := V_PRINT_FORMS(i);         
         idx                         := idx +1;
      end if;      
      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Печать договора вклад "Простой" без капитализации без снятия' then
         V_PRINT_FORMS_BUF(10)             := V_PRINT_FORMS(i);         
         idx                         := idx +1;
      end if;
      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Печать договора вклад "Простой" без капитализации с частичным снятием' then
         V_PRINT_FORMS_BUF(11)             := V_PRINT_FORMS(i);
         idx                         := idx +1;
      end if;      
      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Печать договора вклад "Простой" с капитализацией без снятия' then
         V_PRINT_FORMS_BUF(12)             := V_PRINT_FORMS(i);
         idx                         := idx +1;
      end if;
      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Печать договора вклад "Простой" с капитализацией с частичным снятием' then
         V_PRINT_FORMS_BUF(13)             := V_PRINT_FORMS(i);
         idx                         := idx +1;
      end if;      
      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] = 'Печать договора текущего счета' then
         V_PRINT_FORMS_BUF(14)             := V_PRINT_FORMS(i);
         idx                         := idx +1;
      end if;
   end loop;
   
   V_PRINT_FORMS.delete;
   V_PRINT_FORMS := V_PRINT_FORMS_BUF;

-- снимаем чекбоксы
for i in 1..V_PRINT_FORMS.count loop      
      if V_PRINT_FORMS(i).[TEMPLATE].[NAME] <> 'Анкета-заявление на открытие картсчета и выпуск карты' then
         V_PRINT_FORMS(i).[PRINT_SIGN]    := FALSE;         
      end if;
   end loop;



Но тут начинается другой спец эффект, если операционист решает поставить галку в чек боксе, который я снял програмно, на стороне сервера он просто не срабатывает(всмысле отчет не печатается на экран).

И еще один спецэффект связан с тем если я гружу в список свою форрму со своими докварами то они не заполняются, и я не понимаю как в расширении можно это исправить с учетом всех тех ограничений которые заложены в в дистрибутивном коде.

Если кто-нибудь может помочь наставить на путь истинный буду очень Вам признателен
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеЧт Мар 23, 2023 13:49    Ответить с цитатой
Полезность: Нет оценки
Цитата:
Код:

begin
iDummy := 1;
if iDummy = 1 then
--Здесь расположить альтернативный код
return;
end if;

&BASE$SETVARS;
&BASE$EXECUTE;
end;


В операции PRINT_WRD_XML тип результат - строка , д.б. return null; хотя бы
CSmaster
Участник со стажем


Вступление в Клуб: 24.09.2021
СообщениеЧт Мар 23, 2023 15:01    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
Цитата:
Код:

begin
iDummy := 1;
if iDummy = 1 then
--Здесь расположить альтернативный код
return;
end if;

&BASE$SETVARS;
&BASE$EXECUTE;
end;


В операции PRINT_WRD_XML тип результат - строка , д.б. return null; хотя бы

Пример под операцию, которая ничего не возвращает. Return в данном случае должен выйти из неё после выполнения своего кода, не дойдя до вызова кода в родительской операции. Если расширяемая операция что то возвращает, то подход должен быть другим. К примеру вызвать какое нибудь исключение вначале намерянно, а потом в его обработчике пустить на выполнение свой код вместо дистрибутивного. В общем полёт фантазии.
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеЧт Мар 23, 2023 16:21    Ответить с цитатой
Полезность: Нет оценки
Я на это ответил, но не процитировал

Цитата:
но код отрабатывает с ошибкой
PLP-METHOD_S_FUNC: Операция [] должна возвращать результат.
MVZ
Участник со стажем


Вступление в Клуб: 14.03.2023
СообщениеПт Мар 24, 2023 13:04    Ответить с цитатой
Полезность: Нет оценки
Джентльмены,

больше вам спасибо за ваше время, но к сожалению ничего не помогло. Казалось бы банальная вещь, но реализации толковой нет.

С Уважением,
Максим.
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеПт Мар 24, 2023 13:20    Ответить с цитатой
Полезность: Нет оценки
Цитата:
1.есть-ли штатные методы работы с массивами (функции add, sort, delete)


Сортировать массив можно, либо создав индексированный массив type ttt is table of number index by string;, либо через временную таблицу

ttt.delete(idx);
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru