| 
| 
 | Вопрос # 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;beginQuery3.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 doif 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 dobeginj:=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;//Ïîêàç
ïðèëîæåíèÿ
ExcelExcelApp.Visible := true;  end;  procedure TForm1.Button1Click(Sender: TObject);beginClose();end;     SELECT     table1.Qkline, table2.Qkek, table3.ProizFROM         (SELECT   Round  (AVG(Value),2) AS QklineFROM          GrafP8WHERE      (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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |