SELECT FOR UPDATE/DELETE

JEANCOELHO 20/05/2010 21:33:52
#342346
Olá alguem já trabalho com esse tipo de query??? se sim agradeço a ajuda, tendo em vista que não consegui material suficiente pra ter uma noção de como fazer! Seria uma consulta que ja na consulta ja trava aquele registro para que nenhum outro usuario tenha acesso a ele ate que o mesmo tenha sido atualizado.


Para ser mais claro eu preciso que quando um usuario abrir um registro nenhum outro usuario consiga acesso a ele mesmo que somente leitura, exemplo Select * From Clientes Where Atrasado = 1 order by id desc

Consequentemente tenho muitos acessos simultaneos dos atendentes, assim acontece de mais de 1 acessar o mesmo dado e ligar 2 x ou mais para a mesma pessoa cobrando, intaum preciso travar o registro de forma que outro usuario nao consiga ver as mesmas informações, se ja estiver na tela de um outro usuario, Não pretendo usar select randonico poderia resolver o problema mas resolveria parcialmente, fazer o select e dar um update logo em seguida tb resolveria so parcialmente tendo em vista que sao mais de 500 atendentes trabalhando o tempo todo, intao o que realmente preciso e uma forma de travar o registro na consulta!

desde já grato!
LLAIA 21/05/2010 09:42:36
#342362
isso não poderia ser obtido pela definição do cursor apropriado no recordset? qual lib vc tá usando pra acessaro BD e qual é o seu BD?
JEANCOELHO 21/05/2010 19:03:18
#342458
Microsoft DAO 3.51 em ms sql 2008
F001E 22/05/2010 10:50:16
#342513
eu faria com uma outra tabela...quando voce der um Select Salva isso em uma outra Tabela com algum STATUS = 1, que dai quando voce for dar o mesmo Select Verifica nessa Tabela...se o Status = 1, nao deixa executar o Select.....é uma idéia....dai quando acabar a operação do Select...voce limpa o Status da Tabela para 0...
JEANCOELHO 24/05/2010 14:15:20
#342620
certo mas como fazer para executar esse update na consulta? essa é a questão pq se eu fizer um select e depois fazer o update pode acontecer de cair o msm registro pra mais de 1 atendente. (ja foi testado dessa forma), andei lendo sobre os cursores mas tudo que tentei com eles nao resultou no esperado, se alguem tiver alguma experiencia maior sobre eles e puder me ajudar, acredito que eles possam ser a resposta da questão!


mas valew a dica! Obrigado!
JEAN.JEDSON 25/05/2010 11:10:30
#342714
Resposta escolhida
esplica melhor a situação...
vc tem a tabela com os chamados.... e tem digamos 2 atendentes que irão entrar no sistema e selecionar o próximo registro para ligar e resolver o chamado. vc seleciona o registro e mostra na tela, e até que seja liberado por este atendente o outro não poderia ver este chamado. seria isto?

select top 1 * from chamado order by dataabertura desc; update chamado set travado=1 where id = (select top id * from chamado order by dataabertura desc);

não sei se desta forma funcionaria... mas pode ser tentado.
a forma mais lógica seria ter uma camada no seu sistema para tratar unicamente os chamados... fazendo um [Ô]empilhamento[Ô] de comandos para atendimento... de forma a ser executado um por um...
JEANCOELHO 25/05/2010 12:28:30
#342716
Retorno essa menssagem de erro:

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

mas estou pesquizando mais sobre!
JEANCOELHO 25/05/2010 12:42:25
#342719
Bom estarei testando sistema da seguinte forma, acredito que possa resolver!

UPDATE [Clientes] SET STATUS = [ô][Ô] & [Ô]Ocupado[Ô] & [Ô][ô],Atendente=[ô][Ô] & User.text & [Ô][ô] WHERE ID = (select TOP 1 ID from Clientes where Atrasado = 1)
SELECT * FROM Clientes WHERE Atendente=[ô][Ô] & User.text & [Ô][ô]

Não sei se vai funcionar mas vamos testar caso alguem saiba como fazer da forma tradicional favor encaminhar por email

jeancoelho1982@hotmail.com


Agradeço a todos que tentaram me ajudar!
Tópico encerrado , respostas não são mais permitidas