PDA

Ver la Versión Completa : Procedimiento para el boton borrar


magnu9
04-07-2007, 23:01:36
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.


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
Amigos creo que lo he solucionado. Pero si alguien quiere aportar algo se lo agradezco de corazon.

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
Código Delphi [-] (http://www.clubdelphi.com/foros/#)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 '


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:


querArticulo.Fields[0].IsEmpty;


*La validacion del Edit hazla al iniciar el procedimiento

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