Como guardar un campo concatenado en una tabla?

Tengo un formulario que me agrega nuevos registros en una tabla donde se teclean y en origen de control se direccionan a esa tabla y se agregan, sim embargo un campo en este formulario me genera el campo "Código" concatenando 3 campos uno que se selecciona con un combo box y otros 2 que se agregan automáticamente, ¿cómo puedo agregar este textbox con origen de control la formula de concatenación a el campo en la tabla?

1 respuesta

Respuesta
1

A ver si con este ejemplo de Neckkito logras hacerlo:

http://siliconproject.com.ar/neckkito/index.php/ejemplos-explicados/formularios/93-ejemplos-explicados/ejemplos-de-formularios/160-guardar-campo-calculado-en-tabla

Recuerda que para concatenar, tienes que usar el operador &, así:

Campo1 & Campo2 & Campo3

Si no lo consigues, dímelo y lo vemos con más calma

Lo he intentado el ejemplo está bien explicado sin embargo no tuve éxito, tengo lo siguiente una tabla inventario: ID(Autonumérico), familia, código,descripción, ubicación, Usos y comentarios, disponible, necesario, punto de reorden y fecha.

El formulario que sirve para añadir un registro nuevo el cual está vacío al inicio, con un combo box familia para seleccionar a la familia, dígito descripción y automáticamente se me genera el text box código concatenando familia+las 3 primeras letras de la descripción tecleada+ID(que es autonumérico por lo que se genera solo) este campo concatenado es el que no logro que se me guarde en la tabla, todos los demás tanto ID,familia, descripción, ubicación, Usos y comentarios, disponible, necesario, punto de reorden y fecha, si se me guardan.

Al hacerlo igual al ejemplo el único avance que tuve fue que antes no se guardaba nada ahora aparece un cero.

Que estoy haciendo mal?

Voy a cambiar el enfoque, que igual resulta más sencillo.

Veamos: supongo que en tu formulario, el textbox código tiene en su propiedad "origen de control" (Propiedades->pestaña Datos) la fórmula que te encadena los tres campos, que imagino será esta: =familia & Izq(descripción;3) & ID, o algo parecido.

Bien, eso se lo tienes que borrar, y como origen de control le pones código (el campo de la tabla en el que quieres que se guarde), y para que no lo puedas editar, le puedes poner la propiedad "Bloqueado" en Sí, en la misma pestaña Datos.

Luego te colocas en el campo descripción, sacas sus propiedades, vas a la pestaña Eventos, y localizas "Después de actualizar", una vez que te coloques en esa fila, verás un botón con tres puntos [...] a la derecha. Lo pulsas y seleccionas Generador de código.

Se te abrirá el editor de Visual Basic, y te aparecerá el cursor entre las lineas

Private Sub Descripcion_AfterUpdate y End Sub

Pues ahí escribes esto:

Me.código=Me.familia & Left(Me.descripción,3) & Me.ID

Y con esto ya se te debería generar el campo, y guardar en tu tabla.

Corregí la base a como me dice, pero en ese campo lo que me guarda es un cero y no el código.

Saludos

Ya lo logré! con su ayuda muy bien explicada.

Ahora tengo otra consulta para ese mismo código que no se como hacerlo, como ya le había comentado el código se genera concatenando 3 campos.

Por ejemplo

Caso 1 registro (ID=5)Autonumérico

Código generado

A EJE 5

Caso 2 registro (ID=12)Autonumérico
Código generado
A EJE 12

Me gustaría lograr que el código se me genere de la siguiente forma:

Caso 1 registro (ID=5)Autonumérico
Código generado
A EJE 0005
Caso 1 registro (ID=12)Autonumérico
Código

A EJE 0012

Y así sucesivamente con forme vayan aumentando los registros, de que forma puedo hacer para que se agreguen esos ceros a la izquierda del numero ID capturado para que complete las 4 cifras?

Ya me parecía a mí raro que te pusiera un 0 en el campo... je je

Para la segunda parte de la pregunta, haz este cambio en el código:

Me.código=Me.familia & Left(Me.descripción,3) & Format(Me.ID,"0000")


Un saludo

Excelente su respuesta rápida y me funcionó de maravilla, estoy muy agradecido.

Por otra parte en la tabla inventario me guarda los campos perfectamente, pero algunos de estos campos de este mismo formulario para añadir registros al inventario, necesito que me los guarde en otra tabla que se llama BitacoraControl hice lo siguiente en el botón de agregar

DoCmd.SetWarnings False
DoCmd.RunSQL "Insert into BitacoraControl(CÓDIGO, DESCRIPCIÓN, NUEVO, USUARIO, FECHA, HORA)values(Codigo1, Descripcion1, Disponible1, NomUsuario, Auto_Date, Auto_Time)"
DoCmd.SetWarnings True

Sin embargo esto para otros formularios que tengo como lo son descarga y carga, en donde lo único que se hace es cargar un registro existente y agregar o descargar una cantidad, si me funciona bien, pero para este formulario no me está guardando Código, Descripción y Nuevo(que es la cantidad nueva a ingresar), Será que al ser campos tecleados nuevos no se actualiza antes de guardarlos en bitácora y por eso no los guarda? Qué puedo hacer?

Prueba guardando el registro antes de que se ejecute la SQL, añadiendo DoCmd. RunCommand acCmdSaveRecord antes del DoCMd. RunSQL

Saludos,

Realicé lo que me sugiere pero no logre lo que necesito.

Mi código es el siguiente para que se ubique mejor:

Private Sub cmdAñadir_Click()
On Error GoTo Err_cmdAñadir_Click
DoCmd.GoToRecord , , acNewRec
DoCmd.SetWarnings False
DoCmd.RunSQL "Insert into BitacoraControl(CÓDIGO, DESCRIPCIÓN, NUEVO, USUARIO, FECHA, HORA)values(Codigo1, Descripcion1, Disponible1, NomUsuario, Auto_Date, Auto_Time)"
DoCmd.SetWarnings True
Exit_cmdAñadir_Click:
Exit Sub
Err_cmdAñadir_Click:
MsgBox Err.Description
Resume Exit_cmdAñadir_Click
MsgBox "El artículo nuevo se cargó correctamente", vbInformation, "AVISO"
End Sub

Sólo viendo el código, y sin conocer cómo funciona tu BD, hay una cosa que no me cuadra:

Si mandas a un nuevo registro antes de ejecutar la SQL, es normal que no te inserte nada, pues no habrá valores en el formulario.

Veo dos opciones, la primera y más sencilla es que pongas el DoCmd. GotoRecord después del DoCmd SetWarnings False, y la segunda, que declares tantas variables como campos quieres insertar y les asignes su valor antes del DoCmd. GotoRecord.

Ya me dices si voy por buen camino. Si no, explícame el proceso de llenado de datos del formulario y en que momento pulsas el botón.

Ok, ya lo intenté y no me funciona de la manera fácil, me manda un error que el registro no puede ser encontrado.

Como ya lo había comentado mi tabla INVENTARIO es: ID(Autonumérico), familia, código,descripción, ubicación, Usos y comentarios, disponible, necesario, punto de reorden y fecha.

le doy en botón agregar registro nuevo que me abre el formulario con los campos

Hora->Auto_Time

Fecha->Auto_Date

Usuario->Que se me carga al cargar formulario

Familia->combo box para selecciona familia

ID->Autonumérico que se crea automático al seleccionar Familia

Descripción1->Se digita la descripción que se desea

Codigo1->Se crea automático después de actualizar Descripción, concatenando Familia+Descripción+ID (Como ya lo habíamos visto)

Ubicacion->Se selecciona de combo box

cantidad a cargar (Disponible1)->Se digita cantidad y tiene como origen de control disponible de la tabla

Necesario->Se digita

PuntoReorden->se digita

Comentarios->Se digita

Se le da al botón añadir Articulo (Que es el código que copie arriba) y listo se crea el registro nuevo, se guarda en la tabla INVENTARIO (Se guarda todo perfectamente) y guarda los campos requeridos en tabla BITÁCORA pero solo me está guardando NomUsuario, Auto_Date, Auto_Time en la tabla bitacora los campos Codigo1, Descripcion1, Disponible1, no me los está guardando en bitacora.

No sé por qué?

Ok, ahora que entiendo el proceso, te comento:

Sólo te guarda los campos NomUsuario, Auto_Date y Auto_Time, por lo que te comentaba, antes de ejecutar la sql, te vas a un registro nuevo, que al cargarse sólo tiene esos valores, y por tanto son los que pasa a la otra tabla.

Intenta esto:

Private Sub cmdAñadir_Click()
On Error GoTo Err_cmdAñadir_Click
DoCmd.RunCommand acCmdSaveRecord
DoCmd.SetWarnings False
DoCmd. RunSQL "Insert into BitacoraControl(CÓDIGO, DESCRIPCIÓN, NUEVO, USUARIO, FECHA, HORA)values(Codigo1, Descripcion1, Disponible1, NomUsuario, Auto_Date, Auto_Time)"
DoCmd.SetWarnings True

DoCmd.GoToRecord , , acNewRec
Exit_cmdAñadir_Click:
Exit Sub
Err_cmdAñadir_Click:
MsgBox Err.Description
Resume Exit_cmdAñadir_Click
MsgBox "El artículo nuevo se cargó correctamente", vbInformation, "AVISO"
End Sub

Y si no, prueba de este otro modo:

Private Sub cmdAñadir_Click()
On Error GoTo Err_cmdAñadir_Click
Dim vCodigo as string

Dim vDescripcion as string

Dim vDisponible as Long

dim vUsuario as string

Dim vFecha as Date

Dim vHora as date

vCodigo=Me.Codigo1

vDescripcion=Me.Descripcion1

vDisponible =Me.Disponible1

vUsuario =Me.NomUsuario
vFecha =Me.Auto_Date
vHora =Me.Auto_Time

DoCmd.SetWarnings False

DoCmd.RunSQL "Insert into BitacoraControl(CÓDIGO, DESCRIPCIÓN, NUEVO, USUARIO, FECHA, HORA)values('" & vCodigo & "','" & vDescripcion & "'," & vDisponible & ",'" & vUsuario & "',#" & Format(vFecha,"mm/dd/yyyy") & "#,#" & vHora & "#)"
DoCmd.SetWarnings True

DoCmd.GoToRecord , , acNewRec
Exit_cmdAñadir_Click:
Exit Sub
Err_cmdAñadir_Click:
MsgBox Err.Description
Resume Exit_cmdAñadir_Click
MsgBox "El artículo nuevo se cargó correctamente", vbInformation, "AVISO"
End Sub

Excelente con la primera funcionó a la perfección.

Quedó así:

Private Sub cmdAñadir_Click()
On Error GoTo Err_cmdAñadir_Click
DoCmd.RunCommand acCmdSaveRecord
DoCmd.SetWarnings False
DoCmd.RunSQL "Insert into BitacoraControl(CÓDIGO, DESCRIPCIÓN, NUEVO, USUARIO, FECHA, HORA)values(Codigo1, Descripcion1, Disponible1, NomUsuario, Auto_Date,Auto_Time)"
DoCmd.SetWarnings True
MsgBox "El artículo nuevo se cargó correctamente", vbInformation, "AVISO"
DoCmd.GoToRecord , , acNewRec
Exit_cmdAñadir_Click:
Exit Sub
Err_cmdAñadir_Click:
MsgBox Err.Description
Resume Exit_cmdAñadir_Click
End Sub

Ahora necesito agregarle un mensaje de confirmación: "Está seguro que los datos son correctos y desea guardarlos?"

Aceptar->Sigue y guarda el registro

No->Se devuelve al registro que estamos haciendo para que el usuario revise si todo está bien.

Gracias por toda su ayuda.

Añade lo que está em negrita y ya lo tienes:

Private Sub cmdAñadir_Click()
On Error GoTo Err_cmdAñadir_Click

If MsgBox("Está seguro que los datos son correctos y desea guardarlos?",vbOKCancel+ vbQuestion, "CONFIRMAR") = vbCancel Then Exit sub
DoCmd.RunCommand acCmdSaveRecord

DoCmd.SetWarnings False
DoCmd.RunSQL "Insert into ....

Estimado muchas gracias todo funciona muy bien.

Ahora tengo otra duda en la tabla yo asigné los campos como requeridos, por lo que en el formulario debo llenar esos campos, si no, me da el mensaje por defecto que tiene access, pero no me gusta ya que si la base es abierta en un access en ingles ese mensaje me sale en ingles, ademas que este mensaje se me muestra después del ultimo mensaje de confirmación agregado, como puedo personalizar ese mensaje si algún campo requerido no es llenado y que me salga antes del mensaje de verificación.

A ver que te parece esto:

Private Sub cmdAñadir_Click()
On Error GoTo Err_cmdAñadir_Click

Dim ctl As Control

For Each ctl In Me.Controls
If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Then
If IsNull(ctl) Or ctl.Value = "" Then
MsgBox "El campo " & ctl.name & " es obligatorio",vbokonly + vbInformation,"AVISO"

Me.Controls(ctl.name).SetFocus

Exit Sub
End If
End If
Next ctl

If MsgBox....

Y evidentemente en la tabla ponles requerido en No.

Para otra vez, si no te importa, si las nuevas dudas que te surgen no tienen que ver con la original (como esta última), mejor abre una nueva pregunta.

Funciona muy bien sin embargo tengo 2 campos que no son requeridos son opcionales, por lo que con lo de arriba si no los lleno me dice que es requerido.

Pues añade un

If ctl.Name ="..." or ctl.Name="..." then

antes del If IsNull

y un End If entre los otros dos.

Los ... cámbialos por los nombres de tus campos

No me queda claro yo tengo los campos Familia, Codigo1, Descripcion1, Ubicación, Disponible1, Necesario, PuntoReorden, Usos y Comentarios, RutaFoto.

Estos son los que no pueden quedar en blanco Familia, Codigo1, Descripcion1, Ubicación,Disponible1, Necesario, PuntoReorden

Y estos los que son opcionales Usos y Comentarios, RutaFoto

Cuales debo cambiar por los ...

If Not ctl.Name "Usos Y Comentarios" or Not ctl.Name="RutaFoto" then

Si le pones el Not, tienes que cambiarlos por los que pueden quedar en blanco. Si no, por los que son obligatorios. En este caso es mejor la opción del Not, porque son menos a teclear.

Así es como está hasta el momento:

Private Sub cmdAñadir_Click()
On Error GoTo Err_cmdAñadir_Click
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Then
If Not ctl.Name = "Usos y Comentarios" Or Not ctl.Name = "RutaFoto" Then
If IsNull(ctl) Or ctl.Value = "" Then
MsgBox "Debe ingresar todos los campos " & ctl.Name & " requeridos maracados con *", vbOKOnly + vbInformation, "AVISO"
Me.Controls(ctl.Name).SetFocus
Exit Sub
End If
End If
End If
Next ctl
If MsgBox("Está seguro que los datos son correctos y desea guardarlos?", vbOKCancel + vbQuestion, "CONFIRMAR") = vbCancel Then Exit Sub
DoCmd.RunCommand acCmdSaveRecord
DoCmd.SetWarnings False
DoCmd.RunSQL "Insert into BitacoraControl(CODIGO, DESCRIPCION, NUEVO, USUARIO, FECHA, HORA)values(Codigo1, Descripcion1, Disponible1, NomUsuario, Auto_Date,Auto_Time)"
DoCmd.SetWarnings True
MsgBox "El artículo nuevo se cargó correctamente", vbInformation, "AVISO"
DoCmd.GoToRecord , , acNewRec
Exit_cmdAñadir_Click:
Exit Sub
Err_cmdAñadir_Click:
MsgBox Err.Description
Resume Exit_cmdAñadir_Click
End Sub

Sin embargo me sigue saliendo el mensaje si dejo "Usos y Comentarios" y "RutaFoto" sin llenar.

Hazlo así, entonces:

For Each ctl In Me.Controls
If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Then
If ctl.Name = "Usos y Comentarios" Or ctl.Name = "RutaFoto" Then
Else
If IsNull(ctl) Or ctl.Value = "" Then

Ahora sí te debería ir.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas