我理解楼主的意图,这是一个典型的树状结构,多用于按树状结构展开的材料 BOM、工时 BOM、按部门显示的员工、……等等,一般用 oleTree 控件显示。
由于结构树的层数不定,所以这类问题应采用“递归”算法。
假设来源表为 tblSource.dbf,并对“父阶编码”建立普通索引,则主程序 main.prg 的代码如下:
程序代码:
CLEAR ALL
CLOSE ALL
* 建立结果表
CREATE TABLE tblResult (阶层 c(10 ),父阶编码 c(10 ),子阶编码 c(10 ),用量 n(10 ,2 ),拆分 c(1 ))
* 打开源表
SELECT 0
USE tblSource ORDER 父阶编码
* 生成父阶代码“A1001”的结果,第2个参数表示数量为1,第三个参数表示阶层的初始值为0
MakeTree(' A1001 ' ,1 ,0 )
* 显示结果表
SELECT tblResult
GO TOP
BROWSE
子程序 MakeTree.prg 的代码如下:
程序代码:
* ===========================================================
* 参数:tcFather 父阶编码
* tnCount 父项数量
* tnLevel 层级
* ===========================================================
LPARAMETERS tcFather,tnCount,tnLevel
LOCAL nRec,cSon,nCnt,cSplit,cLevel
nRec = RECNO() && 保存记录指针
SEEK tcFather && 定位到父项代码的首记录
tnLevel = tnLevel + 1 && 层级累加
* 遍历所有子项
SCAN REST WHILE 父阶编码 = tcFather
cSon = 子阶编码
nCnt = 用量 * tnCount
cSplit = IIF(INDEXSEEK(cSon,.f.),' y ' ,' ' ) && 是否被拆分
cLevel = REPL(' * ' ,tnLevel) + TRAN (tnLevel) && 层级
* 添加到结果表
INSERT INTO tblResult (阶层,父阶编码,子阶编码,用量,拆分) VALUES (cLevel,tcFather,cSon,nCnt,cSplit)
* 存在子项时,仍需拆分,采用递归
IF cSplit = ' y '
MakeTree(cSon,nCnt,tnLevel)
ENDIF
ENDSCAN
GO nRec && 恢复记录指针
运行结果如下图:
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
[
本帖最后由 liuxingang28 于 2014-9-30 10:51 编辑 ]
收到的鲜花