- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在从 java 调用一个 RPGIV 程序,rpgiv 程序返回多条记录作为输出参数。
我尝试了以下操作来返回从 rpgiv 返回的所有行。
// Define Output Data Structure
AS400DataType[] outputData =
{
new AS400Text(20), // parentOperationsItemId;
new AS400Text(10), // parentOperationsItemType;
new AS400Text(10), // parentOperationsItemSubType;
new AS400Text(20), // parentKnownbyId;
new AS400Text(10), // parentInternalStatus;
new AS400Text(1), // parentLeafIndicator;
new AS400Text(20), // childOperationsItemId;
new AS400Text(10), // childOperationsItemType;
new AS400Text(10), // childOperationsItemSubType;
new AS400Text(20), // childKnownbyId;
new AS400Text(10), // childInternalStatus;
new AS400Text(1), // childLeafIndicator;
new AS400Text(10) // InternalStatus;
};
AS400Structure [] outputDataConverter2 = new AS400Structure[3];
outputDataConverter2[0] = new AS400Structure(outputData);
outputDataConverter2[1] = new AS400Structure(outputData);
outputDataConverter2[2] = new AS400Structure(outputData);
Object[] dataInputInformation =
{
sSqlSelect,
sFetchDirection,
sOperationsItemId,
sparentOperationsItemTypeList,
sparentOperationsItemSubTpeList,
sparentInternalStatusList,
schildOperationsItemType,
schildOperationsItemSubTpeList,
schildInternalStatusList,
sLinkStatus
};
Object[] dataInputInformationControl =
{
sPosition,
new BigDecimal(sRowsFetched)
};
// Set up the parameter list
ProgramParameter[] parameterList = new ProgramParameter[4];
parameterList[0] = new ProgramParameter(7); //ReturnStatus
parameterList[1] = new ProgramParameter(inputDataConverter.toBytes(dataInputInformation)); //Input
parameterList[2] = new ProgramParameter(inputDataControlConverter.toBytes(dataInputInformationControl)); //Control
parameterList[3] = new ProgramParameter(outputDataConverter2[0].getByteLength()*3); //Output
try
{
// Set the program name and parameter list.
program.setProgram(programName, parameterList);
// Run Function
if (program.run() != true)
{
// Calling Error
AS400Message[] messagelist = program.getMessageList();
for (int i = 0; i < messagelist.length; ++i)
{
output[0].ReturnStatus += messagelist[i] + "\n";
}
}
else
{
// Set the output
output[0] = new GetPlannedRoute();
output[1] = new GetPlannedRoute();
output[2] = new GetPlannedRoute();
output[0].SetOutput(parameterList, outputDataConverter2[0]);
output[1].SetOutput(parameterList, outputDataConverter2[1]);
output[2].SetOutput(parameterList, outputDataConverter2[2]);
}
}
这是在输出类中
public void SetOutput(ProgramParameter[] parameterList, AS400Structure outputPlannedRouteConverter)
{
ReturnStatus = P6Entity.CallingRPGFunction.ConvertReturnStatus(parameterList[0]);
Object[] outputData = (Object[]) outputPlannedRouteConverter.toObject(parameterList[3].getOutputData());
parentOperationsItemId = ((String) outputData[0]).trim();
parentOperationsItemType = ((String) outputData[1]).trim();
parentOperationsItemSubType = ((String) outputData[2]).trim();
parentKnownbyId = ((String) outputData[3]).trim();
parentInternalStatus = ((String) outputData[4]).trim();
parentLeafIndicator = ((String) outputData[5]).trim();
childOperationsItemId = ((String) outputData[6]).trim();
childOperationsItemType = ((String) outputData[7]).trim();
childOperationsItemSubType = ((String) outputData[8]).trim();
childKnownbyId = ((String) outputData[9]).trim();
childInternalStatus = ((String) outputData[10]).trim();
childLeafIndicator = ((String) outputData[11]).trim();
InternalStatus = ((String) outputData[12]).trim();
}
我不确定如何定义 parameterList[3] 以便能够接收多行返回或多个数据结构。以及如何获取输出参数List[3]的具体实例。
RPGIV 代码:
https://www.dropbox.com/s/a29wf1ft0f07sx1/functionCode.txt?dl=0
* FetchedData Occures OCCURS(64) INZ就是我要返回给java的输出数据集。
最佳答案
编辑以显示如何转换打包值。
让我们把它缩减一点。这是一个与您的结构相似的小型 RPG 程序:
D V00001 DS OCCURS(64)
D F0000G 20A
D F0000H 10A
D F0000I 10A
D F0000J 20A
D F0000K 9p 0
D F0000L 1A
D F0000M 20A
D F0000N 10A
D F0000O 10A
D F0000P 20A
D F0000Q 10A
D F0000R 1A
D F0000S 10A
c *entry plist
c parm v00001
// populate the first entry
%occur(v00001) = 1;
F0000G = *ALL'1234567890';
F0000H = *ALL'A';
F0000I = *ALL'B';
F0000J = *ALL'C';
F0000K = 123456789;
F0000L = *ALL'E';
F0000M = *ALL'F';
F0000N = *ALL'G';
F0000O = *ALL'H';
F0000P = *ALL'I';
F0000Q = *ALL'J';
F0000R = *ALL'K';
F0000S = *ALL'a';
// populate the 2nd entry
%occur(v00001) = 2;
F0000G = *ALL'1234567890';
F0000H = *ALL'1234567890';
F0000I = *ALL'1234567890';
F0000J = *ALL'1234567890';
F0000K = 200;
F0000L = *ALL'1234567890';
F0000M = *ALL'1234567890';
F0000N = *ALL'1234567890';
F0000O = *ALL'1234567890';
F0000P = *ALL'1234567890';
F0000Q = *ALL'1234567890';
F0000R = *ALL'1234567890';
F0000S = *ALL'b';
// populate the third entry
%occur(v00001) = 3;
F0000G = *ALL'1234567890';
F0000H = *ALL'1234567890';
F0000I = *ALL'1234567890';
F0000J = *ALL'1234567890';
F0000K = 300;
F0000L = *ALL'1234567890';
F0000M = *ALL'1234567890';
F0000N = *ALL'1234567890';
F0000O = *ALL'1234567890';
F0000P = *ALL'1234567890';
F0000Q = *ALL'1234567890';
F0000R = *ALL'1234567890';
F0000S = *ALL'c';
// reset back to the beginning
%occur(v00001) = 1;
dump(a);
*inlr = *on;
这是成功读取各种“记录”的 Java(我不是 Java 程序员!):
public String testSO(AS400 system, String programName) {
boolean success = false;
final int ONE_ROW_LEN = 147;
final int DS_ROWS = 64;
AS400Text dsText = new AS400Text(ONE_ROW_LEN * DS_ROWS);
AS400Text p0000g = new AS400Text(20);
AS400Text p0000h = new AS400Text(10);
AS400Text p0000i = new AS400Text(10);
AS400Text p0000j = new AS400Text(20);
int p0000k; // packed(9, 0) is 5 bytes
AS400Text p0000l = new AS400Text( 1);
AS400Text p0000m = new AS400Text(20);
AS400Text p0000n = new AS400Text(10);
AS400Text p0000o = new AS400Text(10);
AS400Text p0000p = new AS400Text(20);
AS400Text p0000q = new AS400Text(10);
AS400Text p0000r = new AS400Text( 1);
AS400Text p0000s = new AS400Text(10);
String ds = null;
String returnString = null;
try
{
ProgramCall program = new ProgramCall(system);
// Set up the parameter list
ProgramParameter[] parameterList = new ProgramParameter[1];
parameterList[0] = new ProgramParameter(ONE_ROW_LEN * DS_ROWS);
program.setProgram(programName, parameterList);
success = program.run();
if(success!=true){
AS400Message[] messagelist = program.getMessageList();
System.out.println("\nMessages received:\n");
for (int i = 0; i < messagelist.length; i++) {
System.out.println(messagelist[i]);
}
} else {
// RPG is returning a giant chunk of memory
//allBytes = parameterList[0].getOutputData();
ds = (String)dsText.toObject(parameterList[0].getOutputData());
System.out.println("ds=" + ds);
System.out.println("ds len=" + ds.length());
// Need to index our way into the block of memory
// zero-based!
int row = 0;
int x = row * ONE_ROW_LEN;
System.out.println("x=" + x);
// parse out the individual elements for this row
int len = p0000g.getByteLength();
String s0000g = ds.substring(x, x+len);
x += len;
len = p0000h.getByteLength();
String s0000h = ds.substring(x, x+len);
x += len;
len = p0000i.getByteLength();
String s0000i = ds.substring(x, x+len);
x += len;
len = p0000j.getByteLength();
String s0000j = ds.substring(x, x+len);
// this is packed(9, 0)
x += len;
len = 5;
byte[] b0000k = dsText.toBytes(ds.substring(x, x+len));
BigDecimal d0000k = (BigDecimal)new AS400PackedDecimal(9, 0).toObject(b0000k);
p0000k = d0000k.intValue();
String s0000k = d0000k.toString();
x += len;
len = p0000l.getByteLength();
String s0000l = ds.substring(x, x+len);
x += len;
len = p0000m.getByteLength();
String s0000m = ds.substring(x, x+len);
x += len;
len = p0000n.getByteLength();
String s0000n = ds.substring(x, x+len);
x += len;
len = p0000o.getByteLength();
String s0000o = ds.substring(x, x+len);
x += len;
len = p0000p.getByteLength();
String s0000p = ds.substring(x, x+len);
x += len;
len = p0000q.getByteLength();
String s0000q = ds.substring(x, x+len);
x += len;
len = p0000r.getByteLength();
String s0000r = ds.substring(x, x+len);
x += len;
len = p0000s.getByteLength();
String s0000s = ds.substring(x, x+len);
returnString = s0000s;
System.out.println("Return=" + returnString);
System.out.println("g=" + s0000g);
System.out.println("h=" + s0000h);
System.out.println("i=" + s0000i);
System.out.println("i=" + s0000i);
System.out.println("j=" + s0000j);
System.out.println("k=" + s0000k);
System.out.println("l=" + s0000l);
System.out.println("m=" + s0000m);
System.out.println("n=" + s0000n);
System.out.println("o=" + s0000o);
System.out.println("p=" + s0000p);
System.out.println("q=" + s0000q);
System.out.println("r=" + s0000r);
System.out.println("r=" + s0000s);
}
} catch (Exception e) {
System.out.println("\ne:\n");
System.out.println(e);
System.out.println("\nStack trace:\n");
e.printStackTrace();
}
return returnString;
}
在 Java 中需要理解的关键部分是,在这种设计中,Parameter.getOutputData() 返回 byte[]。我不是 Java 程序员,所以我的 Java 代码很丑。我将返回的 byte[] 转换为 String 并将其作为 block 分配给 ds。然后,我暴力破解了一段代码,将各个变量逐个子字符串化。如果我了解更多 Java,我可能会将这些垃圾放入构造函数中,并可能将其作为列表公开。
在发布了所有这些之后,我无法以这种方式使用生产代码进行操作。我会让 IBM 程序员给我写一个 SuperUltimateBlockFetch 的包装器——该包装器将调用 SuperUltimateBlockFetch 并构建一个结果集供 Java 使用。他们甚至可以把它变成一个存储过程。这将使您不再依赖于了解 RPG 结构的内部构造,并使处理 Java 代码中的各个变量变得更加自然。然后你要做的就是调用存储过程并编写一个 while rs.next()
循环。
关于java - 如何从返回多条记录的java调用RPGIV程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30076472/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!