Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ayuda con mantenimiento de sistema (https://www.clubdelphi.com/foros/showthread.php?t=71515)

microbiano 24-12-2010 15:14:45

ayuda con mantenimiento de sistema
 
bueno como comente hace unos dias estoy en actualizacion de un pequeño punto de venta y quiero actualizar el form de facturacion, para ello utilizo un TStringGrid como detalle de factura pero la verdad es engorroso mostrar informacion en el ya lo he hecho de hecho funciona, pero he oido que todo este codigo se podria evitar si pudiera crear una tabla temporal con el componente JVMemorydataset de l aJEDi, ya logre crear la tabla y agregar elementos, pero no se como interactuar con ellos y como afectaria a mi base de produstos.

ongo el codigo que utilizo para llegar en Tsgrind Grid espero algun consejo pero de antamno muchas gracias
Código Delphi [-]
procedure TFfactura.txtcodigoExit(Sender: TObject);
var
 wprecio_total:Double;
 i:Integer;
 {variables para modificaciones}
 wcodigomodificar,wdescripcionmodificar:string;
 wventa_totalmodificada:Double;
 wdescuentomodificar,wpreciomodificar:Double;
 wtotalmodificar:Double;
 wOK:Boolean;
 begin
 wcodigobarras:=Trim(Ffactura.txtcodigo.Text);
  if wcodigobarras<>'' then
   begin
    For i:=1 to Ffactura.SGFact.RowCount-1 do
     if Ffactura.SGFact.Cells[0,i] = Trim(wcodigobarras) then
      begin
       wOK:=True;
       {codigo para cuando el registro ya existe en el detalle de la factura}
       if wOK=True then
        begin
         {tomo los registros que existen en el flexgrid de acuerdo al registro que voy agregar}
         wcantidadmodificar:=StrToFloat(SGFact.Cells[2,i]);//tomo el valor de la cantidad que tengo en el flexgrid
         wpreciomodificar:=StrToFloat(Ffactura.SGFact.Cells[3,i]);//paso el valor del precio a la variablde de precio
         wcodigomodificar:=Ffactura.SGFact.Cells[0,i]; //tomo el codigo de barras
         wdescripcionmodificar:=Ffactura.SGFact.Cells[1,i]; //tomo la descripcion

         if (wcantidadmodificar<=0) and (wdescuento_considerar=0) then
          begin
           Ffactura.SGFact.Cells[0,cuenta] := wcodigobarras;//agrego codigo de wcodigobarras
           Ffactura.SGFact.Cells[1,Cuenta]:=wdescripcionmodificar;
           Ffactura.wprecio_venta:=wprecio_venta;//StrToFloat(FieldByname('precioventa').AsVariant);//pongo el precio de venta en la variable de precio
           Ffactura.SGFact.Cells[2,Cuenta]:=FloatToStr(wcantidad_venta+1);
           Ffactura.SGFact.Cells[3,Cuenta]:=FloatToStr(Ffactura.wprecio_venta);//pongo el precio del articulo con formato de miles
           //Ffactura.SGFact.Cells[3,Cuenta]:=FormatFloat('###,###,###,##0.00', StrToFloat(Ffactura.SGFact.Cells[3,Cuenta]));
           Ffactura.SGFact.Cells[4,Cuenta]:='0.00';//pongo descuento igual a cero
           //pongo las variables de cantidad y descuento en numero para poder realizar operaciones
           wcantidad_venta:=1;
           wdescuento_considerar:=0;
           wimporte_del_descuento:=((wprecio_venta*wdescuento_considerar)/100);
           wprecio_con_descuento:=(wprecio_venta-wimporte_del_descuento);
           wventa_total_importe:=(wcantidad_venta * wprecio_con_descuento);
           SGFact.Cells[5,Cuenta]:=FloatToStr(wventa_total_importe);
           //Ffactura.SGFact.Cells[5,Cuenta]:=FormatFloat('###,###,###,##0.00', StrToFloat(Ffactura.SGFact.Cells[5,Cuenta]));
           //calculo totales
           calcula_totales;
           wcantidad_venta:=0;
           wdescuento_considerar:=0;
           Ffactura.txtcodigo.Text:='';
           ffactura.txtcodigo.SetFocus;
           Cuenta:=Cuenta+1;
           exit;
          end;
          if (wcantidad_venta>=1) and (wdescuento_considerar=0) then
           begin
            Ffactura.SGFact.Cells[0,cuenta] := wcodigobarras;//agrego codigo de wcodigobarras
            Ffactura.SGFact.Cells[1,Cuenta]:=wdescripcionmodificar;//(FieldByname('nombre').AsString);//agrego nombre del producto
            Ffactura.wprecio_venta:=wprecio_venta;//StrToFloat(FieldByname('precioventa').AsVariant);//pongo el precio de venta en la variable de precio
            Ffactura.SGFact.Cells[2,Cuenta]:=FloatToStr(wcantidad_venta+1);
            Ffactura.SGFact.Cells[3,Cuenta]:=FloatToStr(Ffactura.wprecio_venta);//pongo el precio del articulo con formato de miles
            //Ffactura.SGFact.Cells[3,Cuenta]:=FormatFloat('###,###,###,##0.00', StrToFloat(Ffactura.SGFact.Cells[3,Cuenta]));
            Ffactura.SGFact.Cells[4,Cuenta]:='0.00';//pongo descuento igual a cero
            //pongo las variables de cantidad y descuento en numero para poder realizar operaciones
            //wcantidad_venta:=1;
            wdescuento_considerar:=0;
            wimporte_del_descuento:=((wprecio_venta*wdescuento_considerar)/100);
            wprecio_con_descuento:=(wprecio_venta-wimporte_del_descuento);
            wventa_total_importe:=(wcantidad_venta * wprecio_con_descuento);
            SGFact.Cells[5,Cuenta]:=FloatToStr(wventa_total_importe);
            //Ffactura.SGFact.Cells[5,Cuenta]:=FormatFloat('###,###,###,##0.00', StrToFloat(Ffactura.SGFact.Cells[5,Cuenta]));
            //calculo totales
            calcula_totales;
            wcantidad_venta:=0;
            wdescuento_considerar:=0;
            Ffactura.txtcodigo.Text:='';
            ffactura.txtcodigo.SetFocus;
            Cuenta:=Cuenta+1;
            exit;
           end;
           if (wcantidad_venta>=1) and (wdescuento_considerar>0) then
            begin
             Ffactura.SGFact.Cells[0,cuenta] := wcodigobarras;//agrego codigo de wcodigobarras
             Ffactura.SGFact.Cells[1,Cuenta]:=wdescripcionmodificar;//(FieldByname('nombre').AsString);//agrego nombre del producto
             Ffactura.wprecio_venta:=wprecio_venta;//StrToFloat(FieldByname('precioventa').AsVariant);//pongo el precio de venta en la variable de precio
             Ffactura.SGFact.Cells[2,Cuenta]:=FloatToStr(wcantidad_venta);
             Ffactura.SGFact.Cells[3,Cuenta]:=FloatToStr(Ffactura.wprecio_venta);//pongo el precio del articulo con formato de miles
             //Ffactura.SGFact.Cells[3,Cuenta]:=FormatFloat('###,###,###,##0.00', StrToFloat(Ffactura.SGFact.Cells[3,Cuenta]));
             Ffactura.SGFact.Cells[4,Cuenta]:=FloatToStr(wdescuento_considerar);
             //pongo las variables de cantidad y descuento en numero para poder realizar operaciones
             //wcantidad_venta:=1;
             wimporte_del_descuento:=((wprecio_venta*wdescuento_considerar)/100);
             wprecio_con_descuento:=(wprecio_venta-wimporte_del_descuento);
             wventa_total_importe:=(wcantidad_venta * wprecio_con_descuento);
             SGFact.Cells[5,Cuenta]:=FloatToStr(wventa_total_importe);
             //Ffactura.SGFact.Cells[5,Cuenta]:=FormatFloat('###,###,###,##0.00', StrToFloat(Ffactura.SGFact.Cells[5,Cuenta]));
             //calculo totales
             calcula_totales;
             wcantidad_venta:=0;
             wdescuento_considerar:=0;
             Ffactura.txtcodigo.Text:='';
             ffactura.txtcodigo.SetFocus;
             Cuenta:=Cuenta+1;
             exit;
            end;
         Exit;
        end;
      end;
    {verifico la informacion del resultado para ver si agrego por primera vez el producto}
   if wOK=False then
    begin
     if wcodigobarras<>'' then
        begin
         with Fmodulo.Qry_Temp do
          begin
           Close;
           sql.clear;
           SQL.Add('select * from articulo');
           SQL.Add('where codigobarras=:Pcodigobarras');
           Parameters.ParamByName('pcodigobarras').Value:=Trim(wcodigobarras);
           try
            open;
             if not Fmodulo.Qry_Temp.IsEmpty then
              begin
               while not Fmodulo.Qry_Temp.Eof do
                begin
                 If Cuenta > 1 then SGFact.RowCount := SGFact.RowCount + 1;
                 if (wcantidad_venta<=0) and (wdescuento_considerar=0) then
                  begin
                   Ffactura.SGFact.Cells[0,cuenta] := wcodigobarras;//agrego codigo de wcodigobarras
                   Ffactura.SGFact.Cells[1,Cuenta]:=(FieldByname('nombre').AsString);//agrego nombre del producto
                   Ffactura.wprecio_venta:=StrToFloat(FieldByname('precioventa').AsVariant);//pongo el precio de venta en la variable de precio
                   Ffactura.SGFact.Cells[2,Cuenta]:='1';
                   Ffactura.SGFact.Cells[3,Cuenta]:=FloatToStr(Ffactura.wprecio_venta);//pongo el precio del articulo con formato de miles
                   //Ffactura.SGFact.Cells[3,Cuenta]:=FormatFloat('###,###,###,##0.00', StrToFloat(Ffactura.SGFact.Cells[3,Cuenta]));
                   Ffactura.SGFact.Cells[4,Cuenta]:='0.00';//pongo descuento igual a cero
                   //pongo las variables de cantidad y descuento en numero para poder realizar operaciones
                   wcantidad_venta:=1;
                   wdescuento_considerar:=0;
                   wimporte_del_descuento:=((wprecio_venta*wdescuento_considerar)/100);
                   wprecio_con_descuento:=(wprecio_venta-wimporte_del_descuento);
                   wventa_total_importe:=(wcantidad_venta * wprecio_con_descuento);
                   SGFact.Cells[5,Cuenta]:=FloatToStr(wventa_total_importe);
                   //Ffactura.SGFact.Cells[5,Cuenta]:=FormatFloat('###,###,###,##0.00', StrToFloat(Ffactura.SGFact.Cells[5,Cuenta]));
                   //calculo totales
                   calcula_totales;
                   wcantidad_venta:=0;
                   wdescuento_considerar:=0;
                   Ffactura.txtcodigo.Text:='';
                   ffactura.txtcodigo.SetFocus;
                   Cuenta:=Cuenta+1;
                   exit;
                  end;
                  if (wcantidad_venta>=1) and (wdescuento_considerar=0) then
                   begin
                    Ffactura.SGFact.Cells[0,cuenta] := wcodigobarras;//agrego codigo de wcodigobarras
                     Ffactura.SGFact.Cells[1,Cuenta]:=(FieldByname('nombre').AsString);//agrego nombre del producto
                     Ffactura.wprecio_venta:=StrToFloat(FieldByname('precioventa').AsVariant);//pongo el precio de venta en la variable de precio
                     Ffactura.SGFact.Cells[2,Cuenta]:=FloatToStr(wcantidad_venta);
                     Ffactura.SGFact.Cells[3,Cuenta]:=FloatToStr(Ffactura.wprecio_venta);//pongo el precio del articulo con formato de miles
                     //Ffactura.SGFact.Cells[3,Cuenta]:=FormatFloat('###,###,###,##0.00', StrToFloat(Ffactura.SGFact.Cells[3,Cuenta]));
                     Ffactura.SGFact.Cells[4,Cuenta]:='0.00';//pongo descuento igual a cero
                     //pongo las variables de cantidad y descuento en numero para poder realizar operaciones
                     //wcantidad_venta:=1;
                     wdescuento_considerar:=0;
                     wimporte_del_descuento:=((wprecio_venta*wdescuento_considerar)/100);
                     wprecio_con_descuento:=(wprecio_venta-wimporte_del_descuento);
                     wventa_total_importe:=(wcantidad_venta * wprecio_con_descuento);
                     SGFact.Cells[5,Cuenta]:=FloatToStr(wventa_total_importe);
                     //Ffactura.SGFact.Cells[5,Cuenta]:=FormatFloat('###,###,###,##0.00', StrToFloat(Ffactura.SGFact.Cells[5,Cuenta]));
                     //calculo totales
                     calcula_totales;
                     wcantidad_venta:=0;
                     wdescuento_considerar:=0;
                     Ffactura.txtcodigo.Text:='';
                     ffactura.txtcodigo.SetFocus;
                     Cuenta:=Cuenta+1;
                     exit;
                   end;
                   if (wcantidad_venta>=1) and (wdescuento_considerar>0) then
                    begin
                     Ffactura.SGFact.Cells[0,cuenta] := wcodigobarras;//agrego codigo de wcodigobarras
                     Ffactura.SGFact.Cells[1,Cuenta]:=(FieldByname('nombre').AsString);//agrego nombre del producto
                     Ffactura.wprecio_venta:=StrToFloat(FieldByname('precioventa').AsVariant);//pongo el precio de venta en la variable de precio
                     Ffactura.SGFact.Cells[2,Cuenta]:=FloatToStr(wcantidad_venta);
                     Ffactura.SGFact.Cells[3,Cuenta]:=FloatToStr(Ffactura.wprecio_venta);//pongo el precio del articulo con formato de miles
                     //Ffactura.SGFact.Cells[3,Cuenta]:=FormatFloat('###,###,###,##0.00', StrToFloat(Ffactura.SGFact.Cells[3,Cuenta]));
                     Ffactura.SGFact.Cells[4,Cuenta]:=FloatToStr(wdescuento_considerar);
                     //pongo las variables de cantidad y descuento en numero para poder realizar operaciones
                     //wcantidad_venta:=1;
                     wimporte_del_descuento:=((wprecio_venta*wdescuento_considerar)/100);
                     wprecio_con_descuento:=(wprecio_venta-wimporte_del_descuento);
                     wventa_total_importe:=(wcantidad_venta * wprecio_con_descuento);
                     SGFact.Cells[5,Cuenta]:=FloatToStr(wventa_total_importe);
                     //Ffactura.SGFact.Cells[5,Cuenta]:=FormatFloat('###,###,###,##0.00', StrToFloat(Ffactura.SGFact.Cells[5,Cuenta]));
                     //calculo totales
                     calcula_totales;
                     wcantidad_venta:=0;
                     wdescuento_considerar:=0;
                     Ffactura.txtcodigo.Text:='';
                     ffactura.txtcodigo.SetFocus;
                     Cuenta:=Cuenta+1;
                     exit;
                    end;
                  Next;
                end;
              end
              else
              begin
               Application.MessageBox('No existe Producto en almacén'+CHR(13)+'con el Código de Barras proporcionado.','Error de Búsqueda',MB_TASKMODAL+ MB_ICONERROR);
               Ffactura.txtcodigo.Text:='';
               Ffactura.txtcodigo.SetFocus;
               Exit;
              end;
           except
            on E:EOleException do
             begin
              MessageDlg(Format('Error: %s    Codigo: %d', [E.Message, E.ErrorCode]), mtError, [mbOK], 0);
             end;
           end;
          end;
        end;
     Exit;
    end;

   end;
 end;

Neftali [Germán.Estévez] 27-12-2010 10:29:33

Cita:

Empezado por microbiano (Mensaje 385770)
...ya logre crear la tabla y agregar elementos, pero no se como interactuar con ellos y como afectaria a mi base de produstos.

No he trabajado con el componente que comentas, pero sí con algunos que te dan funcionalidades similares; TClientDataset o las tablas en memoria de las Rx o de las Quantum.

Normalmente la forma de interactuar con estos registros es similar a como lo harías con una tabla normal; Con los mismos métodos y de la misma manera, así que no se cual es el problma en ese sentido. Si ya has conseguido crearla y añadir elementos, el resto de operaciones deben se similares.

Estas tablas almacenan datos en memoria, en tu caso las líneas de la factura. Lo lógico es que se creen elementos nuevos que luego debes volcar a la tabla física (INSERT), o que cargues elementos ya existentes y después de las modificaciones debas actualizar la tabla física (UPDATE).

En el caso de TClientDataSet, te facilita acceder "fácilmente" a los cambios realizados (nuevos registros, actualizaciones y borrados) en memoria que debes volcar a la tabla física y tienes operaciones para realizarlas. En el resto deberás buscar en las propiedades si hay alguna propiedad que te marca si cada registro ha sufrido cambios. Si no existen, deberás hacer el recorrido de forma manual e ir comparando 1 a 1.

microbiano 27-12-2010 15:40:39

gracias amigo neftali, que posibilida existe de que me ponga un ejemplo de como se hacer.


de antemano muchas gracias por la respuesta amigo mio.

Neftali [Germán.Estévez] 27-12-2010 15:56:36

Cita:

Empezado por microbiano (Mensaje 385895)
gracias amigo neftali, que posibilida existe de que me ponga un ejemplo de como se hacer.

Como ya te he dicho, el problema es que no he trabajado con este componente y no sé cómo es.

Si se tratara de TClientDataSet, por ejemplo, basta con buscar en la ayuda o en los foros sobre ApplyUpdates, que es el método encargado de "volcar" los cambios que se han realizado en memoria sobre la Base de Datos física.
Una vez realizados los cambios, el componente te devuelve información del proceso y de los posibles errores que haya podido haber. Para ello hay eventos y métodos (Reconcile, OnReconcileError,...).

Hay otros como el de las QuantumGrid, que sólo te da un descendiente de TDataSet, pero no te facilita el trabajo de actualizar; Así que todo eso debes hacerlo de forma manual. Recorrer el DataSet en memoria e ir realizando las operaciones (Insert, delete, Update) sobre la Base de Datos física de forma manual.

microbiano 27-12-2010 16:23:38

ok no te preocupes de antemano muchas gracias :-)


La franja horaria es GMT +2. Ahora son las 19:21:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi