Podem me ajudar?

14 respostas
java
L

Como que eu posso criar um método que, quando eu criar uma nova ordem de serviços, incrementar mais um no número da ordem de serviço?

Por exemplo:

os de número: 0001 | 0002 e assim vai!

Desde já,agradeço!

14 Respostas

L

Você está usando qual banco de dados?

S

Se você quer saber o número total de ordens, ou linhas, pode usar o método count() para contar todas as linhas que existem na tabela.

D

Para quê isso? Para ter um controle?
Faça ao final, quando a OS estiver criada e salva no banco de dados.

L

MySQL

L

Ele não quer saber o número total de ordens exatamente, ele precisa gerar um número para a ordem que não seja a PK auto incremento do banco, pois com a PK corre o risco de pular alguns números caso ocorra algum rollback na operação.

L

É exatamente isso!

Obrigado

lucastody

L

Você pode salvar o registro no banco normalmente, e depois atualizar o registro gravado com um número para ele. Para isso, você deve criar um método synchronized no java que faça isso. Nesse método, você recupera o último número atribuído, incrementa mais 1 e atualiza o registro que estiver trabalhando. O método synchronized vai garantir que apenas um usuário por vez irá fazer essa ação.

A

Se essa operaçao estiver dentro de uma transaçao do db (e nesse caso deveria) mesmo usando synchronized você pode gerar números repetidos.

Um jeito rápido de fazer isso (e meio sujo) é colocar um check de unicidade na coluna e tentar atualizar o valor, repetindo o processo se falhar por duplicidade.

M

Ao gravar a ordem no db envia esta sem o número

Cria uma trigger no db que ao salvar pega o cadastro anterior e acrescenta 1

L

Dentro de um bloco sincronizado, como poderia acontecer de gerar números repetidos?

A

Talvez tenha entendido errado sua soluçao, mas me parece que o código seria semelhante a isso:

void gravaNovaOrdem() {
    abreTransacaoDb();
    criaOrdemDbNormalmente();
    sync { atualizaOrdemComMaiorNúmero() };
    commitaTransacaoDb();
  }

Nesse caso se duas threads em paralelo chegarem ao commitaTransacaoDb ao mesmo tempo, elas teriam o mesmo número.

Colocando synchronized no método gravaNovaOrdem() resolveria, caso sua aplicaçao esteja rodando em apenas um servidor.

L

Entendi Abel, e o q vc disse faz sentido, porém, eu tinha pensado em duas transações, a primeira criaria a ordem sem número, e a segunda transação iria ficar responsável por atribuir o número para a ordem, que seria feito num bloco sincronizado. Bom, talvez não tenha pensado direito e não seja uma boa solução. O que vc acha?

void gravarOrdem() {
    abreTransacaoDb();
    criaOrdemDbNormalmente();
    commitaTransacaoDb();
}

void sync atribuirNumero(Ordem ordem) {
    abreTransacaoDb();
    atualizaOrdemComMaiorNúmero(ordem)
    commitaTransacaoDb();
}
A

Oi @Lucas_Camara, desculpe a demora na resposta.

Sua abordagem resolveria o problema citado mas acabaria eliminando o efeito da transaçao no DB. Se o método atribuirNumero lançar uma exceçao você teria uma ordem no banco, comitada, sem o número da ordem.

Acho que o synchronized funcionaria, se você colocasse a lógica inteira nele, contando que a aplicaçao se limite a um servidor.

L

Realmente isso aconteceria, e teria que ser tratado, caso o número da ordem seja NULL. Mas, acredito, que resolveria o problema da numeração.

Criado 6 de fevereiro de 2018
Ultima resposta 17 de fev. de 2018
Respostas 14
Participantes 6