Numerar registros de forma única con un condiciona |
Responder |
Autor | |
Absalón
Nuevo Unido: 27/Marzo/2021 Localización: Málaga Estado: Sin conexión Puntos: 27 |
Opciones de entrada
Gracias(0)
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
|
|
Absalón
Nuevo Unido: 27/Marzo/2021 Localización: Málaga Estado: Sin conexión Puntos: 27 |
Opciones de entrada
Gracias(0)
|
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
|
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 06/Mayo/2005 Localización: En la dehesa Estado: en línea Puntos: 14023 |
Opciones de entrada
Gracias(0)
|
¿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. |
|
Absalón
Nuevo Unido: 27/Marzo/2021 Localización: Málaga Estado: Sin conexión Puntos: 27 |
Opciones de entrada
Gracias(0)
|
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
|
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14738 |
Opciones de entrada
Gracias(0)
|
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.
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 |
|
Absalón
Nuevo Unido: 27/Marzo/2021 Localización: Málaga Estado: Sin conexión Puntos: 27 |
Opciones de entrada
Gracias(0)
|
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
|
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14738 |
Opciones de entrada
Gracias(0)
|
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 |
|
Absalón
Nuevo Unido: 27/Marzo/2021 Localización: Málaga Estado: Sin conexión Puntos: 27 |
Opciones de entrada
Gracias(0)
|
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
|
|
emiliove
Administrador Unido: 16/Junio/2009 Localización: Mexico Estado: Sin conexión Puntos: 5694 |
Opciones de entrada
Gracias(0)
|
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:
|
|
Absalón
Nuevo Unido: 27/Marzo/2021 Localización: Málaga Estado: Sin conexión Puntos: 27 |
Opciones de entrada
Gracias(0)
|
Gracias por tu respuesta y ayuda, emiliove.
Lo voy mirando mientras me contesta Xavi. y gracias de nuevo.
|
|
Un saludo
|
|
Absalón
Nuevo Unido: 27/Marzo/2021 Localización: Málaga Estado: Sin conexión Puntos: 27 |
Opciones de entrada
Gracias(0)
|
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
|
|
Responder | |
Tweet
|
Ir al foro | Permisos de foro Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |