|
|
|
| Посоветуйте по отимизации кода...
Я сравниваю (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
Но может у кого-то есть другое , уже испытанное решение… | |
|
| |
|
|
|
| уже отвечал по поводу коллекции полей в рекордсете
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 ?
Только по порядку следования?
я бы попытался сделал запросом... | |
|
| |
|
|
|
| Ну дык да, запросом конечно
как там... записи без подчиненных | |
|
| |
|
|
|
| тут конечно зависит от кол-ва полей, и их известности... возможно придется строку SQL формировать на лету | |
|
| |
|
|
|
| Ну может и так
но это все равно лучше чем рекордсет лопатить | |
|
| |
|
|
|
| я сначала бегу по второй "челнок" базе и начиная с первой записи беру её уникальный код и нахожу его во первой "основной" базе
rstOsnovna.FindFirst "[Guid] ='" & rstHelnok!guid & "'"
If rstOsnovna.NoMatch = True Then GoTo novajazapis 'новая запись '
If Nz(rstHelnok!guid) = Nz(rstOsnovna!guid) Then '1
|
| |
|
| |
|
|
|
| зачем вообще "челночить" по рекордсету? | |
|
| |
|
|
|
| А вы как предлагаете? | |
|
| |
|
|
|
| если уж рекордсетом, то лучше открывать рекордсет объединяющий две таблицы инерджойном по ключевому полю, а потом пробежаться по нему сравнивая поля одной записи. Будет быстрее чем скакать по второму рекордсету с помощью Find | |
|
| |
|
|
|
| Понял.
Это первое что нужно сделать.
Затем нужно посмотреть нет-ли аписей с кодом которого здесь ещё нет
т.е. новая запись ..
я делаю так
If rstOsnovna.NoMatch = True Then GoTo novajazapis 'новая запись . | |
|
| |
|
|
|
| А я бы сделал запросом на добавление и чохом добавил бы все недостающие... | |
|
| |
|
|
|
| Великолепно..
тогда это будет выглядеть так...
первыйэтап
А я бы сделал запросом на добавление и чохом добавил бы все недостающие
второй этап это
соэдать рекордсет объединяющий две таблицы по 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
|
| |
|
| |
|
|
|
| нет теперь же один рекордсет...
нужно сравнить поля в одинаковыми именами из разных таблиц.
предположим что есть две таблицы в разными именами (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
|
писал прям здесь , возможно есть опечатки... | |
|
| |
|
|
|
| А я думал что ты на обед ушёл...
спасибо , читаю.... | |
|
| |
|
|
|
| Да нет, посто я тут еще и работу работать пытаюсь | |
|
| |
|
|
|
| Я перетащил конструкцию в запрос
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
но тода при добавлении очереддного поля нодо подправлять запрос....
что посоветуете? | |
|
| |
|
|
|
| видимо как то так
F=1
if fld.value <> .Fields(strNameTabl2 & ".поле" & F & ")".value then
F=F+1 | |
|
| |
|
|
|
| Говорю же оЧепятки могут быть
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 & ";")
|
| |
|
| |
|
|
|
| очепятки очепятки
Олег , это я заметил и поправил сразу
strNameTabl1 & ".*, " & strNameTabl2 & ".*
Спасибо | |
|
| |
|
|
|
|
|
порешили мы с тобой ВСЕх | |
|
| |
|
|
|
| Но программу я пока не написал...
так что наверняка опять буду в тупичке...
Я к тебе загляну попрошу указать дорожку...
Надеюсь (как всегда) пошлёшь меня в нужном направлениииии.... | |
|
| |
|
|
|
| Цикл не очень быстро происходит...
можно сказать бесконечно долго
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
|
| |
|
| |
|
|
|
| к сожалению файл отправить не удаётся не шлётся
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 | |
|
| |
|
|
|
| вот | |
|
| |