主题:关于填数的问题
lvweiming
[专家分:20] 发布于 2007-10-05 22:38:00
这是我的问题:
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个回复)
沙发
cbl518 [专家分:57140] 发布于 2007-10-06 06:33:00
你用的是 vfp 9 吗???
板凳
lvweiming [专家分:20] 发布于 2007-10-06 07:51:00
vf6
3 楼
BlueSmart [专家分:2340] 发布于 2007-10-06 08:19:00
设你的表为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 楼
user886633 [专家分:2400] 发布于 2007-10-06 23:28:00
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 楼
oufeiwen [专家分:910] 发布于 2007-10-07 14:54:00
对应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 楼
BlueSmart [专家分:2340] 发布于 2007-10-07 15:39:00
我来修改一下:
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 楼
BlueSmart [专家分:2340] 发布于 2007-10-07 15:50:00
[quote]我对这样的风格有所保留[/quote]
言之有理!
说明一点:
这里的程序是针对楼主的数据表写的,不是通用程序.
刚才做了一个极端情况的测试:表里只有一个记录,运行上面的程序,没有出错.用Debuger单步执行的.SKIP后记录号为2,REPLACE 命令照样执行,没有出错信息.
您也试一下吧!
8 楼
oufeiwen [专家分:910] 发布于 2007-10-07 23:34:00
我的跟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 楼
cbl518 [专家分:57140] 发布于 2007-10-07 23:52:00
SELECT 表别名
GO TOP
cbj0=bj
i=1
SCAN
REPLACE xh WITH IIF(bj==cbj0,i,1)
i=xh+1
cbj0=bj
ENDSCAN
10 楼
BlueSmart [专家分:2340] 发布于 2007-10-08 17:36:00
[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没有初值
我来回复