我有一个包含偶数(2,4,6,8,10)的物理文件和另一个包含奇数(1,3,5,7,9)的PF。我们是否可以创建连接逻辑文件,我必须在RPGLE pgm中使用它来按顺序显示数字(1到10)。
如何为此方案创建连接逻辑文件?
答案 0 :(得分:2)
FWiW,在相同容量中使用UNION VIEW的示例,而不是[n隐式]多格式逻辑文件(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
从前两个文件创建生成UNION数据记录的文件:
create view evens_odds as
( select nbr, nbrtext from even_nbrs
union all
select nbr, nbrtext from odd_nbrs
)
;
将VIEW作为共享开放数据路径(ODP)提供给RPG程序,其订单由编号\ sequence (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源创建逻辑文件(CRTLF)创建名为ODDS_EVENS的文件后,以下CL请求可以验证结果:
cpyf ODDS_EVENS *print fromrcd(*start)
dspsplf qsysprt splnbr(*last)
<强> [编辑:18May2015] 强>
以下DDS LF源是明确定义的MFLF,但第一格式 [第一个R-spec]是重复的[即在CRTLF与第一个复制之后在DSPFD TYPE(* RCDFMT)中看到的第二种格式,并在PFILE()上指定的两个文件中实现数据的UNION。而第三和第四种格式[第二和第三种R-spec]是明确定义的,与第一种格式明显不同;第三个和第四个之间的差异以及每个和第一个之间的差异应该被视为显着不同,以便表明它们不是UNION,而是有效地区分封装在单个* FILE对象中的各种数据的逻辑视图。 / p>
查看数据[虽然不一定反映顺序]的最简单的界面是使用Query / 400交互式WRKQRY功能在指定文件选择中选择不同的格式,并在每次连续选择后使用F5 =运行功能。要么是该实用程序的选择和序列字段,要么只显示文件字段描述(DSPFFD)以查看每种格式的布局。
此示例不会尝试执行任何有用的操作,只是尝试强调为该联合生成的联合和多种格式,并显示如何将其他多种格式显式编码为不同的VIEW类实体。
另外,除非运行以下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
<强> [/编辑:18May2015] 强>
答案 1 :(得分:1)
您没有描述连接逻辑,它将一个表中的记录连接到另一个表中的一个或多个记录。
相反,您正在描述所谓的multi-format logical DDS源代码(假设文件之间的记录格式相同):
A R RECFMT PFILE(ODDFILE EVENFILE)
A RECNO
A FLD1
A FLD2
A K RECNO
但是,如果这两个文件具有不同的记录格式,并且您希望每个文件都有不同的字段......那么它看起来就像这样:
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为alpha,FLD2为数字。 SQL联合视图不允许这样做;在SQL中选择的列必须是相同(或兼容)类型。
答案 2 :(得分:0)
将每个物理文件视为网格或表格,其中文件中的记录是行,文件中的字段是列。 (这些也是SQL中使用的术语。)想象一下将两个表并排放置。连接将连接&amp;将行组合在一起,以匹配键,以构建新的结果行,每行包含两个表中的值。
但那不是你所描述的场景。你想要将两个表垂直组合,更像是将两堆卡片按照所需的顺序排列成一堆。