1 декабря 2010 г.

Вышел обновленный плагин для Symphony 3

A set of IBM Lotus Symphony related plug-ins for IBM Lotus Notes 8.5.1 and 8.5.2 with embedded Symphony 3.0 installed (all supported operating systems) to import and export data between Lotus Notes applications and Symphony documents, spreadsheets and presentations.
You need to download also the zip archive including the configuration application, a sample Notes database and two sample spreadsheet.
READ CAREFULLY THE ADMINISTRATOR, USER AND SAMPLE GUIDES INCLUDED IN THE ZIP ARCHIVE TO KNOW DETAILS ABOUT THE WAY THEY WORK.
Guide and user interface are in English language only.

Файл с примерами

26 октября 2010 г.

Продолжение работы с массивами

Пробежка по коллекции документов с возможностью использования Type total для формирования массива содержащего в себе значения lable, value, value_percent. Удобно для использования в сортировке коллекции документов по выбранному ключу (полю)

[Declarations]
Type total
lable As String
value As Double
value_percent As Double
End Type
[Sub/Function]
dim suf
suf = "_1"
Dim doc As NotesDocument
Dim progolos As NotesItem
Dim proc As NotesItem
Dim a As Integer
Dim progolos As String, proc As String, progolos_val As Variant, proc_val As Variant
progolos = "progolos_" & suf
proc= "proc_" & suf
Set doc = coll.GetFirstDocument
Do While Not(doc Is Nothing)
Set progolos = doc.GetFirstItem(progolos_izbiratel)
Set proc = doc.GetFirstItem(proc_izbiratel)
If ( progolos Is Nothing ) Then
progolos_val = ""
Else
progolos_val = progolos.values(0)
End If
If ( proc Is Nothing ) Then
proc_val = ""
Else
proc_val = proc.values(0)
End If

ReDim Preserve array(a%) As total_progolos
array(a%).lable = doc.n_kom(0)
array(a%).value = progolos_val
array(a%).value_percent = proc_val

Set doc = coll.GetNextDocument(doc)
a% = a% + 1
Loop

25 октября 2010 г.

Вышел релиз IBM Lotus Symphony3

Компания IBM выпустила релиз офисного пакета Lotus Symphony 3.0, построенного на основе переработанного кода OpenOffice.org 3.x (прошлая стабильная версия Lotus Symphony 1.3 была основана на OpenOffice.org 1.1.4) и Eclipse Rich Client Platform. Lotus Symphony имеет переработанный интерфейс пользователя, позволяет создавать документы, электронные таблицы и презентации с организацией совместного доступа и групповой работы над ними. В пакете имеется поддержка всех популярных форматов офисных документов, включая DOC, PPS, OOXML (Microsoft Office) и ODF (Open Document Format). Пакет доступен для свободной загрузки для платформ Windows, Mac OS X, Ubuntu, Red Hat и SUSE Linux.

По сравнению с прошлой версией в Lotus Symphony 3.0 внесено более сотни важных улучшений. Наиболее интересные из новшеств:
Поддержка выполнения VBA-скриптов;
Поддержка стандарта ODF 1.2;
Поддержка OLE-объектов Office 2007;
Полностью переработанная боковая панель инструментов, содержащая расширенный набор секций и панелей, поддерживающая гибкие средства настройки содержимого;
Поддержка настройки содержимого и формата панели инструментов;
Возможность создания новых визитных карт и этикеток;
Возможность интеграции в документ OLE-объектов, аудио и видео файлов;
Поддержка режима Live Text, позволяющего распознавать типовые шаблоны в тексте и выполнять с текстом определенные действия (например, указывать адрес на карте, выводить данные из адресной книги и т.п.);
Поддержка зашифрованных и защищенных паролем файлов Microsoft Word и Excel;
Новая галерея клипарта и расширенный набор шаблонов;
Поддержка VML-изображений в файлах OOXML;
Поддержка в VBA API расширенных параметров для защиты электронных таблиц;
Автоматическая проверка наличия обновления пакета в сети;
Редактор документов
Поддержка вложенных таблиц;
Режим многостраничного просмотра макета документа;
Поддержка режима Auto Text, при котором редактор автоматически подбирает варианты завершения фразы по первым буквам;
Поддержка задания пользовательских свойств;
Несколько уровней начертания абзцев;
Редактор электронных таблиц
Максимальное число столбцов расширено с 256 до 1024;
Поддержка масштабирования, характерного для электронных таблиц;
Поддержка преобразования текста в значения столбцов;
Возможность решения уравнений;
Функция "What if";
Поддержка вставки массива констант в формулу;
Поддержка динамических диапазонов в списках проверки;
Поддержка дополнительных формул.
Система создания презентаций
Поддержка отображения на нескольких мониторах;
Расширение числа анимационных эффектов для презентаций;
Расширения числа макетов страниц, графических объектов и шрифтов;
Поддержка копирования и вставки страниц и объектов, вместе со связанными с ними анимационными эффектами.
Прекращена поддержка возможностей, ранее доступных в версии 1.3: импорт SmartSuite-файлов, поддержка Freehand-таблиц, предварительный просмотр презентации перед выводом на печать, возможность создания XForm-документов и поддержка Connector в редакторе документов.

12 октября 2010 г.

Java class по работе связки Notes&SQL

Класс представляет собой связку Notes и SQL. Агент запускается при активировании ссылки [http://host/db.nsf/agent?OpenAgent&id=111111]. Далее происходит обработка запроса к SQL по полученному праметру id=111111, затем в базе Domino создается notes-документ с параметрами выбранными из запроса.

import lotus.domino.*;
import java.util.Vector;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.net.*;
import java.io.*;
import java.util.*;

public class JavaAgent extends AgentBase {

public static java.util.Hashtable parseQueryString(String queryString) {
StringTokenizer tokens = new StringTokenizer(queryString, "&");
Hashtable params = new Hashtable();
while (tokens.hasMoreTokens()){
String token = tokens.nextToken();
int equalIdx = token.indexOf('=');
if (equalIdx != -1 && !token.equalsIgnoreCase("OpenAgent")){
String name = token.substring(0, equalIdx);
System.out.println("name " + name);
String value = token.substring(equalIdx + 1);
System.out.println("value " + value);
params.put(name, value);
}
}
return params;
}
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Document webdoc = agentContext.getDocumentContext();
PrintWriter pw = getAgentOutput();
String qs = webdoc.getItemValueString("Query_String");
java.util.Hashtable ht = parseQueryString(qs);
String id = (String) ht.get( "id" );
// pw.println("ID : " + id);
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
// System.out.println("сессии инициировались");
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
// Class.forName("org.postgresql.Driver").newInstance(); //для случая postgresql

System.out.println("Драйвер загружен");
}
catch (Exception ex)
{
System.out.println("SQLException: " + ex.getMessage());
}
try {
conn = DriverManager.getConnection("jdbc:mysql://conect);
// conn = DriverManager.getConnection("jdbc:postgresql://conect); //для случая postgresql

System.out.println("Подключение установлено");
}
catch (SQLException ex)
{
System.out.println("On connect SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
try {
stmt = conn.createStatement();
System.out.println("id " + id);
String Query = "SELECT * FROM pr_data WHERE auth = " + '"'+id+ '"';// + " ORDER BY id";
//String Query = "SELECT * FROM pr_data";
System.out.println("Запрос " + Query);

try {
rs = stmt.executeQuery(Query);
System.out.println("Запрос выполняется");
}
catch(SQLException ex)
{
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
Database db = agentContext.getCurrentDatabase();
Document doc = db.createDocument();
while (rs.next()) {
int theid= rs.getInt("id");
String fname = rs.getString("fname");
String mname = rs.getString("mname");
String lname = rs.getString("lname");
String message = rs.getString("message");
String email = rs.getString("email");
String auth = rs.getString("auth");
String pindex = rs.getString("pindex");
String pregion = rs.getString("pregion");
String plocality = rs.getString("plocality");
String pstreet = rs.getString("pstreet");
String phome = rs.getString("phome");
String pcorps = rs.getString("pcorps");
String pflat = rs.getString("pflat");
System.out.println("Переменные присвоены");
System.out.println("auth_code= " + auth );
System.out.println("id= " + theid + " ---> ФИО = " + fname + " " + mname +" "+ lname);
System.out.println("id= " + theid + " ---> Почтовый адрес = " + pindex +" "+ pregion +" "+ plocality +" "+ pstreet +" "+ phome +" "+ pcorps +" "+ pflat);
System.out.println("id= " + theid + " ---> Электронныйый адрес = " + email);
System.out.println("id= " + theid + " ---> Текст обращения = " + message );
System.out.println("_________________________________");

doc.replaceItemValue("Form", "rlo");
doc.replaceItemValue("auth", id);
doc.replaceItemValue("FIO", fname + " " + mname +" "+ lname);
doc.replaceItemValue("Address", pindex +" "+ pregion +" "+ plocality +" ул."+ pstreet +" д."+ phome +" корп."+ pcorps +" кв."+ pflat);
doc.replaceItemValue("email", email);
doc.replaceItemValue("Annotation", message);
doc.computeWithForm(false, false);
doc.save();
}
} finally {
if (rs != null) {
try {
rs.close();
} catch(SQLException ex) {}
rs = null;
} //if
if (stmt != null) {
try {
stmt.close();
} catch(SQLException ex) {}
stmt = null;
} //if
} //finally


} catch(Exception e) {
e.printStackTrace();
}
}
}

6 октября 2010 г.

Новоиспеченный проект по ведению Реестра муниципальных служащих


Недавно поступило задание сделать такой Реестр муниципальных служащих, в котором бы отображалась информация о последних. Сказано сделано! Посидев несколько вечеров написал вот такое приложение.

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

Видео с презентацией работы.

18 марта 2010 г.

Посмотрим на свое network оборудование изнутри

On Error Resume Next

Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
arrComputers = Array("localhost")

For Each strComputer In arrComputers
str = str & "SystemName: " & objItem.SystemName & chr(13)
str = str & "==========================================" & chr(13)
str = str & "Computer: " & strComputer & chr(13)

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter", "WQL",wbemFlagReturnImmediately +wbemFlagForwardOnly)

For Each objItem In colItems
str = str & "AdapterType: " & objItem.AdapterType & chr(13)
str = str & "AdapterTypeId: " & objItem.AdapterTypeId & chr(13)
str = str & "AutoSense: " & objItem.AutoSense & chr(13)
str = str & "Availability: " & objItem.Availability & chr(13)
str = str & "Caption: " & objItem.Caption & chr(13)
str = str & "ConfigManagerErrorCode: " & objItem.ConfigManagerErrorCode & chr(13)
str = str & "ConfigManagerUserConfig: " & objItem.ConfigManagerUserConfig & chr(13)
str = str & "CreationClassName: " & objItem.CreationClassName & chr(13)
str = str & "Description: " & objItem.Description & chr(13)
str = str & "DeviceID: " & objItem.DeviceID & chr(13)
str = str & "ErrorCleared: " & objItem.ErrorCleared & chr(13)
str = str & "ErrorDescription: " & objItem.ErrorDescription & chr(13)
str = str & "Index: " & objItem.Index & chr(13)
str = str & "InstallDate: " & WMIDateStringToDate(objItem.InstallDate) & chr(13)
str = str & "Installed: " & objItem.Installed & chr(13)
str = str & "LastErrorCode: " & objItem.LastErrorCode & chr(13)
str = str & "MACAddress: " & objItem.MACAddress & chr(13)
str = str & "Manufacturer: " & objItem.Manufacturer & chr(13)
str = str & "MaxNumberControlled: " & objItem.MaxNumberControlled & chr(13)
str = str & "MaxSpeed: " & objItem.MaxSpeed & chr(13)
str = str & "Name: " & objItem.Name & chr(13)
str = str & "NetConnectionID: " & objItem.NetConnectionID & chr(13)
str = str & "NetConnectionStatus: " & objItem.NetConnectionStatus & chr(13)
strNetworkAddresses = Join(objItem.NetworkAddresses, ",")
str = str & "NetworkAddresses: " & strNetworkAddresses & chr(13)
str = str & "PermanentAddress: " & objItem.PermanentAddress & chr(13)
str = str & "PNPDeviceID: " & objItem.PNPDeviceID & chr(13)
strPowerManagementCapabilities = Join(objItem.PowerManagementCapabilities, ",")
str = str & "PowerManagementCapabilities: " & strPowerManagementCapabilities & chr(13)
str = str & "PowerManagementSupported: " & objItem.PowerManagementSupported & chr(13)
str = str & "ProductName: " & objItem.ProductName & chr(13)
str = str & "ServiceName: " & objItem.ServiceName & chr(13)
str = str & "Speed: " & objItem.Speed & chr(13)
str = str & "Status: " & objItem.Status & chr(13)
str = str & "StatusInfo: " & objItem.StatusInfo & chr(13)
str = str & "SystemCreationClassName: " & objItem.SystemCreationClassName & chr(13)
str = str & "TimeOfLastReset: " & WMIDateStringToDate(objItem.TimeOfLastReset) & chr(13)
str = str & chr(13)
str = str & "=========================================="& chr(13)
'WScript.Echo str
'str = ""
Next
s = s & str
Next


Set obj=createobject ("scripting.filesystemobject")
Set notepad=obj.createtextfile("c:\res_net.txt")
notepad.writeline(s)


Function WMIDateStringToDate(dtmDate)
str = str & dtm:
WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & _
Mid(dtmDate, 7, 2) & "/" & Left(dtmDate, 4) _
& " " & Mid (dtmDate, 9, 2) & ":" & Mid(dtmDate, 11, 2) & ":" & Mid(dtmDate,13, 2))
End Function

16 марта 2010 г.

Снова о документе подключения

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

Sub create_connect
On Error Goto errmes
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim strErrMessage,connect,dserver
Dim s As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim coll As NotesDocumentCollection
Dim doc As NotesDocument
Dim coldoc As NotesDocument
Set db = s.GetDatabase("","names.nsf")


Set view = db.GetView("Connections")
'*****************************
connect = "server/domain"
'*****************************
Set coll = view.Getalldocumentsbykey(connect)
Stop
If coll.Count > 1 Then
'если в коллекции найдены несколько документов, то проверить у них интернет-хост
'если он не удовлетворяет условию, удалить документы не удовлетворяющие условию
Set doc = coll.Getfirstdocument
While Not(doc Is nothing)
If doc.Destination(0) = "CN=server/O=domain" Then
If Not (doc.OptionalNetworkAddress(0) = "server_inet_host") Then
Call doc.Removepermanently(True)
Call ws.Viewrefresh()
End If
End If
Set doc = coll.Getnextdocument(doc)
Wend
'если в коллекции найден один документ, то проверить у него интернет-хост
'и если он не удовлетворяет условию, то переписать значение на нужное
ElseIf coll.Count = 1 Then
Set doc = coll.Getfirstdocument
If Not doc.OptionalNetworkAddress(0) = "server_inet_host" Then
Call doc.ReplaceItemValue("OptionalNetworkAddress", "server_inet_host")
Call doc.ReplaceItemValue("PhoneNumber", "server_inet_host")
Call doc.Save(True,False)
End If
'если нет документа, то создать заново
ElseIf coll.Count = 0 Then

Set uidoc = ws.ComposeDocument( "", db.filename, "local" )
Call uidoc.FieldsetText("Destination","CN=server/O=domain")
Call uidoc.FieldsetText("OptionalNetworkAddress","server_inet_host")
Call uidoc.FieldsetText("PhoneNumber","server_inet_host")
Call uidoc.FieldsetText("PortName","TCPIP")
Call uidoc.FieldsetText("LanPortName","TCPIP")

Call uidoc.Save
Call uidoc.Close
Print "Документ подключения " & connect &" cоздан"
End if
'сообщение об ошибке
Exit Sub
errmes:
strErrMessage = "Ошибка " & Error$ & " выполняемая процедура " & Getthreadinfo(10) &" текущая процедура " & Getthreadinfo(1) & ", в строке " & Cstr(Erl)
Print strErrMessage
End sub