Форум программистов, компьютерный форум, киберфорум
HCL Notes: Программирование
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 18
1

Проверка на копию в БД

05.02.2019, 18:46. Показов 1876. Ответов 7
Метки нет (Все метки)

Создаю БД регистрации заявок на оплату с последующими отметками бухгалтерии о статусе оплаты.
На данный момент не могу сделать проверку новой счет-фактуры на наличие в базе.
т.е. в поле "nomSF" вводится номер счета-фактуры и при сохранении требуется выполнить проверку на сходство номера со всеми введенными ранее.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2019, 18:46
Ответы с готовыми решениями:

Как залить бутлоадер в китайскую копию arduino nano v3.0(CH340) через копию UNO
Пришли 2 контроллера, китацские копии arduino nano 3 и UNO. Обе на CH340. Драйвера встали...

Как создать копию <tr>
Как создать копию &lt;tr&gt; с помощью jQuery при нажатия на + &lt;tr&gt; &lt;td&gt;Выберайте файл:&lt;/td&gt; ...

Создать копию закладки
Доброе время суток. Подскажите пожалуйста как программно создать/удалить закладки со всеми полями...

Создать копию документа
Доброе! нужно из открытого документа иметь возможность создавать новый CopyAllItems не использую,...

7
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 18
06.02.2019, 08:18  [ТС] 2
Ок.
Как в Querysave на LotusScript подключиться к БД?

Как я понял
Source.Document.GetItemValue("nomSF")(0) - берется содержание поля ввода
и через ParentDatabase нужно вытащить количество строк и в массиве проверять их все до наличия совпадений.

Но вот как правильно подключиться не знаю
0
286 / 72 / 36
Регистрация: 02.02.2013
Сообщений: 291
06.02.2019, 13:58 3
Здравствуйте

Для поиска дубликатов обычно используют слудующий алгоритм:

- создают представление, в котором первый отсортированный столбец содержит все номера ( в вашем случае номера счетов факту) в принипе это прдставление больше ничего может и не содержать. Такое представление обычно делают скрытое.
- для проверки вам нужно просто выполнить запрос по этому представлению с использованием getAllDocumentsByKey. Запрос с использованием ключа. В качестве ключа выступает номер счета фактуры. Идея такая:

Visual Basic
1
2
3
4
5
6
set collections = view.getAllDocumentsByKey("Новый Номер счета фактра")
If collections.count = 0 Then
    Print "Номер не используется"   
else
    Print "Номер уже используется"
end if
Вы можете вызывать такую проверку еще до момента сохранения нового документа, чтобы новый документ не попал в представление иначе он будет находить свой же номер (сам себя). Например в событии которое вы написали Querysave - если есть двойтик просто блокируте сохранение и документ остается несохраненных пока номер пользователь не исправит.

Относительно вашего примера

Visual Basic
1
Source.Document.GetItemValue("nomSF")(0)
Технически так можно сделать - но так писать это немножко дурной тон.
Лучше так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
set item = Document.getfirstItem("nomSF")
if item is nothing then
    print "такого поля нет в документе"
else
    REM Получение значение поля
    key = item.Text
    Dim Session As New NotesSession
    dim view as  notesView
    dim db as noteDatabase
    Set db = Session.CurrentDatase
    Set View = db.getView("Название представления для поиска номеров")
    if view is nothing Then
        Такого представления нет
        ... останов обработки
    end if 
    dim collections as notesDocuentCollection
    set collections = view.getAllDocumentsByKey(key)
    If collections.count = 0 Then
        Print "Номер не используется"   
    else
        Print "Номер уже используется"
    end if
enf if

[/VB]

Это Код просто идею демонтртует. Там много ошибок конечно.

Относительно Подключение к базе данных - я не очень понял что вы имели в виду. Зачем вам к ней подключаться если вы в ней уже находитесь ?
Visual Basic
1
 Session.CurrentDatabase
- это и есть текущая база. Если хотите вы можете "выйти" на текущую базу так же через любой объект начиная с поля в документе и затем к базе - как вы и написали ParentDatabase - вернет объект с базой данных, в которой находится поле/документ.
1
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 18
06.02.2019, 15:38  [ТС] 4
Спасибо.
Буду пробовать.

Добавлено через 1 час 4 минуты
Код подправил.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
If Isnewdoc Then
        Set item = Document.getfirstItem("nomSF")
        If item Is Nothing Then
            Print "такого поля нет в документе"
            continue = False
        Else
    REM Получение значение поля
            key = item.Text
            Dim Session As New NotesSession
            Dim view As  NotesView
            Dim db As NotesDatabase
            Set db = Session.CurrentDatabase
            Set View = db.getView("nomSF")
            If view Is Nothing Then
                Print "Такого представления нет"
                continue = False
            End If 
            Dim collections As NotesDocumentCollection
            Set collections = view.getAllDocumentsByKey(key)
            If collections.count = 0 Then
                Print "Номер не используется"   
            Else
                Print "Номер уже используется"
                continue = False
            End If
        End If
    End If
Закинул все в Querysave
По нему ошибок Designer не выдает.

При проверке в момент сохранения ошибок так же не выдает.

Документ сохраняется вне зависимости есть сходство в "nomSF" или нет.
0
286 / 72 / 36
Регистрация: 02.02.2013
Сообщений: 291
07.02.2019, 07:06 5
Здравствуйте

У вас представление так же называется nomSF так же как и поле в документе ? Так можно но на всякий случай спросил, обычно по разному называют, но это кому как нравиться.

В событии Querysave нету параметра Isnewdoc повидимот поэтому у вас сразу выходит из основной ветки. У вас появлялось сообщение "Print "Номер уже используется"" - хоть раз. т.е. у вас алгоритм заходит в эту ветку условия ? Или у вас код не сначала и это Source.IsNewDoc ?

Могу порекомендовать вам хороший прием для отладки lotusscript в режиме реального времени чтобы увидеть как код выполняется.

Перед нажатием на кнопку включить отладку через меню Tools-Debug LotusScript и после этого нажимайте на кнопку. Тогда у вас откроется окно отладчика и вы сможете построчно нажимая кнопку Step Into, пройти по всем операторам и выполнить их и увидеть какие значения у объектов и переменных внизу окна на закладке variable. Для отладки это всегда помогает найти причину неработающих скриптов. Скриншот прикладываю.
0
Миниатюры
Проверка на копию в БД  
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 18
07.02.2019, 08:42  [ТС] 6
С представлением вчера разобрался сразу... просто не стал закидывать.

На данный момент даже код
Visual Basic
1
2
3
4
5
6
7
Set item = Document.getfirstItem("nomSF")
    If item Is Nothing Then
        Print "такого поля нет в документе"
        continue = False
    Else
        Print "такое поле есть в документе"
    End If
Выдает Variant does not contain an object
0
286 / 72 / 36
Регистрация: 02.02.2013
Сообщений: 291
07.02.2019, 09:04 7
Это значит объект не получен, в этом куске это может быть только Document если объекта нет значит не имеет смылс обращаться к его методу getfirstItem() Вообще проверка для примера я привел только для item, но строго говоря такую проверку лучше делать для всех обектов прежде чем начинать с ними работать т.е.


Visual Basic
1
2
3
4
5
6
If Document Is Nothing Then
        Print "такого нет документа"
    Else
       Set item = Document.getfirstItem("nomSF")
       ...
End If
Вообще попробуйте использовать отладчик через меню Tools->Debug LotusScript , и после скрипт запустить, сразу становет ясно где ошибка.
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 18
07.02.2019, 09:50  [ТС] 8
Цитата Сообщение от Alex Ivanov Посмотреть сообщение
это может быть только Document если объекта нет значит не имеет смылс обращаться к его методу
Проверил через отладчик.
На данной части кода выдает "Type mismatch"

Добавлено через 3 минуты
Самое главное, что сейчас пришло в голову...
Номера счетов-фактур у разных компаний могут совпасть.
В связи с этим нужно не только поле "nomSF" сверять, но и "sumDOC"
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2019, 09:50

Создать копию файла
На диске находиться файл result.txt. Написать программу создающую копию этого файла с именем...

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

Сделать копию класса
Есть Class_test a и есть Class_test b Как сделать копию a и положить ее в b, НО чтобы я дальше...

Отследить копию программы
Знаю как сделать, чтобы не запускалась копия программы, используя mutex. Но нужно отследить запуск...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.