Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-10-2006
jorllazo jorllazo is offline
Miembro
 
Registrado: sep 2006
Ubicación: Valencia, España
Posts: 83
Poder: 18
jorllazo Va por buen camino
Usar Evento OnAfterSCroll de un TQuery?

Hola Amigos,
Tengo un Query con una consulta que me devuelve ciertos campos de una tabla "Customers" los cuales muestro en una grid, despues tengo un objeto TCustomer con su metodo "LoadFromDatabase" que carga todos los datos del customer en base al IDCustomer que tenga seleccionado en ese momento en el Registro actual del Query.

Para esto en el evento OnAfterScroll del query tengo el codigo que lee el campo IDCustomer del Registro y se lo pasa como parametro al metodo LoadFromDatabase(custID) el cual devuelve el objeto con todas sus propiedades.

El problema viene que esta operacion me he dado cuenta que por ejemplo cuando el query se abre o se ejecuta la sentencia, se puede llegar a realizar 3 Veces, y de momento aun no esta completado objeto con otdas sus propiedades, pero luego puede ser un proceso lento y si se repite tantas veces, no creeis que es inncesario.

La pregunta es si esto se puede poner en algun otro evento o algo asi ya que quiero que me responda cuando haga Query.First, Query.Next etc., he mirado de ponerlo en el codigo del boton que dispara esto eventos pero entonces deberia añadirlo en muchos sitios mas por ejemplo cuando se haga click en la grid principal.

Si se os ocurre algo mejor, si no lo dejare como esta.
__________________
Gracias de Antemano
Responder Con Cita
  #2  
Antiguo 03-10-2006
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
Una pregunta: ¿cuál es el objeto de una operación como LoadFromDatabase? ¿No están ya los datos en el Query?

// Saludos
Responder Con Cita
  #3  
Antiguo 03-10-2006
jorllazo jorllazo is offline
Miembro
 
Registrado: sep 2006
Ubicación: Valencia, España
Posts: 83
Poder: 18
jorllazo Va por buen camino
No,

En el Query, unicamente estan datos como Nombre, Nombre comercial, Nif, Fecha de Alta. (de momento estos 4).

LoadfromDatabase, carga todo tipo de datos relacionados con el cliente, tipo de iva asociados, numeraciones asociadas. descuentos, documentos de venta, informes comerciales asociados, creo que es una gran cantidad de datos sensible de ser modificada en cualquier momento con lo que la informacion que obtuviesemos en el query, estaria desactualizada en cualquier momento, quitado de la gran cantidad de datos que deberiamos tener cargados en memoria en todo momento.

A lo que le estoy dando vueltas desde que escribi el post, es que cargar, todo estos datos cada vez que el usuario se mueva por el registro tampoco va a ser muy eficiente, puesto que si tenemos a 5 usuarios navegando por la tabla de clientes, se llenaria el servidor con continuos accesos. Queza sea mejor opcion un Boton de "Ver Cliente" que ejecutase esta sentencia (load fromDatabase y rellenase los controles con el valor del objeto.?

Es lo que se me ocurrio, si crees que no es eficaz, por favor comentamelo y miramos algo mejor....
__________________
Gracias de Antemano
Responder Con Cita
  #4  
Antiguo 03-10-2006
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
Más o menos imaginaba algo así y creo que tú mismo ya te has contestado. Ni siquiera tienes que considerar el escenario de varios usuarios. Con uno solo que le de por moverse por el grid que muestre los datos, ya tienes un acceso a la base en cada movimiento. El botón de "Ver cliente" es, me parece, la mejor opción: sólo cargas los datos de un cliente cuando el usuario realmente los quiere ver.

// Saludos
Responder Con Cita
  #5  
Antiguo 03-10-2006
jorllazo jorllazo is offline
Miembro
 
Registrado: sep 2006
Ubicación: Valencia, España
Posts: 83
Poder: 18
jorllazo Va por buen camino
No, si al final aprendere.... jeje
muchas gracias y para lo que necesiteis
__________________
Gracias de Antemano
Responder Con Cita
  #6  
Antiguo 03-10-2006
Ade Ade is offline
Miembro
 
Registrado: jul 2006
Ubicación: Murcia
Posts: 70
Poder: 18
Ade Va por buen camino
Hola a todos
jorllazo tu tras realizar la consulta la muestras en un dbgid y alli seleccionas el cliente y luego pulsando el boton ver cliente t aparecen todos los datos , estoy en lo cierto??

si es asi podrias mostrarme tu consulta del query y las opciones que modificaste del dbgrid para poder seleccionar ?
como se cargan los datos tras pulsar el boton de ver cliente??
con un locate sobre el codigo del cliente seleccionado?

es q trato de hacer lo mismo pero para modificar, y en el dbgid me aparece una flechita negra en un registro aleatorio ( eso creo pues ni es el 1º ni el último) y solo puedo seleccionar esa fila, y tengo la opcion dgselectrow a true.

gracias
Responder Con Cita
  #7  
Antiguo 03-10-2006
jorllazo jorllazo is offline
Miembro
 
Registrado: sep 2006
Ubicación: Valencia, España
Posts: 83
Poder: 18
jorllazo Va por buen camino
Smile

Hola,
Efectivamente, tengo un query en el que ejecuto una consulta la cual unicamente me devuelve 4 campos que son los mas significativos para Localizar / Filtrar en la tabla de clientes, luego el Qry lo tengo enlazado mediante un DataSource a la grid. Entonces se ejecuta la carga del Query y se muestran los resultados en la Grid.

Luego tengo una Clase TPerson la cual tiene un metodo de clase que le llama LoadFromDatabase y toma como parametros el ID del Cliente. en este metodo se ejecuta otra consulta a la BD para traer los datos con los que relleno las propiedades del objeto y lo devuelvo. No podria hacer un locate puesto que en el query no tengo mas que 4 Campos, por eso necesito una nueva consulta que me cree una vista con toda la informacion.

Luego simplemente a mano uno las propiedades con su respectivo control.

Tengo tambien una Toolbar con la que me desplazo a traves de los registros mediante las instrucciones
Código Delphi [-]
                   Query.First;
                   Query.Prior;

Del mismo modo para añadir tengo un metodo de clase que se llama
addItem el cual inserta un registro en la tabla y me devuelve un objeto con el cual lleno de nuevo los controles del formulario.

Luego en el codigo que muesrtra el cliente

Código Delphi [-]

   if dsContacts.State = dsBrowse then
    begin
      oP := TPerson.LoadFromDatabase(Query.FieldbyName('PersonID').AsString);
      setDialogControls;
      pcContacts.ActivePageIndex := 1;
    end;


Espero haberte sido de ayuda, si te puedo aclarar algo mas...

Vaya que contento !!!!! mi primera respuesta !!!!!
__________________
Gracias de Antemano

Última edición por jorllazo fecha: 03-10-2006 a las 18:15:06.
Responder Con Cita
  #8  
Antiguo 03-10-2006
Ade Ade is offline
Miembro
 
Registrado: jul 2006
Ubicación: Murcia
Posts: 70
Poder: 18
Ade Va por buen camino
esto ok, a mi tambien me funciona,
[cita]
Efectivamente, tengo un query en el que ejecuto una consulta la cual unicamente me devuelve 4 campos que son los mas significativos para Localizar / Filtrar en la tabla de clientes, luego el Qry lo tengo enlazado mediante un DataSource a la grid. Entonces se ejecuta la carga del Query y se muestran los resultados en la Grid.
[/cita]
Algunas dudas, pues no te entendi muy bien,
Tu query devuelve 4 campos pero cuantos registro? 1 o mas de 1??
si devuelve mas de uno entonces aparecen en el dbgrid, y tu seleccionas una fila y entonces es cuando guardas el ID del Cliente para el Loadfromdatabase?
Aqui te refieres a la propiedad datasource del dbgib??
[cita]
Luego simplemente a mano uno las propiedades con su respectivo control.
[/cita]
Para que sirve Toolbar??
dond pones las instrucciones
Código Delphi [-]
                   Query.First;
                   Query.Prior;
en el dbgid te aparece una flechita negra a la izquierda de algun registro ??

si quieres puedes echar un vistazo al hilo seleccionar fila dbgrid stack overflow, alli expuse mi problema y explico mas detalladamente lo que quiero hacer
Saludos y gracias por tu ayuda
Responder Con Cita
  #9  
Antiguo 03-10-2006
jorllazo jorllazo is offline
Miembro
 
Registrado: sep 2006
Ubicación: Valencia, España
Posts: 83
Poder: 18
jorllazo Va por buen camino
Cita:
Empezado por Ade
Algunas dudas, pues no te entendi muy bien,
Tu query devuelve 4 campos pero cuantos registro? 1 o mas de 1??
si devuelve mas de uno entonces aparecen en el dbgrid, y seleccionas una fila y entonces es cuando guardas el ID del Cliente para el Loadfromdatabase?
Aqui te refieres a la propiedad datasource del dbgib??
La Query devuelve el numero de registros en Base a la Clausula 'WHERE' de la sentencia SQL, de momento los devuelve todos, osea el total de registros de la tabla

Código SQL [-]
         
         SELECT [PersonID], [Name], [TradeName], [NIF]
          FROM [Persons] 
          WHERE isCustomer = 0 
          AND isEmployee = 0
          AND isProvider = 0




De este modo saco de la tabla todos los contactos
si quiero sacar los clientes pongo isCustomer = 1 y omite contactos etc, etc

Esta es la sentencia que le paso al componente TADOQuery, mas concretamente a su propiedad SQL,
y este es el codigo que la usa y devuelve todos los contactos.


Código Delphi [-]
        
             Query1.SQL.Clear;
             Query1.SQL.Add(strSQL);
             Query1.Open;
                 if not (Query1.Bof and Query1.Eof) then          
                         Query1.First; //Si no esta vacio lo muevo al primer registro             
             DataSource1.DataSet := Query1;
             DbGrid1.dataSource := DataSource1;

La propiedad DataSource del DBGrid indica de donde tomara los datos que muestra en su rejilla.



Con esto, si tenias algun registro que cumple la clausula WHERE de tu sentencia deberia verse visible en la grid, a la que previamente yo le añado las columnas necesarias en su propiedad "Columns" en la que indico el titulo de la columna y el nombre del campo al que ira Ligada.

Cita:
Empezado por Ade
en el dbgid te aparece una flechita negra a la izquierda de algun registro ??
La Flechita negra es la que te indicara en que registro estas en ese momento, si no te aparece tienes que cambiar su propiedad dgIndicator = true de su lista de propiedades "Options"

Cita:
Empezado por Ade
Para que sirve Toolbar??
dond pones las instrucciones
El toolBar es la típica barra de herramientas como por ejemplo si levantas la vista veras en el Explorador de Internet (botones que hacen algo) . Si añades botones (los necesarios para cumplir los cometidos de tu formulario) y haces doble click en ellos, tendras un evento en el cual podras colocar codigo como por ejemplo


Código Delphi [-]
      procedure TfrmMain.tbFirstClick(Sender: TObject);
       begin
             Query1.First; //SE desplaza al 1 registro.
       end;




Espero que ahora te haya solucionado algo mas....
__________________
Gracias de Antemano
Responder Con Cita
  #10  
Antiguo 03-10-2006
Ade Ade is offline
Miembro
 
Registrado: jul 2006
Ubicación: Murcia
Posts: 70
Poder: 18
Ade Va por buen camino
ok, mi problema era la flechita negra, tengo su propiedad dgIndicator = true,

solo q yo trataba de seleccionar otra fila distinta,(q no fuera la q llevaba la flechita) con el raton sobre el dbgid directamente ( para ello a lo mejor tendria q hacer uso de algun evento del raton y en el moverme a ese registro, es lo unico que se me ocurre), y tu esto lo haces mediante el toolbar, voy a probar hacerlo como tu y loq se me acaba de ocurrir.

gracias, te mantendre informado
Responder Con Cita
  #11  
Antiguo 04-10-2006
Ade Ade is offline
Miembro
 
Registrado: jul 2006
Ubicación: Murcia
Posts: 70
Poder: 18
Ade Va por buen camino
nada con las instrucciones:
Código Delphi [-]
ZQuery1.First;
ZQuery1.prior;
me sigue dando el derbordamiento de pila ( stack overflow)
Responder Con Cita
  #12  
Antiguo 04-10-2006
Ade Ade is offline
Miembro
 
Registrado: jul 2006
Ubicación: Murcia
Posts: 70
Poder: 18
Ade Va por buen camino
Problema solucionado, algunas veces lo mejor es eliminar los componentes y volver a empezar, pues hice tantas modificaciones para q funcionara que no modifique algo q no debia, pues probé en un proyecto nuevo y funcionaba, asi q empece.

Saludos y gracias
Responder Con Cita
  #13  
Antiguo 04-10-2006
jorllazo jorllazo is offline
Miembro
 
Registrado: sep 2006
Ubicación: Valencia, España
Posts: 83
Poder: 18
jorllazo Va por buen camino
A ti, me alegro de haber podido servir de ayuda
__________________
Gracias de Antemano
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
Hacer una pausa fuera del evento OnTimer y sin usar Sleep DarkByte Varios 9 28-06-2007 04:08:00
Llamar evento desde otro evento nachito_tuc OOP 1 23-08-2006 21:37:43
TQuery nenufer Conexión con bases de datos 2 22-05-2006 16:41:03
Usar o no Usar un DBGrid Anabel Conexión con bases de datos 13 13-01-2006 20:05:21
RequestLive de TQuery no puede, q mas puedo usar? nefy SQL 3 21-06-2004 19:19:19


La franja horaria es GMT +2. Ahora son las 17:41:34.


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