• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Проверка поля с типом Number

  • Автор темы oxystile
  • Дата начала
O

oxystile

где надо че дописать, чтобы при попытке поставить в поле типа "Number" не число программа не давала сохранить, пока пользователь поле не исправит

заранее спасибо!
 
M

morpheus

можно попробовать Input Validation c формулой @textToNumber ( обработать ошибку ), НО! @TextToNumber вернёт 123 если в поле написать "123йцу" , и вернёт ошибку если "йцу123" ... так что можно добавить исчо Input Translation @TextToNumber( @thisValue)
 
U

ukr

Я тебе советую на сохранение документа повесить код на проверку этого поля, является ли оно числовым или нет.

Код:
IsNumeric(doc.[твое поле])

Либо отлавливать ошибку при сохранении, её номер 4412
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Если не использовать Input Validation, то проверка будет автоматическая при сохранении.
можно попробовать Input Validation c формулой @textToNumber ( обработать ошибку ), НО! @TextToNumber вернёт 123 если в поле написать "123йцу" , и вернёт ошибку если "йцу123" ... так что можно добавить исчо Input Translation @TextToNumber( @thisValue)
Если использовать @ToNumber, то ошибку вернет в любом случае.
Надо в InputValidation прописать @If(@IsDocBeingSaved & @IsError(@ToNumber(@ThisValue)); @Failure("Ошибка"); @Success)
 
S

Sandr

проверка на кверисейве - самый действеннный способ...
 
O

Omh

Sandr
+1

И главное, в одном месте.
А то потом (след. программеру) придётся по всей форме рыскать, где это validation плюётся.
 
O

oxystile

Medevic
@If(@IsDocBeingSaved & @IsError(@ToNumber(@ThisValue)); @Failure("Ошибка"); @Success)
-я ввожу в поле букви, нажимаю сохранить получаю сообщение "Ошибка" , закрываю
открываю снова этот док и в поле запись "ERROR: Cannot convert text to a number"
т.е. что-то не так..ошибку выдает, но значение как бы сохраняет

ukr
если на кверисейф IsNumeric(doc.[твое поле]) точнее я делаю проверку
If Not(Isnumeric(doc.trud(0))) Then и на этой строке у меня возвращается error 184 "variant doesn't contain a container"
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
-я ввожу в поле букви, нажимаю сохранить получаю сообщение "Ошибка" , закрываю
открываю снова этот док и в поле запись "ERROR: Cannot convert text to a number"
т.е. что-то не так..ошибку выдает, но значение как бы сохраняет
Случайно в другом месте сохранения нет? В QuerySave?
 
M

morpheus

oxystile
такс... тут If Not(Isnumeric(doc.trud(0))) - надо сначала проверить на IsEmpty, а уж потом на изнумерик... потому как для поля с типом число неправильное значение будет означать что в поле empty ... проверено на датах(недавно обсуждали )
 
S

Sandr

Код:
If doc.GetItemValue("myField")(0) <> "" Then

If Not Isnumeric(doc.GetItemValue("myField")(0)) Then
Msgbox "Поле " & Chr(34) & "ПОЛЕ" & Chr(34) & " должно содержать числовое значение!", 48, "Ошибка"
source.GotoField("myField")
End If
End if

Morpheus
Зачем на эмпти проверять? Достаточно doc.GetItemValue("myField")(0) <> "" .
 
S

Sandr

Medevic
@If(@IsDocBeingSaved & @IsError(@ToNumber(@ThisValue)); @Failure("Ошибка"); @Success)
-я ввожу в поле букви, нажимаю сохранить получаю сообщение "Ошибка" , закрываю
открываю снова этот док и в поле запись "ERROR: Cannot convert text to a number"
т.е. что-то не так..ошибку выдает, но значение как бы сохраняет

Это при рефреше документа происходит... Проверять надо раньше...
 
O

Omh

Код:
Function ValidateNumericFlds(doc As NotesDocument) As Integer
On Error Goto Errh

Dim rv As Integer
rv = True

lsf_ValidateNumericFlds = rv

Dim NumFlds List As String
NumFlds("FLD_NAME_1") = "LABEL_1"
NumFlds("FLD_NAME_2") = "LABEL_2"

Dim V As Variant
Dim VEmpty As Variant
Dim IsError As Integer

Forall x In NumFlds
V = VEmpty
IsError = False

On Error Resume Next
V = doc.GetItemValue(Listtag(x))(0)
On Error Goto Errh

If Not Isempty(V) Then IsError = Not Isnumeric(V) Else IsError = True

If IsError Then
Messagebox {Ой бяда, ребятушки! В поле "} + x + {" какое-то гогно!}, 0 + 16, "Бяда"
rv = False
Exit Forall
End If
End Forall

lsf_ValidateNumericFlds = rv

Exit Function
Errh:
Call lsf_ErrorTrack
Exit Function
End Function

Скелет не очень красивой ф-ии (но, на мой вкус, лучше чем использование Validation Formula)
Тут ещё Integer вместо Boolean юзается, ибо надо было компатибле виз эр пять.
 
O

oxystile

Omh
работает! :)
просто мега-функция!
спасибо!!!
 
O

Omh

oxystile
Не, это не мега :)
Только смени массажбокс, а то клиент может быть слегка шоцкед :)
 
O

oxystile

:) да, мессадж сменю, хоть и жалко..
так в этой функции вся хитрость заключается в обозначении переменных ( NumFlds List As String) ??
ведь здесь таже проверка на Isnumeric(V), только она выполняется в отличие от моей проверки Isnumeric("поле")
а почему, ведь интересно ж? :)
 
O

Omh

Хитрость в том, что, код вида
Код:
V = doc.GetItemValue("NUM_FLD")(0)
генерит ошибку при наличии ошибочного значения в поле "NUM_FLD".
Мы его обвязываем (On Error Resume Next)
И потом проверяем на IsEmpty (т.е. ошибка была).
При этом, т.к. ф-ия для проверки n полей, не забываю инитить V на Empty:
Код:
V = VEmpty
 
O

oxystile

а как тогда пропустить случай, когда поле пустое?
ведь, если даже поле пустое, то это типа ошибка :wacko:

проверяла, если поле пустое, то проверка IsEmpty не равно true
 
O

Omh

Если пустое, не ошибка. Просто не IsNumeric.
Ошибка будет, если в числовом поле написано "AAA"
 
Мы в соцсетях:

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