当前位置: 首页 > news >正文

T100开发实战:如何用azzi903和azzi850搞定自定义按钮的权限与布局?

T100深度开发实战:基于azzi903与azzi850的权限与布局定制指南

当企业ERP系统需要适应特定业务流程时,界面按钮的权限控制与布局调整往往成为开发的关键痛点。本文将系统性地拆解如何利用T100系统中的azzi903(功能菜单配置工具)与azzi850(功能权限管理工具)实现精细化的界面控制。

1. 理解T100界面架构的核心机制

T100系统的界面元素管理遵循严格的层级结构。每个程序界面(如cooi666)的功能按钮并非随意放置,而是通过"上阶功能编号"这一关键字段确定其在菜单体系中的归属位置。默认情况下,新增功能按钮会被归类到"弹出式菜单"(popup menu),这往往不符合实际业务操作流程的需求。

典型功能按钮的三种归属类型:

  • 整单操作(full-operator):针对整张单据的核心功能,如保存、审核
  • 单身操作(detail-operator):针对单据明细行的特定操作
  • 弹出式菜单(popup-menu):次级或辅助功能

理解这种分类机制是进行自定义布局的前提。例如,"审核后修改身份证"这类功能显然更适合放在"整单操作"区域而非默认的弹出菜单。

2. 功能按钮的全生命周期管理

2.1 从规格设计到代码生成

在规格设计器中新增功能按钮时,系统会自动生成Action代号(如modify_sfz),这个代号将成为后续所有操作的唯一标识。关键步骤包括:

  1. 在规格设计器右侧点击【新增项目】
  2. 在左侧Action设定区域定义:
    Action代号: modify_sfz 说明: 审核后修改身份证
  3. 上传规格并重新生成程序框架

注意:此时生成的按钮默认位于弹出式菜单,需要通过后续步骤调整位置

2.2 使用azzi903调整按钮布局

azzi903工具是调整功能按钮位置的核心武器。要将按钮从弹出式菜单迁移到整单操作区,需执行:

1. 查询目标程序编号(如cooi666) 2. 双击"整单操作"节点,复制其"上阶功能编号"(通常为full-operator) 3. 在"弹出式菜单"下找到目标Action代号 4. 将其"上阶功能编号"修改为刚才复制的值 5. 保存后重新生成4tm和4ad文件

这一过程实质上是修改了功能按钮在菜单树中的父节点,从而改变其最终显示位置。

2.3 通过azzi850实现权限控制

按钮显示在界面上后,还需要通过azzi850为其配置访问权限:

1. 查询作业编号(如cooi666) 2. 在功能授权界面找到新增的Action 3. 为不同角色勾选相应的执行权限

权限配置的颗粒度可以精确到:

  • 角色级别(如财务、采购等)
  • 组织架构级别(如分公司、部门等)
  • 特殊条件组合

3. 功能逻辑的代码实现要点

权限和布局配置完成后,需要在4GL程序中实现具体的业务逻辑。以"审核后修改身份证"功能为例:

3.1 对话框控制与事务管理

ON ACTION modify_sfz LET g_action_choice="modify_sfz" IF cl_auth_chk_act("modify_sfz") THEN IF g_oozyuc_m.oozyucstus = 'Y' THEN CALL s_transaction_begin() CALL cooi666_modify_sfz() RETURNING l_success IF NOT l_success THEN CALL s_transaction_end('N', '0') # 回滚 ELSE CALL s_transaction_end('Y', '0') # 提交 END IF ELSE # 报错:单据未审核 INITIALIZE g_errparam TO NULL LET g_errparam.code = "coo-00667" CALL cl_err() EXIT MENU END IF END IF

3.2 字段修改的核心函数

PRIVATE FUNCTION cooi666_modify_sfz() DEFINE l_success LIKE type_t.num10 LET l_success = TRUE OPEN cooi666_cl USING g_enterprise,g_oozyuc_m.oozyuc00 IF STATUS THEN # 错误处理 CLOSE cooi666_cl LET l_success = FALSE RETURN l_success END IF DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM) INPUT BY NAME g_oozyuc_m.oozyuc005 AFTER INPUT UPDATE oozyuc_t SET oozyuc005 = g_oozyuc_m.oozyuc005 WHERE oozyucent = g_enterprise AND oozyuc001 = g_oozyuc_m.oozyuc001 IF SQLCA.SQLCODE THEN CLOSE cooi666_cl CALL cl_err() LET l_success = FALSE END IF END INPUT CLOSE cooi666_cl RETURN l_success END FUNCTION

4. 高级应用场景与最佳实践

4.1 跨单据操作按钮的实现

在某些场景下,需要实现单据间的数据传递,例如将已审核单据的数据复制到另一张单据:

实现步骤:

  1. 在规格设计器中新增"产生单据"按钮
  2. 通过azzi903调整到目标菜单位置
  3. 使用azzi850配置权限
  4. 实现数据复制逻辑:
PRIVATE FUNCTION cooi666_insert_oozzuc() DEFINE r_success LIKE type_t.num10 DEFINE l_oozzuc RECORD oozzucent LIKE oozzuc_t.oozzucent, oozzuc001 LIKE oozzuc_t.oozzuc001, ... END RECORD # 从原单赋值 LET l_oozzuc.oozzucent = g_enterprise LET l_oozzuc.oozzuc001 = g_oozyuc_m.oozyuc001 ... # 插入目标表 INSERT INTO oozzuc_t VALUES(l_oozzuc.*) IF SQLCA.SQLCODE THEN CALL cl_err() LET r_success = FALSE END IF RETURN r_success END FUNCTION

4.2 界面元素的动态控制

通过程序逻辑可以实现更精细的界面控制:

# 根据单据状态动态禁用按钮 IF g_oozyuc_m.oozyucstus = 'Y' THEN CALL gfrm_curr.setElementDisabled("modify_sfz", FALSE) ELSE CALL gfrm_curr.setElementDisabled("modify_sfz", TRUE) END IF

4.3 参数化功能的扩展

对于需要在标准参数作业中添加字段的情况:

  1. 使用azzi993查询作业对应的参数表
  2. 通过azzi990添加参数记录
  3. 在azzi993中配置作业参数
# 查询参数作业对应的表 azzi993 → 查询aoos010 → 显示对应表为ooaa_t # 添加参数记录 azzi990 → 查询ooaa_t → 新增记录并维护字段属性 # 配置作业参数 azzi993 → 设置aoos010的查询方案

这种开发模式在T100系统中非常普遍,掌握后可以灵活应对各种定制化需求。实际项目中,建议建立完整的测试用例来验证按钮权限和布局调整的效果,特别是在多角色、多组织的复杂场景下。

http://www.jsqmd.com/news/843144/

相关文章:

  • 爱快路由下Mercury AC跨三层寻AP:Option字段实战与避坑指南
  • 简历投了全石沉大海?实测3个免费AI简历神器,HR秒通过、面试翻3倍!
  • 从零构建基于GD32的数字示波器:硬件架构与核心电路解析
  • 2个实测免费的AI简历神器,简历回复率翻3倍,顺利过ATS机筛!
  • 为 OpenClaw 配置 Taotoken 作为 OpenAI 兼容供应商的详细步骤
  • 如何用3步永久保存微信聊天记录?WeChatMsg帮你掌控数字记忆
  • 离子阱量子计算机与SIMD编译优化技术解析
  • GPU缓存架构优化与AI加速器内存技术解析
  • [已解决]ModuleNotFoundError: No module named ‘einops‘:从报错到精通,一文掌握深度学习环境配置与依赖管理
  • 别再为RS485上下拉头疼了!手把手教你搞定RK3568开发板上的ttyS7口(附Qt调试工具源码)
  • Android 11 热点永不关闭的三种实现方案:从源码修改到API调用
  • STM32串口屏通信避坑指南:为什么你的陶晶驰T0屏有时没反应?(附示波器调试实录)
  • AI Agent大模型入门指南:小白程序员必收藏,轻松掌握智能体核心技术
  • C8051Fxx系列MCU的Bootloader与ISP功能开发指南
  • Cortex-M中断优先级配置与优化实践
  • Arm DSTREAM-XT调试系统:多核SoC开发的高效解决方案
  • NotebookLM相似文档推荐不准,深度解析向量维度坍缩、跨域语义漂移与上下文窗口截断三大根源问题
  • 量子退火优化CPS测试用例生成的技术解析
  • 别再手动拖元件了!Cadence Allegro SPB17.4的Room功能,让你的PCB布局效率翻倍
  • 别只盯着密码爆破:身份认证漏洞的3个“非主流”攻击面与防御思考
  • FPGA硬件在环测试在智能医疗设备中的应用与优化
  • 架构重构:HiveWE如何通过现代C++20技术栈重塑魔兽争霸III地图编辑体验
  • 告别RAM不足!FMQL045裸机大程序烧录Flash全攻略:ICF配置、FSBL避坑与国产Flash选型
  • NotebookLM期刊推荐矩阵(含影响因子、APC费用、AI政策条款、平均一审周期——仅限本周开放下载)
  • 简历被AI“带偏”?实测这款不编造经历、数据全存本地的求职神器!
  • AI助力泳装设计,如何让你的品牌快速出圈?
  • DRAM-PIM技术加速数据库分析的原理与实践
  • Typora不同版本集成LightBox插件实现图片放大查看的差异与实战
  • FreeRTOS互斥信号量实战:用STM32CubeIDE解决多任务访问共享串口的优先级翻转问题
  • USB2.0 Reset信号详解:从SE0状态到高速握手的完整时序分析