PDA

Ver la Versión Completa : ayuda con mantenimiento de sistema


microbiano
24-12-2010, 15:14:45
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
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
...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
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 :-)