Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ALmacenar Un Campo En 3 tablas diferentes (https://www.clubdelphi.com/foros/showthread.php?t=22662)

(VIH)Lestat 22-06-2005 18:19:12

ALmacenar Un Campo En 3 tablas diferentes
 
Antes que nada un salu2 a todos y disculpen por las molestias ocasionadas de mi parte ... pero hasta ahora nadie ha podido resolver mi problema que tengo con DELPHI7 e Interbase 7.1...

Alguien me puede decir como puedo Almacenar el valor de un campo de en 3 tablas distintas???...

Miren este es el problema:: Tengo 4 tablas (IBTalumnos, IBTalumnos_carrera, IBTalumnos_semestre,IBTAlumnos_doc) mi Tabla padre es la tabla IBTalumnos, Y las 3 ultimas son las tablas HIJO,, como todos saben en la propiedad MASTERSOURCE de estas 3 ultimas tablas va el nombre de la tabla PADRE es decir:: IBTalumnos y en su propiedad MASTERKEYS los campos que hacen referencia a mi tabla PADRE es decir:: DNI_alumno(TABLAHIJO)-->DNI(TABLAPADRE) ¿ME EXPLICO????

Entonces tengo un formulario en donde capturare la informacion de los alumnos en las tablas antes mencionadas... Pero el problema es ¿¿como almaceno el DNI del alumno en las diferentes tablas al mismo tiempo???

Se puede hacer esto???? como???? de que manera??? en realidad me urge una respuesta y si alguien sabe como hacerle se los agradeceria mucho....

SALE2

geovany 22-06-2005 20:28:07

Has un trigger en la tabla que sea el formulario y al momento de guardar que el trigger te lo guarde en las demas tablas...

(VIH)Lestat 23-06-2005 19:05:54

Oye geovany me puedes dar un ejemplo de como quedaria el TRIGGER por que la verdad no se como se hacen.....

SALU2

el_barto 23-06-2005 19:10:40

Código SQL [-]
 

SET TERM !! ;
CREATE TRIGGER SAVE_SALARY_CHANGE FOR EMPLOYEE
 AFTER UPDATE AS
 BEGIN
  IF (OLD.SALARY <> NEW.SALARY) THEN
  INSERT INTO SALARY_HISTORY
  (EMP_NO, CHANGE_DATE, UPDATER_ID, OLD_SALARY, PERCENT_CHANGE)
   VALUES (OLD.EMP_NO, 'now', USER,OLD.SALARY,
   (NEW.SALARY - OLD.SALARY) * 100 / OLD.SALARY);
 END !!

SET TERM ; !!

ejemplos como estos encontraras en las ayudas del interactive sql de interbase o en el siguiente link si quieres saber mas de los trigger en interbase

Interbase

Chao espero te sirva de algo

(VIH)Lestat 23-06-2005 19:53:22

ok ok entonces realizare mi trigger y si tengo algunos problemas se los hare saber para que puedan ayudarme... ahhh y otra pregunta..

cuando se almacenan los datos en los IBTAbles desde formularios de Delphi tambien se almacenan en mi base de datos??? o sea puedo ver lo qe almacene en mis tablas desde INTERBASE????

el_barto 23-06-2005 20:15:51

Si haces commit en la transaccion lo puedes ver en Interbase

roman 23-06-2005 22:44:30

Como yo no sé de triggers quizá haga una pregunta muy tonta. ¿Por qué no se puede simplemente hacer:

0. empezar transacción
1. Insertar al alumno
2. Obtener el dni asignado
3. insertar carrera con el dni obtenido
4. insertar semestre con el dni obtenido
5. insertar doc con el dni obtenido
6. terminar transacción

Sé que son varias consultas sql pero cada una de ellas debe ser muy rápida.

// Saludos

(VIH)Lestat 24-06-2005 18:54:19

AYUDAAAA!!!!!!

Miren ya quite todos mis DBedits de mi formulario y meti los TEDITs entonces en el edit1 es en donde se encuentra la matricula del alumno y todos mis datos los voy a almacenar de la siguiente manera:

Cita:

IBtable1.fieldbyname('dni').asString:= EDit1.text;
Ibtable2.fieldbyname('dni_alumno').asstring:=Edit1.text;
IBtable3.fieldbyname('dni_alumno').asstring:=edit1.text;
IBtable4.fieldbyname('dni_alumno').asstring:=Edit1.text;
en el boton "guardar" (button1) y lo unico que tengo enlazadoo que supuestamente se guardaria automaticamente son unos DBcombobox que contienen informacion sobre el status del alumno y el estado civil....

Pero me marca error acerca de que el 'FIELD 'DNI_ALUMNO' MUST HAVE A VALUE' ... a que se debe este mensaje?????
sera que no puedo guardar la informacion de un edit en diferentes tablas??? acaso cuando lo guardo en la primera se borra la informacion del EDIT...???

que es lo que pasa??? ayudenme..

el_barto 24-06-2005 18:59:38

Cita:

Como yo no sé de triggers quizá haga una pregunta muy tonta
lo que pasa es que personalmente es mejor usar triggers dado que tu puedes condicionar que se disparen cuando se presenten ciertas condiciones especificas se podra hacer con codigo sql y delphi pero para mi es mejor usar el trigger

el_barto 24-06-2005 19:07:55

[quote=(VIH)Lestat]
Pero me marca error acerca de que el 'FIELD 'DNI_ALUMNO' MUST HAVE A VALUE' ... a que se debe este mensaje?????QUOTE]

evidentemente es que en el campo DNI_ALUMNO no hay dato que guardar posiblemente sea por lo que stu dices no estoy seguro pero si es por eso por que no guardas el dato que tiene en el edit1.text y lo asignas despues de que haces esto

Código Delphi [-]
 
variable := Edit1.Text;
IBtable1.fieldbyname('dni').asString:= EDit1.text;
Edit1.text := variable;

es una solucion muy mediocre pero creo que funciona..

Cita:

acaso cuando lo guardo en la primera se borra la informacion del EDIT...???
No sabria responder, no me acuerdo

(VIH)Lestat 24-06-2005 19:33:17

Pues me sigue marcando el mismo error BARTO..

mira ya probe con esto...

Código:

var dni_a:string;
                    begin
                                  cni_a:=edit1.text;
                                  IBtable1.fieldbyname.('dni'):=dni_a;
                                  IBtable2.fieldbyname('dni_alumno):=dni_a;

y tampoco funciona me sigue marcando es mismo error...

Probe tambien con lo que me digiste y sigue marcando error...

el_barto 24-06-2005 20:38:12

como creaste la tabla dni_alumno es que hay una cosa que debes saber si tienes dos tablas

alumno materia

y en alumno tienes los atributos (*)nombre, (*)apellido, (*)dni, telefono por decir algo

y en materia tienes los atributos (*)nom_materia, (*)cod_materia, (*)dni_alumno

en donde los que tienen (*) son campos obligatorios y si tu le pides a el edit que inserte el dato desde la tabla alumno sacara error siempre por que llenas el campo dni_alumno y los demas campos no los estas llenando siendo ellos obligatorios

Verifica tu teoria de llenar datos en distintas tablas depronto lo que necesitas no es eso

roman 24-06-2005 21:09:24

Cita:

Empezado por el_barto
sacara error siempre por que llenas el campo dni_alumno y los demas campos no los estas llenando siendo ellos obligatorios

Pero el error claramente muestra que el campo que da problemas es DNI_ALUMNO. Aun cuando existiera un problema con otros campos requeridos por el momento el caso es que por alguna razón no está tomando el dato del Edit correctamente.

// Saludos

el_barto 24-06-2005 21:22:26

Cita:

Empezado por (VIH)Lestat
Pues me sigue marcando el mismo error BARTO..

mira ya probe con esto...

Código:

var dni_a:string;
                begin
                                cni_a:=edit1.text;
                                IBtable1.fieldbyname.('dni'):=dni_a;
                                IBtable2.fieldbyname('dni_alumno):=dni_a;


fijate es esto:

lodeclaras asi
Código Delphi [-]
var dni_a:string;
pero lo usas asi
Código Delphi [-]
cni_a:=edit1.text;

El error en este caso se puede producir por esto no??? lo usas como cni_a y lo declaraste dni_a

Cita:

Pero el error claramente muestra que el campo que da problemas es DNI_ALUMNO. Aun cuando existiera un problema con otros campos requeridos por el momento el caso es que por alguna razón no está tomando el dato del Edit correctamente.

Lo digo por que el error muy seguramente se le va a presentar entonces en el trigger que armo desde un principio debio decir que los demas campos o no son obligatorios o se generaran automaticamente, tu que crees Roman??? puedo estar equivocado

roman 24-06-2005 21:27:51

Cita:

Empezado por el_barto
tu que crees Roman???

En cuanto a lo de dni_a y cni_a que fue un simple error al transcribir aquí el código, de lo contrario estaría obteniendo un error de "Undeclared identifier".

En cuanto a lo segundo, quizá justamente el trigger le esté metiendo ruido. Tal como lo plantea ahora pareciera no requerir el trigger pero quizá lo sigue teniendo activo y puede ser que no esté bien definido y sea el que esté metiendo valores en blanco.

// Saludos

el_barto 24-06-2005 21:34:41

Sip por que como muestra nuestro amigo vih lo hace mediante codigo normalito es decir sin hacer uso del trigger, seria bueno mirar como armaste el trigger,
puede que el trigger si tiene un before insert no este guardando el valor de DNI_ALUMNO y por eso se dispara la excepcion

(VIH)Lestat 24-06-2005 21:41:21

MIren... Por el momento no estoy utilizando triggers, pero ya se como funcionan... no los utilizo por que el valor que quiero insertar automaticamente o por medio del trigger es el DNI del alumno pero los demas campos los debe jalar de los DBEDits que tenia... pero todos mis DBEDITS ya los elimine y decidi almacenar los datos directamente en la tabla o sea por medio de la propiedad FIELDBYNAME.. si me entienden???? entonces declare la variable como me sugirio el BARTO y almaceno la DNI del alumno que esta en el edit en la variable..... luego esa misma variable la utilizo para almacenar los datos en las diferentes tablas y estoy checando la variable y si almacena el valor del EDIT.. pero me marca error al guardar los datos ....por que despues de utilizar el FIELDBYNAME.asstring:=dni_a; tengo puesto IBtalbe1.post para guardar los datos....

pero tengo una duda.... si estoy utilizando la propiedad de la tabla FIELDBYNAME para introducir los datos ... ya no tengo que utilizar el POST para guardar los cambios???? porque he visto otros ejemplos cuando almacenan los datos con dicha propiedad y no los utilizan pero hay otros que si...entonces no se que hacer????

(VIH)Lestat 24-06-2005 22:56:07

Para ser mas especifico aqui les pongo el codigo que utilizo para almacenar informacion en las tablas antes mencionadas... espero puedan encontrar el error que me aqueja....todo este codigo lo tengo puesto para un boton..

Código:

procedure TIngresar_alum.BitBtn3Click(Sender: TObject);
 
 
 var dni_a:string;
        apellidopa:string;
        apellidoma:string;
        nombre:string;
        sex:string;
        dir:string;
        local:string;
        ciud:string;
        tele:string;
        fecha_ing:variant;
        statu:string;
        imagen:variant;
        edoc:string;
        carrera:string;
        sem:integer;
        cert:integer;
        fot:integer;
        act:integer;
        cur:integer;
 
 
 
 begin
 
  dni_a:=matricula.Text;
  apellidopa:=apaterno.Text;
  apellidoma:=amaterno.Text;
  nombre:=nombres.Text;
  sex:=sexo.Text;
  dir:=direccion.Text;
  local:=localidad.Text;
  ciud:=municipio.Text;
  tele:=telefono.Text;
  edoc:=edocivil.Text;
  carrera:=DBLcarrera.KeyValue;
  fecha_ing:=fecha.Text;
  statu:=status.Text;
 
  sem:=strtoint(semestre.Text);
  cert:=strtoint(certificado.ValueChecked);
  act:=strtoint(acta.ValueChecked);
  fot:=strtoint(fotos.ValueChecked);
  cur:=strtoint(curp.ValueChecked);
 
 
 
 //Se ponen en modo Editar las Tablas para empezar a recibir datos
 
                ModuloSID.IBTalumnos.Edit;
                ModuloSID.IBTalumno_carrera.Edit;
                ModuloSID.IBTsemestre.Edit;
                ModuloSID.IBTalum_doc.Edit;
 
 
 
 
 
 //Se captura la informacion directamente de las cajas de Texto
 
 
                ModuloSID.IBTalumnos.FieldByName('dni').AsString:=dni_a;
                ModuloSID.IBTalumnos.FieldByName('apellido_pa').AsString:=apellidopa;
                ModuloSID.IBTalumnos.FieldByName('apellido_ma').AsString:=apellidoma;
                ModuloSID.IBTalumnos.FieldByName('nombre').AsString:=Nombre;
                ModuloSID.IBTalumnos.FieldByName('sexo').AsString:=Sex;
                ModuloSID.IBTalumnos.FieldByName('direccion').AsString:=Dir;
                ModuloSID.IBTalumnos.FieldByName('localidad').AsString:=Local;
                ModuloSID.IBTalumnos.FieldByName('ciudad').AsString:=ciud;
                ModuloSID.IBTalumnos.FieldByName('telefono').AsString:=Tele;
                ModuloSID.IBTalumnos.FieldByName('fecha_ingreso').Value:=fecha_ing;
                ModuloSID.IBTalumnos.FieldByName('edo_civil').AsString:=edoc;
                MOduloSID.IBTalumnos.FieldByName('status').AsString:=statu;
               
                ModuloSID.IBTalumnos.Post;
 
                ModuloSID.IBTalumno_carrera.FieldByName('dni_alumno').AsString:=dni_a;
                ModuloSID.IBTalumno_carrera.FieldByName('dni_carrera').AsString:=carrera;
                ModuloSID.IBTalumno_carrera.Post;
 
                ModuloSID.IBTsemestre.FieldByName('dni_alumno').AsString:=dni_a;
                ModuloSID.IBTsemestre.FieldByName('semestre').AsInteger:=sem;
                ModuloSID.IBTsemestre.Post;
 
 
                ModuloSID.IBTalum_doc.FieldByName('dni_alumno').AsString:=dni_a;
                ModuloSID.IBTalum_doc.FieldByName('certificado').AsInteger:=cert;
                ModuloSID.IBTalum_doc.FieldByName('acta').AsInteger:=act;
                ModuloSID.IBTalum_doc.FieldByName('fotos').AsInteger:=fot;
                ModuloSID.IBTalum_doc.FieldByName('curp').AsInteger:=cur;
                ModuloSID.IBTalum_doc.Post;

como pueden ver estoy utilizando un Modulo de datos llamado "ModuloSID" en donde almaceno todos los componentes no visuales de mi BD... espero que me puedan ayudar...
ahh y otra cosa tengo declarado variables para almacenar la informacion de los EDITS y luego pasarselas a mis tablas ... estas variables "SI" almacenan la informacion porque ya le hice pruebas y si me la retiene.. el problema esta en las clausulas POST SUPONGO!!!!:confused::confused:

ercrizeporta 26-06-2005 02:22:42

k pasa tio?a ver si ahora puedo ayudarte yo con esta duda que t surge. creo que el error se puede deber a k para abrir la base de datos para recibir datos lo hagas con "edit". si los datos que vas a introducir son nuevos porque no pruebas a guardar los datos usando el comando "insert" para preparar la base de datos para recibirlos. yo pondría el codigo de insertar en cada tabla debajo de su correspondiente "edit", por el hecho de que cuanto menos tiempo este modificando las tablas supongo será mejor, pero ya esto solo es una idea.
espero haya suerte y sirva esto!!


La franja horaria es GMT +2. Ahora son las 02:36:54.

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