Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > XML в DBGrid


Автор: Rodman 9.11.2006, 12:24
Дароф.

Web - services VS Client...

У меня есть функция которая формирует XML файл... его я записываю в TStream или в TFileStream (как лучше пока не знаю)....

как мне из TStream или TFileStream вывести данные в DBGrid??? smile  smile  smile  smile 


Спасибо...

Автор: Akella 10.11.2006, 09:56
попробуй подключить MemoryDataSet к гриду, а уж в MemoryDataSet загружай данные.
MemoryDataSet - это условное название, я имел ввиду виртуальную таблицу - таблицу в памяти, есть такие компоненты, например в библиотечке EhLib, JEDDI, DevExpress.

Автор: Rodman 10.11.2006, 11:04
Akella, у меня есть компоненты JEDI - это то что ты написал??? я посмотрю в них... но мало понял, что надо сделать... smile 

Автор: Akella 10.11.2006, 13:34
кидаешь на форму MemoryDataset, создаёшь в нём нужные поля, подключаешь к гриду. Во время выполнения приложения загружаешь данные в MemoryDataset из файла XML. Если есть функция, которая формирует XML, то должна быть функция чтения из файла.  Я имею ввиду, что ты же знаешь формат и содержимое создаваемого тобой файла.

Автор: Rodman 10.11.2006, 18:32
ну файла у меня типа
Код

<TagGlobe>
   <Items>
         <IDProduct>00001</IDProduct>
         <GroupProduct>Игрушки</GroupProduct>  
         <DescProduct>Для взрослых</DescProduct>  
         <OrgProduct>Красный Буйвол</OrgProduct>  
   </Items>
   <Items>...  </Items>
   <Items>...  </Items>
   <Items>...  </Items>
...
</TagGlobe>


Разпарсить файл я могу с помощью - TXMLDocument...

пример на Delphi можешь показать как в TDBGrid вывести??? 

Автор: Akella 10.11.2006, 19:06
при парсинге нужно добавлять данные в таблицу и всё, ничего сложного.
В MemoryData создай поля в дизайнере, назначь им тип и всё такое.
а потом заполняй его
Код

MemoryData.active := true;

...
MemoryData.append;
MemoryData.FieldByName('Field1').AsString := присваиваешь данные из парсинга
MemoryData.FieldByName('Field2').AsString := присваиваешь данные из парсинга
MemoryData.FieldByName('Field3').AsString := присваиваешь данные из парсинга
MemoryData.post;

Автор: Rodman 10.11.2006, 19:18
Я правильно понял...

Код

MemoryData.append;// открываю на добавление
...// заношу
MemoryData.post; // добавляю..
 smile 

Автор: Rodman 11.11.2006, 18:43
 smile 

Автор: Akella 13.11.2006, 11:35
правильно

Автор: Rodman 13.11.2006, 11:51
Akella,  smile  smile  smile 
Последнее...

Вот написал как было написано
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, JvMemoryDataset, Grids, DBGrids, JvExDBGrids,
  JvDBGrid, XMLIntf, XMLDoc, XMLDom, MSXMLDom, JvComponentBase, HTTPApp,
  DBWeb;

type
  TForm1 = class(TForm)
    JvDBGrid1: TJvDBGrid;
    JvMemoryData2: TJvMemoryData;
    Button1: TButton;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DataSetTableProducer1: TDataSetTableProducer;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
    NameNode: IXMLNode;
    XMLDocument: TXMLDocument;
begin
  XMLDocument := TXMLDocument.Create(Self);
  try
    XMLDocument.XML.LoadFromFile('File.xml');
    NullStrictConvert := False;
    NullAsStringValue := 'Empty';
    XMLDocument.Active:=True;
    NameNode:=XMLDocument.DocumentElement;
    JvMemoryData2.Active:=True;
    JvMemoryData2.EmptyTable;
    for i := 0 to NameNode.ChildNodes.Count - 1 do
    begin
      JvMemoryData2.Append;
      //пробую так
      JvMemoryData2.FieldValues['F1']:=NameNode.ChildNodes.Nodes[i].ChildValues['IDProduct'];      //JvMemoryData2.FieldByName('F1').Value:=NameNode.ChildNodes.Nodes[i].ChildValues['IDProduct'];
      // и так
      JvMemoryData2.FieldByName('F2').Value:=NameNode.ChildNodes.Nodes[i].ChildValues['GroupProduct'];
      JvMemoryData2.FieldByName('F3').Value:=NameNode.ChildNodes.Nodes[i].ChildValues['DescProduct'];
      JvMemoryData2.FieldByName('F4').Value:=NameNode.ChildNodes.Nodes[i].ChildValues['OrgProduct'];
      JvMemoryData2.Post;
    end
  finally
    XMLDocument.Free;
  end;
  DataSource1.DataSet:=JvMemoryData2;
  JvMemoryData2.Open;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  JvMemoryData2.Free;
end;

end.


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

Что не так??? smile  smile 

Горю...

Автор: Rodman 13.11.2006, 13:52
 smile 

Автор: Akella 13.11.2006, 15:12
Rodman, ну ты даёшь, а ты поля создал? Куда пихаешь данные? откуда Delphi знать какие тебе поля нужны?
Щёлкни по JvMemoryData дважды и создаый нужные поля.


читал?  smile 
Цитата(Akella @  10.11.2006,  19:06 Найти цитируемый пост)
В MemoryData создай поля в дизайнере, назначь им тип и всё такое.


Автор: Rodman 13.11.2006, 15:18
Я создал поля F1, F2, F3, F4...

исходник видел???

Добавлено @ 15:23 
Только не дважды клацал на него, а в поле TFieldDef создал их...

Автор: Akella 13.11.2006, 15:27
внимание, прочти ещё раз:

Цитата(Akella @  13.11.2006,  15:12 Найти цитируемый пост)
Щёлкни по JvMemoryData дважды и создаый нужные поля.


Добавлено @ 15:28 
перед этим удали всё из FieldDefs

Автор: Rodman 13.11.2006, 15:36
Код

object Form1: TForm1
  Left = 396
  Top = 203
  Width = 362
  Height = 304
  BorderIcons = [biSystemMenu]
  Caption = 'XML to DBGrid (with the help of JEDI components)'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnClose = FormClose
  PixelsPerInch = 96
  TextHeight = 13
  object JvDBGrid1: TJvDBGrid
    Left = 0
    Top = 0
    Width = 354
    Height = 120
    Align = alTop
    DataSource = DataSource1
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    SelectColumnsDialogStrings.Caption = 'Select columns'
    SelectColumnsDialogStrings.RealNamesOption = '[With the real field name]'
    SelectColumnsDialogStrings.OK = '&OK'
    SelectColumnsDialogStrings.NoSelectionWarning = 'At least one column must be visible!'
    EditControls = <>
    RowsHeight = 17
    TitleRowHeight = 17
  end
  object Button1: TButton
    Left = 136
    Top = 128
    Width = 75
    Height = 25
    Caption = 'Load'
    TabOrder = 1
    OnClick = Button1Click
  end
  object DBGrid1: TDBGrid
    Left = 0
    Top = 155
    Width = 354
    Height = 120
    Align = alBottom
    DataSource = DataSource1
    TabOrder = 2
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
  end
  object JvMemoryData2: TJvMemoryData
    FieldDefs = <
      item
        Name = 'F1'
        DataType = ftWideString
      end
      item
        Name = 'F2'
        DataType = ftWideString
      end
      item
        Name = 'F3'
        DataType = ftWideString
      end
      item
        Name = 'F4'
        DataType = ftWideString
      end>
    Left = 88
    Top = 128
  end
  object DataSource1: TDataSource
    Left = 240
    Top = 128
  end
  object DataSetTableProducer1: TDataSetTableProducer
    Left = 312
    Top = 128
  end
end


вот настройки.... поля в FieldDefs... это не то что надо???

Попробую по твоему.. еще раз....
Цитата(Akella @  13.11.2006,  15:12 Найти цитируемый пост)
Щёлкни по JvMemoryData дважды и создаый нужные поля.


Автор: Akella 13.11.2006, 15:36
Цитата(Rodman @  13.11.2006,  15:36 Найти цитируемый пост)
вот настройки.... поля в FieldDefs... это не то что надо???

нет

Добавлено @ 15:37 
вместо того, чтобы сюда писАть, уже давно переделал бы

Добавлено @ 15:40 
у меня всё заработало  smile

Добавлено @ 15:41 
сам посмотри

Добавлено @ 15:42 
вопрос считаю решённым, не забудь пометить  smile 

Автор: Rodman 13.11.2006, 15:50
Akella,  smile  Сенкс.... smile  smile 

Все ОК...  Просто думал что кнопки в окне на двойном нжатии не активні, следовательно и не подберешся...

Сорри.....


Тема закрыта...

Автор: rek74 28.1.2008, 13:53
JVMemoryData1.Active:=true;
JVMemorydata1.Append;
JVMemoryData1.FieldByName('1').AsString:=Temp;
JVMemoryData1.Post;

выдает database not in edit or insert mode




Автор: rek74 28.1.2008, 14:15
Сори разобрался вроде уже сам.

Автор: rek74 25.2.2008, 17:31
Возник следующий вопрос. Как оптимально искать информацию в JvMemoryData. На данный момент я делаю все простым перебором. Однако нужно переписать программу чтобы данные выдавались по разным притериям, для каждого критерия придумывать свой алгоритм немного неудобно smile

Автор: Rodman 25.2.2008, 17:43
щас под рукой нету... но первое что приходит в голову - э то фильтры!

Автор: rek74 26.2.2008, 05:17
Как вывести тогда с помощью фильтров все нужные данные?

Автор: Rodman 26.2.2008, 10:26
как на счет поиска..

посмотри в хелпе пример работы на компоненте TTable...

Автор: rek74 26.2.2008, 11:49
Прблема у меня такая вообщем , в таблице данные расположенны примерно так 
A B C 1
A B C  3

A B V  2
A B L   2


Когда я вывожу рапорт подробный все ясно , по критериям A B C у меня отсортированы данные. Однако нада также вывести отсортированый список по критериям A B, 
пробегая по таблице я получаю  A B 1; A B 3, A B 2 что не очень мне нравится ) До этого я с таблицами не работал вообще, поэтому не очень понятно как и что тут делать. Создавать новую таблицу отсортированную как нада немного накладно, так как данных не мало. Причем все должно быть только в памяти ). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)