boy007zz 发表于 2010-12-13 16:58:14

(已解决)while循环进入死循环,请大家帮我看看问题出在哪里~~谢谢

本帖最后由 boy007zz 于 2010-12-16 15:10 编辑

我写了一个while循环调用EXCEL读取DBF库COUNT值的函数,可却进入了死循环,且只能读取i=1的值~大家帮我看看吧~~谢谢
我的程序:#include <Excel.au3>
#include <Array.au3>
#include<file.au3>
Dim $i=1
Dim $B=0
Dim $C
Dim $FLAG = True
Global Const $xlUp = -4162   
$FilePath=IniRead(@ScriptDir&"\dbfconfig.ini","DBF","FilePath" & $i,"NotFound")
$FIleName=IniRead(@ScriptDir&"\dbfconfig.ini","DBF","FileName" & $i,"NotFound")
local $oexcel = _ExcelBookOpen($FilePath,0) ;参数0为静默打开DBF文件
$ColumnNum= $oExcel.Sheets($FileName).Range("A65536").End($xlUp).Row -1; A列第65536行之上的最后有数据的单元格所在行数
$REG=IniRead(@ScriptDir & "\dbfconfig.ini","InitDBFData","REGKEY" & $i,"NOTFOUND")
$KEYNAME=IniRead(@ScriptDir & "\dbfconfig.ini","InitDBFData","KEYNAME" & $i,"NOTFOUND")

Func readdbf (ByRef $oexcel,ByRef $FilePath,ByRef $FileName,ByRef $ColumnNum);自定义函数--读取dbf库count值
       
EndFunc

While(1)
;判断是否没有任何配置项
;如果配置文件为空,即$B=0,则记录日志后退出循环,结束程序
;如果配置文件不为空,即$B<>0表示已经执行完毕所有配置正常,则记录日志后退出循环,结束程序
;如果缺少一个或者多个配置项,则记录执行失败日志,$B不增加,但$i加1,表示允许程序继续执行
If ($FileName= "NotFound" And $FilePath= "NotFound" ) Then
        If( $B=0 And $i=1 )Then
        _FileWriteLog(@ScriptDir & "\DBF.log","配置文件无任何配置,无法验证DBF库否清空")       
        EndIf               
        ExitLoop
        EndIf               
               
        ;如果缺少一个或者多个配置项,则记录执行失败日志,$B不增加,但$i加1,表示允许程序继续执行
        If ($FileName= "NotFound" Or $FilePath= "NotFound" ) Then
        _FileWriteLog(@ScriptDir & "\DBF.log","缺少部分配置项,"&$FilePath&$i&"库清空失败。")
        $i += 1                               
        ContinueLoop
        EndIf
       
            ;如果一个或者多个配置项的值为空,则记录执行失败日志,$B不增加,但$i加1,表示允许程序继续执行
         If ($FileName= ""Or $FilePath= "") Then
            _FileWriteLog(@ScriptDir & "\DBF.log","配置项的值不能为空,Disk"&$FilePath&$i&"库清空失败。")
             $i += 1       
             ContinueLoop
             Else   
             $C=readdbf($oexcel,$FilePath,$FileName,$ColumnNum)
             If $C=0 Then
        _FileWriteLog(@ScriptDir & "\DBF.log",$FileName&"库清空成功。")
        $B += 1
        Else
        _FileWriteLog(@ScriptDir & "\交DBF.log",$FileName&"库初始化失败。")
        EndIf
        $i += 1
                               
      EndIf
WEnd

;由于最后一重循环将$i增加1,但是没有读取DBF库,故将该值减一,表示实际读取了i个DBF库
$i-=1

;程序执行完毕,写注册表,并记录日志
;$B等于$i表示程序创建盘符个数与配置文件配置的个数一致,即程序执行成功
If( $B=$i ) Then
    RegWrite($REG,$KEYNAME,"REG_SZ","0") ; 若成功,创建键值为0
   _FileWriteLog(@ScriptDir & "\DBF.log","==========程序成功执行完毕==========")
Else
    RegWrite($REG,$KEYNAME,"REG_SZ","1") ; 若sb,创建键值为1
   _FileWriteLog(@ScriptDir & "\DBF.log","==========程序执行完毕,但出现错误,请检查==========")
EndIf
我程序要实现的功能是,根据配置文件DBF库的路径读取DBF库,并取得dbf库的count值,需要的判断:
1、查看配置文件里的配置,如果配置文件为空,B=0,退出循环,写日志
2、查看配置文件里的配置,若配置文件不为空,但缺少项目或某项值为空,则B=0,i+1,继续读取i=2的情况
3、如果一个或者多个配置项的值为空,则记录执行失败日志,B不增加,但$i加1,表示允许程序继续执行
进入下一级判断,如果配置项正常,则用自定义函数$C=readdbf($oexcel,$FilePath,$FileName,$ColumnNum)计算DBF的count值,若$C=0,即DBF库为空,则B+1(表示执行成功),退出循环;i+1进入下一个循环
4、如果配置项正常,但$C不等于0,退出循环,i=1进入下一个循环

程序运行完毕后,写注册表键值
$B等于$i表示程序创建盘符个数与配置文件配置的个数一致,即程序执行成功,注册表置0,否则值1

boy007zz 发表于 2010-12-13 16:59:10

为什么啊,这是为什么啊。。。

netegg 发表于 2010-12-13 17:08:45

整理好了再发,看不明白

kingfirekkk 发表于 2010-12-13 17:15:34

不明白你的程序意图,至少你得告诉我们,你的程序要在什么样的情况下面退出哦,目前只有看到你的程序有这样一个出口!不死才怪....
If ($FileName= "NotFound" And $FilePath= "NotFound" and($B=0 And $i=1 ) then exitloop

_ddqs. 发表于 2010-12-13 18:00:26

本帖最后由 _ddqs. 于 2010-12-13 18:29 编辑

把下面2行代码加到循环中的适合位置~~~        If $FIleName = "" Then $FIleName = "NotFound"
        If $FilePath = "" Then $FilePath = "NotFound"
While (1)
       
        If $FIleName = "" Then $FIleName = "NotFound"
        If $FilePath = "" Then $FilePath = "NotFound"


-----------------------------------------------------------------------------------_FileWriteLog(@ScriptDir & "\交DBF.log", $FIleName & "库初始化失败。")
                       
                        ExitLoop ;这里可能是非法文件名,读取失败 也退出!
                EndIf

_ddqs. 发表于 2010-12-13 18:46:51

本帖最后由 _ddqs. 于 2010-12-13 19:25 编辑

逻辑有点乱,处理有点类似下面的代码,自己再修改下

;写记录不要在循环内检测:

        If ($FIleName = "NotFound" And $FilePath = "NotFound") Then
                ;If ($B = 0 And $i = 1) Then
                        _FileWriteLog(@ScriptDir & "\DBF.log", "配置文件无任何配置,无法验证DBF库否清空")
                ;EndIf
                ;ExitLoop
        EndIf

        ;如果缺少一个或者多个配置项,则记录执行失败日志,$B不增加,但$i加1,表示允许程序继续执行
        If ($FIleName = "NotFound" Or $FilePath = "NotFound") Then
                _FileWriteLog(@ScriptDir & "\DBF.log", "缺少部分配置项," & $FilePath & $i & "库清空失败。")
                ;$i += 1
                ;ContinueLoop
        EndIf

        ;如果一个或者多个配置项的值为空,则记录执行失败日志,$B不增加,但$i加1,表示允许程序继续执行
        If ($FIleName = "" Or $FilePath = "") Then
                _FileWriteLog(@ScriptDir & "\DBF.log", "配置项的值不能为空,Disk" & $FilePath & $i & "库清空失败。")
                ;$i += 1
        EndIf


While (1)
       
                If Not FileExists( $FilePath & $FIleName) Then ExitLoop ;不存在文件
                       
                $C = readdbf($oexcel, $FilePath, $FIleName, $ColumnNum)
                If $C = 0 Then
                        _FileWriteLog(@ScriptDir & "\DBF.log", $FIleName & "库清空成功。")
                        $B += 1
                Else
                        _FileWriteLog(@ScriptDir & "\交DBF.log", $FIleName & "库初始化失败。")
                EndIf

                If ($B = 0 And $i = 1) Then
                        _FileWriteLog(@ScriptDir & "\DBF.log", "配置文件无任何配置,无法验证DBF库否清空")
                        ;ExitLoop
                EndIf
               
                ;如果配置文件为空,即$B=0,则记录日志后退出循环,结束程序
                If $B=0 ThenExitLoop ;
               
                If $i>99 ThenExitLoop ; 当$B非0时的出口,限定循环最高次

               
                $i += 1

        If (任务=异常) then Sleep(1000);调试用
WEnd


83265358 发表于 2010-12-13 19:02:27

顶,顺便学习。

boy007zz 发表于 2010-12-16 15:09:40

哦。。这样。。。。。学习了,看来要继续修炼才行。

hollandmfq 发表于 2014-5-17 20:41:15

雷锋精神传天下!谢谢分享!
页: [1]
查看完整版本: (已解决)while循环进入死循环,请大家帮我看看问题出在哪里~~谢谢