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?
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.
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.
- Compartir respuesta
Hola a todos... necesito una ayudita, tengo un cuadro combinado al cual enlacé a 2 cuadros de texto para rellenar, pero al momento de guardar en la tabla estos no se guardan... ¿Alguien me puede ayudar, por favor? - Odrareg Aicrag