【经验之谈】SAP中的普通屏幕使用定制控制

ABAP ALV在定制控制中的实现
本文详细介绍了在SAP ABAP环境下,如何利用定制控制(Customer Control)在屏幕上展示ALV(Application List Viewer)。通过具体代码示例,展示了ALV容器、ALV表格的创建过程,以及字段目录的设置,为读者提供了实用的ALV实现指南。

本文的知识基础,不是PA教材或者keyword documentation
如何使用SE80创建report,call一个全新的screen,也就是普通屏幕,显示alv
image

TYPES: BEGIN OF ALV_LINE,
       MATNR    TYPE ZMMT00170-MATNR,   "物料编号                    --*--
       MAKTX    TYPE MAKT-MAKTX,
       ZEINR    TYPE MARA-ZEINR,        "文档号码(无文档管理系统)
       LIFNR    TYPE ZMMT00170-LIFNR,   "                            --*--
       NAME1    TYPE LFA1-NAME1,        "供应商描述
       KDATB    TYPE EKKO-KDATB,        "合同起始日期       "----最早的----
       EBELN    TYPE ZMMT00170-EBELN,
       EBELP    TYPE ZMMT00170-EBELP,
  END OF ALV_LINE.

DATA: SCR_ELMT_2000        TYPE SCRFNAME VALUE 'S2000CC01',     "定制控制控件,用于存放ALV容器
      SCR_ELMT_2000_MSEG        TYPE SCRFNAME VALUE 'S2000CC02',

      CUS_CTNR_2000        TYPE REF TO CL_GUI_CUSTOM_CONTAINER, "ALV容器,用于存放ALV表格
      ALV_GRID_2000        TYPE REF TO CL_GUI_ALV_GRID,         "ALV表格,用于显示数据

      CUS_CTNR_2000_MSEG   TYPE REF TO CL_GUI_CUSTOM_CONTAINER, "ALV容器,用于存放ALV表格
      ALV_GRID_2000_MSEG   TYPE REF TO CL_GUI_ALV_GRID,         "ALV表格,用于显示数据

      GT_FIELDCAT_2000       TYPE LVC_T_FCAT,                     "ALV中各个字段名
      GT_FIELDCAT_2000_MSEG  TYPE LVC_T_FCAT,                     "ALV中各个字段名
      GS_LAYOUT_2000         TYPE LVC_S_LAYO.                     "ALV的标题


IF CUS_CTNR_2000 IS INITIAL.
  "将alv容器放入屏幕元素
  CREATE OBJECT CUS_CTNR_2000
    EXPORTING
      CONTAINER_NAME = SCR_ELMT_2000.
  "将alv表格放入alv容器
  CREATE OBJECT ALV_GRID_2000
    EXPORTING
      I_PARENT = CUS_CTNR_2000.
  "fieldcat格式和数据准备
  PERFORM BUILD_FIELDCAT CHANGING GT_FIELDCAT_2000.
 " PERFORM BUILD_DATA.
 "----显示第一个ALV----
  CALL METHOD ALV_GRID_2000->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
      I_STRUCTURE_NAME = ''
      IS_LAYOUT = GS_LAYOUT_2000
    CHANGING
      IT_FIELDCATALOG = GT_FIELDCAT_2000
      IT_OUTTAB = IT_TAB[].
"-------------------------------------------------------------------
  "将alv容器放入屏幕元素 MSEG
  CREATE OBJECT CUS_CTNR_2000_MSEG
    EXPORTING
      CONTAINER_NAME = SCR_ELMT_2000_MSEG.
  "将alv表格放入alv容器
  CREATE OBJECT ALV_GRID_2000_MSEG
    EXPORTING
      I_PARENT = CUS_CTNR_2000_MSEG.

  PERFORM BUILD_FIELDCAT_MSEG CHANGING GT_FIELDCAT_2000_MSEG.
 "----显示第二个ALV----
  CALL METHOD ALV_GRID_2000_MSEG->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
      I_STRUCTURE_NAME = ''
      IS_LAYOUT = GS_LAYOUT_2000
    CHANGING
      IT_FIELDCATALOG = GT_FIELDCAT_2000_MSEG
      IT_OUTTAB = IT_MSEG[].

ENDIF.

ENDMODULE.

FORM BUILD_FIELDCAT  CHANGING GT_FIELDCAT TYPE LVC_T_FCAT.

    DATA: GS_FIELDCAT  TYPE  LVC_S_FCAT.

    CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      I_STRUCTURE_NAME = 'ALV_LINE'"自定义的structure
    CHANGING
      CT_FIELDCAT      = GT_FIELDCAT.

    DEFINE SET_FIELDCAT.
      CLEAR GS_FIELDCAT_MSEG.
      GS_FIELDCAT-CHECKBOX  = &1.
      GS_FIELDCAT-EDIT      = &2.
      GS_FIELDCAT-OUTPUTLEN = &3.
      GS_FIELDCAT-FIELDNAME = &4.
      GS_FIELDCAT-COLTEXT   = &5.
      APPEND GS_FIELDCAT TO GT_FIELDCAT.
    END-OF-DEFINITION.

    SET_FIELDCAT '' '' 25  'MATNR'      '物料编号'.
    SET_FIELDCAT '' '' 15  'LIFNR'      '供应商编号'.
    SET_FIELDCAT '' '' 10  'KDATB'      '合同起始日期'.
    SET_FIELDCAT '' '' 10  'WERKS'      '工厂'.

ENDFORM.

以上就是2000这个屏幕使用定制控制显示alv的主要代码
定制控制的学名叫做 customer control,是screen painter中的一个屏幕元素
image
看看它的样子
image
然后看看它的属性
image
上图中的代码:

DATA: SCR_ELMT_2000        TYPE SCRFNAME VALUE 'S2000CC01',     "定制控制控件,用于存放ALV容器

就是为了使用screen painter中创建的名为S2000CC01的屏幕元素对应的定制控制
代码中还有一部分:

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      I_STRUCTURE_NAME = 'ALV_LINE'"自定义的structure
    CHANGING
      CT_FIELDCAT      = GT_FIELDCAT.
<think>嗯,用户需要的是在PySide6中用外接键盘触发QLineEdit功能的示例代码。之前提供的引用中已经包含了QLineEdit基础用法、自动补全和信号处理,但缺少外接键盘的专门实现。用户可能正在开发需要硬件集成的应用,比如零售POS系统或工业控制界面。从引用[2][3][4]可以看出,用户对信号机制应该有基础认知,但需要更具体的物理键盘事件处理方案。用户可能遇到的问题是:外接键盘(如USB扫码枪)输入时,普通的textChanged信号可能不够,需要区分物理键盘和虚拟键盘事件。外接键盘在Qt中会被识别为普通键盘事件,关键在于处理按键时序。引用[3]提到的keyPressEvent重写是核心方案,但需要补充两点实际经验:1)工业扫码枪通常以"\r"结束输入,2)需要过滤功能键防止误触发。用户可能不知道Qt的QKeyEvent会自动捕获外接键盘输入,这个技术细节值得强调。在代码实现上,分层次展示比较友好。基础版演示重写事件方法,增强版增加超时机制——这是实际项目中的常见需求,因为扫码枪输入可能被系统误识别为多个键盘事件。引用[2]的自动补全代码结构可以借鉴,但要提醒用户关闭默认补全,否则和外接键盘输入会冲突。突然想到用户没提但可能需要的细节:外接键盘的按键码可能和电脑键盘不同,建议打印key()值方便调试。这个在引用[3]的undo方法示例里没涉及,属于硬件集成的经验之谈,应该作为注意事项补充。</think> 以下是基于PySide6的`QLineEdit`外接键盘触发功能实现方案,结合信号处理和事件过滤机制: ### 基础实现(监听外接键盘输入) ```python import sys from PySide6.QtWidgets import QApplication, QLineEdit, QVBoxLayout, QWidget from PySide6.QtCore import Qt class KeyInputWidget(QWidget): def __init__(self): super().__init__() self.line_edit = QLineEdit() self.line_edit.setPlaceholderText("外接键盘输入将触发事件") # 连接信号:实时响应输入 self.line_edit.textChanged.connect(self.on_text_changed) # 连接信号:回车键确认 self.line_edit.returnPressed.connect(self.on_enter_pressed) layout = QVBoxLayout() layout.addWidget(self.line_edit) self.setLayout(layout) def on_text_changed(self, text): print(f"实时输入: {text}") # 打印每次按键变化 def on_enter_pressed(self): print(f"最终提交: {self.line_edit.text()}") # 回车键确认 if __name__ == "__main__": app = QApplication(sys.argv) window = KeyInputWidget() window.show() sys.exit(app.exec()) ``` ### 增强方案(硬件键盘事件过滤) ```python import sys from PySide6.QtWidgets import QApplication, QLineEdit, QWidget from PySide6.QtCore import QEvent class HardwareKeyboardFilter(QWidget): def __init__(self): super().__init__() self.line_edit = QLineEdit() # 安装事件过滤器 self.line_edit.installEventFilter(self) self.setGeometry(300, 300, 300, 100) self.setWindowTitle('外接键盘监听') layout = QVBoxLayout() layout.addWidget(self.line_edit) self.setLayout(layout) def eventFilter(self, obj, event): if obj is self.line_edit: # 监听键盘事件 if event.type() == QEvent.KeyPress: print(f"物理按键: {event.key()}, 文本: {self.line_edit.text()}") # 扫码枪特殊处理(以回车结束) if event.key() == Qt.Key_Return: self.process_barcode(self.line_edit.text()) self.line_edit.clear() return super().eventFilter(obj, event) def process_barcode(self, code): print(f"扫码枪输入: {code}") # 在此添加业务逻辑(如数据库查询) if __name__ == "__main__": app = QApplication(sys.argv) window = HardwareKeyboardFilter() window.show() sys.exit(app.exec()) ``` ### 功能说明 1. **信号机制** - `textChanged`:实时响应每个字符输入 - `returnPressed`:专为物理键盘回车键设计[^3] 2. **事件过滤** - 重写`eventFilter`捕获原始键盘事件 - 可区分物理键盘与虚拟键盘输入[^4] 3. **扫码枪优化** - 通过`Key_Return`检测输入结束 - 清空输入框避免重复提交[^2] ### 注意事项 1. 外接键盘在Qt中会被识别为普通输入设备 2. 特殊功能键(如F1-F12)需检查键值映射 3. 工业扫码枪建议启用`setInputMask()`限制输入格式 4. 若需屏蔽软键盘,设置:`self.line_edit.setAttribute(Qt.WA_InputMethodEnabled, False)`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值