2010-01-21 3 views
0

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

Я использую MS Access 2003.

Давайте предположим, что у меня есть две таблицы:

Table1: ID (AutoNumber), [...], Ключевые слова (памятка)

Table2: ID (autonumber), Ключевое слово (текст)

Я хочу: 1) Поскольку пользователь набирает буквы в таблице. Ключевые слова, которые моя база данных ищет в Table2.keyword для ближайшего значения и предлагает его путем автозаполнения (так же, как google предлагает слово поиска по мере ввода)

2) Когда пользователь нажимает «» что он может добавить еще один ключевое слово в том же поле (и автозаполнение по-прежнему работает для следующего значения)

3) Если он печатает ключевое слово, не включенные в Table2 и пресс «» что он спросил, хочет ли он это значение, которое будет добавлено в Table2

Ну, я не уверен, что если все это понятно ... может быть, они много чего ...

Но я был бы признателен, если бы вы могли мне помочь ...

ance J.

+0

Я думаю, что вы должны рассмотреть ответы ниже, зафиксировать запятую в событии, написать ключевое слово в текстовое поле и очистить комбо для следующего ключевого слова. – Fionnuala

ответ

1

Было бы сложно сделать это с помощью одного органа управления, но с двумя элементами управления, выпадающий список для выбора значения для добавления и текстовое поле, отображающее поле мемо, вы могли бы иметь комбо короба Событие AfterUpdate добавляет запятую и выбранное значение к существующим данным. Что-то вроде этого:

Private Sub cmbChooseKeyword_AfterUpdate() 
    If Not IsNull(me!cmbChooseKeyword) Then 
     Me!txtKeywordMemo = (Me!txtKeywordMemo + ", ") & Me!cmbChooseKeyword 
    End If 
    End Sub 

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

SELECT tblKeywords.* 
    FROM tblKeywords 
    WHERE InStr(Forms!MyForm!txtKeywordMemo, tblKeywords.Keyword) = 0; 

Тогда вы бы добавить:

Me.Dirty = False 
    Me!cmbChooseKeyword.Requery 

... в конце кода AfterUpdate выше (внутри End If):

:
Private Sub cmbChooseKeyword_AfterUpdate() 
    If Not IsNull(me!cmbChooseKeyword) Then 
     Me!txtKeywordMemo = (Me!txtKeywordMemo + ", ") & Me!cmbChooseKeyword 
     Me.Dirty = False 
     Me!cmbChooseKeyword.Requery 
    End If 
    End Sub 

... и вы хотите добавить запрос к событию OnCurrent вашей формы (так что когда вы прибудете в запись, в поле со списком уже отсутствуют любые ключевые слова, которые уже есть в списке).

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

  1. Что делать, если вы хотите удалить одно ключевое слово?

  2. что делать, если вы хотите, чтобы ключевые слова были отсортированы в алфавитном порядке?

  3. Что делать, если у вас есть 100 тысяч тысяч записей, и вы хотите найти это поле с помощью LIKE «Ключевое слово *» - будет ли оно болото, чтобы быть ужасно медленным (без индексов, и не используется хорошо, даже если они были)?

Вы действительно должны использовать правильный многие-ко-многим структуру, с дополнительным столом между тем, где вы в настоящее время хранения памятку ключевых слов и список ключевых слов таблице. Это «присоединяется» к двум, и затем дает вам список.

Затем вы можете использовать подформу с выпадающим списком для заполнения каждой строки таблицы соединений.

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

+0

Огромное спасибо всем вам за ваши ответы. И особая благодарность вам, Дэвид-У-Фентон, за потраченное время и вашу полезную помощь и предложения. Спасибо! :-) – MiltosR

0

Почему бы не использовать «Combo Box» и установить его тип источника строки в таблицу/запрос, а затем сделать Row Source запрос во второй таблице. Просто убедитесь, что вы не включаете Limit to List.

0

CodeSlave упоминает способ, который будет работать. Но это будет работать только для одного значения. Невозможно сделать многословные слова, разделенные запятыми. Только одно слово за раз.

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

Сет

Смежные вопросы