El objetivo de este ejemplo es configurar una validación para que se eviten introducir valores repetidos en un campo dentro de una tabla.

Para ello lo que haremos es almacenar en una variable, los elementos existentes en la tabla y verificar si el dato que acaba de introducir el usuario en ese campo, ya existe como tal en nuestra tabla.

var indice = wf.obtenerContextoPadre(this).indice;
var tabla = 'tabla';
var referenciasCatastrales = wf.obtenerValor('input', tabla);
var referenciaCatastralActual = wf.obtenerValor('input', tabla, indice);

// Sólo validamos a nivel de campo cuando añadimos por primera vez (indice == -1)
if (referenciasCatastrales.includes(referenciaCatastralActual) && indice == -1){
	wf.anadirError(this,'Ya se ha introducido esta referencia catastral');
}
JS

Añadiremos una segunda validación, a nivel de la tabla, que compruebe que no hay valores duplicados:

var _ = webforms.lib._;

var tabla = "[[tabla]]";
var element = wf.obtenerElementoHTML(tabla)[0];
var referencias = wf.obtenerValor("[[input]]", tabla);
var referenciasDuplicadas = obtenerDuplicados(referencias);

// Validamos a nivel de tabla la existencia de duplicados
referenciasDuplicadas.forEach(function(referenciasDuplicada) {
	wf.anadirError(element, "El campo (" + referenciasDuplicada + ") está duplicado.");
});

function obtenerDuplicados(lista) {
return _(lista)
	.compact() // No tengas en cuenta los valores indefinidos
	.groupBy() // Agrupa los valores de la lista repetidos
	.pickBy(function(x) { return x.length > 1; }) // Quedate con los grupos con más de un elemento
	.keys() // Quedate con sus claves 
	.value(); 
}
JS


Descarga ejemplo

Tienes disponible el código json del ejemplo para su descarga y que puedas probarlo y adaptarlo a tus necesidades. Ver: Evitar elementos repetidos en una tabla.json

Evitar que se repita una combinación de varios elementosLink to Evitar que se repita una combinación de varios elementos


También es posible evitar que se introduzca una combinación de valores repetidos en una tabla. El siguiente código es un ejemplo para 2 campos, pero puede ser adaptado un número mayor de campos.

En el último de los campos, añadimos la siguiente validación:

var indice = wf.obtenerContextoPadre(this).indice;
var tabla = "[[tabla]]";
var valorCampo1 = wf.obtenerValor("campo1", tabla, indice);
var valorCampo2 = wf.obtenerValor("campo2", tabla, indice);

var valoresCampo1 = wf.obtenerValor("campo1", tabla);
var valoresCampo2 = wf.obtenerValor("campo2", tabla);

// Sólo validamos a nivel de campo cuando añadimos por primera vez (indice == -1)
if (indice == -1) {
	// Recorremos los elementos de la tabla, para comprobar si ya existe una combinación igual que la actual
	for (var i = 0; i <  valoresCampo1.length; i++) {
		if (valorCampo1 == valoresCampo1[i] && valorCampo2 == valoresCampo2[i]) {
			wf.anadirError(this, "Ya ha seleccionado esa combinación de campo1 y campo2. Debe especificar otra");
			break;
		}
	} 
}
JS

En el resto de campos, lanzamos la validación de este campo en su evento change:

webforms.Validation.applyModalFormValidations([{id: "campo2"}], $('#' + webforms.Helpers.getModalId('[[tabla]]')));
JS

A nivel de tabla, añadimos otra validación que compruebe que no hay valores duplicados:

var _ = webforms.lib._;

var tabla = "[[tabla]]";
var element = wf.obtenerElementoHTML(tabla)[0];
var referencias1 = wf.obtenerValor("campo1", tabla);
var referencias2 = wf.obtenerValor("campo2", tabla);
var referenciasDuplicadas = obtenerDuplicados(_.zip(referencias1, referencias2));

// Validamos a nivel de tabla la existencia de duplicados
referenciasDuplicadas.forEach(function(referenciaDuplicada) {
	wf.anadirError(element, "La combinación (" + referenciaDuplicada + ") está duplicada.");
});

function obtenerDuplicados(listaParejas) {
	return _(listaParejas)
		.groupBy(function(pareja) { return pareja[0] + ', ' + pareja[1]; }) // Agrupa las parejas de la lista repetidas
		.pickBy(function(x) { return x.length > 1; }) // Quedate con los grupos con más de un elemento
		.keys() // Quedate con sus claves 
		.value(); 
}
JS