Accesso Integro a BBDD LOTUS

Iniciado por W0lFy, 11 Marzo 2010, 14:16 PM

0 Miembros y 1 Visitante están viendo este tema.

W0lFy

Buenas Gente, como podría acceder a una base de datos LOTUS y modificarla desde cualquier lenguaje de programación? Por ejemplo yo suelo programar en VB pero no me importa si me lo dais en otro lenguaje, he encontrado varias cosas pero son solo para hacer vistas a la bbdd no modificables. de momento he visto estas 2 maneras:

connstr = "Driver={Lotus NotesSQL driver (*.nsf)};"
connstr = connstr & "Database=names.nsf;Server="Server;"
connstr = connstr & "Uid=Usuario;" & "Pwd=password"

he podido ver los campos de 1 vista mediante un recordset, el problema es que no lo puedo modificar, existe alguna manera que no sea desde el propio lotus? Un saludo y gracias!
K@NuT0

^Tifa^

Desconozco la funcionalidad de LOTUS como DB pero... suponiendo que respeta los estandares Ansi SQL establecidos.  Haces referencia a que son vistas y no tablas, ahora aunque supieses la sintaxis y funciones existentes en el API o ODBC que Visual Basic para acceder y trabajar con LOTUS, si tu usuario no tiene permisos de escritura sobre dicha vista, no importa que conozcas las funciones de dicha API para modificar, borrar, actualizar registros existentes.

De lo contrario, si sabes que tienes permisos de escritura sobre dicha vista, no te queda de otra que leerte un tuto de como funciona la API o ODBC en Visual Basic para conectarse a LOTUS.

Se que lo que buscas en un ejemplo mas amplio o tutorial de las funciones dentro de VB con LOTUS notes para insertar, borrar, actualizar, etc registros no?

Kasi

Buenas, la diferencia de conectar a lotus es que no es una BD Relacional como puede ser SQL Server, oracle o Mysql...etc.
Alli solo existen "documentos" y no rows de tablas.

Supongamos que un documento = row de una tabla , con lo cual deberias o bien acceder mediante una vista tomando los documentos uno a uno y procesandolos o bien haciendo un search y obteniendo los documentos sin usar vistas.

Un ejemplo facil(aunque no se si será aplicable a tu caso)
Código (vb) [Seleccionar]


dim s as new NotesSession
dim db as NotesDatabase
dim v as NotesView
dim doc as NotesDocument

set db = s.CurrentDatabase
set v = db.GetView("nombredelavista")

set doc = v.getFirstDocument()
while not doc is nothing

'Aqui tendriamos el documento que estamos sacando de la vista para hacer lo que queramos con el
'

set doc = v.GetNextDocument(doc)
wend



Respecto a lo que dice Tifa, no necesitas tener permisos para escribir en la vista, lo que necesitas es permiso para escribir en los documentos.
Si pones un ejemplo de código completo quiza pueda echarte una mano (trabajo con Lotus Notes, aunque siempre desde el cliente o desde Domino), pero la sintaxis y las funciones serán las mismas supongo.

Un saludo

W0lFy

#3
bueno entonces al fin y al cabo es lo mismo si trabajamos con documentos, digamos que en el diseño del lotus me he creado una vista que se llama ListadoUsuarios, es una vista donde sale el nombre  la contraseña y todo relacionado con los usuarios, ahora me gustaria por ejemplo cambiar el nombre del usuario o la contraseña o cualquier campo, jeje esto es por necesidad necesito cambiarle la contraseña a todos los usuarios mediante una mascara por ejemplo 111aa423 que sea todo aleatorio,
entonces digamos que he puesto esto

Código (vb) [Seleccionar]
dim s as new NotesSession
dim db as NotesDatabase
dim v as NotesView
dim doc as NotesDocument
Dim subj As Variant

set db = s.GetDatabase("Server", "names.nsf")
set v = db.GetView("ListadoUsuarios")

set doc = v.getFirstDocument()
while not doc is nothing

'aqui tendria que realizar la modificación de el/los campos de la vista que quiero
subj = doc.GetItemValue("LastName")
MsgBox subj(0)
Set doc = v.GetNextDocument(doc)
wend


Cual es la sintaxis para acceder directamente al campo por ejemplo LastName de la vista ListadoUsuarios? Un saludo y gracias a los 2 me ha servido mucho vuestra ayuda
K@NuT0

Kasi

Buenas, para acceder al campo tienes varias opciones, una es "a lo bruto", que viene siendo mas o menos asi:
Código (vb) [Seleccionar]

doc.NombreCampo = Valor ' Esto seria para asignar valores

'Para leer el valor del campo sería:
Msgbox doc.NombreCampo(0)
'Teniendo en cuenta que si el mismo campo tiene varios valores, el 0 seria para el primero, 1 para el segundo valor, y asi sucesivamente.


Luego la manera correcta sería:
Código (vb) [Seleccionar]

dim item as NotesItem
set item = doc.GetFirstItem("nombre del campo")
item.Values = Valor '  O valores, puede ser un array tambien
'o bien
item.AppendToTextList("nuevo valor") ' Esto te añade un nuevo valor al campo conservando el antiguo


Espero que te sirva, un saludo  ;)

W0lFy

#5
Gracias Kasi, tengo otra duda, tengo un campo que es HTTPPasword y usa un tipo de encriptacion, como puedo averiguar este tipo de encriptacion? necesito saberlo para poder realizar la aplicacion de VB el fin de essta aplicación es cambiar el password a todos los usuarios al a vez. te comento:

yo cuando entro en 1 usuario, me sale el formulario de la persona a editar.
despues introduces todos los datos para la aplicación web y uno de ellos es el HTTPPasword, pero cuando lo intruduzco y guardo el documento, la clave se cambia, no encuentro ninguna similitud de contraseñas para poder sacar la formula de cifrado. por ejemplo te doy una lista de passwords que he probado:

a:(420965F2DA150B44CBFADD695AB5BBE9)
b:(355EF2217E5693DFACA55CA86AB93B35)
c:(2EE502C509FD9B1DDD624C0C948B2D42)
d:(8E93A29BE8FB2D528FD3E06422AC2B25)
ab:(A271DD471E3AF870120B21F6DE2817A8)

como puedo sacar esta formula? Un saludo y gracias!
K@NuT0

Kasi

Buenas, por defecto lotus notes tiene un tipo de cifrado propia(de un solo sentido, asi que una vez cifrado no es reversible, igual que md5).
Esa cifrado la puedes usar con un comando de Formula ( @Password("cadena a cifrar") te devuelve la string cifrada con el algoritmo).

En principio con HTTPassword te va a pasar siempre eso , asi que no se si es posible hacerlo de la manera que tenias pensado, como alternativa te podrias crear otro campo donde guardes el password sin cifrar si es lo que estás buscando realmente, aunque no se si es eso exactamente lo que estás buscando, intenta poner un ejemplo mas claro a ver si puedo ayudarte mejor.


Un saludo

W0lFy

#7
Existe alguna manera desde VB de llamar al comando de lotus para que encripte la password? m... no se si me explico, grabar los datos en el documento y luego procesar el campo HTTPPasword para que lo encripte, es posible? Un saludo y muchas gracias!!

**MODIFICADO***

Bueno ya he conseguido lo que queria, cambiando el campo y aplicando otro comando que es:
Call doc.ComputeWithForm(False, True)
 Call doc.Save(True, False)
ahora tengo otro problema, intento a acceder a otro servidor distinto y me saca el siguiente mensaje

Código (vb) [Seleccionar]
s2.Initialize
Set dB2 = s2.GetDatabase("server2", "names.nsf") -> linea que falla
Set v2 = dB2.GetView("ListadoUsuarios")



Error '-2147217233(80041af)' en tiempo de ejecucion:
Password or other security violation for database server2!!names.nsf

que ocurre Aqui? los IDs son distintos para cada servidor, es posible que me este cojiendo el del primer servidor o algo, no entiendo podríais ayudarme?
he comprobado que s2 es igual a lo que era s1!! y no puede ser igual porque el usuario no es el mismo, aunque la contraseña si es igual es como si intentara acceder con el mismo usuario a otra base de datos alojada en otro servidor sin permisos...como podría cambiar s2?Un saludo
GRACIAS!!!
K@NuT0

Kasi

Buenas, el mismo usuario tiene acceso a ambos servidores? La ID del usuario sirve para los dos? En la ACL de ambos servidores figura el usuario para poder acceder?

En principio creo que el problema reside en el acceso al servidor s2, intenta conectar al dos mediante una ID especifica creada para ese server a ver si puedes acceder a el con alguna usuario. Y luego intenta que sea válida para todos tus servidores, creo que el problema es de permisos.

Un saludo ;)

W0lFy

#9
Citar
Buenas, el mismo usuario tiene acceso a ambos servidores?

bueno me explico mejor para que me entiendas:

tengo 2 servidores:

1: srvlotus/ser
2: srvdoc/doc

tengo configurado en el notes los LOCATIONS para que acceda a cada uno segun el que ponga, por ejemplo:

Enter your Password: *****
For User: ( en este desplegable existen 2 usuarios)
(Administrador Lotus/doc | Administrador Lotus/Ser| other)
At Location: :(en este desplegable existen 2 valores)
(BIZ|GES)


Entonces segun lo que introduzca en el formulario de ADMIN NOTES entra con un usuario o con otro en su respectivo servidor y con su respectivo ID, esto lo tengo señalado en la parte del LOTUS NOTES donde pone Address Book/Advanced/Locations
aqui estan los dos Locations donde vienen los datos que corresponde a cada location que es el servidor al que apunta, su Id correspondiente y su usuario.


el problema es que en el codigo de Visual basic si hago debug encuentro que a veces en la variable S2 tenemos lo siguiente:
"CN=Administrador Lotus/O=ser"

y otras veces:

"CN=Administrador Lotus/O=doc"

he notado que segun estoy trabajando con notes y accedo a un servidor u otro es cuando se cambia este valor, entonces, en VB funciona mi codigo solo para el servidor al que apunte, los dos funcionan bien pero si tienen respectivamente su servidor correcto con su usuario.
Existe alguna manera de decirle al Objeto NotesSession que se inicializa con un usuario determinado? por que intento modificar S2.EffectiveUser ( por ejemplo) y me dice que es una propiedad de solo lectura.

Como bien he dicho el codigo funciona respectivamente del servidor al que apunte S2, si pudieras como decirme como modificar S2 antes o despues de inicializar(s2.Initialize) para que coja un usuario u otro tendriamos el problema resuelto. es realmente lo que hace Notes antes de entrar a los servidores cuando te pide la contraseña. Espero haberme explicado bien ahora. Un saludo y Gracias

K@NuT0