Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Actualizo registro con problemas (https://www.clubdelphi.com/foros/showthread.php?t=62367)

comba 18-12-2008 18:13:28

Actualizo registro con problemas
 
Hola a todos

Utilizo D6 y MS2000. Tengo una ficha en la cual hay un dbgrid para que el usuario puede seleccionar registro através del ratón o diciendole todos.

El problema viene y la verdad no se porque puede ser.
Muchas veces ocurre que ejecuto una sentencia de sql para que actualize todos los registros y solo me actualiza el primero y el resto se queda igual.

Lo hago através del Sql Server Manager y no da problemas.

Utilizo lo siguiente.

if provincia.Text<> '' then
begin
ADOCommand1.CommandText:='Update Albaranes Set Esta =:param1 where cli=:param2 and aged =:param3';
ADOCommand1.Parameters.ParamByName('param1').Value:='S';
ADOCommand1.Parameters.ParamByName('param2').Value:=cliente.text;
ADOCommand1.Parameters.ParamByName('param3').Value:=Agencia.text;
end else
begin
ADOCommand1.CommandText:='Update Albaranes Set Esta =:param1 where cli=:param2';
ADOCommand1.Parameters.ParamByName('param1').Value:='S';
ADOCommand1.Parameters.ParamByName('param2').Value:=cliente.text;
end;
ADoCommand1.Execute;


El caso que alguna vez me ha ocurrido que haciendo una copia de la bd luego si que funciona durante un par de veces y después ya deja de funcionar.

Alguien tiene idea de que puede pasar.

Un saludo y gracias por la ayuda

Neftali [Germán.Estévez] 18-12-2008 18:23:22

Podrías guardar en algun fichero o mostrar por pantalla las sentencias que estás enviando. Me da la impresión de que alguno de los parámetros tal vez no es el correcto.

Normalmente una consulta o funciona o no funciona, pero no tiene mucha lógica que no falle, pero sólo te actualice un registro (siendo un único UPDATE).

comba 18-12-2008 18:35:03

Esto es lo que me muestra

Update Albaranes Set Esta ='S' Where Cli ='100'

Y solo me actualiza el primero

Neftali [Germán.Estévez] 19-12-2008 18:15:10

¿Cuantos tienes que coincidan con esta condición?
Cita:

Empezado por comba (Mensaje 331465)
Update Albaranes Set Esta ='S' Where Cli ='100'


comba 19-12-2008 18:33:07

Mas de 20 registros.

Lepe 19-12-2008 20:45:22

A mí, se me han fundido los plomos con esa respuesta :eek:.

el adocommand1 ese no tiene una variable "RowsAfected" ? a ver qué dice allí.

Saludos

Neftali [Germán.Estévez] 22-12-2008 12:02:18

Yo tampoco lo entiendo :(...

Lanzas esta consulta:
Código SQL [-]
Select * from Where Cli ='100'
Y te devuelve 20 registros

y lanzas esta SQL
Código SQL [-]
Update Albaranes Set Esta ='S' Where Cli ='100'
Y sólo te actualiza 1

:confused::confused::confused::confused::confused:

¿No tienes Triggers activados?
¿No tienes nada más que actualice?

Kipow 22-12-2008 12:14:58

Seria de que lanzaras la consulta pero considerando el parametro provincia que utilizas en la condicional. por ahi debe de andar el problemin.

Lepe 22-12-2008 15:04:22

¿Por qué tenemos que adivinar las tablas, los campos y los datos que tiene él?

Chico, pon ejemplito de todo y así queda claro lo que quieres hacer y por qué.

Pero por favor, usa las etiquetas delphi y sql:


[delphi]
tu codigo delphi aqui
[/delphi]


[sql]
tu codigo sql aqui
[/sql]

para que podamos verlo con identado y resaltado de sintaxis.

No suele ser normal 3 días para resolver una duda de este tipo, (a menos que sea un bug del motor, o algo similar).

Saludos

comba 30-12-2008 13:45:52

Primero disculparme por no haber contestado antes, pero no he podido.
Os muestro un ejemplo más claro de lo que me ocurre y no entiendo el porque.

Intento hacer esto
try
Data.ConTipsaSer.BeginTrans;
Data.Sql.CommandText:='Delete from Bultos where Cli ='+#39+cliente+#39;
Data.Sql.Execute;
Data.ConTipsaSer.CommitTrans;
except
Data.ConTipsaSer.RollbackTrans;
end;

Y me sigue borrando el primero.

Lo que he hecho ha sigo generar un pequeño ejecutable con el mismo ADOConnection1 y el mismo ADOCommand1

procedure TForm1.Button1Click(Sender: TObject);
var
cliente:String;
begin
cliente:='01504';
ADOConnection1.Connected;
ADOCommand1.CommandText:='Delete from Bultos where cli ='+#39+cliente+#39+')
ADOCommand1.Execute;
ADOConnection1.Connected:=False;
end;
Y me funciona. ¿No se por donde mirar?

Neftali [Germán.Estévez] 30-12-2008 13:55:08

¿Y estás seguro de que en el primer caso la variable cliente vale lo que debe valer?

Código Delphi [-]
try
  Data.ConTipsaSer.BeginTrans;
  MessageDlg(Format('Voy a borrar el cliente <%s>',[cliente]), mtWarning, [mbOK], 0);
  Data.Sql.CommandText:='Delete from Bultos where Cli ='+#39+cliente+#39;
  MessageDlg(Format('SQL:%s',[Data.Sql.CommandText]), mtWarning, [mbOK], 0);
  Data.Sql.Execute;
  Data.ConTipsaSer.CommitTrans;
except
  Data.ConTipsaSer.RollbackTrans;
end;

Ya se que es un poco "rustico", pero es para asegurarte, porque lo que te está pasando está claro que es raro...

comba 30-12-2008 16:29:28

Gracias Neftali, pero si que me muestra el cliente correctamente.

Creo que el problema no es de la base de datos, sino de las transcaciones o de algo que se queda abierto. También lo he probado con un procedimiento almacenado y lamentablemente solo me borra un registro.

Voy a probar a crear otra conexión para borrar y actualizar haber que ocurre?

Gracias

comba 30-12-2008 18:20:49

Gracias por ayudarme, lo he solucionado pero me gustaria saber por que no me hacer los delete o los update.

Bueno lo que he hecho ha sido abrir otra conexión y hacer la sentencia de sql.
Y funciona a la primera.

Un saludo y gracias.


La franja horaria es GMT +2. Ahora son las 04:38:22.

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