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)
-   -   MAnejando la integridad de los Datos en Firebird (https://www.clubdelphi.com/foros/showthread.php?t=46014)

servicomp 20-07-2007 18:22:44

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.

TJose 21-07-2007 02:15:42

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

servicomp 21-07-2007 22:47:16

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

TJose 23-07-2007 00:08:40

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

servicomp 23-07-2007 16:48:31

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 :rolleyes:

sitrico 23-07-2007 17:24:57

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).

servicomp 23-07-2007 18:22:43

ok asi me lo omaginaba, lo haremos y te comentare por este medio que problemas se presentaron


agradeciendo de antemano la atención prestada

rastafarey 01-08-2007 19:11:47

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.

servicomp 12-08-2007 00:52:13

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

Delfino 13-08-2007 00:49:32

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..

sitrico 16-08-2007 19:47:07

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

servicomp 16-08-2007 21:40:27

Agradecimiento
 
Te agradezco la información, lo colocaré en práctica y ver si resuelve mi inquietud

rastafarey 27-08-2007 20:07:21

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).


La franja horaria es GMT +2. Ahora son las 09:11:41.

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