| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 639 人关注过本帖
标题:我是 VF 初学者!请大家帮我看看这个命令怎么编
只看楼主 加入收藏
wsj0608
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2014-10-25
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:7 
我是 VF 初学者!请大家帮我看看这个命令怎么编
我有一个VF表,其中字段如下
卷号    页号    尾页号    首页号
0001     1        3        1
0001     4        7   
0002     1        2        1
0002     3        5
0002     6        10
0003     1        5         1
0004     1        12        1
0004     7
0004     9
0004     13       15
大体就是这类内容的库,我有三个问题
1.显示每卷最大“尾页号”,这个命令怎么写?
2.检测每卷的“页号”和“尾页号”,两者之间的关系为“页号”必须比上一条记录的“尾页号”大“1”,就是“尾页号”=上一条记录“页号”+1,显示不符合这一条件的记录,这条命令应该怎么写
3.检测每卷第一条的“首页号”必须为1,且只有第一条的“首页号”有记录,显示不符合这一条条件的记录。这个命令应该怎么写
谢谢大家了
没有人帮助我么?
我试了很多都不对。
第一题,我先用 set filt to len(allt(尾页号))>=1 命令把“尾页号”为空的筛选掉, 之后是将“案卷号”排序,然后取“尾页号”最大值么?到这就不知道怎么写了
第二题,我不知道怎么用if语句,是 if 页号=1,0(if 尾页号=页号+1),0,1 这样么?中间过程怎么运用
第三题,没头绪,不知道怎么写
有懂的朋友帮我看看,真的琢磨不出来,谢谢了

[ 本帖最后由 wsj0608 于 2014-10-25 21:51 编辑 ]
搜索更多相关主题的帖子: 记录 检测 
2014-10-25 20:22
wsj0608
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2014-10-25
收藏
得分:0 
所有字段都是字符型的,大家帮帮忙,我完全无从下手,谢谢了
2014-10-25 20:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
“一条命令”爱好者有得忙活了

授人以渔,不授人以鱼。
2014-10-25 20:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这根本就不可能用一条命令解决的。编程就是写一系列的指令序列去解决问题,所谓“程序”,就是一连串动作流程的意思,自从面向结果的SQL查询语言问世之后,谁都不会实实际际地编制具体流程了,都指望有问有答的“我想求三角形的面积”机器就答出结果那种效果,结果是自己完全不知道三角形面积是怎么从已知条件中求出来的。说这段话的意思,就是你的问题必须写程序代码才能解决,没有现成的指令可用。

其次,你的数据显然就是有问题的,所以你现在要靠程序来帮你查找错误。根本原因在于数据结构设计不当,可以说这些字段有冗余,并且填入的数据之中,有时是以这个为准,有时又以那个为准,到现在谋求一致,就难以匹配了,所以要排查。这就是根源上给自己制造麻烦。

从你给的数据中,是不是只有004卷中间那2条记录要挑出来的?


[ 本帖最后由 TonyDeng 于 2014-10-25 21:22 编辑 ]

授人以渔,不授人以鱼。
2014-10-25 21:11
wsj0608
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2014-10-25
收藏
得分:0 
回复 4 楼 TonyDeng
是!但不是只有0004,因为我只列了一部分记录,后面还有可能0008,0012会有“尾页号”记录为空的字段
我知道不是一条命令是可以出来,可是我没有头绪应该从哪里入手
2014-10-25 21:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
编程的思路:按照你现在以“卷号+页号”的索引排序,构造一个双重循环,外面那层是由上到下,里面那层是由左到右,亦即遍历整个表的每个单元格。循环时,依次检查“首页号”是否正确,用一个变量记住当前行的“尾页号”,在进入下一行循环时用其“页号”比较与记住的那个变量是否加一。总之,扫一趟就把所有需要检查的都检查了。具体代码就不给你写了,明白了手工处理的思路,按照这个思路写代码就是了,不算很复杂,但也不会太简单。

授人以渔,不授人以鱼。
2014-10-25 21:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
处理的基本思路,是把现在横向简化、跳跃性的数据,修复为竖向、连续的数据,一行一行检查连续性和合法性。你这些数据本来应该是设计为单向的,要么向竖发展,要么向横发展,现在弄成了纵横交错,当然不好处理。所以,解决的思路,是在逻辑上把纵横交错的数据整理成一维单向的,所以前面给你的双重循环逻辑就是“阅读”的顺序是人脑处理的顺序,即从左至右、从上至下依次检查每一个单元格的数据,拉直就是一条线。

一卷分成若干条记录,是这个数据结果最失败之处。

授人以渔,不授人以鱼。
2014-10-25 21:29
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:10 
以下是引用wsj0608在2014-10-25 20:22:02的发言:

我有一个VF表,其中字段如下
卷号    页号    尾页号    首页号
0001     1        3        1
0001     4        7     
0002     1        2        1
0002     3        5
0002     6        10
0003     1        5         1
0004     1        12        1
0004     7
0004     9
0004     13       15
大体就是这类内容的库,我有三个问题
1.显示每卷最大“尾页号”,这个命令怎么写?
2.检测每卷的“页号”和“尾页号”,两者之间的关系为“页号”必须比上一条记录的“尾页号”大“1”,就是“尾页号”=上一条记录“页号”+1,显示不符合这一条件的记录,这条命令应该怎么写
3.检测每卷第一条的“首页号”必须为1,且只有第一条的“首页号”有记录,显示不符合这一条条件的记录。这个命令应该怎么写
谢谢大家了
没有人帮助我么?
我试了很多都不对。
第一题,我先用 set filt to len(allt(尾页号))>=1 命令把“尾页号”为空的筛选掉, 之后是将“案卷号”排序,然后取“尾页号”最大值么?到这就不知道怎么写了
第二题,我不知道怎么用if语句,是 if 页号=1,0(if 尾页号=页号+1),0,1 这样么?中间过程怎么运用
第三题,没头绪,不知道怎么写
有懂的朋友帮我看看,真的琢磨不出来,谢谢了

假设表文件名为“LT1.DBF”,各字段属性为:卷号 C(4),页号 I,尾页号 I,首页号 I。

第一个问题答案(实在太简单了):SELECT 卷号,MAX(尾页号) 最大页号 FROM LT1 GROUP BY 卷号;
第二个问题答案:SELECT * FROM LT1;
                   WHERE 卷号+STR(页号) NOT IN;
                      (SELECT DISTINCT T1.卷号+STR(T1.页号);
                          FROM
(SELECT RECNO() 记录号,* FROM LT1) T1,;
                               (SELECT RECNO() 记录号,* FROM LT1) T2;
                          WHERE T1.尾页号=T2.页号+1 AND;
                                T1.记录号-T2.记录号=1)
    思路:蓝色部分找出满足“尾页号”=上一条记录“页号”+1条件的记录,然后在外层查询中利用WHERE条件过滤掉这些记录,就是满足条件的所有记录。蓝色部分子查询的核心在于红色代码,即自联接查询。楼主请记住:若要在同一表中进行比较,常用两种方法:一、编程。该方法代码虽长,但可以做到层次感清晰,适合入门用户,或对SELECT-SQL命令不熟悉的用户;二、自联接。该方法层次感不如编程,但代码简短,执行速度比编程要更快,适合对SELECT-SQL命令非常熟悉的用户。
第三个问题答案:条件看上去简单,其实要注意的细节很多的一个问题。我分步给你,你自己去组装(可参考问题二组装):
1、每卷第一条的“首页号”必须为1
   SELECT T1.*;
      FROM (SELECT RECNO() 记录号,* FROM LT1) T1,;
           (SELECT 卷号,MIN(记录号) 最小记录号;
               FROM (SELECT RECNO() 记录号,* FROM LT1) T1;
               GROUP BY 卷号) T2;
      WHERE T1.记录号=T2.最小记录号 AND T1.首页号=1
2、只有第一条的“首页号”有记录
   SELECT T1.卷号,T1.页号,T1.尾页号,T1.首页号;
      FROM (SELECT RECNO() 记录号,* FROM LT1) T1,;
           (SELECT 卷号,MIN(记录号) 最小记录号;
               FROM (SELECT RECNO() 记录号,* FROM LT1) T1;
               GROUP BY 卷号) T2;
      WHERE T1.记录号=T2.最小记录号 AND T1.首页号>0 AND;
            T1.卷号 IN ;
               (SELECT 卷号 ;
                   FROM (SELECT 卷号,SUM(首页号) 首页号和;
                            FROM (SELECT RECNO() 记录号,* FROM LT1) T3;
                            WHERE 卷号+STR(记录号) NOT IN ;
                               (SELECT 卷号+STR(MIN(记录号));
                                   FROM (SELECT RECNO() 记录号,* FROM LT1) T4;
                                   GROUP BY 卷号);
                            GROUP BY 卷号 HAVING 首页号和=0) T5);
   UNION ALL ;
   SELECT * FROM LT1 ;
      WHERE 卷号 IN ;
         (SELECT 卷号 FROM LT1;
             GROUP BY 卷号;
             HAVING COUNT(卷号)=1) AND ;
         首页号=1
;
      ORDER BY 卷号

    看到这里,不知道楼主是什么心情。问题三还没有组装,就已经这么复杂了,所以我建议楼主对于问题三还是用编程吧。虽然我没针对问题三编程试验,但感觉针对问题三,配合对表文件的卷号字段进行索引后,编程的逻辑层次应该会比用SELECT-SQL命令强很多。
    最后,要说说楼主给出的案例数据。基本上还行,尤其是卷号为0003只给出一条记录,在SELECT-SQL代码调试时颇有代表性(问题三答案中的蓝色代码部分就是针对只有一条记录处理的)。但有两点不足:一是数据问题。比如:问题三需要的记录,数据几乎都做出来了:每卷的第一条记录首页号都是1,下面的都没有登记,不利于代码调试;还有一个就是问题二需要的记录中,给出的数据没有一条记录是达到要求的,最后我通过手动把卷号0003的尾页号改成7,才得以调试代码;二是逻辑问题。比如:同样是卷号0001,为什么尾页号在第一、二条记录间是不同的呢?难道同个卷宗的结尾页码是不相同的?或是相同的卷号代表着不同的卷宗?不管怎样,楼主都可以从这个案例中获得不少的知识。
2014-10-26 14:02
快速回复:我是 VF 初学者!请大家帮我看看这个命令怎么编
数据加载中...
 
   



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

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