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 13-06-2005
Avatar de el_barto
el_barto el_barto is offline
Miembro
 
Registrado: may 2005
Ubicación: Bogota Colombia
Posts: 533
Poder: 19
el_barto Va por buen camino
Post 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??
Responder Con Cita
  #2  
Antiguo 13-06-2005
axelbb axelbb is offline
Miembro
 
Registrado: oct 2004
Posts: 127
Poder: 20
axelbb Va por buen camino
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?
Responder Con Cita
  #3  
Antiguo 13-06-2005
Avatar de el_barto
el_barto el_barto is offline
Miembro
 
Registrado: may 2005
Ubicación: Bogota Colombia
Posts: 533
Poder: 19
el_barto Va por buen camino
Post

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;
este es el codigo usado para insertar nuevos productos a mi base y se ejecuta cuando hago click sobre el boton

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
pero cuando hago click en el boton me saca error diciendo que el valor cod_prod es NULO y pues por supuesto que es nulo por que no he podido ingresar los datos por que la grilla no me da una fila en blanco para insertar datos....
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.
Responder Con Cita
  #4  
Antiguo 13-06-2005
Avatar de el_barto
el_barto el_barto is offline
Miembro
 
Registrado: may 2005
Ubicación: Bogota Colombia
Posts: 533
Poder: 19
el_barto Va por buen camino
Post

[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;
necesito que lo que yo escriba en una grilla me lo copie a la base de datos mediante un query pero no se como solo llegue hasta aqui:

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
Responder Con Cita
  #5  
Antiguo 13-06-2005
Avatar de el_barto
el_barto el_barto is offline
Miembro
 
Registrado: may 2005
Ubicación: Bogota Colombia
Posts: 533
Poder: 19
el_barto Va por buen camino
Intente hacer esto pero esta mal

Código:
DataModule2.IBQuery2.ParamByName('cod_prod').AsInteger := DBGrid1.Columns[0].Value;
solo por esto estoy barado les agradezco
Responder Con Cita
  #6  
Antiguo 14-06-2005
axelbb axelbb is offline
Miembro
 
Registrado: oct 2004
Posts: 127
Poder: 20
axelbb Va por buen camino
Exclamation 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
Responder Con Cita
  #7  
Antiguo 14-06-2005
Avatar de el_barto
el_barto el_barto is offline
Miembro
 
Registrado: may 2005
Ubicación: Bogota Colombia
Posts: 533
Poder: 19
el_barto Va por buen camino
Post

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
Responder Con Cita
  #8  
Antiguo 14-06-2005
axelbb axelbb is offline
Miembro
 
Registrado: oct 2004
Posts: 127
Poder: 20
axelbb Va por buen camino
Wink 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.
Responder Con Cita
  #9  
Antiguo 14-06-2005
Avatar de el_barto
el_barto el_barto is offline
Miembro
 
Registrado: may 2005
Ubicación: Bogota Colombia
Posts: 533
Poder: 19
el_barto Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 14-06-2005
Avatar de el_barto
el_barto el_barto is offline
Miembro
 
Registrado: may 2005
Ubicación: Bogota Colombia
Posts: 533
Poder: 19
el_barto Va por buen camino
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;
uff ya quiero nuevamente a delphi hace 20 minutos lo odiaba con todas mis fuerzas.
Gracias amigos.
Responder Con Cita
  #11  
Antiguo 15-06-2005
Avatar de el_barto
el_barto el_barto is offline
Miembro
 
Registrado: may 2005
Ubicación: Bogota Colombia
Posts: 533
Poder: 19
el_barto Va por buen camino
Talking 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;
el codigo anterior es deficiente es mejor manejar algo mas sencillo como

Código:
DataModule2.IBDataSet1.Append;
Aqui inserta despues del ultimo registro y no antes del ultimo como pasaba en el codigo anterior

Gracias a Todos
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


La franja horaria es GMT +2. Ahora son las 11:12:35.


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