Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы. / 14 сообщений из 14, страница 1 из 1
15.02.2012, 16:53
    #37663413
Rikki-Tikki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
Здравствуйте!

Задача такая:
в pl sql функции валидации на Tabular form column пройтись по всем строкам на форме и получить значения column-ов в этих других строках.

Как обращаться к column-ам строки, на которой находится column, для которого пишем валидацию понятно - это просто :COLUMN_NAME.

Вот нашла, что в apex 4.1 есть встроенные столбцы, среди которых есть "APEX$ROW_NUM". Может, с помощью него можно перемещаться по строкам?

Пожалуйста, помогите. В Oracle® Application Express Application Builder User's Guide
Release 4.1 для обращения к другим строкам не могу найти.
...
Рейтинг: 0 / 0
15.02.2012, 18:14
    #37663676
Rikki-Tikki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
итак, в валидации на каламне мне нужно каждый раз просматривать значения этого же каламна во всех строках (а именно - считать сумму), имеющихся в данной сессии на форме.
...
Рейтинг: 0 / 0
16.02.2012, 11:48
    #37664783
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
Rikki-Tikki,

Еще раз, если :COLUMN_NAME не подходит

SvDevДля этого предназначено apex_item api. И коллекции apex_application.g_fxx. Гуглите.
apex_application.g_fxx рекомендуется использовать совместно с apex_item api, т.к. порядок нумерации коллекций не документирован. (может поменяться в след. версиях). Но можно прямо через apex_application.g_fxx
...
Рейтинг: 0 / 0
16.02.2012, 11:55
    #37664800
haXbat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
Rikki-Tikki,

И с чем сравнивать получившуюся сумму?

Я похожую проверку делал полностью на клиенте через javascript: пробегался по каждой колонке, подсчитывал сумму, сравнивал с рассчитанным заранее значением. Тут только нужно учитывать особенности обработки чисел с плавающей запятой в js (>>> 1.1+2.2
=3.3000000000000003) + значение, с которым идет сравнение, хранится на странице и его можно ручками править ( в моем случае некритично, иначе передавать ajax-ом и сравнивать на базе)
Рано или поздно все равно придется делать вставки js+ajax, т.к. стандартных апексовых фич становится недостаточно при возрастании сложности логики/интерфейса. Хоть написание вручную и занимает больше времени чем next-next-next в мастерах, по итогу все работает быстрее + тратиться меньше времени на отладку/поддержание кода.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function itog_graf() {
    var f_sum = 0;
    var f_val = 0;
	//в цикле проходим по всем элементам с классом myclass
    $('.myclass').each(function () {
		//умножаем на 10000000, чтобы суммировать целые числа вместо чисел с плавающей запятой
        f_val = parseFloat(this.value.replace(',', '.')) * 10000000;
		//проверка, если в элементе не число, то считаем его за 0
        if (isNaN(f_val)) {
            this.value = 0;
            f_val = 0;
        }
        f_sum = f_val + f_sum;
    });
	//получившийся резльтат записываеся в P37_ITOG
    $s('P37_ITOG', f_sum / 10000000);
	
	//дальше проверка P37_ITOG с рассчитанным ранее значением
}
...
Рейтинг: 0 / 0
16.02.2012, 13:00
    #37664983
Rikki-Tikki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
Привет SvDev, haXbat. Благодарю за отклик.
SvDev, насколько я поняла, apex_item - пакет, который позволяет создавать итемы на форме. Чем он мне поможет для обращения к уже существующим каламнам на табличной форме - не понятно. В любом случае, документацию читаю дальше.
Что смутило насчет apex_application.g_fxx:
http://docs.oracle.com/cd/E23903_01/doc/doc.41/e21676/apex_app.htm#CHDDADIE Referencing Values Within an On Submit Process
You can reference the values posted by an HTML form using the PL/SQL variable APEX_APPLICATION.G_F01 to APEX_APPLICATION.G_F50. Because this element is an array, you can reference values directly, for example:
FOR i IN 1..APEX_APPLICATION.G_F01.COUNT LOOP
htp.p('element '||I||' has a value of '||APEX_APPLICATION.G_F01(i));
END LOOP;
То есть провернуть этот цикл из примера можно только выполнив сабмит? А мне нужно выполнять это обращение к значениям каламнов при каждом редактировании каламна (валидация).
haXbat,
haXbatИ с чем сравнивать получившуюся сумму?

Со значением из базы данных.
haXbatРано или поздно все равно придется делать вставки js+ajax, т.к. стандартных апексовых фич становится недостаточно при возрастании сложности логики/интерфейса.

Это понятно. Но я js+ajax я полнейший ноль, к сожалению, а время поджимает. Большое спасибо за код. Скажите, пожалуйста, я могу вызвать эту js функцию из функции валидадии каламна? И куда эту функцию поместить?
...
Рейтинг: 0 / 0
16.02.2012, 13:23
    #37665057
Rikki-Tikki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
Rikki-TikkiА мне нужно выполнять это обращение к значениям каламнов при каждом редактировании каламна (валидация).

Может, для моего случая больше подходит APEX_UTIL.GET_SESSION_STATE (p_item IN VARCHAR2) RETURN VARCHAR2, ведь мне нужны значения, которые пользователь видит в своей сессии. Только вот имени итема у меня-то нет...
...
Рейтинг: 0 / 0
16.02.2012, 13:29
    #37665073
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
Rikki-TikkiПривет SvDev, haXbat. Благодарю за отклик.
SvDev, насколько я поняла, apex_item - пакет, который позволяет создавать итемы на форме. Чем он мне поможет для обращения к уже существующим каламнам на табличной форме - не понятно.
Он в том числе и для реализации manual tabular forms используется. Помочь может тем, что установит фиксированные переменные коллекций. Впрочем по началу советую особо не заморачиваться с ним. Проще забить.

Rikki-TikkiЧто смутило насчет apex_application.g_fxx:
http://docs.oracle.com/cd/E23903_01/doc/doc.41/e21676/apex_app.htm#CHDDADIE Referencing Values Within an On Submit Process
You can reference the values posted by an HTML form using the PL/SQL variable APEX_APPLICATION.G_F01 to APEX_APPLICATION.G_F50. Because this element is an array, you can reference values directly, for example:
FOR i IN 1..APEX_APPLICATION.G_F01.COUNT LOOP
htp.p('element '||I||' has a value of '||APEX_APPLICATION.G_F01(i));
END LOOP;
То есть провернуть этот цикл из примера можно только выполнив сабмит? А мне нужно выполнять это обращение к значениям каламнов при каждом редактировании каламна (валидация).
Вся валидация в апексе сделана через validations, которые срабатывают на Submit. Можно отказаться от этого впользу аякса и килограммов js кода. Вперед и с песней.

Если вас не устраивает сабмит, то js вроде того что предлагает haXbat единственные вариант.
Ничего сложного там нет, нужны лишь небольшие навыки в работе с HTML технологиями.
Другое дело за 5 минут не изучишь это да.
...
Рейтинг: 0 / 0
16.02.2012, 13:35
    #37665082
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
SvDevВся валидация в апексе сделана через validations, которые срабатывают на Submit.
Хотя теоретически можно ведь плагины написать. Которые существенно упростят процесс js валидации. Я пока этим не заморачивался
...
Рейтинг: 0 / 0
16.02.2012, 14:05
    #37665184
Rikki-Tikki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
SvDevВся валидация в апексе сделана через validations, которые срабатывают на Submit. Можно отказаться от этого впользу аякса и килограммов js кода.
В моем случае выполнение валидации до сабмита не критично, так что, если я правильно вас понимаю, мне будет быстрее разобраться и применить "PL/SQL variable APEX_APPLICATION.G_F01 to APEX_APPLICATION.G_F50" в pl sql коде апексовой валидации, чем с нуля разбираться в javascript.
Таким образом, я сделаю валидацию на уровне страницы, которая будет считать сумму и сравнивать со значением из БД, а при нарушении валидации после сабмита формы пользователь увидит сообщение вроде "сумма такого-то столбца превышает такое-то число".
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
11.07.2013, 21:12
    #38328707
maxandsoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
Не получилось у меня Js-ом значения прочитать :-( кто знает как???

haXbatRikki-Tikki,

И с чем сравнивать получившуюся сумму?

Я похожую проверку делал полностью на клиенте через javascript: пробегался по каждой колонке, подсчитывал сумму, сравнивал с рассчитанным заранее значением. Тут только нужно учитывать особенности обработки чисел с плавающей запятой в js (>>> 1.1+2.2
=3.3000000000000003) + значение, с которым идет сравнение, хранится на странице и его можно ручками править ( в моем случае некритично, иначе передавать ajax-ом и сравнивать на базе)
Рано или поздно все равно придется делать вставки js+ajax, т.к. стандартных апексовых фич становится недостаточно при возрастании сложности логики/интерфейса. Хоть написание вручную и занимает больше времени чем next-next-next в мастерах, по итогу все работает быстрее + тратиться меньше времени на отладку/поддержание кода.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function itog_graf() {
    var f_sum = 0;
    var f_val = 0;
	//в цикле проходим по всем элементам с классом myclass
    $('.myclass').each(function () {
		//умножаем на 10000000, чтобы суммировать целые числа вместо чисел с плавающей запятой
        f_val = parseFloat(this.value.replace(',', '.')) * 10000000;
		//проверка, если в элементе не число, то считаем его за 0
        if (isNaN(f_val)) {
            this.value = 0;
            f_val = 0;
        }
        f_sum = f_val + f_sum;
    });
	//получившийся резльтат записываеся в P37_ITOG
    $s('P37_ITOG', f_sum / 10000000);
	
	//дальше проверка P37_ITOG с рассчитанным ранее значением
}
...
Рейтинг: 0 / 0
12.07.2013, 18:35
    #38329854
maxandsoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
В итоге вот что получилось :

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
//==============================================================================
// Функция подсчета итоговой оценки в баллах для оценочного листа
//==============================================================================
function calculateTotal()
{
   var ret = 0;
   var tmp = '';   

   for (var i=1; i<34;i++)
   	 {
         tmp = html_GetElement('f05_'+i).value;
         if (tmp == undefined) {tmp = ''};
   	     ret = ret + Number(tmp);
      };
   
   $s('P3_APPR_SUM_VAL', ret);

    
}
...
Рейтинг: 0 / 0
12.07.2013, 18:37
    #38329859
maxandsoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
на Report навешен DA OnChange и с помощью APEX_ITEM сделан SELECT_LIST_FROM_QUERY
...
Рейтинг: 0 / 0
17.07.2013, 10:47
    #38333732
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
Rikki-TikkiВ моем случае выполнение валидации до сабмита не критично, так что, если я правильно вас понимаю, мне будет быстрее разобраться и применить "PL/SQL variable APEX_APPLICATION.G_F01 to APEX_APPLICATION.G_F50" в pl sql коде апексовой валидации

P.S. На всякий случай поясняю:
Между сообщениями интервал более 1 года.
G_F тут больше не к месту

делается 2-мя validations, например PL/SQL Function Returning Boolean и Function Returning Error Text
(или тоже самое через page processes + APEX_ERROR.ADD_ERROR)

Первый привязываем к табличной форме с Execution Scope: All Submitted Rows (чтобы всегда выполнялся тот же TRUNCATE_COLLECTION)
Тут проходим для каждой строки и собираем данные в коллекцию, (в примере 3 столбца, ID, COL1_N, COL2_C):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
declare
  l_collection_name varchar2(255) := 'VALIDATION_1_PAGE_10';
begin
  if not apex_collection.collection_exists(p_collection_name => l_collection_name) then
  
    apex_collection.create_collection(p_collection_name => l_collection_name);
  end if;  

  if :APEX$ROW_NUM = 1 then 
    
    APEX_COLLECTION.TRUNCATE_COLLECTION(l_collection_name); 
  end if;

  apex_collection.add_member( p_collection_name => l_collection_name
                            , p_n001 => :ID
                            , p_n002 => :APEX$ROW_NUM
                            , p_c001 => :APEX$ROW_STATUS
                            ...
                            , p_n005 => :COL1_N
                            , p_c005 => :COL2_C );

  return true;
end;



второй - общий, уровня страницы, где собственно сам процесс валидации
(в примере ограничение по столбцу COL1_N, сумма всех строк меньше 100)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare
  l_cnt number;
  l_collection_name varchar2(255) := 'VALIDATION_1_PAGE_10';
begin

  -- суммируем старые значения с новыми
  select sum(decode(a.collection_name, null, t.COL1_N, a.n005 )) 
    into l_cnt
  from apex_collections a full join table1 t 
    on a.n001 = t.id 
   and a.collection_name = 'VALIDATION_1_PAGE_10' 
  ;

  if l_cnt > 100 then
   
    return 'Превышена максимальная сумма';
  end if;
    
  return null;
end;



G_F плох тем, что после апгрейда индексы опять могут сместиться,
да и не дело, когда из-за порядка следования столбцов ломается код.
...
Рейтинг: 0 / 0
17.07.2013, 14:46
    #38334201
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы.
SvDevG_F плох тем, что после апгрейда индексы опять могут сместиться

Для 5.0 в Statement of Direction одним из направлений для развития указано изменение табличных форм. Хотят ввести "более лучшую" реализацию, которая будет позволять создавать сразу несколько табличных форм на странице декларативно. Подозреваю, что будут самостоятельно с APEX_COLLECTIONS синхронизировать табличные формы. Или что-то аналогичное введут.

В общем, вероятность изменения индексов или механизма работы с ними очень большая.
...
Рейтинг: 0 / 0
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Apex 4.1 Tabular form Обращение к column -ам из других строк таблицы. / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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