Como faço para o sistema obedecer o comando do checkbox?

08/07/2008

1

Pessoal tenho um dbgrid com checkbox

Ai quero fazer o seguinte ao marcar os checkbox dentro deste dbgrid e clicar num botão o sistema verificar quais os checkbox´s marcados e fazer um looping na tabela e chamando a procedure [b:67e6894da7]MontaEnvioEMail[/b:67e6894da7]

Bom esta procedure esta certa, apenas o looping que eu acho não estar funcionando a cada checkbox marcado

Olhem como esta o código que eu fiz pra isso:
with qryEnviaPed do
  begin
    Close;
    SelectSQL.Text := ´ select a.*, b. RAZAO_SOCIAL            ´+
                      ´ from pedidos a, CLIENTESFORENCEDORES b ´+
                      ´ where  b.id_pessoa = a.id_cliente and  ´+
                      ´ MARCAR_CHECK = ´´T´´                   ´;
    Open;
    if not IsEmpty then
    begin
       First;
       while not qryEnviaPed.Eof do {enquanto não for o fim}
       begin
         try
            {:chama a procedure a cada passada}
            MontaEnvioEMail;
            Next;
         except
         on E:Exception do
            begin
              MessageDlg(´Ocorreu um erro neste processo. ´ +#1313 +´Erro gerado: ´+13+
              E.Message + 1313 + ´Todo o processo foi abortado!´, mtError, [mbOk],0);
              Abort;
            end;
         end;
       end;
    end;
  end;


Então ele chega a filtrar os pedidos que estão com o checkbox True, mais não envia todos apenas o primeiro, percebi que é pq os outros que estão marcados não estão selecionados, ai resolvi usar o MultSelect do dbgrid, mais esta enviando todos só que apenas do ultimo que eu selecionei na grade, ou seja se eu tenho 3 selecionados e ai peço para enviar ele envia 3 vezes o ultimo que eu selecionei na grade.


Responder

Posts

Achei que estava resolvido, mais ainda esta dando furo.

Bom eu fiz mais um select para filtrar na hora do looping da tabela

Esta aqui é como ficou o código na hora de enviar, coloquei mais uma procedure ai dentro para filtrar
begin
  with qryEnviaPed do
  begin
    Close;
    SelectSQL.Text := ´ select a.*, b. RAZAO_SOCIAL            ´+
                      ´ from pedidos a, CLIENTESFORENCEDORES b ´+
                      ´ where  b.id_pessoa = a.id_cliente and  ´+
                      ´ MARCAR_CHECK = ´´T´´                   ´;
    Open;
    if not IsEmpty then
    begin
       First;
       while not qryEnviaPed.Eof do {enquanto não for o fim}
       begin
         try
           {:Primeiro chama a procedure que monta a SQL para gerar a Nota do Pedido}
           SQLMontaEnvioEMail;
           {:chama a procedure a cada passada}
           MontaEnvioEMail;
           Next;
         except
         on E:Exception do
           begin
             frmBlibliotecas.Dc_MessageDlg(´Ocorreu um erro neste processo. ´ +#1313 +´Erro gerado: ´+13+
             E.Message + 1313 + ´Todo o processo foi abortado!´, mtError, [mbOk],0);
             Abort;
           end;
        end;
      end;
    end;
  end;


A procedure SQLMontaEnvioEMail é esta aqui, teria que a cada loop na tabela passar pela condição do where e pegar o valor da variavel, mais achei um e-mail que foi enviado que parece que não passou por este filtro, ai marquei menos no dbgrid e ai passou, mais se eu passar muitos parece que por algum motivo deve iginorar esta select ai.
procedure TfrmEnvioemail.SQLMontaEnvioEMail;
var
  Int_ID : integer;
begin
   {:Select para o relatório}
   with dm.qryEnviaPed do
    begin
    Close;
    SQL.Clear;
    SQL.Text := ´ select                                                      ´+
                ´  a.*,                                                       ´+
                ´  b.id_produto,                                              ´+
                ´  b.descricao,                                               ´+
                ´  b.qtde,                                                    ´+
                ´  b.vl_unitario,                                             ´+
                ´  b.descontos,                                               ´+
                ´  b.vl_total,                                                ´+
                ´  b.indice_ipi,                                              ´+
                ´  c.razao_social,                                            ´+
                ´  ( C.ENDERECO||´´ Nº.  ´´||C.NUM_CASA)AS ENDER_NUM,         ´+
                ´  C.COMPLEMENTO,                                             ´+
                ´  (C.BAIRRO||´´ CEP: ´´||C.CEP)as bairro_cep,                ´+
                ´  (c.MUNICIPIO||´´ UF.: ´´||c.ESTADO)as Munic_Uf,            ´+
                ´  (C.CPF_CNPJ||´´ IE/RG nº: ´´|| C.INSC_ESTADUAL)AS CNPJ_IE, ´+
                ´  C.EMAIL,                                                   ´+
                ´  (C.TELEFONE||´´ Fax: ´´||C.FAX)as Tel_Fax,                 ´+
                ´  (C.RESPONSAVELCOMPRAS||´´ TEL.RESP. ´´||C.TELEFONERESPCOMPRAS)AS RESPCOMPRAS_TEL ´+
                ´ from                                                       ´+
                ´  pedidos A,                                                 ´+
                ´  MOVIEMENTOPEDIDO B,                                        ´+
                ´  clientesforencedores c                                     ´+
                ´ where                                                      ´+
                ´     b.id_pedido = a.id                                      ´+
                ´ and                                                        ´+
                ´     a.id_cliente = c.id_pessoa                              ´+
                ´ and                                                        ´+
                ´    a.id = :ID                                               ´;
    Int_ID := dsEnviaPed.DataSet.FieldByName(´ID´).asInteger;
    ParamByName(´ID´).AsInteger := Int_ID;
    Open;
  end;
end;


Bom ai depois é so a procedure de envio de email´s que ja esta configurado certo, pois verifiquei em todos e-mail que eu mandei e esta mandando certo pra todos
procedure TfrmEnvioemail.MontaEnvioEmail;
begin
  {:enviar pedidos, falta fazer os filtros ainda}
  FSMTP_Server   := Edit2.Text; //variavel SMTP
  if Trim(Edit3.Text) <then> 0 then
        raise Exception.Create(´Arquivo está aberto. Feche o Adobe para gravar o pedido´)
      else
        raise E;
    end;
  end;
end;


Então, quase funcionou certo, mais tem algum problema em alguma determinada hora que eu acho que o loop que é feito na hora de enviar esta se perdendo, por isso a variavel não consegue pegar o valor que é preciso para montar o PDF certo, ai quando não passa pela variavel cria uma nota de pedido com todos os itens de todos os clientes em uma só nota.


Responder
Ué não saiu a procedure MontaEnvioEmail e a ultima procedure saiu errado, vou postar de novo elas aqui
procedure TfrmEnvioemail.MontaEnvioEmail;
begin
  {:enviar pedidos, falta fazer os filtros ainda}
  FSMTP_Server   := Edit2.Text; //variavel SMTP
  if Trim(Edit3.Text) <> ´´ then
     FSMTP_Port     := StrToInt(Edit3.Text) //variavel porta
  else
     FSMTP_Port := 25;
  FSMTP_Login    := Edit4.Text; //variavel login do usuario SMTP
  FSMTP_Password := Edit5.Text; //variavel senha do usuario SMTP
  FSMTP_From     := Edit1.Text; //endereco do email de envio
  FSMTP_To       := dsEnviaPed.DataSet.FieldByName(´EMAIL_FORNEC´).AsString; //endereco do email do destino
  FSMTP_Message  := ´Mensagem automática - Envio de Pedido nº ´+dsEnviaPed.DataSet.FieldByName(´ID´).asString; //mensagem enviada

  {:Depois chama a procedure que monta no RBuilder o Relatório da Nota de Pedido}
  EnvioEmail;
  frmBlibliotecas.EnviaPedEmail(´Em anexo envio de pedidos da Empresa Teste Representações Ltda´, ´C:\SysRepresentante\Source\´+wNomarq+´.PDF´);
  frmBlibliotecas.Dc_MessageDlg(´Dados enviados com sucesso´, mtInformation, [mbOK], 0);
end;



procedure TfrmEnvioemail.EnvioEmail;
begin
 try
    {:Gera o arquivo PDF para ser anexado}
    n_Pedido := IntToStr(dsEnviaPed.DataSet.FieldByName(´ID´).AsInteger);
    wNomarq  := ´PD´+FormatDateTime(n_pedido+´.yymmdd´, now);
    ppReport1.DeviceType := ´PDF´;
    ppreport1.AllowPrintToFile := True;
    ppreport1.ShowPrintDialog := False;
    ppReport1.SaveAsTemplate := True;
    ppReport1.SavePrinterSetup := True;
    ppReport1.TextFileName := ´C:\SysRepresentante\Source\´+wNomarq+´.PDF´; //Joga o pdf criado para a pasta aonde esta o programa lá no cliente.
    //ppReport1.PrintReport;
  except
    on E: Exception do
    begin
      if Pos(´Cannot Open File´, E.Message) > 0 then
        raise Exception.Create(´Arquivo está aberto. Feche o Adobe para gravar o pedido´)
      else
        raise E;
    end;
  end;
end;



Responder
Pessoal eu quero gerar um log para ver em qual ponto esta se perdendo a busca da variavel num TXT, mais não esta criando o arquivo, esta mandando para o caption de um botão dentro do form

procedure TfrmEnvioemail.SQLMontaEnvioEMail;
var
  Int_ID : integer;
  SaveFileID : TMemo;
begin
   {:Select para o relatório}
   with dm.qryEnviaPed do
    begin
    Close;
    SQL.Clear;
    SQL.Text := ´ select                                                      ´+
                ´  a.*,                                                       ´+
                ´  b.id_produto,                                              ´+
                ´  b.descricao,                                               ´+
                ´  b.qtde,                                                    ´+
                ´  b.vl_unitario,                                             ´+
                ´  b.descontos,                                               ´+
                ´  b.vl_total,                                                ´+
                ´  b.indice_ipi,                                              ´+
                ´  c.razao_social,                                            ´+
                ´  ( C.ENDERECO||´´ Nº.  ´´||C.NUM_CASA)AS ENDER_NUM,         ´+
                ´  C.COMPLEMENTO,                                             ´+
                ´  (C.BAIRRO||´´ CEP: ´´||C.CEP)as bairro_cep,                ´+
                ´  (c.MUNICIPIO||´´ UF.: ´´||c.ESTADO)as Munic_Uf,            ´+
                ´  (C.CPF_CNPJ||´´ IE/RG nº: ´´|| C.INSC_ESTADUAL)AS CNPJ_IE, ´+
                ´  C.EMAIL,                                                   ´+
                ´  (C.TELEFONE||´´ Fax: ´´||C.FAX)as Tel_Fax,                 ´+
                ´  (C.RESPONSAVELCOMPRAS||´´ TEL.RESP. ´´||C.TELEFONERESPCOMPRAS)AS RESPCOMPRAS_TEL ´+
                ´ from                                                       ´+
                ´  pedidos A,                                                 ´+
                ´  MOVIEMENTOPEDIDO B,                                        ´+
                ´  clientesforencedores c                                     ´+
                ´ where                                                      ´+
                ´     b.id_pedido = a.id                                      ´+
                ´ and                                                        ´+
                ´     a.id_cliente = c.id_pessoa                              ´+
                ´ and                                                        ´+
                ´    a.id = :ID                                               ´;
    Int_ID := dsEnviaPed.DataSet.FieldByName(´ID´).asInteger;
    ParamByName(´ID´).AsInteger := Int_ID;
    Open;
    SaveFileID.Text := IntToStr(Int_ID);
    {:coloquei este comando para ver o que vai salvar no log sqlHistorico.txt}
    SaveFileID.Lines.SaveToFile(´C:\SysRepresentante\Source\Runtime \sqlHistoricoID.txt´);
  end;
end;


A parte que estou querendo que salva no arquivo é esta aqui
SaveFileID.Text := IntToStr(Int_ID);
    {:coloquei este comando para ver o que vai salvar no log sqlHistorico.txt}
    SaveFileID.Lines.SaveToFile(´C:\SysRepresentante\Source\Runtime \sqlHistoricoID.txt´);



Responder
Eu só preciso saber como faço este loop deste for aqui

procedure TfrmEnvioemail.SQLMontaEnvioEMail;
var
  Int_ID, I : integer;
  SaveFileID : TStringList;
begin
   {:Select para o relatório}
   SaveFileID := TStringList.Create; // Cria instancia
   with dm.qryEnviaPed do
    begin
    Close;
    SQL.Clear;
    SQL.Text := ´ select                                                      ´+
                ´  a.*,                                                       ´+
                ´  b.id_produto,                                              ´+
                ´  b.descricao,                                               ´+
                ´  b.qtde,                                                    ´+
                ´  b.vl_unitario,                                             ´+
                ´  b.descontos,                                               ´+
                ´  b.vl_total,                                                ´+
                ´  b.indice_ipi,                                              ´+
                ´  c.razao_social,                                            ´+
                ´  ( C.ENDERECO||´´ Nº.  ´´||C.NUM_CASA)AS ENDER_NUM,         ´+
                ´  C.COMPLEMENTO,                                             ´+
                ´  (C.BAIRRO||´´ CEP: ´´||C.CEP)as bairro_cep,                ´+
                ´  (c.MUNICIPIO||´´ UF.: ´´||c.ESTADO)as Munic_Uf,            ´+
                ´  (C.CPF_CNPJ||´´ IE/RG nº: ´´|| C.INSC_ESTADUAL)AS CNPJ_IE, ´+
                ´  C.EMAIL,                                                   ´+
                ´  (C.TELEFONE||´´ Fax: ´´||C.FAX)as Tel_Fax,                 ´+
                ´  (C.RESPONSAVELCOMPRAS||´´ TEL.RESP. ´´||C.TELEFONERESPCOMPRAS)AS RESPCOMPRAS_TEL ´+
                ´ from                                                       ´+
                ´  pedidos A,                                                 ´+
                ´  MOVIEMENTOPEDIDO B,                                        ´+
                ´  clientesforencedores c                                     ´+
                ´ where                                                      ´+
                ´     b.id_pedido = a.id                                      ´+
                ´ and                                                        ´+
                ´     a.id_cliente = c.id_pessoa                              ´+
                ´ and                                                        ´+
                ´    a.id = :ID                                               ´;
    Int_ID := dsEnviaPed.DataSet.FieldByName(´ID´).asInteger;
    ParamByName(´ID´).AsInteger := Int_ID;
    Open;
    //SaveFileID.Text := IntToStr(Int_ID);
    {:coloquei este comando para ver o que vai salvar no log sqlHistorico.txt}
    for i := 0 to Int_ID; //SaveFileID.Count-1 do
    begin
      //ShowMessage(SaveFileID.Names[i]+´ is ´+SaveFileID.ValueFromIndex[i]);
      SaveFileID.Add(SaveFileID[I]);
    end;
    SaveFileID.SaveToFile(´C:\SysRepresentante\Source\Runtime Packages\sqlHistoricoID.txt´);
  end;
  SaveFileID.Free; // -- Libera da Memória
end; 


Para gravar um arquivo TXT como todos os dados

Resultado de como gravou no arquivo gerado
127
127

sendo que tem que vir
127
130
132
134
...
...
...


Responder
Usei um componente memo mesmo para listar, não estava conseguindo mesmo, então vai ficar assim dentro de um memo invisivel e depois salvo o conteudo do memo usando o savetofile


Responder