Resulta que cree 3 campos nuevos en Campos definidos por el usuario para capturar el tipo de visitante en una factura de venta (Local, Nacional y Extranjero) y necesito validar que uno de los tres contenga datos o que no quede nulo pero no lo puedo hacer para que los tres me queden obligatorios ya que dos de ellos si pueden quedar en blanco.
Esta es la validación en el los procedimientos almacenados.
Hay un error y posiblemente la consulta puede estar mejor estructurada, cual seria la mejor forma de hacer la validación.
PD: Apenas estoy aprendiendo de este tema y sus sugerencias las recibo con mucho cariño.
¿Y si concatenas los tres campos en tu consulta de SQL y validas que si el valor de la cadena es = 0 se dispare la validación?
De este manera estarías validando que uno o más campos tiene datos almacenados y de no ser así, la cadena de la concatenación será = 0 y se disparará el bloqueo.
En mi opinión creo que sería mas sencillo solo tener un campo llamado U_turista y este campo tenga valores validos
01 - Turista Local
02 - Turista Nacional
03 - Turista Extranjero
En el TN la validación sería mas sencilla, algo mas o menos así
if @Objet_type = ‘13’ and @transaction_type in (‘A’, ‘U’)
begin
if (select U_turista from OINV where DocEntry = @list_of_cols_val_tab_del) is null
begin
set @error = 1
set @error_message = 'El campo tipo de turista es obligatorio’
end
end
En lo personal, yo haría lo que propone @pcarrasco, solo adicionaría el valor “00 - Sin asignación” y éste valor lo asignaría como valor por defecto, y en el bloque del TN valoraría que tenga uno de los posibles valores validos “01”, “02” o “03”, con esto orillas al usuario a razonar y elegir uno válido.
Posible validación:
if @Objet_type in('13') and @transaction_type in ('A', 'U')
begin
if (isnull((select u_turista from oinv where docentry = @list_of_cols_val_tab_del),'00') = '00')
begin
set @error = 9
set @error_message = 'ATENCION !!! No ha seleccionado un valor válido en el campo Turista, revise por favor ...'
end
end
IF @object_type ='17' and @transaction_type in ('A','U')
Begin
IF (SELECT Len(Concat(T0.U_Turista_Local, T0.U_Turista_Nacional, T0.U_Turista_Extranjero)) FROM ORDR T0 WHERE T0.[DocEntry] = @list_of_cols_val_tab_del) = 0
Begin
set @error_message = 'Recuerda llenar al menos uno de los campos de turista'
set @error = 1
goto Final_de_las_validaciones
END
END
Yo lo probé en Ordenes de venta, solo sería cuestión de adecuarlo a tus necesidades.
Al final encontre esta solución, ya que la que me dió @Gera_Mendez no me estaba validando los campos no se por que extraña razon no lo hizo.
Con esta consulta logré que me funcionara en factura deudores
if @object_type in ('13') and @transaction_type in ('A','U') begin
if (SELECT (t0.U_Turista_Local+ T0.U_Turista_Nacional+T0.U_Turista_Extranjero) FROM OINV T0 WHERE T0.[DocEntry] = @list_of_cols_val_tab_del) = 0
begin
set @error = 10
select @error_message = 'SP75:Uno de los campos de Turista no puede ser nulo'
end
end
Bueno, mucho tiene que ver el tipo de campos que estás utilizando, si es una cadena de caracteres, si es numérico, etc, por ello la mención de adecuarlo a tu ambiente productivo.
Si señor @Gera_Mendez,
Tenía la leve sospecha de que no funcionó por el tema de que los campos son numéricos y creo que concat no me acepta este tipo de campo.