Lotus и Firebird (jdbc)

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

  1. DNT

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

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

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

    vincent_vega Lotus team
    Lotus team

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

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

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

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

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

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    vincent_vega спасибо, с подключением разобрался.
    Код (Java):
    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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    при "уходе" будет потрачено ещё больше времени на грабли от ИБМ и иже с ними :)
    берите любой пример сканирования рекордов и получайте через LS2J строки
    либо получите все рекорды в массив строк и забирайте их в LS2J
    как пример:
    Код (Java):
    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;
       }
    }
    Код (LotusScript):
    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
    Код (LotusScript):
    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 Больной Компом Детектед
    Команда форума Web Team

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

    vincent_vega Lotus team
    Lotus team

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

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

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

    почему не работает такой код:
    Код (Java):
    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();
    но работает такой:
    Код (Java):
    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

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

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

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

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

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

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

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

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

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

    hosm * so what *

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

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

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

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

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

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

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

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