Есть ли способ при использовании запроса по форме в Access для отображения значения из поля, отличного от значения идентификатора, которое он использует для поиска? - PullRequest
0 голосов
/ 25 февраля 2020

Простите слово салат заголовка - это трудно сократить до одного предложения.

У меня есть не существенная, но постоянно раздражающая проблема с базой данных Access, над которой я работаю, которая будет в конечном итоге будет использоваться в качестве базы данных СМИ на моем рабочем месте. Полное раскрытие, я новичок в Access и SQL, так что в моей структуре базы данных может быть некоторая базовая fl aws - у меня есть постоянное беспокойство, что она не очень хорошо нормализована, поэтому, возможно, один из вас может предложить улучшения ,

Суть проблемы в том, что я создал форму для выполнения многополевого запроса. Большинство полей представляют собой поля со списком, которые извлекают свои значения из «вспомогательных» таблиц (под названием «tbl_MediaType», «tbl_Author» и т. Д.), Которые все связаны через отношения полей с основной таблицей («tbl_Items»). «). Запрос работает должным образом, поскольку он может выполнять поиск по нескольким критериям, и при выборе в комбинированных полях вы можете видеть как номер идентификатора записи, так и значение, связанное с этим идентификатором, но после выбора значения отображается только идентификатор записи. , Понятно, что наглядное пособие имеет следующий порядок: раскрывающийся список типов носителей поле типа носителя после выбора

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

Я попытался обойти это, сделав само поле значения (т. Е. Поле с заголовком "MediaType" для tbl_MediaType) полем, на котором основана связь между таблицами (т. Е. поле, которое формирует отношение между tbl_MediaType и tbl_Items) вместо использования числового идентификатора (т. е. поля с названием "MediaTypeID") в качестве связанного поля. Это заставляет форму ломаться. Я также попытался просто не отображать числовой идентификатор в раскрывающемся списке поиска, но, учитывая, что запрос основан на сопоставлении того, что находится в раскрывающемся списке поиска, с полем tbl_Items, что также нарушает форму.

На данный момент база данных все еще находится в стадии разработки и поэтому содержит все фиктивные данные, поэтому, если кто-то захочет покопаться в файле, чтобы сказать мне, что я делаю неправильно, я могу отправить его вам , В то же время, вот SQL для запроса, в случае, если это поможет:

    SELECT 
  tbl_Items.ItemID, 
  tbl_Items.FileName, 
  tbl_Items.FileLocation, 
  tbl_Items.AuthorID, 
  tbl_Author.AuthorName, 
  tbl_Items.MediaTypeID, 
  tbl_MediaType.MediaType, 
  tbl_Items.SubjectCategoryID, 
  tbl_SubjectCategory.SubjectCategory, 
  tbl_Items.YearID, 
  tbl_Year.ActualYear, 
  tbl_Items.FileTypeID, 
  tbl_FileType.FileType 
FROM 
  tbl_FileType 
  INNER JOIN (
    (
      tbl_Author 
      INNER JOIN (
        tbl_MediaType 
        INNER JOIN (
          tbl_SubjectCategory 
          INNER JOIN tbl_Items ON tbl_SubjectCategory.SubjectCategoryID = tbl_Items.SubjectCategoryID
        ) ON tbl_MediaType.MediaTypeID = tbl_Items.MediaTypeID
      ) ON tbl_Author.AuthorID = tbl_Items.AuthorID
    ) 
    INNER JOIN tbl_Year ON tbl_Items.YearID = tbl_Year.YearID
  ) ON tbl_FileType.FileTypeID = tbl_Items.FileTypeID 
WHERE 
  (
    (
      (tbl_Items.YearID) Between [Forms] ! [frm_SearchForm] ! [YearSearchBox] 
      And [Forms] ! [frm_SearchForm] ! [YearSearchBox2]
    ) 
    AND (
      (
        IIf(
          [Forms] ! [frm_SearchForm] ! [CategorySearchBox] Is Null, 
          "*", [tbl_Items].[SubjectCategoryID] = [Forms] ! [frm_SearchForm] ! [CategorySearchBox]
        )
      )<> False
    ) 
    AND (
      (
        IIf(
          [Forms] ! [frm_SearchForm] ! [MediaTypeSearchBox] Is Null, 
          "*", [tbl_Items].[MediaTypeID] = [Forms] ! [frm_SearchForm] ! [MediaTypeSearchBox]
        )
      )<> False
    ) 
    AND (
      (
        IIf(
          [Forms] ! [frm_SearchForm] ! [AuthorSearchBox] Is Null, 
          "*", [tbl_Items].[AuthorID] = [Forms] ! [frm_SearchForm] ! [AuthorSearchBox]
        )
      )<> False
    ) 
    AND (
      (
        IIf(
          [Forms] ! [frm_SearchForm] ! [FileTypeBox] Is Null, 
          "*", [tbl_Items].[FileTypeID] = [Forms] ! [frm_SearchForm] ! [FileTypeBox]
        )
      )<> False
    ) 
    AND (
      (
        IIf(
          [Forms] ! [frm_SearchForm] ! [FileNameSearchBox] Is Null, 
          "*", 
          (
            [tbl_Items].[FileName] Like "*" & [Forms] ! [frm_SearchForm] ! [FileNameSearchBox] & "*"
          ) 
          Or (
            [tbl_Items].[Description] Like "*" & [Forms] ! [frm_SearchForm] ! [FileNameSearchBox] & "*"
          ) 
          Or (
            [tbl_Items].[FileLocation] Like "*" & [Forms] ! [frm_SearchForm] ! [FileNameSearchBox] & "*"
          )
        )
      )<> False
    )
  );

Любая и вся помощь наиболее ценится.

1 Ответ

0 голосов
/ 26 февраля 2020

Комбинированные поля в MS Access могут иметь скрытые поля для скрытия идентификаторов, но отображать удобочитаемое значение, но значение все еще равно скрытому идентификатору, а не отображаемому значению. Просто установите свойство ширины столбца в combobox на ноль и определите его положение в связанном столбце. Ниже приведен пример таблицы со списком из двух столбцов / источника запроса в поле со списком:

BoundColumn: 1
ColumnCount: 2
ColumnWidths: 0; 1;

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

SELECT 
  i.ItemID, 
  i.FileName, 
  i.FileLocation, 
  i.AuthorID, 
  a.AuthorName, 
  i.MediaTypeID, 
  m.MediaType, 
  i.SubjectCategoryID, 
  s.SubjectCategory, 
  i.YearID, 
  y.ActualYear, 
  i.FileTypeID, 
  f.FileType 
FROM 
  tbl_FileType f
  INNER JOIN (
    (
      tbl_Author a
      INNER JOIN (
        tbl_MediaType m
        INNER JOIN (
          tbl_SubjectCategory s
          INNER JOIN tbl_Items ON s.SubjectCategoryID = i.SubjectCategoryID
        ) ON m.MediaTypeID = i.MediaTypeID
      ) ON a.AuthorID = i.AuthorID
    ) 
    INNER JOIN tbl_Year y ON i.YearID = y.YearID
  ) ON f.FileTypeID = i.FileTypeID 
WHERE 
    (
      (i.YearID) BETWEEN [Forms]![frm_SearchForm]![YearSearchBox] 
                     AND [Forms]![frm_SearchForm]![YearSearchBox2]
    ) 
    AND (
      [tbl_Items].[SubjectCategoryID] = NZ([Forms]![frm_SearchForm]![CategorySearchBox], [tbl_Items].[SubjectCategoryID])
    ) 
    AND (
      [tbl_Items].[MediaTypeID] = NZ([Forms]![frm_SearchForm]![MediaTypeSearchBox], [tbl_Items].[MediaTypeID])
    ) 
    AND (
      [tbl_Items].[AuthorID] = NZ([Forms]![frm_SearchForm]![AuthorSearchBox], [tbl_Items].[AuthorID])
    ) 
    AND (
      [tbl_Items].[FileTypeID] = NZ([Forms]![frm_SearchForm]![FileTypeBox], [tbl_Items].[FileTypeID])
    ) 
    AND (
          (      
           [tbl_Items].[FileName] LIKE "*" & NZ([Forms]![frm_SearchForm]![FileNameSearchBox], [tbl_Items].[FileName]) & "*"
          ) 
       OR (
           [tbl_Items].[Description] LIKE "*" & NZ([Forms]![frm_SearchForm]![FileNameSearchBox], [tbl_Items].[Description]) & "*"
          ) 
       OR (
           [tbl_Items].[FileLocation] LIKE "*" & NZ([Forms]![frm_SearchForm]![FileNameSearchBox], [tbl_Items].[FileLocation]) & "*"
          )
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...