Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];

Вниз

Нужно сохранить данные из DBGrida в файл.   Найти похожие ветки 

 
WFS ©   (2007-07-24 20:58) [0]

Скажите пожалуйста, как сохранить данные из DBGrida в файл. Просто вручную все столбцы и строки перебирать очень неудобно. Есть ли че нить такое типа DBgrid1.Savetofile. Или может можно в эксель перегнать?


 
{RASkov} ©   (2007-07-24 21:01) [1]

> [0] WFS ©   (24.07.07 20:58)

В ДБГриде нет данных, или другими словами эти данные уже и так сохранены в файле...
См DataSet.


 
WFS ©   (2007-07-24 21:09) [2]

А можно чуть поконкретнее, какую процедуру датасета нужно использовать?


 
{RASkov} ©   (2007-07-24 21:15) [3]

> [2] WFS ©   (24.07.07 21:09)

никакую... нужно почитать, что есть датасет и что есть дбгрид.... и что есть "ихи" данные....


 
MsGuns ©   (2007-07-24 21:17) [4]

Один из вариантов:

uses ComObj, Excel2000, OleServer,

var
 XLExp_Report: TExcelApplication;
 XLExp_WorkBook: Excel2000.ExcelWorkBook;
 XLExp_Sheet: Excel2000.ExcelWorkSheet;

procedure XLExp_OpenReport(TemplateName: OleVariant);
// Процедура создает в первый раз Excel-приложение, а если оно уже существует,
// то коннектится к нему, определяя опции коннекта и создавая объекты "Книга"
// и "Лист". Имя книги задается параметром TemplateName
begin
 if not Assigned(XLExp_Report) then
    XLExp_Report:=TExcelApplication.Create(nil);
 XLExp_Report.ConnectKind:=ckRunningOrNew;
 XLExp_Report.Connect;
 try
   // если офис 2003, ХР
   XLExp_WorkBook :=XLExp_Report.Workbooks.Add("",0);
 except
   try
     // если офис 2000
     XLExp_WorkBook :=XLExp_Report.Workbooks.Add("Книга1",0);
   except
     //try
       // если Офис 97
       //XLExp_WorkBook :=XLExp_Report.Workbooks.Add(xlWBatWorkSheet,0);
     //except
     //end;
   end;
 end;
 XLExp_Sheet:=XLExp_Workbook.Worksheets.Item[1] as Excel2000.ExcelWorkSheet;
end;

procedure XLExp_DataSetExport(Range: OleVariant; DataSet: TDataSet);
// Експорт данных из датасета в Excel-лист
// Область листа (Range) задается параметром Range
// Range задает область листа (непрерывная последовательность ячеек листа)
//  начиная с которой будет итти заполнение из НД. При этом самой левой колонкой
//  может любая колонка листа, а строкой - любая строка листа.
// Ячейки этой "линии" колонок должны содержать имена полей НД, данные которых
//  будут помещаться в эти колонки
var
 RangeLen,Column,Row,lich,i,x: integer;
 ValueArray: OleVariant;
 Str: string;
 FieldArray: array [0..30] of string;
 bm: TBookmark;

begin
 // Строка начала района
 Row:=XLExp_Sheet.Range[Range,EmptyParam].Row;
 // Колонка начала района (левая крайняя)
 Column:=XLExp_Sheet.Range[Range,EmptyParam].Column;
 // Колонка конца района (правая крайняя)
 RangeLen:=Column+(XLExp_Sheet.Range[Range,EmptyParam].Columns.Count-1);
 // Переписать в массив FieldArray содержимое ячеек 1-й строки указанной области
 // листа Excel (имена полей датасета).
 // Предполагается, что их не должно быть более 21
 x := 0;
 for i := Column to RangeLen do
  begin
   Str := XLExp_Sheet.Cells.Item[Row,i].Formula;  // Содержимое ячейки
   Delete(Str,1,1);         // Обрезаем первый (служебный) символ
   FieldArray[x] := Str;
   x := x+1;
  end;
 // Создать дин.массив размерностью RxC, где R - кол-во строк датасета,
 // а C - кол-во колонок, заданное Range
 ValueArray := VarArrayCreate([0,DataSet.RecordCount-1,0,XLExp_Sheet.Range[Range,EmptyParam].Columns.Count],varVariant);
 lich := 0;    // Индекс строки НД
 // Подготовка датасета к сканированию
 with DataSet do
   begin
    bm := GetBookmark;     // Запомнить текущую запись
    DisableControls;
    First;
    while not Eof do
      begin
       for i := 0 to XLExp_Sheet.Range[Range,EmptyParam].Columns.Count do
         // Для каждой колонки Region определяется имя поля НД и значение
         //  этого поля записывается в дин.массив по адресу=индексу колонки
         begin
          if (FieldArray[i]<>"") then  // Колонка имеет ссылку на имя поля ?
              ValueArray[lich,i] := FieldByName(FieldArray[i]).AsString
          else
              ValueArray[lich,i] := "";
          end;
          lich := lich+1;
          Next;
      end;
    EnableControls;
    GotoBookmark(bm);   // Вернуться в исходную (до сканирования) запись
    FreeBookmark(bm);
   end;
{  Выражение :
   xlSheet.Range[Col[Column]+IntToStr(Row),Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)]
  представляет "экселовскую" адресацию типа "A10","H17", где буква - индекс колонки, а
  число-индекс строки на листе Excel.
   В нативном виде (в самом Excel`е) этот регион будет = "A10:H17"
}
 // Перегнать в лист Excel (Ragion) значения из массива ValueArray
 XLExp_Sheet.Range[XLExp_Col[Column]+IntToStr(Row),XLExp_Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)].Value := ValueArray;
 // Присвоить всем ячейкам региона Region цвет символов как у левой верхней ячейки
 XLExp_Sheet.Range[XLExp_Col[Column]+IntToStr(Row),XLExp_Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)].Font.Color := XLExp_Sheet.Range[Range,EmptyParam].Font.Color;
 // Присвоить всем ячейкам региона Region цвет как у левой верхней ячейки
 XLExp_Sheet.Range[XLExp_Col[Column]+IntToStr(Row),XLExp_Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)].Interior.Color := XLExp_Sheet.Range[Range,EmptyParam].Interior.Color;
 // Присвоить всем ячейкам региона Region рамки как у левой верхней ячейки
 XLExp_Sheet.Range[XLExp_Col[Column]+IntToStr(Row),XLExp_Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)].Borders.LineStyle := XLExp_Sheet.Range[Range,EmptyParam].Borders.LineStyle;
end;


 
WFS ©   (2007-07-24 21:22) [5]

О,господи, как все сложно в этой жизни...
Подскажите, как сгенерировать тогда нажатие клавиши printscreen?:)


 
MsGuns ©   (2007-07-24 21:24) [6]

Эта "сложность" от универсальности. Приведенный код выводит в Эксел данные ЛЮБОГО датасета. Если положить эту процедуру в библиотеку, то впоследствии организовать печать любого "грида" - дело 5 секунд


 
WFS ©   (2007-07-24 21:32) [7]

Боюсь у меня нет времени разбираться с этим.
Мне хотя бы как нибудь надо сделать до завтра и уволиться наконец с работы:)


 
MsGuns ©   (2007-07-24 21:34) [8]

>WFS ©   (24.07.07 21:32) [7]
>Боюсь у меня нет времени разбираться с этим.
Мне хотя бы как нибудь надо сделать до завтра и уволиться наконец с работы:)

Тогда тебе к Игорю Шевченко


 
WFS ©   (2007-07-24 21:36) [9]

А кто это такой?
Да кстати, как сэмулировать принтскрин?


 
Anatoly Podgoretsky ©   (2007-07-24 21:51) [10]


> надо сделать до завтра и уволиться наконец с работы:)

Разумно!


 
WFS ©   (2007-07-24 22:08) [11]

я узнал код клавиши принтскрин. Это 39!
Теперь просто ответьте, как сэмулировать нажатие клавиши.
че нить типа keypress?


 
MsGuns ©   (2007-07-24 22:46) [12]

Видишь ли, "эмуляция" - это нам в наследство от дедовского ДОС осталось, а в винде есть сообщения, которыми обмениваются приложения с ОС.
Попробуй почитать что-нибудь о них, например о PostMessage/SendMessage.
Напоследок, перед тем, как навсегда расстаться с программированием ;)


 
Anatoly Podgoretsky ©   (2007-07-24 22:49) [13]

> MsGuns  (24.07.2007 22:46:12)  [12]

Времени мало осталось, но может успеет?


 
WFS ©   (2007-07-24 22:56) [14]

Ну навсегда я с ним не расстанусь. Но буду заниматься немного другими вещами.
Кстати, я ухожу, если кто хочет, может пойти вместо меня. В основном необходимо заниматься всякого рода тупых, но сложных программ, как например та, которую я сейчас делаю: контроль и учет деталей, находящихся на складе.


 
WFS ©   (2007-07-24 22:56) [15]

*заниматься разработкой (опечатка)


 
MsGuns ©   (2007-07-24 23:32) [16]

>WFS ©   (24.07.07 22:56) [14]
>Кстати, я ухожу, если кто хочет, может пойти вместо меня

Мизантроп ?


 
WFS ©   (2007-07-24 23:38) [17]

MsGuns, я не понял, к чему ты написал это слово:)


 
MsGuns ©   (2007-07-24 23:46) [18]

Нужно быть мизантропом (другими словам - человеконенавистником), чтобы рекомендовать другим место, которое столь сильно деквалифицирует специалиста ;)


 
WFS ©   (2007-07-24 23:57) [19]

Не, ты зря.
Место неплохое, можно работать дома.
Программы, которые требуется писать, сложные, но построены их простых элементов. То есть все, здесь собравшиеся, вполне смогут там работать.
Я по специальности не программер, а лазерщик, и считаю, что за год работы я узнал много нового.


 
WFS ©   (2007-07-24 23:59) [20]

Да, кстати, всем спасибо. Сделал я следующим образом: Сохранил вначале дбгрид в мемо, а затем в файл:))


 
MsGuns ©   (2007-07-25 00:03) [21]

>WFS ©   (24.07.07 23:59) [20]
>Да, кстати, всем спасибо. Сделал я следующим образом: Сохранил вначале дбгрид в мемо, а затем в файл:))

!?

Настоятельно рекомендую непосредственно перед увольнением снести со всех компов твоей контроы все твои программы. Все до единой.
Иначе прокляты будут и ты, и потомки твои до седьмого колена ;)))


 
Loginov Dmitry ©   (2007-07-25 13:08) [22]

TClientDataSet(DBGrid1.DataSource.DataSet).SaveToFile(FileName);

Не запускать это раньше времени :-D


 
stanislav ©   (2007-07-25 13:16) [23]

WFS ©   (24.07.07 23:59) [20]
Вот теперь точно никто не придет на твое место...


 
Virgo_Style ©   (2007-07-25 13:24) [24]

stanislav ©   (25.07.07 13:16) [23]
Если там разделители приличные, то еще есть шанс)


 
WFS ©   (2007-07-25 19:01) [25]

не понял, в чем прикол?


 
MsGuns ©   (2007-07-25 21:18) [26]

>WFS ©   (25.07.07 19:01) [25]
>не понял, в чем прикол?

Ну, если доступно..
Вот есть картина, художественная. Например, "Сикстинкая мадонна".
Требуется ее перевезти.
Так вот, ее взяли и порезали на мелкие кусочки, со спичечную этикету азером. И упаковали затем в спичечные коробки...



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.039 c
15-1184970892
Tirael
2007-07-21 02:34
2007.08.19
остатки СССР


15-1185106776
Rouse_
2007-07-22 16:19
2007.08.19
User-Agent:


1-1181650466
Max_
2007-06-12 16:14
2007.08.19
Шлейф, как с ним бороться ?


15-1184349114
ССергей
2007-07-13 21:51
2007.08.19
Гугль и mail.ru


2-1185386389
Alexey_k
2007-07-25 21:59
2007.08.19
Сворачивание формы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский