Lotus и Firebird (jdbc)

Тема в разделе "Lotus + Java + LS2J", создана пользователем DNT, 2 апр 2010.

  1. DNT

    DNT Постоялец форума
    Lotus team

    Репутация:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    590
    Симпатии:
    7
    Уважаемые господа подскажите, кто сталкивался, как мне подключиться к Firebird-овской БД и использовать табличные данные как справочник.
    Необходимо в документе, в поле со списком запихнуть данные таким образом.
    Есть ли у вас подобные задачи/решения? Не будет ли тормозов при открытии?
    Как оптимальнее решить такую задачу?

    Хочется примерчик, потому как :lol:
     
  2. vincent_vega

    vincent_vega Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    2 апр 2005
    Сообщения:
    168
    Симпатии:
    1
  3. DNT

    DNT Постоялец форума
    Lotus team

    Репутация:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    590
    Симпатии:
    7
    спасибо, вникаю

    а нету маааленького примерчика подключения?
     
  4. DNT

    DNT Постоялец форума
    Lotus team

    Репутация:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    590
    Симпатии:
    7
    vincent_vega спасибо, с подключением разобрался.
    Код:
    import lotus.domino.*;
    import java.sql.*;
     
    public class JavaAgent extends AgentBase {
       public void NotesMain() {
    	  try {
    		 Session session = getSession();
    		 AgentContext agentContext = session.getAgentContext();
    		 
    		 // (Your code goes here)
    		 DriverManager.registerDriver(new org.firebirdsql.jdbc.FBDriver());
    		 //Connection conn =DriverManager.getConnection ("jdbc:firebirdsql:192.168.0.1:dbname.gdb","user", "passw");
    		 Connection conn = DriverManager.getConnection("jdbc:firebirdsql:192.168.0.1:\\data\\Db\\dbname.gdb", "sysdba", "masterkey");
    		 
    		 Statement stmt = conn.createStatement();
    		 ResultSet rset = stmt.executeQuery("select * from SPR_TOV");
    		 while (rset.next())
    			System.out.println(rset.getString(2));
    	  } catch (Exception e) {
    		 e.printStackTrace();
    	  }
       }
    }
    Компилятор вначале ругаться изволил на несоответствие версии JDK - подложил ему версию Jaybird 2.1.6 for JDK 1.4 - схавал.

    Полученные данные мне теперь нужно каким-то образом использовать как справочник при заполнении полей на формах.
    Думаю надо создавать и синхронизировать "локальный" справочник (серверным агентом) и потом лукапить уже по нему.
    Потому как в Java я ноль полный, а времени на разбирательство особо никто и не дает - вопрос: как бы мне "уйти" от явы на лотусскрипт и обрабатывать как мне нужно полученный ResultSet?
     
  5. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    336
    при "уходе" будет потрачено ещё больше времени на грабли от ИБМ и иже с ними :)
    берите любой пример сканирования рекордов и получайте через LS2J строки
    либо получите все рекорды в массив строк и забирайте их в LS2J
    как пример:
    Код:
    import java.util.*;
     
    public class SortList {
       private ArrayList arrList = new ArrayList();
       public void add(String s) {
    	  arrList.add(s);
       }
       public String[] sort() {
    	  Collections.sort(arrList);
    	  String[] sorted = new String[arrList.size()];
    	  arrList.toArray(sorted);
    	  return sorted;
       }
    }
    Код:
    Option Public
    Option Declare
    Use "ErrorHandling"
    Uselsx "*lsxlc"
    Use "SortList"
    Const ERRBASE_SORT=1130
    Private Const ERRLS2JINIT=ERRBASE_SORT+1, CS_ERRLS2JINIT={ошибка инициализации класса Java}
     
    Class SortObj As ErrorHandlerWJ
       Private SortListObj As JavaObject
       Private SortListClass As JavaClass
       Private fCount As Integer
       
       Sub New()
    	  On Error Goto errorhandler
    	  Set SortListClass = jSession.GetClass("SortList")
    	  Set SortListObj = SortListClass.CreateObject
       ExitFunction:
    	  Exit Sub
       errorhandler:
    	  Call Me.RaiseError()
    	  Error ERRLS2JINIT, CS_ERRLS2JINIT
       End Sub
       
       Sub Delete()
    	  If Not SortListObj Is Nothing Then
    		 Delete SortListObj
    	  End If
       End Sub
       
       Sub Add(s As String)
    	  SortListObj.add(s)
       End Sub
       
       Function Sort() As Variant
    	  On Error Goto errorhandler
    	  Sort=SortListObj.sort()
       ExitFunction:
    	  Exit Function
       errorhandler:
    	  Call Me.RaiseError()
    	  Resume ExitFunction
       End Function
    End Class
    Код:
    Option Public
    Option Declare
    %INCLUDE "lserr.lss"
    'Uselsx "*lsxlc"
    Uselsx "*javacon"
    %INCLUDE "lsconst.lss"
     
    Class ErrorHandler
       Sub ClrError()
    	  '
       End Sub
       
       Sub New()
    	  Call Me.ClrError()
       End Sub
       
       Function GetModuleInfo() As String
    	  Dim thisType As String, modInfo As String
    	  thisType = Typename(Me)
    	  'Not a class, use the calling module instead
    	  If (thisType = "") Then thisType = Getthreadinfo(11)
    	  modInfo = thisType & "::" & Getthreadinfo(10) & ": "
    	  GetModuleInfo = modInfo
       End Function
       
       Function RaiseError() As String
    	  Dim es As String
    	  es = GetModuleInfo()
    	  If (Err = 0) Then
    		 es = es + "Manually raised an error"
    	  Else
    		 es = es + "Run time error: (" + Trim(Str(Err)) + ") " + Error$ + " at line: "+ Trim(Str(Erl))
    	  End If
    	  Print es
    	  Me.RaiseError = es
    	  Call Me.ClrError()
       End Function
    End Class
     
    Class ErrorHandlerWJ As ErrorHandler
       Private jSession As JavaSession
       Private jError As JavaError
       
       Sub New()
    	  On Error Goto errorhandler
    	  Set jSession = New JAVASESSION
       ExitFunction:
    	  Exit Sub
       errorhandler:
    	  Call ErrorHandler..RaiseError()
    	  Resume ExitFunction
       End Sub
       
       Function RaiseError() As String
    	  Set jError = jSession.getLastJavaError()
    	  Dim es As String
    	  If (jError.errorMsg = "") Then
    		 es = ErrorHandler..RaiseError()
    	  Else
    		 es = GetModuleInfo() + "Error at line " & Erl & ": " & jError.errorMsg
    		 Print es
    		 jSession.ClearJavaError
    	  End If
    	  RaiseError = es
       End Function
    End Class
     
  6. vital

    vital Больной Компом Детектед

    Репутация:
    0
    Регистрация:
    29 янв 2006
    Сообщения:
    2.431
    Симпатии:
    40
    Пост выше в кодебейз не плохо бы.. Эх, где морфеус..
     
  7. vincent_vega

    vincent_vega Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    2 апр 2005
    Сообщения:
    168
    Симпатии:
    1
    Если данных для справочника не много, то я бы действительно остановился на серверном агенте, который бы синхронизировал лотус базу с реляционной. Если же реляционная база очень большая, то можно и на лету выбирать нужные данные. Уходить от джавы не советую лучше с ней подружится пока агенты разрабатывать будете:) Она вам пригодится не только в лотусе.
     
  8. DNT

    DNT Постоялец форума
    Lotus team

    Репутация:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    590
    Симпатии:
    7
    Прошу помощи в следующем:

    почему не работает такой код:
    Код:
    Statement stmt = conn.createStatement ();
    ResultSet rset = stmt.executeQuery ("select * from SPR_TYPES_IN_OUT");
    Document doc = agentContext.getDocumentContext();
    String s = "";
    Vector stringMultiple = new Vector();
    while (rset.next ())
    {
    s = rset.getString (2);
    stringMultiple.addElement(s);
    }
    doc.replaceItemValue("data", stringMultiple);
    doc.save();
    но работает такой:
    Код:
    Statement stmt = conn.createStatement ();
    ResultSet rset = stmt.executeQuery ("select * from SPR_TYPES_IN_OUT");
    Document doc = agentContext.getDocumentContext();
    String s = "";
    Vector stringMultiple = new Vector();
    while (rset.next ())
    {
    s = rset.getString (2);
    stringMultiple.addElement(s);
    doc.replaceItemValue("data", stringMultiple);
    }
    doc.save();
    Отличие: doc.replaceItemValue("data", stringMultiple); - в первом случае вне цикла, во втором в цикле.
    Мне как-то первый вариант больше нравится, или я чегото непойму логики?
    Подскажите как правильно написать...
     
  9. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    336
    первый вариант правильный и в хэлпе он похожий - смотрите на ошибки в java консоле
    и ещё - не указано, что "не работает"
     
  10. DNT

    DNT Постоялец форума
    Lotus team

    Репутация:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    590
    Симпатии:
    7
    Не работает так: поле data в документе остается пустым, в java консоле нет ошибок.
    Есть предположение что слишком много строк я пытаюсь запихнуть в Vector... Есть какието ограничения? В хелпе не нашел.
    Если запустить тот-же код (первый) на другой ResultSet всего в ~50 записей - все отрабатывает как надо.
     
  11. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    336
    ограничение есть на память jvm (устанавливается в notes.ini) и на значение, кот. записываем в поле (32К с флагом саммари)
    потому - вероятно ваш случай второй
     
  12. DNT

    DNT Постоялец форума
    Lotus team

    Репутация:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    590
    Симпатии:
    7
    запуск этого агента пока запускаю только локально со своей машины. Так что врядли.
     
  13. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    336
    а причем здесь локально - если есть ограничение по размеру данных в поле и на документ, очивидно - они и срабатывают
     
  14. DNT

    DNT Постоялец форума
    Lotus team

    Репутация:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    590
    Симпатии:
    7
    Наверно ламерский вопрос, но не сочтите за труд:

    почему компилятор ругаица на строку: doc.recycle();

    JavaAgent.java:51:cannot resolve symbol
    symbol: variable doc
     
  15. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    336
    значит:
    - у doc нет такого метода
    - не определён doc
    - в слове есть русские буквы :rolleyes:

    причиной м.б. не импортированные библиотеки
    import lotus.domino.*;
    у Document из этих библ есть recycle();
     
  16. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    336
    в кодебай - это куда и кто могет?
     
  17. hosm

    hosm * so what *

    Репутация:
    0
    Регистрация:
    18 май 2009
    Сообщения:
    2.442
    Симпатии:
    8
    В КБ лотус могут писать ВСЕ. Есть правила постинга в КБ. Выбираем раздел и описываем туда готовые решения. Только раздел премодерируемый, и темы всем сразу не видно, модеры должны ее одобрить и открыть для всех. А сообщения к открытым темам видно сразу.
    Кое-кто даже додумывается туда вопросы писать, и не единожды.(
    Морфеюс работает, я тоже. Пока нет возможности уделять достаточно внимания пополнению КБ, уж простите(
     
  18. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    336
    а то часто про сортировку велики изобретают на LS и подключением COM :rolleyes:
    я вона, выше, в ходе кодирования, делал сортировку
     
  19. DNT

    DNT Постоялец форума
    Lotus team

    Репутация:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    590
    Симпатии:
    7
    Хелп ми плиз: после отладки созданного агента на локальной машинке была предпринята попытка запустить его на сервере по расписанию.
    Начались траблы :KillMe: :

    Подложил jar файл на сервер в каталог ...\jvm\lib\ext\, сервер передернули, теперь ругается иначе:

    На локалке работает, на сервере нет.
    java version "1.4.2" и на сервере и на клиенте.

    Помогите пож, а то совсем не знаю куда копать...
     
  20. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    336
    какой оракл и какой драйвер брали?
    но более склоняюсь к мысли - не находит драйвер, при инициализации класса jdbc
    поди пытались из БД юзать, а потом без исправления агента перенсли jar ?
     
Загрузка...

Поделиться этой страницей