2011-10-29 7 views
1

私のプロジェクトインベントリシステムで作業しています私は2 DTPickerを使用してmy listview1のmysqlのブックテーブルにフィルタリングされた日付を表示し、そのレポートを作成します。私はクラスモジュールIDKで私のクエリにエラーがある場合は、そのクエリと私は本当にVB 6.0でbegginerを混乱させる...あなたの助けを必要としてください。vb 6.0誰も私のコードで私を助けることができますか?

私は書籍とサプライヤという2つのテーブルを使用しています。

'クラスモジュール' の私CODE:

Sub DisplayList(ListView1 As ListView, DateFrom As Date, DateTo As Date) 
Dim lstItem As ListItem, a As Integer 
Dim rs As New ADODB.Recordset 
Dim sql As String 
If rs.State = adStateOpen Then rs.Close 

sql = " SELECT supplier.category,books.title,books.dataAcquired,books.amount,books.quantity,books.accesionno,books.conditions" & _ 
     " From supplier INNER JOIN books" & _ 
     " ON supplier.code=books.code" & _ 
     " WHERE (((books.dataAcquired)>=#" & DateFrom & "#) and ((books.dataAcquired) <=#" & DateTo & "#))" & _ 
     " GROUP BY supplier.category,books.title,books.dataAcquired,books.amount,books.quantity,books.accesionno,books.conditions" & _ 
     " ORDER BY books.dataAcquired DESC;" 
    rs.Open sql, cnn 

    ListView1.ListItems.Clear 
    Do While Not rs.EOF 
    a = a + 1 
     Set lstItem = ListView1.ListItems.Add(, , a, 1, 1) 
      lstItem.SubItems(1) = rs(0).Value 
      lstItem.SubItems(2) = rs(1).Value 
      lstItem.SubItems(3) = rs(2).Value 
      lstItem.SubItems(4) = rs(3).Value 
      lstItem.SubItems(5) = rs(4).Value 
      lstItem.SubItems(6) = rs(5).Value 
      lstItem.SubItems(7) = rs(6).Value 
      rs.MoveNext 
      Loop 

End Sub 

MY形式でMY CODE:

format date how yyyy-MM-dd or yyyyMMdd 

sql = " SELECT supplier.category,books.title,books.dataAcquired,books.amount,books.quantity,books.accesionno,books.conditions" & _ 
    " From supplier INNER JOIN books" & _ 
    " ON supplier.code=books.code" & _ 
    " WHERE (((books.dataAcquired)>='" & format(DateFrom,"yyyy-MM-dd") & "') and ((books.dataAcquired) <='" & format(DateTo,"yyyy-MM-dd") & "'))" & _ 
    " GROUP BY supplier.category,books.title,books.dataAcquired,books.amount,books.quantity,books.accesionno,books.conditions" & _ 
    " ORDER BY books.dataAcquired DESC;" 

変更ループ」によって

Private Sub Show_Click() 
clsData.DisplayList ListView1, DTPicker1.Value, DTPicker2.Value 
lblCount.Caption = ListView1.ListItems.Count 
End Sub 

Private Sub Form_Load() 
DTPicker1.Value = Date 
DTPicker2.Value = Date 
End Sub 

Private Sub Form_Activate() 
clsData.DisplayList ListView1, DTPicker1.Value, DTPicker2.Value 
lblCount.Caption = ListView1.ListItems.Count 
End Sub 

答えて

1

変更#を追加しながら、検証のためにレコードセットemptys、いくつかの方法

if RecordsetIsClosed(rs) then exit sub 

While Not RecordSetIsEmpty(rs) 
     a = a + 1 
     Set lstItem = ListView1.ListItems.Add(, , a, 1, 1) 
     lstItem.SubItems(1) = rs(0).Value 
     lstItem.SubItems(2) = rs(1).Value 
     lstItem.SubItems(3) = rs(2).Value 
     lstItem.SubItems(4) = rs(3).Value 
     lstItem.SubItems(5) = rs(4).Value 
     lstItem.SubItems(6) = rs(5).Value 
     lstItem.SubItems(7) = rs(6).Value 
     rs.MoveNext 
wend 

Public Function RecordSetIsEmpty(ByRef rs As ADODB.Recordset) As Boolean  
' On Local Error GoTo RecordSetIsEmpty_Error  
'  RecordSetIsEmpty = True  
'  If rs Is Nothing Then 
'   RecordSetIsEmpty = True 
'   Exit Function 
'  End If  
'  If RecordsetIsClosed(rs) = True Then 
'   RecordSetIsEmpty = True 
'   Exit Function 
'  End If  
    RecordSetIsEmpty = (rs.BOF = True And rs.EOF = True) 
' RecordSetIsEmpty_Done: 
'  Exit Function 
' RecordSetIsEmpty_Error: 
'  Resume RecordSetIsEmpty_Done  
End Function 


Public Function RecordsetIsClosed(ByRef rs As ADODB.Recordset) As Boolean  
On Local Error GoTo RecordsetIsClosed_Error 
    RecordsetIsClosed = True  
    If rs Is Nothing Then 
     RecordsetIsClosed = True 
    End If   
    If rs.State <> adStateClosed Then 
     RecordsetIsClosed = False 
    End If 
RecordsetIsClosed_Done: 
    Exit Function 
RecordsetIsClosed_Error: 
    Resume RecordsetIsClosed_Done 
End Function 

いけない...さて私は

RecordsetIsClosedがあるため、いくつかの例やデータベース管理者に使用されるのMoveNextメソッド覚えてないときのマークBertenshaw

更新おかげでRecordSetIsEmptyは、問題のために使用されるデータベース接続を開くことを忘れレコードセットが返されないか、またはレコードセットが正しく初期化されていない

たとえばアクセスが必要ですmovefist before movenextまたは値を読み取る

+0

SQL日付の比較(コードの主な問題です)に関してマークしましたが、なぜRecordSetIsEmpty()関数が必要なのかわかりません。レコードセットがNothingでないことを確認したら、While Not rs.EOF(またはさらに良い、Do Until rs.EOF)をループ条件として使用することができます。レコードごとのチェックは不要で非効率です。 –

+0

が更新されました。 rs.eofは時々失敗しました申し訳ありませんが、今私は.netと一緒に働いていますが、私は誰かにそれを待っています –

関連する問題