注册 登录
编程论坛 VFP论坛

请教各位大大:有没有更好的方法实现筛选出当前记录中,N个项目中不为0的项目数,及将数值从大到小排序到一个临时表中

shonken 发布于 2022-07-13 16:31, 1111 次点击
CREATE CURSOR 测试表 (项目1 Y,项目2 Y,项目3 Y,项目4 Y,项目5 Y,项目6 Y)
INSERT INTO 测试表 VALUES (23,0,11,33,0,25)
INSERT INTO 测试表 VALUES (23,10,21,43,0,15)
INSERT INTO 测试表 VALUES (23,0,0,53,0,55)

需要筛选出当前记录中,N个项目中不为0的项目数,及将数值从大到小排序到一个临时表中
结果:
记录2:  4个项目
项目数值
43
23
21
15

我用
Copy To Array gaTemp Fields Like 项目* Next 1   
也要5条语句才能实现,不知有没有更好的方法?
5 回复
#2
sdta2022-07-13 18:57
程序代码:
CREATE CURSOR 测试表 (项目1 Y,项目2 Y,项目3 Y,项目4 Y,项目5 Y,项目6 Y)
INSERT INTO 测试表 VALUES (23,0,11,33,0,25)
INSERT INTO 测试表 VALUES (23,10,21,43,0,15)
INSERT INTO 测试表 VALUES (23,0,0,53,0,55)
SELECT * FROM 测试表 WHERE .F. INTO CURSOR 结果 READWRITE
SELECT 测试表
SCAN
    SCATTER TO gaTemp
    DIMENSION gaTemp[FCOUNT()]
    ASORT(gaTemp, 1, FCOUNT(), 1)
    DIMENSION gaTemp[1, FCOUNT()]
    INSERT INTO 结果 FROM ARRAY gaTemp
ENDSCAN
SELECT 结果
BROWSE


[此贴子已经被作者于2022-7-13 19:44编辑过]

#3
shonken2022-07-13 23:26

程序代码:

CREATE CURSOR 测试表 (项目1 Y,项目2 Y,项目3 Y,项目4 Y,项目5 Y,项目6 Y)
INSERT INTO 测试表 VALUES (23,0,11,33,0,25)
INSERT INTO 测试表 VALUES (23,10,21,43,0,15)
INSERT INTO 测试表 VALUES (23,0,0,53,0,55)
Copy To Array gaTemp Fields Like 项目* Next 1
Dimension gaTemp(FCOUNT(),1)
Create Cursor 结果1 (分数 Y )
Append From Array gaTemp
Select 分数 From 结果1 Where 分数#0 Order By 分数 Desc Into Cursor tmp结果
#4
吹水佬2022-07-14 08:12
以下是引用shonken在2022-7-13 23:26:53的发言:



CREATE CURSOR 测试表 (项目1 Y,项目2 Y,项目3 Y,项目4 Y,项目5 Y,项目6 Y)
INSERT INTO 测试表 VALUES (23,0,11,33,0,25)
INSERT INTO 测试表 VALUES (23,10,21,43,0,15)
INSERT INTO 测试表 VALUES (23,0,0,53,0,55)
Copy To Array gaTemp Fields Like 项目* Next 1
Dimension gaTemp(FCOUNT(),1)
Create Cursor 结果1 (分数 Y )
Append From Array gaTemp
Select 分数 From 结果1 Where 分数#0 Order By 分数 Desc Into Cursor tmp结果

也可以直接在数组处理,无需再通过表来操作
程序代码:

CREATE CURSOR 测试表 (项目1 Y,项目2 Y,项目3 Y,项目4 Y,项目5 Y,项目6 Y)
INSERT INTO 测试表 VALUES (0,0,0,0,0,0)
INSERT INTO 测试表 VALUES (23,1,11,33,2,25)
INSERT INTO 测试表 VALUES (23,10,21,43,0,15)
INSERT INTO 测试表 VALUES (23,0,0,53,0,55)
*GO TOP
Copy To Array gaTemp Fields Like 项目* Next 1
DIMENSION gaTemp[ALEN(gaTemp)]
ASORT(gaTemp,1,-1,1)
n = ASCAN(gaTemp,0)
IF BETWEEN(n,2,ALEN(gaTemp))
    DIMENSION gaTemp[n-1]
ELSE
    STORE null TO gaTemp
ENDIF
LIST MEMORY LIKE gaTemp


[此贴子已经被作者于2022-7-14 08:27编辑过]

#5
shonken2022-07-14 10:45
指向记录号1和2时,数组都为NULL?

以下是引用吹水佬在2022-7-14 08:12:08的发言:


也可以直接在数组处理,无需再通过表来操作

CREATE CURSOR 测试表 (项目1 Y,项目2 Y,项目3 Y,项目4 Y,项目5 Y,项目6 Y)
INSERT INTO 测试表 VALUES (0,0,0,0,0,0)
INSERT INTO 测试表 VALUES (23,1,11,33,2,25)
INSERT INTO 测试表 VALUES (23,10,21,43,0,15)
INSERT INTO 测试表 VALUES (23,0,0,53,0,55)
*GO TOP
Copy To Array gaTemp Fields Like 项目* Next 1
DIMENSION gaTemp[ALEN(gaTemp)]
ASORT(gaTemp,1,-1,1)
n = ASCAN(gaTemp,0)
IF BETWEEN(n,2,ALEN(gaTemp))
    DIMENSION gaTemp[n-1]
ELSE
    STORE null TO gaTemp
ENDIF
LIST MEMORY LIKE gaTemp

#6
吹水佬2022-07-14 11:21
回复 5楼 shonken
没考虑到全非0时,改改这里:
程序代码:
n = ASCAN(gaTemp,0)
n = ICASE(n==0,ALEN(gaTemp), n==1,0, n-1)
IF n>0
    DIMENSION gaTemp[n]
ELSE
    STORE null TO gaTemp
ENDIF


[此贴子已经被作者于2022-7-14 11:23编辑过]

1