| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3059 人关注过本帖
标题:动态字段如何排序
取消只看楼主 加入收藏
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
结帖率:73.97%
收藏
已结贴  问题点数:20 回复次数:14 
动态字段如何排序
程序代码:
create cursor b1 (m1 c(1),m2 c(1))
insert into b1 values ("","5")
insert into b1 values ("1","M")
insert into b1 values ("N","2")
insert into b1 values ("8","9")
insert into b1 values ("M","12")
insert into b1 values ("5","N")


按动态字段排序:
FOR jnh = 1 TO FCOUNT()
SELECT EVALUATE(FIELD(jnh)) FROM b1  WHERE ISDIGIT(EVALUATE(FIELD(jnh))) ORDER BY EVALUATE(FIELD(jnh)) DESC
retu
endfor
报"ORDER BY"子句无效!
原因是字段是序号,不是实际的字段名。
如何解决这个问题?
谢谢!
搜索更多相关主题的帖子: values 字段 动态 insert into 
2021-09-17 15:16
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
回复 2楼 吹水佬
谢谢!
2021-09-17 15:48
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用吹水佬在2021-9-17 15:44:12的发言:

FOR jnh=1 TO FCOUNT("b1")
    cmd = [SELECT ]+FIELD(jnh,"b1")+[ FROM b1 WHERE ISDIGIT(]+FIELD(jnh,"b1")+[) ORDER BY ]+FIELD(jnh,"b1")+[ DESC]
    EXECSCRIPT(cmd)
ENDFOR

如何取得指定行的值?
如kk=第2行的值,如何写表达式?
2021-09-17 16:19
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
知道了
go 2
kk=EVALUATE(FIELD(jnh,"b1"))
2021-09-17 16:26
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用吹水佬在2021-9-17 16:31:41的发言:

    cmd = [SELECT ]+FIELD(jnh,"b1")+[ kk FROM b1 WHERE ISDIGIT(]+FIELD(jnh,"b1")+[) ORDER BY ]+FIELD(jnh,"b1")+[ DESC INTO CURSOR tmp]
    EXECSCRIPT(cmd)
    GO 2 IN "tmp"
    kk = tmp.kk

OK!
2021-09-17 17:22
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
下面代码能否再优化,提高运行速度?
求列数据第1、2大的值:
1、在每100行数据中求1列中第1、2大的值;
2、其差值在1、2范围内时,在另表对应行标注
3、只要有1列符合条件,不再求另外的列,转入下一列(字段)重复上面。

主要在第3步处能否修改

tjb.rar (21.29 KB)


程序代码:
*****求列第1、2大值
Set Talk Off
Set Safe Off
use bb in 0
use pmax in 0
FOR i=1 TO RECCOUNT()-99  
    SELECT * FROM bb WHERE BETWEEN(jnh,i,i+99)  INTO TABLE lsb &&&每次选100条记录确定第1、2大值

    SELECT lsb
    kk=2
*****填充每列空白行序号值
    FOR lnj = kk TO FCOUNT()
        n1 = 0
        SELECT * FROM lsb WHERE Not Empty(EVALUATE(FIELD(lnj))) INTO Cursor ls

        IF RECCOUNT()>0
            use
            SELECT lsb
            SCAN
                c1 = EVALUATE(FIELD(lnj))
                IF !EMPTY(c1)
                    n1 = 0
                ELSE
                    n1 = n1 + 1
                    REPLACE (FIELD(lnj)) WITH TRANSFORM(n1)
                ENDIF

            ENDSCAN
        endif

    ENDFOR
*****保留填充序号最后的值(即空白行最大值)
    USE fc\lsb IN 0 ALIAS t1 AGAIN
    USE fc\lsb IN 0 ALIAS t2 AGAIN
    SELECT t1
    SET RELATION TO RECNO()+1 INTO "t2"
    SELECT t1
    FOR lnj = kk TO FCOUNT()
        *n1 = 0
        SELECT * FROM t1 WHERE Not Empty(EVALUATE(FIELD(lnj))) INTO Cursor ls

        IF RECCOUNT()>0
            use
            SELECT t1
            SCAN
                c1 = EVALUATE('t1.'+FIELD(lnj))
                c2 = EVALUATE('t2.'+FIELD(lnj))
                REPLACE ('t1.'+FIELD(lnj)) with IIF(VAL(c2)>0 AND VAL(c1)>0 ,"",c1)
            ENDSCAN
        endif

    ENDFOR
    SET RELATION TO
    SELECT t1
    USE
    SELECT t2
    USE
    SELECT lsb
****以上两段代码是列出空白行的数据,为下一代码求空白行数据的最大、次最大标数值。
***求列第1、2大值(主要代码段)
    FOR lnj = kk TO FCOUNT("lsb")
        Go BOTTOM 
        kjn=jnh  &&确定在pmax标注时对应行
        k1=VAL(EVALUATE(FIELD(lnj,"lsb"))) &&列最后行的值
        
        Calculate Max(VAL(EVALUATE(FIELD(lnj,"lsb")))) To k2 &&列最大值(第1大值)
        COUNT FOR !empty(EVALUATE(FIELD(lnj,"lsb"))) TO krow &&非空行数

        IF k1=k2 AND k1>0 AND krow>20 AND k1<7 &&求第2大值,与最大值比较
            cmd = [SELECT ]+FIELD(lnj,"lsb")+[ mk FROM lsb WHERE ISDIGIT(]+FIELD(lnj,"lsb")+[) ORDER BY ]+FIELD(lnj,"lsb")+[ DESC into cursor tmp]
            EXECSCRIPT(cmd)

            GO 2 IN "tmp"
            k3 = VAL(tmp.mk) &&第2大值

            IF INLIST(k2-k3,1,2) &&在pmax对应行标注
                SELECT pmax
                GO kjn
                REPLACE mmax WITH 'MMAX'
                SELECT lsb
                EXIT &&结束本轮字段循环
            ENDIF
            SELECT lsb
        ENDIF
    ENDFOR
ENDFOR
sele pmax
brow



[此贴子已经被作者于2021-9-18 19:07编辑过]

2021-09-18 12:06
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
1、在每100行数据中求1列中第1、2大的值;
    bb表中非空的都是以字母开头,空的用n1的值(数字)填充,求最大、次最大是否只用n1的值来比较?
    最大和次最大都是在填充数字中求得。
    第一、二段代码就是为求这两个值作准备,能直接用n1值求午更好,但要符合第3段代码中标注的条件。
2、其差值在1、2范围内时,在另表对应行标注
    “差值在1、2范围内”是什么意思?
     最大值和最小值差为1或2
3、只要有1列符合条件,不再求另外的列,转入下一列(字段)重复上面。
    不再求另外的列,又要“转入下一列”是什么意思?
    表述有错。当有1列符合标注条件(最大值和最小值差为1或2,第3段代码)时,本轮字段循环结束,转入求下一个100行数据。
麻烦了!

其实就是求列的空白行行数的最大和次最大(在最后1行数字与最大值相同的条件下),差值在1或2范围内的列,每100行数据只有1列符合就行。

[此贴子已经被作者于2021-9-18 19:12编辑过]

2021-09-18 18:47
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
我已在代码段中添加了补充说明
2021-09-18 18:58
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用吹水佬在2021-9-18 19:34:22的发言:


IF k1=k2 AND k1>0 AND krow>20 AND k1<7 &&求第2大值,与最大值比较
这句是首要条件,意思是:
每次第100行的列值k1==列最大值k2 and 列中非空的个数krow>20 and 每次第100行的列值k1<7
即:k1<>k2 或 krow<21 或 k1>6 该列就不用处理了?

是这意思,统计结果与所发代码统计结果相同即是。
2021-09-18 20:55
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
太麻烦了,谢谢!
恕我愚昧,FUNCTION 如何调用?
2021-09-18 23:23
快速回复:动态字段如何排序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021289 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved