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

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

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

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

Копирование значений полей одного документа в другой

K

kereyt

Добрый вечер!
Есть БД с документами. В документах есть определенные поля (План), значения в которые вводятся вручную ежедневно и которые не меняются на протяжении всего месяца. Полей около 15. Есть задача автоматизации этого процесса - переноса значений полей (План) с документа первого числа месяца на все последующие дни.
Сначала вопрос пытались решить формулой:

k:=@Subset(@DbColumn( "" : "NoCache" ; "" ; "xxx1" ; 3); -1);
@If(k="";@Return(xx);"");
k
, где хх - имя поля, xxx1 - представление, в 3-ем столбце которого и собираются значения поля xx.
Тут просто берётся последнее значение.

Но проблема в том, что прописав подобный код во все требуемые поля и накатив шаблон на БД, я возможно изменю подобные поля за все время ведения БД, созданные ранее.

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

Буду признателен тому, кто поможет и примет в качестве скромного вознаграждения 100-200 рубликов на qiwi...

Если это слишком вертячно, то хотя бы подскажите как вышеуказанный код заставить работать только начиная с 25.07.2016, чтобы не задеть ранее созданные документы в БД.

P.S.
Вообще в идеале нужно, чтобы пользователь открывал базу, нажимал кнопку "Создать". После этого нажимал бы на кнопку "Копирование значений плана". Кнопку невидимую для печати и видимую только редактором. Код под кнопкой проверял бы дату, чтобы она была выше 25.07.2016, потом смотрел месяц создания документа и копировал значения 14-15 полей с документа, созданного первого числа этого месяца и года, в одноименные поля создаваемого документа.

P.S.P.S. Согласен, 200 рубликов - это не серьезная сумма. Предлагаю большое человеческое спасибо и 300 р. Вопрос срочный, до сих пор сижу на работе, а за окном уже стемнело...
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
@kereyt стиль вашего изложения...
да и предложение подобной суммы - это больше как глумление
сформулируйте задачу для себя, с переменными, напишите алгоритм, формально, закодируйте (LS подойдет больше)
выкладывайте сюда, будем обсуждать...
 
K

kereyt

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

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

k:=@Subset(@DbColumn( "" : "NoCache" ; "" ; "xxx1" ; 3); -1);
@If(k="";@Return(xx);"");
k

куда тут вставить что-то типа такого:
@If(Date)>='25.07.2016' ?

т.е. логика тут была такая - при создании документа в поле с кодом вставлялось последнее значение столбца номер 3 представления "ххх1". тупо бралось бы вчерашнее значение.
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
сорри, в LS не особо сильно разбираюсь
это вижуалвасик, только удобнее ;)
k:=@Subset(@DbColumn( "" : "NoCache" ; "" ; "xxx1" ; 3); -1);
вы представляет - чего происходит?!
пытаться получить колонку вьюшки в память, при ограничении в 64к (на самом деле существенно меньше), а потом взять последнее значение...
это не СКЛ!
На LS есть коллекции - элементарно взять последнее/первое значение из вьюшки и прописать его в доке на PO (PostOpen Event)
а уже далее - логику можно и на собаках привязывать (хотя - не вижу смысла)
вьюшку лучше брать по NotesViewEntryCollection, и у нужного NotesViewEntry брать соответ. Columns(num) значение
NotesView.AutoUpdate=False, перед получением коллекции и NotesView.Refresh
все перечисленные сущности гуглябельны (будут примеры из хэлпа)
 
  • Нравится
Реакции: kereyt
K

kereyt

прописать его в доке на PO (PostOpen Event)
Postopen, получается, нельзя задать в конкретном поле, а только на весь документ. Но у меня нужно выбрать несколько полей, не все.
Решил взять такой код и прописать в каждом отдельном поле.
Но не знаю на что его зацепить, пробую на фокус, выбор и остальные, ругается на непроинициализацию объектной переменной.
Код:
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim column As NotesViewColumn
Dim entry As NotesViewEntry
Dim vc As NotesViewEntryCollection
Set db = session.CurrentDatabase
Set view = db.GetView( "gmg1" )
Set column = view.Columns( 2 )
Set entry = vc.GetLastEntry()
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
Postopen, получается, нельзя задать в конкретном поле, а только на весь документ. Но у меня нужно выбрать несколько полей, не все.
Решил взять такой код и прописать в каждом отдельном поле.
Но не знаю на что его зацепить, пробую на фокус, выбор и остальные, ругается на непроинициализацию объектной переменной.
Код:
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim column As NotesViewColumn
Dim entry As NotesViewEntry
Dim vc As NotesViewEntryCollection
Set db = session.CurrentDatabase
Set view = db.GetView( "gmg1" )
Set column = view.Columns( 2 )
Set entry = vc.GetLastEntry()
в PO ,будет меняться инмемори док (Source.Document) и фронту (кот. Source As NotesUIDocument) надо только сказать Refresh
поля можно менять любые, не нужно казать в каждом отдельном поле - менять кучкой
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
36
воткнуть последний энтри из столбца представления-то?
почему ты думаешь, чо это будет "вчерашний" док???
в селекшн формулу вида не стоит делать отбор по дате, это будет АД

плюс, не забыть чо doc.replaceItemvalue(... надо тока для нового дока!

++ в общем, надо бежать по вьюхе (у тя, снизу вверх), сравнивать created day доков с today и как только не равно, брать значения из этого дока и писать в твой (если только он новый) и выходить из цикла
 
Последнее редактирование:
K

kereyt

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
++ в общем, надо бежать по вьюхе
ябы сделал вьюшку с первой (сортированной) колонкой даты
и использовал для отбора NotesDateTimeRange с "нулевой" нижней границей
т.о. сразу получим последний энтрис <= <наша дата>
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
может быть есть такой метод выбора созданного ранее документа (в моём случае - документа за первое число текущего месяца), считывание определенных полей и перенос их в текущий?
есть и он мною описан выше, кусок кода, вашего (LS), тоже пригодится
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
36
они постоянные в течение этого месяца
тогда так и на собаках всё, раз они тебе близки.
1 делаем служебную вьюшку "dbcoll" с твоими доками: 1 колонка - @created и Sort: Descenting, вторая - @Text(@DocumentUniqueID), третья - Мonth
SELECT Form = "<твой док>" & Month != ""
2 в доке
- вычисляемое при создании поле "Month" (скрытое) с формулой:
lastval := @DbColumn( "" : "NoCache" ; "" ; "dbcoll" ; 3)[1];
month := @Month(@Today);
@If(@Text(lastval) != @Text(month); month;"")
т.о. в эту въюху попадут ток первые доки каждого месяца
3 в доке
- вычисляемое при создании поле "Unid" (скрытое) с формулой: @DbColumn( "" : "NoCache" ; "" ; "dbcoll" ; 2)[1]
это будет юнид первого дока последнего месяца
4 формула в нужных (редактируемых) полях: @If(Unid!="";@GetDocField(unid;@ThisName);"")
поле Unid должно быть ДО этих полей
----------------------------
или LS в PO c
и использовал для отбора NotesDateTimeRange с "нулевой" нижней границей
канеш
PS
если надо чоб новый месяц всегда начинался с новых значений вводимых вручную, "формула в нужных" полях такая: @If(unid="" | @Text(@Month(@Today))>@DbColumn( "" : "NoCache" ; "" ; "dbcoll" ; 3)[1];"";@GetDocField(unid;@ThisName));
 
Последнее редактирование:
  • Нравится
Реакции: kereyt

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
тогда так и на собаках всё, раз они тебе близки.
т.о. человек не решит задачу, а заткнет временно, а потом начнутся "суровые будни"
схема отсчета для принятия решение поменяется, наколбасят еще полей и вьюшек...
и понеслись, с костылями, прям паралимпийский комитет, в период подготовки ;)
 
K

kereyt

ЭТО ФОРМУЛА ОТБОРА ВО ВЬЮШКЕ
ну я её в Значение столбца и прописываю, выбрав чекбокс Формула.
и <твой док> = название моей формы?
Форма - "ХХХ-сут.сводка", вписываю вместо "<твой док>". И Лотус начинает ругаться, не принимает формулу:
SELECT нельзя использовать в формулах этого типа ''
 

Вложения

  • month.png
    month.png
    9,3 КБ · Просмотры: 239
Последнее редактирование модератором:
Мы в соцсетях:

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