powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как правильно выполнить запрос и занести результаты в массив?
5 сообщений из 5, страница 1 из 1
Как правильно выполнить запрос и занести результаты в массив?
    #34168659
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь выполнить запрос, заполнить результатами массив и с каждым из его членов проделать определенную операцию:

Private Sub cmdDelete_Click()
Dim strSQL_1 As String
Dim strSQL_2 As String
Dim rstFindKeyWord_ID As DAO.Recordset
Dim rstFindKeyWord_Group As DAO.Recordset
Dim rstForArray As Variant
Dim varArrayMembersValue As Variant

'получим коды слов, связки СЛОВО-ГРУППА которых потом удалим
'из таблицы trelKEY_WORDS_LITERATURE

Set rstFindKeyWord_ID = CurrentDb.OpenRecordset _
("SELECT KEY_WORDS_TABL.idsNUMBER_WORD_ID " & _
"FROM (KEY_WORDS_TABL INNER JOIN trelKEY_WORDS_GROUP_TABL ON " & _
"KEY_WORDS_TABL.idsNUMBER_WORD_ID = trelKEY_WORDS_GROUP_TABL.idsNUMBER_WORD_ID) " & _
"INNER JOIN trelKEY_WORDS_LITERATURE ON " & _
"trelKEY_WORDS_GROUP_TABL.idsNUMBER_KEY_WORD_GROUP = " & _
"trelKEY_WORDS_LITERATURE.idsNUMBER_KEY_WORD_GROUP " & _
"WHERE (((trelKEY_WORDS_LITERATURE.idsLITERATURE_TABL_ID) = " & Forms!frmLiteratureInputData!txtNumber & "));")

по какой-то причине этот запрос возвращает только одну запись, хотя такой же сохраненный запрос:
SELECT KEY_WORDS_TABL.idsNUMBER_WORD_ID
FROM (KEY_WORDS_TABL INNER JOIN trelKEY_WORDS_GROUP_TABL ON KEY_WORDS_TABL.idsNUMBER_WORD_ID = trelKEY_WORDS_GROUP_TABL.idsNUMBER_WORD_ID) INNER JOIN trelKEY_WORDS_LITERATURE ON trelKEY_WORDS_GROUP_TABL.idsNUMBER_KEY_WORD_GROUP = trelKEY_WORDS_LITERATURE.idsNUMBER_KEY_WORD_GROUP
WHERE (((trelKEY_WORDS_LITERATURE.idsLITERATURE_TABL_ID)=882));
возвращает 4 записи


'пробежимся туда-сюда по набору записей
rstFindKeyWord_ID.MoveLast
rstFindKeyWord_ID.MoveFirst

'и занесем их в массив
Set rstForArray = rstFindKeyWord_ID.GetRows(rstFindKeyWord_ID.RecordCount)

'удалим связки СЛОВО-ГРУППА из таблицы trelKEY_WORDS_LITERATURE
strSQL_1 = "DELETE * FROM trelKEY_WORDS_LITERATURE " & _
"WHERE (((trelKEY_WORDS_LITERATURE.idsLITERATURE_TABL_ID) = " & Forms!frmLiteratureInputData!txtNumber & "));"
CurrentDb.Execute strSQL_1, dbFailOnError

'для каждого члена массива
For Each varArrayMembersValue In Array(rstForArray)

'проверим, входит ли это слово в другие связки СЛОВО-ГРУППА
Set rstFindKeyWord_Group = CurrentDb.OpenRecordset _
("SELECT idsNUMBER_KEY_WORD_GROUP FROM trelKEY_WORDS_GROUP_TABL " & _
"WHERE idsNUMBER_WORD_ID = " & varArrayMembersValue & "")

If rstFindKeyWord_Group.RecordCount > 0 Then

Else 'если не входит, удалим и само слово
strSQL_2 = "DELETE * FROM KEY_WORDS_TABL " & _
"WHERE (((KEY_WORDS_TABL.idsNUMBER_WORD_ID) = " & varArrayMembersValue & "));"
CurrentDb.Execute strSQL_2, dbFailOnError
End If

Next

Но, похоже, что-то делаю не так, и никак не пойму что. Прошу помочь.
З.Ы. Сейчас, кажется, Karfagen на меня ругаться будет...
...
Рейтинг: 0 / 0
Как правильно выполнить запрос и занести результаты в массив?
    #34168913
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КДСейчас, кажется, Karfagen на меня ругаться будет...А как вы догадались, что тут кроме меня никого нет? Как же вам помочь-то. У вас тут палево через строчку.

1) Не открывайте Recordset от Currentdb(). Делайте:Dim db As DAO.Database: Set db = CurrentDb()

а потом:
Set rstFindKeyWord_ID = db.OpenRecordset(...)
2) Опять вы мудритеSet rstForArray = rstFindKeyWord_ID.GetRows(rstFindKeyWord_ID.RecordCount)

вместо очевидного:
rstForArray = rstFindKeyWord_ID.GetRows(rstFindKeyWord_ID.RecordCount)
3) Ну и тут шибко оригинально:For Each varArrayMembersValue In Array(rstForArray)
..."WHERE idsNUMBER_WORD_ID = " & varArrayMembersValue & "")

в справке же все примеры есть:
For i = 0 to Ubound(rstForArray,2)
...тут перебираются ЗАПИСИ, попавшие в массив
...массив полученный от GetRows - двумерный, но поскольку вы загружаете
...в него одно поле, то поля в отдельном цикле вы тут не перебираете, а
...загруженный код получаете из элемента rstForArray(0,i)

Next i
Короче, идите читайте скорее что-нибудь - до утра еще есть время. Завтра на рассвете сюда придут люди, вы должны быть готовы понять, что они вам скажут ;)
...
Рейтинг: 0 / 0
Как правильно выполнить запрос и занести результаты в массив?
    #34169149
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Karfagen!
Да, вот как-то догадался...
1. А всегда прокатывало.

Знаю, что напортачил, поэтому и попросил чтобы пнули в верном направлении.
До утра почитать не успею, а вот утром пойду на работу и там еще посижу, покумекаю.
Спасибо!
...
Рейтинг: 0 / 0
Как правильно выполнить запрос и занести результаты в массив?
    #34169544
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю, суть вашего кода состоит в том, чтобы удалить некие ключевые слова, принадлежащие текущему лит.источнику. И именно для этого вы собираете их коды в массив, чтобы потом удалять их поодиночке - чтобы для каждого можно было сделать кое-какую предварительную проверку еще одним запросом.

ИМХО, вся эта затея решается выполнением двух запросов на удаление. Один у вас там уже есть. Другой чуток посложнее, конечно, но реализуемый. Его суть: удалить ключевые слова текущего лит.источника, если они они не используются как ключевые слова в других лит.источниках.

Схематично это так:DELETE * FROM ТаблицаКлючевыхСлов
WHERE КодСлова IN
(SELECT КодСлова FROM [запрос_связка_слов_источника]
WHERE КодЛитИсточника = [ТекущийКодЛитИсточника])
AND NOT IN
(SELECT КодСлова FROM [запрос_связка_слов_источника]
WHERE КодЛитИсточника <> [ТекущийКодЛитИсточника])синее - это список слов текущего лит.источника
красное - это список слов других источников
[запрос_связка_слов_источника] - это ваш JOIN-запрос которым вы у себя в коде выбираете эти слова (без условия - оно тут есть следом)

Демонстрирую через конструкцию IN чтоб было нагляднее, но конечно делать лучше с помощью JOIN.
...
Рейтинг: 0 / 0
Как правильно выполнить запрос и занести результаты в массив?
    #34171545
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Самая главная трудность у меня была с массивом, а вы мне тут как раз помогли. А с запросом - да, все правильно, только я чуть по-другому сделал:

'получим коды слов, связки СЛОВО-ГРУППА которых потом удалим
'из таблицы trelKEY_WORDS_LITERATURE
Set rstFindKeyWord_ID = CurrentDb.OpenRecordset _
("SELECT KEY_WORDS_TABL.idsNUMBER_WORD_ID " & _
"FROM (KEY_WORDS_TABL INNER JOIN trelKEY_WORDS_GROUP_TABL ON " & _
"KEY_WORDS_TABL.idsNUMBER_WORD_ID = trelKEY_WORDS_GROUP_TABL.idsNUMBER_WORD_ID) " & _
"INNER JOIN trelKEY_WORDS_LITERATURE ON " & _
"trelKEY_WORDS_GROUP_TABL.idsNUMBER_KEY_WORD_GROUP = " & _
"trelKEY_WORDS_LITERATURE.idsNUMBER_KEY_WORD_GROUP " & _
"WHERE (((trelKEY_WORDS_LITERATURE.idsLITERATURE_TABL_ID) = " & Forms!frmLiteratureInputData!txtNumber & "));")

'или можно открыть сохраненный запрос
Rem Set rstFindKeyWord_ID = dbs.OpenRecordset("Получение кодов слов")


'пробежимся туда-сюда по набору записей
rstFindKeyWord_ID.MoveLast
rstFindKeyWord_ID.MoveFirst
'и занесем их в массив
rstForArray = rstFindKeyWord_ID.GetRows(rstFindKeyWord_ID.RecordCount)


'удалим связки СЛОВО-ГРУППА из таблицы trelKEY_WORDS_LITERATURE
strSQL_2 = "DELETE * FROM trelKEY_WORDS_LITERATURE " & _
"WHERE (((trelKEY_WORDS_LITERATURE.idsLITERATURE_TABL_ID) = " & Forms!frmLiteratureInputData!txtNumber & "));"
CurrentDb.Execute strSQL_2, dbFailOnError

'для каждого члена массива
For intI = 0 To UBound(rstForArray, 2)

varArrayMembersValue = rstForArray(0, intI)

'проверим, используется ли это слово (в составе связки СЛОВО-ГРУППА) для других
'литературных источников
Set rstFindKeyWord_Group = CurrentDb.OpenRecordset _
("SELECT trelKEY_WORDS_LITERATURE.idsLITERATURE_TABL_ID " & _
"FROM trelKEY_WORDS_GROUP_TABL INNER JOIN trelKEY_WORDS_LITERATURE " & _
"ON trelKEY_WORDS_GROUP_TABL.idsNUMBER_KEY_WORD_GROUP = " & _
"trelKEY_WORDS_LITERATURE.idsNUMBER_KEY_WORD_GROUP " & _
"WHERE trelKEY_WORDS_GROUP_TABL.idsNUMBER_WORD_ID = " & varArrayMembersValue & "")


If rstFindKeyWord_Group.RecordCount > 0 Then

Else 'если нет - удалим и само слово
strSQL_3 = "DELETE * FROM KEY_WORDS_TABL " & _
"WHERE (((KEY_WORDS_TABL.idsNUMBER_WORD_ID) = " & varArrayMembersValue & "));"
CurrentDb.Execute strSQL_3, dbFailOnError
End If

Next intI
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как правильно выполнить запрос и занести результаты в массив?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]