• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Помогите найти ошибку

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

kilcher

Всем доброго дня!
Есть база,в которой отображается список людей(определенный отдел)из справочника организации.База представляет собой что то вроде To do. Т.е. загрузка сотрудников. Представления календарные.
Мне требуется агент,который будет создавать документики по людям,которых еще нет сегодня в загрузке. И так,например, на месяц вперед.
Создала настроечный документ(Profile),в котором задаются даты для заполнения.
вобщем приведу часть моего измученного кода(извиняюсь если он не совсем причесан)



Dim AltFullName As Variant,FullName1 As Variant
Dim keys( 1 To 2 ) As String
Dim gmt As Variant
Dim dat1 As NotesDateTime
Dim dat2 As NotesDateTime
Dim difference As Long
selection = {Form = "Stru" & kDept = "02" & kServ="2" & AltFullName!=""& work="Проверки"}'люди которые берутся из общего справочника

Set coll = db1.Search(selection, Nothing, 0)
Set doc = coll.GetFirstDocument

While Not doc Is Nothing

AltFullName=doc.GetItemValue( "AltFullName" )

Set coll1 = db.Search({Form = "Profile"}, Nothing, 0)'берем данные из настроечного файла
Set doc1 = coll1.GetFirstDocument

Set dat1 = New NotesDateTime( doc1.start(0) )
Set dat2 = New NotesDateTime( doc1.end(0) )
difference = dat1.TimeDifference( dat2 )

If difference <0 Then 'создаем документы на все дни
Do While dat1.TimeDifference( dat2 ) <= 0
gmt = dat1.LSGMTTime
keys(1) =gmt 'дата загрузки
keys(2) =doc.AltFullName(0)' имя сотрудника
Set view = db.GetView("Загрузка1" )
Set pdoc = view.GetDocumentByKey( keys )' ищем есть ли данный сотрудник в загрузке на этот день
If Not ( pdoc Is Nothing ) Then' если нет данного сотрудник,то создаем
Msgbox("Создаем")
Set docB = New NotesDocument( db )
Call docB.AppendItemValue( "Form", "LoadingUser" )
Call docB.AppendItemValue( "date_loading", gmt)
Call docB.AppendItemValue( "member", doc.AltFullName(0))
Call docB.AppendItemValue( "Status", "" )
Call dat1.AdjustDay( 1 )
Call docB.Save(True,True,True)
End If
Loop
End If
Set doc = coll.GetNextDocument(doc)
Wend
 
A

Akupaka

а шо не так?..

не знаю, правильно или нет... лениво думать...
но

Код:
Set pdoc = view.GetDocumentByKey( keys )' ищем есть ли данный сотрудник в загрузке на этот день
If Not ( pdoc Is Nothing ) Then' если нет данного сотрудник,то создаем

т.е. если документ есть, значит сотрудника нет?.. о.О
 
K

kilcher

Если документа нет (с данными параметрами,т.е. с нужной датой загрузки и фамилией сотрудника),то его надо создать. Если пишу просто If pdoc Is Nothing Then,то создает документы по всем сотрудникам,даже если они уже есть.
Получается задвоение,т.е. сотрудник вроде как занят и не занят :(
 
A

Akupaka

ниче не понял... а если if Not(...) then то как надо работает? )

Если документа нет (с данными параметрами,т.е. с нужной датой загрузки и фамилией сотрудника),то его надо создать.
тогда надо проверять отсутствие документа If is nothing then
попробуй еще view.GetDocumentByKey( keys, True )
и дебагером пройдись, может у тебя keys некорректный?..

зы: в чем проблема ты так и не написала :(

Получается задвоение,т.е. сотрудник вроде как занят и не занят
вот тут не понял... если документа нет, то какое задвоение?..
 
K

kilcher

Вобщем он не выполняет условие отбора Set pdoc = view.GetDocumentByKey( keys,True ) :(
Если я беру два параметра для поиска, ведь обе колонки во вью должны быть категоризированы? Может в этом проблема.
Т.е. в моем случае первая колонка-дата,вторая-сотрудник
 
A

Akupaka

они должны быть сортированы (!), а категоризированные - сортированные...
иногда с категориями глюкавит (зыбыл только чего и как избавиться), если есть возможность, то вид лучше не категоризировать.
1-я колонка у тебя дата или текст? тоже может создавать проблемы, если настроено одно, а ищется другое
 
K

kilcher

1-я колонка дата
gmt = dat1.LSGMTTime
keys(1) =gmt
2-я колонка текст(сотрудник)
keys(2) =doc.AltFullName(0)

Вот по этим двум параметрам и должен искать документ. А он фигушки,не находит.
Обе категоризованы
 
A

Akupaka

давай сделаем тест.
что вернет поиск по
view.GetAllDocumentsByKey(dat1)
view.GetAllDocumentsByKey(dat1.LSGMTTime)
view.GetAllDocumentsByKey(cstr(dat1.LSGMTTime))

потом еще категории попробуй убрать и сравни
 
H

hosm

иногда с категориями глюкавит (зыбыл только чего и как избавиться), если есть возможность, то вид лучше не категоризировать.
глюк поиска в категоризированной вьюшке в том, что учитываются документы только 1-й подкатегории.
Лучше искать просто по сортированным, имхо.
 
K

Kee_Keekkenen

это не лучше, это правильно! :blink:
категоризированные вьюхи - это УИ вьюхи, поиск по таким лучше не делать. имхо ;)

а если в сортированной вьюхе есть возможность сортировать по убыванию/возрастанию, то ее тоже лучше не использовать для поиска
 
K

kilcher

давай сделаем тест.
что вернет поиск по
view.GetAllDocumentsByKey(dat1)
view.GetAllDocumentsByKey(dat1.LSGMTTime)
view.GetAllDocumentsByKey(cstr(dat1.LSGMTTime))

потом еще категории попробуй убрать и сравни


все три варианта выдают один результат. Т.е. опять заносят всех сотрудников,не исключая тех что уже есть. Сделала колонки некатегоризованными,а просто сортированными. Ничего не изменилось :blink:
 
A

Akupaka

все три варианта выдают один результат. Т.е. опять заносят всех сотрудников,не исключая тех что уже есть
ну, вообще-то я хотел, чтобы ты проверила, что именно возвращает указанный мною код, а не результат выполнения твоего кода :)
попробуй еще раз, отдельным агентом только поиск выполнить по конкретным данным, которые точно есть в виде!


но, в любом случае, мне кажется, что у тебя некорректно настроен вид для поиска.
попробуй вместо типа столбца даты указать ему, что он текст.
потом, отформатируй его определенным образом, например, @Text(@Year(DateFiled)) + "~" + @Text(@Month(DateFiled)) + "~" + @Text(@Day(DateFiled)).
и выполни снова поиск

а если в сортированной вьюхе есть возможность сортировать по убыванию/возрастанию, то ее тоже лучше не использовать для поиска
хм... никогда не пытался подобное проверять, возможно, ты прав...
 
K

kilcher

Проэксперементировала я с использованием dat1.
В случае с view.GetAllDocumentsByKey(cstr(dat1.LSGMTTime)), не находит ни одного документа.
Остальные варианты находят все документы по указанной дате.
А вот когда добавляю поиск по имени сотрудника,ничего.
Видимо по двум параметрам поиск неправильный :)
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Ключи неправильно типа.
Код:
Dim keys( 1 To 2 ) As String
Замени на Variant.
 
D

Dimly

Ключи неправильно типа.
Код:
Dim keys( 1 To 2 ) As String
Замени на Variant.

Или массив ключа на вариант, при этом первый параметр прям датой пихать,
или все поисковые колонки вьюшки в текст преобразовать.

Главное чтобы типы совпадали переменных ключа составного и колонок.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
не по теме, но рядом
мобуть сгодица :) (для себя писал):
Код:
'вспомогательная ф-ция для преобразования типа
'для употребления с ф-циями Array...
Function ConvertToStringArray(xVar As Variant) As Variant
'преобразование в массив уникальных значений
Select Case Typename(xVar)
Case {STRING}, {VARIANT}:
ConvertToStringArray=Arrayunique(Fulltrim(Split(Cstr(xVar),"")))
Case {STRING( )}, {VARIANT( )}:
ConvertToStringArray=xVar
Case Else
Error TYPEMISMATCH, CS_TYPEMISMATCH & ":" & Typename(xVar)
End Select
End Function
 
K

kilcher

Ну прям беда! Вот вроде начал работать,но только если я задаю первый день из списка для проверки. Если задаю в цикле-фигушки. Видать неверно цикл завершаю?
 
K

kilcher

Ура!!! Получилось!!! Всем спасибо огромное! :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!