Delphi: ошибка «Недопустимый тип поля» с наборами данных master / detail - PullRequest
1 голос
/ 09 ноября 2008

Я спросил о настройке набора данных в памяти с помощью TClientDataset, , и мне сказали, что мне нужно использовать команду «Создать набор данных» в конструкторе форм. Это прекрасно работает, пока я не попытаюсь создать отношение базы данных master-detail. Если у меня есть поле def типа ftDataSet, то выполнение команды «Создать набор данных» (или вызов метода во время выполнения) выдает ошибку «Недопустимый тип поля». Я сделал несколько поисков и обнаружил, что другие люди уже сталкивались с этой проблемой, но никто, кажется, никогда не придумал ответ. Кто-нибудь знает как это исправить?

Ответы [ 3 ]

3 голосов
/ 10 ноября 2008

Вместо того, чтобы помещать ваши детали в столбец ftDataSet, просто используйте уникальное целое число или GUID для ссылки на ключ, и поместите данные детали в другой TClientDataSet и получите этот ключ. Как и в обычной базе данных. Каждый TClientDataSet представляет отдельную таблицу.

1 голос
/ 03 февраля 2009

Ужасная проблема, которая уже стоила мне много времени. Наконец я нашел обходной путь, описанный здесь (спасибо вам, ребята!):

http://www.delphigroups.info/3/6/171869.html

Сводка: виновником являются определения полей основного клиентского набора данных, то есть того, который содержит поля ftDataset. Как только определения полей основного клиентского набора данных не пусты, команда CreateDataSet завершается ошибкой с описанным выше сообщением об ошибке («Недопустимый тип поля»).

Обход: Создайте таблицы основных данных в соответствии с инструкциями, но убедитесь, что определения полей пусты при выполнении CreateDataset:

a) Время разработки: перед тем, как вы выполните «основной набор данных | RightClick | Create DataSet» в форме проектирования, вы должны нажать на основной набор данных, перейти к инспектору объектов, нажать «FieldDefs» и удалить все поля в «FieldDefs». окно. (В самый первый раз, когда вы построили основной набор данных, его там все равно нет, но позже они есть.) Только после этого создайте набор данных. (Я сам попробовал это с Delphi 2007; это работает.)

b) Время выполнения: вызовите [Name of Masterdataset]. FieldDefs.Clear перед тем, как выполнить [Name of Masterdataset] .CreateDataSet. (Я сам не пробовал, но это достоверно описано в указанной выше ссылке.)

Если это было слишком сложно, пожалуйста, посмотрите на вышеупомянутую ссылку.

1 голос
/ 10 ноября 2008

Если вы создаете поле типа ftDataSet, вам нужно определить набор данных, иначе тип недопустим.

Вы можете определить набор данных:

  • выберите поле.
  • выберите свойство ChildDefs и нажмите кнопку [...].
  • добавить поля.

Теперь вы можете создать набор данных. Если только один из потомков не имеет типа ftDataSet, в этом случае вам придется рекурсивно повторять процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...