Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

jueves, 24 de marzo de 2011

VB6: Rutina para Eliminar FIlas Repetidas en un Hierarchical FlexGrid

Esta rutina está pensada para un Hierarchical FlexGrid cuya primera fila (la que tiene el índice 0) contiene los nombres de las columnas, por ello procesa a partir de la fila con índice 1:

Sub eliminar_Repetidos()
Dim estaFila, unaFila As String
Dim i, j, m, n As Integer

estaFila = vbNullString
unaFila = vbNullString

With HierarchicalFlexGrid
    m = 1 ' Apunta a la primera Fila
    n = .Rows - 1 ' Cantidad de filas del HierarchicalFlexGrid
   
    Do Until m > n
        estaFila = vbNullString  'cadena con la Fila Actual
       
        For i = 0 To .Cols - 1
            estaFila = estaFila + .TextMatrix(m, i) ' Relleno la cadena con los datos de toda la fila
        Next
       
        j = 1
        Do Until j > n
            unaFila = vbNullString ' Fila a comparar
           
            For i = 0 To .Cols - 1
                unaFila = unaFila + .TextMatrix(j, i) ' la relleno con los datos de toda la fila
            Next
           
            If estaFila = unaFila And j <> m Then
                .RemoveItem (j) ' Si son iguales remuevo unaFila solamente
                n = n - 1 ' tamaño actual del HierarchicalFlexgrid, al remover disminuye en uno
            End If
           
            j = j + 1
        Loop
        m = m + 1
    Loop
   
    'Chequeo si la última y la penúltima fila son iguales, porque no se eliminan si lo son
    For i = 0 To .Cols - 1
        estaFila = estaFila + .TextMatrix(.Rows - 1, i)
        unaFila = unaFila + .TextMatrix(.Rows - 2, i)
    Next
   
    If unaFila = estaFila Then .RemoveItem (.Rows - 2)
End With
End Sub


La rutina hace lo siguiente: cojo la primera fila y, en un bucle, la comparo con todas las demás y voy eliminando las que son iguales a la primera fila. Al terminar paso a la segunda fila y vuelvo a comparar y eliminar si son iguales. Esto se repite hasta llegar al final del Hierarchical FlexGrid.
Este algoritmo es más eficiente que, en dos bucles anidados, marcar las filas repetidas para eliminarlas después.

viernes, 11 de marzo de 2011

Obtener los nombres de las tablas y los nombres de sus esquemas de una BD en SQLServer desde VB6

Un día intentaba conectarme a AdventureWorks sample BD desde una app en Visual Basic 6.

Declaraba un recordset como sigue:

db.Open miConnectionString 'db es un objeto tipo Connection
Set rs = db.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "TABLE"))
para poder listar todas sus tablas, usando un bucle.
Mi problema era que al ejecutar un query en SQL:

Dim s as String

Do Until rs.EOF
s="Select * from " & rs!Table_Name
' Hacer muchas muchas cosas con la variable "s"
rs.MoveNext
Loop

Me botaba error, ya que sólo tenía el nombre de la tabla. Para que funcionara, el query dentro de la variable "s" necessitaba también el nombre del esquema (Schema Name) y contruirlo todo de la siguiente forma:
Select * from Schema_Name.Tabla

Luego de mucho rebuscar en Google, hallé esta web
http://www.techrepublic.com/article/much-ado-about-field-properties/1045310

Donde explican lo que hace OpenSchema. Para mi caso, utilizo el SchemaID "AdSchemaTables", el cual incluye un filtro llamado "TABLE_SCHEMA".

Finalmente mi query queda:
Dim s as String

Do Until rs.EOF
s="Select * from " & rs!Table_Schema & "." & rs!Table_Name
' Hacer muchas muchas cosas con la variable "s" 
rs.MoveNext
Loop

Update!
Cómo saber si una tabla tiene un nombre de esquema asignado:
Basta añadir este código en el bucle ("miTabla" es una variable tipo String):

miTabla = vbNullString
miTabla = rs!TABLE_SCHEMA
    
If miTabla <> vbNullString Then
      miTabla = rs!TABLE_SCHEMA & "." & rs!TABLE_NAME
Else
      miTabla = rs!TABLE_NAME
End If