Объявление

Свернуть
Пока нет объявлений.

Очистка полей на форме при изменении основного поля

Свернуть
X
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Очистка полей на форме при изменении основного поля

    Доброго времени!

    Имеется форма Запроса. На форме есть контролы Edit для полей:
    1. Reporting Company
    2. Related Contract
    3. Reporting Location
    4. Reporting Person
    5. Request Area
    Контролы недоступны для редактирования, т.е. пользователь должен заполнять эти поля через специальные кнопки, которые рядом контролами. Все эти поля имеют тип Reference to object. Пользователь должен сначала выбрать Компанию, потом, Контракт, потом Локацию и т.д. Хочется сделать так, чтобы если, например, пользователь заполнил поля или часть полей, потом вдруг понял, что неправильно выбрал компанию, поменял ее и все последующие поля 2-4 очистились, чтобы он заново их заполнял, т.к. для другой Компании – другой Контракт и т.п. Если он поменял Контракт, то поля 3-4 отчислись бы и т.д.
    Попробовал использовать событие формы OnAfterFieldChanged. Для проверки вставил такой код
    Код:
    If ChangedField = "ReportingCompany" AND (ActiveRequest.Fields("Related Contract").Value > "" OR ActiveRequest.Fields("Reporting Location").Value > "" OR ActiveRequest.Fields("Reporting Person").Value > "" OR ActiveRequest.Fields("Related Request Area").Value > "") Then
     MsgBox "1"
    End If
    MsgBox "1" вставил, чтоб проверить срабатывание условия. Работает как-то фигово: создаю запрос, заполняю поле Компания, заполняю поле Контракт, меняю поле компании на другое значение – ничего не происходит, не закрывая окна, меняю опять компанию, контракт, заполняю Локацию, меняю опять Компанию – срабатывает. Не пойму логики. Короче, экспериментировал долго. Сделал такой код (с литеры Е у меня начинаются название контролов Edit):
    Код:
    If ChangedField = "ReportingCompany" AND (ERelatedContract.Text <> "" OR ELocation.Text <> "" OR EReportingPerson.Text <> "" OR ERequestArea.Text <> "") Then
    ‘Если меняется поле Компании
    MsgBox "1"
     If ERelatedContract.Text <> "" Then  
      ActiveRequest.UserFields("Related Contract").TValue = Null
      LoadField("Related Contract")
     End If
     If ELocation.Text <> "" Then
      ActiveRequest.UserFields("Reporting Location").TValue = Null
      LoadField("Reporting Location")
     End If
     If EReportingPerson.Text <> "" Then
      ActiveRequest.UserFields("Reporting Person").TValue = Null
      LoadField("Reporting Person")
     End If
     If ERequestArea.Text <> "" Then
      ActiveRequest.UserFields("Related Request Area").TValue = Null
      LoadField("Related Request Area")
     End If
     If ECalendar.Text <> "" Then
      ActiveRequest.UserFields("Working Time Calendar").TValue = Null
      LoadField("Working Time Calendar")
     End If
    End If
    ‘Если меняется поле Контракт
    If ChangedField = "RelatedContract" AND (ELocation.Text <> "" OR EReportingPerson.Text <> "" OR ERequestArea.Text <> "") Then
    MsgBox ("2")
     If ELocation.Text <> "" Then
      ActiveRequest.UserFields("Reporting Location").TValue = Null
      LoadField("Reporting Location")
     End If
     If EReportingPerson.Text <> "" Then
      ActiveRequest.UserFields("Reporting Person").TValue = Null
      LoadField("Reporting Person")
     End If
     If ERequestArea.Text <> "" Then
      ActiveRequest.UserFields("Related Request Area").TValue = Null
      LoadField("Related Request Area")
     End If
     If ECalendar.Text <> "" Then
      ActiveRequest.UserFields("Working Time Calendar").TValue = Null
      LoadField("Working Time Calendar")
     End If
    End If
    ‘ Если меняется поле Локации
    If ChangedField = "Reporting Location" AND (EReportingPerson.Text <> "" OR ERequestArea.Text <> "") Then
    MsgBox ("3")
     If EReportingPerson.Text <> "" Then
      ActiveRequest.UserFields("Reporting Person").TValue = Null
      LoadField("Reporting Person")
     End If
     If ERequestArea.Text <> "" Then
      ActiveRequest.UserFields("Related Request Area").TValue = Null
      LoadField("Related Request Area")
     End If
     If ECalendar.Text <> "" Then
      ActiveRequest.UserFields("Working Time Calendar").TValue = Null
      LoadField("Working Time Calendar")
     End If
    End If
    Но все равно как-то криво работает, вроде работает, но при изменении поля Локации не работает, при попытки сохранения ругается что неверные данные для Контакта (Person), хотя если вообще без кода делать все сохраняется без ругани.
    Подскажите, как правильно сделать?
    PS. У меня даже почему-то пример из документации по Формам не работает – втсаляю код из примера в событие OnOpen и не работает
    Код:
    If NewRequest Then
    Form.Caption = "Hi"
    End if

  • #2
    Re: Очистка полей на форме при изменении основного поля

    Сообщение от Megabizon
    Попробовал использовать событие формы OnAfterFieldChanged
    Обратите внимание в документации на свойство ChangedFieldByUserAction.

    Я бы так написал обработку изменения пользователем поля с алиасом "ReportingCompany":
    в скрипте формы OnAfterFieldChanged,
    Код:
    If ChangedField = "ReportingCompany" And ChangedFieldByUserAction Then
        StoreField "ReportingCompany"
        If ActiveRequest.UserFields("ReportingCompany").IsNull Then
            ' очищаем поля, зависящие от ReportingCompany
        Else
            ' изменяем поля, зависящие от ReportingCompany
        End If
        ' т.к. поля, зависящие от ReportingCompany либо меняются, либо очищаются, 
        ' делаем для каждого LoadField "алиас_поля", чтобы показать изменение пользователю на форме
    End If
    И еще конструкции типа
    Код:
    If ActiveRequest.Fields("Related Contract").Value > "" Then
    рекомендую заменить на
    Код:
    If Not ActiveRequest.UserFields("Related Contract").IsNull Then
    С уважением, Сергей Осадчий

    Комментарий


    • #3
      Re: Очистка полей на форме при изменении основного поля

      Спасибо! Попробую.

      Комментарий

      Обработка...
      X