當我第一次單擊該按鈕時,我選擇的列已排序。當我第二次點擊時,它會反向排序。我該怎么做?注意:我的程式由虛擬塊組成。沒有資料塊
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;
這是我可以排序一次的代碼
uj5u.com熱心網友回復:
一種選擇是創建一個全域變數(或引數)、兩個游標(每個排序一個),并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;
也許您可以嘗試使其“更智能”(因為這幾乎是虛擬的 - 或多或少地重復相同的代碼兩次),但是 - 這很簡單且易于維護。
uj5u.com熱心網友回復:
另一種方法是通過創建一個名為例如的視圖將其轉換為資料庫塊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降序排序第一次,升序排序第二次嘗試,或者只是將當前的IF子句轉換為IF v_ord != 'fatura_no' ...將反向改變行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/441076.html
