Procedimientos Almacenados en Access y Vb2005
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Bien, sé que el título no es el mas adecuado para este artículo, porque como todos sabemos MS Access, no soporta los Procedimientos Almacenados como SQL Server, pero podemos hacer algunas "cositas parecidas", claro que bastante limitadas, como puede ser el caso de agregar, actualizar, eliminar y consultar registros en las tablas. Sé que muchos dirán que en estos tiempos podemos usar SQL Express, pero hay quienes aún prefieren usar MS Access y sus motivos deben tener.
Ahora, si estamos haciendo una aplicación en capas, pues verán que si lo hacemos como les mostraré, no encontrarán mucha diferencia ni demasiado trabajo al momento de pasarse a un motor como SQL Server, pues trataremos en lo posible que la codificación sea casi idéntica como si estuviéramos usando SQL Server, y de esta manera, al cambiar de motor, solamente cambiaríamos en nuestra capa de acceso a datos la cadena de conexión y un par de líneas mas y no soplarnos toda la codificación como normalmente sería usando access.
Bueno para no aburrirlos mas acá va un par de pantallazos de la "aplicación" de ejemplo, debo aclarles que no soy un experto en estas materia, así que espero encuentre de su agrado lo que voy a compartir con todos ustedes y espero sus críticas constructivas que siempre son bienvenidas y bueno, las destructivas también. jejejeje.
Este el formulario bastante sencillo solamente para efectos de prueba de inserción y consultar datos por motivos de tiempo, la idea es ver los procedimientos y no el formulario.
El código del Botón Aceptar que es donde inserto los registros
Private Sub BtnAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAceptar.Click
If MessageBox.Show("¿Seguro de Grabar los Datos ?", "Responda", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
Try
Dim Cone As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Pruebas\Pruebas.mdb;Persist security info=false")
Dim Comando As New OleDbCommand
With Comando
Cone.Open()
.CommandText = "PA_Agrega_Clientes"
.CommandType = CommandType.StoredProcedure
.Connection = Cone
.Parameters.Add("@Codigo", OleDbType.Char, 10).Value = Me.TxtCodigo.Text
.Parameters.Add("@Nombre", OleDbType.VarChar, 50).Value = Me.TxtNombre.Text
.Parameters.Add("@Direccion", OleDbType.VarChar, 50).Value = Me.TxtDireccion.Text
End With
Dim Bien As Integer = Comando.ExecuteNonQuery
If Bien = 0 Then
Throw New Exception("Falló la operacion de inserción")
End If
Comando.Dispose()
Cone.Close()
Cone.Dispose()
MessageBox.Show("Datos Ingresados con éxito", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show(ex.Message, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Else
MessageBox.Show("Operacion cancelada por el usuario", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End If
End Sub
Alli está el código bastante sencillo con eso estamos insertando los registros (3) de lo cual solo quería comentarles este par de lineas:
.CommandText = "PA_Agrega_Clientes"
.CommandType = CommandType.StoredProcedure
el "PA_Agrega_Cliente", como se podrán dar cuenta vendría a ser el nombre de nuestro procedimiento almacenado, y el CommandType=CommandType.StoreProcedure, lo estoy dejando como si realmente se tratara de un procedimiento almacenado y no como CommandText que es lo normal que hacemos en access, y después los parámetros lo pasamos tan igual que como si fuera en SQL Server.
Ahora en la Base de datos (Access) tengo estos 4 Procedimientos, que no son otra cosa que consultas de accion, de las cuales tambien les haré ver el código que contiene.
Estos son mis "Procedimientos" con los cuales estoy trabajando, ahora el código no es nada extraño como verán en la siguiente imagen.
Eso es todo, solo falta el código de como devuelvo los datos al Datagridview (Botón buscar)
Private Sub BtnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnBuscar.Click
Try
Dim Cone As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Pruebas\Pruebas.mdb;Persist security info=false")
Dim DBComando As New OleDbCommand
Cone.Open()
If Me.TxtCodigo.Text <> "" Then
With DBComando
.CommandText = "PA_BuscarCliente_X_Codigo"
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@Codigo", OleDbType.VarChar, 10).Value = Me.TxtCodigo.Text
.Connection = Cone
End With
ElseIf Me.TxtNombre.Text <> "" Then
With DBComando
.CommandText = "PA_BuscarCliente_X_Nombre"
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@Nombre", OleDbType.VarChar, 50).Value = Me.TxtNombre.Text
.Connection = Cone
End With
End If
Dim Adaptador As New OleDbDataAdapter(DBComando)
Dim oCliente As New Cliente.ClientesDataTable
Adaptador.Fill(oCliente)
Cone.Dispose()
Me.DtgLista.DataSource = oCliente
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
End Sub
Ese es el resultado de ejecutar el botón buscar, si se fijan estoy usando un esquema (XSD) de la tabla clientes que usé para el ejemplo y con eso es súper fácil como dije al principio si están haciendo su aplicación en capas no tendrán casi nada de trabajo al cambiar a un motor como SQL Server.
Espero les sirva de algo y las disculpas del caso por si encuentran algo de malo, mi excusa será el tiempo, jajajajaja.
Saludos
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Comentarios
genial doctor!
ResponderEliminarvoy a usarlo ahora... saludos!!!
Hola Richard Karl
ResponderEliminarEspero te sirva de algo en tus tareas cotidianas y gracias por visitar el blog
Saludos cordiales
Muchas gracias, excelente este articulo, ya que las herramientas caser te mapean la base de datos en access y te generan todos estos procedimientos almacenados, lo importante era aprender a llamarlos de VB.NET 2005.
ResponderEliminarMuy agradecido nuevamente.
Gracias a tí pipevilla2 por visitar el blog y espero que te haya servido
ResponderEliminarestimado wilfredo se que tu eres master para esto y quizas te paresca demasiado sencillo pero yo estoy apenas aprendiendo y aveces no entiendo, mira las consultas las hago en la base de datos(Acces) o en el vs, te agradecere mucho si me respondes a este comentario.
ResponderEliminarDaniel Palacios
dpalacios_22@yahoo.es
Hola Daniel Palacios
ResponderEliminarPrimero gracias por visitar el blog y me alegra que te ayude en tu proceso de aprendizaje.
Bueno primero decirte que las consultas las construyas en la base de datos (access) tienes un asistente que te puede ayudar a construir tus consultas básicas o tambien puedes usar la ventana de código SQL en la cual puedes hacerlo directamente usando codigo.
Cualquier consulta al respecto no dudes en escribirme.
Saludos cordiales
estimado wilfredo gracias por tu ayuda, pero el codigo me produce un error que no entiendo ni papa te lo escribo a continuacion:
ResponderEliminarformat of the initialization string does not conform to specification starting at index 0,esto despues de que me pregunta si desea guardar los datos, te ruego tu ayuda, gtracias
Daniel Palacios
dpalacios_22@yahoo.es
Hola Daniel Palacios
ResponderEliminarSolo asegúrate que antes de tu clase de acceso a datos, deberías estar usando el siguiente namespace System.Data.OleDB, de esta manera:
Imports System.Data.OleDB
Eso debe estar como primera linea en tu capa de acceso a datos.
Cualquier otra duda solo consultas, espero te ayude, luego me cuentas como te fue.
Un saludo
estimado wilfredo,con el programa que tengo en proceso nunca pude hacer funcionar tu cadigo, pero hise un nuevo proyecto y ahi si me funciono de maravilla, gracias esta bien bonito como funciona.
ResponderEliminares una gran colaboracion de tu parte.
Daniel Palacios
Hola Daniel Palacios.
ResponderEliminarQue bueno que te haya servido y hayas podido hacer funcionar el código. Espero seguir aportando algo mas en unos dias, de momento no hay mucho tiempo, pero ya pronto estaré libre. Saludos cordiales y suerte.
estimado wilfredo, quiero hacerte la siguiente consulta, tengo un form inicial, donde le apreto un boton y me lleva al form que se conecta a la base de datos pero es solo para lectura en ete form no se puede modificar ni agregar nada, tengo otro form para eso, mi problema es que cuando abro el form para agregar un dato la operacion se realiza bien, lo cierro, luego abro el form para ver todos los registros y el data adapter no se ha actualizado , no se como forzarlo a leer nuevamente la base de dtos para actualizar los registros.
ResponderEliminargracias por tu ayuda
Daniel Palacios
Hola Daniel Palacios
ResponderEliminarPues me imagino que tienes un procedimiento Listar que te devuelve todos los registros que al cargar el form lo invocas y te devuelve todos los registros, aunque no es lo recomendable, pero en fin, y si solamente lo estás ocultando el formulario, significa que al volverlo a llamar solo se muestra con lo cual no está cargando el load del form, porque ya está cargado en memoria. Tendrías que ver si al momento de cerrar ese formulario lo estás descargando con Me.close y me.dispose, si estás haciendo eso se descargará de memoria y al volverlo a invocar tendra que volver a cargarse y por consiguiente pasará por el evento Load del form que te hará ese trabajo de cargar nuevamente la data.
Espero soluciones pronto y nos cuentes como te fue.
Saludos cordiales
Estimado wilfredo nuevamente gracias por tu ayuda, aun no he podido resolver el asunto de recargar el form, te pongo el codigo por si te que da tiempo le echas un vistaso:
ResponderEliminarPrivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Valor_mantenimientoTableAdapter.Fill(Me.Ejemplo2DataSet.valor_mantenimiento)
Me.ReparacionesTableAdapter.Fill(Me.Ejemplo2DataSet.reparaciones)
Me.SerieTableAdapter.Fill(Me.Ejemplo2DataSet.serie)
End Sub
Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click
Me.Dispose()
Me.Close()
agregarserie.Show()
End Sub
al cerrar el form agregarserie tengo una sentencia:
formhistorial.show
y me muestra nuevamente el formulario pero no esta actualizado.
tu comentario de esto seria de mucha ayuda.
Daniel Palacios
Como estás Daniel Palacios
ResponderEliminarPues a simple vista no te podría decir cual es el problema alli al momento de recargar el form de historial creo que es donde tienes el problema, si tienes los formularios separados (si no es un proyecto muy grande) talvez puedas enviarme zipeado el proyecto incluyendo tu base y le doy una mirada con calma al asunto este que te está dando problemas. Hay algunas cosas que así nomás no se podría detectar, talvez una transaccion no confirmada o cualquier otra cosa podría ser, si puedes enviarmelo encantado de revisarlo y te lo devuelvo de inmediato para que puedas solucionar tu problema.
Saludos cordiales
muchas gracias por tu interes, ahorita te lo envio
ResponderEliminarsaludos
Daniel Palacios
Hola Wilfredo Patricio Castillo
ResponderEliminarMi nombres es Raul Capcha Anco, tambien soy un aprendiz de visual basic, ya casi manejo muy bien los formularios, per aun no he entrando en conecciones a base de datos.. quisiera pedirte, si esk tienes una aplicacion sencilla para conectar a base d edatos
estraria muy agradecimo .. pues este articulo esta de la patada ....hasta la proxcima
Hola Raul J. Capcha
ResponderEliminarGracias por leer el blog, bueno para acceso a datos es justamente ese artículo que está alli, es la misma idea solamente que alli está separado por capas, hice un pequeño ejemplo para poder consultar una tabla en un solo formulario, talvez te sirva como guia, enviame tu correo y te lo paso. Saludos cordiales
HOLA WILFREDO CASTILLO
ResponderEliminarSOY UN APRENDIZ EN VB. MI NOMBRE ES MIGUEL JIMENEZ Y MI PROBLEMA ES QUE NO SE CUAL ES EL CODIGO DE COMO GUARDAR Y CONSULTAR LOS DATOS CON EL SQL QUE TIENE INCORPORADO EL VB.NET 2008 Y COMO ACTIVAR EL CRYSTAL REPORT POR EL VISUAL SI ME PUEDES AYUDAR TE LO AGRADECERIA ES PARA MI TRABAJO FINAL DE CARRERA. QUE TENGAS UN BUEN DIA. MI CORREO ES JMMJ_87@HOTMAIL.COM
.CommandText = "PA_Agrega_Clientes"
ResponderEliminarAsi se llama la consulta .. hecha en acces no es cierto ?
Como hago la consulta en acces con las condiciones que hiciste en el codigo?
Puesto que me tira el ERROR : Falló la operacion de inserción.
Mauricio Briceño M.
Pues si ese es el nombre de la consulta de accion que está en la base de datos access y que hace las veces de un store procedure, la consulta esa se hace con el editor de consultas que tiene access, espero que sepas como manejarlo es muy sencillo. Luego nos cuentas como te fue.
ResponderEliminarSaludos cordiales
hola. Tengo una duda, cuando creo un setup en .net 2005 y i base es en access. puedo agregar esa base al setup?. Es decir al momento de que una persona active el instalador, el setup agregue la base tambien, en una direccion especifica que el ejecutable alla creado en el momento de la instalacion. Si me podrias instruirme con esa duda, ya sea en access como en slq 2005 express.
ResponderEliminarDe antemano te quedo muy agradecido por la atencion.
Hola, disculpa la demora en responder, pero estuve fuera mucho tiempo, asi que espero que aún te sirva. Bueno el asunto es que si haces un proyecto de instalacion de aplicación, puedes agregar cualquier archivo que tu creas conveniente y la base de datos de access claro que se puede agregar tu base al, instalador, en cuanto a la base de sql express, pues el asunto cambia porque tienes que instalar primero el sql express y luego adjuntar la base de datos a tu servbidor local o de producción, son 2 cosas diferentes.
ResponderEliminarSaludos cordiales y gracias por visitar el blog
Hola Wilfrido, disculpa por no haberme presentado soy carlos cumbe, gracias por tu respuesta, me a servido de mucho lo que me has dicho. aunque te confiezo que con la respuesta de sql express hubiese preferido escuchar que se puede agregar como en access, pero bueno... igual me ha servido de mucho esta informacion, y hace tiempo que queria salir de la duda.
ResponderEliminarDe antemano te doy muchas gracias.
wilfredo me sirve de ayuda por una tarea que me dejo mi profesor
ResponderEliminarque teniamos que crear proc en access para un pequeño sistema en c#
tomare en cuenta
Pues gracias por visitar el blog y una alegría que les sirva a muchos.
ResponderEliminarSaludos cordiales
Buen dia.
ResponderEliminarEspero que me ayuden, no encuentro la forma de que en sql server no deseo ingresar por medio de autentificacion de windows, ya se como crear un login , user , y a ese asignarle la base, pero no deseo que al ingresar por autentificacion de wwindows se vea la base o se pueda acceder a ella, es decir deseo restringirlo, bueno paraece todo un travalengua lo que escribi espero haberme echo explicar, si tiene alguna idea que me pueda servir estaria muy agradecido
ola ke tal amigo oie muy buena tu ayuda solo que ahoa tengo una duda puedo introducir una fecha desde un objeto datapicker1 a la base de datos usando este mismo tipo de estructura por favor si pudieras ayudarme por ke tengo kmo 1 mes batallando kn eso y no puedo hacer ke funcione sale de antemano muchas gracias
ResponderEliminarHola, si lo que quieres es ingresar datos de tipo fecha a una determinada tabla desde un datapicker, pues no es nada dificil, solo es cuestion que sigas todo el procedimiento que ves alli y que en los parámetros definas el tipo de dato como fecha o date, y de igual manera debe estar en la tabla y a la hora de enviar el parámetro solamente tendrias que decirle por ejemplo si tienes un objeto cliente y recibe un parametro fecha en un metodo grabar por decir tendrias que pasarle asi: oCliente.Grabar(datapicket1.value,otrodato)
ResponderEliminaro asi:
oCliente.Grabar(CDate(datapicker1.value),otrodato)
y eso te debe funcionar como relojito.
Cualquier otra duda solo me escribes y nos cuentas como te fue.
Gracias por visitar el blog y espero que te ayude en tu trabajo.
Saludos cordiales
bueno, espero haber comprendido tu inquietud, pero para ingresar un tipo fecha a la base:debes de hacer lo siguiente:
ResponderEliminardeclara un objeto
dim fecha as object
fecha=datapicker1.values
rs!ca_fecha=cdate(fecha)
creo que seria asi. Y en una funcion o procedimiento puedes crear esa variable tipo de dato object para que te facilite las cosas
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola José
ResponderEliminarQue pasó?, solucionaste tu problema?, veo que eliminaste la entrada, pero me llegó la notificación con tu pregunta.
Espero que hayas solucionado tu problema.
Saludos cordiales
Hola wilfredo, quetal?
ResponderEliminarEs que estoy programando con vb.net 2005; segui todos los pasos que pedias y aun asi no me funciona.
Cuando dejo la linea=
.CommandType = CommandType.StoredProcedure
me sale el error "Falló la operacion de inserción."
Pero si cambio el StoredProcedure por Tabledirect; ahi si me muestra que la insercion fue correcta, pero reviso mi base de datos, y no hay nada. No hubo cambios. Porque será que pasa esto?
Hola, necesito ayuda con esto tengo una tabla donde guardo los registros de una fecha en la misma tabla un campo llamado totaldias, lo que he logrado hasta ahora.... estoy trabajando con access y vb.net 2005. me muestra los registros agrupados por el id y el nombre y me cuenta o me da el total de los dias pero a su vez necesito que me diga cuales fueron esos dias, agrupados como dije anteriormente... Ej.
ResponderEliminarId Nombre Dias Total Dias
66 pedro perez 12,3,5 3
como puedo hacer todo esto esta dentro de una misma tabla, comento lo pude hacer pero solo me muestra los dias totales y no me agrupa nada y cuando trato de agruparlo me da error!!!!!!!!!!! i dont understand quien pueda ayudarme gracias mil gracias de antemano
Hola, para obtener el nombre del dia de una determinada fecha es tan sencillo, como hacer lo siguiente:
ResponderEliminarDim StrFecha as date
StrFecha=Cdate("04/05/2010")
Messagebox.show("El dia es :" & StrFecha.TosTring("dddd"))
Pero no dices, donde es que quieres mostrarlo ni donde es que quieres agruparlos, si es una consulta, o en un reporte.
Espero te ayude en algo o en todo caso dar mas informacion para poderte ayudar mejor.
Saludos cordiales y gracias por visitar el blog
Gracias a ti por la ayuda, tengo una consulta donde muestro los datos de mi tabla en un datagridview, mi tabla tiene los siguientes campos: id,nombre, dia,totaldias... necesito que me muestre los dias no mas sin mes ni año, en el campo dias...lo necesito para mi consulta y para el reporte tambien,... :>
ResponderEliminarHola
ResponderEliminarpara obtener el nombre del dia en sql server es tan sencillo como esto:
select DATENAME(weekday,(fecha_Trabajo)) from TuTabla Where Condicion.
o tambien:
select DATENAME(weekday,'06/04/2010')
que te dará Martes, cambiando el weekday por month, tambien obtienes el nombre del mes.
Espero haberte ayudado, cualquier duda, solo escribe y cuéntanos como te fue, si lograste solucionar tu problema.
Saludos cordiales
Hola interesante la informacion, solo tengo una duda, como uso el editor de consultas en access 2007?
ResponderEliminarHola, eso es muy sencillo, al hacer clic en el menú crear, se desplegarán unas fichas en la parte superior derecha y escoges la que dice diseño de consultas, alli podrás escoger las tablas para realizar las consultas, seleccionando los campos con el diseñador, pero tambien puedes darle cancelar y se abrirá al lado superior izquierdo una ficha que dice SQL, al hacer clic alli, se abre la ventana para escribir directamente la consulta.
ResponderEliminarEspero haberte ayudado y gracias por visitar el blog
Gracias por decirme como hacer el diseño de la consulta, tengo otra duda, en un tabla tengo un campo numerico el cual usa una mascara que es la siguiente &&&-&&&& Pero no sé como declararlo en la consulta PARAMETERS [@Sentencia] Number( ), que pongo en el parentesis?....Gracias por contestar!!!
ResponderEliminarHola
ResponderEliminarSi el campo tiene esa máscara, no tienes que declararlo en los parámetros de la consulta, eso lo puedes hacer en el grid o donde lo vayas a mostrar, o simplemente en el select puedes hacer algo asi:
Select Campo1,Format(camponumerico,"000-000") As Tu_Campo From Tabla Where=Algo
o tambien asi:
Select Campo1,Format(CampoNumerico,"###-###") As Tu_Campo From Tabla Where=Algo
Y por último, dentro del Number(), no necesitas poner nada.
Espero haberte ayudado.
Saludos cordiales.
gracias ya solucione el problema de la consulta, ahora solo tengo que arreglar un error en el codigo...Muchas gracias me ha servido de mucho esta informacion :D
ResponderEliminarHola, me ha servido mucho esta información, quisiera saber si me puedes mostrar el codigo para actualizar y eliminar por favor. Muchas gracias!.
ResponderEliminarsi no es mucha molestia el codigo de la sentencia SQL tambien :|
ResponderEliminarHola
ResponderEliminarMe alegra que te haya servido el ejemplo, pero no es dificil la eliminacion y la actualizacion de datos, solo tienes que hacer otro "Procedimiento" como el que ves alli que se llama PA_Inserta, pero con nombre PA_Actualiza_Clientes por ejemplo
y la manera de llamarlo en el codigo es igual al que se ve alli para insertar, con 2 DIFERENCIAS a tener en cuenta, primero que no deberia ser insert sino Update mas o menos asi:
Update Clientes Set nombre=@Nombre Where IdCliente=@IdCliente
pero el parámetro @IdCliente se debe pasar como último parámetro y no primero, sino no funcionará correctamente.
Para la parte de eliminar tambien se hará un procedimiento similar pero debería ser asi:
Delete From Clientes Where IdCliente=@IdCliente, todo lo demás es identico a lo que ya está alli.
Espero haberte ayudado
Saludos cordiales
Bueno a mi me ha servido mucho tu informacion, pero tengo problemas en actualizar, mi codigo esta asi:
ResponderEliminar.CommandText = "SP_UPDATE"
.CommandType = CommandType.StoredProcedure
.Connection = cnn
.Parameters.Add("@IdCliente", OleDbType.Integer)
.Parameters.Add("@Sentencia", OleDbType.Char, 255).Value = Me.txt_sentencia.Text
.Parameters.Add("@Fecha", OleDbType.Char).Value = Me.dtp_fecha.Text
.Parameters.Add("@Demandado", OleDbType.Char, 255).Value = Me.txt_demandado.Text
.Parameters.Add("@Demandante", OleDbType.Char, 255).Value = Me.txt_demandante.Text
.Parameters.Add("@Fallo", OleDbType.Char, 255).Value = Me.txt_fallo.Text
.Parameters.Add("@Temas", OleDbType.Char, 255).Value = Me.txt_temas.Text
El error que me da es el siguiente: "El parametro [@IdCliente] no tiene un valor predeterminado."
Si pongo el @IdCliente al final como tu sugieres en un mensaje anterior: "pero el parámetro @IdCliente se debe pasar como último parámetro y no primero, sino no funcionará correctamente." me sale el siguiente error: "El parametro [@Temas] no tiene un valor predeterminado."
Te pongo mi codigo de la sentencia SQL talves sirve de algo: PARAMETERS [@IdCliente] Long, [@Sentencia] IEEEDouble, [@Fecha] DateTime, [@Demandado] Text ( 255 ), [@Demandante] Text ( 255 ), [@Fallo] Text ( 255 ), [@Temas] Text ( 255 );
UPDATE tabla_formulario SET Sentencia = [@Sentencia]
WHERE Id = @IdCliente;
Espero me puedas ayudar! Gracias.
Hola
ResponderEliminarQue bueno que te haya servido la información.
El error que te da, es porque no estás pasando un valor pues para el parámetro @IdCliente, segun veo en la propiedad .value, no estas pasando nada, pero si en los demás.
Corrige eso y nos cuentas como te fue.
Saludos cordiales
pues el problema es que el Id Cliente se tiene que incrementar automaticamente y no debe ser asignado por el usuario, por esa razon no le he asigne ningun textbox.
ResponderEliminarHola cheguillen
ResponderEliminarMira el tema es que en un procedimiento UPDATE, tiene que ir el parametro IdCliente como condicion de la actualizacion.
Donde no debe ir y ni siquiera se le debe nombrar es en el procedimiento INSERT siempre y cuando el IdCliente sea autonumérico.
Por ejemplo en un procedimiento UPDATE tiene que ir porque al actualizar tendrias que hacer algo asi: UPDATE Clientes Set nombre=@Nombre Where IdCliente=@IdCliente
entonces como ves en esos casos tienes que pasar el nombre y el IdCliente, de manera obligatoria, sino no podrías especificar a que registro vas a actualizar.
Espero haberte despejado la duda, haz las pruebas y nos cuentas como te fue.
Saludos cordiales
Muchas gracias por el ejemplo... esta muy bueno..... el problema es que lo estoy pasando a vb.net 2008 y tengo un error en el boton buscar...
ResponderEliminaraqui esta el codigo y donde me muestra el error esta en parentesis...
Dim Adaptador As New OleDb.OleDbDataAdapter(DBComando)
Dim oCliente As New (((Cliente.ClientesDataTable)))
Adaptador.Fill(oCliente)
Cone.Dispose()
Me.DtgLista.DataSource = oCliente
Catch ex As Exception
Throw New ((((Exception(ex.Message)
End Try)))))))
me aparece este error
Pocos parámetros. Se esperaba 3.
............
me gustaria mucho que me pudiera ayudar.....
pues estoy buscando la forma de que mi programa busque un numero de 6 digitos en la base de datos....
y pues su ejemplo me ha ayudado mucho....
espero que me pueda ayudar....
mi correo es andresblackky@hotmail.com...
espero un correo con su ayuda muchas gracias
Hola
ResponderEliminarPues no deberias tener ningun problema, si es que lo has hecho como lo indico alli, todo eso lo he probado ya inclusive con VB 2010 y no hay ningun problema, es asunto es que aqui Dim oCliente As New Cliente.ClientesDataTable, esta linea si te fijas se refiere a un datatable y como indiqué está en capas, entonces en la capa de entidades, solo son esquemas de las tablas, si has puesto un archivo .xsd o esquema con las tablas de tu sistema, no deberias tener ningun problema, como ya dije, lo he probado hasta con el VB 2010, y no me da ningun error.
Saludos cordiales y gracias por visitar el blog
hola buenas tardes soy nuevo en esto y mi consulta es obtener un id autoincremental de una tabla por ejemplo Unidad la cual es la clave primaria y despues hacer como clave compuesta en la tabla unimar por ejemplo hice este codigo pero me funciona
ResponderEliminarALTER PROCEDURE [dbo].[Insert_Unidad]
(@par_IdUnidad INT OUTPUT,@par_NombreUnidad[varchar](20),@par_EstadoUnidad[int])
AS BEGIN
INSERT INTO Unidad
([NombreUnidad],[EstadoUnidad])
VALUES (@par_NombreUnidad,@par_EstadoUnidad)
SELECT IDUNIDAD=@@IDENTITY
INSERT INTO Unimar
([idUnidad])
VALUES(@par_IdUnidad)
Declare @IdUnidad int
set @IdUnidad =Scope_Identity()
END
Hola
ResponderEliminarPor favor consultalo tu tema en un foro de SQL SERVER, esto es solo referente a MS Access y lo que tu estás preguntando es un procedimiento almacenado de SQL SERVER, y no te puedo responder aqui sino confundiremos a los lectores.
Saludos cordiales
hola este explicacion me sirvio en mucho ojala que hubiera mas blogs como este es genial, con esto me entraron mas ganas de aprender . net.......
ResponderEliminarEstimado. Una consulta, se puede optimizar el ingreso o actualización a la base de datos access. Tengo una aplicación donde la actualización al dato es lento... un dato es que tengo el SQL en la aplicación, quizas al tenerla en la base de mdb como función trabaje mejor ?.
ResponderEliminarsaludos
Hola
ResponderEliminarClaro que puede mejorar estando en la base, si te fijas en las consultas de accion que tengo en el ejemplo este, que le llamo malamente procedimientos, puedes mejorarlo bastante, pero tambien la actualizacion si es lento mucho depende de cuantos datos tengas y si hay muchos índices que actualizar. Tambien influye la forma en que insertas los datos, si es que abres toda la tabla y luego haces un add, o usas diretamente un Insert Into Table VALUES ..., hay muchas cosas a tener en cuenta, pero es cuestion que hagas las pruebas metiendo tu Funcion de Insercion en la base de datos y le pases los parámetros y evalúes cual te conviene.
Espero haberte dato una luz.
Saludos cordiales
Hola wilfredo, saludos desde Nicaragua.
ResponderEliminarEsta muy interesante tu ejemplo, yo no sabia que se podia hacer esto mismo en access, similar a server.
tengo 2 preguntas que hacerte tal vez me podes ayudar:
1. Como es que creas a las que llamas consultas de accion? porque yo escribo las consultas en access pero en SQL sin asistente, "a pie" pero no s'e como haces para crearlas...
2. Fijate que estoy tratando desde hace semanas de hacer un reporte en vb.net2008 con crystal y access, un reporte entre rango de fechas, es decir fecha1, fecha2 pero siempre me genera errores... pens'e hacer algo similar con access pero no podia pasar parametros... no s'e si tenes algun ejemplo con respecto a lo anterior.
De antemano, gracias por tu ayuda y tu ejemplo que esta muy bueno.
Carlos.
se me olvido wilfredo, mi correo es no_soy_racista@hotmail.com o cgmontenegro@gmail.com
ResponderEliminarsaludos,
Hola Carlos
ResponderEliminarTu primera pregunta ya está respondida mas arriba, pero lo vuelvo a citar aquí:
----------------------------
Hola, eso es muy sencillo, al hacer clic en el menú crear, se desplegarán unas fichas en la parte superior derecha y escoges la que dice diseño de consultas, alli podrás escoger las tablas para realizar las consultas, seleccionando los campos con el diseñador, pero tambien puedes darle cancelar y se abrirá al lado superior izquierdo una ficha que dice SQL, al hacer clic alli, se abre la ventana para escribir directamente la consulta.
Espero haberte ayudado y gracias por visitar el blog.
----------------------------
Luego de eso solamente grabas la consulta y ya lo tendrás dentro de tu base de datos en la vista Consultas o Vistas.
Respecto a tu segunda pregunta la cosa no es dificil:
Primero para crear un reporte en Crystal Reports no es nada dificil, solamente necesitas agregar un archivo .XSD en el cual creas un datatable con la estructura de los campos que llevará tu reporte. Para agregar el datatable es facil, simplemente le das clic derecho-->Agregar-->Datatable y alli empiezas a crear los campos.
Teniendo hecho eso, ya puedes empezar a crear tu reporte.
Estando en el diseñador del reporte en la parte izquierda donde dice Campos de la base de datos, haces clic derecho en asistente de base de datos, y alli seleccionas tu datatable y ya casi todo estará listo solo debes poner los campos en el detalle.
Para llamarlo al reporte y pasarle los parámetros hay varias maneras, aqui te indicaré la forma sencilla que es como lo hago:
Un form para poner los textbox que necesites pasar como parámetros y un boton que será el que ejecute el reporte, aqui lo que hago es llamar a otro form, en el cual tengo insertado un crystalReport Viewer que en el cual declaras dim oRepo as New TuReporte.
En el load lleva lo siguiente:
Dim oTxtDesde As TextObject
Dim oTxtHasta As TextObject
oRepo.Load(System.AppDomain.CurrentDomain.BaseDirectory & "\Tureporte.Rpt")
oTxtDesde = oRepo.Section2.ReportObjects("TxtFecha1")
oTxtDesde.Text = FrmPrimerForm.TxtDesde.Text
'..Esto haces para el Campo hasta tambien...
oRepo.SetDataSource(CType(oObjeto.Listar_X_Fechas(CDate(FrmPrimerForm.TxtDesde.Text), CDate(FrmPrimerForm.TxtHasta.Text)), DataTable))
Con eso no deberías tener problemas.
Espero te haya servidor y no te haya terminado por confundir.
Cualquier duda hazlo saber, y disculpas por la demora.
Saludos cordiales
Saludos Will.
ResponderEliminarGracias por responder.
1.La primera consulta que te hice ya la resolvi y esta muy bien en access creo a como lo enseñas en tu ejemplo, un storeprocedure con par de parametros de entrada, lo clasico vos sabes: mostrar informacion por ej, del 02 de agosto de 2010 al 30 de agosto de 2010:
PARAMETERS [@fecha1] Text ( 255 ), [@fecha2] Text ( 255 );
SELECT empleado.nombre_empleado, visitante.nombre_visitante, visita.fecha
FROM visita, visitante_visita, visitante, empleado_visitante, empleado
WHERE visita.cod_visita=visitante_visita.cod_visita
And visitante_visita.cod_visitante=visitante.cod_visitante
And visitante.cod_visitante=empleado_visitante.cod_visitante
And empleado_visitante.cod_empleado=empleado.cod_empleado
And visita.fecha Between [@fecha1] And [@fecha2]
GROUP BY empleado.nombre_empleado, visitante.nombre_visitante, visita.fecha;
En access no hay problemas. Me pide el par de fechas y me muestra el resultado, pero desde vb.net2008...
2. Con tu ejemplo, no entiendo que es oObjeto.Listar_X_Fechas cuando al reporte le pasas el setdatasource.
La idea es tener un formulario que me pida introducir los rangos de fechas con el control dtpicker y al hacer click en un boton, que me mande a llamar al reporte con la informacion entre ambas fechas, pero no establecer directamente al reporte ambas fechas, porque me parece que en tu ejemplo lo que haces es 'asignar' txtdesde y txthasta directamente a la setion2 del reporte. Me entendes?
No crees que con la consulta anterior le puedo pasar los parametros desde vb.net? a como se activa un storeprocedure desde server?
De antemano, gracias por tu valioso aporte, agradezco tu tiempo y dedicacion.
Saludos desde Nicaragua.
Carlos,
PD: De que país sos vos?
saludos will, gracias por responder.
ResponderEliminarCon respecto a la primera pregunta, ya resolvi, escribi una consulta en access que recibe par de parametros de entrada fecha y genera un conjunto de informacion entre las fechas:
PARAMETERS [@fecha1] Text ( 255 ), [@fecha2] Text ( 255 );
SELECT empleado.nombre_empleado, visitante.nombre_visitante, visita.fecha
FROM visita, visitante_visita, visitante, empleado_visitante, empleado
WHERE visita.cod_visita=visitante_visita.cod_visita And visitante_visita.cod_visitante=visitante.cod_visitante And visitante.cod_visitante=empleado_visitante.cod_visitante And empleado_visitante.cod_empleado=empleado.cod_empleado And visita.fecha Between [@fecha1] And [@fecha2]
GROUP BY empleado.nombre_empleado, visitante.nombre_visitante, visita.fecha;
con respecto a la 2da consulta tengo problemas.
ResponderEliminarCon la consulta anterior, la idea es pasar desde un formulario con dos dtpicker la fechainicial y la fechafinal y con un boton mandar a llamar al formulario que contiene el visorreport con la informacion entre las fechas.
En tu ejemplo, no entiendo la linea: oRepo.SetDataSource(CType(oObjeto.Listar_X_Fechas(CDate(fecha1), CDate(fecha2)), DataTable))
Al parecer lo que haces es agregar directamente al reporte txtdesde y txthasta a la section2?
Me entendes?
De antemano, gracias por tu ayuda y por el tiempo que dedicas.
ResponderEliminarSaludos desde Nicaragua
Carlos.
PD: de que país sos?
Con lo de la consulta, es como trabajar con storeprocedures en server, lo que quiero es pasar ambas fechas como parametros a access y que se ejecute la consulta definida.
ResponderEliminarSi ejecuto la consulta estando en access, me pide ambas fechas, inicial y final y no hay problemas , me presenta el resultado pero no asi desde vb.net2008.
tu ejemplo es bastante mas sencillo y mas rapido al ejecutar por lo que veo pero no se si estoy en lo correcto al decirte que me parece que asignas directamente txtdesde y txthasta a la section2 del oreporte.
Hola Carlos
ResponderEliminarHaber vamos por partes.
En primer lugar, el ejemplo que muestro en este artículo que dio origen a estos comentarios, dice que está hecho en n-capas.
Ahora con respecto a tu primera consulta de enviarle los parámetros desde el vb.net 2008, si te fijas bien en el ejemplo, donde muestra la imagen de un Form Clientes que está mostrando datos, sobre esa imagen está el codigo dice del Boton Buscar (Buscar_click)
Si te fijas en este fragmento del codigo:
.Parameters.Add("@Codigo", OleDbType.VarChar, 10).Value = Me.TxtCodigo.Text
.Connection = Cone
End With
.....
Entonces es lo mismo para lo que tu necesitas, solo que tendrías que pasarle 2 parámetros en vez de uno, para tu caso sería algo como esto:
.Parameters.Add("@Fecha1", OleDbType.DateTime, 10).Value = CDate(Me.Datapicker1.value)
.Parameters.Add("@Fecha2",OleDbType.DateTime,10).Value=CDate(Me.DataPicker2.Value)
.Connection = Cone
End With
...............
Lo demas es igual al ejemplo, con eso tu consulta te devolverá los datos desde vb.net 2008, lo puedes probar poniendo un datagridview como en el ejemplo.
Respecto a tu pregunta 2, la cosa es asi:
Como dije que el ejemplo está en n-capas, entonces tengo una clase en la capa de acceso a datos que es la encargada de ejecutar la consulta y me devuelve un datatable con los datos, que lo envia a la capa de negocios que es la que es instanciada desde la capa cliente, entonces como verás siendo una clase que en este caso sería por decir clsDatos, en la cual tiene una funcion Listar_X_Fecha(Fecha1,Fecha2) as Datatable
, al ser instanciada en el cliente sería algo asi:
Dim oReporte as new clsDatos
Entonces alli es donde uno hace uso del objeto oReporte.Listar_X_Fechas.
Asi que no es nada extraño.
Para probarlo puedes hacerte una clase similar y que te devuelva los datos y será todo igual al ejemplo que te envié en la respuesta anterior.
En cuanto a lo que dices que le asigno los txtdesde y txthasta a la seccion 2 del reporte, pues si es verdad pero para que?, pues porque muchas veces el cliente necesita ver en el reporte que es Desde tal fecha hasta tal fecha verdad?, entonces solo para eso le asigno eso, pero tambien puedo no hacerlo y en el reporte no se sabria desde que fecha hasta que fecha.
Aca cito lo que me dices:
---------------------------------
En tu ejemplo, no entiendo la linea: oRepo.SetDataSource(CType(oObjeto.Listar_X_Fechas(CDate(fecha1), CDate(fecha2)), DataTable))
----------------------------------
Bien, esta linea lo que hace es pasar los parámetros de fecha1 y fecha2 a la consulta para que te devuelva los datos en ese rango, y a la vez aprovecho esos parametros para mostrarlos en el reporte, pero tambien solo puedo pasar los parametros para que me devuelva los datos en el reporte y no mostrarlos en el reporte, asi que no tiene nada que ver con lo que estás pensando, sino que esa linea es la que invoca a la funcion de la clase que recibe 2 parametros y te devuelve los datos en ese rango como ya dije, pero yo aprovecho eso mismo para mostrar tambien entre que rango está el reporte, pero no es que le asigne eso al reporte directamente sin los parámetros o que eso sea lo que filtre los datos dentro del reporte, sino que los datos llegan al reporte ya filtrados, y es la manera en que le envio los parametros para que me devuelva los datos en el reporte.
Espero no haber sino muy extenso en la explicación.
Cualquier cosa no dudes en escribir.
A y por cierto soy de Perú, un abrazo desde "Trujillo" Capital Internacional de la Primavera y de la Marinera
Dios le bendiga Wilfredo, muchas gracias por su apoyo.
ResponderEliminarPues claro, tenía usted razón porque el código para consultar y mostrar en datagridview es sencillo:
fecha1 = Trim(Me.TextBox1.Text)
fecha2 = Trim(Me.TextBox2.Text)
Dim f1, f2 As New DateTime
f1 = Me.DateTimePicker1.Value.ToShortDateString
f2 = Me.DateTimePicker2.Value.ToShortDateString
Try
Dim DBComando As New OleDbCommand
obj_conexion_mdf.Open()
With DBComando
.CommandText = "prueba"
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@fecha1", OleDbType.Date, 10).Value = f1 'Me.TextBox1.Text
.Parameters.Add("@fecha2", OleDbType.Date, 10).Value = f2 'Me.TextBox2.Text
.Connection = obj_conexion_mdf
End With
Dim Adaptador As New OleDbDataAdapter(DBComando)
Adaptador.Fill(oCliente)
obj_conexion_mdf.Dispose()
Me.DataGridView1.DataSource = oCliente
Form2.Show()
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
pero se me presenta un problema que creo que es más sencillo pero no doy...
ResponderEliminaren la instruccion form2.show
este formulario tiene el crystalviewer y en el evento load lo que hago es:
Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument
' Asigno el reporte
CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
CrReport.Load(Application.StartupPath & "\Crystalreport1.rpt")
CrReport.SetDataSource(dtDatos)
Me.CrystalReportViewer1.ReportSource = CrReport
pero en la instruccion CrReport.Load(Application.StartupPath & "\Crystalreport1.rpt")
me manda un error de "load report failed"
Que cree que puede ser,? utilicé CrReport.Load(System.AppDomain.CurrentDomain.BaseDirectory & "\CrystalReport1.Rpt")
pero genera el mismo error.
Saludos y gracias...Carlos
Application.StartupPath me retorna:
ResponderEliminarC:\Documents and Settings\A0AT02176\Desktop\nueva fecha\nuevafecha\bin\Debug...
que es donde se encuentra el .exe de la aplicacion, pero si deseo cargar el .rpt deberia de llegar hasta
C:\Documents and Settings\A0AT02176\Desktop\nueva fecha\nuevafecha\Crystalreport1.rpt
pero el caso es staruppath busca el .rpt en \bin\debug no en \nuevafecha\.Crystalreport1.rpt
Dios le bendiga don wilfredo.
ResponderEliminarGracias por su apoyo.
Ya resolví el problema y tenía razón, era simple lo del llamado al reporte.
Sólo un problema, cuando cargo el reporte entre rangos de fecha, lo cierro y vuelvo a realizar una nueva búsqueda por fechas o entre el rango anterior, los registros aparecen duplicados en el reporte.
He probado con objformulario.Dispose() 'el que form que contiene el reporte
objreporte.Dispose()'el objeto reporte
objformulario = Nothing
objreporte = Nothing
Pero el problema persiste
Saludos, Carlos
Muy bien Carlos
ResponderEliminarMe alegra que haya podido solucionar su problema.
Y bueno creo que el primero problema que tenia del error que no encontraba el reporte era porque estaba declarando el namespace "CrystalDecisions.CrystalReports.Engine.ReportDocument"
Pero deberia hacerlo así:
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Nada mas y con eso funcionaría sin problemas la llamada con App.Domain. como lo indiqué inicialmente.
Lo de los registros duplicados, creo que es problema de la consulta, seguramente está devolviendo datos duplicados, y si no es así, talvez exista una propiedad .DiscardesaveData, que debe estar activada para que no se guarden los datos en el reporte y tener el problema de la supuesta duplicidad.
Espero que todo siga bien y muchos éxitos.
Hasta pronto
Saludos nuevamente don Wilfredo.
ResponderEliminarEspero esté bien.
Reiterando mi agradecimiento por su apoyo.
Fijese que, aunque no tiene que ver directamente con el ejemplo, no sé si le ha pasado que cada vez que abro el reporte en tiempo de ejecución, aparece la consulta anterior, no es duplicación de información porque las pruebo antes en el queryB de access, pero he destruido los objetos asociados con el reporte con dispose() en el evento disposed y deactivate del form que contiene el crystalviewer pero sigue apareciendo el resultado de la consulta anterior...
Gracias nuevamente, desde Nicaragua ,Carlos
Hola Carlos
ResponderEliminarPara solucionar este inconveniente antes de esta línea:
CrReport.Load(Application.StartupPath & "\Crystalreport1.rpt")
CrReport.SetDataSource(dtDatos)
Debe poner la siguiente línea:
CrReport.Refresh
Y con eso ya no tendrá el problema de los datos anteriores.
Espero que todo esté bien y solucionado.
Saludos cordiales
Wilfredo Excelenete tu comentario de procedimientos almacenados en access lo necesitaba, me queda una duda y es la siguiente:
ResponderEliminarhaber ubiquemonos en un maestro detalle osea una tabla para el javascript:void(0)encabezado y el otro para el detalle, yo por lo general trabajo mucho begintran y el comitram en Visual Studio 6.0 osea gurado todo de una, no lo hago uno por uno no me gusta, la cuestion es como controlo o como hago para enviarle todo (encabezado y detalle) a un procedimiento
Te agradezco la informacion
Marcos Suarez
Hola
ResponderEliminarHaber si esto te da una idea de como grabar un maestro y detalle
Public Function Grabar(ByVal Fecha As DateTime, ByVal Serie As String, ByVal Numero As String, ByVal Valor_Venta As Decimal, ByVal IGV As Decimal, ByVal Total As Decimal, ByVal Cliente As Integer, ByVal TipoDoc As String, ByVal Detalle As Detalle_VentasDataTable) As Boolean
Dim Cone As SqlConnection
Cone = New SqlConnection
Dim DBComando As New SqlCommand
Dim T As SqlTransaction
Try
Cone.ConnectionString = Conexion.GetConnectionStrings
Cone.Open()
T = Cone.BeginTransaction
With DBComando
.CommandText = "PA_Inserta_Venta"
.CommandType = CommandType.StoredProcedure
.Connection = Cone
.Transaction = T
.Parameters.Add("@IdVenta", SqlDbType.Int, 10).Direction = ParameterDirection.Output
.Parameters.Add("@Fecha", SqlDbType.DateTime, 10).Value = Fecha
.Parameters.Add("@Serie", SqlDbType.VarChar, 4).Value = Serie
.Parameters.Add("@Numero", SqlDbType.VarChar, 10).Value = Numero
.Parameters.Add("@ValorVenta", SqlDbType.Decimal, 14).Value = Valor_Venta
.Parameters.Add("@Igv", SqlDbType.Decimal, 14).Value = IGV
.Parameters.Add("@Total", SqlDbType.Decimal, 14).Value = Total
.Parameters.Add("@IdCliente", SqlDbType.Int, 10).Value = Cliente
.Parameters.Add("@IdTipoDoc", SqlDbType.VarChar, 4).Value = TipoDoc
End With
Dim HuboExito As Integer = DBComando.ExecuteNonQuery
If HuboExito = 0 Then
Throw New Exception("Error en la operacion de Inserción")
T.Rollback()
End If
Dim IdVenta As Object
IdVenta = DBComando.Parameters(0).Value
Dim Fila As Detalle_VentasRow
For Each Fila In Detalle.Rows
Dim DBComandoDet As New SqlCommand
With DBComandoDet
.CommandText = "PA_Inserta_Detalle_Venta"
.CommandType = CommandType.StoredProcedure
.Connection = Cone
.Transaction = T
.Parameters.Add("@IdVenta", SqlDbType.Int, 10).Value = IdVenta
.Parameters.Add("@IdProducto", SqlDbType.Int, 10).Value = Fila.IdProducto
.Parameters.Add("@Precio", SqlDbType.Decimal, 14).Value = Fila.Precio
.Parameters.Add("@Cantidad", SqlDbType.Int, 4).Value = Fila.Cantidad
Dim TodoBien = DBComandoDet.ExecuteNonQuery
If TodoBien = 0 Then
Throw New Exception("Error en la operación de Inserción")
T.Rollback()
End If
End With
Next
T.Commit()
Cone.Close()
Cone.Dispose()
Detalle.Rows.Clear()
Return True
Catch ex As Exception
Throw New Exception(ex.Message)
T.Rollback()
Return False
End Try
End Function
Hola buenas tardes, estoy trabajando en un proyecto de visual 2005, pero integrado con access, revise en su blog y los aportes son muy buenos para una persona que como yo estoy iniciando mis pinos en este tema de la programacion. Tengo una duda cuando realizao la busqueda no me funciona el procedimiento que tiene en su ejemplo..me podria indicar como debe ir ese procedimiento porque no me permite encontrar el codigo que busco dentro de la base de datos. Muchas gracias por la ayuda que me pueda brindar...
ResponderEliminarah perdon olvide mi nombre es Mario Perez estudiante de programacion aqui en mi pais....
ResponderEliminardisculpa no habia notado que los comentarios de este blog fueron ya hace tiempo, pero si es posible obtener su ayuda, de lo que escribi como anonimo me seria de mucha ayuda. te agradezco Wilfredo la colaboracion, es mas en tu blog es la unica ayuda que he visto asi sencilla y practica para poner a prueba..Ya realice la de guardar y funciona bien..sigo en la de buscar..claro que me gustaria saber algo mas, espero no molestar, si yo quiero que la persona al da enter en el cuadro de texto al momento de capturar el codigo puedo hacer que realice la busqueda ahi mismo y le diga que ya existe..espero ser claro en la pregunta...
ResponderEliminarHola Mario Perez
ResponderEliminarPues el procedimientos es muy sencillo para hacer la búsqueda, quedaría mas o menos así:
PARAMETERS[@Codigo]Text (10);
Select Codigo,Nombre From Clientes Where Codigo=@Codigo
Eso es todo y como verás solo recibe el parámetro Código desde la aplicacion y con eso te devuelve los datos.
Espero tengas claro este tema.
Y por cierto no se cual es tu país, pero que bueno que te sirva lo que escribo.
Saludos cordiales
Hola
ResponderEliminarPara hacer lo que quieres, se puede hacer de varias maneras:
1. Puedes crear una función mas o menos así:
Public Function Buscar_X_Codigo(ByVal Codigo As String) As Boolean
Try
Dim Fila As DataRow
Dim oCliente As New Dal.Clientes
If oCliente.Buscar_X_Codigo(Codigo).Rows.Count > 0 Then
For Each Fila In oCliente.Buscar_X_Codigo(Codigo).Rows
Me.Codigo = Fila("IdCliente").ToString
Me.Apellido_Paterno = Fila("ApePaterno").ToString
Me.Apellido_Materno = Fila("ApeMaterno").ToString
Me.Nombres = Fila("Nombres").ToString
Next
Return True
Else
Return False
End If
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
End Function
----------------
2.- En el evento keypress del textbox
puedes poner algo como esto:
If e.KeyChar = Convert.ToChar(Keys.Return) Then
If Me.TxtCodigo.Text <> "" Then
If oCliente.Buscar_X_Codigo(me.txtcodigo.text) then
messagebox.show"Codigo ya existe"
Else
'Aqui pones tu codigo para lo que necesites hacer si no existe el codigo....
End If
Hola buen dia..
ResponderEliminarPrimero que todo soy de Colombia, y el programar es una de mis aficiones que he podido empezar a realizar, pero bueno no en la forma que he esperado. Su blog me ha parecido muy practico y facil de entender frente a otros que son buenos pero no para personas como yo que estamos empezando en este mundo tan grande.
Igualmeente gracias por la atencion prestada y la ayuda que me ha dado ya realice los cambios que me sugirio y si esta muy bien, solo tengo una duda en la linea que aparece asi :
Dim Adaptador As New OleDbDataAdapter(DBComando)
Dim oCliente As New Cliente.ClientesDataTable
Coloco la base de datos mia y el campo (espero no estarme equivocando) pero no me sale el Datatable..mi visual no me lo sugiere...que puede ser.
La Base de datos mia se llama Cecan.mdb y la tabla se llama especia y dentro el campo es codigo y nombre.
Se que el error es mio y probablemente de ubicacion de los datos.
Quedo a la espera de su orientacion y de antemano por la paciencia que pueda tener frente a mis preguntas.
Gracias
Mario
Hola Mario Perez.
ResponderEliminarPues no es nada de lo que te imaginas, ni ubicación de tus datos o de tu base, sino que debiste leer el artículo y alli dice que está hecho en n-capas el ejemplo ese, pero porque no puedes ver el datatable, es porque no agregaste la capa de Entidades de la que alli hablo ni tampoco el .XSD en el mismo proyecto, eso lo puedes hacer viendo un paso a paso que he preparado y publicado, ya que como verás tengo muchas consultas y comentarios al respecto, este es el enlace para que revises el paso a paso y no tengas dudas.
Haciendo remember de post antiguo Procedimientos Almacenados en Microsoft Access y Visual Basic 2005
Espero te sirva y cualquier cosa, no dudes en escribir y contarnos como te fue.
Saludos cordiales
Hola Buenas Tardes
ResponderEliminarlei el articulo que contiene lo de ncapaz y si claro estaba mirando hacia el punto que no era, esta parte de access no la conocia y me parecio muy interesante, me gustaria saber si contiene o sabee de un articulo que me de mas informacion a fondo sobre el tema.
Bueno gracias a su ayuda ya puedo grabar un registro, buscarlo igualmente y la base de datos esta como se me sugirio que deberia estar y que no habia entendido.
Tengo una duda que se que debe ser algo asi como lo de access que no entendi, yo tengo un formulario que tiene dos label y dos textbox, se me pide que al dar enter en el primero me diga si el codigo esta, ya realize los cambios con la ayuda que usted me brindo pero nuevamente quedo en esta linea,
Dim oCliente As New Dal.Clientes
debo tener un problema en cuanto al enlace de las bases de datos...De antemano agradezco la paciencia que ha tenido conmigo y un saludo de colombia...
Gracias
Mario
Hola Mario
ResponderEliminarHaber
El problema con enlace a la base de datos como tal, según tú, no existe, lo que pasa es que como ya dije, el proyecto de ejemplo funciona en n-capas, entonces, el asunto es mas o menos asi:
1.-Capa Cliente=Creas un proyecto de VB .exe que será la capa cliente, donde tendrás los formularios y solamente interactúa hacia atrás con la capa de negocio y nadie mas.
2.-Capa Negocio=Agregas un proyecto DLL, en el cual será puro codigo y como bien lo dice el nombre, es donde van las reglas de negocio y todas las validaciones y restricciones que necesite la aplicación, y esta capa debe interactuar hacia adelante con la CAPA CLIENTE, y hacia atrás solo debe interactuar con la CAPA DE ACCESO A DATOS (DAL).
3.- Agregas un proyecto DLL,que será la capa de acceso a datos, la cual interactúa con la Base de Datos en este caso con access, y hacia adelante solo con la CAPA de NEGOCIO, ejemplo de la capa de Acceso a datos es lo que está después del primer formulario en el artículo, donde dice esto:
Dim Cone as new OLEDB.OLEDBConnection
Al ser un proyecto independiente, lo podrías llamar como hice yo:El proyecto de acceso a datos se llama DAL (Data Access Layer)
Y dentro de ese proyecto tendría una clase llamada Cliente
Y en esa clase iría todo lo que está despues del primer formulario como ya dije.
Ejemplo
Public Class Cliente
Public Function Grabar(Nombre as String,Direccion As String, etc)As Boolean
....Aqui todo el codigo que está despues del primer formulario
...
Return Tru
End Function
--------------
Ahora para que funcione todo como relojito, estando en la capa de negocio debes hacer referencia en Referencias del proyecto, seleccionar la referencia al proyecto DAL, y tambien al proyecto de la capa Cliente.
Entonces con eso cuando estés en tu capa de negocio y quieres registrar un cliente harías uso de la linea que tienes problemas asi:
Dim oCliente as new Dal.Cliente
if oCliente(Nombre,Direccion,etc) then
Return True
Else
Return False
endif
Ahora eso te serviría para pasar los datos de la capa negocio hacia la capa de datos y por consiguiente hacia la base de datos.
En cuanto a pasar los datos desde la capa cliente hacia la capa de negocio, el asunto es casi igual, por ejemplo en el boton guardar podrías tener algo como esto:
dim oClie as CAPANEGOCIO.Cliente
if oClie.Grabar(Nombre,Direccion,Etc) then
MEssagebox.Show("Datos grabados","Aviso")
else
messagebox.show("No se grabaron los datos","Error")
endif
El asunto no es tan dificil de entender, pero tampoco tan sencillo, porque hay que tener algunos temas muy claros.
Espero con esto te haya despejado la duda, haz las pruebas y luego nos cuentas como te fue.
Saludos cordiales.
Buenas noches Wilfredo
ResponderEliminarEstuve analizando lo que me dijo y realice un proyecto nuevo con las instrucciones que me dio, pero en algo me estoy quedando y no logro realizar que funcione lo que necesito que salga. hable con mi maestro de programacion y trate de mostrarle la forma en que lo estoy realizando y bueno parece que no le dio mucho interes al tema. A mi me gusta el metodo que usted me sugiere es muy diferente a lo que estamos realizando aqui en clase, pero aun sigo un poco perdido con el tema de las n-capas. Sr. wilfredo me tomo el atyrevimiento de enviarle el codigo que he realizado para que usted me pueda indicar la forma mas acertada de realizarlo, quiero y deseo entender su metodo y no por cumplir aqui en el estudio si no porque me parece que su estilo es sencillo y muy aplicable a cualquier proyecto a realizar. espero no abusar de su confianza al enviarle lo que he realizado.
Como siempre Gracias y un saludo desde colombia.
Mario Perez
Hola Mario Perez
ResponderEliminarNo hay problema, enviame tu proyecto incluyendo tu Base, para poderlo ver completo y ayudarte, envialo en un archivo .zip para echarle una mirada y poder ayudarte mejor.
Mi correo es: wpatricio70@hotmail.com, por el cual me puedes contactar y puedes agregarme a tu lista de msn, que con gusto te ayudaré.
Saludos cordiales
Men yo tengo una pregunta de casualidad no sabes si en ACCESS es posible reemplazar los procedimientos almacenados que uno crea en SQL ¿?
ResponderEliminarHola
ResponderEliminarNo es posible, ya que todas las modificaciones se deben hacer desde el mismo SQL Server con el Management Studio.
Saludos cordiales
Hola Wilfredo, por favor podrias decirme como sería el asunto con un reporte de Report Services y claro una consulta de access que recibe 2 parámetros y que el resultado se vea en un report viewer. Gracias de antemano.
ResponderEliminarHola Beto Rios
ResponderEliminarPues el asunto no es dificil, solamente tendrías que elaborar tu reporte, poner un reportviewer en un formulario, y para pasarle los parametros tendrías que poner algo asi, en el load del formulario que tiene el report viewer:
En el load:
Dim p As New ReportParameter("pDesde", FrmReporteVentas.TxtDesde.Text)
Dim p2 As New ReportParameter("pHasta", FrmReporteVentas.TxtHasta.Text)
Me.RvVentas.LocalReport.SetParameters(New ReportParameter() {p})
Me.RvVentas.LocalReport.SetParameters(New ReportParameter() {p2})
Me.PA_Listar_Ventas_X_FechasTableAdapter.Fill(Me.Reportes.PA_Listar_Ventas_X_Fechas, CType(FrmReporteVentas.TxtDesde.Text, Date?), CType(FrmReporteVentas.TxtHasta.Text, Date?))
Me.RvVentas.RefreshReport()
Con eso ya tienes tu reporte con 2 parámetros, en este caso del ejemplo se está pasando 2 parámetros de fecha, desde y hasta, que es un rango de fechas para obtener un reporte.
Espero te sirva.
Saludos cordiales
Gracias. Es un excelente aporte.
ResponderEliminartengo un problema con mi codigo espero puedan ayudarme, estoy trabajando con webforms de vb.net 2005 y al intenta guardar mis datos no hace nada este es mi codigo.
ResponderEliminarProtected Sub Btn_guardar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Btn_guardar.Click
Dim Conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\172.16.121.64\Coordinación\Modificaciones\Registro_y_seguimiento_datos.mdb")
Dim strSQL As New OleDbCommand("INSERT INTO Documentos (Folio_Recepcion) VALUES (@Folio_Recepcion)", Conn)
'Fecha_Documento, Id_TipoDoc, NumeroOficio, Dirigido_a, Remitente, Resumen_Asunto, Insruccion_CGA, Prioridad, Fecha_Limite, Id_Area) VALUES (@Folio_Recepcion, @Fecha_Documento, @Id_TipoDoc, @NumeroOficio, @Dirigido_a, @Remitente, @Resumen_Asunto, @Insruccion_CGA, @Prioridad, @Fecha_Limite, @Id_Area)", Conn)
Dim prm As New OleDbParameter
prm = New OleDbParameter("@Folio_Recepcion", OleDbType.Integer)
prm.Direction = Data.ParameterDirection.Input
prm.Value = Folio_Recepcion.Text
strSQL.Parameters.Add(prm)
Try
Conn.Open()
strSQL.ExecuteNonQuery()
Catch ex As Exception
Mensaje.Text = "Error al escribir en el archivo..."
Mensaje.ForeColor = Drawing.Color.Red
End Try
Conn.Close()
strSQL.Parameters.Clear()
espero me puedan ayudar..
tengo un problema, me estoy incursionando apenas en esto tengo una base de datos en access y quiero insertar informacion desde un webforms y no me hace nada mi codigo es el siguiente
ResponderEliminarProtected Sub Btn_guardar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Btn_guardar.Click
Dim Conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\172.16.121.64\Coordinación\Modificaciones\Registro_y_seguimiento_datos.mdb")
Dim strSQL As New OleDbCommand("INSERT INTO Documentos (Folio_Recepcion) VALUES (@Folio_Recepcion)", Conn)
'Fecha_Documento, Id_TipoDoc, NumeroOficio, Dirigido_a, Remitente, Resumen_Asunto, Insruccion_CGA, Prioridad, Fecha_Limite, Id_Area) VALUES (@Folio_Recepcion, @Fecha_Documento, @Id_TipoDoc, @NumeroOficio, @Dirigido_a, @Remitente, @Resumen_Asunto, @Insruccion_CGA, @Prioridad, @Fecha_Limite, @Id_Area)", Conn)
Dim prm As New OleDbParameter
prm = New OleDbParameter("@Folio_Recepcion", OleDbType.Integer)
prm.Direction = Data.ParameterDirection.Input
prm.Value = Folio_Recepcion.Text
strSQL.Parameters.Add(prm)
Try
Conn.Open()
strSQL.ExecuteNonQuery()
Catch ex As Exception
Mensaje.Text = "Error al escribir en el archivo..."
Mensaje.ForeColor = Drawing.Color.Red
End Try
Conn.Close()
strSQL.Parameters.Clear()
espero me puedan ayudar muchas gracias...
Hola Julio Cesar.
ResponderEliminarTe recomiendo que sigas la sintaxis exacta como está en el ejemplo, porque la verdad no se entiende nada tu código, veo comentario y 2 veces VALUES, asi que no se exactamente que hace.
Trata de seguir el ejemplo que con eso lograrás insertar los datos.
Luego nos cuentas como te fué
Saludos cordiales
Hola wilfredo
ResponderEliminardisculpa que te moleste
quisiera saber como puedo crear una pagina web que me almacene los datos de un cd el autor, el titulo, el precio y la imagen del disco y que en recuadro mas abajo se puedan ver las etichetas de los dicos ya guardados
disculpa me olvidaba la base de datos en access 2007
ResponderEliminarse llama test la tabla cd
ResponderEliminarcon los campos
autor titulo precio etiqueta
Hola Anthony
ResponderEliminarNo te podría indicar exactamente como hacer tu página, porque hay muchas maneras de abordar ese tema, dependiendo con que lo hagas. asp, asp.net php, lo único que te indicaría en el tema de acceso a los datos si sigues el ejemplo que puse alli lograrás guardar los datos que necesites.
Saludos
es en asp.net
ResponderEliminarHola Antony
ResponderEliminarPuedes usar visual studio o visual web developer, y con el realizar toda la parte de la presentación, en cuanto al tema de acceso a los datos, como te dije, usa la misma técnia que indico en el blog y todo irá bien.
Saludos cordiales
Hola Wilfredo Patricio Castillo, sabe excelente tu comentarios con respecto a los Procedimientos almacenados en access.
ResponderEliminary Tengo una pregunta con respecto al procedimiento que muestras del
PROCEDURES [@CODIGO] TEXT (255),[@NOMBRE] TEXT (255), [@DIRECCION] TEXT(255)
INSERT INTO CLIENTE ...
Haber que posibilidad hay de EN VIAR OTRO PARAMETRO PARA PREGUNTAR ASI:
IF [@NUMERO]=1
INSERT INTO CLIENTE ...
IF [@NUMERO]=2
UPDATE CLIENTE...
IF [@NUMERO]=3
DELETE CLIENTE ...
¿SE PODRA HACER? O DE QUE MANERE.
TE LO DIGO POR QUE SI TIENES 100 TABLAS Y PARA CADA TABLA HAY QUE HACERLE UN PROCEDIMIENTO PARA INSERTAR, OTRO PARA ACTUALIZA, OTRO PARA ELIMINAR ETCC..
GRACIAS
Hola Wilfredo me parecio excelente tu post, por otra parte, es posible que subas un video para ver la accion en forma mas interactiva.
ResponderEliminarSaludos
hola, esta muy bien tu ejemplo, sencillo y practico, pero me gustaria que me ayudes a ejecutar consultas con parametros, en tu ejemplo agregas una linea para cada parametro que quieres definir, sin embargo en SQL server utilizo el sqlcommandbuilder.deriveparameters(cmd) para automaticamente leer los parametros de procedimiento almacenado y asignarles su valor mediante un buqule, de tal modo que solo coloco el nombre del procedimiento almacenado seguido de los valores para los parametros, que automaticamente los llena, ya sean 1 o 100 parametros, de ese modo no tengo que escribir 100 lineas para agregar todos los parametros, BUeno espero haberme explicado bien, te muestro el codigo que utilizo para sqlserver pero que lo modifique para access (OLEDB) pero no me funciona.
ResponderEliminarSlds.
Sub llenar_parametros(ByVal cmd As OleDbCommand, ByVal ParamArray parametros() As Object)
If CN.State = ConnectionState.Closed Then CN.Open()
OleDbCommandBuilder.DeriveParameters(cmd)
Dim prm As New SqlParameter
Dim I As Integer = 0
For Each prm In cmd.Parameters
If prm.ParameterName <> "@RETURN_VALUE" Then
prm.Value = parametros(I)
I = I + 1
End If
Next
End Sub
Hola David
ResponderEliminarGracias por leer el blog y disculpas por la demora en responder.
Bueno si te fijas en tu código estás haciendo uso de sentencias SQL Server que no son válidas para MS Acess, asimismo hay que recordar que ms access no es un servidor de base de datos como SQL Server, por lo tanto debemos tener presente las limitaciones.
Saludos cordiales
Saludos Wilfredo
ResponderEliminarEstoy tratando de guardar en una tabla en access los datos de una grilla, al abrir la tabla guarada los datos, pero me sale el siguiente error: El parámetro @Idproducto no tiene un valor predeterminado.
este es el codigo que utilizo
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'GUARDAR DATOS EN LA TABLA
conexion = New System.Data.OleDb.OleDbConnection("PROVIDER = MICROSOFT.ACE.OLEDB.12.0;DATA SOURCE= C:\Documents and Settings\Administrador\Escritorio\CONTROLES EDGAR\MENUS\MENUS\Alimentacion.accdb")
Dim i As Integer
Dim a As String
Dim reg As System.Data.OleDb.OleDbCommand
For i = 0 To DataGridView1.Rows.Count - 1
a = "Update IngredientesMenus set Idmenu= ""@Idmenu"" where Idproducto= ""@Idproducto"" "
a = "insert into IngredientesMenus values(@Idmenu,@Idproducto,@Opcion,@Clase,@Producto,@Cantidad)"
reg = New System.Data.OleDb.OleDbCommand(a, conexion)
reg.Parameters.Add(New OleDb.OleDbParameter("@Idmenu,", OleDb.OleDbType.VarChar, 15)).Value = Me.Codigomenus.Text
reg.Parameters.Add(New OleDb.OleDbParameter("@Idproducto,", OleDb.OleDbType.VarChar, 15)).Value = Me.DataGridView1.Rows(i).Cells("Codigo").Value
reg.Parameters.Add(New OleDb.OleDbParameter("@Opcion,", OleDb.OleDbType.VarChar, 60)).Value = Me.TextBox2.Text
reg.Parameters.Add(New OleDb.OleDbParameter("@Clase,", OleDb.OleDbType.VarChar, 40)).Value = Me.Label2.Text
reg.Parameters.Add(New OleDb.OleDbParameter("@Producto,", OleDb.OleDbType.VarChar, 60)).Value = Me.DataGridView1.Rows(i).Cells("Producto").Value
reg.Parameters.Add(New OleDb.OleDbParameter("@Cantidad,", OleDb.OleDbType.Double)).Value = Me.DataGridView1.Rows(i).Cells("Cantidad").Value
reg.Connection.Open()
reg.ExecuteNonQuery()
reg.Connection.Close()
Next
MsgBox("Ingredientes guardados satisfactoriamente")
Gracias por tu ayuda
Saludos Wilfredo
ResponderEliminarEstoy tratando de guardar en una tabla en Access los datos de una datagrid, al abrir la tabla guarda los datos, pero me sale el siguiente error:
El parámetro @Idproducto no tiene un valor predeterminado.
este es el codigo que utilizo
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'GUARDAR DATOS EN LA TABLA
conexion = New System.Data.OleDb.OleDbConnection("PROVIDER = MICROSOFT.ACE.OLEDB.12.0;DATA SOURCE= C:\Documents and Settings\Administrador\Escritorio\CONTROLES EDGAR\MENUS\MENUS\Alimentacion.accdb")
Dim i As Integer
Dim a As String
Dim reg As System.Data.OleDb.OleDbCommand
For i = 0 To DataGridView1.Rows.Count - 1
a = "insert into IngredientesMenus values(@Idmenu,@Idproducto,@Opcion,@Clase,@Producto,@Cantidad)"
reg = New System.Data.OleDb.OleDbCommand(a, conexion)
reg.Parameters.Add(New OleDb.OleDbParameter("@Idmenu,", OleDb.OleDbType.VarChar, 15)).Value = Me.Codigomenus.Text
reg.Parameters.Add(New OleDb.OleDbParameter("@Idproducto,", OleDb.OleDbType.VarChar, 15)).Value = Me.DataGridView1.Rows(i).Cells("Codigo").Value
reg.Parameters.Add(New OleDb.OleDbParameter("@Opcion,", OleDb.OleDbType.VarChar, 60)).Value = Me.TextBox2.Text
reg.Parameters.Add(New OleDb.OleDbParameter("@Clase,", OleDb.OleDbType.VarChar, 40)).Value = Me.Label2.Text
reg.Parameters.Add(New OleDb.OleDbParameter("@Producto,", OleDb.OleDbType.VarChar, 60)).Value = Me.DataGridView1.Rows(i).Cells("Producto").Value
reg.Parameters.Add(New OleDb.OleDbParameter("@Cantidad,", OleDb.OleDbType.Double)).Value = Me.DataGridView1.Rows(i).Cells("Cantidad").Value
reg.Connection.Open()
reg.ExecuteNonQuery()
reg.Connection.Close()
Next
MsgBox("Ingredientes guardados satisfactoriamente")
Gracias por tu ayuda
Hola Edgar
ResponderEliminarPrimero gracias por visitar el blog.
Ahora
Respecto a tu consulta, si te das cuenta en el ejemplo lo que hago es generar una consulta de acción dentro de la base de datos con los parámetros que recibirá y en el formulario en todo caso solo le envio los parámetros.
Por otro lado el error que te arroja, debe ser porque no está tomando el idproducto al parecer, tendrias que asegurarte que estás capturando el idproducto correcto.
Lo otra diferencia es la sintaxis que muestro con lo que estás haciendo tu.
Revisa ese par de cosas y luego nos cuentas como te fue.
Saludos cordiales
Saludos Wilfredo
ResponderEliminarYa consegui que me guarde los datos, pero me guarda doble, no se porque, te dejo el codigo a ver si me das una mano.
Gracias
'GUARDAR DATOS EN LA TABLA
conexion = New System.Data.OleDb.OleDbConnection("PROVIDER = MICROSOFT.ACE.OLEDB.12.0;DATA SOURCE= C:\Documents and Settings\Administrador\Escritorio\CONTROLES EDGAR\MENUS\MENUS\Alimentacion.accdb")
Dim i As Integer
Dim reg As New System.Data.OleDb.OleDbCommand
For i = 0 To DataGridView1.Rows.Count - 1
reg.Connection = conexion
reg.CommandText = "insert into IngredientesMenus values(@Idmenu,@Idproducto,@Opcion,@Clase,@Producto,@Cantidad)"
reg.Parameters.Add(New OleDb.OleDbParameter("@Idmenu,", OleDb.OleDbType.VarChar, 15)).Value = Me.Codigomenus.Text
reg.Parameters.Add(New OleDb.OleDbParameter("@Idproducto,", OleDb.OleDbType.VarChar, 15)).Value = Me.DataGridView1.Rows(i).Cells("Codigo").Value
reg.Parameters.Add(New OleDb.OleDbParameter("@Opcion,", OleDb.OleDbType.VarChar, 60)).Value = Me.TextBox2.Text
reg.Parameters.Add(New OleDb.OleDbParameter("@Clase,", OleDb.OleDbType.VarChar, 40)).Value = Me.Label2.Text
reg.Parameters.Add(New OleDb.OleDbParameter("@Producto,", OleDb.OleDbType.VarChar, 60)).Value = Me.DataGridView1.Rows(i).Cells("Producto").Value
reg.Parameters.Add(New OleDb.OleDbParameter("@Cantidad,", OleDb.OleDbType.Double)).Value = Me.DataGridView1.Rows(i).Cells("Cantidad").Value
reg.Connection.Open()
reg.ExecuteNonQuery()
reg.Connection.Close()
Next
MsgBox("Productos Guardados Satisfactoriamente")
Saludos Wilfredo
ResponderEliminarYa me guarda los registros, pero el problema es que me guarda doble, te dejo el codigo para que me ayudes.
Gracias
conexion = New System.Data.OleDb.OleDbConnection("PROVIDER = MICROSOFT.ACE.OLEDB.12.0;DATA SOURCE= C:\Documents and Settings\Administrador\Escritorio\CONTROLES EDGAR\MENUS\MENUS\Alimentacion.accdb")
Dim i As Integer
Dim reg As New System.Data.OleDb.OleDbCommand
For i = 0 To DataGridView1.Rows.Count - 1
reg.Connection = conexion
reg.CommandText = "insert into IngredientesMenus values(@Idmenu,@Idproducto,@Opcion,@Clase,@Producto,@Cantidad)"
reg.Parameters.Add(New OleDb.OleDbParameter("@Idmenu,", OleDb.OleDbType.VarChar, 15)).Value = Me.Codigomenus.Text
reg.Parameters.Add(New OleDb.OleDbParameter("@Idproducto,", OleDb.OleDbType.VarChar, 15)).Value = Me.DataGridView1.Rows(i).Cells("Codigo").Value
reg.Parameters.Add(New OleDb.OleDbParameter("@Opcion,", OleDb.OleDbType.VarChar, 60)).Value = Me.TextBox2.Text
reg.Parameters.Add(New OleDb.OleDbParameter("@Clase,", OleDb.OleDbType.VarChar, 40)).Value = Me.Label2.Text
reg.Parameters.Add(New OleDb.OleDbParameter("@Producto,", OleDb.OleDbType.VarChar, 60)).Value = Me.DataGridView1.Rows(i).Cells("Producto").Value
reg.Parameters.Add(New OleDb.OleDbParameter("@Cantidad,", OleDb.OleDbType.Double)).Value = Me.DataGridView1.Rows(i).Cells("Cantidad").Value
reg.Connection.Open()
reg.ExecuteNonQuery()
reg.Connection.Close()
Next
MsgBox("Productos Guardados Satisfactoriamente")
Dim columna As DataGridViewColumn = New DataGridViewTextBoxColumn()
Dim columna1 As DataGridViewColumn = New DataGridViewTextBoxColumn()
Dim columna2 As DataGridViewColumn = New DataGridViewTextBoxColumn()
Me.Codigomenus.Text = ""
Me.TextBox2.Text = ""
Me.Label2.Text = ""
Me.TextBox3.Text = ""
Me.TextBox4.Text = ""
Me.TextBox5.Text = ""
BusquedaOpcionesMenus.campo = ""
Form11.campo3 = ""
DataGridView1.Columns.Clear()
Me.TextBox2.DataBindings.Clear()
Me.Label2.DataBindings.Clear()
Me.TextBox4.DataBindings.Clear()
Me.Codigomenus.Focus()
columna.Name = "CODIGO"
columna.Width = 200
columna1.Name = "PRODUCTO"
columna1.Width = 595
columna2.Name = "CANTIDAD"
columna2.Width = 150
Me.DataGridView1.Columns.Add(columna)
Me.DataGridView1.Columns.Add(columna1)
Me.DataGridView1.Columns.Add(columna2)
Saludos Wilfredo
ResponderEliminarYa me guarda los datos en la tabla, pero el problema es que me duplica, te dejo el codigo para que me ayudes. Gracias
Dim i As Integer
For i = 0 To DataGridView1.Rows.Count - 1
'Dim da As New OleDb.OleDbDataAdapter
Dim cmd As New OleDb.OleDbCommand
conexion.Open()
cmd.Connection = conexion
cmd.CommandText = "INSERT INTO IngredientesMenus (" & _
"Idmenu,Idproducto,Opcion,Clase,Producto,Cantidad " & _
") VALUES (" & _
"'" & Codigomenus.Text & "', " & _
"'" & DataGridView1.Rows(i).Cells("Codigo").Value & "', " & _
"'" & TextBox2.Text & "', " & _
"'" & Label2.Text & "', " & _
"'" & DataGridView1.Rows(i).Cells("Producto").Value & "', " & _
"'" & Val(DataGridView1.Rows(i).Cells("Cantidad").Value) & "')"
DataGridView1.Refresh()
cmd.ExecuteNonQuery()
'cmd.CommandType = CommandType.TableDirect
'da.SelectCommand = cmd
conexion.Close()
Next
Haber amigo Edgar
ResponderEliminarSi te fijas en el título del artículo dice "procedimientos almacenados", que no son otra cosa que consultas de acción dentro de la base de datos y a eso nos vamos a ceñir en estos comentarios, si sigues el ejemplo tal cual, no tendrás problemas porque si me has enviado 4 correos con código diferente para hacer lo mismo. Si me salgo del contexto del artículo voy a terminar confundiendo a los lectores.
Saludos cordiales
Hola que tal Wilfredo
ResponderEliminarEspero me puedas ayudar, mira yo no lo logro que vb guarde los datos en la tabla de access, mi base de datos cuenta con dos tablas, en una tengo que dar de alta usuarioos y en la mascota que le corresponde al usuario que voy a registrar, pero por mas que hago al darle registrar no logro que lo guarde en la base de datos :S
Espero me puedas ayudar, no se que hacer... veo que en tu publicacion haces consultas en las base de datos, es necesario hacer eso? como lo hago?
Como se hace un procedimiento almacenado en access y con conexion en java.............Porfavor podrias ayudarme con un ejemplo bien detallado, te lo agradeceria mucho....................gracias de antemano
ResponderEliminarBueno mi estimado amigo
ResponderEliminarLo que escribí en el post es lo que se puede hacer con access, exactamente no son procedimientos almacenados, porque no los soporta, es por eso que hago la aclaración que se pueden hacer algunas cosas pequeñas. Respecto a java, no podría hacerte un post detallado solo para tí, porque en primer lugar no trabajo con java, y no quisiera terminar de confundirte mas, talvez te puedan ayudar busca en www.lawebdelprogramador.com.
Saludos cordiales
Wilfredo
ResponderEliminarTe hago una consulta:
Si modificara la cadena de conexión la siguiente manera, podría acceder a una base de datos en red ? :
Dim Cone As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\server\D:\Pruebas\Pruebas.mdb;Persist security info=false")
Gracias !
Así es, porque estás indicando un recurso compartido, asi que no habrá inconveniente., claro que lo ideal sería que la cadena de conexión la leyeras desde el App.config o de algún archivo para evitar incrustar la cadena de conexión en el código de la aplicación.
ResponderEliminarHola Wilfredo, excelente blog, muy informativo.
ResponderEliminarQuisiera hacerte una consulta, estoy utilizando Access en VB.net 2008 y actualmente realizo todo por código directo. Me gusto este método por las ventajas que tiene en comparación a mi código actual.
He realizado algunas pruebas satisfactorias de "Consultas" de Access desde vb y funcionan muy bien, pero no logro hacer una consulta que funcione en access con parámetros y muestre una cantidad "n" de registros y no toda la tabla.
Tengo varias consultas del tipo: SELECT TOP 10 Nombre, Apellido FROM Clientes;
En la consulta access pongo algo así:
PARAMETERS [@Condicion] Integer;
SELECT TOP [@Condicion] Campo1, Campo2 FROM Tabla;
Me reclama "La instrucción SELECT incluye una palabra reservada, le falta un argumento o está mal escrito, o bien los signos de puntuación no son correctos. "
Si escribo: SELECT TOP 22 Campo1, Campo2 FROM Tabla; en la consulta de access, funciona sin problema, puede que sea limitante del access.
¿Sabes como hacer algo similar pero con procedimientos almacenados?
Hola Felipe Andres, solo para decirte que no es parametrizable el "n" en Access ni en SQL Server, pero para lo que tu necesitas las consultas TOP, puedes optar por hacer código desde la aplicación de esta manera no tendrás problemas, te pongo un ejemplo que te debe funcionar sin problemas y obtendrás el TOP que necesitas.
ResponderEliminarPrivate Sub BtnConsultar_Click(sender As Object, e As EventArgs) Handles BtnConsultar.Click
Try
If Conn.State = ConnectionState.Closed Then
Conn.Open()
End If
With DBComando
.CommandText = "SELECT TOP " & CInt(Me.TxtCantidad.Text) & " IdCliente, ApePaterno, ApeMaterno, Nombres From CLIENTES"
.CommandType = CommandType.Text
.Connection = Conn
End With
Dim rd As OleDbDataReader
Dim oLista As New List(Of Cliente)
Dim oClie As New Cliente
rd = DBComando.ExecuteReader
If rd.HasRows Then
While rd.Read
oClie = New Cliente
oClie.IdCliente = rd.GetString(0)
oClie.ApePaterno = rd.GetString(1)
oClie.ApeMaterno = rd.GetString(2)
oClie.Nombres = rd.GetString(3)
oLista.Add(oClie)
End While
End If
rd.Close()
Me.dgvLista.DataSource = oLista
Catch ex As Exception
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
Conn.Close()
End Try
End Sub
Si te fijas no es nada difícil, en el textbox TxtCantidad pones el numero que quieras seleccionar con el TOP (10, 20, etc), solo es cuestión de crear una clase para devolver la lista genérica con los datos y va de maravilla.
Espero te sirva.
Saludos cordiales y gracias por visitar el blog.
Estimado, gracias por tu respuesta, eso es lo que actualmente realizo con las consultas armadas directo en el código. Efectivamente no se puede incluir como parámetro, seguí buscando información del tema y vi varios comentarios con lo mismo.
EliminarVoy a guardar su ejemplo para futuras referencias, esta muy bueno.
Le agradezco su tiempo y dedicación, que tenga Feliz año nuevo.
Hola por casualidad tienes un ejemplo de procedimientos para ser usado con el control DataBindings. Gracias
ResponderEliminarjajajaja bien hecho Wilfredo, este post aunque es viejito no esta desfasado aun, me ha servido para un formulario de ingreso de nuevos empleados en mi sistema, la unica variante fue hacer que algunas variables que se usan frecuentemente como el de la conexion a la base de datos, las he declarado de manera global desde un modulo de tal manera que puedo mandarlas a llamar desde cualquier parte del sistema sin necesidad de escibir todo su codigo.
ResponderEliminarSaludos y gracias por el aporte
Pues gracias por visitar el blog y que bueno que te haya servido.
ResponderEliminarSaludos cordiales
Hola, disculpa podrías ayudarme a sincronizar una base de datos creada en access 2013 a visual studio 2010 y una vez sincronizada que busque los datos desde un textbox? por favor y de antemano gracias.
ResponderEliminarRosendo Rodríguez
3h_chendo@hotmail.com
Sincronizar?, No entiendo bien que es lo que pretendes, ya que visual studio es un IDE de desarrollo, pero no entiendo lo de sincronizar la base con el visual studio.
ResponderEliminarSi fueras mas específico y explicaras con mas claridad te podría ayudar.
Otra cosa, tu correo está bien escrito?, ya que intenté responderte por allí y dice que no existe.
ah disculpa es hhh_chendo@hotmail.com, espero tu respuesta
ResponderEliminarHola, tengo una duda las consultas de acción son tambien para la web?
ResponderEliminarSi tu aplicación web necesita ejecutar una consulta de acción igualmente se ejecutará, recuerda que al ser una aplicación en capas, la capa de acceso a datos recibirá una petición y no sabrá si lo pidió una aplicación web o de escritorio.
ResponderEliminarSaludos cordiales
Buenas noches don Wilfredo, hace poco menos de 2 años me hizo el favor de orientarme en còmo administrar una base de datos en access 2003 para el desarrollo de un sistema para moteles. Èste ha trabajado de manera òptima, sin embargo surge la necesidad de actualizar el sistema pero ya para un hotel en forma, donde opere las habitaciones, reservaciones, restaurante e ingresos de los empleados. Sè que access me puede dar soporte sin embargo creo que es tiempo de migrar a SQL server. Me gustarìa su opiniòn y consejos pues las veces que lo he solicitado han sido de gran ayuda. Gracias por ello.
ResponderEliminarBuenas noches don Wilfredo, hace poco menos de 2 años me hizo el favor de orientarme en còmo administrar una base de datos en access 2003 para el desarrollo de un sistema para moteles. Èste ha trabajado de manera òptima, sin embargo surge la necesidad de actualizar el sistema pero ya para un hotel en forma, donde opere las habitaciones, reservaciones, restaurante e ingresos de los empleados. Sè que access me puede dar soporte sin embargo creo que es tiempo de migrar a SQL server. Me gustarìa su opiniòn y consejos pues las veces que lo he solicitado han sido de gran ayuda. Gracias por ello.
ResponderEliminarHola Guillermo.
ResponderEliminarQue bueno saber de tí nuevamente.
Pues fíjate que lo mejor que has pensado en cuanto a migrar a SQL Sever.
No se si piensas hacer todo desde cero reescribiendo tu aplicación o solo la base de datos. Si solo es la base de datos pues solo es cosa de planificar esa migración verificando que la data pase sin problemas, para ello te puede ayudar mucho SSMA para access, el cual lo puedes descargar de manera gratuita desde acá:
https://www.microsoft.com/en-us/download/details.aspx?id=42656
Haz las pruebas necesarias y luego nos cuentas como te fue.
Si necesitas reescribir la aplicación pues ahora se hace mucho mas sencillo que hace unos años, ya que tienes a tu disposición Entity Framework que la parte de acceso a datos lo hace por tí, y mejor aún si prefieres hacerla web con ASP.NET MVC, con entity Framework, hasta las vistas te genera, así que no te desanimes, adelante, cualquier cosa solo me escribes.
Saludos cordiales,
Gracias por contestarme y darme, como siempre, la mejor alternativa y las mejores alternativas. Lo voy a hacer desde cero para tener un mejor control y aprovechar las ventajas que ahora se ofrece.
EliminarUna pregunta màs. Que tan conveniente es usar sql express 2014 para crear la base de datos nueva. Las personas tiene movimiento de unas 60 habitaciones diarias con 25 o 30 de las mismas con service room y operan sus empleados en turnos de 12 horas.
ResponderEliminarPues para gestionar esa cantidad de información y operaciones, es mas que suficiente, ya que SQL Server Express 2014, tiene una capacidad de almacenamiento de hasta 10 gigas por base de datos, así que por ese lado no tendrías problemas, no se cuantos usuarios concurrentes vayas a tener, pero como referencia te puedo contar que tengo una aplicación de cuentas corrientes en una oficina de cobranzas, con un promedio de 12 terminales en ventanillas en simultáneo y está soportado por SQL Server express y va sin problemas y ya lleva unos cuantos años, ya que empezó con SQL Server express 2005, y antes de eso estuvo con una base de datos access, se hizo la migración, mejoraron en un 90% los tiempos de respuesta, los procesos de facturación que son los mas largos cada fin de mes no pasa de 7 minutos y claro que son solo 12 mil clientes y hay un poco de lógica alli porque verifica si ya le facturaron por adelantado a un cliente, si tuvo corte de servicio, reposición de servicio y temas como que si va a pagar completo o fracción, entonces todo ese proceso lo hace en el lado del servidor y tranquilo, pero para lo que era antes con access pues el asunto va muy bien. Así que adelante no te desanimes ni te asustes, cualquier cosa estoy a tu disposición.
ResponderEliminarSaludos cordiales,
Gracias don Wilfredo. Ya estoy creando desde cero la base de datos. Tengo mucho del programa avanzado pero en access. Lo unico que va a quedar pendiente es que cuando lo termine tengo que instalar la base de datos y el programa en un servidor que tiene Microsoft SQL Server 12R Standar. Voy a hacer lo mismo que con el de los moteles, crear un disco de instalaciòn e instalarlo, valga la redundacia, en el servidor. ¿Ahì tambièn tengo que instalar el sql server express como en la computadora del usuario antes instalaba access?
ResponderEliminarHaber si me dices que tienes un servidor con SQL Server 2012 R2 estándard, ya no tiene sentido instalar el express, puedes usar el 2012 R2, solamente crar el script de creación de la base de datos completa y ejecutarlo en el servidor, con lo cual quedará tu base de datos lista en el servidor.
ResponderEliminarLa aplicación si tendrás que generar tu instalador e instalarlo en los terminales de los usuarios. En cuanto a lo de access, tampoco es necesario instalar access en cada terminal, solo es cosa de poner la base de datos en una carpeta compartida y la aplicacion debe apuntar a la base de datos en esa carpeta compartida y listo, todo debe funcionar sin problemas. Para el caso de SQL Server es lo mismo, la aplicación debe tener configurado en la cadena de conexion la dirección del servidor y puerto respectivo y todo irá bien.
Cualquier otra duda, solo me escribes.
Saludos cordiales.
Buenas tardes. Me expliquè mal. El access solo lo ocupo en el programa de moteles. Este con el sql va a ser para un hotel. Mi duda es que la base de datos la voy a crear en mi computadora junto con el programa. Al terminarlo tengo que poner la base de datos en el servidor para que los usuarios de recepciòn, ama de llaves y administraciòn accesen a ella. Estoy terminando el desarrollo del còdigo del programa en mi computadora. Mi pregunta es si la base de datos, con la ruta correspondiente puedo llevarla de mi computadora al servidor mediante una "instalacion".
ResponderEliminarNo, no es así como lo piensas, cuando se trabaja con SQL Server, la base de datos se debe implementar en el servidor, y la aplicación se debe instalar con su instalador, pero sola, y al momento de implementar, puedes configurar la cadena de conexión que apunte a la base de datos en el servidor, pero no se puede llevar la base de datos como un archivo de access, que si se podría hacer, ya que SQL Server, es un servidor que debe estar corriendo y configurado por separado, tu base de datos que estás creando en tu pc, cuando ya esté lista, tiene la opción de generar un script que lo puedes llevar y correr en el servidor y te dejará la base creada en el servidor tal y como lo tienes en tu pc que estás desarrollando.
ResponderEliminarCualquier otra duda, solo me escribes.
Saludos cordiales,
PD: No se si lo estés haciendo en capas y orientado a objetos que sería mucho mas mantenible y ordenado, lo cual se te haría mas sencillo pasar a web, con solo agregar una capa cliente web y reutilizarías toda la lógica de negocio y acceso a datos que ya tienes en la aplicaicón de escritorio.
Buenas noches Don Wilfredo. Nuevamente Guillermo Torres. Terminé de desarrollar el programa e hice la base de datos en sql server express 2014 instalada en una pc que configurè como servidor, instalandole el MS Server 2012 standar. Hice las pruebas pero me fallan algunos procesos pues no acceso a ella. En mi ignorancia, he probado crear la cadena empleando Base de datos basada en servicio; ADO.NET y Conjunto de datos al desarrollar los dataset y en los 3 tengo problemas de comunicación. Me doy a explicar? Sé que estoy haciendo algo mal, pues cuando corro el programa en una base de datos sql local no me falla nada. Qué me aconseja.
ResponderEliminarHola Guillermo.
ResponderEliminarAgrégame al skype para poder conversar mas fluido y poderte ayudar mejor en este asunto, ya que por mensajes estamos un poco adivinando.
Agregame como wilfredopatricio@outlook.com, o búscame como Wilfredo Patricio Castillo, y cuando veas este mismo logo, me agregas y conversamos.
Saludos cordiales,
UNA PRUGUNTA COM SERIA.. EL CODIGO PARA UN SELECT. CON LOS MISMO CAMPOR QUE TIENES PARA EL INSERT
ResponderEliminarHola Freddy Orozco, gracias por visitar el blog.
ResponderEliminarLo que pides es sencillo, como este ejemplo trata de hacer los "procedimientos" en la base de datos, quedarías mas o menos así:
PARAMETERS [@Codigo] Text(10);
SELECT Codigo,Nombre Direccion From Clientes WHERE Codigo=@Codigo
Eso sería todo, y la manera de llamarlo está allí arriba donde dice como Buscar.
Saludos cordiales,
muy bueno el articulo, a ver si me puedes ayudar, tengo una app en wpf c#, que consulta 4 tablas, cuyo resultado se muestra en un datagrid, quisiera saber si puedo hacer un procedimiento almacenado que me simplifique un poco el codigo, el codigo que uso es este:
ResponderEliminarstring cadenaselect = "SELECT pacientes.id, pacientes.nombre, pacientes.appat, pacientes.apmat, pacientes.fechanac, pacientes.edad, pacientes.sexo, pacientes.rfc, pacientes.curp, pacientes.calle, pacientes.num_ext, pacientes.colonia, pacientes.delegacion, pacientes.estado, pacientes.cp, pacientes.edocivil, pacientes.ocupacion, pacientes.telefono, pacientes.email, pacientes.fechaing, pacientes.noexp, pacientes.noafil, pacientes.referido, pacientes.rutafoto, antecedentes.afdiab, antecedentes.afcard, antecedentes.afhiper, antecedentes.afneop, antecedentes.afvarices, antecedentes.afotros, antecedentes.appdiab, antecedentes.appcard, antecedentes.apphiper, antecedentes.apphcol, antecedentes.appob,antecedentes.appinf, antecedentes.apptvp, antecedentes.grhblood, antecedentes.apnpalcoh, antecedentes.apnptab, antecedentes.appnptoxi, antecedentes.apnpalerg, antecedentes.apnpgineco_m, antecedentes.apnpgineco_c, antecedentes.apnpgineco_g, antecedentes.apnpgineco_p, antecedentes.apnpgineco_fum, antecedentes.apnpgineco_fup, antecedentes.apnpantqx, antecedentes.apnpfactriesg FROM pacientes INNER JOIN antecedentes ON pacientes.id = antecedentes.idpac";
OleDbConnection cn = new OleDbConnection(ConfigurationManager.ConnectionStrings["medikfile.Properties.Settings.remunmedikcon"].ToString());
try
{
cn.Open();
OleDbCommand sc = new OleDbCommand(instruccion, cn);
OleDbDataAdapter da = new OleDbDataAdapter(sc);
DataSet ds = new DataSet("TitlesDS");
da.Fill(ds);
dg.ItemsSource = ds.Tables[0].DefaultView;
cn.Close();
}
catch (Exception ex)
{ Console.WriteLine("{0} error de conexion", ex); }
finally
{ }
Hola Wilfredo, buenos días. Estoy utilizando tu forma de trabajo para una aplicacion en VB.net con base de datos en ACCESS, me parece muy practica la idea de poder modificar los procedimientos desde la base una vez desplegado el programa.
ResponderEliminarTe consulto porque tengo un problema al ejecutar el procedimiento almacenado, el cual es un UPSER con datos tomados de un datagrid, me aparece un cartel que dice:
"No se puede leer ningun registro; no tiene permiso para READ en 'msysobjects'."
Entiendo que no estoy conectandome como administrador o algo por el estilo.
Si pudieras guiarme, te agradecería.
Hola Claudio, para eso el buen Enrique Martínez, en su momento escribió esto, dale una, mirada y te ayudará mucho.
ResponderEliminarhttps://social.msdn.microsoft.com/Forums/lync/es-ES/376b03c9-555f-4b44-bfb9-dc001247b543/error-en-funcinquotno-se-puede-leer-ningn-registroquot
Espero te ayuda a solucionar tu problema.
Saludos cordiales,
Wilfredo.