Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: помогите с кодом... MS2000
 
 автор: час   (13.03.2007 в 09:21)   личное сообщение
 
 

Посоветуйте по отимизации кода...


Я сравниваю (rstOsnovna DAO.Recordset) и (rstHelnok DAO.Recordset) , одноимённые поля проверяю на разность содержащихся в них данных.Так как эти таблицы из разных офисов в них наверняка есть разница .

If Nz(rstOsnovna!NOMER) <> Nz(rstHelnok![NOMER]) Then raznicaECTb = 1
If Nz(rstOsnovna!NAME) <> Nz(rstHelnok![NAME]) Then raznicaECTb = 1
If Nz(rstOsnovna!NDATE) <> Nz(rstHelnok![NDATE]) Then raznicaECTb = 1
и т.д. ......................
всё бы не плохо но говорят ( If ) очень медленно работает и если два десятка полей, тысячи записей, то сравнение пройдёт долго.
потому я решил попробовать иначе...

Set Helndb = wsp.OpenDatabase(put_k_baze"Helnok.mdb")
Set rstOsnovna = CurrentDB.OpenRecordset("dog" , dbOpenDynaset)
Set rstHelnok = Helndb.OpenRecordset("dog1", dbOpenDynaset)

dim name_field as string
dim raznicaECTb as integer

raznicaECTb =0
Do Until rstHelnok.EOF = True

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

name_field =rstHelnok.name
If Nz(rstOsnovna!(name_field)) <> Nz(rstHelnok!(name_field) Then raznicaECTb = 1


Loop
if raznicaECTb = 1 then‘ и если хотя бы одно поле не совпадает по содержимому, то принять меры…


else

end if

Но может у кого-то есть другое , уже испытанное решение…

  Ответить  
 
 автор: osmor   (13.03.2007 в 09:44)   личное сообщение
 
 

уже отвечал по поводу коллекции полей в рекордсете
http://www.hiprog.com/forum/read.php?id_forum=1&id_theme=1648&page=1


dim fld as field

for each fld in rstHelnok.Fields
   with fld
   if .value <> rstOsnovna.Fields(.name).value then raznicaECTb = 1 : Exit For
next

а как Вы будете определять что запись в рекордсете 1 соответсвует записи в рекордсете 2 ?
Только по порядку следования?
я бы попытался сделал запросом...

  Ответить  
 
 автор: KrukVN   (13.03.2007 в 10:10)   личное сообщение
 
 

Ну дык да, запросом конечно
как там... записи без подчиненных

  Ответить  
 
 автор: osmor   (13.03.2007 в 10:13)   личное сообщение
 
 

тут конечно зависит от кол-ва полей, и их известности... возможно придется строку SQL формировать на лету

  Ответить  
 
 автор: KrukVN   (13.03.2007 в 10:18)   личное сообщение
 
 

Ну может и так
но это все равно лучше чем рекордсет лопатить

  Ответить  
 
 автор: час   (13.03.2007 в 11:50)   личное сообщение
 
 

я сначала бегу по второй "челнок" базе и начиная с первой записи беру её уникальный код и нахожу его во первой "основной" базе
rstOsnovna.FindFirst "[Guid] ='" & rstHelnok!guid & "'"
                    If rstOsnovna.NoMatch = True Then GoTo novajazapis 'новая запись '
                    If Nz(rstHelnok!guid) = Nz(rstOsnovna!guid) Then '1

  Ответить  
 
 автор: Explorer   (13.03.2007 в 11:56)   личное сообщение
 
 

зачем вообще "челночить" по рекордсету?

  Ответить  
 
 автор: час   (13.03.2007 в 11:57)   личное сообщение
 
 

А вы как предлагаете?

  Ответить  
 
 автор: osmor   (13.03.2007 в 12:04)   личное сообщение
 
 

если уж рекордсетом, то лучше открывать рекордсет объединяющий две таблицы инерджойном по ключевому полю, а потом пробежаться по нему сравнивая поля одной записи. Будет быстрее чем скакать по второму рекордсету с помощью Find

  Ответить  
 
 автор: час   (13.03.2007 в 12:08)   личное сообщение
 
 

Понял.
Это первое что нужно сделать.
Затем нужно посмотреть нет-ли аписей с кодом которого здесь ещё нет
т.е. новая запись ..
я делаю так
If rstOsnovna.NoMatch = True Then GoTo novajazapis 'новая запись .

  Ответить  
 
 автор: osmor   (13.03.2007 в 12:12)   личное сообщение
 
 

А я бы сделал запросом на добавление и чохом добавил бы все недостающие...

  Ответить  
 
 автор: час   (13.03.2007 в 12:16)   личное сообщение
 
 

Великолепно..
тогда это будет выглядеть так...
первыйэтап
А я бы сделал запросом на добавление и чохом добавил бы все недостающие

второй этап это
соэдать рекордсет объединяющий две таблицы по id_полю

Олег, а как пробежаться по нему сравнивая поля одной записи. Будет быстрее чем скакать по второму рекордсету с помощью Find
вот так?
dim name_field as string
dim raznicaECTb as integer

raznicaECTb =0
Do Until rstHelnok.EOF = True

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

name_field =rstHelnok.name 
If Nz(rstOsnovna!(name_field)) <> Nz(rstHelnok!(name_field) Then raznicaECTb = 1


Loop

  Ответить  
 
 автор: osmor   (13.03.2007 в 12:41)   личное сообщение
 
 

нет теперь же один рекордсет...
нужно сравнить поля в одинаковыми именами из разных таблиц.
предположим что есть две таблицы в разными именами (tbl1 b tbl2) и одинаковым набором полей.
Ну примерно так:
Нужно передать имена таблиц и имя ключевого поля
как только встретит несовпадение вернет 1
если все совпадает вернет 0
проверки на несовпадение имен полей в таблицах - нет

Function CompTable(NameSourceTBL as string,NameTargetTBL as string, NameIdField as string) as Byte 

dim raznicaECTb  as byte
Dim rst As DAO.Recordset
Dim fld As DAO.Field
dim strNameTabl1 as string
dim strNameTabl2 as string
dim strIDName as string
strNameTabl1 = NameSourceTBL   ' имя таблицы 1
strNameTabl2 = NameTargetTBL  ' имя таблицы 2
strIDName  = NameIdField  ' имя ключевого поля

Set rst = CurrentDb.OpenRecordset("SELECT " & _
strNameTabl1 & ".*, " & strNameTabl1 & ".* FROM " & _
strNameTabl1 & " INNER JOIN " & strNameTabl2 & _
" ON " & strNameTabl1 & "." & strIDName & " = " & strNameTabl2 & "." & strIDName & ";")
with rst
if  .recordcount <> 0 then
rst.MoveFirst
raznicaECTb = 0
do while not .eof and raznicaECTb =0
   For Each fld In rst.Fields
         if fld.SourceTable = strNameTabl1 then
                if fld.value <> .Fields(strNameTabl2 & "." & fld.SourceField).value  then 
                               raznicaECTb = 1 
                              Exit For 
                end if
         end if
   Next
loop
end if
CompTable = raznicaECTb 
end function


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

  Ответить  
 
 автор: час   (13.03.2007 в 12:45)   личное сообщение
 
 

А я думал что ты на обед ушёл...
спасибо , читаю....

  Ответить  
 
 автор: osmor   (13.03.2007 в 12:54)   личное сообщение
 
 

Да нет, посто я тут еще и работу работать пытаюсь

  Ответить  
 
 автор: час   (13.03.2007 в 16:18)   личное сообщение
 
 

Я перетащил конструкцию в запрос
SELECT dogCHELN.*, dogCHELN.* FROM dogCHELN INNER JOIN dogOsnova ON dogCHELN.kod = dogOsnova.kod;

одноименные поля в таблице 2 превращаются в
поле1 поле2 прле3 и т.д.
т.е.
нужно писать
dogOsnova.NOMER, dogOsnova.NAIMENOVANIE, dogOsnova.NDATE, dogOsnova.ODATE, dogOsnova.COMENT

но тода при добавлении очереддного поля нодо подправлять запрос....
что посоветуете?

  Ответить  
 
 автор: час   (13.03.2007 в 16:22)   личное сообщение
 
 

видимо как то так
F=1
if fld.value <> .Fields(strNameTabl2 & ".поле" & F & ")".value then
F=F+1

  Ответить  
 
 автор: osmor   (13.03.2007 в 16:29)   личное сообщение
 
 

Говорю же оЧепятки могут быть

Set rst = CurrentDb.OpenRecordset("SELECT " & _ 
strNameTabl1 & ".*, " & strNameTabl1 & ".* FROM " & _ 
strNameTabl1 & " INNER JOIN " & strNameTabl2 & _ 
" ON " & strNameTabl1 & "." & strIDName & " = " & strNameTabl2 & "." & strIDName & ";") 

Читать как:

Set rst = CurrentDb.OpenRecordset("SELECT " & _ 
strNameTabl1 & ".*, " & strNameTabl2 & ".* FROM " & _ 
strNameTabl1 & " INNER JOIN " & strNameTabl2 & _ 
" ON " & strNameTabl1 & "." & strIDName & " = " & strNameTabl2 & "." & strIDName & ";") 

  Ответить  
 
 автор: час   (13.03.2007 в 16:33)   личное сообщение
 
 

очепятки очепятки
Олег , это я заметил и поправил сразу
strNameTabl1 & ".*, " & strNameTabl2 & ".*
Спасибо

  Ответить  
 
 автор: osmor   (13.03.2007 в 16:36)   личное сообщение
 
 

т.е. все порешалось?

  Ответить  
 
 автор: час   (13.03.2007 в 16:37)   личное сообщение
 
 


порешили мы с тобой ВСЕх

  Ответить  
 
 автор: час   (13.03.2007 в 16:44)   личное сообщение
 
 

Но программу я пока не написал...
так что наверняка опять буду в тупичке...
Я к тебе загляну попрошу указать дорожку...
Надеюсь (как всегда) пошлёшь меня в нужном направлениииии....

  Ответить  
 
 автор: час   (13.03.2007 в 17:53)   личное сообщение
 
 

Цикл не очень быстро происходит...
можно сказать бесконечно долго

Function CompTable(NameSourceTBL As String, NameTargetTBL As String, NameIdField As String) As Byte
Dim raznicaECTb  As Byte
Dim rst As DAO.Recordset
Dim fld As DAO.Field
Dim strNameTabl1 As String
Dim strNameTabl2 As String
Dim strIDName As String
strNameTabl1 = NameSourceTBL   ' имя таблицы 1
strNameTabl2 = NameTargetTBL  ' имя таблицы 2
strIDName = NameIdField   ' имя ключевого поля

Set rst = CurrentDb.OpenRecordset("SELECT " & strNameTabl1 & ".*, " & strNameTabl2 & ".* FROM " & strNameTabl1 & " INNER JOIN " & strNameTabl2 & " ON " & strNameTabl1 & "." & strIDName & " = " & strNameTabl2 & "." & strIDName & ";")
With rst
If .RecordCount <> 0 Then
rst.MoveFirst
raznicaECTb = 0
Do While Not .EOF And raznicaECTb = 0
   For Each fld In rst.Fields
         If fld.SourceTable = strNameTabl1 Then
         SysCmd acSysCmdSetStatus, "-" & Nz(fld.Value) & "-" & fld.Name
                If fld.Value <> .Fields(strNameTabl2 & "." & fld.SourceField).Value Then
                               raznicaECTb = 1
                              Exit For
                End If
         End If
   Next
Loop
End If
End With
CompTable = raznicaECTb
End Function

  Ответить  
 
 автор: час   (13.03.2007 в 17:55)   личное сообщение
 
 

к сожалению файл отправить не удаётся не шлётся
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

  Ответить  
 
 автор: час   (13.03.2007 в 17:56)   личное сообщение
 
 

вот

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList