回 帖 发 新 帖 刷新版面

主题:关于填数的问题

这是我的问题:
   b j      x h
  三班       1
  三班       1
  三班       1
  五班       1
  五班       1
  五班       1
  五班       1
  五班       1
  七班       1
  七班       1
  七班       1
  七班       1
我要做成下面的表:
  b j       x h
  三班       1
  三班       2
  三班       3
  五班       1
  五班       2
  五班       3
  五班       4
  五班       5
  七班       1
  七班       2
  七班       3
  七班       4
谢谢!!

回复列表 (共12个回复)

沙发

你用的是 vfp 9 吗???

板凳


vf6

3 楼


设你的表为myclass.dbf,bj c(10), xh c(10)

if !used('myclass')
    use myclass in 0 alias myclass
endif
select myclass
go top
n=1
cbj=alltrim(bj)
do while .not.eof()
    skip
    cbjt=alltrim(bj)
    if cbj==cbjt
        n=n+1
        replace xh with str(n)
    else
        n=1
        cbj=alltrim(bj)
    endif
enddo
browse
close all
return

4 楼

USE XXXX
SORT TO temp ON bj
USE temp 
cBj=''
nXh=1
SCAN 
IF ALLTRIM(bj)==ALLTRIM(cBj)
nXh=nXh+1
ELSE 
nXh=1
ENDIF 
REPLACE xh WITH nXh
cBj=bj
ENDSCAN

5 楼

对应3楼的坛友的程序段如下:
[quote]
do while .not.eof()
    skip
    ....
    ....
    ....
enddo
[/quote]
我对这样的风格有所保留,我会避免将skip紧放在do while .not.eof()的后面,看法如下:
eof()意思是否在"表记录指针"指向末尾记录下一条。当循环开始,记录是最后一条时,紧执行一次skip,eof()值就为真。之后对记录的一些操作(如执行repl ..with ..语句等)可能会出错。
为避免这个可能,我通常将skip放到enddo之前一行,如下:
do while .not.eof()
    ....
    ....
    ....
    skip
enddo

6 楼


我来修改一下:

SET SAFETY OFF
if used('myclass')
    use IN MYCLASS
endif
USE MYCLASS IN 0
INDEX ON BJ TAG SBJ
select myclass
go top
n=1
REPLACE XH WITH ALLT(STR(N))
cbj=alltrim(bj)
do while .not.eof()
    skip
    cbjt=alltrim(bj)
    if cbj==cbjt
        n=n+1
        replace xh with str(n)
    else
        n=1
        cbj=alltrim(bj)
        REPLACE XH WITH ALLT(STR(N))
    endif
enddo
browse
close all
return

7 楼

[quote]我对这样的风格有所保留[/quote]

言之有理!

说明一点:
这里的程序是针对楼主的数据表写的,不是通用程序.

刚才做了一个极端情况的测试:表里只有一个记录,运行上面的程序,没有出错.用Debuger单步执行的.SKIP后记录号为2,REPLACE 命令照样执行,没有出错信息.
您也试一下吧!

8 楼

我的跟4楼的差不多,如下
&& 设表名为myclass,字段xh为数值型或整型
use myclass
scan
    if recn()#1 and bj=bj001
        xh001=xh001+1
    else
        xh001=1
        bj001=bj
    endif
    repl xh with xh001
endscan

9 楼

SELECT 表别名
GO TOP
cbj0=bj
i=1
SCAN
    REPLACE xh WITH IIF(bj==cbj0,i,1)
    i=xh+1
    cbj0=bj
ENDSCAN

10 楼

[quote]我的跟4楼的差不多,如下
&& 设表名为myclass,字段xh为数值型或整型
use myclass
scan
    if recn()#1 and bj=bj001
        xh001=xh001+1
    else
        xh001=1
        bj001=bj
    endif
    repl xh with xh001
endscan[/quote]

变量bj001和xh001没有初值

我来回复

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