Сравните две записи и выделите различия - PullRequest
0 голосов
/ 05 июля 2019

У меня есть отчет opex apex, который каждый раз выбирает две строки. Я хочу выделить все столбцы, где данные отличаются в двух строках. Поэтому, когда пользователь просматривает отчет о сравнении, ему не нужно просматривать все столбцы, чтобы определить, где были изменены данные.

Я пытался взглянуть на особенности апекса и некоторый код JavaScript, но не смог сделать это надежно.

Вы можете посмотреть образец отчета здесь: https://apex.oracle.com/pls/apex/f?p=128616:8:109311280077805:::::

перейти на страницу "помоги мне с сравнением"

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

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

если ваша таблица имеет идентификатор "test", вы можете попробовать вызвать эту функцию при загрузке страницы compareRows(document.getElementById('test'));

тело функции:

function compareRows(table) {
    var row1,row2, rows = table.rows;
    var cell1,cell2;
    var rowText;
    row1=rows[1];
    row2=rows[2];
    cell1=row1.cells;
    cell2=row2.cells;
    for (var i=0; i<cell1.length; i++) {
    if(cell1[i].textContent != cell2[i].textContent){
    cell1[i].style.backgroundColor = "red";
    cell2[i].style.backgroundColor = "red";
    }
    }
    }

enter image description here

0 голосов
/ 05 июля 2019

Вы можете использовать аналитическую функцию «LAG» для ссылки на предыдущую строку в вашем наборе результатов.Таким образом, одним из возможных решений является (1) выбрать значение текущей строки и значение предыдущей строки, (2) сравнить 2 столбца и установить флаг, только в строке 2, потому что именно там вы хотите выделить, (3) использовать подсветку в вершине, чтобы указать, какие столбцы имеют разные значения.См. Пример sql ниже для примера.

-- create tables
create table so_dummy_data (
    id                             number generated by default on null as identity  
                                   constraint so_dummy_data_id_pk primary key,
    name                           varchar2(100) not null,
    email                          varchar2(100) not null
)
;

-- load data

insert into so_dummy_data (
    id,
    name,
    email
) values (
    1,
    'John Doe',
    'john.doe@mail.com'
);

insert into so_dummy_data (
    id,
    name,
    email
) values (
    2,
    'John Doe',
    'john.x.doe@mail.com'
);

commit;


WITH old_and_new AS
(SELECT
                id,
                name,
                LAG(name,1)OVER(
                   ORDER BY
                    name
                )AS new_name,
                email,
                LAG(email,1)OVER(
                   ORDER BY
                    1
                )AS new_email,
                row_number() over (order by 1) rn
                FROM
                so_dummy_data
)
SELECT
  name,
  CASE
    WHEN rn = 1 THEN 'N'
    WHEN name = new_name THEN
      'N'
    ELSE
      'Y'
  END AS name_changed,
  email,
  CASE
    WHEN rn = 1 THEN 'N'
    WHEN email = new_email THEN
      'N'
    ELSE
      'Y' 
  END AS email_changed
FROM
old_and_new;
...