回 帖 发 新 帖 刷新版面

主题:[求助]再问自动填充的问题。

各位大侠帮帮忙。我这儿有两个表,如下:

呵呵,俺的脑子都让这个弄的快成浆糊了,乱啊。再重新描述一下:

如下:

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个回复)

沙发

*产品名称    包装编号          产品名称    包装编号    产品包装编号
我给你重新写一个试试
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
*希望对你有用
     

板凳

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 楼

To agt澳:

您给的这个程序里面循环的代码是不是少点东西呀?我怎么运行到中间就说错误呢?

4 楼

To 3楼:

没看明白,恕俺愚钝。俺是菜鸟一个。还请您多指教。

5 楼

*这里涉及数字与字符的转换,要你先解决的,所以你如不解决,照搬的话就可能这里有错啦
*注意:字符与数字的转换,  ALLTRIM(STR(VAL(d表.maxbh)+n)),2,"0")这句你自己研究吧,我不懂
  maxbh=maxbh+2
  REPLACE b表.包装编号 with maxbh


另外,你把(二个少量数据)事例的数据库发给我,我给你解决也可以.email:agt-fi@qq.com

6 楼

那么分成三句,可以直接复制到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 楼

多谢热心讲解,我还得再研究研究。

8 楼

*产品名称    包装编号          产品名称    包装编号    产品包装编号
*根据你发的附件,我给你重写,并在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 楼

谢谢大侠的热心帮助,有一点我可能没说清楚,
就是A表中很多产品,B表中可能只有其中的某几个产品有新包装,如果是这样的话,我试了一下您这个程序,循环总是结束不了。
不知道还有没有改进的方法呢?

10 楼

如下:

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表中只有三种产品有新包装。

我来回复

您尚未登录,请登录后再回复。点此登录或注册