Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Uso de ParamArray dentro de una clase

Estas en el tema de Uso de ParamArray dentro de una clase en el foro de Visual Basic clásico en Foros del Web. Hola a Todos En esta ocasiion necesito de su colaboracion para resolver el siguiente problemita... Estoy desarrollando un clase de tipo utilitaria que sirva como ...
  #1 (permalink)  
Antiguo 21/01/2011, 16:37
Avatar de DexterGlue  
Fecha de Ingreso: septiembre-2010
Ubicación: Managua
Mensajes: 60
Antigüedad: 13 años, 7 meses
Puntos: 0
Busqueda Uso de ParamArray dentro de una clase

Hola a Todos

En esta ocasiion necesito de su colaboracion para resolver el siguiente problemita...

Estoy desarrollando un clase de tipo utilitaria que sirva como capa intermedia entre la interrfaz de usuario y la base de datos. En dicha clase tengo la siguiente funcion

Código:
Public Function SaveRecords(Procedure As String, CommandType As ADODB.CommandTypeEnum, ParamArray Param() As Variant) As ADODB.Recordset
     Set SaveRecords = LoadProcedure(Procedure, CommandType, Param())   
End Function
La funcion manda a llamar a otra funcion que me permite ejecutar una sentencia TSQL cuaquiera, pasandole los parametros que requiere a un objecto ADO Command.

Los parametros son lo siguientes:
  • Procedure: contiene la sentencia TSQL a ejecutar (SELECT, INSERT, UPDATE, SP)
  • CommandType: Identificador del tipo de sentecia a ejecutar, segun lo indicado por ADODB.CommandTypeEnum
  • Param(): listado de parametros a utilizar por la funcion, propiamente dicho para los SP

Ejemplo:

Código:
Objecto.SaveRecords "PA_SaveRecord", adCmdStoredProc, txtSucursal, txtMonto, txtFecha
DOnde
"PA_SaveRecord", es un procedimiento que se encuentra en el servidor,
adCmdStoredProc, es un valor que le indica al command el tipo de TSQL a ejecutar
txtSucursal, txtMonto, txtFecha, son parte de los parametros que recibe "PA_SaveRecord"


La funcion LoadProcedure simplemente le pasa los parametros de la funcion SaveRecords y ejecuta un objeto command.

Código:
Public Function LoadProcedure(Procedure As String, CommandType As ADODB.CommandTypeEnum, ParamArray Param() As Variant) As ADODB.Recordset
On Error GoTo ValidateErr
Dim comMain As ADODB.Command, param2 As Variant

If cn Is Nothing Then Set cn = New ADODB.Connection
If cn.State <> adStateOpen Then cn.Open StrConn
If comMain Is Nothing Then Set comMain = New ADODB.Command

comMain.CommandType = CommandType
comMain.CommandText = Procedure

If UBound(Param(), 1) > 0 Then
    Select Case TypeName(Param(0))
    Case "Integer"
                comMain.Parameters.Append comMain.CreateParameter("IdParam", adInteger, , , Param(0))
    Case "String"
                comMain.Parameters.Append comMain.CreateParameter("IdParam", adBSTR, , Len(CStr(Param(1))), CStr(Param(1)))
    Case "Date"
                comMain.Parameters.Append comMain.CreateParameter("IdParam", adDate, , , Param)    
    End Select
End If
comMain.ActiveConnection = cn

Set LoadProcedure = comMain.Execute

ValidateErr:
          msgbox  MsgBox Err.Description, vbInformation, Err.Source & " - Error Number: " & Err.Number
           Err.clear

ValidateExit:

If comMain.State = adStateOpen Then comMain.Cancel
Set comMain = Nothing

End Function
Ahora el punto esta que al pasar el Param() de la funcion SaveRecords a la funcion LoadProcedure, este se va como un elemento del arreglo que esta dentro de la funcion LoadProcedure y en este punto no se como acceder a los elementos que se pasaron como parametros por la funcion SaveRecords.

Agradeceria la ayuda que me puedan brindar en este tema
  #2 (permalink)  
Antiguo 22/01/2011, 03:15
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Uso de ParamArray dentro de una clase

No tengo muy claro el asunto, pero creo que el array param() lo deberías pasar como matriz.
Algo así:

Código vb:
Ver original
  1. Private Sub Command1_Click()
  2.   funcion1 "p1", "p2"
  3. End Sub
  4.  
  5. Private Sub funcion1(ParamArray param() As Variant)
  6.   Dim matriz() As Variant
  7.   ReDim matriz(UBound(param))
  8.   Dim f As Long
  9.   For f = 0 To UBound(param)
  10.     matriz(f) = param(f)
  11.   Next f
  12.   funcion2 matriz()
  13. End Sub
  14.  
  15. Private Sub funcion2(param() As Variant)
  16.   Dim f As Long
  17.   For f = 0 To UBound(param)
  18.     MsgBox param(f)
  19.   Next f
  20. End Sub
Saludos

PD: Notarás que he creado una nueva matriz para llenarla con la matriz que llegó con el paramarray. Es necesario, ya que la matriz del paramarray no parece ser válida para ser mandada a otra función, de modo que tuve que crear una nueva matriz para llamar a la funcion2. Al menos a mí no me dejó mandarla directamente.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Última edición por pkj; 22/01/2011 a las 03:30
  #3 (permalink)  
Antiguo 24/01/2011, 10:53
Avatar de DexterGlue  
Fecha de Ingreso: septiembre-2010
Ubicación: Managua
Mensajes: 60
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Uso de ParamArray dentro de una clase

Hola PKJ

Gracias por la pronta respuesta... verificare lo que me comentas. Aun que el problema que tengo es que al meter la matriz que viene como parametro dentro de la funcion LoadProcedure recive el parametro como un elemento de la matriz, asi que al final tengo dentro de la funcion SaveRecords una matriz con un elemento... y ese elemento es otra matriz.

Al final el proposito de la funcion LoadProcedure, es ejecutar cualquier tipo de T-SQL (SELECT, INSERT, UPDATE, EXECUTE) en la base de datos y traer de regreso los datos, en caso de que asi sea, y poder devolverlos a las funciones que lo llamen..

Asi por ejemplo SaveRecords es solo una funcion que hace uso de LoadProcedure igualmente tengo otra funcion que me permite cargar catalogos, y otros tipos de informacion a controles que ya tengo definidos, y para recuperar la informacion hago uso de la funcion LoadProcedure.

Nuevamente agradezgo tu colaboracion
Saludos
  #4 (permalink)  
Antiguo 24/01/2011, 11:00
Avatar de DexterGlue  
Fecha de Ingreso: septiembre-2010
Ubicación: Managua
Mensajes: 60
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Uso de ParamArray dentro de una clase

Hola PKJ

Gracias por la pronta respuesta... verificare lo que me comentas. Aun que el problema que tengo es que al meter la matriz que viene como parametro dentro de la funcion LoadProcedure recive el parametro como un elemento de la matriz, asi que al final tengo dentro de la funcion SaveRecords una matriz con un elemento... y ese elemento es otra matriz.

Al final el proposito de la funcion LoadProcedure, es ejecutar cualquier tipo de T-SQL (SELECT, INSERT, UPDATE, EXECUTE) en la base de datos y traer de regreso los datos, en caso de que asi sea, y poder devolverlos a las funciones que lo llamen..

Asi por ejemplo SaveRecords es solo una funcion que hace uso de LoadProcedure igualmente tengo otra funcion que me permite cargar catalogos, y otros tipos de informacion a controles que ya tengo definidos, y para recuperar la informacion hago uso de la funcion LoadProcedure.

Nuevamente agradezgo tu colaboracion
Saludos
  #5 (permalink)  
Antiguo 15/02/2011, 17:22
Avatar de DexterGlue  
Fecha de Ingreso: septiembre-2010
Ubicación: Managua
Mensajes: 60
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Uso de ParamArray dentro de una clase

Le agradecria si alguien pudiera ayudarme con esta interrogante ya que todabia sigo con el mismo problema...

Saludos
  #6 (permalink)  
Antiguo 17/02/2011, 04:10
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Uso de ParamArray dentro de una clase

Si lo he entendido bien, y despues de darle vueltas y hacer nuevas pruebas, la solucion más simple es la única que se me ocurre que pueda funcionar.

Si siempre va a entrar la misma cantidad de parámetros solo tendrias que crear una linea que los cargue uno a uno:

Código vb:
Ver original
  1. Set SaveRecords = LoadProcedure(Procedure, CommandType, Param(0), Param(1), Param(2))


Sin embargo, si es un paramarray suele ser porque no se sabe cuantos parametros va a recibir, de modo que la unica solucion que se me ocurre y que debe funcionar es hacer la llamada segun la cantidad de parametros que arrastre param():

Código vb:
Ver original
  1. if ubound(param)=0 then
  2.  
  3.   Set SaveRecords = LoadProcedure(Procedure, CommandType, Param(0))
  4.  
  5. elseif ubound(param)=1 then
  6.  
  7.   Set SaveRecords = LoadProcedure(Procedure, CommandType, _
  8. Param(0), Param(1))
  9.  
  10. elseif ubound(param)=2 then
  11.  
  12.   Set SaveRecords = LoadProcedure(Procedure, CommandType, _
  13. Param(0), Param(1), _
  14. Param(2))
  15.  
  16. '...etc
  17. '...etc
  18. '...debes poner hasta un valor alto por si entra un comando con muchos parametros
  19.  
  20. 'p.ej:
  21. elseif ubound(param)=30 then
  22.   Set SaveRecords = LoadProcedure(Procedure, CommandType, _
  23. Param(0), Param(1) _
  24. Param(2), Param(3) _
  25. Param(4), Param(5) _
  26. Param(6), Param(7) _
  27. Param(8), Param(9) _
  28. Param(10), Param(11) _
  29. Param(12), Param(13) _
  30. Param(14), Param(15) _
  31. Param(16), Param(17) _
  32. Param(18), Param(19) _
  33. Param(20), Param(21) _
  34. Param(22), Param(23) _
  35. Param(24), Param(25) _
  36. Param(26), Param(27) _
  37. Param(28), Param(29) _
  38. Param(30))
  39.  
  40. ' y si son demasiados parametros podemos avisar
  41. Else
  42.   MsgBox "Demasiados parámetros en la llamada a LoadProcedure"
  43.  
  44. End If
Yo es que no consigo recibir ni la matriz dentro de otra matriz, porque me da error de tipos diferentes de datos, de modo que no puedo llegar mas lejos que esto. Espero que al menos te saque del paso si no lo habias hecho ya.

Suerte
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:37.