powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создать поле в открытом TClientDataset ?
25 сообщений из 33, страница 1 из 2
Создать поле в открытом TClientDataset ?
    #35803484
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Люблю TclientDataset, но не могу никак добиться создания поля в открытом наборе (созданном через CreateDataset, например). Как-то ковырялся в коде, пришел к умозаключению, что это в принципе невозможно из-за проверки на активность и выдаче ошибки в этом случае в функциях создания полей. Или ошибся? Кто-нибудь достигал каких-то в этом результатов? Интересует возможность создания хотя бы калькулируемых полей, про ftData уж и не заикаюсь...
.. на открытом датасете.
.. D7. может что-то в других версиях изменилось?
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803488
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чем смысл данного ?
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803489
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чём проблема закрыть сначала?
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803496
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckА в чём проблема закрыть сначала?

закрыл - потерял данные.
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803497
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне с похожим вопросом помогли тут
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803498
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: V.Borzov
> Здравствуйте!
>
> Люблю TclientDataset,

Напрасно. Есть In-Memory датасеты (если пользуетесь по этой причине). Не
забывайте, что приложение, использующее этот компонент, тянет за собой
MIDAS.DLL.

> но не могу никак добиться создания поля в открытом наборе (созданном через
> CreateDataset, например).

Задлянафига? Нельзя разве создать вычисляемое поле до открытия датасета?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803501
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДжибсА в чем смысл данного ?

В том, что нужно для работы пару калькулируемых полей. или даже тройку. а данные получены из другого датасета, копированием, причем не вручную, когда создаешь сам поля + createdataset, а более-менее универсальным типа такого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 function  ReadDataset(SourceDataset :TDataSet) :OleVariant;
 var   dsp : TDatasetProvider;
 begin 
  Result := NULL;

  dsp := TDatasetProvider.Create( nil );
   try 
     sourcedataset.DisableControls;
      try 
        if  sourcedataset.Active  then  sourcedataset.First; 
       dsp.DataSet := sourcedataset;
       result := dsp.data;
      finally 
       SourceDataSet.EnableControls;
      end 
    finally 
     dsp.Free;
    end ;
 end ;

Тут ничего не поделаешь, кроме как создать эти поля после копирования. До копирования создавать структуру тоже бесполезно.
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803506
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Midas.dll можно и не брать - uses MidasLib

Другое дело, что все поля можно и заранее создать. Что собственно требуется?
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803508
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: miksoft
> Мне с похожим вопросом помогли тут
>

Автор хочет не просто в рантайме, а на открытом датасете такое проделать.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803511
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L

Напрасно. Есть In-Memory датасеты (если пользуетесь по этой причине).


Главный ньюанс - скорость копирования из источника в этот датасет. пример привел выше. Пример работает мухой. все остальные, че видел - тупо копируют по полям перебором. Для образования пойдет, но в промышленности - не катит ИМХО. Все остальное и здесь катит прекрасно и быстро, вот только заданный вопрос в subj пока и смущает.

Senya_L

Не
забывайте, что приложение, использующее этот компонент, тянет за собой
MIDAS.DLL.



uses MidalLib


Senya_L
Задлянафига? Нельзя разве создать вычисляемое поле до открытия датасета?


Чуть выше привел пример.
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803514
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftМне с похожим вопросом помогли тут

Не, нам AdoQuery, совсем другой компонент, к тому же, исходное условие такое, что нет возможности сначала задать структуру, потом скопировать (если только не тупым перебором исходного датасета, что означает потерю скорости в разы или даже десятки раз по сравнению с тем примером, что я написал (readdataset).

В FibDataset, к примеру, даже есть CreateCalcField, точное название не помню. напрямую задачу решает, но у себя.
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803515
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: V.Borzov
> Главный ньюанс - скорость копирования из источника в этот датасет.
> пример привел выше. Пример работает мухой. все остальные, че видел - тупо
> копируют по полям перебором. Для образования пойдет, но в промышленности -
> не катит ИМХО. Все остальное и здесь катит прекрасно и быстро, вот только
> заданный вопрос в subj пока и смущает.
>

У нас с Вами разные TClientDataSet. Дайте мне свой :)
Вообще-то этот компонент прожорливый, зараза. И по использованию пямяти, и
по сетевому трафику.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803517
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заберите данные в один cds. Скопируйте поля (поля а не данные) в другой. Добавьте туда по вкусу вычисляемые. Потом через cds2.Data := cds1.Data передайте. В чём проблема не вижу.
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803518
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L
> Автор: V.Borzov
> Главный ньюанс - скорость копирования из источника в этот датасет.
> пример привел выше. Пример работает мухой. все остальные, че видел - тупо
> копируют по полям перебором. Для образования пойдет, но в промышленности -
> не катит ИМХО. Все остальное и здесь катит прекрасно и быстро, вот только
> заданный вопрос в subj пока и смущает.
>

У нас с Вами разные TClientDataSet. Дайте мне свой :)


Я б сделал свой, да не вышло. Иногда выходит патчик залить в какой-нибудь стандартный компонент и исходник программе подсунуть, иногда нет. fib патчики, для FastReport, для quickreport, черт бы его побрал, для Indy и даже для ActnMan и ActnCtrl прокатило. А здесь, точно не помню, но затык случился, вроде бы, как раз в том куске, что прилинковывается через midaslib (или midas.dll). Полностью переписать разве только если в типа TMYClientDataset. Но по этому пути тоже отлуп случился. Кажется, опять же с тем же самым - неполный доступ к исходникам. В итоге пришел к выводу, что НИЗЗЯ. но надежда умирает последней...


Senya_L
Вообще-то этот компонент прожорливый, зараза. И по использованию пямяти, и
по сетевому трафику.


ПО памяти - не скажу в сравнении. А по трафику - для этого собираюсь использовать другие компоненты. То есть, руку набил пока в использовании его именно как "датасет в памяти". То есть, взял из TFibDataset тупо, по-быстрому скопировал (см.пример) и пошел работать себе дальше. сам TFibDataset уже не нужен. Причины: а) скопировал, и не паришься, пофиг тебе все коннекты и дисконнекты, б) универсализация какая-никакая кода.. Мало ли, придется когда-нибудь уйти с Fib, к примеру..
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803521
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckЗаберите данные в один cds. Скопируйте поля (поля а не данные) в другой. Добавьте туда по вкусу вычисляемые. Потом через cds2.Data := cds1.Data передайте. В чём проблема не вижу.

Это было в попытках решить. Проблема в том, что второй датасет потеряет полностью структуру при попытке копирования из первого.
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803534
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего нигде не теряется. Я добавляю любые поля Calc и InternalCalc и всё работает проблем. Никакая структура не теряется. Другое дело если свовсем разная структура, то естественно копировать руками.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
 unit  Unit25;

 interface 

 uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, Grids, DBGrids, DBClient, DBTables, StdCtrls, Provider;

 type 
  TForm25 =  class (TForm)
    Table1: TTable;
    ClientDataSet1: TClientDataSet;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    ClientDataSet1CustNo: TFloatField;
    ClientDataSet1Company: TStringField;
    ClientDataSet1Addr1: TStringField;
    ClientDataSet1Addr2: TStringField;
    ClientDataSet1City: TStringField;
    ClientDataSet1State: TStringField;
    ClientDataSet1Zip: TStringField;
    ClientDataSet1Country: TStringField;
    ClientDataSet1Phone: TStringField;
    ClientDataSet1FAX: TStringField;
    ClientDataSet1TaxRate: TFloatField;
    ClientDataSet1Contact: TStringField;
    ClientDataSet1LastInvoiceDate: TDateTimeField;
    ClientDataSet1Test: TStringField;
    Button1: TButton;
    DataSetProvider1: TDataSetProvider;
     procedure  ClientDataSet1CalcFields(DataSet: TDataSet);
     procedure  Button1Click(Sender: TObject);
   private 
     { Private declarations } 
   public 
     { Public declarations } 
   end ;

 var 
  Form25: TForm25;

 implementation 

 {$R *.dfm} 

 procedure  TForm25.Button1Click(Sender: TObject);
 begin 
  ClientDataSet1.Data := DataSetProvider1.Data;
 end ;

 procedure  TForm25.ClientDataSet1CalcFields(DataSet: TDataSet);
 begin 
ClientDataSet1Test.Value := 'Всякое';
 end ;

 end .

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
 object  Form25: TForm25
  Left =  0 
  Top =  0 
  Caption = 'Form25'
  ClientHeight =  466 
  ClientWidth =  554 
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = - 11 
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch =  96 
  TextHeight =  13 
   object  DBGrid1: TDBGrid
    Left =  22 
    Top =  114 
    Width =  524 
    Height =  147 
    DataSource = DataSource1
    TabOrder =  0 
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = - 11 
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
   end 
   object  DBGrid2: TDBGrid
    Left =  22 
    Top =  276 
    Width =  487 
    Height =  147 
    DataSource = DataSource2
    TabOrder =  1 
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = - 11 
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
   end 
   object  Button1: TButton
    Left =  452 
    Top =  22 
    Width =  75 
    Height =  25 
    Caption = 'Button1'
    TabOrder =  2 
    OnClick = Button1Click
   end 
   object  Table1: TTable
    Active = True
    DatabaseName = 'DBDEMOS'
    TableName = 'customer.db'
    Left =  142 
    Top =  98 
   end 
   object  ClientDataSet1: TClientDataSet
    Aggregates = <>
    Params = <>
    OnCalcFields = ClientDataSet1CalcFields
    Left =  362 
    Top =  42 
     object  ClientDataSet1Test: TStringField
      FieldKind = fkInternalCalc
      FieldName = 'Test'
      Size =  250 
     end 
     object  ClientDataSet1CustNo: TFloatField
      FieldName = 'CustNo'
     end 
     object  ClientDataSet1Company: TStringField
      FieldName = 'Company'
      Size =  30 
     end 
     object  ClientDataSet1Addr1: TStringField
      FieldName = 'Addr1'
      Size =  30 
     end 
     object  ClientDataSet1Addr2: TStringField
      FieldName = 'Addr2'
      Size =  30 
     end 
     object  ClientDataSet1City: TStringField
      FieldName = 'City'
      Size =  15 
     end 
     object  ClientDataSet1State: TStringField
      FieldName = 'State'
     end 
     object  ClientDataSet1Zip: TStringField
      FieldName = 'Zip'
      Size =  10 
     end 
     object  ClientDataSet1Country: TStringField
      FieldName = 'Country'
     end 
     object  ClientDataSet1Phone: TStringField
      FieldName = 'Phone'
      Size =  15 
     end 
     object  ClientDataSet1FAX: TStringField
      FieldName = 'FAX'
      Size =  15 
     end 
     object  ClientDataSet1TaxRate: TFloatField
      FieldName = 'TaxRate'
     end 
     object  ClientDataSet1Contact: TStringField
      FieldName = 'Contact'
     end 
     object  ClientDataSet1LastInvoiceDate: TDateTimeField
      FieldName = 'LastInvoiceDate'
     end 
   end 
   object  DataSource1: TDataSource
    DataSet = Table1
    Left =  58 
    Top =  64 
   end 
   object  DataSource2: TDataSource
    DataSet = ClientDataSet1
    Left =  170 
    Top =  34 
   end 
   object  DataSetProvider1: TDataSetProvider
    DataSet = Table1
    Left =  262 
    Top =  16 
   end 
 end 
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803536
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L
Вообще-то этот компонент прожорливый, зараза. И по использованию пямяти, и
по сетевому трафику.


То есть, идея такая: если есть стандартный код/компонент, который принципиально не хуже/особо не хуже, то лучше юзать его. Если нет, то лучше юзать какое-нибудь приемлемое бесплатное с открытыми кодами. Если нет, то что-нибудь за деньги, с открытыми кодами. Если нет, то убиться. Если нет, то писать свое.

Пока я на первом "если" в сомнениях мечусь. и только с одним этим вопросом. ну есть еще один обнаруженный мааахонький, некорректная работа с int64, при сортировке кажется. Но обходится, или даже в следующих версиях Delphi, может, пофикшено... Больше проблем не находил. Ну в рамках решаемой задачи "датасет в памяти".

Насчет памяти, опять же - взял таблицу DB формата. Начал копирование. Где-то после копирования трети данных встало с ошибкой. После применения патчика к TClientDataset стало копировать где-то половину, потом встает. Памяти расходуется при этом меньше, чем сама таблица DB имеет. засчет обрезания строк. Результ вполне приемлемый для TClientDataset. Сравнивал с Memdata от Jedi, там получше, но непырципиально.

C MemTable от EhLib не связывался по причине второго "если".
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803559
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Michael Longneck]Ничего нигде не теряется. Я добавляю любые поля Calc и InternalCalc и всё работает проблем. Никакая структура не теряется. Другое дело если свовсем разная структура, то естественно копировать руками.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
[/quot]

Упс, не может быть, не верю! Работает! Как я не догнал....

[SRC delphi] procedure  TForm1.Button1Click(Sender: TObject);
 var  Field :TField;
 begin 
   with  cds1  do   begin 
     with  fielddefs  do 
     begin 
      Clear;
      Add('field1',ftinteger);
     end ;

    createdataset;
    Append;
    FieldByName('field1').AsInteger :=  1 ;
    post;
   end ;

   with  cds2  do 
   begin 

    Field := TIntegerField.Create(Self);
    Field.FieldKind := fkdata;
    Field.FieldName := 'field1';
    Field.dataset := CDS2;

    Field := TIntegerField.Create(Self);
    Field.FieldKind := fkCalculated;
    Field.FieldName := 'field2';
    Field.dataset := CDS2;
     //Fields.Add(Field); 


    data := cds1.data;
   end ;

 end ;

 procedure  TForm1.CDS2CalcFields(DataSet: TDataSet);
 begin 
  dataset.FieldByName('field2').AsInteger :=  2 ;
 end ;
Сенкс, респект!

Владимир.
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803584
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnyDac хорошая библиотека. Но платная. Соответственно при разработках фрилансеру её надо закладывать в стоимость проекта. И прочая.

А с глупыми подростками спорить не надо. После подобной аргументации, обычно, можно сразу переходить к кулачному изложению сути вопроса (ибо статусный поединок и есть скрытая цель такой аргументации).

Правило - к каждой цели - подходящие средства. :)

PS Сорри модераторам, неудержался
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803682
Танцор Пасадобля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L
У нас с Вами разные TClientDataSet. Дайте мне свой :)
Вообще-то этот компонент прожорливый, зараза. И по использованию пямяти, и
по сетевому трафику.

По исползованию памяти и трафику не компонент прожорлив,
а ваши запросы, обратно TClientDataSet отправляет лишь дельту изменений.
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803689
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Танцор Пасадобля
>
> По исползованию памяти и трафику не компонент прожорлив,
> а ваши запросы, обратно TClientDataSet отправляет лишь дельту
> изменений.
>

Я говорю про обычные селект-запросы "в лоб". Используемый в TClientDataSet
механизм передачи и хранения данных неоптимален. В свое время наткнулся на
тормоза с получением большого больших рекордсетов (был молод и тянул на
клиента много строк, обычное дело). Стал лазить по исходникам, понял, что с
большими объемами там лучше не связываться.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803690
Танцор Пасадобля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LСтал лазить по исходникам, понял, что с
большими объемами там лучше не связываться.

Большие объемы - это сколько?
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803705
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Танцор Пасадобля
> Большие объемы - это сколько?
>

"Больше-меньше" - понятие относительное. :)
Лучше вообще не связываться.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803708
Танцор Пасадобля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L
"Больше-меньше" - понятие относительное. :)
Лучше вообще не связываться.

Почему так мрачно? Нормально cds работает если грамотно использовать...
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803716
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Танцор Пасадобля
> Почему так мрачно? Нормально cds работает если грамотно
> использовать...
>

Если грамотно, то все можно к делу приладить.
Но создалось в свое время ощущение (возможно, неправильное), что MIDAS
вообще сама по себе уж слишком узко заточена была. Эдакая наивная идея, что
можно "взять" данные с сервера, изменить/добавить/удалить и отослать дельту.
Не все укладывается в эту схему. Считайте это за религию и что не сумел
приготовить :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создать поле в открытом TClientDataset ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]