Completar código según las primeras tres letras del mismo

En mi BD de Acces, tengo una tabla de productos; "PRODUCTOS" con todos sus campos (ID, Número, Nombre...) Y un formulario con el mismo nombre y mismos campos. Sucede que tengo por ejemplo productos para la venta; VEN000001, consumibles CNS000001, servicios SRV00001, SRV00002 y así. Lo que quiero es que colocar un botón en formulario de productos y que cuado agregue un nuevo registro colocar las primeras tres letras del código y al clicar el botón el mi

Smo me complete el código con el consecutivo del ese producto en esa categoría, por ejemplo en este caso ; SRV000003.

Por otro y lado, y como hay veces que los productos son muy similares y solo cambia el nombre, quería colocar otro botón que me heredara o copiara todos los datos de un registro específico (dónde esté parado en el formulario en ese momento) y solo cambiar el código y el número por cuanto no pueden ser diferentes y luego ya el usuario cambiar el nombre y demás datos que ameriten, sin tener que llenar toda la plantilla

Respuesta
1

Lo puedes hacer de muchas formas. Por ejemplo, si tengo la tabla Copia y con ella hago un formulario, cuando en el primer registro escribo la referencia y el nombre del producto, al pulsar enter

Me voy a otro registro y pongo otra referencia y otro producto

Me voy a otro registro  y "repito" la referencia

En este caso, ya que como te digo lo puedes hacer de mil formas( por ejemplo, ponendo las referencias en un combinado, que siempre es más cómodo elegir que escribir), el código del evento Después de actualizar del cuadro Producto es

Private Sub Producto_AfterUpdate()
DoCmd.RunCommand acCmdSaveRecord
Num = Referencia & Format(DCount("nz([producto])", "copia", "referencia='" & Me.Referencia & "'"), "00000")
End Sub

Pero también podrías decirle que primero "mirara" si ese producto ya está en la tabla, etc.

2 respuestas más de otros expertos

Respuesta
1

Se les conoce como ‘falsos auto numéricos’ (hay mucha literatura sobre ello)

Se basa en descomponer el código en sus partes (en este caso dos) y tras conocer la constante, localizar la mayor de ese conjunto incrementar el número y reconstruir el nuevo código.

Partamos de SRV000003

En él la primera parte (tres caracteres) es la parte fija y que nos valdrá como condición para obtener el mayor

Left(Codigo,3)  ==== >>> ‘SRV’ (Familia)

La segunda parte es un número que se desea incremental

MID(Codigo, 4) ====== >>>’000003’ y como es un texto ==== >>> Val(MID(Codigo, 4)) ===== >>> 3 (Correlativo)

El siguiente:

DMax(“Val(MID(Codigo, 4))”, “Productos”, “Left(Codigo,3)= ‘” & Familia & “’”) Devolvería 3 o NULL
Le aplicamos NZ que detecta el valor NULL y devuelve el segundo parámetro (un cero en este caso)
NZ(DMax(“Val(MID(Codigo, 4))”, “Productos”, “Left(Codigo,3)= ‘” & Familia & “’”), 0)

Lo incrementamos

NZ(DMax(“Val(MID(Codigo, 4))”, “Productos”, “Left(Codigo,3)= ‘” & Familia & “’”), 0) +1
Le añadimos los ceros para obtener una cadena de texto de seis caracteres

Format NZ(DMax(“Val(MID(Codigo, 4))”, “Productos”, “Left(Codigo,3)= ‘” & Familia & “’”), 0) +1, “000000”)

Solo se necesita concatenar la familia con el dato antes calculado y  ...

NuevoElemento=  Familia & Format NZ(DMax(“Val(MID(Codigo, 4))”, “Productos”, “Left(Codigo,3)= ‘” & Familia & “’”), 0) +1, “000000”)

EL resultado: SRV000004 y así para cada tipo de familia

Si se desea utilizar el actual para generar una copia, personalmente lo clonaría con el número cero (o una marca, es un texto), lo editaría y al momento de validarlo (si se descarta basta con borrar el registro) es cuando le generaría con la formula anterior el ID que el correspondiese y ya estaría creado.

Lo que he llamado 'Familia' son los tres primeros caracteres, han de conocerse para poder calcular el numero que le corresponde y (simple sugerencia) un combo seria el método adecuado, pues en un cuadro de texto se puede escribir con libertad y dar lugar a crear series nuevas (error al digitar) o con mas de tres caracteres.

Respuesta
1

En el evento del botón este puede ser el código

Private Sub btnGenerarCodigo_Click()
    Dim categoria As String
    Dim codigo As String
    Dim consecutivo As Long
    Dim nuevoCodigo As String
    ' Obtener la categoría del producto (las primeras tres letras)
    categoria = Left(Me.txtCodigo.Value, 3)
    ' Obtener el consecutivo actual de la categoría
    consecutivo = DMax("Numero", "PRODUCTOS", "Left(Codigo, 3) = '" & categoria & "'")
    ' Incrementar el consecutivo
    consecutivo = consecutivo + 1
    ' Generar el nuevo código con el formato adecuado
    nuevoCodigo = categoria & Format(consecutivo, "000000")
    ' Asignar el nuevo código al campo correspondiente
    Me.txtCodigo.Value = nuevoCodigo
End Sub

Para el segundo botón que copia los datos de un registro específico.

Agrega otro botón al formulario y configure su evento "Al hacer clic"

En el evento "Al hacer clic" del segundo botón, puede agregar el siguiente código:

Private Sub btnCopiarRegistro_Click()
    Dim codigo As String
    Dim rs As DAO.Recordset
    ' Obtener el código del producto actual
    codigo = Me.txtCodigo.Value
    ' Abrir un recordset para obtener los datos del registro actual
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM PRODUCTOS WHERE Codigo = '" & codigo & "'")
    ' Verificar si se encontró el registro
    If Not rs.EOF Then
        ' Ir al último registro para agregar uno nuevo
        rs.MoveLast
        rs.AddNew
        ' Copiar los datos del registro actual al nuevo registro
        For Each fld In rs.Fields
            If fld.Name <> "ID" Then ' Excluir el campo ID para evitar conflictos de claves primarias
                fld.Value = rs.Fields(fld.Name).Value
            End If
        Next fld
        ' Actualizar el campo de código con un valor vacío
        Me.txtCodigo.Value = ""
        ' Cerrar el recordset y guardar los cambios
        rs.Close
        Set rs = Nothing
        Me.Refresh
    End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas