| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1472 人关注过本帖
标题:关于UPDATE的一点问题
只看楼主 加入收藏
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
谢谢TonyDeng老师。你说:要實現聯動,指定SET RELATION關聯,讓兩個表的記錄指針用A3匹配。
我在例题中用这样的语句:
....
INDEX ON A3 TAG A1
SELECT 0
USE L2
INDEX ON A3 TAG A1
SELECT L1
SET RELATION TO A3 INTO L2
...
是不是已经指定了关联,用A3匹配。
其实在上述例题中,我用 REPLACE ALL L1.A1 WITH L2.A2 FOR L1.A3=L2.A3 语句 代替 UPDATE L1 SET L1.A1=L2.A2 WHERE L1.A3=L2.A3   ,就能很好达到效果。说明指针作用、转移是正常的。

此外很抱歉,你的英文答复,我有点看不懂。我还是很感谢你。你的帖子对我帮助很大。

2012-02-07 08:41
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用panpende在2012-2-7 08:28:29的发言:

谢谢茵梦湖老师关注。 9.0的代码 UPDATE L1 SET L1.A1=L2.A2 from L2 WHERE L1.A3=L2.A3 确实达到预期效果。都是不知为什么8.0不能稳定达到效果。此前我也曾经在此论坛提到过这个问题,茵梦湖老师也是如此答复过我,对此我十分感谢。因为我主要使用8.0版本,因此我需要判定8.0中是否能可靠使用这个命令。因为在不少程序段使用,还是能达到效果,但是在上述例题中不知为什么不能达到效果。

例如我在某个程序中,有如下语句:
USE LC4  &&部分数据
INDEX ON STR(A28)+A12+A15+A18 TAG A12
SELE 0
USE LC2 &&全部数据(含LC4记录,但是缺少A26字段的数据。LC2需要补充LC4中A26字段的数据。)
INDEX ON STR(A28)+A12+A15+A18 TAG A12
GO TOP
SET RELATION TO STR(A28)+A12+A15+A18 INTO LC4
UPDATE LC2 SET LC2.A26=LC4.A26 WHERE LC2.A28=LC4.A28 .AND. LC2.A12=LC4.A12 .AND. LC2.A15=LC4.A15 .AND. LC2.A18=LC4.A18 &&A26发票数
就能很好达到效果,又为什么呢?
不加索引,运行后效果如何,因为UPDATE命令执行时,并不需要索引,我认为不稳定的原因和索引有关

坚守VFP最后的阵地
2012-02-07 10:18
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
谢谢sdta老师指导,按照你的思路,取消了L1、L2的索引 INDEX ON A3 TAG A1 ,程序得到预期的效果。看来如你所说,不稳定的原因和索引有关。不知为什么。
2012-02-07 11:24
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 13楼 panpende
猜测:与索引后的排列位置有关

坚守VFP最后的阵地
2012-02-07 12:43
lygcw9603
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:233
专家分:357
注 册:2006-8-27
收藏
得分:0 
以下是引用panpende在2012-2-7 11:24:59的发言:

谢谢sdta老师指导,按照你的思路,取消了L1、L2的索引 INDEX ON A3 TAG A1 ,程序得到预期的效果。看来如你所说,不稳定的原因和索引有关。不知为什么。
看一下TONYDENG版主的答复,你的问题就有答案了
2012-02-07 13:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
SET RELATION指令,是指定當前工作區的數據表指針跟隨INTO參數工作區中的表指針移動,後者動了,本區就動,但本區動,後者不會動。因為你的需要在移動L1記錄指針的時候跟著動L2的,所以在SELECT L2後設置SET RELATION ……INTO L1即可。

其實,你這個UPDATE指令跟REPLACE是完全一樣的,也要這樣設。

我給的那些英文資料,是VFP9的原版幫助文字。

授人以渔,不授人以鱼。
2012-02-07 13:40
lygcw9603
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:233
专家分:357
注 册:2006-8-27
收藏
得分:0 
回复 16楼 TonyDeng
西边的月亮还未落下啊
2012-02-07 13:47
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
取消了L1、L2的索引 INDEX ON A3 TAG A1 ,程序得到预期的效果。看来不稳定的原因和索引有关。不知为什么。
但是对程序稍微做一变动,程序还是没有得到预期的效果。
SET CENTURY ON
SET EXACT ON
SET DATE YMD
SET SYSMENU OFF
CLEAR ALL
CLOSE DATABASES
CD D:\BDS
CREATE DBF L1 (A1 C(10), A2 C(10),A3 N(2)) &&建立表
FOR X=1 TO 8
Y=STR(X,1)
APPEND BLANK
REPLACE A1 WITH 'SJA'+Y,A2 WITH 'SJB'+Y,A3 WITH X
ENDFOR
COPY TO L2 FOR A3<6
*INDEX ON A3 TAG A1 &&取消索引
SELECT 0
USE L2
DELETE FOR A3=3 &&稍微做一变动
PACK
*INDEX ON A3 TAG A1 &&取消索引
SELECT L1
SET RELATION TO A3 INTO L2
UPDATE L1 SET L1.A1=L2.A2 WHERE L1.A3=L2.A3
*REPLACE ALL L1.A1 WITH L2.A2 FOR L1.A3=L2.A3 &&此语句在有索引时有效
BROWSE

看来取消索引是不行的,不稳定的原因没有真正解决。
2012-02-07 13:49
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
谢谢TonyDeng的关注,根据你的意见修改程序如下:
SET TALK OFF
SET SAFETY OFF
SET CENTURY ON
SET EXACT ON
SET DATE YMD
SET SYSMENU OFF
CLEAR ALL
CLOSE DATABASES
CD D:\BDS
CREATE DBF L1 (A1 C(10), A2 C(10),A3 N(2)) &&建立表
FOR X=1 TO 8
Y=STR(X,1)
APPEND BLANK
REPLACE A1 WITH 'SJA'+Y,A2 WITH 'SJB'+Y,A3 WITH X
ENDFOR
COPY TO L2 FOR A3<6
INDEX ON A3 TAG A1
SELECT 0
USE L2
DELETE FOR A3=3
PACK
INDEX ON A3 TAG A1
*SELECT L1
SET RELATION TO A3 INTO L1
SELECT L1
*UPDATE L1 SET L1.A1=L2.A2 from L2 WHERE L1.A3=L2.A3 &&此命令在9.0可以,8.0出错
UPDATE L1 SET L1.A1=L2.A2 WHERE L1.A3=L2.A3
*REPLACE ALL L1.A1 WITH L2.A2 FOR L1.A3=L2.A3  &&此命令在更改关联方法后也不能达到预想的目的
BROWSE
RETURN

程序不能达到预想的目的。请TonyDeng试试。









*REPLACE ALL L1.A1 WITH L2.A2 FOR L1.A3=L2.A3
BROWSE
AA
RETURN
2012-02-07 14:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
*SELECT L1   (SELECT L2)
 SET RELATION TO A3 INTO L1
 SELECT L1
 *UPDATE L1 SET L1.A1=L2.A2 from L2 WHERE L1.A3=L2.A3 &&此命令在9.0可以,8.0出错
 UPDATE L1 SET L1.A1=L2.A2 WHERE L1.A3=L2.A3
 *REPLACE ALL L1.A1 WITH L2.A2 FOR L1.A3=L2.A3  &&此命令在更改关联方法后也不能达到预想的目的
 BROWSE
 

授人以渔,不授人以鱼。
2012-02-07 14:12
快速回复:关于UPDATE的一点问题
数据加载中...
 
   



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

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