Связка ODBC и LotusScript


Задача предельно проста, надо через ODBC выгрузить из LotusNotes некоторые данные (в качестве источника ODBC используется база MS Access у которой имена таблиц и полей написаны по русски и содержат пробелы).

Стандартные методы не заработали, по этому пришлось идти в обход.

Шаг 1: объявите библиотеку для работы с ODBC

UseLSX «*LSXODBC»

Шаг 2: объявите переменные

Dim con As ODBCConnection
Dim qry As ODBCQuery
Dim res As ODBCResultSet

Шаг 3: организация подключения к источнику ODBC

Set con = New ODBCConnection
Set qry = New ODBCQuery
Set res = New ODBCResultSet
Set qry.Connection = con
con.ConnectTo(«DNSNAME»,»user»,»password»)

Для Access используем без имени пользователя и пароля con.ConnectTo(«DNSNAME»)

Шаг 4: проверка и обработка ошибок

‘проверка на подключению к источнику
If Not con.IsConnected Then
Messagebox «Could not connect to DNSNAME»,, «Error»
Exit Sub
End If

Обработка ошибок

On Error Goto errorHandler
con.ConnectTo(«ATDB»)
qry.SQL = «SELECT * FROM STUDENTS»
result.Execute

errorHandler:
If con.GetError <> DBstsSUCCESS Then
Messagebox con.GetExtendedErrorMessage,, _
con.GetError & » » & con.GetErrorMessage
End If
If qry.GetError <> DBstsSUCCESS Then
Messagebox qry.GetExtendedErrorMessage,, _
qry.GetError & » » & qry.GetErrorMessage
End If
If result.GetError <> DBstsSUCCESS Then
Messagebox result.GetExtendedErrorMessage,, _
result.GetError & » » & result.GetErrorMessage
End If
Exit Sub

SQL код вставки строки:

countrec = countrec+1
Qry.SQL = «INSERT INTO [Имя таблицы] ([Код]) VALUES («+cstr(countrec)+»)»
Set Res.Query = Qry
Res.Execute

После того как вставили пустую строку с уникальным countrec приступаем к обновлению остальных полей в записи. Желательно вынести этот код в отдельную процедуру типа updaterec.
dim fileName$
fieldName = «[Поле]»
dim fieldValue$
fieldValue = «100» ‘число
fieldValue = «‘текст'» ‘текст
v = Evaluate({@text(@year(FDate))+»-«+@Right(«00″+@text(@month(FDate));2)+»-«+@Right(«00″+@text(@day(FDate));2)+» 00:00:00″},doc)
fieldValue = «‘»+v(0)+»‘» ‘дата и время yyyy-mm-dd hh:mm:ss
NumRec = 10 ‘уникальный ключ для позиционирования на нужной строке
Qry.SQL = «UPDATE [Имя таблицы] SET «+fieldName+» = «+fieldValue+» WHERE [Код]=»+CStr(countrec)
Set Res.Query = Qry
Res.Execute

Немного о буферах

Если возникли трудности с возвратом результатов командой SELECT, а именно в Lotus передаются не все строки, попробуйте изменить значения буфера на:

Res.MaxRows = DB_ALL
Res.CacheLimit = DB_ALL
Res.FetchBatchSize = DB_ALL

Закрытие подключения

Call Res.Close(DB_CLOSE)
Call con.Disconnect