[firebase-br] Codigo vago
Eduardo Bahiense
eduardo em icontroller.com.br
Qui Fev 12 22:39:38 -03 2009
Olá Augusto
A melhor maneira de você atender a este requisito brutal é com um método
igualmente brutal.
Considere ter uma tabela estática com os campos
Atribuido char(1),
Codigo bigint,
Create index atrib01 on atrib (atribuido, codigo);
Agora, popule esta tabela com 1 milhão ou mais de registros, coforme sua
expextativa de crescimento, com '0' e codigo+1 ('0' significa não atribuído)
Agora, atribua '1' aos códigos já utilizados:
UPDATE ATRIB A SET ATRIBUIDO = '1' WHERE EXISTS(SELECT 1 FROM
TABELA_COM_CODIGOS WHERE CODIGO=A.CODIGO)
Nesse ponto, você montou sua estrutura brutal, agora tem que mantê-la.
Obter um codigo novo (pseudo código):
DECLARE VARIABLE NEWCODIGO
DECLARE VARIABLE CONSEGUIU
WHILE TRUE DO
BEGIN
SELECT FIRST 1 FROM ATRIB WHERE ATRIBUIDO='0' INTO :NEWCODIGO;
UPDATE ATRIB SET ATRIBUIDO='1' WHERE CODIGO=:NEWCODIGO AND
ATRIB='0' RETURNING ATRIB INTO :CONSEGUIU;
-- se alguém já pegou esse código conseguiu será NULL
IF CONSEGUIU = '1' THEN BREAK;
END
SUSPEND (RETURN NEWCODIGO)
Lembre que o código acima não é real, mas só um rascunho da idéia
A obtenção disso será extremamente rápida, pois usará índice para achar
o primeiro código livre, mas você terá que ter mecanismos seguros para
desmarcar os inutilizados e, talvez, um mecanismo para inserir mais
registros nessa tabela a cada inclusão, de forma que ela nunca esgote o
estoque de códigos livres, preferencialmente com tudo em TRIGGERS.
O objetivo da procedure acima é conseguir pegar o primeiro código que se
conseguir bloquear (atrib='1'), para impedir que dois usuários peguem o
mesmo código ao mesmo tempo.
Deixe seu código bem comentado para quem for dar manutenção saber que
foi o melhor que deu para fazer.
Pensei esse mecanismo agora, é só uma tentativa e não algo que eu já
tenha testado em produção.
HTA, Eduardo
Augusto junior escreveu:
> Tenho um cadastro onde existe um campo char(6) ... esse campo guarda um
> valor numerico com zeros a esquerda..
>
> 000001
> 000002
> 000003
> 000004.....
>
> acontece que esse campo o cliente que define o valor do mesmo.... e colocado
> manualmente... e sempre sendo um valor unico...
>
> agora ele me pediu para ter uma opcao de o sistema informar um numero vago
> ....
>
> fiz isso usando um contador numerico que vai incrementando em um looping
> ... e a cada incremento faco a busca usando locate para
> ver se ja existe ou nao ..
>
> funcionou perfeitamente ... mas a lentidao do locate desanima...
>
> existe alguma forma de fazer um sql que retorne o primeiro valor vago ?
>
> Grato
> Augusto
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
Mais detalhes sobre a lista de discussão lista