比较两个记录并突出显示差异

时间:2019-07-05 00:23:11

标签: oracle oracle-apex

我有一个oracle apex报表,每次它获取两行。 我想突出显示两行中数据不同的所有列。 因此,当用户查看比较报告时,他不必浏览所有列即可确定数据已更改的地方。

我尝试查看apex功能和一些javascript代码,但无法可靠地做到这一点。

您可以在此处查看示例报告: https://apex.oracle.com/pls/apex/f?p=128616:8:109311280077805 :::::

转到页面“帮助我进行比较”

我要突出显示“福利名称”列,因为“福利名称”列中的数据不同。

2 个答案:

答案 0 :(得分:0)

您可以使用分析功能“ 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;

答案 1 :(得分:0)

如果表的ID为“ 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