Проверка числового поля

Тема в разделе "Lotus - Программирование", создана пользователем Gor, 28 ноя 2007.

  1. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Вопрос лёгкий. Но кое что хочу всё таки разжевать=)

    Задача такая - создать поле чтобы в него можно было записать только числовые значения и чтобы значение было всегда больше единицы.

    Я обычно все поля скопом проверяю на скриптах, по событиям =)) Наверно глупо)
    Input Validation почти не использую.

    В этой задачи я так понимаю необходимо использовать числовое поле, по крайней мере оно выбрасывает лотусовую ошибку когда в него пытаешься ввести буквы а потом перейти в другое поле - Cannot convert text to a number.

    А как сделать, чтобы Messagebox с собственным ругательным сообщением на русском вылазил сразу же если ты набрал предположим букву в это поле и проверялось на неравенство нулю и для этого не надо было бы переходить в другое поле?
     
  2. Sandr

    Sandr Гость

    1-е. Убрать обновление документа при потере фокуса в поле...
    2-е. Можно сделать текстовое поле, а кооректность введенного значения проверять самому, на какое-то событие.. например на кверисейве...

    3-е Input Validation - гогно...
     
  3. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    1-е. Input Validation - гогно...
     
  4. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Мой совсем извращеный моск подсказывает просто напросто в текстовом поле зделать запрет ввода всего кроме цифрна подобии этого ( тут мы ловим Enter, по аналогии можно ловить любой символ
     
  5. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Как то я опять неправильно высказался наверно))

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


    этим способом я обычно и пользуюсь...
    ... (просто не написал по какому именно событию:blink:)

    здесь задачка несколько иная...
    хотелось бы мгновенного результата... чтобы ввёл букву а тебе мессаджбокс - вы ввели символ в числовое поле, ввёл ноль или отрицательное значени - а он тебе мессагу - значение поля должно превыщать 0. хотелось бы вот так...
    Подскажите, может делал кто нибудь такое

    У меня есть прикрученная реализация на Java scriptax чтобы в поле нельзя было ввести больше 20,30,40 итд символов, это где то уже обсуждалось. Здесь видимо тоже данную задачку можно реализовать только с помощью Javы? Может подобное ктонибудь писал уже? Или без Javы можно обойтись?
    Просто знаний по Jave мне вряд ли хватит для реализации...

    уф... блин... Думал это можно в Лотусе как нибудь попроще реализовать))
     
  6. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    <!--QuoteBegin-Gor+28:11:2007, 12:57 -->
    <span class="vbquote">(Gor @ 28:11:2007, 12:57 )</span><!--QuoteEBegin-->Просто знаний по Jave мне вряд ли хватит для реализации...
    [snapback]87664" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    А вот не стоит путать JAVA и JAVASCRIPT это раз
    я сам реализовавывл меанизм отлова Enter'a не гугукая в жаваскриптах ифига - потратил пол дня облазил нмого инета и порыскал в своих книгах по web програмированию, тем более что моего примера будет более чем достаточно ( в нём есть убирание последнего символа - в моём случае Ентра , в Вашем - любого НЕ числа )
     
  7. Sandr

    Sandr Гость

    Вот функция

    Код (Text):
    function checkNumFields(fldArray) {
    try {
    var result = true;
    var re = /\d+\.?\d*/;
    for(i=0;i<fldArray.length; i++) {
    var fieldName = Left(fldArray[i], "|");
    var fieldAlias = Right(fldArray[i], "|");
    if (document.getElementById(fieldName) && document.getElementById(fieldName).type!='hidden') {
    var fldValue = document.getElementById(fieldName).value;
    var retVal = fldValue.match(re);
    if (!(retVal != null && retVal == fldValue)) {
    alert('Поле "'+ fieldAlias + '" должно содержать положительное числовое значение!');
    //                      document.getElementById(fieldName).focus();       Ошибка в случае если фокус на неактивной вкладке
    document.getElementById(fieldName).select();
    result = false;
    return result;
    };
    };
    };
    return result;
    } catch(e) {
    alert("checkNumFields: " + e.message);
    };
    };
    Вызываем на onBlur поля.
    Передаем в неё масив полей и алиесов полей...
    К примеру если есть поле "Number" и алиес его "Число", то передаем туда масив элементами которого будут значения "Number|Число"

    Пример приведен для одного поля.. Если полей много, то значения передаем серез запятую.. либо объкт масив...
     
  8. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Вроде бы всё сделал правильно, прикрутил функцию... логика в принципе понятна...
    Вылезает ошибка -

    CheckNumFields: FldArray has no properties


    Вот весь код на Header
    Код (Text):
     
    */

    var listenField1

    function startListener1 (field) {
    listenField1 = field;
    checkNumFields();
    }


    */
    function stopListener1 () {
    listenField1 = null;
    }

    //функция для проверки числового поля

    function checkNumFields(fldArray) {
    try {
    var result = true;
    var re = /\d+\.?\d*/;
    for(i=0;i<fldArray.length; i++) {
    var fieldName = Left(fldArray[i], "|");
    var fieldAlias = Right(fldArray[i], "|");
    if (document.getElementById(fieldName) && document.getElementById(fieldName).type!='hidden') {
    var fldValue = document.getElementById(fieldName).value;
    var retVal = fldValue.match(re);
    if (!(retVal != null && retVal == fldValue)) {
    alert('Поле "'+ fieldAlias + '" должно содержать положительное числовое значение!');
    //                      document.getElementById(fieldName).focus();       Ошибка в случае если фокус на неактивной вкладке
    document.getElementById(fieldName).select();
    result = false;
    return result;
    };
    };
    };
    return result;
    } catch(e) {
    alert("checkNumFields: " + e.message);
    };
    };
    на Blur
    Код (Text):
    if (checkNumFields(CZE))
    this.focus();
    else
    stopListener1();
    на On Focus
    Код (Text):
    startListener1(this);
     
  9. Sandr

    Sandr Гость

    А что у вас в CZE ?
     
  10. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Для: Morpheus
    Твой ум самый извращенный =)
    Любимая фраза всех и вся
    Люди, не используйте JS для таких вещей! Опять же взял код на ловлю Enter'a (несколько иной)... работает все ок. Но ИНОГДА выдает ошибки... почему - хз... Может с фреймами что-то, может ещё что-то

    В querySave:
    , где а - содержимое поля
     
  11. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Я так понял в скобках для функции должно передаваться поле текущее?
    CZE у меня поле... в которое вноситься должны значения числовые положительные...
    хотя если CZE убрать и оставить так -
    if (checkNumFields())
    this.focus();
    else
    stopListener1();

    Ошибка остаётся точно такая же
    checkNumFields: fLD ARRAY HAS NO PROPERTIES(
     
  12. Sandr

    Sandr Гость

    Я же написал под кодом

    Если ваще поле называется CZE и алиес у него, к примеру CZE , то передавайте в функцию такое

    "CZE|CZE"

    тобишь

    checkNumFields("CZE|CZE")

    И все...

    Для: fedotxxl

    Дык сказано же было, что не на сохранение нужно, а на потерю фокуса...
    Можно, вообще то на Exiting LS впихнуть... Но попросили JS функцию, её и предоставили :blink:. Сам я лично юзаю её только в ВЕБе...
     
  13. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Для: Sandr
    Зачем городить огород?... Правильней не реализовать, а направить на правильный путь
     
  14. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.291
    Симпатии:
    0
    Мудрят, мудрят...
    Сделать поле ключевым, НО с допустимыми значениями НЕ из списка. На каждый символ будет PostRecalculate
     
  15. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Для: Constantin A Chervonenko
    Только надо принять во внимание сложность формы.
    А то может получиться так, что каждый символ будет появлятся 2 секунды.
     
  16. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Я обратился за помощью потому что я действительно не видел выхода из ситуации кроме как использование Java script функции...
    Рассматривал вариант я с PostRecalculate, но на форме 30 полей вводимых с клавиатуры, показалось что будет очень грузновато с ним... на выходе из этого поля и на querysave лотус скриптами варианты тоже не подходят, поэтому только javascript...

    Не знаю сейчас что со мной не то или что то ещё, но я тупо не могу создать АЛИАС На поле!!!=))))))
    В имени поля пишу к примеру CZE|CZE выходит ошибка сразу -
    Field name must begin with the letter or the symbols _ and итд итп =)))

    Перепробовал кучу вариантов... пробелов нету нигде...((( ????
    По видимому жутко туплю))
     
  17. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: Gor
    Для JS Вы должны писать имя поля в последней закладке свойст поля , закладка называеться <HTML> вот там и задавайте имя поля
     
  18. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Там владка name не редактируемая, а дальше идут HTML Tags... В HTML tags в ID у меня забито CZE
     
  19. Sandr

    Sandr Гость

    alias для поля, существует только в понятии функции.. Он там есть только для красоты сообщения... :)
    Если красота сообшщения вас не смущает, то пишите так.
    Если есть поле CZE, то в функцию передавайте "CZE|CZE". :)
    Это сделано только для удобства пользователя.. пользователь модет не подозревать о существовании поля CZE, зато может знать о поле "Центральный загрузочный элемент" (Не смог я подобрать расшифровку аббревиатуры CZE :))... вот...

    зачем? Все и так схавается... Тем более, что имя туда автоматически прописывается.. и поменять его низя... Можно только тем же JSом...но не нужно...
     
  20. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    спасибо Sandr объяснил и разъяснил непросвещённому)

    Но у меня всё равно неработает :)
    Код (Text):
    On Blur:
    if (checkNumFields1("CZE|CZE"))
    this.focus();
    else
    stopListener1();
    On focus:
    startListener1(this);

    JS Header

    var listenField1 // поле которое мониторить буим


    function startListener1 (field) {
    listenField1 = field;
    checkNumFields("CZE|CZE");
    // checkNumFields1("CZE");
    }


    /*
    Обнуляем переменные для того чтобы оставновить мониторинг
    */
    function stopListener1 () {
    listenField1 = null;
    }

    //функция для проверки числового поля

    function checkNumFields(fldArray) {
    try {
    var result = true;
    var re = /\d+\.?\d*/;
    for(i=0;i<fldArray.length; i++) {
    var fieldName = Left(fldArray[i], "|");
    var fieldAlias = Right(fldArray[i], "|");
    if (document.getElementById(fieldName) && document.getElementById(fieldName).type!='hidden') {
    var fldValue = document.getElementById(fieldName).value;
    var retVal = fldValue.match(re);
    if (!(retVal != null && retVal == fldValue)) {
    alert('Поле "'+ fieldAlias + '" должно содержать положительное числовое значение!');
    //                      document.getElementById(fieldName).focus();       Ошибка в случае если фокус на неактивной вкладке
    document.getElementById(fieldName).select();
    result = false;
    return result;
    };
    };
    };
    return result;
    } catch(e) {
    alert("checkNumFields: " + e.message);
    };
    };
    Обшипка=))

    CheckNumFields: Left is not defined
     
Загрузка...

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