Como faço para o sistema obedecer o comando do checkbox?
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:
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.
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.
Adriano_servitec
Curtidas 0
Respostas
Adriano_servitec
08/07/2008
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
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.
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
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.
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.
GOSTEI 0
Adriano_servitec
08/07/2008
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;GOSTEI 0
Adriano_servitec
08/07/2008
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
A parte que estou querendo que salva no arquivo é esta aqui
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´);GOSTEI 0
Adriano_servitec
08/07/2008
Eu só preciso saber como faço este loop deste for aqui
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
...
...
...
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
...
...
...
GOSTEI 0
Adriano_servitec
08/07/2008
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
GOSTEI 0