Bases de Datos: Trabajar con tablas con un gran número de columnas

Cuando utilizamos bases de datos las consultas suelen involucrar unos pocos campos, de modo que el uso del método Field sobre el RecordSet obtenido resulta de lo más práctico a la hora de recuperar los valores de las columnas consultadas; pero, ¿qué podemos hacer cuando la tabla consultada contiene, por ejemplo, decenas de columnas?

En estos casos, el uso de Field para acceder a cada una de las columnas no resulta nada práctico. ¿Imaginas escribir tantas líneas de código como campos (o columnas) debas consultar? ¿Imaginas hacerlo por cada una de las operaciones que debas realizar contra la base de datos? En estos casos, sin embargo, Xojo nos proporciona otra forma de iterar: IdxField.

A diferencia de lo que ocurre con Field, donde nos limitamos a proporcionar como parámetro el nombre de la columna de la cual queremos obtener el dato, cuando utilizamos IdxField pasamos como parámetro un valor numérico correspondiente al índice de la columna que de la cual queremos obtener (o asignar) un valor determinado. Por supuesto, este valor tiene un índice 1 para denotar la primera de las columnas de la tabla, llegando su rango a la columna ‘n’. Por tanto, el valor numérico pasado como parámetro nunca deberá superar el número de columnas disponibles en la tabla en cuestión.

Ahora bien, es bastante probable que el esquema de la tabla contenga columnas en las que no estemos interesados iterar a la hora de recuperar sus valores para mostrarlos, por ejemplo. Algunos ejemplos podrían ser tanto el ID único, columnas autocalculados / con valores autogenerados, o bien columnas utilizadas a modo de control. Por tanto, a la hora de diseñar este tipo de tablas con una cantidad de columnas tan elevada siempre será buena idea contar con un poco de planificación previa para que los campos por los que no estemos interesados iterar se encuentren bien al principio y/o al final de aquellas columnas por las que posteriormente queramos iterar para recuperar sus valores. Por ejemplo:

id			// columna 0, en la que no estamos interesados
relacion	// columna 1, en la que no estamos interesados
data1		// primera columna con datos válidos
data2		// segunda columna con datos válidos
.
.
.
dataN		// última columna con datos válidos
fecha		// última columna de la tabla, en la que no estamos interesados

Así, si el total de columnas en la tabla del anterior ejemplo (abstracto) fuese de 100; entonces los índices válidos comprenderían el rango 2-99

Con lo anterior en cuenta, ¿cómo podemos saber cuantas columnas tiene una tabla en cuestión. Bien sencillo, mediante el método FieldCount de un RecordSet válido obtenido en una consulta contra la base de datos.

De esta forma, teniendo en cuenta una instancia de base de datos llamada db, y una tabla con el nombre test, el siguiente fragmento de código nos permitiría acceder a todas las columnas para obtener sus valores como String:

Dim rc as RecordSet = db.SqlSelect("Select * from test")

If rc <> Nil and rc.RecordCount <> 0 Then
  Dim s as String
  While not rc.EOF
    For n as Integer = 2 to rc.FieldCount - 1
      s = rc.IdxField(n).StringValue
    Next
    rc.MoveNext
  Wend
End If

Sin embargo, en otros casos más prácticos probablemente necesitemos acceder al nombre de la columna por la que estemos iterando, de modo que podamos realizar una acción u otra en función de cuál se trate. En este caso accediendo a la propiedad Name sobre el RecordField devuelto que obtenemos cuando utilizamos Idxfield. Por ejemplo, en el siguiente ejemplo estaríamos almacenando sobre la variable de tipo String el nombre de cada uno de los campos por los que iteramos:

Dim rc as RecordSet = db.SqlSelect("Select * from test")
If rc <> Nil and rc.RecordCount <> 0 Then
  Dim s, s1 as String
  While not rc.EOF
    For n as Integer = 2 to rc.FieldCount - 1
      s = rc.IdxField(n).StringValue
      s1 = rc.IdxField(n).Name
    Next
    rc.MoveNext
  Wend
End If

Como puedes ver, una forma más práctica de recuperar la información para cada una de las columnas de la tabla y que podrás utilizar sobre todos los tipos de proyectos y despliegues.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *