2016-03-26 2 views
0

Я хотел бы вставить ряд процентов для каждого клиента в конце каждого месяца только после проверки того же. Он работает для первого, но не для остальных. Я не знаю, как использовать «For..each» здесь ...: |Как вставить новую строку для каждой записи в таблицу?

Любая помощь будет оценена по достоинству.

Спасибо!

Dim Str(0) As String 
    Str(0) = GetID("Transactions", "ID") 
    Dim TempStr(5) As String 

    Try 
     Conn.Open() 
     Com.CommandText = "Select * From Customer" 
     Dr = Com.ExecuteReader 
     While Dr.Read() 
      TempStr(0) = Dr(0).ToString 
      TempStr(1) = Dr(2).ToString 
      TempStr(2) = Dr(3).ToString 
      TempStr(3) = Dr(5).ToString 
      TempStr(4) = Dr(6).ToString 
      TempStr(5) = Dr(7).ToString 

      Dim LastIntDate = DateAdd("m", 0, DateSerial(Year(Today), Month(Today), 0)) 
      Try 
       Com.CommandText = "Select * From Transactions WHERE CID=" & TempStr(0).ToString & " AND TDate=#" & LastIntDate & "# AND Description='Interest'" 
       Dr2 = Com.ExecuteReader 
       If Dr2.Read = True Then 
        Dr2.Close() 
       Else 
        Try 
         Com.CommandText = "INSERT INTO Transactions Values(?,?,?,?,?,?,?)" 
         With Com.Parameters 
          .Add("@ID", OleDb.OleDbType.VarChar).Value = Str(0).ToString 
          .Add("@CustID", OleDb.OleDbType.VarChar).Value = TempStr(0).ToString 
          .Add("@TDate", OleDb.OleDbType.Date).Value = Date.Today 
          .Add("@Credit", OleDb.OleDbType.Currency).Value = 0 
          .Add("@Debit", OleDb.OleDbType.VarChar).Value = 500 
          .Add("@Balance", OleDb.OleDbType.VarChar).Value = Val(TempStr(3) + Interest) 
          .Add("@Desc", OleDb.OleDbType.VarChar).Value = "Interest" 
         End With 
         Com.ExecuteNonQuery() 
         Com.Parameters.Clear() 
        Catch ex As Exception 
         MsgBox(ex.Message) 
        End Try 

        Try 
         Com.CommandText = "Update Customer Set CurrBal=? WHERE ID=?" 
         With Com.Parameters 
          .Add("@CurrBal", OleDb.OleDbType.VarChar).Value = (TempStr(3) + Interest) 
          .Add("@CustID", OleDb.OleDbType.VarChar).Value = TempStr(0).ToString 
         End With 
         Com.ExecuteNonQuery() 
         Com.Parameters.Clear() 
        Catch ex As Exception 
         MsgBox(ex.Message) 
        End Try 
       End If 
       Dr2.Close() 
      Catch ex As Exception 

      End Try 
     End While 
     Dr.Close() 

    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
    Conn.Close() 

ответ

0

Вы близко. Вы не хотите, чтобы Dr.Read в то время как false, вы хотите читать в то время как true. Как правило, это просто:

Do While Dr.Read() 

нормально, я думаю, что вы делаете слишком много работы, вы не используете правильную картину Dispose и вы используете SQL Injection уязвимых реализации, но ответить на ваш вопрос:

Причина, по которой он работает только для первого клиента, заключается в том, что вы только читаете первую запись от Dr. Плохая практика в стороне, сделайте что-нибудь вроде этого:

Dim Str(0) As String 
Str(0) = GetID("Transactions", "ID") 
Dim TempStr(5) As String 

Try 
    Conn.Open() 
    Com.CommandText = "Select * From Customer" 
    Dr = Com.ExecuteReader 
    While Dr.Read() 
     TempStr(0) = Dr(0).ToString 
     TempStr(1) = Dr(2).ToString 
     TempStr(2) = Dr(3).ToString 
     TempStr(3) = Dr(5).ToString 
     TempStr(4) = Dr(6).ToString 
     TempStr(5) = Dr(7).ToString 

     '********************** 
     ' All your other stuff goes here so that it executes once 
     ' for each customer 
     '**********************    
    End While 
    Dr.Close() 

Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 
+0

На самом деле мне не нужно это искать, поэтому для этого используется Dr.read = False. Если у него этого нет, только тогда интерес должен быть опубликован. – Abhi

+0

Тогда вам будет лучше проверять 'Dr.HasRows', чем видеть, возвращает ли первое чтение false. – Crowcoder

+0

Вы можете сэкономить еще больше неприятностей, выполнив 'INSERT INTO [Транзакции] .. blah bah .. WHERE NOT EXISTS (SELECT ... where cid = и т. Д. Это устранит первую команду и цикл. – Crowcoder

Смежные вопросы