Ver Mensaje Individual
  #4  
Antiguo 29-07-2014
octavioallec octavioallec is offline
Miembro
 
Registrado: oct 2007
Posts: 17
Reputación: 0
octavioallec Va por buen camino
Código de ejmplo

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.

Código Delphi [-]
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.

Última edición por Casimiro Notevi fecha: 29-07-2014 a las 20:52:50.
Responder Con Cita