topgp combobox动态下拉列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了topgp combobox动态下拉列表相关的知识,希望对你有一定的参考价值。

用过TOPGP的都知道,画面上的下拉列表是写死在画面档上的,每个程序都要手动去维护一遍,很恶心很麻烦,
鼎捷也发现了这个问题,在T100上面就全部使用了动态的方式显示,具体的操作方式就是可以在前端维护一个基础档,然后程序抓取基础档上的资料动态显示到下拉列表中。这样做确实是方便了很多。其实TOPGP也是支持这种写法的,有天无聊我就自己开发了一个版本,使用起来确实挺方便,发出来给交流一下!
一,设计基础资料表
这个不多说,直接贴上表结构

1:单头档
ALTER TABLE DS.TC_GC_FILE
 DROP PRIMARY KEY CASCADE;

DROP TABLE DS.TC_GC_FILE CASCADE CONSTRAINTS;

CREATE TABLE DS.TC_GC_FILE
(
  TC_GC01  NUMBER(10)                           NOT NULL,  ---分类编码
  TC_GC02  VARCHAR2(80 BYTE),                                ---说明
    TC_GC03  VARCHAR2(250 BYTE)                               ---备注
)
TABLESPACE DBS1
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          128K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;

CREATE UNIQUE INDEX DS.TC_GC_PK ON DS.TC_GC_FILE
(TC_GC01)
LOGGING
TABLESPACE DBS1
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOPARALLEL;

DROP SYNONYM ODS.TC_GC_FILE;

CREATE SYNONYM ODS.TC_GC_FILE FOR DS.TC_GC_FILE;

DROP SYNONYM DSALL.TC_GC_FILE;

CREATE SYNONYM DSALL.TC_GC_FILE FOR DS.TC_GC_FILE;

ALTER TABLE DS.TC_GC_FILE ADD (
  CONSTRAINT TC_GC_PK
 PRIMARY KEY
 (TC_GC01)
    USING INDEX 
    TABLESPACE DBS1
    PCTFREE    10
    INITRANS   2
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                PCTINCREASE      0
               ));

GRANT INDEX, SELECT ON DS.TC_GC_FILE TO ODS;

GRANT INDEX, SELECT ON DS.TC_GC_FILE TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE ON DS.TC_GC_FILE TO TIPTOPGP;

2:单身档

ALTER TABLE DS.TC_GD_FILE
 DROP PRIMARY KEY CASCADE;

DROP TABLE DS.TC_GD_FILE CASCADE CONSTRAINTS;

CREATE TABLE DS.TC_GD_FILE
(
  TC_GD01  NUMBER(10)                           NOT NULL,          ---编码
  TC_GD02  VARCHAR2(40 BYTE)                    NOT NULL,   ---编码值
  TC_GD03  VARCHAR2(250 BYTE),                                       ---说明
  TC_GD04  NUMBER(5)                                                          --显示顺序
)
TABLESPACE DBS1
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          128K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;

CREATE UNIQUE INDEX DS.TC_GD_PK ON DS.TC_GD_FILE
(TC_GD01, TC_GD02)
LOGGING
TABLESPACE DBS1
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOPARALLEL;

DROP SYNONYM ODS.TC_GD_FILE;

CREATE SYNONYM ODS.TC_GD_FILE FOR DS.TC_GD_FILE;

DROP SYNONYM DSALL.TC_GD_FILE;

CREATE SYNONYM DSALL.TC_GD_FILE FOR DS.TC_GD_FILE;

ALTER TABLE DS.TC_GD_FILE ADD (
  CONSTRAINT TC_GD_PK
 PRIMARY KEY
 (TC_GD01, TC_GD02)
    USING INDEX 
    TABLESPACE DBS1
    PCTFREE    10
    INITRANS   2
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                PCTINCREASE      0
               ));

GRANT INDEX, SELECT ON DS.TC_GD_FILE TO ODS;

GRANT INDEX, SELECT ON DS.TC_GD_FILE TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE ON DS.TC_GD_FILE TO TIPTOPGP;

二:添加基础资料维护作业
这个也没什么好说的,开发一个最简单的双档维护程序就行了,贴上一张效果图
技术分享图片

三:新增公用函数
这个函数可以在lib/4gl目录下新增,这样每个程序就能自动链接了
我是新增了一个这个函数cl_set_combo_items.4gl程序里面新增了一个函数cl_set_combo,主要用这个函数就行了,直接贴代码

# Prog. Version..: ‘5.25.03-11.07.14(00000)‘     #
#
# Program name...: cl_set_combo_items.4gl
# Descriptions...: 動態設定ComboBox的Item.
# Date & Author..: 03/07/02 by Hiko
# Usage..........: CALL cl_set_combo_items("oea08", "1,2", "Local Order,Export Order")
# Modify.........: No.FUN-640240 06/05/17 Echo 自動執行確認功能
# Modify...... ..: No.FUN-690005 06/09/05 By chen 類型轉換
# Modify.........: No.FUN-6C0017 06/12/13 By jamie 程式開頭增加‘database ds‘
# Modify.........: No.TQC-740146 07/04/24 By Echo 判斷是否背景作業,條件需再加上 g_gui_type 
# Modify.........: No.FUN-7C0053 07/12/17 By alex 修改說明only

IMPORT os

DATABASE ds        #FUN-6C0017   #FUN-7C0053

GLOBALS "../../config/top.global"

# Descriptions...: 設定ComboBox的Item.
# Date & Author..: 2003/07/02 by Hiko
# Input Parameter: ps_field_name STRING ComboBox所對應的欄位名稱
#                  ps_values STRING Item所對應的儲存值字串(中間以逗點分隔)
#                  ps_items SMALLINT Item字串(中間以逗點分隔)
# Return Code....: void
# Modify.........: MOD-520002 alex 刪除傳入值的空白尾碼
# Modify.........: MOD-540134 alex 同上

FUNCTION cl_set_combo_items(ps_field_name, ps_values, ps_items)
  DEFINE ps_field_name,ps_values,ps_items STRING
  DEFINE lcbo_target ui.ComboBox
  DEFINE lst_values,lst_items base.StringTokenizer
  DEFINE ls_msg     LIKE ze_file.ze03          #No.FUN-690005   VARCHAR(100)

  WHENEVER ERROR CALL cl_err_msg_log

  #FUN-640240
  #IF g_bgjob = ‘Y‘ THEN
  IF g_bgjob = ‘Y‘ AND g_gui_type NOT MATCHES "[13]"  THEN    #TQC-740146

     RETURN
  END IF
  #END FUN-640240

   #MOD-540134
  LET ps_field_name=ps_field_name.trim()
   #MOD-520002
  LET ps_values=ps_values.trim()
  LET ps_items=ps_items.trim()

  LET lcbo_target = ui.ComboBox.forName(ps_field_name)

  IF lcbo_target IS NULL THEN
    SELECT ze03 INTO ls_msg FROM ze_file WHERE ze01 = ‘lib-031‘ AND ze02 = g_lang
    CALL cl_err(ps_field_name, "lib-031", 1)
    RETURN
  ELSE
    CALL lcbo_target.clear()
  END IF

  LET lst_values = base.StringTokenizer.create(ps_values, ",")
  LET lst_items = base.StringTokenizer.create(ps_items, ",")

  WHILE lst_values.hasMoreTokens()
    CALL lcbo_target.addItem(lst_values.nextToken(), lst_items.nextToken())
  END WHILE
END FUNCTION

FUNCTION cl_set_combo(p_field,p_gc01)
   DEFINE p_field   LIKE type_file.chr1000,           #No.FUN-690005  VARCHAR(10)
          p_gc01    LIKE type_file.num10         #No.FUN-690005  VARCHAR(5)  #No.FUN-690103

   DEFINE l_sql     STRING
   DEFINE l_value1  LIKE type_file.chr100 
   DEFINE l_value2  LIKE type_file.chr100
   DEFINE lcbo_target ui.ComboBox
   DEFINE ls_msg     LIKE ze_file.ze03          #No.FUN-690005   VARCHAR(100) 

   WHENEVER ERROR CALL cl_err_msg_log

  IF g_bgjob = ‘Y‘ AND g_gui_type NOT MATCHES "[13]"  THEN    #TQC-740146

     RETURN
  END IF  

#LET p_field = p_field.trim()
LET lcbo_target = ui.ComboBox.forName(p_field)
  IF lcbo_target IS NULL THEN
    SELECT ze03 INTO ls_msg FROM ze_file WHERE ze01 = ‘lib-031‘ AND ze02 = g_lang
    CALL cl_err(p_field, "lib-031", 1)
    RETURN
  ELSE
    CALL lcbo_target.clear()
  END IF

 LET l_sql = " SELECT tc_gd02,tc_gd02||‘:‘||tc_gd03 FROM tc_gd_file WHERE tc_gd01 = ",p_gc01, 
         " order by tc_gd04,tc_gd02"

   PREPARE eepc100_b_ecamuc_pd FROM l_sql
   DECLARE eepc100_b_ecamuc_cs CURSOR FOR eepc100_b_ecamuc_pd

   FOREACH eepc100_b_ecamuc_cs INTO l_value1,l_value2
      CALL lcbo_target.addItem(l_value1,l_value2)
   END FOREACH 

END FUNCTION

四:调用函数
调用的时候就特别简单了,直接在CALL cl_ui_init() 下面CALL cl_set_combo(‘画面党上的命名’,编码) ,如下图

技术分享图片

以上,就是制作动态下拉列表的全部步骤,这些做完了,就可以随心所欲的在前端维护下拉列表值了,再也不用去改画面档了!

以上是关于topgp combobox动态下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

C# winform 下拉列表控件(comboBox)

C#winform,combobox添加可筛选功能

题目要求是在c#中的combobox控件的下拉列表中添加图片。我有代码,可是有错误,图片添加部分不

DataGridView ComboBox 列动态项

沫沫金miniui表格DataGrid动态Combobox功能实现

动态改变ComboBox下拉框的宽度