unit ulistaproduto;

interface

uses
  Windows, Messages, variants, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, DBTables, jpeg, Grids, DBGrids, StdCtrls, ExtCtrls, ComCtrls, ActnList,
  Buttons, DBCtrls;

type

THackDBGrid = class(TDBGrid);

  Tflistaproduto = class(TForm)
    DataSource1: TDataSource;
    ActionList1: TActionList;
    inserir: TAction;
    formatar: TAction;
    filtrar: TAction;
    foco: TAction;
    fimagem: TAction;
    cmodelo: TAction;
    combos: TAction;
    Table1: TTable;
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    SpeedButton1: TSpeedButton;
    combonome: TComboBox;
    combomodelo: TComboBox;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    combogrupo: TComboBox;
    Label3: TLabel;
    cnome: TAction;
    Label4: TLabel;
    Bevel1: TBevel;
    Bevel2: TBevel;
    Edit1: TEdit;
    StatusBar1: TStatusBar;
    DBGrid1: TDBGrid;
    Image1: TDBImage;
    Panel5: TPanel;
    ajuda: TAction;
    estoque: TAction;
    procedure FormActivate(Sender: TObject);
    procedure inserirExecute(Sender: TObject);
    procedure formatarExecute(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure filtrarExecute(Sender: TObject);
    procedure combonomeChange(Sender: TObject);
    procedure combomodeloChange(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure DBGrid1Enter(Sender: TObject);
    procedure DBGrid1Exit(Sender: TObject);
    procedure focoExecute(Sender: TObject);
    procedure Image1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure fimagemExecute(Sender: TObject);
    procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure table1AfterScroll(DataSet: TDataSet);
    procedure cmodeloExecute(Sender: TObject);
    procedure combosExecute(Sender: TObject);
    procedure combomodeloDropDown(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure combogrupoChange(Sender: TObject);
    procedure combonomeDropDown(Sender: TObject);
    procedure cnomeExecute(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ajudaExecute(Sender: TObject);
    procedure estoqueExecute(Sender: TObject);
  private
   procedure AppHint(Sender : TObject);
    { Private declarations }
  public
  st, cx : string;
    { Public declarations }
  end;

var
  flistaproduto: Tflistaproduto;

implementation

uses UPedido, upedidofornecedor, UNota,
  ubalcao, udm, shellapi, uentrada;



procedure tflistaproduto.AppHint(Sender: TObject);
begin
  StatusBar1.Panels[0].Text := Application.Hint;
end;

{$R *.DFM}

procedure Tflistaproduto.FormActivate(Sender: TObject);
begin
  THackDBGrid(DBGrid1).FixedCols := 7;
   combosexecute(self);
    formatarexecute(self);

end;

procedure Tflistaproduto.inserirExecute(Sender: TObject);
var
prod:string;

begin

  if st <>'nenhum' then begin

  cx:='1';
   if inputquery ('Quantidade','Digite aqui a quantidade', cx) then begin

   if table1['produto'] <> null then prod := table1['produto'];
    if table1['descricao'] <> null then prod := prod + ' ' + table1['descricao'];

        if st = 'entrada' then begin
         fdm.tbentradaitem.insert;
          fdm.tbentradaitem['codigo'] := table1['codigo'];
           fdm.tbentradaitem['nome'] := prod;
            fdm.tbentradaitem['vrunit'] := table1['vrunit'];
             fdm.tbentradaitem['un'] := table1['un'];
              fdm.tbentradaitem['qtd'] := strtofloat(cx);
               fdm.tbentradaitem['total'] := (fdm.tbentradaitem.fieldbyname ('vrunit') as tfloatfield).Value * (fdm.tbentradaitem.fieldbyname ('qtd') as tfloatfield).Value;
                fentrada.totalizarExecute(self);
            end;

        if st = 'pedidofornecedor' then begin
         fdm.tbpedidofornecedoritem.insert;
          fdm.tbpedidofornecedoritem['codigo'] := table1['codigo'];
           fdm.tbpedidofornecedoritem['nome'] := prod;
            fdm.tbpedidofornecedoritem['vrunit'] := table1['vrunit'];
             fdm.tbpedidofornecedoritem['un'] := table1['un'];
              fdm.tbpedidofornecedoritem['qtd'] := strtofloat(cx);
               fdm.tbpedidofornecedoritem['total'] := (fdm.tbpedidofornecedoritem.fieldbyname ('vrunit') as tfloatfield).Value * (fdm.tbpedidofornecedoritem.fieldbyname ('qtd') as tfloatfield).Value;
                fdm.tbpedidofornecedoritem['saldo'] := (fdm.tbpedidofornecedoritem.fieldbyname ('qtd') as tfloatfield).Value - (fdm.tbpedidofornecedoritem.fieldbyname ('qtdentrada') as tfloatfield).Value;

                fpedidofornecedor.totalizarExecute(self);
            end;

        if st = 'pedido' then begin
         fdm.tbpedidoitem.insert;
          fdm.tbpedidoitem['codigo'] := table1['codigo'];
           fdm.tbpedidoitem['nome'] := prod;
            fdm.tbpedidoitem['vrunit'] := table1['vrvenda'];
             fdm.tbpedidoitem['un'] := table1['un'];
              fdm.tbpedidoitem['codigobarra'] := table1['codigobarra'];
               fdm.tbpedidoitem['qtd'] := strtofloat(cx);
                fdm.tbpedidoitem['total'] := (fdm.tbpedidoitem.fieldbyname ('vrunit') as tfloatfield).Value * (fdm.tbpedidoitem.fieldbyname ('qtd') as tfloatfield).Value;
                 fdm.tbpedidoitem['saldo'] := (fdm.tbpedidoitem.fieldbyname ('qtd') as tfloatfield).Value - (fdm.tbpedidoitem.fieldbyname ('qtdentrada') as tfloatfield).Value;

                 fpedido.totalizarExecute(self);
            end;

        if st = 'balcao' then begin
         fbalcao.Timer1.Enabled := false;
          fbalcao.timer2.Enabled := false;
           fdm.tbbalcao.insert;
            fdm.tbbalcao['codigo'] := table1['codigo'];
             fdm.tbbalcao['nome'] := prod;
              fdm.tbbalcao['vrunit'] := table1['vrvenda'];
               fdm.tbbalcao['un'] := table1['un'];
                fdm.tbbalcao['codigobarra'] := table1['codigobarra'];
                 fdm.tbbalcao['qtd'] := strtofloat(cx);
                  fdm.tbbalcao['total'] := (fdm.tbbalcao.fieldbyname ('vrunit') as tfloatfield).Value * (fdm.tbbalcao.fieldbyname ('qtd') as tfloatfield).Value;

                   fbalcao.Panel22.Caption := '';
                    fbalcao.totalizarExecute(self);
            end;


        if st = 'nota' then begin
         fdm.tbnotaitem.insert;
          fdm.tbnotaitem['codigo'] := table1['codigo'];
           fdm.tbnotaitem['nome'] := prod;
            fdm.tbnotaitem['vrunit'] := table1['vrvenda'];
             fdm.tbnotaitem['un'] := table1['un'];
              fdm.tbnotaitem['qtd'] := strtofloat(cx);
               fdm.tbnotaitem['total'] := (fdm.tbnotaitem.fieldbyname ('vrunit') as tfloatfield).Value * (fdm.tbnotaitem.fieldbyname ('qtd') as tfloatfield).Value;

                fnota.totalizarExecute(self);
            end;
             end;
            end else
                Application.MessageBox('Você está apenas consultando, não pode usar este recurso!!!','ERRO',MB_OK + MB_ICONERROR);

                  
end;

procedure Tflistaproduto.formatarExecute(Sender: TObject);
begin
 (table1.fieldbyname ('codigo') as tfloatfield).displayformat := '000000';
  (table1.fieldbyname ('vrvenda') as tfloatfield).displayformat := '###,##0.00';

end;

procedure Tflistaproduto.SpeedButton1Click(Sender: TObject);
var
i:integer;
begin              
        table1.Filtered := false;
         table1.CancelRange;

        for i :=0 to componentcount -1 do
         if components[i] is tcombobox then
          tcombobox(components[i]).text := '';
           edit1.Clear;

end;

procedure Tflistaproduto.filtrarExecute(Sender: TObject);
begin
        table1.Filtered := false;
         table1.Filter := 'produto = ''' + uppercase(combonome.text) +'*''';
          table1.Filtered := true;

end;

procedure Tflistaproduto.combonomeChange(Sender: TObject);
begin

      if combonome.Text = '' then
       combogrupoChange(self)
       else begin

        if combogrupo.text <> '' then
         table1.Filter := 'sigla = ''' + uppercase(combogrupo.text) + ''' and produto = ''' + uppercase(combonome.text) +'*'''
        else
         table1.Filter := 'produto = ''' + uppercase(combonome.text) +'*''';

          table1.Filtered := true;

           combomodelo.Clear;
            end;

end;

procedure Tflistaproduto.combomodeloChange(Sender: TObject);
begin

      if combomodelo.Text = '' then begin
      combogrupoChange(self);
      combonomeChange(self);

      end else begin

        if (combogrupo.text <> '') and (combonome.text <> '') then
         table1.Filter := 'sigla = ''' + uppercase(combogrupo.text) + ''' and produto = ''' + uppercase(combonome.text) + ''' and descricao = ''' + uppercase(combomodelo.text) +'*'''

        else  if (combogrupo.text <> '') and (combonome.text = '') then
         table1.Filter := 'sigla = ''' + uppercase(combogrupo.text) + ''' and descricao = ''' + uppercase(combomodelo.text) +'*'''

        else  if (combogrupo.text = '') and (combonome.text <> '') then
         table1.Filter := 'produto = ''' + uppercase(combonome.text) + ''' and descricao = ''' + uppercase(combomodelo.text) +'*'''

         else
         table1.Filter := 'descricao = ''' + uppercase(combomodelo.text) +'*''';

          table1.Filtered := true;

          end;
end;

procedure Tflistaproduto.FormKeyPress(Sender: TObject; var Key: Char);
begin
 if key=#13 then begin
  key := #0;
       Perform(WM_nextdlgctl,0,0);
 end Else if Key = #27 then
   Perform(WM_nextdlgctl,1,0);
end;

procedure Tflistaproduto.DBGrid1Enter(Sender: TObject);
begin
        keypreview := false;

end;

procedure Tflistaproduto.DBGrid1Exit(Sender: TObject);
begin
        keypreview := true;
end;

procedure Tflistaproduto.focoExecute(Sender: TObject);
begin
        if dbgrid1.Focused = true then
        combonome.SetFocus
        else
        dbgrid1.SetFocus;
end;

procedure Tflistaproduto.Image1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
       if image1.Width < 430 then begin
        if key = 107 then begin
         image1.width := image1.width + 10;
          image1.height := image1.height + 10;
           image1.left := image1.left - 5;
            image1.top := image1.top - 5;
           end;
           end;

        if image1.Width > 120 then begin
        if key = 109 then begin
         image1.width := image1.width - 10;
          image1.height := image1.height - 10;
           image1.left := image1.left + 5;
            image1.top := image1.top + 5;
             end;
              end;

        if key = 27 then begin
         image1.Hide;
          dbgrid1.setfocus;
           end;

end;

procedure Tflistaproduto.fimagemExecute(Sender: TObject);
 var
  pt : String;
begin
      if table1['imagem'] <> null then begin
       pt := table1['imagem'] ;
       if fileexists (pt) then
        image1.Picture.LoadFromFile (pt);
        end else
      image1.Picture.LoadFromFile (extractfilepath(paramstr(0)) + '\imagem\imagem.wmf');
     image1.show;
    dbgrid1.SetFocus;

end;

procedure Tflistaproduto.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
        if key = vk_f4 then begin
         if image1.Visible = false then
          fimagemexecute(self)
         else
          image1.Hide;
        end;
end;

procedure Tflistaproduto.table1AfterScroll(DataSet: TDataSet);
 var
  pt : String;
begin

     if image1.Visible = true then begin
      if table1['imagem'] <> null then begin
       pt := table1['imagem'] ;
       if fileexists (pt) then
        image1.Picture.LoadFromFile (pt);
        end else
      image1.Picture.LoadFromFile (extractfilepath(paramstr(0)) + '\imagem\imagem.wmf');
end;


end;

procedure Tflistaproduto.cmodeloExecute(Sender: TObject);

begin

   with fdm.query1 do begin
    close;
     sql.clear;

     if (combogrupo.text <> '') and(combonome.Text <> '') then
      sql.add ('select distinct descricao from tbproduto where sigla = "' + uppercase(combogrupo.text)+ '" and produto = "' + uppercase(combonome.text)+ '" order by descricao')

     else if (combogrupo.text <> '') and(combonome.Text = '') then
      sql.add ('select distinct descricao from tbproduto where sigla = "' + uppercase(combogrupo.text)+ '" order by descricao')

     else if (combogrupo.text = '') and(combonome.Text <> '') then
      sql.add ('select distinct descricao from tbproduto where produto = "' + uppercase(combonome.text)+ '" order by descricao')

     else
      sql.add ('select distinct descricao from tbproduto order by descricao');
       open;
        end;

    combomodelo.Items.Clear;

    fdm.query1.First;
    While not fdm.query1.Eof do begin
    if fdm.query1['descricao'] <> null then
    combomodelo.Items.add(fdm.query1['descricao']);

    fdm.query1.Next;

    end;

end;

procedure Tflistaproduto.combosExecute(Sender: TObject);
begin

       with fdm.query1 do begin
        close;
         sql.Clear;
          sql.add(' select distinct sigla from tbproduto order by sigla');
           open;
            end;


       fdm.query1.First;


        combogrupo.Items.Clear;

       while not fdm.query1.Eof do begin
        if fdm.query1['sigla'] <> null then
        combogrupo.Items.Add (fdm.query1['sigla']);
         fdm.query1.Next;
          end;

       with fdm.query1 do begin
        close;
         sql.Clear;
          sql.add(' select distinct produto from tbproduto order by produto');
           open;
            end;

       fdm.query1.First;

       combonome.Items.Clear;

        while not fdm.query1.Eof do begin
        if fdm.query1['produto'] <> null then
        combonome.Items.Add (fdm.query1['produto']);
         fdm.query1.Next;
          end;


       with fdm.query1 do begin
        close;
         sql.Clear;
          sql.add(' select distinct descricao from tbproduto order by descricao');
           open;
            end;


       fdm.query1.First;


        combomodelo.Items.Clear;

       while not fdm.query1.Eof do begin
        if fdm.query1['descricao'] <> null then
        combomodelo.Items.Add (fdm.query1['descricao']);
         fdm.query1.Next;
          end;



end;

procedure Tflistaproduto.combomodeloDropDown(Sender: TObject);
begin
        cmodeloexecute(self);
end;

procedure Tflistaproduto.SpeedButton2Click(Sender: TObject);
begin

        inserirexecute(self);
end;

procedure Tflistaproduto.SpeedButton3Click(Sender: TObject);
var
MSG, st : STRING;
begin

     if table1['produto'] <> null then
      st := table1['produto'];

     if table1['descricao'] <> null then
      st := st + ' ' + table1['descricao'];


    with fdm.query1 do begin
     close;
      sql.clear;
       sql.add ('select distinct fantasia from tbpedidoitem where nome = "'+ st+'"');
        open;
         end;

    while not fdm.query1.Eof do begin
    if fdm.query1['fantasia'] <> null then
    msg := msg + fdm.query1['fantasia']+ #13;
    fdm.query1.next;
    end;

    showmessage('CLIENTES QUE CONSOMEM ' + St+':'+ #13+ #13 + msg);


end;

procedure Tflistaproduto.combogrupoChange(Sender: TObject);
begin

      if combogrupo.Text = '' then
      table1.filtered := false
      else begin

         table1.Filter := 'sigla = ''' + uppercase(combogrupo.text) +'*''';
          table1.Filtered := true;

           if combogrupo.Focused = true then begin
           combomodelo.Clear;
           combonome.Clear ;
           end;
           end;
end;

procedure Tflistaproduto.combonomeDropDown(Sender: TObject);
begin
        cnomeexecute(self);
end;

procedure Tflistaproduto.cnomeExecute(Sender: TObject);
begin
   with fdm.query1 do begin
    close;
     sql.clear;

     if combogrupo.Text <> '' then
      sql.add ('select distinct produto from tbproduto where sigla = "' + uppercase(combogrupo.text)+ '" order by produto')
     else
      sql.add ('select distinct produto from tbproduto order by produto');
       open;
        end;

    combonome.Items.Clear;

    fdm.query1.First;
    While not fdm.query1.Eof do begin
    if fdm.query1['produto'] <> null then
    combonome.Items.add(fdm.query1['produto']);

    fdm.query1.Next;

    end;
end;

procedure Tflistaproduto.Edit1Change(Sender: TObject);
begin
                table1.setrange ([edit1.text], ['Z']);
end;

procedure Tflistaproduto.FormCreate(Sender: TObject);
begin
        Application.OnHint := AppHint;
end;

procedure Tflistaproduto.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin

    Application.OnHint := nil ;
     table1.Close;
      fdm.Query1.Close;
       flistaproduto.Release;
       
end;

procedure Tflistaproduto.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
        if key = 40 then
         table1.Next;

        if key = 38 then
         table1.prior;
end;

procedure Tflistaproduto.ajudaExecute(Sender: TObject);
var
  Comp: Trichedit; // * variável Comp da classe TMemo
  texto : string;
begin
  Comp := Trichedit.Create (Self);  // * cria o componente Memo
  Comp.Parent := Self;    // * exibe o componente criado

  if fileexists (extractfilepath(paramstr(0)) + '\ajuda\ajudalistaproduto.txt') then
   comp.lines.loadfromfile (extractfilepath(paramstr(0)) + '\ajuda\ajudalistaproduto.txt');

  texto := comp.Text;
  comp.Destroy;

  Showmessage (texto);


end;

procedure Tflistaproduto.estoqueExecute(Sender: TObject);
var
tot, tot1: real;
begin

        with fdm.Query1 do begin
         close;
          sql.clear;
           sql.add ('select codigo, nome, sum(qtd)as entrada from tbentradaitem');
            sql.add (' where codigo = "'+ dbgrid1.columns[0].field.text + '" group by codigo, nome');
            open;
        end;

        with fdm.Query2 do begin
         close;
          sql.clear;
           sql.add ('select codigo, nome, sum(qtd) as saida from tbpedidoitem');
            sql.add (' where codigo = "'+ dbgrid1.columns[0].field.text + '" group by codigo, nome');
            open;
        end;

        fdm.tbproduto.Open;

        if fdm.tbproduto.Locate('codigo',fdm.query1['codigo'],[]) then
        tot1:= fdm.tbproduto.FieldByName('minimo').asfloat
        else
        tot1 := 0;

        FDM.tbproduto.close;

        tot := (fdm.query1.fields[2].asfloat - fdm.query2.fields[2].asfloat);

        if fdm.query1['nome'] <> null then
            showmessage('ESTOQUE = ' + floattostr(tot) + ' ' + fdm.query1['nome']+#13+
            'ESTOQUE MÍNIMO = '+ floattostr(tot1))
        else
        showmessage('Estoque Vazio!!!');

             fdm.query1.Close;
              fdm.query2.Close;

end;

end.
