Пишу базу

  • Автор темы Автор темы phantom76
  • Дата начала Дата начала
вот теперь ему будет понятнее :) а то написал про какие-то варианты 7... ;)
а то понятно, что будет некорректно... хотя, кто знает, что ему нужно было ;)
 
Код:
Set notesDateTime = notesItem.DateTimeValue

->

Set dateTime2 = doc.GetFirstItem("Rep_date").DateTimeValue

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

вообще работает мой вариант (If dateTime3.DateOnly <= dateTime2.DateOnly Then..), причем выдает именно число.месяц.год
этот пример я взял из книги Lotus Developer's Toolbox (Марк Эллиот), он приводился в качестве метода сравнения дат
в описании сказано, что выдает the date part of a date-time, in the local time zone, вроде то что нужно..
 
вообще работает мой вариант (If dateTime3.DateOnly <= dateTime2.DateOnly Then..), причем выдает именно число.месяц.год
этот пример я взял из книги Lotus Developer's Toolbox (Марк Эллиот), он приводился в качестве метода сравнения дат
Работает? Попробуй сравнить даты 21.08.2008 и 22.08.2007.
 
опс, сори, я был не внимателен... попутал с JS, видать...
хм... DateOnly возвращает строку, зависящую от локальных настроек... будет ли такая конструкция корректна по отношению к датам? ведь реально происходит сравнение не дат, а строк... вполне вероятно, что строка 01.02.2006 окажется больше строки 01.01.2008, т.к. сравнение строк происходит позначно, хотя дата 01.01.2008 будет больше 01.02.2006...
 
да увидел, что некорректно работает... как же тогда правильно сравнивать даты? так как показывали выше?
исходя из этого и выборка документов из базы будет работать в моем случае не правильно:

[codebox]Set dateTime1 = New NotesDateTime("Today")
Call dateTime1.AdjustDay(-31)
searchFormula$ = {Form = "NewRep"}
Set dc = db.Search(searchFormula$, dateTime1,0)[/codebox]

должен быть агент , принцип работы такой..
ищет документы за последний месяц и далее в этих документах смотрит в поле (rep_data) дату, если текущая дата лежит в интервале: "ep_data"-5 < "Today" < "rep_data" , то нарпавить уведомление адресатам..
 
а Set dateTime2 = New NotesDateTime(doc.GetFirstItem("Rep_date").text) в каком формате лучше оставлять?
дальше dateTime2 сравниваю с dateTime3 которая равна Set dateTime3 = New NotesDateTime("Today")

а так не пробовали ?
Код:
Set dateTime2 = New NotesDateTime(format (doc.Getitemvalue("Rep_date")(0),"dd.mm.yyyy") )
Set dateTime3 = New NotesDateTime(format (Today,"dd.mm.yyyy"))

if dateTime3.timedifference(dateTime2) > 0 then
' значение даты в Rep_date ранее чем сегодня
end if
 
а можете формулы для сравнения дат, не на лотус скрипте, а именно для SelectionFormula, примерчик привести?

View.SelectionFormula={SELECT (Form="НазваниеФормы")&(@Date(ДатаВПолеФормы1)=@Date("}+ДатаВОткрытойФорме+{"))}

такая не работает...
 
а @Date что делает? в хэлпе написано!
@IsTime( value ) + @TextToTime( string )
 
View.SelectionFormula={SELECT (Form="НазваниеФормы")
&
(@TextToTime(@Text(ДатаВПолеФормы1))=@TextToTime(@Text("}+ДатаВОткрытойФорме+{"))}

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

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

[codebox]Set doc = dc.GetFirstDocument
Print "отобрано документов " & dc.Count
While Not (doc Is Nothing)
Set dateTime2 = New NotesDateTime(Format (doc.Getitemvalue("Rep_date")(0),"dd.mm.yyyy") )
Print "отсечка: " & dateTime2.timedifference(dateTime3) & " документ от " & dateTime2.DateOnly
If dateTime2.timedifference(dateTime3) > 0 And dateTime2.timedifference(dateTime3) < 604800 Then
Print dateTime3.DateOnly +": отправка напоминаний на отчет от " + dateTime2.DateOnly

End If

Set doc = dc.GetNextDocument(doc)
Wend[/codebox]
 
причем тут открытый док?.. во-первых, если ты таким образом создаешь вид, то кто тебе мешает сделать поля открытого дока обязательными?! и проверять их до заполнения формулы вида...
во-вторых, формула отбора твоя действует на документы, которые отбираются в вид, и именно для этих доков нужно быть уверенному, что у них заполнено корректно поле с датой...

распишу подробнее:

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

или я что-то не так понимаю и можно делать принципиально другим способом?
 
тогда надо преобразование выполнять только в том месте где данные берутся из открытой формы:

View.SelectionFormula={SELECT (Form="НазваниеФормы") &
(@Date(ДатаВПолеФормы1))=@Date(@TextToTime("} + Текстовое выражение.ДатаВОткрытойФорме + {"))}

либо

(@Date(ДатаВПолеФормы1))=@Date(} + Текстовое выражение.ДатаВОткрытойФорме.ЧислоГода + {; } + Текстовое выражение.ДатаВОткрытойФорме.ЧислоМесяца + {; } + Текстовое выражение.ДатаВОткрытойФорме.ЧислоДня + {))}
 
из агента пытаюсь вызвать функцию или процедуру для выполнения рассылки, соответственно задекларировал функцию :
Function Mailer (Adreses As String, document As NotesDocument) As String - где Adreses - адрес на который отправляется письмо , document - документ являющийся поводом для рассылки..
из агента вызываю функцию:
S$ = mailer (doc2.GetItemValue("Remind_1")(0). ,doc) , где - doc2.GetItemValue("Remind_1")(0). - пытаюсь получить адрес ид поля типо "Name"из конфигурационного документа, ; doc - документ основание для рассылки.. S$ - строка статуса рассылки..

S$ = mailer (doc2.GetItemValue("Remind_1")(0). ,doc) - ругается на эту строку "Variable not set" , где я ошибся?

да еще момент, как правильно создавать конфигурационные документы в базе, по умолчания я создал для него форму и по ней создал всего 1 документ... а как это делается цивилизованным способом? :)

кажеться понял функции тоже через call вызываются..
 
кажеться понял функции тоже через call вызываются..
не обязательно, но можно


S$ = mailer (doc2.GetItemValue("Remind_1")(0). ,doc)
вроде точка лишняя doc2.GetItemValue("Remind_1")(0)!!.!!

да еще момент, как правильно создавать конфигурационные документы в базе, по умолчания я создал для него форму и по ней создал всего 1 документ... а как это делается цивилизованным способом?
NotesDataBAse . GEtProfileDocument
 
Мы в соцсетях:

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