Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-08-2010
gonza_619 gonza_619 is offline
Miembro
 
Registrado: feb 2010
Posts: 157
Poder: 15
gonza_619 Va por buen camino
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

Última edición por gonza_619 fecha: 16-08-2010 a las 23:52:57. Razón: otra opcion
Responder Con Cita
  #2  
Antiguo 17-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.

Última edición por ecfisa fecha: 17-08-2010 a las 01:28:46.
Responder Con Cita
  #3  
Antiguo 17-08-2010
gonza_619 gonza_619 is offline
Miembro
 
Registrado: feb 2010
Posts: 157
Poder: 15
gonza_619 Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 17-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.

Última edición por ecfisa fecha: 17-08-2010 a las 04:54:59.
Responder Con Cita
  #5  
Antiguo 17-08-2010
gonza_619 gonza_619 is offline
Miembro
 
Registrado: feb 2010
Posts: 157
Poder: 15
gonza_619 Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 17-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.

Última edición por ecfisa fecha: 17-08-2010 a las 05:31:10.
Responder Con Cita
  #7  
Antiguo 17-08-2010
gonza_619 gonza_619 is offline
Miembro
 
Registrado: feb 2010
Posts: 157
Poder: 15
gonza_619 Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 17-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.

Última edición por ecfisa fecha: 17-08-2010 a las 14:37:51.
Responder Con Cita
  #9  
Antiguo 17-08-2010
gonza_619 gonza_619 is offline
Miembro
 
Registrado: feb 2010
Posts: 157
Poder: 15
gonza_619 Va por buen camino
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
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
Dá error "Master has detail records" cuando no debería darlo! JuanBCT Tablas planas 3 06-08-2005 03:48:37
DBLookupComboBoxs Master/Detail o Detail/Master yusnerqui OOP 5 29-07-2005 18:40:20
master/detail, imprimiendo master en cada hoja acalderonr Impresión 4 29-11-2003 14:46:07
interbase:¿como crear un master-detail-detail? ElSanto24 Firebird e Interbase 2 22-10-2003 10:24:45
Master/Detail/Detail/Detail/etc... hgiacobone Tablas planas 2 24-07-2003 17:20:31


La franja horaria es GMT +2. Ahora son las 19:18:18.


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