Report - ответы на часто задаваемые вопросы по CfW


Как в отчете вывести только одну выбранную в BROWSE запись ?

Ответ:
Заводим глобальную переменную (переменные) по первичному ключу записи. В Browse при вызове печати устанавливаем значение этой переменной. В Report отфильтровываем нужную запись.

Отвечал Владимир Смелик   Марта 15, 1999      vovs@bigfoot.com


Как использовать {PROP:...} в REPORTe и как использовать CREATE в REPORTe

Вопрос:
Задача состоит в том, что хотелось бы "динамически" создать отчет, т.е сформировать шапку в HEADERe и соответственно DETAIL. Поэтому вопрос №1 можно ли использовать "CREATE(...)" в REPORTe и вопрос №2 можно ли динамически, перед каждым новым вызовом процедуры печати, изменять размеры (например длину, положение и высоту) и свойства (например hide/unhide) управляющих элементов (text, line, и.т.д. ) в DETAILe и HEADERe. Хотя кто-то может быть предложит свой вариант решения такой задачи. С уважением Бородин Олег.

Ответ:
Ответ 1: Можно, только нужно внимательно прочитать в хелпе о третьем параметре CREATE(...) и см. ответ 2.
Ответ 2: Можно двумя способами.
Первый - перед изменением свойств сделать SETTARGET(<Метка Отчета>) и после изменения сделать SETTARGET.
Второй - использовать PROP в виде <Метка Отчета>$<Метка поля>{PROP:Что-то}, например Report$?Field1{PROP:Hide} = 1

Отвечал В. Синявский     Августа 03, 1999     root@jrcn.donetsk.ua


Можно ли в REPORTe сохранить отчет в файле или хотя бы печатать с любой страницы (не REPORT WRITER)?

Ответ:
В шаблонах Вадима Синявского имеется такая возможность.

Отвечал Vladimir V. Smelik    Мая 26, 1999      vovs@bigfoot.com


Можно ли отказаться от печати Header-а?

Вопрос:
Можно ли отказаться от печати скажем на первой странице Header-а?  А проблема в том, что на первой странице также нужен Header, такой же как на остальных, но с одним нюансом: в нем должно присутствовать что-то типа "Утверждаю..."   Естественно его лучше сделать через Detail, но как в таком случае отказаться от печати Header?

Ответ:
1. ИМХО лучший вариант вообще убрать всякие Header, сделать одни Detail. Вставку делай в "Перед печатью структуры Detail", там лучше всего сделать типа что-то следующего:

    SET(file)
    LOOP
       NEXT(file)
       IF ErrorCode ~= 0 THEN BREAK.
       Print(rpt:detail1)
       Print(rpt:detail2)
        ..... вообщем чего хочешь!!! Можно условие печати того или иного d
    .
    BREAK  ! Этот бряк из ACCEPT

2. Продублируй строчку с "Утверждаю.." и напиши в ней что хочешь, и поставь ее на то же место, а при печати можно делать HIDE той или иной строки. А если тебе вообще ее не нужно, то и дублировать не нужно, просто прячь ее на нужных страницах перед Print(rpt:header).   И все!!!

Отвечал Oleg Semkin   Февраля 01, 1999


Можно ли создать досовский отчет из CW4 ?

Ответ 1:
В составе моих шаблонов (правда только для C5) есть библиотекасоздания ASCII отчетов (именно отчетов, а не просто выгонка строкв ASCII-файл!). Поддерживаются практически все фичи Clarion-отчетов: разбиение на страницы, печать PageHeader/Footer, Break-стркутуры, счетчики/сумматоры и многе другое. Эту библиотеку можно использовать и без шаблонов, но это дело достаточно геморройное - необходим вызов большого количества инициализационных методов класса поддержки ASCII-отчета.

Отвечал В.Синявский   Января 20, 2000      root@jrcn.donetsk.ua

Ответ 2:
Наверное, здесь поможет только прямая печать на принтер. Раньше этот вопрос уже обсуждался, были даже темплейты. Посмотрите эти примеры:
ftp.net.gaming.ru/YuriM/Clarion/lineprn.zip
ftp.net.gaming.ru/YuriM/Clarion/prnfile.arj
ftp.net.gaming.ru/YuriM/Clarion/WRITEPRN.zip
Хотя они и очень старые, но их можно переделать в что-нибудь свое...
Другое решение - настроить виндовский драйвер принтера на печать в текстовом режиме. Драйвер такой имеется, только настройка - по дкаждый принтер индивидуальная.

Отвечал Юрий Марков   Мая 24, 2000      yumar@peterlink.ru


Печать заголовка отчета только на первой странице

Вопрос:
Стандартный форматер отчета не имеет раздела "REPORT HEADER".  Имеется в виду заголовок отчета, который печатается только напервой странице. Не всегда эту проблему удается решить путем групп и прерываний. Как быть с этим? То же самое касается и раздела итогов одного на весь отчет.

Ответ:
1. ИМХО лучший вариант вообще убрать всякие Header, сделать одни Detail.Вставку делай в "Перед печатью структуры Detail", там лучвсего сделать типа что-то следующего:

  SET(file)
  LOOP
    NEXT(file)
    IF ErrorCode ~= 0 THEN BREAK .
    Print(rpt:detail1)
    Print(rpt:detail2) ..... вообщем чего хочешь!!! Можно условие печати того или иного 
  .
  BREAK  ! Этот бряк из ACCEPT

2. Продублируй строчку с "Утверждаю.." и напиши в ней что хочешь, и поставь ее на то же место, а при печати можно делать HIDE той или иной строки. А если тебе вообще ее не нужно, то и дублировать не нужно, просто прячь ее на нужных страницах перед Print(rpt:header)

****************
Я делаю так. Для того, что бы можно было сделать приятный на вид заголовок отчета, необходимо выполнение двух условий :
  1. Шапка всего отчета должна размещаться в GroupHeader по RecordStatus
  2. PageHeader на первой странице необходимо замазать.
Первый пункт достаточно очевиден и останавливаться на нем я не буду. 
Со вторым пунктом несколько сложнее. Для решения этой задачи создаем дополнительную полосу Detail. Ее положение задаем в точности совпадающим с положением страничной шапки и устанавливаем атрибут ABSOLUTE. Внутри этой области размещаем БЕЛЫЙ прямоугольник, занимающий полностью всю полосу.Теперь, при печати отчета, вторая полоса будет полностью замазыватьстраничный заголовок.
  Для того, что бы она печаталась только один раз, снабжаем обе полосы атрибутом USE - USE(?p1) и USE(?p2), например. Это необходимо, для того, что бы по второй полосе можно было использовать условие печати. Условие задается в Параметрах отчета, на закладке Detail фильтр. Для второй полосы задаем условие фильтрации в виде логической переменной - FirstPage, например. Начальным значением этой переменной д.б. TRUE. В точку вставки "После печати Detail структур" вставляем FirstPage=FALSE. Этим достигается то, что нигде, кроме первой страницы, страничный заголовок затираться не будет.
   ВНИМАНИЕ: Вторая полоса Detail обязательно должна стоять в самом конце структуры Report, перед последним END. В противном случае, первая запись файла отчета будет суммироваться дважды. Я просто рукми переношу ее в самый конец. В результате получается нечто вроде :

Report   REPORT,AT(20,20,180,250),PAPER(9),PRE(RPT),FONT('Arial',8,,FONT:regula
    HEADER,AT(20,10,180,10)
       ! Заголовок страницы, который будет перекрыт
    END
    break1 BREAK(RecordStatus)
      HEADER,AT(,,,39)
         ! Здесь размещаем заголовок всего отчета
      END
      detail DETAIL,AT(,,,5),USE(?d1)
         ! Строка отчета - основная Detail
      END
      FOOTER
         ! Итоги по всему отчету
      END
    END
    detail2 DETAIL,AT(20,10,180,10),USE(?d2),ABSOLUTE
            ! Вспомогательная полоса для замазывания
       BOX,AT(0,0,180,10),USE(?Box1),COLOR(COLOR:White),FILL(COLOR:White),#ORIG(?Box1)
         ! Ластик
       END
    END
************Сергей Ларионов
Отвечал Oleg Semkin   Апреля 19, 1999

Ответ 2:
В Clarion5 достаточно титульную страницу сделать в Group break Header-е и включить у нее признак "Alone".

Отвечал Гундоров С.М.  01.06.2000


Постраничный Report

Вопрос:
Генерится большой, страниц эдак на 40 Report. В зависимости от ситуации он может портебоваться полностью, может потребоваться только первый лист, может какой-нибудь из середины, а может не один. Возможно ли это сделать и если можно то как?

Ответ:
В шаблонах Вадима Синявского есть возможность указать нужные страницы для печати.
Есть такие возможности и во вьювере отчетов из набора шаблонов TinTools, в ReportDat и пр.


Как "русифицировать" Report?

Ответ:
Использовать TTF и не забывать прописывать (руками, оно надежней)"Cyr" в имени фонта, например FONT('Arial Cyr',9,,,CHARSET:ANSI).
Открыть исходный текст структуры Report (при помощи кнопки "..." справа от кнопки "Report") и у атрибута FONT исправить название шрифта, например, вместо "Arial" написать "Arial Cyr".


Как при печати отчета узнать номер текущей страницы

Ответ:
Корректно - никак. В принципе в произвольный момент времени нельзя сказать, какая страница генерируeтся (из-за странично-ориетнированнойидеологии генерации отчетов в CW). Можно только сказать сколько старниц уже сформировано.

Отвечал В.Синявский   Декабря 30, 1999      root@jrcn.donetsk.ua


Как динамически (во время работы) изменять шрифт для ВСЕГО REPORT?

Вопрос:
Как динамически (во время работы) изменять шрифт для ВСЕГО REPORT?  При попытке делать это с помощью PROP: - игнорирует это! Если для изменения шрифта полей изменять его для КАЖДОГО поля !!! то, в общем-то работает, но ведь это неправильно.

Ответ:
Изменить шрифт окна (а отчет - это то же окно, но только устройствоего отображения другое) после его открытия в CW нельзя.Правильно это или нет, но c'est la vie.


Как определить размер бумаги принтера?

Вопрос:
Как определить размер бумаги принтера?   PRINTER{PROPPRINT:PaperHeight} и PRINTER{PROPPRINT:PaperWidth} не возвращают размер бумаги, установленной для принтера вWindows 95. Аналогично для REPORT.

Ответ:
PRINTER{PROPPRINT:PaperHeight} и PRINTER{PROPPRINT:PaperWidth} должны выдавать что-то вразумительное, только если значение PROPPRINT:Paper равно PAPER:User. В остальных случаях - могут, но не обязаны. Вообще-то, это не ограничение CW, а свойство Windows. Это правило установлено для соответствующих полей структуры DEVMODE DC устройства вывода.


Как указать формат бумаги?

Вопрос:
Если указать формат бумаги, например, А3, а принтер этот формат не поддерживает, то в режиме просмотра размер бумаги ограничен форматом А4. Как Clarion (REPORT) определяет это и можно ли от этого отказаться?

Ответ:
Любая Windows программа не сама рисует на экране или выводит на принтер, а использует для этого GDI. При инсталляции драйвера устройства его характеристики становятся доступными для GDI и GDI будет использовать их независимо от желания пользователя. Для принтера лист бумаги - это тот же экран. Например, если принтер имеет разрешение 300x300 dpi, а лист бумаги имеет размеры 11" x 8", то размеры изображения, которое может быть напечатано, равны 3300x2400 точек. Для данного принтера и для данного формата бумаги вывести за раз на печать изображение большего размера нельзя. Кроме того, GDI просто не разрешит использовать форматы бумаги и разрешение иные, помимо тех, которые поддерживаются драйвером.


Печать сумм в REPORT

Вопрос:
Проблема - в отчете необходимо вывести подсчеты по некоторым признакам. В DOSe это было легко (написать Setup Procedure) , здесь пробую - подобное не выходит.

Ответ:
Для решения подобной проблемы лично я делаю ряд магических телодвижений :)
1.Завести новую DETAIL
2.Всем элементам Report присвоить имена для USE (?detail ets.)
3.В Параметрах отчета->DETAIL_фильтр для основной detail создать фильтр XXX# = XXX# и поставить галочку "Исключить нефильтруемые Detail".
4.В Embeds "После печати Detail структур" выполняем суммирование.
5.В Embeds "Перед печатью препросмотра" печатаем detail с результатами. Может есть и более простой/правильный путь,но я делаю так.

Отвечал Владимир Смелик   Сентября 08, 1998     vovs@bigfoot.com


Разное количество колонок в одном отчете

Вопрос:
Необходимо на CW создать отчет с количеством колонок,вычисяемым во время работы программы (их может быть от 1до 1024).

Ответ:
Вариант №1 от Vasiliy Goncharenko.

1. Определяешь для своей Detail - структуры Use аттрибут, например ?MyDetail.
2. В точке вставки After Opening Report определяешь ширину своей Detail - структуры :
   SETTARGET(Report)
   ?MyDetail{PROP:Width} = xxxx
   SETTARGET()

Если ?MyDetail{PROP:Width} будет в 2 раза уже Detail area, то в отчете появится 2 колонки, 3 раза - 3 колонки, ... 1024 раз -1024 колонки.

Следует учесть, что вышенаписанное верно, если поля Detail -структуры не выступают за указанную в ?MyDetail{PROP:Width}ширину.

Вариант №2 от Юрия Философова.

Выражаю СВОЁ ЛИЧHОЕ мнение!

Есть вот такой интересный вариант - генерация отчётов вформате HTML. Я доработал библиотеку CGILIB (см у Смелика) таким образом, что она работает и локально с выводом отчётав обычный ASCII файл и в режиме собственно CGI, если работает под WEB-сервером.
Во-первых, отчёты легко переносить. А поскольку HTML c таблицами кушает товарищ Мелкомягкий Офис (и Word и Excel), файлы можно хранить, копировать и т д - это довольно неплохой вариант. Любит, знаете ли, нынче господин Юзер хранить отчёты, вставлять фрагменты в документы и манипулировать с циферками из отчётов в Excel. Вот ему и угодим :)

А построить таблицу с переменным числом колонок в HTML -раз плюнуть...

Юрий Философов.


Печать только totals в текстовый файл

Вопрос:
Есть файл, в котором есть билеты от несколько разных фирм.
Он бровзается за фильтром по отдельных фирмах. Теперь вопрос:
как сгенерить обычный текст-файл, в котором отдельно каждое количество билетов от каждой фирмы. То-есть:
ФИРМА             К-ВО
------------------------
Бла-бла-бла        300
Ку-ку                13
Еще-что-то         295

..и так далее.

Ответ:
1. Засосать все в очередь, обработать и выдать результат в текстовик (драйвер ASCII) в удобном для тебя виде.
2. Использовать процедуру-шаблон ReportASCII из Legacy-набора вместе с шаблоном ReportDataProcess. Для суммирования по фирмам сделать BREAK-группу. Результат выполнения данного шаблона - текстовый файл, сформированный на основе текстового шаблона. Там, так-же, есть возможность просмотра и/или распечатки полученного отчета.

Олег А. Руденко


Как сохранить данные ListBox'a в файл формата Excel не запуская сам Excel?

Ответ:
ODBC.
Во-первых, надо настроить в панели управления источник данных ODBC. Там хитрость в том, что указывается кол-во столбцов обозреваемых драйвером. А также имя Excel файла. Если его не указывать, то оно будет запрашиваться автоматом во время открытия файла. Для ОДБС Excel файл является базой данных. А каждый лист внутри него - таблицей.

Пусть на надо скинуть Browse из 10 колонок в Excel. Создаем источник данных с именем, например, ExcelBrowse и указываем, что сканируем 10 столбцов.

Описываем в клашке файл

Строка в NAME будет находится в первой строке листа, иначе там будет имя поля файла, если в названии встречаются пробелы, то название берется в ту хрень, которая находится на одной клавише с тильдой и буквой ЙО.

ExcelFile FILE,DRIVER('ODBC'),NAME('ExcelSheetName'),OWNER('ExcelBrowse'),CREATE
record      record
FIELD1        STRING(20),NAME('`Название колонки первого поля`')
и т.д.
              end
           end

Ну а дальше дело техники.
SET, NEXT, ADD, PUT и т.д. Только никаких GET. Вобщем см. Хелп.

Павел Яковенко


Как можно экспортировать отчеты из Clarion в EXEL

Ответ:
Я раньше выводил отчеты в Excel через механизм OLE.  Примеры такого вывода можно найти на сайтах по Clarion-у.  Но это оказалось очень медленно для больших отчетов (десятки минут).    Последнее время я делаю специальные процедурки экспорта нужных данных в текстовый файл в формате *.csv.  Это обычный текст.  Поля разделены запятыми. Строки заключены в кавычки.  Из строк предварительно удаляю символы "Запятая", <10> и <13>.

Эти файлы прекрасно читаются Excel-ом. После выполнения процедуры экспорта в файл я просто запускаю этот *.csv-файл на выполнение при помощи функции FileExecute (она есть на моем сайте).  В результате запускается Excel и открывает этот файл.  

Отвечал:  Гундоров Сергей,  gsm@pilot.ru


Как задать количество экземпляров отчета

Ответ 1:
-В GLOBAL
INCLUDE('PrnProp.clw')

-Перед открытием отчета
Printer{PropPrint:Copies} = количество копий

Вроде всё.

Отвечал: Сергей. njgor@ru.mos.ru

Ответ 2:
Только есть одна беда Printer{PropPrint:Copies} не всеми принтерами поддерживается

Бирюков Александр  mailto:baa@dionis.ru

Ответ 3:
Залезть в файл abreport.clw, натйти там метод PrintPreviewClass.Display, завести локальную переменную 
CopiesNumber LONG(1), добавить на локальное окно метода 
PROMPT('Копий:'),AT(190,12,34,9),USE(?CopiesNumber:2),RIGHT
SPIN(@n2),AT(226,12,21,9),USE(CopiesNumber),MSG('Выбор количества страниц в 
столбце'),RANGE(1,99), STEP(1)

Далее конец метода изменить так , чтобы он выглядел следующим образом
IF SELF.PrintOk
  SELF.SyncImageQueue
  j# = Records(SELF.ImageQueue)
  LOOP CopiesNumber-1 TIMES
    LOOP i# = 1 TO j#
       GET(SELF.ImageQueue, i#)
      ADD(SELF.ImageQueue)
    END
  END
END
RETURN SELF.PrintOK

Павел Яковенко, paolo@ncport.ru


 

Hosted by uCoz