Бесят уже.
Сами по невнимательности всё партачат, а потом то "твой код глючит", то "у меня не компилируется".
Отчет Excel |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
Отчет Excel |
TarasBer |
Сообщение
#21
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Бесят уже.
Сами по невнимательности всё партачат, а потом то "твой код глючит", то "у меня не компилируется". -------------------- |
Atreides |
Сообщение
#22
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
Ну, а какого ты сверху написал ":=", а здесь, ниже, уже пишешь "="? Требуется-то именно присваивание, переменная же... уже разобрался, не стал отписывать... Признаю мой косяк. Сообщение отредактировано: Atreides - -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
Atreides |
Сообщение
#23
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
1. После завершения работы, остается висящий процесс в диспетчере задач, после накапливаются там и тормозят работу, приходиться в ручную убивать процессы. 2. При повторном обращении к выдаче отчета вылетает ошибка, что ClientDataSet не может найти поле Kodorg. Приходиться закрывать и заново открывать прожку. Хотя прописал закрытие ClientDataSet после открытия эксельного файлика. Сообщение отредактировано: Atreides - -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
Сообщение
#24
|
Гуру Группа: Пользователи Сообщений: 1 013 Пол: Мужской Ада: Разработчик Embarcadero Delphi: Сторонник Free Pascal: Разработчик Репутация: 627 |
Цитата Попробовал так, заполняется неплохо, но с отставанием на 1 лист, ибо первый код вписывается на первый лист – пустой и не удаляется. Разумеется. Ты ж записываешь данные еще ДО создания листа, куда пишется массив Data. Перенеси эту строку куда-нибудь нижеCurr := ActiveBook.Sheets.Add (Type := TemplateSheet, After := Curr); // Вот этой строки - "отставания" не будет... Да, ToCell3 присваивать новое значение надо тоже после Add-а уже, ибо ячейка - на новом листе... Цитата 2. После завершения работы, остается висящий процесс в диспетчере задач, после накапливаются там и тормозят работу, приходиться в ручную убивать процессы. Завершай Excel корректно - не будет оставаться:ActiveBook.Sheets[1].Delete; // Это я уже показывал |
Atreides |
Сообщение
#25
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
Разумеется. Ты ж записываешь данные еще ДО создания листа, куда пишется массив Data. Перенеси эту строку куда-нибудь ниже Curr := ActiveBook.Sheets.Add (Type := TemplateSheet, After := Curr); // Вот этой строки - "отставания" не будет... Да, ToCell3 присваивать новое значение надо тоже после Add-а уже, ибо ячейка - на новом листе... Да и снова я погорячился и буквально после поста сам исправил. -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
Сообщение
#26
|
Гуру Группа: Пользователи Сообщений: 1 013 Пол: Мужской Ада: Разработчик Embarcadero Delphi: Сторонник Free Pascal: Разработчик Репутация: 627 |
Цитата Хотя прописал закрытие ClientDataSet после открытия эксельного файлика. И после этого удивляешься,Цитата что ClientDataSet не может найти поле Kodorg ??? А как ты хотел, чтоб при закрытом наборе данных что-то находилось? "Фантастика - в следующем зале" (С) Все, что тебе надо сделать после захода в процедуру - это сбросить признак фильтрации, чтоб начиналась работа с нефильтрованным набором. Потом, когда понадобится, фильтрация опять будет включена...ClientDataSet1.Filtered := False;, закрывать ничего не надо... |
Atreides |
Сообщение
#27
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 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; -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
Сообщение
#28
|
Гуру Группа: Пользователи Сообщений: 1 013 Пол: Мужской Ада: Разработчик Embarcadero Delphi: Сторонник Free Pascal: Разработчик Репутация: 627 |
Цитата на каждой странице не хватает по три записи, где теряются не понимаю. Я тебе объясню...Вот тут: Цитата CellStart := Curr.Cells[12, 1]; CellFinish := Curr.Cells[12 + iRec - 1, 14];, у тебя же отчет данные недоговаривает. Насчет разных непредвиденных значений... У тебя, насколько я вижу, есть несколько полей типа ftData? Так вот, когда поле типа ftString переносится в Excel, и ему не хватает ширины столбца, чтоб полностью показаться, ничего страшного не происходит: показывается часть строки, а часть - отрезается. Совсем другое дело с ftData: если ему не хватает ширины столбца - то отображается #####, надо изменять ширину столбца. Как только изменишь, и этой ширины хватит - покажется дата. #НД в шапке? Прогнал программу раз 15, с разными данными в ClientDataSet - ни разу в шапку ничего не залезло. Да и не может, в принципе, если ты поправишь вычисление CellFinish. Если все-же поймаешь такое поведение - скажи, сколько было записей в ClientDataSet на тот момент, когда переносились данные, я попробую сгенерировать набор с таким же количеством данных и проверить поведение у себя. И еще: желательно было бы иметь информацию, в каких именно ячейках появляется #НД Сообщение отредактировано: IUnknown - |
Atreides |
Сообщение
#29
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
Поправка на поля исправила ошибку с не хватающими записями и шапкой. Записей у меня 9548 штук. )) Возникла трудность - как экселю сообщить, что в ячейку пишется формула, а не просто текст. Написал формулу подсчета сумм, но отображается формула, если нажать энтер, то нормально сумма отображается, а так ток "#ИМЯ?". Это у меня по общей сумме.
Код position:=IntToStr(irec+11); ToCell5:='N'+inttostr(irec + 12); Curr.Range[ToCell5] := '=СУММ(N12:N'+position+')'; И еще можно цикл сделать, например на каждой закладке у меня по данным есть поле с формами (они упорядочены у меня запросом от меньших к большим). Как только появилась новое значение ( к примеру с 6 сменилось на 7) то отписать под ними строку итого и сумму и продолжить вывод данных? -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
Сообщение
#30
|
Гуру Группа: Пользователи Сообщений: 1 013 Пол: Мужской Ада: Разработчик Embarcadero Delphi: Сторонник Free Pascal: Разработчик Репутация: 627 |
Цитата как экселю сообщить, что в ячейку пишется формула, а не просто текст. Надо сказать об этом:Curr.Range[ToCell5].Formula := '=СУММ(N12:N'+position+')';Логично? По крайней мере, на англоязычном Оффисе вот такой код работает прекрасно: Curr.Range['A11'].Formula := '=Sum(A1:A10)'; Цитата например на каждой закладке у меня по данным есть поле с формами (они упорядочены у меня запросом от меньших к большим). Как только появилась новое значение ( к примеру с 6 сменилось на 7) то отписать под ними строку итого и сумму и продолжить вывод данных? Не понял. Это в тех данных, которые ты из Дельфи перетягивал, или ты еще что-то свое делаешь в этих закладках? Если то, что из Delphi - то прямо при заполнении массива Data это желательно делать. Хотя, конечно, можно и потом пробежаться по содержимому листа, и проверить, где меняется значение в определенном поле. Тебе для этого даже сумму считать не придется, достаточно только знать, в каком ряду это значение началось, и в каком - заканчивается. В общем, приведи пример, как у тебя на листе данные располагаются, и что с ними надо сделать... |
Atreides |
Сообщение
#31
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
С формулами разобрался, отлично подсчитал общие итоги.
Кинул пример файлика с итогами, которые мне нужны, выделил красным. Т.е на каждой закладке внизу заполнить итоги по каждому наименованию с отдельной формой и суммой, и общий итог по всем. Сообщение отредактировано: Atreides - Прикрепленные файлы _____1.xls ( 122.5 килобайт ) Кол-во скачиваний: 313 -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
Сообщение
#32
|
Гуру Группа: Пользователи Сообщений: 1 013 Пол: Мужской Ада: Разработчик Embarcadero Delphi: Сторонник Free Pascal: Разработчик Репутация: 627 |
Цитата Или, наверное, проще вариант, это пройти по листу и посчитать суммы по одинаковым значения форм и вывести внизу рядом с общим итогом. Так действительно будет проще. Уже потому, что если будешь вставлять суммы в середину таблицы, общий итог будет изменяться.А вообще, я бы воспользовался не функцией Sum, а функцией SumIf. Смотри: Понимаешь идею? То есть, тебе достаточно на лист забросить несколько (по числу разных форм) ячеек с формулами. Формулы - почти одинаковые, разница - только в среднем поле, для N26 из моего примера, это =SUMIF(B12:B22, M26, N12:N22). А рядом, слева (ну, это уже по желанию, можно и справа ) собственно, для какой формы это все считается. Формула одна, результаты - разные. |
Atreides |
Сообщение
#33
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
а как же исключать ячейки и определять начало новых значений
-------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
Сообщение
#34
|
Гуру Группа: Пользователи Сообщений: 1 013 Пол: Мужской Ада: Разработчик Embarcadero Delphi: Сторонник Free Pascal: Разработчик Репутация: 627 |
Когда ж ты сам начнешь думать?
Вот идея прохода по листу с заполнением сумм по формам: procedure TForm1.Button9Click(Sender: TObject); |
Atreides |
Сообщение
#35
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
Благодарю! Выходит даже не обязательно искать эти значения, просто надо выписать уже значения и после просто формулу подставлять. Снова очередная моя невнимательность. а если мне надо два критерия выбора, просто через запятую указать?
Сообщение отредактировано: Atreides - -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
Сообщение
#36
|
Гуру Группа: Пользователи Сообщений: 1 013 Пол: Мужской Ада: Разработчик Embarcadero Delphi: Сторонник Free Pascal: Разработчик Репутация: 627 |
Это то есть как 2 критерия? Пример можно привести? Вот есть у меня твой файл, какие 2 критерия ты хочешь добавить для вычисления частичных сумм? Один критерий - понятно, какое-то поле совпадает с нужным значением. Второй какой?
|
Atreides |
Сообщение
#37
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
По наименованию и по форме. Родилась идея запросом получать записи наименований и форм по distinct, записать их в эксель и к ним уже формулки подписать.
Сообщение отредактировано: Atreides - -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
Сообщение
#38
|
Гуру Группа: Пользователи Сообщений: 1 013 Пол: Мужской Ада: Разработчик Embarcadero Delphi: Сторонник Free Pascal: Разработчик Репутация: 627 |
Я ж просил пример привести... Еще раз: я понимаю, когда у тебя есть один критерий, и ты печатаешь: для формы = "11" сумма = столько_то, для "4У" - столько_то... Как сюда втюхать еще и наименование? Как сумму вычислять, расскажи? Отдельно для разных форм, отдельно для разных наименований - пожалуйста, но это не 2 критерия, а две разные формулы, каждая с одним критерием.
|
Atreides |
Сообщение
#39
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
Под данными надо подвести итоги по суммам и количеству. Итоги считать надо по типу по всем формам с наименованиями не повторяющимися, т.е. Там есть Самара 4У и должна быть Самара 11, так же и с БШШП 4У и БШШП 11. Вот и получается два критерия поиска вычисления сумм
-------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
Сообщение
#40
|
Гуру Группа: Пользователи Сообщений: 1 013 Пол: Мужской Ада: Разработчик Embarcadero Delphi: Сторонник Free Pascal: Разработчик Репутация: 627 |
А для комбинирования нескольких условий в Excel есть array formulas, то есть, формулы, работающие с массивами. Пишешь формулу:
Sh.Cells[26, 14].FormulaArray := '=SUM((A12:A22=L26)*(B12:B22=M26)*(N12:N22))'; , и получаешь: Идея понятна, да? Изменяя номера ячеек после знака равенства, получишь все нужные критерии... Если надумаешь проверить как это работает и будешь вводить формул в самом Excel-е, то учти, что array formula вводится не просто Enter-ом, а Ctrl+Shift+Enter... |
Текстовая версия | 2.05.2024 10:48 |