PDA

Ver la Versión Completa : no sobre escribe un registro lo agrega


kryna
14-04-2005, 21:53:46
Hola amigos del foro!!

Tengo otro problemilla.... cuando modifica en vez de sobre escribirme en el registro activo lo que me hace es que me agrega otro registro a mi tabla..

yo lo hago de esta forma

Código:
MessageDlg('ESTA SEGURO Q DESEA MODIFICAR ESTE REGISTRO???', mtCONFIRMATION, [mbOk], 0)
Tb1.Edit;
Tb1.FieldByName('especialidad').AsString := edit1.text;
Tb1.FieldByName('codigo').AsString := edit2.text;
Tb1.Post;
Tb1.FlushBuffers;
Tb1.Close;
Tb2.Edit;
Tb2.FieldByName('especialidad').AsString := edit1.text;
Tb2.FieldByName('descripcion').AsString := edit3.text;
Tb2.post;
Tb2.FlushBuffers;
Tb2.Close;
ShowMessage('EL REGISTRO FUE MODIFICADO CON EXITO!!');
end;

Donde tengo el error

marcoszorrilla
14-04-2005, 22:02:42
En especialidad te faltaba una comilla, pero el código que tienes es imposible que añade un registro, lo que hace es modificar el actual.

Un Saludo.

jachguate
14-04-2005, 22:21:35
pero el código que tienes es imposible que añade un registro, lo que hace es modificar el actual.

A menos, claro que el dataset este vacio, en cuyo caso la llamada a edit es equivalente a una llamada a insert/append.

Hasta luego.

;)

kryna
14-04-2005, 22:22:09
disculpe sr marcos....

pero en verdad me agrega un registro no me modifica el actual...

yo se que parece ilogico pero es asi... sino no les hari aperder su tiempo.. no se donde pueda estar la falla..

yo tampoco lo entiendo

marcoszorrilla
14-04-2005, 22:26:51
Al hilo de lo que dice Juan Antonio, también pude ser que tengas una rejilla y avances por algún motivo una línea con lo cual se agregaría un registro.

Porque no nos pones la unit completa que pienso no tendrá mucho código porque tiene que haber algo que no estamos viendo.

Y nada de Señor hombre, aquí somos foristas que intercambiamos opiniones y conocimientos y por eso nunca perdemos el tiempo.

Un Saludo.

roman
14-04-2005, 22:33:16
Quizá lo que voy a decir no es del todo cierto pues ya no me acuerdo bien.

Con alguna versión antigua de MySql y de phpMyAdmin me sucedía lo mismo cuando trataba de editar un registro de una consulta en la que no se especificaba la llave primaria de la tabla (o la tabla no tenía llave primaria).

phpMyAdmin, al no disponer de la llave primaria, generaba la cláusula WHERE basándose en todos los campos presentes y por alguna razón, quizá por el juego de caracteres usado, daba la impresión de no encontrar el registro y en su lugar lo insertaba.

Claro que esto o era un "bug" o una "funcionalidad" de MySql al trocar un UPDATE por un INSERT.

Por otra parte sería bueno que nos indicaras qué componentes usas para acceder a MySql.

// Saludos

kryna
14-04-2005, 22:45:39
aqui les va el codigo..

te lo voy a enviar como privado

kryna
14-04-2005, 23:35:50
hola

no uso mysql.. mi gestor es paradox 7

jachguate
15-04-2005, 01:11:19
¿Y por qué el código como privado???

:confused:?

roman
15-04-2005, 01:15:52
no uso mysql..


Disculpa, no sé de dónde saqué que estabas hablando de MySql. Siendo Paradox, secundo entonces la frase de Marcos:


el código que tienes es imposible que añade un registro


así que sería bueno ver el código más en detalle. No entiendo por qué lo borraste.

// Saludos

marcoszorrilla
15-04-2005, 07:22:20
Este es el código que he recibido como privado y que debe de ser público ya que sino los que están siguiendo el hilo .... lo perderían...


unit Unit1;

procedure TFormservicios.botonbuscarClick(Sender: TObject);
begin

if editorcodigo <> nil then
begin
qrycodigo.Close;
qrycodigo.ParamByName('Codigo').AsInteger := StrToInt(editorcodigo.text);
Dsconcepto.dataset := qrycodigo;
qrycodigo.Open;

qryespecialidad.Close;
qryespecialidad.ParamByName('Codigo').AsInteger := StrToInt(editorcodigo.text);
Dsespecialidad.dataset := qryespecialidad;
qryespecialidad.Open;

codigo_esp.Text := codigo_es.Text;
descripcion_con.Text := descripcion_co.Text;
codigo_con.Text := codigo_co.Text;
descripcion_esp.Text := descripcion_es.Text;
cost.Text := costo.Text;
fech.Text := fecha.Text;
orde.Text := norden.Text;

if qrycodigo.EOF then
ShowMessage('No encontré ningún Registro!');

end

end;


procedure TFormservicios.BmodificarClick(Sender: TObject);
var
//las borre
begin
// borre
MessageDlg('ESTA SEGURO Q DESEA MODIFICAR ESTE REGISTRO???', mtCONFIRMATION, [mbOk], 0);
Tbconcepto.Edit;
Tbconcepto.FieldByName('cod_especialidad').AsString := clave;
Tbconcepto.FieldByName('cod_concepto').AsString := clave2;
Tbconcepto.FieldByName('descripcion_concepto').AsString := clave3;
Tbconcepto.Post;
Tbconcepto.FlushBuffers;
Tbconcepto.Close;
Tbespecialidad.Edit;
Tbespecialidad.FieldByName('cod_especialidad').AsString := Clave;
Tbespecialidad.FieldByName('descripcion_especialidad').AsString := clave4;
Tbespecialidad.FieldByName('orden').AsString := claveo;
tbespecialidad.FieldByName('nota').AsString := claven;
Tbespecialidad.post;
Tbespecialidad.FlushBuffers;
Tbespecialidad.Close;

ShowMessage('EL REGISTRO FUE MODIFICADO CON EXITO!!');
end;

end.


Un Saludo.

marcoszorrilla
15-04-2005, 07:33:16
Realmente no veo muy claro el funcionamiento si se busca mediante una consulta el registro por qué luego se modifica apuntando directamente a la tabla, el puntero de la tabla, no estará en el mismo lugar que el de la consulta, los datos se deben de modificar en la consulta, o por el contrario si existen índices utilizar Findkey directamente con la tabla, ya que sino cuando se supone que estamos haciendo la modificación en la tabla el puntero puede estar en Eof y provocar un alta como es el caso.

Un Saludo.

roman
15-04-2005, 07:53:28
Y una observación colateral:

En BmodificarClick, no importa qué conteste el usuario al mensaje, el resto del código siempre se ejecutará.

// Saludos

kryna
15-04-2005, 14:13:09
Disculpa Marcos

Pero como hago eso..
Cuando hago la consulta y me muestra los datos en las DBEdit no me permite modificar ya que los DS se vuelven de solo lectura, un opcion que me plantearon fue pasar los datos de los DBEdit a unos Edit y modificarlos desde los Edit apuntandolos a las tablas...

Estoy muy interesada en que me digas como hacerlo desde la consulta como tu planteas .. ya que viendolo desde tu punto de vista tienes la razon ....

marcoszorrilla
15-04-2005, 14:36:36
Como es una consulta simple que no involucra varias tablas a la vez será suficiente con que pongas la propiedad de la Consulta RequestLive = True.


Un Saludo.

kryna
15-04-2005, 15:20:20
tengo esa opcion en true....

y si me involucra varias tabla.. en realidad son 3 tablas ahi tienes solo 2, lo que pasa es que para que el codigo no se hiciera largo elimine parte de ste al momento de enviarte el codigo esa parte del codigo....

marcoszorrilla
15-04-2005, 15:25:38
En el caso de una consulta de varias tablas no es actualizable, puedes consultar en el momento de intentar hacer la modificación CanModify a ver si es cierta o no, pero para el caso que citas no lo es.

Tendrás que mirar el componente UpdateSql en especial su propiedad ModifySql.

Un Saludo.

kryna
15-04-2005, 15:49:32
Hola

Al parecer ya me esta funcionando... coloque a codigo como clave principal en el Database Desktop y hasta los memento me esta funcionando... gracias.

Sabes ? yo pense cuando se me empezo a presentar el problema con los DS de solo lectura en usar el UpdateSql pero en realidad no se como se usa? ni su utilidad? ni como llamarlo desde delphi? ni como crear el sql del update? ni si se necesita un query para midificar, insertar y eliminar? cree un hilo en este foro y me remitian a otros hilos pero en realidad mis dudas no se disiparon...

Si podrian asesorarme con esto?

jachguate
15-04-2005, 16:35:15
Hola Kyrna.

Para comprender el funcionamiento de TUpdateSQL podes comenzar por leer lo que Ian Marteens (http://www.marteens.com) ha escrito en su libro "La cara oculta de delphi4", que está disponible para descarga en su propia web, además de la propia ayuda de borland.

Hasta luego.

;)