Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   No se habilita un ClientDataSet al Limpiarlo (https://www.clubdelphi.com/foros/showthread.php?t=89386)

novato_erick 13-11-2015 00:27:15

No se habilita un ClientDataSet al Limpiarlo
 
Hola Chicos como han estado?

Bueno aprovecho para ver si me ayudan en un comportamiento que tiene el componente ClientDataSet que no he logrado corregir:

El usuario me ah comentado que mi tabla temporal trae registro que anteriormente a ingresado haciendo que dichos registros que no pertenece a ese nuevo registro estén dentro de una tabla que he denominado DETALLE_CPENDIENTE.

bueno en fin pensando corregir este problema hice esto en el Evento OnCloseQuery del Formulario:

Código Delphi [-]
        dmComprar.cdsDetallesComprasPendientesUser.DisableControls;
      try
        dmComprar.cdsDetallesComprasPendientesUser.EmptyDataSet;
      finally
        dmComprar.cdsDetallesComprasPendientesUser.EnableControls;
      end;

En teoria deberia me limpia pero en un evento que tengo en un dbgrid que me trae registros pendientes y quiero continuar dicho registro seleccionado me pasa que el ClientDataSet no hace nada está vacío.

Código Delphi [-]
procedure TfrmConsultaComprasPendiente.dbgComprasPendientesCellClick
  (Column: TColumn);
begin
  with dmComprar.qDetallesComprasPendientesUser do
    try
      Close;
      Params.parambyname('ID').AsInteger :=
        dmComprar.cdsComprasPendientesUserID_COMPRAPEN.AsInteger;
    finally
      Execsql;
    end;
  dmComprar.cdsDetallesComprasPendientesUser.Open; 
 
end;

No entiendo porque ese comportamiento


Saludos

Novato_erick

Al González 13-11-2015 17:05:55

Es que te falta punto y coma.

novato_erick 14-11-2015 03:40:17

Hola Algonzales


Me falta punto y coma?

AgustinOrtu 14-11-2015 04:09:39

Yo la verdad no entendi nada

En el codigo del evento OnCellClick lo que yo leo es lo siguiente:

1. Cierras un query
2. De ese query, asignas al parametro Id el valor del campo UserID_COMPRAPEN del ClientDataSet cdsComprasPendientes
3. Ejecutas un sql ??? no entiendo el porque del bloque try-finally
4. Abres el ClientDataSet

a. No entiendo porque en 1 cierras el query. Como en 3 estas usando ExecSQL imagino que es una sentencia UPDATE o DELETE, en ese caso no necesitas cerrar el query. En realidad lo mas adecuado seria no usar un query, sino un command

b. No entiendo porque abres el ClientDataSet. En que momento se cierra?


---


Solo me queda adivinar, y es que como nunca cierras el ClientDataSet, entonces "no refresca". Yo agregaria un Close al ClientDataSet

novato_erick 14-11-2015 04:31:55

Hola AustinOrtu

El bloque try finally

Cita:

Delphi al limite.
Es lo que se llaman excepciones anidadas.

http://delphiallimite.blogspot.com/2...-y-ii.html?m=1
Al finalizar abro el dataset trayendo el conjunto de datos abriendolo.
Creo q a la final simplemente es controlar mi codigo.

Saludos...

AgustinOrtu 14-11-2015 04:36:46

Hola de nuevo erick

Se como funcionan los bloque try-finally. En este caso mi duda era el porque el empleo del mismo.

Basicamente estas diciendo

1. Cerrar el DataSet
2. Asgino un parametro a un query

Si en 1 o 2 ocurre una excepcion, el finally se ejecuta siempre. Realmente ese es el efecto deseado?

Es decir, falla la asignacion del parametro, supongamos que el DataSet estaba cerrado. Pum, excepcion y se ejecuta el finally

novato_erick 14-11-2015 04:47:08

El dataset q contiene los ID_COMPRASPEN es un codigo q consulta todos los registros q tenga el usuario pendiente en el q al recorrerlo cada vez cierra y abre el dataset q me trae los detalles de esa consulta. Es efectivo cuando tengo mas de un registto pendiente mas no me refresca al tener solo un registro al ser ingresado recientemente como pendiente y solamente lo hace cuando cierro el programa totalmente.


Saludos

ecfisa 14-11-2015 07:40:08

Hola novato_erik.

No tomes esto como una crítica, nada mas alejado de mi intención, es sólo un consejo. Noto que del modo en que describes la situación no hemos podido entenderla, fijate si puedes replantearla de otro modo para así poder ayudarte.

Saludos :)

Al González 14-11-2015 23:15:20

...Y, por favor, usando puntos, comas y todo lo indispensable para que sea posible entender lo que escribes. ¡Por el amor de Chuck Norris!

novato_erick 19-11-2015 17:21:39

jajaja Chicos Disculpen la tardanza en contestar...

Cita:

ecficsa

No tomes esto como una crítica, nada mas alejado de mi intención, es sólo un consejo. Noto que del modo en que describes la situación no hemos podido entenderla, fijate si puedes replantearla de otro modo para así poder ayudarte.
Tranquilo para nada me afecta las criticas en realidad aprendo de mis errores y procuraré ser más detallado en mis consulta...

Al González

Cita:

...Y, por favor, usando puntos, comas y todo lo indispensable para que sea posible entender lo que escribes. ¡Por el amor de Chuck Norris!
Muy sinceramente Gracias Al González igual que a ecfisa procuraré ser mas detallado pero en realidad encontré unan solución ejemplo:

al cerrar mi formulario de consulta de compras pendientes en su respectivo evento
Código Delphi [-]
 TfrmConsultaComprasPendiente.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
with dmComprar.cdsComprasPendientesUser do
begin
   Params.ParamByName('IDUSCOMPRA').AsInteger := Variables.Id_usuario;
   open;
end;
if   dmComprar.cdsComprasPendientesUser.Active then //Aquí me quedé en duda con la interrogante que tenia AgustinOrtu asi que utilizé los parametros del ClientDataSet asociado con mi TSQLQuery de DBExpress y en realidad resulta igual.
  dmComprar.cdsComprasPendientesUser.Refresh;
  Variables.registroscompraspen := dmComprar.cdsComprasPendientesUser.
    RecordCount;
  dmComprar.cdsComprasPendientesUser.Active := False;
  dmComprar.cdsDetallesComprasPendientesUser.Active := False;
  if registroscompraspen >= 1 then
  begin
    frmPrincipal.LblAvisosMSG.Caption := 'Tienes ' +
      IntToStr(registroscompraspen) + ' Registros de Compras Pendientes';
    frmPrincipal.iAvisosInv.Picture.LoadFromFile
      ('C:\MIPROGRAMA\Imagenes\Package-warning-iconTxT.png');
    frmPrincipal.LblAvisosMSG.Font.Color := ClRed;
  end
  else
  begin
    frmPrincipal.LblAvisosMSG.Caption := 'No tienes Notificaciones';
    frmPrincipal.iAvisosInv.Picture.LoadFromFile
      ('C:\MIPROGRAMA\Imagenes\Package-Accept-iconTxT.png');
    frmPrincipal.LblAvisosMSG.Font.Color := clWindowText
  end;
end;

En fin al cerrar los ClientDataSet o Desactivarlos al volver abrirlo simplemente los DBGRID asociados al datasource y clienteDataSet no mostraban nada así que hice esto:

Código Delphi [-]
procedure TfrmConsultaComprasPendiente.btnBuscarPendientesClick(
  Sender: TObject);
begin
//DataSource1.DataSet := DataModule1.FindComponent('DatosCliente') as TDataSet
dbgComprasPendientes.Enabled := True;
dbgComprasPendientes.DataSource.DataSet :=
dmComprar.FindComponent('cdsComprasPendientesUser') as TDataSet;
with dmComprar.cdsComprasPendientesUser do
begin

   close;
   Params.ParamByName('IDUSCOMPRA').AsInteger := Variables.Id_usuario;
   open;
end;
  if  dmComprar.cdsComprasPendientesUser.Active then
   dmComprar.cdsComprasPendientesUser.Refresh;
end;

y Listo ya me trae los datos recientes que me costaba pero sinceramente estoy en duda porque el DBGRID Pierde su propiedad Enable poniendolo en falso.

De todas manera con esto ya corregí mi comportamiento extraño.

Chicos Realmente aprecio mucho su colaboración a mejorarme con ustedes he aprendido y me falta mucho más que aprender Cualquier cosa si se dan alguna vez una vuelta por Panamá avisen para tomar algo juntos.


Saludos

novato_erick

PD: en realidad voy a reducir más mi codigo porque al verlo me di cuenta que se puede hacer...


La franja horaria es GMT +2. Ahora son las 11:32:16.

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