Status mensagem
Bom dia,
Preciso muito de uma ajuda para alterar o status das minhas mensagens.
Exemplo: se eu envio uma mensagem para 3 usuários.. eu tenho que salvar como recebido apenas aquele usuário que já abriu o sistema e viu ... ai coloquei para mostrar no dbgrid e no clique dele, coloquei para alterar para recebido... ele até altera, porém... só altera o primeiro registro
Eu fiz assim:
if (dm.cdsrelusumsg.fieldbyname('Status').asstring = 'Enviado') and (dm.cdsrelusumsg.FieldByName('codigousu').AsString = quotedstr(xpubusu)) then
begin
dm.cdsrelusumsg.Edit;
dm.cdsrelusumsg.fieldbyname('Status').asstring:='Recebido';
dm.cdsrelusumsg.Post;
dm.cdsrelusumsg.ApplyUpdates(0);
end;
DBMemo1.Visible:=True;
Tem algo de errado para não salvar e nem alterar nada?
Preciso muito de uma ajuda para alterar o status das minhas mensagens.
Exemplo: se eu envio uma mensagem para 3 usuários.. eu tenho que salvar como recebido apenas aquele usuário que já abriu o sistema e viu ... ai coloquei para mostrar no dbgrid e no clique dele, coloquei para alterar para recebido... ele até altera, porém... só altera o primeiro registro
Eu fiz assim:
if (dm.cdsrelusumsg.fieldbyname('Status').asstring = 'Enviado') and (dm.cdsrelusumsg.FieldByName('codigousu').AsString = quotedstr(xpubusu)) then
begin
dm.cdsrelusumsg.Edit;
dm.cdsrelusumsg.fieldbyname('Status').asstring:='Recebido';
dm.cdsrelusumsg.Post;
dm.cdsrelusumsg.ApplyUpdates(0);
end;
DBMemo1.Visible:=True;
Tem algo de errado para não salvar e nem alterar nada?
P. Azeredo
Curtidas 0
Respostas
Valquiria Silva
14/07/2014
Olá Priscila.
Assim como está apenas o registro selecionado na linha do DbGrid será alterado.
Para alterar todos, você teria que percorrer todos os registros modificando os status.
Assim como está apenas o registro selecionado na linha do DbGrid será alterado.
Para alterar todos, você teria que percorrer todos os registros modificando os status.
GOSTEI 0
P. Azeredo
14/07/2014
E como eu poderia fazer isso?
Pode me dar uma ajuda?
Eu teria que colocar:
dm.cdsrelusumsg.first;
while not dm.cdsrelusumsg.eof do
begin
if (dm.cdsrelusumsg.fieldbyname('Status').asstring = 'Enviado') and (dm.cdsrelusumsg.FieldByName('codigousu').AsString = quotedstr(xpubusu)) then
begin
dm.cdsrelusumsg.Edit;
dm.cdsrelusumsg.fieldbyname('Status').asstring:='Recebido';
dm.cdsrelusumsg.Post;
dm.cdsrelusumsg.ApplyUpdates(0);
end;
DBMemo1.Visible:=True;
dm.cdsrelusumsg.next;
Pode me dar uma ajuda?
Eu teria que colocar:
dm.cdsrelusumsg.first;
while not dm.cdsrelusumsg.eof do
begin
if (dm.cdsrelusumsg.fieldbyname('Status').asstring = 'Enviado') and (dm.cdsrelusumsg.FieldByName('codigousu').AsString = quotedstr(xpubusu)) then
begin
dm.cdsrelusumsg.Edit;
dm.cdsrelusumsg.fieldbyname('Status').asstring:='Recebido';
dm.cdsrelusumsg.Post;
dm.cdsrelusumsg.ApplyUpdates(0);
end;
DBMemo1.Visible:=True;
dm.cdsrelusumsg.next;
GOSTEI 0
Valquiria Silva
14/07/2014
Isso. Mas dar um edit e um post num laço dentro do mesmo ClientDataSet deixa o cursor perdido, o ideal é clonar esse dataset e ai sim atualizar, ou ainda, marcar todas as linhas que você quer atualizar e mandar um comando Update.
Mas não entendi uma coisa, vc disse :
Quem deve alterar este status? O usuário ao entrar no sistema pela grid?
Mas não entendi uma coisa, vc disse :
se eu envio uma mensagem para 3 usuários.. eu tenho que salvar como recebido apenas aquele usuário que já abriu o sistema e viu
Quem deve alterar este status? O usuário ao entrar no sistema pela grid?
GOSTEI 0
P. Azeredo
14/07/2014
" o ideal é clonar esse dataset e ai sim atualizar, ou ainda, marcar todas as linhas que você quer atualizar e mandar um comando Update."
Eu não compreendi!
Eu tentei dar um Update, mas diz que está com erro de síntaxe.
Sim, quem altera o status, é o usuário. Quando ele dá dois cliques na mensagem, a mensagem abre embaixo e o status altera para RECEBIDO.
Eu não compreendi!
Eu tentei dar um Update, mas diz que está com erro de síntaxe.
Sim, quem altera o status, é o usuário. Quando ele dá dois cliques na mensagem, a mensagem abre embaixo e o status altera para RECEBIDO.
GOSTEI 0
Valquiria Silva
14/07/2014
Entendi.
neste caso se aparecerem 3 mensagens, o usuário tem que clicar em uma de cada vez e atualizar o status? Você tem tela pra mostrar essas mensagens?
Se for isso:
no doubleclick da grid
if (dm.cdsrelusumsg.fieldbyname('Status').asstring = 'Enviado') and (dm.cdsrelusumsg.FieldByName('codigousu').AsString = quotedstr(xpubusu)) then
begin
dm.cdsrelusumsg.Edit;
dm.cdsrelusumsg.fieldbyname('Status').asstring:='Recebido';
dm.cdsrelusumsg.Post;
DBMemo1.Visible:=True;
end;
e ao sair dessa tela
dm.cdsrelusumsg.ApplyUpdates(0);
neste caso se aparecerem 3 mensagens, o usuário tem que clicar em uma de cada vez e atualizar o status? Você tem tela pra mostrar essas mensagens?
Se for isso:
no doubleclick da grid
if (dm.cdsrelusumsg.fieldbyname('Status').asstring = 'Enviado') and (dm.cdsrelusumsg.FieldByName('codigousu').AsString = quotedstr(xpubusu)) then
begin
dm.cdsrelusumsg.Edit;
dm.cdsrelusumsg.fieldbyname('Status').asstring:='Recebido';
dm.cdsrelusumsg.Post;
DBMemo1.Visible:=True;
end;
e ao sair dessa tela
dm.cdsrelusumsg.ApplyUpdates(0);
GOSTEI 0
P. Azeredo
14/07/2014
Fiz o que você falou e continua sem salvar! Nem alterando mais no dbgrid está... Porque isso acontece? Se está tudo correto, até onde eu sei?
GOSTEI 0
Valquiria Silva
14/07/2014
Oi Priscila, faça o Debug do código pra verificar se ele está passando pelo click, e se está entrando no trecho de código que altera o status.
GOSTEI 0
P. Azeredo
14/07/2014
Não está passando
GOSTEI 0
P. Azeredo
14/07/2014
Eu tirei a parte do usuário e ele passou e alterou, porém, não modificou na tabela ainda. Altera no dbgrid e não salva no banco de dados.
GOSTEI 0
Valquiria Silva
14/07/2014
Ok.
Volte o comando
dm.cdsrelusumsg.ApplyUpdates(0);
para onde estava assim:
if (dm.cdsrelusumsg.fieldbyname('Status').asstring = 'Enviado') then
begin
dm.cdsrelusumsg.Edit;
dm.cdsrelusumsg.fieldbyname('Status').asstring:='Recebido';
dm.cdsrelusumsg.Post;
dm.cdsrelusumsg.ApplyUpdates(0);
DBMemo1.Visible:=True;
end;
veja se salva
Volte o comando
dm.cdsrelusumsg.ApplyUpdates(0);
para onde estava assim:
if (dm.cdsrelusumsg.fieldbyname('Status').asstring = 'Enviado') then
begin
dm.cdsrelusumsg.Edit;
dm.cdsrelusumsg.fieldbyname('Status').asstring:='Recebido';
dm.cdsrelusumsg.Post;
dm.cdsrelusumsg.ApplyUpdates(0);
DBMemo1.Visible:=True;
end;
veja se salva
GOSTEI 0
P. Azeredo
14/07/2014
Ele altera no dbgrid, mas nada de alteração no banco de dados... Se eu fechar e voltar para aquela tela, ele volta como Enviado... Ain Deus!
GOSTEI 0
Valquiria Silva
14/07/2014
Não da erro? Nem nada?
Qual o tipo deste campo no banco de dados?
Este field ele é um campo calculado?
Qual o tipo deste campo no banco de dados?
Este field ele é um campo calculado?
GOSTEI 0
P. Azeredo
14/07/2014
Esse campo é VCHAR e não deu nenhum erro... ele passa pela linha, troca no dbgrid. Porém, não salva nada
Deixa eu te falar uma coisa...
Não sei se estou fazendo certo, mas sabe como eu coloquei para ficar como Enviado?
Na hora de enviar a mensagem e salvar na tabela... eu coloquei p o status salvar como ENVIADO
Será que é por isso que está dando problema? Eu deveria salvar de outra forma?
Deixa eu te falar uma coisa...
Não sei se estou fazendo certo, mas sabe como eu coloquei para ficar como Enviado?
Na hora de enviar a mensagem e salvar na tabela... eu coloquei p o status salvar como ENVIADO
Será que é por isso que está dando problema? Eu deveria salvar de outra forma?
GOSTEI 0
Valquiria Silva
14/07/2014
E como "ENVIADO" ele salva?
Qual o tipo deste campo no Banco de dados? Varchar de que tamanho?
Qual o tipo deste campo no Banco de dados? Varchar de que tamanho?
GOSTEI 0
P. Azeredo
14/07/2014
Sim, está salvando como ENVIADO... Porém, como RECEBIDO não.
Varchar(200)
Varchar(200)
GOSTEI 0
Valquiria Silva
14/07/2014
que Mistério.
Ele está executando o ApplyUpdates, certo?
Se estiver, faça um teste no data module (dm) no cds (cdsrelusumsg) tem um evento chamado ReconcileError
se houver algum erro durante o processo ele vai passar por este evento
então faça o erro aparecer na tela assim:
procedure Tdm.cdsrelusumsgReconcileError(DataSet: TCustomClientDataSet;
E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
inherited;
ShowMessage(e.Message);
end;
e veja se aparece alguma mensagem
Ele está executando o ApplyUpdates, certo?
Se estiver, faça um teste no data module (dm) no cds (cdsrelusumsg) tem um evento chamado ReconcileError
se houver algum erro durante o processo ele vai passar por este evento
então faça o erro aparecer na tela assim:
procedure Tdm.cdsrelusumsgReconcileError(DataSet: TCustomClientDataSet;
E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
inherited;
ShowMessage(e.Message);
end;
e veja se aparece alguma mensagem
GOSTEI 0
Valquiria Silva
14/07/2014
Priscila
você disse
onde exatamente você setou essas informações?
você disse
Na hora de enviar a mensagem e salvar na tabela... eu coloquei p o status salvar como ENVIADO
onde exatamente você setou essas informações?
GOSTEI 0
P. Azeredo
14/07/2014
Na tela de enviar mensagem... Coloquei p salvar no campo status:=enviado
GOSTEI 0
Valquiria Silva
14/07/2014
Olá Priscila.
Acho que não consigo te ajudar sem depurar seu código.
Minha última dica é que você verifique se neste "cdsrelusumsg" existe algum evento com código, e se existir verificar o que ele esta fazendo.
Você me disse que na hora de salvar coloca o status como enviado, esse " na hora de salvar" é um evento do ClientDataSet?
Se for o problema está ai pq independente do que vc passar para o status quando o registro for salvo irá passar por este trecho de código e salvar como ENVIADO.
Desculpe não poder ajudar mais.
Abs.
Acho que não consigo te ajudar sem depurar seu código.
Minha última dica é que você verifique se neste "cdsrelusumsg" existe algum evento com código, e se existir verificar o que ele esta fazendo.
Você me disse que na hora de salvar coloca o status como enviado, esse " na hora de salvar" é um evento do ClientDataSet?
Se for o problema está ai pq independente do que vc passar para o status quando o registro for salvo irá passar por este trecho de código e salvar como ENVIADO.
Desculpe não poder ajudar mais.
Abs.
GOSTEI 0
P. Azeredo
14/07/2014
Obrigada por sua paciÊncia e ajuda.
Ficou assim:
Resolvido:
begin
xtxt:='select * from usumsg where codigousu =' + QuotedStr(IntToStr(xpubfun))+' and codigomsg ='+ QuotedStr(dm.cdsrelusumsgcodigomsg.asstring);
dm.cdsusumsg.Active:=false;
dm.sqlusumsg.SQL.Clear;
dm.sqlusumsg.SQL.Text:=xtxt;
dm.sqlusumsg.ExecSQL();
dm.cdsusumsg.Active:=true;
if (dm.cdsrelusumsg.fieldbyname('Status').asstring = 'Enviado') then
begin
dm.cdsusumsg.Edit;
dm.cdsusumsg.fieldbyname('Status').asstring:='Recebido';
dm.cdsusumsg.Post;
dm.cdsusumsg.applyupdates(0);
dm.cdsrelusumsg.Active:=False;
dm.cdsrelusumsg.Active:=True;
end;
Ficou assim:
Resolvido:
begin
xtxt:='select * from usumsg where codigousu =' + QuotedStr(IntToStr(xpubfun))+' and codigomsg ='+ QuotedStr(dm.cdsrelusumsgcodigomsg.asstring);
dm.cdsusumsg.Active:=false;
dm.sqlusumsg.SQL.Clear;
dm.sqlusumsg.SQL.Text:=xtxt;
dm.sqlusumsg.ExecSQL();
dm.cdsusumsg.Active:=true;
if (dm.cdsrelusumsg.fieldbyname('Status').asstring = 'Enviado') then
begin
dm.cdsusumsg.Edit;
dm.cdsusumsg.fieldbyname('Status').asstring:='Recebido';
dm.cdsusumsg.Post;
dm.cdsusumsg.applyupdates(0);
dm.cdsrelusumsg.Active:=False;
dm.cdsrelusumsg.Active:=True;
end;
GOSTEI 0