| 
 
  
	| Перегрузка Дистрибутивного функционала через расширение 
 
 |  
	
		| Предыдущая тема :: Следующая тема |  
		| Автор | Сообщение |  
		| 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);
 |  |  
		|  |  
		|  |  
  
	| 
 
 | Вы не можете начинать темы Вы не можете отвечать на сообщения
 Вы не можете редактировать свои сообщения
 Вы не можете удалять свои сообщения
 Вы не можете голосовать в опросах
 
 |  |