Опять отчет...

Обсуждение извечных проблем кларионовских (и не только) отчетов

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Привет всем!

Подскажите как сделать следующее: на первом листе отчета шапка таблицы должна распечататься с неким заголовком типа "Ведомость...", а на последующих надпись не нужна, только шапка, причем Y-позиция начала печати на каждом листе должна быть одна и та же.

Алексей,
начальник отдела ПТО
ООО "ОРК"

mail: alex@jrcn.donetsk.ua, icq: 62605472
www: http://www.nikasoft.co.uk
http://www.clarionline.h1.ru (FAQ-онлайн)
origin: It is not a programm, it requires MS Windows...

(Добавление)

Привет, Алексей!

Решается теми же шаблонами от Ingasoft (EasylistPrint)

Толмачёв И.Л. <itolmachev@rosinter.ru>

Вообще-то должно решаться руками... Вопрос был о приницпе, а не о том, что где-то можно купить что-то, что позволит сделать жизнь веселей ;)

--
Best regards,
Vadym mailto:vadim@softcreator.com
ICQ: 82308757

1. Создаем переменную = 'Ведомость'
2. Ставим ее в начале отчета
3. После печати 1-й страницы делаем ее невидимой.

"Владимир Лакаев" <lakaew@mail.ru>

А пример работающего по данному принципу кода есть? ;)

--
Best regards,
Vadym

Создать деталь, содержащую слово "Ведомость" с атрибутом Absolute. И начать печать отчёта именно с неё. Такие детали можно печатать где угодно, даже за пределами зоны печати

---------------------------------------
C уважением,
Юрий Философов,
Главный программист
Корпорация "Диполь", Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439

Не получится. Ключевая фраза - "причем Y-позиция начала печати на каждом листе должна быть одна и та же".

--
Best regards,
Vadym

(Добавление)

У меня предложение - видоизменить (переписать) шаблон REPORTS. Это будет очень полезно - уж очень часто приходится делать подобные вещи и хочется работу упростить.

С уважением,
Рожкова Оксана,
mailto: orozhkova@mdi.ru

Шаблон переписать - как два байта перестать ;)
Было бы понятно - как перепсать ;)
Дело в том, что изменение позиции начала отчета (т.е. по сути то, что позволит нам расположить свой псевдо-заголовок только на первой странице, перед этим спрятав стандартный заголовок станицы) будет применено еще ДО окончания генерации текущей старницы. Т.е. изменили позицию, напечатали свой заголовок, вернули позициию назад (в ожидании, что она релально проявится только на следующей странице) - и в результате увидели, что позиция осталась неизменной на текущей странице - как если бы не танцевали с изменением позиции!
Но я помню точно, что в CW2 такой фокус приводил к желаемому результату.
Что-то изменилось в логике движка генератора отчетов - и в худшую сторону...

--
Best regards,
Vadym
Написал: ClaList(2)
Гость

Сообщение Гость »

Не получится. Ключевая фраза - "причем Y-позиция начала печати на каждом листе должна быть одна и та же".
А для деталей с атрибутом Absolute высота не засчитывается...
When ABSOLUTE is present, the position specified by the x and y parameters of the structure's AT attribute is relative to the top left corner of the page. ABSOLUTE has no effect on following structures printed without the ABSOLUTE attribute.

---------------------------------------
C уважением,
Юрий Философов
У меня предложение - видоизменить (переписать) шаблон REPORTS. Это будет очень полезно - уж очень часто приходится делать подобные вещи и хочется работу упростить.
Можно и по другому:
Создать detail, поставить ей фиксированную позицию так что-бы она перекрывала page header (не забыть присвоить ей use label), нарисовать в ней прямоугольник белого цвета и с белыми же границами, в свойствах отчета на вкладке фильтр деталей (detail filters) поставить ей условие False и сказать один раз принт ее после открытия отчета.
Ну а что в ней (детали) нарисовать, это уже просто. И не надо шаблоны переделывать.

2VS: Примера кода я сейчас найти не могу, но лет несколько назад так делал и все работало.

/Alexey

(Добавление)
Ну а что в ней (детали) нарисовать, это уже просто. И не надо шаблоны переделывать.
А если высота этого первого заглока должна быть меньше или больше, чем загловока станицы (а чаще всего именно таки есть)?
2VS: Примера кода я сейчас найти не могу, но лет несколько назад так делал и все работало.
У меня тоже был пример, работал на CW2 - а пытался воспроизвести недавно - балалайка, логика движка генереации отчета изменилась видимо.

--
Best regards,
Vadim
А если высота этого первого заглока должна быть меньше или больше, чем загловока станицы (а чаще всего именно таки есть)?
Вот тут не помню (склероз замучал). :( Надо бы поэкспериментировать, но времени не хватает. Можно, наверное, сделать две детали. Одну для скрытия PageHeader, другую для печати текста. Но я не уверен, что не произойдет наложения. Опять же, в области заголовка страницы детали не печатаются (по крайней мере по умолчанию, хотя сдвинуть туда их можно, но не нужно ;).
Так что меньше делать смысла нет. А вот что будет если эту деталь сделать больше, я не помню, и клариона щас под рукой нет.
У меня тоже был пример, работал на CW2 - а пытался воспроизвести недавно - балалайка, логика движка генереации отчета изменилась видимо.
Это работало на CW 5.5.

/Alexey
Написал: ClaList(2)
Гость

Сообщение Гость »

Подскажите как сделать следующее: на первом листе отчета шапка таблицы должна распечататься с неким заголовком типа "Ведомость...", а на последующих надпись не нужна, только шапка, причем Y-позиция начала печати на каждом листе должна быть одна и та же.
Для такой печати я использую сл. схему
Заголовок первой страницы деталь с абсолютными координатами
Заголовки сл страниц в форме
Если не требуется одинаковая координата Y на всех листах, то подбирается
пустой detail,чтобы сместить начало печати основного detail
Report для печати фактуры прилагаю
C5 ШВС шаблон печати по очереди с изменяемой высотой основного detail
Возможно сделано криво(особенно подбор высоты основного detail - может кто подскажет как определить высоту detail?) - но работает

Удачи!
==========================
http://www.fordm.ru
Алексей И. Латухин

(Добавление)

Посчитать максимальную высоту всех значимых контролов (переменных), плюс смещение этих переменных относительно начала детали. Я делаю так (STRING'и использую только для однострочной информации, иначе TEXT):

Код: Выделить всё

SetSeparatorHeight ROUTINE

  DATA

nLoopIndex       SIGNED,AUTO
nMaxDetailHeight SIGNED(0)
nDetailHeight    SIGNED,AUTO

  CODE
  SETTARGET(Report)
  LOOP nLoopIndex = FIRSTFIELD() TO LASTFIELD()
    IF nLoopIndex{PROP:Type} = CREATE:Text AND nLoopIndex{PROP:Parent} = ?Detail
      nDetailHeight = 2 * nLoopIndex{PROP:YPos} + nLoopIndex{PROP:LineCount} * nLoopIndex{PROP:LineHeight}
      IF nDetailHeight > nMaxDetailHeight
        nMaxDetailHeight = nDetailHeight
      END
    END
  END
  LOOP nLoopIndex = FIRSTFIELD() TO LASTFIELD()
    IF ((nLoopIndex{PROP:Type} = CREATE:Line AND nLoopIndex{PROP:Width} = 0) OR nLoopIndex{PROP:Type} = CREATE:Text) AND
nLoopIndex{PROP:Parent} = ?Detail
      nLoopIndex{PROP:Height} = nMaxDetailHeight
    END
  END
  ?Underline{PROP:YPos} = nMaxDetailHeight
  SETTARGET

Алексей

(Добавление)
А для деталей с атрибутом Absolute высота не засчитывается...
When ABSOLUTE is present, the position specified by the x and y
parameters of the structure's AT attribute is relative to the top
left corner of the page. ABSOLUTE has no effect on following
structures printed without the ABSOLUTE attribute.

Юрий, ты не понял, видимо...

Объясняю на примере:

Код: Выделить всё

    
        1 лист               следующие
     -------------          -------------
    !  Заголовок  !     !  ---------  !
    !  ------------  !     ! !           ! !
    ! !  Шапка  !  !     !  ---------  !
    !  ------------  !     !               !
    !                   !     !               !
    !                   !     !               !
    !                   !     !               !
     -------------          -------------
Что видим: на первом листе надпись "Заголовок" (PROP:YPos = Y1)и
Y-позиция "шапки" (PROP:YPos = Y2), на следующих надписи
"Заголовок" нет (спрятали) и позиция "шапки" PROP:YPos = Y1, т.е.
Y-позиии надписи.

Мне не нужно печатать за пределами печати, мне нужно сделать именно так как я нарисовал.

Алексей

(Добавление)

Так надо писать так, чтобы понял :). Я делал деталь с реквизитом Absolute на фоне белого прямоугольника и печатал шапку документа.
После чего печатал пустую деталь, чтобы данные начинались там, где надо.

---------------------------------------
C уважением,
Юрий Философов

А так: ?

1. Делаем деталь Заголовок + Шапка (копия шапки страницы или я тоже чего-то не понял?). Под них подкладываем белый BOX. Задаем абсолютные координаты = координатам шапки
2. Делаем пустую деталь с высотой заголовка.
3. В условиях печати детали для обеих ставим False.
3. Перед печатью первой записи вручную печатаем первую деталь - должна закрыть стандартную шапку и вторую - должна занять перекрытое первой деталью место.

WBR, Nick Tsigouro. MailTo:Nick@arsis.ru

(Добавление)

3. После печати 1-й страницы делаем ее невидимой.

Так просто?! :)
Читаем ниже внимательно...
Если я сделаю надпись "Ведомость" невидимой, то шапка так и останется "опущенной" на остальных страницах, а мне нужно поднять ее на уровень надписи "Ведомость".

Алексей

Вообще-то должно решаться руками... Вопрос был о приницпе, а не о том, что где-то можно купить что-то, что позволит сделать жизнь веселей ;)

Наш человек :)

Алексей

(Добавление)

Привет, Oksana!

У меня предложение - видоизменить (переписать) шаблон REPORTS. Это будет очень полезно - уж очень часто приходится делать подобные вещи и хочется работу упростить.

Дело осталось за малым, кто это предложение реализует... :)

Алексей

(Добавление)

Это задача из ряда стандартных:

1 Page

Title
Header Table
Table

2 Page

Hader Table
Table

Решение, которое я предложу на первый взгляд покажется сложным, но на самом деле оно очень простое.
Чтобы делать отчёты любой сложности необходимо контролировать процесс печати, завершение наполнения страницы, переход на следующую, этого штатно нет, но решается.

Чтобы контролировать наполнение страницы, на первый взгляд кажется, что надо просто суммировать высоты печатаемых DETAIL секций, при условии, что мы всё печатаем через такие секции, но эксперименты показали, что это утверждение не верно, происходит своего рода округление и определить точно страница наполнена или нет не получится.

Решение очень простое:
Создаёте DETAIL секции на все группы, на Title, на Header Table, на
Table,...., и пустой DETAIL
Далее сами в динамике формируете DETAIL секцию на одну страницу на базе пустого, т е через CREATE и смещение по высоте от начала наполняете пустой DETAIL информацией из требуемых секций, с контролем на переполнение страницы по высоте. В результате Вы контролируете все процессы печати страницы.

Andrew Myalin

(Добавление)

Так просто?! :)
Читаем ниже внимательно...
Если я сделаю надпись "Ведомость" невидимой, то шапка так и останется "опущенной" на остальных страницах, а мне нужно поднять ее на уровень надписи "Ведомость".

Я уже в одном из писем описывала этот кривой процесс (он мне не нравится), но работает и ладно.
У меня был такой отчет - надпись, шапка таблицы, а внизу шапки строка 1,2,3 и т.д., имитирующие колонки, т.е мы печатаем название, шапку таблицы, а на следующих страницах только строку 1,2,3. Согласитесь, подобные вещи встречаются довольно часто...(это к вопросу про шаблон)
У меня есть этот отчет под С4, если есть время с этим разобраться, я его вышлю.

С уважением,
Рожкова Оксана,
mailto: orozhkova@mdi.ru

(Добавление)

Так надо писать так, чтобы понял :).

"Да я три раза объяснил, уже и сам понял..." (с) анекдот :)

Я делал деталь с реквизитом Absolute на фоне белого прямоугольника и печатал шапку документа. После чего печатал пустую деталь, чтобы данные начинались там, где надо.

А вот теперь не понял я. :)
Что значит пустую деталь? Высота детали? И вообще это "левая" деталь? Можно подробнее.

Алексей

(Добавление)

Мне не нужно печатать за пределами печати, мне нужно сделать именно так как я нарисовал.

Solution:
1- делаешь обычный репорт с page header и detail
2- делаешь detail с точной копией page header (не забыть про use атрибут!) и БЕЗ Absolute
3- Делаешь detail с Absolute position такой-же как у page header (не забыть сначала нарисовать белый прямоугольник с белыми границами по размеру page header, и, опять же про атрибут use) и рисуешь там чего надо.
4- На вкладке Detail filter новым деталям ставишь False.
5- В source после report open ставишь print этих details.
6- Радуешься жизни.

/Alexey

PS: И никаких извращений!

(Добавление)

Что значит пустую деталь? Высота детали? И вообще это "левая" деталь? Можно подробнее.

Наша задача- отпечатать заголовок отчёта и закрыть стандартный ReportHeader. Делаем деталь с атрибутом Absolute, включающую заголовки шапку документа. Под неё подкладываем белый прямоугольник, чтобы он перекрыл Page Header. Но если первый заголовок больше стандартного, обычные детали должны начинаться ниже обычного. Поэтому надо ещё напечатать ничего не содержащую деталь, высота которой равна разности высоты шапки первого листа и обычного PageHeader. Ну и подгонять немного придётся, конечно...

---------------------------------------
C уважением,
Юрий Философов
Написал: ClaList(2)
Гость

Сообщение Гость »

Поэтому надо ещё напечатать ничего не содержащую деталь, высота которой равна разности высоты шапки первого листа и обычного PageHeader. Ну и подгонять немного придётся, конечно...
Вот теперь понял... :) да и Володя Якимченко помог... :)
Всем спасибо за советы. Все получилось.

Сделал так:

1. Нарисовал обычный отчет с хидером (без заголовка) и футером.
2. Создал хидер-деталь - копия хидера + заголовок.
3. Создал пустую деталь высотой
= высота_хидер-детали - высота_хидера - позиция_хидер-детали
4. Открыл отчет
5. Спрятал хидер
6. Отпечатал хидер-деталь
7. Показал хидер
8. Перед печатью первой детали распечатал пустую_деталь
9. Взвел флаг ее_больше_непечати
10. Печать деталей

Работает... :)

Итак, после некоторых "исследований" вырисовался новый "более правильный" вариант. :)

1. Создаем стандартный отчет: хидер (без заголовка),тело,футер
2. Создаем хидер-деталь - копия хидера + заголовок таблицы
3. Выставляем атрибут Y для хидер-детали равный разнице высот хидер-детали и хидера, взятый со знаком минус. Атрибут ABSOLUTE не нужен.
4. Послеоткрытия отчета прячем стандартный хидер, печатаем хидер-деталь, восстанавливаем печать хидера.

Все дальнейшая печать идет как обычно. Т.е. никаких лишних деталей.

P.S. Вадик, вероятно вот "твой" алгоритм. :)

Алексей

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

Да понятно, что все это (может не все) можно сделать руками, но...
хорошо, когда есть только хидер и таблица, а если есть постраничный тотал? а как отлавливать висячие детали. Пример: последняя деталь отпечаталась на последнем листе и нужно отпечатать тотал по некой части, т.е. тотал уже не помещяется на этот лист и должен перейти на другой, что не есть красиво. Ннужно перенести последнюю деталь на последний лист, но она-то уже распечатана.

Алексей

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

Andrew Myalin

(Добавление)

P.S. Вадик, вероятно вот "твой" алгоритм. :)

Точно! Именно так и было в той старой проге - там только смещениями и прятатнием загловка достигался результат.

--
Best regards,
Vadim
Написал: ClaList(2)
Гость

Сообщение Гость »

Решение очень простое:
Создаёте DETAIL секции на все группы, на Title, на Header Table, на Table,...., и пустой DETAIL
Далее сами в динамике формируете DETAIL секцию на одну страницу на базе пустого, т е через CREATE и смещение по высоте от начала наполняете пустой DETAIL информацией из требуемых секций, с контролем на переполнение страницы по высоте. В результате Вы контролируете все процессы печати страницы.
А почему нельзя воспользоваться Title и PageHeader? В Title заносим заголовок документа и часть шапки, а в page Header то, что повторяется на остальных страницах - строчка с 1,2,3...

olga <oklish@mail.ru>

Ну дык... это и нужно было (разве что не 1,2,3). Дело было в том, чтобы использовать освободившееся место, которое остается на странице, не содержащей заголовок таблицы.

Алексей

(Добавление)

Да вроде бы никогда не оставалось свободного места, если использовать Title , следующая страница нормально печаталась сверху

olga

(Добавление)

Прошу прощения - такая структура (Title) есть только в шаблонах В.Дегтяренко для печати в rtf- файл, в стандартных шаблонах нет, работаю только с ними, а посему заклинило

--
Best regards,
olga
Написал: ClaList(2)
Гость

Сообщение Гость »

Да вроде бы никогда не оставалось свободного места, если использовать Title , следующая страница нормально печаталась сверху
А что подразумевается под Title?
Прошу прощения - такая структура (Title) есть только в шаблонах В.Дегтяренко для печати в rtf- файл, в стандартных шаблонах нет, работаю только с ними, а посему заклинило
Вот теперь понятно. :)

Алексей
Написал: ClaList(2)
Ответить