0

Oracle Form と pl/sql は初めてです。これが私の問題です 私のフォームでは、BOS_M_HOLIDAY という名前のテーブルから取得したレコードを表示する 3 つのデータ ブロックを取得しました。しかし、どういうわけか、ループ後に各データブロックに表示される最後のレコードだけです。レコードを取得する方法は、PRE-FORM トリガーと WHEN-TIME-EXPIRED トリガーを使用することです。PRE-FORM Trigger の私のコードは次のとおりです。

DECLARE

CURSOR a_aa is SELECT HOL_DATE FROM BOS_M_HOLIDAY WHERE REGEXP_LIKE(HOL_DATE, '.......12') ORDER BY HOL_DATE;
CURSOR a_bb is SELECT HOL_DATE FROM BOS_M_HOLIDAY WHERE REGEXP_LIKE(HOL_DATE, '.......13') ORDER BY HOL_DATE ;
CURSOR a_cc is SELECT distinct DESCR FROM BOS_M_HOLIDAY WHERE REGEXP_LIKE(HOL_DATE, '.......13')ORDER BY 1;
Timer_ID TIMER;

BEGIN

OPEN a_aa;
LOOP
    FETCH a_aa INTO :holiday_2012.HOL_DATE;
    EXIT WHEN a_aa%notfound;
    Timer_ID := FIND_TIMER('CALL_NEXT_RECORD');
        IF NOT Id_Null(Timer_ID) THEN
        Delete_Timer(Timer_ID);
        END IF;
    Timer_ID := Create_Timer('CALL_NEXT_RECORD',1,NO_REPEAT);
END LOOP;
CLOSE a_aa;

OPEN a_bb;
LOOP
    FETCH a_bb INTO :holiday_2013.HOL_DATE;
    EXIT WHEN a_bb%notfound;
    Timer_ID := FIND_TIMER('CALL_NEXT_RECORD');
        IF NOT Id_Null(Timer_ID) THEN
        Delete_Timer(Timer_ID);
        END IF;
    Timer_ID := Create_Timer('CALL_NEXT_RECORD',1,NO_REPEAT);
END LOOP;
CLOSE a_bb;

OPEN a_cc;
LOOP
    FETCH a_cc INTO :description.DESCR;
    EXIT WHEN a_cc%notfound;
    Timer_ID := FIND_TIMER('CALL_NEXT_RECORD');
        IF NOT Id_Null(Timer_ID) THEN
        Delete_Timer(Timer_ID);
        END IF;
    Timer_ID := Create_Timer('CALL_NEXT_RECORD',1,NO_REPEAT);
END LOOP;
CLOSE a_cc;

END;

WHEN-TIME-EXPIREDトリガーの私のコードは次のとおりです。

DECLARE
v_Timer VARCHAR2(30) := Get_Application_Property(TIMER_NAME);
BEGIN
IF (v_Timer = 'CALL_NEXT_RECORD') THEN
    NEXT_RECORD;
END IF;
END;

このコードは、タイマー部分なしで WHEN-BUTTON-PRESSED トリガーを使用すると機能します。私の英語をむき出しにして、わからない部分があれば遠慮なく聞いてください。ありがとう!

4

1 に答える 1

4

ループでは、各レコードが各ブロックの同じ (1 番目の) レコードに割り当てられています。確かに、 を発行するタイマーを作成しますNEXT_RECORDが、これは可能な限り最悪のアイデアです。タイマーが実際に実行されるまでに、ほとんどの (すべてではないにしても) ループが既に終了しているため、とにかく機能しません。次のレコードに進む前にタイマーが終了するのを待つループには何もありません。実際、タイマーが実際に実行される前に、タイマーを何度も作成して破棄する可能性があります。

この種のものにタイマーを使用しないでください。NEXT_RECORDループ内で呼び出す必要があります。

また、この種のコードを入れないことをお勧めします。PRE-FORM代わりに、WHEN-NEW-FORM-INSTANCEトリガーに入れます。

さらに良いことに、DEFAULT_WHEREこの手続き型コードを使用する代わりに、テーブルに基づいてブロックを作成し (プロパティに述語を配置)、クエリを実行する必要があります。

于 2013-09-13T04:41:08.763 に答える