** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Problema con autonumerico:
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoProblema con autonumerico:

 Responder Responder
Autor
Mensaje
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 807
Enlace directo a este mensaje Tema: Problema con autonumerico:
    Enviado: 12/Abril/2020 a las 12:11
Buenos dias:

Estoy intentando usar una funcion creada por Emilio hace años:
'***********************************************************************************
'* Función que calcula el valor máximo de una tabla y un campo pasados como parámetros
'* uso: AutoNumerico("Pendientes","id")
'* ESH 09/09/00 15:50
'***********************************************************************************
Public Function AutoNumerico(strTabla As String, strCampo As String) As Integer
Dim dbs As Database, _
    rst As Recordset, _
    strMaximo As String
' creo una cadena con la select para obtener el valor más alto del campo
strMaximo = "SELECT Max(" & strCampo & ") as Mayor FROM    " & strTabla
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(strMaximo)   ' abro un recordset con esa cadena
If IsNull(rst!Mayor) Then
    AutoNumerico = 1                     ' si la tabla está vacía
Else
    AutoNumerico = rst!Mayor + 1         ' devuelvo el valor incrementado en uno
End If
' cierro el recordset
rst.Close
Set rst = Nothing
Set dbs = Nothing
End Function     ' AutoNumerico

donde strcampo=referencia, numerico y con esta extructura:

strtabla es la tabla , vinculada, desde otro access.

me devuelve un error 13 de "Error de coincidencia de tipos" en la linea  en rojo.

haciendo pruebas me he dado cuenta que si escribo un debug.print dbs en el panel de inmediato, me lanza el error (creo que debiera dar el nombre de la base, pero no lo se seguro).

Este codigo tiene años, estoy usando access 2013 aunque la base es mdb (por alguna extraña razon me gusta mas).

Como supongo que Emilio despues de los años que lleva en esto no va a cometer errores, mi pregunta es  ¿alguna incompatibilidad conocida?

Como siempre gracias por adelantado.
Recordar de que soy nuevo y estoy aprendiendo.
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6479
Enlace directo a este mensaje Enviado: 12/Abril/2020 a las 13:36
Hola!

Acabo de probar el código con una tabla vinculada y funciona correctamente.
Un Saludo.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 12/Abril/2020 a las 13:51
¿Puedes poner los valores exactos de strCampoy strTabla?

Por otro lado intenta declara dbs como DAO.Database y rst como DAO.Recordset (por si las moscas)

Xavi, un minyó de Terrassa

Mi web
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 12/Abril/2020 a las 15:56
Un par de apuntes:

Si no coinciden los tipos, asegurate que en la parte 
strMaximo = "SELECT Max(" & strCampo & ") as Mayor FROM    " & strTabla
No lo he comprobado, pero mira que strCampo se refiera a un campo numérico y no a uno de texto para de la función Max no se queje

Por otro lado lo de declarar las librerias antes del tipo de objeto, en varios post de este mismo foro he leido que siempre es muy aconsejable. 
La razón es que varias librerías pueden tener un objeto con el mismo nombre, y para evitar conflictos, o bien se tiene mucho cuidado con la prioridad de las referencias,
 o mejor opción, declaramos la librería antes del objeto
El objeto Recordset por ejemplo, lo tienen tanto Access, DAO, ADODB, ADOX y seguro muchas otras librerías. 
Y lo contienen con algunas propiedades y métodos diferentes , y otras iguales
Por eso estoy de acuerdo con xavi

Para acabar, la instrucción Debug.Print sólo tiene un objetivo, que es el de imprimir en la pantalla de inmediato el valor que le pasemos en forma de variable o una cadena, pero debe de ser eso, algo que pueda imprimir.
dbs es un objeto con varios métodos y propiedades y creo que no tiene propiedad pretederminada, por eso, entre otras razones,  el comando Debug.Print dbs genera error, por que no encuentra "nada" para imprimir, deberías usar
 Debug.Print dbs.PropiedadQueSea.Value 
o Debug.Print dbs.TableDef(NombreTabla).Fields.Count   
etc, es decir, siempre un valor, no un objeto
También decir que para que dbs sea algo, hay que establecerlo con un Set dbs... lo que sea
para poder usar lo de antes, en la misma pantalla de inmediato habría que escribir Set dbs=...
lo que creo que no está permitido (No lo he probado)

Resumo. Y perdón por extenderme tantoWink
Mira el tipo de campo que tienes como strCampo (Que sea numério) 
Atiende al consejo de Xavi y declara la bibliotecas
y si necesitas conocer algún valor de dbs, crea un procediciento aparte para ello, o coloca un Stop en tu código y revisa la ventana de Locales

Un saludo Wink


Editado por Dabellaso - 12/Abril/2020 a las 16:00
El saber no ocupa lugar, sólo tiempo
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 12/Abril/2020 a las 16:23
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 12/Abril/2020 a las 17:05
Estoy probando y cuando dije que strCampo se refiera a un campo numérico y no a uno de texto para de la función Max no se queje, olvídalo, Max también funciona con campos de texto (siempre y cuando estos contengan únicamente números).

Pero tanto con campo numérico como con campo de texto(con valores números), me genera otros errores
He duplicado la consulta generada directamente en el editor de consultas y a priori me genera error que que el campo no forma parte de la función de agregado, he probado haciendo una consulta de totales y funciona bien. Depués hice consulta de selección nuevamente y ahora funciona. No entiendo por que.

Estoy viendo el código de Mihura que me parece super interesante, a ver si logro entenderlo y aplicarlo correctamente. Gracias Mihura

   
El saber no ocupa lugar, sólo tiempo
Arriba
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 807
Enlace directo a este mensaje Enviado: 12/Abril/2020 a las 20:41
Vamos despacio, pasado este codigo
strMaximo = "SELECT Max(" & strCampo & ") as Mayor FROM " & strTabla
el resultado, pasado a una consulta directamente, funciona y da el resultado correcto.
strcampo es referencia, strtabla es general (tabla que contiene el campo referencia)

Set dbs = CurrentDb si en este punto pongo un debug,print dbs, yo supongo que debiera resultar la base de datos actual (Ojo no lo se, y por las explicaciones que me da dabellaso es no)
pero me lanza el mismo error 13

Set rst = dbs.OpenRecordset(strMaximo)
Aqui me señala el error.


Recordar de que soy nuevo y estoy aprendiendo.
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 12/Abril/2020 a las 21:31
En mi caso que comente antes, me di cuenta de que al principio escribí mal mis campos, por eso me daba errores.

Ahora me funciona
y el error de que no coinciden los tipos, me lo daba en otra linea (por intentar sumar números a letras letra). No sé que decir. Voy a intentar reproducir el error 13 en esa linea
El saber no ocupa lugar, sólo tiempo
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6479
Enlace directo a este mensaje Enviado: 12/Abril/2020 a las 22:06
Hola!

Crea una nueva base de datos e importa todos los datos de tu anterior base de datos. A veces funciona por tener la base limpia.
Un Saludo.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 12/Abril/2020 a las 22:28
¿Has probado lo que te indiqué en mi primer mensaje en este hilo?

Si tienes marcadas las referencias Microsoft ActiveX Data Objects x.x Library y alguna de DAO por debajo de ella, al declarar Database y Recordset sin prefijo, interpretará ADO en lugar de DAO.

En cualquier caso, la función es sustituible por esto:

Nz(DMax("referencia", "general"), 0)+1

Me consta que, como dijiste en otro hilo, lo haces por aprender así que pongo la alternativa solo a modo de ejemplo de que las cosas se pueden hacer de varias formas.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 807
Enlace directo a este mensaje Enviado: 13/Abril/2020 a las 09:53
Buenos dias señores:

Una vez realizadas las pruebas propuestas (Incluida la de Xavi), me seguia dando el error, pero , me di cuenta que algunas veces no lo daba (¿?), en una de las pruebas que he realizado en vez de in end if escribi por error edn if, hice correr el codigo y cosa curiosa, no daba el error de codigo erroneo (de nuevo ¿?).

Tras trastear por google sobre el tema, decido pasar todos los formularios, codigo y demas, a otra base en blanco, ¡e voila! ahora funciona todo. Lo que me lleva  a pensar que de alguna manera, la base se habia corrompido y me estaba haciendo cosas raras.

Como esto de una base en mal estado, me ha ocurrido varias veces (aunque lo normal es que de errores al abrir) mi pregunta al aire es:

Suelo trabajar desde pen-drive, ya que lo hago en diversos entornos (Fijo de casa u oficina, portatil) mi pregunta es ¿No supondra una fuente de errores dicho dispositivo? (en otra pregunta que realice hace algun tiempo, pregunte sobre tener el back-end en drowbox o similar, ya que me averiaba constantemente la base, me respondieron que es imposible) ¿No ocurrira algo parecido con el pen-drive?

Muchas gracias por la ayuda a todos, por mi parte se puede cerra el hilo, salvo que alguien quiera comentar algo nuevo.

Recordar de que soy nuevo y estoy aprendiendo.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 13/Abril/2020 a las 10:18
Para evitar errores de tecleo, falta de declaración de variables, etc .... tienes que forzar su 'buen uso' incluyendo en todos los formularios / informes / modulos la opción:

Option Explicit

Justo después de Option Compare Database.

Y además compilar el código después de cada cambio, yo tengo juntos los botones de compilar y guardar de forma que cada cambio que hago primero compilo y después guardo (así me cubro de posibles sorpresas con los cierres inesperados y pérdidas de trabajo).



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

Access Aplicaciones
Tecsys.es
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 13/Abril/2020 a las 11:26
Nota: para no tener que teclear cada vez Option Explicit, ves a Herramientas/Opciones del editor de VBA, y en la pestaña editor, marca la segunda casilla (Requerir declaración de variables). De esa forma ya aparecerá automáticamente en cada nuevo módulo.

Jesús, no se me había ocurrido poner el botón al lado... tengo tan interiorizado Alt+D+intro  después de cada cambio que no se me había ocurrido. Lo pondré igualmente
Xavi, un minyó de Terrassa

Mi web
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 13/Abril/2020 a las 11:31
Lo de que lo ponga automáticamente yo ya lo tengo hecho, lo que no había es 'pensado' en ponerlo aquí', ... como digo en otro hilo, necesito salir a tomar el fresco ... Wink


Otra cosa es que muchísima gente no lo pone, ni compila,  ... eso se ve (se sufre) cuando tocas cosas de otra gente Unhappy.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 807
Enlace directo a este mensaje Enviado: 16/Enero/2021 a las 13:08
este hilo se puede cerrar.

El error, como comente en algún momento, fue de que cambien el nombre de un campo por otro (acentuado, si no recuerdo mal)
Recordar de que soy nuevo y estoy aprendiendo.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable