Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-02-2021
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Copiar este formulario de Access es posible en Delphi?

Tengo el siguiente formulario de una aplicacion vieja que se quiere renovar en Access:

https://ibb.co/YTYqWRX

Hasta ahora hice la parte de arriba pero se me complico con la grilla.Para lo mismo estoy usando un DBGrid pero no logro hacerlo:
Tiene el listado de codigos alfanumericos en la columna codigo por cada registro(esto por lo que busque se puede hacer con la propiedad PickList de Column). Cuando se selecciona un codigo aparece el nombre y precio del producto correspondiente. A su vez el combo lista que se ve es otra tabla de la base de datos que aplica un descuento de acuerdo al cliente(ya esta predeterminada) pudiendo cambiarse.
Se que no es algo sencillo al menos para mi:

Código Delphi [-]
 procedure TDataModule1.cdsptemporalNewRecord(DataSet: TDataSet);
begin
  SetupGridPickList('Codigo','Select * from productos;');
end;

Hasta ahora uso el evento on new record(hay un boton de agregar registro),con la idea de llenar un TClientDataSet como tabla temporal, y cargar el combo haciendo uso de picklist:
Código Delphi [-]
procedure TDataModule1.SetupGridPickList(const FieldName, sql: string);
var
 slPickList:TStringList;
 Query : TSQLQuery;
 i : integer;
begin
 slPickList:=TStringList.Create;
 Query := TSQLQuery.Create(self);

 Query.SQLConnection :=DataModule1.CONEXION;
 Query.SQL.Text := sql;
 Query.Open;
 //Fill the string listwhile not Query.EOF dobegin
 Query.First;
 while not Query.eof do
   begin
       slPickList.Add(Query.Fields[9].AsString);
       Query.Next;
   end;



 Form3.DBGrid1.Columns[1].PickList:=slPickList;


end;

Alguna sugerencia?Es posible?
Responder Con Cita
  #2  
Antiguo 09-02-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Responder Con Cita
  #3  
Antiguo 09-02-2021
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Creo que rellenar la lista de valores de la columna Codigo, con la llamada a:

Código Delphi [-]
SetupGridPickList

Sólo debes hacerlo una vez. No es necesario que la llenes cada vez que añadas un nuevo registro. Por ejemplo, en el AfterOpen del dataModule "ligado" al DBGrid.

Y para buscar el resto de valores que corresponden al código (nombre y precio) puedes usar el evento DataChange del campo código.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 09-02-2021 a las 11:50:00.
Responder Con Cita
  #4  
Antiguo 09-02-2021
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Creo que rellenar la lista de valores de la columna Codigo, con la llamada a:

Código Delphi [-]
SetupGridPickList

Sólo debes hacerlo una vez. No es necesario que la llenes cada vez que añadas un nuevo registro. Por ejemplo, en el AfterOpen del dataModule "ligado" al DBGrid.

Y para buscar el resto de valores que corresponden al código (nombre y precio) puedes usar el evento DataChange del campo código.
Claro pero entonces en vez de llenar la columna del DBGrid, debo llenar por asi decirlo el campo del TClientDataSet asociado.
¿Pero como creo un campo de TclientDataSet que acepte una lista de string? De que tipo deberia ser?
Responder Con Cita
  #5  
Antiguo 11-02-2021
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por giulichajari Ver Mensaje
Claro pero entonces en vez de llenar la columna del DBGrid, debo llenar por asi decirlo el campo del TClientDataSet asociado.
¿Pero como creo un campo de TclientDataSet que acepte una lista de string? De que tipo deberia ser?

No.
Yo estoy pensando en llenar las columnas del DBGrid. Pero eso sólo debes hacerlo 1 vez. No debes hacerlo por cada fila (registro).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 11-02-2021
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
No.
Yo estoy pensando en llenar las columnas del DBGrid. Pero eso sólo debes hacerlo 1 vez. No debes hacerlo por cada fila (registro).
Vos decis que haciendolo solo una vez al agregar un nuevo registro, apareceran los codigos?

Hasta ahora hice esto(como me habias dicho el afterOpen):

Código Delphi [-]
procedure TDataModule1.cdsptemporalAfterOpen(DataSet: TDataSet);
begin
 SetupGridPickList('Codigo','Select * from productos;');
end;


Código Delphi [-]
 procedure TDataModule1.SetupGridPickList(const FieldName, sql: string);
var
 slPickList:TStringList;
 Query : TSQLQuery;
 i : integer;
begin
 slPickList:=TStringList.Create;
 Query := TSQLQuery.Create(self);

 Query.SQLConnection :=DataModule1.CONEXION;
 Query.SQL.Text := sql;
 Query.Open;
 //Fill the string listwhile not Query.EOF dobegin
 Query.First;
 while not Query.eof do
   begin
       slPickList.Add(Query.Fields[9].AsString);

       Query.Next;
   end;



 Form3.gpedido.Columns[1].PickList:=slPickList;


end;

Pero me da access violation y no compila: Form3.gpedido.Columns[1].PickList:=slPickList; Gpedido es la grilla en cuestion.

Por otro lado el onchange de codigo funciona perfecto:

Código Delphi [-]
procedure TDataModule1.cdsptemporalCodigoChange(Sender: TField);
var

 Queryn : TSQLQuery;
 i : integer;
begin

 Queryn := TSQLQuery.Create(self);

 Queryn.SQLConnection :=DataModule1.CONEXION;
 Queryn.SQL.Text :='SELECT NomProducto,PrecioActual from productos where Codigo="'+cdsptemporalCodigo.AsString + '"';

 Queryn.Open;
 DataModule1.cdsptemporalidcliente.AsInteger:=DataModule1.cdsclientesIdCliente.AsInteger;
qlistapedido.ParamByName('idcl').AsInteger:=DataModule1.cdsptemporalidcliente.AsInteger;
qlistapedido.Open;

DataModule1.cdsptemporallista.AsString:=qlistapedido.Fields[1].AsString;
 DataModule1.cdsptemporalPrecio.AsFloat:=Queryn.Fields[1].AsFloat;
 DataModule1.cdsptemporalNomProducto.AsString:=       Queryn.Fields[0].AsString;


end;
Responder Con Cita
  #7  
Antiguo 12-02-2021
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por giulichajari Ver Mensaje
Pero me da access violation y no compila: Form3.gpedido.Columns[1].PickList:=slPickList; Gpedido es la grilla en cuestion.
Para el problema de que no compila, deberías decir el error que te da.
Para el "Access Violation" puedes ejecutar paso a paso y ver dónde está el problema. Posiblemente algo que no está asignado correctamente.

En esa línea además estás asignando a la PickList (que es un TStringList) otro objeto, cosa que te va a dar problemas.
Añade los elementos a la lista, pero no sustituyas el objeto.

Algo así:

Código Delphi [-]
  // Rellenar la lista de productos
  DataProductos.Open;
  while not DataProductos.Eof do begin
    DBGrid1.Columns[2].PickList.Add(DataProductos.FieldByName('Codigo').AsString);
    DataProductos.Next;
  end;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 12-02-2021
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Para el problema de que no compila, deberías decir el error que te da.
Para el "Access Violation" puedes ejecutar paso a paso y ver dónde está el problema. Posiblemente algo que no está asignado correctamente.

En esa línea además estás asignando a la PickList (que es un TStringList) otro objeto, cosa que te va a dar problemas.
Añade los elementos a la lista, pero no sustituyas el objeto.

Algo así:

Código Delphi [-]
  // Rellenar la lista de productos
  DataProductos.Open;
  while not DataProductos.Eof do begin
    DBGrid1.Columns[2].PickList.Add(DataProductos.FieldByName('Codigo').AsString);
    DataProductos.Next;
  end;
Bueno hasta ahora hice como me dijiste en el after open del tclientdataset del pedido:


Código Delphi [-]
procedure TDataModule1.cdspedidotemporalAfterOpen(DataSet: TDataSet);

begin

 DataModule1.cdsproductos.First;

 while not DataModule1.cdsproductos.eof do
   begin
      Form3.gpedidotemp.Columns[1].PickList.Add(DataModule1.cdsproductosCodigo.AsString) ;


       DataModule1.cdsproductos.Next;
   end;

end;

Y obtengo como te dije:

https://imgur.com/a/jCMQ9Lr

Un error, osea no entiendo porque no puedo asignar el contenido del dataset a la columna de la grilla.
Responder Con Cita
  #9  
Antiguo 15-02-2021
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por giulichajari Ver Mensaje
Y obtengo como te dije:

https://imgur.com/a/jCMQ9Lr

Un error, osea no entiendo porque no puedo asignar el contenido del dataset a la columna de la grilla.
Puedes probar con algo así:

Código Delphi [-]
while not DataModule1.cdsproductos.eof do
begin
  Form3.gpedidotemp.Columns[1].PickList.Add(DataModule1.cdsproductos.FieldByName('codigo').AsString) ;
  DataModule1.cdsproductos.Next;
end;

Si te sigue dando un "Access Violation" evalua si alguno de los elementos de la línea no está asignado.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 20-02-2021
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Puedes probar con algo así:

Código Delphi [-]
while not DataModule1.cdsproductos.eof do
begin
  Form3.gpedidotemp.Columns[1].PickList.Add(DataModule1.cdsproductos.FieldByName('codigo').AsString) ;
  DataModule1.cdsproductos.Next;
end;

Si te sigue dando un "Access Violation" evalua si alguno de los elementos de la línea no está asignado.
Hola German ,funciono de la siguiente manera:

Código Delphi [-]
procedure TPEDIDO.FormCreate(Sender: TObject);
var
idpedido:integer;
begin
Position := poScreenCenter;
//obtengo el pedido actual

if DBEdit1.Text<>'' then
begin
//hago la consulta con este id y obtengo el detalle
  idpedido:=StrToInt(DBEdit1.Text);
  DataModule1.qdetpedido.Close;
DataModule1.qdetpedido.ParamByName('idp').AsInteger:=idpedido;
DataModule1.qdetpedido.ExecSQL();
end;
  DataModule1.cdsproductos.First;

 while not DataModule1.cdsproductos.eof do
   begin
     PEDIDO.gpedidotemp.Columns[2].PickList.Add(DataModule1.cdsproductosCodigo.AsString) ;


       DataModule1.cdsproductos.Next;
   end;
end;

En el evento OnCreate del formulario donde esta la grilla.


Por lo menos una parte ya hice. Lo que hago con button5 es agregar un nuevo pedido.
Código SQL [-]
procedure TPEDIDO.Button5Click(Sender: TObject);
var
intUltimo:integer;
begin
//añado nuevo pedido
DataModule1.cdspedidos.Open;
DataModule1.cdspedidos.Insert;
intUltimo:=DataModule1.cdspedidos.RecordCount + 1;
DBEdit1.Text:=IntToStr(intUltimo);
//lo registro
DataModule1.cdspedidos.ApplyUpdates(0);

//lo asigno al detalle
DataModule1.qdetpedido.Close;
 DataModule1.qdetpedido.ParamByName('idp').AsInteger:=intUltimo;
  DataModule1.qdetpedido.ExecSQL;


end;

Pero la grilla de detalle de pedido no se borra. Esta grilla tiene una DatSource asociado a un TClientDataSet, y todo proviene de un query:

Código SQL [-]
select * from detallepedido where detallepedido.Idpedido=:idp;

Es decir lo que intento hacer es seleccionar de acuerdo al pedido en cuestion su detalle.
¿Cual es la manera de borrar la grilla y resetearla?
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
Sera posible este tipo de ShowModal? pborges36 OOP 4 12-09-2008 00:49:12
¿Es posible cerrar automaticamente un formulario en delphi? mabjes OOP 7 13-07-2007 17:47:26
Copiar registros de una tabla a otra en Access con Delphi Gelmin Conexión con bases de datos 1 01-07-2005 12:35:04
es posible este tipo de consulta? manos SQL 7 09-05-2005 15:43:48
Ver un formulario de Access en delphi?? razadi Servers 2 06-08-2004 00:31:09


La franja horaria es GMT +2. Ahora son las 00:52:10.


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