Ir al contenido


Foto

problema en bookmark y adoquery


  • Por favor identifícate para responder
2 respuestas en este tema

#1 roca

roca

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 18 mayo 2013 - 09:38

Hola a todos, soy nuevo por aquí  :)
Estoy trabajando con delphi2010 y sqlserver 2000 (despues usaré una bd más reciente)
Les comento que tengo un formulario (consulta nivel educativo) donde muestro en un tdbgrid el resultado de una consulta: SELECT * FROM T_NIVEL_EDUCATIVO
La tabla se llama: t_nivel_educativo y los campos que tiene: id_ne, codigo_ne y denominacion_ne
En este formulario tengo: adoconnection1, adoquery1, datasource1 y un botón donde puedo seleccionar un registro para luego modificarlo en un segundo formulario.
El código de este botón es:



delphi
  1. procedure TFormConsultaNivelEducativo.BtnAceptarClick(Sender: TObject);
  2.     var
  3.           ClaveID:Integer;
  4.     begin
  5.           //*** Asignar el valores ID a una Variable
  6.           ClaveID := FormConsultaNivelEducativo.ADOQuery1.FieldByName('ID_NE').Value;
  7.           //*** Mostrar Formulario
  8.           FormNivelEducativo.Show;
  9.           //Llenar los campos con el registro seleccionado en el grid
  10.           FormNivelEducativo.TxtID.Text := FormConsultaNivelEducativo.ADOQuery1.FieldByName('ID_NE').asString;
  11.           FormNivelEducativo.TxtCodigo.Text := FormConsultaNivelEducativo.ADOQuery1.FieldByName('CODIGO_NE').asString;
  12.           FormNivelEducativo.TxtDenominacion.Text :=FormConsultaNivelEducativo.ADOQuery1.FieldByName('DENOMINACION_NE').asString;
  13.     end;



Hasta aquí todo bien
Cuando muestro el segundo formulario (nivel educativo), también tengo un adoconnection2, adoquery2, datasource2 y un DBNavigator2 que necesito que pueda mostrar los demás registros de la tabla, después de modificar el que se seleccionó en el grid.
Esto es para evitar que el usuario tenga que salir hasta el primer formulario para ubicar otro registro que también debe modificar, sino que simplemente con los botones lo puede hacer.

El código del botón de modificar el registro en este segundo formulario es:



delphi
  1. procedure TFormNivelEducativo.BtnModificarClick(Sender: TObject);
  2.     var
  3.           ClaveID : Integer;
  4.           BookMark : TBookMarkStr;
  5.     begin
  6.           with FormNivelEducativo.ADOQuery2 do
  7.               begin
  8.                     //GUARDAMOS EL CAMPO CLAVE ID DEL REGISTRO QUE ESTAMOS MODIFICANDO
  9.                     ClaveID := FormConsultaNivelEducativo.ADOQuery1.FieldByName('ID_NE').Value;
  10.                     //++++++++++++++++++++++++++++++++++++++++
  11.                     //MARCAMOS EL REGISTRO SOBRE EL QUE ESTAMOS TRABAJANDO
  12.                     Close;
  13.                     SQL.Clear;
  14.                     SQL.Text := 'SELECT * FROM T_NIVEL_EDUCATIVO WHERE ID_NE = '+QuotedStr(TxtID.Text);
  15.                     Open;
  16.                     BookMark := ADOQuery2.Bookmark;
  17.                     //++++++++++++++++++++++++++++++++++++++++
  18.                     //CODIGO PARA MODIFICAR EL REGISTRO
  19.                     Close;
  20.                     SQL.Clear;
  21.                     SQL.Text := 'UPDATE T_NIVEL_EDUCATIVO SET CODIGO_NE=:CODIGO_NE, DENOMINACION_NE=:DENOMINACION_NE      WHERE ID_NE=:ID_NE';
  22.                     //ASIGNAMOS A CADA CAMPO LOS VALORES CORRESPONDIENTES
  23.                     Parameters.ParamByName('ID_NE').Value := ClaveID;
  24.                     Parameters.ParamByName('CODIGO_NE').Value := TxtCodigo.Text;
  25.                     Parameters.ParamByName('DENOMINACION_NE').Value := TxtDenominacion.Text;
  26.                     ExecSQL;
  27.                     //++++++++++++++++++++++++++++++++++++++++
  28.                     //REFRESCAMOS LOS DATOS DE LOS CAMPOS                   
  29.                     Close;
  30.                     SQL.Clear;
  31.                     SQL.Text := 'SELECT * FROM T_NIVEL_EDUCATIVO';
  32.                     Open;
  33.                     ADOQuery2.Bookmark := BookMark;
  34.                     FormNivelEducativo.TxtId.Text := FormNivelEducativo.ADOQuery2.FieldByName('ID_NE').asString;
  35.                     FormNivelEducativo.TxtCodigo.Text := FormNivelEducativo.ADOQuery2.FieldByName('CODIGO_NE').asString;
  36.                     FormNivelEducativo.TxtDenominacion.Text := FormNivelEducativo.ADOQuery2.FieldByName('DENOMINACION_NE').asString;
  37.               end;
  38.     end;



Los datos se guardan correctamente con las correcciones que se realizan en los campos.
Pero el BookMark no me está mostrando el id del registro corregido, es como si no estuviese allí.
No se que puede estar mal...  :(
Si me pueden dar una mano se los agradezco!!

PD: Mis disculpas por si mi mensaje no va en esta sección.
  • 0

#2 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 20 mayo 2013 - 05:51

Saludos.

El BookMark guarda los datos del registro separados por coma, en Delphi 2010+ el tipo de dato de la propiedad BookMark es del tipo TBytes, si realizas una actualización del registro el BookMark de este registro cambia con los nuevos valores por ende tu "viejo" BookMark no te servirá.

Según puedo apreciar lanzas una segunda consulta:


delphi
  1. //REFRESCAMOS LOS DATOS DE LOS CAMPOS                   
  2.                     Close;
  3.                     SQL.Clear;
  4.                     SQL.Text := 'SELECT * FROM T_NIVEL_EDUCATIVO';
  5.                     Open;


Cambiando esta sentencia y agregando una condición con el ID puedes solucionar este problema y evitar el uso del BookMark.
  • 0

#3 roca

roca

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 20 mayo 2013 - 08:17

Hola Rolphy Reyes
Gracias por la respuesta.
Usare el ID tal como me comentas...  (y)
  • 0




IP.Board spam blocked by CleanTalk.