Числовое поле

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

oxystile

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

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

morpheus

скриптописец
07.08.2006
3 915
1
#2
можно попробовать Input Validation c формулой @textToNumber ( обработать ошибку ), НО! @TextToNumber вернёт 123 если в поле написать "123йцу" , и вернёт ошибку если "йцу123" ... так что можно добавить исчо Input Translation @TextToNumber( @thisValue)
 
U
#3
Я тебе советую на сохранение документа повесить код на проверку этого поля, является ли оно числовым или нет.

Код:
IsNumeric(doc.[твое поле])
Либо отлавливать ошибку при сохранении, её номер 4412
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#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

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

Omh

Lotus team
04.07.2007
2 210
1
#6
Sandr
+1

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

Omh

Lotus team
04.07.2007
2 210
1
#8
Medevic
Тогда уж TeamStudio Configurator.
Ибо дефаултный синопсис, кмк, гогнецо :)
 
O

oxystile

#10
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

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

morpheus

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

Sandr

#13
Код:
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

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

Omh

Lotus team
04.07.2007
2 210
1
#16
Код:
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 юзается, ибо надо было компатибле виз эр пять.
 
U
#17
В начале писал два способа, чувствуется прийдется их расписать

1 способ:

Код:
Dim doc As NotesDocument
Dim v As Variant

Set doc = source.Document

v = doc.GetItemValue("Имя твоего поля")

if IsNumeric(doc.GetItemValue) Then
MessageBox "Введено число"
Else
MessageBox "Вы ввели текст"
End if
Второй способ:

Код:
On Error 4412 Goto ErrHnd

[твой код]

Done:	
Exit Sub
ErrHnd:
Msgbox "Поле не является строковым",16,"Предупреждение"
Resume Done
Вырезка из Help
Dim v As Variant
Print IsNumeric(v) ' Output: True (v is EMPTY)
v = 12
Print IsNumeric(v) ' Output: True
' A string that is not interpretable as a number
v = "Twelve"
Print IsNumeric(v) ' Output: False
' A string that is interpretable as a number
v = "12"
Print IsNumeric(v) ' Output: True
 
O

oxystile

#18
да у меня ошибка уже на
If Isnumeric(doc.GetItemValue("trud")) Then
Msgbox "число"
ввожу буквы, а получаю сообщение "число"

причем проверку писала и на кверисейф в самом начале, и на соб. change поля
причем, если там же написать что-то типа t=doc.trud(0) то ошибка "Variant doesn't contain a container"