Añadir valores a un cuadro combinado
Quiero añadir campos a un cuadro combinado de empresas, el cual actualiza otro con la zona de l a empresa correspondiente, lo que quiero es lo siguiente: que al capturar el nombre de una empresa y no exista, me pregunte que si la quiero añadir al catalogo de empresas con su respectiva zona, no tengo idea de como hacerlo ya que no tengo conocimientos de visual basic y a ver si me puedes pasar algún manual gratuito que este realmente bueno, ya que no he encontrado ninguno.
1 respuesta
Respuesta de madern
1
1
Para saber si un usuario ha seleccionado un registro que no existe en un combobox se utiliza el evento NotInList
Por ejemplo:
Private Sub cmbEmpresa_NotInList(NewData As String, Response As Integer)
Dim dbs as database, strSql as string
Dim Campo1, Campo2, Campo3
Const cTabla as string ="tblEmpresa"
'Evitamos que Access muestre un mensaje..
Response=False
if msgbox("Desea agregar el registro " & newdata & "?",vbquestion + vbyesno,"Registro inexistente")=Vbyes then
'Es momento de dar de alta el registro en la tabla..
'Debemos preguntar el valor de cada campo...
campo1=inputbox("Valor para el campo1")
campo2=inputbox("Valor para el campo2")
campo3=newdata
set dbs=currentdb
strSQL="INSERT INTO " & ctabla & " (Campo1, Campo2, Campo3) VALUES (" & _
Campo1 & ", " & _
Campo2 & ", " & _
Campo3 & ")"
dbs.Execute strSql, dbFailOnError
'Actualizar lista
cmbEmpresa.Requery
'Desplegar lista..
cmbEmpresa.DropDown
end if
End Sub
Respecto al manual, te remito a la página..
Guille. Costasol.net es quizás de los mejores que hay en la red sobre Visual Basic.. en esa página podrás encontrar cursos por capítulos de visual basic.
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Por ejemplo:
Private Sub cmbEmpresa_NotInList(NewData As String, Response As Integer)
Dim dbs as database, strSql as string
Dim Campo1, Campo2, Campo3
Const cTabla as string ="tblEmpresa"
'Evitamos que Access muestre un mensaje..
Response=False
if msgbox("Desea agregar el registro " & newdata & "?",vbquestion + vbyesno,"Registro inexistente")=Vbyes then
'Es momento de dar de alta el registro en la tabla..
'Debemos preguntar el valor de cada campo...
campo1=inputbox("Valor para el campo1")
campo2=inputbox("Valor para el campo2")
campo3=newdata
set dbs=currentdb
strSQL="INSERT INTO " & ctabla & " (Campo1, Campo2, Campo3) VALUES (" & _
Campo1 & ", " & _
Campo2 & ", " & _
Campo3 & ")"
dbs.Execute strSql, dbFailOnError
'Actualizar lista
cmbEmpresa.Requery
'Desplegar lista..
cmbEmpresa.DropDown
end if
End Sub
Respecto al manual, te remito a la página..
Guille. Costasol.net es quizás de los mejores que hay en la red sobre Visual Basic.. en esa página podrás encontrar cursos por capítulos de visual basic.
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Ya prove la solución y no me queda muy claro a que se refiere esta parte:
'Debemos preguntar el valor de cada campo...
campo1=inputbox("Valor para el campo1")
campo2=inputbox("Valor para el campo2")
campo3=newdata
set dbs=currentdb
Ya que haciendo pruebas al ingresar un valor nuevo en el combo me piede valores y me saca un error en "set dbs=currentdb", donde dice que no coinciden los tipos.
Espero me puedas ayuar. GRacias de antemano
'Debemos preguntar el valor de cada campo...
campo1=inputbox("Valor para el campo1")
campo2=inputbox("Valor para el campo2")
campo3=newdata
set dbs=currentdb
Ya que haciendo pruebas al ingresar un valor nuevo en el combo me piede valores y me saca un error en "set dbs=currentdb", donde dice que no coinciden los tipos.
Espero me puedas ayuar. GRacias de antemano
Fíjate bien de haber dimensionado correctamente la variable dbs. Debe ser del tipo DataBase.
Lo de los inputbox es para obtener el valor de cada campo del nuevo registro a agregar. Sólo es necesario si además del código indicado por el usuario necesitas más datos para dar de alta el registro.
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Lo de los inputbox es para obtener el valor de cada campo del nuevo registro a agregar. Sólo es necesario si además del código indicado por el usuario necesitas más datos para dar de alta el registro.
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Pues ya revise bien la variable dbs. del tipo Database, y me sigue sacando el mismo error, no encuentro la solución, ¿tu qué dices?
Acabo de contestar a una pregunta que es posible que te pase a ti también.
Verifica las referencias de la base de datos. Debes tener referenciado Microsoft Dao 3.6 en lugar de Microsoft ActiveX Data Objects.
Seguramente es esto. Desde la versión 2000 hace referencia a ésta en lugar de la del DAO.
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Verifica las referencias de la base de datos. Debes tener referenciado Microsoft Dao 3.6 en lugar de Microsoft ActiveX Data Objects.
Seguramente es esto. Desde la versión 2000 hace referencia a ésta en lugar de la del DAO.
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Así es amigo, esa es la solución a ese error, pero ahora me manda otro en esta parte dbs.Execute strSql, dbFailOnError, me parece que no estoy nombrando bien los campos, me podrías esecificar donde va cada control y cada campo de la tabla empresa.
Gracias
Gracias
Quien lo diría... hoy tienes asistencia en línea... :)
Para responderte necesito saber los campos de la tabla y los valores a agregar..
Pero haremos un supuesto...
Suponemos la tabla tblEmpresa, con los campos...
IdEmpresa --- Autonumérico
CodigoEmpresa -- Entero Largo
NombreEmpresa -- Texto
Cuando un usuario indica un código de empresa que no existe, es cuando preguntamos al usuario si quiere agregarlo.. el valor de Código de empresa lo tenemos en la variable NewData del evento NotInList.
Ahora nos falta saber el nombre de la empresa y lo preguntaremos a través de un inputbox
Dim strNombreEmpresa as string
strNombreEmpresa=InputBox("Indique el nombre de la empresa")
y ahora creamos la sentencia sQL.
strSQL="INSERT Into tblEmpresa (Codigo, NombreEmpresa) VALUES (" & _
newdata & ", '" & strnombreempresa & "')"
set dbs=currentdb
Dbs. Execute strsql, dbfailonerror
Con esto debería funcionarte. Si no te funciona, pásame el código para ver los nombres de los campos y cómo estas indicando los valores asignados.
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Para responderte necesito saber los campos de la tabla y los valores a agregar..
Pero haremos un supuesto...
Suponemos la tabla tblEmpresa, con los campos...
IdEmpresa --- Autonumérico
CodigoEmpresa -- Entero Largo
NombreEmpresa -- Texto
Cuando un usuario indica un código de empresa que no existe, es cuando preguntamos al usuario si quiere agregarlo.. el valor de Código de empresa lo tenemos en la variable NewData del evento NotInList.
Ahora nos falta saber el nombre de la empresa y lo preguntaremos a través de un inputbox
Dim strNombreEmpresa as string
strNombreEmpresa=InputBox("Indique el nombre de la empresa")
y ahora creamos la sentencia sQL.
strSQL="INSERT Into tblEmpresa (Codigo, NombreEmpresa) VALUES (" & _
newdata & ", '" & strnombreempresa & "')"
set dbs=currentdb
Dbs. Execute strsql, dbfailonerror
Con esto debería funcionarte. Si no te funciona, pásame el código para ver los nombres de los campos y cómo estas indicando los valores asignados.
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
jajaja, pues aprovechando la asistencia...
Es una tabla empresas con una relación a una tabla zonas de empresas
Con los siguientes campos:
Tabla empresas
IDempresa-------autonumérico
Nombre empresa-------texto
Zona empresa-------numérico
Tabla zonas de empresas
IDzona---------autonumérico
Nombre zona--------texto
En el formulario al escoger una empresa, me selecciona automáticamente la zona a la que pertenece, entonces cuando un usuario indica una empresa que no existe, quiero que la agregue a la tabla y al combo, con su respectiva zona.
Espero te quede más claro.
Gracias por tu tiempo, enserio te lo agradezco, porque ya me estoy rompiendo la cabeza después de muchos días de tratar de resolver este detalle.
Es una tabla empresas con una relación a una tabla zonas de empresas
Con los siguientes campos:
Tabla empresas
IDempresa-------autonumérico
Nombre empresa-------texto
Zona empresa-------numérico
Tabla zonas de empresas
IDzona---------autonumérico
Nombre zona--------texto
En el formulario al escoger una empresa, me selecciona automáticamente la zona a la que pertenece, entonces cuando un usuario indica una empresa que no existe, quiero que la agregue a la tabla y al combo, con su respectiva zona.
Espero te quede más claro.
Gracias por tu tiempo, enserio te lo agradezco, porque ya me estoy rompiendo la cabeza después de muchos días de tratar de resolver este detalle.
Vamos a ver si ahora te funciona...
Entiendo que en el combo, el usuario escribe el nombre de una empresa que no existe...
Por consiguiente:
strNombreEmpresa = NewData
Lo que necesitamos preguntar es el número de zona... pero claro... el usuario no sabrá el Id de la zona... por consiguiente pediremos el nombre de zona...
strNombreZona = InputBox("Indique el nombre de la zona asociada")
'Ahora debemos buscar el Id de la zona...
lngIdZona = Nz(DLookup("IdZona", "NombreTablaZona", "NombreZona='" & strNombreZona & "'"), 0)
Y ahora podriamos agregar la empresa...
el código del evento entero sería...
Private Sub cmbEmpresa_NotInList(NewData As String, Response As Integer)
Const cTabla As String = "tblEmpresa"
Dim dbs As Database, strSql As String
Dim strNombreEmpresa As String, strNombreZona As String, lngIdZona As Long
'Llenamos el nombre de la empresa..
strNombreEmpresa = NewData
'Pedimos el nombre de la zona..
strNombreZona = InputBox("Indique el nombre de la zona asociada")
'Verificamos que nos hayan indicado una zona...
If strNombreZona = "" Then
MsgBox "No se ha indicado ninguna zona." & vbCrLf & "Imposible agregar la empresa.", vbCritical
Exit Sub
End If
lngIdZona = Nz(DLookup("IdZona", "NombreTablaZona", "NombreZona='" & strNombreZona & "'"), 0)
'Verificamos que la zona indicada exista...
If lngIdZona = 0 Then
MsgBox "La zona indicada no existe." & vbCrLf & "Imposible agregar la empresa", vbCritical
Exit Sub
End If
'Cargamos la sentencia SQL ...
strSql = "INSERT INTO " & cTaula & " ([Nombre Empresa], [Zona Empresa]) VALUES (" & _
"'" & strNombreEmpresa & ", " & _
lngIdZona & ")"
'Cargamos base de datos actual...
Set dbs = CurrentDb
'Ejecutamos sentencia SQL...
On Error Resume Next
dbs.Execute strSql, dbFailOnError
'verificamos si ha existido algún error
If Err Then
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical
Exit Sub
End If
'Cerramos base de datos..
dbs.Close: Set dbs = Nothing
'Actualizamos combobox
Screen.ActiveControl.Requery
Exit Sub
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Entiendo que en el combo, el usuario escribe el nombre de una empresa que no existe...
Por consiguiente:
strNombreEmpresa = NewData
Lo que necesitamos preguntar es el número de zona... pero claro... el usuario no sabrá el Id de la zona... por consiguiente pediremos el nombre de zona...
strNombreZona = InputBox("Indique el nombre de la zona asociada")
'Ahora debemos buscar el Id de la zona...
lngIdZona = Nz(DLookup("IdZona", "NombreTablaZona", "NombreZona='" & strNombreZona & "'"), 0)
Y ahora podriamos agregar la empresa...
el código del evento entero sería...
Private Sub cmbEmpresa_NotInList(NewData As String, Response As Integer)
Const cTabla As String = "tblEmpresa"
Dim dbs As Database, strSql As String
Dim strNombreEmpresa As String, strNombreZona As String, lngIdZona As Long
'Llenamos el nombre de la empresa..
strNombreEmpresa = NewData
'Pedimos el nombre de la zona..
strNombreZona = InputBox("Indique el nombre de la zona asociada")
'Verificamos que nos hayan indicado una zona...
If strNombreZona = "" Then
MsgBox "No se ha indicado ninguna zona." & vbCrLf & "Imposible agregar la empresa.", vbCritical
Exit Sub
End If
lngIdZona = Nz(DLookup("IdZona", "NombreTablaZona", "NombreZona='" & strNombreZona & "'"), 0)
'Verificamos que la zona indicada exista...
If lngIdZona = 0 Then
MsgBox "La zona indicada no existe." & vbCrLf & "Imposible agregar la empresa", vbCritical
Exit Sub
End If
'Cargamos la sentencia SQL ...
strSql = "INSERT INTO " & cTaula & " ([Nombre Empresa], [Zona Empresa]) VALUES (" & _
"'" & strNombreEmpresa & ", " & _
lngIdZona & ")"
'Cargamos base de datos actual...
Set dbs = CurrentDb
'Ejecutamos sentencia SQL...
On Error Resume Next
dbs.Execute strSql, dbFailOnError
'verificamos si ha existido algún error
If Err Then
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical
Exit Sub
End If
'Cerramos base de datos..
dbs.Close: Set dbs = Nothing
'Actualizamos combobox
Screen.ActiveControl.Requery
Exit Sub
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Madern, ya probé tu solución y todo jala bien hasta que le ingreso el nobre de la zona en el inputbox, ya que me saca un mensaje:
Error 3075 de sintaxis en la cadena de la expresión de consulta", 1)'.
Que paso ya lo revise y estoy casi seguro que todo lo puse bien.
Error 3075 de sintaxis en la cadena de la expresión de consulta", 1)'.
Que paso ya lo revise y estoy casi seguro que todo lo puse bien.
Cópiame todo el código que pones dentro del evento NotInList y pásamelo..
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Antes de enviarme nada...
Los nombres de las tablas y campos NUNCA deberían contener espacios en blanco... si los contienen en las cadenas de SQL y consultas debe especificarse el nombre de la tabla y/o campo entre corchetes...
"Mi Campo=" provocaría un error
"[Mi Campo]=" sería lo correcto..
Es posible que este sea el error que te encuentras.
Ya me dirás algo.
otra cosa... en mi código anterior he finalizado el evento con exit sub... verifica que termine con End Sub
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Los nombres de las tablas y campos NUNCA deberían contener espacios en blanco... si los contienen en las cadenas de SQL y consultas debe especificarse el nombre de la tabla y/o campo entre corchetes...
"Mi Campo=" provocaría un error
"[Mi Campo]=" sería lo correcto..
Es posible que este sea el error que te encuentras.
Ya me dirás algo.
otra cosa... en mi código anterior he finalizado el evento con exit sub... verifica que termine con End Sub
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Carai...
Cuando te pasé el código había un error, que es el que te estaba provocando a ti...(esto pasa por enviaros código sin ni siquiera probarlo... y es que a veces uno se cree que es el mejor de los mejores... y aún no...)
Te paso el código revisado y probado en una base de datos... lamento el retraso...
Private Sub cmbEmpresa_NotInList(NewData As String, Response As Integer)
Const cTabla As String = "Empresas"
Dim dbs As Database, strSql As String
Dim strNombreEmpresa As String, strNombreZona As String, lngIdZona As Long
Response = False
'Llenamos el nombre de la empresa..
strNombreEmpresa = NewData
'Pedimos el nombre de la zona..
strNombreZona = InputBox("Indique el nombre de la zona asociada")
'Verificamos que nos hayan indicado una zona...
If strNombreZona = "" Then
MsgBox "No se ha indicado ninguna zona." & vbCrLf & "Imposible agregar la empresa.", vbCritical
Exit Sub
End If
lngIdZona = Nz(DLookup("IdZona", "Zonas de Empresas", "[Nombre Zona]=" & "'" & strNombreZona & "'"), 0)
'Verificamos que la zona indicada exista...
If lngIdZona = 0 Then
MsgBox "La zona indicada no existe." & vbCrLf & "Imposible agregar la empresa", vbCritical
Exit Sub
End If
'Cargamos la sentencia SQL ...
strSql = "INSERT INTO " & cTabla & " ([Nombre Empresa], [Zona Empresa]) VALUES (" & _
"'" & strNombreEmpresa & "', " & _
lngIdZona & ")"
'Cargamos base de datos actual...
Set dbs = CurrentDb
'Ejecutamos sentencia SQL...
On Error Resume Next
dbs.Execute strSql, dbFailOnError
'verificamos si ha existido algún error
If Err Then
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical
Exit Sub
End If
'Cerramos base de datos..
dbs.Close: Set dbs = Nothing
'Actualizamos combobox
cmbEmpresa = Null
cmbEmpresa.Requery
'Obtener Id de la empresa que acabamos de agregar...
cmbEmpresa = Nz(DLookup("IdEmpresa", "Empresas", "[Nombre Empresa] = '" & strNombreEmpresa & "'"), 0)
End Sub
Ahora sí que funciona... :)
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
Cuando te pasé el código había un error, que es el que te estaba provocando a ti...(esto pasa por enviaros código sin ni siquiera probarlo... y es que a veces uno se cree que es el mejor de los mejores... y aún no...)
Te paso el código revisado y probado en una base de datos... lamento el retraso...
Private Sub cmbEmpresa_NotInList(NewData As String, Response As Integer)
Const cTabla As String = "Empresas"
Dim dbs As Database, strSql As String
Dim strNombreEmpresa As String, strNombreZona As String, lngIdZona As Long
Response = False
'Llenamos el nombre de la empresa..
strNombreEmpresa = NewData
'Pedimos el nombre de la zona..
strNombreZona = InputBox("Indique el nombre de la zona asociada")
'Verificamos que nos hayan indicado una zona...
If strNombreZona = "" Then
MsgBox "No se ha indicado ninguna zona." & vbCrLf & "Imposible agregar la empresa.", vbCritical
Exit Sub
End If
lngIdZona = Nz(DLookup("IdZona", "Zonas de Empresas", "[Nombre Zona]=" & "'" & strNombreZona & "'"), 0)
'Verificamos que la zona indicada exista...
If lngIdZona = 0 Then
MsgBox "La zona indicada no existe." & vbCrLf & "Imposible agregar la empresa", vbCritical
Exit Sub
End If
'Cargamos la sentencia SQL ...
strSql = "INSERT INTO " & cTabla & " ([Nombre Empresa], [Zona Empresa]) VALUES (" & _
"'" & strNombreEmpresa & "', " & _
lngIdZona & ")"
'Cargamos base de datos actual...
Set dbs = CurrentDb
'Ejecutamos sentencia SQL...
On Error Resume Next
dbs.Execute strSql, dbFailOnError
'verificamos si ha existido algún error
If Err Then
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical
Exit Sub
End If
'Cerramos base de datos..
dbs.Close: Set dbs = Nothing
'Actualizamos combobox
cmbEmpresa = Null
cmbEmpresa.Requery
'Obtener Id de la empresa que acabamos de agregar...
cmbEmpresa = Nz(DLookup("IdEmpresa", "Empresas", "[Nombre Empresa] = '" & strNombreEmpresa & "'"), 0)
End Sub
Ahora sí que funciona... :)
Saludos.
Jordi Pérez i Madern
Mataró (Barcelona)
- Compartir respuesta
- Anónimo
ahora mismo