none
como criar sequencial de números em um textbox no windowsform c# RRS feed

  • Pergunta

  • Ola pessoal tudo bem, estou precisando criar um sequencial de número no textbox para o codigo do cliente, ou como posso trazer do banco o codigo do cliente que a coluna esta com identity e o textbox amostrar o proximo numero sequencial para cadastrar um novo cliente ?
    terça-feira, 10 de novembro de 2015 03:26

Respostas

  • Você pode executar esse código na hora que clicar em novo registro e direcionar o valor de NextId para dentro desse TextBox!

    Fulvio C

    • Marcado como Resposta Aelton Menezes terça-feira, 10 de novembro de 2015 19:40
    terça-feira, 10 de novembro de 2015 19:28

Todas as Respostas

  • Boa noite.

    AQUI tem uma thread com um problema igual.

    O ideal seria apresentar o ID após a inserção.

    Atente-se aos meus avisos, pois as maneiras marcadas como resposta abrem brechas para vários problemas que podem acontecer com o uso do sistema.


    Att., Rafael Simor

    • Sugerido como Resposta Marcos SJ terça-feira, 10 de novembro de 2015 11:30
    • Não Sugerido como Resposta Marcos SJ terça-feira, 10 de novembro de 2015 14:56
    terça-feira, 10 de novembro de 2015 03:32
  • SimorC,

    Quer que eu desmarqeue alguma resposta naquela thread?

    Atencisoamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 10 de novembro de 2015 11:31
  • Bom dia.

    Obrigado, Marcos, mas não acho que há necessidade.

    De uma forma as respostas realmente resolvem a dúvida; o "único" problema é que se a pessoa não ler todos posts, a solução pode gerar alguns outros problemas no futuro.


    Att., Rafael Simor

    terça-feira, 10 de novembro de 2015 12:00
  • Boa noite.

    AQUI tem uma thread com um problema igual.

    O ideal seria apresentar o ID após a inserção.

    Atente-se aos meus avisos, pois as maneiras marcadas como resposta abrem brechas para vários problemas que podem acontecer com o uso do sistema.


    Att., Rafael Simor

    Desculpe minha intromissão, mas, o link não é uma resposta apropriada, imagine se eu excluo o ultimo registro e tente inserir um novo registro ele vai causar ai um problema trazendo o valor do último registro excluído. 

    Link que diz que é mau prática: 

    1 ) https://social.msdn.microsoft.com/Forums/pt-BR/393f5b20-2036-4811-a975-82a4174f50db/buscar-ultimo-valor-inserido-no-banco?forum=520

    2 ) https://gustavomaiaaguiar.wordpress.com/2008/12/11/piores-praticas-geracao-de-sequenciais-baseados-no-max-1/

    A outra parte da resposta sua é perfeita, visto que só podemos ter o novo número a partir da inserção.


    Fulvio C

    terça-feira, 10 de novembro de 2015 12:08
  • Bom Aelton Menezes, 

    O melhor é igual o SimorC relatou na 3 linha da sua resposta. Existe uma maneira assim:

      SELECT IDENT_CURRENT('nomedatabela') + IDENT_INCR('nomedatabela')

    Ele trará para você é uma base SQL Server o próximo registro. Se for para uma tela isso funciona bem, mas, se existir esse sistema em redes isso também não vai ajudar, visto que dois podem estár na mesma tela e fazendo cadastros ao mesmo tempo trazendo dados inválidos ao cadastro.

    A melhor forma seria inserir o registro e trazer os Id Inserido com:

    //comando para SQLServer, cada banco tem a sua nomenclatura

    SELECT SCOPE_IDENTITY()



    Fulvio C

    terça-feira, 10 de novembro de 2015 12:18
  • Fulvio, não se preocupe sobre a "intromissão", acredito que todos aqui estamos abertos a críticas e sugestões :)

    E sim, Fulvio, te entendo perfeitamente.

    Na verdade é mais ou menos isso que havia falado.

    O MAX+1 realmente não é usual nunca, porém o "IDENT_CURRENT" resolveria, na teoria, o problema.

    A questão é: e se dois usuários abrirem o mesmo formulário de inserção ao mesmo tempo? Somente o primeiro usuário que fizer o INSERT terás o ID que havia sido mostrado, para o outro, um ID diferente será gerado.


    Att., Rafael Simor

    terça-feira, 10 de novembro de 2015 12:20
  • Fulvio, não se preocupe sobre a "intromissão", acredito que todos aqui estamos abertos a críticas e sugestões :)

    E sim, Fulvio, te entendo perfeitamente.

    Na verdade é mais ou menos isso que havia falado.

    O MAX+1 realmente não é usual nunca, porém o "IDENT_CURRENT" resolveria, na teoria, o problema.

    A questão é: e se dois usuários abrirem o mesmo formulário de inserção ao mesmo tempo? Somente o primeiro usuário que fizer o INSERT terás o ID que havia sido mostrado, para o outro, um ID diferente será gerado.


    Att., Rafael Simor

    Correto ... !!!

    Fulvio C

    terça-feira, 10 de novembro de 2015 12:21
  • Aliás, minha ideia no outro tópico era de criar um registro temporário, exibir este ID gerado na tela e, ao clicar no botão, fazer o update deste registro.

    Assim terá gerado um ID e este ID não poderá ser usado mais para nada. 

    Mas com isso existem outros problemas:

    - Se o usuário cancelar a operação, esta linha deve ser excluída.

    - Todos SELECTs do sistema precisam ignorar estes registros fantasmas.

    - Sempre ao abrir/fechar o formulário, processamento desnecessário será executado.

    Mas recomendaria esta alternativa somente se a exibição do ID seja crucial ao sistema, pois senão é mais fácil e melhor simplesmente exibir o ID após a inserção, como de fato deveria ser.


    Att., Rafael Simor

    terça-feira, 10 de novembro de 2015 12:31
  • Olá Fulvio obrigado pelo feedback, só não entendi como possor amostrar isso no textbox ?

    Poderia me dar um exemplo de como eu implementaria esse código ?

    terça-feira, 10 de novembro de 2015 17:25
  • Bem simples seria assim:

    int NextId = 0; // proximo valor
    string NameTable = "people";
    using (SqlConnection Conn = new SqlConnection(@"Server=.\SQLExpress;Database=myEntities;User Id=sa;Password=senha;"))
    using (SqlCommand Command = new SqlCommand(string.Format("SELECT IDENT_CURRENT('{0}') + IDENT_INCR('{0}')", NameTable), Conn)) 
    {
    	Conn.Open();
    	int.TryParse(Command.ExecuteScalar().ToString(), out NextId);
    	Conn.Close();
    }
    Quando ele acabar de executar até o último } o NextId terá o próximo registro


    Fulvio C

    terça-feira, 10 de novembro de 2015 18:09
  • Ele trará para você é uma base SQL Server o próximo registro. Se for para uma tela isso funciona bem, mas, se existir esse sistema em redes isso também não vai ajudar, visto que dois podem estár na mesma tela e fazendo cadastros ao mesmo tempo trazendo dados inválidos ao cadastro.

    Aelton, lembre-se do que foi discutido aqui.

    Implementar esta forma de pegar o "próximo Id" funcionará somente se uma tela de cadastro for aberta por vez (tanto pelo mesmo usuário como outros usuários em rede), como o próprio Fluvio falaste.

    Use com cautela.


    Att., Rafael Simor

    terça-feira, 10 de novembro de 2015 18:19
  • Executei o código e esta tudo certo mas não aparece o codigo do banco no textbox, o sistema vai ficar em rede mas só apenas um computador será responsável pelo cadastro os demais só apenas consulta, muuuuito obrigado pelo feedback de vcs pessoal, mas só ainda nao consegui trazer o codigo para o textbox
    terça-feira, 10 de novembro de 2015 19:07
  • Você jogou o valor para dentro do textbox:

    int NextId = 0; // proximo valor
    string NameTable = "people";
    using (SqlConnection Conn = new SqlConnection(@"Server=.\SQLExpress;Database=myEntities;User Id=sa;Password=senha;"))
    using (SqlCommand Command = new SqlCommand(string.Format("SELECT IDENT_CURRENT('{0}') + IDENT_INCR('{0}')", NameTable), Conn)) 
    {
    	Conn.Open();
    	int.TryParse(Command.ExecuteScalar().ToString(), out NextId);
    	Conn.Close();
    }
    
    Text1.Text = NextId.ToString();


    Fulvio C

    terça-feira, 10 de novembro de 2015 19:16
  • não, eu uso um metodo para listar em uma grid, entao eu posso entrar neste textbox e colocar este codigo dentro dele ?
    terça-feira, 10 de novembro de 2015 19:22
  • Você pode executar esse código na hora que clicar em novo registro e direcionar o valor de NextId para dentro desse TextBox!

    Fulvio C

    • Marcado como Resposta Aelton Menezes terça-feira, 10 de novembro de 2015 19:40
    terça-feira, 10 de novembro de 2015 19:28
  • Cara Fulvio, vc é muito foda, muito obrigado pela compressão e fedback de todos, consegui e esta rodando perfeitamente vcs são fooooooda.

    Vlwwwwwwww

    terça-feira, 10 de novembro de 2015 19:40