Ver Mensaje Individual
  #14  
Antiguo 18-04-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Reputación: 23
ContraVeneno Va por buen camino
bueno, si el uso del nicegrid es solo para mostrar los datos temporalmente, sin utilizar nada especial de este componente. Creo que sería mejor una tabla en memoria utilizando el TjvMemorydata que viene el la pestaña JV Data Controls (o data access :P).

En esta tabla tu defines los campos que quieres, que según veo, son 4, un entero, un string y dos tipo moneda.

Esta tabla en memoria funciona exactamente igual que si tuvieras un TTable enlazado a tu base de datos, pero obviamente al ser en memoria, no afecta en nada a tu base de datos.

Lo mejor de todo, en este caso, es que no tendrías por que preocuparte ni por formatos ni por conversiones ni por regionalismos, ya que todo lo manejarías directo al tipo de datos que tu defines.

Por ejemplo, para agregar un elemento ("item" en inglés) o artículo, harías algo así:

Código Delphi [-]
with Datamodule.TablaMemoria do begin
 Append;
 FieldByName('CTD').AsInteger := CTD.AsInteger;
 FieldByname('Descripcion').AsString := edtDescripcion.Text;
 FieldByName('ValorUnit').AsCurrency := edtValorUnitario.AsCurrency; 
 FieldByName('ValorTotal').AsCurrency := edtValorTotal.AsCurrency;
 Post;
end; //with

Los datos tipo moneda, te los va amostrar con formato de moneda, tal como este configurada la región en la computadora (con "," como separador de miles o como separador de decimales, no importa, tu programa lo tomará como este configurado el sistema operativo).

Para guardarlo en tu base de datos, podrías hacer algo así;

Código Delphi [-]
with UnDataModule.UnQuery do begin
 If active then close;
 SQL.Clear;
 SQL.Add('Insert into UnaTabla(CTD, Descripcion, ValorUnit, ValorTotal)');
 SQL.Add('Values(:vCTD, :vDescripcion, :vValorUnit, :vValorTotal)');
 Parameters.ParamByname('vCTD').AsInteger := UnaTablaEnMemoria.FieldByName('CTD').AsInteger;
 Parameters.ParamByname('vDescripcion').AsString := UnaTablaEnMemoria.FieldByName('Descripcion').AsString;
 Parameters.ParamByName('vValorUnit').AsCurrency := UnaTablaEnMemoria.FieldByName('ValorUnit').AsCurrency;
 Parameters.ParamByName('vValorTotal').AsCurrency := UnaTablaEnMemoria.FieldByName('ValorTotal').AsCurrency;

 ExecSQL;
end; //with

Si te fijas, en ningún momento hago conversiones de cadena a moneda, ni tampoco me preocupo por formatos ya que los toma directo del sistema operativo.
Y tienes todos los eventos necesarios para hacer cambios. AfterInsert, beforeinsert, beforedelete, afterdelete, beforepost, afterpost, etc, etc, etc, etc.


Edito: -----
Incluso, podrías dejar solo el Grid enlazado a la tabla en memoria y hacer los camios directamente sobre el mismo grid, sin necesidad de que pongas los valores en validateedits aparte y luego meterlos en el grid. Puedes hacer todas las validaciones que requieras directo en la tabla en memoria. Incluso puedes enlazar el campo del artículo, a una tabla de artículos en tu base de datos si defines el campo como ftDataset. En fin, que las posibilidades son mucho mucho mayores.



Y en caso de que se arrepientan, lo único que tendrías que hacer sería:

Código Delphi [-]
 UnaTablaEnMemoria.EmptyTable;
__________________


Última edición por ContraVeneno fecha: 18-04-2008 a las 16:15:50.
Responder Con Cita