Обновить вызов всех строк, если предложение в VBA - PullRequest
0 голосов
/ 06 августа 2009

Я пишу макрос для преобразования нулей в таблице доступа в «0000»

Ноль - это текстовый тип данных, поэтому я приводил его к типу int в условии if, чтобы обновить записи, состоящие только из нулей, и предотвратить его при обновлении записей, которые не являются нулями

но теперь все записи обновляются .. если предложение вызывается все время, даже если в определенной строке есть значение

помогите пожалуйста

Dim db As Database
Dim rst As Recordset
Dim strData As String
Set db = CurrentDb()

Dim qryString As String
qryString = "SELECT * FROM tblECodes "

Set rst = db.OpenRecordset(qryString)
rst.MoveFirst

Do While Not rst.EOF

  Dim testid As String
  Dim Sch1 As Integer
  Sch1 = CInt(rst.Fields("Scheduled"))
  Testid1 = rst.Fields("Testid")

  If Sch1 = "1" Then
    strSQLUp = "Update tblECodes set scheduled = '0000' where testid = 148"
    CurrentDb.Execute strSQLUp
  End If

  rst.MoveNext

Loop
rst.Close
db.Close

Ответы [ 3 ]

3 голосов
/ 08 августа 2009

Ваш вопрос включает в себя очень запутанный код.

Вы определяете этот набор записей:

  Set rst = db.OpenRecordset("SELECT * FROM tblECodes")

, а затем просматривайте строку за строкой, проверяя, соответствует ли строка определенным критериям, и затем выполняйте строку SQL, которая обновляет строки в той же самой таблице.

Это абсолютно бессмысленно.

Эта строка SQL должна выполнять эту работу (при условии, что я понял проблему с ненулевыми полями, которые обновляются, когда их не должно быть):

  UPDATE tblECodes
  SET Scheduled = "0000"
  WHERE Scheduled = "0" AND Sch1 = "1" AND TestID = 148;

Насколько я могу судить из вашего кода, приведенный выше оператор SQL абсолютно эквивалентен вашему процедурному коду, с добавлением предостережения, что он будет обновлять только записи, где Scheduled = 0.

Выполните это с помощью CurrentDB.Execute и параметра dbFailOnError, и вы добьетесь успеха, по крайней мере, если вы четко описали свою проблему.

2 голосов
/ 06 августа 2009

Должно ли это быть "testid = Testid1"? Кроме того, вы делаете Sch1 = "1", вы можете изменить это значение на 1 (без кавычек).

Do While Not rst.EOF

  Dim testid As String
  Dim Sch1 As Integer
  Sch1 = CInt(rst.Fields("Scheduled"))
  Testid1 = rst.Fields("Testid")

  If Sch1 = 1 Then
    strSQLUp = "Update tblECodes set scheduled = '0000' where testid = " & Testid1
    CurrentDb.Execute strSQLUp
  End If

  rst.MoveNext

Loop

Кроме того, вместо зацикливания RBAR (строка с агонизирующей строкой), вы хотите выполнить один запрос для повышения производительности:

docmd.RunQuery ("Update TblECodes Set Scheduled = '0000' Where Scheduled = '1'")
0 голосов
/ 06 августа 2009

Предложение РаджКуери от docmd.RunQuery должно работать хорошо. Но если вы хотите остаться в VBA:


Do While Not rst.EOF
  If rst!Scheduled = "0001" And rst!testid = "148" Then
    rst.Edit
    rst!scheduled = "0000"
    rst.Update
  End If
  rst.MoveNext
Loop
...