Отчеты в Lotus

LuMee

Well-known member
02.05.2006
477
0
#1
Насколько я понял, обычно отчеты в лотусе делаются путем выгрузки данных в Word или Excel средствами Lotus Script. Подход надежный, но довольно неудобный; особенно тяжко дается подготовка данных (ну до чего же Lotus Script убогий временами), когда требуется их достаточно сложная группировка и всяко.
Мне было интересно, имеет ли кто-нибудь опыт создания отчетов с помощью других средств, например, на Java (через Notes Java classes), .NET (через СОМ) или с помощью NotesSQL (тоже весьма кривая штука кстати, как оказалось)? И, если таковые имеются, прошу их этим опытом поделиться.
P.S. Особенно интересует все, что связано с Lotus R5, ибо с ним непосредственно и работаю.
 

morpheus

скриптописец
07.08.2006
3 915
1
#2
<!--QuoteBegin-LuMee+15:11:2006, 14:07 -->
<span class="vbquote">(LuMee @ 15:11:2006, 14:07 )</span><!--QuoteEBegin-->ну до чего же Lotus Script убогий временами
[snapback]47918" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ложь, п@#ёж и провокация! :huh:

я бы мог распинаться про кривые руки... но просто не соглашусь с Вами

<!--QuoteBegin-LuMee+15:11:2006, 14:07 -->
<span class="vbquote">(LuMee @ 15:11:2006, 14:07 )</span><!--QuoteEBegin-->особенно тяжко дается подготовка данных
[snapback]47918" rel="nofollow" target="_blank[/snapback]​
[/quote] - опять враньё....

вот самый простой пример Класс SortCollection

у себя зделал через Class и отчёты беруться на ура! и групировка и сортировка и всё что угодно, было бы желание
 
M

Mihal

#3
<!--QuoteBegin-LuMee+15:11:2006, 14:07 -->
<span class="vbquote">(LuMee @ 15:11:2006, 14:07 )</span><!--QuoteEBegin-->Насколько я понял, обычно отчеты в лотусе делаются путем выгрузки данных в Word или Excel средствами Lotus Script. Подход надежный, но довольно неудобный; особенно тяжко дается подготовка данных (ну до чего же Lotus Script убогий временами), когда требуется их достаточно сложная группировка и всяко.
[snapback]47918" rel="nofollow" target="_blank[/snapback]​
[/quote]

Протестую! В чём проблема ЛотусСкрипта?! А NotesSQL ясно шо кривая. Какой SQL в нереляционной базе?:huh: Кстати, а чем Java может помочь? Ну, можно дорваться до данных Jav-ой. А дальше что?

Технологии построения отчётов, которыми пользуюсь (пользовался) (альтернативные): Crystal Report, HTML, XML, ActiveX.
 

LuMee

Well-known member
02.05.2006
477
0
#4
Lotus Script расстраивает, главным образом, отстутствием такой приятной штуки, как коллекции. Array и List проблем не решают, ибо оба неудобны (у второго можно как нибудь по-простому узнать количество элементов?).
В java есть Hashtable, есть Vector - удобно и побыстрее, чем массивы Redim'ать каждый раз. Правда, нету возможности добраться до СОМ, а без этого сложно данные отобразить (эх, вот если бы кто-нибудь переписал JFreeReport под Java 1.1.8 :huh:)...
 

morpheus

скриптописец
07.08.2006
3 915
1
#5
<!--QuoteBegin-LuMee+15:11:2006, 16:51 -->
<span class="vbquote">(LuMee @ 15:11:2006, 16:51 )</span><!--QuoteEBegin-->отстутствием такой приятной штуки, как коллекции
[snapback]47933" rel="nofollow" target="_blank[/snapback]​
[/quote]
брэхня..... NotesDocumentCollection

<!--QuoteBegin-LuMee+15:11:2006, 16:51 -->
<span class="vbquote">(LuMee @ 15:11:2006, 16:51 )</span><!--QuoteEBegin-->Array и List проблем не решают
[snapback]47933" rel="nofollow" target="_blank[/snapback]​
[/quote] - можно доделать класы на основе масивов, с функ-ми сортировки и чего угодно
 

LuMee

Well-known member
02.05.2006
477
0
#6
... который:
1. хранит только документы, а мне числа/строки надо - запаковывать их в NotesDocument? тормозить наверное будет, или нет?
2. нельзя даже создать по нормальному (жалко что ли IBM'овцам было конструктор ему сделать), приходится изголятся с вьюхами. Мелочь в сущности, но неприятно
- можно доделать класы на основе масивов, с функ-ми сортировки и чего угодно
Можно, конечно можно, было бы время. При наличии онного можно вообще взять С++ какой-нить и собственный АPI к Лотусу соорудить, вот только как быть, если время очень крепко поджимает?
Опять же, динамическая коллекция на основе массивов по-прежнему предполагает регулярное redim'анье массивов, хранящих данные, что не лучшим образом сказывается на производительности (в Java массивы порезвее наверное пересоздаются).
 
30.05.2006
1 345
11
#7
Опять же, динамическая коллекция на основе массивов по-прежнему предполагает регулярное redim'анье массивов, хранящих данные, что не лучшим образом сказывается на производительности (в Java массивы порезвее наверное пересоздаются).
По-резвее? Из чего это следует? Природу не обманешь! Ну, если в Жабе дин."массив" в действительности сделан на списках, то его Redim и правда будет быстрее. Зато выборка/обновление элемента - медленнее.
У LS-массивов один существенный недостаток: ограничение на макс.длину
 
M

Mihal

#8
Я когда делал на лотусе делал след. конструкцию. Сделал свой тип, состоящий из массива и документа. Потом сделал список таких типов. В массив каждого элемента засовывал ключи на другие элементы списка (что-то вроде многосвязного списка получилось). Такая конструкция у меня отрабатывала МУХОЙ (реально нереально быстро) несколько тысяч документов. Правда, потом долго их сейвила :). Так что извращаться можно по-разному.
 

morpheus

скриптописец
07.08.2006
3 915
1
#9
Для: Mihal

я немного по другому

Зделал
Код:
Class Record
Public Type As String
Public Vikovavec As String
Public VikovavecBez As String
.......
около 30 наименований(чтобы точно хватило)
Потом обьявил "коллекцию/масив"

Код:
Class MasRecord
Public Rec() As Record
Public Count As Long

' Создание класса
Sub New()
Count = -1
End Sub
В теле класа MasRecord обьявлены все функции : добвления, удаления, сортировки... всё что угодно... работает быстро
 

LuMee

Well-known member
02.05.2006
477
0
#10
Так что извращаться можно по-разному.
Ну да.. А хочется без извращений, по-человечески

2 Morpheus
Получается что-то вроде такого, так?
Код:
Class Collection
Private capacity As Long
Private lastPosition As Long
Private data() As Variant

Sub New()
capacity = 0
lastPosition = -1
End Sub

Sub Add(item As Variant)
If Not lastPosition < (capacity - 1) Then
Redim Preserve data(capacity + 1) ' Или больше, чтоб меньше раз Redim'ать
End If
lastPosition = lastPosition + 1
data(lastPosition) = item
End Sub

Function Get(index As Long) As Variant
Get = data(index)
End Function

...
Только неясно, как в рамках подобной парадигмы оформить удаление элементов: что делать, если элемент удаляется из середины списка?
З.Ы. Продолжая тему LS-извращений, могу еще и придумать LS-версию Hashtable из Java:
Код:
Class Hashtable
Private data As NotesDocument

Sub New(db As NotesDatabase)
Set data = new NotesDocument(db)
End Sub

Sub AddItem(key As String, value As Variant)
Call data.ReplaceItemValue(key, value)
End Sub

Function GetByKey(key As String) As Variant
GetByKey = data.GetItemValue(key)
End Function

Function GetByIndex(index As Long) As Variant
GetByIndex = data.Items(index).Values
End Function

...
Вот только все это по-прежему отдает извратом ненужным... Зато прикольно :)
 

morpheus

скриптописец
07.08.2006
3 915
1
#11
<!--QuoteBegin-LuMee+16:11:2006, 20:49 -->
<span class="vbquote">(LuMee @ 16:11:2006, 20:49 )</span><!--QuoteEBegin-->Только неясно, как в рамках подобной парадигмы оформить удаление элементов: что делать, если элемент удаляется из середины списка?
[snapback]48051" rel="nofollow" target="_blank[/snapback]​
[/quote]

Код:
	'Удаление члена
Sub Del(i1 As Integer)
Dim k As Integer
k = Ubound(Rec)
Set Rec(i1) = Rec(k)
If k>0 Then
Redim TmpMas(k-1) As Record
Dim i As Integer
For i = 0 To k-1
Set TmpMas(i) = Rec(i)
Next
Erase Rec
Redim Rec(k-1) As Record
For i = 0 To k-1
Set Rec(i) = TmpMas(i)
Next
Count = Count -1
End If
End Sub
' Замена местами
Sub Repl(i1 As Integer, i2 As Integer)
Dim TmpRec As New Record
Set TmpRec = Rec(i1)
Set Rec(i1) = Rec(i2)
Set Rec(i2) = TmpRec
End Sub
 

morpheus

скриптописец
07.08.2006
3 915
1
#12
<!--QuoteBegin-LuMee+16:11:2006, 20:49 -->
<span class="vbquote">(LuMee @ 16:11:2006, 20:49 )</span><!--QuoteEBegin-->Вот только все это по-прежему отдает извратом ненужным
[snapback]48051" rel="nofollow" target="_blank[/snapback]​
[/quote]

НиХ... :) в смысле - отнюдь! Вполне нормальная работа с класами... а от по Вашим словам получаеться что LS это изврат, а собаки ваабче садо-мазахизм :)
 

LuMee

Well-known member
02.05.2006
477
0
#13
Идею удаления уловил, так и думал, в общем-то :D
НиХ... :unsure: в смысле - отнюдь! Вполне нормальная работа с класами...
Ну не знаю, тот прикол с хеш-коллекцией являет собой типичный пример нецелевого использования классов (NotesDocument в данном случае), что, вообще говоря, не поощряется.
а от по Вашим словам получаеться что LS это изврат, а собаки ваабче садо-мазахизм :blink:
LS - он да, в достаточной мере изврат :) После Java и C# выглядит каким-то непродуманным что ли...
Насчет собак, то в условиях периодических расхождений суровой реальности с документацией (недавно обсуждалось про @IsNewDoc), неважной документированностью отдельных функций, нигде не описанных "особенностей" поведения Лотуса и, наконец, полного отсутствия отладчика программирование на собаках нередко отдает самым жестким BDSM :)
 

morpheus

скриптописец
07.08.2006
3 915
1
#14
<!--QuoteBegin-LuMee+17:11:2006, 13:28 -->
<span class="vbquote">(LuMee @ 17:11:2006, 13:28 )</span><!--QuoteEBegin-->После Java и C# выглядит каким-то непродуманным что ли...
[snapback]48115" rel="nofollow" target="_blank[/snapback]​
[/quote]
Так ведь это есть СКРИПТ, что ж его сравнивать с C#.
Язык достаточно мощний,на котором можно решить поти все, хотя иногда сложновато(например выпадающее меню)

Подсел ан ЛС 2 года назад... пока не изменяю :unsure:
 
30.05.2006
1 345
11
#15
LS - он да, в достаточной мере изврат :) После Java и C# выглядит каким-то непродуманным что ли...
Молодо-зелено... Не после C#, а ДО. LS намного старше, да и Java-ки - тоже. У молодых языков нет груза обратной совместимости, а история LS еще из 1-2-3 тянется
К стати, никто не мешает тебе пользоваться Jav-ой. Там всё красивше, и иерархия классов действительно стройнее
 

LuMee

Well-known member
02.05.2006
477
0
#16
Язык достаточно мощний,на котором можно решить поти все, хотя иногда сложновато(например выпадающее меню)
Почти все - это да (правда, частенько через заднее место), жалко, что во многих местах (типа вычисления значений CFD-полей) можно только формулы использовать... Также жалко, что нельзя из него в формулы значения передавать (через profile docs - не всегда годится).
А как на нем выпадающее меню сделать?
Подсел ан ЛС 2 года назад... пока не изменяю
Гвозди бы делать из этих людей :) Мне полугода хватило, чтобы вдрызг расшатать нервную систему :blink:
Молодо-зелено... Не после C#, а ДО. LS намного старше, да и Java-ки - тоже. У молодых языков нет груза обратной совместимости, а история LS еще из 1-2-3 тянется
Под ПОСЛЕ я имел в виду не историю их создания, а лишь то, что раньше я работал с Java и C# (с этим и сейчас на других проектах), и после знакомства с ними LS мне кажется кривоватым и недоделанным.
Насчет обратной совместимости, я не думаю, что она сильно пострадает, если джедаи из IBM добавят в LS API несколько вспомогательных классов вроде Java'вских Hashtable или ArrayList, ну или реализуют дополнительные функции в самом LS.
К стати, никто не мешает тебе пользоваться Jav-ой. Там всё красивше, и иерархия классов действительно стройнее
Мешает, главным образом, то, что Java не может взаимодействовать с ГУИ, да и обработчики кнопок на ней писать нельзя. Значит, понадобится использовать LS вместе с агентами на Java, что в итоге усложняет архитектуру системы.
 
30.05.2006
1 345
11
#17
жалко, что во многих местах (типа вычисления значений CFD-полей) можно только формулы использовать...
"Вы просто не умеете их готовить!" doc.RerplaceItemValue "CFDpole","Value" - и все
Также жалко, что нельзя из него в формулы значения передавать (через profile docs - не всегда годится).
+ через поля, + через Environment. На чистом LS из вьюхи в форму тоже переменную передать нельзя: разные модули. Вот и @ - тоже другой модуль
А как на нем выпадающее меню сделать?
А при чем здесь язык? Архитектура системы тебя не устраивает, вирт.машина. А её аскетичность - плата за мультиплатформность, нет заклада на WinAPI
Под ПОСЛЕ я имел в виду не историю их создания, а лишь то, что раньше я работал с Java и C# (с этим и сейчас на других проектах), и после знакомства с ними LS мне кажется кривоватым и недоделанным.
А мне после Модулы и Оберона С/Жаба недоделками кажутся, и?
Мешает, главным образом, то, что Java не может взаимодействовать с ГУИ, да и обработчики кнопок на ней писать нельзя. Значит, понадобится использовать LS вместе с агентами на Java, что в итоге усложняет архитектуру системы.
Опять: ГУЙ - это здесь вирт.машина. Напиши свой -на Жабе (это доступно, апплеты) и взимодействуй!
 

LuMee

Well-known member
02.05.2006
477
0
#18
"Вы просто не умеете их готовить!" doc.RerplaceItemValue "CFDpole","Value" - и все
Если я не ошибаюсь, в итоге значение поля сохранится в документ. Тогда какое это поле CFD? Обычное вычисляемое получаем, а его мне не надо.
Еще мне все время было неясно, почему, скажем, на формулах установить значение CFD поля можно (FIELD CfdField := "Some value":blink:, а вот на LS с помощью Evaluate то же самое не получается (пишет что-то вроде "Не удается выполнить команду").
А при чем здесь язык? Архитектура системы тебя не устраивает, вирт.машина. А её аскетичность - плата за мультиплатформность, нет заклада на WinAPI
Да я просто спросил. Знаю, что там какие-то функции из Notes C API можно задействовать, только не попадалось мне пока их толковых описаний.
Опять: ГУЙ - это здесь вирт.машина. Напиши свой -на Жабе (это доступно, апплеты) и взимодействуй!
Мысль.. ГУИ на джава, бизнес-логику на джава, потом еще MySQL прикрутить где-нибудь с боку и вообще задуматься, а зачем в этой тусовке Lotus нужен :)
 
30.05.2006
1 345
11
#19
Если я не ошибаюсь, в итоге значение поля сохранится в документ. Тогда какое это поле CFD? Обычное вычисляемое получаем, а его мне не надо.
Ошибаешься. Если только ты не испортишь property item.saveToDisk. Им-то и отличается CFD-поле от прочих. Hint: это свойство поля устанавливает форма при открытии, а несвоевременное doc.ReplaceItemValue может и испортить
Еще мне все время было неясно, почему, скажем, на формулах установить значение CFD поля можно (FIELD CfdField := "Some value":blink:, а вот на LS с помощью Evaluate то же самое не получается (пишет что-то вроде "Не удается выполнить команду").
Все получается. Ищи ошибку. И RTFMь по-чаще. Про команды (@Command): сказано, что они не Evaluate-ятся
Знаю, что там какие-то функции из Notes C API можно задействовать, только не попадалось мне пока их толковых описаний.
Качай с IBMа весь C API. По Лотусовой традиции там унутре исключительно полный Help в виде *.nsf. Но м.б. разочарован: UI через C API не доступен
ГУИ на джава, бизнес-логику на джава, потом еще MySQL прикрутить где-нибудь с боку и вообще задуматься, а зачем в этой тусовке Lotus нужен :)
Правильно. В IBM тоже так думают. DB/2 + MQ + ВебСфера + ContentManager+.. На кой эта Domin-а?
 

LuMee

Well-known member
02.05.2006
477
0
#20
Ошибаешься. Если только ты не испортишь property item.saveToDisk. Им-то и отличается CFD-поле от прочих. Hint: это свойство поля устанавливает форма при открытии, а несвоевременное doc.ReplaceItemValue может и испортить
Хм, вот этого не знал. А можно поподробнее?
Все получается. Ищи ошибку. И RTFMь по-чаще. Про команды (@Command): сказано, что они не Evaluate-ятся
Ну, на команды и не расчитывал (собссно, и не надо). А вот что надо ему передавать в Evaluate вторым параметром, чтоб работала вышеприведенная формула? Насчет искать ошибку - при всем своем нубизме, в двух строчках ошибиться не могу (перепроверял) :)
Но м.б. разочарован: UI через C API не доступен
Кой-какой доступен. Нарыл в инете код для создания симпатичного прогресс бара (даже странно, что его не включили в обычный API) ;)
Правильно. В IBM тоже так думают. DB/2 + MQ + ВебСфера + ContentManager+.. На кой эта Domin-а?
Эти бы слова, да заказчику в уши :)