Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Procedimiento para el boton borrar (https://www.clubdelphi.com/foros/showthread.php?t=45496)

magnu9 04-07-2007 23:01:36

Procedimiento para el boton borrar
 
Hola chicos... utilizo el siguiente procedimiento para guardar una localidad de un articulo... en un sistema de farmacia que estoy construyendo... me explico un poco. Lo que quiero es borrar una localidad cuando lo desee. Pero si esta localidad esta asignada a un articulo pues no se puede borrar sin antes haber borrado el articulo. Pero aunque la localidad no tenga articulo asignado como quiera el procedimiento me lanza el mensaje de que "La localidad tiene articulos asignados". Se animan ayudarme. Gracias de antemanos.

Código Delphi [-]
procedure TmtLocalidad.borrarClick(Sender: TObject);
begin
        querArticulo.close;
        querArticulo.SQL.Text:='SELECT articulo.codloc FROM articulo INNER JOIN localidad ON articulo.codloc = localidad.codloc';
          querArticulo.Open;  
        if querArticulo.Fields[0].AsInteger <> 0 then
          showmessage('Esta Localidad Tiene Articulos Asignados')
        else
        if dbCodigo.text = '' then
             MessageDlg('No existe localidad para borrar', mtInformation,[mbCancel], 0,)
         else if MessageDlg('¿ Seguro que desea borrar la localidad' + dbCodigo.Text + ' ?',
              mtConfirmation, [mbYes, mbNo], 0) = mrYes then
              querLocalidad.Delete;
              btnNuevo.Enabled:=true;
              btnGuardar.Enabled:=false;
end;

magnu9 04-07-2007 23:46:57

Solucion posible
 
Amigos creo que lo he solucionado. Pero si alguien quiere aportar algo se lo agradezco de corazon.

Código Delphi [-]
procedure TmtLocalidad.SpeedButton1Click(Sender: TObject);
begin
        querArticulo.close;
            querArticulo.SQL.Text:='SELECT localidad.codloc FROM articulo CROSS JOIN localidad WHERE (localidad.codloc = '''+dbcodigo.Field.Text+''' and articulo.codloc = '''+dbcodigo.Field.Text+''')';
          querArticulo.Open;  
        if querArticulo.Fields[0].AsInteger <> 0 then
          showmessage('Esta Localidad Tiene Articulos Asignados')
        else
        if dbCodigo.text = '' then
             MessageDlg('No existe localidad para borrar', mtInformation,[mbCancel], 0,)
         else if MessageDlg('¿ Seguro que desea borrar la localidad' + dbCodigo.Text + ' ?',
              mtConfirmation, [mbYes, mbNo], 0) = mrYes then
              querLocalidad.Delete;
              btnNuevo.Enabled:=true;
              btnGuardar.Enabled:=false;
end;

gabrielkc 05-07-2007 00:13:16

Cita:

Empezado por magnu9
Código Delphi [-]Procedure TmtLocalidad.SpeedButton1Click(Sender: TObject);
begin
querArticulo.close;
querArticulo.SQL.Text:='SELECT localidad.codloc FROM articulo CROSS JOIN localidad WHERE (localidad.codloc = '''+dbcodigo.Field.Text+''' and articulo.codloc = '''+dbcodigo.Field.Text+''')';
querArticulo.Open;
if querArticulo.Fields[0].AsInteger <> 0 then
showmessage('Esta Localidad Tiene Articulos Asignados')
else
if dbCodigo.text = '' then
MessageDlg('No existe localidad para borrar', mtInformation,[mbCancel], 0,)
else if MessageDlg('¿ Seguro que desea borrar la localidad' + dbCodigo.Text + ' ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
querLocalidad.Delete;
btnNuevo.Enabled:=true;
btnGuardar.Enabled:=false;
end;

Depende de la BD que estés usando.

A eso que quieres hacer se le llama integridad referencial.

En los RDBMS (Firebird,Interbase,SQL Server, etc) se puede especificar eso desde la BD y no tendrias problemas, pero si lo haces con Paradox.......no se si definiendo un Indice secundario (no creo, pero no recuerdo, hacer mucho no uso paradox).


pero algunas correcciones o recomendaciones:
*Renombra las tablas para que no pongas el nombre completo cada vez que hagas referencia a ellas.
*Cuando quieras un string entrecomillado usa la funcion QuotedStr(); para que evites poner decenas de '

Código Delphi [-]
 
 querArticulo.SQL.Text:='SELECT codloc FROM articulo a CROSS JOIN localidad l WHERE (l.codloc = '+QuotedStr(dbcodigo.Field.Text)+' and a.codloc = '+QuotedStr(dbcodigo.Field.Text)+')';

*No uses AsInteger=0 para comprobar que no hay datos. cuando el resultado es NULL, al menos en interbase y firebird te lanza un error. puedes usar:

Código Delphi [-]
 
querArticulo.Fields[0].IsEmpty;

*La validacion del Edit hazla al iniciar el procedimiento
Código Delphi [-]
    Procedure TmtLocalidad.SpeedButton1Click(Sender: TObject);
      if dbCodigo.text = '' then 
       begin
         MessageDlg('No existe localidad para borrar', mtInformation,[mbCancel], 0,);
         Exit;
       end;
     etc......

Así evitas hacer un Query que no se necesitaba.

Bueno..... creo que para mi es todo :p


La franja horaria es GMT +2. Ahora son las 11:21:53.

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