首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RPGle -我希望我能用RPGLe做一些“反射”

RPGle -我希望我能用RPGLe做一些“反射”
EN

Stack Overflow用户
提问于 2013-10-30 22:25:53
回答 3查看 589关注 0票数 5

我希望我能用RPGLe做一些反射。我所说的反射是指:“在运行时确定对象能力的过程或机制”。

假设你有这样的数据结构:

代码语言:javascript
复制
 D DS_Format       DS                  Qualified Based(pDS_Format)
 D  Type                         20I 0 Inz(1)
 D  Label                        50A   Inz('myLabel')
 D  Description                5000A   Inz('myDescription')        

使用反射api,我可以这样做:

代码语言:javascript
复制
Reflection_ListSubfields(DS_Format); 

=>返回此数组:{ 'Type','Label','Description‘}

然后,我可以这样做:

代码语言:javascript
复制
Reflection_GetSubfield(DS_Format : 'Label'); => return 'myLabel'

我希望我也能这样做:

代码语言:javascript
复制
Reflection_GetSubfieldType(DS_Format : 'Label'); => return 'A'
Reflection_GetSubfieldLength(DS_Format : 'Label'); => return 50
Reflection_GetSubfieldPrecision(DS_Format : 'Type'); => return 0

有了这个,我希望我可以做这样的事情(只需做一些小工作):

代码语言:javascript
复制
SerializeXml(DS_Format); //I build xml with one line of code !

并获取:

代码语言:javascript
复制
<DS_Format>
    <Type>1</Type>
    <Label>myLabel</Label>
    <Description>myDescription</Description>
</DS_Format>

与DeserializeXml(MyXml)相反;

反射将帮助我构建非常酷的apis。有什么办法吗?

EN

回答 3

Stack Overflow用户

发布于 2013-10-31 00:33:18

我一直在思考这些概念中的一些,可能会有一个变通的办法。(我现在没有时间写一个完整的答案&充实细节,但等待您看到有一些希望;-)尽管有些人可能会认为这是一种欺骗。)

基本概念是这样的:如果您定义了一个具有所需格式的表,并且您的days结构允许在外部定义DS,那么您可以使用嵌入式SQL描述该表或查询SYSCOLUMNS,以获得字段定义,最好是在过程中。

诚然,这与refection不是一回事,但可以实现相同的功能。人们可能只会在有限的情况下这样做。我相信其他人会指出各种各样的问题,但这里的重点是这是可能的。

票数 3
EN

Stack Overflow用户

发布于 2014-02-20 05:13:55

我想知道调试API是否可以帮助获得您所要求的至少一些行为……

http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/topic/apis/debug1.htm

其中一个包含的函数是转储模块变量(QteDumpModuleVariables)应用编程接口

当然,您的作业必须处于调试模式才能使用这些API...

票数 2
EN

Stack Overflow用户

发布于 2014-04-25 16:55:45

下面是WarrenT想法的一个非常简单的实现。

代码语言:javascript
复制
create table ds_format
(
   Type        numeric(20, 0),
   Label       char(50),
   Description char(5000)
);

SQL描述区域的常量:

代码语言:javascript
复制
D SQL_NUM         C                   99

在返回字段名数组的SQLRPGLE模块中实现Reflection_ListSubfields:

代码语言:javascript
复制
P Reflection_ListSubfields...                         
P                 B                                
 *                                                 
D                 PI            80A   Dim(SQL_NUM) 
D  name                         30A   Const
 *                                                 
D tableName       S                   Like(name)   
D i               S              3S 0 Inz          
D fieldList       S             80A   Dim(SQL_NUM) 
 /free                                             
    EXEC SQL include SQLDA;                        

    // retrieve description of the table                                           
    tableName = name;                              
    EXEC SQL describe table :tableName into :sqlda;

    // loop over all fields and
    // retrieve the name                                                   
    for i = 1 to SQLD;                             
       SQLVAR = SQL_VAR(i);                        
       fieldList(i) = SQLNAME;                     
    endfor;                                        

    return fieldList;
 /end-free           
P                 E  

下面是一个非常粗略的Reflection_GetSubfield实现,它以字符串的形式返回值:

代码语言:javascript
复制
P Reflection_GetSubfield...                                   
P                 B                                        
 *                                                         
D                 PI         32000A   Varying              
D  dataStruct                     *   Const                
D  name                         30A   Const
D  fieldName                    80A   Const                
 *                                                         
D tableName       S                   Like(name)           
D i               S              3S 0 Inz                  
D start           S              6S 0 Inz(1)               
D length          S              6S 0 Inz(1)               
D p_str           S               *                        
D str             S          32000A   Based(p_str)         
D value           S          32000A   Varying              
 /free                                                 
    EXEC SQL include SQLDA;                        

    // retrieve description of the table                                           
    tableName = name;                                  
    EXEC SQL describe table :tableName into :sqlda;    

    // loop over all fields
    for i = 1 to SQLD;                                 
       SQLVAR = SQL_VAR(i);                            

       length = SQLLEN;                                

       // Zoned decimal?
       if SQLTYPE = 489;                               
          length = SQLLEN / 256;                       
       endif;                                          

       // field found?                                                       
       if SQLNAME = fieldName;                         
          leave;                                       
       endif;

       start += length;                             
    endfor;                                            

    p_str = dataStruct;                                 

    // retrieve value from our string                                                
    value = %trim(%subst(str: start: length));  

    return value;                               
 /end-free                                      
P                 E                             

我猜有了这些信息,实现其他三个过程就相对容易了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19684993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档