none
Sequencia para Empresa+Clientes RRS feed

  • Pergunta

  • Minha tabela de clientes existe o campo "CodEmpresa" e o campo "CodCliente".

    Como eu faço uma auto-numeração para o CodCliente diferente para cada empresa, exemplo:

    CodEmpresa - CodCliente

    1                -  1

    1                -  2

    1                -  3

    2                - 1

    2                - 2

    terça-feira, 4 de junho de 2019 01:03

Respostas

  • "N.SOLUTION", você terá que implementar o próprio mecanismo de geração do valor sequencial de código de cliente, por empresa. Isso pode ser feito conforme relatado no artigo “Geração de sequências numéricas”. A implementação é bem simples: basta criar uma tabela de sequências, em que nela ficará armazenado o último valor de sequência utilizado para identificação de cliente, em cada empresa; nessa tabela o procedimento armazenado GetSequence obtém o próximo valor de sequência a ser utilizado para cliente da empresa.

    Não utilize construções do tipo "max(coluna) +1", pois esse tipo de implementação pode falhar, conforme demonstrado no artigo “Geração de sequências numéricas”.

    Eis esboço de utilização do procedimento armazenado, sempre que for acrescentar cliente na empresa:

    -- código #1
    - próximo valor disponível para cliente da empresa
    declare @Prox_Cliente int;
    BEGIN TRANSACTION; -- obtém próximo código de cliente EXECUTE dbo.GetSequence @nome_seq= cast (CodEmpresa as varchar(30)), @valor = @Prox_Cliente output; INSERT into dbo.Clientes (CodEmpresa, CodCliente, ...) values (CodEmpresa, @Prox_Cliente, ...); COMMIT;

    No exemplo acima é considerado que as colunas CodEmpresa e CodCliente são valores numéricos.

    ---

    Sempre que acrescentar uma empresa no sistema, é necessário inicializar o respectivo sequenciador de cliente para aquela empresa:

    -- código #2
    BEGIN TRANSACTION;
    
    -- acrescenta nova empresa na tabela de empresas
    INSERT into dbo.Empresa (CodEmpresa, ...) values (@CodEmpresa, ...); -- cria sequência de cliente para uso nesta empresa INSERT into dbo.tbSequence values (cast(@CodEmpresa as varchar(30)), 0);

    COMMIT; go

    Todos os passos necessários estão detalhados no artigo anteriormente mencionado.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    sábado, 22 de junho de 2019 11:53
    Moderador

Todas as Respostas

  • Eu sugiro que você tenha 2 tabelas, uma de cliente e outra de empresa, e ai na tabela cliente você cria uma coluna codempresa para que contenha o codigo da empresa que o cliente pertence.
    Exemplo:
    Tabela EMPRESA
    CodEmpresa - NomeEmpresa
    1 - XPTO
    2 - VWK1

    Tabela CLIENTE
    CodCliente - CodEmpresa - NomeCliente
    1 - 1 - João da Silva
    2 - 1 - Maria Antônia
    3 - 2 - Pedro Souza

    • Sugerido como Resposta IgorFKModerator terça-feira, 4 de junho de 2019 12:51
    terça-feira, 4 de junho de 2019 11:10
  • Eu sugiro que você tenha 2 tabelas, uma de cliente e outra de empresa, e ai na tabela cliente você cria uma coluna codempresa para que contenha o codigo da empresa que o cliente pertence.
    Exemplo:
    Tabela EMPRESA
    CodEmpresa - NomeEmpresa
    1 - XPTO
    2 - VWK1

    Tabela CLIENTE
    CodCliente - CodEmpresa - NomeCliente
    1 - 1 - João da Silva
    2 - 1 - Maria Antônia
    3 - 2 - Pedro Souza


    Luciano,

    Concordo com sua sugestão, ainda mais se pensarmos que toda e qualquer empresa poderá ter mais de um cliente.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 4 de junho de 2019 11:44
  • Boa noite,

    Obrigado por responderem, mas acho que não me fiz claro.

    Eu tenho duas tabelas que é "Empresas" e "Clientes".

    No login do sistema é selecionada a empresa em que o usuário pertence e quando é feita uma inclusão de um cliente, esse código é informado.

    O problema é que gostaria de ter um auto-incremento separado por empresa, como abaixo, mas o SQL faz um auto-incremento único independente do número da empresa, exemplo:

    Tabela de clientes:

    CodigoDaEmpresa, CodigoDoCliente (Auto-numeracao)

    1,1

    1,2

    2,3

    1,4

    O que eu gostaria é de fazer com que o incremento fosse independente por empresa, exemplo:

    1,1

    1,2

    2,1

    1,3

    Obrigado

    sexta-feira, 21 de junho de 2019 21:28
  • N.Solution,

    Teoricamente esta falando de uma tabela que contem o chamado relacionamento muitos para muitos baseado na relação empresas x clientes.

    Sinceramente falando, o uso de Max pode ser sim uma solução, mas é claro podemos nos deparar com a ocorrência de uma possível duplicidade isso dependendo da maneira que ela esta sendo aplicada.

    Pois bem, imagino que dentro da uma aplicação é selecionado a empresa, através de um tipo de seleção o cliente é vinculado a ela, então talvez seja justamente neste momento que poderíamos pensar no uso de uma Stored Procedure, Function ou até mesmo Trigger que logo após esta confirmação da seleção e relacionamento, podemos disparar algum tipo de recurso que identificação com base no número da empresa já armazenada qual será o número máximo a ser aplicado a este cliente.

    Podemos talvez pensar no uso da função Last_Value() ou Row_Number(), mas isso vai depender da versão do SQL Server.

    Bom, poderia nos detalhar como é estabelecida esta relação entre empresa e cliente?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 21 de junho de 2019 22:46
  • Boa noite,

    Faça via trigger, onde irá ler através do MAX e coloca um AND para a empresa logada.

    sexta-feira, 21 de junho de 2019 23:11
  • "N.SOLUTION", você terá que implementar o próprio mecanismo de geração do valor sequencial de código de cliente, por empresa. Isso pode ser feito conforme relatado no artigo “Geração de sequências numéricas”. A implementação é bem simples: basta criar uma tabela de sequências, em que nela ficará armazenado o último valor de sequência utilizado para identificação de cliente, em cada empresa; nessa tabela o procedimento armazenado GetSequence obtém o próximo valor de sequência a ser utilizado para cliente da empresa.

    Não utilize construções do tipo "max(coluna) +1", pois esse tipo de implementação pode falhar, conforme demonstrado no artigo “Geração de sequências numéricas”.

    Eis esboço de utilização do procedimento armazenado, sempre que for acrescentar cliente na empresa:

    -- código #1
    - próximo valor disponível para cliente da empresa
    declare @Prox_Cliente int;
    BEGIN TRANSACTION; -- obtém próximo código de cliente EXECUTE dbo.GetSequence @nome_seq= cast (CodEmpresa as varchar(30)), @valor = @Prox_Cliente output; INSERT into dbo.Clientes (CodEmpresa, CodCliente, ...) values (CodEmpresa, @Prox_Cliente, ...); COMMIT;

    No exemplo acima é considerado que as colunas CodEmpresa e CodCliente são valores numéricos.

    ---

    Sempre que acrescentar uma empresa no sistema, é necessário inicializar o respectivo sequenciador de cliente para aquela empresa:

    -- código #2
    BEGIN TRANSACTION;
    
    -- acrescenta nova empresa na tabela de empresas
    INSERT into dbo.Empresa (CodEmpresa, ...) values (@CodEmpresa, ...); -- cria sequência de cliente para uso nesta empresa INSERT into dbo.tbSequence values (cast(@CodEmpresa as varchar(30)), 0);

    COMMIT; go

    Todos os passos necessários estão detalhados no artigo anteriormente mencionado.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    sábado, 22 de junho de 2019 11:53
    Moderador