Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Project Project1.exe raised exeption.... (https://www.clubdelphi.com/foros/showthread.php?t=41410)

pnsd_89 14-03-2007 20:54:55

Project Project1.exe raised exeption....
 
Hola soy un programador junior estoy aciendo una AMB donde tengo que filtrar unos datos de una base de datos PostgresSQL.
La From y los componentes estan pero a la hORA de filtrar salta un error que dice: "Project Project1.exe raised exeption class EAccessViolation with message 'access violation at address 52BBEA3C in module' dbexpress100.bpl' read of address 00000094"",el dato con una funcion hecha por un compañero (esta funcion ya funciona en otros programas y sirve para conectarce al la bd) pero es en un if de esta funcion donde el programa no acepta y salta este error esta condicion dice: "if BaseDatosFB.InTransaction then". Ahhh. olvide mencionar que el error salta al precionar el boton que hace la consulta en el momento que llega a la condicion "if" ya mencionada. Ya mire mi select luego de precionar el boton del query y esta perfecto sin
ningun.
por favor si alguna vez te sucedio algo semegante comentalo que ya no aguanto esta impotencia que ciento:confused:

dec 14-03-2007 21:23:07

Hola,

"Lo repetiré hasta que se me entienda". Las "violaciones de acceso a memoria" se producen porque se trata de acceder a la instancia de un objeto que aún no ha sido creado y/o cuando se trata de acceder a la instancia de un objeto que ya fue liberado. Tendrás que situar algún que otro punto de ruptura en tu código, echar un vistazo para ver a qué objetos se están accediendo, si se está llamando a algún método de alguno, etc.

Es muy probable que el problema no esté en la consulta SQL propiamente dicha, en tu caso.

pnsd_89 14-03-2007 21:47:53

Y como LO soluciono??¿?
 
Ok. como soluciono ese problema. Una duda estoy usando un combobox esto puede afectar en algo. MUchAs gracias Por responder te voy a gradecer mas si lo vuelves a hacer y a las personas que lo haran.
PD: Perdon por la ignorancia con delphi pero hace 1.5 meses que comense a utilizarlo y es el primer lenguage orientado a objetos que estoy usando. :o

pnsd_89 14-03-2007 21:55:14

a me olvidaba
 
la consulta sql esta perfecta la comprove con un showmessage

dec 14-03-2007 21:57:35

Hola,

Ignorantes somos todos en un momento dado. Y nadie nace sabiendo, así que no te preocupes en absoluto. En lo que respecta al problema... lo que ocurre es que es complicado (acaso pudieras copiar por aquí al menos una parte del código fuente implicado en el problema), es complicado, digo, dar una solución concreta.

Dices que si usar un "ComboBox" puede tener que ver... pues hombre, en principio no, pero, si se está tratando de utilizar un "ComboBox" que no ha sido creado o ya ha sido destruído... entonces evidentemente sí habría problemas. No se puede (sin más) saber si el "ComboBox" es culpable, pero, puedes centrarte en depurar el error.

¿Puedes copiar por aquí algo del código fuente relacionado con el problema? Tal vez de ese modo alguien pueda echarte una mano si ve algo, o quiera preguntarte algo a partir de que pueda ver el código fuente en cuestión.

pnsd_89 14-03-2007 22:07:56

Ok...
 
Código Delphi [-]
procedure TFSucursal.BitBtn3Click(Sender: TObject);
var
   sSQL, sFROM, sWHERE, sORDER, sEsquema,sent: string;
begin
     sSQL   := EmptyStr;
     sFROM  := EmptyStr;
     sWHERE := EmptyStr;
     sORDER := EmptyStr;

     sEsquema := 'dba.';


     sSQL  := 'select * ';
     sFROM := 'from '+sEsquema+'sucursal_mh ';
     sWHERE:= 'where 0 = 0 ';

     if not ( Trim( DBLFiltra_sucursal.Text ) = EmptyStr ) then
        sWHERE := sWHERE + 'and cod_sucursal_mh = '+ (DBLFiltra_sucursal.KeyValue);
     sORDER := ' order by des_sucursal_mh';
     DMSucursales.QrySucursal_MH.SQL.Clear;
     DMSucursales.QrySucursal_MH.SQL.Add ( sSQL + sFROM + sWHERE + sORDER );
     DMSucursales.CDSsucursal_mh.Close;
      sent:=(sSQL+sFROM+sWHERE+sORDER);
      ShowMessage(sent);
     UCerrarAbrirPG(DMSucursales.CDSsucursal_mh, Self); {aqui salta a la funcion (en realidad no se si es una funcion o petodo. y salta a este codigo siguiente En un na UNIDAD01}

{...}

Código Delphi [-]
procedure UCerrarAbrirPG(DataSet: TDataSet; Sender : TForm);
var
   nombre, ErrorM : string;
begin
     ErrorM := '';
     nombre := DataSet.Name;
     if BaseDatosPG.InTransaction then {:eek:EN este lugar no entra y salta el error :eek:}
        begin
             try
                DataSet.Close;
             except
                on E: Exception do
                   UAbrirMensaje('Error al cerrar el componente '+nombre+'.'+#13+#10+'Mensaje : '+E.Message,ierror,sender);
             end; {try}
             try
                DataSet.Open;
             except
                on E: Exception do
                   UAbrirMensaje('Error al abrir el componente '+nombre+'.'+#13+#10+'Mensaje : '+E.Message,ierror,sender);
             end; {try}
        end {if}
     else
        begin
             try
               DataSet.Close;
             except
               on E: Exception do
                  UAbrirMensaje('Error al cerrar el componente '+nombre+'.'+#13+#10+'Mensaje : '+E.Message,ierror,sender);
             end; {try}
             IniciarTransaccionPG;
             try
                BaseDatosPG.StartTransaction(TDPG);
                DataSet.Open;
                BaseDatosPG.Commit(TDPG);
             except
                on E: Exception do
                   begin
                       BaseDatosPG.Rollback(TDPG);
                       UAbrirMensaje('Error al abrir el componente '+nombre+'.'+#13+#10+'Mensaje : '+E.Message,ierror,sender);
                   end; {on}
             end; {try}
        end; {else}
end;

Edito este mensaje para añadir las etiquetas [ delphi ].

roman 14-03-2007 22:12:43

Cita:

Empezado por dec
Las "violaciones de acceso a memoria" se producen porque se trata de acceder a la instancia de un objeto que aún no ha sido creado y/o cuando se trata de acceder a la instancia de un objeto que ya fue liberado

Hombre, esto no es del todo cierto. Por ejemplo, los siguientes códigos causarán una violación de acceso:

Código Delphi [-]
var
  a: array of Integer;

begin
  a[84] := 84;
end;

Código Delphi [-]
var
  p: pbyte;

begin
  p^ := 84;
end;

Menciono esto porque el error pudiera también estar al acceder a un elemento inexistente de un arreglo, por ejemplo, ComboBox.Items

// Saludos

dec 14-03-2007 22:14:42

Hola,

Sí; llevas razón Román. Incluso, ¿no podría decirse que cualquier intento de acceder a memoria ya liberada o sin asignar aún causaría una violación de acceso? Pregunto. :)

Edito: Y me respondo. Supongo que esto último no es así puesto que por ejemplo uno puede acceder al valor de una variable de tipo "string" incluso sin que esta fuera inicializada. Mejor dicho, las variables de tipo "string" son inicializadas por Delphi con un determinado valor, con una cadena vacía. ¿Verdad?

pnsd_89 14-03-2007 22:40:39

Esta podria ser la causa?
 
en el codigo aparece un Trim( DBLFiltra_sucursal.Text ){DBLFIltra_sucursal = a un TRxLookupDBComboBox} esta podria ser la causa? Y como cambio esto o que hago para que no cree problemas

pnsd_89 15-03-2007 22:15:53

encontre el error
 
el error se daba por el mal direccionaminto del programa a la base de datos.
si sefijan en el error en el if de arriba donde se produce el error la palabra que dice BasedeDatosPG estaba como nill osea que no apuntaba a nada es por eso que se producia el error gracias a todos por su colaboracion emos derrotado nuevamente al enemigo jajaja.


La franja horaria es GMT +2. Ahora son las 22:36:05.

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