IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Отчет Excel
Atreides
сообщение 27.04.2011 13:04
Сообщение #1


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Задача - разложить данные по предприятия в закладки книги файла эксель. Т.е. одна закладка одно предприятие. + имя закладки это имя предприятия из списка. Шапка одна и так же везде должна быть, количество предприятий может меняться. Для вывода отчет использую шаблон и компоненту EXLReport. В один список все прекрасно выходит, а вот как разбить на страницы с именами предприятий и данные разложить вопрос. Не уверен, что верно написал переход по списку предприятий еще...
Вот пример моего вывода:
Код
procedure TForm5.Button1Click(Sender: TObject);
var
  col: integer;
  st: string;
  year, MonthSelected: string;
  oth: string;
  sum_03, sum_04, sum_05, sum_1_04, sum_2_04, sum_1_05, sum_2_05: string;
  provodka: string;
  data: string;
  direct: string;
  IDSOURCE, PR_MEST: string;
  priznak: string;
  NO_FAM: string;
  cods: string;
  KOD:string;
  koll:integer;

  begin

// собираем данные

  year := Form5.Edit1.Text;
  MonthSelected := FloatToStr(Form5.ComboBox1.ItemIndex + 1);
  priznak := IntToStr(Form5.ComboBox3.ItemIndex + 1);

  oth := 'получе5ние отчетного месяца' + MonthSelected + '';
  Form5.ClientDataSet1.close;
  Form5.ClientDataSet1.DataRequest(oth);
  Form5.ClientDataSet1.open;
  oth := Form5.ClientDataSet1.fieldbyname('id_otchm').asstring;


  IDSOURCE := 'выбор источника загрузки '';
  Form5.ClientDataSet1.close;
  Form5.ClientDataSet1.DataRequest(IDSOURCE);
  Form5.ClientDataSet1.open;
  IDSOURCE := Form5.ClientDataSet1.fieldbyname('ID_SOURCE').asstring;
  PR_MEST := Form5.ClientDataSet1.FieldByName('Pr_MEST').AsString;
  NO_FAM := Form5.ClientDataSet1.FieldByName('NO_ONE_FAM').AsString;

    direct := 'reestor_bez_mesta.xls';

    //получаем список кодов организации
  begin

    cods := 'выборка кодов организации  ' +

    ' order by Kodorg asc ';

    Form5.ClientDataSet1.close;
    Form5.ClientDataSet1.DataRequest(cods);
    Form5.ClientDataSet1.open;
    koll:=Form5.ClientDataSet1.RecordCount;

    Kod := Form5.ClientDataSet1.FieldByName('KODORG').AsString;
  while
   Form5.ClientDataSet1.Eof
    do

        begin
      //по одной организации
    

      st := '  запрос данных о предприятии ';

      Form5.ClientDataSet2.close;
      Form5.ClientDataSet2.DataRequest(st);
      Form5.ClientDataSet2.open;

   {   col := Form5.ClientDataSet2.RecordCount;
      begin
        if col = 0 then
        begin
          ShowMessage('Данные отсуствуют')
        end
        else  }


            Form5.ClientDataSet1.Next;
        begin
           Form5.EXLReport1.TemplSheet:='Лист 3';
          exlReport1.Template := 'H:\808.COM\Andreev\Справочники\Forms\' + direct;
          if Assigned(Form5.EXLReport1) then Form5.EXLReport1.Show; // открытие окошка эксель
        end;
      end;
    end;
  end;
//end;



Сообщение отредактировано: Atreides - 27.04.2011 13:07


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Atreides
сообщение 6.05.2011 7:24
Сообщение #2


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Никак не могу найти ошибку, на каждой странице не хватает по три записи, где теряются не понимаю. Так же иногда получается, что данные вписываются в шапку, заполняют собой шапку и на этом появляется запись #НД

Код

procedure TForm5.BitBtn3Click(Sender: TObject);

var
  workBooks, activeBook, curr, Range: Variant;
  CellStart, CellFinish: Variant;
  sPlace: string;
  Ls: TStringList;
  i, iRec: Integer;
  Data: Variant;
  st: string;
  col: integer;
  year, MonthSelected: string;
  oth: string;
  direct: string;
  IDSOURCE, PR_MEST: string;
  priznak: string;
  NO_FAM: string;
  ID_TRAN: string;
  ToCell, ToCell2, ToCell3: string;
  value, value2: string;
  mesto: string;
  nametext: string;
  TemplateSheet: string;

begin

  ToCell := 'C1'; // Var ToCell : String;
  ToCell2 := 'A6';
  ToCell3 := 'B8';

  value := Form5.ComboBox1.Text + ' ' + Form5.Edit1.Text + ' г.';
  value2 := DateTimeToStr(Now);
  ID_TRAN := Form5.ComboBox2.Text;
  mesto := IntToStr(Form5.ComboBox4.ItemIndex);
  year := Form5.Edit1.Text;
  MonthSelected := FloatToStr(Form5.ComboBox1.ItemIndex + 1);
  priznak := IntToStr(Form5.ComboBox3.ItemIndex + 1);

  oth := 'select ID_OTCHM from sprotchmonth where YEAROTCH = ' + year + ' and MONTHOTCH = ' + MonthSelected + '';
  Form5.ClientDataSet1.close;
  Form5.ClientDataSet1.DataRequest(oth);
  Form5.ClientDataSet1.open;
  oth := Form5.ClientDataSet1.fieldbyname('id_otchm').asstring;


  st := 'select ID_TRANS from SPR_TRANS t where t.NAME_TRANS=' + #39 + ID_TRAN + #39 + '';
  Form5.ClientDataSet2.close;
  Form5.ClientDataSet2.DataRequest(st);
  Form5.ClientDataSet2.open;
  ID_TRAN := Form5.ClientDataSet2.fieldbyname('ID_TRANS').asstring;


  IDSOURCE := 'select * from SPR_TRANS t, SPRSOURCEDATA s where   ' +
    ' t.Id_Trans =' + #39 + ID_TRAN + #39 + ' and t.Id_Trans=s.Id_Trans and s.Pr_Mest=' + #39 + mesto + #39 + '';
  Form5.ClientDataSet1.close;
  Form5.ClientDataSet1.DataRequest(IDSOURCE);
  Form5.ClientDataSet1.open;
  IDSOURCE := Form5.ClientDataSet1.fieldbyname('ID_SOURCE').asstring;
  PR_MEST := Form5.ClientDataSet1.FieldByName('Pr_MEST').AsString;
  NO_FAM := Form5.ClientDataSet1.FieldByName('NO_ONE_FAM').AsString;
  nametext := Form5.ClientDataSet1.FieldByName('NAMETEXT').AsString;


  begin

    if mesto = '0' then

    begin

      st := ' select   s.SHORT_NAME, l.Kodorg, kod.forma_tt, l.Kodpodr, ';

      if NO_FAM = '0' then


        st := st + ' l.FIO,'
      else
        st := st + ' (rpad(l.FIO,38) ||rpad(l. FIODEPEN,38)) FIO, ';

      st := st + 'l.n_Doclgotn,    ' +

      '   l.Date_Opd, l.Date_Begin_Ab, l.n_Opd, Sposob_Opd,   ' +

      '  l.vid_period_ab, l.kol_doc,   ' +

      '     STAT_OTPR, ' +

      '    STAT_NAZN, summa, SUMMA_DOP,  sysdate  ' +

      '      from *****    ' +

      ' where l.Id_Otchm= ' + oth + ' and l.Id_Source=' + IDSOURCE + ' ' +

      ' and lor.pr_attrib=' + priznak + ' ' +

         '     order by l.Kodorg, s.SHORT_NAME  asc  ';

      Form5.ClientDataSet1.close;
      Form5.ClientDataSet1.DataRequest(st);
      Form5.ClientDataSet1.open;

      if Form5.ClientDataSet1.RecordCount = 0 then
      begin
        ShowMessage('Записи отсуствуют');
      end
      else
      begin
        XLApp := CreateOleObject('Excel.Application');
// XLApp.Visible := True;
        XLApp.SheetsInNewWorkbook := 1; // Добавим 1 лист - 3 (по умолчанию)

        workBooks := XLApp.WorkBooks;
        ActiveBook := workBooks.Add;
        Curr := ActiveBook.Sheets[1]; // Запомним добавленный лист

        try
          Ls := TStringList.Create;

    // заполнение

          ClientDataSet1.First;
          while not ClientDataSet1.Eof do
          begin
            sPlace := ClientDataSet1.FieldByName('Kodorg').AsString;
            if Ls.IndexOf(sPlace) = -1 then
            begin
              Ls.Add(sPlace);
            end;
            ClientDataSet1.Next;
          end;

          for i := 0 to Pred(Ls.Count) do
          begin
            ClientDataSet1.Filtered := False;
            ClientDataSet1.Filter := 'Kodorg = ' + QuotedStr(Ls.Strings[i]);
            ClientDataSet1.Filtered := True;

            Data := VarArrayCreate([1, ClientDataSet1.RecordCount, 1, 14], varVariant);
            ClientDataSet1.First;
            iRec := 0;
            while not ClientDataSet1.Eof do
            begin


              Data[iRec + 1, 1] := ClientDataSet1.FieldByName('SHORT_NAME').AsString;
              Data[iRec + 1, 2] := ClientDataSet1.FieldByName('forma_tt').AsString;
              Data[iRec + 1, 3] := ClientDataSet1.FieldByName('KODPODR').AsString;
              Data[iRec + 1, 4] := ClientDataSet1.FieldByName('FIO').AsString;
              Data[iRec + 1, 5] := ClientDataSet1.FieldByName('n_Doclgotn').AsString;
              Data[iRec + 1, 6] := ClientDataSet1.FieldByName('Date_Opd').AsString;
              Data[iRec + 1, 7] := ClientDataSet1.FieldByName('Date_Begin_Ab').AsString;
              Data[iRec + 1, 8] := ClientDataSet1.FieldByName('n_Opd').AsString;
              Data[iRec + 1, 9] := ClientDataSet1.FieldByName('Sposob_Opd').AsString;
              Data[iRec + 1, 10] := ClientDataSet1.FieldByName('vid_period_ab').AsString;
              Data[iRec + 1, 11] := ClientDataSet1.FieldByName('kol_doc').AsString;
              Data[iRec + 1, 12] := ClientDataSet1.FieldByName('STAT_OTPR').AsString;
              Data[iRec + 1, 13] := ClientDataSet1.FieldByName('STAT_NAZN').AsString;
              Data[iRec + 1, 14] := ClientDataSet1.FieldByName('SUMMA').AsString;

              Inc(iRec);

              ClientDataSet1.Next;

            end;

      //  добавляем новый личт из шаблона ПОСЛЕ того, что был текущим
            Curr := ActiveBook.Sheets.Add(type := TemplateSheet, After := Curr);
            Curr.Name := Ls.Strings[i];

            //разметка страницы
            curr.PageSetup.PrintArea := 'A1:N' + inttostr(irec + 12);
            curr.PageSetup.Zoom := 60;
            curr.PageSetup.Orientation := 2;
            //разметка страницы

            CellStart := Curr.Cells[12, 1];
            CellFinish := Curr.Cells[iRec + 8, 14]; // корректировка позиции вставки
            Range := Curr.Range[CellStart, CellFinish];
            Curr.Range[ToCell] := value2;
            Curr.Range['D12:D' + inttostr(irec + 12)].WrapText := True;
            Curr.Range[ToCell2] := '  ЗA ' + value;
            Curr.Range[ToCell3] := (Ls.Strings[i]);

            Range.Value := Data;

            VarClear(Data);
          end;

        finally
          Ls.Free;
        end;
        ClientDataSet1.Filtered := False;
        Form5.ClientDataSet1.close;
        ActiveBook.Sheets[1].Delete; // удаление первого листа
        XLApp.Visible := True;
      //  XLApp.Workbooks[1].SaveAs('C:\' + nametext + '.xls'); // <--- Сохраняем куда надо
     //   XLApp.Quit; // <--- И убираем из процессов
        XLApp := Unassigned;



      end;
      Form5.ComboBox1.ItemIndex := (-1);
      Form5.ComboBox2.ItemIndex := (-1);
      Form5.ComboBox3.ItemIndex := (-1);
      Form5.ComboBox4.ItemIndex := (-1);
      Form5.Edit1.Clear;
    end;


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Atreides   Отчет Excel   27.04.2011 13:04
IUnknown   Сторонние компоненты не использую, идея - такая: p...   28.04.2011 1:49
Atreides   XLApp - это ExcelApplication или какой модуль надо...   28.04.2011 8:57
IUnknown   Нет. Это Uses ..., ComObj; var XLApp : Variant; ...   28.04.2011 10:05
Atreides   меня интересует вопрос в каком месте послать запро...   28.04.2011 15:20
IUnknown   Такой запрос не нужен. Его роль на себя берет ...   28.04.2011 15:44
Atreides   наверное, лучше исходник прикрепить как целостны п...   28.04.2011 16:01
IUnknown   Ну вот: Поменяешь там путь к XLT-файлу на правил...   28.04.2011 16:51
Atreides   Почему то в конце столбцов образуются символы (#Н/...   29.04.2011 11:49
IUnknown   Значит, размер области вычислил неправильно. Такое...   29.04.2011 12:32
Atreides   Data := VarArrayCreate([1, ClientDataS...   29.04.2011 12:38
IUnknown   Можно. Перенеси ActiveBook.Sheets[1].Delete; // ...   29.04.2011 12:59
Atreides   Еще вопрос такой возник – можно добавить вставку д...   2.05.2011 11:30
IUnknown   Если ячейка известна - то разумеется, можно: ToCe...   2.05.2011 13:33
Atreides   Из константы можно путь в переменную вывести?   3.05.2011 13:55
IUnknown   Из константы в переменную - можно, обратно - нельз...   3.05.2011 14:08
Atreides   Из константы в переменную - можно, обратно - нель...   3.05.2011 14:33
IUnknown   Что значит "не прокатывает"? Все прекрас...   3.05.2011 14:51
Atreides   Что значит "не прокатывает"? Все прекра...   3.05.2011 14:59
IUnknown   Ну, а какого ты сверху написал ":=", а з...   3.05.2011 15:03
Atreides   Ну, а какого ты сверху написал ":=", а ...   3.05.2011 15:55
TarasBer   Бесят уже. Сами по невнимательности всё партачат, ...   3.05.2011 15:32
Atreides   1. После завершения работы, остается висящий проце...   4.05.2011 14:21
IUnknown   Разумеется. Ты ж записываешь данные еще ДО создани...   4.05.2011 15:11
Atreides   Разумеется. Ты ж записываешь данные еще ДО создан...   4.05.2011 15:32
IUnknown   И после этого удивляешься, ??? А как ты хотел, что...   4.05.2011 15:53
Atreides   Никак не могу найти ошибку, на каждой странице не ...   6.05.2011 7:24
IUnknown   Я тебе объясню... Вот тут: ты что-то намудрил. Ес...   6.05.2011 10:08
Atreides   Поправка на поля исправила ошибку с не хватающими ...   11.05.2011 14:47
IUnknown   Надо сказать об этом: Curr.Range[ToCell5].Formula ...   11.05.2011 15:07
Atreides   С формулами разобрался, отлично подсчитал общие ит...   12.05.2011 7:44
IUnknown   Так действительно будет проще. Уже потому, что есл...   12.05.2011 9:15
Atreides   а как же исключать ячейки и определять начало новы...   12.05.2011 14:18
IUnknown   Когда ж ты сам начнешь думать? Вот идея прохода п...   12.05.2011 15:40
Atreides   Благодарю! Выходит даже не обязательно искать ...   13.05.2011 9:11
IUnknown   Это то есть как 2 критерия? Пример можно привести?...   13.05.2011 10:38
Atreides   По наименованию и по форме. Родилась идея запросом...   13.05.2011 12:02
IUnknown   Я ж просил пример привести... Еще раз: я понимаю, ...   13.05.2011 12:12
Atreides   Под данными надо подвести итоги по суммам и количе...   17.05.2011 11:10
IUnknown   А для комбинирования нескольких условий в Excel ес...   17.05.2011 12:43
Гость   В целом разобрался, но тут посидел голову поломал ...   23.05.2011 14:59
Atreides   В целом разобрался, но тут посидел голову поломал...   23.05.2011 15:01
IUnknown   Не знаю, тебе решать. Ты свой запрос видишь, а я -...   23.05.2011 17:46
Atreides   В любом случае огромное спасибо, за помощь!   24.05.2011 7:22
Atreides   А можно ячейки задать типа данных программных путе...   3.06.2011 7:39
Atreides   столкнулся с такой проблемой, когда у меня записей...   1.07.2011 16:56
Lapp   Ну неужели ТАК СЛОЖНО поставить ПРАВИЛЬНЫЙ тег?.. ...   2.07.2011 0:37
IUnknown   Попробую догадаться: значение числовое, но очень д...   2.07.2011 2:16
Atreides   А тогда как корректней и чтобы быстрей работало пр...   2.07.2011 13:19


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 0:39
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"