Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Usar IIF en check (https://www.clubdelphi.com/foros/showthread.php?t=75599)

CarlosG 06-09-2011 01:48:35

Usar IIF en check
 
Hola, miembros del foro.

Pues tengo una pregunta acerca de utilizar iif() dentro de una restriccion check algo como:

constraint CK_UseKardex check(iif(UseKardex=1, TipoKardex is not null, TipoKardex is null))

Pues que estoy migrando desde otro Gestor de BD. a Firebird con docenas de iif() como estas pero no me funciona. Hay alguna manera de hacer esto en firebird?.

Gracias de anticipadas por sus repuestas :).

Caral 06-09-2011 01:50:46

Hola
IIF() lo acepta Firebird, pero creo que solo dentro de un sql.
Saludos

CarlosG 06-09-2011 01:58:10

Gracias Caral.

Pero me preguntaba si existe alguna manera de lograr el mismo objetivo dentro del check en Firebird? claro con otras funciones que permita firebird.

Caral 06-09-2011 02:02:02

Hola
No se o no conozco el check, no lo he usado.
Saludos
PD: es pregunta para conocedores....

Caral 06-09-2011 02:18:26

Hola
Estaba revisando aqui para tratar de entender esto y segun entiendo lo que hace check es devolver un valor null segun el caso.
Da la impresion, o por lo menos a mi me parece que hace algo similar al IFF, solo que creando una sola condicion de retorno.
Lo que no entiendo es: Si es asi; por que no usar el IFF directamente ?.
Solo me auto pregunto ?.
Saludos

CarlosG 06-09-2011 02:42:58

Bueno Caral, lo que hace el check es validar una condicion logica Check(<condicion>) y hasta antes de la versión 2.0 de Firebird si la condicion se evaluaba a NULL se tomaba como False pero a partir de esta (la 2.0) se evalua a True
Cita:

a CHECK is now passed if the condition resolves to NULL
, por lo cual es mejor asegurarse de que la <condicion> devuelva True o False y no NULL, digo por si las mosca no vaya a cambiar en el futuro! ;).

La ventaja de la de la funcion IIF es que permite hacer validaciones anidadas mas complejas y mas entedibles que si la hicieramos sin ella, pero si no hay forma de utilizar IIF o algo similar tendre que hacerlo a mano.

Gallosuarez 06-09-2011 03:46:43

Dudas respecto a lo quieres hacer ...
 
Carlos:

:confused: Pues no entiendo bien a bien que es lo que quieres hacer en el check (no entiendo tu ejemplo), pero yo he utilizado el iif muy a menudo. Te pongo un par de ejemplos:

En un campo calculado:
Código SQL [-]
FULLNAME COMPUTED BY (TRIM(LASTNAME || ' ' || IIF(MOTHERSMAIDEN_NAME <> '', MOTHERS_MAIDEN_NAME || ' ', '') || FIRSTNAME));

Dentro de un procedimiento almacenado:
Código SQL [-]
  /* Bucle para procesar apellido(s) paterno */
  WHILE (1 = 1) DO
  BEGIN
    PosEspacio = IIF(POSITION(' ', APaterno) = 0, 1, POSITION(' ', APaterno));
    APaterno1 = SUBSTRING(APaterno FROM 1 FOR PosEspacio - 1);
    IF (APaterno1 NOT IN ('DE','LA','LAS','MC','VON','DEL','LOS','Y','MAC','VAN')
      OR (PosEspacio - 1) = 0) THEN LEAVE;
    APaterno = SUBSTRING(APaterno FROM PosEspacio + 1);
  END

Espero que te ayude mi código ...

Saludos,
Gerardo Suárez Trejo

CarlosG 06-09-2011 05:01:06

Gracias por las repuestas :).

Cita:

:confused: Pues no entiendo bien a bien que es lo que quieres hacer en el check (no entiendo tu ejemplo)
Disculpa es que lo saque rapido de mi codigo SQL DDL, y como que no se entiende muy bien . A Traducir: check(iif(UseKardex=1, TipoKardex is not null, TipoKardex is null))

condicion: UseKardex es = 1
Si es Verdadero: obligar el ingreso para el campo TipoKardex
Si es Falso: impedir que se ingrese informacion en el campo TipoKardex.

Soy nuevo en Firebird y habia creado todo mi script SQL de BD, usando checks comprobaciones a nivel de tabla con funciones IIF (pensaba que si se podia :( ) pero al probarlo no funciono, como decia CARAL no funcioma en checks, al parecer solo hay 2 opciones.

1.- Uso los Procedimientos almacenado, aunque mejor los triggers como sugiere GalloSuarez donde si puedo usar los IIFs.
2.- o sustituir los IIF por condiciones AND y OR, traduciendo el ejemplo seria: CHECK((UseKardex=1 AND TipoKardex is not null) or (UseKardex=0 AND TipoKardex is null)).

Gracias por las respuestas, tengo que corregir mi script SQL, cometiendo fallas se aprende :).


La franja horaria es GMT +2. Ahora son las 12:40:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi