Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   salida de indice al borrar (https://www.clubdelphi.com/foros/showthread.php?t=75407)

danielmj 20-08-2011 13:45:46

salida de indice al borrar
 
hola,

el siguiente codigo, recorre la tabla en busca de unos apellidos y nombre, cuando lo encuentra debe borrarlos previo mensaje de aviso al usuario...

Código Delphi [-]
procedure Tformulario1.sButton2Click(Sender: TObject);
var
  j: integer;
  ape,nom: string;

begin
 //i:= lista2.ItemIndex;
  for j := 0 to adotabla.FieldCount - 1 do
    begin
      ape:= adoTabla.FieldByName('APELLIDOS').AsString + ' ';
      nom:= adoTabla.FieldByName('NOMBRE').AsString;
      if lista2.items.Strings[j] = ape+nom then   //aqui salida de indices
        adotabla.delete;
    end;
  adotabla.Close;
end;

Borrar borra, pero no lo hace de manera muy limpia y aunque borra el registro, devuelve el mensaje de error "salida de indices...." que he marcado en negrita.

Espero podais ayudarme, un saludo y gracias

Casimiro Noteví 20-08-2011 14:05:08

Hola, esto no tiene nada que ver con "Conexión con bases de datos", lo paso a "Varios", y recuerda seguir nuestras normas, gracias.

danielmj 22-08-2011 08:57:38

buenos dias,

perdona casimiro noveti, pero como el fondo de mi pregunta esta relacionado con la base de datos de donde se deben borrar los registros, pense y decidi (como dicen las normas) que ese era el sitio indicado. Si no es asi, me disculpo por ello, es de ser humilde reconocer nuestros errores.

Y sobre mi pregunta, a ver si alguien puede echarme una mano por que me he quedao pillao en este punto.

un saludo y gracias.

Casimiro Noteví 22-08-2011 12:10:00

Hola, no hay problema, todos nos equivocamos y yo el primero :)

En relación a tu pregunta, ¿por qué no lo haces directamente con sql?, o sea, algo así como:

Código Delphi [-]
dataset.close;
dataset.sql.text:='delete from tabla where nombre= :nombre and apellido= :apellido';
dataset.params[0]:=adoTabla.FieldByName('nombre').AsString;
dataset.params[1]:=adoTabla.FieldByName('apellido').AsString;
dataset.execquery;

fjcg02 22-08-2011 12:20:43

Hola,

no sé, a bote pronto me chirría la línea
Código Delphi [-]
  for j := 0 to adotabla.FieldCount - 1 do

No recorres la tabla, sino los campos de la misma.

No será
Código Delphi [-]
  for j := 0 to adotabla.RecordCount - 1 do

Si te da error de indices, seguramente será del stringGrid, que no tiene tantos elementos como campos tu tabla.

Prueba a ver.... y nos cuentas.

Saludos

danielmj 26-08-2011 00:04:46

buenas...

estoy frito ya con esto ehh, he tardao en contestar por que intento hacer que funcione pero nada. Lo que hago es comparar el cliente marcado con un checkbox en un checklistbox con los valores de la variable "apenom" en la que previamente he metido los datos de

Código Delphi [-]
adotabla.fieldbyname('APELLIDOS').AsString;
y
Código Delphi [-]
adotabla.fieldbyname('NOMBRE').AsString;

si son iguales, borra de la tabla el cliente seleccionado, hasta ahi la teoria, pero no consigo que corra.

Alguna idea?
un saludo y gracias.

ecfisa 26-08-2011 01:10:58

Hola Daniel.

Por lo que interpreto en un CheckListBox tenés cargados los apellidos+nombres de una tabla, en una variable 'apenom' un apellido+nombre y para que un dato sea borrado, son requisitos:
  1. Que esté tildado en el CheckListBox.
  2. Que el item sea igual al contenido de la variable 'apenom'.

Si no me equivoco, podrías hacer algo así:
Código Delphi [-]
procedure TForm1.btBorraSelecClick(Sender: TObject);
var
  i: Integer;
  Ape,Nom: string;
begin
  with CheckListBox1 do
  begin
    for i:= 0 to Items.Count -1 do
      if (Checked[i])and(Items[i] = apenom) then
        if MessageDlg('¿Desea borrar '+Items[i]+'?',mtConfirmation,[mbYes,mbNo],0)= mrYes then
        begin
          Ape:= Copy(Items[i],1,Pos(' ',Items[i])-1);
          Nom:= Copy(Items[i],Pos(' ',Items[i])+1,MaxInt);
          ADOTabla.Locate('APELLIDO;NOMBRE',VarArrayOf([Nom,Ape]),[loCaseInsensitive]);
          ADOTabla.Delete;
        end;
  end;
end;
Esto siguiendo el planteo que indicas, pero coincido con Casimiro que es más sencillo con una sentencia SQL.

Saludos.


La franja horaria es GMT +2. Ahora son las 20:11:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi