FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
como ejecutar un sql mediante un Button
Buenos dias de antemano agradezco la atencion prestada a este hilo
Tengo un problema yo tengo una base de datos manejada en interbase y uso como lenguaje de programacion Delphi, yo deseo usar un boton para ejecutar una sentencia sql, dado que en una de mis ventanas solo va a ser usada para la adicion de mis productos no se veria bien si utilizo un dbnavigator. El problema radica en que el boton no tiene la propiedad datasource para conectarlo a mi DataModule2.DataSource1... En este caso como hago para ejecutar mi sql?? |
#2
|
|||
|
|||
No hay problema
El botón no tiene por qué tener asociado un datasource. Simplemente ejecuta un procedimiento que a su vez hace lo que necesitas. Por ejemplo:
procedure TForm1.BitBtn1Click(Sender: TObject); begin TuDataModule.Query1.Open; end; Desde luego, es un código elemental, podés hacer que abra una transacción para ejecutar tu SQL, una ventana con componentes diferentes para mostrar los datos... Mil cosas. Dentro del Query1.SQL tenés la sentencia SQL, donde podés pasarle parámetros, qué se yo. Esa es la duda o no entendí bien? |
#3
|
||||
|
||||
Gracias me has sabido ayudar pero tengo un problema:
Código:
procedure TForm4.Button1Click(Sender: TObject); begin DataModule2.IBQuery2.SQL.Text := 'INSERT INTO producto(cod_prod, nom_prod, atr_prod1, atr_prod2, atr_prod3, atr_prod4, atr_prod5) VALUES (:cod_prod, :nom_prod, :atr_prod1, :atr_prod2, :atr_prod3, :atr_prod4, :atr_prod5)'; DataModule2.IBQuery2.ExecSQL; end; el problema radica en que uso una grilla para poder ingresar los datos y esta grilla esta conectada a un datasource que a su vez esta conectada a un Query que como instruccion sql tiene: Código:
select * from producto Como debo conectar la grilla de manera que cuando haga click en el boton automaticamente la grilla me ofrezca una fila en blanco para ingresar los datos??? Espero haberme hecho entender y ojala puedan ustedes ayudarme gracias Última edición por el_barto fecha: 13-06-2005 a las 20:52:43. |
#4
|
||||
|
||||
[quote=el_barto]
Código:
procedure TForm4.Button1Click(Sender: TObject); begin DataModule2.IBQuery2.SQL.Text := 'INSERT INTO producto(cod_prod, nom_prod, atr_prod1, atr_prod2, atr_prod3, atr_prod4, atr_prod5) VALUES (:cod_prod, :nom_prod, :atr_prod1, :atr_prod2, :atr_prod3, :atr_prod4, :atr_prod5)'; DataModule2.IBQuery2.ExecSQL; end; DataModule2.IBQuery2.ParamByName('cod_pro').AsInteger := ?????? Pero no se como pasar el valor que tiene en la grilla en la columna 0, yo se que eso debe ser una tonteria pero recurro a ustedes dado que esa tonteria me quedo grande |
#5
|
||||
|
||||
Intente hacer esto pero esta mal
Código:
DataModule2.IBQuery2.ParamByName('cod_prod').AsInteger := DBGrid1.Columns[0].Value; |
#6
|
|||
|
|||
Cambiate a un IBDataSet
Para usar grillas de ese modo, tendrías que elegir el componente IBDatSet. Tiene para asignarle SQL de consulta, borrado, modificación... Al conectarlo a un Grid, podés hacer las ediciones que quieras en él, y con el método ApplyUpdates los mandás todos juntos al servidor. No te preocupas por lo que hiciste en la grilla, lo que cambió, se actualiza todo junto automáticamente (genera los SQL de inserción, borrado y modificación él sólo, de acuerdo al modelo que le ponés en cada uno). Además te olvidás de las transacciones. Lógicamente, tu botón simplemente ejecuta ese método. Usando Query solamente, estás entrando en complicaciones innecesarias.
Con las opciones por defecto que trae el DBGrid, cuando te vas al final de la tabla y bajás con la flecha uno más, aparece un registro en blanco para editar, y escribir lo que quieras. Hay bastante material en este foro y en la web sobre cómo se usa ese componente. Vale la pena verlo. Un vínculo muy claro de cómo usar un dbgrid con un IBDataset está aquí: http://www.firebird.com.mx/modules/s...rticle&artid=7 Saludos. Última edición por axelbb fecha: 14-06-2005 a las 16:15:53. Razón: Agregar enlace relacionado al tema |
#7
|
||||
|
||||
Es que no deseo conectar la grilla a la base de datos directamente quiero es que la grilla sea un medio para pedir los datos y despues solo usar un boton que haga el query.
Por lo que he detallado si tu insertas datos o eliminas datos ( "solo por nombrar estas dos acciones" ) directamente sobre la tabla es un error grave, hay que suponer siempre que el usuario no tiene el nivel de habilidad que nosotros para manejar el aplicativo, por ejemplo: 1. Que tal que el usuario haya ingresado 10 registros y se de cuenta que estan mal no por error del programa si no por error del usuario y precisamente esta trabajando sobre la tabla, ummmm deberia cancelar la accion de ingresar datos peroooo ¡Mier....! estaba trabajando directamente sobre la base de datos nada que hacer ya inserto los registros. 2. Peor aun, que tal que el usuario este eliminando registros y elimine uno que nunca debio ser borrado deberia cancelar la accion hecha ¡H....p.....! nada que hacer lo borro directamente sobre la base. Y el usuario cada vez que tenga estos problemas puede llorar por que cada accion que ejecute es un camino sin retorno Ese es mi punto que cada accion que se haga no sea ejecutada sobre la base de datos si no en una grilla y despues cuando este seguro haga click en el boton Aceptar y este sea el encargado de ejecutar de ejecutar el IBQuery |
#8
|
|||
|
|||
Es que precisamente...!!!!
Precisamente!!, si trabajas del modo que te explico, TODO EL TRABAJO DEL USUARIO será en memoria Y NO directamente en el servidor. Puede mandarse todas las cagadas que quiera... hasta apretar el botoncito que confirme los cambios:
procedure TForm1.Button1.Click(Sender: TObject); Begin // Pedir Mensaje de confirmacion antes de lo que sigue, obviamente!!! DataModule1.IBDataSet1.ApplyUpdates; end; Y después de esto, sí, a llorar al campito!! Pero si no, no se graba nada, aunque lo veas en el grid. Si desea descartar TODO lo que hizo después de la última ApplyUpdates, podés poner un botón que ejecute un: IBDataSet1.CancelUpdates y un IBDataSet1.Refresh y vuelve a estar como al principio. Es que nunca trabajó directamente sobre las tablas, sino en la caché local de su PC, mediante las sorprendentes posibilidades del componente DataSet. Probalo, lee el artículo que te sugerí antes. Suerte. |
#9
|
||||
|
||||
Lo voy aprobar y te cuento, Pero mientras me respondias no me quede con las manos cruzadas trabaje con el commit del IBTransaction, entonces coloque un boton que dice Aceptar y cuando lo presione hace un commit y otro boton que dice Cancelar y tambien cuando lo presione hace un rollback.
Pero sabes cual es el problema que me tiene a punto de mandar a la mier..... esta base?, es que manejo un boton que cuando se oprima funcione como el "+" del DBNavigator, ... es decir que cuando se presione se aliste para insertar y a la grilla se le agregue una fila en blanco lista para recibir datos.... Eso si es una mamera hacerlo y francamente ese puñetero Grid me tiene Loco si me podes ayudar con eso te lo agradecere por la eternidad |
#10
|
||||
|
||||
Ufffffffffffff ya lo logre gracias amigos lo unico que hice fue convinar tu respuesta con mi solucion y funciona al pelo es decir primero hago un ApplyUpdate y luego commit jejejeje Gracias
Y para la maldita grilla use: Código:
procedure TForm4.Button3Click(Sender: TObject); begin DataModule2.IBDataSet1.Last; // para que inserte despues del ultimoregistro DataModule2.IBDataSet1.Insert; // inserta end; Gracias amigos. |
#11
|
||||
|
||||
Append mejor este codigo
Código:
procedure TForm4.Button3Click(Sender: TObject); begin DataModule2.IBDataSet1.Last; // para que inserte despues del ultimoregistro DataModule2.IBDataSet1.Insert; // inserta end; Código:
DataModule2.IBDataSet1.Append; Gracias a Todos |
|
|
|