Imprimir página | Cerrar ventana

Crear funcion

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84651
Fecha de impresión: 26/Marzo/2026 a las 22:25


Tema: Crear funcion
Publicado por: rokoko
Asunto: Crear funcion
Fecha de publicación: 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



Respuestas:
Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: rokoko
Fecha de publicación: 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


Publicado por: javier.mil
Fecha de publicación: 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


-------------
https://www.accessdemo.info" rel="nofollow - https://www.accessdemo.info





Publicado por: rokoko
Fecha de publicación: 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...
https://docs.microsoft.com/es-es/office/vba/language/reference/user-interface-help/long-data-type" rel="nofollow - https://docs.microsoft.com/es-es/office/vba/language/reference/user-interface-help/long-data-type
    
Function RT_Modulo_Contadores(NombreFormulario As String, Numero As Variant) As Long


Publicado por: javier.mil
Fecha de publicación: 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


 



 



-------------
https://www.accessdemo.info" rel="nofollow - https://www.accessdemo.info





Publicado por: Mihura
Fecha de publicación: 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:  http://www.accessaplicaciones.com/ejemplos.html#rt05" rel="nofollow - Rutina contadores






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

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: rokoko
Fecha de publicación: 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.




Publicado por: rokoko
Fecha de publicación: 01/Septiembre/2019 a las 15:40
Se puede cerrar

Gracias!!!



Imprimir página | Cerrar ventana