Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-09-2011
Avatar de CarlosG
CarlosG CarlosG is offline
Miembro
NULL
 
Registrado: ago 2011
Posts: 24
Poder: 0
CarlosG Va por buen camino
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 .
Responder Con Cita
  #2  
Antiguo 06-09-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
IIF() lo acepta Firebird, pero creo que solo dentro de un sql.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 06-09-2011
Avatar de CarlosG
CarlosG CarlosG is offline
Miembro
NULL
 
Registrado: ago 2011
Posts: 24
Poder: 0
CarlosG Va por buen camino
Question

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.
Responder Con Cita
  #4  
Antiguo 06-09-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No se o no conozco el check, no lo he usado.
Saludos
PD: es pregunta para conocedores....
__________________
Siempre Novato
Responder Con Cita
  #5  
Antiguo 06-09-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #6  
Antiguo 06-09-2011
Avatar de CarlosG
CarlosG CarlosG is offline
Miembro
NULL
 
Registrado: ago 2011
Posts: 24
Poder: 0
CarlosG Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 06-09-2011
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 18
Gallosuarez Va por buen camino
Question Dudas respecto a lo quieres hacer ...

Carlos:

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

Última edición por Gallosuarez fecha: 06-09-2011 a las 03:47:45. Razón: corrección el el código ...
Responder Con Cita
  #8  
Antiguo 06-09-2011
Avatar de CarlosG
CarlosG CarlosG is offline
Miembro
NULL
 
Registrado: ago 2011
Posts: 24
Poder: 0
CarlosG Va por buen camino
Gracias por las repuestas .

Cita:
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 .
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
char_length en check no funciona erickperez6 Firebird e Interbase 1 23-10-2010 04:40:15
instruccion CHECK CHiCoLiTa MS SQL Server 3 01-03-2005 18:12:58
Actualizar un check cmgenny Firebird e Interbase 5 28-03-2004 18:09:18
Check!! subzero Firebird e Interbase 3 09-02-2004 23:43:04
Error gds consistency check... no se que judoboy Firebird e Interbase 12 31-07-2003 19:13:33


La franja horaria es GMT +2. Ahora son las 09:58:17.


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
Copyright 1996-2007 Club Delphi