powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создать поле в открытом TClientDataset ?
33 сообщений из 33, показаны все 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
Создать поле в открытом TClientDataset ?
    #35803769
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L

Не все укладывается в эту схему. Считайте это за религию и что не сумел
приготовить :)



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

ADO и IBX в зависимости от СУБД. Хватает. Когда их перестает хватать и ручки
тянутся к средствам кэширования навроде CDS - это первый признак
проктологии.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803987
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот примерный результат:
Код: 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.
 function  ReadDataSet(DestinationCDS :TClientDataSet;
                     SourceDataSet :TDataSet;
                     AddField_Names:  array   of   string ;
                     AddField_Types : array   of  TFieldType ;
                     AddField_Kinds : array   of  TFieldKind;
                     AddField_Sizes : array   of  Integer
                     ) :Boolean;

 var  iC :Integer;
    k :Integer;
    Field :TField;
 begin 
   iC := High(AddField_Names);
    if  (iC <> High(AddField_Names))
       or  (iC <> High(AddField_Types))
       or  (iC <> High(AddField_Kinds))
    then   raise  Exception.Create('Íåñîîòâåòñòâèå êîëè÷åñòâà ýëåìåíòîâ â ñïèñêàõ');

   DestinationCDS.DisableControls;
    try 
      if  iC>= 0 
      then   begin 
        if   not  SourceDataSet.Active  then  SourceDataSet.Open;

       DestinationCDS.Close;
       DestinationCDS.Fields.Clear;

        with  SourceDataSet  do 
        for  k :=  0   To  FieldCount- 1   do 
        begin 
         Field := TFieldClass(Fields[k].classtype).Create(DestinationCDS.Owner);  //  defaultfieldClasses[SourceDataSet.Fields[k].DAtatype].Create(DestinationCDS.Owner); 
         Field.FieldName := Fields[k].FieldName;
         Field.Size := Fields[k].Size;
         Field.DataSet := destinationcds;
        end ;

        for  k :=  0   To  iC  do 
        begin 
         Field := defaultfieldClasses[addfield_types[k]].Create(DestinationCDS.Owner);
         Field.FieldName := AddField_Names[k];
         Field.FieldKind := addField_kinds[k];
          if  High(addField_Sizes[k]) >= ic
          then  Field.Size := AddField_Sizes[k];

         Field.DAtaset := DestinationCDS;
        end ;

      end ;


     DestinationCDS.data := REadDAtaset(SourceDataset);
    finally 
     DestinationCDS.EnableControls;
    end ;
   Result := True;
 end ;


 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 ;


---------------------------------


 procedure  TForm1.Button1Click(Sender: TObject);
 var  Field :TField;
 begin 
  Table1.Open;
  ReadDataSet(CDS2,Table1, ['Field2','Field3'],[ftInteger,ftString],[fkInternalCalc,fkCalculated],[ 0 , 100 ]);
 end ;

 procedure  TForm1.CDS2CalcFields(DataSet: TDataSet);
 begin 
  dataset.FieldByName('field2').AsInteger := dataset.recno;
  dataset.FieldByName('field3').AsString := 'Recno = '+IntToStr(dataset.recno);
 end ;



Вроде работает :)
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803991
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V.Borzov
Код: plaintext
1.
2.
    then   raise  Exception.Create('Íåñîîòâåòñòâèå êîëè÷åñòâà ýëåìåíòîâ â ñïèñêàõ');




then raise Exception.Create('Несоответствие количества элементов в списках');

Остальное можно не переводить
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803995
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создавая поля не забудьте выставить свойство .Name для полей. Не помню какие, но с этим были проблемы.
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35803999
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ньюанс:

Код: plaintext
1.
2.
3.
4.
   ...
   Result := DestinationCDS.Active;  // true; 
 end ;


хоть и бессмысленный, но рука чешется...
...
Рейтинг: 0 / 0
Создать поле в открытом TClientDataset ?
    #35861048
Extender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
 unit  FieldInfo;

 interface 

 uses 
  Windows, Messages, SysUtils, Classes, Db, DbClient;

 type 
  PFieldProps = ^TFieldProps;
  TFieldProps =  record 
    FieldName:  string ;
    ClassType: TFieldClass;
    MemoryStream: TMemoryStream;
    LookUpDataSet: TDataSet;
   end ;

   {New: Add Calculated fields} 
 procedure  AddCalculatedFields(Dataset: TDataSet;  const  FieldsNames,
  FieldsTypes:  array   of   string );
 {New: Assign data and Fields to new structure} 
 {With this function you can add Data Field (not calculated) to client dataset
but this function is slow and heavy} 
 procedure  AssignData(List: TList; Dataset: TClientDataSet);
 {Streams Fields List Clear} 
 procedure  ClearAllFieldsInfo(List: TList);
 {New: Copy Old Data in Modified Dataset} 
 procedure  CopyDatasetData(Source, Target: TDataSet);
 {New: delete an Item from List} 
 procedure  DeleteField(List: TList; index: integer);
 {Get information about Field definition into Dataset and then put into List} 
 procedure  GetAllFieldsInfo(List: TList; DataSet: TDataSet);
 {Get information about one Field and then put into List} 
 procedure  GetFieldInfo(List: TList; Field: TField);
 {New:  get the FieldIndex of Item} 
 function  GetFieldIndex(List: TList; FieldName:  string ): integer;
 {New:  get the FieldName of Item} 
 function  GetFieldName(List: TList; index: integer):  string ;
 {Get information about Field definition into Stream List and then put into Dataset} 
 procedure  SetAllFieldsInfo(List: TList; DataSet: TDataSet);
 {Field Classes register} 
 procedure  RegClasses;
 {Field Classes Unregister} 
 procedure  UnRegClasses;

 implementation 

 uses 
  Variants;

 procedure  AddCalculatedFields(Dataset: TDataSet;  const  FieldsNames,
  FieldsTypes:  array   of   string );
 var 
  List: TList;
  i: integer;
  oField: TField;
  clFieldClass: TFieldClass;
 begin 
   if   not  DataSet.Active  then 
     raise  Exception.Create('I can not create calculated Fields when dataset is closed' + # 13 
      + 'with function AddCalculatedFields')
   else 
   begin 
    List := TList.Create;
    GetAllFieldsInfo(List, DataSet);
     for  i := Low(FieldsNames)  to  High(FieldsNames)  do 
       if   not  Assigned(Dataset.FindField(FieldsNames))  then 
       begin 
        clFieldClass := TFieldClass(GetClass(FieldsTypes[i]));
        oField := clFieldClass.Create(DataSet);
        oField.FieldName := FieldsNames[i];
        oField.Calculated := True;
         if  oField  is  TStringField  then 
          oField.Size :=  100 ;  [i]{!!!} 
        oField.FieldKind := fkInternalCalc;
        GetFieldInfo(List, oField);
        oField.Free;
       end ;
    DataSet.Close;
    SetAllFieldsInfo(List, DataSet);
    ClearAllFieldsInfo(List);
    List.Free;
    DataSet.Open;
   end ;
 end ;

 procedure  AssignData(List: TList; Dataset: TClientDataSet);
 var 
  NewDs: TClientDataSet;
 begin 
  DataSet.DisableControls;
  NewDs := TClientDataSet.Create( nil );
  SetAllFieldsInfo(List, NewDs);
  NewDs.CreateDataSet;
  CopyDatasetData(Dataset, NewDs);
  Dataset.Data := Null;
  SetAllFieldsInfo(List, DataSet);
  Dataset.Data := NewDs.Data;
  NewDs.Data := Null;
  NewDs.Free;
  DataSet.EnableControls;
 end ;

 procedure  ClearAllFieldsInfo(List: TList);
 var 
  i: Integer;
 begin 
   {Free record in each element of list} 
   for  i :=  0   to  List.Count -  1   do 
   begin 
    TFieldProps(List^).MemoryStream.Free;
    TFieldProps(List[i]^).ClassType :=  nil ;
    TFieldProps(List[i]^).LookUpDataSet :=  nil ;
    Dispose(List[i]);
   end ;
   [i]{Clear the List} 
  List.Clear;
 end ;

 procedure  CopyDatasetData(Source, Target: TDataSet);
 type 
  TSourceTargetFields =  array [ 0 .. 1 ]  of  TField;
 var 
  i, index: Integer;
  aFields:  array   of  TSourceTargetFields;
  oField: TField;
 begin 
   if   not  Source.Active  then 
    Source.Active := True;
   if   not  Target.Active  then 
    Target.Active := True;
   for  i :=  0   to  Source.FieldCount -  1   do 
   begin 
    oField := Target.FindField(Source.Fields.FieldName);
     if  oField <>  nil   then 
     begin 
      index := High(aFields) +  1 ;
      SetLength(aFields, index +  1 );
      aFields[index][ 0 ] := Source.Fields[i];
      aFields[index][ 1 ] := oField;
     end ;
   end ;

  Source.First;
   while   not  Source.Eof  do 
   begin 
    Target.Insert;
     for  i :=  0   to  High(aFields)  do 
     begin 
      aFields[i][ 1 ].Value := aFields[i][ 0 ].Value;
     end ;
    Target.Post;
    Source.Next;
   end ;
 end ;

 procedure  DeleteField(List: TList; index: integer);
 begin 
   if  index < List.Count  then 
   begin 
    TFieldProps(List[index]^).MemoryStream.Free;
    TFieldProps(List[index]^).ClassType :=  nil ;
    TFieldProps(List[index]^).LookUpDataSet :=  nil ;
    Dispose(List[index]);
    List.Delete(index);
   end ;
 end ;

 procedure  GetAllFieldsInfo(List: TList; DataSet: TDataSet);
 var 
  i: Integer;
  Field: TField;
 begin 
   for  i :=  0   to  DataSet.Fields.Count -  1   do 
   begin 
    Field := DataSet.Fields[i];
     [i]{Put Field information into list} 
    GetFieldInfo(List, Field)
   end ;
 end ;

 procedure  GetFieldInfo(List: TList; Field: TField);
 var 
  FieldProps: PFieldProps;
  i: integer;
 begin 
  New(FieldProps);

   {FieldName is necesary to compare if exist into the list} 
  FieldProps^.FieldName := Field.FieldName;
  FieldProps^.ClassType := TFieldClass(Field.ClassType);
  FieldProps^.MemoryStream := TMemoryStream.Create;
  FieldProps^.MemoryStream.WriteComponent(Field);
   {LookUpDataSet is necesary because is a pointer and WriteComponent do not keep this information} 
  FieldProps^.LookUpDataSet := Field.LookupDataSet;

   for  i :=  0   to  List.Count -  1   do 
   begin 
     if  TFieldProps(List^).FieldName = FieldProps^.FieldName  then 
     begin 
       [i]{if exist into list then delete it} 
      TFieldProps(List^).MemoryStream.Free;
      TFieldProps(List[i]^).ClassType :=  nil ;
      TFieldProps(List[i]^).LookUpDataSet :=  nil ;
      Dispose(List[i]);
      List.Delete(i);
      Break;
     end ;
   end ;

   [i]{Add information into the list} 
  List.Add(FieldProps);
 end ;

 function  GetFieldIndex(List: TList; FieldName:  string ): integer;
 var 
  i: integer;
 begin 
  result := - 1 ;
   for  i :=  0   to  List.Count -  1   do 
   begin 
     if  AnsiCompareText(PFieldProps(List).FieldName, FieldName) =  0   then 
     begin 
      result := i;
      Break;
     end ;
   end ;
 end ;

 function  GetFieldName(List: TList; index: integer):  string ;
 begin 
   if  index < List.Count  then 
    result := PFieldProps(List[index]).FieldName
   else 
    result := '';
 end ;

 procedure  SetAllFieldsInfo(List: TList; DataSet: TDataSet);
 var 
  i: Integer;
  LocalField: TField;
  FieldClass: TFieldClass;
  SourceInfo: TMemoryStream;
 begin 
   if  DataSet.Active  then 
    DataSet.Active := False;

   [i]{se recorre toda la lista de definiciones de campos} 
  DataSet.Fields.Clear;
  DataSet.FieldDefs.Clear;

   {Add all List Field definition into List to DataSet} 
   for  i :=  0   to  List.Count -  1   do 
   begin 
     {Get Correct Class Type} 
    FieldClass := TFieldProps(List^).ClassType;

     [i]{if Class exists} 
     if  FieldClass <>  nil   then 
     begin 
       {Goto the first position of stream} 
      SourceInfo := TFieldProps(List^).MemoryStream;
      SourceInfo.Seek( 0 , soFromBeginning);

       [i]{Create Field with Dataset} 
      LocalField := FieldClass.Create(DataSet);
       {Set Field information} 
      LocalField := TField(SourceInfo.ReadComponent(LocalField));
       {Assign DataSet to Field} 
      LocalField.DataSet := DataSet;
      LocalField.LookupDataSet := TFieldProps(List^).LookUpDataSet;

       [i]//      if FieldClass=TStringField then LocalField.Size:=100; {!!!} 
     end ;
   end ;
 end ;

 procedure  RegClasses;
 var 
  AFieldClasses:  array [ 0 .. 25 ]  of  TPersistentClass;
 begin 
  AFieldClasses[ 0 ] := TADTField;
  AFieldClasses[ 1 ] := TAggregateField;
  AFieldClasses[ 2 ] := TArrayField;
  AFieldClasses[ 3 ] := TAutoIncField;
  AFieldClasses[ 4 ] := TBCDField;
  AFieldClasses[ 5 ] := TBinaryField;
  AFieldClasses[ 6 ] := TBlobField;
  AFieldClasses[ 7 ] := TBooleanField;
  AFieldClasses[ 8 ] := TBytesField;
  AFieldClasses[ 9 ] := TCurrencyField;
  AFieldClasses[ 10 ] := TDateField;
  AFieldClasses[ 11 ] := TDataSetField;
  AFieldClasses[ 12 ] := TDateTimeField;
  AFieldClasses[ 13 ] := TFloatField;
  AFieldClasses[ 14 ] := TGraphicField;
  AFieldClasses[ 15 ] := TIntegerField;
  AFieldClasses[ 16 ] := TLargeintField;
  AFieldClasses[ 17 ] := TMemoField;
  AFieldClasses[ 18 ] := TNumericField;
  AFieldClasses[ 19 ] := TObjectField;
  AFieldClasses[ 20 ] := TReferenceField;
  AFieldClasses[ 21 ] := TSmallintField;
  AFieldClasses[ 22 ] := TStringField;
  AFieldClasses[ 23 ] := TTimeField;
  AFieldClasses[ 24 ] := TVarBytesField;
  AFieldClasses[ 25 ] := TWordField;
  RegisterClasses(AFieldClasses);
 end ;

 procedure  UnRegClasses;
 var 
  AFieldClasses:  array [ 0 .. 25 ]  of  TPersistentClass;
 begin 
  AFieldClasses[ 0 ] := TADTField;
  AFieldClasses[ 1 ] := TAggregateField;
  AFieldClasses[ 2 ] := TArrayField;
  AFieldClasses[ 3 ] := TAutoIncField;
  AFieldClasses[ 4 ] := TBCDField;
  AFieldClasses[ 5 ] := TBinaryField;
  AFieldClasses[ 6 ] := TBlobField;
  AFieldClasses[ 7 ] := TBooleanField;
  AFieldClasses[ 8 ] := TBytesField;
  AFieldClasses[ 9 ] := TCurrencyField;
  AFieldClasses[ 10 ] := TDateField;
  AFieldClasses[ 11 ] := TDataSetField;
  AFieldClasses[ 12 ] := TDateTimeField;
  AFieldClasses[ 13 ] := TFloatField;
  AFieldClasses[ 14 ] := TGraphicField;
  AFieldClasses[ 15 ] := TIntegerField;
  AFieldClasses[ 16 ] := TLargeintField;
  AFieldClasses[ 17 ] := TMemoField;
  AFieldClasses[ 18 ] := TNumericField;
  AFieldClasses[ 19 ] := TObjectField;
  AFieldClasses[ 20 ] := TReferenceField;
  AFieldClasses[ 21 ] := TSmallintField;
  AFieldClasses[ 22 ] := TStringField;
  AFieldClasses[ 23 ] := TTimeField;
  AFieldClasses[ 24 ] := TVarBytesField;
  AFieldClasses[ 25 ] := TWordField;
  UnRegisterClasses(AFieldClasses);
 end ;

 initialization 
  RegClasses;

 finalization 
  UnRegClasses;
 end .
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Создать поле в открытом TClientDataset ?
    #39761854
BasilCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типа так работает:
Код: pascal
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.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
begin

  CDS2 := TClientDataSet.Create(nil);
// &#231;&#228;&#229;&#241;&#252; &#228;&#238;&#225;&#224;&#226;&#232;&#242;&#252; &#234;&#238;&#228; &#228;&#238;&#225;&#224;&#226;&#235;&#229;&#237;&#232;&#255; &#228;&#240;&#243;&#227;&#232;&#245; &#239;&#238;&#235;&#229;&#233; ...

 With CDS2 do
  begin
// 1
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'NUMBER_LIST';
    end;
// 2
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftString;
     Size:=20;
     Name := 'NUMBER_SAKAS';
    end;
// 3
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'TIPORASMER_H_OCNOVI';
    end;
// 4
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftString;
     Size:=20;
     Name := 'TOLCHINA_NAPLAVKI';
    end;
// 5
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftString;
     Size:=20;
     Name := 'TIP_LENTI';
    end;
// 6
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'DLINA';
    end;
// 7
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'CHIRINA';
    end;
// 8
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftString;
     Size:=20;
     Name := 'MARKA_OCNOVI';
    end;
// 9
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftString;
     Size:=20;
     Name := 'TIP_MARKA_LENTI';
    end;
// 10
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftDate;
     Name := 'DATA_SADANIJA';
    end;
// 11
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftTime;
     Name := 'VREMJA_SADANIJA';
    end;

// 12
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftMemo;
     Size:=240;
     Name := 'OPICANIE';
    end;

// 13
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftGraphic;
     Size:=240;
     Name := 'FOTO';
    end;
// 14
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'USTANOVL_U';
    end;

// 15
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'USTANOVL_A';
    end;
// 16
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'SYPPORT_N';
    end;
// 17
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'Mode_Napl';
    end;
// 18
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'X_L1';
    end;
// 19
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'A_L';
    end;
// 20
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'B_L';
    end;
// 21
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'Y_L1';
    end;
// 22
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'R_R';
    end;
// 23
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'XY_NUMBER';
    end;
// 24
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := '_ZIKL';
    end;
// 25
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'NOMER_MACHINE';
    end;
// 26
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftInteger;
     Name := 'NOMER_MACHINE_VIPOL';
    end;
// 27
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftGraphic;
     Size:=240;
     Name := 'PLAN_LISTA';
    end;
// 28
   With FieldDefs.AddFieldDef do
    begin
     DataType := ftString;
     Size:=20;
     Name := 'CVET';
    end;


   CreateDataSet;
   SaveToFile('C:\CLX_CLIENT_SERVER\csd\SAKAS2.cds');
  end;

end;


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


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