| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3118 人关注过本帖
标题:请教两个修改表结构和组合框数据绑定的问题
只看楼主 加入收藏
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
不是难不难理解,而是思路,处理同样一件事,我用的思路和你用的思路差别太大了。
2011-07-17 10:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在你的機器上運行結果如何?在我這裡不過濾地處理全部數據(學生表兩千多條記錄、七十多個科目、成績表三萬多條記錄),大概是1秒左右。

改一下如下的代碼,可適應無過濾條件(此時調用Grid1.Init事件不傳入參數即可)的情形:
程序代码:
    PROCEDURE Grid1.Init(tcFilter AS Character)
        LOCAL laColumns[5+RECCOUNT("kcb"),5]
        LOCAL lnIndex AS Integer
        
        laColumns[1,1] = "学号"
        laColumns[1,2] = "xsb.xh"
        laColumns[1,3] = 100
        laColumns[2,1] = "姓名"
        laColumns[2,2] = "xsb.xm"
        laColumns[2,3] = 60
        laColumns[3,1] = "班级名称"
        laColumns[3,2] = "xsb.bjmc"
        laColumns[3,3] = 60
        laColumns[4,1] = "总成绩"
        laColumns[4,2] = "Get_TotalScore(xsb.xh)"
        laColumns[4,3] = 80
        laColumns[4,4] = "Z"
        laColumns[4,5] = "99,999.99"
        laColumns[5,1] = "平均分"
        laColumns[5,2] = "Get_AverageScore(xsb.xh)"
        laColumns[5,3] = 80
        laColumns[5,4] = "Z"
        laColumns[5,5] = "999.99"
        
        GOTO TOP IN kcb
        lnIndex = 5
        DO WHILE !EOF("kcb")
            lnIndex = lnIndex + 1
            laColumns[lnIndex,1] = ALLTRIM(kcb.kcm)
            laColumns[lnIndex,2] = "Get_Score(xsb.xh, '" + kcb.kch + "')"
            laColumns[lnIndex,3] = 80
            laColumns[lnIndex,4] = "Z"
            laColumns[lnIndex,5] = "999.99"
            SKIP IN kcb
        ENDDO 
        
        WITH This
            IF (PCOUNT() == 1) .AND. (VARTYPE(tcFilter) == "C")
                SET FILTER TO &tcFilter IN xsb
            ELSE
                SET FILTER TO IN xsb
            ENDIF 
            .Set_Columns(@laColumns, "xsb")
            .ReadOnly = .T.
            .LockColumns = 3
            .HeaderHeight = 35
            .RowHeight = 25
        ENDWITH 
        
        WITH This
            lnIndex = 5
            DO WHILE lnIndex <= .ColumnCount
                WITH .Columns(lnIndex).Header1
                    IF LENC(.Caption) > 5
                        .Caption = Wrap_String(.Caption, 5)
                        .WordWrap = .T.
                    ENDIF 
                ENDWITH 
                lcString = .Columns(lnIndex).ControlSource
                LOCAL lcSum AS Number 
                SUM &lcString ALL TO lnSum
                IF lnSum > 0
                    lnIndex = lnIndex + 1
                ELSE 
                    .DeleteColumn(lnIndex)
                ENDIF 
            ENDDO 
        ENDWITH 
        GOTO TOP IN xsb
        
    ENDPROC 


[ 本帖最后由 TonyDeng 于 2011-7-17 12:44 编辑 ]

授人以渔,不授人以鱼。
2011-07-17 12:25
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
可以运行,结果和你发的图一样。我不会测运行所需要的时间。
你这是通过一个程序实现查询然后将结果输出到自定义窗体中,我现在如果要用同样的思路,用可视化编程实现的话,是不是要把这个程序拆成很多个,每个类每个过程每个函数都得新建一个,才能在表单里面用。

[ 本帖最后由 lyxc34 于 2011-7-17 17:06 编辑 ]
2011-07-17 16:53
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
呵呵,首尾加了个?time(),花了四秒左右,不过我开了WOW的更新程序,内存被占了一半,机子是2G内存,WIN7系统。
2011-07-17 17:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不用拆很多。如果你不重複使用哪個自定義my_Grid類的話,將裏面的Set_Columns過程寫在你窗體中的Grid自定義方法中,即你的Grid對象中有兩個方法,一個是Init,一個是Set_Columns,這樣就可以用在你自己的窗體中了,不用理會我其餘的代碼。調用的時候,在你組合框得到過濾條件字符串後,發送一條Grid.Init('過濾條件字符串')指令就看到結果了。

那三個函數的代碼,隨便集中放在PRG文件就是了,比如你啓動程序時的PRG文件。

你這些數據庫加起來都不夠3M,這個程序的速度跟内存的關係不大,主要是CPU的速度,你開了WOW更新可能佔用了CPU。我用的也是Win7,不過是64位的,4G内存,CPU是i5-2410M,在我這裡全部數據組裝起來就是1秒左右(可以計算得到最終的表格有多少單元格,也看得到程序到底做了什麽動作在耗時),如果在篩選狀態下,時間更短。

授人以渔,不授人以鱼。
2011-07-17 17:48
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
在表单及其控件的事件方法里面都不能直接嵌入过程或自定义函数,如果要像这样完全一个程序搞定的话那应该就是一个表单对应一个程序。
2011-07-17 17:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
可以插入自定義方法和屬性的,你自己查查資料。

授人以渔,不授人以鱼。
2011-07-17 17:54
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
還有一個辦法,將Set_Columns過程中的代碼寫到Grid.Init事件代碼的對應位置,這樣就不用自定義方法了。看懂了那段代碼就知道怎麽搬。

授人以渔,不授人以鱼。
2011-07-17 18:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我幫你改寫成這樣,把下面過程中的代碼寫在你表單中Grid控件的Init事件中。

程序代码:
    PROCEDURE Grid1.Init
        LPARAMETERS tcFilter AS Character
        
        LOCAL laColumns[5+RECCOUNT("kcb"),5]
        LOCAL lnIndex AS Integer
        
        laColumns[1,1] = "学号"
        laColumns[1,2] = "xsb.xh"
        laColumns[1,3] = 100
        laColumns[2,1] = "姓名"
        laColumns[2,2] = "xsb.xm"
        laColumns[2,3] = 60
        laColumns[3,1] = "班级名称"
        laColumns[3,2] = "xsb.bjmc"
        laColumns[3,3] = 60
        laColumns[4,1] = "总成绩"
        laColumns[4,2] = "Get_TotalScore(xsb.xh)"
        laColumns[4,3] = 80
        laColumns[4,4] = "Z"
        laColumns[4,5] = "99,999.99"
        laColumns[5,1] = "平均分"
        laColumns[5,2] = "Get_AverageScore(xsb.xh)"
        laColumns[5,3] = 80
        laColumns[5,4] = "Z"
        laColumns[5,5] = "999.99"
        
        GOTO TOP IN kcb
        lnIndex = 5
        DO WHILE !EOF("kcb")
            lnIndex = lnIndex + 1
            laColumns[lnIndex,1] = ALLTRIM(kcb.kcm)
            laColumns[lnIndex,2] = "Get_Score(xsb.xh, '" + kcb.kch + "')"
            laColumns[lnIndex,3] = 80
            laColumns[lnIndex,4] = "Z"
            laColumns[lnIndex,5] = "999.99"
            SKIP IN kcb
        ENDDO 
        
        WITH This
            .Themes = .F.
            .DeleteMark = .F.
            .RecordMark = .F.
            .HighlightStyle = 2
            .HighlightRowLineWidth = 3
            .RecordSourceType = 1
            .RecordSource = "xsb"
            .ColumnCount = ALEN(laColumns,1)
            FOR lnIndex = 1 TO .ColumnCount
                WITH .Columns(lnIndex)
                    WITH .Header1
                        .Caption = laColumns[lnIndex,1]
                        .FontBold = .T.
                        .Alignment = 2
                    ENDWITH 
                    .ControlSource = laColumns[lnIndex,2]
                    IF !EMPTY(laColumns[lnIndex,3])
                        .Width = laColumns[lnIndex,3]
                    ENDIF 
                    IF !EMPTY(laColumns[lnIndex,4])
                        .Format = laColumns[lnIndex,4]
                    ENDIF 
                    IF !EMPTY(laColumns[lnIndex,5])
                        .InputMask = laColumns[lnIndex,5]
                    ENDIF 
                    IF INLIST(VARTYPE(EVALUATE(.ControlSource)), "N", "Y")
                        .Alignment = 1
                    ENDIF
                ENDWITH 
            NEXT 
            .ReadOnly = .T.
            .LockColumns = 3
            .HeaderHeight = 35
            .RowHeight = 25
        ENDWITH 
        
        IF (PCOUNT() == 1) .AND. (VARTYPE(tcFilter) == "C") .AND. !EMPTY(tcFilter)
            SET FILTER TO &tcFilter IN xsb
        ELSE
            SET FILTER TO IN xsb
        ENDIF 

        WITH This
            lnIndex = 5
            DO WHILE lnIndex <= .ColumnCount
                WITH .Columns(lnIndex).Header1
                    IF LENC(.Caption) > 5
                        .Caption = Wrap_String(.Caption, 5)
                        .WordWrap = .T.
                    ENDIF 
                ENDWITH 
                lcString = .Columns(lnIndex).ControlSource
                LOCAL lcSum AS Number 
                SUM &lcString ALL TO lnSum
                IF lnSum > 0
                    lnIndex = lnIndex + 1
                ELSE 
                    .DeleteColumn(lnIndex)
                ENDIF 
            ENDDO 
        ENDWITH 
        GOTO TOP IN xsb
        
    ENDPROC 


在組合框查詢提交時,用下面的語句:
ThisForm.Grid1.Init("ALLTRIM(xsb.bjmc) == '09护2'")

frm_Test.Grid1.Init

[ 本帖最后由 TonyDeng 于 2011-7-17 18:11 编辑 ]

授人以渔,不授人以鱼。
2011-07-17 18:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
重覆内容刪除

[ 本帖最后由 TonyDeng 于 2011-7-17 18:41 编辑 ]

授人以渔,不授人以鱼。
2011-07-17 18:10
快速回复:请教两个修改表结构和组合框数据绑定的问题
数据加载中...
 
   



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

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