|
Как правильно выполнить запрос и занести результаты в массив?
|
|||
---|---|---|---|
#18+
Пытаюсь выполнить запрос, заполнить результатами массив и с каждым из его членов проделать определенную операцию: 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 на меня ругаться будет... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2006, 19:11 |
|
Как правильно выполнить запрос и занести результаты в массив?
|
|||
---|---|---|---|
#18+
КДСейчас, кажется, 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 Короче, идите читайте скорее что-нибудь - до утра еще есть время. Завтра на рассвете сюда придут люди, вы должны быть готовы понять, что они вам скажут ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2006, 21:56 |
|
Как правильно выполнить запрос и занести результаты в массив?
|
|||
---|---|---|---|
#18+
Здравствуйте, Karfagen! Да, вот как-то догадался... 1. А всегда прокатывало. Знаю, что напортачил, поэтому и попросил чтобы пнули в верном направлении. До утра почитать не успею, а вот утром пойду на работу и там еще посижу, покумекаю. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2006, 06:50 |
|
Как правильно выполнить запрос и занести результаты в массив?
|
|||
---|---|---|---|
#18+
Насколько я понимаю, суть вашего кода состоит в том, чтобы удалить некие ключевые слова, принадлежащие текущему лит.источнику. И именно для этого вы собираете их коды в массив, чтобы потом удалять их поодиночке - чтобы для каждого можно было сделать кое-какую предварительную проверку еще одним запросом. ИМХО, вся эта затея решается выполнением двух запросов на удаление. Один у вас там уже есть. Другой чуток посложнее, конечно, но реализуемый. Его суть: удалить ключевые слова текущего лит.источника, если они они не используются как ключевые слова в других лит.источниках. Схематично это так:DELETE * FROM ТаблицаКлючевыхСлов WHERE КодСлова IN (SELECT КодСлова FROM [запрос_связка_слов_источника] WHERE КодЛитИсточника = [ТекущийКодЛитИсточника]) AND NOT IN (SELECT КодСлова FROM [запрос_связка_слов_источника] WHERE КодЛитИсточника <> [ТекущийКодЛитИсточника])синее - это список слов текущего лит.источника красное - это список слов других источников [запрос_связка_слов_источника] - это ваш JOIN-запрос которым вы у себя в коде выбираете эти слова (без условия - оно тут есть следом) Демонстрирую через конструкцию IN чтоб было нагляднее, но конечно делать лучше с помощью JOIN. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2006, 10:52 |
|
Как правильно выполнить запрос и занести результаты в массив?
|
|||
---|---|---|---|
#18+
Самая главная трудность у меня была с массивом, а вы мне тут как раз помогли. А с запросом - да, все правильно, только я чуть по-другому сделал: 'получим коды слов, связки СЛОВО-ГРУППА которых потом удалим 'из таблицы 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2006, 18:28 |
|
|
start [/forum/topic.php?fid=45&gotonew=1&tid=1654491]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
12ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 266ms |
total: | 404ms |
0 / 0 |