• Lunes 23 de Diciembre de 2024, 00:53

Autor Tema:  En MSHFlexgrid, no señalar casillas al iniciar una Form  (Leído 2154 veces)

lagunax

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
En MSHFlexgrid, no señalar casillas al iniciar una Form
« en: Martes 10 de Marzo de 2009, 17:16 »
0
Buen día. Se que no tiene mucho que pregunte algo (y obtuve una buena respuesta) pero hay una duda que no logro sacar de mi cabeza, ojala que sea tan sencillo de resolver como lo anterior.

En mi programa realizo una sección de busqueda en una BD Access 2003, filtro los datos de la BD  mediante las opciones en un Combobox (ejemplo, campo Nombre) y aun puedo filtrar más mediante otro campo, al final los cargo en un MSHFlexgrid para desplegarlos. Al hacer click en el MSHFlexgrid, se obtiene el primer valor de cada fila (un ID) con el que realizo una busqueda y despliego en Textbox´s los valores del resto de los campos.

Ejemplo de encabezado de tabla (en gris):   ID  -  NOMBRE  -  DESCRIPCION  -  SOLUCIONES

Cuando se encuentran registros, la fila siguiente al encabezado esta señalada en azul y me devuelve el ID de la fila.
El problema surge cuando selecciono una opción en el Combobox (ejemplo, busca NOMBRE = ALTIMIT), al no haber ninguna correspondencia, el MSHFlexgrid no despliega nada más que el encabezado anterior, pero marca toda la fila del encabezado. Cuando cambio a otra opcion que si me puede desplegar registros el indice (ID) se adelanta por uno, además que el MSHFlexgrid ya no me señala la fila entera al hacer click sobre el. Un ejemplo:

ID  -  NOMBRE  -  DESCRIPCION  -  SOLUCIONES   --> Encabezado en Gris
1       JAVA          PROGRAMA        DESCARGAR    --> Cuando haces click obtienes el ID de la fila
2        VB6           PROGRAMA        DESCARGAR2  --> Cuando la tabla esta vacia y buscas por otro Nombre
3       FOXPRO     APLICACION        DESCARGA3         al hacer click en fila "ID = 2" te regresa el proximo valor
                                                                               (aqui ID seria 3)

He probado con la propiedad Focusrect que es la que manipula la forma en que se señalan las celdas, pero no logro solucionar este problema. Cuando existen registros no surge este problema, solo cuando no hay resultados en la busqueda. Adjunto el codigo:

Código: Visual Basic
  1.  
  2. Option Explicit
  3. Public bool As Boolean
  4. Public bool2 As Boolean
  5. Public auxi_grid As String
  6. Public pasar_id As Integer
  7. Public Numero As Integer
  8. Public ident As Integer
  9. Public auxi As Integer
  10.  
  11. Public copia_id As Integer
  12. Public copia_nombre As String
  13. Public copia_descripcion As String
  14. Public copia_solucion_1 As String
  15.  
  16. Public cn As ADODB.Connection
  17. Public rst As ADODB.Recordset
  18. Sub Conectar()
  19.        
  20.     ' Crea una nueva conexión y un recordset
  21.     Set cn = CreateObject("ADODB.Connection")
  22.     Set rst = CreateObject("ADODB.Recordset")
  23.        
  24.     rst.CursorLocation = adUseClient
  25.     ' abre la base de datos DIRECCION ANTERIOR
  26. '    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data " & _
  27. '            "Source=C:Program FilesMicrosoft " & _
  28. '            "Visual StudioVB98SISTEMA BUSQUEDAAplicacion.MDB;Persist Security Info=False"
  29. 'DIRECCION NUEVA DEL SERVIDOR \XOA008
  30.     cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data " & _
  31.             "Source=\Xoa008COMPARTIDO SISTEMASSistema " & _
  32.             "de Registro & Solución de ProblemasBase de DatosAplicacion.MDB;Persist Security Info=False"
  33.  
  34.  
  35. End Sub
  36.  
  37. Sub Desconectar()
  38. 'MOSTRAR LA LISTA DE SOLUCIONES EN TEXT3.TEX
  39. '    Form6.Text3.Text = rst("Solucion_1")
  40. '*******************************************
  41.     rst.Close
  42.     cn.Close
  43.     Set rst = Nothing
  44.     Set cn = Nothing
  45. End Sub
  46.  
  47.  
  48. Private Sub Combo1_Click()
  49. Call Conectar
  50.  
  51. rst.Open "SELECT ID,Nombre,Descripcion FROM TablaAplicacion WHERE Nombre Like '%" & _
  52.              Combo1.Text & "%'", cn, adOpenStatic, adLockOptimistic
  53.  
  54. ' Muestra los datos en el FlexGrid
  55. Set MSHFlexGrid1.DataSource = rst
  56.  
  57.  
  58. ' Visualiza la cantidad de registros filtrados
  59. Me.Caption = "Peugeot - Registros encontrados: " & CStr(rst.RecordCount)
  60.  
  61. 'REVISA ESTE CAMBIO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  62. 'POSIBILIDAD PARA EVITAR QUE SE MANTENGA SELECCIONADA UNA CELDA Y
  63. 'ASI EVITAR QUE SE CORRA EL REGISTRO
  64. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  65. MSHFlexGrid1.FocusRect = flexFocusHeavy
  66. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  67.  
  68. Call Desconectar
  69. End Sub
  70.  
  71. Private Sub Command1_Click()
  72. 'MARZO 5 - EVITAR ERROR AL PULSAR GUARDAR CON CAMPOS EN BLANCO
  73. 'MARZO 9 - CAMBIOS REALIZADOS PARA SOLO GUARDAR LA SOLUCION
  74. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  75.  
  76. If Text6.Text = "" Then
  77. 'If Text3.Text = "" And Text5.Text = "" And Text6.Text = "" And Combo2.Text = "" Then
  78.     MsgBox ("No hay Datos para Modificar.")
  79. Else
  80. Call Conectar
  81. rst.Open "SELECT ID,Nombre,Descripcion,Solucion_1 FROM TablaAplicacion WHERE ID Like '%" & _
  82.              Text4.Text & "%'", cn, adOpenStatic, adLockOptimistic
  83. If rst.EOF = True Then
  84.         Beep
  85. Else
  86.     Do While bool2 = False
  87.         If rst.Fields("ID") = pasar_id Then
  88.             'rst.Fields("Nombre") = Combo2.Text
  89.             'rst.Fields("Descripcion") = Text5.Text
  90.             rst.Fields("Solucion_1") = Text6.Text
  91.             rst.Update
  92.             MsgBox ("Se han guardado los cambios.")
  93.             bool2 = True
  94.             Command3.Enabled = False
  95.         Else
  96.             rst.MoveNext
  97.         End If
  98.     Loop
  99. End If
  100.  
  101. rst.MoveFirst
  102. Call Desconectar
  103. bool2 = False
  104.  
  105. MSHFlexGrid1.Clear
  106. Command1.Enabled = False
  107. Command4.Enabled = False
  108.  
  109. End If
  110. 'Call copy_auxi
  111. End Sub
  112.  
  113. Private Sub Command2_Click()
  114.  
  115. 'MARZO 5 - LIMPIEZA AL SALIR DE EDITAR/BORRAR
  116. 'MARZO 9 - CAMPOS NO NECESARIOS TEXT3,5 Y COMBO2
  117. MSHFlexGrid1.Clear
  118. MSHFlexGrid1.Refresh
  119. Text1.Text = ""
  120. Text2.Text = ""
  121. Text3.Text = ""
  122. '**********************Text4.Text = ""
  123. 'Text5.Text = ""
  124. Text6.Text = ""
  125. Combo1.Text = ""
  126. 'Combo2.Text = ""
  127. Form9.Hide
  128. Form1.Show
  129. End Sub
  130.  
  131. Private Sub Command3_Click()
  132. 'AGREGADO DEL 5 DE MARZO
  133. 'MARZO 9 - CAMPOS INNECESARIOS
  134. 'Combo2.Text = copia_nombre
  135. 'Text5.Text = copia_descripcion
  136. Text6.Text = copia_solucion_1
  137. 'Call local_clear_auxi
  138. End Sub
  139.  
  140. Private Sub Command4_Click()
  141. 'On Error Resume Next
  142. 'Se utiliza la línea On Error Resume Next para indicarle a Visual Basic que siga ejecutando
  143. 'la forma, aún cuando ocurra un error de ejecución
  144.  
  145.  
  146. Call Conectar
  147. rst.Open "SELECT ID,Nombre,Descripcion,Solucion_1 FROM TablaAplicacion WHERE ID Like '%" & _
  148.              Text4.Text & "%'", cn, adOpenStatic, adLockOptimistic
  149. If rst.EOF = True Then
  150.         Beep
  151. Else
  152. Do While bool2 = False
  153. 'Do Until bool2 = True
  154.         If rst.Fields("ID") = pasar_id Then '¿¿¿¿¿¿ crear variable para copiar
  155.             'MARZ0 5 MIDIFICADO
  156.             'rst.Fields("Nombre") = Combo2.Text
  157.             'rst.Fields("Descripcion") = Text5.Text
  158.             'rst.Fields("Solucion_1") = Text6.Text
  159.            
  160.             If MsgBox("Se va a eliminar el Registro, ¿Desea continuar?", vbExclamation + vbYesNo, "Eliminacion de Registros") = vbYes Then
  161.                 rst.Delete
  162.                 rst.Requery
  163.                 rst.MoveNext
  164.            'POSIBILIDAD PARA EVITAR QUE AL ELIMINAR N REGISTRO DESPLIEGUE DATOS ANTES DEL BORRADO
  165.            '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  166.                 'PARA EVITAR QUE AL ELIMINAR EL CURSOR DESPLIEGUE EL MISMO REGISTRO ELIMINADO
  167.                 'A PESAR DE QUE EL RECORDSET YA AVANZO
  168.                 'CALCULAR EL AVANCE DEL RECORSET
  169.              '   Text3.Text = rst.Fields("ID")
  170.              '   Combo2.Text = rst.Fields("Nombre")
  171.              '   Text5.Text = rst.Fields("Descripcion")
  172.              '   Text6.Text = rst.Fields("Solucion_1")
  173.              '       If rst.EOF Then
  174.              '           rst.MoveLast
  175.              '       End If
  176.             '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  177.                 MsgBox ("Registro Eliminado con Éxito.")
  178.                
  179.                 'EVITA QUE DESPLIEGUE OTROS REGISTROS DESPUES DE ELIMINAR UNO++++++
  180.                 'MARZO 9 - CAMPOS INNECESARIOS
  181.                 Text3.Text = ""
  182.                 'Combo2.Text = ""
  183.                 'Text5.Text = ""
  184.                 Text6.Text = ""
  185.                 Command3.Enabled = False
  186.                 Command4.Enabled = False
  187.                 '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  188.                 bool2 = True
  189.                
  190.                 MSHFlexGrid1.Clear
  191.                 'DESPLEGAR VALORES EN TABLA SEGUN APLICACION AL BORRAR
  192.                 '+++++++++++++++++++++++++++++++++++++++++++++++++++++
  193.                 Call Desconectar
  194.                 Call Conectar
  195.                 rst.Open "SELECT ID,Nombre,Descripcion FROM TablaAplicacion WHERE Nombre Like '%" & _
  196.                  Combo1.Text & "%'", cn, adOpenStatic, adLockOptimistic
  197.                 Set MSHFlexGrid1.DataSource = rst
  198.                 '+++++++++++++++++++++++++++++++++++++++++++++++++++++
  199.             Else
  200.                 MsgBox ("El Registro No fue Eliminado.")
  201.                 bool2 = True
  202.                 Command4.Enabled = False
  203.             End If
  204.         Else
  205.                 rst.MoveNext
  206.         End If
  207. Loop
  208. End If
  209. 'COMENTAR PARA EVITAR QUE AL BORRAR ENVIE Y DESPLIEGUE AL PRIMER REGISTRO
  210. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  211. 'rst.MoveFirst
  212. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  213. 'Command4.Enabled = False
  214.  
  215. Call Desconectar
  216. bool2 = False
  217.  
  218. '///////////////////////////////
  219.  
  220. End Sub
  221.  
  222. Private Sub Form_Load()
  223. MSHFlexGrid1.Clear
  224.  
  225.     With MSHFlexGrid1
  226.         .SelectionMode = flexSelectionByRow
  227.         .FixedCols = 0
  228.         .ColWidth(0) = 700
  229.         .ColWidth(1) = 2000
  230.         .ColWidth(2) = 5000
  231. '        .ColWidth(3) = 4000
  232. '        .ColWidth(4) = 4000
  233.     End With
  234.  
  235.     Text2.Text = ""
  236.     Text3.Text = ""
  237. End Sub
  238.  
  239.  
  240.  
  241. Private Sub MSHFlexGrid1_Click()
  242. '///////////////////////////////////////////////////////////////////
  243. 'CAMBIAR CADENAS STRING A INTEGER
  244. 'Dim Cadena As String, Numero As Integer
  245. 'Cadena = "12345.25"
  246. 'Numero = CInt(Val(Cadena)) 'Esto te cambia la cadena a un numero entero
  247. Text1.Text = MSHFlexGrid1.Text
  248.  
  249. auxi_grid = MSHFlexGrid1.Text
  250. Numero = CInt(Val(auxi_grid))
  251. Text4.Text = Numero
  252. Form7.Text1.Text = ""
  253. 'ENABLE EL BOTON DESHACER CUANDO SE HACE CLICK EN TABLA
  254. 'OTRA OPCION SERIA ELIMINAR EL BOTON - SERIA MEJOR OPCION
  255. '   PERMITIR MODIFICAR SOLO EL CAMPO SOLUCION
  256. Command3.Enabled = True
  257. Command4.Enabled = True
  258. Command1.Enabled = True
  259. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  260. Call Conectar
  261. 'CAMBIOS NUEVOS agregamos Solucion
  262. rst.Open "SELECT ID,Nombre,Descripcion,Solucion_1 FROM TablaAplicacion WHERE ID Like '%" & _
  263.              Text4.Text & "%'", cn, adOpenStatic, adLockOptimistic
  264.  
  265. '   Para acceder a un campo:
  266.     If rst.EOF = True Then
  267.         Form7.Text1.Text = ""
  268.     Else
  269. 'CAMBIOS NUEVOS        Adodc1.RecordSource = "SELECT * FROM TablaAplicacion"
  270. 'CAMBIOS NUEVOS        Adodc1.Refresh
  271.        
  272. '///        With Adodc1.Recordset
  273. '///            If .EOF And .BOF Then
  274. '///                auxi = 0
  275. '///            Else
  276.             If MSHFlexGrid1.Text = "" Then
  277.                 MsgBox "La Tabla esta Vacia"
  278.             Else
  279.                 Do While bool = False
  280.                         'PREGUNTAR SI HAY UN EOF O BOF PARA CUANDO NO HAY REGISTROS EN LA OPCION
  281.                         'Y HACEN CLICK
  282.                         '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  283.                          If rst.BOF = True Or rst.EOF = True Then
  284.                             MsgBox ("No existen registros de esta Aplicación.")
  285.                             bool = True
  286.                          Else
  287.                         '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  288.                          If rst.Fields("ID") = Text4.Text Then
  289.                                 Text3.Text = ""
  290.                                 'Combo2.Text = ""
  291.                                 'Text5.Text = ""
  292.                                 Text6.Text = ""
  293.                          'CAMBIOS 9 DE MARZO, SE BORRAN LOS CAMPOS DE ID,NOMBRE Y DESCRIPCION
  294.                          'YA QUE SOLO SE DESEA MODIFICAR SOLUCION
  295.                          '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  296.                                 Text3.Text = rst.Fields("ID")
  297.                                 'Combo2.Text = rst.Fields("Nombre")
  298.                                 'Text5.Text = rst.Fields("Descripcion")
  299.                          '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  300.                                 Text6.Text = rst.Fields("Solucion_1")
  301.                                 bool = True
  302.                                 pasar_id = rst.Fields("ID")
  303.                                 'CAMBIO RECIENTE HOY 5 MARZO
  304.                                 Call local_clear_auxi
  305.                                 Call local_copy_auxi
  306.                                
  307.                          Else
  308. 'CAMBIOS NUEVOS                                Adodc1.Recordset.MoveNext
  309.                                 rst.MoveNext
  310.                          End If
  311.                          '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  312.                          End If
  313.                          '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  314.                 Loop
  315.             End If
  316. '///            End If
  317. '///        End With
  318. 'CAMBIOS NUEVOS        Adodc1.Recordset.MoveFirst 'CAMBIO RECIENTE
  319.     End If
  320. rst.MoveFirst
  321. Call Desconectar
  322.  
  323. auxi_grid = ""
  324. Numero = 0
  325. Text4.Text = ""
  326. bool = False
  327. End Sub
  328.  
  329. Private Sub Text1_GotFocus()
  330.     'Text1.Text = ""
  331. End Sub
  332.  
  333. Private Sub Text2_Change()
  334.     ' conecta
  335.     Call Conectar
  336.     bool = False
  337.     ' Ejecuta la consulta SQL
  338. 'SENTENCIA SQL ORIGINAL
  339. '    rst.Open "SELECT ID,Nombre,Descripcion FROM TablaAplicacion WHERE Descripcion Like '%" & _
  340.  '            Text2.Text & "%'", cn, adOpenStatic, adLockOptimistic
  341.    
  342.  
  343.     rst.Open "SELECT ID,Nombre,Descripcion FROM TablaAplicacion WHERE Descripcion Like '%" & Text2.Text & "%' And Nombre Like '" & Combo1.Text & "'", cn, adOpenStatic, adLockOptimistic
  344.  
  345.  
  346. '   ' Para acceder a un campo:
  347.     If rst.EOF = True Then
  348.     '    Text3.Text = "" borrar text1
  349.         Text1.Text = ""
  350.     Else
  351. 'ULTIMA MODIFICIACION ADODC******************************************************
  352.         ident = rst("ID")
  353.         Adodc1.RecordSource = "SELECT * FROM TablaAplicacion"
  354.         Adodc1.Refresh
  355.       Do While bool = False
  356.         If Adodc1.Recordset.Fields("ID") = ident Then
  357.             'Text3.Text = Adodc1.Recordset.Fields("Solucion_1")
  358.             'IMPRIME SOLUCION EN TEXT3.TEXT CUANDO FILTRAS INFO
  359.             bool = True
  360.         Else
  361.             Adodc1.Recordset.MoveNext
  362.         End If
  363.       Loop
  364. '*******************************************************************************
  365.  ' GOOD       Text3.Text = rst("Solucion_1")
  366.     End If
  367.  
  368.     ' Enlaza el FlexGRid
  369.     Set MSHFlexGrid1.DataSource = rst
  370.  
  371.     ' Cantidad de registros
  372.     Me.Caption = "Registros encontrados: " & CStr(rst.RecordCount)
  373.  
  374.     ' Desconecta de la base de datos
  375.     Call Desconectar
  376.    
  377.     If Text2.Text = "" Then
  378.    
  379.         'Text3.Text = "" borrar text1
  380.         Text1.Text = ""
  381.     End If
  382. End Sub
  383.  
  384. Private Sub Text2_GotFocus()
  385.     Text2.Text = ""
  386. End Sub
  387.  
  388. ''MODIFICACION RECIENTE 5 de marzo////////////////////////////////////////////
  389. ' COPIA VARIABLES AUXI PARA BOTON DESHACER
  390. ' NO COPIAR VALORES NO NECESARIOS
  391. Private Sub local_copy_auxi()
  392. 'copia_id = TxtID.Text
  393. 'copia_nombre = Combo2.Text
  394. 'copia_descripcion = Text5.Text
  395. copia_solucion_1 = Text6.Text
  396. End Sub
  397.  
  398. Private Sub local_clear_auxi()
  399. copia_id = 0
  400. 'copia_nombre = ""
  401. 'copia_descripcion = ""
  402. copia_solucion_1 = ""
  403. End Sub
  404.  
  405.  
  406.  

Aqui uso un modulo para el filtrado que mencione anteriormente:

Código: Visual Basic
  1.  
  2. Function Autocompletar_FlexGrid(MSFlexGrid As Object, _
  3.                                TBox As TextBox, _
  4.                                Columna As Long)
  5.  
  6. Dim i As Integer
  7. Dim pos_SelStart As Integer
  8.  
  9.     If (KeyRetroceso Or Len(TBox.Text) = 0) Then
  10.         KeyRetroceso = False
  11.         Exit Function
  12.     End If
  13.        
  14.     With MSFlexGrid
  15.         'Recorremos todas las filas del MsFlexgrid
  16.         For i = 0 To .Rows - 1
  17.             'Busca en el flexgrid si hay coincidencia, en la fila y columna actual
  18.             If InStr(1, .TextMatrix(i, Columna), TBox.Text, vbTextCompare) = 1 Then
  19.                    
  20.                 pos_SelStart = TBox.SelStart
  21.                 'Asignamos el valor de la celda actual al textbox
  22.                 TBox.Text = .TextMatrix(i, Columna)
  23.                 'Indicamos el comienzo de la selección
  24.                 TBox.SelStart = pos_SelStart
  25.                 'seleccionamos la porción de texto en el Text
  26.                 TBox.SelLength = Len(.TextMatrix(i, Columna)) - pos_SelStart
  27.                 ' Establecemos con TopRow , la fila arriba de todo
  28.                 .TopRow = i
  29.                 Exit For
  30.             End If
  31.         Next i
  32.     End With
  33. End Function
  34.  
  35.  

Solo espero haberme explicado bien. De antemano otra vez Gracias por la ayuda.