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.