Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Delphi 7. DBGrid экспорт данных  [new]
Валерий666
Member

Откуда:
Сообщений: 146
Добрый день! Возможно ли выгрузить данные из DBGrida без визуализации перехода по строкам.
Делаю вот так:

procedure TForm1.sBitBtn21Click(Sender: TObject);
var F:textfile;
headers,lines:string;
i:integer;
begin
AssignFile (f, Form1.spath+'\export\' + 'export.txt');
Rewrite (f);
        for i:=0 to GRegisration.Columns.Count-1 do
            begin
               headers:=headers+GRegisration.Columns[i].Title.Caption+#9;
            end;
         writeln (f,headers);

QRegistration.First;
while not QRegistration.Eof do
        begin
           lines:='';
        for i:=0 to GRegisration.Columns.Count-1 do
           lines:=lines+GRegisration.Columns[i].Field.Text+#9;

        writeln (f,lines);
        QRegistration.Next;
        end;

CloseFile(f);
messageDlg('Экспорт завершен. Файл: '+Form1.spath+'\export\' + 'export.txt', mtInformation, [mbOK], 0);
ShellExecute(0,'Open',pchar(Form1.spath+'\export\' + 'export.txt'),nil,nil,1);


Может есть другой способ?
13 дек 17, 16:33    [21031251]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
чччД
Guest
Валерий666
...выгрузить данные из DBGrida без визуализации перехода по строкам...


Схема:
      with DataSource.Dataset do
      begin
        DisableControls;
        SaveBookmark;
        try
...
<Код выгрузки>
...
        finally
          RestoreBookmark;
          EnableControls;
        end;
13 дек 17, 16:44    [21031292]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24154
Валерий666
Возможно ли выгрузить данные из DBGrida без визуализации перехода по строкам.

Можно: DisableControls, EnableControls. Либо отвязать datasource.dataset и затем вернуть.
13 дек 17, 16:45    [21031297]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
DesWind
Member

Откуда:
Сообщений: 94
Валерий666,

DataSource.enabled:=false;
13 дек 17, 16:45    [21031301]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
Валерий666
Member

Откуда:
Сообщений: 146
чччД
Валерий666
...выгрузить данные из DBGrida без визуализации перехода по строкам...


Схема:
      with DataSource.Dataset do
      begin
        DisableControls;
        SaveBookmark;
        try
...
<Код выгрузки>
...
        finally
          RestoreBookmark;
          EnableControls;
        end;

Access violation....

Очевидно процедуре First;(Next,Last и пр.) не нравится отключение контролов...
13 дек 17, 16:49    [21031321]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
Валерий666
Member

Откуда:
Сообщений: 146
DesWind
Валерий666,

DataSource.enabled:=false;
Спасибо, помогло! К вечеру уже мозг не соображает...
13 дек 17, 16:51    [21031330]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24154
Валерий666
Очевидно процедуре First;(Next,Last и пр.) не нравится отключение контролов...

Не очевидно.
13 дек 17, 16:52    [21031334]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
Валерий666
Member

Откуда:
Сообщений: 146
wadman
Валерий666
Очевидно процедуре First;(Next,Last и пр.) не нравится отключение контролов...

Не очевидно.

Почему тогда именно на этом моменте вылазит критическая ошибка?
13 дек 17, 16:56    [21031347]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24154
Валерий666
wadman
пропущено...

Не очевидно.

Почему тогда именно на этом моменте вылазит критическая ошибка?

Очевидно идёт обращение к не тому участку памяти или к не инициализированному объекту.
13 дек 17, 17:11    [21031424]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
чччД
Guest
Валерий666
wadman
пропущено...

Не очевидно.

Почему тогда именно на этом моменте вылазит критическая ошибка?

Не вылазит.
13 дек 17, 17:20    [21031474]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 48125
обращаться в методе класса к экземпляру класса - моветон
Валерий666
procedure TForm1.sBitBtn21Click(Sender: TObject);
var F:textfile;
headers,lines:string;
i:integer;
begin
AssignFile (f, Form1.spath+'\export\' + 'export.txt');
13 дек 17, 17:42    [21031586]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
VDSoft
Member

Откуда:
Сообщений: 40
Валерий666
Почему тогда именно на этом моменте вылазит критическая ошибка?

Пока переделанный указанным образом код не приведешь, гадать представляется бессмысленным.
13 дек 17, 19:50    [21031904]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
Bali
Member

Откуда:
Сообщений: 50
Валерий666,
Я так делаю:
procedure Export(Grid: tDBGrid);
var
  SaveBeforeScroll: TDataSetNotifyEvent;
  SaveAfterScroll: TDataSetNotifyEvent;
  SaveAutoCalcFields: Boolean;
begin
  with Grid.Datasource.DataSet do
    begin
      DisableControls;
      SaveBeforeScroll := BeforeScroll;
      SaveAfterScroll := AfterScroll;
      SaveAutoCalcFields := AutoCalcFields;
      BeforeScroll := nil;
      AfterScroll := nil;
      AutoCalcFields := False;

      //Экспортируем куда нужно
      First;
      while not(eof) do
        begin
          next;
        end;

      EnableControls;
      BeforeScroll := SaveBeforeScroll;
      AfterScroll := SaveAfterScroll;
      AutoCalcFields := SaveAutoCalcFields;
    end;
end;

Ничего не мигает.
13 дек 17, 22:34    [21032200]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
Bali
Member

Откуда:
Сообщений: 50
Извиняюсь, забыл про BookMark:

procedure Export(Grid: tDBGrid);
var
  SaveAutoCalcFields: Boolean;
  BM: TBookmark;
begin
  with Grid.Datasource.DataSet do
    begin
      BM := GetBookmark;
      DisableControls;     
      SaveAutoCalcFields := AutoCalcFields;
      BeforeScroll := nil;
      AfterScroll := nil;
      AutoCalcFields := False;

      //Экспортируем куда нужно
      First;
      while not(eof) do
        begin
          next;
        end;

      GotoBookmark(BM);
      EnableControls; 
      AutoCalcFields := SaveAutoCalcFields;
    end;
end;


Единственное что после GotoBookmark, выделенная строка встает посередине таблицы.
14 дек 17, 02:11    [21032440]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4410
Единственное что после GotoBookmark, выделенная строка встает посередине таблицы.[/quot]

+ А оно тебе надо?


DBGridRowPos:=TGridCracker(DBGrid1).Row;
...
if DBGridRowPos>0
then ScrollActiveToRow(DBGrid1,DBGridRowPos);
...

procedure TForm.ScrollActiveToRow(Grid : TDBGrid; ARow : Integer);
var FTitleOffset, SDistance : Integer;
NewRect : TRect;
RowHeight : Integer;
NewRow : Integer;
begin
with TGridCracker(Grid) do begin
NewRow:= Row;
FTitleOffset:= 0;
if dgTitles in Options then inc(FTitleOffset);
if ARow = NewRow then Exit;
with DataLink, DataSet do
try
BeginUpdate;
Scroll(NewRow - ARow);
if (NewRow - ARow) < 0 then ActiveRecord:= 0
else ActiveRecord:= VisibleRowCount - 1;
SDistance:= MoveBy(NewRow - ARow);
NewRow:= NewRow - SDistance;
MoveBy(ARow - ActiveRecord - FTitleOffset);
RowHeight:= DefaultRowHeight;
NewRect:= BoxRect(0, FTitleOffset, ColCount - 1, 1000);
ScrollWindowEx(Handle, 0, - RowHeight * SDistance, @NewRect, @NewRect, 0, nil, SW_Invalidate);
MoveColRow(Col, NewRow, False, False);
finally
EndUpdate;
end;
end;
end;


У меня по одному проекту тоже так хотели, а потом пришли у выводу, что стандартное поведение лучше... Это проявляется при появлении в наборе новых записей, которые остаются вне отображаемой части таблицы....
14 дек 17, 09:37    [21032651]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1385
Вот из-за таких выеживаний с датасетом, на ровном месте, забил на идеологию DB-Aware полностью.
Сделал себе некий аналог датасета, который больше напоминает динамический массив записей. Поначалу вообще так и было, но оказалось неудобным подгонять методы по разные имена полей. В итоге поля создаются динамически.

Для визуализации данных использую VirtualTreeView в режиме грида.
Связывает грид и мой датасет некое подобие DS, но понятие "текущей записи" есть только для самого грида. Все что ниже никакой такой ограниченности не имеет. Соответственно бегать по этому "датасету" легко и просто.

В данном случае вместо

QRegistration.First;
while not QRegistration.Eof do
        begin
           lines:='';
        for i:=0 to GRegisration.Columns.Count-1 do
           lines:=lines+GRegisration.Columns[i].Field.Text+#9;

        writeln (f,lines);
        QRegistration.Next;
        end;


Было бы нечто вроде

for i := 0 to CDS_Reg.Count-1 do begin
  s := '';
  for j := 0 to CDS_Reg.FieldsWorl.Count-1 do begin
    s := s + CDS_Reg.ReadString(i, j) + #9;
  end;{for j}
end;{for i}


Заполняется данными этот буфер вот таким кодом:

  
  CDV.RowSavePosition;
  QSel1.ParamByName('id').AsInteger  := Fid;
  CDS.ExecSelect(QSel1);
  CDV.Sync;
  CDV.RowRestorePositionID;


QSel - это компонент выполняющий запрос но имеющий буфер только на одну запись.
В FibPlus это TpFIBQuery

CDV.Sync в частности синхронизирует поля грида с датасетом, приводит количество записей в дереве к количеству записей в CDS и дергает перерисовку у дерева. После чего дерево, если ему нужно отрисовать ячейку, просто запрашивает ее значение в CDS.
Так же через CDV привязан StatusBar - после выполнения запроса в него автоматом пишется количество записей в CDS и время выполнения запроса.

Из удобных моментов - эти компоненты по сути не имеют никакой прривязки к базам.
Есть например такой метод

CDS.DirList('c:\DATA\*.txt');

Получит список файлов по маске и создаст на каждый файл по записи в CDS.
Какую информацию при этом он запишет - зависит от наличия в CDS полей.
Предопределенные имена
FILE_NAME
FILE_SIZE
FILE_DATE
есть поле - соответственная инфа запишется. Нет поля - не запишется.

Или, создаем поле CHECK_BOX - в первой колонке появляется галка чекбокса. Установка\снятие меняет значение в поле CHECK_BOX которое Integer. Потом легко пробегаемся по буферу выбирая записи с чеком или без.

Поле ROW_FONTSTYLE отвечает за стиль шрифта в соответствующей строке.
Поле ROW_FONTSTYLE - цвет шрифта в строке. Пишем туда например "RED" - и строка красная.

В контекстное меню грида автоматически привязываются пункты меню "поиск по подстроке" и "сохранить в файл", сделано несколько форматов сохранения - XLS, CSV, TXT, INI, DBF - и они автоматические есть в любом гриде который прицеплен к этой системе.

Ну и т.д.

Конечно, это один из колхозных велосипедов, и он не допилен в должной степени что бы его можно было без стестения показывать другим :) но вот уже более 10 лет я радуюсь что теперь не связан с парадигмой DB-Aware, в том виде какой заложен в Delphi.
14 дек 17, 10:31    [21032824]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
Bali
Member

Откуда:
Сообщений: 50
fraks,

Так в гриде тоже можно определенные строки выбрать.
У меня приблизительно так:

TDatasetDisable = class(tObject)
      fSaveBeforeScroll: TDataSetNotifyEvent;
      fSaveAfterScroll: TDataSetNotifyEvent;
      fSaveAutoCalcFields: Boolean;
      fdataset: tDataset;
      fBookMark: tBookMark;
    public
      constructor Create(aDataset: tDataset);
      destructor destroy; override;
  end;

constructor TDatasetDisable.Create(aDataset: tDataset);
begin
  inherited Create();
  fDataset := aDataset;
  if assigned(fDataset) then
    begin
      fSaveBeforeScroll := fDataSet.BeforeScroll;
      fSaveAfterScroll  := fDataSet.AfterScroll;
      fSaveAutoCalcFields := false;
      fBookMark := fDataSet.BookMark;
      fDataSet.DisableControls;
      fDataSet.BeforeScroll := nil;
      fDataSet.AfterScroll := nil;
      fDataSet.AutoCalcFields := False;

    end;
end;

destructor TDatasetDisable.Destroy;
begin
  if assigned(fDataset) then
    begin
      fDataSet.EnableControls;
      fDataSet.BeforeScroll := fSaveBeforeScroll;
      fDataSet.AfterScroll := fSaveAfterScroll;
      fDataSet.AutoCalcFields := fSaveAutoCalcFields;
      fDataSet.GotoBookMark(fBookmark);
    end;
  inherited;
end;

procedure Export(Grid: tDBGrid);
var
  SetDatasetDisable := TDatasetDisable;	
begin
 SetDatasetDisable := TDatasetDisable.create(Grid.DataSource.DataSet);
 if (Grid.SelectedRows <> nil) and (Grid.SelectedRows.Count > 0)  then
 for i := 0 to Grid.SelectedRows.Count - 1 do
   begin
     //экспортируем строку               
   end
 else
   begin
     Grid.DataSource.DataSet.First;
     while not Grid.DataSource.DataSet.Eof do
       begin
         //экспортируем строку               
         Grid.DataSource.DataSet.Next;
       end;
    end;
 SetDatasetDisable.free;
end;


Правда грид "слегка" подпилен.
14 дек 17, 11:30    [21033019]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1385
Bali
Так в гриде тоже можно определенные строки выбрать.

Да я собственно не про строки, а про то что в наше время работать с буфером лежащим в ОЗУ как с магнитной лентой споследовательным доступом - это мягко говоря писец...
И отвязка датасета от контролов ассоциируется со снятием ленты с одного магнитофона и перестановкой на другой.
14 дек 17, 11:37    [21033039]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
Bali
Member

Откуда:
Сообщений: 50
fraks
Да я собственно не про строки, а про то что в наше время работать с буфером лежащим в ОЗУ как с магнитной лентой споследовательным доступом - это мягко говоря писец...
И отвязка датасета от контролов ассоциируется со снятием ленты с одного магнитофона и перестановкой на другой.


Никакого писца, сколько лет, никаких проблем. От контролов ничего не отвязывается, или Disablecontrols не фэншую.
Что теперь, если нужно выбранные строки, в excel или в csv выгрузить еще один Dataset для экспорта создавать - вот это да, писец.
14 дек 17, 14:50    [21033827]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
schi
Member

Откуда: Москва
Сообщений: 2577
fraks
Bali
Так в гриде тоже можно определенные строки выбрать.

Да я собственно не про строки, а про то что в наше время работать с буфером лежащим в ОЗУ как с магнитной лентой споследовательным доступом - это мягко говоря писец...
И отвязка датасета от контролов ассоциируется со снятием ленты с одного магнитофона и перестановкой на другой.


Если в наше время буфер превышает размеры доступной памяти, то только последовательно. И печально.
14 дек 17, 15:10    [21033923]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
almswiss
Member

Откуда:
Сообщений: 105
andreymx
обращаться в методе класса к экземпляру класса - моветон

Так, да, согласен, но есть же Self.
4 янв 18, 01:50    [21081099]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1385
schi
fraks
пропущено...

Да я собственно не про строки, а про то что в наше время работать с буфером лежащим в ОЗУ как с магнитной лентой споследовательным доступом - это мягко говоря писец...
И отвязка датасета от контролов ассоциируется со снятием ленты с одного магнитофона и перестановкой на другой.


Если в наше время буфер превышает размеры доступной памяти, то только последовательно. И печально.


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

Но при чем тут рассматриваемая ситуация когда у нас это дело прицеплено к гриду? У нас что там забуферизировано данных больше чем есть памяти?
4 янв 18, 20:51    [21082337]     Ответить | Цитировать Сообщить модератору
 Re: Delphi 7. DBGrid экспорт данных  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2811
fraks,

автор
Но при чем тут рассматриваемая ситуация когда у нас это дело прицеплено к гриду? У нас что там забуферизировано данных больше чем есть памяти?


Почему это так удивляет? Обычное состояние на больших наборах.
4 янв 18, 23:58    [21082529]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить