Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-04-2012
escorpionrojo43 escorpionrojo43 is offline
Miembro
 
Registrado: abr 2010
Posts: 89
Poder: 15
escorpionrojo43 Va por buen camino
Ventana de Busqueda

Hola Companeros
tengo el siguiente problema.

En mi aplicacion he puesto una opcion de busqueda de clientes, la opcion de busqueda funciona bien el problema es que me da error al pasa los datos a la ventana que lo llama.

Código Delphi [-]
procedure TFFactura.btnDatosClienteClick(Sender: TObject);
begin
    Application.CreateForm(TFBuscaPaciente, FBuscaPaciente);
      if FBuscaPaciente.ShowModal = mrOk then
      begin
        editclt_codigo.Text := FBuscaPaciente.uniquery1.FieldByName('IDPACIENTE').asString;
      end;
    FBuscaPaciente.Destroy
end;

al ejecutar esta parte del codigo me da un error
access violation at address 00525133

la ventana de busqueda la tengo con la propiedad visible false y el formstyle es fsnormal.
alguien me puede ayudar con esto?
Responder Con Cita
  #2  
Antiguo 23-04-2012
MartinS MartinS is offline
Miembro
NULL
 
Registrado: nov 2011
Ubicación: Villa Cacique - Argentina
Posts: 283
Poder: 13
MartinS Va por buen camino
Hola: Podrias poner el codigo que realiza la consulta?

Saludos
Responder Con Cita
  #3  
Antiguo 23-04-2012
escorpionrojo43 escorpionrojo43 is offline
Miembro
 
Registrado: abr 2010
Posts: 89
Poder: 15
escorpionrojo43 Va por buen camino
Cita:
Empezado por MartinS Ver Mensaje
Hola: Podrias poner el codigo que realiza la consulta?

Saludos
Este es el codigo del formulario buscador completo
Código Delphi [-]
unit UbuscaPaciente;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, StdCtrls, ExtCtrls, Grids, DBGrids, MemDS, DBAccess, Uni, Buttons;

type
  TFBuscaPaciente = class(TForm)
    UniQuery1: TUniQuery;
    DBGrid1: TDBGrid;
    Panel1: TPanel;
    Panel2: TPanel;
    Label18: TLabel;
    Edit1: TEdit;
    RadioGroup2: TRadioGroup;
    DataSource1: TDataSource;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    procedure query();
    procedure RadioGroup2Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FBuscaPaciente: TFBuscaPaciente;

implementation

uses Udatamodulo;

{$R *.dfm}

procedure TFBuscaPaciente.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = vk_return then
    bitbtn2.SetFocus;
end;

procedure TFBuscaPaciente.Edit1Change(Sender: TObject);
begin
query
end;

procedure TFBuscaPaciente.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  freeandnil(FBuscaPaciente);
end;

procedure TFBuscaPaciente.query();
begin
  with UniQuery1, sql do
  begin
    close;
    clear;
    begin
      if RadioGroup2.ItemIndex = 0 then
        Add(' SELECT * FROM paciente where upper(nombre) like upper('+#39+'%'+edit1.text+'%'+#39+')')
      else
        Add(' SELECT * FROM paciente where upper(telefono) like upper('+#39+'%'+edit1.text+'%'+#39+')');
    end;
    open;
  end;
end;

procedure TFBuscaPaciente.RadioGroup2Click(Sender: TObject);
begin
query
end;

end.
Responder Con Cita
  #4  
Antiguo 23-04-2012
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Hola,

parece que cuando quieres rescatar el dato estás accediendo a algo que ya no existe, ¿porqué no pruebas a enviar el dato desde el mismo formulario de busqueda en lugar de rescatarlo desde el principal?

Saludos.
__________________
Confórmate con lo que tienes pero anhela lo que te falta.
Responder Con Cita
  #5  
Antiguo 23-04-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Este código es más peligroso que una caja de bombas

Código Delphi [-]
procedure TFBuscaPaciente.query(); 
begin   
  with UniQuery1, sql do   
  begin     
    close;     
    clear;    
    begin       
      if RadioGroup2.ItemIndex = 0 then         
        Add(' SELECT * FROM paciente where upper(nombre) like upper('+#39+'%'+edit1.text+'%'+#39+')')       
      else         
        Add(' SELECT * FROM paciente where upper(telefono) like upper('+#39+'%'+edit1.text+'%'+#39+')');     
    end;     
    open;   
  end; 
end;
Responder Con Cita
  #6  
Antiguo 23-04-2012
escorpionrojo43 escorpionrojo43 is offline
Miembro
 
Registrado: abr 2010
Posts: 89
Poder: 15
escorpionrojo43 Va por buen camino
Cita:
Empezado por ElDioni Ver Mensaje
Hola,

parece que cuando quieres rescatar el dato estás accediendo a algo que ya no existe, ¿porqué no pruebas a enviar el dato desde el mismo formulario de busqueda en lugar de rescatarlo desde el principal?

Saludos.
seria una buena solucion si solo ese formulario llamara la informacion pero quiero que otros formularios puedan hacer uso de la busqueda.
que crees que podria hacer en ese caso eldioni?
Responder Con Cita
  #7  
Antiguo 23-04-2012
escorpionrojo43 escorpionrojo43 is offline
Miembro
 
Registrado: abr 2010
Posts: 89
Poder: 15
escorpionrojo43 Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Este código es más peligroso que una caja de bombas

Código Delphi [-]
procedure TFBuscaPaciente.query(); 
begin   
  with UniQuery1, sql do   
  begin     
    close;     
    clear;    
    begin       
      if RadioGroup2.ItemIndex = 0 then         
        Add(' SELECT * FROM paciente where upper(nombre) like upper('+#39+'%'+edit1.text+'%'+#39+')')       
      else         
        Add(' SELECT * FROM paciente where upper(telefono) like upper('+#39+'%'+edit1.text+'%'+#39+')');     
    end;     
    open;   
  end; 
end;
Por que lo dices Casimiro?
Responder Con Cita
  #8  
Antiguo 23-04-2012
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola, el error yo creo que te da por el OnClose de tu formulario de busqueda:

Código Delphi [-]
 //liberas tu formulario antes de tiempo
 //comenta esta linea y prueba
 freeandnil(FBuscaPaciente);

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #9  
Antiguo 23-04-2012
escorpionrojo43 escorpionrojo43 is offline
Miembro
 
Registrado: abr 2010
Posts: 89
Poder: 15
escorpionrojo43 Va por buen camino
Cita:
Empezado por Caro Ver Mensaje
Hola, el error yo creo que te da por el OnClose de tu formulario de busqueda:

Código Delphi [-]
 //liberas tu formulario antes de tiempo
 //comenta esta linea y prueba
 freeandnil(FBuscaPaciente);

Saluditos
efectivamente ese era el problema
Gracias caro.
Responder Con Cita
  #10  
Antiguo 23-04-2012
escorpionrojo43 escorpionrojo43 is offline
Miembro
 
Registrado: abr 2010
Posts: 89
Poder: 15
escorpionrojo43 Va por buen camino
Casimiro
me ha causado una gran inquietud lo que dijiste podrias decirme lo peligroso del codigo por favor?
Responder Con Cita
  #11  
Antiguo 23-04-2012
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola, ademas de lo que he comentado antes, despues haces un Destroy de tu formulario de busqueda que ya ha sido liberado.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #12  
Antiguo 23-04-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Este código es más peligroso que una caja de bombas
Más peligroso que un mono con una ametralladora... una AK-47 para ser exacto

__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #13  
Antiguo 23-04-2012
escorpionrojo43 escorpionrojo43 is offline
Miembro
 
Registrado: abr 2010
Posts: 89
Poder: 15
escorpionrojo43 Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
Más peligroso que un mono con una ametralladora... una AK-47 para ser exacto

estimado Delphius
en vista de que nuestro companero aun no me dado respuesta y tu lo secundas en su comentario podrias decirme por favor que es lo peligroso de mi codigo para solucionarlo.
y de que manera lo podrias hacer tu?
gracias.
Responder Con Cita
  #14  
Antiguo 23-04-2012
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
Cita:
Empezado por escorpionrojo43 Ver Mensaje
Casimiro
me ha causado una gran inquietud lo que dijiste podrias decirme lo peligroso del codigo por favor?
No sé que esté pensando Casimiro, pero de algo si estoy seguro, 1 - SQL Injection, 2 - Bajo rendimiento, ya que cada vez que mandas a un motor una consulta SQL hace que el motor tenga un rendimiento mucho menor que si ejecutaras un procedimiento almacenado o vista.
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #15  
Antiguo 23-04-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Bueno, es peligroso en 1er lugar porque es muy prospenso a una injección de SQL. En este hilo se ha comentado al respecto.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #16  
Antiguo 23-04-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Es peligroso porque puedes estar haciendo algo que no sabes que lo estabas haciendo.
Aunque en este caso pueda parece bastante claro, nunca estás realmente seguro de que hace las cosas bien: que el open sea del query, que el close sea del sql ¿o era al revés?, que no haya un error con los begin end y esté llamando al close del formulario, etc.
Además que para hacer depuración de código no sirve.
Algunas veces se ha hablado de que existen empresas que tienen prohibido usar el with
Responder Con Cita
  #17  
Antiguo 23-04-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por mightydragonlor Ver Mensaje
2 - Bajo rendimiento, ya que cada vez que mandas a un motor una consulta SQL hace que el motor tenga un rendimiento mucho menor que si ejecutaras un procedimiento almacenado o vista.
A ver, esta parte no me queda clara. ¿Que los motores de bases de datos no están precisamente para mandarles consultas? En este caso -buscar pacientes- ¿cómo nos ayudaría un procedimiento almacenado?

// Saludos
Responder Con Cita
  #18  
Antiguo 23-04-2012
escorpionrojo43 escorpionrojo43 is offline
Miembro
 
Registrado: abr 2010
Posts: 89
Poder: 15
escorpionrojo43 Va por buen camino
ok necesito documentarme mas al respecto.
gracias por la observación. ahora bien ya ven como ejecuto yo esa consulta.
me podrian dar un buen ejemplo de como hacerlo. asi fue que me ensenaron y obviamente no me dijeron las consecuencias.

Puede alguien poner el codigo de forma correcta para fines didacticos?
gracias.
Responder Con Cita
  #19  
Antiguo 23-04-2012
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
Cita:
Empezado por roman Ver Mensaje
A ver, esta parte no me queda clara. ¿Que los motores de bases de datos no están precisamente para mandarles consultas? En este caso -buscar pacientes- ¿cómo nos ayudaría un procedimiento almacenado?

// Saludos
No es que no estén preparados, pero a un nivel mas técnico, cuando mandas un Select bla bla bla esta instrucción debe ser parseada, estudiada para conseguir un plan de ejecución óptimo y luego ejecutada, cuando creas un procedimiento almacenado o una vista, lo anterior solo se hace una vez, cuando se crea, el resto de las veces ya no tiene por que hacerlo, por que ya lo tiene definido, pero si se hace algún cambio en índices, cuando se ejecute nuevamente la vista o procedimiento almacenado, se vuelve a generar el plan de ejecución y se sigue usando siempre, excepto si vuelve a cambiar algún índice, pero cuando mandas un select directo a la base de datos, esto se hace siempre, imagina que tienes 1000 usuario simultaneos haciendo esto, cada minuto, la diferencia es salvaje, espero te haya ayudado en algo, el tema es bien complejo y muy extenso, pero traté de hacerlo de la mejor manera.
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #20  
Antiguo 23-04-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Gracias. Entonces, ¿lo recomendado es llenar la base de procedimientos almacenados e invocarlos desde la aplicación cliente?

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ventana modal que muestra un diálogo al abrirse (no se ve la ventana) Lord Delfos Varios 2 12-02-2010 04:50:30
Como evitar que se abra la ventana de busqueda, al hacer doble clic sobre un acceso d QuarkBcn Windows 0 24-10-2007 11:28:00
Ventana hija en un marco (Frame o Panel) de la ventana padre birmain Varios 2 14-10-2007 09:27:56
Duda Puntual: Ventana de Busqueda Catálogos Grandes. Paoti OOP 2 20-06-2007 23:32:44
como mostrar una ventana con base al resultado de una busqueda Nelly Varios 3 02-02-2006 18:16:20


La franja horaria es GMT +2. Ahora son las 07:04:08.


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
Copyright 1996-2007 Club Delphi