Buscar

Visual Basic y BDs. Dos preguntas (Contestadas)


 
 Old 02 ago 2005, 17:18   #1 (permalink)  
Moderador
 
Avatar de the_ma3x
 
Registrado: febrero 2005
Ubicación: México
Mensajes: 4.325

Predeterminado Visual Basic y BDs. Dos preguntas

Hace tiempo hice dos preguntas por separado en estos foros y en algunos otros y no encontre respuesta.

La primera. Tienes un control Datagrid y necesitas que se autoajusten las columnas al contenido. Y la segunda, era que al agregar una nueva columna a una tabla, no existe un metodo propiamente dicho mediante T-SQL o SQL-ANSI para posicionar la columna nueva en una determinada posición, como si lo tiene MySQL. (Estamos hablando de Access y VB).

Existen muchos articulos en la Red en los cuales te dicen que esto se puede hacer mediante la Propiedad AbsolutePosition en TableDefs de DAO y AbsolutePosition en el Schema de la Tabla en ADO. Pero son muy ambiguos y no te dicen que al posicionar tu columna en una nueva tabla, necesitas reposicionar el resto de columnas que quedaron inmediatamente despues de esta nueva.

Bueno... he aqui las soluciones.

Ajustar un DataGrid en tiempo de ejecución:

Cita:
Public Sub AjustaDataGrid(dg As DataGrid, adoData As Adodc, dblRecord As Integer, _
intField As Integer, Optional AccForHeaders As Boolean)
Dim row As Long, col As Long
Dim sWidth As Single, maxWidth As Single
Dim saveFont As StdFont, saveScaleMode As Integer
Dim cellText As String
'dg = DataGrid
'adData = Adodc control
'dblRecord = Numero de Registros
'intField = Numero de Campos
'AccForHeaders = Encabezados (True or False)
dg.Visible = False
'Si numero de registros = 0 sal del procedimiento
If dblRecord = 0 Then Exit Sub
If adoData.Recordset.RecordCount = 0 Or adoData.Recordset.RecordCount < 0 Then
dg.Visible = True
Exit Sub
End If

Set saveFont = dg.Parent.Font
Set dg.Parent.Font = dg.Font
saveScaleMode = dg.Parent.ScaleMode
dg.Parent.ScaleMode = vbTwips
adoData.Recordset.MoveFirst
maxWidth = 0
For col = 1 To intField - 1
adoData.Recordset.MoveFirst
If AccForHeaders Then
maxWidth = dg.Parent.TextWidth(dg.Columns(col).Text) + 200
End If
adoData.Recordset.MoveFirst
For row = 1 To dblRecord
If intField = 1 Then
Else
cellText = dg.Columns(col).Text
End If
sWidth = dg.Parent.TextWidth(cellText) + 200

If sWidth > maxWidth Then
maxWidth = sWidth
dg.Columns(col).Width = maxWidth
End If
adoData.Recordset.MoveNext
Next row
dg.Columns(col).Width = maxWidth
Next col
Set dg.Parent.Font = saveFont
dg.Parent.ScaleMode = saveScaleMode
dg.Visible = True
adoData.Recordset.MoveFirst
End Sub
Se puede llamar facilmente con un:

Cita:
AjustaDataGrid dtagridProyect, adoData, dtagridProyect.VisibleRows, dtagridProyect.Columns.Count - 1, True
Como Notaran, se puede modificar el código para no pasar el control ADO (si no lo usan). Y también notaran que le establezco como cantidad de registros la propiedad VisibleRows, ya que si el datagrid esta vinculado a una tabla o consulta que retorne muchos registros, esta función la recorreria por completo buscando cual es el campo más ancho para ajustar el grid en base a eso. Y se tardaría muchisimo en hacerlo. (Imagina recorrer 400,000 registros) O si gustan pueden pasarle directamente un numero de registros como parametro.

Posicionar Columna nueva en una posición Predeterminada (DAO)


Cita:
Public Function Crear_Col(ColumnaSel As String, Nom_Col As String)
Dim dbs As dao.Database, tdf As dao.TableDef, fld As dao.Field
Dim i As Integer
Dim X As Integer
Dim Z As Integer

Set dbs = DBEngine.OpenDatabase(dbPath)
Set tdf = dbs.TableDefs(Trim(strNomImpProyecto))

i = tdf.fields(ColumnaSel).OrdinalPosition
X = tdf.fields.Count - 1
If i = X Then
With tdf
.fields.Append .CreateField(Nom_Col, dbText, 100)
'.fields(Nom_Col).OrdinalPosition = I + 1
.fields(Nom_Col).Required = False
.fields(Nom_Col).AllowZeroLength = True
.fields.Refresh
End With
Else
With tdf
.fields.Append .CreateField(Nom_Col, dbText, 100)
.fields(Nom_Col).OrdinalPosition = i + 1
.fields(Nom_Col).Required = False
.fields(Nom_Col).AllowZeroLength = True
.fields.Refresh
End With
Z = i + 1
For Each fld In tdf.fields
If fld.Name <> ColumnaSel And fld.Name <> Nom_Col Then
If fld.OrdinalPosition > i And fld.OrdinalPosition <= X Then
Z = Z + 1
fld.OrdinalPosition = Z
End If
End If
Next
End If
i = 0

tdf.fields.Refresh
dbs.Close
Set fld = Nothing
Set tdf = Nothing
Set dbs = Nothing
End Function
En esta función verán que se pasan dos argumentos, ColumnaSel y Nom_Col ambos String.

Esto porque me paso que de un Datagrid, yo selecciono una columna y necesitaba agregar una en la posición despues de esta, Así que le paso el Nombre de la columna seleccionada y el nombre de la nueva columna.

Como verán agrego un Campo de Texto (100) que no es requerido y que además permite valores con longitud cero. Esto es modificable. Y es más. Ustedes pueden agregar el campo con una consulta SQL (Alter Table ADD COLUMN) y esta se agregara al final de todos los campos. Solo bastara con que modifiquen un poco este código y así puedan hacer el ciclo para reposicionar todas las columnas.

En fin, a mi me costo un poco de trabajo solucionar estas cuestiones así que comparto estas funciones para alguno que se llegue a encontrar en la misma situación que yo.

Espero les sirva.
Un saludo

Editado por the_ma3x en 03 ago 2005 a las 16:13.

Every wall is a door. Ralph Waldo Emerson
the_ma3x is offline   Citar y responder
 
 Old 05 ago 2005, 19:20   #2 (permalink)  
Nuevo miembro
 
Avatar de korn_423
 
Registrado: julio 2004
Mensajes: 4

Predeterminado Re: Visual Basic y

No puedro previsualizar mi programa hasta ke lo tenga akavado !1????????????????????
korn_423 is offline   Citar y responder
 
 Old 05 ago 2005, 20:40   #3 (permalink)  
Moderador
 
Avatar de the_ma3x
 
Registrado: febrero 2005
Ubicación: México
Mensajes: 4.325

Predeterminado Re: Visual Basic y BDs. Dos preguntas (Contestadas)

???

Cual programa? En VB?

Puedes correrlo y depurarlo desde el IDE de VB.

Simplemente oprime F5 y el programa se ejecutara. Así podras verlo y trabajar en los errores que se presenten...

Saludos

Every wall is a door. Ralph Waldo Emerson
the_ma3x is offline   Citar y responder

« VB: separar string en tokens | conectar con mysql desde java »

Herramientas
Estilo


 

Tema Iniciado por Foro Respuestas Último mensaje
Buscando Plug-in del Visual Basic 6 levosero Programación 2 24 oct 2010 03:36
Visual Basic .NET ruben_softonic Programación 3 02 feb 2010 23:56
Menus con Iconos en Visual Basic 6.0 Christian_22 Programación 8 08 abr 2008 16:10
turtorial Visual Basic 1 liceto Programación 7 06 jun 2005 01:41
Guia Visual Basic Access MALEFICIO Programación 4 28 abr 2005 19:44



Buscar