Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-01-2011
verito_83mdq verito_83mdq is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 118
Poder: 14
verito_83mdq Va por buen camino
Recuperar BookMark despues de cerrar dataset...

Hola Como andan todos?? Acá tengo una complicación la cual estuve buscando acá en el foro pero no encuentro un caso similar.

El problema es el siguiente tengo un dbGrig conectado al datasource y este al ZQuery, hago la búsqueda y despues le asigno una marca
Código Delphi [-]
PrevRecord := Buscarform.ClientesDBGrid.DataSource.DataSet.GetBookmark;

despues abro un form donde listo los datos y en este form puedo modificar los datos, para hacer esto tengo que cerrar el Query Clientes y abrirlo con la sentencia Update. El problema es que al cerrar el query pierdo la marca arrojandome este error:''cannot perform this operation on a closed dataset''
lo cual es logico si yo antes la cerre.

Estuve tratando de buscarle una solución pero con todo tenia problema.
Espero que me puedan dar una mano. Desde ya muchas gracias.
Responder Con Cita
  #2  
Antiguo 26-01-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
El problema es que no se sabe en que momento tomas el Bookmark. Con el ínfimo código que has puesto es muy difícil de saberlo. Así que cualquier intento de ayudar será como golpe de ciego.

Saludos,
Chris
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #3  
Antiguo 26-01-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Como dice Chris, creo que el problema esta donde tomás el Bookmark, el alcance de la variable donde se almacena o si es modificada en algún punto, ya que el echo de cerrar la consulta no afecta a la variable TBookmarkStr.

Te pongo un ejemplo simple por si te sirve de ayuda:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  BM: TBookmarkStr;
begin
  // Mostrar algunos datos...
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Add('SELECT * FROM COUNTRY');
  IBQuery1.Open;
  IBQuery1.MoveBy(4);      // Desplazarse 4 registros
  // Antes de modificar, guardar la posición actual del DataSet
  BM:= DBGrid1.DataSource.DataSet.Bookmark; 
  IBQuery1.Close;
  // Modificar algo...
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Add('UPDATE COUNTRY');
  IBQuery1.SQL.Add('SET CURRENCY = :MONEDA');
  IBQuery1.SQL.Add('WHERE COUNTRY = :PAIS');
  IBQuery1.ParamByName('PAIS').AsString:= 'Japan';
  IBQuery1.ParamByName('MONEDA').AsString:= 'Yin';
  IBQuery1.ExecSQL;
  IBQuery1.Close;
  // Mostrar datos
  IBQuery1.SQL.Text:= 'SELECT * FROM COUNTRY';
  IBQuery1.Open;
  // Mover a posición almacenada en BM
  DBGrid1.DataSource.DataSet.Bookmark := BM; 
end;

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 26-01-2011 a las 18:20:44.
Responder Con Cita
  #4  
Antiguo 26-01-2011
verito_83mdq verito_83mdq is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 118
Poder: 14
verito_83mdq Va por buen camino
Hola Chris! Gracias por contestar!! Bueno ahora pongo el código y explico, hay código que esta fuera de contexto pero igual pongo los procedimientos completos.


1-Busco Cliente, Selecciono cliente en el dbGrig y pongo ver datos.



Código Delphi [-]
 procedure TBuscarForm.DatosClienteBitBtnClick(Sender: TObject); 
begin 
 
 
              flag:=False; 
              PrevRecord := Buscarform.ClientesDBGrid.DataSource.DataSet.GetBookmark; 
              r:=QueryDataModule.ClienteZQuery.FieldByName('ID_Cliente').Value; 
 
              with QueryDataModule.ObservacionClienteZQuery do 
               begin 
                 If active then close; 
                 SQL.Clear; 
                 SQL.Add('Select * from observacion_cliente where observacion_cliente.ID_Cliente='+r+''); 
                 Open; 
               end; 
 
               //Prioridad Nula 
 
               if QueryDataModule.ObservacionClienteZQuery.FieldByName('ID_Prioridad').IsNull  then 
                 begin 
                  if flag=false then 
                    begin 
                     BuscarForm.Visible:=False; 
                     flag:=true; 
                     ListarDatoClienteForm:=TListarDatoClienteForm.Create(Application); 
                    end; 
                 end; 
 
 
 
 
 
 
                //Prioridad Baja 
                if QueryDataModule.ObservacionClienteZQuery.FieldByName('ID_Prioridad').Value =1 then 
                 begin 
                  if flag=false then 
                    begin 
                     BuscarForm.Visible:=False; 
                     flag:=true; 
                     ListarDatoClienteForm:=TListarDatoClienteForm.Create(Application); 
                    end; 
                 end; 
 
 
 
 
 
 
               //Prioridad Normal 
               if QueryDataModule.ObservacionClienteZQuery.FieldByName('ID_Prioridad').Value =2 then 
                 begin 
                   if flag=false then 
                     begin 
                       showmessage('Usted deberia leer las observaciones'); 
                       BuscarForm.Visible:=False; 
                       flag:=true; 
                       ListarDatoClienteForm:=TListarDatoClienteForm.Create(Application); 
                     end; 
                 end; 
 
 
 
                //Prioridad Alta 
                if QueryDataModule.ObservacionClienteZQuery.FieldByName('ID_Prioridad').Value =3 then 
                    begin 
                      if flag=false then 
                        begin 
                         BuscarForm.Visible:=False; 
                         flag:=true; 
                         ListarObservacionesForm:=TListarObservacionesForm.Create(Application); 
                         if flag=false then 
                         ListarDatoClienteForm:=TListarDatoClienteForm.Create(Application); 
                        end; 
                     end; 
 
 
 
end;





2-En el Form Create asigno los Edit.



Código Delphi [-]
procedure TListarDatoClienteForm.FormCreate(Sender: TObject); 
begin 
 
 
              ActualizarActivadoPngSpeedButton.Visible:=False; 
 
 
 
 
 
              //Datos Cliente 
 
              ApellidoEdit.Text:=QueryDataModule.ClienteZQuery.FieldByName('Apellido').AsAnsiString; 
              NombreEdit.Text:=QueryDataModule.ClienteZQuery.FieldByName('Nombre').AsAnsiString; 
              DNIEdit.Text:=QueryDataModule.ClienteZQuery.FieldByName('DNI').AsAnsiString; 
              ListarFechaNacimientoDateTimePicker.Date:=QueryDataModule.ClienteZQuery.FieldByName('Fecha_Nacimient  o').AsDateTime; 
              DireccionEdit.Text:=QueryDataModule.ClienteZQuery.FieldByName('Direccion').AsAnsiString; 
              TelefonoEdit.Text:=QueryDataModule.ClienteZQuery.FieldByName('Telefono').AsAnsiString; 
              ConyugeCheckBox.Checked:=QueryDataModule.ClienteZQuery.FieldByName('Conyuge').Value; 
              ObservacionesCheckBox.Checked:=QueryDataModule.ClienteZQuery.FieldByName('Observaciones_Check').Valu  e; 
              CelularEdit.Text:=QueryDataModule.ClienteZQuery.FieldByName('Celular').AsAnsiString; 
              E_MailEdit.Text:=QueryDataModule.ClienteZQuery.FieldByName('E_Mail').AsAnsiString; 
              OcupacionDBLookupComboBox.KeyValue:=QueryDataModule.ClienteZQuery.FieldByName('ID_Ocupacion').Value; 
              ProveedorMailDBLookupComboBox.KeyValue:=QueryDataModule.ClienteZQuery.FieldByName('ID_Proveedor_Mail  ').Value; 
               
 
 
 
               //Fecha Ingreso al Sistema 
 
 
              IngresoSistemaDiaLabel.Caption := FormatDateTime('dddd yyyy/mm/dd', QueryDataModule.ClienteZQuery.FieldByName('Fecha_Ingreso_Sistema').AsDateTime); 
              IngresoSistemaHoraLabel.Caption:= FormatDateTime('hh:nn:ss', QueryDataModule.ClienteZQuery.FieldByName('Fecha_Ingreso_Sistema').AsDateTime); 
 
 
 
              //Datos en color rojo o verde, segun el estado. 
              if QueryDataModule.ClienteZQuery.FieldByName('Baja').Value=1 then 
                  begin 
                      showmessage('Atencion Cliente Rescindido'); 
                      Self.Font.Color:=clred; 
                      ListarFechaNacimientoDateTimePicker.Font.Color:=clred; 
                  end 
 
 
              else 
                  begin 
                      Self.Caption:='Cliente Activo'; 
                      Self.Font.Color:=clgreen; 
                      ListarFechaNacimientoDateTimePicker.Font.Color:=clgreen; 
                  end; 
 
end;







3-Cuando se modifica un TEdit se habilita el boton Actulizar.







Código Delphi [-]
procedure TListarDatoClienteForm.ActualizarActivadoPngSpeedButtonClick( 
  Sender: TObject); 
begin 
 
 
           with QueryDataModule.ClienteZQuery do 
               begin 
                 If active then close; 
                   SQL.Clear; 
                   SQL.Add('Update cliente set '); 
                   SQL.Add('Apellido='''+ApellidoEdit.Text+''', '); 
                   SQL.Add('Nombre='''+NombreEdit.Text+''', '); 
                   SQL.Add('DNI='''+DNIEdit.Text+''', '); 
                   SQL.Add('Fecha_Nacimiento=:FechaNacimiento,'); 
                   ParamByName('FechaNacimiento').Value:=ListarFechaNacimientoDateTimePicker.DateTime; 
                   SQL.Add('ID_Ocupacion=:Ocupacion,'); 
                   ParamByName('Ocupacion').Value:=OcupacionDBLookupComboBox.KeyValue; 
                   SQL.Add('ID_Proveedor_Mail=:Proveedor,'); 
                   ParamByName('Proveedor').Value:=ProveedorMailDBLookupComboBox.KeyValue; 
                   //SQL.Add('ID_Ciudad='''+NombreEdit.Text+''', '); 
                   SQL.Add('Direccion='''+DireccionEdit.Text+''', '); 
                   SQL.Add('Telefono='''+TelefonoEdit.Text+''', '); 
                   SQL.Add('Celular='''+CelularEdit.Text+''', '); 
                   SQL.Add('E_Mail='''+E_MailEdit.Text+''' '); 
                   SQL.Add('Where cliente.ID_Cliente='+r+''); 
                   ExecSQL; 
               end; 
 
 
 
 
 
 
end;



4-Una vez que Actualice hago click en el boton volver, para retornar al DBGrig y en este momento es cuando me da ese error.





Código SQL [-]
 procedure TListarDatoClienteForm.AnteriorPngSpeedButtonClick( 
  Sender: TObject); 
begin 
 
 
                BuscarForm.Visible:=True; 
                //BuscarForm.BuscarPngSpeedButtonClick(Sender); 
 
                BuscarForm.ClientesDBGrid.DataSource.DataSet.GotoBookmark(PrevRecord); 
                release; 
                 
 
end;


Bueno esos son los pasos, espero que sirva ahora. Gracia Chriss y ecfisa!!!!!

Última edición por verito_83mdq fecha: 26-01-2011 a las 18:20:15.
Responder Con Cita
  #5  
Antiguo 26-01-2011
verito_83mdq verito_83mdq is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 118
Poder: 14
verito_83mdq Va por buen camino
jajaja no se pueden quejar, querían código ahí tienen!!!

La variable PrevRecord la tengo declarada como variable global pero de tipo PrevRecord: TBookmark;
y veo que ecfisa la declaro de tipo TBookmarkStr , sera eso? que es el Str que tiene adicional? string?
Saludos!!

Última edición por verito_83mdq fecha: 26-01-2011 a las 18:28:55.
Responder Con Cita
  #6  
Antiguo 26-01-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por verito_83mdq Ver Mensaje
jajaja no se pueden quejar, querían código ahí tienen!!!
Ufff!!!! Dame tres días para revisarlo y te contesto...

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 26-01-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por verito_83mdq Ver Mensaje
La variable PrevRecord la tengo declarada como variable global pero de tipo PrevRecord: TBookmark;
y veo que ecfisa la declaro de tipo TBookmarkStr , sera eso? que es el Str que tiene adicional? string?
Saludos!!
Hacen lo mismo pero TBookmarkStr es más simple de usar:
TBookmark:
Código Delphi [-]
var
  BM: TBookmark;
begin
  BM:= DataSet.Bookmark;
  try
    DataSet.MoveBy(10);
  finally
    DataSet.GotoBookmark(BM);
    DataSet.FreeBookmark(BM);  // liberar memoria
  end;
end;

TBookmarkStr:
Código Delphi [-]
var
  BM: TBookmarkStr;
begin
  BM:= DataSet.Bookmark;
  try
    DataSet.MoveBy(10);
  finally
    DataSet.Bookmark:= BM;  //Delphi libera la memoria de forma automática
  end;
end;

Aparte de que es más eficiente asignar valor a una propiedad, que llamar al procedimiento GotoBookmark.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 26-01-2011 a las 18:44:01.
Responder Con Cita
  #8  
Antiguo 26-01-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
BuscarForm.ClientesDBGrid.DataSource.DataSet es lo mismo que QueryDataModule.ClienteZQuery? Si son lo mismo entonces puede ser que el problema sea que no estes volviendo abrir QueryDataModule.ClienteZQuery con la consulta para presentar los datos.

Saludos,
Chris
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #9  
Antiguo 26-01-2011
verito_83mdq verito_83mdq is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 118
Poder: 14
verito_83mdq Va por buen camino
Hola Chriss, gracias a todos!!! Si es lo mismo, osea el DBGrid trabaja con el mismo Query (ClienteZQuery). Como seria eso de volver a abrir?
Te referís a que tengo que hacer un Select previo a la sentencia de Bookmark?

Muchas gracias!!!!
Responder Con Cita
  #10  
Antiguo 26-01-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por verito_83mdq Ver Mensaje
Te referís a que tengo que hacer un Select previo a la sentencia de Bookmark?
Exactamente amigo!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #11  
Antiguo 27-01-2011
verito_83mdq verito_83mdq is offline
Miembro
NULL
 
Registrado: nov 2010
Posts: 118
Poder: 14
verito_83mdq Va por buen camino
Bueno estoy tratando de resolverlo, gracias a Chris y a ecfisa me quedo mas claro, el ejemplo que puso ecfisa es muy bueno y ayuda bastante.

Por ahora les digo Gracias a los dos!

Saludos!!!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Recuperar Informacion despues de un Commit Kipow Firebird e Interbase 2 01-04-2009 19:04:02
Como recuperar el arranque después de Instalar Windows RONPABLO Linux 4 14-07-2008 17:43:33
Recuperar autoinc. después de Insert to aig MS SQL Server 2 22-09-2004 10:41:28
Como recuperar autonumerico despues de borrado, cancelado, ect. IcebergDelphi Tablas planas 2 19-05-2003 17:02:39
Recuperar autonumericos despues de Borrar, Cancelar ,Ect. IcebergDelphi Varios 1 14-05-2003 07:55:02


La franja horaria es GMT +2. Ahora son las 16:12:06.


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