| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6105 人关注过本帖
标题:如果想运行一段程序期间弹出写有“请稍等”的表单,运行完成后“请稍等”自 ...
只看楼主 加入收藏
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
我这里没有 SQL Server,凭记忆应该这样的:

csql = [ driver=sql server;server=]+cServer+[;uid=]+cUid+[;pwd=]+cPwd+[;database=]+cdbs
sqlHandler = Sqlstringconnect(csql)
Local lcQuery, lnRes
lcQuery = "select bh,fyqj,df,sf,hj,sjh from wy_sdb where fyqj>='2016-01-01'"
SQLSetprop(sqlHandler, "Asynchronous" , .T.)
lnRes = SQLExec(sqlHandler, lcQuery, "tResult")

lnPoint = 0
Do While lnRes == 0
    lnPoint  = lnPoint + 1
    If lnPoint > 20  && 根据你的记录数的多少,刻度、步长自己调整
        lnPoint = 1
    Endif
    Wait Window Replicate(".", lnPoint) Nowait  && 刷新过程条
    lnRes = SQLExec(sqlHandler)  && 取异步已经下回来的记录数
EndDo

If lnRes < 0
    Aerror(laError)
    Messagebox(laError[1, 2])
Endif
SQLSetprop(sqlHandler, "Asynchronous", .F.)

如果要有总刻度,先同步方式获取总记录数:lnReccount;
如果需要漂亮的过程条,这个程序量太大了,下次再说吧,可好?

至于内网可以联,外网联不上,你提供的信息量太少,不好猜。
帮不上忙,我很惭愧。我还要继续努力。

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-04-02 21:18
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
如果要求不是很高的话,VFP 自带的过程条 _Therm.Vcx 还是可以的。
因为 DBF 没有异步方式,用循环做了一个过程条,可以在 Select FieldList...From Table...Where loTherm.Update()
也可以外部运行,比如:

Local loTherm, lcTask, lnPercent, lnSeconds
txtTitle = "正在查询"
lnDuration = 5  && 秒
loTherm = Newobject("_Thermometer", Home() + "Ffc\_Therm", "", txtTitle)
lcTask = "进度值 : "

With loTherm
    .Show()
    For I = 1 To lnDuration
        lnPercent = m.I/lnDuration * 100
        .Update(lnPercent, lcTask + " " + Transform(lnPercent))
        lnSeconds = Seconds()
        Do While lnSeconds + 1 > Seconds()
        Enddo
    Endfor
    .Complete("已经完成......")
Endwith

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-04-02 21:49
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
lnPoint  = lnPoint + 1
不是记录数,不知道是什么
我对比了同步和异步,时间差不多,9000条记录,都是11秒左右
csql = [ driver=sql server;server=]+cServer+[;uid=]+cUid+[;pwd=]+cPwd+[;database=]+cdbs
sqlHandler = Sqlstringconnect(csql)
Local lcQuery, lnRes ,lcWait
lcQuery = "select bh,fyqj,df,sf,hj,sjh from wy_sdb where fyqj>='2015-10-01'"
SQLSetprop(sqlHandler, "Asynchronous" , .T.)
lnRes = SQLExec(sqlHandler, lcQuery, "tResult")
t1=SECONDS()
lnPoint = 0
lcWait = ""
i=0
Do While lnRes == 0
    lnPoint  = lnPoint + 1
    i=i+1
    If lnPoint > 20  && 根据你的记录数的多少,刻度、步长自己调整
        lnPoint = 1
    ENDIF
    lcWait = Replicate("■", lnPoint)+SPACE(40-lnPoint*2)
    Wait Window (lcWait) Nowait  && 刷新过程条
    lnRes = SQLExec(sqlHandler)  && 取异步已经下回来的记录数
EndDo

If lnRes < 0
    Aerror(laError)
    Messagebox(laError[1, 2])
ENDIF
WAIT CLEAR

?i &&i 的值在1200左右,所以,i不是下载的记录数
?SECONDS()-t1
SQLSetprop(sqlHandler, "Asynchronous", .F.)

t2=SECONDS()
lnRes = SQLExec(sqlHandler, lcQuery, "tResult")
?SECONDS()-t2


[此贴子已经被作者于2016-4-3 00:17编辑过]

2016-04-02 23:51
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
lnPoint 不是记录数,是延时步进的刻度。
当前已获取的记录数应该从:
lnRes = SQLExec(sqlHandler)  && 取异步已经下回来的记录数
这句语句的后面取。
另外,同步和异步方式的查询,时间是差不多的,但如果你的过程条函数用在:Select ...From... Where 过程条函数
你的速度会大打折扣的。

这样吧,去掉一些繁琐的判别语句,使用 VFP FFC 自带的 _Therm.Vcx 过程条,做一个简单的示例,可以显示格式为:当前记录数 N / 总记录数 M:

*!*    SQL Query 使用过程条,SQLExec 必须异步模式。
*!*    下面是一个使用 VFP FFC _Therm.Vcx 过程条例子:

Local loTherm
*!*    使用 VFP FFC 自带的 _Therm.Vcx 过程条:
loTherm = Newobject("_thermometer", Home() + "ffc/_therm", "", "请稍候...")
loTherm.Show
loTherm.Update(0, "正在查询...")
DoEvents Force

*!*    首先使用同步方式获取总记录数(不要异步方式):
csql = [ driver=sql server;server=]+cServer+[;uid=]+cUid+[;pwd=]+cPwd+[;database=]+cdbs
sqlHandler = Sqlstringconnect(csql)  && 连接句柄
SQLSetprop(sqlHandler, "Asynchronous", .F.)
If SQLExec(m.sqlHandler, "Select Count(*) As Cnt From wy_sdb (Nolock)", "Cnt") < 0
    Error Message()
Endif
lotherm.iBasis =   && Cnt 游标中的总记录数

*!*    然后使用异步方式做查询:
SQLSetprop(sqlHandler, "Asynchronous", .T.)
CursorSetProp("FetchSize", 1000, 0)  && FetchSize 属性 & 值自己调整
Local lcQuery
lcQuery = "select bh,fyqj,df,sf,hj,sjh from wy_sdb where fyqj>='2016-01-01'"
If SQLExec(sqlHandler, lcQuery) < 0
    Error Message()
Endif

*!*    更新过程条的显示,显示格式为:当前记录数 N / 总记录数 M:
Local Cnt
Do While SQLExec(sqlHandler) = 0
    DoEvents
    Cnt = CursorGetProp("RecordsFetched")
    loTherm.Update(, Transform() + "/" + Transform(loTherm.iBasis))
Enddo

Release loTherm




[此贴子已经被作者于2016-4-3 15:08编辑过]

收到的鲜花
  • mywisdom882016-04-03 16:41 送鲜花  50朵   附言:我很赞同

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-04-03 15:02
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 

重点:有以下3个
SQLSetprop(sqlHandler, "Asynchronous" , .T.) &&设置为异步
CursorSetProp("FetchSize", 1000, 0) &&每次下载的记录数,要是想从1%,2%,3%,...100%,这里写1
lnCnt=CursorGetProp("RecordsFetched") &&到目前为止,下载的记录数


[此贴子已经被作者于2016-4-3 16:47编辑过]

2016-04-03 16:36
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
太好了,把一大堆的 SQL 查询 + 过程条的代码,浓缩、总结、减肥、提炼、归纳成三条语句,完美。

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-04-03 17:45
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
不再测试 DBF 的异步方式了,最后再提供一个状态栏上显示进程条的测试。

Set Status Bar On
 Public obar
 ** Open table
 cTable = Getfile("dbf")
 If Empty(cTable)
     Return .T.
 Endif

 ** Create the Progress bar object
 obar = Createobject("POnStatus")
 obar.pIndicatorStyle = '■'  && "||"
 Select * From (cTable) Where obar.DrawStatus(Recno(), Reccount())
 Set Message To
 Close Databases
 Release All

 ** Class definition for the Progress bar object
 Define Class POnStatus As Custom
     pIndicatorStyle = ""

     Procedure DrawStatus
         Lparameter nRecno, nReccount
         Local nPtr, cIndicator

         nPtr = Int(nRecno*100/nReccount)
         cIndicator = Replicate(This.pIndicatorStyle, nPtr) + Space(2) + ;
         Transform(nPtr) + "%" + Space(4) + Transform(nRecno) + ;
         " of " + Transform(nReccount)
         Set Message To Left(cIndicator, Len(cIndicator))
         Return .T.
     Endproc

 Enddefine

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-04-04 20:36
vfpp314
Rank: 1
等 级:新手上路
帖 子:46
专家分:5
注 册:2016-3-18
收藏
得分:0 
谢谢,各位大侠,我目前只需要在弹出 表单中插入一个 gif动画就可以,“伪进度条”就可以。不需要真实的处理进度。。。主要是为了提醒操作者现在计算机在处理数据。让操作者等待就可以了
2016-04-08 11:26
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
动画 GIF

图片附件: 游客没有浏览图片的权限,请 登录注册


throbberslow.gif (3.85 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-04-08 11:31
vfpp314
Rank: 1
等 级:新手上路
帖 子:46
专家分:5
注 册:2016-3-18
收藏
得分:0 
以下是引用吹水佬在2016-3-31 08:01:50的发言:

示例
** test.prg
of = CREATEOBJECT("form1")
of.show
READ EVENTS
CLEAR ALL
RETURN

DEFINE CLASS form1 as Form
    ShowWindow = 2
    Top = 200
    Left = 300
   
    ADD OBJECT cmd1 as commandbutton WITH top=10,left=10,caption="Test"
    ADD OBJECT edit1 as editbox WITH top=40,left=10,height=200
   
    PROCEDURE cmd1.click
        LOCAL of2
        of2 = CREATEOBJECT("form2")
        of2.show
        FOR i = 1 TO 10
            of2.ddProgress = i/10
            thisform.edit1.SelText = TRANSFORM(i)+0h0D0A
            INKEY(1)
        ENDFOR
        *IF VARTYPE(of2) == "O"
        *    of2.release
        *ENDIF
    ENDPROC

    PROCEDURE Unload
        CLEAR EVENTS
    ENDPROC
ENDDEFINE

DEFINE CLASS form2 as Form
    ShowWindow = 1
    DeskTop = .T.
    AutoCenter = .T.
    Width = 300
    Height = 100
   
    ddProgress = 0
   
    ADD OBJECT label1 as label WITH top=20,left=20,autosize=.T.,caption="请稍等......"
    ADD OBJECT Shape1 AS Shape WITH top=50,left=20,height=25,width=this.Width-40
    ADD OBJECT Shape2 AS Shape WITH top=50,left=20,height=25,Width=0,BackColor=0xFA9632,BorderStyle=0
   
    FUNCTION ddProgress_Assign(vNewVal)
        IF BETWEEN(vNewVal, 0, 1)
            this.Shape2.Width = this.Shape1.Width * vNewVal
        ENDIF
    ENDFUNC
ENDDEFINE



请问,“thisform.edit1.SelText = TRANSFORM(i)+0h0D0A”这句显示 语法错误
2016-04-08 11:34
快速回复:如果想运行一段程序期间弹出写有“请稍等”的表单,运行完成后“请稍等 ...
数据加载中...
 
   



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

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