在開發的時候發現這樣一個問題,當切換不同BLOCK的時候彈出需要保存的窗口,於是想在切換record的時候,自動commit一下,結果發現很多觸發器都不允許commit_form的函數.於是就有了兩個思路:
1.利用KEY-NEXT-ITEM
Declare
l_LINE_record Number;
l_MID_record Number;
l_MEND_record Number;
Begin
If :MEND.MEND_SCORE Is Not Null Then
:PARAMETER.CURRENT_KEY_MODE := 'KEY-NEXT-ITEM';
APP_CUSTOM.open_window('LINES');
Go_Block('MID');
l_MID_record := :MID.LINE_NUMBER;
:PARAMETER.CUR_MID_REC := l_MID_record+1;
l_MID_record := :PARAMETER.CUR_MID_REC;
if :PARAMETER.CUR_MID_REC > :MID.MAX_LINE_NUMBER THEN
FND_MESSAGE.SET_STRING('該項已完成評價!');
FND_MESSAGE.HINT;
ELSE NULL;
END IF;
Go_record(l_MID_record);
clear_message;
Go_Block('MEND');
GO_ITEM('MEND.MEND_SCORE');
:PARAMETER.CURRENT_KEY_MODE := 'WHEN-VALIDATE-ITEM';
End If;
End;
在item的WHEN-VALIDATE-ITEM加入
Begin
---當有變更,而且CURRENT_KEY_MODE(輸入之后的導航類型)不是KEY-NEXT-ITEM的時候,必須用tab按鍵或者enter導航! --FND_MESSAGE.DEBUG('WHEN-VALIDATE-ITEM1'); IF :MEND.MEND_SCORE IS NOT NULL AND NVL(:PARAMETER.CURRENT_KEY_MODE,'WHEN-VALIDATE-ITEM') <> 'KEY-NEXT-ITEM' THEN FND_MESSAGE.SET_STRING('請注意:該欄位輸入之后,請按Tab按鍵或者Enter按鍵導航!'); FND_MESSAGE.HINT; --RAISE FORM_TRIGGER_FAILURE;---禁止用戶用鼠標點擊導航! END IF; --FND_MESSAGE.DEBUG('WHEN-VALIDATE-ITEM2'); End;
代碼這里可能存在一點問題,依據自己的需要進行修改.
2.利用POST-RECORD
這里利用函數:
/*后來直接在post-record中寫ddl語句,
如果record_status是INSERT或者CHANGED就觸發,
然后form_ddl('commit');再把record_status設為query,就完成了自動保存*/
declare CURSOR row_id IS SELECT rowid FROM CUX_HRPE_MEND_T WHERE MEND_ID = :MEND.MEND_ID; BEGIN if GET_RECORD_PROPERTY(:SYSTEM.CURSOR_RECORD,'MEND',Status ) = 'INSERT' THEN --MEND_DATA.LOCK_ROW; --FND_MESSAGE.DEBUG('插入'); IF :LINES.LINE_ID IS NULL THEN SELECT CUX_HRPE_LINES_t_S.NEXTVAL INTO :LINES.LINE_ID FROM SYS.DUAL; :MEND.LINE_ID := :LINES.LINE_ID; END IF; IF :MID.MID_ID IS NULL THEN SELECT CUX_HRPE_MID_t_S.NEXTVAL INTO :MID.MID_ID FROM SYS.DUAL; :MEND.MID_ID := :MID.MID_ID; END IF; IF :MEND.MEND_ID IS NULL THEN SELECT CUX_HRPE_MEND_T_S.NEXTVAL INTO :MEND.MEND_ID FROM SYS.DUAL; END IF; fnd_standard.set_who; INSERT INTO CUX_HRPE_MEND_T ( MEND_ID, MID_ID, LINE_ID, HEADER_ID, MEND_ORGANIZATION_ID, MEND_PERSON_ID, MEND_SCORE, MEND_VALUE, MEND_CAUSE, MEND_DATE, MEND_SUBMIT_FLAG, CREATED_BY, CREATION_DATE, LAST_UPDATED_BY, LAST_UPDATE_DATE, LAST_UPDATE_LOGIN, ATTRIBUTE_CATEGORY, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, PEOPLE_COUNT, SCD_PERCENT) VALUES ( :MEND.MEND_ID, :MEND.MID_ID, :MEND.LINE_ID, :MEND.HEADER_ID, :MEND.MEND_ORGANIZATION_ID, :MEND.MEND_PERSON_ID, :MEND.MEND_SCORE, :MEND.MEND_VALUE, :MEND.MEND_CAUSE, :MEND.MEND_DATE, :MEND.MEND_SUBMIT_FLAG, :MEND.CREATED_BY, :MEND.CREATION_DATE, :MEND.LAST_UPDATED_BY, :MEND.LAST_UPDATE_DATE, :MEND.LAST_UPDATE_LOGIN, :MEND.ATTRIBUTE_CATEGORY, :MEND.ATTRIBUTE1, :MEND.ATTRIBUTE2, :MEND.ATTRIBUTE3, :MEND.ATTRIBUTE4, :MEND.ATTRIBUTE5, :MEND.PEOPLE_COUNT, :MEND.SCD_PERCENT); OPEN row_id; FETCH row_id INTO :MEND.row_id; IF (row_id%NOTFOUND) THEN CLOSE row_id; RAISE NO_DATA_FOUND; END IF; CLOSE row_id; forms_ddl('COMMIT'); set_record_property(:system.trigger_record,:system.trigger_block, STATUS,QUERY_STATUS); ELSIF GET_RECORD_PROPERTY(:SYSTEM.CURSOR_RECORD,'MEND',Status ) = 'CHANGED' THEN IF :MEND.MEND_ID IS NOT NULL THEN fnd_standard.set_who; UPDATE CUX_HRPE_MEND_T SET MEND_ID = :MEND.MEND_ID, MID_ID = :MEND.MID_ID, LINE_ID = :MEND.LINE_ID, HEADER_ID = :MEND.HEADER_ID, MEND_ORGANIZATION_ID = :MEND.MEND_ORGANIZATION_ID, MEND_PERSON_ID = :MEND.MEND_PERSON_ID, MEND_SCORE = :MEND.MEND_SCORE, MEND_VALUE = :MEND.MEND_VALUE, MEND_CAUSE = :MEND.MEND_CAUSE, MEND_DATE = :MEND.MEND_DATE, MEND_SUBMIT_FLAG = :MEND.MEND_SUBMIT_FLAG, CREATED_BY = :MEND.CREATED_BY, CREATION_DATE = :MEND.CREATION_DATE, LAST_UPDATED_BY = :MEND.LAST_UPDATED_BY, LAST_UPDATE_DATE = :MEND.LAST_UPDATE_DATE, LAST_UPDATE_LOGIN = :MEND.LAST_UPDATE_LOGIN, ATTRIBUTE_CATEGORY = :MEND.ATTRIBUTE_CATEGORY, ATTRIBUTE1 = :MEND.ATTRIBUTE1, ATTRIBUTE2 = :MEND.ATTRIBUTE2, ATTRIBUTE3 = :MEND.ATTRIBUTE3, ATTRIBUTE4 = :MEND.ATTRIBUTE4, ATTRIBUTE5 = :MEND.ATTRIBUTE5, PEOPLE_COUNT = :MEND.PEOPLE_COUNT, SCD_PERCENT = :MEND.SCD_PERCENT WHERE ROWID = :MEND.row_id; IF (SQL%NOTFOUND) THEN RAISE NO_DATA_FOUND; END IF; forms_ddl('COMMIT'); set_record_property(:system.trigger_record,:system.trigger_block, STATUS,QUERY_STATUS); else FND_MESSAGE.DEBUG('UPDATE插change的時候沒有mendid'); END IF; else null; end if; END;
