PDA

Ver la Versión Completa : salida de indice al borrar


danielmj
20-08-2011, 13:45:46
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...


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 Notevi
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 (http://www.clubdelphi.com/foros/guiaestilo.php), 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 Notevi
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:

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
for j := 0 to adotabla.FieldCount - 1 do

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

No será
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

adotabla.fieldbyname('APELLIDOS').AsString; y
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:

Que esté tildado en el CheckListBox.
Que el item sea igual al contenido de la variable 'apenom'.


Si no me equivoco, podrías hacer algo así:

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.