| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2272 人关注过本帖
标题:标注字段名问题
只看楼主 加入收藏
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
结帖率:73.97%
收藏
已结贴  问题点数:20 回复次数:22 
标注字段名问题
吹水佬版主:
    在“动态字段排序”帖的“获取最大、次最大”代码中,解决了运行速度问题,谢谢!
但标注时字段名时遇到了小问题:
     代码条件中,是在遇上第1个字段符合标注条件后,就退出该轮字段的循环,进入下一个100行。
在下表中两个字段都符合条件,却标的是最后一个字段名:
ys.rar (991 Bytes)


程序代码:
USE bb IN 0
USE pmax IN 0
SELECT pmax
BLANK FIELDS mmax ALL 

SELECT bb
COPY TO ARRAY a100 NEXT 100 && 第1个100行
pmax(@a100)
SELECT bb
SKIP
SCAN REST
    ** 下一个100行
    SCATTER TO a1  && 取bb一行存入a1
    ADEL(a100,1)   && 删除a100第1行
    ACOPY(a1, a100, 1, -1, AELEMENT(a100,100,1))  && 将a1写入a100最后一行
    pmax(@a100)
ENDSCAN

SELECT * FROM pmax
RETU


FUNCTION k2k3(k2,k3,n1)  && 最大值、最次大值
    IF n1 > k2
        k2 = n1
    ELSE
        IF n1 > k3
            k3 = n1
        ENDIF 
    ENDIF 
ENDFUN

FUNCTION pmax(a100)
    FOR nCol=2 TO ALEN(a100,2)
        n1 = 0
        k2 = 0
        k3 = 0
        krow = 0  &&非空行数
        FOR nRow=1 TO ALEN(a100,1)
            IF EMPTY(a100[nRow,nCol])
                n1 = n1 + 1
            ELSE
                k2k3(@k2,@k3,@n1)
                n1 = 0
                krow = krow + 1
            ENDIF
        ENDFOR
        k1 = n1  &&列最后行的值 
        k2k3(@k2,@k3,@n1)
        IF k1==k2 AND k1>3 AND krow>20 AND k1<7     &&求第2大值,与最大值比较            
            IF k2-k3=1 &&在pmax对应行标注(条件有修改)
                SELECT pmax
                GO a100[100,1]
                REPLACE mmax WITH "MMAX"
                REPLACE maxm WITH FIELD(nCol,"bb") &&标注此列字段名
                EXIT 
                              
            ENDIF 
        ENDIF 
    ENDFOR
ENDFUNC

请指教,谢谢!

[此贴子已经被作者于2021-9-20 14:31编辑过]

搜索更多相关主题的帖子: 标注 SELECT IF 字段 条件 
2021-09-20 14:21
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:20 
标注是第1个字段
图片附件: 游客没有浏览图片的权限,请 登录注册
2021-09-20 15:15
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:0 
条件变了
IF k1==k2 AND k1>0 AND krow>20 AND k1<7     &&求第2大值,与最大值比较
IF k1==k2 AND k1>3 AND krow>20 AND k1<7     &&求第2大值,与最大值比较

IF INLIST(k2-k3,1,2) &&在pmax对应行标注
IF k2-k3=1 &&在pmax对应行标注(条件有修改)

图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2021-9-20 15:25编辑过]

2021-09-20 15:16
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
回复 3楼 吹水佬
条件还原:
程序代码:
IF k1==k2 AND k1>0 AND krow>20 AND k1<7     &&求第2大值,与最大值比较
           
            IF INLIST(k2-k3,1,2) &&在pmax对应行标注
           
                SELECT pmax
                GO a100[100,1]
                REPLACE mmax WITH "MMAX"
                REPLACE maxm WITH FIELD(nCol,"bb")
                EXIT 
                              
            ENDIF 
        ENDIF 

图片附件: 游客没有浏览图片的权限,请 登录注册


是我获取字段名的代码有问题?

[此贴子已经被作者于2021-9-20 16:25编辑过]

2021-09-20 16:20
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:0 
原算法不合题意,要修改。
2021-09-20 18:15
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
回复 5楼 吹水佬
麻烦了!!!
2021-09-20 18:40
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:0 
回复 6楼 fdqzy
原算法是逐行计算最大次大的值
n1 = n1 + 1
REPLACE (FIELD(lnj)) WITH TRANSFORM(n1)
修改结果:有4个符合条件的记录
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
use bb in 0
use pmax in 0
SELECT pmax
BLANK FIELDS mmax ALL 
SELECT bb
COPY TO ARRAY a100 NEXT 100 && 第1个100行
pmax(@a100)
SELECT bb
SKIP
SCAN REST
    ** 下一个100行
    SCATTER TO a1  && 取bb一行存入a1
    ADEL(a100,1)   && 删除a100第1行
    ACOPY(a1, a100, 1, -1, AELEMENT(a100,100,1))  && 将a1写入a100最后一行
    pmax(@a100)
ENDSCAN
SELECT * FROM pmax
SELECT * FROM tt
RETURN

FUNCTION k2k3(k2,k3,n1)  && 最大值、最次大值
    IF n1 > k2
        k3 = k2
        k2 = n1
    ENDIF 
ENDFUNC

FUNCTION pmax(a100)
    FOR nCol=2 TO ALEN(a100,2)
        n1 = 0
        k2 = 0
        k3 = 0
        krow = 0  &&非空行数
        FOR nRow=1 TO ALEN(a100,1)
            IF EMPTY(a100[nRow,nCol])
                n1 = n1 + 1
                k2k3(@k2,@k3,@n1)
            ELSE
                n1 = 0
                krow = krow + 1
            ENDIF
        ENDFOR
        k1 = n1  &&列最后行的值
        IF k1==k2 AND k1>0 AND krow>20 AND k1<7     &&求第2大值,与最大值比较
            IF INLIST(k2-k3,1,2) &&在pmax对应行标注
                SELECT pmax
                GO a100[100,1]
                REPLACE mmax WITH "MMAX", maxm WITH FIELD(nCol,"bb")
                EXIT 
            ENDIF 
        ENDIF 
    ENDFOR
ENDFUNC
2021-09-20 19:44
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
谢谢!
请教,tt表在哪反映?
2021-09-20 22:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:0 
以下是引用fdqzy在2021-9-20 22:06:29的发言:

谢谢!
请教,tt表在哪反映?

tt表测试用的:
CREATE TABLE tt (_jnh1 I,_jnh100 I,_maxm C(6),_k1 I,_k2 I,_k3 I,_krow I)
在标注时:
REPLACE mmax WITH "MMAX", maxm WITH FIELD(nCol,"bb")
INSERT INTO tt VALUES (a100[1,1], a100[100,1], FIELD(nCol,"bb"), k1, k2, k3, krow)  
EXIT
2021-09-20 22:27
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
回复 9楼 吹水佬
谢谢!
2021-09-21 02:21
快速回复:标注字段名问题
数据加载中...
 
   



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

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