我有一个包含偶数(2,4,6,8,10)和另一个包含奇数(1,3,5,7,9)的物理文件。我们可以创建连接逻辑文件,我必须在RPGLE pgm中使用它来按从(1到10)的顺序显示数字。
如何为该场景创建连接逻辑文件?
发布于 2015-05-18 11:18:07
FWiW,这是一个使用联合视图的示例,其容量与数据库认为不是“关系”的隐式多格式逻辑文件(MFLF)相同:
设置:
create table even_nbrs
( nbr dec not null with default
, nbrtext char(2) not null with default
)
;
create table odd_nbrs
( nbr dec not null with default
, nbrtext char(2) not null with default
)
;
insert into even_nbrs values
(2, 2), (4, 4), (6, 6), (8, 8), (10, 10)
; -- 5 rows inserted in EVEN_NBRS
insert into odd_nbrs values
(1, 1), (3, 3), (5, 5), (7, 7), ( 9, 9)
; -- 5 rows inserted in ODD_NBRS
创建从前两个文件生成数据记录的联合的文件:
create view evens_odds as
( select nbr, nbrtext from even_nbrs
union all
select nbr, nbrtext from odd_nbrs
)
;
将视图作为共享开放数据路径(ODP)提供给RPG程序,该路径的顺序是按编号序列(NBR)列排序的,用于运行时CL处理:
ovrdbf the_File tofile(evens_odds) mbr(*first) share(*yes)
opnqryf the_File keyfld((nbr))
/* optionally, the next three commands to test and review results: */
cpyfrmqryf the_File *print
dspsplf qsysprt splnbr(*last)
posdbf the_File *start
/* call the RPG program that could read by key or sequentially */
call the_RPGpgm
并且,对于非关系型DDS LF,MFLF将具有以下DDS:
R ODDS_EVENS PFILE(ODD_NBRS EVEN_NBRS)
NBR
NBRTEXT
K NBR
在使用该DDS源创建名为ODDS_EVENS的文件的创建逻辑文件(CRTLF)之后,以下CL请求可以验证结果:
cpyf ODDS_EVENS *print fromrcd(*start)
dspsplf qsysprt splnbr(*last)
edit:18May2015
下面的DDS LF源是显式定义的MFLF,但第一个R-spec的第一个格式是重复的,即CRTLF之后在DSPFD类型(*RCDFMT)中看到的第二个格式是第一个格式的副本,并影响在PFILE()上指定的两个文件中的数据的联合。然而,第二和第三R-spec的第三和第四种格式是明确定义的,并且与第一种格式明显不同;第三和第四种格式之间的差异以及每种格式和第一种格式之间的差异应该被视为明显不同,以便表明它们不是联合,而是封装在单个*文件对象中的各种数据的有效不同的逻辑视图。
查看数据的最简单界面是使用Query/400交互式WRKQRY特性来选择指定文件选择中的不同格式,并在每次连续选择之后使用F5=Run特性。该实用程序的选择字段和序列字段,或仅显示文件字段说明(DSPFFD),以查看每种格式的布局。
这个示例并不试图执行任何有用的操作,只是试图强调联合和为该联合生成的多种格式,并展示如何将其他多种格式显式编码为不同的类似于视图的实体。
此外,除非在前面的file\data设置活动中的设置之后运行以下SQL语句,否则对RcdFmt(ODDS_ONLY)中的数据的引用将导致小数数据映射错误,因为最初作为从整数值映射的字符值输入的单位值为空格:update odd_nbrs set nbrtext = right(digits(nbr), 2)
R ODDS_EVENS PFILE(ODD_NBRS EVEN_NBRS)
TEXT('NBR fld only; 1-digit values')
NBR
K NBR
K *NONE
K *NONE
S NBR COMP(LT 10)
R ODDS_ONLY PFILE(ODD_NBRS)
TEXT('NBR,NBRTEXT mapped to zoned')
NBR
NBRTEXT 2S00
K NBR
K NBRTEXT
K *NONE
R EVENS_ONLY PFILE(EVEN_NBRS)
TEXT('NBR to alpha and more zoned')
NBR
NBR2S00 2S00 RENAME(NBR) COLHDG('NBR2S00')
NBR2A 2A I SST(NBR2S00 1 2) COLHDG('NBR2A')
NBRTEXT
K *NONE
K *NONE
K NBR2S00
/edit:18May2015
发布于 2015-05-17 23:55:45
您没有描述联接逻辑,它将一个表中的记录联接到另一个表中的一个或多个记录。
相反,您要描述的是所谓的multi-format logical,其DDS源应该是这样的(假设文件之间的记录格式相同):
A R RECFMT PFILE(ODDFILE EVENFILE)
A RECNO
A FLD1
A FLD2
A K RECNO
但是,如果这两个文件具有不同的记录格式,并且您想要来自each...then的不同字段,则如下所示:
A R ODDFILER PFILE(ODDFILE)
A RECNO
A FLD1
A FLD3
A K RECNO
A
A R EVENFILER PFILE(EVENFILE)
A RECNO
A FLD2
A FLD4
A K RECNO
这里有一篇关于使用连接和多格式逻辑的不错的文章。http://www.mcpressonline.com/programming/general/multi-format-and-join-logicals.html
正如CRPence的答案所提到的,MFLF类似于SQL UNION ALL视图。
不同之处在于,在我的第二个示例中,MFLF允许FLD1是字母,而FLD2是数字。SQL联合视图不允许这样做;在SQL中选择的列必须具有相同(或兼容)类型。
发布于 2015-05-17 19:33:47
将每个物理文件看作一个网格或表,其中文件中的记录是行,文件中的字段是列。(这些也是SQL中使用的术语。)想象一下把两张桌子并排放在一起。连接将connext并在键匹配的地方将行组合在一起,以构建新的结果行,每个结果行都包含来自两个表的值。
但这根本不是你所描述的场景。您希望将这两张表垂直组合在一起,更像是将两堆卡片按所需的顺序排序成一堆。
https://stackoverflow.com/questions/30278230
复制相似问题