Как реализовать связанный с TDataSet комбинированный список со значениями, отсутствующими в списке

Мне нужно реализовать комбинированный список, который связан с TpFIBDataSet (потомок TDataSet). Я делал это несколько раз раньше. Это не большая вещь, если она содержит только предопределенные значения.

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

Мне кажется, что основная проблема заключается в том, что предопределенные значения внутренне представлены в виде целочисленных идентификаторов (я использую поле со списком TwwDBComboBox из пакета InfoPower Роя Уолла, поскольку он реализует функциональность списка карт), потому что поле является внешним ключом, в то время как пользовательские значения могут быть почти всеми (только ограничены маской).
Например, как я могу различить целочисленный идентификатор и целочисленный пользовательский ввод?

Смотрите набор свойств комбобокса:

AComboBox.Style   := csDropDown;
AComboBox.MapList := True;

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

1 ответ

Например, как я могу различить целочисленный идентификатор и целочисленный пользовательский ввод?

Вы возвращаетесь в базу данных. Либо запрос напрямую select count(*) from table where id = ComboBoxId,
Или используйте Locate метод набора данных.
Или держать кеш под рукой в MyList: TList<Integer> и сделать MyList.BinarySearch чтобы увидеть, если элемент уже находится в БД.
Очевидно, что кэш будет работать только в том случае, если БД является однопользовательской, поскольку в противном случае вы не сможете поддерживать ее в актуальном состоянии.

Если его нет в БД, вы запускаете запрос на вставку. После того, как он вставлен, вы запускаете стандартное поведение комбинированного списка, потому что теперь значения обязательно будут в БД.

Другие вопросы по тегам