![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#9
|
||||
|
||||
|
Cita:
lo cual, si bien la copia del archivo se realizaba a la perfección, no lo podía usar hasta tanto no reiniciara la aplicación. Pero cuando ya estaba por rendirme, se me ocurrió usar un ADOConnection (antes simplemente me conectaba desde la propiedad ConnectionString del ADOQuery). Entonces lo pude solucionar de la siguiente manera: ADOConnection.Connected := FALSE; CopyFile('Datos.bkp', 'Datos.mdb', FALSE); ADOConnection.Connected := TRUE; Cita:
base sin ningún tipo de problemas. Lo único que pasaba era que los resultados tardaban su tiempito en aparecer en el DBGrid. Intentaré describir la situación y mostraré código fuente. Y luego explicaré como lo solucioné. Código:
procedure TForm_Venta.Button_AddClick(Sender: TObject);
//Agrega al DBGrid de Ítems el Artículo seleccionado
// en el DBGrid de Resultados
var
Aux1:Integer;
Aux2:Currency;
begin
If (DBGrid_Resultado.SelectedField.Text <> '') AND (SpinEdit_Cantidad.Value > 0) then
begin
//Busca los datos del Artículo seleccionado
Aux.Active := FALSE; // Aux es una variable de tipo TADOQuery
Aux.SQL.Clear;
Aux.SQL.Add('SELECT * FROM TablaAux WHERE Descripcion
='''+DBGrid_Resultado.Fields[0].Text+'''');
Aux.Active := TRUE;
If not Aux.IsEmpty then
begin
Aux1 := Aux.FieldByName('Cantidad').AsInteger;
Aux1 := Aux1 + SpinEdit_Cantidad.Value;
//Agrega al DBGrid de Ítems el Artículo seleccionado si la cantidad
//solicitada es menor o igual al stock actual del mismo. Además
//realiza las actualizaciones correspondientes de stock y subtotal
If Aux1 <= StrToInt(DBGrid_Resultado.Fields[1].Text) then
begin
Aux2 := Aux.FieldByName('Precio Unit').AsCurrency;
Aux2 := Aux1 * Aux2;
Aux.Active := TRUE;
Aux.SQL.Clear;
Aux.SQL.Add('UPDATE TablaAux SET Cantidad =
'+InttoStr(Aux1)+' , Subtotal = "'+FloatToStr(Aux2)
+'" WHERE Descripcion =
'''+DBGrid_Resultado.Fields[0].Text+'''');
Aux.ExecSQL;
end;
end
else
begin
Aux.Active := TRUE;
Aux.SQL.Clear;
Aux.SQL.Add('INSERT INTO TablaAux VALUES
'''+DBGrid_Resultado.Fields[0].Text+''',
'+IntToStr(SpinEdit_Cantidad.Value)+',
"'+DBGrid_Resultado.Fields[2].Text+'" ,
"'+FloatToStr(SpinEdit_Cantidad.Value*
StrToFloat(DBGrid_Resultado.Fields[2].Text))+'")');
Aux.ExecSQL;
end;
Modulo.ConsultaAux.Active := FALSE;
Modulo.ConsultaAux.Active := TRUE;
//Actualiza el máximo valor del SpinEdit y en caso de ser igual
//a cero, lo deshabilita. Además limpia su contenido.
SpinEdit_Cantidad.MaxValue := SpinEdit_Cantidad.MaxValue
- SpinEdit_Cantidad.Value;
If SpinEdit_Cantidad.MaxValue = 0 then
SpinEdit_Cantidad.ReadOnly := TRUE
Else
SpinEdit_Cantidad.ReadOnly := FALSE;
SpinEdit_Cantidad.Value := 0;
//Actualiza el monto total de la venta o presupuesto
ViewTotal;
end;
end;
Lo que intentaba de hacer era que cuando el usuario clickeara el botón Add, agregara el artículo que se había seleccionado en el DBGrid_Resultados (muestra el resultado de una búsqueda y permite encontrar un Artículo en particular) al DBGrid de Ítems (muestra los artículos que posteriormente se facturarán, mostrando descripción, cantidad a vender, precio unitario y subtotal. Hasta acá era fácil. El problema era que yo necesitaba saber si ese artículo ya se encontraba en el DBGrid de Ítems, y luego dependiendo de eso, debía o actualizar la cantidad a vender o simplemente agregar el artículo. Y bueno, no se si era por la cantidad de consultas sobre la misma base o por alguna otra razón que desconozco, la cuestión que cuando clickeaba mi botón ADD, el DBGrid se tomaba un tiempito para actualizar (si es que lo lograba). Entonces decidí cambiar de estrategia y directamente no permitir ingresar el artículo nuevamente. Así, si realmente se arrepintió de la cantidad ingresada y quería agregar más a ese artículo, debe primero quitarlo y luego agregarlo nuevamente con la cantidad deseada. Esto no solo simplificó mi código (tanto de este evento como de todos los posteriores), si no que además ahora anda. El código actual es el siguiente. Código:
procedure TForm_Venta.Button_AddClick(Sender: TObject);
//Agrega al DBGrid de Ítems el Producto seleccionado
begin
If (DBGrid_Resultado.SelectedField.Text <> '') AND (SpinEdit_Cantidad.Value > 0) then
begin
//Busca el Producto seleccionado en la tabla de ítems a facturar / presupuestar
Aux.Active := FALSE;
Aux.SQL.Clear;
Aux.SQL.Add('SELECT * FROM TablaAux WHERE Descripcion =
'''+DBGrid_Resultado.Fields[1].Text+'''');
Aux.Active := TRUE;
If Aux.IsEmpty then
begin // Agrega el producto a la lista de ítems
Aux.Active := TRUE;
Aux.SQL.Clear;
Aux.SQL.Add('INSERT INTO TablaAux VALUES
'''+DBGrid_Resultado.Fields[1].Text+''',
'+IntToStr(SpinEdit_Cantidad.Value)+',
"'+DBGrid_Resultado.Fields[2].Text+'" ,
"'+FloatToStr(SpinEdit_Cantidad.Value*
StrToFloat(DBGrid_Resultado.Fields[2].Text))+'")');
Aux.ExecSQL;
Modulo.ConsultaAux.Active := FALSE;
Modulo.ConsultaAux.Active := TRUE;
//Actualiza el monto total de la venta o presupuesto
VerTotal;
end
else // Si Aux no esta vacío
MessageBox(Handle, 'El producto ya existe en la lista de ítems',
'ERROR', MB_OK+MB_ICONEXCLAMATION);
end;
end;
Desde ya les agradezco sus respuestas y les pido disculpas por no poder contestarles rápidamente. Un saludo y gracias de nuevo. ![]()
__________________
https://www.youtube.com/DexterBass Última edición por Dexter182 fecha: 21-07-2005 a las 10:21:02. |
|
|
|