Экспорт DBgrid в CSV?

У меня есть отсортированная сетка БД (пользователь нажал несколько переключателей и флажков, чтобы повлиять на отображение).

Я хотел бы экспортировать все данные (а не только то, что видно в сетке), отсортированные одинаково, в CSV. Как мне это сделать? Данные - не пользовательские настройки, просто для уточнения.

Заранее благодарю за любую помощь


[Обновление] Я строю sqlQuery по крупицам, в зависимости от пользовательских настроек флажков и радиогрупп, затем, когда один из них меняется, я

   ActivityADQuery.SQL.Clear();
   ActivityADQuery.SQL.Add(sqlQuery);
   ActivityADQuery.Open(sqlQuery);

То есть нет жестко закодированного запроса, он меняется, и я хочу экспортировать текущие настройки.

Я не знаю достаточно, хочу ли я экспортировать из сетки или набора данных (я просто не парень db, это мой первый DBgrid), но я подозреваю, что мне нужна сетка, потому что она имеет подмножество полей он набор данных.

Я предполагаю, что TJvDBGridCSVExport является компонентом Jedi (?). Я пытался избегать их до сих пор, как бы здорово они ни звучали, потому что я предпочитаю сдержанные, автономные компоненты установке огромной коллекции. Это может быть не самый умный поступок, но я так чувствую - ymmv (и, вероятно, так и есть)


person Mawg says reinstate Monica    schedule 18.01.2013    source источник
comment
пробовали TJvDBGridCSVExport?   -  person Arioch 'The    schedule 18.01.2013
comment
Как осуществляется порядок данных? Связанный набор данных должен иметь тот же порядок, что и в сетке, и вам нужно только экспортировать набор данных в CSV.   -  person Sir Rufo    schedule 18.01.2013
comment
@Arioch'TJvDBGridCSVExport экспортирует ли все данные из соответствующего набора данных или только те, которые показаны Grid?   -  person Sir Rufo    schedule 18.01.2013
comment
Пожалуйста, уточните: вы хотите экспортировать данные или настройки или и то, и другое?   -  person Sir Rufo    schedule 18.01.2013
comment
with Grid.DataSource.DataSet do begin. И если бы он только экспортировал данные из самого грида, то вряд ли бы он запрашивал DBGrid — достаточно было бы StringGrid. Что ж, вам могут не нравиться большие библиотеки, но вы также можете свести их к минимуму. Но прежде чем сделать это, вы можете обнаружить, что многие из ваших пользовательских подпрограмм уже были в библиотеке. Например, когда я работал над TDbf, я нашел кучу скопированных подпрограмм, которые были в RxLib, JCL, vgLib и почти во всех библиотеках FLOSS того времени :-) PS. SQL.Clear(); SQL.Add почему ?почему не просто SQL.Text := ... ? ;-)   -  person Arioch 'The    schedule 18.01.2013
comment
Возьмите какой-нибудь TDataSet с бэкэндом hCSV и просто скопируйте в него сам TDataSet построчно. Я не помню, был ли TBatchMove связан с BDE или нет, но я полагаю, что есть много примеров, клонирующих один TDataSet против другого. Клонируйте .FieldDefs, затем клонируйте строки, и это должно быть все. Одна из возможных отправных точек для поиска наборов данных CSV torry.net/pages.php?id=567   -  person Arioch 'The    schedule 18.01.2013


Ответы (2)


Другое решение также работает с (несколько) выбранными строками:

procedure TReportsForm.ExportToCSV(const aGrid : TDBGrid; const FileName : String);
Var
  I, J : Integer;
  SavePlace : TBookmark;
  Table : TStrings;
  HeadTable : String;
  LineTable : String;
  First : Boolean;
Begin

  HeadTable := '';
  LineTable := '';
  Table := TStringList.Create;
  First := True;

  Try
    For I := 0 To Pred(aGrid.Columns.Count) Do
      If aGrid.Columns[I].Visible Then
        If First Then
        Begin
// Use the text from the grid, in case it has been set programatically
// E.g., we prefer to show "Date/time" than "from_unixtime(activity.time_stamp, "%D %b %Y  %l:%i:%S")"
//          HeadTable := HeadTable + aGrid.Columns[I].FieldName;
          HeadTable := HeadTable + ActivityReportStringGrid.Columns[i].Title.Caption + ','; // Previous separated wth semi-colon, not comma! (global)
          First := False;
        End
        Else
        begin
//          HeadTable := HeadTable + ';' + aGrid.Columns[I].FieldName;
          HeadTable := HeadTable + ActivityReportStringGrid.Columns[i].Title.Caption + ',';
        end;

    Delete(HeadTable, Length(HeadTable), 1);  // Remove the superfluous trailing comma
    Table.Add(HeadTable);
    First := True;

    // with selection of rows
    If aGrid.SelectedRows.Count > 0 Then
    Begin
      For i := 0 To aGrid.SelectedRows.Count - 1 Do
      Begin
        aGrid.DataSource.Dataset.GotoBookmark(pointer(aGrid.SelectedRows.Items[i]));
        For j := 0 To aGrid.Columns.Count - 1 Do
          If aGrid.Columns[J].Visible Then
            If First Then
            Begin
              lineTable := lineTable + aGrid.Fields[J].AsString;
              First := False;
            End
            Else
              lineTable := lineTable + ',' + aGrid.Fields[J].AsString;

        Delete(LineTable, Length(LineTable), 1);  // Remove the superfluous trailing comma
        Table.Add(LineTable);
        LineTable := '';
        First := True;
      End;
    End
    Else
      //no selection
    Begin
      SavePlace := aGrid.DataSource.Dataset.GetBookmark;
      aGrid.DataSource.Dataset.First;

      Try
        While Not aGrid.DataSource.Dataset.Eof Do
        Begin
          For I := 0 To aGrid.Columns.Count - 1 Do
            If aGrid.Columns[I].Visible Then
              If First Then
              Begin
                lineTable := lineTable + aGrid.Fields[I].AsString;
                First := False;
              End
              Else
                lineTable := lineTable + ',' + aGrid.Fields[I].AsString;


          Delete(LineTable, Length(LineTable), 1);  // Remove the superfluous trailing comma
          Table.Add(LineTable);
          LineTable := '';
          aGrid.DataSource.Dataset.Next;
          First := True;
        End;

        aGrid.DataSource.Dataset.GotoBookmark(SavePlace);
      Finally
        aGrid.DataSource.Dataset.FreeBookmark(SavePlace);
      End;
    End;
    Table.SaveToFile(FileName);
  Finally
    Table.Free;
  End;
End;  // ExportToCSV()
person Andreas    schedule 18.01.2013

Вы можете использовать собственную крошечную процедуру, которую можно адаптировать к вашим потребностям.

Procedure Dataset2SeparatedFile(ads: TDataset; const fn: String; const Separator: String = ';');
var
  sl: TStringList;
  s: String;
  i: Integer;
  bm: TBookmark;

  Procedure ClipIt;
  begin
    s := Copy(s, 1, Length(s) - Length(Separator));
    sl.Add(s);
    s := '';
  end;
  Function FixIt(const s: String): String;
  begin
    // maybe changed
    Result := StringReplace(StringReplace(StringReplace(s, Separator, '', [rfReplaceAll]), #13, '', [rfReplaceAll]), #10, '', [rfReplaceAll]);
    // additional changes could be Quoting Strings
  end;

begin
  sl := TStringList.Create;
  try
    s := '';
    For i := 0 to ads.FieldCount - 1 do
    begin
      if ads.Fields[i].Visible then
        s := s + FixIt(ads.Fields[i].DisplayLabel) + Separator;
    end;
    ClipIt;
    bm := ads.GetBookmark;
    ads.DisableControls;
    try
      ads.First;
      while not ads.Eof do
      begin
        For i := 0 to ads.FieldCount - 1 do
        begin
          if ads.Fields[i].Visible then
            s := s + FixIt(ads.Fields[i].DisplayText) + Separator;
        end;
        ClipIt;
        ads.Next;
      end;
      ads.GotoBookmark(bm);
    finally
      ads.EnableControls;
      ads.FreeBookmark(bm);
    end;
    sl.SaveToFile(fn);
  finally
    sl.Free;
  end;
end;
person bummi    schedule 18.01.2013