У меня есть база данных sqlite, содержащая «заметки» для клиентов. Конструкция базы данных довольно проста и включает в себя одну таблицу для заметок, таблицу «ссылок», ссылки, связывающие клиентов и заметки с именем customer_note, и таблицу клиентов. Таблица примечаний имеет поле id, customer_note — customer_id и note_id (один ко многим), а таблица customer также имеет идентификатор.
Запрос для получения заметок для выбранного клиента:
SELECT * FROM note n
INNER JOIN customer_note cn
ON (cn.note_id = n.id)
WHERE customer_id = :customerID
ORDER BY created_on ASC
Запрос выполняется в случае, когда прокручивается набор данных клиента.
customersCDSAfterScroll()
{
int cID = customerCDS->FieldByName("id")->AsInteger;
customerNotesQ->Params->ParamByName("customerID")->AsInteger = bID;
customerNotesQ->Open();
//Get notes
string note = stdstr(customerNotesQ->FieldByName("note")->AsString);
Log(lInfo) << "Note is: "<<note;
customerNotesQ->Close();
}
На запрос ссылаются DataSetProvider, ClientDataSet и компонент DataSource. На пользовательском интерфейсе TDBLookupListbox получает данные.
Проблема в том, что TDBLookpListbox показывает ВСЕ заметки для всех клиентов.
В сообщениях журнала из приведенного выше кода я вижу, что запрос, похоже, выполняет свою работу правильно.
Любая идея о том, что идет не так?
Так как результат запроса содержит только примечания, правильно отфильтрованные параметром, невозможно, чтобы этот запрос предоставил данные в список.
Поэтому ответ может быть таким, что вы неправильно настроили DBLookupListBox и присвоили ему другой источник данных, который указывает на запрос, который не фильтрует ваши заметки.
Также мы не можем видеть, действительно ли customerNotesQ закрывается, когда вы назначаете значение параметра и открываете запрос. Но если нет, то параметр не будет иметь никакого эффекта.
Других решений пока нет …