每次单击按钮 pl/sql 时如何按不同属性排序?
how to sort by different attribute each time we click a button pl/sql?
当我第一次单击该按钮时,我选择的列已排序。当我第二次点击时,它会按 reverse.How 排序,我可以这样做吗?
注意:我的程序由虚拟块组成。没有数据块
declare
cursor c is
select *
from muhasebe.doviz_takip
where UPPER(fatura_no) LIKE
NVL('%' || UPPER(:giris.sorgulama) || '%', UPPER(fatura_no))
order by fatura_no asc;
begin
go_block('XDOVIZ_TAKIP');
clear_block;
first_record;
for r in c loop
:FATURA_NO := r.fatura_no;
:ACIKLAMA := r.aciklama;
:YUKLEME_TAR := r.yukleme_tar;
:VARIS_TAR := r.varis_tar;
:TUTAR := r.tutar;
next_record;
end loop;
first_record;
end;
这是我可以排序一次的代码
一个选项是创建一个全局变量(或参数)、两个游标(每个排序一个)和 IF-THEN-ELSE
根据全局变量的值决定使用哪个游标。
像这样:
DECLARE
CURSOR c_asc IS
SELECT *
FROM muhasebe.doviz_takip
WHERE UPPER (fatura_no) LIKE
NVL ('%' || UPPER ( :giris.sorgulama) || '%',
UPPER (fatura_no))
ORDER BY fatura_no ASC;
CURSOR c_desc IS
SELECT *
FROM muhasebe.doviz_takip
WHERE UPPER (fatura_no) LIKE
NVL ('%' || UPPER ( :giris.sorgulama) || '%',
UPPER (fatura_no))
ORDER BY fatura_no DESC;
BEGIN
GO_BLOCK ('XDOVIZ_TAKIP');
CLEAR_BLOCK;
FIRST_RECORD;
:global.sort := NVL ( :global.sort, 'ASC');
IF :global.sort = 'DESC'
THEN
FOR r IN c_asc
LOOP
:FATURA_NO := r.fatura_no;
:ACIKLAMA := r.aciklama;
:YUKLEME_TAR := r.yukleme_tar;
:VARIS_TAR := r.varis_tar;
:TUTAR := r.tutar;
NEXT_RECORD;
END LOOP;
:global.sort := 'ASC';
ELSIF :global.sort = 'ASC'
THEN
FOR r IN c_desc
LOOP
:FATURA_NO := r.fatura_no;
:ACIKLAMA := r.aciklama;
:YUKLEME_TAR := r.yukleme_tar;
:VARIS_TAR := r.varis_tar;
:TUTAR := r.tutar;
NEXT_RECORD;
END LOOP;
:global.sort := 'DESC';
END IF;
FIRST_RECORD;
END;
也许您可以尝试使其“更智能”(因为这几乎是虚拟的 - 或多或少地重复相同的代码两次),但是 - 这 简单 并且容易维护。
另一种方法是通过创建名为 v_doviz_takip
的视图将其转换为 数据库块 ,例如
CREATE OR REPLACE VIEW v_doviz_takip AS
SELECT *
FROM muhasebe.doviz_takip
并将块xdoviz_takip
的查询数据源名称设置为此
并添加一个 WHERE
子句
UPPER(fatura_no) LIKE NVL('%' || UPPER(:giris.sorgulama) || '%', UPPER(fatura_no))`
到街区。然后添加一行
SET_BLOCK_PROPERTY('xdoviz_takip',order_by, 'fatura_no');
到 WHEN-NEW-FORM-INSTANCE
触发器。
并将您当前的代码块转换为这个:
DECLARE
v_ord VARCHAR2(25) := GET_BLOCK_PROPERTY('XDOVIZ_TAKIP',order_by);
BEGIN
GO_BLOCK ('XDOVIZ_TAKIP');
CLEAR_BLOCK;
IF v_ord = 'fatura_no' THEN v_ord := v_ord||' DESC'; ELSE v_ord := 'fatura_no' END IF;
SET_BLOCK_PROPERTY('XDOVIZ_TAKIP',order_by, v_ord);
EXECUTE_QUERY;
FIRST_RECORD;
END;
这样,它将按 fatura_no 降序排列 第一个 ,然后按升序排列 second 次尝试
, or 只是将当前的 IF 子句转换为 IF v_ord != 'fatura_no' ...
会反向改变行为。
当我第一次单击该按钮时,我选择的列已排序。当我第二次点击时,它会按 reverse.How 排序,我可以这样做吗? 注意:我的程序由虚拟块组成。没有数据块
declare
cursor c is
select *
from muhasebe.doviz_takip
where UPPER(fatura_no) LIKE
NVL('%' || UPPER(:giris.sorgulama) || '%', UPPER(fatura_no))
order by fatura_no asc;
begin
go_block('XDOVIZ_TAKIP');
clear_block;
first_record;
for r in c loop
:FATURA_NO := r.fatura_no;
:ACIKLAMA := r.aciklama;
:YUKLEME_TAR := r.yukleme_tar;
:VARIS_TAR := r.varis_tar;
:TUTAR := r.tutar;
next_record;
end loop;
first_record;
end;
这是我可以排序一次的代码
一个选项是创建一个全局变量(或参数)、两个游标(每个排序一个)和 IF-THEN-ELSE
根据全局变量的值决定使用哪个游标。
像这样:
DECLARE
CURSOR c_asc IS
SELECT *
FROM muhasebe.doviz_takip
WHERE UPPER (fatura_no) LIKE
NVL ('%' || UPPER ( :giris.sorgulama) || '%',
UPPER (fatura_no))
ORDER BY fatura_no ASC;
CURSOR c_desc IS
SELECT *
FROM muhasebe.doviz_takip
WHERE UPPER (fatura_no) LIKE
NVL ('%' || UPPER ( :giris.sorgulama) || '%',
UPPER (fatura_no))
ORDER BY fatura_no DESC;
BEGIN
GO_BLOCK ('XDOVIZ_TAKIP');
CLEAR_BLOCK;
FIRST_RECORD;
:global.sort := NVL ( :global.sort, 'ASC');
IF :global.sort = 'DESC'
THEN
FOR r IN c_asc
LOOP
:FATURA_NO := r.fatura_no;
:ACIKLAMA := r.aciklama;
:YUKLEME_TAR := r.yukleme_tar;
:VARIS_TAR := r.varis_tar;
:TUTAR := r.tutar;
NEXT_RECORD;
END LOOP;
:global.sort := 'ASC';
ELSIF :global.sort = 'ASC'
THEN
FOR r IN c_desc
LOOP
:FATURA_NO := r.fatura_no;
:ACIKLAMA := r.aciklama;
:YUKLEME_TAR := r.yukleme_tar;
:VARIS_TAR := r.varis_tar;
:TUTAR := r.tutar;
NEXT_RECORD;
END LOOP;
:global.sort := 'DESC';
END IF;
FIRST_RECORD;
END;
也许您可以尝试使其“更智能”(因为这几乎是虚拟的 - 或多或少地重复相同的代码两次),但是 - 这 简单 并且容易维护。
另一种方法是通过创建名为 v_doviz_takip
的视图将其转换为 数据库块 ,例如
CREATE OR REPLACE VIEW v_doviz_takip AS
SELECT *
FROM muhasebe.doviz_takip
并将块xdoviz_takip
的查询数据源名称设置为此
并添加一个 WHERE
子句
UPPER(fatura_no) LIKE NVL('%' || UPPER(:giris.sorgulama) || '%', UPPER(fatura_no))`
到街区。然后添加一行
SET_BLOCK_PROPERTY('xdoviz_takip',order_by, 'fatura_no');
到 WHEN-NEW-FORM-INSTANCE
触发器。
并将您当前的代码块转换为这个:
DECLARE
v_ord VARCHAR2(25) := GET_BLOCK_PROPERTY('XDOVIZ_TAKIP',order_by);
BEGIN
GO_BLOCK ('XDOVIZ_TAKIP');
CLEAR_BLOCK;
IF v_ord = 'fatura_no' THEN v_ord := v_ord||' DESC'; ELSE v_ord := 'fatura_no' END IF;
SET_BLOCK_PROPERTY('XDOVIZ_TAKIP',order_by, v_ord);
EXECUTE_QUERY;
FIRST_RECORD;
END;
这样,它将按 fatura_no 降序排列 第一个 ,然后按升序排列 second 次尝试
, or 只是将当前的 IF 子句转换为 IF v_ord != 'fatura_no' ...
会反向改变行为。