Crear registro en formulario con datos de otro formulario

Tengo un pequeño problema: Tengo una tabla de Clientes con un formulario a través del cual introduzco nuevos clientes. Además tengo otra tabla de contactos con otro formulario asociado. En el formulario contactos voy introduciendo datos de posibles clientes. En este formulario he creado un botón denominado "Crear_Cliente" para que cuando un contacto se convierte en cliente, cree un nuevo registro en el Formulario de los clientes (Tabla_Clientes) e inserte un nuevo registro con los valores que tenemos de ese contacto. Una vez creado, quiero que tome el valor Referencia del cliente (Es un autonumérico, por lo que no toma valor hasta que se guarda el registro) y lo asocie al contacto. Es una forma de asociar el contacto inicial con el cliente definitivo.

He creado el siguiente código:

Private Sub Crear_Cliente_Click()
Dim Nombre_Comercial As String
Dim Captura_Cliente As String
Dim Direccion As String
Dim Codigo_postal As String
Dim Poblacion As String
Dim Provincia As String
Dim Email As String
Dim Web As String
Dim Telefono As String
Dim Contactos As String
Dim Id_Cliente As Integer
'Toma de valores
Nombre_Comercial = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Nombre_Comercial]
Captura_Cliente = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Captura_Cliente]
Direccion = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Direccion]
Codigo_postal = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Codigo_postal]
Poblacion = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Poblacion]
Provincia = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Provincia]
Email = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![E-mail]
Web = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Web]
Telefono = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Telefono]
Contactos = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Contactos]
'Abrimos el Formulario "Tabla_Clientes"
DoCmd.OpenForm ("Tabla_Clientes")
'Añadimos un nuevo registro
DoCmd.GoToRecord , , acNewRec
If Nombre_Comercial = Null Then
Else
    Forms![Tabla_Clientes]![Nombre] = Nombre_Comercial
End If
Forms![Tabla_Clientes]![Fecha Alta] = Date
Forms![Tabla_Clientes]![Punto de venta] = True
Forms![Tabla_Clientes]![Captura_Cliente] = Captura_Cliente
If Direccion = Null Then
Else
    Forms![Tabla_Clientes]![Direccion] = Direccion
End If
If Codigo_postal = Null Then
Else
    Forms![Tabla_Clientes]![Codigo postal] = Codigo_postal
End If
If Poblacion = Null Then
Else
    Forms![Tabla_Clientes]![Población] = Poblacion
End If
If Provincia = Null Then
Else
    Forms![Tabla_Clientes]![Provincia_Facturas] = Provincia
End If
If Email = Null Then
Else
    Forms![Tabla_Clientes]![E-mail] = Email
End If
If Web = Null Then
Else
    Forms![Tabla_Clientes]![Web] = Web
End If
If Telefono = Null Then
Else
    Forms![Tabla_Clientes]![Telefono] = Telefono
End If
If Contactos = Null Then
Else
    Forms![Tabla_Clientes]![Subformulario Contactos_Clientes].Form![Nombre] = Contactos
End If
'Grabamos el registro creado
DoCmd.RunCommand acCmdSaveRecord
'Tomamos el valor de Referencia (autonumerico)
Id_Cliente = Forms![Tabla_Clientes]![Referencia] = Id_Cliente
'Introducimos el valor Referencia en el campo correpondiente del Formulario "Contactos"
Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Id_Cliente] = Id_Cliente
DoCmd.RunCommand acCmdSaveRecord
End Sub

El problema es que al abrir el Formulario Tabla_Clientes, no crea un nuevo registro, y me inserta los valores en el primer registro que tengo creado. Por otro lado, no toma el valor autonumérico de la referencia del cliente y el valor que inserta en el contacto como referencia es 0.

¿Dónde me he equivocado?

2 Respuestas

Respuesta
2

Te juro que me he perdido con tanto código. En el formulario Contactos puedes poner, por ejemplo, un botón y en el evento al hacer clic poner

docmd.setwarnings false

docmd.runsql"insert into clientes(referencia,nombre_comercial, dirección,....)values(" & me.idcontacto, & ", '" & me.nombre_comercial& "', '"  & me.direccion & "',....)

Los campos de origen y destino no tienen porque llamarse igual pero si que el tipo de datos sea compatible

Si no quieres poner eso puedes poner

docmd.setwarnings false

docmd.runsql"insert into clientes select nombre_comercial, captura_cliente,direccion,....from contactos where idcontacto=" & me.idcontacto""

Suponiendo que el índice de la tabla contactos se llame así

Y como le estas diciendo que lo inserte, te lo añadirá como registro nuevo.

No me extraña, yo mismo me he perdido ;-)

Te resumo lo que quiero hacer:

Tengo un formulario (Formulario Contactos) donde voy dando de alta posibles clientes con los que establezco un contacto. Una vez éste cliente se convierte en cliente definitivo, lo doy de alta en la tabla clientes, a través de otro formulario denominado "Tabla_Clientes".

Mi intención es mecanizarlo, de forma que en vez de tener que dar de alta al nuevo cliente, con pulsar un botón el formulario de Contactos, me introduzca el registro del nuevo cliente en el Formulario "Tabla_Clientes".

Mi lógica era la siguiente:

1) Tomo los valores de los campos del Registro en el Formulario de contactos.

2) Abro el formulario de Clientes

3) Inserto un nuevo registro

4) Introduzco los valores tomados del contacto en los campos del formulario clientes.

5) Tomo la referencia autonumeríca asignada al nuevo cliente, para lo cual debo guardar antes el registro

6) La introduzco en el registro de Contactos para asociar el contacto con el cliente definitivo.

Espero que se entienda mejor, un saludo y gracias

Hombre tu dirás, pero creo que es más lógico insertar los datos del formulario Contactos en la tabla Clientes y luego, si quieres, abrir el formulario Clientes, que pasar datos de formulario a formulario. En cualquiera de las instrucciones puedes poner luego, por ejemplo

docmd.openform"cliente",,,"nombrecliente='" & me.nombrecliente & "'"

De acuerdo, lo voy a intentar como comentas. Lo único es que no se que campos voy a tener en la tabla contactos, en unos casos puede ser sólo un mail, en otros un teléfono, por lo que lo más sencillo sería abrir el formulario en el último registro. ¿Cuan es en ese caso la orden a indicar?

Además, una vez creado el registro en la tabla Clientes, necesito tomar el autonumerico he incluirlo en el contacto correspondiente. ¿Eso, igual si es mejor hacerlo desde el formulario, una vez abierto en el último registro?

Gracias

Supongamos que estás en el formulario Contactos. Puedes poner, por ejemplo, en el evento Al hacer clic de un botón

Docmd. Openform"Clientes",,,, acformadd, acdialog

Esto lo que hará será abrirte el formulario Clientes en vista diálogo y en un registro nuevo. Y poner en el evento Al abrir del formulario Clientes

me.cliente.defaultvalue=forms!contactos!cliente

me.direccion.defaultvalue=forms!contactos!direccion

Etc

Los campos no tienen porque llamarse igual. Yo lo h puesto en plan didáctico.

Lo que hace es que, como el formulario Clientes estará abierto "sobre" el de contactos te coge los valores que tu hayas decidido en el código.

Me he decidido por la opción que me planteas de insertar el registro directamente en la tabla Tabla_Clientes. Pero se me ha planteado un problema. Los campos no siempre tienen valores y me da error por "uso no válido de null", he intentado salvarlo con el siguiente código, pero sigue dándome el mismo error. Estoy creando la instrucción INSER INTO poco a poco, añadiendo los campos de uno en uno y probando, para no cometer errores, por eso la instrucción no está completa, y sólo he añadido algunos campos. Posteriormente los iré añadiendo.

El código que tengo de momento es este:

Private Sub Crear_Cliente_Click()
Dim Nombre_Comercial As String
Dim Fecha_Alta As Date
Dim Captura_Cliente As String
Dim Direccion As String
Dim Codigo_postal As String
Dim Poblacion As String
Dim Provincia As String
Dim Email As String
Dim Web As String
Dim Telefono As String
Dim Contactos As String
Dim Id_Cliente As Integer
'Toma de valores-He añadido estas instrucciones para intentar evitar valores null
If Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Nombre_Comercial] = Null Then
    Nombre_Comercial = ""
Else
    Nombre_Comercial = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Nombre_Comercial]
End If
Fecha_Alta = Date
If Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Captura_Cliente] = Null Then
    Captura_Cliente = ""
Else
    Captura_Cliente = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Captura_Cliente]
End If
If Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Direccion] = Null Then
    Direccion = ""
Else
    Direccion = Forms![Formulario Contactos]![Subformulario Datos Contactos].Form![Direccion]
End If
DoCmd.RunSQL "insert into Tabla_Clientes" & _
"([Nombre Comercial],[Fecha alta],[Direccion Pedidos],[Codigo Postal Pedidos])" & _
"values('" & Nombre_Comercial & "',#" & Fecha_Alta & "#,'" & Direccion & "','" & Codigo_postal & "')"
End Sub

Gracias por tu ayuda

Cuando sospeches que un campo o un control pueda tener un valor nulo ponlo como nz, ejemplo

Campoa=nz([campob]) Siendo campob el que pueda ser nulo

La función nz, tal como la he puesto te transforma los nulos en ceros.

En caso de que quieras, por ejemplo, que en caso de que sea nulo te lo transforme en un 3, pones

campoa=nz([campob],3)

En caso de que campob fuera texto y quisieras que te ponga algún valor texto

campoa=nz([campob],"

Respuesta
2

Yo creo que tu equivocación está en el planteamiento que haces, que no es el más adecuado. Y digo que no es el más adecuado porque estás duplicando información en dos tablas que básicamente son idénticas.

Mi sugerencia sería que usases una sola tabla, por ejemplo la de contactos, a la que le añades un campo de tipo Sí/No para marcar si el contacto es o no cliente. Además, le puedes añadir otros campos (fecha de alta de cliente...)

Luego me crearía dos consultas, una de contactos no clientes (filtras por el si/no en "distinto de verdadero") y otra de clientes (filtrada por el campo si/no en "verdadero") y trabajaría con ellas.

Un saludo


Lo he planteado así, ya que la tabla contactos apenas la voy a utilizar, mientras que la tabla clientes, la estaré utilizando constantemente en consultas, formularios ... De esta forma pretendo no sobrecargar la carga clientes con registros inútiles. Sólo paso a la tabla los contactos efectivos.

La tabla clientes crecería mucho, convirtiéndose en poco practica.

En mi opinión te contradices: primero dices que en la tabla "contactos" introduces datos de posibles clientes y si luego se convierten en clientes los pasas as la tabla "clientes", y ahora dices que la tabla contactos a penas la usarás.

Insisto, tener dos tablas idénticas (o con dos campos de diferencia como Fecha alta y punto de venta) con registros duplicados es "peor" que tener una sola.

Y registros "inútiles" los seguirás teniendo, en "contactos", además de tener a un cliente en "Clientes" y en "Contactos".

Tampoco coincido en que la tabla por tener muchos registros se vuelva poco práctica. Por medio de consultas puedes limitar los campos y registros con los que trabajar. Y una consulta no deja de ser una tabla sobre la que puedes hacer otras consultas, formularios, informes...

Si no quieres cambiar tu sistema, una forma de atacar el problema sería ejecutar desde el formulario de "contactos", una consulta de datos anexados que traslade los datos de tabla a tabla, sin necesidad de abrir el formulario y hacerlo a través de él, por ejemplo:

CurrentDb.Execute "INSERT INTO Clientes SELECT * FROM Contactos WHERE ID_Contacto=" & Me.ID_Contacto

Y luego actualizar la fecha de alta y demás datos del cliente que acabas de crear (será el de Id más alto):

CurrentDb.Execute "UPDATE Clientes SET  [Fecha Alta]=#" & Format(Date,"mm/dd/yyyy") & "#, [Punto de venta]=True WHERE ID_Cliente=" & DMax("ID_Cliente","Clientes")

Y si quieres aprovechar el código que ya tienes, se me ocurre que pruebes abriendo el formulario directamente en un registro nuevo, en vez de abrirlo en el primer registro e irte a uno nuevo, cambiando las lineas:

DoCmd.OpenForm "Tabla_Clientes"

DoCmd. GoToRecord,, acNewRec

Por ésta:

DoCmd.OpenForm "Tabla_Clientes",,,,acFormAdd

Un saludo


Añade tu respuesta

Haz clic para o

Más respuestas relacionadas