29 octubre, 2013
Lotus Script. Acceso al iSeries desde Lotus Domino.
Otros de los conectores que suelo utilizar para explotar la base de datos de mi iSeries es la conexión del Lotus Domino. Esto nos permite crear agentes domino que generen o modifiquen documentos Notes a partir de los datos de nuestro iSeries.
El agente que podemos desarrollar puede ser en Lotus Script o en Java, pero en este post me centraré solo en Lotus Script.
La principal diferencia es que un Agente en Lotus Script que acceda a los datos del iSeries no puede ejecutarse con el mandato SBMDOMCMD como comentaba en este otro post, cosa que sí podemos hacer desde Java, por lo que solo podemos ejecutarlos desde un cliente Lotus. En otro post os explicaré como hacerlo en Java.
Desarrollar un agente que lea datos de nuestro iseries es muy sencillo.
Desarrollo en Lotus Script
En Primer Lugar, para la conexión usaremos el LSX for Lotus Connectors, por lo que debemos debemos definir el uso de la librería LSXLC de lotus Conector en la sección Options que es la que nos permite el acceso.
Uselsx «*lsxlc»
Definimos la conexión y las variables donde vamos a recibir los datos. Usamos la conexión a db2 que es la de nuestro iSeries.
Dim con As New LCConnection(«db2»)‘ conexión
Dim fldLst As New LCFieldList
Dim fld As LCField
Y abrimos la conexión a nuestra Base de Datos con nuestro usuario correspondiente
con.Database = «server»
con.UserId = «user»
con.Password = «password»
con.Connect
Una vez abierta la conexión procedemos a leer los datos de las tablas necesarias controlando que haya datos que leer y una vez terminado desconectamos.
sql = «SELECT * FROM csqvr.prvart»
If (con.Execute(sql,fldLst)=0) Then
Print «No se han leido registros»
Else
While (con.Fetch (fldLst) > 0)
Clave = Trim$(fldLst.parcod(0))
Wend
End If
con.disconnect
Como podéis ver , el acceso a los datos se hace mediante las variables fldLst tipo LCFieldList y la variable fld tipo LCField. La primera contiene la lista de todos los campos que se devuelven al ejecutar la sentencia SQL, por lo que, como veis en el ejemplo, referenciar a uno de esos campos no es más que una propiedad de esa clase fldLst.NombreCampo(0).
Bueno, esta es la manera fácil de acceder desde Lotus Script a DB2. En el próximo post os contaré como accedo desde agentes creados en Java.
Os dejo un ejemplo completo de código
Option Public
Option Explicit
Uselsx "*lsxlc"
Sub Initialize
Dim ss As New notessession
Dim bd As notesdatabase
Dim doc As notesdocument, nuevodoc As Notesdocument
Dim vista As notesview
Dim Leidos As Integer, Modif As Integer, Altas As Integer
Dim Clave As String, sql As String
Dim con As New LCConnection("db2")
Dim fldLst As New LCFieldList
Dim fld As LCField
On Error Goto msgerror
con.Database = "database"
con.UserId = "user"
con.Password = "password"
con.Connect
Set bd = ss.currentdatabase
Set vista = bd.getview("ImpLot")
sql = "SELECT * FROM csqvr.prvLot"
If (con.Execute(sql,fldLst)=0) Then
Set doc = New NotesDocument( bd ) ' Mando Mensaje nada leido
doc.Form = "Memo"
doc.SendTo = "Departamento Informatica"
doc.Subject = "Terminado Lotes. L- No Leido"
Call doc.Send( False )
Print "No se han leido registros"
Else
Leidos = 0
Modif=0
Altas=0
Print "Importando Lotes. Espere por favor ......"
While (con.Fetch (fldLst) > 0)
Leidos=Leidos+1
Clave = Trim$(fldLst.plolot(0)) & Trim$(fldLst.plocod(0))
Set doc = vista.getdocumentbykey(clave,True)
If Not doc Is Nothing Then ' si encuentra el documento, lo machaca
Doc.fLote_DesLot = Trim$(fldLst.plolde(0))
Doc.fLote_Descripcion = Trim$(fldLst.plodes(0))
Doc.fLote_Cantidad = fldLst.plocan(0)
Call doc.save(True,True) ' guardo el documento
Modif=Modif+1
Else ' si no lo encuentra lo doy de alta
Set nuevoDoc = bd.createdocument()
nuevoDoc.form = "fLotes"
nuevoDoc.fLote_CodigoL = Trim$(fldLst.plolot(0))
nuevoDoc.fLote_DesLot = Trim$(fldLst.plolde(0))
nuevoDoc.fLote_CodigoProd = Trim$(fldLst.plocod(0))
nuevoDoc.fLote_Descripcion = Trim$(fldLst.plodes(0))
nuevoDoc.fLote_Cantidad = fldLst.plocan(0)
Call nuevoDoc.save(True,True)
Altas=Altas+1
End If
Wend
End If
con.disconnect
Set doc = New NotesDocument( bd )
doc.Form = "Memo"
doc.SendTo = "Departamento Informatica"
doc.Subject = "Terminado Lotes. L- " & Leidos & " M- " & Modif & " A- " & Altas
Call doc.Send( False )
Exit Sub
msgerror:
Set doc = New NotesDocument( bd ) 'si encuentra error manda mensaje
doc.Form = "Memo"
doc.SendTo = "Departamento Informatica"
doc.Subject = "Terminado Lotes. ERRORES DETECTADOS"
doc.Body = Error$
Call doc.Send( False )
End Sub