Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
 Аватар для Slimmi
2 / 2 / 0
Регистрация: 28.03.2008
Сообщений: 64

adoquery и fastreports

23.07.2011, 16:09. Показов 7269. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
У меня возникла проблема при получении данных в отчет по информации из запроса из БД.
У меня имеется таблица, в событие edit.change у меня происходит поиск нужных мне данных из БД. Код следующий:
Code
1
2
3
4
5
6
7
8
procedure TForm1.Edit3Change(Sender: TObject);
begin
Datamodule2.ADOQuery1.Active := false;
Datamodule2.ADOQuery1.SQL.Clear;
Datamodule2.ADOQuery1.SQL.Add('select * from spisok_org where id_organizacii LIKE "%'+Form1.Edit3.Text+'%"');
Datamodule2.ADOQuery1.Active := true;
Datamodule2.ADOQuery1.Open;
end;
В дбгриде отодражается результат поиска. Так вот как данные или из этого грида или из Адо отобразить в отчете, если при передаче в отчет не видно полей, которые нужно отобразить.
Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.07.2011, 16:09
Ответы с готовыми решениями:

ОТЧЕТ fastreports
добрый день! в fastreports создаю отчет, и вместо 136 записей в отчете появляются только первых 4. подскажите, в чем может быть проблема?...

Оформление отчета в FastReports
есть такая фишка, как в MasterData закрашивать строку по условию. Memo 6 закрашиваю по условию <Line> mod 2 = 1 - это условие...

Запрос ADOQuery внутри другого ADOQuery реален?
Помогите сформировать запрос для двух ADOQuery. Есть 2 таблицы БД mssql: sotrudniki , table_hlp(Вспомогательная таблица для делания...

35
 Аватар для Slimmi
2 / 2 / 0
Регистрация: 28.03.2008
Сообщений: 64
24.07.2011, 17:23  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от MsGuns Посмотреть сообщение
"Ну какой же Вы тупооой !" (с)
не спорю )))
...
вот строка
Delphi
1
Delete(s,length(s),1);
вот ошибка по ней
Delphi
1
[DCC Error] Unit1.pas(113): E2034 Too many actual parameters
даже две, курсор перед s и перед 1. вОт!

Добавлено через 2 минуты
нужно скорее Б, чем А. лишняя форма не к чему. У меня проблемы с передачей отображаемой информации в гриде в текстовый файл, в файл фастрепорта или в эксель, не принципиально, вобщем с этим трудности.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.07.2011, 17:56
Блин, ну нема у меня делфей дома. Смысл строки в том, чтоб отрезать последний символ в строке.
Пример:
Строка после сборки: Вася;Иванов;22.08.2011;$1200,00;
Строка для добавления в список: Вася;Иванов;22.08.2011;$1200,00

Сами найдите параметры строковой функции Delete
В конце концов наплюйте, пойдет и так

Добавлено через 9 минут
Ага, это побочный эффект от with,- delete компилятор воспринимает как метод TDataSet, а не как строковую функцию.
Хммм.. тогда подкрутим так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
   while not eof do 
     begin
      s := '';
      for i := 0 to Fields.Count-1 do 
        begin
          if i>0 then 
             s := s+Dmtr;            
          s := s+Fields[i].AsString;
        end;
      ls.Add(s);
      next;
     end;
Добавлено через 56 секунд
Снава форматер косячит
1
 Аватар для Slimmi
2 / 2 / 0
Регистрация: 28.03.2008
Сообщений: 64
24.07.2011, 18:23  [ТС]
все замечательно, закоментил удаление и все работает. Еще хотел спросить, как сделать, чтоб в этот же файл все записывалось, но только начиная с 3 строки экселя. Первые 2 сделаю как шапку. И чтоб файл при записи в него инфы открывался. Возможно такое продемонстрировать?

Добавлено через 5 минут
с новым циклом все работает, да и без удаления тож вроде нормально. СПС! Только вот еще пост 23 беспокоит ))

Добавлено через 14 минут
блин блин блин, и можно ли использовать другое расширений файла, а не csv, хотел изменить там разметку и тд, так хера, не меняются.

Добавлено через 4 минуты
MsGuns, и еще вопрос, можно ли через делфи создавать представления на mysql?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.07.2011, 18:33
Delphi
1
можно ли использовать другое расширений файла, а не csv,
Только с разрешения МВФ

Вы издеваетесь, похоже, Вы ж сами указали такое расширение !!!!
Правда я, дурак, подсказал

Добавлено через 6 минут
Delphi
1
Еще хотел спросить, как сделать, чтоб в этот же файл все записывалось, но только начиная с 3 строки экселя. Первые 2 сделаю как шапку. И чтоб файл при записи в него инфы открывался. Возможно такое продемонстрировать?
Таки эксель ? Что ж, разумное решение. Тогда шаблоны и экспорт в эксель. Примеров в тырнете моря. Могу дать готовый код, но он Вас испугает, наверное. Да и его еще надоть корректно выцыганить из достаточно обширного библиотечного юнита тыщ на 5-6 строк.
Все ж лучше для Вас (и для Вашего случая) использовать например DBGridEh библитотеки Ehlib. Я думаю, что в вашем чисто образовательном проекте использование коммерческой библиотеки не будет большим преступлением.

Добавлено через 50 секунд
Delphi
1
MsGuns, и еще вопрос, можно ли через делфи создавать представления на mysql?
Можно. Например используя все то же АДО.
1
 Аватар для Slimmi
2 / 2 / 0
Регистрация: 28.03.2008
Сообщений: 64
24.07.2011, 18:40  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Можно. Например используя все то же АДО.
а примерчик можно? оч нужно. А вообще прогу по польшей степени делаю к завтрашнему дню. Поэтому любому примеру и коду буду рад.

Про шаблоны и тд тоже можно. Все, я в ожидании чуда, ну и кода конечно )))
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.07.2011, 18:47
Delphi
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
unit XLReps;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics,
  ComObj, Excel2000, OleServer, DB, Variants, Dialogs;
 
type
  // Выравнивание текста внутри ячейки :
  CXLExp_HorAlignment = (ehaLeft,ehaRight,ehaCenter,ehaNone);   // горизонтальное
  CXLExp_VertAlignment = (evaTop,evaBottom,evaCenter,evaResize,evaMultiLine,evaNone);  // вертикальное
  // Толщина и наклон символов
  CXLExp_FontStyle = (efsBold, efsItalic, efsNone);
  SXLExp_FontStyle = set of CXLExp_FontStyle;
  CXLExp_BorderStyle = (ebsThin, ebsMedium, ebsThick, ebsBlank);
  RXLExp_Text = record
    Hor: CXLExp_HorAlignment;     // Горизонтальное
    Vert: CXLExp_VertAlignment;   // Вертикальное
    WrdWrap: boolean;             // Перенос по словам
  end;
 
  RXLExp_Font = record
    Name: TFontName;                 // Название шрифта (если '', то Default
    Color: TColor;                // Цвет шрифта
    Size: ShortInt;               // Размер шрифта (если AutoSize=true, игнорируется)
    Style: TFontStyles;           // Стиль (fsBold,fsItalic,fsUnderline,fsStrikeOut)
  end;
 
  RXLExp_CellsProp = record       // ******** Свойства ячеек
    Align: RXLExp_Text;           // Выравнивание текста внутри ячейки
    Font:  RXLExp_Font;           // Фонт
    Width: integer;               // Ширина ячейки в ед.Excel (если -1, то не уст-ся)
    Height: integer;              // Высота ячейки в ед.Excel (если -1, то не уст-ся)
    Value: OleVariant;            // Значение ячейки
    Color: TColor;                // Цвет фона
    // ВАЖНО ! При установке цвета фона следует учитывать, что палитра цветов
    // Excel`а существенно отличается от принятого в Windows, что может привести
    // к тому, что вместо светло-серого ячейки окрасятся в черный, т.к. полутона
    // екселем интерпретируются в полный, насыщенный цвет палитры RGB
  end;
 
  RXLExp_Region = record
    ColLeft: word;                // Колонка начала
    RowTop: word;                 // Строка начала
    ColRight: word;               // Колонка конца
    RowBottom: word;              // Строка конца
    JoinCells: boolean;           // Объединения ячеек (только для региона)
    Text: string;                 // Текст в ячейках
  end;
 
// Открывает Excel-объект для вывода отчета
procedure XLExp_OpenReport(TemplateName: OleVariant);
 
// Закрывает Excel-объект
procedure XLExp_CloseReport;
 
// Устанавливает свойства ячеек в заданном районе
procedure XLExp_SetCellsProp(Region: RXLExp_Region; CellsProp: RXLExp_CellsProp);
 
// Возращает объект "Свойства" для указанного района ячеек
procedure XLEXP_GetCellsProp(Region: RXLExp_Region; var CellsProp: RXLExp_CellsProp);
 
// Задать ширину колонки
procedure XLExp_SetColumnWidth(Col,Width: integer);
 
// Слить ячейки в одну область
procedure XLExp_MergeCells(Region: RXLExp_Region);
 
// Запись в указанный район ячеек текста со слитием ячеек, выравниванием по центру
// и заданным размером и типом шрифта
procedure XLExp_CaptionInRange(Region: RXLExp_Region; Txt: string;
       FntSize: word; FntStyle: SXLExp_FontStyle; Mrg: boolean);
 
// Процедура обводит ячейки указанного района листа решеткой заданной ширины
procedure XLExp_DrowBorder(Region: RXLExp_Region; Brd: CXLExp_BorderStyle);
 
// Занести текст в указанную ячейку
function XLExp_SetDataInCell(Index1,Index2: OleVariant; Data: string):string;
 
procedure XLExp_DataSetExport(Range:OleVariant; DataSet:TDataSet);
 
function XLExp_ShowReport: boolean;
 
function XLExp_GetLastRow(Range:OleVariant; DataSet:TDataSet):integer;
 
var
  XLExp_Report: TExcelApplication;
  XLExp_WorkBook: Excel2000.ExcelWorkBook;
  XLExp_Sheet: Excel2000.ExcelWorkSheet;
  XLExp_Col: array [1..40] of string=('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AE','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM');
 
implementation
 
uses TypInfo, SysConst, MaskUtils, Math, Registry;
 
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_CloseReport;
// Процедура закрывет Excel-приложение и освобождает занятые им ресурсы
begin
  if Assigned(XLExp_Report) then
    begin
     XLExp_Sheet:=nil;
     XLExp_Workbook:=nil;
     FreeAndNil(XLExp_Report);
    end;
end;
 
procedure XLEXP_SetCellsProp(Region: RXLExp_Region; CellsProp: RXLExp_CellsProp);
// Присваивает ячейкам заданного района указанные свойства
begin
  with XLExp_Sheet.Range[XLExp_Col[Region.ColLeft]+IntToStr(Region.RowTop),
                    XLExp_Col[Region.ColRight]+IntToStr(Region.RowBottom)] do
    begin
     case CellsProp.Align.Hor of
       ehaLeft: HorizontalAlignment := xlLeft;
       ehaRight: HorizontalAlignment := xlRight;
       ehaCenter: HorizontalAlignment := xlCenter;
       ehaNone: HorizontalAlignment := xlDefaultAutoFormat;
     end;
     case CellsProp.Align.Vert of
       evaResize: VerticalAlignment := xlGeneral;
       evaMultiLine: VerticalAlignment := xlDistributed;
       evaTop: VerticalAlignment := xlTop;
       evaBottom: VerticalAlignment := xlBottom;
       evaCenter: VerticalAlignment := xlCenter;
       evaNone: VerticalAlignment := xlDefaultAutoFormat;
     end;
     WrapText := CellsProp.Align.WrdWrap;
     Font.Bold := fsBold in CellsProp.Font.Style;
     Font.Italic := fsItalic in CellsProp.Font.Style;
     Font.Strikethrough := fsStrikeOut in CellsProp.Font.Style;
     Font.Subscript := fsUnderline in CellsProp.Font.Style;
     Font.Color := CellsProp.Font.Color;
     Font.Size := CellsProp.Font.Size;
     if CellsProp.Font.Name>'' then Font.Name := CellsProp.Font.Name;
     Interior.Color := CellsProp.Color;
     if CellsProp.Width>-1 then Columns.ColumnWidth := CellsProp.Width;
     if CellsProp.Height>-1 then Rows.RowHeight := CellsProp.Height;
     MergeCells := Region.JoinCells;
     if Region.Text>'' then Value := Region.Text;
    end;
    //--------------------------------------------------------------------------
    //преобразование формата в ячеек в текстовый всю выделенную область
    XLExp_Sheet.Range[XLExp_Col[Region.ColLeft]+IntToStr(Region.RowTop),
    XLExp_Col[Region.ColRight]+IntToStr(Region.RowBottom)].NumberFormat:= '@';
    // @ этот параметр устанавливает текстовый формат
    // 0 - числовое значение
    // m/d/yyyy - дата
    // #,##0.00$ - денежный
    //--------------------------------------------------------------------------
end;
 
procedure XLEXP_GetCellsProp(Region: RXLExp_Region; var CellsProp: RXLExp_CellsProp);
// Возращает объект "Свойства" для указанного района ячеек
begin
  with XLExp_Sheet.Range[XLExp_Col[Region.ColLeft]+IntToStr(Region.RowTop),
                    XLExp_Col[Region.ColRight]+IntToStr(Region.RowBottom)] do
    begin
     CellsProp.Align.WrdWrap := WrapText;
     CellsProp.Font.Style := [];
     if Font.Bold then Include(CellsProp.Font.Style,fsBold);
     if Font.Italic then Include(CellsProp.Font.Style,fsItalic);
     if Font.Strikethrough then Include(CellsProp.Font.Style,fsStrikeOut);
     if Font.Subscript then Include(CellsProp.Font.Style,fsUnderline);
     CellsProp.Font.Color := Font.Color;
     CellsProp.Color := Interior.Color;
 
     if CellsProp.Width>-1 then Columns.ColumnWidth := CellsProp.Width;
     if CellsProp.Height>-1 then Rows.RowHeight := CellsProp.Height;
     Region.JoinCells := MergeCells;
    end;
end;
 
procedure XLExp_SetColumnWidth(Col,Width: integer);
// Изменить ширину колонки
begin
  XLExp_Sheet.Range[XLExp_Col[Col]+'1',XLExp_Col[Col]+'1'].ColumnWidth := Width + 1;
end;
 
procedure XLExp_MergeCells(Region: RXLExp_Region);
// Слить ячейки
begin
  XLExp_Sheet.Range[XLExp_Col[Region.ColLeft]+IntToStr(Region.RowTop),
                    XLExp_Col[Region.ColRight]+IntToStr(Region.RowBottom)].MergeCells := true;
end;
 
procedure XLExp_CaptionInRange(Region: RXLExp_Region; Txt: string;
       FntSize: word; FntStyle: SXLExp_FontStyle; Mrg: boolean);
// Запись в указанный район ячеек текста со слитием ячеек, выравниванием по центру
// и заданным размером и типом шрифта
begin
  with XLExp_Sheet.Range[XLExp_Col[Region.ColLeft]+IntToStr(Region.RowTop),
                    XLExp_Col[Region.ColRight]+IntToStr(Region.RowBottom)] do
   begin
    if Mrg then MergeCells := true;
    Formula := Txt;
    HorizontalAlignment := xlCenter;
    VerticalAlignment := xlCenter;
    Font.Size := FntSize;
    Font.Bold := (efsBold in FntStyle);
    Font.Italic := (efsItalic in FntStyle);
   end;
end;
 
procedure XLExp_DrowBorder(Region: RXLExp_Region; Brd: CXLExp_BorderStyle);
// Процедура обводит указанный район листа рамкой заданного типа
begin
  with XLExp_Sheet.Range[XLExp_Col[Region.ColLeft]+IntToStr(Region.RowTop),
                    XLExp_Col[Region.ColRight]+IntToStr(Region.RowBottom)].Borders do
    begin
     LineStyle := xlContinuous;
     case Brd of
       ebsThin: Weight := xlThin;
       ebsMedium: Weight := xlMedium;
       ebsThick: Weight := xlThick;
     end;
    end;
end;
 
function XLExp_SetDataInCell(Index1,Index2: OleVariant; Data: string): string;
// Записывает заданный текст в указанную ячейку
begin
  XLExp_Report.ActiveWorkbook;     // Активировать текущую книгу
  // Лист книги, в котором править ячейку
  XLExp_Sheet := XLExp_Workbook.Worksheets.Item[1] as Excel2000.ExcelWorkSheet;
  // Присвоение ячейке заданного значения
  XLExp_Sheet.Cells.Item[Index1,Index2].Value := Data;
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..39] 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;
 
function XLExp_ShowReport: boolean;
// Показать лист Excel`а для правки, сохранения и печати
begin
  result := false;
  if Assigned (XLExp_Report) then
    begin
     XLExp_Report.WindowState[0] := Excel2000.xlMaximized;
     XLExp_Report.Visible[0] := true;
     XLExp_Report.ScreenUpdating[0] := true;
     result := true;
    end;
end;
 
function XLExp_GetLastRow(Range: OleVariant; DataSet: TDataSet): integer;
// Возвращает индекс следующей за последней строкой (Row) листа,
// занятой (или которая будет занята после заливки данных из НД) данными.
// Начиная с этой строки можно располагать итоги или подвал документа
begin
  XLExp_GetLastRow:=XLExp_Sheet.Range[Range,EmptyParam].Row+DataSet.RecordCount;
end;
 
end.
Добавлено через 1 минуту
Delphi
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
// Содержит процедуры автовывода отображаемого в DBGrid` НД
//  в книгу Excel
unit XLRepGrid;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, ComObj, Excel2000, OleServer,
  DB, DBGrids, Variants, XLReps, Graphics;
 
procedure XLRep_ExportFromDBGrid(Grid: TDBGrid; RepCaption: string);
 
implementation
 
uses Math;
 
procedure XLRep_ExportFromDBGrid(Grid: TDBGrid; RepCaption: string);
// Выводятся только колонки с Visible=true и Field.Tag>0 (последнее для
// блокировки вывода "фантомных" колонок, где отображается не поле
// датасета, а, например, картинка
type
  // Описатель печатной колонки
  TXLRep_GridCol = ^RXLRep_GridCol;
  RXLRep_GridCol = record
    Title: string;
    FldName: string;
    FldNdx: Shortint;
    Width: integer;
    AgrSum: extended;
    AgrFlg: boolean;
    Alignment: TAlignment;
    Font: RXLExp_Font;
  end;
 
var
  i,r: integer;
  bm: TBookMark;
  GridRep: TList;
  pc: TXLRep_GridCol;
  rg: RXLExp_Region;
  cs: RXLExp_CellsProp;
  VA: OleVariant;
  ascroll: TDataSetNotifyEvent;
 
begin
  GridRep := TList.Create;
  ascroll := nil;
  // Анализ грида и связанного с ним датасета
  for i := 0 to Grid.Columns.Count-1 do
    if Grid.Columns[i].Visible and (Grid.Columns[i].Field<>nil) and
       (Grid.Columns[i].Field.Tag>0) then
      begin
       NEW(pc);
       pc.Title := Grid.Columns[i].Title.Caption;
       pc.FldName := Grid.Columns[i].FieldName;
       pc.FldNdx := Grid.Columns[i].Field.Index;
       pc.Width := Grid.Columns[i].Width;
       pc.AgrSum := 0;
       pc.AgrFlg := (Grid.Columns[i].Field.Tag>1);
       pc.Alignment := Grid.Columns[i].Alignment;
       with pc.Font do
         begin
          Size := Grid.Columns[i].Font.Size;
          Name := Grid.Columns[i].Font.Name;
          Style := Grid.Columns[i].Font.Style;
         end;
       GridRep.Add(pc);
      end;
  // Подконнектиться к Экселю с открытием новой книги
  XLExp_OpenReport('');
  // Определяем ширину колонок в Excel как ширина колонки грида в пикселах,
  //  деленная на 8 (Эксель "меряет" ширину в кол-ве условных символов цифр
  //  фонта по умолчанию (Arrial Cyr, обычный, 10)
  for i := 0 to GridRep.Count-1 do
     XLExp_SetColumnWidth(i+1,TXLRep_GridCol(GridRep[i])^.Width div 8);
  // ************************  ЗАГОЛОВОК ОТЧЕТА ***************************
  with rg do
    begin
     ColLeft := 1; ColRight := GridRep.Count;    // Ширина на все колонки
     RowTop := 1; RowBottom := 1;                // 1-я строка листа под заголовок
     JoinCells := true;                          // Объединить ячейки
     Text := RepCaption;                         // Текст заголовка
    end;
  with cs do
    begin
     Align.Hor := ehaCenter; Align.Vert := evaMultiLine;  // Центровка по высоте и ширине
     Font.Size := 13; Font.Style := [fsBold,fsItalic]; // Шрифт крупный, жирный, наклонный
     Font.Color := clWindowText;                 // Черный цвет символов
     Color := clWhite;                           // Белый фон
     Width := -1;                                // Ширину колонок не менять
     Height := 42;                               // Высота строки двойная
    end;
  XLEXP_SetCellsProp(rg,cs);                     // Разметка ячеек и занесение текста
  // ************************  ШАПКА ТАБЛИЦЫ ***************************
  // Вторую строку отводим под шапку таблицы, размечаем ячейки под
  // названия колонок
  // и помещаем туда название колонок из титула грида.
  with rg do
    begin
     RowTop := 2; RowBottom := 2;                // Вторая строка листа под шапку
     JoinCells := false; Text := '';             // Ячейки не объединять и не заполнять
    end;
  with cs do
    begin
     Align.Hor := ehaCenter; Align.Vert := evaMultiLine;  // Выравнивать по центру и с переносом слов
     Font.Size := 10; Font.Style := [fsBold];    // Шрифт чуть крупнее обычного и жирный
     Height := 28;                               // Высота строки двойная
    // Color := clSilver;                          // Серый фон шапки
    end;
  XLEXP_SetCellsProp(rg,cs);                     // Разметка ячеек
  XLExp_DrowBorder(rg,ebsMedium);                // Нанесение сетки
  // Занесение заголовков в шапку
  for i := 0 to GridRep.Count-1 do
     XLExp_SetDataInCell(rg.RowTop,i+1,TXLRep_GridCol(GridRep[i])^.Title);
  // *********** СОЗДАНИЕ МАССИВА И ЗАПОЛНЕНИЕ ЕГО ДАННЫМИ ДАТАСЕТА ************
  with Grid.DataSource.DataSet do
    begin
     bm := GetBookmark;         // Запомнить текущую запись
     DisableControls;           // Запрет отображения
     if Assigned(AfterScroll) then// отключение режима AfterScroll
       Begin
         ascroll := AfterScroll;// передача содержимого процедуры AfterScroll переменной
         AfterScroll := nil;    // установление режиму AfterScroll пустого значение
       end;
     Last; First;               // Извлечь все записи с сервера
     r := 0;
     // Создать пустой массив вариантов
     VA := VarArrayCreate([0,RecordCount-1,0,GridRep.Count],varVariant);
     while not eof do
       begin
        inc(r);
        for i := 0 to GridRep.Count-1 do
          begin
           pc := TXLRep_GridCol(GridRep[i]);
           VA[RecNo-1,i] := FieldByName(pc.FldName).AsString;
           //VA[RecNo-1,i] := FieldByName(pc.FldName).AsVariant;
           if pc.AgrFlg then pc.AgrSum := pc.AgrSum +FieldByName(pc.FldName).AsFloat;
          end;
        Next;
       end;
     GotoBookmark(bm);          // Вернуться в исходную запись
     FreeBookmark(bm);
     AfterScroll := ascroll;// возвращение режиму AfterScroll прежнего значение процедуры
     EnableControls;            // Разрешение отображения
    end;
  // Выставить свойства колонок таблицы аналогично колонкам грида
  for i :=0 to GridRep.Count-1 do
    begin
     with rg do
       begin
        ColLeft := i+1; ColRight := ColLeft;
        RowTop := 3; RowBottom := RowTop+r-1;
        JoinCells := false; Text := '';
       end;
     with cs do
       begin
        Font := TXLRep_GridCol(GridRep[i])^.Font;
        Font.Color := clWindowText;
        case TXLRep_GridCol(GridRep[i])^.Alignment of
          taLeftJustify: Align.Hor := ehaLeft;
          taRightJustify: Align.Hor := ehaRight;
          taCenter: Align.Hor := ehaCenter;
        end;
        Height := 13;
       end;
     XLEXP_SetCellsProp(rg,cs);
    end;
  with rg do
    begin
     ColLeft := 1; ColRight := GridRep.Count;
     RowTop := 3; RowBottom := RowTop+r-1;
    end;
  XLExp_DrowBorder(rg,ebsThin);     // Покрыть таблицу сеткой
  // Заполнение ячеек данными массива
  XLExp_Sheet.Range[XLExp_Col[rg.ColLeft]+IntToStr(rg.RowTop),
     XLExp_Col[rg.ColRight]+IntToStr(rg.RowBottom)].Value := VA;
  VarArrayRedim(VA,0);   // Убить массив
  // Создать массив итогов
  VA := VarArrayCreate([0,GridRep.Count-1],varVariant);
  // Записать в него итоги по колонкам
  for i := 0 to GridRep.Count-1 do
    if TXLRep_GridCol(GridRep[i])^.AgrFlg then
      VA[i] := FloatToStr(TXLRep_GridCol(GridRep[i])^.AgrSum)
    else
      VA[i] := '';
  // Разметить строку для итогов
  with rg do       // Выделяем строку, через одну от последней табличной.
    begin
     ColLeft := 1; ColRight := GridRep.Count;
     RowBottom := RowTop+r+1; RowTop := RowBottom;
    end;
  // Устанавливаем свойства ячеек, аналогично табличным колонкам
  XLEXP_SetCellsProp(rg,cs);
  // Заполнение ячеек итогов данными массива
  XLExp_Sheet.Range[XLExp_Col[rg.ColLeft]+IntToStr(rg.RowTop),
     XLExp_Col[rg.ColRight]+IntToStr(rg.RowBottom)].Value := VA;
  VarArrayRedim(VA,0);   // Убить массив
  // Вывестти отчет на просмотр
  XLExp_ShowReport;
  XLExp_CloseReport;
end;
 
end.
1
 Аватар для Slimmi
2 / 2 / 0
Регистрация: 28.03.2008
Сообщений: 64
24.07.2011, 18:50  [ТС]
и что, как, куда это вот такое бАльшОЕ?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.07.2011, 19:06
Что касается АДО + MySQL..
С мускулом не работал почти, посему не шибко грамотен, но ...

посмотрите здесь:
http://delphi.about.com/od/mys... doconn.htm

Что же касается создания вьюх (несколько странный "заказ" ибо создание (правка) бизнес-логики не "крестьяноское", т.е. пользовательскте дело), то см. DDL SQL for MySQL, пишите запрос типа CREATE (ALTER) VIEW ... , суйте его в TADOCommand и выполняйте

Добавлено через 8 минут
Delphi
1
и что, как, куда это вот такое бАльшОЕ?
я предупреждал однако

нормальный код - это .. не детей делать, тут вдумчивость нужна, усердие, закалка, тренировка... в общем просто добавьте эти юниты в проект, в модуле с Вашим гридом добавьте в uses XL_RepGrid, а в обработчике кнопки вместо вызова Put....
XLRep_ExportFromDBGrid(<Ваш грид>; 'Красивый отчет из моего грида');

Да, два момента.
Во-первых, для проверки выгрузки в эксель выполняйте не F9 как обычно, а Project->Build Project1 и запуск программы из винды (не из делфи). Либо отключите отладчик. Иначе при выполнении блока загрузки новой книги (там для разных офисов сделано) будет вываливаться в отладчик
1
 Аватар для Slimmi
2 / 2 / 0
Регистрация: 28.03.2008
Сообщений: 64
24.07.2011, 19:08  [ТС]
так а можно немного поподробнее про пост 26, для чего первый юнит и для чего процедура, что мне лучше использовать и как и что передавать, желательно пример строки вызова процедуры.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.07.2011, 19:20
первый юнит для того, что без него не будет работать аторой, из которого собсна Вы и вызываете процедуру.
А чего, куда и как я все написал в [28] предпоследний абзац - читайте уважно
0
 Аватар для Slimmi
2 / 2 / 0
Регистрация: 28.03.2008
Сообщений: 64
24.07.2011, 19:40  [ТС]
ошибочку выдает некую блин, как обычно. Первую часть закинул в новый юнит, второй закинул в рабочий юнит, пишет
[DCC Fatal Error] Unit1.pas(8): F1026 File not found: 'XL_RepGrid.dcu'

Добавлено через 30 секунд
кстати, как отрубить отладчик?

Добавлено через 11 минут
и такая вот ошибка, чет в названии большого юнита
[DCC Error] Unit3.pas(1): E1038 Unit identifier 'XLReps' does not match file name
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.07.2011, 20:19
Вы опять делаете не точно как Вам сказали, а протом еще ругаетесь. Вам было сказано добавить ДВА юнита, т.е. добавить в форму ДВА новых юнита, туда скопировать содержимое поста, потом внести изменения как Вам было сказано, потом откомпилить. А что делаете Вы ?
Короче, на сегодня прощаюсь. Код у Вас имеется, а как его прикрутить - соображайте
1
 Аватар для Slimmi
2 / 2 / 0
Регистрация: 28.03.2008
Сообщений: 64
24.07.2011, 23:01  [ТС]
я не ругался, просто не так прочитал, торопился, бежать надо было, а сейчас, когда пришел, попробовал все сделать как Вы сказали, все тоже ничего не получилось. Вот только у меня вопрос, к делфи ничего дополнительного ставить не надо? и XLRep и все что с ним связано это стандартная штука?

Добавлено через 41 минуту
ВОбщем жаль, очень жаль конечно что Вы ушли, но реально, сделал все как было сказано выше, ошибка повторилась. ТОли я чет не так делаю, толи руки кривые, вобщем беда.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
25.07.2011, 00:57
Ушел потому что тема перестала быть мне интересной в смысле более нечего сказать.
Но на прощание резюмирую:

Вывод в Эксель (да и вообще работа с офисом в делфи), да еще с использованием шаблонов, штука не элементарная и для ее реализации надо кое-что уметь и кое-что знать. Просто скопипастить что-то и чтоб все заработало - это вряд ли. Я дал Вам не толко идею, но и пример реализации. Вы можете просто интегрировать мой код в свой проект и малыми силами получить РАЗОВЫЙ результат, так и не получив ни знаний, ни навыков.

А можете написать свой "системный" модуль, куда вставить этот код. Дополняя впоследствии этот модуль своими полезными процедурами и классами, Вы можете расширить его до библиотеки (своего рода расширения VCL), которую подключить к среде. И использовать эту библиотеку при разработке ЛЮБЫХ проектов, существенно сокращая время и получая качественный код в самых разнообразных приложениях. Эти два юнита являются частью именно такой моей библиотеки.

А можете написать свой код выгрузки в эксель, руководствуясь этим кодом как примером. Можно также нарыть в тырнете массу примеров других авторов (кстати, неоднократно встречал код гораздо лучше моего). В итоге - самостоятельно (пусть и глядя на пример) решив эту задачу, Вы реально не только повысите свою квалификацию, но и получите удовлетворение от собственного успеха.

Самое главное - подходить к програмиированию творчески, а не как скубент-двоешник, которому "завтра сдавать". И ищущему любое ГОТОВОЕ решение как панацею.
0
 Аватар для Slimmi
2 / 2 / 0
Регистрация: 28.03.2008
Сообщений: 64
25.07.2011, 02:21  [ТС]
благодарю!
0
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 11
11.04.2012, 14:27
пытаюсь выдать в экзель данные из эхлибовского дбгрида, выдает ошибку (
заменил TDBGrid на TDBGridEh

procedure XLRep_ExportFromDBGrid(Grid: TDBGridEh; RepCaption: string);

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x00408c7c: read of address 0xfffffff9'.
---------------------------
Break Continue Help
---------------------------

не подскажете что нужно сделать?

Добавлено через 28 минут
c DBgrid та же ошибка (
использую XE2
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2012, 14:27

Передача символов в переменную FastReports
Кто знает как передать значение текстовой переменной в переменную FastReports ? читал тут топики...пробовал по разному но всегда 1 и...

Как установить компонент FastReports?
Всем привет еще раз)) Установил программу FastReports, а при компиляции выдает ошибку( Помогите как можно еще скомпилировать???? Срочно...

Fastreports net conversion error from string
Пишу запрос: select * from patient INNER JOIN oprs ON patient.uid = oprs.uid INNER JOIN n_otd ON oprs.otd =...

Access violetion in module 'fs10.bpl' FastReports
Кто знает, в чем тут дело ? Выдает ошибку Access violetion at address 003BA99C in module 'fs10.bpl'

Обращение в ADOquery к ADOquery
Доброго времени суток. Вопрос заключается в следующем: Имеется подключенная бд *.mdb к delphi В delphi есть запрос на основе одной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru