** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Numerar registros de forma única con un condiciona
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Numerar registros de forma única con un condiciona

 Responder Responder
Autor
Mensaje
Absalón Ver desplegable
Nuevo
Nuevo


Unido: 27/Marzo/2021
Localización: Málaga
Estado: Sin conexión
Puntos: 27
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Absalón Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Numerar registros de forma única con un condiciona
    Enviado: 28/Marzo/2021 a las 20:06
Soy nuevo por estos lares así que antes de nada un saludo a todos.

Tengo el siguiente código:

Function ContadorEnv(CodEnv As String, Envases As String, Optional DbPath As String) As Long
Dim SQL As String
Dim DB As Object  ' DAO.Database
Dim rst As Object  'DAO.Recordset

    On Error GoTo ContadorEnv_Error
    SQL = " SELECT " & CodEnv & " FROM " & Envases & " WHERE " & CodEnv & " = 1"
    
    If DbPath = "" Then
        Set DB = CurrentDb
    Else
        Set DB = DBEngine.OpenDatabase(DbPath)
    End If
    
    Set rst = DB.OpenRecordset(SQL, DB_OPEN_SNAPSHOT)
    
    If rst.EOF Or rst.BOF Then
        ContadorEnv = 1
    Else
        SQL = " SELECT " & Envases & "." & CodEnv & " + 1" & " FROM " & Envases & " LEFT JOIN " & Envases & " As TMP" _
        & " ON " & Envases & "." & CodEnv & " + 1" & " = TMP." & CodEnv & " WHERE TMP." & CodEnv & " IS NULL" _
        & " ORDER BY " & Envases & "." & CodEnv
        
        Set rst = DB.OpenRecordset(SQL)
        ContadorEnv = rst(0)
    End If
    
exit_Function:
    
    If Not rst Is Nothing Then rst.Close
    Set rst = Nothing
    If Not DB Is Nothing Then DB.Close
    Set DB = Nothing
    
    On Error GoTo 0
    Exit Function
    
ContadorEnv_Error:
    MsgBox "Error " & Err.Number & " (" & Err.description & ")"
    Resume exit_Function

End Function



Con él numero los registros de forma única y me busca y rellena los huecos formados por eliminaciones y funciona de maravilla.

Me sirve para numerar los registros de una tabla llamada "TEnvases" por la que controlo los diferentes tipos de envases y cuyo campo clave es "CodTenv". Por otro lado tengo una tabla llama "Envases", campo clave "CodEnv" en la que introduzco las diferentes capacidades y medidas de los envases, estando relacionada con la anterior tabla por el campo clave ya indicado, pues bien lo que quiero es adaptar el código/Función antes indicado para que me haga los mismo, es decir; numerar los registros de forma única y que me busque y rellene los huecos dejado por eliminaciones pero teniendo como condicionante el "CodTenv", tal que así:

CodTenv= 1   CodEnv= 10001
     "         1        "        10002
     "        2  "        20001
     "         2        "        20002

y así sucesivamente. Ya he visto los autonuméricos y los falsos autonúmericos pero no me sirven ya que el registro eliminado no los recupera o tal vez yo no haya sido capaz de adaptarlo, pero como lo anterior me funciona me gustaría poder adaptarlo.

Gracias anticipadas
Un saludo

Un saludo
Arriba
Absalón Ver desplegable
Nuevo
Nuevo


Unido: 27/Marzo/2021
Localización: Málaga
Estado: Sin conexión
Puntos: 27
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Absalón Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Abril/2021 a las 19:17
Buenas tardes;

Salvo que estéis pensando la respuesta, gracias por nada.

Parece ser que lo que consulté no ha sido importante para nadie.

Un saludo 
Un saludo
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Abril/2021 a las 19:38
¿Te has planteado que a lo mejor tu exposición no deja claro el problema?

Y, por supuesto que el tema es importante sólo para ti. Si quieres empatía deberías mostrarla tu también. 

Vuelve a intentarlo y a lo mejor alguien da con la tecla de los envases.


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Absalón Ver desplegable
Nuevo
Nuevo


Unido: 27/Marzo/2021
Localización: Málaga
Estado: Sin conexión
Puntos: 27
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Absalón Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Abril/2021 a las 19:47
Me parece que está bastante bien explicado, cosa que revisé antes de enviarlo.

En cuanto a la empatía, no he demostrado lo contrario, cosa que parece ser que tú si, por la forma de contestar.

Tal vez con una contestación indicando el motivo de la no comprensión de la exposición hubiera sido suficiente y no la callada por respuesta, pero veo que es más fácil incitar en la respuesta que intentar dar una solución.

Y para terminar, por supuesto que el tema es importante para mi y solo para mi, con esa respuesta por su parte me da a entender lo importante que es para usted las preguntas que les planteamos.

Un saludo 


Un saludo
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 06/Abril/2021 a las 18:51
Hola Absalón,

Como bien dice en las normas del foro que aceptaste en su momento, si alguien no recibe respuestas a una pregunta, habitualmente se debe a que no ha sido planteada con la suficiente claridad o profusión de detalles.

Para quien plantea las preguntas el escenario es obvio, los datos están muy claros y el objetivo lo visualiza (pero no sabe como llegar hasta él).

Pero esa clarividencia no la tenemos el resto que sólo leemos lo que aparece en el mensaje.  En tu caso expones un código que dices (y no lo dudo) que devuelve el valor adecuado. Pero no entiendo (después de leerla varias veces hoy) que es lo que pretendes conseguir y, sobre todo, que has hecho para conseguirlo, los errores encontrados y los resultados obtenidos.

Tu planteaste la pregunta el día 28 y el día 5 pones tu segundo mensaje. O sea, una semana sin respuesta. ¿Motivos? Pues se me ocurren 3 (por lo menos)
- no se ha entendido la duda
- no la ha visto suficiente gente. Estamos en Semana Santa... yo mismo no lo he visto hasta hoy (en Catalunya es fiesta el lunes)
- la bola de cristal de Emilio está rota

Dicho esto, tus respuestas de ayer está totalmente fuera de lugar. 

Publicado originalmente por Absalón Absalón escribió:

Salvo que estéis pensando la respuesta, gracias por nada.

Parece ser que lo que consulté no ha sido importante para nadie.

Aquí se colabora de forma voluntaria y altruista. No puedes esperar respuestas inmediatas. Algunos de los que respondemos aquí nos dedicamos profesionalmente a esto de la programación y estamos bastante acostumbrados a interpretar lo que nos piden los interlocutores. Te aseguro que, en tu caso, a tu explicación le falta "algo" para poder aventurar una respuesta.
En segundo lugar, en este foro todas las preguntas son igual de importantes. En el momento en que alguien lanza una pregunta en un foro es porque es importante para esa persona. Y los que respondemos en los foros lo hacemos por distintos motivos:
- porque nos gusta hacerlo
- porque se presentan retos interesantes
- porque queremos devolver lo que en su momento nos dieron los foros
- porque nos aburrimos
- por lo-que-sea

Así que es de muy mal gusto ese "gracias por nada"

Y lo rematas con tu último mensaje dónde aseguras que te has explicado muy bien y acusas a un administrador de falta de empatía cuando el primero en demostrar eso has sido tu ("gracias por nada"). Finalmente pensar que no damos importancia a las preguntas es no haber leído nada en este foro ni saber nada de sus integrantes.

A partir de aquí decides si deseas formar parte de esta comunidad o no. La puerta está tan abierta para salir como lo estuvo para entrar. Solo pedimos respeto.

Un saludo

Xavi, un minyó de Terrassa

Mi web
Arriba
Absalón Ver desplegable
Nuevo
Nuevo


Unido: 27/Marzo/2021
Localización: Málaga
Estado: Sin conexión
Puntos: 27
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Absalón Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 06/Abril/2021 a las 20:09
Gracias por tu respuesta Xavi;

Si la respuesta de Mihura hubiera sido como la tuya de seguro que no habría contestado de esa forma. En cuanto a mi falta de empatía discrepo contigo ya que se produce a raíz de la contestación de Mihura, y no antes. Lo que se produce es un malestar.

Al mismo tiempo pido disculpas ya que quizás pequé de impaciente.

Te ruego me indiques qué necesitas para que me puedas ayudar en lo que os planteé.

Un saludo
Un saludo
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 06/Abril/2021 a las 20:42
Yo también discrepo en que la falta de empatía la genera el mensaje "gracias por nada" que es anterior al de Mihura. Pero como no estamos aquí para discrepar, pasemos a lo que interesa (no aseguro respuesta: ando liadísimo)

Analizo tu función
Le pasas 3 argumentos
- CodEnv que parece que equivale con el nombre de un campo de la tabla
- Envases que parece que es nombre de la tabla
- DbPath dónde puedes pasar el path de la base de datos por si la tabla fuera externa y no vinculada

Creas una SQL para obtener el registro que el campo valga 1 y abres un recorset

Si el recordset está vacío, el contador es 1
Si no está vacío creas una segunda SQL que (supongo) te indica número que tocaría o el hueco.

Hasta aqui más o menos se entiende.

¿Qué faltaría? Datos de ejemplo, ejemplos de uso y entender lo que devolvería la función.

Siguiente paso. Parece que quieres adaptar la función para que numere los registros de otra tabla (Envases) de un determinado CodTenv y asigne un valor al campo CodEnv.

A mi entender solo debes replicar esa función (yo no ampliaría la funcionalidad de esta; lo veo enrevesado) incluyendo un argumento en el WHERE para filtrar los datos al CodTenv seleccionado.

En cualquier caso (y desde el total desconocimiento de la aplicación) me parece intuir un diseño "complicado" de las tablas que podría no ser el mas eficiente.

Un saludo

Xavi, un minyó de Terrassa

Mi web
Arriba
Absalón Ver desplegable
Nuevo
Nuevo


Unido: 27/Marzo/2021
Localización: Málaga
Estado: Sin conexión
Puntos: 27
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Absalón Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 08/Abril/2021 a las 20:44
Gracias por tu respuesta, Xavi
No voy a entrar en a ver quién discrepa más, jejeje. Dejémoslo estar.

Te explico;

Tengo una tabla "Tipos de Envases":
- CodTEnv: campo clave
- Tipo: texto como descripción del envase

A ésta tabla le paso una función similar a la que ya expuse en mi primer mensaje y consigo el valor único de CodTEnv, así mismo si se elimina un registro esa función me rellena el hueco dejado.

Tengo una segunda tabla "Envases":
- CodEnv: campo clave
- CodTEnv: para relacionar con la tabla anterior de Tipos de Envases
- Capacidad: capacidad del envase
- Medida: en cuanto se mide la capacidad del envase (kilos, litros etc.)
- Uso: Profesional o no profesional

Bien, mi idea es adaptar la función ya expuesta anteriormente para que haga lo siguiente:

TABLA TIPOS DE ENVASES                    TABLA ENVASES
Si CodTEnv= 1                   entonces      CodEnv= 10001
                                                                          10002
                                                                          10003
Si CodTEnv= 2                          "           CodEnv= 20001
                                                                          20002   etc
Esto lo tengo conseguido con la siguiente función:

Private Sub Form_Current()
    
If Not Me.NewRecord Then Exit Sub
    Select Case Me.CodTEnv
        Case 1 To 9
            Me.CodEnv = Me.CodTEnv & Format(Nz(DMax("Val( Mid(CodEnv, 2))", "Envases", "Val( Left(CodEnv,1)) = " & Me.CodTEnv), 0) + 1, "0000")
        Case 10 To 99
            Me.CodEnv = Me.CodTEnv & Format(Nz(DMax("Val( Mid(CodEnv, 3))", "Envases", "Val( Left(CodEnv,2)) = " & Me.CodTEnv), 0) + 1, "0000")
        Case 100 To 999
            Me.CodEnv = Me.CodTEnv & Format(Nz(DMax("Val( Mid(CodEnv, 4))", "Envases", "Val( Left(CodEnv,3)) = " & Me.CodTEnv), 0) + 1, "0000")
        Case 1000 To 9999
            Me.CodEnv = Me.CodTEnv & Format(Nz(DMax("Val( Mid(CodEnv, 5))", "Envases", "Val( Left(CodEnv,4)) = " & Me.CodTEnv), 0) + 1, "0000")
        Case Else
            Me.CodEnv = Me.CodTEnv & Format(Nz(DMax("Val( Mid(CodEnv, 6))", "Envases", "Val( Left(CodEnv,5)) = " & Me.CodTEnv), 0) + 1, "0000")
    End Select

End Sub

Hasta aquí todo perfecto, pero cuando se anula un registro de la Tabla "Envases" ese registro se pierde. Entonces lo que quiero hacer es adaptar, si es posible, la función expuesta en el primer mensaje para poder rellenar esos huecos dejados por anulaciones.

Lo he intentado de mil formas y no lo he conseguido.

Te ruego que si ves algo que no entiendas o que esté confuso me lo hagas saber.

Un saludo y gracias por tu atención
Un saludo
Arriba
emiliove Ver desplegable
Administrador
Administrador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5694
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita emiliove Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 08/Abril/2021 a las 23:00
Mientras te contesta Xavi, se me ocurren dos formas mediante un Recordset recorres la tabla envases hasta encontrar el faltante y lo asignas al nuevo envase.
Y la otra forma es usar la tabla números con ella puedes buscar los números faltantes y mediante un DPrimero asignar el primer valor encontrado al nuevo envase, un ejemplo de la tabla números:
Arriba
Absalón Ver desplegable
Nuevo
Nuevo


Unido: 27/Marzo/2021
Localización: Málaga
Estado: Sin conexión
Puntos: 27
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Absalón Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 09/Abril/2021 a las 13:20
Gracias por tu respuesta y ayuda, emiliove.

Lo voy mirando mientras me contesta Xavi.
y gracias de nuevo.


Un saludo
Arriba
Absalón Ver desplegable
Nuevo
Nuevo


Unido: 27/Marzo/2021
Localización: Málaga
Estado: Sin conexión
Puntos: 27
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Absalón Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 14/Abril/2021 a las 20:41
Hola Xavi;

He mandado un mensaje descriptivo de lo que quiero hacer, por favor, échale un vistazo y me comentas cómo lo ves, y si le ves alguna otra solución que tú creas más oportuna o factible.

Gracias
Un saludo
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable