IBM大型机论坛索引
 
登录
 
IBM大型机论坛索引 大型机:搜索 IBM Mainframe论坛:常见问题解答 寄存器
 

在排序数组中查找重复项


IBM大型机论坛 -> COBOL程式设计
发表新话题   回复主题
查看上一个主题 :: 查看下一个主题  
作者 信息
satyapn9

新的用户


已加入:2010年10月8日
帖子:27
地点:印度

发布发表:2013年5月17日,星期五,上午11:55
引用回复

嗨,我在排序数组中发现重复项时遇到问题。以下是详细信息。

有一个排序数组,TABLE-FIELD-YY的默认值为'N',如果找到TABLE-FIELD-XX的值,我将设置为'Y'。它是使用二进制搜索(SEARCH ALL)实现的。由于正在执行二进制搜索,因此值“ Y”将不会设置为TABLE-FIELD-XX的重复项。

在这里,我想利用以下循环将TABLE-FIELD-XX的所有重复项的“ Y”移动。但是,即使在查找该数组中所有重复项的逻辑下面,它也不会将“ Y”移至所有重复项。我的意思是骗子计数很好。


码:
   对我进行1比1的调整               
              UNTIL I >  MAX-COUNT-ARRAY   
     COMPUTE J = I + 1             
    对J进行1到K的转换 
               UNTIL K >  MAX-COUNT-ARRAY   
        IF 表格字段-XX(I) =         
           TABLE-FIELD-XX(K)           
           将“ Y”移动到TABLE-FIELD-YY(K) 
           ADD 1 TO DUPS-COUNT                       
        END-IF                                           
     结束执行                                         
   END-PERFORM.     


有人可以帮助我实现这一目标吗?我在这里想念什么吗?
回到顶部
查看用户资料 发送私信
潘多拉魔盒

主持人


已加入:2006年9月7日
职位:1565
地点:仙女座星系

发布发表:2013年5月17日,星期五12:13 pm
引用回复

重申我的理解

当TABLE-FIELD-XX(I)是重复值时,是否要将“ Y”移到TABLE-FIELD-YY(I)?
回到顶部
查看用户资料 发送私信
satyapn9

新的用户


已加入:2010年10月8日
帖子:27
地点:印度

发布发表:2013年5月17日,星期五,下午12:47
引用回复

是的,我想为TABLE-FIELD-YY(I)的所有重复项移动'Y'
回到顶部
查看用户资料 发送私信
潘多拉魔盒

主持人


已加入:2006年9月7日
职位:1565
地点:仙女座星系

发布发表:2013年5月17日,星期五,下午12:58
引用回复

试试这个未经测试的代码

码:
   对我进行1比1的调整               
              直到我>  MAX-COUNT-ARRAY 
     IF I = 1
        移动  表格字段-XX(I) TO TEMP
     ELSE
        IF  表格字段-XX(I) = TEMP
            移动 'Y' TO TABLE-FIELD-YY(I)
        万一
     END-IF
     MOVE  表格字段-XX(I) TO TEMP
   END-PERFORM   
回到顶部
查看用户资料 发送私信
比尔·伍德格

主持人荣誉


加入时间:2011年3月9日
帖子:7311
位置:矩阵内部

发布发表:2013年5月17日星期五1:41下午
引用回复

您怎么知道“它没有移动Y”?

您为什么认为“重复计数”是“好”?

A
A
A

这将得出3的计数(这是一份正本和两份副本),

B
B
B
B

这将计数为6

C
C

这将计数为1。

如果您正在执行“全部搜索”以将某项设置为Y,那么为什么之后又盲目地将所有重复项设置为Y?

如果您能说明全部内容,我们可以帮助您摆脱困境。
回到顶部
查看用户资料 发送私信
satyapn9

新的用户


已加入:2010年10月8日
帖子:27
地点:印度

发布发表:2013年5月17日,星期五,下午3:01
引用回复

嗨,比尔,

我正在使用SEARCH ALL在数组中搜索TABLE-FIELD-XX(I),并且如果搜索成功,则想将FLAG设置为``Y''到TABLE-FIELD-YY(I)。

在这里,我想将“ Y”移动到该数组中的所有重复项。但是我不知道如何使用SEARCH ALL功能本身来实现此目的。

因此想利用另一个循环条件来实现这一点。

如果不清楚,请告诉我。
回到顶部
查看用户资料 发送私信
比尔·伍德格

主持人荣誉


加入时间:2011年3月9日
帖子:7311
位置:矩阵内部

发布发表:2013年5月17日,星期五,下午3:25
引用回复

使用SEARCH ALL(加强调)时,在表中有重复项不是很好。

语言参考写道:
仅在以下情况下才可以预测SEARCH ALL操作的结果:
表中的数据按ASCENDING KEY或DESCENDING KEY排序
订购
WHEN中指定的ASCENDING或DESCENDING键的内容
子句提供唯一的表引用。


与表不按顺序排列时(哪个普通表将不起作用)不同,您的“表”是“有效的”,但是在不知道该精确表结构的结果的情况下,无法知道从任何重复项集合中找到了哪个单独的记录。

你可能会得到

码:
Y
x
x

要么

x
Y
x

要么

x
x
Y


取决于以“ x”表示的数据组的位置。

您可以使用SEARCH ALL查找数据项(通常是“查找”类型的任务)。

现在,取决于如何才能最好地完成任务,这取决于您所拥有的(尚未告诉我们)。

也许,一个唯一键表带有一个“索引”,该索引指向单独表中的完整数据组。找到匹配项后,以索引为起点来更新单独表中与该键匹配的所有数据。

就像我之前说的,如果您可以具体说明数据是什么以及正在尝试做什么,那么您会得到一个更好的答案。
回到顶部
查看用户资料 发送私信
潘多拉魔盒

主持人


已加入:2006年9月7日
职位:1565
地点:仙女座星系

发布发表:2013年5月17日,星期五3:40 pm
引用回复

引用:
试试这个未经测试的代码

码:
对我进行1比1的调整
直到我> 最大计数数组
如果I = 1
将TABLE-FIELD-XX(I)移动到温度
其他
IF 表格字段-XX(I) = TEMP
移动 'Y' TO TABLE-FIELD-YY(I)
万一
万一
将TABLE-FIELD-XX(I)移动到温度
结束执行
回到顶部
查看用户资料 发送私信
satyapn9

新的用户


已加入:2010年10月8日
帖子:27
地点:印度

发布发表:2013年5月17日,星期五3:48 pm
引用回复

是的,实际上我的要求是使用FILE中的键来查找表(数组)。该表数据以该键(TABLE-FIELD-XX)的升序存储。

我应该写出要输出的行,这些行在表中,但不在基于该键的FILE中。为此,我在表中添加了一个新字段TABLE-FIELD-YY
在加载表时,我已将所有行的'N'移至TABLE-FIELD-YY。

现在,在执行查找时,如果找到匹配项,则将TABLE-FIELD-XX的相应条目的“ Y”设置为TABLE-FIELD-YY。

我清楚吗?
回到顶部
查看用户资料 发送私信
比尔·伍德格

主持人荣誉


加入时间:2011年3月9日
帖子:7311
位置:矩阵内部

发布发表:2013年5月17日,星期五,下午4:06
引用回复

如果文件按“键顺序”排列,则可以考虑“匹配文件”过程。

如果使用文件的目的仅是为了完成此任务,则无论如何都可以提取和排序密钥。

您提到“表”。您的数据来自DB2吗?您可以从DB2中提取一个“平面”文件并进行匹配。

如果执行上述操作,则可以使用SORT和JOINKEYS非常简单地完成整个操作(如果您的SORT是最新的)。

就像我之前建议的那样

包含您所有数据的OCCURS

从该OCCURS中的唯一“键”和该值的索引/下标提取到新的OCCURS。

使用新的OCCURS来建立密钥的匹配,然后使用主表中的索引/下标更新来更新该密钥的所有记录。

潘多拉魔盒

“ Y”仅适用于那些在具有相同键的记录中已经具有“ Y”“某处”的键。
回到顶部
查看用户资料 发送私信
潘多拉魔盒

主持人


已加入:2006年9月7日
职位:1565
地点:仙女座星系

发布发表:2013年5月17日,星期五,下午4:15
引用回复

要求改变我的建议对这里毫无帮助
回到顶部
查看用户资料 发送私信
satyapn9

新的用户


已加入:2010年10月8日
帖子:27
地点:印度

发布发表:2013年5月17日,星期五,下午4:54
引用回复

感谢您的建议法案,

但是我无法更改要求,因为它是通过这种方式设计的。

我提到的TABLE此处仅是ARRAY。它有几个字段,并且已经填充了数据,如果键存在于数组中而不在FILE中,我应该对它进行查找并应该写记录以输出。

我在这里需要帮助的唯一事情是找到那些重复项并设置一个标志。
回到顶部
查看用户资料 发送私信
satyapn9

新的用户


已加入:2010年10月8日
帖子:27
地点:印度

发布发表:2013年5月17日,星期五,下午4:58
引用回复

潘多拉(Pandora),您建议的代码已由我测试,但在此条件下未成功。
回到顶部
查看用户资料 发送私信
比尔·伍德格

主持人荣誉


加入时间:2011年3月9日
帖子:7311
位置:矩阵内部

发布发表:2013年5月17日,星期五5:24 pm
引用回复

satyapn9,

您已有表。你保持那个。

从您现有的表中,提取“关键”字段,以及该条目的索引/下标- 并且仅对表中的第一个键值执行此操作 (即所有键都是唯一的)。

您将新表用于SEARCH ALL。

找到匹配项后,您将返回原始表,并找到匹配项的索引/下标,然后 更新原始表中的所有条目 哪一个 具有与您刚刚获得的比赛相同的钥匙.

如果您被阻止这样做,那么您必须将其退还给坚持要以另一种方式完成的人,并要求他们提供一些愚蠢,不清楚,难以维护的代码来巧妙地执行它们想。
回到顶部
查看用户资料 发送私信
比尔·伍德格

主持人荣誉


加入时间:2011年3月9日
帖子:7311
位置:矩阵内部

发布发表:2013年5月17日,星期五,下午5:32
引用回复

satyapn9写道:
潘多拉(Pandora),您建议的代码已由我测试,但在此条件下未成功。


因为您不清楚要实现的目标。
回到顶部
查看用户资料 发送私信
satyapn9

新的用户


已加入:2010年10月8日
帖子:27
地点:印度

发布发表:2013年5月17日,星期五,8:07 pm
引用回复

嗨,比尔,您对我的逻辑为什么不能正常工作的问题不太了解。相反,您建议需求更改。但是目前不可能。

无论如何,感谢您的宝贵时间。
回到顶部
查看用户资料 发送私信
潘多拉魔盒

主持人


已加入:2006年9月7日
职位:1565
地点:仙女座星系

发布发表:2013年5月17日,星期五,8:16 pm
引用回复

引用:
您不太了解我的问题,为什么我的逻辑不能正常工作。


亲爱的萨蒂亚普先生,您很难向我们解释事情,因为它为您提供了富有成效的答案
回到顶部
查看用户资料 发送私信
罗伯特·桑普

全球主持人


已加入:2008年6月6日
帖子:8569
地点:美国爱荷华州迪比克

发布发表:2013年5月17日,星期五,晚上8:38
引用回复

satyapn9:

您的第一个问题是您不了解COBOL尝试在具有重复键值的表上实施SEARCH ALL肯定会失败-period。您最初使用SEARCH ALL的声明是您应该进入的标志 初学者和学生论坛 而不是这个论坛-无论您声称拥有多少年的“经验”。

第二个问题是,您尚未完全准确地说明问题所在,但您一直抱怨建议的解决方案不起作用。

您最初发布的逻辑可以正常工作-与实际匹配的按键一样长。我怀疑您所拥有的是其中包含非显示数据的键值,在这种情况下,两个键可能看起来匹配但实际上不匹配。

建议:对一些您认为应该匹配的键值使用DISPLAY,并使用十六进制显示查看程序输出。如果您认为应该匹配的键值实际上不匹配(以字节为单位,以十六进制表示),那么您的逻辑工作正常,则数据出了问题。无论如何,我们将需要先查看其中一些DISPLAY输出语句,然后才能提出其他建议。
回到顶部
查看用户资料 发送私信
比尔·伍德格

主持人荣誉


加入时间:2011年3月9日
帖子:7311
位置:矩阵内部

发布发表:2013年5月17日,星期五8:41 pm
引用回复

satyapn9写道:
嗨,比尔,您对我的逻辑为什么不能正常工作的问题不太了解。相反,您建议需求更改。但是目前不可能。

无论如何,感谢您的宝贵时间。


没有业务要求“以某种糟糕的方式来修补”。

我没有建议可以改变业务需求。

就像我说的。如果您只是一名编码人员,而您必须对所告诉的内容进行编码,请回到告诉您的人的位置,并请他们提供难看,高维护,浪费资源的解决方案,您似乎将其视为自己的解决方案。 “需求”。
回到顶部
查看用户资料 发送私信
查看上一个主题 :: :: 查看下一个主题  
发表新话题   回复主题 查看书签
所有时间均为格林尼治标准时间+ 6小时
论坛索引 -> COBOL程式设计

 


类似主题
话题 论坛 回覆
没有新帖 我们可以在主U中插入重复项吗? DB2 2
没有新帖 有人可以帮我找到... IBM工具 9
没有新帖 将更多4个文件与已排序或已合并... DFSORT / ICETOOL 3
该主题已锁定:您无法编辑帖子或回复。 寻找人的年龄 COBOL程式设计 1
没有新帖 查找深奥的单位名称计划... 所有其他大型机主题 2
搜索我们的论坛:


回到顶部