Progress 12.8中如何自动遍历类内临时表以优化代码?
在Progress 12.8中自动遍历类内临时表的方案
可以实现自动遍历类内所有临时表,无需每次新增临时表都修改UploadData方法。核心思路是利用Progress的句柄机制遍历当前会话中的临时表集合,结合过滤条件精准定位需要处理的临时表。
优化后的实现代码
修改UploadData方法
将原有的逐个调用逻辑替换为遍历逻辑:
METHOD PUBLIC VOID UploadData(): DEFINE VARIABLE hTempTable AS HANDLE NO-UNDO. // 遍历当前会话中所有临时表句柄 DO hTempTable = FIRST SESSION:TEMP-TABLES: // 过滤条件:仅处理当前类创建的临时表 IF hTempTable:CREATOR = THIS-OBJECT:HANDLE THEN DO: // 仅处理有数据的临时表,避免空表无效调用 IF hTempTable:NUM-RECORDS > 0 THEN DO: LoadTableJSON(INPUT hTempTable, INPUT TRUE). END. END. // 可选:按临时表名称前缀过滤(比如你的临时表都以TT-开头) // IF hTempTable:NAME BEGINS "TT-" THEN DO: // IF hTempTable:NUM-RECORDS > 0 THEN DO: // LoadTableJSON(INPUT hTempTable, INPUT TRUE). // END. // END. END. END METHOD.
保留原LoadTableJSON方法
原方法无需修改,它已经通过句柄接收临时表,具备通用性:
METHOD PRIVATE CHARACTER LoadTableJSON(INPUT hTable AS HANDLE, INPUT lUpload AS LOGICAL): DEFINE VARIABLE cTableName AS CHARACTER NO-UNDO. DEFINE VARIABLE iTableID AS INTEGER NO-UNDO. DEFINE VARIABLE lcJson AS LONGCHAR NO-UNDO. DEFINE VARIABLE cResult AS CHARACTER NO-UNDO. ASSIGN cTableName = hTable:NAME iTableID = INT(hTable:SERIALIZE-NAME). WriteLog(SUBSTITUTE("Processing &1", cTableName)). hTable:WRITE-JSON("LONGCHAR", lcJson, TRUE). ASSIGN cResult = TransformJSON(STRING(lcJson)). WriteLog(SUBSTITUTE("JSON Loaded - &1", cResult)). IF lUpload THEN PostData(INPUT cResult, INPUT iTableID). WriteLog("Processing Finished"). END METHOD.
关键原理说明
SESSION:TEMP-TABLES集合:Progress会话会维护当前所有临时表的句柄集合,通过FIRST/LAST/NEXT/PREVIOUS可以遍历所有临时表。CREATOR属性过滤:临时表句柄的CREATOR属性会指向创建它的对象(即你的自定义类实例),通过这个条件可以确保只处理当前类内定义的临时表,避免干扰其他临时表。NUM-RECORDS判断:提前检查临时表是否有数据,避免对空表执行无效的JSON序列化和上传操作,提升效率。
扩展说明
- 如果你的临时表命名有统一规则(比如都以
TT-开头),可以直接用名称前缀过滤,实现更简单。 - 若需要按特定顺序处理临时表,可以在临时表的
SERIALIZE-NAME或自定义属性中定义排序规则,遍历后排序再处理。
内容的提问来源于stack exchange,提问作者Raphael Frei
相关产品推荐
相关产品推荐

