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: 21
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: 21
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: 21
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
  #7  
Antiguo 23-07-2007
servicomp servicomp is offline
Miembro
 
Registrado: oct 2003
Ubicación: Cartago
Posts: 153
Poder: 21
servicomp Va por buen camino
ok asi me lo omaginaba, lo haremos y te comentare por este medio que problemas se presentaron


agradeciendo de antemano la atención prestada
Responder Con Cita
  #8  
Antiguo 01-08-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Tu peo no es de base de datos si no de aplicacion.

Lo que quieres es si existe el nit que lo muestre si no que lo inserte.

haces un select sobre la tabla donde el edit.text sea igual al nit. Si encuentras una considencia la muentra si no ya estas insertando cuando edites cualquie campo dentro d el abase de datos.

Este trabajo s eme hace mas facil ya que uso ibo y los dbedit tiene un campo uq ese llama para el cual puedo usar dentro del sql y el se encarga de pasarlo automaticamente.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #9  
Antiguo 12-08-2007
servicomp servicomp is offline
Miembro
 
Registrado: oct 2003
Ubicación: Cartago
Posts: 153
Poder: 21
servicomp Va por buen camino
Y como lo hao desde un Edit

Hola Compañeros

bueno como les habia dicho al principio del enlace, mi tabla es pequeña, solo para aprendizaje.

El ejemplo que estamos realizando es el del tutor de Paradox a interbase, que me ha servidor demasiado. todo muy bien cuando usamos un DbGrid, pero queremos Usar unos Edit

Como hago para grabar la información en mi tabla

En el Ibdataset1 en la propiedad InsertSQL inserte el siquiente codigo
Código SQL [-]
Insert To Personas (clavepersona, nombre, apellidos, telefono, email)
Values
(:Edit1.Text, :Edit2.Text, :Edit3.Text, :Edit4.text, :Edit5.Text)

Supuestamente me pasa los datos de los Edit a la tabla.

Pero en mi boton de grabar como lo hago

Código PHP:
procedure TForm1.Button2Click(SenderTObject);
begin
   
Que colocamos aquicomo hago para que me almacene la información 
      que se encuentra en los Edit
}  
end
Agradeciendo amigos la atención prestada
Responder Con Cita
  #10  
Antiguo 13-08-2007
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
No te compliques la vida si usas el IBDataset,
Entra solo la propiedad SelectSQL, lo demas se genera automaticamente pinchando con el boton derecho sobte el componente y la opcion Dataset Editor, con el asistente se generan las demas SQLs, asi podras utilizar los metodos insert, edit, post etc. del dataset..
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #11  
Antiguo 16-08-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Facil, Usa:

Cita:
procedure TForm1.Button2Click(Sender: TObject);
begin
{ Que colocamos aqui, como hago para que me almacene la información
que se encuentra en los Edit}
end;

Código Delphi [-]
InsertSQL.ParamByName('campo').AsString := Edit.Text

Tambien puedes usar: AsInteger, AsDateTime, AsCurrency segun el tipo de datos
__________________
Sitrico
Responder Con Cita
  #12  
Antiguo 16-08-2007
servicomp servicomp is offline
Miembro
 
Registrado: oct 2003
Ubicación: Cartago
Posts: 153
Poder: 21
servicomp Va por buen camino
Smile Agradecimiento

Te agradezco la información, lo colocaré en práctica y ver si resuelve mi inquietud
Responder Con Cita
  #13  
Antiguo 27-08-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Si quieres usar un boton x o y pudes crear una accion de base de datos y la relacionas con el data source dle data set y esta con el btos(componete t action de la paeta standart).
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
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 01:26:42.


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