none
Gerar código aleatóriamente para o cadastro de Cliente RRS feed

  • Pergunta

  • Bom dia,

    Tenho o seguinte modelo:

     public class TBCliente
        {
            public  int TBCLIENTEID { get; set; }
            public string NMCLIENTE { get; set; }
            public string TPCLIENTE { get; set; }
            public string CPFCNPJ { get; set; }
            public string CODFORNECEDOR { get; set; }
        }

    O sistema deverá gerar o CODFORNECEDOR automaticamente, e esse código servirá para o Usuário do Sistema identificar o Cliente, além de outros atributos, é claro, como por exemplo o Nome, e CNPJ.

    Pensei em usar o código abaixo para gerar o CODFORNECEDOR e antes de gravar no banco de dados fazer uma  comparação para verificar se já existe um codigo igual, e caso exista o sistema deverá gerar um outro código:

    Random rnd = new Random();
    int CODFORNECEDOR = rnd.Next(1000, 10001);
    Acredito ser essa é uma boa prática, o que vocês acham ?

    quarta-feira, 21 de outubro de 2015 11:27

Respostas

  • Bom, vamos lá. Não sei quais são as regras de negócio do teu sistema, nem tenho muita noção do resto do código, porém...

    Primeiro: TPCLIENTE, que imagino que seja "TipoCliente", seria melhor ser uma chave estrangeira (FK) de uma tabela que irá armazenar somente "Tipos de clientes"; na tabela "Cliente", só teria os ID's relacionais desta tabela de "Tipo de cliente".

    Segundo: CPFCNPJ... Para saber se um cliente é pessoa física ou jurídica, tu terias que fazer uma verificação no código para validar este campo e tu estarias gravando dois tipos de informação no mesmo campo. Seria melhor separar estes campos, deixar um campo para CPF e outro para CNPJ; acredito que a melhor prática, novamente, seria separar isto em 3 tabelas, uma "Cliente", que conteria todos dados comuns de clientes (exemplo: telefone, email), uma tabela somente para "PessoaFisica", que conteria, por exemplo, CPF, Nome e outra tabela para "PessoaJuridica", contendo CNPJ, IE, Razão Social, etc., sendo que essas duas tabelas fariam referência com a tabela "Cliente" (Tabela Cliente se torna uma generalização, tabelas PessoaFisica e PessoaJuridica se tornam especializações da tabela Cliente).

    Terceiro, mas não menos importante: CODFORNECEDOR parece ser uma Chave Estrangeira. Tu não deves criar uma chave estrangeira que não existe em algum lugar do teu banco de dados. Tu deves criar um registro na tabela "Fornecedor" (Como falado anteriormente, utilizando Identity/Auto_increment) e fazer uma referência na tabela Cliente com esse ID gerado automaticamente. A dúvida de "gerar um código que não existe" está errada em seu conceito, pois se o CODFORNECEDOR for uma chave estrangeira, este código DEVE existir, senão o banco de dados não pode deixar o registro ser gravado, pois será uma referência inexistente e teu banco de dados não terá integridade referencial (Ou seja, tu estaria gravando um CODFORNECEDOR de um Fornecedor que não existe).

    Acredito que, olhando "por cima", seja basicamente isso.

    Novamente, essas são sugestões de uma pessoa que não conhece as regras de negócio do teu sistema, porém seria interessante dar uma verificada se as sugestões não se encaixariam no teu contexto.

    • Marcado como Resposta Marcos SJ quarta-feira, 21 de outubro de 2015 18:14
    quarta-feira, 21 de outubro de 2015 12:47

Todas as Respostas

  • Auto_increment/Identity não é uma opção?

    Assim, ao inserir no banco de dados, o SGBD iria gerenciar esse "id automático".

    E existem algumas melhorias que poderiam ser feitas nessa entidade de "Cliente".

    quarta-feira, 21 de outubro de 2015 12:01
  • AJCOR, bom dia!

    na minha opinião o melhor a fazer é deixar o banco gerar o código automaticamente, você só pega o retorno do banco que sera o código gerado. Assim terá a certeza que nunca terá um código igual para o mesmo fornecedor. 

    E você não precisa ter o trabalho de comparar no banco se o código já existe antes de salvar.

    Ex: CodFornecedor = PK - identity Yes

    Espero ter ajudado em alguma coisa.

    Att

    Thyago

    quarta-feira, 21 de outubro de 2015 12:05
  • Auto_increment/Identity não é uma opção?

    Assim, ao inserir no banco de dados, o SGBD iria gerenciar esse "id automático".

    E existem algumas melhorias que poderiam ser feitas nessa entidade de "Cliente".

    Sim, o Auto_increment/Identity seria uma opão.

    Qual seria sua sugestão para melhoria da Entidade ?

    quarta-feira, 21 de outubro de 2015 12:31
  • AJCOR, bom dia!

    na minha opinião o melhor a fazer é deixar o banco gerar o código automaticamente, você só pega o retorno do banco que sera o código gerado. Assim terá a certeza que nunca terá um código igual para o mesmo fornecedor. 

    E você não precisa ter o trabalho de comparar no banco se o código já existe antes de salvar.

    Ex: CodFornecedor = PK - identity Yes

    Espero ter ajudado em alguma coisa.

    Att

    Thyago

    Thyago no meu modelo já tenho um identity = TBCLIENTEID.

    Bom, estou chegando a conclusão de que não vou precisar desse atributo CODFORNECEDOR, estou pensando mesmo em adotar o valor identity= TBCLIENTEID e exibir para o Usuário trabalhar.


    quarta-feira, 21 de outubro de 2015 12:47
  • Bom, vamos lá. Não sei quais são as regras de negócio do teu sistema, nem tenho muita noção do resto do código, porém...

    Primeiro: TPCLIENTE, que imagino que seja "TipoCliente", seria melhor ser uma chave estrangeira (FK) de uma tabela que irá armazenar somente "Tipos de clientes"; na tabela "Cliente", só teria os ID's relacionais desta tabela de "Tipo de cliente".

    Segundo: CPFCNPJ... Para saber se um cliente é pessoa física ou jurídica, tu terias que fazer uma verificação no código para validar este campo e tu estarias gravando dois tipos de informação no mesmo campo. Seria melhor separar estes campos, deixar um campo para CPF e outro para CNPJ; acredito que a melhor prática, novamente, seria separar isto em 3 tabelas, uma "Cliente", que conteria todos dados comuns de clientes (exemplo: telefone, email), uma tabela somente para "PessoaFisica", que conteria, por exemplo, CPF, Nome e outra tabela para "PessoaJuridica", contendo CNPJ, IE, Razão Social, etc., sendo que essas duas tabelas fariam referência com a tabela "Cliente" (Tabela Cliente se torna uma generalização, tabelas PessoaFisica e PessoaJuridica se tornam especializações da tabela Cliente).

    Terceiro, mas não menos importante: CODFORNECEDOR parece ser uma Chave Estrangeira. Tu não deves criar uma chave estrangeira que não existe em algum lugar do teu banco de dados. Tu deves criar um registro na tabela "Fornecedor" (Como falado anteriormente, utilizando Identity/Auto_increment) e fazer uma referência na tabela Cliente com esse ID gerado automaticamente. A dúvida de "gerar um código que não existe" está errada em seu conceito, pois se o CODFORNECEDOR for uma chave estrangeira, este código DEVE existir, senão o banco de dados não pode deixar o registro ser gravado, pois será uma referência inexistente e teu banco de dados não terá integridade referencial (Ou seja, tu estaria gravando um CODFORNECEDOR de um Fornecedor que não existe).

    Acredito que, olhando "por cima", seja basicamente isso.

    Novamente, essas são sugestões de uma pessoa que não conhece as regras de negócio do teu sistema, porém seria interessante dar uma verificada se as sugestões não se encaixariam no teu contexto.

    • Marcado como Resposta Marcos SJ quarta-feira, 21 de outubro de 2015 18:14
    quarta-feira, 21 de outubro de 2015 12:47