Comparar registros
Estaba intentando crear un método para comparar dos registros de una misma tabla cuya única diferencia sería el campo que sirve de índice.
El asunto no es fácil, una opción sería meter todas las columnas en un contenedor (cada línea del contenedor correspondería a una columna) y luego hacer lo mismo con el otro registro en un segundo contenedor, luego quedaría comparar campo a campo los contenedores.
No sirve hacer la comparación directa tipo if(registro1 == registro2), porque compara los tipos de registro, no los datos que contienen.
Una desventaja para la opción anteriormente propuesta (la de entrar los datos en masa en dos contenedores y compararlos) es que si modificamos la tabla, por ejemplo agregándole una nueva columna, hay que modificar también el método de comparación para que entre esa nueva columna en el contenedor.
La opción más elegante entonces sería recorrer automáticamente uno a uno los campos de cada registro e ir comparándolos. ¿Pero cómo saber cuantos registros hay en una tabla y como ir recorriéndolos? Con los objetos dictTable y dictField.
El objeto dicttable contiene información de una tabla específica y el dictfield, de un campo particular de la tabla.
dictTable.fieldcnt() nos devuelve la cantidad de campos que contiene la tabla (esto incluye los campos de sistema, como lo son el recId o el dataAreaId) y dictTable.fieldCnt2Id(n) nos devuelve el 'n'ésimo campo de la tabla (un fieldId, es decir un identificador único de un campo).
En cuanto a dictfield, podemos obtener propiedades específicas de un campo particular, como el nombre del campo con dictField.name().
Entonces lo que se puede hacer es ir recorriendo uno a uno cada campo de una tabla específica e ir comparándolos como por ejemplo, comparar que dos registros de la inventtable, para ver si tenemos dos artículos con datos iguales pero con diferente código (campo ItemId):
Para ello primero debemos asignar nuestro dictTable a la tabla de donde sacaremos los datos a comparar:
dicttable d = new dicttable(tablenum(InventTable));
Y luego declaramos las tablas con que haremos la consulta y el dictfield para saber si el campo con el que estemos trabajando nos sirve o no:
InventTable Item1, Item2;
dictfield f;
Buscamos los dos campos a comparar, por ejemplo los artículos de código '5001' y '5002'
Item1 = InventTable::find('5001');
Item2 = InventTable::find('5002');
La cantidad de columnas o campos que contiene la InventTable la podemos conocer con el metodo fieldcnt() de la dicttable, por lo que para recorrer todos los campos hacemos:
for(i=0; i<= d.fieldCnt(); i++)
{
}
Dentro del for podemos obtener los datos del 'i'ésimo campo de la InventTable con nombreTabla.(dictTable.fieldCnt2Id(i)). Por ejemplo si hacemos Item1.(d.fieldCnt2Id(1)) obtendremos el valor '5001' ya que el primer campo es el ItemId.
Comparar los campos entonces se haría dentro del bucle de la siguiente forma:
if (Item1.(d.fieldCnt2Id(i)) != Item2.(d.fieldCnt2Id(i)))
info ("Campos diferentes");
Pero antes, no nos interesa comparar los registros que sean de sistema. Puesto que son registros diferentes, tendrán recId diferentes, fechas de creación diferentes, etc. Así que antes, verificamos que el campo que vayamos a comparar no sea de sistema, para ello utilizaremos el dictField. Primero asignamos el dictField a la tabla y el campo en el que nos encontramos:
f = new dictfield(tablenum(InventTable), d.fieldCnt2Id(i));
El método dictField.isSystem() nos devuelve un booleano que indica si se trata de un campo de sistema o no. Pero aún queda otra cosa, tampoco queremos comparar los ItemId tal como nos lo planteamos en un principio. Para saber cuando estaremos en el campo 'ItemId' utilizaremos el método dictField.name().
Así entonces la comparación nos queda:
for(i=0; i<= d.fieldCnt(); i++)
{
f = new dictfield(tablenum(InventTable), d.fieldCnt2Id(i));
if (f.isSystem() == false && f.name() != 'ItemId')
{
if (Item1.(d.fieldCnt2Id(i)) != Item2.(d.fieldCnt2Id(i)))
info ("Campos diferentes");
}
}
Con dictTable y dictField podemos controlar y acceder a los datos de todos los campos de una tabla sin tener que saber cuantos campos tiene la tabla o el nombre de éstos.

