Несколько таблиц в TClientDataset? - PullRequest
1 голос
/ 21 сентября 2008

Можно ли поместить результаты нескольких запросов по нескольким таблицам в TClientDataset?

Просто что-то вроде

SELECT * from t1;
SELECT * from t2;
SELECT * from t3;

Я не могу найти способ заставить провайдера данных (SetProvider) извлекать результаты из более чем одной таблицы за раз.

Ответы [ 3 ]

12 голосов
/ 22 сентября 2008

ClientDatasets может содержать поля, которые сами являются другими наборами данных. Поэтому, если вы хотите создать три таблицы в одном наборе данных, создайте три ClientDatasets, содержащие три требуемых набора результатов, и затем вы можете поместить их в один ClientDataSet.

Эта статья:

http://dn.codegear.com/article/29001

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

"Создание структуры ClientDataSet's во время выполнения с использованием TFields"

4 голосов
/ 21 сентября 2008

Единственным способом было бы присоединиться к столам. Но тогда вы должны предоставить критерии объединения через соединенные внешние ключи.

select * from t1, t2, t3 where t1.key = t2.key and t2.key = t3.key;

Теперь предположим, что вы придумали ключ (например, LineNr), который бы позволил такое соединение. Затем вы можете использовать полное внешнее объединение для включения всех записей (важно, если не все таблицы имеют одинаковое количество строк). Но это как-то взломать. Не используйте auto_number для ключа, так как он не использует ключи повторно и, следовательно, имеет тенденцию оставлять дыры в нумерации, в результате чего многие строки заполнены только частично.

Если вы хотите заполнить набор данных клиента из нескольких таблиц, имеющих одинаковый набор полей, вы можете использовать оператор UNION для этого. Это будет использовать одни и те же столбцы и объединить все строки в одну таблицу.

0 голосов
/ 21 сентября 2008

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

...