如果把6楼版主的代码再稍加扩充,可以得出楼主的第2张表的原样(仅供参考)
CLEAR ALL
CLOSE ALL
CREATE TABLE tblResult (阶层 c(10),父阶编码 c(10),子阶编码 c(10),用量 n(10,2),拆分 c(1))
s=2 && 阶层组大于2时没测试
ns1=1
ns2=0
USE tblSource ORDER 父阶编码 alia tbl && 原表需自己创建
=AFIELDS(cf,'tbl')
for n=1 to s
cs1=IIF(n=1,&cf(n,1),&cf(n,1))
MakeTree(cs1,ns1,ns2)
endf
SELECT tblResult
browse
close all
procedure maketree
* ===========================================================
* 参数:tcFather 父阶编码,tnCount
父项数量, tnLevel
层级
* ==========================================================
LPARAMETERS tcFather,tnCount,tnLevel
LOCAL nRec,cSon,nCnt,cSplit,cLevel
nRec = RECNO()
&& 保存记录指针
SEEK tcFather
&& 定位到父项代码的首记录
tnLevel = tnLevel + 1
&& 层级累加
* 遍历所有子项
SCAN REST WHILE 父阶编码 = tcFather
tnCount=IIF(n=1,tnCount,1)
cSon = 子阶编码
nCnt = 用量 * tnCount
cSplit = IIF(INDEXSEEK(cSon,.f.),'y',' ')
&& 是否被拆分
cLevel = REPL('*',tnLevel) + TRAN(tnLevel)
&& 层级
* 添加到结果表
INSERT INTO tblResult (阶层,父阶编码,子阶编码,用量,拆分) VALUES (cLevel,cs1,cSon,nCnt,cSplit)
* 存在子项时,仍需拆分,采用递归
IF cSplit = 'y'
MakeTree(cSon,nCnt,tnLevel)
endif
ENDSCAN
GO nRec
&& 恢复记录指针