Autor Tema: [AYUDA] Mejorar esta funcion  (Leído 5724 veces)

0 Usuarios y 1 Visitante están viendo este tema.

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
[AYUDA] Mejorar esta funcion
« en: Octubre 07, 2014, 02:45:24 pm »
Hola tengo esta función que uso con algunos ComboBox y el mismo modo uso en varios formularios, pero a veces solo necesito cargar solo un combo o a veces mas de 2

Código: (VB) [Seleccionar]
Public Sub CARGAR_COMBOS(ByVal strSQL As String, ByVal xCombo1 As ComboBox, ByVal xCombo2 As ComboBox)
       
    xCombo1.Clear
    xCombo2.Clear
   
    strSQL = strSQL
    rsADO.Open strSQL, cnADO, adOpenStatic, adLockOptimistic, adCmdText
           
    Do Until rsADO.EOF
        With rsADO
            xCombo1.AddItem .Fields(xId) & "|" & .Fields(xNombre)
            xCombo2.AddItem .Fields(xId) & "|" & .Fields(xNombre)
            rsADO.MoveNext
        End With
    Loop
   
End Sub


Para usarlos hago asi:

Código: (VB) [Seleccionar]
Private Sub Command1_Click()
   
    Call CARGAR_COMBOS("SELECT * FROM lista_banco, txtCombo1,txtCombo2")
   
End Sub


El problema que tengo es que a veces necesito cargar solo un combo y con la funcion que cree tengo que ocultar un combo que nunca voy a usar, tambien solucione creando varios funciones por ejemplo CARGAR_SOLO_UN_COMBO, CARGAR_DOS_COMBOS, etc.

Ojala me entiendan...
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:[AYUDA] Mejorar esta funcion
« Respuesta #1 en: Octubre 07, 2014, 03:39:02 pm »
ja ja que funcion rebuscada  :D

Yo tengo algo parecido, pero solo carga un combo.

Se me ocurre, si haces una que solo cargue un combo, y otra que copie contenido de un combo en otro?
De esa manera usas siempre CARGAR_COMBO y si en el proyecto hay otro combo usas COPIAR_COMBO(combo1,combo2)

Algo asi se me ocurre.


E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:[AYUDA] Mejorar esta funcion
« Respuesta #2 en: Octubre 07, 2014, 03:47:35 pm »
Siiii jejeje muy rebuscada pero funciona bien solo quiero modernizar por decirlo jeje.

La idea que tengo es por ejemplo:

CALL CARGAR_COMBO("SELECT * FROM lista_banco" aca al poner una coma que me cargue el primer combo, si pongo otro que vaya generado los xCombo segun necesite)

pero si solo pongo un combo que no me pida o no tire error.
« última modificación: Octubre 07, 2014, 03:50:29 pm por E N T E R »
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:[AYUDA] Mejorar esta funcion
« Respuesta #3 en: Octubre 07, 2014, 03:57:04 pm »
Podrías probar así:

Código: (vb) [Seleccionar]
Public Sub CARGAR_COMBOS(ByVal strSQL As String, ParamArray combos() As Variant)
    Dim i as Integer, j As Integer
    j = UBound(combos)
    for i = 0 to j
        Call combos(i).Clear
    Next
   
    strSQL = strSQL
    rsADO.Open strSQL, cnADO, adOpenStatic, adLockOptimistic, adCmdText
           
    Do Until rsADO.EOF
        With rsADO
            For i = 0 To j
                Call combos(i).AddItem(.Fields(xId) & "|" & .Fields(xNombre))
            Next
            rsADO.MoveNext
        End With
    Loop
End Sub


Y así lo podrás cargar con infinitos combos (...bueno, hay un limite, ni idea cual es)
PD: Explota si le mandas algo que no sea un combobox

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:[AYUDA] Mejorar esta funcion
« Respuesta #4 en: Octubre 07, 2014, 04:00:10 pm »
jajaja, que maquina ahora seee muchas gracias amigo Raul
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:[AYUDA] Mejorar esta funcion
« Respuesta #5 en: Octubre 07, 2014, 04:01:06 pm »
Me ganó Raul, yo habia pensado algo asi, de esta forma no da error, pero tiene un limite

Private Sub CargarCombos(oCombo1 As ComboBox, Optional oCombo2 As ComboBox, Optional oCombo3 As ComboBox)
   
    oCombo1.AddItem "UNO"
    oCombo1.AddItem "DOS"
   
    If Not oCombo2 Is Nothing Then
        oCombo2.AddItem "UNO"
        oCombo2.AddItem "DOS"
    End If
   
    If Not oCombo3 Is Nothing Then
        oCombo3.AddItem "UNO"
        oCombo3.AddItem "DOS"
    End If
   

End Sub

AxioUK

  • Megabyte
  • ***
  • Mensajes: 108
  • Reputación: +17/-1
  • Modulos GSL
    • Ver Perfil
Re:[AYUDA] Mejorar esta funcion
« Respuesta #6 en: Octubre 08, 2014, 03:15:56 am »
Buuu por no Leer apropiadamente.....

ya estaba solucionado...!

jeje, Saludos Cordiales a todos...
« última modificación: Octubre 08, 2014, 03:19:24 am por AxioUK »

_____________________________
Sé un poco de todo y mucho de nada... ;)

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:[AYUDA] Mejorar esta funcion
« Respuesta #7 en: Octubre 08, 2014, 02:10:39 pm »
Estimado ENTER
 
He realizado algunas modificaciones al código publicado por raul338, las mismas que procedo a detallar:
  • He cambiado de Procedimiento a Función, con la finalidad de saber si tuvo éxito la carga de los ComboBox.
  • Para evitar que la función Explote estoy evaluando con la función TypeName que el objeto (control) que se está pasando en el Array sea del tipo ComboBox. La evaluación es de tipol todo o nada.
  • Como primer parámetro de la función se pasa un objeto del tipo Ado.Recordset, de esta manera la función se especializa en cargar los ComboBox y no tiene dependencia de variables globales como cnADO, adOpenStatic, adLockOptimistic, adCmdText o de recuperar el recordset. La única dependencia es de ADO por lo que hay que incluir una referencia a Microsoft ActiveX Data Object 2.8 Library
  • Para optimizar la invocación de los objetos ADO al momento de realizar la iteración he movido de lugar el With Recordset
Public Function CargarCombos(ByVal Recordset As ADODB.Recordset, ParamArray Combos() As Variant) As Boolean
  Dim lngArrayLower As Long
  Dim lngArrayUpper As Long
  Dim lngCounter As Long
 
  CargarCombos = False
 
  lngArrayLower = LBound(Combos)
  lngArrayUpper = UBound(Combos)

' Para evitar que la función Explote estoy evaluando con la función TypeName que el control que
  ' se está pasando en el Array sea del tipo ComboBox. La evaluación es de tipol todo o nada.

  For lngCounter = lngArrayLower To lngArrayUpper
    If TypeName(Combos(lngCounter)) <> "ComboBox" Then Exit Function
  Next
 
  ' Se blanquena cada uno de los ComboBox
  For lngCounter = lngArrayLower To lngArrayUpper
    objComboBox.Clear
  Next
 
  ' Se cargan los ComboBox con los valores del Recordset
  With Recordset
    Do Until .EOF
      For lngCounter = lngArrayLower To lngArrayUpper
        Call Combos(lngCounter).AddItem(.Fields(xId) & "|" & .Fields(xNombre))
      Next
     
      .MoveNext
    Loop
  End With

 
  CargarCombos = True
End Function

 
Adicionalmente he implementado otra función que hace uso de For Each y utiliza menos variables. Esta función debería de ser más rápida que la anterior.

Public Function CargarCombos2(ByVal Recordset As ADODB.Recordset, ParamArray Combos() As Variant) As Boolean
  Dim objComboBox As Variant
 
  CargarCombos = False
 
  ' Para evitar que la función Explote estoy evaluando con la función TypeName que el control que
  ' se está pasando en el Array sea del tipo ComboBox. La evaluación es de tipol todo o nada.

  For Each objComboBox In Combos
    If TypeName(objComboBox) <> "ComboBox" Then Exit Function
  Next
 
  ' Se blanquena cada uno de los ComboBox
  For Each objComboBox In Combos
    objComboBox.Clear
  Next
 
  ' Se cargan los ComboBox con los valores del Recordset
  With Recordset
    Do Until .EOF
      For Each objComboBox In Combos
         Call Combos(lngCounter).AddItem(.Fields(xId) & "|" & .Fields(xNombre))
      Next
     
      .MoveNext
    Loop
  End With

 
  CargarCombos = True
End Function

 

Para ambas funciones la pueden invocar de la siguiente manera
   blnCargaCombos = CargarCombos(rstCiudades, Combo1, Combo2)

  blnCargaCombos2 = CargarCombos2(rstCiudades, Combo1, Combo2)


 

Saludos, desde algún lugar de Lima-Perú
« última modificación: Octubre 08, 2014, 02:19:26 pm por Albertomi »
Saludos, desde algún lugar de Lima-Perú

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:[AYUDA] Mejorar esta funcion
« Respuesta #8 en: Octubre 08, 2014, 08:03:02 pm »
Pregunta offtopic Albertomi:
Por qué no usas las etiquetas de código? Se hace difícil leerlas en el tema oscuro.

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:[AYUDA] Mejorar esta funcion
« Respuesta #9 en: Octubre 08, 2014, 08:48:30 pm »
Una maquina quedo che todo esto muchas gracias amigo.
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

AxioUK

  • Megabyte
  • ***
  • Mensajes: 108
  • Reputación: +17/-1
  • Modulos GSL
    • Ver Perfil
Re:[AYUDA] Mejorar esta funcion
« Respuesta #10 en: Octubre 08, 2014, 10:48:10 pm »
One Little tip: si deshabilitas el Repintado del Form, la carga se acelera un poco más... sobre todo si la cantidad de registros a cargar aumenta

En las Declaraciones....
Código: (VB) [Seleccionar]
' Función que deshabilita el repintado de una ventana en windows
Private Declare Function LockWindowUpdate& Lib "User32" (ByVal hwndLock As Long)

Antes de comenzar la Carga de Registros en el Combobox
Código: (VB) [Seleccionar]
         ' Deshabilita el repintado del control para que cargue los datos mas rapidamente
         Call LockWindowUpdate(Combos.hWnd)
         ' Carga los Datos en el ComboBox ...
         Call Combos.AddItem(.Fields(xId) & "|" & .Fields(xNombre))

Al terminar la Función
Código: (VB) [Seleccionar]
' Habilitar el repintado
  Call LockWindowUpdate(0&)


Saludos Cordiales
« última modificación: Octubre 08, 2014, 10:52:10 pm por AxioUK »

_____________________________
Sé un poco de todo y mucho de nada... ;)

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:[AYUDA] Mejorar esta funcion
« Respuesta #11 en: Octubre 09, 2014, 08:48:55 am »
Gracias amigo AxioUK creo que eso me va a servir mas con el control ListView donde suelo cargar mas datos en los combos solo cargo esos datos mas cortitos máximo como 10 a 15 items

Como ves aca en la imagen apenas tiene 5 items.
screen


http://snag.gy/8DUgW.jpg
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo