Public Sub crystal_init()    '对水晶报表进行初始化Call check_condatabase
Dim rs_rpt As ADODB.Recordset
Dim rs_feiyong As ADODB.Recordset
Set rs_rpt = New ADODB.Recordset
Set rs_feiyong = New ADODB.Recordsetrs_rpt.Open "select * from feiyong_rpt", cn, adOpenStatic, adLockPessimistic
rs_feiyong.Open "select * from feiyong", cn, adOpenStatic, adLockPessimisticIf rs_rpt.BOF <> True Then '这地方已经判断rs_rpt.Open为是否为true
  If rs_feiyong.BOF <> True Then rs_feiyong.MoveFirst
    Do Until rs_feiyong.EOF
       If rs_rpt.EOF <> True Then
          For i = 0 To 7
              rs_rpt.Fields(i).Value = rs_feiyong.Fields(i).Value
          Next
       Else
          rs_rpt.AddNew
          For i = 0 To 7
              rs_rpt.Fields(i).Value = rs_feiyong.Fields(i).Value
          Next
       End If
       rs_rpt.Update
       rs_rpt.MoveNext
       rs_feiyong.MoveNext
    Loop
Else
    If rs_rpt.BOF <> True Then rs_rpt.MoveLast ‘而这地方还判断一次重复的,不是不这地方有错误!!!!
   
    If rs_feiyong.BOF <> True Then rs_feiyong.MoveFirst
    Do Until rs_feiyong.EOF
       rs_rpt.AddNew
       For i = 0 To 7
           rs_rpt.Fields(i).Value = rs_feiyong.Fields(i).Value
       Next
       rs_rpt.Update
       rs_rpt.MoveNext
       rs_feiyong.MoveNext
    Loop
    Exit Sub
End IfIf rs_rpt.EOF <> True Then
   Do Until rs_rpt.EOF
      rs_rpt.Delete
      rs_rpt.MoveNext
   Loop
End If

解决方案 »

  1.   

    格式化后的代码Public Sub crystal_init() '对水晶报表进行初始化    Call check_condatabase
        Dim rs_rpt As ADODB.Recordset
        Dim rs_feiyong As ADODB.Recordset
        Set rs_rpt = New ADODB.Recordset
        Set rs_feiyong = New ADODB.Recordset
        
        rs_rpt.Open "select * from feiyong_rpt", cn, adOpenStatic, adLockPessimistic
        rs_feiyong.Open "select * from feiyong", cn, adOpenStatic, adLockPessimistic
        
        If rs_rpt.BOF <> True Then '这地方已经判断rs_rpt.Open为是否为true
            If rs_feiyong.BOF <> True Then rs_feiyong.MoveFirst
            
            Do Until rs_feiyong.EOF
                If rs_rpt.EOF <> True Then
                    For i = 0 To 7
                        rs_rpt.Fields(i).Value = rs_feiyong.Fields(i).Value
                    Next
                Else
                    rs_rpt.AddNew
                    
                    For i = 0 To 7
                        rs_rpt.Fields(i).Value = rs_feiyong.Fields(i).Value
                    Next
                End If
                
                rs_rpt.Update
                rs_rpt.MoveNext
                rs_feiyong.MoveNext
            Loop
        Else
            If rs_rpt.BOF <> True Then rs_rpt.MoveLast '而这地方还判断一次重复的,不是不这地方有错误!!!!
            If rs_feiyong.BOF <> True Then rs_feiyong.MoveFirst
            
            Do Until rs_feiyong.EOF
                rs_rpt.AddNew
                
                For i = 0 To 7
                    rs_rpt.Fields(i).Value = rs_feiyong.Fields(i).Value
                Next
                
                rs_rpt.Update
                rs_rpt.MoveNext
                rs_feiyong.MoveNext
            Loop
            
            Exit Sub
        End If
        
        If rs_rpt.EOF <> True Then
            Do Until rs_rpt.EOF
                rs_rpt.Delete
                rs_rpt.MoveNext
            Loop
        End If
      

  2.   

    的确错误,    Else
            If rs_rpt.BOF <> True Then rs_rpt.MoveLast '而这地方还判断一次重复的,不是不这地方有错误!!!!
    **********************************
    这里不可能   rs_rpt.BOF <> True 
      

  3.   

    谢谢jhone99 那它正确的写法应该是什么呢?
      

  4.   


    的确有冗余语句,但不影响逻辑。我一般这样写:Call check_condatabase
    Dim rs_rpt As ADODB.Recordset
    Dim rs_feiyong As ADODB.Recordset
    Set rs_rpt = New ADODB.Recordset
    Set rs_feiyong = New ADODB.Recordsetcn.Execute "DELETE FROM feiyong_rpt"
    cn.Execute "INSERT INTO feiyong_rpt SELECT fieldname0, fieldname1, fieldname2, fieldname3, fieldname4, fieldname5, fieldname6, fieldname7 FROM feiyong"rs_rpt.Open "select * from feiyong_rpt", cn, adOpenStatic, adLockPessimistic
    rs_feiyong.Open "select * from feiyong", cn, adOpenStatic, adLockPessimistic
      

  5.   

    If rs_rpt.EOF <> True Then
            Do Until rs_rpt.EOF
                rs_rpt.Delete
                rs_rpt.MoveNext
            Loop
    这地方什么意思不明白,刚把数据拷贝到位rs_rpt,为什么这个语句把数据又都删除了?
      

  6.   

    帮你注释下
    If rs_rpt.EOF <> True Then '如果数据集rs_rpt不是最后则
      Do Until rs_rpt.EOF      '循环到rs_rpt的最后一条
      rs_rpt.Delete            '删除当前游标所在位置的数据
      rs_rpt.MoveNext          '游标下移
      Loop