主题:[求助]再问自动填充的问题。
tian_2008
[专家分:0] 发布于 2009-12-02 15:32:00
各位大侠帮帮忙。我这儿有两个表,如下:
呵呵,俺的脑子都让这个弄的快成浆糊了,乱啊。再重新描述一下:
如下:
B表 A表
产品名称 包装编号 产品名称 包装编号 产品包装编号
佳能 佳能 01 佳能01
佳能 佳能 03 佳能03
奥林巴斯 佳能 05 佳能05
奥林巴斯 尼康 01 尼康01
索尼 尼康 03 尼康03
索尼 01 索尼01
索尼 03 索尼03
索尼 05 索尼05
索尼 07 索尼07
奥林巴斯 01 奥林巴斯01
奥林巴斯 03 奥林巴斯03
A表是一个不断更新的数据库,里面的产品很多。产品包装编号=产品名称+包装编号。
A表中各厂家产品的包装种类的编号依次为:01,03,05......,后一个编号比前一个编号大2。
B表是从当月销售数据中挑出来的产品的新包装。
如何才能将B表中的各厂家产品的新包装依据A表自动填充新的包装编号呢?
如,佳能本月有两个新包装,依据A表中佳能产品包装编号已编到05,本月应该给07,09。
注:A表是只读文件。
有位大侠给的程序如下:
USE a表 in 0
USE b表 in 0
SELECT a表
INDEX ON 产品包装编号 to a
n_1=""
n_2=""
n_3=""
FOR i = 1 to RECCOUNT("b表")
foundkg=.f.
GO i in b表
LOCATE for ALLTRIM(a表.产品名称)==ALLTRIM(b表.产品名称)
foundkg=FOUND()
DO while !EOF()
n_1=ALLTRIM(a表.产品名称)
n_2=ALLTRIM(a表.包装编号)
IF foundkg
CONTINUE
foundkg=FOUND()
ENDIF
IF !foundkg
IF n_3=n_1
REPLACE b表.包装编号 with PADL(ALLTRIM(STR(VAL(n_2)+n)),2,"0") in b表
n=n+2
ELSE
n=2
REPLACE b表.包装编号 with PADL(ALLTRIM(STR(VAL(CHRTRAN(n_2,CHRTRAN(n_2,"0123456789",""),""))+2)),2,"0") in b表
n_3=n_1
n=n+2
ENDIF
EXIT
ENDIF
ENDDO
NEXT
但是运行起来,有时候编号会填的准确无误,有的时候会出现错误编号的情况。不知道是怎么回事。
还请各位大侠帮忙啊,谢谢啦!呵呵
回复列表 (共14个回复)
沙发
agt澳 [专家分:840] 发布于 2009-12-02 19:14:00
*产品名称 包装编号 产品名称 包装编号 产品包装编号
我给你重新写一个试试
clea all
SELECT 产品名称,max(包装编号) maxbh into curs c表 from a表 group by 产品名称
select 0
use b表
INDEX ON 产品名称 to indexcpmc
go top
do while not eof()
select maxbh into curs d表 from c表 where 产品名称=c表.产品名称
*注意:字符与数字的转换, ALLTRIM(STR(VAL(d表.maxbh)+n)),2,"0")这句你自己研究吧,我不懂
maxbh=maxbh+2
REPLACE b表.包装编号 with maxbh
maxbh==d表.maxbh+2
SKIP
do while 产品名称=d表.产品名称
REPLACE b表.包装编号 with maxbh
maxbh=maxbh+2
SKIP
enddo
enddo
retu
*希望对你有用
板凳
Vii [专家分:1130] 发布于 2009-12-02 23:54:00
SELECT M1.CPMC 产品名称,'0'+ALLTRIM(STR((SELECT COUNT(*) FROM (SELECT RECNO() AS XH,CPMC FROM B) M2 WHERE M1.CPMC=M2.CPMC AND M1.XH>=M2.XH)*2+VAL(M3.BZBH))) AS 包装编号;
FROM (SELECT RECNO() AS XH,CPMC FROM B) M1;
LEFT JOIN (SELECT CPMC,MAX(BZBH) BZBH FROM A GROUP BY CPMC) M3 ON M1.CPMC=M3.CPMC
*思路B表分组排序,连接A表改商品最大编号.
3 楼
tian_2008 [专家分:0] 发布于 2009-12-04 18:07:00
To agt澳:
您给的这个程序里面循环的代码是不是少点东西呀?我怎么运行到中间就说错误呢?
4 楼
tian_2008 [专家分:0] 发布于 2009-12-04 18:08:00
To 3楼:
没看明白,恕俺愚钝。俺是菜鸟一个。还请您多指教。
5 楼
agt澳 [专家分:840] 发布于 2009-12-04 18:49:00
*这里涉及数字与字符的转换,要你先解决的,所以你如不解决,照搬的话就可能这里有错啦
*注意:字符与数字的转换, ALLTRIM(STR(VAL(d表.maxbh)+n)),2,"0")这句你自己研究吧,我不懂
maxbh=maxbh+2
REPLACE b表.包装编号 with maxbh
另外,你把(二个少量数据)事例的数据库发给我,我给你解决也可以.email:agt-fi@qq.com
6 楼
Vii [专家分:1130] 发布于 2009-12-04 19:26:00
那么分成三句,可以直接复制到PRG执行看结果:
SELECT RECNO() AS XH,产品名称 FROM B INTO CURSOR TMP_1
SELECT 产品名称 AS 产品名称,(SELECT COUNT(*) FROM TMP_1 M1 WHERE M1.产品名称=M2.产品名称 AND M1.XH<=M2.XH) AS CNT FROM TMP_1 M2 INTO CURSOR TMP_2
SELECT M1.产品名称,'0'+ALLTRIM(STR(M1.CNT*2+VAL(M2.包装编号))) 包装编号 FROM TMP_2 M1 LEFT JOIN (SELECT 产品名称,MAX(包装编号) 包装编号 FROM A GROUP BY 产品名称) M2 ON M1.产品名称=M2.产品名称
7 楼
tian_2008 [专家分:0] 发布于 2009-12-15 14:54:00
多谢热心讲解,我还得再研究研究。
8 楼
agt澳 [专家分:840] 发布于 2009-12-16 11:02:00
*产品名称 包装编号 产品名称 包装编号 产品包装编号
*根据你发的附件,我给你重写,并在vfp9.0下测试通过
clea all
*一般初学者多不会用debug程序调试的功能,查找命令在那里出现错误,然后有针对的解决问题。
*!* set step on
*!* set step 命令
*!* 为程序调试打开跟踪窗口并挂起程序。
*!* 语法
*!* SET STEP ON
*!* 参数
*!* ON
*!* 打开跟踪窗口并挂起程序。
*!* 说明
*!* SET STEP 用于调试程序。可在程序中需要逐条执行命令的地方插入 SET STEP ON 命令。
*!* 可以通过如下步骤来把参数传给程序并跟踪它的运行:
*!* 打开跟踪窗口。
*!* 从跟踪窗口的“程序”菜单中选择“打开”命令选择要跟踪的程序。
*!* 在程序的第一个可执行行上设置断点。
*!* 在“命令”窗口中,带参数运行程序(DO ... WITH... )。
SELECT 产品,max(包装编号) maxbh into curs c表 from a group by 产品
select 0
use b excl
INDEX ON 产品 to indexcpmc
go top
select c
do while not eof()
select b
Mmaxbh=0
select maxbh,产品 into curs d表 from c表 where 产品=b.产品
select b
*注意:字符与数字的转换, ALLTRIM(STR(VAL(d表.maxbh)+n)),2,"0")这句你自己研究吧,我不懂
*注意:字符与数字的转换, 我按我的理解改了
Mmaxbh=val(d表.maxbh)+2
REPLACE b.包装编号 with iif(Mmaxbh>9,str(Mmaxbh,2,0),'0'+str(Mmaxbh,1,0))
Mmaxbh=Mmaxbh+2
if not eof()
SKIP
do while 产品=d表.产品
REPLACE b.包装编号 with iif(Mmaxbh>9,str(Mmaxbh,2,0),'0'+str(Mmaxbh,1,0))
Mmaxbh=Mmaxbh+2
SKIP
enddo
endif
select c
SKIP
enddo
retu
*希望对你有用
9 楼
tian_2008 [专家分:0] 发布于 2009-12-16 14:20:00
谢谢大侠的热心帮助,有一点我可能没说清楚,
就是A表中很多产品,B表中可能只有其中的某几个产品有新包装,如果是这样的话,我试了一下您这个程序,循环总是结束不了。
不知道还有没有改进的方法呢?
10 楼
tian_2008 [专家分:0] 发布于 2009-12-16 14:39:00
如下:
B表 A表
产品名称 包装编号 产品名称 包装编号 产品包装编号
佳能 佳能 01 佳能01
佳能 佳能 03 佳能03
奥林巴斯 佳能 05 佳能05
索尼 尼康 01 尼康01
尼康 03 尼康03
索尼 01 索尼01
索尼 03 索尼03
索尼 05 索尼05
索尼 07 索尼07
奥林巴斯 01 奥林巴斯01
奥林巴斯 03 奥林巴斯03
B表中只有三种产品有新包装。
我来回复