powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / как сохранить результат интерактивного отчета в таблице
10 сообщений из 10, страница 1 из 1
как сохранить результат интерактивного отчета в таблице
    #36187633
Abdysamat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
условие:
Есть страница для поиска клиентов по полям Фамилия, Имя, Отчество, Дата рождения, Номер удостоверения/паспорта.
На странице есть интерактивый отчет, на нем ограниечение на вывод строк на странице, максимум можно 15 строк увидеть, если запрашиваемых данны больше, выводятся первые 15 и сообщение, что по данному запросу найдено больше чем 15 строк, предлагается отфильтровать данные с помощью встренных фильтров интерактивного отчета.

задание:
Нужно сохранять введенные в формы поиска данные и отображаемые в отчете на странице данные в лог_таблицу. С первой частью я уже справилься. Повесил на кнопку поиск процесс, при каждом нажатии на кнопку в лог записываются systimestamp, имя пользователя, IP адрес, данные полей поиска. Для результата отчета есть в таблице поле varchar2(2048). Должно поместиться.
Теперь как сохранить туда результат отчета - вот в чем проблема. Можно было бы в процедуре сделать ту же самую выборку, что и для Инт. отчета, а потом 15 строк сконвертировать в varchar и сохранить их, но если юзер будет фильтровать данные с помощью фильтра, процесс на кнопке Поиск уже не будет задейтствован.
Может на жаваскрипте можно что-то придумать?
...
Рейтинг: 0 / 0
как сохранить результат интерактивного отчета в таблице
    #36187641
Abdysamat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понял , что при фильтрации уже Ajax работает.
придумал, нужно узнать , какое значение передается при сабмите фильтра, затем повесить Он_лоад процесс с условием request = <значение сабмита при фильтре> и тогда можно будет поймать данные после фильтрации.

Щас буду пробовать =)
...
Рейтинг: 0 / 0
как сохранить результат интерактивного отчета в таблице
    #36188469
kvad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Боюсь что бесполезно пытаться перехватывать сабмиты фильтра IR процессами со страницы, содержащей этот IR (если это не так, переубедите меня, пожалуйста).

Я применял такую конструкцию для перехвата событий IR:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
var onIRUpdate = function() {

  if (!gReport || gReport.ajax_busy === 'true') {
    setTimeout(
      function(){
        onIRUpdate();
      },  1000 );
    return false;    
  }

  <полезный код>

  setTimeout(
    function(){
      gReport.l_LastFunction = function(){
        onIRUpdate();
      };
      if (gReport.valid_action.toString().indexOf('onIRUpdate') == - 1 ) {
        var valid_action_0 = gReport.valid_action;
        gReport.valid_action = function(pTest){
          valid_action_0(pTest);
          onIRUpdate();
        };
      };
    },  1000 );
}

Первый запуск onIRUpdate надо повесить на загрузку страницы, например, с помощью addLoadEvent(onIRUpdate).
Там происходит проверка доступности объекта gReport (реализация IR), выполняется <полезный код>, а в конце ч-з setTimeout вешаются перехватчики на ajax-обновление IR (смена фильтра, набора колонок, и т.д.), заставляющие при обновлении опять запускать onIRUpdate().

Там, где <полезный код>, можно ч-з htmldb_Get вызвать необходимый процесс записи в лог.
Если нет необходимости как-то специально обрабатывать содержимое табл., записываемое в лог, то я бы просто сохранял весь ее html-код: $x('apexir_DATA_PANEL').innerHTML, передавая параметром в htmldb_Get (если влезет в 4000 симв.).
...
Рейтинг: 0 / 0
как сохранить результат интерактивного отчета в таблице
    #36195798
Abdysamat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо kvad , помогло, то что надо.
Вот только одно но: когда Аякс работает, исходный код страницы не обновляется, и даже если я и фильтрую данные отчета, в $x('apexir_DATA_PANEL').innerHTML лежат те данные , что были при первой загрузке страницы. Нехорошо получается :-(
...
Рейтинг: 0 / 0
как сохранить результат интерактивного отчета в таблице
    #36198937
kvad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как-то я не заметил, чтобы innerHTML был неактуальным. Можно пример?
Вот что присутствует, так это "ложные" срабатывания onIRUpdate, т.е. в момент вызова контрола для установки параметров IR (например, нового фильтра, или выбор колонок) ф-ция тоже исполнится, т.к. аякс-вызов при этом тоже произойдет ибо панелька эта строится на стороне сервера. Эту ситуацию можно дополнительно отлавливать, добавив проверку на видимость панельки "apexir_CONTROL_PANEL_DROP":

Код: plaintext
1.
2.
  if ($x('apexir_CONTROL_PANEL_DROP').style.display == 'none') {
    <полезный код>
  }

Тупо в лоб, но должно работать.
...
Рейтинг: 0 / 0
как сохранить результат интерактивного отчета в таблице
    #36199085
Abdysamat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kvad,

А да, простите неуча, невнимательно осмотр результата проводил. Да, срабатывает Аякс и на щелчок по фильтру, и потом на применении фильтра еще 2 раза. ЩАс буду пробовать отлавливать.
Огроменное СПАСИБО.
...
Рейтинг: 0 / 0
как сохранить результат интерактивного отчета в таблице
    #36200466
Abdysamat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аааа, не получается. apexir_CONTROL_PANEL_DROP после установки фильтра остается.
К тому же нужно чтобы только после фильтра лог срабатывал. А тут он и при выборе колонок, и при сохранении отчета страбатывает.

Чото я не пойму , что именно делается в этом куске кода:
if (gReport.valid_action.toString().indexOf('onIRUpdate') == -1){
var valid_action_0 = gReport.valid_action;
gReport.valid_action = function(pTest){
valid_action_0(pTest);
onIRUpdate();
};
};

В частности что за pTest и с чем ее едят.
Может кто-нибудь сможет объяснить
...
Рейтинг: 0 / 0
как сохранить результат интерактивного отчета в таблице
    #36201051
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbdysamatАааа, не получается. apexir_CONTROL_PANEL_DROP после установки фильтра остается.
К тому же нужно чтобы только после фильтра лог срабатывал. А тут он и при выборе колонок, и при сохранении отчета страбатывает.

Чото я не пойму , что именно делается в этом куске кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
   if (gReport.valid_action.toString().indexOf('onIRUpdate') == - 1 ){
      var valid_action_0 = gReport.valid_action;
      gReport.valid_action = function(pTest){
         valid_action_0(pTest);
         onIRUpdate();
      };
   };

В частности что за pTest и с чем ее едят.
Может кто-нибудь сможет объяснить

pTest - это формальный параметр. В этом куске кода переопределяется функция - метод gReport.valid_action - таким образом, чтобы вначале отрабатывало всё, что было в старой функции , а потом - Ваша функция onIRUpdate().
...
Рейтинг: 0 / 0
как сохранить результат интерактивного отчета в таблице
    #36201307
kvad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abdysamat,

apexir_CONTROL_PANEL_DROP после установки фильтра остается, но скрывается. Я предлагал проверять hide она (style.display == 'none') или нет. Если hide, то обрабатываем сохранение; если произошел ее показ с аякс-запросом и активацией (нам не нужной) onIRUpdate, то код не выполнять.

Код: plaintext
gReport.valid_action.toString().indexOf('onIRUpdate') == - 1 

- это проверка, была ли уже модифицирована gReport.valid_action ранее (здесь же).
...
Рейтинг: 0 / 0
как сохранить результат интерактивного отчета в таблице
    #36204693
Abdysamat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наконец то! Сделал все намного проще:
В заголовке кода страницы вижу ссылку на родной апексовский жаваскрипт
Код: plaintext
<script src="/i/javascript/apex_ns_3_1.js" type="text/javascript"></script> 
Захожу в эту директорию(через IE надо открыть как веб-папку), и в этом файле нахожу функцию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
this.column.filter=function(pThis){
			var lAction = 'ADD';
			if(pThis){
				that.current_col_id = pThis;
				lAction = 'UPDATE';
			}else{
				pThis = $v('apexir_COLUMN_NAME');
			}
			var l_OB = that.dialog.validate();
			if(!l_OB){return}
			var lTemp = [l_OB.col,l_OB.col_opt,l_OB.form_items[ 0 ],l_OB.form_items[ 1 ],'apexir_EXPR3']
			that.get.AddArrayItems(lTemp, 1 );
			that.supress_update = true;
			that.action('FILTER',lAction,pThis);
		}
В конце этой функции, после вызова action() вставляю вызов своей функции CallLogging(). ЗАтем заменяю файл в веб-папке /i/javascript/apex_ns_3_1.js на измененный.

В коде своей страницы вставляю функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
	function CallLogging(){
		var receiver = new htmldb_Get(null,$x('pFlowId').value,'APPLICATION_PROCESS=logging', 0 );
		receiver.add( 'IR_RESULTS', "<table>"+$x('4886115631288457').innerHTML+"</table>"); //  4886115631288457  is ID of gTable variable (IR table)
		gReturn = receiver.get();
		receiver = null;
	}

и в футере своей страницы дописал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	addLoadEvent(IsgReport);

	function IsgReport(){
		if (gReport) {
			CallLogging();
		}
	}


И все! Правда, для других страниц, использующих /i/javascript/apex_ns_3_1.js он тоже будет пытаться найти CallLogging(), ну да ничего. Запарился уже с этой проблемой. Можно было наверно на своей странице написать свою функцию для gReport.column.filter = ...
Но что-то не получилось. Наверно не хватило знаний ЖаваСкрипта.

Вот, всем спасибо за помощь и за внимание!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / как сохранить результат интерактивного отчета в таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]