С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
24 / 2 / 0
Регистрация: 25.01.2021
Сообщений: 134

Отчет в Excel c возможностью выбора периода дат

14.02.2023, 23:05. Показов 1609. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно сделать отчет в Excel с возможностью выбора периода дат, за который были сделаны заказы и в конце с общая сумма всех заказов.
Код самого отчета у меня есть, непонятно только, как нужно усовершенствовать код.
Я пыталась найти способ как это сделать, но не вышло...Знаю что нужно использовать DateTimePicker, но как его настроить на работу с кодом не знаю
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.02.2023, 23:05
Ответы с готовыми решениями:

Отчет с указанием периода дат
Создал базу, настроил запрос все выдает как надо. Но в отчете надо что бы выдавало период запроса. В запросе все работает. Спрашивает с...

СУММЕСЛИМН для периода дат
Всем доброго времени суток... Помогите пожалуйста ещо в одной проблеме...Недавно мне на этом сайте очень помогли в одном решение. Работа...

Выборка дат из заданного периода
Здравствуйте, столкнулась с такой задачей в MS Access 2007: нужно сделать выборку дат за определенный период. Подскажите пожалуйста как...

22
5953 / 4529 / 1094
Регистрация: 29.08.2013
Сообщений: 28,121
Записей в блоге: 3
15.02.2023, 00:24
если отчет в экселе, то при чем тут Delphi?
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
15.02.2023, 02:10
Цитата Сообщение от heatingtea Посмотреть сообщение
Код самого отчета у меня есть, непонятно только, как нужно усовершенствовать код.
А у нас его нет. И каких тогда советов по усовершенствованию Вы от нас ждете?
0
126 / 106 / 20
Регистрация: 23.05.2015
Сообщений: 694
15.02.2023, 08:27
heatingtea, Если это по теме с той же базой, делаем так:

При нажатии кнопки вывести отчет создаем небольшую форму, содержащую два MaskEdit, кнопки Сформировать и Отменить (примерно как на картинке).
При нажатии на Отменить - форму закрываем, При нажатии на сформировать - формируем SQL запрос на выборку нужных данных в котором в котором после Where указываем диапазон дат взятых из наших MaskEdit.
Например:
Delphi
1
2
3
4
5
6
7
DM1.QROOMS2.SQL.Clear;
DM1.QROOMS2.SQL.Add('Select DISTINCT LA, Status From ROOMS WHERE (DV between :Prm1 AND :Prm2) and (Status<>:Prm3) Order By DV');
DM1.QROOMS2.Params.ParamByName('Prm1').Value:=MaskEdit1.Text;
DM1.QROOMS2.Params.ParamByName('Prm2').Value:=MaskEdit2.Text;
DM1.QROOMS2.Params.ParamByName('Prm3').Value:='C';
DM1.QROOMS2.Open;
DM1.QROOMS2.First;
При этом, желательно предусмотреть защиту от некорректного ввода дат.
Например:
Delphi
1
2
3
4
5
6
7
{Проверяем даты}
 If StrToDate(MaskEdit1.Text)>StrToDate(MaskEdit2.Text) Then
 begin
 MessageDlg('Начальная дата '+Chr(13)+'не может быть больше конечной даты!', mtInformation, [mbOk], 0);
 MaskEdit1.SetFocus;
 exit;
 end;
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm8.MaskEdit1Exit(Sender: TObject);
var dt : TDateTime;
begin
    if not TryStrToDate(MaskEdit1.Text, dt) then
  begin
     ShowMessage('Не верно введена начальная дата - повторите ввод.');
     MaskEdit1.Text :='';
     MaskEdit1.SetFocus;
  end;
end;
На основе полученных данных, формируем запрос и выводим его в ExcelensCells
В общем - пробуйте.
1
126 / 106 / 20
Регистрация: 23.05.2015
Сообщений: 694
15.02.2023, 08:32
Да сама картинка:
Миниатюры
Отчет в Excel c возможностью выбора периода дат  
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
15.02.2023, 08:47
Стесняюсь спросить, а зачем для ввода даты использовать MaskEdit, а не компонент, предназначенный ровно для этих целей - TDateTimePicker? Сразу отпадет надобность в проверке - там некорректную дату просто не ввести.
0
126 / 106 / 20
Регистрация: 23.05.2015
Сообщений: 694
15.02.2023, 09:31
D1973, Да, я думаю что вы совершенно правы.
Писано сие дело было давненько... Когда деревья были большими . . .
0
24 / 2 / 0
Регистрация: 25.01.2021
Сообщений: 134
15.02.2023, 21:10  [ТС]
SeGun здравствуйте, а можно ли это сделать без новой формы, а на той же? и обязательно ли использовать еще один dbgrid?
0
126 / 106 / 20
Регистрация: 23.05.2015
Сообщений: 694
15.02.2023, 21:39
Цитата Сообщение от heatingtea Посмотреть сообщение
SeGun здравствуйте, а можно ли это сделать без новой формы, а на той же? и обязательно ли использовать еще один dbgrid?
Да конечно можно, просто нужно будет найти место для 2х DataPicker(ов) из которых пользователь должен выбрать диапазон дат. Второй DBGrid не нужен, он на картинке для других целей.
1
24 / 2 / 0
Регистрация: 25.01.2021
Сообщений: 134
16.02.2023, 13:36  [ТС]
Цитата Сообщение от SeGun Посмотреть сообщение
При нажатии на сформировать - формируем SQL запрос на выборку нужных данных в котором в котором после Where указываем диапазон дат взятых из наших MaskEdit.
Не понимаю, у меня есть код отчета в кнопке вывести отчет, нужно перед основным кодом вставить ваш?
0
126 / 106 / 20
Регистрация: 23.05.2015
Сообщений: 694
16.02.2023, 17:50
Цитата Сообщение от heatingtea Посмотреть сообщение
Не понимаю, у меня есть код отчета в кнопке вывести отчет, нужно перед основным кодом вставить ваш?
Думаю не все так просто. Сейчас попробую разобраться в вашем коде. . .
0
126 / 106 / 20
Регистрация: 23.05.2015
Сообщений: 694
16.02.2023, 19:51
Лучший ответ Сообщение было отмечено heatingtea как решение

Решение

Для примера, добавьте заказ сегодняшним днем.
В общем как-то так:

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
{---Вывод в Excel журнала заказов---}
procedure TForm4.Button28Click(Sender: TObject);
var
   ExcelApp,Sheet,Colum:Variant;
   index,i:Integer;
begin
    If DateTimePicker1.Date >DateTimePicker2.Date Then
 begin
 MessageDlg('Начальная дата '+Chr(13)+'не может быть больше конечной!', mtInformation, [mbOk], 0);
 DateTimePicker1.SetFocus;
 exit;
 end;
    ExcelApp:=CreateOleObject('Excel.Application');
   ExcelApp.Application.EnableEvents:=False;
   ExcelApp.Workbooks.Add(-4167);
   ExcelApp.Workbooks[1].WorkSheets[1].Name:='Журнал заказов';
   ExcelApp.Range['A1:F1'].Select;
   ExcelApp.Selection.MergeCells:=True;
   ExcelApp.DisplayAlerts:=False;
 
   Colum:=ExcelApp.Workbooks[1].WorkSheets['Журнал заказов'].Rows;
   Colum.Rows[1].Font.Bold:=true;
   Colum.Rows[1].Font.Size:=18;
   Colum.Rows[2].Font.Bold:=true;
   Colum.Rows[2].Font.Size:=14;
   Colum.Rows.Font.Name:='Times New Roman';
 
   Sheet:=ExcelApp.Workbooks[1].WorkSheets['Журнал заказов'];
   Sheet.Cells[1,1]:='Журнал заказов';
   Sheet.Cells[1,1].HorizontalAlignment:=3;
   Sheet.Cells[2,1]:='Номер заказа';
   Sheet.Cells[2,1].HorizontalAlignment:=3;
   Sheet.Cells[2,2]:='Сотрудник';
   Sheet.Cells[2,2].HorizontalAlignment:=3;
   Sheet.Cells[2,3]:='Клиент';
   Sheet.Cells[2,3].HorizontalAlignment:=3;
   Sheet.Cells[2,4]:='Столик';
   Sheet.Cells[2,4].HorizontalAlignment:=3;
   Sheet.Cells[2,5]:='Дата';
   Sheet.Cells[2,5].HorizontalAlignment:=3;
   Sheet.Cells[2,6]:='Итого';
   Sheet.Cells[2,6].HorizontalAlignment:=3;
   //Задаем начальные значения DataTimePicker с разницей в 1 день от сегодняшнего числа
  // Form4.Caption:= DateToStr( DateTimePicker1.DateTime-1 );
  {  DateTimePicker1.Date:=Now();
    DateTimePicker1.Date:= DateTimePicker1.Date-1;
    Form4.Caption := DateToStr( DateTimePicker1.Date );
   }
     DataModule1.ADOQuery7.SQL.Clear;
   DataModule1.ADOQuery7.SQL.Text:='SELECT * FROM Журнал Where Дата between :p1 AND :p2';
 DataModule1.ADOQuery7.Parameters.ParamByName('p1').Value := DateToStr(DateTimePicker1.Date);
 DataModule1.ADOQuery7.Parameters.ParamByName('p2').Value := DateToStr(DateTimePicker2.Date+1);
   DataModule1.ADOQuery7.Open;
   index:=3;
   DataModule1.ADOQuery7.First;
   While NOT DataModule1.ADOQuery7.EOF Do
   begin
 //ShowMessage (DataModule1.ADOQuery7.Fields.Fields[9].AsString);
   Sheet.Cells[index,1]:=DataModule1.ADOQuery7.Fields.Fields[4].AsString;
   Sheet.Cells[index,2]:=DataModule1.ADOQuery7.Fields.Fields[5].AsString;
   Sheet.Cells[index,3]:=DataModule1.ADOQuery7.Fields.Fields[6].AsString;
   Sheet.Cells[index,4]:=DataModule1.ADOQuery7.Fields.Fields[7].AsString;
   Sheet.Cells[index,5]:=DataModule1.ADOQuery7.Fields.Fields[8].AsString;
   Sheet.Cells[index,6]:=DataModule1.ADOQuery7.Fields.Fields[9].AsString;
   Inc(index);
   DataModule1.ADOQuery7.Next;
end;
   ExcelApp.Columns.AutoFit;
   ExcelApp.Visible:=True;
   DataModule1.ADOQuery7.Close;
   DataModule1.ADOQuery7.SQL.Clear;
   DataModule1.ADOQuery7.SQL.Text:='SELECT * FROM Журнал';
   DataModule1.ADOQuery7.Open;
   
end;
procedure TForm4.FormShow(Sender: TObject);
begin
//Задаем начальные значения   DateTimePickers
  DateTimePicker1.Date:=Now();
    DateTimePicker1.Date:= DateTimePicker1.Date-1;
    DateTimePicker2.Date:=Now();
end;
Миниатюры
Отчет в Excel c возможностью выбора периода дат  
1
126 / 106 / 20
Регистрация: 23.05.2015
Сообщений: 694
16.02.2023, 20:22
Небольшое уточнение:
Delphi
1
2
  Sheet:=ExcelApp.Workbooks[1].WorkSheets['Журнал заказов'];
 Sheet.Cells[1,1]:='Журнал заказов за период c '+DateToStr(DateTimePicker1.Date)+' по '+DateToStr(DateTimePicker1.Date+1);
Шапочку подправил. . .
1
24 / 2 / 0
Регистрация: 25.01.2021
Сообщений: 134
16.02.2023, 20:37  [ТС]
Спасибо! Только у меня почему-то ошибка
Миниатюры
Отчет в Excel c возможностью выбора периода дат  
0
24 / 2 / 0
Регистрация: 25.01.2021
Сообщений: 134
16.02.2023, 20:45  [ТС]
Может быть я что-то не так сделала
Вложения
Тип файла: rar Progа (2).rar (468.2 Кб, 5 просмотров)
0
24 / 2 / 0
Регистрация: 25.01.2021
Сообщений: 134
16.02.2023, 21:00  [ТС]
Ой извините, не прописала процедуру FormShow в начале, теперь работает, СПАСИБО!!!

Добавлено через 7 минут
Только как быть с итогом за период в отчете?
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
17.02.2023, 07:42
Цитата Сообщение от heatingtea Посмотреть сообщение
Ой извините, не прописала процедуру FormShow в начале
Ее не надо "прописывать", ее надо создавать через закладку Events ObjectInspector-а. И не процедура это, а метод класса формы.
1
126 / 106 / 20
Регистрация: 23.05.2015
Сообщений: 694
17.02.2023, 08:38
Цитата Сообщение от heatingtea Посмотреть сообщение
Только как быть с итогом за период в отчете?
Итог за период, будем формировать отдельным запросом и вставлять в конце.

А в этом месте все же так:
Delphi
1
2
Sheet:=ExcelApp.Workbooks[1].WorkSheets['Журнал заказов'];
 Sheet.Cells[1,1]:='Журнал заказов за период c '+DateToStr(DateTimePicker1.Date)+' по '+DateToStr(DateTimePicker1.Date);
1
24 / 2 / 0
Регистрация: 25.01.2021
Сообщений: 134
17.02.2023, 09:24  [ТС]
DateTimePicker2.Date вроде, да?
0
126 / 106 / 20
Регистрация: 23.05.2015
Сообщений: 694
17.02.2023, 12:46
Да. Так правильно. . . не увидел.

Delphi
1
 Sheet.Cells[1,1]:='Журнал заказов за период c '+DateToStr(DateTimePicker1.Date)+' по '+DateToStr(DateTimePicker2.Date);
Добавлено через 8 минут
Цитата Сообщение от SeGun Посмотреть сообщение
Сообщение от heatingtea
Только как быть с итогом за период в отчете?
Можно посчитать сумму по всем заказам за период, в цикле перебирая полученный запрос и накапливая сумму.
Так что и дополнительный запрос не понадобится.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.02.2023, 12:46
Помогаю со студенческими работами здесь

Разбиение периода дат на составляющие
Всем привет. Не могу понять, как можно растянуть диапазон дат на составляющие... Есть, например, данные в ячейке &quot;2000-2005&quot;....

Расчет периода разности дат
Здравствуйте! Кто может помочь? Не могу понять где ошибаюсь. Есть на форме четыре поля: ДатаНачала, ДатаОкончания, ТекущаяДата, СтажРаботы....

Передать параметры Периода в Отчет
Всем привет, сорри за простой вопрос, но что то никак не могу понять: Как передать параметры периода с формы ... Создал форму...

Как вывести отчет за два периода сразу?
Доброго времени суток, уважаемые форумчане! Помогите пожалуйста решить такое: Есть одна таблица с кучей числовых полей. Есть запрос,...

ищу DatePicker с временем, списком выбора месяца и возможностью смены месяца после выбора числа
Привет. Ищу хороший DatePicker с указанными функциям. Немного расшифрую, что от него нужно: 1) Возможность выбора времени (чч:мм) ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru