ACCES: вставить select с итерацией, где условие - PullRequest
0 голосов
/ 29 февраля 2012

Я довольно новичок в Access, vba и SQl, но все же мне нужно использовать их все вместе.Что мне нужно сделать, так это продублировать некоторые записи в определенной таблице на основе набора критериев;Для того, чтобы сделать это, мне удалось выполнить оператор "вставка выбора".Вкратце, моя проблема в том, что мне приходится дублировать N раз одну и ту же запись, где некоторые значения полей в таблице равны определенному значению.вот мой код: это позволяет мне повторять операторы sql N раз (где N берется из таблицы)

    Sub trydup()
Dim rst As DAO.Recordset
Dim asd As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("piv")
With rst
Dim i As Long
For i = 1 To 36
Dim NOM(1 To 36) As String
Dim NUM(1 To 36)
NOM(i) = !CDPRD
NUM(i) = !n
.MoveNext
Next
End With
Set asd = CurrentDb.OpenRecordset("Acc6")
MsgBox (NUM(4) & "   " & NOM(4))
With asd
Dim k As Integer
Dim n As Long
For n = 1 To 36
Do While k <= NUM(n)
  CurrentDb.Execute " INSERT into Acc6 SELECT * from Acc6 where CD_MAD = " & "'NOM(" & n & " )'"
k = k + 1
Loop
Next n
End With
End Sub

действительно, если я вместо этого выполню этот код:

Sub trydup()
Dim rst As DAO.Recordset
Dim asd As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("piv")
With rst
Dim i As Long
For i = 1 To 36
Dim NOM(1 To 36) As String
Dim NUM(1 To 36)
NOM(i) = !CDPRD
NUM(i) = !n
.MoveNext
Next
End With
Set asd = CurrentDb.OpenRecordset("Acc6")
MsgBox (NUM(4) & "   " & NOM(4))
With asd
Dim k As Integer
Dim n As Long
For n = 1 To 36
Do While k <= NUM(n)
  *CurrentDb.Execute " INSERT into Acc6 SELECT * from Acc6 where CD_MAD='PCA' " )'"*
k = k + 1
Loop
Next n
End With
End Sub

где PCA - значение, содержащееся в векторе NOM, vba работает нормально!поэтому вопрос в том, как извлечь в sql оператор все значения вектора "NOM" итеративлей?спасибо заранее за answares !!!!

У меня есть обновление по этому вопросу.Давайте рассмотрим более простую проблему: предположим, что я хочу сделать то же самое для всего одного шага в моем коде: первое значение в векторе NUM равно = 12 в NOM = PCA, так что в основном я хотел бы сделатьчтобы найти все строки в моей таблице, которые имеют значение поля CD_MAD = 'PCA', а затем скопировать 12 раз эту запись в той же таблице!поэтому мой код будет выглядеть примерно так:

    Sub trydup()
Dim rst As DAO.Recordset
Dim asd As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("piv")
With rst
Dim i As Long
For i = 1 To 36
Dim NOM(1 To 36) As String
Dim NUM(1 To 36)
NOM(i) = !CDPRD
NUM(i) = !n
.MoveNext
Next
End With
Set asd = CurrentDb.OpenRecordset("Acc6")
   With asd
   Dim n As Long
For n = 1 To 36
Do While k <= 12
  CurrentDb.Execute " INSERT into Acc6 SELECT * from Acc6 where CD_MAD='PCA' " )'"
k = k + 1
Loop
End With
End Sub

проблема здесь в основном в критериях "где": действительно, если предположить, что на шаге 0 в моей исходной таблице есть 4 записи, которые проверяют критерии CD_MAD= 'PCA' на втором шаге будет 8, на 3 шаге будет 16 и так далее ... это не то, что я хотел бы получить, так как я хотел бы ответить на это конкретное сырье всего 12 раз !!!что я хотел бы сделать, это найти способ выполнить один раз select istruction и затем вставить этот выбор 12 раз !!!!Помогите, пожалуйста, я немного схожу с ума !!


У меня есть обновление по этому вопросу.Давайте рассмотрим более простую проблему: предположим, что я хочу сделать то же самое для всего одного шага в моем коде: первое значение в векторе NUM равно = 12 в NOM = PCA, так что в основном я хотел бы сделатьчтобы найти все строки в моей таблице, которые имеют значение поля CD_MAD = 'PCA', а затем скопировать 12 раз эту запись в той же таблице!поэтому мой код будет выглядеть примерно так:

    Sub trydup()
Dim rst As DAO.Recordset
Dim asd As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("piv")
With rst
Dim i As Long
For i = 1 To 36
Dim NOM(1 To 36) As String
Dim NUM(1 To 36)
NOM(i) = !CDPRD
NUM(i) = !n
.MoveNext
Next
End With
Set asd = CurrentDb.OpenRecordset("Acc6")
   With asd
   Dim n As Long
For n = 1 To 36
Do While k <= 12
  CurrentDb.Execute " INSERT into Acc6 SELECT * from Acc6 where CD_MAD='PCA' " )'"
k = k + 1
Loop
End With
End Sub

проблема здесь в основном в критериях "где": действительно, если предположить, что на шаге 0 в моей исходной таблице есть 4 записи, которые проверяют критерии CD_MAD= 'PCA' на втором шаге будет 8, на 3 шаге будет 16 и так далее ... это не то, что я хотел бы получить, так как я хотел бы ответить на это конкретное сырье всего 12 раз !!!что я хотел бы сделать, это найти способ выполнить один раз select istruction и затем вставить этот выбор 12 раз !!!!помогите, пожалуйста, я немного схожу с ума !!

1 Ответ

0 голосов
/ 29 февраля 2012

"...where CD_MAD & "'NOM(" & n & " )'" не делает то, что вы хотите.Поскольку строка SQL ссылается на массив, он не имеет доступа к нему.

Измените его на это, чтобы извлечь значение из NOM, а затем объединить значение в строку

" ... where CD_MAD = '" & NOM(n) & "'" 
...