Ajuda em Códigos sequenciais para um controle de estoque

27 respostas
morcinek

Boa noite, estou criando um controle de estoque bem simples, porem nao consigo continuar por causa dos codigos, preciso que a cada produto salvo, ele crie um codigo unico para ele, por ex:

0001
0002
0003

e assim em diante… os codigos eu salvo em uma ArrayList, e salvo em um arquivo… como faço para apenas chamar o getCodigo? e ele criar automatico o numero em sequencia?
fiz alguns testes mas nenhum deu certo, alguem tem alguma ideia?

27 Respostas

W

Amigo eu vou criar um metodo e comentar ok assim você pode observa oque está acontecendo

morcinek

ta certo wesllhey, estou aguardando, obrigado!

morcinek

Ainda estou com o problema, alguém tem uma ajuda?

morcinek

?

L

Você não está utilizando banco de dados? No banco de dados a chave primária da tabela pode funcionar como campo código do seu produto, tendo em vista que a chave primária funciona como identificador único do registro da tabela.
Em caso negativo vc terá que implementar a lógica no seu programa.

discorpio

Boa noite.

O seu banco de dados resolve isto para você.

Se você estiver utilizando o Postgres, basta criar dentro da tabela um campo do tipo “SERIAL”, e se for MySql, basta criar um campo do tipo “AUTOINCREMENT”

// Na criação das tabelas do Postgres
   CREATE TABLE produto (
         id_produto SERIAL NOT NULL,
         ......
         ......
         ......
   );

   // Na criação das tabelas do MySql
  CREATE TABLE `produto` (
      'id_produto' int(11) NOT NULL AUTO_INCREMENT,
       ......
       ......
  );

  // Se as tabelas  estiverem criadas, então basta adicionar assim
  // No Postgres
  ALTER TABLE produto ADD COLUMN id_produto SERIAL NOT NULL;
  // ou
  ALTER TABLE produto ADD id_produto SERIAL NOT NULL;

  // No MySql
  ALTER TABLE produto ADD 'id_produto' INT(11) NOT NULL AUTO_INCREMENT;

Pronto, você não precisa fazer mais nada, porque as funções internas desses dois banco de dados fará o auto incremento para você, bastando tão somente e ler o valor desse campo.

Valendo lembrar que esses campos só serão incrementados no momento em que você inserir o registro e for realizado um Commit no Banco, caso contrário o auto incremento não é gerado.

morcinek

Boa noite amigos, não estou utilizando banco de dados no meu programa, no caso o meu “banco de dados” é a arraylist que guardo em um arquivo serializado…
o problema é justamente esse, implementar a lógica para gerar o cógigo…
não sei como percorrer a arraylist e pegar o maior numero guardado… somar 1, e ainda por no padrao que quero “ooo1”, se nao tiver como isso quebra o galho sem, mas o problema é esse, se tiver algum exemplo ajudaria muito, percorrer a arraylist eu sei, o problema é que nao sei como fazer para pegar o maior numero guardado, somar 1, e setar o novo codigo…

E muito obrigado por sua ajuda discorpio, pois será util em outra aplicação que estou tentado desenvolver também,

morcinek

Consegui resolver, com a ajuda da POG ^^ , e de vocês, obrigado.

kinrpg

Posta ai como fez que to com essa duvida também :3

morcinek

Olha só, na verdade agora estou com mais um problema, vamos ver se tu me ajuda também:
criei um método pra criar o código

public void novoCodigo(){
            
            int i_maior = 0;

            for(int i = 1; i < produtos.size(); i++) {
            
            int valor = produtos.get(i).getCodigoproduto();
            
            if(valor > i_maior){
            
            int novo = valor + 1;
            
            lbCodigopedido.setText(String.valueOf(novo));

                }
        }

    }
kinrpg

Huuu entendi… Pois é fiz isso ai mesmo…

Viva o POG \o/

Obrigado.

morcinek

aqui eu fiz pra verificar, quando o usuario vai cadastrar pela primeira vez, ele funciona só se deixar o frame aberto, se eu cadastrar, fechar e voltar para fazer outro cadastro, ele nao cria mais codigo nenhum, se ficar sem a verificação da arraylist, ele funciona normal, so que tenho q fazer um cadatro primeiro manualmente pra funcionar… se alguem souber como arrumar

public void novoCodigo(){  
              if (produtos.isEmpty()){
       
              lbCodigopedido.setText(String.valueOf(1));
              } else {


            int i_maior = 0;  
  
            for(int i = 1; i < produtos.size(); i++) {  
              
            int valor = produtos.get(i).getCodigoproduto();  
              
            if(valor > i_maior){  
              
            int novo = valor + 1;  
              
            lbCodigopedido.setText(String.valueOf(novo));  
  
                }  
        }  
  }
    }
W

amigo me desculpe pela demora eu estava com problemas, mas ta ai como prometido

public static void main(String[] args) {

		// quantidade de sequencias que desejas
		Integer quantidade = 10;
		String sequencia = "";

		for (int i = 1; i <= quantidade; i++) {
			Integer valorAlocado = i;
			sequencia = completaZerosEsquerda(valorAlocado.toString(), 3);// o 3 é a quantidade de dígitos que vai ter a sequência 3 = 000, 4 = 0000 ...
			System.out.println(sequencia);
		}

	}

	// completar com zeros a esquerda
	public static String completaZerosEsquerda(String valor, int tamanho) {
		String tmp = "";
		for (int i = 0; i < tamanho - valor.length(); i++) {
			tmp += "0";
		}
		return tmp + valor;
	}
morcinek

opa, não tem problema wesllhey, tentei fazer sozinho e quase cheguei a solução, mas agora com o seu parece que vai dar certo pois esta bem melhor é claro, vou aos teste e posto mais tarde se deu certo,
so mais uma duvida se tiver problema, que fiz um teste rapido zerando a arraylist, quando isso acontece e vou inserir o primeiro registro, não consigo gerar o novo codigo, somente se ja tiver algum salvo, a partir dai sim, funciona beleza, tentei fazer uma verificação mais em cima com meu codigo e não deu certo, agora vou tentar com o seu usando, nomearraylist.isEmpty(); para ver se da certo

muito obrigado pela ajuda!

W

eu to saindo agora da empresa to indo para casa vou está on qualquer coisa só posta ai ok

morcinek

Boa noite wesllhey, bom o codigo funcionou muito bem, bem melhor q minha antiga gambiarra hehehe porem, o unico problema restante foi para verificar se nenhum item foi salvo antes, e começar pelo 0001 por exemplo.
tentei com este codigo para contar o numero de indeces… e nao funcionou

int i_maior = 0;
        for(int i = 1; i < produto.size(); i++) {
        if (produto.get(i).getCodigoprod() == i_maior ) {
           tfCodigo.setText("0001");
        }
        }

também, tentei colocando somente assim:

if(produto.isEmpty()){
      tfCodigo.setText("0001");
       }

e de outras maneiras tambem, como comparar se indice é diferente de -1… e por ai vai, nenhuma deu certo, se puder ajudar nessa tambem, nao sei se esta faltando alguma coisa, vou seguir tentando fazer o codigo dar certo, e se der espero a ajuda de alguem, obrigado

W

Amigo primeiro você terá que ver se sua lista tem um tamanho > 0 suaLista.size() se ela for > 0 isso que dizer que já existe valores acionados em sua lista, é interessante que tenha uma sequência inicial e final do tipo int,
tipo quando você for ver se sua lista tem valores então você pega a sequencia final do ultimo elemento de sua lista dessa forma ficara assim

if(suaLista.size() != 0){

// pegando a utima sequência de sua lista pela sequência final que deve ser int, exe: ao salvar uma sequência ela deve ter seqInicial int, seqFinal int e sequencia String
// sua seqInicial = 1 seqFinal = 10 e sequencia = 010
// irá receber 10 da seqFinal
Integer seqFinalAnterior = utimoItemDeSuaLista.getSequenciaFinal();

// sequência atual se baseia pela nova quantidade que será adicionada ex: antes você gerou uma sequência de seqFinal = 10
// dessa forma  você tem 10 + a nova quantidade que hipoteticamente é + 10 
/// temos uma nova sequência final que é de 20
sequencia.setSeqFinal = seqFinalAnterior + quantidadeAdd

// como nossa ultima sequência foi até 010 o i =  seqFinalAnterior + 1 porque 10 da sequência final anterior + 1 para começar a partir de 011 
for (int i = seqFinalAnterior + 1; i <= sequenciaFinalAtual; i++) {
				Integer valorAlocado = i;

			        // setando a nova sequencia
				sequencia.setSequencia(completaZerosEsquerda(valorAlocado.toString(), 3));

				crachaController.insert(cracha);
			}

}
W

espero ter ajudado.

morcinek

Sim acho que ja tentei com uma comparação assim, ou parecida, em um dos testes, ele retornava sim que a lista estava vazia e setava o codigo 0001 para dar continuidade ao proximo codigo que gera os proximos codigos, so que junto com a verificação o codigo que gera os numeros nao funciona, se estiver sozinho funciona, ja tentei tambem por em metodos separados, e fica como se o evento do botao nao funcionasse

morcinek

muito obrigado, vamos ver aqui vou estudar esse para implementar e posto aqui, obrigado mesmo

W
if(suaLista.size() != 0){  
  
// pegando a utima sequência de sua lista pela sequência final que deve ser int, exe: ao salvar uma sequência ela deve ter seqInicial int, seqFinal int e sequencia String  
// sua seqInicial = 1 seqFinal = 10 e sequencia = 010  
// irá receber 10 da seqFinal  
Integer seqFinalAnterior = utimoItemDeSuaLista.getSequenciaFinal();  
  
// sequência atual se baseia pela nova quantidade que será adicionada ex: antes você gerou uma sequência de seqFinal = 10  
// dessa forma  você tem 10 + a nova quantidade que hipoteticamente é + 10   
/// temos uma nova sequência final que é de 20  
sequencia.setSeqFinal = seqFinalAnterior + quantidadeAdd  
  
// como nossa ultima sequência foi até 010 o i =  seqFinalAnterior + 1 porque 10 da sequência final anterior + 1 para começar a partir de 011   
for (int i = seqFinalAnterior + 1; i <= sequenciaFinalAtual; i++) {  
                Integer valorAlocado = i;  
  
                    // setando a nova sequencia  
                sequencia.setSequencia(completaZerosEsquerda(valorAlocado.toString(), 3));  
  
             
            }  
  
}
// dessa forma se a lista não estiver preenchida ela vai adicionar do 0 
else {

for (int i = 1; i <= quantidade; i++) {
    Integer valorAlocado = i;
    sequencia.setSequencia(completaZerosEsquerda(valorAlocado.toString(), 3));
	} 

}
W

tenta algo parecido para ver se da certo lembrado que a classe que tem a sequência deve ter seqInicial int, seqFinal int, sequencia String

W

Amigo eu fiz um exemplo completo da uma olhada

morcinek

Vamos ver, o ultimo acho que não consegui implementar muito bem no projeto, estou vendo aqui oq pode estar de errado que eu tenha colocado

W
Sua classe, como é só um exemplo só tem os campos necessários
public class Sequencia {

	private int seqIncial;

	private int seqFinal;

	private String sequencia;

	public int getSeqIncial() {
		return seqIncial;
	}

	//	getters e setters
	public void setSeqIncial(int seqIncial) {
		this.seqIncial = seqIncial;
	}

	public int getSeqFinal() {
		return seqFinal;
	}

	public void setSeqFinal(int seqFinal) {
		this.seqFinal = seqFinal;
	}

	public String getSequencia() {
		return sequencia;
	}

	public void setSequencia(String sequencia) {
		this.sequencia = sequencia;
	}
}
W

Você pode popular sua lista para testar

public class SequenciaTeste {

	@SuppressWarnings("unused")
	public static void main(String[] args) {

		List<Sequencia> sequencias = new ArrayList<Sequencia>();
		Sequencia sequencia = new Sequencia();
		//	compos que serão preenchidos 
		sequencia.setSeqIncial(1);
		sequencia.setSeqFinal(10);
		
		// verificando se a lista está vasia
		if (sequencias.size() == 0) {
			for (int i = 1; i <= sequencia.getSeqFinal(); i++) {
				Integer valorAlocado = i;
				//	setar os valores da sequência em todas as sequências
				sequencia.setSeqIncial(sequencia.getSeqIncial());
				sequencia.setSeqFinal(sequencia.getSeqFinal());

				sequencia.setSequencia(completaZerosEsquerda(valorAlocado.toString(), 3));
				System.out.println(sequencia.getSequencia());
				
				// adcionar uma sequência a uma lista de sequência
				sequencias.add(sequencia);
			}
		} else {
			//	classe para pegar a ultima sequência adcionada na lista
			Sequencia sequenciaAnterior = new Sequencia();
			int utimoIndice = -1;

			for (Sequencia entidade : sequencias) {
				// 	calcular a quantidade de índice que a lista possui, para a utima sequência da lista,
				utimoIndice = utimoIndice + 1;
			}
			//	adcionado uma sequência da lista pelo índice
			sequenciaAnterior = sequencias.get(utimoIndice);
			//	adcionar uma seqInicial e seqFinal que será adcionado a uma nova sequência a partir da ultima
			//	adcionado + 1 por causa que se a utima sequência for 010, vai começar a partir de 011
			sequencia.setSeqIncial(sequenciaAnterior.getSeqFinal() + 1);
			//	seqFinal é basiado na nova quantidade se sequência :sequencia.getSeqFinal()  + a quantidade da sequência final anterior :sequenciaAnterior.getSeqFinal()
			//	dessa forma se a anterior foi até 10 agora será o valor da nova sequência :10 + a anterior 10, então temos 20
			sequencia.setSeqFinal(sequencia.getSeqFinal() + sequenciaAnterior.getSeqFinal());

			for (int i = sequencia.getSeqIncial(); i <= sequencia.getSeqFinal(); i++) {
				Integer valorAlocado = i;
				//	setar os valores da sequência em todas as sequências
				sequencia.setSeqIncial(sequencia.getSeqIncial());
				sequencia.setSeqFinal(sequencia.getSeqFinal());

				sequencia.setSequencia(completaZerosEsquerda(valorAlocado.toString(), 3));
				System.out.println(sequencia.getSequencia());
				// adcionar uma sequência a uma lista de sequência
				sequencias.add(sequencia);
			}
		}
	}

	//	adcionar zeros a esquerda 
	public static String completaZerosEsquerda(String valor, int tamanho) {
		String tmp = "";
		for (int i = 0; i < tamanho - valor.length(); i++) {
			tmp += "0";
		}
		return tmp + valor;
	}
}
W

espero ter ajudado

Criado 2 de agosto de 2012
Ultima resposta 6 de ago. de 2012
Respostas 27
Participantes 5