Lotus Notes y DECS
Necesito conectar el servidor Domino (6.51) con bases de datos externas (Ms access vía ODBC). Para ello estoy tratando de usar DECS, pero aunque sigo el manuala, algo falla y no sé qué estoy haciendo mal. Si sabes sobre conexión con bases de datos externas
1 Respuesta
Respuesta de e6967712
1
1
e6967712, Hola, soy Raúl Peláez
Cierto, por eso usamos un agente ejecutado en servidor que realice la consulta.
Ej:
Dim con As ODBCConnection
Dim qry As ODBCQuery
Dim result As ODBCResultSet
Set con = New ODBCConnection
Set qry = New ODBCQuery
Set result = New ODBCResultSet
Set qry.Connection = con
Set result.Query = qry
'Inicializa las variables de error
cod_error="r00"
lit_error="Consulta realizada con éxito."
con.SilentMode=True
If Not con.ConnectTo( OrigenDatos, Usuario, Password ) Then
cod_error="c"+Cstr( con.Geterror )
lit_error=Cstr( con.GetExtendedErrorMessage )+" ERROR 1."
Print lit_error
Exit Sub
Else
'Conpone la sentencia SQL
qry.SQL = |select CAST( estructura AS VARCHAR(128)), CAST( t.[name] AS VARCHAR(128)), CAST( c.termid AS VARCHAR(128)) from term t, cargo c where t.termid = c.termid order by t.[name]|
result.FirstRow
If Not result.Execute Then
cod_error="q"+Cstr( con.Geterror )
lit_error=Cstr( con.GetExtendedErrorMessage )+qry.SQL+" ERROR 2."
Print lit_error
Exit Sub
End If
'Realiza la introducción de datos
'i_dt=0
'i_dr=0
'i_zona=0
i=0
Do
result.NextRow
aux=result.GetValue(1)
If Cstr(aux)="False" And i_dt=0 Then
cod_error="r11"
lit_error="No existen valores para los criterios de búsqueda especificados. (Listado Cargos)"
Exit Sub
End If
aux_result=result.GetValue(2)
If aux_result <> "- - - - - - - -" And aux_result <> "A definir" _
And aux_result <> "Lector" Then
Redim Preserve lista(i)
lista(i)=aux_result+" ("+result.GetValue(3)+")"
i=i+1
End If
' Select Case result.GetValue(1)
' Case "DT", "SS.CC."
' Redim Preserve lista_dt(i_dt)
' lista_dt(i_dt)=result.GetValue(2)+" ("+result.GetValue(3)+")"
' i_dt=i_dt+1
' Case "DR"
' Redim Preserve lista_dr(i_dr)
' lista_dr(i_dr)=result.GetValue(2)+" ("+result.GetValue(3)+")"
' i_dr=i_dr+1
' Case "Zona"
' Redim Preserve lista_zona(i_zona)
' lista_zona(i_zona)=result.GetValue(2)+" ("+result.GetValue(3)+")"
' i_zona=i_zona+1
' End Select
Loop Until result.IsEndOfData
'Cierra base de datos y conexión
result.Close(DB_CLOSE)
con.Disconnect
End If
Llamado por un agente
Sub ObtenerListaCargosPorEstructura ( clave_eo As String, nivel As String, doc_aux As NotesDocument, codigo_con_unidad As String , dt, dr,zona, area)
Dim s As New NotesSession
Dim db As NotesDatabase
Dim DocCom As NotesDocument, doc_config As NotesDocument, DocResp As NotesDocument
Dim col As NotesDocumentCollection
Dim vista As notesview
Dim docEstructura As notesdocument
Dim listaCargos() As String
Dim contador As Integer
Dim pos As Integer
Dim codigoCargo As Integer
Dim listaCodigos List As String
Dim item As notesitem
contador=0
Set db = s.CurrentDatabase
Set doc_config=ObtenerDocConfig
Set vista=db.getview("(Estructura organizativa por codigo)")
Set docEstructura=vista.GetDocumentByKey(codigo_con_unidad, True)
If docEstructura Is Nothing Then
Set DocCom=db.CreateDocument
Set Item = New NotesItem( DocCom, "Autores", "*", AUTHORS )
Call DocCom.save(True, True)
Call DocCom.replaceItemValue("Clave",DocCom.Noteid)
Call DocCom.replaceItemValue("Form","F.Comunicacion")
Call DocCom.replaceItemValue("clave_eo", clave_eo )
Call DocCom.replaceItemValue("nivel", nivel )
Call DocCom.replaceItemValue("dt", dt )
Call DocCom.replaceItemValue("dr", dr )
Call DocCom.replaceItemValue("zona", zona )
Call DocCom.replaceItemValue("area", area )
Call DocCom.save(True, True)
'Ejecuta el agente en el servidor
If EjecutarAgenteServidor(db, DocCom, "(ARGOS obtener cargos por estructura)") Then
clave = "F.Respuesta" + DocCom.Noteid
If EsperarRespuesta(Cstr(clave), DocCom, DocResp) Then
If DocResp.cod_error(0)="r00" Or DocResp.cod_error(0)="" Then
Set vista=db.GetView("(Responsables unidad)")
Set docEstructura=vista.GetDocumentByKey(nivel)
If Not docEstructura Is Nothing Then
Forall cod_cargo In docEstructura.codigos_cargos
listaCodigos(cod_cargo)=""
End Forall
End If
' Quitamos codigos
Forall cargo In DocResp.lista
pos=Instr(cargo, "-")
Redim Preserve listaCargos(contador)
If Isnumeric(Trim(Left(cargo, pos-1))) Then
listaCargos(contador)=Trim(Right(cargo, Len(cargo)-pos))
Else
listaCargos(contador)= cargo
End If
contador=contador+1
End Forall
Call doc_aux.ReplaceItemValue( "lista_cargos", listaCargos )
'Call doc_aux.ReplaceItemValue( "lista_cargos", DocResp.lista )
' lista=DocResp.lista
End If
End If
End If
Else
Call doc_aux.ReplaceItemValue( "lista_cargos", docEstructura.resp_unidad(0) )
End If
End Sub
Ej:
Dim con As ODBCConnection
Dim qry As ODBCQuery
Dim result As ODBCResultSet
Set con = New ODBCConnection
Set qry = New ODBCQuery
Set result = New ODBCResultSet
Set qry.Connection = con
Set result.Query = qry
'Inicializa las variables de error
cod_error="r00"
lit_error="Consulta realizada con éxito."
con.SilentMode=True
If Not con.ConnectTo( OrigenDatos, Usuario, Password ) Then
cod_error="c"+Cstr( con.Geterror )
lit_error=Cstr( con.GetExtendedErrorMessage )+" ERROR 1."
Print lit_error
Exit Sub
Else
'Conpone la sentencia SQL
qry.SQL = |select CAST( estructura AS VARCHAR(128)), CAST( t.[name] AS VARCHAR(128)), CAST( c.termid AS VARCHAR(128)) from term t, cargo c where t.termid = c.termid order by t.[name]|
result.FirstRow
If Not result.Execute Then
cod_error="q"+Cstr( con.Geterror )
lit_error=Cstr( con.GetExtendedErrorMessage )+qry.SQL+" ERROR 2."
Print lit_error
Exit Sub
End If
'Realiza la introducción de datos
'i_dt=0
'i_dr=0
'i_zona=0
i=0
Do
result.NextRow
aux=result.GetValue(1)
If Cstr(aux)="False" And i_dt=0 Then
cod_error="r11"
lit_error="No existen valores para los criterios de búsqueda especificados. (Listado Cargos)"
Exit Sub
End If
aux_result=result.GetValue(2)
If aux_result <> "- - - - - - - -" And aux_result <> "A definir" _
And aux_result <> "Lector" Then
Redim Preserve lista(i)
lista(i)=aux_result+" ("+result.GetValue(3)+")"
i=i+1
End If
' Select Case result.GetValue(1)
' Case "DT", "SS.CC."
' Redim Preserve lista_dt(i_dt)
' lista_dt(i_dt)=result.GetValue(2)+" ("+result.GetValue(3)+")"
' i_dt=i_dt+1
' Case "DR"
' Redim Preserve lista_dr(i_dr)
' lista_dr(i_dr)=result.GetValue(2)+" ("+result.GetValue(3)+")"
' i_dr=i_dr+1
' Case "Zona"
' Redim Preserve lista_zona(i_zona)
' lista_zona(i_zona)=result.GetValue(2)+" ("+result.GetValue(3)+")"
' i_zona=i_zona+1
' End Select
Loop Until result.IsEndOfData
'Cierra base de datos y conexión
result.Close(DB_CLOSE)
con.Disconnect
End If
Llamado por un agente
Sub ObtenerListaCargosPorEstructura ( clave_eo As String, nivel As String, doc_aux As NotesDocument, codigo_con_unidad As String , dt, dr,zona, area)
Dim s As New NotesSession
Dim db As NotesDatabase
Dim DocCom As NotesDocument, doc_config As NotesDocument, DocResp As NotesDocument
Dim col As NotesDocumentCollection
Dim vista As notesview
Dim docEstructura As notesdocument
Dim listaCargos() As String
Dim contador As Integer
Dim pos As Integer
Dim codigoCargo As Integer
Dim listaCodigos List As String
Dim item As notesitem
contador=0
Set db = s.CurrentDatabase
Set doc_config=ObtenerDocConfig
Set vista=db.getview("(Estructura organizativa por codigo)")
Set docEstructura=vista.GetDocumentByKey(codigo_con_unidad, True)
If docEstructura Is Nothing Then
Set DocCom=db.CreateDocument
Set Item = New NotesItem( DocCom, "Autores", "*", AUTHORS )
Call DocCom.save(True, True)
Call DocCom.replaceItemValue("Clave",DocCom.Noteid)
Call DocCom.replaceItemValue("Form","F.Comunicacion")
Call DocCom.replaceItemValue("clave_eo", clave_eo )
Call DocCom.replaceItemValue("nivel", nivel )
Call DocCom.replaceItemValue("dt", dt )
Call DocCom.replaceItemValue("dr", dr )
Call DocCom.replaceItemValue("zona", zona )
Call DocCom.replaceItemValue("area", area )
Call DocCom.save(True, True)
'Ejecuta el agente en el servidor
If EjecutarAgenteServidor(db, DocCom, "(ARGOS obtener cargos por estructura)") Then
clave = "F.Respuesta" + DocCom.Noteid
If EsperarRespuesta(Cstr(clave), DocCom, DocResp) Then
If DocResp.cod_error(0)="r00" Or DocResp.cod_error(0)="" Then
Set vista=db.GetView("(Responsables unidad)")
Set docEstructura=vista.GetDocumentByKey(nivel)
If Not docEstructura Is Nothing Then
Forall cod_cargo In docEstructura.codigos_cargos
listaCodigos(cod_cargo)=""
End Forall
End If
' Quitamos codigos
Forall cargo In DocResp.lista
pos=Instr(cargo, "-")
Redim Preserve listaCargos(contador)
If Isnumeric(Trim(Left(cargo, pos-1))) Then
listaCargos(contador)=Trim(Right(cargo, Len(cargo)-pos))
Else
listaCargos(contador)= cargo
End If
contador=contador+1
End Forall
Call doc_aux.ReplaceItemValue( "lista_cargos", listaCargos )
'Call doc_aux.ReplaceItemValue( "lista_cargos", DocResp.lista )
' lista=DocResp.lista
End If
End If
End If
Else
Call doc_aux.ReplaceItemValue( "lista_cargos", docEstructura.resp_unidad(0) )
End If
End Sub
Será más fácil si te explico mis necesidades:
- Tengo un formulario con un campo combobox (Usuario). Este hace una consulta a una tabla externa para mostrar las opciones.
- Además tengo un campo de texto (NoSerie) que se actualiza haciendo una búsqueda en una tabla externa, cada vez que cambio el valor de otro campo (Id).
- Tengo un formulario con un campo combobox (Usuario). Este hace una consulta a una tabla externa para mostrar las opciones.
- Además tengo un campo de texto (NoSerie) que se actualiza haciendo una búsqueda en una tabla externa, cada vez que cambio el valor de otro campo (Id).
Al principio usé @DbColumn y @DbLookup para conectar con ODBC en campos combobox o campos calculados. Lo probaba en el servidor y funcionaba. Pero al probarlo en un PC cliente descubrí que trataba de usar el ODBC del cliente, no del servidor. Y es que no puedo configurar el ODBC de cada usuario.
En nuestra web uso ASP, donde las consultas ODBC las hace el servidor. Pensaba que aquí funcionaría igual, pero se ve que no. ¿O me equivoco?
En nuestra web uso ASP, donde las consultas ODBC las hace el servidor. Pensaba que aquí funcionaría igual, pero se ve que no. ¿O me equivoco?
Eso tiene una pinta estupenda. Lástima que yo sea tan mala en programación... He tratado de adaptar tu código para mi agente, pero no entiendo de dónde sacas la mitad de las cosas.
Todo ese código, ¿es el agente? ¿Cómo envías los parámetros del documento al agente?
(Entenderé que me mandes a paseo)
Todo ese código, ¿es el agente? ¿Cómo envías los parámetros del documento al agente?
(Entenderé que me mandes a paseo)
No uses DECS, da demasiados problemas. Intenta crearte un ODBC de sistema en el PC Donde tengas el servidor.
Crea un agente que se ejecute en el servidor ( usando la propiedad RunOnServer, pasando el NoteID de un documento donde lleve los parámetros). Luego haz que al realizar la consulta ODBC genere un documento en la BD.
Create un bucle que espere a que se genere el documento de respuesta con los resultados del servidor y recoge los resultados. A continuación elimínalo.
Lo usamos mucho en el curro para conectar a SAP o a SQL Server.
Un ejemplo de conexión ODBC en LotusScript:
Para hacer consultas SQL te pongo otro ejemplo.
Uselsx "*LSXODBC"
Sub Initialize
Dim con As New ODBCConnection
Dim qry As New ODBCQuery
Dim result As New ODBCResultSet
Dim firstName As String
Dim lastName As String
Dim msg As String
Set qry.Connection = con
Set result.Query = qry
con.ConnectTo("ATDB")
qry.SQL = "SELECT * FROM STUDENTS"
result.Execute
msg = "Student names:" & Chr(10)
If result.IsResultSetAvailable Then
Do
result.NextRow
firstName = result.GetValue("FIRSTNAME", _
firstName)
lastName = result.GetValue("LASTNAME", _
lastName)
msg = msg & Chr(10) & firstName & " " & _
lastName
Loop Until result.IsEndOfData
Messagebox msg,, "Student Names"
result.Close(DB_CLOSE)
Else
Messagebox "Cannot get result set for STUDENTS"
Exit Sub
End If
con.Disconnect
End Sub
Acuérdate que también puedes usar @DBCommand @DbColumn y @DbLookup para conectar a ODBC pero eso si, a nivel local ( Todos los PCs clientes necesitaran tener configurado el ODBC de sistema).
Crea un agente que se ejecute en el servidor ( usando la propiedad RunOnServer, pasando el NoteID de un documento donde lleve los parámetros). Luego haz que al realizar la consulta ODBC genere un documento en la BD.
Create un bucle que espere a que se genere el documento de respuesta con los resultados del servidor y recoge los resultados. A continuación elimínalo.
Lo usamos mucho en el curro para conectar a SAP o a SQL Server.
Un ejemplo de conexión ODBC en LotusScript:
Para hacer consultas SQL te pongo otro ejemplo.
Uselsx "*LSXODBC"
Sub Initialize
Dim con As New ODBCConnection
Dim qry As New ODBCQuery
Dim result As New ODBCResultSet
Dim firstName As String
Dim lastName As String
Dim msg As String
Set qry.Connection = con
Set result.Query = qry
con.ConnectTo("ATDB")
qry.SQL = "SELECT * FROM STUDENTS"
result.Execute
msg = "Student names:" & Chr(10)
If result.IsResultSetAvailable Then
Do
result.NextRow
firstName = result.GetValue("FIRSTNAME", _
firstName)
lastName = result.GetValue("LASTNAME", _
lastName)
msg = msg & Chr(10) & firstName & " " & _
lastName
Loop Until result.IsEndOfData
Messagebox msg,, "Student Names"
result.Close(DB_CLOSE)
Else
Messagebox "Cannot get result set for STUDENTS"
Exit Sub
End If
con.Disconnect
End Sub
Acuérdate que también puedes usar @DBCommand @DbColumn y @DbLookup para conectar a ODBC pero eso si, a nivel local ( Todos los PCs clientes necesitaran tener configurado el ODBC de sistema).
- Compartir respuesta
- Anónimo
ahora mismo