На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> ClientDataSet и поля типа ftDataSet , для создания отчета в QReport
    Всем привет!

    В моей программе достаточно много вычислений — результаты выводятся в 12 больших табличек (исп-ся cxGrid-ы). Полученные результаты нужно распечатывать в виде отчета (исп. QReport), причем можно будет выбирать желаемые таблицы или печатать все вместе. Для передачи данных из табличек в отчет использую ClientDataSet. В нем определил FieldDefs — поля типа ftDataSet для каждой таблицы, и у каждого свойство ChildDefs с описанием полей этой самой таблицы.
    Но когда дело дошло до написания кода — я застрял. Никак не могу понять каким образом записывать в ClientDataSet данные из табличек? Пробовал так:
    ExpandedWrap disabled
      ClientDataSet1.FieldDefs[1].ChildDefs[0] := Values[i, j];

    Ругается — то несоответствие типов, то индексы списков выходят за пределы и т.п. Самое главное — не соображу, как можно работать с полем из FieldDefs (которое определено как ftDataSet) как с настоящим DataSet-ом (например, добавлять записи)?
      ну если ты создал поле ftDataSet то и работай с им как с датасетом.
      ExpandedWrap disabled
          with (ClientDataSet1.Fields[0] as TDataSetField).DataSet do
          begin
            insert;
            FieldByName('my_text').AsString := 'Это вложеный дата_сет';
            post;
          end;
        Спасибо за ответ!

        Предложенный выше код работает почему-то со всем ClientDataSet, а мне нужно заполнить вложенные датасеты (поля ftDataSet). Поэтому добраться до них у меня получилось только через NestedDataSet:
        ExpandedWrap disabled
          with (ClientDataSet1.Fields[0] as TDataSetField).NestedDataSet do
            begin
              insert;
              FieldByName('my_text').AsString := 'Это вложеный дата_сет';
              post;
            end;

        Вот только записи во вложенный датасет не добавляются — выходит ошибка «at beginning of table» и после вставки записей всегда -1.
          Цитата S-V-E @
          Поэтому добраться до них у меня получилось только через NestedDataSet:

          блин. моя ошибка.
          Цитата S-V-E @
          Вот только записи во вложенный датасет не добавляются — выходит ошибка «at beginning of table» и после вставки записей всегда -1.

          Может что то не так делаешь. вот пример как динамически создать записи с вложенным дата сетом

          ExpandedWrap disabled
            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 мб).
            Ха! :crazy: Я же не создавал записи в самом ClientDataSet! Ну я и :wall: … Теперь все нормально, проверил — работает как надо :) Спасибо большое за ответы!
            Цитата
            на больших таблицах мне не удавалось получить датасет с симнадцатой строчки

            спасибо за житейский совет :) , учту на будущее, но у меня их всего лишь 12 :blush:
            Цитата
            но таблицы у меня были и впрям большие (грузилось из xml файла 30-70 мб)

            у меня каждая максимум 1,5-2 Мб
            Еще раз спасибо за ответы! :thanks:
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0272 ]   [ 16 queries used ]   [ Generated: 27.04.24, 13:57 GMT ]