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 21-07-2012
disturbednoise disturbednoise is offline
Registrado
NULL
 
Registrado: may 2012
Posts: 7
Poder: 0
disturbednoise Va por buen camino
Unhappy Agregar datos en grid llenado con dataset

Hola a todos, espero y poder explicar de la mejor manera mi problema:

Cuento con un TADOStored Proc ligado a un DataSource para regresar datos y mostrarlos en una forma delphi usando un boton de la siguiente manera:

Código Delphi [-]
procedure TmoduloVentasW.agregarProducto(Sender: TObject);
begin
           
            dm.spAgregarArt.ProcedureName:='consultaArticuloVentaEx';
            dm.spAgregarArt.Parameters.Refresh;
               if codigoProducto.Text='' then
               begin
               showmessage('Es necesario agregar un código de producto');
               exit;
               end
               else
                dm.spAgregarArt.Parameters.ParamByName('@idArticulo').Value:= codigoProducto.Text;
                dm.spAgregarArt.Parameters.ParamByName('@articuloV').Value:= NULL;
                dm.spAgregarArt.ExecProc;
                valorVA:= dm.spAgregarArt.Parameters.ParamByName('@articuloV').value;

                if  (valorVA = 0)  then
                begin
                  showmessage('El artículo ingresado no existe');
                  codigoProducto.Text:='';
                  exit;

                end;
              if (valorVA = 1) then

                  //Aqui refresco y cambio los valores para asignar otro nombre de procedimiento almacenado al mismo TADOStored Proc
                     
                  dm.spAgregarArt.ProcedureName:='consultaArticuloVenta';
                  dm.spAgregarArt.Parameters.Refresh;
                  dm.spAgregarArt.Parameters.ParamByName('@idArticulo').Value:= codigoProducto.Text;
                  dm.spAgregarArt.Open;
          

end;

Funciona el código al presionar el boton una vez y me pasa los datos de la consulta, que es un "select" a un grid, pero al volver a dar click al botón me muestra el siguiente mensaje: spAgregarArt Cannot perform this operation on an open data set

Y era de esperarse, ya que deje el dm.spAgregarArt.Open, pero mi duda es si puedo recorrer ese data set y volver a usarlo para agregar otro elemento a mi grid o de que manera hacerlo?, para que al dar click cuantas veces desee, se me agreguen datos al grid usando la consulta y el stored procedure

Espero y puedan ayudarme, muchas gracias!!

Última edición por Casimiro Notevi fecha: 21-07-2012 a las 00:40:51.
Responder Con Cita
  #2  
Antiguo 21-07-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
Lo que no entiendo, en principio, es para qué haces una consulta si lo que quieres es agregar registros.
Responder Con Cita
  #3  
Antiguo 21-07-2012
disturbednoise disturbednoise is offline
Registrado
NULL
 
Registrado: may 2012
Posts: 7
Poder: 0
disturbednoise Va por buen camino
Red face Respuesta

Buen dia

El programa que estoy intentando desarrollar es sobre facturacion.

Cuento con un TextEdit que al momento de poner por ejemplo un ID de algún articulo y dar click en el botón llamado "agregar" en el evento onclick llamado "agregarProducto", quiero que se llene un grid con los datos del articulo, por ejemplo, descripción, precio, cantidad, etc. Para realizar una venta.

Si por ejemplo pusiera un nuevo ID, entonces desearía que mi grid se llenara con el nuevo articulo, sin borrar el anterior y así sucesivamente

El primer stored procedure llamado "consultaArticuloVentaEx" la realizo para comprobar si existe el ID en la base de datos, sino solamente regreso algun valor que me indica que no existe el articulo y muestro un mensaje.

El segundo stored procedure llamado "consultaArticuloVenta", lo mando llamar en caso de que si exista un ID válido y dejo el dm.spAgregarArt.Open; que en este caso si me llenaria mi grid con los datos correspondientes, saludos!
Responder Con Cita
  #4  
Antiguo 22-07-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola disturbednoise.

Si no entiendo mal lo que estas buscando, un modo de hacerlo podría ser:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  DataSet.Open;
  StringGrid1.FixedCols:= 0;
  StringGrid1.FixedRows:= 1; // fila reservada para título
  StringGrid1.ColCount:= DataSet.FieldCount; // tantas columnas como campos
  // poner el nombre de campo como título de cada columna
  for i:= 0 to DataSet.FieldCount-1 do
    StringGrid1.Cells[i, 0]:= DataSet.Fields[i].DisplayLabel;
end;

procedure TForm1.btnAgregarClick(Sender: TObject);
var
  i: Integer;
begin
  // Si el dato ingresado existe, pasar campos al StringGrid
  if DataSet.Locate('NOMBRE_DEL_CAMPO_BUSCADO', Edit1.Text, []) then
  begin
    for i:= 0 to DataSet.FieldCount-1 do
      StringGrid1.Cells[i, StringGrid1.Row]:= DataSet.Fields[i].AsString;
    StringGrid1.Row:= StringGrid1.Row + 1; // nuevo dato
  end
  else  // si no existe mostrar error
    MessageBox(Handle, 'Artículo inexistente', '', MB_ICONERROR + MB_OK)
end;
...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 22-07-2012 a las 23:20:44. Razón: agregar comentario
Responder Con Cita
  #5  
Antiguo 31-07-2012
disturbednoise disturbednoise is offline
Registrado
NULL
 
Registrado: may 2012
Posts: 7
Poder: 0
disturbednoise Va por buen camino
Hola ecfisa

Gracias por tu respuesta, lo que entendí de tu solución es por ejemplo traer dentro del dataset al crear la forma todos los datos de la tabla y hacer una búsqueda en el data set por el dato ingresado en mi text edit, si por ejemplo mi tabla va creciendo demasiado no existiría alguna manera de contar con dos data set o una tabla temporal en el que pueda ir abriendo y cerrando un data set, para hacer las llamadas a mi stored procedure pero al mismo tiempo ir grabando los datos a una tabla temporal para de ahí colgarlos al grid?

Disculpa la tardanza en contestar, pero me encontraba fuera de la ciudad, saludos!
Responder Con Cita
  #6  
Antiguo 01-08-2012
disturbednoise disturbednoise is offline
Registrado
NULL
 
Registrado: may 2012
Posts: 7
Poder: 0
disturbednoise Va por buen camino
Mas concretamente lo que quiero hacer es un grid que contenga los detalles de Factura o de alguna venta.

Lo llevo a cabo con un datasource y de ahi ligado a mi grid agrego el resultado de la busqueda de un articulo, pero no puedo agregar varios articulos al grid, ya que al querer usar de nuevo el datasource, me dice que esta abierto, si lo cierro entonces mi grid se queda en blanco, espero y me explique un poco mejor, gracias!!
Responder Con Cita
  #7  
Antiguo 01-08-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
Creo que estás algo confundido, un dbgrid es un "visor" de un dataset. Cualquier dataset, lo asocias a un datasource y este mismo datasource lo asocias a un dbgrid... y voilá, ya aparece en el dbgrid los datos que tiene el dataset.
Lo que tenga el dataset es lo que aparecerá, se mostrará, se visualizará... en el dbgrid.
Responder Con Cita
  #8  
Antiguo 01-08-2012
disturbednoise disturbednoise is offline
Registrado
NULL
 
Registrado: may 2012
Posts: 7
Poder: 0
disturbednoise Va por buen camino
Red face

Esta parte que comentas ya me quedó mas clara, pero por ejemplo si quiero agregar el resultado de varias consultas a mi grid haciendo uso del mismo dataset seria con el ejemplo que me pusiste arriba o de que manera?

Porque tengo entendido que realizo una consulta, cuento con mi data set, lo asocio al data source y de ahi al grid y veo el resultado, pero lo que quisiera es dejar en el grid el resultado y volver a usar el data set con otra consulta para llenar el grid con mas resultados, hay alguna manera de hacer eso?, saludos y muchas gracias por todo enserio
Responder Con Cita
  #9  
Antiguo 01-08-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola disturbednoise.

¿ Que componente estas usando para la inserción y cuál para la consulta o utilizas el mismo para ambas cosas ?

Pareciera que estas utilizando ADO, pero ¿ Podrías especificar exáctamente el nombre de los componentes ?

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 01-08-2012
disturbednoise disturbednoise is offline
Registrado
NULL
 
Registrado: may 2012
Posts: 7
Poder: 0
disturbednoise Va por buen camino
Si utilizo los componentes Ado

Mira para en mi TDataSource tengo mi DataSet con un TAdoStoredProc para realizar la consulta

y un TcxGrid asociado a mi datasource, gracias..
Responder Con Cita
  #11  
Antiguo 01-08-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

¿ Has probado haciendo un Refresh al finalizar la ejecució del ADOStoredProc ? ( ADODataSet.Refresh; )

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 01-08-2012 a las 19:23:03. Razón: quitar ícono del texto
Responder Con Cita
  #12  
Antiguo 01-08-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
Yo creo que el compañero lo que quiere hacer es llenar los itemes de una venta y, claro quiere ir viendo los artículos ue se añaden en una rejilla. ¿No es así?

Pero entonces tiene que tener una relación maestro-detalle entre la tabla de ventas y la de detalles de la venta. Agregar el registro maestro de la venta y asociar un dbgrid al dataset de los detalles. Éste mostrará sólo los de la venta actual en tanto que está mandada por el registro de la tabla maestra.

// Saludos
Responder Con Cita
  #13  
Antiguo 02-08-2012
disturbednoise disturbednoise is offline
Registrado
NULL
 
Registrado: may 2012
Posts: 7
Poder: 0
disturbednoise Va por buen camino
Asi es, lo que quiero hacer es eso, ir viendo los articulos que se van agregando en el grid para realizar la venta

Habrá algun ejemplo que me proporcionen para que me quede mas claro?, ya cheque datasource, componentes TdxMemData, clientDataset, dataset provider, pero aun no logro usarlos de la mejor manera, para lograr el resultado esperado con un TAdo Stored Proc, gracias por todo y saludos
Responder Con Cita
  #14  
Antiguo 02-08-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
A ver, vamos a suponer que tienes tablas de ventas, articulos y articulosVenta (detalles de la venta):

articulo = (articuloId, ... )
venta = (ventaId, ...)
articulosVenta = (ventaId, articuloId, ...)

Un primer dbgrid lo conectas a la tabla de ventas. El segundo dbgrid puedes conectarlo a una consulta SQL:

Código SQL [-]
select ventaId, articulo.*
from articulo, articulosVenta
where articulo.artculoId = articulosVenta.articuloId

El dataset que uses para la consulta lo pones como tabla detalle del dataset que uses para las ventas. Eso hace que el de la consulta sólo muestre los detalles de la venta actual.

Cuand inicias una venta agregas un registro a la tabla de ventas. Para agregar artículos, haces tu consulta que trae los datos del artículo e insertas un nuevo registro en la tabla articulosVenta poniendo en el campo ventaId el valor del ID de la nueva venta. Haces un refreseh de la consulta del segundo dbgrid para que refleje al artículo insertado.

No es la única manera de hacerlo pero para que te des una idea.

// 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
dbgrid llenado de datos emenchi34 Conexión con bases de datos 14 16-11-2006 11:34:44
Grid a DataSet robinsongm Varios 2 28-07-2006 14:53:00
Agregar datos a un string grid zvf OOP 2 05-07-2006 18:55:54
Llenado de Base de datos Luis Castillo Firebird e Interbase 1 16-01-2006 20:52:36
Extraer datos de un dataset? Durbed Conexión con bases de datos 5 01-10-2004 16:40:30


La franja horaria es GMT +2. Ahora son las 09:59:30.


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