Добавить число в поле, основанное на количестве вхождений конкретного текста в другое поле

0 Ben Holman [2018-07-31 04:50:00]

У меня есть поле, которое имеет несколько вариантов для тренировок, которые могут быть введены в мою базу данных доступа. У меня есть набор индексов, чтобы не допускать дубликатов, где совпадение обучения и дата совпадают, но есть одно общее обучение, которое я хотел бы разрешить дублировать. Я думаю, что если я смогу создать еще один столбец с чем-то вроде числа авто в индексе, это может решить мою проблему. Однако я не знаю, как это сделать.

Я думаю, что каждый раз, когда вы выбираете "Дополнительное обучение", этот другой столбец обнаруживает это и добавляет номер авто (или другой уникальный идентификатор). Он не будет делать это для каких-либо других записей, тем самым позволяя дублировать только одну тренировку.

Какие-либо предложения?

ms-access


2 ответа


0 Решение Ben Holman [2018-08-01 02:30:00]

Вышеупомянутый ответ, вероятно, является более элегантным решением того, что я просил, но в то же время я смог найти способ получить результат, который я хотел.

Я добавил столбец [короткий текст] в таблицу и включил его в ключ с моими столбцами заголовка и даты. Теперь ключ ищет дублирование в трех полях вместо двух.

В форме, которая вводит данные, я создал невидимое поле, которое ссылается на этот столбец, и добавляет отметку времени, если пользователь выбирает "родовое обучение" и "c" (для копирования), если они выбирают что-либо еще. Это решило проблему, с которой я столкнулся. Здесь код, который я добавил в форму:

 Private Sub TrainingTitle_Change()
      If Me.TrainingTitle = 45 Then
           Me.Text50 = Now()
           Me.Text30.Visible = True
           Me.Label31.Visible = True

      Else
           Me.Text50 = "c"
           Me.Text30.Visible = False
           Me.Label31.Visible = False

    End If

 End Sub

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

Спасибо, что помогли мне подумать об этом и прийти к решению.


1 C Perkins [2018-07-31 10:15:00]

Прежде всего, не делайте нового поля AutoNumber, так как это даст вам противоположность тому, что вам нужно... оно по определению генерирует уникальные значения, тем самым сводя на нет соблюдение уникальности двух основных полей (дата и обучение).

Если у вас есть хотя бы Access 2010, я рекомендую использовать Data Macros для установки третьего столбца (как вы предлагаете). Одной из альтернатив было бы ослабление фактических ограничений таблицы (то есть индексов), а затем поместить всю проверку в код формы ввода. Это может работать достаточно хорошо, если есть ограниченные формы и только один пользователь базы данных за раз, а не код изгоев, который будет противоречить вашим правилам, но я нахожу, что и громоздкий, и противоречащий идее использования базы данных, чтобы обеспечить соблюдение правила данных. Кроме того, нет никакого способа, чтобы "этот другой столбец [обнаруживал" изменения в других полях. Отдельная колонка не имеет таких возможностей. Макросы данных могут действительно проверять, проверять и изменять значения для вставленных и обновленных строк, поэтому, возможно, это удовлетворяет тому, что вы имели в виду, но оно работает на основе таблицы и ряда.

Поскольку в вопросе отсутствует формальная схема базы данных, здесь приведена схема, на которой основан макрос примерных данных:

Table [Training]: [ID] AutoNumber, Primary Key
                  [Title] Text, Required
                  [Multiple] Boolean, Default false

Table [Schedule]: [ID] AutoNumber, Primary Key
                  [TrainingDate] DateTime, Required
                  [TrainingID] Long, Required (FK to Training.ID)
                  [MultipleSeq] Integer, NOT Required, Default 0
                  Unique index on [TrainingDate], [TrainingID] and [MultipleSeq]

[MultipleSeq] не требуется (обязательно: нет), так что установка его поля в null допускает несколько записей, несмотря на ограничение уникальности индекса.

Следующий макрос данных перед изменением обновляет дополнительный индексированный столбец до нулевого или статического значения в зависимости от выбранного учебного курса. Это общее решение может также работать с одним полем обучения, где макрос данных проверяет заголовок тренировки вместо столбца [Обучение]. [Несколько]. Преимущество схемы, которую я показываю, заключается в том, что вы можете иметь несколько таких исключений для уникального ограничения, а имя "общего обучения" можно обновить без обновления всех строк (это действительно просто эффект правильно нормализованных таблиц).

Вставьте следующее в макрос данных перед изменением таблицы расписания:

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application">
<DataMacro Event="BeforeChange">
  <Statements>
    <LookUpRecord>
      <Data>
        <Reference>Training</Reference>
        <WhereCondition>[Training].[ID]=[Schedule].[TrainingID]</WhereCondition>
      </Data>
      <Statements>
        <ConditionalBlock>
        <If><Condition>[Training].[Multiple]=True</Condition>
          <Statements>
            <Comment>The specified training allows multiple entries per date, so set  [MultipleSeq] to null to circumvent the uniqueness requirement.</Comment>
            <Action Name="SetField">
              <Argument Name="Field">Schedule.MultipleSeq</Argument>
              <Argument Name="Value">Null</Argument>
            </Action>
          </Statements>
        </If>
        <Else>
          <Statements>
            <Action Name="SetField">
              <Argument Name="Field">Schedule.MultipleSeq</Argument>
              <Argument Name="Value">0</Argument>
            </Action>
          </Statements>
        </Else>
        </ConditionalBlock>
      </Statements>
    </LookUpRecord>
  </Statements>
</DataMacro>
</DataMacros>