Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   master source has detail records (https://www.clubdelphi.com/foros/showthread.php?t=69412)

gonza_619 16-08-2010 23:38:15

master source has detail records
 
hola, miren he tenido un problema con este mensaje, al parecer es porque en otro form tengo una tabla en la que relaciono la tabla que necesesito borrar un registro.
bueno tengo un form1 en la cual tengo 2 tables. una llamada CURSO y otra RUBRO , la tabla CURSO es el detalle y Rubro el maestro. bien ahora al seleccionar un Rubro me aparece todos los cursos de ese rubro, ahora cuando quiero borrar un curso de ese rubro me aparece "master has detail records", entonces me fije en el Form2 en el cual tengo una tabla planes de pago en el cual tengo relacionado Curso, lo cual parece ser el problema del mensaje, entonces hice los sig. en un boton eliminar del form1 cuando selecciono un curso:
Código Delphi [-]
If Application.MessageBox ('¿Estas seguro que deseas eliminar el registro actual?',
'Eliminar registro',mb_YesNo+MB_IconStop) = ID_yes Then

if form2.table2.fieldbyname('curso').asinteger=Table1.fieldbyname('cod_curso').asinteger
then
application.Terminate;

bien lo hice como prueba para ver si funcionaba pero no ocurre nada , no cierra la aplicacion
Aclaro que en el form 2, la tabla que relaciono curso (planes), tiene el campo CURSO como clave foranea. como sugieren que deberia hacer o modificar el codigo ? gracias

bueno tambien se me ocurrio :
If Application.MessageBox ('¿Estas seguro que deseas eliminar el registro actual?',
'Eliminar registro',mb_YesNo+MB_IconStop) = ID_yes Then

while not form3.Table3.EoF do
begin
if form3.Table3.FieldByName('curso').AsInteger=table1.FieldByName('cod_curso').AsInteger
then application.Terminate;
end;

pero al parecer no recorre la tabla del form3

ecfisa 17-08-2010 01:20:52

Hola gonza.

Supongamos que las tablas se llaman: Curso, Rubro y Planes.

Una posible solución sería usar el evento BeforeDelete de Curso para verificar si el registro tiene dependencias,
de ser así, avisar y abortar la operación:

Código Delphi [-]
procedure TForm1.CursoBeforeDelete(DataSet: TDataSet);
begin
  if not Planes.IsEmpty then
  begin
    ShowMessage('No se puede borrar, tiene registros dependientes'); // El mensaje que quieras.
    Abort;
  end;
end;

Saludos.

gonza_619 17-08-2010 04:25:48

master has detail records
 
bien, donde tendria que colocar el codigo? en un boton?,
el problema es que quiero borrar los datos relacionados en la otra tabla del form2.

ecfisa 17-08-2010 04:51:53

Hola.

No gonza.

Podés asignarlo:

.- Desde el Object Inspector:
Estando seleccionada la tabla Curso -> Click en pestaña Events -> Doble Click en el evento BeforeDelete.
Te va a armar la estructura del procedimiento.
Algo así:
Código Delphi [-]
procedure TForm1.CursoBeforeDelete(DataSet: TDataSet);
begin
  // ACA VA EL CÓDIGO
end;

.- O escribiendo el código. Asignás el procedimiento CursoBeforePost en el evento OnCreate del form por ejemplo.

Algo así:
Código Delphi [-]
procedure TForm1.CursoBeforeDelete(DataSet: TDataSet);
begin
  // ACA VA EL CÓDIGO
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    Curso.Open;
    Curso.BeforeDelete:= CursoBeforeDelete;
    ...
end;

Lógicamente te vá a resultar más fácil del primer modo.

Saludos.

gonza_619 17-08-2010 05:09:54

master has detail records
 
hola gracias, disculpa que no sepa mucho del tema pero estaria bien si lo coloco asi:

Código Delphi [-]
procedure TForm1.Table1BeforeDelete(DataSet: TDataSet);
begin
if not form3.Table3.IsEmpty then
  begin
    ShowMessage('No se puede borrar, tiene registros dependientes');
    Abort;
  end;

ya que la tabla planes esta en el form2 y curso en form1, y como probaria el evento? con un boton table1.delete? muchas graicas

ecfisa 17-08-2010 05:24:54

No tenés nada por que disculparte :)

Si tenés la tabla declarada en form3, es correcto.

Pero el código que te puse, sólo evita el borrado si tiene datos en relación de dependencia...
Y ahora mirando bién tu post anterior, ví que queres eliminar los datos dependientes.
caro y marcoszorrilla ya explicaron dos modos de hacerlo Acá .

Podés utilizar el código propuesto por ellos asignándolo a un TButton por ejemplo.

Cualquier duda no dejes de consultar

Saludos.

gonza_619 17-08-2010 05:36:31

gracias ecfisa, pero al parecer tampoco es ese el problema ya que quise borrar un dato en el cual no aparece en la tabla planes y me sigue tirando el mismo error, no se que puede ser o a que se refiere con "master has detail records cannot delete o modify" en el form 1 tengo un maestro detalle con las tablas que expliq y en el form 2 la tabla planes la cual contiene curso como FK.
la tabla curso es el detalle y rubro maestro. cuando quiero borrar un curso que selecciono del dbgrid me tira ese error, desactive la tabla rubro y sigue igual,
coloq un dblookupcombobox en el cual selecciono el rubro y me aparece los cursos en el dbgrid. no se como seguir , tendrian alguna sugerencia para resolverlo gracias desde ya

ecfisa 17-08-2010 14:28:29

Hola de nuevo gonza.

No me explicaba por que no te funcionaba hasta que encontré ( esto ), allí busca la frase: "Delete fails"
que explica el problema y bajate el update 7.1

Espero que así lo soluciones.

Saludos.

gonza_619 17-08-2010 16:58:11

solucionado
 
bien disculpa a todos pero al parecer tenia una tabla en la cual tenia relacionado tambien el curso, disculpen de nuevo pero espero q le sirva a alguien mas. ahora lo q tengo que hacer es borrar los registros que aparecen en las otras tablas primero para luego borrar la que selecciono en el dbgrid.
entonces se me ocurrio
Código Delphi [-]
if Dbgrid.columns.count >0 then
 var1 := dbgrid.columns[1].Field.AsString;
 var2 := DBGrid.SelectedField.AsString;
lo saq de otro post, es decir YO SELECCIONO UN REGISTRO DEL DBGRID Q REPRESENTA LA TABLA Y LO ELIMINO, PERO ANTES TENGO Q REGISTRAR QUE ESE REGISTRO NO ESTE EN OTRAS TABLAS RELACIONADO ENTONCES HICE:
Código Delphi [-]
procedure TForm1.Button5Click(Sender: TObject);
var x:integer;
begin
x:=table1.fieldbyname('cod_curso').asinteger;
while not Table3.EoF do
  begin
  if Table3.FieldByName('curso').AsInteger=x
   then  TABLE1.DELETE;
   end;
INTENTE DE QUE EL REGISTRO QUE SELECCIONO DEL DBGRID SE GUARDE EN UNA VARIABLE Y LUEGO RECORRA LA TABLA EN DONDE TAMBIEN ESTA ESE REGISTRO (TABLE3) Y LO ELIMINE PRIMERO PARA LUEGO ELIMINARLO DEL TABLE1 DE DONDE LO SELECCIONE. EL PROBLEMA ES CUANDO TENGO Q BUSCAR O RECORRER UNA TABLA QUE ESTA EN OTRO FORM.
BUENO SEGUIRE PROBANDO Y SI LO SOLUCIONO LO POSTEO GRACIAS DESDE YA


La franja horaria es GMT +2. Ahora son las 08:51:14.

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