Travar Registros no IB
Tenho uma tabela de notas fiscais, e a mesma pode ser acessada por n usuarios.
mostro todos os registros em uma pesquisa para os usuarios ´A´ e ´B´.
O usuario ´A´ quer trabalhar a NF nro 10, e pega o registro para trabalhar.
No Oracle eu uso
CODE
SELECT * FROM TB_NF WHERE NOTA = 10 FOR UPDATE NO WAIT
para travar o registro para o usuario ´A´.
O usuario ´´B´ quer trabalhar também a NF nro 10, e tenta pegar o registro para trabalhar, no Oracle eu sei que se o usuario ´A´ está trabalhando com o comando
CODE
SELECT * FROM TB_NF WHERE NOTA = 10 FOR UPDATE NO WAIT
Se eu não conseguir dar um ´Lock´ travar o registro é porque ele esta em uso.
Gostaria se é possível travar apenas um registro para uso no Interbase.
Entendeu?
No help do SQL do interbase existe o comando NO WAIT porém pesquisando na net encontrei em algumas apostilas que o IB nao trava os registros.
A maneira mais fácil que conheço é tratando os registros por TAG(marca).
Ex.:
O usuario ´A´ quer trabalhar a NF nro 10, e pega o registro para trabalhar.
Então dou um UPDATE no campo TAG para 1.
O usuario ´´B´ quer trabalhar também a NF nro 10, e tenta pegar o registro para trabalhar.
Então verifico na tabela se a TAG do registro está em 0, se não o mesmo está em uso.
Mas isso é muito usado em Paradox, e acho que um banco legal como o Ib deveria ter esse recurso.
Obs.: Estarei testando o Firebird pois em alguns sites dizem que a versão 1.5 tem o comando que eu quero ´WHIT NO WAIT´
Obrigado a todos pela colaboração!!
mostro todos os registros em uma pesquisa para os usuarios ´A´ e ´B´.
O usuario ´A´ quer trabalhar a NF nro 10, e pega o registro para trabalhar.
No Oracle eu uso
CODE
SELECT * FROM TB_NF WHERE NOTA = 10 FOR UPDATE NO WAIT
para travar o registro para o usuario ´A´.
O usuario ´´B´ quer trabalhar também a NF nro 10, e tenta pegar o registro para trabalhar, no Oracle eu sei que se o usuario ´A´ está trabalhando com o comando
CODE
SELECT * FROM TB_NF WHERE NOTA = 10 FOR UPDATE NO WAIT
Se eu não conseguir dar um ´Lock´ travar o registro é porque ele esta em uso.
Gostaria se é possível travar apenas um registro para uso no Interbase.
Entendeu?
No help do SQL do interbase existe o comando NO WAIT porém pesquisando na net encontrei em algumas apostilas que o IB nao trava os registros.
A maneira mais fácil que conheço é tratando os registros por TAG(marca).
Ex.:
O usuario ´A´ quer trabalhar a NF nro 10, e pega o registro para trabalhar.
Então dou um UPDATE no campo TAG para 1.
O usuario ´´B´ quer trabalhar também a NF nro 10, e tenta pegar o registro para trabalhar.
Então verifico na tabela se a TAG do registro está em 0, se não o mesmo está em uso.
Mas isso é muito usado em Paradox, e acho que um banco legal como o Ib deveria ter esse recurso.
Obs.: Estarei testando o Firebird pois em alguns sites dizem que a versão 1.5 tem o comando que eu quero ´WHIT NO WAIT´
Obrigado a todos pela colaboração!!
Bolomaster
Curtidas 0
Respostas
Jacson
27/04/2004
E ai bolomaster .. ....... :oops:
Este post parece a copia de uma questão minha do scriptbrasil/forum/delphi e kylix
:oops:
abraços
Este post parece a copia de uma questão minha do scriptbrasil/forum/delphi e kylix
:oops:
abraços
GOSTEI 0
Afarias
27/04/2004
no firebird 1.5 vc pode usar FOR UPDATE e FOR UPDATE WITH LOCK mas no IB ou no FB 1.0 não tem esses comandos, nestes casos, a única forma de fazer é ´alterando´ o registro (e não commitando) -- o registro fica bloqueado até q seja realizado um commit ou rollback.
a opção WAIT ou NO_WAIT é da transação.
T+
a opção WAIT ou NO_WAIT é da transação.
T+
GOSTEI 0
Bolomaster
27/04/2004
Parece, nao jacson, é, como esta eu nao sabia a resposta foi procurar quem sabe, blz..
abraços
abraços
GOSTEI 0
Jacson
27/04/2004
foi só uma piadinha....
seu de sua boa intenção, e sei que vc como moderador no scriptbrasil tambem já respondeu muito bem a muitas questoes minhas ....
desculpe a birncadeira....
aproveitando o post na questão do interbase , tem um outro topico que postei que perguntavo sobre o retorno de cusores(querys) atraves de storedprocedures no IB, descobri:
CREATE PROCEDURE PROC_SELECT RETURNS (VARNOME CHAR(60)) AS
BEGIN
//CURSOR(No oracle abre-se o select com um objCursor (cCursor IS REFFCURSOR)
//No IB é que é necessario passar o valor para as variaveis(out)
FOR
SELECT NOME FROM CLIENTES INTO :VARNOME
DO
SUSPEND;
END
Abraço,
Att, Jacson Soares;
seu de sua boa intenção, e sei que vc como moderador no scriptbrasil tambem já respondeu muito bem a muitas questoes minhas ....
desculpe a birncadeira....
aproveitando o post na questão do interbase , tem um outro topico que postei que perguntavo sobre o retorno de cusores(querys) atraves de storedprocedures no IB, descobri:
CREATE PROCEDURE PROC_SELECT RETURNS (VARNOME CHAR(60)) AS
BEGIN
//CURSOR(No oracle abre-se o select com um objCursor (cCursor IS REFFCURSOR)
//No IB é que é necessario passar o valor para as variaveis(out)
FOR
SELECT NOME FROM CLIENTES INTO :VARNOME
DO
SUSPEND;
END
Abraço,
Att, Jacson Soares;
GOSTEI 0
Bolomaster
27/04/2004
kra, sem problemas.. blz.. ai eu infelizmente, nao ando mais com tempo de participar dos foruns, pois agora estou fielmente envolvido com meus programas e me lancei de corpo e alma na faculdade... entao é f*.. mas valeu
[b:762a35754e]Olha o palavreado! ;)[/b:762a35754e]
(afarias)
[b:762a35754e]Olha o palavreado! ;)[/b:762a35754e]
(afarias)
GOSTEI 0