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

Тема в разделе "Lotus - Программирование", создана пользователем kereyt, 25 июл 2016.

  1. kereyt

    kereyt Member

    Регистрация:
    25 июл 2016
    Сообщения:
    18
    Симпатии:
    1
    Добрый вечер!
    Есть БД с документами. В документах есть определенные поля (План), значения в которые вводятся вручную ежедневно и которые не меняются на протяжении всего месяца. Полей около 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 р. Вопрос срочный, до сих пор сижу на работе, а за окном уже стемнело...
     
    #1 kereyt, 25 июл 2016
    Последнее редактирование: 25 июл 2016
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    @kereyt стиль вашего изложения...
    да и предложение подобной суммы - это больше как глумление
    сформулируйте задачу для себя, с переменными, напишите алгоритм, формально, закодируйте (LS подойдет больше)
    выкладывайте сюда, будем обсуждать...
     
  3. kereyt

    kereyt Member

    Регистрация:
    25 июл 2016
    Сообщения:
    18
    Симпатии:
    1
    сорри, в LS не особо сильно разбираюсь, в том-то и дело...
    никакого глумления не предполагалось(
    только глаза в кучу у меня и жопа в лепешку(

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

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

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    это вижуалвасик, только удобнее ;)
    вы представляет - чего происходит?!
    пытаться получить колонку вьюшки в память, при ограничении в 64к (на самом деле существенно меньше), а потом взять последнее значение...
    это не СКЛ!
    На LS есть коллекции - элементарно взять последнее/первое значение из вьюшки и прописать его в доке на PO (PostOpen Event)
    а уже далее - логику можно и на собаках привязывать (хотя - не вижу смысла)
    вьюшку лучше брать по NotesViewEntryCollection, и у нужного NotesViewEntry брать соответ. Columns(num) значение
    NotesView.AutoUpdate=False, перед получением коллекции и NotesView.Refresh
    все перечисленные сущности гуглябельны (будут примеры из хэлпа)
     
    kereyt нравится это.
  5. kereyt

    kereyt Member

    Регистрация:
    25 июл 2016
    Сообщения:
    18
    Симпатии:
    1
    Postopen, получается, нельзя задать в конкретном поле, а только на весь документ. Но у меня нужно выбрать несколько полей, не все.
    Решил взять такой код и прописать в каждом отдельном поле.
    Но не знаю на что его зацепить, пробую на фокус, выбор и остальные, ругается на непроинициализацию объектной переменной.
    Код (LotusScript):
    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()
     
    #5 kereyt, 26 июл 2016
    Последнее редактирование модератором: 26 июл 2016
  6. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    в PO ,будет меняться инмемори док (Source.Document) и фронту (кот. Source As NotesUIDocument) надо только сказать Refresh
    поля можно менять любые, не нужно казать в каждом отдельном поле - менять кучкой
     
  7. kereyt

    kereyt Member

    Регистрация:
    25 июл 2016
    Сообщения:
    18
    Симпатии:
    1
    а как их можно перечислить?
    они же все сразу будут меняться.
    дайте примерчик, пожалуйста.
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    вопрос не понял... - руками, конечно
    имена их известны Call doc.replaceItemvalue(<field name>, <newvalue>)
     
  9. kereyt

    kereyt Member

    Регистрация:
    25 июл 2016
    Сообщения:
    18
    Симпатии:
    1
    как мне сюда воткнуть последний энтри из столбца представления-то?
     
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
  11. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    почему ты думаешь, чо это будет "вчерашний" док???
    в селекшн формулу вида не стоит делать отбор по дате, это будет АД

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

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

    kereyt Member

    Регистрация:
    25 июл 2016
    Сообщения:
    18
    Симпатии:
    1
    ну у меня такая задача стоит - при создании нового документа в некоторые поля этого документа нужно вставить значения (они постоянные в течение этого месяца) из документа за прошлое число... это я так думал будет легче сделать, выбирая их из представления. в идеале нужно, конечно, вставлять значение этих полей из первого за текущий месяц документа. но это для меня вообще задача трудная.
    может быть есть такой метод выбора созданного ранее документа (в моём случае - документа за первое число текущего месяца), считывание определенных полей и перенос их в текущий?
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    ябы сделал вьюшку с первой (сортированной) колонкой даты
    и использовал для отбора NotesDateTimeRange с "нулевой" нижней границей
    т.о. сразу получим последний энтрис <= <наша дата>
     
  14. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    есть и он мною описан выше, кусок кода, вашего (LS), тоже пригодится
     
  15. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    тогда так и на собаках всё, раз они тебе близки.
    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
    канеш
    PS
    если надо чоб новый месяц всегда начинался с новых значений вводимых вручную, "формула в нужных" полях такая: @If(unid="" | @Text(@Month(@Today))>@DbColumn( "" : "NoCache" ; "" ; "dbcoll" ; 3)[1];"";@GetDocField(unid;@ThisName));
     
    #15 alexas1, 26 июл 2016
    Последнее редактирование: 26 июл 2016
    kereyt нравится это.
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    т.о. человек не решит задачу, а заткнет временно, а потом начнутся "суровые будни"
    схема отсчета для принятия решение поменяется, наколбасят еще полей и вьюшек...
    и понеслись, с костылями, прям паралимпийский комитет, в период подготовки ;)
     
  17. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    ну да, эт мельдоней такой )))))
     
  18. kereyt

    kereyt Member

    Регистрация:
    25 июл 2016
    Сообщения:
    18
    Симпатии:
    1
    на этом этапе ругается: SELECT нельзя использовать в формулах этого типа ''
    "<твой док>" - это же моя главная форма?
     
  19. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    ЭТО ФОРМУЛА ОТБОРА ВО ВЬЮШКЕ
     
  20. kereyt

    kereyt Member

    Регистрация:
    25 июл 2016
    Сообщения:
    18
    Симпатии:
    1
    ну я её в Значение столбца и прописываю, выбрав чекбокс Формула.
    и <твой док> = название моей формы?
    Форма - "ХХХ-сут.сводка", вписываю вместо "<твой док>". И Лотус начинает ругаться, не принимает формулу:
     

    Вложения:

    • month.png
      month.png
      Размер файла:
      22,5 КБ
      Просмотров:
      4
    #20 kereyt, 27 июл 2016
    Последнее редактирование: 27 июл 2016
Загрузка...

Поделиться этой страницей