Генератор Отчетов List & Label
Часто
задаваемые вопросы, советы и уловки
При
использовании List & Label возможна ли
работа с несколькими базами данных
одновременно?
Конечно.
Поскольку List & Label самостоятельно базы
данных не открывает, а получает данные
непосредственно от программиста, то как
вы в программе все организуете, так и
будет: хоть поле, хоть переменную, хоть
результат функции. List & Label требует
написания программы, которая должна
открыть описание формы, объявить для нее
переменные и пройти по данным, заполняя
переменные значениями и говоря "напечатать".
Общая структура такой программы -
типовая.
Где
я могу найти информацию об
использовании List & Label с Microsoft .NET?
Эту
информацию
можно найти здесь.
Существуют
ли примеры использования List & Label с
PowerBuilder?
К сожалению,
в комплекте поставки List & Label версии 8.0 примеров для PowerBuilder'a нет,
но структура обращения к List & Label едина для любой платформы.
Примеры использования List & Label с Alaska Xbase++ (с комментариями на русском языке)
можно найти здесь.
Я
установил себе List & Label 8.0 и не могу
найти Дизайнер в виде отдельного модуля.
List&Label не работает непосредственно с данными, а получает их из
вашего приложения. Все передаваемые ему данные должны быть вами
описаны, и это описание должно быть одинаковым при работе с
Дизайнером и при непосредственной генерации документа. Поэтому
Дизайнер не может существовать как самостоятельный исполняемый
модуль, но его запуск должен производиться вами при помощи функции
LlDefineLayout() после описания возможных переменных.
Например:
начинаем работу с переменными
llDefineVariableStart(hJob)
объявляем используемые переменные, для примера присваивая им некоторые
значения
llDefineVariableExt( hJob, 'Family', 'Иванов', LL_TEXT, 0 )
llDefineVariableExt( hJob, 'Name', 'Федор', LL_TEXT, 0 )
llDefineVariableExt( hJob, 'Father', 'Петрович', LL_TEXT, 0 )
вызываем дизайнер
LlDefineLayout( hJob, hWnd, "Дизайнер", LL_PROJECT_LABEL, 'Name.lbl' )
Я
установил себе List & Label 8.0 и не могу
найти документацию (HLP-файл) к Дизайнеру в папке,
в которую проинсталлирован продукт.
Информацию
о том, куда какие файлы установились, вы
можете найти в файле install.log,
расположенном в директории инсталляции List & Label.
По
умолчанию документация к Дизайнеру List
& Label (HLP-файл) инсталлируется в
системную папку Windows (например, под Windows 98
в C:\WIN*\SYSTEM) вместе с основной DLL (cm32l8.dll).
При необходимости можно вручную
переместить файлы, перечисленные в redist.txt
(включая HLP-файлы), в другую папку и соответственно
изменить переменную окружения PATH.
И,
конечно, вы
можете вызывать документацию из меню "Пуск -> Программы
-> Combit... -> Documentation".
Где
я могу посмотреть какая подверсия List & Label
8.0 у меня установлена?
Можете
запустить List & Label Sample Application и зайти в
пункт меню " ? -> About ", а можете
использовать функцию LlGetVersion(). Описание
функции LlGetVersion() смотрите в руководстве
программиста (Progref.pdf), включенном в
поставку List & Label.
Пример
создания подсказок при использовании OCX/VCL
Если
вы используете OCX (например, в Visual Basic) или
VCL компонент (в Delphi), вы можете назначать
подсказки на отдельные переменные и
поля в списке переменных.
Компоненты
List Label включают событие "VarHelpText",
с помощью которого для имени переменной
может быть назначена индивидуальная
подсказка.
Подсказка
будет появляться в тот момент, когда
указатель мыши делает паузу на
выбранной переменной.
Пожалуйста,
имейте в виду, что для того, чтобы
появилась соответствующая подсказка,
должно быть выбрано имя переменной.
Следующий
пример на Delphi покажет вам как это
делается. Вам просто нужно заменить
текст подсказки и имя переменной:
procedure TForm1.L7_1VarHelpText(Sender: TObject;
pszVarName: PChar; var pszHelpText: PChar);
определяет тексты описания для
переменных
var HelpText: String;
begin
If StrPas(pszVarName)='ITEMNO' then
HelpText:='Item Number'
else if StrPas(pszVarName)='DESCRIP1' then
HelpText:='Short Description'
else if StrPas(pszVarName)='DESCRIP2' then
HelpText:='Description'
else if StrPas(pszVarName)='PRICEPP' then
HelpText:='Price per Item'
else if StrPas(pszVarName)='SalesStatistics' then
HelpText:='Sales Statistics for Item'
else
HelpText:='Sorry, no help available';
StrPCopy(pszHelpText, HelpText);
end;
Если
вы не используете OCX или VCL, вы можете
получить тот же результат с помощью
LL_CMND_VARHELPTEXT.
Подавление
вывода данных
Для
подавления вывода данных, установите
значение переменной "1e100":
LlDefineVariableExt("DATE", "1e100", LL_DATE_MS, NULL)
Это
значение будет интерпретироваться как
"пустое" и будет подавляться при
использовании Date$(DATE) при обработке
переменных с данными в проекте List & Label.
Иерархический
просмотр полей/переменных в Дизайнере
Чтобы
отобразить переменные и поля в
Дизайнере List Label иерархически,
используйте период в именах полей/переменных.
LlDefineField(hJob, "Item.Description1", "sample");
LlDefineField(hJob, "Item.No", "0815");
Используя
сложные периоды, вы можете создавать
папки с иерархической структурой. При
использовании в Дизайнере никакой
настройки не требуется. Имена
переменных/полей будут, конечно,
содержать периоды, которые
использовались для их преобразования.
Нелатинские
буквы
Символ
"ч" ( Chr(247) ) по умолчанию
определяется List & Label как табуляция.
Чтобы пользоваться им как буквой,
переопределите табуляцию, например:
LlSetOption( hJob, LL_OPTION_TABREPRESENTATIONCODE, 400 )
Чтобы
не возникало проблем с именами
переменных, данными русским языком,
отключите опцию List & Label “использование
в именах только латинских букв”:
LlSetOption( hJob, LL_OPTION_XLATVARNAMES, .F. )
Формат
даты
List
& Label использует юлианский формат даты
– ее представление в числе дней,
прошедших с сотворения мира (а также в
часах, минутах и секундах, хранящихся в
дробной части такового числа). Если вы
пишете на Visual Basic, Visual FoxPro или Delphi, то
можете воспользоваться специальными
типами формата даты:
LL_DATE_OLE
LL_DATE_MS
LL_DATE_DELPHI
LL_DATE_DELPHI_1
LL_DATE_VFIXPRO
В
прочих случаях остаются два варианта:
Первый
вариант - при передаче данных в List & Label
перекрутить дату в юлианский формат,
например:
Func JulianDate(dDate)
Local nDate := 0
If ! Empty(dDate)
// 1 января 2000 года в юлианском формате
nDate := 2451544
// число дней с/до 1 января 2000 года
nDate += dDate - SToD('20000101')
Else
nDate := 10 ** 10
Endif
Return Str(nDate) // возвращаем строку, т.к.
значения
//
любого типа передаются
// функциям L&L в текстовом виде
Это
имеет смысл, если вы хотите
воспользоваться функциями дат,
встроенными в Дизайнер Форм List & Label, но
неудобно при наличии пустых дат, т.к.
юлианский формат их не предусматривает.
Придется присваивать пустой дате
заведомо нереальное значение (в примере
- 10**10) и ставить соответствующему
объекту файла проекта List & Label условие
видимости:
DateToJulian(даты) < 10**10
Второй
вариант - передавать дату в List & Label как
строку текста, приведя ее к нужному
формату в своем программном модуле. Это
снимает проблему пустых дат, но лишает
конечного пользователя возможности
менять формат даты.
Формат
строк
List
& Label работает с символами формата ANSI.
Если вы пользуетесь символами русского
алфавита, введенными в формате OEM, не
забывайте конвертировать их перед тем,
как передать функциям List & Label.