| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1101 人关注过本帖
标题:下面一段代码迷糊,请行家指教
只看楼主 加入收藏
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:4 
以下是引用sylknb在2014-3-30 12:12:10的发言:

加与不加结果一样,但道理不懂。
我记得有人说过:
注意:SCAN 语句始终只判断当前工作区中的表文件记
录指针,如结构体中因需要切换了工作区,那么在ENDSCAN
语句前千万要记得再切回原来的工作区。
为什么在此代码中不要加select1
以前低版本时(2.6之前)必须要切换的,不知道从哪一版本开始,SCAN结构会记住第一次进去时的工作区,然后碰到配对的ENDSCAN时会自动切换回原来的工作区。
2014-03-31 08:27
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用hu9jj在2014-3-30 22:02:59的发言:

endscam会自动判定对应的工作区的,但是为了阅读方便,我通常还是会写上selct语句。
同意你的观点,我也是这样。这是一种良好的编程习惯,与软件本身是否自动支持无关。
2014-03-31 08:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
回复 楼主 sylknb
關聯不是二指針跟著走,祗有子表指針跟著主表走,而主表作循環。

授人以渔,不授人以鱼。
2014-03-31 13:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
參看25樓附件的示例(已編譯為獨立可執行程序,內嵌數據庫)。

左邊是主表,右邊是子表。當光標在左邊移動時,右邊的子表記錄指針也跟著走,但光標在右邊移動,左邊的主表記錄指針不會變。這個是一對多關聯,主表不需有索引,但子表必須有索引。

該程序的代碼如下:
程序代码:
#INCLUDE "FoxPro.h"

SET PATH TO "E:\我的文檔\項目\myTools\VFP"
SET PROCEDURE TO "myTools"
myInit()
Main()
RETURN 

*-----------------------------
* 程序主入口
*-----------------------------
PROCEDURE Main()
    LOCAL loMainForm
    loMainForm = CREATEOBJECT("_MainForm")
    WITH loMainForm
        .WindowState = WINDOWSTATE_MAXIMIZED
        .Caption = "測試 - SET RELATION TO"
        .Show
    ENDWITH
    READ EVENTS
ENDPROC 

*-----------------------------
* 主窗口類定義
*-----------------------------
DEFINE CLASS _MainForm AS myForm
    ShowWindow = 2        && 頂層窗口
   
    ADD OBJECT Label1 AS Label WITH Caption = "主表"
    ADD OBJECT Grid1  AS Grid
    ADD OBJECT Label2 AS Label WITH Caption = "子表"
    ADD OBJECT Grid2  AS Grid
   
    PROCEDURE Load
        * 載入數據環境
        OPEN DATABASE "test"
        USE "table1" IN 0
        USE "table2" ORDER "t01" IN 0
        SET RELATION TO t01 INTO "table2" IN "table1"    && 在table1中關聯到table2,關聯的索引為t01標籤
    ENDPROC
   
    PROCEDURE Unload
        * 關閉數據環境
        SET DATABASE TO "test"
        CLOSE DATABASES
    ENDPROC
   
    PROCEDURE Init
        WITH ThisForm
            *-----------------
            * 批量設置控件屬性
            *-----------------
            .SetAll("FontName", "微软雅黑", "Label")
            .SetAll("FontSize", 16, "Label")
            .SetAll("FontBold", .T., "Label")
            .SetAll("AutoSize", .T., "Label")
            .SetAll("Height", 30, "Label")
        ENDWITH
    ENDPROC
   
    *-------------------------
    * 對表單內控件進行佈局,隨窗體尺寸變化而自動變化,其事件由本表單父類響應
    *-------------------------
    PROCEDURE Arrange
        WITH ThisForm.Label1
            .Top = 5
            .Left = 5
        ENDWITH
        WITH ThisForm.Grid1
            .Top = ThisForm.Label1.Top + ThisForm.Label1.Height + 5
            .Left = 5
            .Height = ThisForm.Height - .Top - 5
            .Width = (ThisForm.Width / 2) - .Left - 5
        ENDWITH
        WITH ThisForm.Label2
            .Top = 5
            .Left = (ThisForm.Width / 2) + 5
        ENDWITH
        WITH ThisForm.Grid2
            .Top = ThisForm.Label2.Top + ThisForm.Label2.Height + 5
            .Left = (ThisForm.Width / 2) + 5
            .Height = ThisForm.Height - .Top - 5
            .Width = ThisForm.Width - .Left - 5
        ENDWITH
    ENDPROC
   
    PROCEDURE Grid1.Init
        WITH This
            .RecordSourceType = 1
            .RecordSource = "table1"
            .HighlightStyle = 2
            .ColumnCount = 1
            WITH .Columns(1)
                WITH .Header1
                    .Caption = FIELD("t02", "table1", 1)
                    .FontBold = .T.
                ENDWITH
                .ControlSource = "table1.t02"
            ENDWITH
        ENDWITH
    ENDPROC
   
    PROCEDURE Grid2.Init
        WITH This
            .RecordSourceType = 1
            .RecordSource = "table2"
            .HighlightStyle = 2
            .ColumnCount = 1
            WITH .Columns(1)
                WITH .Header1
                    .Caption = FIELD("s02", "table2", 1)
                    .FontBold = .T.
                ENDWITH
                .ControlSource = "table2.s02"
            ENDWITH
        ENDWITH
    ENDPROC 

    *-------------------------
    * Grid1控件光標穩定之後的處理
    *-------------------------
    PROCEDURE Grid1.AfterRowColChange(tnColumnIndex)
        This.Parent.Grid2.Refresh        && 刷新Grid2控件中的光標位置
    ENDPROC
   
ENDDEFINE


[ 本帖最后由 TonyDeng 于 2014-4-1 03:21 编辑 ]

授人以渔,不授人以鱼。
2014-04-01 01:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
test.zip (14.04 KB)

授人以渔,不授人以鱼。
2014-04-01 03:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
仿此手法可製作多表聯動!無論是使用Grid還是ListBox、ComboBox作界面,數據部分的處理是一樣的,祗要設置了關聯,記錄指針就是那樣走,同時有篩選效果。

授人以渔,不授人以鱼。
2014-04-01 03:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
直觀地看明白了關聯表的記錄指針移動細節,就能理解在主表中作循環時,各表的運動情況,以及應該做什麽對應的處理。

授人以渔,不授人以鱼。
2014-04-01 03:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用taifu945在2014-3-31 08:29:27的发言:

同意你的观点,我也是这样。这是一种良好的编程习惯,与软件本身是否自动支持无关。

如果我沒記錯,這種寫法曾經被譏諷爲脫褲子放屁。

授人以渔,不授人以鱼。
2014-04-01 03:37
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用TonyDeng在2014-4-1 03:37:19的发言:


如果我沒記錯,這種寫法曾經被譏諷爲脫褲子放屁。

确实是有点多余的,但从可读性出发,还是有点作用。各人的习惯而已。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2014-04-01 07:57
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
TonyDeng:
你的水平真高,关联主表与付表之间的变化,真妙。
我说的是(1)二表关联后使用SACN---DSACN结构体中因需要切换了工作区,联访后要不要返回?试了结果可加可不加,原因是什么?
         (2)二表不关联使用 SACN---DSACN结构体中因需要切换了工作区,联访后要不要返回?
《二表关联》:

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
select 1  &&这里要不要返回到1区?
ENDSCAN
SELECT 3
BROWSE
[二表不关联:]
use bm3 alias bm3 in 0
zap
USE BM1 ALIAS BM1 IN 0
USE BM2 ALIAS BM2 IN 0
SELECT BM2
SCAN
   SELECT BM1
   SCAN
      IF BM1.ZKZH=BM2.ZKZH.AND.BM1.XM<>BM2.XM
      sele bm3
       appe blank
       repl zkzh with bm2.zkzh,xm with bm2.xm,xm1 with bm1.xm
     ENDIF
    SELECT BM1 &&&要不要回工作区BM1?

   ENDSCAN
  ENDSCAN
SELECT BM3
BROWSE
2014-04-01 17:59
快速回复:下面一段代码迷糊,请行家指教
数据加载中...
 
   



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

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