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 20-07-2007
servicomp servicomp is offline
Miembro
 
Registrado: oct 2003
Ubicación: Cartago
Posts: 153
Poder: 21
servicomp Va por buen camino
MAnejando la integridad de los Datos en Firebird

Hola compañeros

ÇComo lo he manifestado en preguntas anteriores son nuevo en esto de el Firebird, y queremos en estas vacaciones migrar mi viejo aplicativo de Paradox a Firebird

Según lo que hemos leído en el foro y entras páginas, tomé la desición de usar los IBX comommetodo de conexión de mi firebird.

Todos los ejemplos que hemos hecho han resultado de mucha ayuda y aprendizaje, pero también han iniciado a salir las dudas que no he podido resolver.

Se ha creado una tabla ejemplo pequeña con la siguiente composición
Código SQL [-]
CREATE TABLE PERSONAS (
    NIT          VARCHAR(12) NOT NULL,
    NOMBREUNO    VARCHAR(10) NOT NULL,
    NOMBREDOS    VARCHAR(10),
    APELLIDOUNO  VARCHAR(15) NOT NULL,
    APELLIDODOS  VARCHAR(15),
    CELULARUNO   VARCHAR(15),
    CELULARDOS   VARCHAR(15),
    TELEFONO     VARCHAR(15),
    EMAIL        VARCHAR(30),
    MESSENGER    VARCHAR(30)
);


/****                             Primary Keys                             ****/

ALTER TABLE PERSONAS ADD CONSTRAINT PK_PERSONAS PRIMARY KEY (NIT);

Le ingresamos algunos datos, pero como no se debe repetir el campo NIT. tratamos de resolver el problema como se hace en paradox, el cual es recoger el valor a verificar y mediante una buisquedad en la tabla, si se encuentra, nos ubicamos en el y traemos la información.

En firebird los conceptos son totalmente diferentes

Código:
1. Podemos hacerlo mediante un TRIGGERS ó disparador, en el Before Insert.
2. Mediante un Procedimiento Almacenado
3. Este a pesar que no lo he leído me imagino ue también es factible, y es mediante código en Delphi.
El problema es que no he encontrado la forma de hacerlo, asi que solicito su colaboración para tener una luz.

Se que hay una forma de programarlo y seria algo asi
Código SQL [-]
Select NIT FROM  PERSONAS 
Where NIT = Edit1.Text;

Como proceso esta información.
Responder Con Cita
  #2  
Antiguo 21-07-2007
TJose TJose is offline
Miembro
 
Registrado: may 2003
Posts: 162
Poder: 22
TJose Va por buen camino
Código SQL [-]
create table Tabla1(
   Id dId,
   Apellido dApellido,
   ...   
   IdEtapa dId,
   ...
);

create table Etapas(
   Id dId,
   Etapa dTexto30
);

...

alter table Tabla1 add constraint pk_Tabla1 primary key (Id);
alter table Etapas add constraint pk_Etapas primary key (Id);

...

alter table Tabla1 add constraint fk_Tabla1_01 foreign key (IdEtapa) references Etapas(Id);

en la última sentencia
Código SQL [-]
alter table Tabla1 add constraint fk_Tabla1_01 foreign key (IdEtapa) references Etapas(Id);
obliga a que cuando se setee un valor a idetapa en la tabla Tabla1, este valor exista en la tabla Etapas (campo id)
se podrían según el caso y las necesidades aplicar variaciones, como por ejemplo que cuando se borre un registro de Etapas, borre todos los registros de Tabla1 donde el IdEtapa corresponde a Id de la tabla Etapas. Esto se denomina borrado en cascada. También se puede definir una actualización en cascada

También a través de dominios puede implementarse algún tipo de validación y mantención de la integridad de los datos. Por ejemplo:
Código SQL [-]
create domain dSexo as
char(1)
not null
check (value in ('M','F'));

Saludos
TJose
Responder Con Cita
  #3  
Antiguo 21-07-2007
servicomp servicomp is offline
Miembro
 
Registrado: oct 2003
Ubicación: Cartago
Posts: 153
Poder: 21
servicomp Va por buen camino
Agradeciendo tu colaboración


No hay otra forma mas entendible para realizar esta operación, se me hace complicado hacer un tabla diferente para esta necesidad

como se podria realizar de unas forma más sencilla
Responder Con Cita
  #4  
Antiguo 23-07-2007
TJose TJose is offline
Miembro
 
Registrado: may 2003
Posts: 162
Poder: 22
TJose Va por buen camino
para el campo NIT

veo que lo has definido como clave primaria
Código SQL [-]
ALTER TABLE PERSONAS ADD CONSTRAINT PK_PERSONAS PRIMARY KEY (NIT);
ya con esto no se podrán repetir (por estar definido como primary key)

También puedes hacer que no se repitan valores en campos que no son clave primaria con la sentecia siguiente
Código SQL [-]
alter table Etapas add constraint unq_Etapas unique (Etapa);

En este caso no podrán ingresarse registros donde el campo Etapa se repita.

Saludos
TJose
Responder Con Cita
  #5  
Antiguo 23-07-2007
servicomp servicomp is offline
Miembro
 
Registrado: oct 2003
Ubicación: Cartago
Posts: 153
Poder: 21
servicomp Va por buen camino
agradeciendo de nuevo la colaboración al problema

hola compañeros


De nuevo gracias por su colaboración.

Bueno, queremos que cuando un nuevo NIT ingrese al sistema, primero verifique si se encuentra en la base de datos; si no se encuentra se introducen todos los datos, pero si se encuentra, debemos hacer llegar los datos a la pantalla bien sea para su actualización ó la eliminación.


agradeciendo de antemano la atención prestada
Responder Con Cita
  #6  
Antiguo 23-07-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
Creeme que la que te comentaron es la manera correcta, (indice unico).

Debes manejar la excepción de clave duplicada.

Para lograr lo que quieres puedes hacer lo siguiente:

1 lees el NIT
2 Inicias una transacción (StartTransaction).
3 insertas el NIT (INSERT INTO TABLA (NIT) AS (:NIT)
4 Ejecutas el SQL
5 Si hay error = NIT (Repetido ó invalido) Aqui puedes leer los datos para modificar ó eliminar.
6 Haces un RollBack sobre la transacción (2) (desaparece la inserción y continuas)
7 pides los demás datos
8 Guardas todo (ahora sí commit).
__________________
Sitrico

Última edición por sitrico fecha: 23-07-2007 a las 17:27:06.
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
Manejando manejadores... Berto2003 Varios 5 06-03-2007 10:38:40
Manejando la tabla ASCII en C aeff C++ Builder 4 22-01-2007 18:02:47
Problema manejando excepciones David OOP 1 28-07-2006 19:17:48
problema manejando datos =( CI>140 Conexión con bases de datos 4 22-09-2003 09:56:16
problemas manejando campos CI>140 Conexión con bases de datos 1 20-09-2003 15:59:40


La franja horaria es GMT +2. Ahora son las 06:37:16.


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