Ir para conteúdo
Fórum Script Brasil
  • 0

Gerar novo código


cassios

Pergunta

Galera boa tarde é o seguinte to montando um sistema e to precisando de uma mãozinha....

Tenho um cadastro de clientes: quando o cliente chega a uma loja de assistência com um equipamento eu quero cadastrar o equipamento para este cliente então é o seguinte:

O cliente chega eu o cadastro ele traz o equipamento e eu o cadastro o equipamento.

Se o mesmo cliente trazer outro equipamento o código será 2

Mas se um cliente novo chega e traz um equipamento então o sistema gera código 2 para o cliente mas o equipamento para esse cliente eu qero que começe a contar a partir do um e assim por diante.

no caso do primeiro cliente voltar a loja com outro equipamento a sequencia continua na boa equipamento 3 e assim vai.

Gostaria de uma ajuda de como montar isso para o meu sistema.

Abraços a todos

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0
Galera boa tarde é o seguinte to montando um sistema e to precisando de uma mãozinha....

Tenho um cadastro de clientes: quando o cliente chega a uma loja de assistência com um equipamento eu quero cadastrar o equipamento para este cliente então é o seguinte:

O cliente chega eu o cadastro ele traz o equipamento e eu o cadastro o equipamento.

Se o mesmo cliente trazer outro equipamento o código será 2

Mas se um cliente novo chega e traz um equipamento então o sistema gera código 2 para o cliente mas o equipamento para esse cliente eu qero que começe a contar a partir do um e assim por diante.

no caso do primeiro cliente voltar a loja com outro equipamento a sequencia continua na boa equipamento 3 e assim vai.

Gostaria de uma ajuda de como montar isso para o meu sistema.

Abraços a todos

Oi Cassios,

Não sei como você montou sua tabela no BD, o cod. do equipamento não pode ser chave primária, e você deve deixar o campo cod equipamento livre para digitar o codigo, tendo atenção para criar rotina de verificação dos codigos do cliente e equipamento. você tmabém deve atentar para não ter nenhum generator de codigo de equipamento.

Se cod cliente já existe faça

cod equipamento + 1

senão

cod equipamento recebe novo cod

Deve aprimorar mais esta pequena rotina mostrando mensagens.

Recife.

Editado por Recife
Link para o comentário
Compartilhar em outros sites

  • 0
Guest --brugall --

Cassios,

Pelo que entendi na sua tabela o relacionamento está 1 p muitos entre cliente e equipamento, é isso mesmo? Se for isso você pode fazer uma consulta antes do Insert na tabela, pode jogar um select para verificar se existe algum equipamento cadastrado com o Código do cliente ( Lembrando q nesse caso o código do cliente está como chave estrangeira na tabela Equipamento).

A partir desse select você pode somar pelo RecordCount dele por exemplo:

try
  with queryEquipamento do
   begin
    sql.add(' Select * from Cliente C, Equipamento E');
    sql.add('  where C.ID = E.IDCliente');
    Open;                                             // vai fazer a consulta de quantos registros tem para o cliente.
   end;

   objetoEquipamento.ID := queryEquipamento + 1;

 except

 end;

Acho que isso dá pra ajudar um pouco, mas seria interessante analisar como está no Banco.

Link para o comentário
Compartilhar em outros sites

  • 0

brugall a idéia é por aí, mas acho que dá para melhorar um pouquinho, porque existem alguns casos (componentes) que o valor de RecordCount não é confiável e o mais apropriado seria utilizar uma querie com COUNT.

Supondo as tabelas:

- Equipamento com os campos ID_EQUIPAMENTO (INT) e ID_CLIENTE (INT);

- Cliente com o campo ID_CLIENTE (INT);

A proposta é utilizar o mais comum nestes casos: uma querie com o MAX.

Assim, poderia ser criada uma função para isto:

function DMMain.NextEqpID(IDCliente :Integer) :Integer;
begin
  with QryMaxEquipamento do
  begin
    SQL.Clear;
    SQL.Add('SELECT MAX(ID_EQUIPAMENTO) AS ID_EQUIPAMENTO');
    SQL.Add('FROM EQUIPAMENTO');
    SQL.Add('WHERE ID_CLIENTE = :ID_CLIENTE');
    ParamByName('ID_CLIENTE').AsInteger := IDCliente;  
    Open;
    Result := FieldByName('ID_EQUIPAMENTO').AsInteger +1;
    Close;
  end;
end;

daí, no evento BeforePost de seu dataset (ou qualquer outro evento anterior a efetiva gravação no banco), você chama esta função, passando o código do cliente em questão e atribui o seu retorno ao campo de identificação do equipamento.

OBS:

- Ocorre com uma abordagem desta (obter o valor máximo) que, se eventualmente, algum equipamento futuramente for excluído do cadastro, ao listar os equipamentos do cliente, poderá haverá uma lacuna (falta de um código no meio);

- Por outro lado, se utilizar a contagem de itens, havendo a mesma exclusão, ao ser incluso um novo item, há 99% de chance de erro por duplicação de chave (key violation);

Assim, se for necessário manter os itens sempre sequenciais, nenhuma das duas abordagens funcionará corretamente.

Entretanto, eu diria que a melhor abordagem é a do MAX; independente das lacunas, que podem ser contornadas nas "visualizações" se for importante, mas que evita dores de cabeça caso você tenha outras informações que se relacionem a estes dados (questões de integridade referencial).

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...