Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Copiar este formulario de Access es posible en Delphi? (https://www.clubdelphi.com/foros/showthread.php?t=95057)

giulichajari 09-02-2021 00:03:09

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?

Casimiro Notevi 09-02-2021 09:43:52


Neftali [Germán.Estévez] 09-02-2021 11:01:50

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.

giulichajari 09-02-2021 16:31:28

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 539935)
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?

Neftali [Germán.Estévez] 11-02-2021 16:05:35

Cita:

Empezado por giulichajari (Mensaje 539943)
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).

giulichajari 11-02-2021 17:22:55

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 540002)
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;

Neftali [Germán.Estévez] 12-02-2021 09:15:23

Cita:

Empezado por giulichajari (Mensaje 540004)
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;

giulichajari 12-02-2021 19:54:21

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 540010)
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.

Neftali [Germán.Estévez] 15-02-2021 09:25:18

Cita:

Empezado por giulichajari (Mensaje 540018)
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.

giulichajari 20-02-2021 00:03:35

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 540046)
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?


La franja horaria es GMT +2. Ahora son las 16:07:22.

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