Ibm midrange 如何使用RPGLE对不同字段的单词进行子字符串和断开?

Ibm midrange 如何使用RPGLE对不同字段的单词进行子字符串和断开?,ibm-midrange,rpgle,Ibm Midrange,Rpgle,我遇到过关于子字符串的问题,这些子字符串来自输入,并存储在具有不同字段长度的目标字段中 我有四个35A输入字段条件,如果输入行1的35A位置的字符不是空格,输入行2的第一个字符不是空格, 然后将输入行字段1的最后一个字移动到目标字段2。相同的规则将应用到第2、3、4行的目标字段。它还将提示错误 如果目标字段长度不足以存储总共四个输入字段,则移动后输入字 情景1: 输入1 35A:|汤姆卡特旧巴生路1241号| 输入2 35A:| Rired,58785意外收获站Johnan | 输入3 35A

我遇到过关于子字符串的问题,这些子字符串来自输入,并存储在具有不同字段长度的目标字段中

我有四个35A输入字段条件,如果输入行1的35A位置的字符不是空格,输入行2的第一个字符不是空格, 然后将输入行字段1的最后一个字移动到目标字段2。相同的规则将应用到第2、3、4行的目标字段。它还将提示错误 如果目标字段长度不足以存储总共四个输入字段,则移动后输入字

情景1:

输入1 35A:|汤姆卡特旧巴生路1241号|
输入2 35A:| Rired,58785意外收获站Johnan |
输入3 35A:|应力湾白厅奇尼亚|
输入4 35A:| LL ST JAMES|

预期结果存储到4行目标字段,每行40A。

目的地140A区:汤姆市旧巴生路1241号|
目的地字段2 40A:|分类,58785意外收获展位|
目的地字段3 40A:|约翰南压力湾白厅|-海湾世界依然存在
目的地字段4 40A:| CHIGNALL ST JAMES|

情景2:

输入1 35A:|汤姆卡特旧巴生路1241号|
输入2 35A:| Rired,58785意外收获展位约翰南|
输入3 35A:|应力湾白厅奇尼亚|
输入4 35A:| LL ST JAMES TAXES STATES STAND CITY|

预期结果存储到4行目标字段,每行40A。

目的地140A区:汤姆市旧巴生路1241号|
目的地字段2 40A:|分类,58785意外收获展位|
目的地字段3 40A:|约翰南压力湾白厅|-保留空间的“海湾”世界
目的地字段4 40A:| CHIGNALL ST JAMES TAXES STATES站CI |-提示错误消息,因为“TY”在40长度字段中不够合适


非常感谢您的帮助,谢谢。很抱歉我的英语不好。

首先,当数据以35A的形式输入时,您为什么要尝试存储在40A中

第二,为什么要读取/存储多个字段而不是单个字段?如果您使用的是5250绿色屏幕。请查看或查看关键字。如果您使用的是GUI或基于web的UI…它应该更容易

如果你一定要做你要求的事

我将
%trim()
并将所有输入字符串连接成一个大字符串。然后循环通过

string = %trim(Inp1) + %trim(Inp2) + %trim(Inp3) + %trim(Inp4);
searchFrom = 40;
strPos = 1;
for x = 1 to 4;
  endPos = %scanr(' ':string:searchFrom);
  destArr(x) = %subst(string:strPos:endPos);
  strPos = endPos + 1;
  searchFrom = strPos + 40;
endfor;
上面缺少任何类型的错误检查,但它应该能让您了解这一点


注意:
%scarn()
是v7.3的新版本。如果在早期版本中,您需要构建自己的
scan_rev()
函数。

首先,当数据以35A的形式输入时,为什么要尝试存储在40A中

第二,为什么要读取/存储多个字段而不是单个字段?如果您使用的是5250绿色屏幕。请查看或查看关键字。如果您使用的是GUI或基于web的UI…它应该更容易

如果你一定要做你要求的事

我将
%trim()
并将所有输入字符串连接成一个大字符串。然后循环通过

string = %trim(Inp1) + %trim(Inp2) + %trim(Inp3) + %trim(Inp4);
searchFrom = 40;
strPos = 1;
for x = 1 to 4;
  endPos = %scanr(' ':string:searchFrom);
  destArr(x) = %subst(string:strPos:endPos);
  strPos = endPos + 1;
  searchFrom = strPos + 40;
endfor;
上面缺少任何类型的错误检查,但它应该能让您了解这一点


注意:
%scarn()
是v7.3的新版本。如果在早期版本中,您需要构建自己的
scan_rev()
函数。

您可以使用
%checkr(“”,str)
查找字符串中的最后一个非空字符。您尝试了什么?发生了什么?我设法找到了最后一个非空字符,但问题是如何根据我的预期结果连接正确的位置?任何想法或想法逻辑?您可以使用
%checkr(“”,str)
查找字符串中的最后一个非空字符。您尝试了什么?发生了什么?我设法找到了最后一个非空字符,但问题是如何根据我的预期结果连接正确的位置?任何想法或想法逻辑?这将无法正确处理空格。感谢您的回复,数据来自于35A是旧的遗留系统保持不变,40A是必需的。%SCANR函数仍然可以在V7R2上使用?如果不能,任何示例都可以参考内置扫描版本()?如果total word无法匹配目标字段,如何为我的场景2提示错误?
%scanr
是v7.3中出现的内置程序。它反向扫描字符串以查找字符串。您应该能够通过for循环和
%substr
@DumAco实现这一点。通常,这不是一个为您编写代码的站点。向我们展示您所拥有的,我们可以帮助您了解具体情况。%substr和%subst有什么不同?哪一个适合我的情况?这将无法正确处理空格。感谢您的回复,数据来自于35A是旧的遗留系统保持不变,40A是必需的。在V7R2上仍然可以使用%scaner函数?如果不能,任何示例都可以参考内置扫描版本()?如果total word无法匹配目标字段,如何为我的场景2提示错误?
%scanr
是v7.3中出现的内置程序。它反向扫描字符串以查找字符串。您应该能够通过for循环和
%substr
@DumAco实现这一点。通常,这不是一个为您编写代码的站点。向我们展示您所拥有的,我们可以帮助您了解具体情况。%substr与%subst有什么不同?哪一个适合我的情况?