diff --git a/.intellijPlatform/coroutines-javaagent-legacy.jar b/.intellijPlatform/coroutines-javaagent-legacy.jar
index 06fd3bd..4ec9da5 100644
Binary files a/.intellijPlatform/coroutines-javaagent-legacy.jar and b/.intellijPlatform/coroutines-javaagent-legacy.jar differ
diff --git a/.intellijPlatform/self-update.lock b/.intellijPlatform/self-update.lock
index 42345ef..01ad1ac 100644
--- a/.intellijPlatform/self-update.lock
+++ b/.intellijPlatform/self-update.lock
@@ -1 +1 @@
-2026-04-07
\ No newline at end of file
+2026-04-10
\ No newline at end of file
diff --git a/DevResources/dynform-exam.frml b/DevResources/dynform-exam.frml
new file mode 100644
index 0000000..09eace5
--- /dev/null
+++ b/DevResources/dynform-exam.frml
@@ -0,0 +1,397 @@
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+ PROJ_ID,ACM_CODE
+
+
+ SELECT :PROJ_ID PROJ_ID
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PJBG.PBDG_TOTAL PBDG_TOTAL
+ , PJBG.PBDG_COUNT PBDG_COUNT
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN ( SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM PROJECT_BUDGETS PJBD WHERE PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN PROJECT_BUDGETS PJBG ON PJBG.PROJ_ID=:PROJ_ID AND PJBG.ACM_CODE = ACTT.ACM_CODE
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , ACM_CODE
+ , PBDG_TOTAL
+ , PBDG_COUNT
+
+ FROM PROJECT_BUDGETS
+ ORDER BY PROJ_ID,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ ATTACH_FILES
+ PROJ_ID,ATFI_SEQ,ACM_CODE
+
+ SELECT ATFI_SEQ
+ , PROJ_ID
+ , ACM_CODE
+ , ATFI_TYPE
+ , ATFI_FILE
+ , ATFI_MIME
+ , ATFI_DESC
+ , CREATE_BY
+ , CREATE_TIME
+ , UPDATE_BY
+ , UPDATE_TIME
+
+ FROM ATTACH_FILES
+ ORDER BY PROJ_ID,ATFI_SEQ,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/defs/ajax.xml b/DevResources/full-examples/bdgt04/defs/ajax.xml
new file mode 100644
index 0000000..25237df
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/defs/ajax.xml
@@ -0,0 +1,201 @@
+
+
+
+ BUD
+ Main Activity
+ 100
+
+ SELECT PJM.PJM_CODE
+ , PJM.PJM_NAME
+ , PJM.PJM_JOB_TYPE
+ , PJM.PJM_WORK_PLAN
+ , PJM.PJM_PRODUCT
+ , PJM.PJM_GROUP_PLAN
+ , PJM.PJM_JOB_PROJECT
+ , PJM.PJM_STRATEGY
+ , PJM.PJM_ACTIVE
+
+ FROM PROJECT_M PJM
+
+ WHERE (PJM.PJM_CODE LIKE '%'||:SEARCH||'%' OR PJM.PJM_NAME LIKE '%'||:SEARCH||'%')
+
+
+
+
+
+
+
+ BUD
+ Main Activity
+ 100
+
+
+ SELECT ACM_CODE
+ , ACM_NAME
+ , NODE_LEVEL
+ , MAIN_NODE
+ , ACM_UNIT
+ , ACM_START_YEAR
+ , ACM_END_YEAR
+ , STM_CODE
+ , JBT_CODE
+ , JBP_CODE
+ , EXP_CODE
+ , PJM_CODE
+ , STG_CODE
+ , NODE_TYPE
+ , DECODE(NODE_TYPE,'C','true','') disabled
+
+ FROM BGT.V_ACTIVITY_TREE ACM
+
+ WHERE 0=0
+ AND (:DV_YEAR BETWEEN ACM_START_YEAR AND ACM_END_YEAR)
+ -- AND (ACM.STM_CODE = '%' OR ACM.STM_CODE = :STM_CODE)
+ AND (ACM.ACM_CODE LIKE '%'||:SEARCH||'%' OR ACM.ACM_NAME LIKE '%'||:SEARCH||'%')
+
+
+
+
+
+
+
+ BUD
+ Main Activity
+ 100
+
+
+ SELECT BGD.BGM_CODE
+ , BGD.BGM_NAME
+ , BGD.BGM_EXPENSE_TYPE
+ , BGD.BGM_UNIT
+ , BGD.BGM_UNIT_RATE
+ , BGD.BGM_ACTIVE
+ , BGD.BGM_PREPARE
+
+ FROM BUDGET_M BGD
+
+ WHERE (BGD.BGM_CODE LIKE '%'||:SEARCH||'%' OR BGD.BGM_NAME LIKE '%'||:SEARCH||'%')
+
+ ORDER BY BGM_CODE
+
+
+
+
+ APP
+
+ SELECT RFG_GRP
+ , RFC_CODE
+ , RFC_DESC
+ , RFC_FLAG
+ , RFC_ORDER
+
+ FROM REFER_CODE
+ WHERE (RFG_GRP = 'STG-ITEMS')
+ AND (RFC_CODE LIKE '%'||:SEARCH||'%' OR RFC_DESC LIKE '%'||:SEARCH||'%')
+ ORDER BY RFC_CODE
+
+
+
+
+ APP
+
+ SELECT RFG_GRP
+ , RFC_CODE
+ , RFC_DESC
+ , RFC_FLAG
+ , RFC_ORDER
+
+ FROM REFER_CODE
+ WHERE (RFG_GRP = :RFG_GRP)
+ AND (RFC_CODE LIKE '%'||:SEARCH||'%' OR RFC_DESC LIKE '%'||:SEARCH||'%')
+ ORDER BY RFC_CODE
+
+
+
+
+
+ BUD
+ Main Activity
+ 100
+
+
+ SELECT ACM_CODE
+ , ACM_NAME
+ , NODE_LEVEL
+ , MAIN_NODE
+ , ACM_UNIT
+ , ACM_START_YEAR
+ , ACM_END_YEAR
+ , STM_CODE
+ , JBT_CODE
+ , JBP_CODE
+ , EXP_CODE
+ , PJM_CODE
+ , STG_CODE
+ , NODE_TYPE
+ , DECODE(NODE_TYPE,'C','true','') disabled
+
+ FROM BGT.V_ACTIVITY_TREE ACM
+
+ WHERE 0=0
+ AND (:DV_YEAR BETWEEN ACM_START_YEAR AND ACM_END_YEAR)
+ -- AND (ACM.STM_CODE = '%' OR ACM.STM_CODE = :STM_CODE)
+ AND (ACM.ACM_CODE LIKE '%'||:SEARCH||'%' OR ACM.ACM_NAME LIKE '%'||:SEARCH||'%')
+
+
+
+
+
+
+
+ APP
+ Main Activity
+ 100
+
+
+ SELECT BGM.BGM_CODE
+ , BGM.BGM_NAME
+ , BGM.EXP_TYPE
+ , BGM.BGM_UNIT
+ , BGM.BGM_UNIT_RATE
+ , BGM.BGM_SEQ
+ , BGM.NODE_LEVEL
+ , BGM.MAIN_NODE
+ , DECODE(NODE_TYPE,'C','true','') disabled
+
+ FROM V_BUDGET_TREE BGM
+
+ WHERE (BGM.BGM_CODE LIKE '%'||:SEARCH||'%' OR BGM.BGM_NAME LIKE '%'||:SEARCH||'%')
+
+ ORDER BY BGM_SEQ
+
+
+
+
+
+
+ APP
+ Main Activity
+ 100
+
+
+ SELECT BGM.BGM_CODE
+ , BGM.BGM_NAME
+ , BGM.EXP_TYPE
+ , BGM.BGM_UNIT
+ , BGM.BGM_UNIT_RATE
+ , BGM.BGM_SEQ
+ , BGM.NODE_LEVEL
+ , BGM.MAIN_NODE
+ , DECODE(NODE_TYPE,'C','true','') disabled
+
+ FROM V_BUDGET_TREE BGM
+
+ WHERE (BGM_CODE LIKE '3.1%')
+ AND (BGM.BGM_CODE LIKE '%'||:SEARCH||'%' OR BGM.BGM_NAME LIKE '%'||:SEARCH||'%')
+
+ ORDER BY BGM_SEQ
+
+
+
+
\ No newline at end of file
diff --git a/DevResources/full-examples/bdgt04/view/bgt0401010.jsp b/DevResources/full-examples/bdgt04/view/bgt0401010.jsp
new file mode 100644
index 0000000..1d9e6ff
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0401010.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt04", "bdgt-0401010");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/bgt0401020-budget.jsp b/DevResources/full-examples/bdgt04/view/bgt0401020-budget.jsp
new file mode 100644
index 0000000..f8cb7db
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0401020-budget.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt04", "bdgt-0401020-budget");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/bgt0401020.jsp b/DevResources/full-examples/bdgt04/view/bgt0401020.jsp
new file mode 100644
index 0000000..942057f
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0401020.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt04", "bdgt-0401020");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/bgt0401030-budget.jsp b/DevResources/full-examples/bdgt04/view/bgt0401030-budget.jsp
new file mode 100644
index 0000000..5860ceb
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0401030-budget.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt04", "bdgt-0401030-budget");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/bgt0401030.jsp b/DevResources/full-examples/bdgt04/view/bgt0401030.jsp
new file mode 100644
index 0000000..de98e88
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0401030.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt04", "bdgt-0401030");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/bgt0403010-general.jsp b/DevResources/full-examples/bdgt04/view/bgt0403010-general.jsp
new file mode 100644
index 0000000..c85f981
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0403010-general.jsp
@@ -0,0 +1,51 @@
+<%@ page import="org.apache.commons.codec.*" %>
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ String _formId = "bdgt-0403010/general";
+ try {
+ String data = factory.rqsCtx.getParameter("data","");
+ if (!data.isBlank()) {
+ data = JUtils.decBase64(data);
+ data = URLDecoder.decode(data, CharEncoding.UTF_8);
+
+ boolean isEditMode = factory.rqsCtx.isPostParam("add") || factory.rqsCtx.isPostParam("edit") || factory.rqsCtx.isPostParam("view");
+ JSONObject jsData = new JSONObject(data);
+ String type = jsData.getString("type");
+ String acmCode = jsData.getString("acm_code");
+ String projId = jsData.getString("proj_id");
+
+ if (isEditMode && type.equals("rutn")) {
+ _formId = "bdgt-0403010/routine";
+ } else if (isEditMode && type.equals("mngt")) {
+ _formId = "bdgt-0403010/manage";
+ } else if (isEditMode && type.equals("eqpt")) {
+ _formId = "bdgt-0403010/equipt";
+ } else if (isEditMode && type.equals("cnst")) {
+ _formId = "bdgt-0403010/construct";
+ }
+
+ dynForm = new DynForm(application, request, response, "bdgt04", _formId);
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("ACM_CODE",acmCode);
+ dynForm.setFormvar("PROJ_ID",projId);
+ } else {
+ dynForm = new DynForm(application, request, response, "bdgt04", _formId);
+ }
+
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+
+ if (dynForm.workIn(WorkMode.Editing)) {
+ factory.pageCtx.addWidget(DynConstants.PageWidget.FileBox);
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/bgt0403010-project-budget.jsp b/DevResources/full-examples/bdgt04/view/bgt0403010-project-budget.jsp
new file mode 100644
index 0000000..692886e
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0403010-project-budget.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt04", "bdgt-0403010-project-budget");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/bgt0403010-project.jsp b/DevResources/full-examples/bdgt04/view/bgt0403010-project.jsp
new file mode 100644
index 0000000..ceea8c4
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0403010-project.jsp
@@ -0,0 +1,35 @@
+<%@ page import="org.apache.commons.codec.*" %>
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ String _formId = "bdgt-0403010/project";
+ try {
+ String data = factory.rqsCtx.getParameter("data","");
+ data = JUtils.decBase64(data);
+ data = URLDecoder.decode(data, CharEncoding.UTF_8);
+
+ JSONObject jsData = new JSONObject(data);
+ String type = jsData.getString("type");
+ String acmCode = jsData.getString("acm_code");
+ String projId = jsData.getString("proj_id");
+
+ dynForm = new DynForm(application, request, response, "bdgt04", _formId);
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("ACM_CODE",acmCode);
+ dynForm.setFormvar("PROJ_ID",projId);
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+
+ if (dynForm.workIn(WorkMode.Editing)) {
+ factory.pageCtx.addWidget(DynConstants.PageWidget.FileBox);
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/bgt0403010.jsp b/DevResources/full-examples/bdgt04/view/bgt0403010.jsp
new file mode 100644
index 0000000..0bd586e
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0403010.jsp
@@ -0,0 +1,25 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ String _formId = "bdgt-0403010";
+// String _page = factory.rqsCtx.getParameter("page");
+// if (_page.equals("general")) {
+// _formId = "bdgt-0403010-general";
+// }
+ dynForm = new DynForm(application, request, response, "bdgt04", _formId);
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/bgt0403020-general.jsp b/DevResources/full-examples/bdgt04/view/bgt0403020-general.jsp
new file mode 100644
index 0000000..f421894
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0403020-general.jsp
@@ -0,0 +1,51 @@
+<%@ page import="org.apache.commons.codec.*" %>
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ String _formId = "bdgt-0403020/general";
+ try {
+ String data = factory.rqsCtx.getParameter("data","");
+ if (!data.isBlank()) {
+ data = JUtils.decBase64(data);
+ data = URLDecoder.decode(data, CharEncoding.UTF_8);
+
+ boolean isEditMode = factory.rqsCtx.isPostParam("add") || factory.rqsCtx.isPostParam("edit") || factory.rqsCtx.isPostParam("view");
+ JSONObject jsData = new JSONObject(data);
+ String type = jsData.getString("type");
+ String acmCode = jsData.getString("acm_code");
+ String projId = jsData.getString("proj_id");
+
+ if (isEditMode && type.equals("rutn")) {
+ _formId = "bdgt-0403020/routine";
+ } else if (isEditMode && type.equals("mngt")) {
+ _formId = "bdgt-0403020/manage";
+ } else if (isEditMode && type.equals("eqpt")) {
+ _formId = "bdgt-0403020/equipt";
+ } else if (isEditMode && type.equals("cnst")) {
+ _formId = "bdgt-0403020/construct";
+ }
+
+ dynForm = new DynForm(application, request, response, "bdgt04", _formId);
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("ACM_CODE",acmCode);
+ dynForm.setFormvar("PROJ_ID",projId);
+ } else {
+ dynForm = new DynForm(application, request, response, "bdgt04", _formId);
+ }
+
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+
+ if (dynForm.workIn(WorkMode.Editing)) {
+ factory.pageCtx.addWidget(DynConstants.PageWidget.FileBox);
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/bgt0403020-project-budget.jsp b/DevResources/full-examples/bdgt04/view/bgt0403020-project-budget.jsp
new file mode 100644
index 0000000..1f0a818
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0403020-project-budget.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt04", "bdgt-0403020/project-budget");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/bgt0403020-project.jsp b/DevResources/full-examples/bdgt04/view/bgt0403020-project.jsp
new file mode 100644
index 0000000..69859c0
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0403020-project.jsp
@@ -0,0 +1,35 @@
+<%@ page import="org.apache.commons.codec.*" %>
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ String _formId = "bdgt-0403020/project";
+ try {
+ String data = factory.rqsCtx.getParameter("data","");
+ data = JUtils.decBase64(data);
+ data = URLDecoder.decode(data, CharEncoding.UTF_8);
+
+ JSONObject jsData = new JSONObject(data);
+ String type = jsData.getString("type");
+ String acmCode = jsData.getString("acm_code");
+ String projId = jsData.getString("proj_id");
+
+ dynForm = new DynForm(application, request, response, "bdgt04", _formId);
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("ACM_CODE",acmCode);
+ dynForm.setFormvar("PROJ_ID",projId);
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+
+ if (dynForm.workIn(WorkMode.Editing)) {
+ factory.pageCtx.addWidget(DynConstants.PageWidget.FileBox);
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/bgt0403020.jsp b/DevResources/full-examples/bdgt04/view/bgt0403020.jsp
new file mode 100644
index 0000000..c07c1f4
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/bgt0403020.jsp
@@ -0,0 +1,21 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ String _formId = "bdgt-0403020";
+ dynForm = new DynForm(application, request, response, "bdgt04", _formId);
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0401010.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0401010.frml
new file mode 100644
index 0000000..fdfd907
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0401010.frml
@@ -0,0 +1,249 @@
+
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.PJM_CODE
+ , PROJ.STM_CODE
+ , PROJ.BTM_CODE
+ , PROJ.ACM_CODE
+ , BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , PROJ.PLAN_TYPE
+ , PROJ.PROJ_DURATION
+ , PROJ.PROJ_START_YEAR
+ , PROJ.PROJ_END_YEAR
+ , PROJ.PROJ_FOR_STAFF
+
+ , PROJ.PROJ_FROM_YEAR
+ , 0 BDGT_TOTAL
+
+ FROM PROJECTS PROJ
+ INNER JOIN REFER_CODE RFC ON RFC.RFG_GRP='PROJ-TYPE' AND RFC.RFC_CODE=PROJ.PROJ_TYPE AND RFC.RFC_FLAG = 'GENERAL'
+
+ WHERE STM_CODE = :STM_CODE
+ ORDER BY RFC.RFC_ORDER, PROJ.PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+
+
+ SELECT PACT.PROJ_ID
+ , PACT.PROJ_GROUP
+ , PACT.PROJ_TYPE
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL+1 NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PACT.BDGT_COUNT
+ , PACT.BDGT_TOTAL
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN (SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM V_PROJECT_ACTIVITY PACT WHERE PACT.PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN V_PROJECT_ACTIVITY PACT ON PACT.ACM_CODE = ACTT.ACM_CODE AND PACT.PROJ_ID = :PROJ_ID
+
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0401020-budget.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0401020-budget.frml
new file mode 100644
index 0000000..ec9b393
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0401020-budget.frml
@@ -0,0 +1,316 @@
+
+
+
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+ PROJ_ID,ACM_CODE
+
+
+ SELECT :PROJ_ID PROJ_ID
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PJBG.PBDG_TOTAL PBDG_TOTAL
+ , PJBG.PBDG_COUNT PBDG_COUNT
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN ( SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM PROJECT_BUDGETS PJBD WHERE PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN PROJECT_BUDGETS PJBG ON PJBG.PROJ_ID=:PROJ_ID AND PJBG.ACM_CODE = ACTT.ACM_CODE
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , ACM_CODE
+ , PBDG_TOTAL
+ , PBDG_COUNT
+
+ FROM PROJECT_BUDGETS
+ ORDER BY PROJ_ID,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0401020.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0401020.frml
new file mode 100644
index 0000000..9e0dc83
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0401020.frml
@@ -0,0 +1,694 @@
+
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.PJM_CODE
+ , BUD.GET_PROJECT(PROJ.PJM_CODE) PROJ_NAME
+ , PROJ.STM_CODE
+ , PROJ.BTM_CODE
+ , PROJ.ACM_CODE
+ , BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , PROJ.PLAN_TYPE
+ , PROJ.PROJ_DURATION
+ , PROJ.PROJ_START_YEAR
+ , PROJ.PROJ_END_YEAR
+ , PROJ.PROJ_FOR_STAFF
+
+ , PROJ.PROJ_CATE
+ , PROJ.PROJ_KIND
+ , PROJ.PROJ_FROM_YEAR
+
+
+ FROM PROJECTS PROJ
+ WHERE PROJ_TYPE = 'PLCY' AND STM_CODE=:STM_CODE
+ ORDER BY PROJ_YEAR DESC, PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0401030-budget.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0401030-budget.frml
new file mode 100644
index 0000000..ec9b393
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0401030-budget.frml
@@ -0,0 +1,316 @@
+
+
+
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+ PROJ_ID,ACM_CODE
+
+
+ SELECT :PROJ_ID PROJ_ID
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PJBG.PBDG_TOTAL PBDG_TOTAL
+ , PJBG.PBDG_COUNT PBDG_COUNT
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN ( SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM PROJECT_BUDGETS PJBD WHERE PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN PROJECT_BUDGETS PJBG ON PJBG.PROJ_ID=:PROJ_ID AND PJBG.ACM_CODE = ACTT.ACM_CODE
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , ACM_CODE
+ , PBDG_TOTAL
+ , PBDG_COUNT
+
+ FROM PROJECT_BUDGETS
+ ORDER BY PROJ_ID,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0401030.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0401030.frml
new file mode 100644
index 0000000..82e7fc0
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0401030.frml
@@ -0,0 +1,680 @@
+
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.PJM_CODE
+ , BUD.GET_PROJECT(PROJ.PJM_CODE) PROJ_NAME
+ , PROJ.STM_CODE
+ , PROJ.BTM_CODE
+ , PROJ.ACM_CODE
+ , BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , PROJ.PLAN_TYPE
+ , PROJ.PROJ_DURATION
+ , PROJ.PROJ_START_YEAR
+ , PROJ.PROJ_END_YEAR
+ , PROJ.PROJ_FOR_STAFF
+
+ , PROJ.PROJ_CATE
+ , PROJ.PROJ_KIND
+ , PROJ.PROJ_FROM_YEAR
+
+
+ FROM PROJECTS PROJ
+ WHERE PROJ_TYPE = 'INYR' AND STM_CODE=:STM_CODE
+ ORDER BY PROJ_YEAR DESC, PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010.frml
new file mode 100644
index 0000000..7d93b35
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010.frml
@@ -0,0 +1,112 @@
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.STM_CODE
+ , PROJ.FLOW_TYPE
+ , PROJ.FLOW_TYPE_DESC
+ , PROJ.PJM_CODE, PROJ.PROJ_NAME
+ , PROJ.ACM_CODE, PROJ.ACM_NAME
+ , PROJ.PROJ_SEQ
+ , (SELECT RFC_DESC FROM REFER_CODE RFC WHERE RFC.RFG_GRP='FLOW-STATE' AND RFC.RFC_CODE='REVISE') FLOW_STATE
+
+
+ FROM (SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , TO_CHAR(PROJ.PROJ_YEAR, 'FM0000') PROJ_YEAR
+ , PROJ.STM_CODE
+ , FTYP.RFC_CODE FLOW_TYPE
+ , FTYP.RFC_DESC FLOW_TYPE_DESC
+ , PROJ.PJM_CODE, BUD.GET_PROJECT(PROJ.PJM_CODE) PROJ_NAME
+ , PROJ.ACM_CODE, BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , FTYP.RFC_ORDER PROJ_SEQ
+ FROM REFER_CODE FTYP
+ INNER JOIN REFER_CODE PTYPE ON PTYPE.RFG_GRP = 'PROJ-TYPE' AND PTYPE.RFC_FLAG = FTYP.RFC_CODE
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_TYPE = PTYPE.RFC_CODE
+ WHERE FTYP.RFG_GRP = 'FLOW-TYPE' AND FTYP.RFC_CODE != 'GENERAL' AND PROJ.PROJ_YEAR = :PROJ_YEAR AND PROJ.STM_CODE = :STM_CODE
+ UNION ALL
+ SELECT :PROJ_YEAR || 'xGENERALx' || :STM_CODE PROJ_ID
+ , 'GENERAL' PROJ_TYPE
+ , :PROJ_YEAR PROJ_YEAR
+ , :STM_CODE STM_CODE
+ , FTYP.RFC_CODE FLOW_TYPE
+ , FTYP.RFC_DESC FLOW_TYPE_DESC
+ , 'GENERAL' PJM_CODE, FTYP.RFC_DESC PROJ_NAME
+ , 'GENERAL' ACM_CODE, FTYP.RFC_DESC ACM_NAME
+ , FTYP.RFC_ORDER PROJ_SEQ
+ FROM REFER_CODE FTYP
+ WHERE FTYP.RFC_CODE = 'GENERAL'
+ ) PROJ
+
+ ORDER BY PROJ_SEQ, PROJ_ID
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/construct.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/construct.frml
new file mode 100644
index 0000000..6106315
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/construct.frml
@@ -0,0 +1,324 @@
+
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+ SELECT PROJ_ID
+ , PROJ_TYPE
+ , PROJ_YEAR
+ , PJM_CODE
+ , STM_CODE
+ , BTM_CODE
+ , ACM_CODE
+ , BUD.GET_ACTIVITY(ACM_CODE) ACM_NAME
+ , PLAN_TYPE
+ , PROJ_DURATION
+ , PROJ_INST_COUNT
+ , PROJ_START_YEAR
+ , PROJ_END_YEAR
+ , PROJ_FOR_STAFF
+ , PROJ_FROM_YEAR
+ , CREATE_BY
+ , CREATE_TIME
+ , UPDATE_BY
+ , UPDATE_TIME
+
+ FROM PROJECTS
+ WHERE STM_CODE = :STM_CODE AND PROJ_TYPE='CNST'
+ ORDER BY PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_CONST_INFO
+ PROJ_ID,ACM_CODE
+
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PCTI_ADDRESS
+ , PCTI_TUMBON
+ , PCTI_AMPUR
+ , PCTI_PROVINCE
+ , PCTI_ADDR_NOTE
+ , PCTI_AREA
+ , PCTI_EMP_COUNT
+ , PCTI_CHK_LOCATION
+ , PCTI_CHK_DOCUMENT
+ , PCTI_REMARK
+ , CREATE_BY
+ , JDTOE(CREATE_TIME) CREATE_TIME, CREATE_TIME DT_CREATE_TIME
+ , UPDATE_BY
+ , JDTOE(UPDATE_TIME) UPDATE_TIME, UPDATE_TIME DT_UPDATE_TIME
+
+ FROM PROJECT_CONST_INFO
+ ORDER BY PROJ_ID, ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/equipt.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/equipt.frml
new file mode 100644
index 0000000..cd9e0b3
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/equipt.frml
@@ -0,0 +1,340 @@
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PBDG.PROJ_ID
+ , PBDG.PBDG_ID
+ , PBDG.ACM_CODE
+ , BUD.GET_ACTIVITY(PBDG.ACM_CODE) ACM_NAME
+ , PBDG.PBDG_TOTAL
+ , PBDG.PBDG_COUNT
+ , PBDG.PBDG_ASSET_TYPE
+ , PBDG.PBDG_REASON
+ , PMAS.PROJ_YEAR
+ , PMAS.STM_CODE
+ , PMAS.PROJ_YEAR||'/'||PMAS.STM_CODE||'/'||PBDG.PROJ_ID FILEPATH
+
+ FROM PROJECT_BUDGETS PBDG
+ INNER JOIN PROJECTS PMAS ON PMAS.PROJ_ID = PBDG.PROJ_ID
+
+ ORDER BY PROJ_ID,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , BGM_CODE
+ , PBGI_QT_01
+ , PBGI_QT_02
+ , PBGI_QT_03
+ , PBGI_QT_04
+ , PBGI_QTY
+ , PBGI_COST
+ , PBGI_FREQ
+ , PBGI_ASSET_TYPE
+ , PBGI_REPLACE
+ , PBGI_ADDITION
+ , PBGI_ACQUIRE
+ , PBGI_TOTAL
+ , PBGI_REASON
+
+ FROM PROJECT_BUDGET_ITEMS
+ ORDER BY PROJ_ID,BGM_CODE,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/general.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/general.frml
new file mode 100644
index 0000000..4b23fed
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/general.frml
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.PJM_CODE
+ , PROJ.STM_CODE
+ , PROJ.BTM_CODE
+ , PROJ.ACM_CODE
+ , BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , PROJ.PLAN_TYPE
+ , PROJ.PROJ_DURATION
+ , PROJ.PROJ_START_YEAR
+ , PROJ.PROJ_END_YEAR
+ , PROJ.PROJ_FOR_STAFF
+
+ , PROJ.PROJ_FROM_YEAR
+ , 0 BDGT_TOTAL
+
+ FROM PROJECTS PROJ
+ INNER JOIN REFER_CODE RFC ON RFC.RFG_GRP='PROJ-TYPE' AND RFC.RFC_CODE=PROJ.PROJ_TYPE AND RFC.RFC_FLAG = 'GENERAL'
+
+ WHERE STM_CODE = :STM_CODE AND PROJ.PROJ_YEAR = :PROJ_YEAR
+ ORDER BY RFC.RFC_ORDER, PROJ.PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+
+
+ SELECT PACT.PROJ_ID
+ , PACT.PROJ_YEAR
+ , PACT.PROJ_TYPE
+ , PACT.PROJ_GROUP
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL+1 NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PACT.BDGT_COUNT
+ , PACT.BDGT_TOTAL
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN (SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM V_PROJECT_ACTIVITY PACT WHERE PACT.PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN V_PROJECT_ACTIVITY PACT ON PACT.ACM_CODE = ACTT.ACM_CODE AND PACT.PROJ_ID = :PROJ_ID
+
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/manage.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/manage.frml
new file mode 100644
index 0000000..9f4a16c
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/manage.frml
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PBDG.PROJ_ID
+ , PROJ.PROJ_YEAR
+ , PBDG.PBDG_ID
+ , PBDG.ACM_CODE
+ , BUD.GET_ACTIVITY(PBDG.ACM_CODE) ACM_NAME
+ , PBDG.PBDG_TOTAL
+ , PBDG.PBDG_COUNT
+
+ FROM PROJECT_BUDGETS PBDG
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_ID=PBDG.PROJ_ID
+
+ ORDER BY PBDG.PROJ_ID,PBDG.PBDG_ID
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/project-budget.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/project-budget.frml
new file mode 100644
index 0000000..2bd3c9b
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/project-budget.frml
@@ -0,0 +1,343 @@
+
+
+
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+ PROJ_ID,ACM_CODE
+
+
+ SELECT :PROJ_ID PROJ_ID
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PJBG.PBDG_TOTAL PBDG_TOTAL
+ , PJBG.PBDG_COUNT PBDG_COUNT
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN ( SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM PROJECT_BUDGETS PJBD WHERE PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN PROJECT_BUDGETS PJBG ON PJBG.PROJ_ID=:PROJ_ID AND PJBG.ACM_CODE = ACTT.ACM_CODE
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , ACM_CODE
+ , PBDG_TOTAL
+ , PBDG_COUNT
+
+ FROM PROJECT_BUDGETS
+ ORDER BY PROJ_ID,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/project.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/project.frml
new file mode 100644
index 0000000..2bac7ea
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/project.frml
@@ -0,0 +1,644 @@
+
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.PJM_CODE
+ , BUD.GET_PROJECT(PROJ.PJM_CODE) PROJ_NAME
+ , PROJ.STM_CODE
+ , PROJ.BTM_CODE
+ , PROJ.ACM_CODE
+ , BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , PROJ.PLAN_TYPE
+ , PROJ.PROJ_DURATION
+ , PROJ.PROJ_START_YEAR
+ , PROJ.PROJ_END_YEAR
+ , PROJ.PROJ_FOR_STAFF
+
+ , PROJ.PROJ_CATE
+ , PROJ.PROJ_KIND
+ , PROJ.PROJ_FROM_YEAR
+
+
+ FROM PROJECTS PROJ
+ WHERE STM_CODE=:STM_CODE
+ ORDER BY PROJ_YEAR DESC, PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/routine.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/routine.frml
new file mode 100644
index 0000000..3423ae7
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403010/routine.frml
@@ -0,0 +1,256 @@
+
+
+
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PBDG.PROJ_ID
+ , PROJ.PROJ_YEAR
+ , PBDG.PBDG_ID
+ , PBDG.ACM_CODE
+ , BUD.GET_ACTIVITY(PBDG.ACM_CODE) ACM_NAME
+ , PBDG.PBDG_TOTAL
+ , PBDG.PBDG_COUNT
+
+ FROM PROJECT_BUDGETS PBDG
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_ID=PBDG.PROJ_ID
+
+ ORDER BY PBDG.PROJ_ID,PBDG.PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020.frml
new file mode 100644
index 0000000..6c458f4
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020.frml
@@ -0,0 +1,114 @@
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.STM_CODE
+ , PROJ.FLOW_TYPE
+ , PROJ.FLOW_TYPE_DESC
+ , PROJ.PJM_CODE, PROJ.PROJ_NAME
+ , PROJ.ACM_CODE, PROJ.ACM_NAME
+ , PROJ.PROJ_SEQ
+ , BGT.FLOW_STATE('STEP-'||TO_CHAR (DBMS_RANDOM.VALUE(2, 4),'FM00')) FLOW_STATE
+ , JDTOTT(SYSDATE - (DBMS_RANDOM.VALUE(3, 10))) STATE_DATE
+ , TO_CHAR (DBMS_RANDOM.VALUE(2, 8),'FM000') LATEST_VER
+
+
+ FROM (SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , TO_CHAR(PROJ.PROJ_YEAR, 'FM0000') PROJ_YEAR
+ , PROJ.STM_CODE
+ , FTYP.RFC_CODE FLOW_TYPE
+ , FTYP.RFC_DESC FLOW_TYPE_DESC
+ , PROJ.PJM_CODE, BUD.GET_PROJECT(PROJ.PJM_CODE) PROJ_NAME
+ , PROJ.ACM_CODE, BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , FTYP.RFC_ORDER PROJ_SEQ
+ FROM REFER_CODE FTYP
+ INNER JOIN REFER_CODE PTYPE ON PTYPE.RFG_GRP = 'PROJ-TYPE' AND PTYPE.RFC_FLAG = FTYP.RFC_CODE
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_TYPE = PTYPE.RFC_CODE
+ WHERE FTYP.RFG_GRP = 'FLOW-TYPE' AND FTYP.RFC_CODE != 'GENERAL' AND PROJ.PROJ_YEAR = :PROJ_YEAR AND PROJ.STM_CODE = :STM_CODE
+ UNION ALL
+ SELECT :PROJ_YEAR || 'xGENERALx' || :STM_CODE PROJ_ID
+ , 'GENERAL' PROJ_TYPE
+ , :PROJ_YEAR PROJ_YEAR
+ , :STM_CODE STM_CODE
+ , FTYP.RFC_CODE FLOW_TYPE
+ , FTYP.RFC_DESC FLOW_TYPE_DESC
+ , 'GENERAL' PJM_CODE, FTYP.RFC_DESC PROJ_NAME
+ , 'GENERAL' ACM_CODE, FTYP.RFC_DESC ACM_NAME
+ , FTYP.RFC_ORDER PROJ_SEQ
+ FROM REFER_CODE FTYP
+ WHERE FTYP.RFC_CODE = 'GENERAL'
+ ) PROJ
+
+ ORDER BY PROJ_SEQ, PROJ_ID
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/construct.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/construct.frml
new file mode 100644
index 0000000..8f6b70d
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/construct.frml
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+ SELECT PROJ_ID
+ , PROJ_TYPE
+ , PROJ_YEAR
+ , PJM_CODE
+ , STM_CODE
+ , BTM_CODE
+ , ACM_CODE
+ , BUD.GET_ACTIVITY(ACM_CODE) ACM_NAME
+ , PLAN_TYPE
+ , PROJ_DURATION
+ , PROJ_INST_COUNT
+ , PROJ_START_YEAR
+ , PROJ_END_YEAR
+ , PROJ_FOR_STAFF
+ , PROJ_FROM_YEAR
+ , CREATE_BY
+ , CREATE_TIME
+ , UPDATE_BY
+ , UPDATE_TIME
+
+ FROM PROJECTS
+ WHERE STM_CODE = :STM_CODE AND PROJ_TYPE='CNST'
+ ORDER BY PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_CONST_INFO
+ PROJ_ID,ACM_CODE
+
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PCTI_ADDRESS
+ , PCTI_TUMBON
+ , PCTI_AMPUR
+ , PCTI_PROVINCE
+ , PCTI_ADDR_NOTE
+ , PCTI_AREA
+ , PCTI_EMP_COUNT
+ , PCTI_CHK_LOCATION
+ , PCTI_CHK_DOCUMENT
+ , PCTI_REMARK
+ , CREATE_BY
+ , JDTOE(CREATE_TIME) CREATE_TIME, CREATE_TIME DT_CREATE_TIME
+ , UPDATE_BY
+ , JDTOE(UPDATE_TIME) UPDATE_TIME, UPDATE_TIME DT_UPDATE_TIME
+
+ FROM PROJECT_CONST_INFO
+ ORDER BY PROJ_ID, ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/equipt.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/equipt.frml
new file mode 100644
index 0000000..f0e90dc
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/equipt.frml
@@ -0,0 +1,314 @@
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PBDG.PROJ_ID
+ , PBDG.PBDG_ID
+ , PBDG.ACM_CODE
+ , BUD.GET_ACTIVITY(PBDG.ACM_CODE) ACM_NAME
+ , PBDG.PBDG_TOTAL
+ , PBDG.PBDG_COUNT
+ , PBDG.PBDG_ASSET_TYPE
+ , PBDG.PBDG_REASON
+ , PMAS.PROJ_YEAR
+ , PMAS.STM_CODE
+ , PMAS.PROJ_YEAR||'/'||PMAS.STM_CODE||'/'||PBDG.PROJ_ID FILEPATH
+
+ FROM PROJECT_BUDGETS PBDG
+ INNER JOIN PROJECTS PMAS ON PMAS.PROJ_ID = PBDG.PROJ_ID
+
+ ORDER BY PROJ_ID,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , BGM_CODE
+ , PBGI_QT_01
+ , PBGI_QT_02
+ , PBGI_QT_03
+ , PBGI_QT_04
+ , PBGI_QTY
+ , PBGI_COST
+ , PBGI_FREQ
+ , PBGI_ASSET_TYPE
+ , PBGI_REPLACE
+ , PBGI_ADDITION
+ , PBGI_ACQUIRE
+ , PBGI_TOTAL
+ , PBGI_REASON
+
+ FROM PROJECT_BUDGET_ITEMS
+ ORDER BY PROJ_ID,BGM_CODE,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/general.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/general.frml
new file mode 100644
index 0000000..d78156d
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/general.frml
@@ -0,0 +1,265 @@
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.PJM_CODE
+ , PROJ.STM_CODE
+ , PROJ.BTM_CODE
+ , PROJ.ACM_CODE
+ , BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , PROJ.PLAN_TYPE
+ , PROJ.PROJ_DURATION
+ , PROJ.PROJ_START_YEAR
+ , PROJ.PROJ_END_YEAR
+ , PROJ.PROJ_FOR_STAFF
+
+ , PROJ.PROJ_FROM_YEAR
+ , 0 BDGT_TOTAL
+
+ FROM PROJECTS PROJ
+ INNER JOIN REFER_CODE RFC ON RFC.RFG_GRP='PROJ-TYPE' AND RFC.RFC_CODE=PROJ.PROJ_TYPE AND RFC.RFC_FLAG = 'GENERAL'
+
+ WHERE STM_CODE = :STM_CODE AND PROJ.PROJ_YEAR = :PROJ_YEAR
+ ORDER BY RFC.RFC_ORDER, PROJ.PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+
+
+ SELECT PACT.PROJ_ID
+ , PACT.PROJ_YEAR
+ , PACT.PROJ_TYPE
+ , PACT.PROJ_GROUP
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL+1 NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PACT.BDGT_COUNT
+ , PACT.BDGT_TOTAL
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN (SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM V_PROJECT_ACTIVITY PACT WHERE PACT.PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN V_PROJECT_ACTIVITY PACT ON PACT.ACM_CODE = ACTT.ACM_CODE AND PACT.PROJ_ID = :PROJ_ID
+
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/manage.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/manage.frml
new file mode 100644
index 0000000..259b98b
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/manage.frml
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PBDG.PROJ_ID
+ , PROJ.PROJ_YEAR
+ , PBDG.PBDG_ID
+ , PBDG.ACM_CODE
+ , BUD.GET_ACTIVITY(PBDG.ACM_CODE) ACM_NAME
+ , PBDG.PBDG_TOTAL
+ , PBDG.PBDG_COUNT
+
+ FROM PROJECT_BUDGETS PBDG
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_ID=PBDG.PROJ_ID
+
+ ORDER BY PBDG.PROJ_ID,PBDG.PBDG_ID
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/project-budget.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/project-budget.frml
new file mode 100644
index 0000000..18f55d8
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/project-budget.frml
@@ -0,0 +1,321 @@
+
+
+
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+ PROJ_ID,ACM_CODE
+
+
+ SELECT :PROJ_ID PROJ_ID
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PJBG.PBDG_TOTAL PBDG_TOTAL
+ , PJBG.PBDG_COUNT PBDG_COUNT
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN ( SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM PROJECT_BUDGETS PJBD WHERE PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN PROJECT_BUDGETS PJBG ON PJBG.PROJ_ID=:PROJ_ID AND PJBG.ACM_CODE = ACTT.ACM_CODE
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , ACM_CODE
+ , PBDG_TOTAL
+ , PBDG_COUNT
+
+ FROM PROJECT_BUDGETS
+ ORDER BY PROJ_ID,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/project.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/project.frml
new file mode 100644
index 0000000..639aced
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/project.frml
@@ -0,0 +1,621 @@
+
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.PJM_CODE
+ , BUD.GET_PROJECT(PROJ.PJM_CODE) PROJ_NAME
+ , PROJ.STM_CODE
+ , PROJ.BTM_CODE
+ , PROJ.ACM_CODE
+ , BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , PROJ.PLAN_TYPE
+ , PROJ.PROJ_DURATION
+ , PROJ.PROJ_START_YEAR
+ , PROJ.PROJ_END_YEAR
+ , PROJ.PROJ_FOR_STAFF
+
+ , PROJ.PROJ_CATE
+ , PROJ.PROJ_KIND
+ , PROJ.PROJ_FROM_YEAR
+
+
+ FROM PROJECTS PROJ
+ WHERE STM_CODE=:STM_CODE
+ ORDER BY PROJ_YEAR DESC, PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/routine.frml b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/routine.frml
new file mode 100644
index 0000000..b8d92e8
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/bdgt-0403020/routine.frml
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PBDG.PROJ_ID
+ , PROJ.PROJ_YEAR
+ , PBDG.PBDG_ID
+ , PBDG.ACM_CODE
+ , BUD.GET_ACTIVITY(PBDG.ACM_CODE) ACM_NAME
+ , PBDG.PBDG_TOTAL
+ , PBDG.PBDG_COUNT
+
+ FROM PROJECT_BUDGETS PBDG
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_ID=PBDG.PROJ_ID
+
+ ORDER BY PBDG.PROJ_ID,PBDG.PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/grids/grid-construct-budget.frml b/DevResources/full-examples/bdgt04/view/frm/grids/grid-construct-budget.frml
new file mode 100644
index 0000000..746f1dd
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/grids/grid-construct-budget.frml
@@ -0,0 +1,263 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+
+ SELECT :PROJ_ID PROJ_ID
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PBGI.PBDG_ID
+ , PBGI.BGM_CODE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_ASSET_TYPE
+ , PBGI.PBGI_REPLACE
+ , PBGI.PBGI_ADDITION
+ , PBGI.PBGI_ACQUIRE
+ , PBGI.PBGI_TOTAL
+ , PBGI.PBGI_REASON
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN ( SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT PBGI.PBDG_ID ACM_CODE FROM PROJECT_BUDGET_ITEMS PBGI WHERE PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.PBDG_ID = ACTT.ACM_CODE
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.acm_code}] : ${data.acm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/grids/grid-equipt-budget.frml b/DevResources/full-examples/bdgt04/view/frm/grids/grid-equipt-budget.frml
new file mode 100644
index 0000000..2d71eb9
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/grids/grid-equipt-budget.frml
@@ -0,0 +1,231 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT BGTT.BGM_CODE
+ , BGTT.BGM_NAME
+ , BGTT.BGM_UNIT
+ , BGTT.BGM_UNIT_RATE
+ , BGTT.NODE_LEVEL
+ , BGTT.BGM_SEQ
+ , BGTT.EXP_TYPE
+ , BGTT.MAIN_NODE
+ , BGTT.NODE_TYPE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_ASSET_TYPE
+ , PBGI.PBGI_REPLACE
+ , PBGI.PBGI_ADDITION
+ , PBGI.PBGI_ACQUIRE
+ , PBGI.PBGI_TOTAL
+ , PBGI.PBGI_REASON
+
+
+ FROM BGT.V_BUDGET_TREE BGTT
+ INNER JOIN (SELECT DISTINCT BGDM.BGM_CODE
+ FROM BUD.BUDGET_M BGDM
+ INNER JOIN BUD.BUDGET_M BGDH ON BGDM.BGM_CODE = BGDH.BGM_CODE
+ START WITH BGDM.BGM_CODE IN (SELECT PBGI.BGM_CODE FROM BGT.PROJECT_BUDGET_ITEMS PBGI WHERE PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID)
+ CONNECT BY PRIOR BGDH.BGM_MAIN_NODE = BGDH.BGM_CODE) FLTR ON FLTR.BGM_CODE = BGTT.BGM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.BGM_CODE = BGTT.BGM_CODE
+
+ ORDER BY BGTT.BGM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/grids/grid-manage-budget.frml b/DevResources/full-examples/bdgt04/view/frm/grids/grid-manage-budget.frml
new file mode 100644
index 0000000..532e586
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/grids/grid-manage-budget.frml
@@ -0,0 +1,222 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT BGTT.BGM_CODE
+ , BGTT.BGM_NAME
+ , BGTT.BGM_UNIT
+ , BGTT.BGM_UNIT_RATE
+ , BGTT.NODE_LEVEL
+ , BGTT.BGM_SEQ
+ , BGTT.EXP_TYPE
+ , BGTT.MAIN_NODE
+ , BGTT.NODE_TYPE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_ACQUIRE
+ , PBGI.PBGI_TOTAL
+
+
+ FROM BGT.V_BUDGET_TREE BGTT
+ INNER JOIN (SELECT DISTINCT BGDM.BGM_CODE
+ FROM BUD.BUDGET_M BGDM
+ INNER JOIN BUD.BUDGET_M BGDH ON BGDM.BGM_CODE = BGDH.BGM_CODE
+ START WITH BGDM.BGM_CODE IN (SELECT PBGI.BGM_CODE FROM BGT.PROJECT_BUDGET_ITEMS PBGI WHERE PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID)
+ CONNECT BY PRIOR BGDH.BGM_MAIN_NODE = BGDH.BGM_CODE) FLTR ON FLTR.BGM_CODE = BGTT.BGM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.BGM_CODE = BGTT.BGM_CODE AND PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID
+
+ ORDER BY BGTT.BGM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/grids/grid-proj-budget.frml b/DevResources/full-examples/bdgt04/view/frm/grids/grid-proj-budget.frml
new file mode 100644
index 0000000..ef495f2
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/grids/grid-proj-budget.frml
@@ -0,0 +1,272 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT BGTT.BGM_CODE
+ , BGTT.BGM_NAME
+ , BGTT.BGM_UNIT
+ , BGTT.BGM_UNIT_RATE
+ , BGTT.NODE_LEVEL
+ , BGTT.BGM_SEQ
+ , BGTT.EXP_TYPE
+ , BGTT.MAIN_NODE
+ , BGTT.NODE_TYPE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_TOTAL
+
+
+ FROM BGT.V_BUDGET_TREE BGTT
+ INNER JOIN (SELECT DISTINCT BGDM.BGM_CODE
+ FROM BUD.BUDGET_M BGDM
+ INNER JOIN BUD.BUDGET_M BGDH ON BGDM.BGM_CODE = BGDH.BGM_CODE
+ START WITH BGDM.BGM_CODE IN (SELECT PBGI.BGM_CODE FROM BGT.PROJECT_BUDGET_ITEMS PBGI WHERE PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID)
+ CONNECT BY PRIOR BGDH.BGM_MAIN_NODE = BGDH.BGM_CODE) FLTR ON FLTR.BGM_CODE = BGTT.BGM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.BGM_CODE = BGTT.BGM_CODE AND PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID
+
+ ORDER BY BGTT.BGM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No
+
+
+ รายการกิจกรรม
+
+
+ งบประมาณ
+
+
+
+
+
+
+ หน่วย/คน
+
+
+ ครั้ง/คืน
+
+
+ อัตรา
+
+
+ รวมเป็นเงิน
+
+
+
+
+
+
+ 1
+
+
+ กิจกรรมย่อย 1
+
+ 5
+ 10
+ 200
+ 10,000
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/grids/grid-routine-budget.frml b/DevResources/full-examples/bdgt04/view/frm/grids/grid-routine-budget.frml
new file mode 100644
index 0000000..08ed7d2
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/grids/grid-routine-budget.frml
@@ -0,0 +1,222 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT BGTT.BGM_CODE
+ , BGTT.BGM_NAME
+ , BGTT.BGM_UNIT
+ , BGTT.BGM_UNIT_RATE
+ , BGTT.NODE_LEVEL
+ , BGTT.BGM_SEQ
+ , BGTT.EXP_TYPE
+ , BGTT.MAIN_NODE
+ , BGTT.NODE_TYPE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_ACQUIRE
+ , PBGI.PBGI_TOTAL
+
+
+ FROM BGT.V_BUDGET_TREE BGTT
+ INNER JOIN (SELECT DISTINCT BGDM.BGM_CODE
+ FROM BUD.BUDGET_M BGDM
+ INNER JOIN BUD.BUDGET_M BGDH ON BGDM.BGM_CODE = BGDH.BGM_CODE
+ START WITH BGDM.BGM_CODE IN (SELECT PBGI.BGM_CODE FROM BGT.PROJECT_BUDGET_ITEMS PBGI WHERE PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID)
+ CONNECT BY PRIOR BGDH.BGM_MAIN_NODE = BGDH.BGM_CODE) FLTR ON FLTR.BGM_CODE = BGTT.BGM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.BGM_CODE = BGTT.BGM_CODE AND PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID
+
+ ORDER BY BGTT.BGM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/grids/grid-stratigy-item.frml b/DevResources/full-examples/bdgt04/view/frm/grids/grid-stratigy-item.frml
new file mode 100644
index 0000000..c581893
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/grids/grid-stratigy-item.frml
@@ -0,0 +1,86 @@
+
+
+
+
+ APP
+ PROJECT_STTGYS_ITEMS
+ PROJ_ID,PSTG_CODE,PSTI_GROUP
+
+
+ SELECT PSTI.PROJ_ID
+ , PSTI.PSTG_CODE
+ , PSTI.PSTI_GROUP
+ , RFGP.RFC_DESC GROUP_DESC
+ , PSTI.PSTI_CODE
+ , RFCI.RFC_DESC ITEM_DESC
+ , PSTI_DETAIL
+
+ FROM PROJECT_STTGYS_ITEMS PSTI
+ INNER JOIN BGT.REFER_CODE RFGP ON RFGP.RFG_GRP='STG-ITEMS' AND RFC.RFC_CODE=STTG.PSTI_CODE
+ INNER JOIN BGT.REFER_CODE RFCI ON RFC.RFG_GRP=PSTI.PSTI_GROUP AND RFC.RFC_CODE=STTG.PSTI_CODE
+
+ ORDER BY PSTI_GROUP, PSTI_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/grids/grid-stratigy.frml b/DevResources/full-examples/bdgt04/view/frm/grids/grid-stratigy.frml
new file mode 100644
index 0000000..7fcc58e
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/grids/grid-stratigy.frml
@@ -0,0 +1,75 @@
+
+
+
+
+ APP
+ PROJECT_STTGYS
+ PROJ_ID,PSTG_CODE
+
+
+ SELECT STTG.PROJ_ID
+ , STTG.PSTG_CODE
+ , RFC.RFC_DESC PSTG_DESC
+ , STTG.PSTG_CONCEPT
+
+
+ FROM PROJECT_STTGYS STTG
+ INNER JOIN BGT.REFER_CODE RFC ON RFC.RFG_GRP='STG-MAIN' AND RFC.RFC_CODE=STTG.PSTG_CODE
+
+ ORDER BY PSTG_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt04/view/frm/grids/grid-work-budget.frml b/DevResources/full-examples/bdgt04/view/frm/grids/grid-work-budget.frml
new file mode 100644
index 0000000..26b37e8
--- /dev/null
+++ b/DevResources/full-examples/bdgt04/view/frm/grids/grid-work-budget.frml
@@ -0,0 +1,174 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , BGM_CODE
+ , BUD.GET_BUDGET (BGM_CODE) BGM_NAME
+ , PBGI_QT_01
+ , PBGI_QT_02
+ , PBGI_QT_03
+ , PBGI_QT_04
+ , PBGI_QTY
+ , PBGI_COST
+ , PBGI_FREQ
+ , PBGI_ASSET_TYPE
+ , PBGI_REPLACE
+ , PBGI_ADDITION
+ , PBGI_ACQUIRE
+ , PBGI_TOTAL
+ , PBGI_REASON
+
+ FROM PROJECT_BUDGET_ITEMS
+ ORDER BY PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/defs/ajax.xml b/DevResources/full-examples/bdgt05/defs/ajax.xml
new file mode 100644
index 0000000..25237df
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/defs/ajax.xml
@@ -0,0 +1,201 @@
+
+
+
+ BUD
+ Main Activity
+ 100
+
+ SELECT PJM.PJM_CODE
+ , PJM.PJM_NAME
+ , PJM.PJM_JOB_TYPE
+ , PJM.PJM_WORK_PLAN
+ , PJM.PJM_PRODUCT
+ , PJM.PJM_GROUP_PLAN
+ , PJM.PJM_JOB_PROJECT
+ , PJM.PJM_STRATEGY
+ , PJM.PJM_ACTIVE
+
+ FROM PROJECT_M PJM
+
+ WHERE (PJM.PJM_CODE LIKE '%'||:SEARCH||'%' OR PJM.PJM_NAME LIKE '%'||:SEARCH||'%')
+
+
+
+
+
+
+
+ BUD
+ Main Activity
+ 100
+
+
+ SELECT ACM_CODE
+ , ACM_NAME
+ , NODE_LEVEL
+ , MAIN_NODE
+ , ACM_UNIT
+ , ACM_START_YEAR
+ , ACM_END_YEAR
+ , STM_CODE
+ , JBT_CODE
+ , JBP_CODE
+ , EXP_CODE
+ , PJM_CODE
+ , STG_CODE
+ , NODE_TYPE
+ , DECODE(NODE_TYPE,'C','true','') disabled
+
+ FROM BGT.V_ACTIVITY_TREE ACM
+
+ WHERE 0=0
+ AND (:DV_YEAR BETWEEN ACM_START_YEAR AND ACM_END_YEAR)
+ -- AND (ACM.STM_CODE = '%' OR ACM.STM_CODE = :STM_CODE)
+ AND (ACM.ACM_CODE LIKE '%'||:SEARCH||'%' OR ACM.ACM_NAME LIKE '%'||:SEARCH||'%')
+
+
+
+
+
+
+
+ BUD
+ Main Activity
+ 100
+
+
+ SELECT BGD.BGM_CODE
+ , BGD.BGM_NAME
+ , BGD.BGM_EXPENSE_TYPE
+ , BGD.BGM_UNIT
+ , BGD.BGM_UNIT_RATE
+ , BGD.BGM_ACTIVE
+ , BGD.BGM_PREPARE
+
+ FROM BUDGET_M BGD
+
+ WHERE (BGD.BGM_CODE LIKE '%'||:SEARCH||'%' OR BGD.BGM_NAME LIKE '%'||:SEARCH||'%')
+
+ ORDER BY BGM_CODE
+
+
+
+
+ APP
+
+ SELECT RFG_GRP
+ , RFC_CODE
+ , RFC_DESC
+ , RFC_FLAG
+ , RFC_ORDER
+
+ FROM REFER_CODE
+ WHERE (RFG_GRP = 'STG-ITEMS')
+ AND (RFC_CODE LIKE '%'||:SEARCH||'%' OR RFC_DESC LIKE '%'||:SEARCH||'%')
+ ORDER BY RFC_CODE
+
+
+
+
+ APP
+
+ SELECT RFG_GRP
+ , RFC_CODE
+ , RFC_DESC
+ , RFC_FLAG
+ , RFC_ORDER
+
+ FROM REFER_CODE
+ WHERE (RFG_GRP = :RFG_GRP)
+ AND (RFC_CODE LIKE '%'||:SEARCH||'%' OR RFC_DESC LIKE '%'||:SEARCH||'%')
+ ORDER BY RFC_CODE
+
+
+
+
+
+ BUD
+ Main Activity
+ 100
+
+
+ SELECT ACM_CODE
+ , ACM_NAME
+ , NODE_LEVEL
+ , MAIN_NODE
+ , ACM_UNIT
+ , ACM_START_YEAR
+ , ACM_END_YEAR
+ , STM_CODE
+ , JBT_CODE
+ , JBP_CODE
+ , EXP_CODE
+ , PJM_CODE
+ , STG_CODE
+ , NODE_TYPE
+ , DECODE(NODE_TYPE,'C','true','') disabled
+
+ FROM BGT.V_ACTIVITY_TREE ACM
+
+ WHERE 0=0
+ AND (:DV_YEAR BETWEEN ACM_START_YEAR AND ACM_END_YEAR)
+ -- AND (ACM.STM_CODE = '%' OR ACM.STM_CODE = :STM_CODE)
+ AND (ACM.ACM_CODE LIKE '%'||:SEARCH||'%' OR ACM.ACM_NAME LIKE '%'||:SEARCH||'%')
+
+
+
+
+
+
+
+ APP
+ Main Activity
+ 100
+
+
+ SELECT BGM.BGM_CODE
+ , BGM.BGM_NAME
+ , BGM.EXP_TYPE
+ , BGM.BGM_UNIT
+ , BGM.BGM_UNIT_RATE
+ , BGM.BGM_SEQ
+ , BGM.NODE_LEVEL
+ , BGM.MAIN_NODE
+ , DECODE(NODE_TYPE,'C','true','') disabled
+
+ FROM V_BUDGET_TREE BGM
+
+ WHERE (BGM.BGM_CODE LIKE '%'||:SEARCH||'%' OR BGM.BGM_NAME LIKE '%'||:SEARCH||'%')
+
+ ORDER BY BGM_SEQ
+
+
+
+
+
+
+ APP
+ Main Activity
+ 100
+
+
+ SELECT BGM.BGM_CODE
+ , BGM.BGM_NAME
+ , BGM.EXP_TYPE
+ , BGM.BGM_UNIT
+ , BGM.BGM_UNIT_RATE
+ , BGM.BGM_SEQ
+ , BGM.NODE_LEVEL
+ , BGM.MAIN_NODE
+ , DECODE(NODE_TYPE,'C','true','') disabled
+
+ FROM V_BUDGET_TREE BGM
+
+ WHERE (BGM_CODE LIKE '3.1%')
+ AND (BGM.BGM_CODE LIKE '%'||:SEARCH||'%' OR BGM.BGM_NAME LIKE '%'||:SEARCH||'%')
+
+ ORDER BY BGM_SEQ
+
+
+
+
\ No newline at end of file
diff --git a/DevResources/full-examples/bdgt05/view/bgt0501010-general.jsp b/DevResources/full-examples/bdgt05/view/bgt0501010-general.jsp
new file mode 100644
index 0000000..f447a75
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/bgt0501010-general.jsp
@@ -0,0 +1,51 @@
+<%@ page import="org.apache.commons.codec.*" %>
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ String _formId = "bdgt-0501010/general";
+ try {
+ String data = factory.rqsCtx.getParameter("data","");
+ if (!data.isBlank()) {
+ data = JUtils.decBase64(data);
+ data = URLDecoder.decode(data, CharEncoding.UTF_8);
+
+ boolean isEditMode = factory.rqsCtx.isPostParam("add") || factory.rqsCtx.isPostParam("edit") || factory.rqsCtx.isPostParam("view");
+ JSONObject jsData = new JSONObject(data);
+ String type = jsData.getString("type");
+ String acmCode = jsData.getString("acm_code");
+ String projId = jsData.getString("proj_id");
+
+ if (isEditMode && type.equals("rutn")) {
+ _formId = "bdgt-0501010/routine";
+ } else if (isEditMode && type.equals("mngt")) {
+ _formId = "bdgt-0501010/manage";
+ } else if (isEditMode && type.equals("eqpt")) {
+ _formId = "bdgt-0501010/equipt";
+ } else if (isEditMode && type.equals("cnst")) {
+ _formId = "bdgt-0501010/construct";
+ }
+
+ dynForm = new DynForm(application, request, response, "bdgt05", _formId);
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("ACM_CODE",acmCode);
+ dynForm.setFormvar("PROJ_ID",projId);
+ } else {
+ dynForm = new DynForm(application, request, response, "bdgt05", _formId);
+ }
+
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+
+ if (dynForm.workIn(WorkMode.Editing)) {
+ factory.pageCtx.addWidget(DynConstants.PageWidget.FileBox);
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt05/view/bgt0501010.jsp b/DevResources/full-examples/bdgt05/view/bgt0501010.jsp
new file mode 100644
index 0000000..0f54641
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/bgt0501010.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt05", "bdgt-0501010");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+// dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt05/view/bgt0501020-budget.jsp b/DevResources/full-examples/bdgt05/view/bgt0501020-budget.jsp
new file mode 100644
index 0000000..bb2a0a8
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/bgt0501020-budget.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt05", "bdgt-0501020-budget");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt05/view/bgt0501020.jsp b/DevResources/full-examples/bdgt05/view/bgt0501020.jsp
new file mode 100644
index 0000000..4045419
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/bgt0501020.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt05", "bdgt-0501020");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt05/view/bgt0501030-budget.jsp b/DevResources/full-examples/bdgt05/view/bgt0501030-budget.jsp
new file mode 100644
index 0000000..ccef64d
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/bgt0501030-budget.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt05", "bdgt-0501030-budget");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt05/view/bgt0501030.jsp b/DevResources/full-examples/bdgt05/view/bgt0501030.jsp
new file mode 100644
index 0000000..d2d8ca4
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/bgt0501030.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt05", "bdgt-0501030");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010.frml b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010.frml
new file mode 100644
index 0000000..d51794c
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010.frml
@@ -0,0 +1,93 @@
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+
+ SELECT PROJ_YEAR
+ , STM_CODE
+ , STM_NAME
+ , FLOW_TYPE
+ , FLOW_TYPE_DESC
+ , PROJ_SEQ
+ , FLOW_STATE
+ , JDTOTT(SYSDATE - (DBMS_RANDOM.VALUE(3, 10))) STATE_DATE
+
+
+ FROM (SELECT DISTINCT :PROJ_YEAR PROJ_YEAR
+ , PROJ.STM_CODE STM_CODE
+ , BUD.GET_SECTION(PROJ.STM_CODE) STM_NAME
+ , FTYP.RFC_CODE FLOW_TYPE
+ , FTYP.RFC_DESC FLOW_TYPE_DESC
+ , FTYP.RFC_ORDER PROJ_SEQ
+ , BGT.FLOW_STATE('STEP-02') FLOW_STATE
+ FROM REFER_CODE FTYP
+ INNER JOIN REFER_CODE PTYPE ON PTYPE.RFG_GRP = 'PROJ-TYPE' AND PTYPE.RFC_FLAG = FTYP.RFC_CODE
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_TYPE = PTYPE.RFC_CODE
+ WHERE FTYP.RFG_GRP = 'FLOW-TYPE' AND FTYP.RFC_CODE = 'GENERAL' AND PROJ.PROJ_YEAR = :PROJ_YEAR
+ ORDER BY STM_NAME) QR1
+
+ ORDER BY STM_NAME
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/construct.frml b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/construct.frml
new file mode 100644
index 0000000..2b8cceb
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/construct.frml
@@ -0,0 +1,338 @@
+
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+ SELECT PROJ_ID
+ , PROJ_TYPE
+ , PROJ_YEAR
+ , PJM_CODE
+ , STM_CODE
+ , BTM_CODE
+ , ACM_CODE
+ , BUD.GET_ACTIVITY(ACM_CODE) ACM_NAME
+ , PLAN_TYPE
+ , PROJ_DURATION
+ , PROJ_INST_COUNT
+ , PROJ_START_YEAR
+ , PROJ_END_YEAR
+ , PROJ_FOR_STAFF
+ , PROJ_FROM_YEAR
+ , CREATE_BY
+ , CREATE_TIME
+ , UPDATE_BY
+ , UPDATE_TIME
+
+ FROM PROJECTS
+ WHERE PROJ_ID = :PROJ_ID
+ ORDER BY PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_CONST_INFO
+ PROJ_ID,ACM_CODE
+
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PCTI_ADDRESS
+ , PCTI_TUMBON
+ , PCTI_AMPUR
+ , PCTI_PROVINCE
+ , PCTI_ADDR_NOTE
+ , PCTI_AREA
+ , PCTI_EMP_COUNT
+ , PCTI_CHK_LOCATION
+ , PCTI_CHK_DOCUMENT
+ , PCTI_REMARK
+ , CREATE_BY
+ , JDTOE(CREATE_TIME) CREATE_TIME, CREATE_TIME DT_CREATE_TIME
+ , UPDATE_BY
+ , JDTOE(UPDATE_TIME) UPDATE_TIME, UPDATE_TIME DT_UPDATE_TIME
+
+ FROM PROJECT_CONST_INFO
+ ORDER BY PROJ_ID, ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/equipt.frml b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/equipt.frml
new file mode 100644
index 0000000..53915ed
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/equipt.frml
@@ -0,0 +1,356 @@
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PBDG.PROJ_ID
+ , PBDG.PBDG_ID
+ , PBDG.ACM_CODE
+ , BUD.GET_ACTIVITY(PBDG.ACM_CODE) ACM_NAME
+ , PBDG.PBDG_TOTAL
+ , PBDG.PBDG_COUNT
+ , PBDG.PBDG_ASSET_TYPE
+ , PBDG.PBDG_REASON
+ , PMAS.PROJ_YEAR
+ , PMAS.STM_CODE
+ , PMAS.PROJ_YEAR||'/'||PMAS.STM_CODE||'/'||PBDG.PROJ_ID FILEPATH
+
+ FROM PROJECT_BUDGETS PBDG
+ INNER JOIN PROJECTS PMAS ON PMAS.PROJ_ID = PBDG.PROJ_ID
+
+ ORDER BY PROJ_ID,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , BGM_CODE
+ , PBGI_QT_01
+ , PBGI_QT_02
+ , PBGI_QT_03
+ , PBGI_QT_04
+ , PBGI_QTY
+ , PBGI_COST
+ , PBGI_FREQ
+ , PBGI_ASSET_TYPE
+ , PBGI_REPLACE
+ , PBGI_ADDITION
+ , PBGI_ACQUIRE
+ , PBGI_TOTAL
+ , PBGI_REASON
+
+ FROM PROJECT_BUDGET_ITEMS
+ ORDER BY PROJ_ID,BGM_CODE,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/general.frml b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/general.frml
new file mode 100644
index 0000000..07a4c13
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/general.frml
@@ -0,0 +1,259 @@
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.PJM_CODE
+ , PROJ.STM_CODE
+ , PROJ.BTM_CODE
+ , PROJ.ACM_CODE
+ , BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , PROJ.PLAN_TYPE
+ , PROJ.PROJ_DURATION
+ , PROJ.PROJ_START_YEAR
+ , PROJ.PROJ_END_YEAR
+ , PROJ.PROJ_FOR_STAFF
+
+ , PROJ.PROJ_FROM_YEAR
+ , 0 BDGT_TOTAL
+
+ FROM PROJECTS PROJ
+ INNER JOIN REFER_CODE RFC ON RFC.RFG_GRP='PROJ-TYPE' AND RFC.RFC_CODE=PROJ.PROJ_TYPE AND RFC.RFC_FLAG = 'GENERAL'
+
+ WHERE STM_CODE = :STM_CODE AND PROJ.PROJ_YEAR = :PROJ_YEAR
+ ORDER BY RFC.RFC_ORDER, PROJ.PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+
+
+ SELECT PACT.PROJ_ID
+ , PACT.PROJ_YEAR
+ , PACT.PROJ_TYPE
+ , PACT.PROJ_GROUP
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL+1 NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PACT.BDGT_COUNT
+ , PACT.BDGT_TOTAL
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN (SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM V_PROJECT_ACTIVITY PACT WHERE PACT.PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN V_PROJECT_ACTIVITY PACT ON PACT.ACM_CODE = ACTT.ACM_CODE AND PACT.PROJ_ID = :PROJ_ID
+
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/manage.frml b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/manage.frml
new file mode 100644
index 0000000..1b72e4e
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/manage.frml
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PBDG.PROJ_ID
+ , PROJ.PROJ_YEAR
+ , PBDG.PBDG_ID
+ , PBDG.ACM_CODE
+ , BUD.GET_ACTIVITY(PBDG.ACM_CODE) ACM_NAME
+ , PBDG.PBDG_TOTAL
+ , PBDG.PBDG_COUNT
+
+ FROM PROJECT_BUDGETS PBDG
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_ID=PBDG.PROJ_ID
+
+ ORDER BY PBDG.PROJ_ID,PBDG.PBDG_ID
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/routine.frml b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/routine.frml
new file mode 100644
index 0000000..0b552ec
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501010/routine.frml
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PBDG.PROJ_ID
+ , PROJ.PROJ_YEAR
+ , PBDG.PBDG_ID
+ , PBDG.ACM_CODE
+ , BUD.GET_ACTIVITY(PBDG.ACM_CODE) ACM_NAME
+ , PBDG.PBDG_TOTAL
+ , PBDG.PBDG_COUNT
+
+ FROM PROJECT_BUDGETS PBDG
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_ID=PBDG.PROJ_ID
+
+ ORDER BY PBDG.PROJ_ID,PBDG.PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/bdgt-0501020-budget.frml b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501020-budget.frml
new file mode 100644
index 0000000..9f2e5a8
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501020-budget.frml
@@ -0,0 +1,346 @@
+
+
+
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+ PROJ_ID,ACM_CODE
+
+
+ SELECT :PROJ_ID PROJ_ID
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PJBG.PBDG_TOTAL PBDG_TOTAL
+ , PJBG.PBDG_COUNT PBDG_COUNT
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN ( SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM PROJECT_BUDGETS PJBD WHERE PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN PROJECT_BUDGETS PJBG ON PJBG.PROJ_ID=:PROJ_ID AND PJBG.ACM_CODE = ACTT.ACM_CODE
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , ACM_CODE
+ , PBDG_TOTAL
+ , PBDG_COUNT
+
+ FROM PROJECT_BUDGETS
+ ORDER BY PROJ_ID,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/bdgt-0501020.frml b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501020.frml
new file mode 100644
index 0000000..29e2565
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501020.frml
@@ -0,0 +1,766 @@
+
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+
+ SELECT PROJ_YEAR
+ , PROJ_ID
+ , STM_CODE
+ , STM_NAME
+ , PJM_CODE
+ , PJM_NAME
+ , FLOW_TYPE
+ , FLOW_TYPE_DESC
+ , PROJ_SEQ
+ , FLOW_STATE
+ , JDTOTT(SYSDATE - (DBMS_RANDOM.VALUE(3, 10))) STATE_DATE
+
+
+ FROM (SELECT DISTINCT :PROJ_YEAR PROJ_YEAR
+ , PROJ.PROJ_ID
+ , PROJ.STM_CODE STM_CODE
+ , BUD.GET_SECTION(PROJ.STM_CODE) STM_NAME
+ , PROJ.PJM_CODE PJM_CODE
+ , BUD.GET_PROJECT(PROJ.PJM_CODE) PJM_NAME
+ , FTYP.RFC_CODE FLOW_TYPE
+ , FTYP.RFC_DESC FLOW_TYPE_DESC
+ , FTYP.RFC_ORDER PROJ_SEQ
+ , BGT.FLOW_STATE('STEP-02') FLOW_STATE
+ FROM REFER_CODE FTYP
+ INNER JOIN REFER_CODE PTYPE ON PTYPE.RFG_GRP = 'PROJ-TYPE' AND PTYPE.RFC_FLAG = FTYP.RFC_CODE
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_TYPE = PTYPE.RFC_CODE
+ WHERE FTYP.RFG_GRP = 'FLOW-TYPE' AND FTYP.RFC_CODE = 'POLICY' AND PROJ.PROJ_YEAR = :PROJ_YEAR
+ ORDER BY STM_NAME) QR1
+
+ ORDER BY STM_NAME
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.PJM_CODE
+ , BUD.GET_PROJECT(PROJ.PJM_CODE) PROJ_NAME
+ , PROJ.STM_CODE
+ , BUD.GET_SECTION(PROJ.STM_CODE) STM_NAME
+ , PROJ.BTM_CODE
+ , PROJ.ACM_CODE
+ , BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , PROJ.PLAN_TYPE
+ , PROJ.PROJ_DURATION
+ , PROJ.PROJ_START_YEAR
+ , PROJ.PROJ_END_YEAR
+ , PROJ.PROJ_FOR_STAFF
+
+ , PROJ.PROJ_CATE
+ , PROJ.PROJ_KIND
+ , PROJ.PROJ_FROM_YEAR
+
+
+ FROM PROJECTS PROJ
+ WHERE PROJ_ID = :PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/bdgt-0501030-budget.frml b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501030-budget.frml
new file mode 100644
index 0000000..71d809f
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501030-budget.frml
@@ -0,0 +1,346 @@
+
+
+
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+ PROJ_ID,ACM_CODE
+
+
+ SELECT :PROJ_ID PROJ_ID
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PJBG.PBDG_TOTAL PBDG_TOTAL
+ , PJBG.PBDG_COUNT PBDG_COUNT
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN ( SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM PROJECT_BUDGETS PJBD WHERE PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN PROJECT_BUDGETS PJBG ON PJBG.PROJ_ID=:PROJ_ID AND PJBG.ACM_CODE = ACTT.ACM_CODE
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , ACM_CODE
+ , PBDG_TOTAL
+ , PBDG_COUNT
+
+ FROM PROJECT_BUDGETS
+ ORDER BY PROJ_ID,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/bdgt-0501030.frml b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501030.frml
new file mode 100644
index 0000000..f814623
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/bdgt-0501030.frml
@@ -0,0 +1,766 @@
+
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+
+ SELECT PROJ_YEAR
+ , PROJ_ID
+ , STM_CODE
+ , STM_NAME
+ , PJM_CODE
+ , PJM_NAME
+ , FLOW_TYPE
+ , FLOW_TYPE_DESC
+ , PROJ_SEQ
+ , FLOW_STATE
+ , JDTOTT(SYSDATE - (DBMS_RANDOM.VALUE(3, 10))) STATE_DATE
+
+
+ FROM (SELECT DISTINCT :PROJ_YEAR PROJ_YEAR
+ , PROJ.PROJ_ID
+ , PROJ.STM_CODE STM_CODE
+ , BUD.GET_SECTION(PROJ.STM_CODE) STM_NAME
+ , PROJ.PJM_CODE PJM_CODE
+ , BUD.GET_PROJECT(PROJ.PJM_CODE) PJM_NAME
+ , FTYP.RFC_CODE FLOW_TYPE
+ , FTYP.RFC_DESC FLOW_TYPE_DESC
+ , FTYP.RFC_ORDER PROJ_SEQ
+ , BGT.FLOW_STATE('STEP-02') FLOW_STATE
+ FROM REFER_CODE FTYP
+ INNER JOIN REFER_CODE PTYPE ON PTYPE.RFG_GRP = 'PROJ-TYPE' AND PTYPE.RFC_FLAG = FTYP.RFC_CODE
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_TYPE = PTYPE.RFC_CODE
+ WHERE FTYP.RFG_GRP = 'FLOW-TYPE' AND FTYP.RFC_CODE = 'IN-YEAR' AND PROJ.PROJ_YEAR = :PROJ_YEAR
+ ORDER BY STM_NAME) QR1
+
+ ORDER BY STM_NAME
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.PJM_CODE
+ , BUD.GET_PROJECT(PROJ.PJM_CODE) PROJ_NAME
+ , PROJ.STM_CODE
+ , BUD.GET_SECTION(PROJ.STM_CODE) STM_NAME
+ , PROJ.BTM_CODE
+ , PROJ.ACM_CODE
+ , BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , PROJ.PLAN_TYPE
+ , PROJ.PROJ_DURATION
+ , PROJ.PROJ_START_YEAR
+ , PROJ.PROJ_END_YEAR
+ , PROJ.PROJ_FOR_STAFF
+
+ , PROJ.PROJ_CATE
+ , PROJ.PROJ_KIND
+ , PROJ.PROJ_FROM_YEAR
+
+
+ FROM PROJECTS PROJ
+ WHERE PROJ_ID = :PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/grids/grid-construct-budget.frml b/DevResources/full-examples/bdgt05/view/frm/grids/grid-construct-budget.frml
new file mode 100644
index 0000000..5f3dc68
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/grids/grid-construct-budget.frml
@@ -0,0 +1,260 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+
+ SELECT :PROJ_ID PROJ_ID
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PBGI.PBDG_ID
+ , PBGI.BGM_CODE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_ASSET_TYPE
+ , PBGI.PBGI_REPLACE
+ , PBGI.PBGI_ADDITION
+ , PBGI.PBGI_ACQUIRE
+ , PBGI.PBGI_TOTAL
+ , PBGI.PBGI_REASON
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN ( SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT PBGI.PBDG_ID ACM_CODE FROM PROJECT_BUDGET_ITEMS PBGI WHERE PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.PBDG_ID = ACTT.ACM_CODE
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.acm_code}] : ${data.acm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/grids/grid-equipt-budget.frml b/DevResources/full-examples/bdgt05/view/frm/grids/grid-equipt-budget.frml
new file mode 100644
index 0000000..2d71eb9
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/grids/grid-equipt-budget.frml
@@ -0,0 +1,231 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT BGTT.BGM_CODE
+ , BGTT.BGM_NAME
+ , BGTT.BGM_UNIT
+ , BGTT.BGM_UNIT_RATE
+ , BGTT.NODE_LEVEL
+ , BGTT.BGM_SEQ
+ , BGTT.EXP_TYPE
+ , BGTT.MAIN_NODE
+ , BGTT.NODE_TYPE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_ASSET_TYPE
+ , PBGI.PBGI_REPLACE
+ , PBGI.PBGI_ADDITION
+ , PBGI.PBGI_ACQUIRE
+ , PBGI.PBGI_TOTAL
+ , PBGI.PBGI_REASON
+
+
+ FROM BGT.V_BUDGET_TREE BGTT
+ INNER JOIN (SELECT DISTINCT BGDM.BGM_CODE
+ FROM BUD.BUDGET_M BGDM
+ INNER JOIN BUD.BUDGET_M BGDH ON BGDM.BGM_CODE = BGDH.BGM_CODE
+ START WITH BGDM.BGM_CODE IN (SELECT PBGI.BGM_CODE FROM BGT.PROJECT_BUDGET_ITEMS PBGI WHERE PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID)
+ CONNECT BY PRIOR BGDH.BGM_MAIN_NODE = BGDH.BGM_CODE) FLTR ON FLTR.BGM_CODE = BGTT.BGM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.BGM_CODE = BGTT.BGM_CODE
+
+ ORDER BY BGTT.BGM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/grids/grid-manage-budget.frml b/DevResources/full-examples/bdgt05/view/frm/grids/grid-manage-budget.frml
new file mode 100644
index 0000000..532e586
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/grids/grid-manage-budget.frml
@@ -0,0 +1,222 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT BGTT.BGM_CODE
+ , BGTT.BGM_NAME
+ , BGTT.BGM_UNIT
+ , BGTT.BGM_UNIT_RATE
+ , BGTT.NODE_LEVEL
+ , BGTT.BGM_SEQ
+ , BGTT.EXP_TYPE
+ , BGTT.MAIN_NODE
+ , BGTT.NODE_TYPE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_ACQUIRE
+ , PBGI.PBGI_TOTAL
+
+
+ FROM BGT.V_BUDGET_TREE BGTT
+ INNER JOIN (SELECT DISTINCT BGDM.BGM_CODE
+ FROM BUD.BUDGET_M BGDM
+ INNER JOIN BUD.BUDGET_M BGDH ON BGDM.BGM_CODE = BGDH.BGM_CODE
+ START WITH BGDM.BGM_CODE IN (SELECT PBGI.BGM_CODE FROM BGT.PROJECT_BUDGET_ITEMS PBGI WHERE PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID)
+ CONNECT BY PRIOR BGDH.BGM_MAIN_NODE = BGDH.BGM_CODE) FLTR ON FLTR.BGM_CODE = BGTT.BGM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.BGM_CODE = BGTT.BGM_CODE AND PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID
+
+ ORDER BY BGTT.BGM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/grids/grid-proj-budget.frml b/DevResources/full-examples/bdgt05/view/frm/grids/grid-proj-budget.frml
new file mode 100644
index 0000000..f714ac1
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/grids/grid-proj-budget.frml
@@ -0,0 +1,213 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT BGTT.BGM_CODE
+ , BGTT.BGM_NAME
+ , BGTT.BGM_UNIT
+ , BGTT.BGM_UNIT_RATE
+ , BGTT.NODE_LEVEL
+ , BGTT.BGM_SEQ
+ , BGTT.EXP_TYPE
+ , BGTT.MAIN_NODE
+ , BGTT.NODE_TYPE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_TOTAL
+
+
+ FROM BGT.V_BUDGET_TREE BGTT
+ INNER JOIN (SELECT DISTINCT BGDM.BGM_CODE
+ FROM BUD.BUDGET_M BGDM
+ INNER JOIN BUD.BUDGET_M BGDH ON BGDM.BGM_CODE = BGDH.BGM_CODE
+ START WITH BGDM.BGM_CODE IN (SELECT PBGI.BGM_CODE FROM BGT.PROJECT_BUDGET_ITEMS PBGI WHERE PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID)
+ CONNECT BY PRIOR BGDH.BGM_MAIN_NODE = BGDH.BGM_CODE) FLTR ON FLTR.BGM_CODE = BGTT.BGM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.BGM_CODE = BGTT.BGM_CODE AND PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID
+
+ ORDER BY BGTT.BGM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/grids/grid-routine-budget.frml b/DevResources/full-examples/bdgt05/view/frm/grids/grid-routine-budget.frml
new file mode 100644
index 0000000..24a0aad
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/grids/grid-routine-budget.frml
@@ -0,0 +1,222 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT BGTT.BGM_CODE
+ , BGTT.BGM_NAME
+ , BGTT.BGM_UNIT
+ , BGTT.BGM_UNIT_RATE
+ , BGTT.NODE_LEVEL
+ , BGTT.BGM_SEQ
+ , BGTT.EXP_TYPE
+ , BGTT.MAIN_NODE
+ , BGTT.NODE_TYPE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_ACQUIRE
+ , PBGI.PBGI_TOTAL
+
+
+ FROM BGT.V_BUDGET_TREE BGTT
+ INNER JOIN (SELECT DISTINCT BGDM.BGM_CODE
+ FROM BUD.BUDGET_M BGDM
+ INNER JOIN BUD.BUDGET_M BGDH ON BGDM.BGM_CODE = BGDH.BGM_CODE
+ START WITH BGDM.BGM_CODE IN (SELECT PBGI.BGM_CODE FROM BGT.PROJECT_BUDGET_ITEMS PBGI WHERE PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID)
+ CONNECT BY PRIOR BGDH.BGM_MAIN_NODE = BGDH.BGM_CODE) FLTR ON FLTR.BGM_CODE = BGTT.BGM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.BGM_CODE = BGTT.BGM_CODE AND PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID
+
+ ORDER BY BGTT.BGM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/grids/grid-stratigy-item.frml b/DevResources/full-examples/bdgt05/view/frm/grids/grid-stratigy-item.frml
new file mode 100644
index 0000000..c581893
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/grids/grid-stratigy-item.frml
@@ -0,0 +1,86 @@
+
+
+
+
+ APP
+ PROJECT_STTGYS_ITEMS
+ PROJ_ID,PSTG_CODE,PSTI_GROUP
+
+
+ SELECT PSTI.PROJ_ID
+ , PSTI.PSTG_CODE
+ , PSTI.PSTI_GROUP
+ , RFGP.RFC_DESC GROUP_DESC
+ , PSTI.PSTI_CODE
+ , RFCI.RFC_DESC ITEM_DESC
+ , PSTI_DETAIL
+
+ FROM PROJECT_STTGYS_ITEMS PSTI
+ INNER JOIN BGT.REFER_CODE RFGP ON RFGP.RFG_GRP='STG-ITEMS' AND RFC.RFC_CODE=STTG.PSTI_CODE
+ INNER JOIN BGT.REFER_CODE RFCI ON RFC.RFG_GRP=PSTI.PSTI_GROUP AND RFC.RFC_CODE=STTG.PSTI_CODE
+
+ ORDER BY PSTI_GROUP, PSTI_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/grids/grid-stratigy.frml b/DevResources/full-examples/bdgt05/view/frm/grids/grid-stratigy.frml
new file mode 100644
index 0000000..7fcc58e
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/grids/grid-stratigy.frml
@@ -0,0 +1,75 @@
+
+
+
+
+ APP
+ PROJECT_STTGYS
+ PROJ_ID,PSTG_CODE
+
+
+ SELECT STTG.PROJ_ID
+ , STTG.PSTG_CODE
+ , RFC.RFC_DESC PSTG_DESC
+ , STTG.PSTG_CONCEPT
+
+
+ FROM PROJECT_STTGYS STTG
+ INNER JOIN BGT.REFER_CODE RFC ON RFC.RFG_GRP='STG-MAIN' AND RFC.RFC_CODE=STTG.PSTG_CODE
+
+ ORDER BY PSTG_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt05/view/frm/grids/grid-work-budget.frml b/DevResources/full-examples/bdgt05/view/frm/grids/grid-work-budget.frml
new file mode 100644
index 0000000..26b37e8
--- /dev/null
+++ b/DevResources/full-examples/bdgt05/view/frm/grids/grid-work-budget.frml
@@ -0,0 +1,174 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , BGM_CODE
+ , BUD.GET_BUDGET (BGM_CODE) BGM_NAME
+ , PBGI_QT_01
+ , PBGI_QT_02
+ , PBGI_QT_03
+ , PBGI_QT_04
+ , PBGI_QTY
+ , PBGI_COST
+ , PBGI_FREQ
+ , PBGI_ASSET_TYPE
+ , PBGI_REPLACE
+ , PBGI_ADDITION
+ , PBGI_ACQUIRE
+ , PBGI_TOTAL
+ , PBGI_REASON
+
+ FROM PROJECT_BUDGET_ITEMS
+ ORDER BY PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/defs/ajax.xml b/DevResources/full-examples/bdgt06/defs/ajax.xml
new file mode 100644
index 0000000..25237df
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/defs/ajax.xml
@@ -0,0 +1,201 @@
+
+
+
+ BUD
+ Main Activity
+ 100
+
+ SELECT PJM.PJM_CODE
+ , PJM.PJM_NAME
+ , PJM.PJM_JOB_TYPE
+ , PJM.PJM_WORK_PLAN
+ , PJM.PJM_PRODUCT
+ , PJM.PJM_GROUP_PLAN
+ , PJM.PJM_JOB_PROJECT
+ , PJM.PJM_STRATEGY
+ , PJM.PJM_ACTIVE
+
+ FROM PROJECT_M PJM
+
+ WHERE (PJM.PJM_CODE LIKE '%'||:SEARCH||'%' OR PJM.PJM_NAME LIKE '%'||:SEARCH||'%')
+
+
+
+
+
+
+
+ BUD
+ Main Activity
+ 100
+
+
+ SELECT ACM_CODE
+ , ACM_NAME
+ , NODE_LEVEL
+ , MAIN_NODE
+ , ACM_UNIT
+ , ACM_START_YEAR
+ , ACM_END_YEAR
+ , STM_CODE
+ , JBT_CODE
+ , JBP_CODE
+ , EXP_CODE
+ , PJM_CODE
+ , STG_CODE
+ , NODE_TYPE
+ , DECODE(NODE_TYPE,'C','true','') disabled
+
+ FROM BGT.V_ACTIVITY_TREE ACM
+
+ WHERE 0=0
+ AND (:DV_YEAR BETWEEN ACM_START_YEAR AND ACM_END_YEAR)
+ -- AND (ACM.STM_CODE = '%' OR ACM.STM_CODE = :STM_CODE)
+ AND (ACM.ACM_CODE LIKE '%'||:SEARCH||'%' OR ACM.ACM_NAME LIKE '%'||:SEARCH||'%')
+
+
+
+
+
+
+
+ BUD
+ Main Activity
+ 100
+
+
+ SELECT BGD.BGM_CODE
+ , BGD.BGM_NAME
+ , BGD.BGM_EXPENSE_TYPE
+ , BGD.BGM_UNIT
+ , BGD.BGM_UNIT_RATE
+ , BGD.BGM_ACTIVE
+ , BGD.BGM_PREPARE
+
+ FROM BUDGET_M BGD
+
+ WHERE (BGD.BGM_CODE LIKE '%'||:SEARCH||'%' OR BGD.BGM_NAME LIKE '%'||:SEARCH||'%')
+
+ ORDER BY BGM_CODE
+
+
+
+
+ APP
+
+ SELECT RFG_GRP
+ , RFC_CODE
+ , RFC_DESC
+ , RFC_FLAG
+ , RFC_ORDER
+
+ FROM REFER_CODE
+ WHERE (RFG_GRP = 'STG-ITEMS')
+ AND (RFC_CODE LIKE '%'||:SEARCH||'%' OR RFC_DESC LIKE '%'||:SEARCH||'%')
+ ORDER BY RFC_CODE
+
+
+
+
+ APP
+
+ SELECT RFG_GRP
+ , RFC_CODE
+ , RFC_DESC
+ , RFC_FLAG
+ , RFC_ORDER
+
+ FROM REFER_CODE
+ WHERE (RFG_GRP = :RFG_GRP)
+ AND (RFC_CODE LIKE '%'||:SEARCH||'%' OR RFC_DESC LIKE '%'||:SEARCH||'%')
+ ORDER BY RFC_CODE
+
+
+
+
+
+ BUD
+ Main Activity
+ 100
+
+
+ SELECT ACM_CODE
+ , ACM_NAME
+ , NODE_LEVEL
+ , MAIN_NODE
+ , ACM_UNIT
+ , ACM_START_YEAR
+ , ACM_END_YEAR
+ , STM_CODE
+ , JBT_CODE
+ , JBP_CODE
+ , EXP_CODE
+ , PJM_CODE
+ , STG_CODE
+ , NODE_TYPE
+ , DECODE(NODE_TYPE,'C','true','') disabled
+
+ FROM BGT.V_ACTIVITY_TREE ACM
+
+ WHERE 0=0
+ AND (:DV_YEAR BETWEEN ACM_START_YEAR AND ACM_END_YEAR)
+ -- AND (ACM.STM_CODE = '%' OR ACM.STM_CODE = :STM_CODE)
+ AND (ACM.ACM_CODE LIKE '%'||:SEARCH||'%' OR ACM.ACM_NAME LIKE '%'||:SEARCH||'%')
+
+
+
+
+
+
+
+ APP
+ Main Activity
+ 100
+
+
+ SELECT BGM.BGM_CODE
+ , BGM.BGM_NAME
+ , BGM.EXP_TYPE
+ , BGM.BGM_UNIT
+ , BGM.BGM_UNIT_RATE
+ , BGM.BGM_SEQ
+ , BGM.NODE_LEVEL
+ , BGM.MAIN_NODE
+ , DECODE(NODE_TYPE,'C','true','') disabled
+
+ FROM V_BUDGET_TREE BGM
+
+ WHERE (BGM.BGM_CODE LIKE '%'||:SEARCH||'%' OR BGM.BGM_NAME LIKE '%'||:SEARCH||'%')
+
+ ORDER BY BGM_SEQ
+
+
+
+
+
+
+ APP
+ Main Activity
+ 100
+
+
+ SELECT BGM.BGM_CODE
+ , BGM.BGM_NAME
+ , BGM.EXP_TYPE
+ , BGM.BGM_UNIT
+ , BGM.BGM_UNIT_RATE
+ , BGM.BGM_SEQ
+ , BGM.NODE_LEVEL
+ , BGM.MAIN_NODE
+ , DECODE(NODE_TYPE,'C','true','') disabled
+
+ FROM V_BUDGET_TREE BGM
+
+ WHERE (BGM_CODE LIKE '3.1%')
+ AND (BGM.BGM_CODE LIKE '%'||:SEARCH||'%' OR BGM.BGM_NAME LIKE '%'||:SEARCH||'%')
+
+ ORDER BY BGM_SEQ
+
+
+
+
\ No newline at end of file
diff --git a/DevResources/full-examples/bdgt06/view/bgt0601010-general.jsp b/DevResources/full-examples/bdgt06/view/bgt0601010-general.jsp
new file mode 100644
index 0000000..0067c91
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/bgt0601010-general.jsp
@@ -0,0 +1,51 @@
+<%@ page import="org.apache.commons.codec.*" %>
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ String _formId = "bdgt-0601010/general";
+ try {
+ String data = factory.rqsCtx.getParameter("data","");
+ if (!data.isBlank()) {
+ data = JUtils.decBase64(data);
+ data = URLDecoder.decode(data, CharEncoding.UTF_8);
+
+ boolean isEditMode = factory.rqsCtx.isPostParam("add") || factory.rqsCtx.isPostParam("edit") || factory.rqsCtx.isPostParam("view");
+ JSONObject jsData = new JSONObject(data);
+ String type = jsData.getString("type");
+ String acmCode = jsData.getString("acm_code");
+ String projId = jsData.getString("proj_id");
+
+ if (isEditMode && type.equals("rutn")) {
+ _formId = "bdgt-0601010/routine";
+ } else if (isEditMode && type.equals("mngt")) {
+ _formId = "bdgt-0601010/manage";
+ } else if (isEditMode && type.equals("eqpt")) {
+ _formId = "bdgt-0601010/equipt";
+ } else if (isEditMode && type.equals("cnst")) {
+ _formId = "bdgt-0601010/construct";
+ }
+
+ dynForm = new DynForm(application, request, response, "bdgt06", _formId);
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("ACM_CODE",acmCode);
+ dynForm.setFormvar("PROJ_ID",projId);
+ } else {
+ dynForm = new DynForm(application, request, response, "bdgt06", _formId);
+ }
+
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+
+ if (dynForm.workIn(WorkMode.Editing)) {
+ factory.pageCtx.addWidget(DynConstants.PageWidget.FileBox);
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt06/view/bgt0601010.jsp b/DevResources/full-examples/bdgt06/view/bgt0601010.jsp
new file mode 100644
index 0000000..ddaceb7
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/bgt0601010.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt06", "bdgt-0601010");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+// dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt06/view/bgt0601020-budget.jsp b/DevResources/full-examples/bdgt06/view/bgt0601020-budget.jsp
new file mode 100644
index 0000000..d82ae47
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/bgt0601020-budget.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt06", "bdgt-0601020-budget");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt06/view/bgt0601020.jsp b/DevResources/full-examples/bdgt06/view/bgt0601020.jsp
new file mode 100644
index 0000000..64b80f2
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/bgt0601020.jsp
@@ -0,0 +1,20 @@
+<%@ page contentType="text/html; charset=UTF-8" language="java" %>
+<%@ include file="/WEB-INF/app/system/dynf/dynfSysInfo.jsp" %>
+
+
+<%
+ try {
+ dynForm = new DynForm(application, request, response, "bdgt06", "bdgt-0601020");
+ dynForm.setFormOwner(request.getRequestURL().toString());
+ dynForm.setFormvar("STM_CODE",factory.user.getUSER_DEPT_CODE());
+ if (dynForm.workIn(WorkMode.Editing)) {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataEdit.jsp" %><%
+ } else {
+ %><%@ include file="/WEB-INF/app/system/dynf/dynfDataList.jsp" %><%
+ }
+ } catch (Exception ex) {
+ factory.setRestCode("ERROR");
+ factory.setRestMsg(ex.getMessage() + "\n" + JUtils.stackToString(ex,16));
+ logger.error(ex.getMessage(),ex);
+ }
+%>
diff --git a/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010.frml b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010.frml
new file mode 100644
index 0000000..101b8e0
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010.frml
@@ -0,0 +1,100 @@
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+
+ SELECT PROJ_YEAR
+ , STM_CODE
+ , STM_NAME
+ , FLOW_TYPE
+ , FLOW_TYPE_DESC
+ , PROJ_SEQ
+ , FLOW_STATE
+ , JDTOTT(SYSDATE - (DBMS_RANDOM.VALUE(3, 10))) STATE_DATE
+ , CAST(DBMS_RANDOM.VALUE(50, 80) AS INTEGER) PROJ_COUNT
+ , CAST(DBMS_RANDOM.VALUE(20,45) AS INTEGER) PROJ_ALLOW
+
+
+ FROM (SELECT DISTINCT :PROJ_YEAR PROJ_YEAR
+ , PROJ.STM_CODE STM_CODE
+ , BUD.GET_SECTION(PROJ.STM_CODE) STM_NAME
+ , FTYP.RFC_CODE FLOW_TYPE
+ , FTYP.RFC_DESC FLOW_TYPE_DESC
+ , FTYP.RFC_ORDER PROJ_SEQ
+ , BGT.FLOW_STATE('STEP-02') FLOW_STATE
+ FROM REFER_CODE FTYP
+ INNER JOIN REFER_CODE PTYPE ON PTYPE.RFG_GRP = 'PROJ-TYPE' AND PTYPE.RFC_FLAG = FTYP.RFC_CODE
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_TYPE = PTYPE.RFC_CODE
+ WHERE FTYP.RFG_GRP = 'FLOW-TYPE' AND FTYP.RFC_CODE = 'GENERAL' AND PROJ.PROJ_YEAR = :PROJ_YEAR
+ ORDER BY STM_NAME) QR1
+
+ ORDER BY STM_NAME
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/construct.frml b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/construct.frml
new file mode 100644
index 0000000..9a630e6
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/construct.frml
@@ -0,0 +1,322 @@
+
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+ SELECT PROJ_ID
+ , PROJ_TYPE
+ , PROJ_YEAR
+ , PJM_CODE
+ , STM_CODE
+ , BTM_CODE
+ , ACM_CODE
+ , BUD.GET_ACTIVITY(ACM_CODE) ACM_NAME
+ , PLAN_TYPE
+ , PROJ_DURATION
+ , PROJ_INST_COUNT
+ , PROJ_START_YEAR
+ , PROJ_END_YEAR
+ , PROJ_FOR_STAFF
+ , PROJ_FROM_YEAR
+ , CREATE_BY
+ , CREATE_TIME
+ , UPDATE_BY
+ , UPDATE_TIME
+
+ FROM PROJECTS
+ WHERE PROJ_ID = :PROJ_ID
+ ORDER BY PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_CONST_INFO
+ PROJ_ID,ACM_CODE
+
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PCTI_ADDRESS
+ , PCTI_TUMBON
+ , PCTI_AMPUR
+ , PCTI_PROVINCE
+ , PCTI_ADDR_NOTE
+ , PCTI_AREA
+ , PCTI_EMP_COUNT
+ , PCTI_CHK_LOCATION
+ , PCTI_CHK_DOCUMENT
+ , PCTI_REMARK
+ , CREATE_BY
+ , JDTOE(CREATE_TIME) CREATE_TIME, CREATE_TIME DT_CREATE_TIME
+ , UPDATE_BY
+ , JDTOE(UPDATE_TIME) UPDATE_TIME, UPDATE_TIME DT_UPDATE_TIME
+
+ FROM PROJECT_CONST_INFO
+ ORDER BY PROJ_ID, ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/equipt.frml b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/equipt.frml
new file mode 100644
index 0000000..6672ee0
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/equipt.frml
@@ -0,0 +1,340 @@
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PBDG.PROJ_ID
+ , PBDG.PBDG_ID
+ , PBDG.ACM_CODE
+ , BUD.GET_ACTIVITY(PBDG.ACM_CODE) ACM_NAME
+ , PBDG.PBDG_TOTAL
+ , PBDG.PBDG_COUNT
+ , PBDG.PBDG_ASSET_TYPE
+ , PBDG.PBDG_REASON
+ , PMAS.PROJ_YEAR
+ , PMAS.STM_CODE
+ , PMAS.PROJ_YEAR||'/'||PMAS.STM_CODE||'/'||PBDG.PROJ_ID FILEPATH
+
+ FROM PROJECT_BUDGETS PBDG
+ INNER JOIN PROJECTS PMAS ON PMAS.PROJ_ID = PBDG.PROJ_ID
+
+ ORDER BY PROJ_ID,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , BGM_CODE
+ , PBGI_QT_01
+ , PBGI_QT_02
+ , PBGI_QT_03
+ , PBGI_QT_04
+ , PBGI_QTY
+ , PBGI_COST
+ , PBGI_FREQ
+ , PBGI_ASSET_TYPE
+ , PBGI_REPLACE
+ , PBGI_ADDITION
+ , PBGI_ACQUIRE
+ , PBGI_TOTAL
+ , PBGI_REASON
+
+ FROM PROJECT_BUDGET_ITEMS
+ ORDER BY PROJ_ID,BGM_CODE,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/general.frml b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/general.frml
new file mode 100644
index 0000000..2205bcc
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/general.frml
@@ -0,0 +1,267 @@
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.PJM_CODE
+ , PROJ.STM_CODE
+ , PROJ.BTM_CODE
+ , PROJ.ACM_CODE
+ , BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , PROJ.PLAN_TYPE
+ , PROJ.PROJ_DURATION
+ , PROJ.PROJ_START_YEAR
+ , PROJ.PROJ_END_YEAR
+ , PROJ.PROJ_FOR_STAFF
+
+ , PROJ.PROJ_FROM_YEAR
+ , 0 BDGT_TOTAL
+
+ FROM PROJECTS PROJ
+ INNER JOIN REFER_CODE RFC ON RFC.RFG_GRP='PROJ-TYPE' AND RFC.RFC_CODE=PROJ.PROJ_TYPE AND RFC.RFC_FLAG = 'GENERAL'
+
+ WHERE STM_CODE = :STM_CODE AND PROJ.PROJ_YEAR = :PROJ_YEAR
+ ORDER BY RFC.RFC_ORDER, PROJ.PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+
+
+ SELECT PACT.PROJ_ID
+ , PACT.PROJ_YEAR
+ , PACT.PROJ_TYPE
+ , PACT.PROJ_GROUP
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL+1 NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PACT.BDGT_COUNT
+ , PACT.BDGT_TOTAL
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN (SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM V_PROJECT_ACTIVITY PACT WHERE PACT.PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN V_PROJECT_ACTIVITY PACT ON PACT.ACM_CODE = ACTT.ACM_CODE AND PACT.PROJ_ID = :PROJ_ID
+
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/manage.frml b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/manage.frml
new file mode 100644
index 0000000..1425c96
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/manage.frml
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PBDG.PROJ_ID
+ , PROJ.PROJ_YEAR
+ , PBDG.PBDG_ID
+ , PBDG.ACM_CODE
+ , BUD.GET_ACTIVITY(PBDG.ACM_CODE) ACM_NAME
+ , PBDG.PBDG_TOTAL
+ , PBDG.PBDG_COUNT
+
+ FROM PROJECT_BUDGETS PBDG
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_ID=PBDG.PROJ_ID
+
+ ORDER BY PBDG.PROJ_ID,PBDG.PBDG_ID
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/routine.frml b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/routine.frml
new file mode 100644
index 0000000..9ecaeb4
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601010/routine.frml
@@ -0,0 +1,259 @@
+
+
+
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PBDG.PROJ_ID
+ , PROJ.PROJ_YEAR
+ , PBDG.PBDG_ID
+ , PBDG.ACM_CODE
+ , BUD.GET_ACTIVITY(PBDG.ACM_CODE) ACM_NAME
+ , PBDG.PBDG_TOTAL
+ , PBDG.PBDG_COUNT
+
+ FROM PROJECT_BUDGETS PBDG
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_ID=PBDG.PROJ_ID
+
+ ORDER BY PBDG.PROJ_ID,PBDG.PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/bdgt-0601020-budget.frml b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601020-budget.frml
new file mode 100644
index 0000000..5bd0861
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601020-budget.frml
@@ -0,0 +1,315 @@
+
+
+
+
+
+
+
+ APP
+ V_ACTIVITY_TREE
+ PROJ_ID,ACM_CODE
+
+
+ SELECT :PROJ_ID PROJ_ID
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PJBG.PBDG_TOTAL PBDG_TOTAL
+ , PJBG.PBDG_COUNT PBDG_COUNT
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN ( SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM PROJECT_BUDGETS PJBD WHERE PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN PROJECT_BUDGETS PJBG ON PJBG.PROJ_ID=:PROJ_ID AND PJBG.ACM_CODE = ACTT.ACM_CODE
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+ APP
+ PROJECT_BUDGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , ACM_CODE
+ , PBDG_TOTAL
+ , PBDG_COUNT
+
+ FROM PROJECT_BUDGETS
+ ORDER BY PROJ_ID,PBDG_ID
+
+
+
+
+
+
+
+
+
+
+
+ APP
+ PROJECT_TARGETS
+ PROJ_ID,ACM_CODE
+
+ SELECT PROJ_ID
+ , ACM_CODE
+ , PWMT_UNIT
+ , PTGT_QT_0101
+ , PTGT_QT_0102
+ , PTGT_QT_0201
+ , PTGT_QT_0202
+ , PTGT_QT_0301
+ , PTGT_QT_0302
+ , PTGT_QT_0401
+ , PTGT_QT_0402
+
+ FROM PROJECT_TARGETS
+ ORDER BY PROJ_ID,ACM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/bdgt-0601020.frml b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601020.frml
new file mode 100644
index 0000000..fe8cf0d
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/bdgt-0601020.frml
@@ -0,0 +1,758 @@
+
+
+
+
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+
+ SELECT PROJ_YEAR
+ , PROJ_ID
+ , STM_CODE
+ , STM_NAME
+ , PJM_CODE
+ , PJM_NAME
+ , FLOW_TYPE
+ , FLOW_TYPE_DESC
+ , PROJ_SEQ
+ , FLOW_STATE
+ , JDTOTT(SYSDATE - (DBMS_RANDOM.VALUE(3, 10))) STATE_DATE
+ , 'อยู่ระหว่างพิจารณา' PROJ_ALLOW
+
+
+ FROM (SELECT DISTINCT :PROJ_YEAR PROJ_YEAR
+ , PROJ.PROJ_ID
+ , PROJ.STM_CODE STM_CODE
+ , BUD.GET_SECTION(PROJ.STM_CODE) STM_NAME
+ , PROJ.PJM_CODE PJM_CODE
+ , BUD.GET_PROJECT(PROJ.PJM_CODE) PJM_NAME
+ , FTYP.RFC_CODE FLOW_TYPE
+ , FTYP.RFC_DESC FLOW_TYPE_DESC
+ , FTYP.RFC_ORDER PROJ_SEQ
+ , BGT.FLOW_STATE('STEP-02') FLOW_STATE
+ FROM REFER_CODE FTYP
+ INNER JOIN REFER_CODE PTYPE ON PTYPE.RFG_GRP = 'PROJ-TYPE' AND PTYPE.RFC_FLAG = FTYP.RFC_CODE
+ INNER JOIN PROJECTS PROJ ON PROJ.PROJ_TYPE = PTYPE.RFC_CODE
+ WHERE FTYP.RFG_GRP = 'FLOW-TYPE' AND FTYP.RFC_CODE = 'POLICY' AND PROJ.PROJ_YEAR = :PROJ_YEAR
+ ORDER BY STM_NAME) QR1
+
+ ORDER BY STM_NAME
+
+
+
+
+ APP
+ PROJECTS
+ PROJ_ID
+
+
+ SELECT PROJ.PROJ_ID
+ , PROJ.PROJ_TYPE
+ , PROJ.PROJ_YEAR
+ , PROJ.PJM_CODE
+ , BUD.GET_PROJECT(PROJ.PJM_CODE) PROJ_NAME
+ , PROJ.STM_CODE
+ , BUD.GET_SECTION(PROJ.STM_CODE) STM_NAME
+ , PROJ.BTM_CODE
+ , PROJ.ACM_CODE
+ , BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
+ , PROJ.PLAN_TYPE
+ , PROJ.PROJ_DURATION
+ , PROJ.PROJ_START_YEAR
+ , PROJ.PROJ_END_YEAR
+ , PROJ.PROJ_FOR_STAFF
+
+ , PROJ.PROJ_CATE
+ , PROJ.PROJ_KIND
+ , PROJ.PROJ_FROM_YEAR
+
+
+ FROM PROJECTS PROJ
+ WHERE PROJ_ID = :PROJ_ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/grids/grid-construct-budget.frml b/DevResources/full-examples/bdgt06/view/frm/grids/grid-construct-budget.frml
new file mode 100644
index 0000000..5f3dc68
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/grids/grid-construct-budget.frml
@@ -0,0 +1,260 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+
+ SELECT :PROJ_ID PROJ_ID
+ , ACTT.ACM_CODE
+ , ACTT.ACM_NAME
+ , ACTT.ACM_SEQ
+ , ACTT.NODE_LEVEL
+ , ACTT.MAIN_NODE
+ , ACTT.ACM_UNIT
+ , ACTT.ACM_START_YEAR
+ , ACTT.ACM_END_YEAR
+ , ACTT.NODE_TYPE
+ , PBGI.PBDG_ID
+ , PBGI.BGM_CODE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_ASSET_TYPE
+ , PBGI.PBGI_REPLACE
+ , PBGI.PBGI_ADDITION
+ , PBGI.PBGI_ACQUIRE
+ , PBGI.PBGI_TOTAL
+ , PBGI.PBGI_REASON
+
+
+ FROM BGT.V_ACTIVITY_TREE ACTT
+ INNER JOIN ( SELECT DISTINCT ACM.ACM_CODE
+ FROM BUD.ACTIVITY_M ACM
+ INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
+ START WITH ACM.ACM_CODE IN (SELECT PBGI.PBDG_ID ACM_CODE FROM PROJECT_BUDGET_ITEMS PBGI WHERE PROJ_ID = :PROJ_ID)
+ CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.PBDG_ID = ACTT.ACM_CODE
+
+ ORDER BY ACTT.ACM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.acm_code}] : ${data.acm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/grids/grid-equipt-budget.frml b/DevResources/full-examples/bdgt06/view/frm/grids/grid-equipt-budget.frml
new file mode 100644
index 0000000..2d71eb9
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/grids/grid-equipt-budget.frml
@@ -0,0 +1,231 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT BGTT.BGM_CODE
+ , BGTT.BGM_NAME
+ , BGTT.BGM_UNIT
+ , BGTT.BGM_UNIT_RATE
+ , BGTT.NODE_LEVEL
+ , BGTT.BGM_SEQ
+ , BGTT.EXP_TYPE
+ , BGTT.MAIN_NODE
+ , BGTT.NODE_TYPE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_ASSET_TYPE
+ , PBGI.PBGI_REPLACE
+ , PBGI.PBGI_ADDITION
+ , PBGI.PBGI_ACQUIRE
+ , PBGI.PBGI_TOTAL
+ , PBGI.PBGI_REASON
+
+
+ FROM BGT.V_BUDGET_TREE BGTT
+ INNER JOIN (SELECT DISTINCT BGDM.BGM_CODE
+ FROM BUD.BUDGET_M BGDM
+ INNER JOIN BUD.BUDGET_M BGDH ON BGDM.BGM_CODE = BGDH.BGM_CODE
+ START WITH BGDM.BGM_CODE IN (SELECT PBGI.BGM_CODE FROM BGT.PROJECT_BUDGET_ITEMS PBGI WHERE PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID)
+ CONNECT BY PRIOR BGDH.BGM_MAIN_NODE = BGDH.BGM_CODE) FLTR ON FLTR.BGM_CODE = BGTT.BGM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.BGM_CODE = BGTT.BGM_CODE
+
+ ORDER BY BGTT.BGM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/grids/grid-manage-budget.frml b/DevResources/full-examples/bdgt06/view/frm/grids/grid-manage-budget.frml
new file mode 100644
index 0000000..532e586
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/grids/grid-manage-budget.frml
@@ -0,0 +1,222 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT BGTT.BGM_CODE
+ , BGTT.BGM_NAME
+ , BGTT.BGM_UNIT
+ , BGTT.BGM_UNIT_RATE
+ , BGTT.NODE_LEVEL
+ , BGTT.BGM_SEQ
+ , BGTT.EXP_TYPE
+ , BGTT.MAIN_NODE
+ , BGTT.NODE_TYPE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_ACQUIRE
+ , PBGI.PBGI_TOTAL
+
+
+ FROM BGT.V_BUDGET_TREE BGTT
+ INNER JOIN (SELECT DISTINCT BGDM.BGM_CODE
+ FROM BUD.BUDGET_M BGDM
+ INNER JOIN BUD.BUDGET_M BGDH ON BGDM.BGM_CODE = BGDH.BGM_CODE
+ START WITH BGDM.BGM_CODE IN (SELECT PBGI.BGM_CODE FROM BGT.PROJECT_BUDGET_ITEMS PBGI WHERE PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID)
+ CONNECT BY PRIOR BGDH.BGM_MAIN_NODE = BGDH.BGM_CODE) FLTR ON FLTR.BGM_CODE = BGTT.BGM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.BGM_CODE = BGTT.BGM_CODE AND PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID
+
+ ORDER BY BGTT.BGM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/grids/grid-proj-budget.frml b/DevResources/full-examples/bdgt06/view/frm/grids/grid-proj-budget.frml
new file mode 100644
index 0000000..f714ac1
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/grids/grid-proj-budget.frml
@@ -0,0 +1,213 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT BGTT.BGM_CODE
+ , BGTT.BGM_NAME
+ , BGTT.BGM_UNIT
+ , BGTT.BGM_UNIT_RATE
+ , BGTT.NODE_LEVEL
+ , BGTT.BGM_SEQ
+ , BGTT.EXP_TYPE
+ , BGTT.MAIN_NODE
+ , BGTT.NODE_TYPE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_TOTAL
+
+
+ FROM BGT.V_BUDGET_TREE BGTT
+ INNER JOIN (SELECT DISTINCT BGDM.BGM_CODE
+ FROM BUD.BUDGET_M BGDM
+ INNER JOIN BUD.BUDGET_M BGDH ON BGDM.BGM_CODE = BGDH.BGM_CODE
+ START WITH BGDM.BGM_CODE IN (SELECT PBGI.BGM_CODE FROM BGT.PROJECT_BUDGET_ITEMS PBGI WHERE PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID)
+ CONNECT BY PRIOR BGDH.BGM_MAIN_NODE = BGDH.BGM_CODE) FLTR ON FLTR.BGM_CODE = BGTT.BGM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.BGM_CODE = BGTT.BGM_CODE AND PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID
+
+ ORDER BY BGTT.BGM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/grids/grid-routine-budget.frml b/DevResources/full-examples/bdgt06/view/frm/grids/grid-routine-budget.frml
new file mode 100644
index 0000000..24a0aad
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/grids/grid-routine-budget.frml
@@ -0,0 +1,222 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT BGTT.BGM_CODE
+ , BGTT.BGM_NAME
+ , BGTT.BGM_UNIT
+ , BGTT.BGM_UNIT_RATE
+ , BGTT.NODE_LEVEL
+ , BGTT.BGM_SEQ
+ , BGTT.EXP_TYPE
+ , BGTT.MAIN_NODE
+ , BGTT.NODE_TYPE
+ , PBGI.PBGI_QTY
+ , PBGI.PBGI_FREQ
+ , PBGI.PBGI_COST
+ , PBGI.PBGI_ACQUIRE
+ , PBGI.PBGI_TOTAL
+
+
+ FROM BGT.V_BUDGET_TREE BGTT
+ INNER JOIN (SELECT DISTINCT BGDM.BGM_CODE
+ FROM BUD.BUDGET_M BGDM
+ INNER JOIN BUD.BUDGET_M BGDH ON BGDM.BGM_CODE = BGDH.BGM_CODE
+ START WITH BGDM.BGM_CODE IN (SELECT PBGI.BGM_CODE FROM BGT.PROJECT_BUDGET_ITEMS PBGI WHERE PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID)
+ CONNECT BY PRIOR BGDH.BGM_MAIN_NODE = BGDH.BGM_CODE) FLTR ON FLTR.BGM_CODE = BGTT.BGM_CODE
+ LEFT OUTER JOIN BGT.PROJECT_BUDGET_ITEMS PBGI ON PBGI.BGM_CODE = BGTT.BGM_CODE AND PBGI.PROJ_ID = :PROJ_ID AND PBGI.PBDG_ID = :PBDG_ID
+
+ ORDER BY BGTT.BGM_SEQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+ {return $(`${value}
`);}]]>
+
+
+
+
+
+
+
+
+
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+ {return row["node_type"] !== "C"}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/grids/grid-stratigy-item.frml b/DevResources/full-examples/bdgt06/view/frm/grids/grid-stratigy-item.frml
new file mode 100644
index 0000000..c581893
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/grids/grid-stratigy-item.frml
@@ -0,0 +1,86 @@
+
+
+
+
+ APP
+ PROJECT_STTGYS_ITEMS
+ PROJ_ID,PSTG_CODE,PSTI_GROUP
+
+
+ SELECT PSTI.PROJ_ID
+ , PSTI.PSTG_CODE
+ , PSTI.PSTI_GROUP
+ , RFGP.RFC_DESC GROUP_DESC
+ , PSTI.PSTI_CODE
+ , RFCI.RFC_DESC ITEM_DESC
+ , PSTI_DETAIL
+
+ FROM PROJECT_STTGYS_ITEMS PSTI
+ INNER JOIN BGT.REFER_CODE RFGP ON RFGP.RFG_GRP='STG-ITEMS' AND RFC.RFC_CODE=STTG.PSTI_CODE
+ INNER JOIN BGT.REFER_CODE RFCI ON RFC.RFG_GRP=PSTI.PSTI_GROUP AND RFC.RFC_CODE=STTG.PSTI_CODE
+
+ ORDER BY PSTI_GROUP, PSTI_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/grids/grid-stratigy.frml b/DevResources/full-examples/bdgt06/view/frm/grids/grid-stratigy.frml
new file mode 100644
index 0000000..7fcc58e
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/grids/grid-stratigy.frml
@@ -0,0 +1,75 @@
+
+
+
+
+ APP
+ PROJECT_STTGYS
+ PROJ_ID,PSTG_CODE
+
+
+ SELECT STTG.PROJ_ID
+ , STTG.PSTG_CODE
+ , RFC.RFC_DESC PSTG_DESC
+ , STTG.PSTG_CONCEPT
+
+
+ FROM PROJECT_STTGYS STTG
+ INNER JOIN BGT.REFER_CODE RFC ON RFC.RFG_GRP='STG-MAIN' AND RFC.RFC_CODE=STTG.PSTG_CODE
+
+ ORDER BY PSTG_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
diff --git a/DevResources/full-examples/bdgt06/view/frm/grids/grid-work-budget.frml b/DevResources/full-examples/bdgt06/view/frm/grids/grid-work-budget.frml
new file mode 100644
index 0000000..26b37e8
--- /dev/null
+++ b/DevResources/full-examples/bdgt06/view/frm/grids/grid-work-budget.frml
@@ -0,0 +1,174 @@
+
+
+
+
+ APP
+ PROJECT_BUDGET_ITEMS
+ PROJ_ID,BGM_CODE,PBDG_ID
+
+ SELECT PROJ_ID
+ , PBDG_ID
+ , BGM_CODE
+ , BUD.GET_BUDGET (BGM_CODE) BGM_NAME
+ , PBGI_QT_01
+ , PBGI_QT_02
+ , PBGI_QT_03
+ , PBGI_QT_04
+ , PBGI_QTY
+ , PBGI_COST
+ , PBGI_FREQ
+ , PBGI_ASSET_TYPE
+ , PBGI_REPLACE
+ , PBGI_ADDITION
+ , PBGI_ACQUIRE
+ , PBGI_TOTAL
+ , PBGI_REASON
+
+ FROM PROJECT_BUDGET_ITEMS
+ ORDER BY PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROJ_ID,BGM_CODE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ console.log("call formater with ", data);
+ return $(`[${data.bgm_code}] : ${data.bgm_name}
`);
+ }
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
diff --git a/build.gradle.kts b/build.gradle.kts
index 1abcc2c..75c14ee 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -115,4 +115,4 @@ tasks {
// publishPlugin {
// token.set(System.getenv("PUBLISH_TOKEN"))
// }
-}
\ No newline at end of file
+}
diff --git a/entities.json b/entities.json
new file mode 100644
index 0000000..4352d8c
--- /dev/null
+++ b/entities.json
@@ -0,0 +1,6 @@
+{
+ "people": [],
+ "projects": [
+ "Java"
+ ]
+}
\ No newline at end of file
diff --git a/mempalace.yaml b/mempalace.yaml
new file mode 100644
index 0000000..8176e1f
--- /dev/null
+++ b/mempalace.yaml
@@ -0,0 +1,10 @@
+wing: dynamicform
+rooms:
+- name: devresources
+ description: Files from DevResources/
+- name: gradle
+ description: Files from gradle/
+- name: src
+ description: Files from src/
+- name: general
+ description: Files that don't fit other rooms
diff --git a/src/main/java/com/sdk/dynform/tools/helper/DynFormCompletionContributor.java b/src/main/java/com/sdk/dynform/tools/helper/DynFormCompletionContributor.java
index bf32f8e..af1acc8 100644
--- a/src/main/java/com/sdk/dynform/tools/helper/DynFormCompletionContributor.java
+++ b/src/main/java/com/sdk/dynform/tools/helper/DynFormCompletionContributor.java
@@ -3,15 +3,22 @@ package com.sdk.dynform.tools.helper;
import com.intellij.codeInsight.completion.*;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.patterns.PlatformPatterns;
+import com.intellij.patterns.XmlPatterns;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.xml.XmlAttribute;
+import com.intellij.psi.xml.XmlFile;
+import com.intellij.psi.xml.XmlTag;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
public class DynFormCompletionContributor extends CompletionContributor {
public DynFormCompletionContributor() {
+ // Java completion
extend(CompletionType.BASIC, PlatformPatterns.psiElement().withParent(PsiLiteralExpression.class),
new CompletionProvider() {
@Override
@@ -27,7 +34,6 @@ public class DynFormCompletionContributor extends CompletionContributor {
PsiExpressionList argList = newExp.getArgumentList();
if (argList != null) {
PsiExpression[] args = argList.getExpressions();
- // Suggest modules at index 3
if (args.length >= 4 && args[3] == literal) {
List modules = DynFormPathUtils.getAllModules(position.getProject());
for (String module : modules) {
@@ -35,7 +41,6 @@ public class DynFormCompletionContributor extends CompletionContributor {
.withIcon(com.intellij.icons.AllIcons.Nodes.Module));
}
}
- // Suggest frml files at index 4
if (args.length >= 5 && args[4] == literal) {
String moduleName = getArgumentValue(args, 3);
if (moduleName != null) {
@@ -50,6 +55,191 @@ public class DynFormCompletionContributor extends CompletionContributor {
}
}
});
+
+ // XML completion for Field/Section NAME/ID/TARGET
+ extend(CompletionType.BASIC, XmlPatterns.psiElement()
+ .inside(XmlPatterns.xmlAttributeValue()
+ .withParent(XmlPatterns.xmlAttribute().withName("NAME", "ID", "TARGET")
+ .withParent(XmlPatterns.xmlTag().withName("FIELD", "SECTION")))),
+ new CompletionProvider() {
+ @Override
+ protected void addCompletions(@NotNull CompletionParameters parameters,
+ @NotNull ProcessingContext context,
+ @NotNull CompletionResultSet resultSet) {
+ PsiElement position = parameters.getPosition();
+ XmlAttribute attr = PsiTreeUtil.getParentOfType(position, XmlAttribute.class);
+ if (attr == null) return;
+
+ if ("TARGET".equals(attr.getName())) {
+ // เสนอฟิลด์ในฟอร์มปัจจุบัน
+ XmlTag formContainer = PsiTreeUtil.getParentOfType(position, XmlTag.class);
+ while (formContainer != null && !"FORM_ENTRY".equals(formContainer.getName()) && !"FORM_BROWSE".equals(formContainer.getName())) {
+ formContainer = formContainer.getParentTag();
+ }
+
+ if (formContainer == null) {
+ XmlFile file = (XmlFile) parameters.getOriginalFile();
+ formContainer = file.getRootTag();
+ }
+
+ if (formContainer != null) {
+ addFieldsInTagRecursive(formContainer, resultSet);
+ }
+ } else {
+ // เสนอฟิลด์ภายใต้ LAYOUT container เดียวกัน
+ XmlTag layoutTag = PsiTreeUtil.getParentOfType(position, XmlTag.class);
+ while (layoutTag != null && !"LAYOUT".equals(layoutTag.getName())) {
+ layoutTag = layoutTag.getParentTag();
+ }
+ if (layoutTag == null) return;
+ XmlTag containerTag = layoutTag.getParentTag();
+ if (containerTag == null) return;
+ XmlTag fieldsTag = containerTag.findFirstSubTag("FIELDS");
+ if (fieldsTag != null) {
+ addFieldsInTagRecursive(fieldsTag, resultSet);
+ }
+ }
+ }
+ });
+
+ // XML completion for Dataset ID
+ extend(CompletionType.BASIC, XmlPatterns.psiElement()
+ .inside(XmlPatterns.xmlAttributeValue()
+ .withParent(XmlPatterns.xmlAttribute().withName("DATAID", "DATASET", "DATASET-ID"))),
+ new CompletionProvider() {
+ @Override
+ protected void addCompletions(@NotNull CompletionParameters parameters,
+ @NotNull ProcessingContext context,
+ @NotNull CompletionResultSet resultSet) {
+ addDatasetsInFile(parameters.getOriginalFile(), resultSet);
+ PsiFile ajaxFile = DynFormPathUtils.findAjaxXml(parameters.getOriginalFile());
+ if (ajaxFile != null) {
+ addDatasetsInFile(ajaxFile, resultSet);
+ }
+ }
+ });
+
+ // XML completion for SRC in UPDATE-FIELDS
+ extend(CompletionType.BASIC, XmlPatterns.psiElement()
+ .inside(XmlPatterns.xmlAttributeValue()
+ .withParent(XmlPatterns.xmlAttribute().withName("SRC")
+ .withParent(XmlPatterns.xmlTag().withName("FIELD")
+ .withParent(XmlPatterns.xmlTag().withName("UPDATE-FIELDS"))))),
+ new CompletionProvider() {
+ @Override
+ protected void addCompletions(@NotNull CompletionParameters parameters,
+ @NotNull ProcessingContext context,
+ @NotNull CompletionResultSet resultSet) {
+ PsiElement position = parameters.getPosition();
+ XmlTag ajaxOptionTag = PsiTreeUtil.getParentOfType(position, XmlTag.class);
+ while (ajaxOptionTag != null && !"AJAX-OPTION".equals(ajaxOptionTag.getName())) {
+ ajaxOptionTag = ajaxOptionTag.getParentTag();
+ }
+ if (ajaxOptionTag == null) return;
+
+ String datasetId = ajaxOptionTag.getAttributeValue("DATASET");
+ if (datasetId == null) return;
+
+ PsiFile ajaxFile = DynFormPathUtils.findAjaxXml(parameters.getOriginalFile());
+ if (ajaxFile instanceof XmlFile xmlFile) {
+ XmlTag rootTag = xmlFile.getRootTag();
+ if (rootTag != null) {
+ XmlTag datasetsContainer = rootTag.findFirstSubTag("DATASETS");
+ if (datasetsContainer == null) datasetsContainer = rootTag;
+
+ for (XmlTag datasetTag : datasetsContainer.findSubTags("DATASET")) {
+ if (datasetId.equals(datasetTag.getAttributeValue("ID"))) {
+ XmlTag fieldsTag = datasetTag.findFirstSubTag("FIELDS");
+ if (fieldsTag != null) {
+ addFieldsInTagRecursive(fieldsTag, resultSet);
+ }
+ }
+ }
+ }
+ }
+ }
+ });
+
+ // XML completion for GRID-ID
+ extend(CompletionType.BASIC, XmlPatterns.psiElement()
+ .inside(XmlPatterns.xmlAttributeValue()
+ .withParent(XmlPatterns.xmlAttribute().withName("GRID-ID"))),
+ new CompletionProvider() {
+ @Override
+ protected void addCompletions(@NotNull CompletionParameters parameters,
+ @NotNull ProcessingContext context,
+ @NotNull CompletionResultSet resultSet) {
+ addGridsInFileRecursive(parameters.getOriginalFile(), resultSet, new HashSet<>());
+ }
+ });
+ }
+
+ private void addFieldsInTagRecursive(XmlTag container, @NotNull CompletionResultSet resultSet) {
+ for (XmlTag subTag : container.getSubTags()) {
+ if ("FIELD".equals(subTag.getName())) {
+ String name = subTag.getAttributeValue("NAME");
+ if (name != null && !name.isEmpty()) {
+ resultSet.addElement(LookupElementBuilder.create(name)
+ .withIcon(com.intellij.icons.AllIcons.Nodes.Field)
+ .withTypeText(subTag.getAttributeValue("TYPE")));
+ }
+ } else {
+ if (("SECTION".equals(subTag.getName()) || "FIELDS".equals(subTag.getName())) && subTag.getAttributeValue("ID") != null) {
+ String id = subTag.getAttributeValue("ID");
+ resultSet.addElement(LookupElementBuilder.create(id)
+ .withIcon(com.intellij.icons.AllIcons.Nodes.Package)
+ .withItemTextForeground(java.awt.Color.BLUE));
+ }
+ addFieldsInTagRecursive(subTag, resultSet);
+ }
+ }
+ }
+
+ private void addDatasetsInFile(PsiFile file, @NotNull CompletionResultSet resultSet) {
+ if (!(file instanceof XmlFile xmlFile)) return;
+ XmlTag rootTag = xmlFile.getRootTag();
+ if (rootTag == null) return;
+
+ XmlTag datasetsContainer = rootTag.findFirstSubTag("DATASETS");
+ if (datasetsContainer == null) datasetsContainer = rootTag;
+
+ for (XmlTag datasetTag : datasetsContainer.findSubTags("DATASET")) {
+ String id = datasetTag.getAttributeValue("ID");
+ if (id != null && !id.isEmpty()) {
+ resultSet.addElement(LookupElementBuilder.create(id)
+ .withIcon(com.intellij.icons.AllIcons.Nodes.DataTables)
+ .withTypeText(datasetTag.getAttributeValue("TABLENAME")));
+ }
+ }
+ }
+
+ private void addGridsInFileRecursive(PsiFile file, @NotNull CompletionResultSet resultSet, Set visited) {
+ if (file == null || !visited.add(file)) return;
+ if (!(file instanceof XmlFile xmlFile)) return;
+ XmlTag rootTag = xmlFile.getRootTag();
+ if (rootTag == null) return;
+
+ XmlTag dataGridsTag = rootTag.findFirstSubTag("DATA-GRIDS");
+ if (dataGridsTag != null) {
+ for (XmlTag gridTag : dataGridsTag.findSubTags("DATA-GRID")) {
+ String id = gridTag.getAttributeValue("ID");
+ if (id != null && !id.isEmpty()) {
+ resultSet.addElement(LookupElementBuilder.create(id)
+ .withIcon(com.intellij.icons.AllIcons.Nodes.DataTables));
+ }
+ }
+ }
+
+ XmlTag includesTag = rootTag.findFirstSubTag("INCLUDES");
+ if (includesTag != null) {
+ for (XmlTag includeTag : includesTag.findSubTags("INCLUDE")) {
+ String path = includeTag.getAttributeValue("FILE");
+ if (path != null) {
+ PsiFile includedFile = DynFormPathUtils.findIncludedFile(file, path);
+ addGridsInFileRecursive(includedFile, resultSet, visited);
+ }
+ }
+ }
}
private PsiNewExpression getNewDynFormExpression(PsiLiteralExpression literal) {
diff --git a/src/main/java/com/sdk/dynform/tools/helper/DynFormPathUtils.java b/src/main/java/com/sdk/dynform/tools/helper/DynFormPathUtils.java
index b60107f..aebfdf2 100644
--- a/src/main/java/com/sdk/dynform/tools/helper/DynFormPathUtils.java
+++ b/src/main/java/com/sdk/dynform/tools/helper/DynFormPathUtils.java
@@ -5,13 +5,10 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
-import com.intellij.psi.search.FilenameIndex;
-import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.List;
public class DynFormPathUtils {
@@ -20,12 +17,75 @@ public class DynFormPathUtils {
@Nullable
public static VirtualFile getModuleBaseDir(@NotNull Project project) {
- // ค้นหาจาก project root โดยตรง
VirtualFile baseDir = project.getBaseDir();
if (baseDir == null) return null;
return baseDir.findFileByRelativePath(MODULE_BASE_PATH);
}
+ @Nullable
+ public static VirtualFile findModuleDir(@NotNull PsiFile file) {
+ VirtualFile vFile = file.getVirtualFile();
+ if (vFile == null) return null;
+
+ VirtualFile current = vFile.getParent();
+ while (current != null) {
+ if (current.getParent() != null && "module".equals(current.getParent().getName())) {
+ return current;
+ }
+ current = current.getParent();
+ }
+ return null;
+ }
+
+ @Nullable
+ public static PsiFile findAjaxXml(@NotNull PsiFile file) {
+ VirtualFile moduleDir = findModuleDir(file);
+ if (moduleDir != null) {
+ VirtualFile ajaxFile = moduleDir.findFileByRelativePath("defs/ajax.xml");
+ if (ajaxFile != null) {
+ return PsiManager.getInstance(file.getProject()).findFile(ajaxFile);
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ public static PsiFile findIncludedFile(@NotNull PsiFile contextFile, @NotNull String path) {
+ // จัดการกรณี typo (ิ แทน /)
+ path = path.replace("ิ", "/");
+
+ VirtualFile moduleBase = getModuleBaseDir(contextFile.getProject());
+ if (moduleBase == null) return null;
+
+ VirtualFile targetVFile = null;
+ if (path.startsWith("#")) {
+ // ภายในโมดูลเดียวกัน: #grids/file.frml -> currentModule/view/frm/grids/file.frml
+ VirtualFile moduleDir = findModuleDir(contextFile);
+ if (moduleDir != null) {
+ String relativePath = "view/frm/" + path.substring(1);
+ targetVFile = moduleDir.findFileByRelativePath(relativePath);
+ }
+ } else if (path.startsWith("/")) {
+ // ข้ามโมดูล: /bdgt04/grids/file.frml -> module/bdgt04/view/frm/grids/file.frml
+ String cleanPath = path.substring(1);
+ int firstSlash = cleanPath.indexOf("/");
+ if (firstSlash > 0) {
+ String targetModule = cleanPath.substring(0, firstSlash);
+ String subPath = cleanPath.substring(firstSlash + 1);
+ String fullPath = targetModule + "/view/frm/" + subPath;
+ targetVFile = moduleBase.findFileByRelativePath(fullPath);
+ }
+ } else {
+ // สัมพัทธ์กับไฟล์ปัจจุบัน
+ targetVFile = contextFile.getVirtualFile().getParent().findFileByRelativePath(path);
+ }
+
+ if (targetVFile != null) {
+ return PsiManager.getInstance(contextFile.getProject()).findFile(targetVFile);
+ }
+ return null;
+ }
+
@NotNull
public static List getAllModules(@NotNull Project project) {
List modules = new ArrayList<>();
diff --git a/src/main/java/com/sdk/dynform/tools/helper/DynFormReferenceContributor.java b/src/main/java/com/sdk/dynform/tools/helper/DynFormReferenceContributor.java
index e99eb88..34f871e 100644
--- a/src/main/java/com/sdk/dynform/tools/helper/DynFormReferenceContributor.java
+++ b/src/main/java/com/sdk/dynform/tools/helper/DynFormReferenceContributor.java
@@ -2,14 +2,24 @@ package com.sdk.dynform.tools.helper;
import com.intellij.openapi.util.TextRange;
import com.intellij.patterns.PlatformPatterns;
+import com.intellij.patterns.XmlPatterns;
import com.intellij.psi.*;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.xml.XmlAttribute;
+import com.intellij.psi.xml.XmlAttributeValue;
+import com.intellij.psi.xml.XmlFile;
+import com.intellij.psi.xml.XmlTag;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.HashSet;
+import java.util.Set;
+
public class DynFormReferenceContributor extends PsiReferenceContributor {
@Override
public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) {
+ // Java Reference Provider
registrar.registerReferenceProvider(PlatformPatterns.psiElement(PsiLiteralExpression.class),
new PsiReferenceProvider() {
@NotNull
@@ -24,11 +34,9 @@ public class DynFormReferenceContributor extends PsiReferenceContributor {
PsiExpressionList argList = newExp.getArgumentList();
if (argList != null) {
PsiExpression[] args = argList.getExpressions();
- // Argument index 3 is moduleName
if (args.length >= 4 && args[3] == literal) {
return new PsiReference[]{new DynFormModuleReference(element, new TextRange(1, value.length() + 1), value)};
}
- // Argument index 4 is frmlName
if (args.length >= 5 && args[4] == literal) {
String moduleName = getArgumentValue(args, 3);
if (moduleName != null) {
@@ -40,6 +48,109 @@ public class DynFormReferenceContributor extends PsiReferenceContributor {
return PsiReference.EMPTY_ARRAY;
}
});
+
+ // XML Reference Provider for Field/Section NAME/ID
+ registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue()
+ .withParent(XmlPatterns.xmlAttribute().withName("NAME", "ID", "TARGET")
+ .withParent(XmlPatterns.xmlTag().withName("FIELD", "SECTION"))),
+ new PsiReferenceProvider() {
+ @NotNull
+ @Override
+ public PsiReference @NotNull [] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
+ XmlAttributeValue attrValue = (XmlAttributeValue) element;
+ String value = attrValue.getValue();
+ if (value == null || value.isEmpty()) return PsiReference.EMPTY_ARRAY;
+
+ XmlAttribute attr = (XmlAttribute) attrValue.getParent();
+ XmlTag tag = (XmlTag) attr.getParent();
+ String attrName = attr.getName();
+
+ if ("TARGET".equals(attrName)) {
+ return new PsiReference[]{new DynFormLocalFieldReference(attrValue, new TextRange(1, value.length() + 1), value)};
+ }
+
+ // เคส 1: อยู่ใน LAYOUT หรือ TITLES -> ลิงก์ไปหา FIELDS (นิยาม)
+ if (hasAncestorWithName(tag, "LAYOUT") || hasAncestorWithName(tag, "TITLES")) {
+ return new PsiReference[]{new DynFormFieldDefinitionReference(attrValue, new TextRange(1, value.length() + 1), value)};
+ }
+
+ // เคส 2: อยู่ใน FIELDS (นิยาม) -> ลิงก์กลับไปหา LAYOUT หรือ TITLES (การใช้งาน)
+ if (hasAncestorWithName(tag, "FIELDS")) {
+ return new PsiReference[]{new DynFormFieldUsageReference(attrValue, new TextRange(1, value.length() + 1), value)};
+ }
+
+ return PsiReference.EMPTY_ARRAY;
+ }
+ });
+
+ // XML Reference for Dataset ID (DATAID, DATASET, DATASET-ID)
+ registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue()
+ .withParent(XmlPatterns.xmlAttribute().withName("DATAID", "DATASET", "DATASET-ID")),
+ new PsiReferenceProvider() {
+ @NotNull
+ @Override
+ public PsiReference @NotNull [] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
+ XmlAttributeValue attrValue = (XmlAttributeValue) element;
+ String value = attrValue.getValue();
+ if (value == null || value.isEmpty()) return PsiReference.EMPTY_ARRAY;
+ return new PsiReference[]{new DynFormDatasetReference(attrValue, new TextRange(1, value.length() + 1), value)};
+ }
+ });
+
+ // XML Reference for Grid ID
+ registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue()
+ .withParent(XmlPatterns.xmlAttribute().withName("GRID-ID")),
+ new PsiReferenceProvider() {
+ @NotNull
+ @Override
+ public PsiReference @NotNull [] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
+ XmlAttributeValue attrValue = (XmlAttributeValue) element;
+ String value = attrValue.getValue();
+ if (value == null || value.isEmpty()) return PsiReference.EMPTY_ARRAY;
+ return new PsiReference[]{new DynFormGridReference(attrValue, new TextRange(1, value.length() + 1), value)};
+ }
+ });
+
+ // XML Reference for SRC in UPDATE-FIELDS
+ registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue()
+ .withParent(XmlPatterns.xmlAttribute().withName("SRC")
+ .withParent(XmlPatterns.xmlTag().withName("FIELD")
+ .withParent(XmlPatterns.xmlTag().withName("UPDATE-FIELDS")))),
+ new PsiReferenceProvider() {
+ @NotNull
+ @Override
+ public PsiReference @NotNull [] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
+ XmlAttributeValue attrValue = (XmlAttributeValue) element;
+ String value = attrValue.getValue();
+ if (value == null || value.isEmpty()) return PsiReference.EMPTY_ARRAY;
+ return new PsiReference[]{new DynFormAjaxSrcFieldReference(attrValue, new TextRange(1, value.length() + 1), value)};
+ }
+ });
+
+ // XML Reference for Include File
+ registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue()
+ .withParent(XmlPatterns.xmlAttribute().withName("FILE")
+ .withParent(XmlPatterns.xmlTag().withName("INCLUDE")
+ .withParent(XmlPatterns.xmlTag().withName("INCLUDES")))),
+ new PsiReferenceProvider() {
+ @NotNull
+ @Override
+ public PsiReference @NotNull [] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
+ XmlAttributeValue attrValue = (XmlAttributeValue) element;
+ String value = attrValue.getValue();
+ if (value == null || value.isEmpty()) return PsiReference.EMPTY_ARRAY;
+ return new PsiReference[]{new DynFormFileIncludeReference(attrValue, new TextRange(1, value.length() + 1), value)};
+ }
+ });
+ }
+
+ private static boolean hasAncestorWithName(XmlTag tag, String name) {
+ XmlTag current = tag.getParentTag();
+ while (current != null) {
+ if (name.equals(current.getName())) return true;
+ current = current.getParentTag();
+ }
+ return false;
}
@Nullable
@@ -68,15 +179,11 @@ public class DynFormReferenceContributor extends PsiReferenceContributor {
private static class DynFormModuleReference extends PsiReferenceBase {
private final String moduleName;
-
public DynFormModuleReference(@NotNull PsiElement element, TextRange textRange, String moduleName) {
super(element, textRange);
this.moduleName = moduleName;
}
-
- @Nullable
- @Override
- public PsiElement resolve() {
+ @Nullable @Override public PsiElement resolve() {
return DynFormPathUtils.findModuleDirectory(myElement.getProject(), moduleName);
}
}
@@ -84,17 +191,256 @@ public class DynFormReferenceContributor extends PsiReferenceContributor {
private static class DynFormFrmlReference extends PsiReferenceBase {
private final String moduleName;
private final String frmlName;
-
public DynFormFrmlReference(@NotNull PsiElement element, TextRange textRange, String moduleName, String frmlName) {
super(element, textRange);
this.moduleName = moduleName;
this.frmlName = frmlName;
}
-
- @Nullable
- @Override
- public PsiElement resolve() {
+ @Nullable @Override public PsiElement resolve() {
return DynFormPathUtils.findFrmlFile(myElement.getProject(), moduleName, frmlName);
}
}
+
+ private static class DynFormLocalFieldReference extends PsiReferenceBase {
+ private final String fieldName;
+ public DynFormLocalFieldReference(@NotNull XmlAttributeValue element, TextRange range, String fieldName) {
+ super(element, range);
+ this.fieldName = fieldName;
+ }
+ @Nullable @Override public PsiElement resolve() {
+ XmlTag container = PsiTreeUtil.getParentOfType(myElement, XmlTag.class);
+ while (container != null && !"FORM_ENTRY".equals(container.getName()) && !"FORM_BROWSE".equals(container.getName()) && !"GRID-LIST".equals(container.getName())) {
+ container = container.getParentTag();
+ }
+ if (container == null) {
+ XmlFile file = (XmlFile) myElement.getContainingFile();
+ container = file.getRootTag();
+ }
+ if (container == null) return null;
+ return findFieldInTag(container, fieldName);
+ }
+ }
+
+ /**
+ * ลิงก์จาก Layout หรือ Titles ไปหา FIELDS
+ */
+ private static class DynFormFieldDefinitionReference extends PsiReferenceBase {
+ private final String fieldName;
+ public DynFormFieldDefinitionReference(@NotNull XmlAttributeValue element, TextRange range, String fieldName) {
+ super(element, range);
+ this.fieldName = fieldName;
+ }
+ @Nullable @Override public PsiElement resolve() {
+ XmlTag tag = PsiTreeUtil.getParentOfType(myElement, XmlTag.class);
+ if (tag == null) return null;
+
+ // หา container (FORM_ENTRY, FORM_BROWSE, GRID-LIST หรือ FILTERS)
+ XmlTag container = tag;
+ while (container != null &&
+ !"LAYOUT".equals(container.getName()) &&
+ !"TITLES".equals(container.getName()) &&
+ !"FORM_ENTRY".equals(container.getName()) &&
+ !"FORM_BROWSE".equals(container.getName()) &&
+ !"GRID-LIST".equals(container.getName()) &&
+ !"FILTERS".equals(container.getName())) {
+ container = container.getParentTag();
+ }
+
+ if (container != null && ("LAYOUT".equals(container.getName()) || "TITLES".equals(container.getName()))) {
+ container = container.getParentTag();
+ }
+
+ if (container == null) return null;
+
+ XmlTag fieldsTag = container.findFirstSubTag("FIELDS");
+ if (fieldsTag == null) return null;
+
+ return findFieldInTag(fieldsTag, fieldName);
+ }
+ }
+
+ /**
+ * ค้นหาย้อนกลับจากนิยามฟิลด์ (FIELDS) ไปยังการใช้งานใน LAYOUT หรือ TITLES
+ */
+ private static class DynFormFieldUsageReference extends PsiReferenceBase {
+ private final String fieldName;
+ public DynFormFieldUsageReference(@NotNull XmlAttributeValue element, TextRange range, String fieldName) {
+ super(element, range);
+ this.fieldName = fieldName;
+ }
+ @Nullable @Override public PsiElement resolve() {
+ XmlTag tag = PsiTreeUtil.getParentOfType(myElement, XmlTag.class);
+ if (tag == null) return null;
+
+ // หา FIELDS container
+ XmlTag fieldsTag = tag;
+ while (fieldsTag != null && !"FIELDS".equals(fieldsTag.getName())) {
+ fieldsTag = fieldsTag.getParentTag();
+ }
+ if (fieldsTag == null) return null;
+
+ XmlTag containerTag = fieldsTag.getParentTag();
+ if (containerTag == null) return null;
+
+ // หาใน LAYOUT ก่อน
+ XmlTag layoutTag = containerTag.findFirstSubTag("LAYOUT");
+ if (layoutTag != null) {
+ PsiElement found = findFieldInTag(layoutTag, fieldName);
+ if (found != null) return found;
+ }
+
+ // ถ้าไม่เจอใน LAYOUT ให้หาใน TITLES
+ XmlTag titlesTag = containerTag.findFirstSubTag("TITLES");
+ if (titlesTag != null) {
+ PsiElement found = findFieldInTag(titlesTag, fieldName);
+ if (found != null) return found;
+ }
+
+ return null;
+ }
+ }
+
+ @Nullable
+ private static PsiElement findFieldInTag(XmlTag container, String name) {
+ for (XmlTag subTag : container.getSubTags()) {
+ if ("FIELD".equals(subTag.getName()) && name.equals(subTag.getAttributeValue("NAME"))) {
+ XmlAttribute nameAttr = subTag.getAttribute("NAME");
+ return nameAttr != null ? nameAttr.getValueElement() : subTag;
+ }
+ if (("SECTION".equals(subTag.getName()) || "ROW".equals(subTag.getName())) && name.equals(subTag.getAttributeValue("ID"))) {
+ XmlAttribute idAttr = subTag.getAttribute("ID");
+ return idAttr != null ? idAttr.getValueElement() : subTag;
+ }
+ PsiElement found = findFieldInTag(subTag, name);
+ if (found != null) return found;
+ }
+ return null;
+ }
+
+ private static class DynFormDatasetReference extends PsiReferenceBase {
+ private final String datasetId;
+ public DynFormDatasetReference(@NotNull XmlAttributeValue element, TextRange range, String datasetId) {
+ super(element, range);
+ this.datasetId = datasetId;
+ }
+ @Nullable @Override public PsiElement resolve() {
+ PsiElement found = findDatasetInFile(myElement.getContainingFile(), datasetId);
+ if (found != null) return found;
+
+ PsiFile ajaxFile = DynFormPathUtils.findAjaxXml(myElement.getContainingFile());
+ if (ajaxFile != null) {
+ return findDatasetInFile(ajaxFile, datasetId);
+ }
+ return null;
+ }
+
+ @Nullable
+ private PsiElement findDatasetInFile(PsiFile file, String id) {
+ if (!(file instanceof XmlFile xmlFile)) return null;
+ XmlTag rootTag = xmlFile.getRootTag();
+ if (rootTag == null) return null;
+
+ XmlTag datasetsContainer = rootTag.findFirstSubTag("DATASETS");
+ if (datasetsContainer == null) datasetsContainer = rootTag;
+
+ for (XmlTag datasetTag : datasetsContainer.findSubTags("DATASET")) {
+ if (id.equals(datasetTag.getAttributeValue("ID"))) {
+ XmlAttribute idAttr = datasetTag.getAttribute("ID");
+ return idAttr != null ? idAttr.getValueElement() : datasetTag;
+ }
+ }
+ return null;
+ }
+ }
+
+ private static class DynFormGridReference extends PsiReferenceBase {
+ private final String gridId;
+ public DynFormGridReference(@NotNull XmlAttributeValue element, TextRange range, String gridId) {
+ super(element, range);
+ this.gridId = gridId;
+ }
+ @Nullable @Override public PsiElement resolve() {
+ return findGridInFileRecursive(myElement.getContainingFile(), gridId, new HashSet<>());
+ }
+
+ @Nullable
+ private PsiElement findGridInFileRecursive(PsiFile file, String id, Set visited) {
+ if (file == null || !visited.add(file)) return null;
+ if (!(file instanceof XmlFile xmlFile)) return null;
+ XmlTag rootTag = xmlFile.getRootTag();
+ if (rootTag == null) return null;
+
+ XmlTag dataGridsTag = rootTag.findFirstSubTag("DATA-GRIDS");
+ if (dataGridsTag != null) {
+ for (XmlTag gridTag : dataGridsTag.findSubTags("DATA-GRID")) {
+ if (id.equals(gridTag.getAttributeValue("ID"))) {
+ XmlAttribute idAttr = gridTag.getAttribute("ID");
+ return idAttr != null ? idAttr.getValueElement() : gridTag;
+ }
+ }
+ }
+
+ XmlTag includesTag = rootTag.findFirstSubTag("INCLUDES");
+ if (includesTag != null) {
+ for (XmlTag includeTag : includesTag.findSubTags("INCLUDE")) {
+ String path = includeTag.getAttributeValue("FILE");
+ if (path != null) {
+ PsiFile includedFile = DynFormPathUtils.findIncludedFile(file, path);
+ PsiElement found = findGridInFileRecursive(includedFile, id, visited);
+ if (found != null) return found;
+ }
+ }
+ }
+ return null;
+ }
+ }
+
+ private static class DynFormAjaxSrcFieldReference extends PsiReferenceBase {
+ private final String fieldName;
+ public DynFormAjaxSrcFieldReference(@NotNull XmlAttributeValue element, TextRange range, String fieldName) {
+ super(element, range);
+ this.fieldName = fieldName;
+ }
+ @Nullable @Override public PsiElement resolve() {
+ XmlTag ajaxOptionTag = PsiTreeUtil.getParentOfType(myElement, XmlTag.class);
+ while (ajaxOptionTag != null && !"AJAX-OPTION".equals(ajaxOptionTag.getName())) {
+ ajaxOptionTag = ajaxOptionTag.getParentTag();
+ }
+ if (ajaxOptionTag == null) return null;
+
+ String datasetId = ajaxOptionTag.getAttributeValue("DATASET");
+ if (datasetId == null) return null;
+
+ PsiFile ajaxFile = DynFormPathUtils.findAjaxXml(myElement.getContainingFile());
+ if (!(ajaxFile instanceof XmlFile xmlFile)) return null;
+
+ XmlTag rootTag = xmlFile.getRootTag();
+ if (rootTag == null) return null;
+
+ XmlTag datasetsContainer = rootTag.findFirstSubTag("DATASETS");
+ if (datasetsContainer == null) datasetsContainer = rootTag;
+
+ for (XmlTag datasetTag : datasetsContainer.findSubTags("DATASET")) {
+ if (datasetId.equals(datasetTag.getAttributeValue("ID"))) {
+ XmlTag fieldsTag = datasetTag.findFirstSubTag("FIELDS");
+ if (fieldsTag != null) {
+ return findFieldInTag(fieldsTag, fieldName);
+ }
+ return datasetTag;
+ }
+ }
+ return null;
+ }
+ }
+
+ private static class DynFormFileIncludeReference extends PsiReferenceBase {
+ private final String path;
+ public DynFormFileIncludeReference(@NotNull XmlAttributeValue element, TextRange range, String path) {
+ super(element, range);
+ this.path = path;
+ }
+ @Nullable @Override public PsiElement resolve() {
+ return DynFormPathUtils.findIncludedFile(myElement.getContainingFile(), path);
+ }
+ }
}
diff --git a/src/main/resources/META-INF/pluginIcon.svg b/src/main/resources/META-INF/pluginIcon.svg
index 7799969..821b1ad 100644
--- a/src/main/resources/META-INF/pluginIcon.svg
+++ b/src/main/resources/META-INF/pluginIcon.svg
@@ -1,11 +1,23 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+