![]() |
Cannot perform this operation on a ON A CLOSED DATASET
Perdon por el titulo si querer aplaste enter.
El caso es el siguiente miren tengo una aplicacion que me manda este el error de can not perform this operation on a closed dataset, yo pensaba que era un error del codigo, pero en esta liga http://www.clubdelphi.com/foros/showthread.php?t=19379 vi que no que es de la base de datos asi que me fije cual la tabla ala que apunta cuando me manda el error y fui ala base de datos, me di ceunta que solo hay un registro pero no se si beda borrarlo o que debo hacer?? si kieren ver algo de el codigo solo diganme que parte, la aplicacion no la codifique pero la debocorregir yo el manejador de base de datos es ms sql server gracias:) espero susrespuestas |
Tienes que explicar cuando te da el error, si es posible el trozo de código en el que falla indicando la línea, la base de datos que usas, los componentes con los que te conectas a ella...
|
Hola, concuerdo con Kuan-yiu, especifica, especifica, porque estoy seguro que debe ser que el componente que usas para conectarte a la tabla no esta Active o Open:
Cita:
|
Delphi 6, base de datos MS SQL Server, la conecion es ADO y el componentes es un TADOdataset que ase referencia a una tabla
Application.CreateForm(TFRBusquedaCliente,FRBusquedaCliente); if FRBusquedaCliente.ShowModal = mrOk then begin ADODSFact.Edit; ADODSFactID_CLIENTE.Value:=FRBusquedaCliente.intCliente; end; FRBusquedaCliente.Free; end; La aplicacion no la codifique yo por eso no entiendo muy bien el codigo si es otra parte la que necesito poner solo decime cual y la pongo es un programa que abarca muchas cosas y no las se espero que estedes si gracias |
he aqui el problema:
Saludos. |
Hola
Ya te lo dijeron pero para insistir. No se puede editar una tabla, query si esta cerrada, donde se abre en el codigo que pusiste, no lo veo. Tal vez asi: Saludos |
Hola
Me ganaron por 37 segundos Saludos |
Graciassssss!!!!!!
Esa era la solucionnn muchas gracias soy un novato :( pero ustedes si que saben gracias a los dosss jejeje me prestan su cerebro unos meses :p jajajaj
graciasssss |
Ese Problema ya esta solucionado pero ahora estoy en otro identico marca el mismo error solo que en un dbgirddetafact
procedure TFPrincipal.actFactDireExecute(Sender: TObject); begin Application.CreateForm(TFFacturacionDirecta,FFacturacionDirecta); FFacturacionDirecta.ShowModal; FFacturacionDirecta.Free;// aqui me marca el error end; que sera ?? |
Hola
El error lo marca ahí por que es el principio del programa, osea que en el oncreate del from tienes el problema. Aparte: Para mi no lo puedes enseñar y liberar enseguida. Saludos |
Código Delphi [-]
procedure TFPrincipal.actFactDireExecute(Sender: TObject); begin Application.CreateForm(TFFacturacionDirecta,FFacturacionDirecta); try FFacturacionDirecta.ShowModal;//ahora el error es aqui finally FFacturacionDirecta.Free; end; end; el error ahora lo marca ahi mm weno hgracias por tu apoyoo :) gracioas |
trata de mostrar el evento onshow, y on create del formulario, a su ves escribe el error que te da, si en verdad es el mismo es porq te falto abrir la tabla
|
Hola
Coloca el codigo del from FFacturacionDirecta completo. Si dices que el error es el mismo solo que en dbgirddetafact, pues ahi esta el error, ahi es donde hay que buscar. Tambien puedes presionar f8 o f7 creo. Saludos |
Hola...
Si indicas cual es el error que obtienes, te podremos ayudar mejor... ;) Saludos... |
Esta prte del codigo es la que ejecuta cuando le doy click al grid me di cuanta que tampoco tenia el ADODSFact.open se lo puese pero esta vez el error sigue siendo el mismo
procedure TFFacturacionDirecta.actBusqEvenExecute(Sender: TObject); begin Application.CreateForm(TFRBusquedaEventos,FRBusquedaEventos); if FRBusquedaEventos.ShowModal = mrOk then begin ADODSFact.Edit; ADODSFactNUM_EVENTO.Value:=FRBusquedaEventos.intEvento; end; FRBusquedaEventos.Free; end; |
todo el codigo
procedure TFFacturacionDirecta.FormCreate(Sender: TObject);
begin New(Permiso); Permiso:=FDMPrincipal.leerPermiso('FFACTURACIONMESA'); ADODSServ.Open; ADODSClie.Open; ADODSRfc.Open; ADODSEven.Open; end; procedure TFFacturacionDirecta.actNuevoExecute(Sender: TObject); begin ADODSFact.Open; ADODSDetaFact.Open; ADODSFact.Last; if ADODSFactNUM_FACTURA.IsNull then intFactura:=1 else intFactura:=ADODSFactNUM_FACTURA.Value+1; try ADODSFact.Append; ADODSFact.Post; ADODSFact.Edit except FDMPrincipal.capturarExcepcion; end; end; procedure TFFacturacionDirecta.ADODSFactBeforeInsert(DataSet: TDataSet); begin if Permiso^.Insertar=False then Raise Exception.Create('No Posee Privilegios Para Ingresar Registros En Este Módulo'); end; procedure TFFacturacionDirecta.ADODSFactNewRecord(DataSet: TDataSet); begin intIDFactura:=FDMPrincipal.obtenerMaxID('ID_FACTURA','SIE_FACTURACIONMESA'); ADODSFactID_FACTURA.Value:=intIDFactura; ADODSFactNUM_FACTURA.Value:=intFactura; ADODSFactID_CLIENTE.Value:=0; ADODSFactSUBTOTAL.Value:=0; ADODSFactIVA.Value:=0; ADODSFactTOTAL.Value:=0; ADODSFactNUM_EVENTO.Value:=0; ADODSFactFECHA_FACTURACION.Value:=Date; ADODSFactTASA_IMPUESTO.Value:=currIVA; end; procedure TFFacturacionDirecta.ADODSFactID_CLIENTEValidate(Sender: TField); begin if not ADODSClie.Locate('ID_CLIENTE',ADODSFactID_CLIENTE.Value,[]) then Raise Exception.Create('El cliente especificado no existe. Seleccione otro'); end; procedure TFFacturacionDirecta.actBusqClieExecute(Sender: TObject); begin Application.CreateForm(TFRBusquedaCliente,FRBusquedaCliente); if FRBusquedaCliente.ShowModal = mrOk then begin ADODSFact.Edit; ADODSFactID_CLIENTE.Value:=FRBusquedaCliente.intCliente; end; FRBusquedaCliente.Free; end; procedure TFFacturacionDirecta.dbEdtClieKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=VK_F2 then actBusqClie.Execute; end; procedure TFFacturacionDirecta.ADODSClieAfterScroll(DataSet: TDataSet); begin intCliente:=ADODSClieID_CLIENTE.Value; ADODSRFC.Close; ADODSRFC.Parameters.ParamByName('IDCLIE1').Value:=intCliente; ADODSRFC.Parameters.ParamByName('IDCLIE2').Value:=intCliente; ADODSRFC.Open; DBCBoxRFC.KeyValue:=ADODSRFCRFC.Value; end; procedure TFFacturacionDirecta.actBusqEvenExecute(Sender: TObject); begin Application.CreateForm(TFRBusquedaEventos,FRBusquedaEventos); if FRBusquedaEventos.ShowModal = mrOk then begin ADODSFact.Edit; ADODSFactNUM_EVENTO.Value:=FRBusquedaEventos.intEvento; end; FRBusquedaEventos.Free; end; procedure TFFacturacionDirecta.ADODSFactNUM_EVENTOValidate(Sender: TField); begin if ADODSFactNUM_EVENTO.Value<>0 then begin if not ADODSEven.Locate('ID_EVENTO',ADODSFactNUM_EVENTO.Value,[]) then Raise Exception.Create('El evento especificado no existe. Seleccione otro') else ADODSFactEVENTO.Value:=ADODSEvenCONCEPTO.Value; end else ADODSFactEVENTO.Value:=EVENTO_DEFAULT; end; procedure TFFacturacionDirecta.dbEdtEvenKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=VK_F2 then actBusqEven.Execute; end; procedure TFFacturacionDirecta.ADODSDetaFactNewRecord(DataSet: TDataSet); begin ADODSDetaFactID_EMPRESA.Value:=intEmpresa; ADODSDetaFactID_USUARIO.Value:=intUsuario; ADODSDetaFactID_FACTURA.Value:=intIDFactura; ADODSDetaFactNUM_FACTURA.Value:=0; ADODSDetaFactPER_DESCTO.Value:=0; ADODSDetaFactDESCUENTO.Value:=0; ADODSDetaFactFECHA_REGISTRO.Value:=Date; ADODSDetaFactCANTIDAD.Value:=1; end; procedure TFFacturacionDirecta.actBusqServExecute(Sender: TObject); begin Application.CreateForm(TFRBusquedaServicios,FRBusquedaServicios); if FRBusquedaServicios.ShowModal = mrOk then begin ADODSDetaFact.Edit; ADODSDetaFactCLAVE_SERVICIO.Value:=FRBusquedaServicios.cveServicio; end; FRBusquedaServicios.Free; end; procedure TFFacturacionDirecta.ADODSDetaFactCLAVE_SERVICIOValidate( Sender: TField); begin if not ADODSServ.Locate('CLAVE',ADODSDetaFactCLAVE_SERVICIO.Value,[]) then Raise Exception.Create('El servicio especificado no existe. Seleccione otro') else begin ADODSDetaFactPRECIO_VENTA.Value:=ADODSServPRECIO_VENTA.Value; ADODSDetaFactID_SERVICIO.Value:=ADODSServID_SERVICIO.Value; end; end; procedure TFFacturacionDirecta.dbGridDetaFactDblClick(Sender: TObject); begin if dbGridDetaFact.SelectedField.FieldName='CLAVE_SERVICIO' then actBusqServ.Execute; end; procedure TFFacturacionDirecta.dbGridDetaFactKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if KEY=VK_F2 then begin if dbGridDetaFact.SelectedField.FieldName='CLAVE_SERVICIO' then actBusqServ.Execute; end; end; procedure TFFacturacionDirecta.ADODSDetaFactCANTIDADValidate( Sender: TField); begin if ADODSDetaFactCANTIDAD.Value<1 then Raise Exception.Create('La cantidad del servicio debe ser mayor o igual a 1 (uno)'); end; procedure TFFacturacionDirecta.ADODSDetaFactCANTIDAD_UNIDADValidate( Sender: TField); begin if ADODSDetaFactCANTIDAD_UNIDAD.Value<1 then Raise Exception.Create('El número de unidades debe ser mayor o igual a 1 (uno)'); end; procedure TFFacturacionDirecta.dbGridDetaFactKeyPress(Sender: TObject; var Key: Char); begin if dbGridDetaFact.SelectedField.FieldName='PRECIO_VENTA' then begin if bolModiPrecServicioMesa then begin if ADODSDetaFactMOD.Value=False then key:=#0; end else Key:=#0; end; end; procedure TFFacturacionDirecta.ADODSDetaFactCalcFields(DataSet: TDataSet); var Sub:Currency; begin Sub:=ADODSDetaFactPRECIO_VENTA.Value*ADODSDetaFactCANTIDAD.Value*ADODSDetaFactCANTIDAD_UNIDAD.Value; ADODSDetaFactIMPORTEC.Value:=Sub; end; procedure TFFacturacionDirecta.ADODSDetaFactBeforePost(DataSet: TDataSet); begin if ADODSDetaFactID_SERVICIO.IsNull then begin Raise Exception.Create('Especifíque la Clave del Producto'); Exit; end; ADODSDetaFactIMPORTE.Value:=ADODSDetaFactIMPORTEC.AsCurrency; end; end. |
Yun-i, publica el error que te sale no el codigo, asi te ayudamos mejor. saludos. |
Y por favor, usa las etiquetas [ delphi ] [ /delphi ] (sin los espacios en blanco) cuando publiques código en Delphi...
Saludos... |
Ok perdon no saba eso gracas soy nuevo nunka habia pegado codigo pero gracias
encuanto al error sigue marcando lo mismo aun agregando lo que me dicen :/ |
Hola
Me lo explican?, por que esto: Nunca lo he visto.:confused: Saludos |
Cita:
Yo tampoco se que es el codigo no lo hice yo pero seria bueno que alguien pudirea explikarnos :) saludos |
Quizás en el evento OnNewRecord se asigne el número de factura, como sabemos ese número debe ser correlativo sin huecos en la numeración. Si el programa está en red, dos usuarios pueden pulsar el botón de "Insertar nuevo registro" y tener el mismo número de factura.
En Paradox y otras hierbas, se suele agregar un registro en blanco (que provoca el evento OnNewRecord entre otros) y acto seguido se graba para que nadie más en la red pueda tomar ese número de factura. (Obviamente no tiene que ser por motivo de factura, pero si es la filosofía). Después se deja en Edición para que el usuario no note nada raro y pueda seguir introduciendo los demás datos del registro. Saludos |
En cuanto al error original del hilo:
El error lo dice claramente: No se puede realizar la operación en un Dataset Cerrado. Está claro que al ejecutar la acción "actBusqEvenExecute" en alguna ocasión, el adodsFact no está abierto. Deberías encontrar esa situación para manejarla mejor. Yo solo he parcheado el asunto, pero sabe dios que registro editará, lo más normal es que edite el que no necesitas. Saludos |
lepe como siempre
Bueno miren, gracias a los comentarios de lepe y carol me cayo el 20(entendi) ya quedo bueno esa parte, lo que hice para evitarme problemas es abrir en el oncreate de la forma todos los TADODataset y ya no marca el error, pero como bien dijeron ustedes el errror era pk estaba cerrado el dataset.
sale pues asi quedo el codigo las otras funciones las estoy analizando esas ya estaban bueno esa parte ya esta pero pues hay muchas cosas que no se del sistema son 140 formas aprox. ya con reportes y pantallas chicas de consulta puero pues si hay algunas con mayor complejidad bueno almenos para mi asi es ya que el sistema manda correos de forma automatica al realizar algun proceso, crea, modifica abre, adjunta archivos de ofice exporta a excel algunos reportes de quik report etc etc pero bueno conforme me vaya saliendo dudas ire habriendo hilos creo que es mas recomendable no?? bueno ante todo muchas gracias por su apoyo :) Saluods |
| La franja horaria es GMT +2. Ahora son las 11:45:07. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi