首页 > 技术文章 > INPUT和CONSTRUCT指令——范例报表查询,作用让用户输入数据,自动生成SQL的WHERE条件,带开窗查询

xiaoli9627 2017-05-10 15:23 原文

INPUT指令

说明:
1. 当程序执行到INPUT指令时,会将控制权交给用户,让用户输入数据。
2. 用户输入完字段的数据,会将数据回传给程序中的变量接收。
3. 只要执行到INPUT的指令,程序会将每个字段Default为NULL。

  反之不需要将每个字段的值都变为NULL的话,需添加(WITHOUT DEFAULTS) 

 

范例(cxrq005):

1、首先在MAIN函数前定义客制变量,用来接收用户数据;

#add-point:自定義模組變數-客製(Module Variable) name="global.variable_customerization"

TYPE type_g_input RECORD
        xrsduc010 STRING,
        xrsduc010_desc STRING,
        xrsduc010_desc_1 STRING
END RECORD

DEFINE g_input      type_g_input

#end add-point  

以上这些变量,均对应规格上的控件代号进行定义;

 

2、在cxrq005 _ui_dialog()函数中的DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)领域下自定义INPUT;

      DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
         #add-point:input段落 name="ui_dialog.input"
         INPUT g_input.xrsduc010 FROM xrsduc010 ATTRIBUTES(WITHOUT DEFAULTS)  
         
           ON ACTION controlp INFIELD xrsduc010
           INITIALIZE g_qryparam.* TO NULL
           LET g_qryparam.state = 'c'               #c-多选,i-单选
           LET g_qryparam.reqry = FALSE
           LET g_qryparam.default1 = g_input.xrsduc010       #給予default值
           LET g_qryparam.arg1 = g_site
           CALL  cq_pmab001_2()                                #呼叫開窗
           DISPLAY g_qryparam.return1  TO xrsduc010      #將開窗取得的值回傳到變數
           #DISPLAY g_qryparam.return2 TO xrsduc010_desc
           #DISPLAY g_qryparam.return3 TO xrsduc010_desc_1
           
         END INPUT
         #end add-point  

如有多个控件的输入控制权需要交给用户来输入,依次在INPUT指令中输入接收数据的变量和控件代号即可。

 

 

CONSTRUCT指令

此指令可让用户在画面上输入查询条件(通称Query By Example;QBE),以取得用户的查询范围数据。用户的查询数据会组成一串WHERE指令(参下页批注),并置入设定好的变量中。若使用者未输入任何条件,即按下『确定』离开CONSTRUCT,系统也会自动于此变量中补入『1=1』

 

范例同上:

1、同上;

接收WHERE指令的变量最好使用STRING类型;

 

 

2、在cxrq005 _ui_dialog()函数中的DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)领域下自定义CONSTRUCT:

         #add-point:construct段落 name="ui_dialog.construct"
         CONSTRUCT BY NAME g_input.xrsduc010 ON xrsduc010 
            ON ACTION controlp INFIELD xrsduc010
                   INITIALIZE g_qryparam.* TO NULL
                   LET g_qryparam.state = 'c'
                   LET g_qryparam.reqry = FALSE
                   LET g_qryparam.default1 = g_input.xrsduc010       #給予default值
                   LET g_qryparam.arg1 = g_site
                   CALL  cq_pmab001_2()                                #呼叫開窗
                   DISPLAY g_qryparam.return1  TO xrsduc010      #將開窗取得的值回傳到變數
                   #DISPLAY g_qryparam.return2 TO xrsduc010_desc
                   #DISPLAY g_qryparam.return3 TO xrsduc010_desc_1
                   
                NEXT FIELD xrsduc010 
                
         END CONSTRUCT
         #end add-point 

域名和变量名称相同时: CONSTRUCT BY NAME char_variable ON column_list

反之:CONSTRUCT char_variable ON column_list FROM field_list

说明:
 char_variable为接取用户输入数据的字符串变量(建议以STRING格式变量接取)
 column_list为对应到表格(TABLE)的域名清单(逗号隔开)
 field_list为画面(WINDOW或是FORM)上的字段代码清单(逗号隔开)

 

注:INPUT的数据输入后,其值是分散于个变量中,若要以INPUT指令来接取用户所输入的查询条件,则必需以一连串复杂的字符串组合指令来组出查询指令所需要的WHERE条件。而CONSTRUCT的优点在:系统会自动判别用户输入条件并组合,后续只要将之与SELECT等指令组合即可,可降低设计的复杂度。

 

推荐阅读