| |
|
|
| |
to: час
(13.03.2007 в 17:55)
|
| | вот  | |
| |
| |
| |
|
|
| |
to: час
(13.03.2007 в 17:53)
|
| | к сожалению файл отправить не удаётся не шлётся
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 | |
| |
| |
| |
|
|
| |
to: час
(13.03.2007 в 16:44)
|
| | Цикл не очень быстро происходит...
можно сказать бесконечно долго
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
|
| |
| |
| |
| |
|
|
| |
to: час
(13.03.2007 в 16:37)
|
| | Но программу я пока не написал...
так что наверняка опять буду в тупичке...
Я к тебе загляну попрошу указать дорожку...
Надеюсь (как всегда) пошлёшь меня в нужном направлениииии....  | |
| |
| |
| |
|
|
| |
to: osmor
(13.03.2007 в 16:36)
|
| |
порешили мы с тобой ВСЕх
| |
| |
| |
| |
|
|
| |
to: час
(13.03.2007 в 16:33)
|
| | т.е. все порешалось? | |
| |
| |
| |
|
|
| |
to: osmor
(13.03.2007 в 16:29)
|
| | очепятки очепятки
Олег , это я заметил и поправил сразу
strNameTabl1 & ".*, " & strNameTabl2 & ".*
Спасибо  | |
| |
| |
| |
|
|
| |
to: час
(13.03.2007 в 16:22)
|
| | Говорю же оЧепятки могут быть
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 & ";")
|
| |
| |
| |
| |
|
|
| |
to: час
(13.03.2007 в 16:18)
|
| | видимо как то так
F=1
if fld.value <> .Fields(strNameTabl2 & ".поле" & F & ")".value then
F=F+1 | |
| |
| |
| |
|
|
| |
to: osmor
(13.03.2007 в 12:54)
|
| | Я перетащил конструкцию в запрос
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
но тода при добавлении очереддного поля нодо подправлять запрос....
что посоветуете? | |
| |
| |
| |
|
|
| |
to: час
(13.03.2007 в 12:45)
|
| | Да нет, посто я тут еще и работу работать пытаюсь  | |
| |
| |
| |
|
|
| |
to: osmor
(13.03.2007 в 12:41)
|
| | А я думал что ты на обед ушёл...
спасибо , читаю....  | |
| |
| |
| |
|
|
| |
to: час
(13.03.2007 в 12:16)
|
| | нет теперь же один рекордсет...
нужно сравнить поля в одинаковыми именами из разных таблиц.
предположим что есть две таблицы в разными именами (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
|
писал прям здесь , возможно есть опечатки... | |
| |
| |
| |
|
|
| |
to: osmor
(13.03.2007 в 12:12)
|
| | Великолепно..
тогда это будет выглядеть так...
первыйэтап
А я бы сделал запросом на добавление и чохом добавил бы все недостающие
второй этап это
соэдать рекордсет объединяющий две таблицы по 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
|
| |
| |
| |
| |
|
|
| |
to: час
(13.03.2007 в 12:08)
|
| | А я бы сделал запросом на добавление и чохом добавил бы все недостающие... | |
| |
| |
| |
|
|
| |
to: osmor
(13.03.2007 в 12:04)
|
| | Понял.
Это первое что нужно сделать.
Затем нужно посмотреть нет-ли аписей с кодом которого здесь ещё нет
т.е. новая запись ..
я делаю так
If rstOsnovna.NoMatch = True Then GoTo novajazapis 'новая запись . | |
| |
| |
| |
|
|
| |
to: час
(13.03.2007 в 11:50)
|
| | если уж рекордсетом, то лучше открывать рекордсет объединяющий две таблицы инерджойном по ключевому полю, а потом пробежаться по нему сравнивая поля одной записи. Будет быстрее чем скакать по второму рекордсету с помощью Find | |
| |
| |
| |
|
|
| |
to: Explorer
(13.03.2007 в 11:56)
|
| | А вы как предлагаете?  | |
| |
| |
| |
|
|
| |
to: час
(13.03.2007 в 11:50)
|
| | зачем вообще "челночить" по рекордсету? | |
| |
| |
| |
|
|
| |
to: osmor
(13.03.2007 в 09:44)
|
| | я сначала бегу по второй "челнок" базе и начиная с первой записи беру её уникальный код и нахожу его во первой "основной" базе
rstOsnovna.FindFirst "[Guid] ='" & rstHelnok!guid & "'"
If rstOsnovna.NoMatch = True Then GoTo novajazapis 'новая запись '
If Nz(rstHelnok!guid) = Nz(rstOsnovna!guid) Then '1
|
| |
| |
| |
| |
|
|
| |
to: osmor
(13.03.2007 в 10:13)
|
| | Ну может и так
но это все равно лучше чем рекордсет лопатить | |
| |
| |
| |
|
|
| |
to: KrukVN
(13.03.2007 в 10:10)
|
| | тут конечно зависит от кол-ва полей, и их известности... возможно придется строку SQL формировать на лету | |
| |
| |
| |
|
|
| |
to: osmor
(13.03.2007 в 09:44)
|
| | Ну дык да, запросом конечно
как там... записи без подчиненных | |
| |
| |
| |
|
|
| |
to: час
(13.03.2007 в 09:21)
|
| | уже отвечал по поводу коллекции полей в рекордсете
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 ?
Только по порядку следования?
я бы попытался сделал запросом... | |
| |
| |
| |
|
|
| | Посоветуйте по отимизации кода...
Я сравниваю (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
Но может у кого-то есть другое , уже испытанное решение… | |
| |
| |