Удалить дубли документов

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#1
Всем привет, накосячил с агентом. Результат: продублировались все документы в базе, как это исправить, тоесть удалить все дубли?
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#4
Я про это и говорю. Поиском или через представление по дате создания легко найти все дубли.
 

alik86

Well-Known Member
Lotus team
20.11.2008
465
1
#6
Created, Modified, Modified by...
Добавлено: GetModifiedDocuments method, @Created, @Modified и др.
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#7
Сделал вью по всем документам с категоризированой колонкой @text(@Created)+" - "+@DocChildren.
Получилось на некоторые даты-время по несколько десятов документов причем разных форм.
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#8
Даты могут отличаться на секунды/минуты.
Надо брать документы за период.
SELECT (@Created > [Дата - 5мин]) & (@Created < [Дата + 5мин])
 

alik86

Well-Known Member
Lotus team
20.11.2008
465
1
#9
Получилось на некоторые даты-время по несколько десятов документов причем разных форм
Ну так может по несколько десятов документов и было создано. А нужную форму укажите в формуле отбора вида.
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#10
11212.png
Код:
Set dc=dbd.AllDocuments
Call dbd.CreateCopy("",DirPath(0)+dbd.FileName)
Set doc=dc.GetFirstDocument		
While Not doc Is Nothing
Call doc.CopyToDatabase(dbd)
Set doc=dc.GetNextDocument(doc)
Wend
Для каждого документа по 1 копии
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#11
Может как то в цикле все документы сравнивать?
Цикл по всем дкументам текущий сравниваем со следущими, если находится идентичный то удаляем его.
ТОлько вот как сравнивать?

UPD: По размеру?

Код:
Set dc=db.AllDocuments

Set docc=dc.GetFirstDocument
While Not docc Is Nothing
Set docs=dc.GetNextDocument(docc)		
While Not docs Is Nothing
If docc.Size=docs.Size Then
set tmpdoc=dc.GetPreDocument(docs)
Call docs.remove(true)
set docs=tmpdoc
End If
Set docs=dc.GetNextDocument(docs)
Wend
Set docc=dc.GetNextDocument(docc)
Wend
Получится так сделать?
 

alik86

Well-Known Member
Lotus team
20.11.2008
465
1
#12
Что-то я так и не понял, чем не покатил поиск по created, modified?
В принципе у документов-копий created и modified должны совпадать до секунды - можно поплясать от этого.
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#13
Что-то я так и не понял, чем не покатил поиск по created, modified?
В принципе у документов-копий created и modified должны совпадать до секунды - можно поплясать от этого.
Тоесть искать дубли точно также как я написал выше по размеру, только по дате создания и изменения?
 

alik86

Well-Known Member
Lotus team
20.11.2008
465
1
#14
Создайте вид с формулой отбора SELECT ((Form = "Forma") & (@Created = @Modified)), он выдаст вам документы по нужной форме, которые были скопированы программно.
В общем случае при создании документа "ручками" created - это момент создания, а modified - момент сохранения, т.е. "modified - created = время заполнения полей документа". При программном копировании для документа эти моменты совпадают. Как-то так.
P.S. Только не забывайте про "7 раз отмерь - один раз отрежь" - перепроверьте, ибо я выдал лишь своё предположение. :ya_lamo:
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#15
Создайте вид с формулой отбора SELECT ((Form = "Forma") & (@Created = @Modified)), он выдаст вам документы по нужной форме, которые были скопированы программно.
В общем случае при создании документа "ручками" created - это момент создания, а modified - момент сохранения, т.е. "modified - created = время заполнения полей документа". При программном копировании для документа эти моменты совпадают. Как-то так.
P.S. Только не забывайте про "7 раз отмерь - один раз отрежь" - перепроверьте, ибо я выдал лишь своё предположение.
Проверил, не то, всего в бд было около 30000 документов, сейчас около 60000. тоесть ровно в 2 раза больше.
Сделал представление по указанной выше формуле, по этой форме было примерно 1300 доков сейчас по ней 2600, отображается только 20, какие еще есть варианты?


Юзеры скоро загрызут.... :ya_lamo:
 
D

Darker

Гость
#16
Отсортируй представление по общему параметру, и удаляй каждый первый(второй) документ
 
D

Darker

Гость
#18
Код:
lead=true
set doc=view.getfirstdocument
while not doc is nothing
lead=not lead
if lead then doc.ToRemove="1":call doc.save(true,False)
set doc=view.getnextdocument(doc)
wend

set col=db.Search({ToRemove="1"},Nothing,0)
col.RemoveAll(1)
 

alik86

Well-Known Member
Lotus team
20.11.2008
465
1
#19
Зато наверняка усвоите, что НЕЛЬЗЯ экспериментировать на рабочей базе!
Высказывание: Последовательность "эксперимент -> *цензура*..ц -> чтение документации" даже из толковых админов/программеров тяжело выбить.
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#20
Зато наверняка усвоите, что НЕЛЬЗЯ экспериментировать на рабочей базе!
Высказывание: Последовательность "эксперимент -> *цензура*..ц -> чтение документации" даже из толковых админов/программеров тяжело выбить
Полностью согласен, что тяжело выбить:), сколько раз уже зарекался не экспериментировать на раб базе