Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 7. DBGrid экспорт данных / 23 сообщений из 23, страница 1 из 1
13.12.2017, 16:33
    #39569137
Валерий666
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
Добрый день! Возможно ли выгрузить данные из DBGrida без визуализации перехода по строкам.
Делаю вот так:

Код: 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.
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);



Может есть другой способ?
...
Рейтинг: 0 / 0
13.12.2017, 16:44
    #39569148
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
Валерий666...выгрузить данные из DBGrida без визуализации перехода по строкам...

Схема:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
      with DataSource.Dataset do
      begin
        DisableControls;
        SaveBookmark;
        try
...
<Код выгрузки>
...
        finally
          RestoreBookmark;
          EnableControls;
        end;
...
Рейтинг: 0 / 0
13.12.2017, 16:45
    #39569149
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
Валерий666Возможно ли выгрузить данные из DBGrida без визуализации перехода по строкам.
Можно: DisableControls, EnableControls. Либо отвязать datasource.dataset и затем вернуть.
...
Рейтинг: 0 / 0
13.12.2017, 16:45
    #39569151
DesWind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
Валерий666,

DataSource.enabled:=false;
...
Рейтинг: 0 / 0
13.12.2017, 16:49
    #39569156
Валерий666
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
чччДВалерий666...выгрузить данные из DBGrida без визуализации перехода по строкам...

Схема:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
      with DataSource.Dataset do
      begin
        DisableControls;
        SaveBookmark;
        try
...
<Код выгрузки>
...
        finally
          RestoreBookmark;
          EnableControls;
        end;


Access violation....

Очевидно процедуре First;(Next,Last и пр.) не нравится отключение контролов...
...
Рейтинг: 0 / 0
13.12.2017, 16:51
    #39569158
Валерий666
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
DesWindВалерий666,

DataSource.enabled:=false;Спасибо, помогло! К вечеру уже мозг не соображает...
...
Рейтинг: 0 / 0
13.12.2017, 16:52
    #39569159
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
Валерий666Очевидно процедуре First;(Next,Last и пр.) не нравится отключение контролов...
Не очевидно.
...
Рейтинг: 0 / 0
13.12.2017, 16:56
    #39569162
Валерий666
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
wadmanВалерий666Очевидно процедуре First;(Next,Last и пр.) не нравится отключение контролов...
Не очевидно.
Почему тогда именно на этом моменте вылазит критическая ошибка?
...
Рейтинг: 0 / 0
13.12.2017, 17:11
    #39569173
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
Валерий666wadmanпропущено...

Не очевидно.
Почему тогда именно на этом моменте вылазит критическая ошибка?
Очевидно идёт обращение к не тому участку памяти или к не инициализированному объекту.
...
Рейтинг: 0 / 0
13.12.2017, 17:20
    #39569177
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
Валерий666wadmanпропущено...

Не очевидно.
Почему тогда именно на этом моменте вылазит критическая ошибка?
Не вылазит.
...
Рейтинг: 0 / 0
13.12.2017, 17:42
    #39569200
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
обращаться в методе класса к экземпляру класса - моветонВалерий666
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TForm1.sBitBtn21Click(Sender: TObject);
var F:textfile;
headers,lines:string;
i:integer;
begin
AssignFile (f, Form1.spath+'\export\' + 'export.txt');
...
Рейтинг: 0 / 0
13.12.2017, 19:50
    #39569243
VDSoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
Валерий666Почему тогда именно на этом моменте вылазит критическая ошибка?
Пока переделанный указанным образом код не приведешь, гадать представляется бессмысленным.
...
Рейтинг: 0 / 0
13.12.2017, 22:34
    #39569288
Bali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
Валерий666,
Я так делаю:
Код: 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.
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;


Ничего не мигает.
...
Рейтинг: 0 / 0
14.12.2017, 02:11
    #39569335
Bali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
Извиняюсь, забыл про BookMark:

Код: 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.
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, выделенная строка встает посередине таблицы.
...
Рейтинг: 0 / 0
14.12.2017, 09:37
    #39569424
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
Единственное что после 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;


У меня по одному проекту тоже так хотели, а потом пришли у выводу, что стандартное поведение лучше... Это проявляется при появлении в наборе новых записей, которые остаются вне отображаемой части таблицы....
...
Рейтинг: 0 / 0
14.12.2017, 10:31
    #39569475
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
Вот из-за таких выеживаний с датасетом, на ровном месте, забил на идеологию DB-Aware полностью.
Сделал себе некий аналог датасета, который больше напоминает динамический массив записей. Поначалу вообще так и было, но оказалось неудобным подгонять методы по разные имена полей. В итоге поля создаются динамически.

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

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;



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

Код: pascal
1.
2.
3.
4.
5.
6.
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}



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

Код: pascal
1.
2.
3.
4.
5.
6.
  
  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.
...
Рейтинг: 0 / 0
14.12.2017, 11:30
    #39569520
Bali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
fraks,

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

Код: 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.
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;



Правда грид "слегка" подпилен.
...
Рейтинг: 0 / 0
14.12.2017, 11:37
    #39569525
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
BaliТак в гриде тоже можно определенные строки выбрать.

Да я собственно не про строки, а про то что в наше время работать с буфером лежащим в ОЗУ как с магнитной лентой споследовательным доступом - это мягко говоря писец...
И отвязка датасета от контролов ассоциируется со снятием ленты с одного магнитофона и перестановкой на другой.
...
Рейтинг: 0 / 0
14.12.2017, 14:50
    #39569651
Bali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
fraksДа я собственно не про строки, а про то что в наше время работать с буфером лежащим в ОЗУ как с магнитной лентой споследовательным доступом - это мягко говоря писец...
И отвязка датасета от контролов ассоциируется со снятием ленты с одного магнитофона и перестановкой на другой.

Никакого писца, сколько лет, никаких проблем. От контролов ничего не отвязывается, или Disablecontrols не фэншую.
Что теперь, если нужно выбранные строки, в excel или в csv выгрузить еще один Dataset для экспорта создавать - вот это да, писец.
...
Рейтинг: 0 / 0
14.12.2017, 15:10
    #39569670
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
fraksBaliТак в гриде тоже можно определенные строки выбрать.

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

Если в наше время буфер превышает размеры доступной памяти, то только последовательно. И печально.
...
Рейтинг: 0 / 0
04.01.2018, 01:50
    #39579181
almswiss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
andreymxобращаться в методе класса к экземпляру класса - моветон
Так, да, согласен, но есть же Self.
...
Рейтинг: 0 / 0
04.01.2018, 20:51
    #39579488
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
schifraksпропущено...

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

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

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

Но при чем тут рассматриваемая ситуация когда у нас это дело прицеплено к гриду? У нас что там забуферизировано данных больше чем есть памяти?
...
Рейтинг: 0 / 0
04.01.2018, 23:58
    #39579509
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 7. DBGrid экспорт данных
fraks,

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

Почему это так удивляет? Обычное состояние на больших наборах.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 7. DBGrid экспорт данных / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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