Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.240.178] |
|
Сообщ.
#1
,
|
|
|
Всем привет!
В моей программе достаточно много вычислений — результаты выводятся в 12 больших табличек (исп-ся cxGrid-ы). Полученные результаты нужно распечатывать в виде отчета (исп. QReport), причем можно будет выбирать желаемые таблицы или печатать все вместе. Для передачи данных из табличек в отчет использую ClientDataSet. В нем определил FieldDefs — поля типа ftDataSet для каждой таблицы, и у каждого свойство ChildDefs с описанием полей этой самой таблицы. Но когда дело дошло до написания кода — я застрял. Никак не могу понять каким образом записывать в ClientDataSet данные из табличек? Пробовал так: ClientDataSet1.FieldDefs[1].ChildDefs[0] := Values[i, j]; Ругается — то несоответствие типов, то индексы списков выходят за пределы и т.п. Самое главное — не соображу, как можно работать с полем из FieldDefs (которое определено как ftDataSet) как с настоящим DataSet-ом (например, добавлять записи)? |
Сообщ.
#2
,
|
|
|
ну если ты создал поле ftDataSet то и работай с им как с датасетом.
with (ClientDataSet1.Fields[0] as TDataSetField).DataSet do begin insert; FieldByName('my_text').AsString := 'Это вложеный дата_сет'; post; end; |
Сообщ.
#3
,
|
|
|
Спасибо за ответ!
Предложенный выше код работает почему-то со всем ClientDataSet, а мне нужно заполнить вложенные датасеты (поля ftDataSet). Поэтому добраться до них у меня получилось только через NestedDataSet: with (ClientDataSet1.Fields[0] as TDataSetField).NestedDataSet do begin insert; FieldByName('my_text').AsString := 'Это вложеный дата_сет'; post; end; Вот только записи во вложенный датасет не добавляются — выходит ошибка «at beginning of table» и после вставки записей всегда -1. |
Сообщ.
#4
,
|
|
|
Цитата S-V-E @ Поэтому добраться до них у меня получилось только через NestedDataSet: блин. моя ошибка. Цитата S-V-E @ Вот только записи во вложенный датасет не добавляются — выходит ошибка «at beginning of table» и после вставки записей всегда -1. Может что то не так делаешь. вот пример как динамически создать записи с вложенным дата сетом begin ClientDataSet1.FieldDefs.Add('id', ftAutoInc); // добавляем поля в "родительский" датасет ClientDataSet1.FieldDefs.Add('child_dataset', ftDataSet); with ClientDataSet1.FieldDefs[1].ChildDefs do // добавляем поля в "дочерний" датасет begin Add('id', ftAutoInc); Add('name', ftString, 20); end; ClientDataSet1.CreateDataSet; // создаем датасет. ClientDataSet1.Insert; // создаем строчку в родительском датасете with TDataSetField(ClientDataSet1.Fields[1]).NestedDataSet do repeat Insert; Fields[1].AsString := 'Бла бла бла'; Post; until (RecNo > 9); // набиваем дочерний датасет десятьма записями ClientDataSet1.Post; // сохраняем данные в родительском датасете /// (это можно сделать и до инсертов в дочернем, но по окончании добавления в дочерний, родительский останется в режиме редактирования) ClientDataSet1.Insert; // добавляем вторую строчку with TDataSetField(ClientDataSet1.Fields[1]).NestedDataSet do repeat Insert; Fields[1].AsString := 'Вторая строка с вложеным дата сетом'; Post; until (RecNo > 9); ClientDataSet1.Post; end; Добавлено пс. как практика показывает то ClientDataSet глючит насчет внутренних датасетов (на больших таблицах мне не удавалось получить датасет с симнадцатой строчки. почему именно 16 первых работало покрыто мраком), поэтому не переусердствуй. ))) пс. пс. но таблицы у меня были и впрям большие (грузилось из xml файла 30-70 мб). |
Сообщ.
#5
,
|
|
|
Ха! Я же не создавал записи в самом ClientDataSet! Ну я и … Теперь все нормально, проверил — работает как надо Спасибо большое за ответы!
Цитата на больших таблицах мне не удавалось получить датасет с симнадцатой строчки спасибо за житейский совет , учту на будущее, но у меня их всего лишь 12 Цитата но таблицы у меня были и впрям большие (грузилось из xml файла 30-70 мб) у меня каждая максимум 1,5-2 Мб Еще раз спасибо за ответы! |