我希望我能用RPGLe做一些反射。我所说的反射是指:“在运行时确定对象能力的过程或机制”。
假设你有这样的数据结构:
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,我可以这样做:
Reflection_ListSubfields(DS_Format); =>返回此数组:{ 'Type','Label','Description‘}
然后,我可以这样做:
Reflection_GetSubfield(DS_Format : 'Label'); => return 'myLabel'我希望我也能这样做:
Reflection_GetSubfieldType(DS_Format : 'Label'); => return 'A'
Reflection_GetSubfieldLength(DS_Format : 'Label'); => return 50
Reflection_GetSubfieldPrecision(DS_Format : 'Type'); => return 0有了这个,我希望我可以做这样的事情(只需做一些小工作):
SerializeXml(DS_Format); //I build xml with one line of code !并获取:
<DS_Format>
<Type>1</Type>
<Label>myLabel</Label>
<Description>myDescription</Description>
</DS_Format>与DeserializeXml(MyXml)相反;
反射将帮助我构建非常酷的apis。有什么办法吗?
发布于 2013-10-31 00:33:18
我一直在思考这些概念中的一些,可能会有一个变通的办法。(我现在没有时间写一个完整的答案&充实细节,但等待您看到有一些希望;-)尽管有些人可能会认为这是一种欺骗。)
基本概念是这样的:如果您定义了一个具有所需格式的表,并且您的days结构允许在外部定义DS,那么您可以使用嵌入式SQL描述该表或查询SYSCOLUMNS,以获得字段定义,最好是在过程中。
诚然,这与refection不是一回事,但可以实现相同的功能。人们可能只会在有限的情况下这样做。我相信其他人会指出各种各样的问题,但这里的重点是这是可能的。
发布于 2014-02-20 05:13:55
我想知道调试API是否可以帮助获得您所要求的至少一些行为……
http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/topic/apis/debug1.htm
其中一个包含的函数是转储模块变量(QteDumpModuleVariables)应用编程接口
当然,您的作业必须处于调试模式才能使用这些API...
发布于 2014-04-25 16:55:45
下面是WarrenT想法的一个非常简单的实现。
create table ds_format
(
Type numeric(20, 0),
Label char(50),
Description char(5000)
);SQL描述区域的常量:
D SQL_NUM C 99在返回字段名数组的SQLRPGLE模块中实现Reflection_ListSubfields:
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实现,它以字符串的形式返回值:
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 我猜有了这些信息,实现其他三个过程就相对容易了。
https://stackoverflow.com/questions/19684993
复制相似问题