|
Вопрос # 4 227/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Передо мной стоит задача создавать посменный отчет из БД SQL 2005
Начало и конец запрос задаются руками из DitaTimePicker. Результат отоброжается в DB Grid а оттуда экспортируется в Excel. Помогите пожалуйста со счетчиком.Никак не могу сделать так чтобы от начальной даты до конечной через каждые 12 часов добавлялась следующая строка.Запрос параметризованный.Помогите пожалуйста кто может
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, Buttons, Menus, FMTBcd, ADODB, DB, SqlExpr, DBTables,
- MXTABLES, ExtDlgs, jpeg, ExtCtrls, ComCtrls, Grids, DBGrids, OleServer,
- Excel2000, DBCtrls, CmAdmCtl;
-
- type
- TForm1 = class(TForm)
- BitBtn1: TBitBtn;
- DataSource1: TDataSource;
- Label2: TLabel;
- Label3: TLabel;
- DateTimePicker1: TDateTimePicker;
- DateTimePicker3: TDateTimePicker;
- DateTimePicker2: TDateTimePicker;
- DateTimePicker4: TDateTimePicker;
- DBGrid1: TDBGrid;
- Query1: TQuery;
- Button1: TButton;
- Query3: TQuery;
- Database2: TDatabase;
- COMAdminCatalog1: TCOMAdminCatalog;
- Query2: TQuery;
- Label4: TLabel;
- Memo1: TMemo;
- procedure BitBtn1Click(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- Type
- TMasQuery = array [1..8] of TADOQuery;
- var
- Form1: TForm1;
- MasTagName: array [1..8] of string;
- MasTagIndex: array [1..8] of string;
- MasQuery: TMasQuery;
- i,j,jj,index: Integer;
- ExcelApp,sheet: Variant;
-
- implementation
-
- uses Unit2, Unit3, ComObj;
-
- {$R *.dfm}
-
-
- procedure TForm1.BitBtn1Click(Sender: TObject);
- var k:integer;
- var First,Last,Step: string;
- begin
- Query3.Active:=False;
- //Query3.Close;
- //Query3.SQL.Clear;
- begin
- Query3.Params.ParamByName('FirstDate').Value:=FormatDateTime('mm.dd.yyyy',
form1.DateTimePicker1.date)+' '+TimeToStr(form1.DateTimePicker3.Time);
- Query3.Params.ParamByName('LastDate').Value:=FormatDateTime('mm.dd.yyyy',
form1.DateTimePicker2.date)+' '+TimeToStr(form1.DateTimePicker4.Time);
- Query3.Params.ParamByName('FirstDate1').Value:=FormatDateTime('mm.dd.yyyy',
form1.DateTimePicker1.date)+' '+TimeToStr(form1.DateTimePicker3.Time);
- Query3.Params.ParamByName('LastDate1').Value:=FormatDateTime('mm.dd.yyyy',
form1.DateTimePicker2.date)+' '+TimeToStr(form1.DateTimePicker4.Time);
- Query3.Params.ParamByName('FirstDate2').Value:=FormatDateTime('mm.dd.yyyy',
form1.DateTimePicker1.date)+' '+TimeToStr(form1.DateTimePicker3.Time);
- Query3.Params.ParamByName('LastDate2').Value:=FormatDateTime('mm.dd.yyyy',
form1.DateTimePicker2.date)+' '+TimeToStr(form1.DateTimePicker4.Time);
- Query3.Active:=True;
- memo1.Lines:=Query3.SQL;
- end;
-
-
- COMAdminCatalog1.Connect;
- ExcelApp := CreateOleObject('Excel.Application');
- ExcelApp.Visible := False;
- ExcelApp.WorkBooks.Add(-4167);
- ExcelApp.WorkBooks[1].WorkSheets[1].name :='Export';
- Sheet:=ExcelApp.WorkBooks[1].WorkSheets['Export'];
- index:=2;
- j:=0;
-
- //Ýêñïîðò
øàïêè
- for jj:=1 to DBGrid1.FieldCount do
- if DBGrid1.Columns.Items[jj-1].Visible=true then
- begin
- j:=j+1;
- sheet.cells[1,j]:=DBGrid1.Columns.Items[jj-1].Title.caption;
- end;
- //Ýêñïîðò
äàííûõ
- DBGrid1.DataSource.DataSet.First;
- for i:=1 to DBGrid1.DataSource.DataSet.RecordCount do
- begin
- j:=0;
- for jj:=1 to DBGrid1.FieldCount do
- if DBGrid1.Columns.Items[jj-1].Visible=true then
- begin
- j:=j+1;
- sheet.cells[index,j]:=DBGrid1.fields[jj-1].asstring;
- end;
-
- inc(index);
- DBGrid1.DataSource.DataSet.Next;
- end;
- //Ïîêàç
ïðèëîæåíèÿ
Excel
- ExcelApp.Visible := true;
-
-
- end;
-
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- Close();
- end;
-
-
-
-
-
- SELECT table1.Qkline, table2.Qkek, table3.Proiz
- FROM (SELECT Round (AVG(Value),2) AS Qkline
- FROM GrafP8
- WHERE (TagIndex = 5) AND (DateAndTime > :FirstDate) AND (DateAndTime < :LastDate)) AS
table1 CROSS JOIN
- (SELECT Round(avg(Value),2) AS Qkek
- FROM GrafP8 AS GrafP8_1
- WHERE (TagIndex = 6) AND (DateAndTime > :FirstDate1) AND
(DateAndTime < :LastDate1)) AS table2 CROSS JOIN
-
- (SELECT Round(SUM(Value)/12,2) AS Proiz
- FROM GrafP8 AS GrafP8_2
- WHERE (TagIndex = 9) AND (DateAndTime > :FirstDate2) AND
(DateAndTime < :LastDate2)) AS table3
-
 |
Вопрос задал: zexxer (статус: Посетитель)
Вопрос отправлен: 25 мая 2010, 10:46
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 15; последнее сообщение — 25 мая 2010, 17:30; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 25 мая 2010, 10:52 [#1]:
А в чём проблема? Проверить по таймеру, прошло ли 12 часов?
Посмотри модуль DateUtils.pas, там всё есть.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
zexxer (статус: Посетитель), 25 мая 2010, 10:59 [#2]:
а можно поподробнее?
|
|
min@y™ (статус: Доктор наук), 25 мая 2010, 11:10 [#3]:
Цитата (zexxer):
а можно поподробнее?
Ты сначала объясни, в чём проблема.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
zexxer (статус: Посетитель), 25 мая 2010, 12:28 [#4]:
проблема в организации цикла...мне нужен результат в виде таблицы. то есть строки будут номера смен а столбцы значени производительности и другие параметры. у меня не получается осуществить такой цикл чтобы сначала шел список значений первой смены следующая строка-второй.следующая третьей как это сделать?
|
|
min@y™ (статус: Доктор наук), 25 мая 2010, 14:06 [#5]:
У тебя есть исходные данные - начальная дата/время (НДВ) и конечная дата/время (КДВ). Заведи переменную типа TDateTime и присвой ей НДВ. Это будет 1-я смена. 2-я смена - НДВ + 0.5, 3-я смена - НДВ + 1.0, N-я смена - НДВ + 0.5 * (N - 1) и т.д., пока переменная не станет >= КДВ.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
zexxer (статус: Посетитель), 25 мая 2010, 15:25 [#6]:
у меня получилось вот так,но что-то программа отказывается работать
procedure TForm1.BitBtn1Click(Sender: TObject);
var First,Last:TdateTime;
k:integer;
Last:=StrToTime('LastDate');
First:=StrToTime('FirstDate');
k:=0;
while k:=First>=Last do
begin
k:=First+0,5*(k-1)
|
|
min@y™ (статус: Доктор наук), 25 мая 2010, 15:38 [#7]:
Сам-то понял, что написал?
Кошмар какой! Ошибки почти в каждой строке...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
zexxer (статус: Посетитель), 25 мая 2010, 15:52 [#8]:
|
|
min@y™ (статус: Доктор наук), 25 мая 2010, 15:53 [#9]:
Цитата (zexxer):
Значение смайлика понимаю. Но какое это имеет отношение к делу?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
zexxer (статус: Посетитель), 25 мая 2010, 15:57 [#10]:
да уже просто запарился с этим циклом...что-то не пойму никак
|
|
min@y™ (статус: Доктор наук), 25 мая 2010, 16:12 [#11]:
Вот тебе схематический код, однако, судя по твоем знаниям в программировании на паскале, он тебе врядли поможет.
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Current, Last: TDateTime;
k: integer;
begin
Last:= <Конечное время/дата>;
Current:= <Начальное время/дата>;
k:= 1; // если нужен номер смены
while Current < Last do
begin
// <--- Здесь запись в таблицу времени/даты k-й смены, которая равна Current
// Затем всё остальное:
Current:= Current + 0.5;
Inc(k); // если нужен номер смены
end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
zexxer (статус: Посетитель), 25 мая 2010, 16:33 [#12]:
спасибо огромное
|
|
min@y™ (статус: Доктор наук), 25 мая 2010, 16:52 [#13]:
Цитата (zexxer):
спасибо огромное
Блин, столько трудов, а никакой благодарности!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
zexxer (статус: Посетитель), 25 мая 2010, 17:04 [#14]:
почему же никакой?
|
|
min@y™ (статус: Доктор наук), 25 мая 2010, 17:30 [#15]:
Цитата (zexxer):
почему же никакой?
У нас тут благодарность измеряется в оценках, репутации и пиве.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|