Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Error Catastrófico (https://www.clubdelphi.com/foros/showthread.php?t=82494)

cd.rafael 12-03-2013 18:00:37

Error Catastrófico
 
Cordial Saludo,

Definitivamente no estoy de acuerdo con este tipo de mensajes que muestra Delphi, lo deja a uno :confused:.

El problema es rarísimo y no sé qué pueda ser:

Hice una aplicación que me permita abrir cualquier tabla para poder realizar cualquier acción (insertar, editar, eliminar). Utilizo dbExpress.

Vay a tratar de dar un ejemplo para poderme explicar:

1. Inicio la aplicación para la TablaX. Al iniciar la aplicación, la tabla se encuentra cerrada.
2. Abro una forma de búsqueda donde puedo realizar un query cualquiera y no genera ningún problema, ej.

Código:

select * from TablaX
3. Cierro la aplicación, la inicio nuevamente para la misma TablaX y abro la foma de búsqueda y genero el siguiente query
y hasta aquí, ningún problema:

Código:

select * from TablaX where Campo1 = 1
4. Cierro la aplicación, la inicio nuevamente para la TablaY y abro la foma de búsqueda y genero el siguiente query
y... ERROR CATASTROFICO:mad::mad::mad::mad::
Código:

select * from TablaY
5. Cierro la aplicación, la inicio nuevamente para la misma TablaY y abro la foma de búsqueda y genero el siguiente query
y... ningún problema:confused::confused::confused::confused::

Código:

select * from TablaY where Campo1 = 1
La verdad es que no sé qué podrá ser y cabe advertir que todas las consultas son perfectamente válidas.

Agradezco muchísimo de antemano toda la ayuda posible.

Casimiro Noteví 12-03-2013 18:03:36

Código fuente necesitamos.

cd.rafael 12-03-2013 18:09:09

Cordial Saludo,

Código:

    Application.CreateForm(TfrmBusqueda, frmBusqueda);
    frmBusqueda.gStEsquema := pStEsquema;
    frmBusqueda.gStTabla := pStTabla;
    frmBusqueda.gScxConexion := pQry.SQLConnection;
    frmBusqueda.ShowModal;
    if (frmBusqueda.gBlCancela) then
    begin
        Exit;
    end;
    if (Length(frmBusqueda.gStSQLAdd) > 0) then
    begin
        pClientDataSet.Close;
        pQry.Close;
        if (Pos('where', frmBusqueda.gStSQLAdd) = 0) and (Pos('where', LowerCase(pStSQL)) = 0) then
        begin
            pQry.SQL.Text := pStSQL + ' where 1 = 1 ' + frmBusqueda.gStSQLAdd;
        end else begin
            pQry.SQL.Text := pStSQL + ' ' + frmBusqueda.gStSQLAdd;
        end;
        pQry.Open;
    end else begin
        pQry.SQL.Text := pStSQL;
        pQry.Open;
    end;
    try
        pQry.Refresh;
        pClientDataSet.Open; //Aquí Genera el Error Catastrófico!!!
        pClientDataSet.Refresh;
    finally;
    end;

Muchas Gracias.

Chris 12-03-2013 18:36:44

Ningún error en computación es catastrófico !!!:-|.

Cuál es exactamente el mensaje que tira el error?

cd.rafael 12-03-2013 18:41:23

1 Archivos Adjunto(s)
Cordial Saludo,

Adjunto imagen.

Gracias.

Chris 12-03-2013 18:49:16

Es casi obvio para mí que este error no tiene nada que ver con Delphi, sino con algo externo usado por dbExpress o incluso aún el sistema operativo. Que tipo de tablas / motor de DB estás usando?

cd.rafael 12-03-2013 18:54:25

Cordial saludo,

SO. Windows 7
BD. Oracle 10g

Tipos de columnas utilizadas en la Tabla:

campo1 number(2)
campo2 varchar2(50)
campo3 varchar2(1)

Número de Registros: 20

Gracias.

cd.rafael 13-03-2013 18:15:00

Cordial Saludo,

El error sale cuando intento abrir el ClientDataSet, pero lo raro es que solo falla en ciertas consultas, como expliqué, son dos consultas:

Código:

select * from TablaX --Funciona
select * from TablaY --No Funciona
select * from TablaY where Campo1 = 1 --Funciona

Hice la siguiente prueba: Modifiqué la siguiente propiedad:

Código:

ClientDataSet.PacketRecords := 1;
Y ahora si abre, pero no muestra todos los registros y cuando intento ir al último registro, me sale el dichoso "Error Catastrófico".

Cabe advertir que la tabla ahora tiene 32 registros y no creo que ese sea el problema.

Por ahí leí que podría ser error del Midas.dll, pero tampoco.

Alguien de casualidad tiene idea de qué se trata y de cómo resolver este problema?

Gracias.

Casimiro Noteví 13-03-2013 19:32:04

¿Estará estropeada la base de datos?

cd.rafael 13-03-2013 20:10:22

Cordial Saludo,

La Base de Datos está perfecta, puedo consultar dicha tabla desde el SQL Developer sin problemas.

Casimiro Noteví 13-03-2013 20:56:14

Pues "divide y vencerás". Empieza por hacer un proyecto nuevo e ir probando paso a paso hasta que encuentres el fallo. No se me ocurre otra cosa, no tenemos información, no tenemos el programa, no tenemos básicamente nada para poder ayudarte, incluso esos selects que has puesto, seguramente tampoco es un copia->pega de tu código, así que no sé cómo ayudar.

ozsWizzard 14-03-2013 12:38:08

No tendrá nada que ver pero siempre leo que dbExpress es mejor que BDE, por ejemplo, pues estoy hasta los mismísimos del dbExpress. :mad:

El BDE nunca me dio problemas y el dbExpres me da fallos por todas partes. Para empezar, a veces me obliga a lanzar esta instrucción "Conexion.CloseDataSets" cuando no tengo ni un DataSet abierto, pero si no lo hago no me deja iniciar la transacción y tampoco puedo usarlo en dll porque falla. Esos y algún que otro error raro que no he conseguido sacar (entre ellos el error catastrófico)

Pero bueno, ahora ya tengo toda la aplicacción en dbExpress y ya es tarde para echarse atrás. :(

Por otra parte, tiene toda la pinta de que sea la transformación de un dato de un registro concreto de TablaY. Yo intentaría identificar que registro es.

Saludos.

Casimiro Noteví 14-03-2013 12:54:34

Lo poco que he usado dbexpress me ha funcionado muy bien. Tan sólo tuve problema a la hora de la instalación... por no haber leido antes :o
Una vez instalado no tuve ni un problema de ningún tipo, iba como la seda, me sorprendió de lo bien que funciona y rápido.
No puedes compararlo con BDE, que es algo obsoleto y está "dado de baja" desde hace muchos años.

ElDioni 14-03-2013 17:10:10

Si es al utilizar el ClientDataSet, puede que sea el archivo midas.dll, prueba a añadirlo en tu proyecto a ver que pasa.

Saludos.

cd.rafael 14-03-2013 17:18:56

Cordial Saludo,

Perdón por la pregunta, pero... cómo agrego la librería la proyecto?

Gracias.

ElDioni 14-03-2013 19:03:10

En las uses del proyecto tienes que poner MidasLib.

Código Delphi [-]

program Presupuestos;


uses
  MidasLib,
  Forms,
  Controls,
  Unit1 in 'Unit1.pas' {FrmMenuPres},
  Unit2 in 'Unit2.pas' {FrmAcceso},  

{$R *.res}
var
  frmacceso:tfrmacceso;
begin
  Application.Initialize;
  frmacceso:=tfrmacceso.create(nil);
  if frmacceso.Showmodal=mrOK then
    begin
      frmacceso.Free;
      //Application.CreateForm(TFrmAcceso, FrmAcceso);
      Application.CreateForm(TFrmMenuPres, FrmMenuPres);
      Application.Run;
    end
  else
    begin
      frmacceso.Free;
    end;
end.

ozsWizzard 14-03-2013 19:21:43

Cita:

Empezado por Casimiro Notevi (Mensaje 456752)
Lo poco que he usado dbexpress me ha funcionado muy bien. Tan sólo tuve problema a la hora de la instalación... por no haber leido antes :o
Una vez instalado no tuve ni un problema de ningún tipo, iba como la seda, me sorprendió de lo bien que funciona y rápido.
No puedes compararlo con BDE, que es algo obsoleto y está "dado de baja" desde hace muchos años.

Sería justo decir que todos estos problemas no son solamente de dbExpress, siempre los he detectado (y encontrado por internet) con Sql Server (tampoco es santo de mi devoción esta BDD).

Ya sé que BDE está obsoleto pero a mí nunca me ha dado ningún problema sin embargo, si me pasa con las conexiones usando dbExpress.

Lo que he comentado de una dll tiene que haber un hilo por hay donde lo explico. Cambié a ADO y funciona perfectamente.

EL error del closedatasets lo leí por ahí también(hará ya unos 8 meses), es un error del cual eran conscientes en Embarcadero y microsoft, ambos pensarían que es culpa del otro...

Y aún me pasa alguna cosa rara más, como por ejemplo al cerrar las aplicaciones.

En una aplicación conecto el "TSqlConnection" en tiempo de ejecución (al crear el "DataModule"), al hacer Aplication.Terminate, si no desconecto después la conexión, me da un error infinito (hasta que la aplicación se cansa de sacar errores) y no es capaz de posicionar el error en ninguna parte.

Pero oye, que quien quiera que use dbExpress, si yo pudiera volvería atrás, al menos para usar Sql Server (aunque casi que cambiaba antes la BDD)

Ah, y siento desvirtuar el tema.




Por otra parte, insisto, ¿Has comprobado que no falle ningún registro?.

Piensa que si TablaX no falla y TablaY falla solamente si te traes todos los registros pero si solamente te traes algunos, no. Al ir al último también te falla (es decir, que pasa por el registro erróneo).

Siempre y cuando te refieras a que TablaX siempre es la misma e TablaY siempre es la misma, y no te refieras al orden de ejecutar las cosas.

Saludos

cd.rafael 18-03-2013 15:45:29

Cordial Saludo,

Hay cosas que nunca podré entender. Alguna vez, en mis épocas de Universidad, cuando algo no me funcionaba, lo que hacía era eliminar el objeto y volver a coloacrlo en el form, y... así es exactamente lo que hice. Saqué un pantallazo de las propiedades del ClientDataSet que tenía en mi DataModulo, lo borré y coloqué un nuevo ClientDataSet y le asigné las mismas propiedades del anterior, y adivinen qué?... FUNCIONA:eek:. Pero no tengo ni idea de qué pudo ser.

AHora me enfrento con otro Expediente X, pero me toca en otro hilo.

Muchas gracias a todos.

bulc 18-03-2014 10:43:11

Prueba sacar con el select menos registros de ...
 
los que te permite el Paquete del ClientDataSet. Yo he tenido ese problema y lo he solucionado así. Pero lo he hecho por intuición. No me ha vuelto a salir. Y me pasaba cuando llegaba al final del conjunto expuesto en el DBGrid por el select. Si este conjunto superaba el paquete del ClientDataSet entonces saltaba ese error ya que no se habían cargado todos los registros del select por ser mayor su número de los que el paquete ClientDataSet tenía establecidos. Mira los registros que produce el select y adapta la prop. PacketRecord, en consecuencia.
Si te pasa al cambiar de tabla deberías cerrar el ClientDataSet anterior antes de volver a cargarlo.
Prueba a ver qué pasa.
Suerte.
bulc

juanelo 18-03-2014 16:58:00

18-03-2013
En lo dicho ... :D


La franja horaria es GMT +2. Ahora son las 18:36:20.

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