Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2016, 12:00   #31
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Я сегодня, наверно, застрелюсь.

Вот, что у меня есть:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
    ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData: Variant;
    BeginCol, BeginRow, i, j: Integer;
    RowCount, ColCount: Integer;
    PrevFio, PrevDate: String;
    x, n: Integer;
    sg: array of array of string;
    str, stb: Integer;
begin
  // координаты левого верхнего угла области в которую выводятся данные
  BeginCol := 1;
  BeginRow := 1;

  // Создание Эксель
  ExcelApp := CreateOleObject('Excel.Application');

  // Отключаем реакцию Эксель на события чтобы ускорить вывод
  ExcelApp.Application.EnableEvents := false;

  // Открываем шаблон
  Workbook := ExcelApp.WorkBooks.Add(report_path + 'Отчет по заданию.xlt');
  // Если шаблона нет и надо создать новый документ то
  //  Workbook := ExcelApp.WorkBooks.Add;

  ADOQuery3.Close;
  ADOQuery3.SQL.Clear;
  ADOQuery3.Parameters.Clear;
  ADOQuery3.SQL.Add('SELECT DISTINCT OpenDate');
  ADOQuery3.SQL.Add('FROM [SsmLoodsman].[dbo].[ProdTarget]');
  ADOQuery3.SQL.Add('where (OpenDate BETWEEN :date1  AND :date2)');
  ADOQuery3.SQL.Add('order by 1');
  ADOQuery3.Parameters.ParamByName('date1').Value := cxDateEdit1.Date;
  ADOQuery3.Parameters.ParamByName('date2').Value := cxDateEdit2.Date;
  ADOQuery3.Open;

  ADOQuery2.Close;
  ADOQuery2.SQL.Clear;
  ADOQuery2.Parameters.Clear;
  ADOQuery2.SQL.Text:='SELECT DISTINCT Executor FROM [SsmLoodsman].[dbo].[ProdTarget] order by 1';
  ADOQuery2.Open;

  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.Parameters.Clear;
  ADOQuery1.SQL.Add('SELECT Executor, Id, [Order], Draft, Detail, OperQuantity, [Status], OpenDate');
  ADOQuery1.SQL.Add('FROM [SsmLoodsman].[dbo].[ProdTarget]');
  ADOQuery1.SQL.Add('where (OpenDate BETWEEN :date1  AND :date2)');
  ADOQuery1.SQL.Add('and ([Master] = :master)');
  ADOQuery1.SQL.Add('order by OpenDate, Executor');
  ADOQuery1.Parameters.ParamByName('master').Value := ComboBox1.Text;
  ADOQuery1.Parameters.ParamByName('date1').Value := cxDateEdit1.Date;
  ADOQuery1.Parameters.ParamByName('date2').Value := cxDateEdit2.Date;
  ADOQuery1.Open;

  str := ADOQuery1.RecordCount + ADOQuery2.RecordCount + 2;
  stb := ADOQuery1.FieldCount;
  PrevFio := '';
  x := 2;
  SetLength(sg, str, stb);
  sg[0,0] := 'МАСТЕР: ' + ComboBox1.Text;
  sg[1,0] := 'Исполнитель';
  sg[1,1] := 'Номер задания';
  sg[1,2] := 'Заказ';
  sg[1,3] := 'Чертеж';
  sg[1,4] := 'Наименование';
  sg[1,5] := 'Количество';
  sg[1,6] := 'Факт';

  n := 0;
  while not ADOQuery3.EOF do begin
    Inc(n);
    if n = 1 then ExcelApp.Worksheets[n].Name := Copy(ADOQuery3.FieldByName('OpenDate').AsString, 1, 10)
    else begin
    ExcelApp.ActiveSheet.Copy(After := ExcelApp.ActiveSheet);
    ExcelApp.Worksheets[n].Name := Copy(ADOQuery3.FieldByName('OpenDate').AsString, 1, 10);
    end;
    ADOQuery3.Next;
  end;

  while not ADOQuery1.EOF do begin
    if ADOQuery1.FieldByName('Executor').AsString <> PrevFio then begin
     PrevFio := ADOQuery1.FieldByName('Executor').AsString;
     sg[x,0] := PrevFio;
     Inc(x);
    end;
    sg[x,1] := ADOQuery1.FieldByName('Id').AsString;
    sg[x,2] := ADOQuery1.FieldByName('Order').AsString;
    sg[x,3] := ADOQuery1.FieldByName('Draft').AsString;
    sg[x,4] := ADOQuery1.FieldByName('Detail').AsString;
    sg[x,5] := ADOQuery1.FieldByName('OperQuantity').AsString;
    sg[x,6] := ADOQuery1.FieldByName('Status').AsString;
    sg[x,7] := Copy(ADOQuery1.FieldByName('OpenDate').AsString, 1, 10);
    Inc(x);
    ADOQuery1.Next;
  end;

  // Размеры выводимого массива данных
  ColCount := stb-1;
  RowCount := str;

    ArrayData := VarArrayCreate([0, str, 0, stb], varVariant);
    for i := 0 to str - 1 do begin
      for  j := 0 to stb - 1 do
         ArrayData[i, j] := sg[i,j];

  // Левая верхняя ячейка области в которую будем выводить данные
  Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol];
  // Правая нижняя
  Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow  + RowCount - 1, BeginCol + ColCount - 1];

  // Область в которую будем выводить данные
  Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];

  // Сам вывод данных
  Range.Value := ArrayData;

  // Делаем Эксель видимым
  ExcelApp.Visible := true;
  end;
end;
ADOQuery3 - для создания страниц Excel по датам.
ADOQuery2 - для выбора исполнителей, принадлежащих к выбранному мастеру.
ADOQuery1 - непосредственно данные об исполнителях и заказах.

На данном этапе в результате я получаю такой вот .xls-файл:


Выбирал период за март текущего год. У первого задание датировано 24м числом. У второго - 25м. Листы созданы. Как данные разделить - я в ступоре.
nactyx вне форума Ответить с цитированием
Старый 05.04.2016, 13:58   #32
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Есть два пути
1. один раз получить много(все даты) и потом МНОГО раз просматирвать выбирая нужное (по нужной дате)
2. каждый раз получать только нужное (только по нужной дате)

Цитата:
ADOQuery3 - для создания страниц Excel по датам.
Код:
  n := 0;
  while not ADOQuery3.EOF do begin
    Inc(n);
    if n = 1 then ExcelApp.Worksheets[n].Name := Copy(ADOQuery3.FieldByName('OpenDate').AsString, 1, 10)
    else begin
    ExcelApp.ActiveSheet.Copy(After := ExcelApp.ActiveSheet);
    ExcelApp.Worksheets[n].Name := Copy(ADOQuery3.FieldByName('OpenDate').AsString, 1, 10);
    end;
{ ЗДЕСЬ МЫ ЗНАЕМ ЛИСТ И ДАТУ относящуюся к ЭТОМУ листу}
    LoadDateList(ExcelApp.Worksheets[n]{нужный лист}, ADOQuery3.FieldByName('OpenDate').AsDate{нужная дата}); //так давай его заполним
    ADOQuery3.Next;
  end;
Код:
procedure TForm1.LoadDateList(workshhet: variant; listdate: TDate);
var
  fdt: TField;
begin
  ВАР 1. получаем один раз(уже получили) 
  ADOQuery1.First; // и смотрим много раз (КАждый раз сначала)
  fdt:=ADOQuery1.FieldByname('где там у нас дата?');
  while not ADOQuery1.Eof do begin 
    if ADOQuery1.FieldByname('где там у нас дата?').AsDatetime =listdate then begin //и берем только нужные даты
    if fdt.AsDatetime =listdate then begin //и берем только нужные даты
      // будем заполнять
    end;
    ADOQuery1.Next;
  end;  

  ВАР 2. каждый раз получаем только нужные
  ADOQueryD.SQL.text:=запрос получающий данные за ОДИН день 
  ADOQueryD.Open; 
  while not ADOQueryD.Eof do begin 
      // данные только нужные будем "просто" заполнять (без проверки даты)
    ADOQueryD.Next;
  end;  
  ADOQueryD.Close;
 
end; 
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 05.04.2016 в 14:05.
evg_m на форуме Ответить с цитированием
Старый 05.04.2016, 14:58   #33
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Я
СДЕЛАЛ
ЭТО!

Пришлось учесть еще такой нюанс, что в Excel-файле изначально должен быть хотя бы один лист. Поэтому основную часть пришлось вызывать и для одного первого листа, и для всех следующих, т.е. в двух местах.

Огромное спасибо Serge_Bliznykov и evg_m!

Последний раз редактировалось nactyx; 05.04.2016 в 15:01.
nactyx вне форума Ответить с цитированием
Старый 05.04.2016, 15:38   #34
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от nactyx Посмотреть сообщение
Я
СДЕЛАЛ
ЭТО!
Молодец! Поздравляю!

Всегда пожалуйста!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Экспорт из Excel в MS SQL Server 2008 с помощью Delphi XE7 TimurUfa БД в Delphi 0 16.01.2015 12:20
Delphi + Excel+ MS SQL Server bobik47 БД в Delphi 4 30.08.2013 15:07
Экспорт в Excel из Delphi через SQL запрос betirsolt БД в Delphi 1 19.05.2013 18:11
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
Delphi c SQL и выгрузка в Excel или word girl23 БД в Delphi 7 24.10.2007 17:56