PDA

Ver la Versión Completa : No se habilita un ClientDataSet al Limpiarlo


novato_erick
13-11-2015, 00:27:15
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:


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.


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


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

http://delphiallimite.blogspot.com/2007/10/como-manejar-excepciones-en-delphi-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...


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


...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

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:


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...