Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-01-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
Smile Actualizar AdoQuery

Hola amigos....
todo el tiempo que tengo programando con delphi, pues jamas e usado ADO porque siempre use o BDE (muy poco) o componentes de Terceros (corelab)..
bien tengo una aplicacion que usa corelab en la que hay consultas que acceden a datos de dos o mas tablas por la via de Join Etc....
Dicha consulta la muestro en un form y edito en tiempo de ejecucion una columna en particular las otras son de solo lectura, pues bien esa columna en cuestion en realidad pertenece a una sola tabla de las 3 o mas enlazadas y con Los componentes corelab se usa un componente aparte (UpdateSql) que permite definir las reglas de actualizacion de la tabla en base a la consulta y campos clave, a tal fin usa un codigo como este

Código Delphi [-]
UPDATE Semestre
SET
  campo = :campo
WHERE
    Campo2 = :Old_campo2 AND
    Campo3 = :Old_Campo3 AND
    Campo4 = :Old_Campo4 AND

asi pues es de lo mas facil ya que incluso te proporciona un asistente si no quieres teclear la anterior declaracion....

Pues bien en ADO no funciona asi la cosa no existe este componente (creo que es el ado command) y mucho menos se en que punto colocar la instruccion anterior para que me actualize la columna de la tabla correspondiente de una consulta que enlaza varias tablas ......

espero haberme explicado y si tienen otra propuesta de como hacer esto pues en eso estoy porque preguntando se aprende mas rapido ......

Gracias por adelantado ....
Responder Con Cita
  #2  
Antiguo 07-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Pues me parece que es igual en ado.
Usando un adoquery:
Código Delphi [-]
Adoquery1.sql.text:= 'UPDATE Semestre SET campo = :campo'+
                     'WHERE  Campo2 = :Old_campo2 AND'+
                     'Campo3 = :Old_Campo3 AND'+
                     'Campo4 = :Old_Campo4 ';
Adoquery1.ExecSQL;
No se, digo yo.
Saludos
Responder Con Cita
  #3  
Antiguo 07-01-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
No me explique bien ....

Claro Caral, la instruccion Sql es asi de simple...
el problema es donde la coloco... vuelvo con el ejemplo anterior..

con Bde colocas un componente Query que contiene la instruccion sql que te devuelve el conjunto de datos en cuestion ...este conjunto lo muestras en un grid.... y
accedes a una de sus columnas para modificarla, asi como asi te desplazas a la fila siguiente y el componente guarda lo anteriormente modificado ...

ahora bien yo no hice edit ... post ....no

solo coloque el anterior query, un componente UpdateSql que contiene la instruccion de Actualizacion anteriormente descrita por mi y por Caral con la salvedad que el QUERY contiene una propiedad que permite enlazar aL Objeto que hara el Update ... no se si se entiende por eso coloco el codigo ....


Código Delphi [-]
query1.sql.text:=('SELECT  campo1,campo2 from tabla1 INNER JOIN tabla2 On 
tabla1.id=tabla2.id INNER JOIN Tabla3 on Tabla1.id=tabla3.id');

UpdateSql1.sql.text:=('UPDATE Semestre SET campo = :campo'+
                     'WHERE  Campo2 = :Old_campo2 AND'+
                     'Campo3 = :Old_Campo3 AND'+
                     'Campo4 = :Old_Campo4 ');

// aca enlazo los componentes ....

Query1.UpdateObject:=UpdateSql1;
ahora bien que me permite esto pues no tener que estar tecleando el ExecSql ya que los objetos estan configurados ya para entender que al modificar la columna ejecuta la instruccion de Actualizacion y no tengo yo que hacer nada de codigo en ningun evento OnAfterPost ni nada por el estilo ....

pues asi se hace con Corelab y con BDE ahora bien como se hace esto con Ado ... esa es mi pregunta .....

P.D.... Tengo la impresion que la respuesta esta justo frente a mi nariz pero en mi inmenza torpeza no doy con ella

...Gracias ......
Responder Con Cita
  #4  
Antiguo 07-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Ado no tinen un Updatesql, ese componente no lo trae, no se por que?.
Bueno, uso ADO y nunca he necesitado del componente updatesql, suena practico incluso IB lo trae, pero ado no.
Entiendo la sentencia sql, lo que no se es si sera mas practico o no, por lo menos a mi nunca me ha hecho falta.
Saludos
Responder Con Cita
  #5  
Antiguo 08-01-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
Hola Caral

Que tal ....

se que eres un usuario entusiasta asi que te propongo algo .... haz una consulta que enlace 3 o mas tablas por medio de joins ...luego coloca ese conjunto de datos resultante en un Grid, y luego intenta modificar un valor cualquiera .... seguro te saldra un error que dice ... "informacion insuficiente para actualizar o insertar registro" (o algo asi palabras mas palabras menos)

Si a ti te funciona y a mi no pues me cortare las venas o ire a meditar al tibet ..

En todo caso creeme que el componente UpdateSql es util y te permite librarte de codigo que al fin y al cabo es lo que buscamos evitar (mas codigo del estrictamente necesario)

en todo caso lo que planteo es como simular este componente (usando codigo claro) y donde poner dicho codigo para que permita la actualizacion "trasparente"

en todo caso un query que va a solo una tabla su actualizacion es directa y sin problemas pero cuando es mas de una tabla pues claro que no sabe ni que tabla ni que columna actualizar, alli entra un codigo que lo haga (un update comun y corriente) en todo caso donde poner ese codigo .....

Gracias Caral por tus Respuestas .....
Responder Con Cita
  #6  
Antiguo 08-01-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
En todo caso

Si dices que nunca lo has utilizado, (el componente UpdateSql) pero que tampoco lo has necesitado entonces como haces un update sobre un query como el anteriormente descrito .....

Gracias .....
Gracias ....
Gracias ...
Gracias ..
Gracias .
Responder Con Cita
  #7  
Antiguo 08-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola Kenobi

Cita:
Empezado por Kenobi Ver Mensaje
Que tal ....

se que eres un usuario entusiasta asi que te propongo algo .... haz una consulta que enlace 3 o mas tablas por medio de joins ...luego coloca ese conjunto de datos resultante en un Grid, y luego intenta modificar un valor cualquiera .... seguro te saldra un error que dice ... "informacion insuficiente para actualizar o insertar registro" (o algo asi palabras mas palabras menos)

Si a ti te funciona y a mi no pues me cortare las venas o ire a meditar al tibet ..
Creo que estas un poco equivocado con migo, no soy entusiasta SOY NOVATO, MUY NOVATO.

Muy seguramente me equivoco y me equivoco mucho, eso si, tratando de ayudar.
Lo que si puedo decir, de lo poco que he aprendido es que en delphi se puede hacer casi todo y que hay muchas maneras de matar pulgas.

Hacer una consulta con un inner Join a tres tablas, sin usar las claves principales y todavia querer actualizarla, no es muy inteligente, mas bien diria que es absurdo, recuerda, me puedo equivocar.
Hacer una consulta a diez tablas, con lo que sea y luego hacer una actualizacion de los datos segun sea necesario me parece mas viable ademas de mas claro, insisto, no me hagas caso, seguro me equivoco tambien.
En mi ventiunico programa en la parte de Facturacion, consulto 5 tablas y actualizo todo en un botoncito, como, muy sencillo, no se, seguro me salio de casualidad pero funciona.
Si le tienes tanta mania a ADO por que insistes en usarlo, sigue con BDE, no?
El Tibet en esta fecha esta muy frio, te recomiendo unas vacaciones en Jamaica, te sentaran mejor.
Saludos
Responder Con Cita
  #8  
Antiguo 08-01-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
Jamaica no estaria mal....

Jajajaja .... sin duda mejor Jamaica que el tibet, sin embargo aclaro algo, no uso Bde uso unos que funcionan como estos de la empresa Corelab, la referencia a estos es porque se que la mayoria conoce mas Bde que los de Corelab, y porque no seguir con estos si son tan buenos, pues facil, son de pago y no son economicos, por otro lado Ado viene con delphi (cosa de no comprar mas) y debo aprender a usarlo porque no siempre voy a programar frente a mi pc(eventualmente tendre que hacer algo y uff se me quedaron los fuentes de Corelab, que desastre),

ahora bien me llama la atencion lo de no inteligente de un query que al que se le puede actualizar una columna, si fuera asi no existiria este componente (updateSql) en corelab, bde, e incluso ibx, no crees...?
porque si a ver vamos los lookupcombobox si que hacen lentas las aplicaciones y aun asi muchos los usan porque son super practicos y utiles (sin mencionar que no requieren de codigo especial, que complique las aplicaciones a futuro)

si pudiera te enviaria la aplicacion para que veas que rapido va (aun con dicha actualizacion poco inteligente), pero no puedo porque pertenece a una organizacion y claro no puedo mostrar esos datos.

Pero creeme que funciona bien, claro que tomo en cuenta tus comentario e investigare en consecuencia....

Gracias ....


P.D. por cierto estoy seguro que soy mas novato que tu .... Jejejejej.....
Responder Con Cita
  #9  
Antiguo 08-01-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
Muchas Formas de Matar pulgas....

Tienes razon, en cuanto a la metodologias de exterminio de insectos...

por tal razon voy a colocar(segun se me ocurran) distintos metodos para hacer lo que quiero ....

aca va el primero ...

el problema fundamental es que el dbgrid enlazado al query no permite la modificacion por faltar informacion para update o insert ...

bien pero que tal si en vez de llenar el Dbgrid con la consulta la lleno con un ClientDataSet previamente enlazado a la consulta en cuestion ...

voila .... asi si que se deja y luego pues con un boton(o lo que sea) recorro los campos de ClientDataSet modificados haciendo el update ya antes mensionado sobre la tabla en cuestion ....

ya lo hice y si funciona, pero ....

mi humilde opinion, si bien es cierto que es poco codigo, si son muchos componentes mas(2 en total por cada consulta a actualizar) y esa no creo que sea la idea ....

se se te ocurre otra idea ....dimela estoy abierto a comentarios .....

P.D : por cierto estoy haciendo la actualizacion del clientdataset hacia la tabla recorriendo dicho componente...

Código Delphi [-]
while not Clientdataset.eof do
Begin
// sentencia update....
clientdataset.next;
end;

digamos que de forma secuencial ... pregunto no existe un metodo mas directo asi como asigno del query al clientdataset , pues en sentido contrario(del clientdataset al query )

Inquietudes mias nada mas .....

Gracias ....
Responder Con Cita
  #10  
Antiguo 08-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Te voy a decir como lo hago, no debe ser la mejor manera, pero funciona.
Uso un query para llenar la informacion (puede ser en un dbgrid u otro), este query hace la consulta de las tablas que necesite, no importa que capos consulte, claves etc, osea una consulta de lo que necesite en ese momento.
Coloco otro query, normalmente lo llamo temporal.
Este ultimo query es el que me actualiza las tablas, una por una.
Puede ser engorroso, pero me sirve para darme cuenta de un vistazo, que actualizo y como.
Entonces en conclusion dos querys uno consulta otro actualiza, es lo mismo que utilizar un query para consulta y un sqlupdate para actualizar, son los mismos dos componenes, eso si, es mas codigo, pero al fin y al cabo es una rato mas, nada mas.
Saludos
Responder Con Cita
  #11  
Antiguo 08-01-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
Hola Caral

Claro que funciona tu metodo de hecho yo alguna que otra vez lo hice asi....
Pero la raiz de lo que estoy planteando es la siguiente no es la instruccion de llenado del conjunto de datos, tampoco es la instruccion update(ni siquiera es como simular las variables Old al puro estilo de los triggers) ...

el problema es que el conjunto de datos del query en cuestion se muestra en un grid y la idea es que el usuario por facilidad, llene una de las columnas de dicho grid ....

claro al query ser de varias tablas el post no sabe a donde ir a cual tabla y cual columna,

te pongo un ejemplo (se me acaba de ocurrir) de lo que quiero decir

imaginate una aplicacion que sirva para registrar las notas obtenidas de un grupo de alumnos de una academia ...
pues la consulta iria minimo a la tabla ALUMNOS,ASIGNATURAS,CURSO

siendo la tabla curso la que tiene la clave principal para el alumno la asignatura la seccion y por supuesto la columna a actualizar la NOTA ...

pues por facilidad al usuario le conviene ver un grid con el grupo de alumnos de la asignatura X de la seccion Y y asi vaciar estas notas, y como pues facil

cuando ya la consulta esta cargada en el grid pues te vas a la columna nota escribes la nota, luego cursor abajo y nota siguiente y asi .....

vez... al final pues el Profesor asigno las notas correspondientes

sin embargo cuando haces esto el sistema al intentar salir de la primera celda modificada te lanza este error informacion insuficiente para actualizar o agregar fila .....

con Corelab tu asignabas el comortamiento de modificacion por medio del contro UpdateSql que permitia instrucciones de modificacion insercion o borrado sobre la tabla a la que referencia el query principal cosa de actuar en consecuencia ....

Gracias Caral .....

P.D : por cierto donde estan todos los demas, hace un tiempo tengo la impresion de que este foro se esta quedando sin gente, se fueron por otro lenguaje o que si es asi digan cual para ver si los seguimos .....
Responder Con Cita
  #12  
Antiguo 09-01-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
Unhappy Mas nadie ....?

Responder Con Cita
  #13  
Antiguo 09-01-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por Kenobi Ver Mensaje
Que no es un asunto entre Caral y tu?????

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #14  
Antiguo 09-01-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
Smile Nada que ver ....

Hola a todos, no señor nada que ver que es con Caral la cosa, solo que el es el unico que me a dicho algo de algo (lo cual agradezco infinitamente) pero no es a donde quiero llegar ....

lo que quiero es hacer algo que simule el UpdateSql pero con Ado , como ya dije lo hice usando tablas(clientDataSet) y luego aplico en un evento(boton) la sentencias en un ado commnand de actualizacion de datos a la tabla correspondiente...

Pero eso implica usar no solo el adocommand sino tambien el DataProvider y el clientDataset ....

Gracias ...

Vamos alguien animese y digame algo ....
Responder Con Cita
  #15  
Antiguo 14-01-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
Question Otra forma de preguntar ....

Pues nadie me dice nada asi que insisto, el ADoquery me lanza un error cuando intento actulizar un registro, bien la idea es interceptar ese error y en alguna parte colocar el codigo de actualizacion de un AdoCommand,

la pregunta es Donde intercepto el error y Donde coloco el Codigo de Update (adocommand)

Please......
Please ...
please ..
Responder Con Cita
  #16  
Antiguo 14-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Yo no he trabajado con ADO, por eso mismo no he dejado ningun mensaje en este hilo, aunque lo he visitado mucho. Puede me equivoque en las siguientes afirmaciones.

Según veo, has llegado al límite de ADO. Quiero decir, estás intentando hacer algo para lo que ADO no está preparado, así que lo más fácil es:
- Cambiar de componentes. Igual no es viable.
- hacer las cosas como ADO espera, si para ello necesitas un ClientDataset y otra parafernalia... pues ajo y agua. Como sugerencia, crea un frame que ya tenga todos esos componentes y te quite trabajo en la repetición de código.

En cuanto a la nueva pregunta, espero que los ADO tengan un evento OnPostError, lugar donde podrás capturar el error y actuar en consecuencia, pero vamos, no es lo óptimo hacer saltar un error sabiendo que siempre ocurrirá para después parchearlo.

Otra opción es usar el evento BeforePost, allí siempre harías lo mismo:
- capturar los nuevos valores que el usuario ha editado.
- Cancelar el guardado (Dataset.Cancel);
- Ejecutar tu AdoCommand.
- Hacer un refresh del registro.

Quizás lo más complejo de todo, pero "más eficiente", sea usar un StringGrid, o un control no enlazado a datos, de esa forma tendrás total libertad para moverte entre columnas del StringGrid y hacer las actualizaciones. Ésto por supuesto, necesitará mucho más código delphi.

El no tener claves primarias, es un error grave de diseño.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #17  
Antiguo 15-01-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
en cuanto a lo de las claves primarias

Pues la verdad la bd no la diseñe yo, solo estaba alli con un sistema ya existente, por esa razon no debo hacer grandes cambios porque se afecta el sistema en cuestion, ahora bien lo de las claves primarias no lo entiendo bien (digo el porque del la referencia a ellas y su relacion con lo de ADo)
en efecto existen columnas que uso como clave, (aquellas por medio de las cuales hago el join),ademas dentro de las tablas estan definidos indices sobre una o varias columnas bien sea el caso .....

De verdad no entiendo esta parte, ya fue referenciada por Caral y ahora por Lepe... no me queda mas que rendirme y aceptar que algo estoy haciendo mal (por ignorancia claro esta), en todo caso les pido ayuda....


P.D ... con todo respeto Lepe no creo que sea posible que Esto no se pueda con ADo, es algo muy util y dudo que a los diseñadores de esa tecnologia se les pasara sobre todo habiendo antecedentes (sqlUpdate de Bde), estoy seguro que alguien sabe como hacerlo lo que pasa es que esta de vacaciones del Foro
tu opcion en el BeforePost ya la intente pero con otro orden en las sentencias voy a probar asi como dices ....

Gracias amigos
Responder Con Cita
  #18  
Antiguo 15-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por Kenobi Ver Mensaje
P.D ... con todo respeto Lepe no creo que sea posible que Esto no se pueda con ADo, es algo muy util y dudo que a los diseñadores de esa tecnologia se les pasara sobre todo habiendo antecedentes (sqlUpdate de Bde),
Yo ni siquiera le he echado un vistazo a la paleta ADO, pero de tus afirmaciones deduje que en dicha paleta no existe un componente sqlUpdate. Si no existe, ajo y agua. O bien en ADO se hace de otra forma y estamos obsecados con el sqlUpdate .

Saludos y Suerte
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #19  
Antiguo 15-01-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
Eso creo yo

sinceramente creo que si se puede pero de otra forma, no puedo creer que algo que ya estaba en Bde sea eliminado en Ado sin dejar la alternativa para hacer, y fijate que Bde, Idb, corelab usan SqlUpdate, porque, pues porque es facil de usar y te permite actualizar consultas "complejas", incluso vistas, por eso no creo que se pierda esta funcionalidad...

es mi humilde opinion...

sin duda por alli debe andar un especialista en Ado y en eso estoy esperando a que diga algo

Please ...

P.D ... por cierto lepe dices que no usar Ado y entonces que usas ....?
solo por curiosidad....
Responder Con Cita
  #20  
Antiguo 15-01-2008
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
Bueno hay otra alternativa para el updateSQL, es mas trabajosa pero bueno:
se llama:
"Campos Lookup"
el procedimiento a grandes rasgos es:
Adoquery con consulta principal (la que se va a actualizar)
Adoquery - los que necesites para ligar mas tablas
ligas los adoquery por medio de la propiedad datasource del adoquery (necesitas datasources ligado al adoquery principal)
despues boton derecho en el adoquery principal, fieldsEditor, agregas los campos y creas unos nuevos que sean del tipo lookup para que muestres todos los campos en el grid y listo!
esto es a grandes rasgos, la ayuda viene muy bien explicado aunque en partes separadas
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
MaxRecord de adoquery Rako Conexión con bases de datos 2 09-07-2007 15:28:24
ADOQuery silviodp Conexión con bases de datos 15 13-12-2006 17:45:34
concatenar en un adoquery crack_neon Conexión con bases de datos 2 04-05-2006 21:57:24
Duda con AdoQuery Telemaco Conexión con bases de datos 1 26-04-2004 11:27:54
AdoQuery davidgaldo Conexión con bases de datos 1 05-02-2004 20:07:29


La franja horaria es GMT +2. Ahora son las 19:23:48.


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