PDA

Ver la Versión Completa : Armar detalle de factura evitando muchos querys


giulichajari
25-07-2014, 13:58:37
Hola amigos, en mi sistema tengo un formulario Ticket con botones Agregar Producto que lleva a un form con la lista de productos. El form ticket tiene a su vez un dbgrid, que se debe ir completando a medida se van agregando productos para luego enviar esos datos al controlador fiscal. El caso es que del form lista de productos obtengo el id del producto seleccionado en la grilla al hacer click en agregar, con este id genero una consulta para llenar el DBGrid de el form ticket.

Pero el caso es que pense colocar un stringrid para realizar solo una consulta, la consulta de lista de productos tiene muchos datos como marca, precio, categoria, etc, y al estar ya en el form lista de productos, no quiero ejecutar otro query.

Entonces:

1-Como hago para ejecutar la consulta de lista de productos una sola vez y no cada vez que el usuario haga click en Agregar Producto.
2-Como llenaria el stringgrid o me conviene un dbgrid?

Agradezco sus consejos.

grandzon
26-07-2014, 10:48:18
Hola compadre.

Podría sugerirte que en la misma form tengas un grid con los productos que deseas agregar a la factura, de esa forma no harías la consulta cada que abres el formulario de producto, pues no lo tienes.

Respecto a tu segunda consulta, si piensas guardar los datos inmediatamente supongo te convendría más un dbgrid.

No soy un experto pero creo que el que todos aportemos algo hace crecer la comunidad.

giulichajari
26-07-2014, 14:31:09
Hola compadre.

Podría sugerirte que en la misma form tengas un grid con los productos que deseas agregar a la factura, de esa forma no harías la consulta cada que abres el formulario de producto, pues no lo tienes.

Respecto a tu segunda consulta, si piensas guardar los datos inmediatamente supongo te convendría más un dbgrid.

No soy un experto pero creo que el que todos aportemos algo hace crecer la comunidad.

Es que tengo el form de agregar productos, lo unico que necesito es ejecutar el query que esta en el dataset de la grilla una sola vez.

Y la segunda consulta la solucione con un stringgrid, deonde voy cargando los productos.
Dado que tengo una tabla de ticket(numero,fecha,hora,importe) y una ticketproducto(idticket,idproducto) donde guardo los productos de cada ticket, pero el insert en estas tablas se va a producir una vez que se emita el ticket, osea que se confirme todo, no puedo ir insertando los articulos apenas se agregan a la grilla, es un especie de archivo que queda ahi, entonces tengo el id de los productos en el stringgrid y luego inserto todo.

octavioallec
29-07-2014, 20:01:39
Hola buenas tardes desde México, con gusto coloco un procedimiento que uso en una aplicación para enviar a un StringGrid (que esta en el FormVentas) el producto seleccionado desde otro form llamado ListProducts.

procedure TFormVtas.AddProduct(Cve, Cant, NotaFact:String);
//El procedimiento solicita los parámetros como String para realizar las consultas sin conversiones

var x,Fila:Word; //Para llevar el control de la fila del StringGrid
Incide:Boolean; //Para determinar si algún producto ya fue agregado con anterioridad
ImpIVA,PUnitIVA:Currency; //Para calcular el precio unitario e importe con los impuestos (IVA en México)

begin {AGREGAR PRODUCTO A LA VENTA}
//Cve es para ingresar el código de barras del producto a través de un TEdit, si Cve lleva el código se usa para buscar el producto, TipoPcio es una variable para indicar el tipo de precio que debera seleccionar en la búsqueda (Público, Docena, Mayoreo, Crédito)
if Cve<>'' then Datos.Query3.SQL.Text:='SELECT Id,Producto,'+TipoPcio+' AS PUnit,Exist,Observ,Foto,SAT FROM productos WHERE IdOficina='''+Datos.IdOficina+''' AND Codigo='''+Cve+''''
//Si Cve pasa vacío entonces se busca por ID del producto, usando directamente el dato de la otra forma LisProducts
else Datos.Query3.SQL.Text:='SELECT Id,Producto,'+TipoPcio+' AS PUnit,Exist,Observ,Foto,SAT FROM productos WHERE IdOficina='''+Datos.IdOficina+''' AND Id='+Datos.ClientData3.FieldByName('Id').AsString;
Datos.Query3.Open;

if not Datos.Query3.IsEmpty then
if (Datos.Query3.FieldByName('Exist').AsInteger>=1) or (Datos.ProdZero=True) then //ProdZero es un variable boleana para saber si la aplicación debe o NO descontar el producto de los inventarios o almacenes
begin
Incide:=False;
Fila:=Grid1.RowCount;
for x:=0 to Grid1.RowCount-1 do
if Datos.Query3.FieldByName('Id').AsString=Grid1.Cells[6,x] then //Se determina si existe algún producto repetido en la posible venta
begin
Incide:=True;
Break;
end;
if Incide then //Si existe alguna incidencia, sólo se modifica la cantidad, un poco más adelante se solicita recalcular los importes y total de la posible venta
begin
if (Datos.Query3.FieldByName('Exist').AsInteger>StrToInt(Grid1.Cells[1,x])) or (Datos.ProdZero=True) then
if Cant='' then Grid1.Cells[1,x]:=IntToStr(StrToInt(Grid1.Cells[1,x])+1)
else Grid1.Cells[1,x]:=CurrToStr(StrToInt(Grid1.Cells[1,x])+StrToCurr(Cant))
else ShowMessage('La cantidad solicitada no puede ser cubierta, no hay suficiente producto');
end else
begin
if Grid1.Cells[1,0]<>'' then
begin
Inc(Fila);
Grid1.RowCount:=Fila;
end;

CalcPcioUnit(Datos.Query3.FieldByName('PUnit').AsCurrency,ImpIVA,PUnitIVA); //Esta función la uso para determinar el precio con los impuestos incluidos, como TODO el código, lo puedes ajustar a tus necesidades (espero te sea de utilidad).

if Cant='' then Grid1.Cells[1,Fila-1]:='1'
else Grid1.Cells[1,Fila-1]:=Cant; //SE ASIGNA LA CANTIDAD DE LOS PRODUCTOS DE UN TICKET QUE SERÁ FACTURADO

Grid1.Cells[2,Fila-1]:=Datos.Query3.FieldByName('Producto').AsString; //Se ingresan los datos en el StrinGrid
//Grid1.Cells[3,Fila-1] //SE ASIGNA EN EL PROCEDIMIENTO CALCTOTAL
//Grid1.Cells[4,Fila-1] //SE ASIGNA EN EL PROCEDIMIENTO CALCTOTAL
Grid1.Cells[5,Fila-1]:=''; //SIN DATOS PARA CUIDAR LA VISUALIZACIÓN
Grid1.Cells[6,Fila-1]:=Datos.Query3.FieldByName('Id').AsString;
Grid1.Cells[7,Fila-1]:=Datos.Query3.FieldByName('PUnit').AsString;
Grid1.Cells[8,Fila-1]:=CurrToStr(ImpIVA);
Grid1.Cells[9,Fila-1]:=CurrToStr(PUnitIVA);
Grid1.Cells[10,Fila-1]:=Datos.Query3.FieldByName('Foto').AsString;
Grid1.Cells[11,Fila-1]:=TipoPcio;
Grid1.Cells[13,Fila-1]:=NotaFact;

try
if Grid1.Cells[10,Grid1.Row]<>'.' then Image1.Picture.LoadFromFile(Datos.PathProdImg+'\'+Grid1.Cells[10,Grid1.Row]+'.jpg') //Aquí se inserta la referencia de la fotografía del producto seleccionado
else Image1.Picture:=nil; //En caso de NO existir o fallas en la asignación se limpia el Image
except
Image1.Picture:=nil;
end;
end;
CalcTotal; //Procedimiento para calcular todos los importes de cada producto y el total de la posible venta
Edit3.Clear;
Edit3.SetFocus;
end else ShowMessage('La cantidad solicitada no puede ser cubierta, no hay suficiente producto')
else ShowMessage('Producto no registrado, pida asesoría con el administrador');
Datos.Connection1.Close; //Al terminar se cierra la conexión a la base de datos.
end;

He tratado de documentarlo lo mejor que me ha sido posible, espero que te sea de ayuda. Saludos.

giulichajari
29-07-2014, 21:53:00
Gracias @octavioallec por tomarte ese trabajo!
Igualmente encontre en internet que es mas eficiente colocar un clientdataset y un dbgrid, es muy largo para explicar aca el proceso para crearlo, pero igual voy a probar ese codigo.,