• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

  • Автор темы Автор темы dimat
  • Дата начала Дата начала

dimat

Well-known member
31.07.2008
508
0
Всем привет, накосячил с агентом. Результат: продублировались все документы в базе, как это исправить, тоесть удалить все дубли?
 
Легко вычислить по автору и дате создания.
 
Я про это и говорю. Поиском или через представление по дате создания легко найти все дубли.
 
Created, Modified, Modified by...
Добавлено: GetModifiedDocuments method, @Created, @Modified и др.
 
Сделал вью по всем документам с категоризированой колонкой @text(@Created)+" - "+@DocChildren.
Получилось на некоторые даты-время по несколько десятов документов причем разных форм.
 
Даты могут отличаться на секунды/минуты.
Надо брать документы за период.
SELECT (@Created > [Дата - 5мин]) & (@Created < [Дата + 5мин])
 
Получилось на некоторые даты-время по несколько десятов документов причем разных форм
Ну так может по несколько десятов документов и было создано. А нужную форму укажите в формуле отбора вида.
 
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 копии
 
Может как то в цикле все документы сравнивать?
Цикл по всем дкументам текущий сравниваем со следущими, если находится идентичный то удаляем его.
ТОлько вот как сравнивать?

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

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


Юзеры скоро загрызут.... :ya_lamo:
 
Отсортируй представление по общему параметру, и удаляй каждый первый(второй) документ
 
Код:
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)
 
Зато наверняка усвоите, что НЕЛЬЗЯ экспериментировать на рабочей базе!
Высказывание: Последовательность "эксперимент -> *цензура*..ц -> чтение документации" даже из толковых админов/программеров тяжело выбить.
 
Зато наверняка усвоите, что НЕЛЬЗЯ экспериментировать на рабочей базе!
Высказывание: Последовательность "эксперимент -> *цензура*..ц -> чтение документации" даже из толковых админов/программеров тяжело выбить
Полностью согласен, что тяжело выбить:), сколько раз уже зарекался не экспериментировать на раб базе
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab