Fórum Chave Primaria (Como resolver esta situação?) #349156

19/11/2007

0

Prezados Amigos...
Estou com o seguinte problema...

Tenho um sistema em produção onde trabalho o campo codigo (chave primaria) da tabela do cadastro principal com um sistema de autoincremento...

O sistema possui um cadastro principal que dentro deste, são alimentadas várias tabelas de sub-cadastros internos ao principal, e nessas tabelas dos sub-cadastros armazeno o codigo do cadastro principal como referencia (chave estrangeira).

O problema está ocorrendo quando o sistema foi colocado em rede com mais de uma maquina alimentando o cadastro ao mesmo tempo... pque o aplicativo ia no BD pegava o ultimo codigo e adicionava + 1, e este codigo ia sendo utilizado nos sub-cadastros....

As vezes quando chegava no fim do cadastro principal.. que o usuario já havia feito todo o cadastro e sub cadastros.. então o codigo dele já havia sido utilizado pque outro usuario efetivou um cadastro em sua frente.

Estive pensando em modificar o campo codigo para cpf desta forma não haveria repeticao.... Mas gostaria de uma solução mais simples de forma que eu pudesse aplicar alguma inteligencia na função que retorna o autoincremento afim de fazer com que este codigo nunca se repita....

Conto com vcs....


Pablo_lima

Pablo_lima

Responder

Posts

19/11/2007

Gandalf.nho

Qual a base de dados que você usa?


Responder

Gostei + 0

20/11/2007

Pablo_lima

Qual a base de dados que você usa?


Prezado Amigo...
Utilizo Firebird 1.5 com dbexpress

Um abraço.


Responder

Gostei + 0

20/11/2007

Gandalf.nho

Essas tabelas secundárias são alimentadas como? Num formulário master-detail ou em algum evento de maneira invisível pro usuário?


Responder

Gostei + 0

20/11/2007

Pablo_lima

Essas tabelas secundárias são alimentadas como? Num formulário master-detail ou em algum evento de maneira invisível pro usuário?


De maneira invisivel....
Por exemplo... O cadastro principal de codigo 10 (Autoincremento que neste caso é o ultimo registro da tabela + 1)

Dentro do cadastro do candidato, cadastramos suas experiencias profissionais. Cada experiencia guarda como relação o codigo (10) do cadastro principal....

E quando vamos finalizar a gravação final do candidato com o codigo 10 (detalhe os sub cadastros todos já forão persistidos.. ex; experiencias profissionais, dependentes, cursos, etc.. ) então outro usuario já finalizou a gravação com o codigo 10...

Então este que está pra finalizar o cadastro tem um erro.. de chave primaria....

Sei lá.. estive pensando.. em como tenho finalizado a persistencia no fim do cadastro principal...
Efetivar o codigo ex: 10 para que o proximo usuario pegue o 11 e não o 10...

Nossa to confuso com isso...
Por isso pensei que o CPF fosse a solução..
Enfim.. A unica coisa que preciso.. é dar um jeito de fazer com que essa conteudo da chave primaria não se repita....

O duro é que até pra armazenar o CPF no campo codigo que é a chave primaria tá complicado.. pque o tipo INT não aceita o conteudo do CPF... diz que é muito grande...

Um abraço...
Conto com vcs....


Responder

Gostei + 0

20/11/2007

Silviogs

Olá

vc pode criar uma tabela que tenha um incremento tipo:

create table incremento
(codigo integer);

no componente que vc usa faça:

procedure TFrm_Principal.CadastrodocandidatoNewRecord(DataSet: TDataSet);
var
codigoatual : integer;
begin
Auxiliar.Close;
Auxiliar.SQL.Clear;
Auxiliar.SQL.Add(´select codigo from incremento´);
Auxiliar.Open;
codigoatual := Auxiliar.Fields[0].AsInteger + 1;

Auxiliar.Close;
Auxiliar.SQL.Clear;
Auxiliar.SQL.Add(´update incremento set codigo=´+codigoatual);
Auxiliar.ExecSQL;
end;

Espero ter ajudado

Silvio Guedes


Responder

Gostei + 0

20/11/2007

Corcos

Ao inves de gerar o codigo no inicio do cadastro ´prendendo´ o codigo faça no final, antes do applyupdate, assim dificilmente alguem clicará no mesmo segundo.


Responder

Gostei + 0

22/11/2007

Pablo_lima

Ao inves de gerar o codigo no inicio do cadastro ´prendendo´ o codigo faça no final, antes do applyupdate, assim dificilmente alguem clicará no mesmo segundo.


OK Corcos.. Agradeço a dica velho.. Mas...

Preciso do codigo de referencia do cadastro principal no inicio do cadastro.. pque utilizo ele para armazenamento de todos os subcadastros que ocorrem no andamento do cadastro principal.. como falei.. experiencias profissionais, dependentes, cursos, etc....

Estes subcadastros... armazenam o codigo do cadastro principal como chave estrangeira.. de referencia para futuras pesquisas...

Obrigado pela força...


Responder

Gostei + 0

22/11/2007

Pablo_lima

Olá vc pode criar uma tabela que tenha um incremento tipo: create table incremento (codigo integer); no componente que vc usa faça: procedure TFrm_Principal.CadastrodocandidatoNewRecord(DataSet: TDataSet); var codigoatual : integer; begin Auxiliar.Close; Auxiliar.SQL.Clear; Auxiliar.SQL.Add(´select codigo from incremento´); Auxiliar.Open; codigoatual := Auxiliar.Fields[0].AsInteger + 1; Auxiliar.Close; Auxiliar.SQL.Clear; Auxiliar.SQL.Add(´update incremento set codigo=´+codigoatual); Auxiliar.ExecSQL; end; Espero ter ajudado Silvio Guedes


Prezado Silvio...
Deixe eu ver se entendi a idéia...

Eu tenho a tabela do candidato... (cadastro principal).. No meu processo de autoincremento tenho uma procedure que pega o ultimo codigo da tabela e adiciona + 1.. joga esse valor numa variavel que utilizo para armazenar a chave estrangeira das tabelas dos sub cadastros....(experiencias profissionais, cursos, dependentes etc...)

Essa proposta que vc passou trabalharia com uma outra tabela.. como vc disse por exemplo (Autoincremento) e ela teria uma outra sequencia de codigo? Onde eu utilizaria uma especie de junção para unir ao codigo do autoincremento da tabela principal para que o codigo da tabela principal não se repita?

Se puder me esclareça um pouco mais sua propsota.. Pois acho que poderá me ajudar com meu problema...

Um abraço...
Pablo


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar