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

Tema cerradoCrear funcion

 Responder Responder
Autor
Mensaje
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 2082
Enlace directo a este mensaje Tema: Crear funcion
    Enviado: 19/Agosto/2019 a las 09:52
Hola. Estoy intentanto modificar una rutina de Miuhra para convertirla en una funcion y poder llamarla desde cualquier parte de la aplicacion.

Para que sea practica de utilizar tengo que pasarle un tercer parametro, el nombre de la tabla. Es aqui donde fallo, la he declarado como objeto, pero a la hora de llamarla por mas que pruebo me da errores.
Para llamarla lo intento asi.
'
'*******************************
Dim varNumeroId As String
RT_Modulo_Contadores "NombreFormulario",NombreTabla, varNumeroId    
Me.NombreCampoID = varNumeroId
'**********************************
Tambien he probado asi
'****************************
Dim varNumeroId As String
Dim varTabla as Object
Set varTabla = Tabla1   'Nombre de la tabla
RT_Modulo_Contadores "NombreFormulario",NombreTabla, varNumeroId    
Me.NombreCampoID = varNumeroId
'***************************

A ver si veis el fallo....... esta relacionado con NombreTabla

Aqui la funcion de Mihura

'---------------------------------------------------------------------------------------------
' Autor : JESUS MANSILLA CASTELLS -Mihura-

'---------------------------------------------------------------------------------------------
Function RT_Modulo_Contadores(NombreFormulario As String, NombreTabla As Object, Numero As Variant)

Dim dbExterna As Database
Set dbExterna = CurrentDb


Dim I As Double, NombreTabla As dao.Recordset
Set NombreTabla = CurrentDb.OpenRecordset("SELECT * FROM [tbContadores] WHERE Codigo_con = '" & NombreFormulario & "'")
If NombreTabla.RecordCount = 0 Then
         MsgBox "Error tabla contadores. Codigo : " & NombreFormulario, vbCritical, "TECSYS"
     Else
         On Error GoTo Error_rut
         NombreTabla.LockEdits = True
         NombreTabla.Edit
         NombreTabla("Valor_con") = NombreTabla("Valor_con") + 1
         Numero = NombreTabla("Valor_con")
         NombreTabla.Update
End If
NombreTabla.Close
Exit Function

Error_rut:
For I = 1 To 50000: Next
Resume
Return

End Function


Editado por rokoko - 19/Agosto/2019 a las 09:53
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11096
Enlace directo a este mensaje Enviado: 19/Agosto/2019 a las 10:19
Función RT_Modulo_Contadores(Código as string) As Long


Con estos cambios (más alguno interno) ya la puedes llamar directamente desde donde quieras que te devuelva el contador.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 2082
Enlace directo a este mensaje Enviado: 19/Agosto/2019 a las 16:22
Pues parece que funciona, pero no se porque....Ouch
No le hace falta a la funcion pasarle el nombre de la tabla??? Tal y como lo tengo da igual el nombre que le ponga....Ermm los que esta en negrita es el nombre de la tabla, y es indiferente lo que le ponga, que funciona.....

'---------------------------------------------------------------------------------------------
' Autor : JESUS MANSILLA CASTELLS -Mihura-
'*******************************
'Para llamarla
'Dim varId As String
'RT_Modulo_Contadores "NombreFormulario",varId    
'Me.NombreCampo = varId
'**********************************
Function RT_Modulo_Contadores(NombreFormulario As String, Numero As Variant) As Long
Dim dbExterna As Database
Set dbExterna = CurrentDb



Dim I As Double, Tablaxxx As dao.Recordset
Set Tablaxxx = CurrentDb.OpenRecordset("SELECT * FROM [tbContadores] WHERE Codigo_con = '" & NombreFormulario & "'")
If Tablaxxx.RecordCount = 0 Then
         MsgBox "Error tabla contadores. Codigo : " & NombreFormulario, vbCritical, "TECSYS"
     Else
         On Error GoTo Error_rut
         Tablaxxx.LockEdits = True
         Tablaxxx.Edit
         Tablaxxx("Valor_con") = Tablaxxx("Valor_con") + 1
         Numero = Tablaxxx("Valor_con")
         Tablaxxx.Update
End If
Tablaxxx.Close
Exit Function

Error_rut:
For I = 1 To 50000: Next
Resume
Return
End Function


Editado por rokoko - 19/Agosto/2019 a las 16:23
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4310
Enlace directo a este mensaje Enviado: 19/Agosto/2019 a las 18:07
Tablaxxx As dao.Recordset es una Variable y como tal da Igual el nombre que le pongas siempre y cuando No uses una palabra reservada de Access

En..... FROM [tbContadores] .... es donde contiene el Nombre real de la Tabla que quieres atacar
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 2082
Enlace directo a este mensaje Enviado: 20/Agosto/2019 a las 09:45
Pues aun me cuesta pillarlo....el codigo va en un modulo, option explicit esta puesto y yo no declarado esa variable (Tablaxxx) , a no ser que se quede como long, pero long es para numeros..... estoy un poco perdido...
    
Function RT_Modulo_Contadores(NombreFormulario As String, Numero As Variant) As Long
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4310
Enlace directo a este mensaje Enviado: 20/Agosto/2019 a las 16:15
Publicado originalmente por rokoko rokoko escribió:

........./.... yo no declarado esa variable (Tablaxxx) ..../....


Por supuesto que estas declarando la variable !! ,..... la variable Tablaxxx la estas declarando AQUI

Dim I As Double, Tablaxxx As dao.Recordset

Lo mismo escrito de otro modo

Dim I As Double
Dim Tablaxxx As DAO.Recordset


La Tabla No es long  tu tabla esta declarada como DAO.Recordset

Otra cosa son los campos que componen esa Tabla , pero eso es ya otra historia muy distinta, pero insisto tu Tabla como tal la tienes declarada como DAO.Recordset

Si quieres puedes tambien declararla como Object

Dim Tablaxxx As Object


 
Otra cosa:
La Variable  dbExterna No se esta usando ,...... se podria borrar....... al menos en la funcion que has escrito.........

Dim dbExterna As Database  '<< Se podria Borrar


 



 



Editado por javier.mil - 20/Agosto/2019 a las 16:23
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11096
Enlace directo a este mensaje Enviado: 20/Agosto/2019 a las 17:37
Veamos, que dijo un ciego ...  LOL

La función original es:
'--------------------------------------------------------------------------------------------- 
' Autor : JESUS MANSILLA CASTELLS -Mihura-
'--------------------------------------------------------------------------------------------- 
Sub RT_Modulo_Contadores(codigo As String, Numero As Variant) 
Dim i As Double, Mitabla As DAO.Recordset 
Set Mitabla = CurrentDb.OpenRecordset("SELECT * FROM [TContadores] WHERE Codigo_con = '" & codigo & "'") 
If Mitabla.RecordCount = 0 Then 
         MsgBox "Error tabla contadores. Codigo : " & codigo, vbCritical, "TECSYS" 
     Else 
         On Error GoTo Error_rut 
         Mitabla.LockEdits = True 
         Mitabla.Edit 
         Mitabla("Valor_con") = Mitabla("Valor_con") + 1 
         Numero = Mitabla("Valor_con") 
         Mitabla.Update 
End If 
Mitabla.Close 
Exit Sub 

Error_rut: 
For i = 1 To 50000: Next 
Resume 
Return 

End Sub

Que traducida a función queda:

Function RT_Modulo_Contadores(Codigo As String) As Long
    Dim i As Double, Mitabla As Recordset
    Set Mitabla = CurrentDb.OpenRecordset("SELECT * FROM [TContadores] WHERE Codigo_con = '" & Codigo & "'")
    If Mitabla.RecordCount = 0 Then
        MsgBox "Error tabla contadores. Codigo : " & Codigo, vbCritical, "TECSYS"
    Else
        On Error GoTo Error_rut
        Mitabla.LockEdits = True
        Mitabla.Edit
        Mitabla("Valor_con") = Mitabla("Valor_con") + 1
        RT_Modulo_Contadores = Mitabla("Valor_con")
        Mitabla.Update
    End If
    Mitabla.Close
    Exit Function

Error_rut:
    For i = 1 To 50000: Next
    Resume
    Return

End Function

Tienes un error de concepto gordo, el parámetro que se pasa no es el nombre de la tabla a cambiar, sino la clave del registro de la tabla de contadores que contiene el valor a usar.

La rutina original: Rutina contadores






Editado por Mihura - 20/Agosto/2019 a las 17:38
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 2082
Enlace directo a este mensaje Enviado: 20/Agosto/2019 a las 20:17
DeadDead  Vale vale, ahora lo pillo...Smile,  yo siempre ponia el nombre de la tabla de mi base de datos en MiTabla.Ouch 

Lo de Dim dbExterna As Database
Set dbExterna = CurrentDb  lo puse en su dia para tablas en Back end......lo dejo puesto en principio, ya que asi funciona con tablas internas como externas.



Saludos



Y gracias a los dos por aclararme dudas.


Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 2082
Enlace directo a este mensaje Enviado: 01/Septiembre/2019 a las 15:40
Se puede cerrar

Gracias!!!
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable