Помогите с оптимизацией кода

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Помогите с оптимизацией кода

Сообщение gjghjc » 23.09.2004 (Чт) 17:56

Сейчас это работает так:

' Открываем Базу_Источник и Рекордсет_Источник
Set srcBase = DAO.OpenDatabase(srcMainPath, False, False, "dBASE IV;LANGID=0x0419;CP=866;COUNTRY=0")
Set srcRS = srcBase.OpenRecordset("SELECT поле1, поле2 FROM " & srcFile & """")

' Открываем Базу_Приемник и Рекордсет_Приемник
Set dstBase = DAO.OpenDatabase(dstMainPath, False, False, "dBASE IV;LANGID=0x0419;CP=866;COUNTRY=0")
Set dstRS = dstBase.OpenRecordset("SELECT поле1, поле2 FROM " & dstFile & """")

dstRS.MoveLast
dstRS.MoveFirst

srcRS.MoveLast
srcRS.MoveFirst

MsgBox srcRS.RecordCount
MsgBox dstRS.RecordCount

Do Until srcRS.EOF

dstRS.MoveFirst

Do Until dstRS.EOF

Select Case srcRS.Fields("поле1")

Case Is = dstRS.Fields("поле1")
dstRS.Edit
dstRS.Fields("поле2") = srcRS.Fields("поле2")
dstRS.Update

End Select

dstRS.MoveNext
Loop

srcRS.MoveNext
Loop

Приблизительный размер источника 20 тыс приемника от 10 до 1000 если мне конечно не лениво покурить 20-30 мин. но хотелось бы узнать как это можно оптимизировать.
Заранее спасибо всем откликнувшимся!!!!!!!
Утро добрым не бывает!

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 24.09.2004 (Пт) 7:18

Ор-р-ригинально. Поиск записи тупым сканированием таблицы...

1.
Рекомендуется почитать про методы Seek, FindFirst - к ним в Help-е примеры есть.

2.
Подобное обновление можно вообще сделать одним запросом - тут надо почитать Help по UPDATE.

3.
Если ты только начинаешь работать с базами (что похоже по вопросу) - не советую орентироваться на DAO - все-же довольно устаревшая технология - работай сразу с ADO, чтобы потом не переучиваться...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 24.09.2004 (Пт) 9:31

:)
Код: Выделить всё
UPDATE
    Table1 SET Table1.pole2 = Table2.pole2
FROM
    Table1, Table2
WHERE
    Table1.pole1 = Table2.pole1

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 24.09.2004 (Пт) 11:26

Спасибо большое за код(Sedge) и направление поисков для дальнейшего развития (Andrey Fedorov).
Утро добрым не бывает!

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 24.09.2004 (Пт) 16:20

Как я понял эту хреновину нужно запихать в строковую переменную а затем привинтить к dstBase.Execute

Вот только у меня он пишет что пропущен оператор в выражении запроса
делаю так

SQLUpdate = "Update " & dstFile1 & " SET " & dstFile1 & ".pole1 = " & srcFile1 & ".pole1 FROM " & dstFile1 & " , " & srcFile1 & " WHERE " & dstFile1 & ".pole2 = " & srcFile1 & ".pole2"

где dstFile1 и srcFile1 имена таблиц (без расшрения dbf хотя пробовал и с ним та же фигня получается)
HELP!!!!!!!!
Утро добрым не бывает!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.09.2004 (Пн) 11:08

Попробуй заключить имена таблиц и полей в квадратные скобки.
Если все-равно будет ошибка, сделай debug.print SQLUpdate и результаты запости сюда.
Lasciate ogni speranza, voi ch'entrate.

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 27.09.2004 (Пн) 11:23

Я с DBF-форматом не работал, но не думаю, что для синтаксиса ANSI-SQL есть какая-то разница. Запрос вроде как правильно написан. Посмотри, какая строка у тебя заносится в переменную SQLUpdate. Ошибка скорее всего происходит на этапе формирования этой строки. Может какая-нибудь из переменных (srcFile1 или dstFile1) содержит пустое значение.

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 27.09.2004 (Пн) 18:09

И DEBUG.PRINT делал и в квадратные скобки включал и как только не извращался ничего не получилось. Большое спасибо г-же Rainbow за помощь именно она подсказала вариант решения который сработал.

Попробуйте переписать запрос в виде:
UPDATE Table1 INNER JOIN Table2 ON Table1.id = Table2.id SET Table1.Name3 =Table2.Name2;


Запостил сюда можь кого тоже спасет как и меня :D

Кстати в переменных пустых значений небыло это точно.
Утро добрым не бывает!


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList