| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1101 人关注过本帖
标题:下面一段代码迷糊,请行家指教
只看楼主 加入收藏
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
2.在SELECT 3 替换后,为何在ENDSCAN 前不用SELE 1,不用返回1区吗?

看下面的测试结果,你就有答案了(对有疑问的问题,要自己学会测试)
程序代码:
*-- 测试代码
CLEAR 
CREATE CURSOR t (f1 c(2))
FOR lni=1 TO 10
    INSERT INTO t VALUES (TRANSFORM(lni))
ENDFOR
GO top

CREATE CURSOR t1 (f2 c(1))
FOR lni=1 TO 10
    INSERT INTO t1 VALUES (chr(64+lni))
ENDFOR

SCAN
   ? t1.f2+'|'
   SELECT t
   ??t.f1
   SELECT t1 && 此处可以注释掉与不注释掉有何区别,看显示结果
ENDSCAN

坚守VFP最后的阵地
2014-03-30 12:08
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
加与不加结果一样,但道理不懂。
我记得有人说过:
注意:SCAN 语句始终只判断当前工作区中的表文件记
录指针,如结构体中因需要切换了工作区,那么在ENDSCAN
语句前千万要记得再切回原来的工作区。
为什么在此代码中不要加select1
2014-03-30 12:12
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用sylknb在2014-3-30 12:12:10的发言:

加与不加结果一样,但道理不懂。
我记得有人说过:
注意:SCAN 语句始终只判断当前工作区中的表文件记
录指针,如结构体中因需要切换了工作区,那么在ENDSCAN
语句前千万要记得再切回原来的工作区。
为什么在此代码中不要加select1


在FOXPRO版本中,类似情况确实要切换工作区的,但在VFP中为什么可以不切换工作区的原理,没有深入研究过。

坚守VFP最后的阵地
2014-03-30 12:20
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
sdta:
请教的代码,是你以前回答我的问题。当时也没有仔细看,今天认真学后感到为什么在3区替换后不用回到1区?是不是二表关联后可以不回去吗?
SELE 3
USE BM3
ZAP
SELE 1
USE BM1
SELE 2
USE BM2
INDE ON ZKZH TO LS
SELE 1
SET RELA  TO ZKZH INTO B

SCAN
   IF A.ZKZH=B.ZKZH.AND.A.XM<>B.XM
      SELE 3
      APPE BLANK
      REPL ZKZH WITH B.ZKZH,XM WITH B.XM
   ENDIF
ENDSCAN
SELECT 3
BROWSE
2014-03-30 12:51
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
你以前回答时有select 1见符件,
图片附件: 游客没有浏览图片的权限,请 登录注册
2014-03-30 13:02
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
再看下工作区(SELECT())、与别名(ALIAS())测试结果
程序代码:
CLEAR 
CREATE CURSOR t (f1 c(2))
FOR lni=1 TO 10
    INSERT INTO t VALUES (TRANSFORM(lni))
ENDFOR
GO top

CREATE CURSOR t1 (f2 c(1))
FOR lni=1 TO 10
    INSERT INTO t1 VALUES (chr(64+lni))
ENDFOR

SCAN
   ?SELECT(),ALIAS()
   SELECT t
   ??SELECT(),ALIAS()
ENDSCAN


结果:
2  T1   1 T

通过测试可以发现,当执行到SCAN 下时,工作区(别名为T的工作区)自动切换到原始工作区,也就是 别名为T1的工作。

坚守VFP最后的阵地
2014-03-30 15:04
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 15楼 sylknb
这些习惯都是由FOXPRO版本带来的。

坚守VFP最后的阵地
2014-03-30 15:05
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
2  T1   1 T

当然好理介,因CREATE CURSOR t1 (f2 c(1))此时的临时表时打开,SCAN ---ENDSCAN 当然是对搜索当前的表,当前表的别名是T1,当加了SELECT t
??SELECT(),ALIAS(),工作区变成T了。
我们二人的理介可能都陷入误区了。
关联时
select 1
SET RELA  TO ZKZH INTO B

SCAN
   IF A.ZKZH=B.ZKZH.AND.A.XM<>B.XM
      SELE 3
      APPE BLANK
      REPL ZKZH WITH B.ZKZH,XM WITH B.XM
   ENDIF
select 1 &&&此处可不加因本身在1区关联。

ENDSCAN
因15楼的图片中代码,它们之间没有关联,所以要加SELECT 1

2014-03-30 16:02
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:4 
endscam会自动判定对应的工作区的,但是为了阅读方便,我通常还是会写上selct语句。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2014-03-30 22:02
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
应该写上selct语句
2014-03-30 23:01
快速回复:下面一段代码迷糊,请行家指教
数据加载中...
 
   



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

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