Fórum Dúvida com Primary Key e Foreign Key #275364
04/04/2005
0
SQLConnection -> SQLDataSet -> DataSetProvider -> ClientDataSet
Tenho as seguintes tabelas:
LOGIN
id_user integer NOT NULL Primary Key*
login varchar
senha varchar
DADOS
id_pess integer NOT NULL Primary Key*
id_user integer NOT NULL Foreign Key LOGIN
nome varchar
fone varchar
*Ambos tem uma Trigger de auto incremento antes do ´Insert´
Agora aí vão as dúvidas:
1)Quando vou gravar um registro na tabela LOGIN, ele diz que o compo ´id_user´ é requerido, mas como vou passar um valor sendo que o SGBD vai se encarregar de colocar o valor pra mim? Como faço para configurar ou pular isso?
2) Na tabela DADOS a mesma coisa, mas ainda tem o problemas da FOREIGN KEY. Quando vou gravar um registro, ele pede um valor pra chave estrangeira, mas quando vou dar um valor, no caso um valor válido da tabela LOGIN, ele da um erro de violação de chave. Como eu resolvo
isso?
Valew
Seu_madruga
Curtir tópico
+ 0Posts
04/04/2005
Kotho
O problema de Key Violation ocorre, porque o campo está com a propriedade ProviderFlags como Key (e ele tem que estar assim mesmo). E, toda vez que tiver mais de um registro que esse campo possua o mesmo valor vai gerar esta exceção. Então, você pode jogar um valor (que pode ser uma variavel que seja incrementada) para burlar esse erro, já que você vai atribuir via trigger.
Tem uma propriedade no DataSetProvider chamada Constraints, mas essa eu nunca testei. Tente colocar como False antes de usar a opção anterior.
Gostei + 0
04/04/2005
Seu_madruga
Gostei + 0
04/04/2005
Kotho
Gostei + 0
04/04/2005
Seu_madruga
Gostei + 0
04/04/2005
Kotho
Fora isso, eu nem incluo os campos no Client, pois só dá trabalho extra.
Gostei + 0
04/04/2005
Seu_madruga
Gostei + 0
04/04/2005
Kotho
Gostei + 0
04/04/2005
Seu_madruga
1) Tenho no form um SimpleDataSet, um DataSource e um DBGrid;
2) Tenho dois DBEdits que ligam os campos LOGIN e SENHA;
3) Dois botões, um tem o SimpleDataSet.INSERT e outro com POST e APPLYUPDATES;
4) Liguei a tabela LOGIN no SimpleDataSet.Connection;
5) Coloquei um comando SQL ´Select * from LOGIN´ no CommandText do SimpleDataSet.DataSet.CommandText;
6) Rodei a aplicação e quando vou dar um POST ou APPLYUPDATES aparece a msn:
´Field ID must have a value´
7) Faço um duplo clique no SimpleDataSet para criar os objetos de Campo
ID, LOGIN E SENHA;
8) Selecionei o Campo ID para trocar suas propriedades;
9) Coloco a opção do campo ID Required de True para False
Rodo a aplicação novamnte e aparece outra msn:
´Field value Required´
10) Troquei a opção do compo ID ´AutoGenerateValue´ para ´arAutoInc´
11) Em ProviderFlags coloquei a opção ´pfInKey´ como True
12) Nada ainda, continua com o erro! Não sei o que fazer!
O que eu faço? Não funciona, quem puder eproduzir o erro para ver aonde eu estou errando, eu agradeceria muito
Valew
Gostei + 0
05/04/2005
Seu_madruga
Gostei + 0
05/04/2005
Fred
ai vai a function:
function TfrmPadrao.AutoInc(gen : string): integer; var ResultSet : TCustomSQLDataSet; SQLstmt : string; begin result := 0; SQLstmt := ´select gen_id(´+gen+´,1) ´ + ´as VALOR from RDB$DATABASE;´; ResultSet := nil; try dm.SQLConnection1.Execute(SQLstmt, nil, @ResultSet); if Assigned(ResultSet) then Result := ResultSet.FieldByName(´VALOR´).AsInteger; finally ResultSet.Free; end; end;
no evento OnNewRecord ou outro semelhante vc coloca seudataSetCODIGO.AsInteger := AutoInc(´NOMEDOGENERATOR´);
e apague todas as triggers de autoincremento
Gostei + 0
05/04/2005
Seu_madruga
Gostei + 0
13/04/2005
Seu_madruga
O problema é que eu não queria apagar as triggers de auto incremento nem precisar passar 0 para enganar o banco de dados, deve ter algum parametro que indica que meu campo ID é auto incremento no Banco e a aplicação não vai me pedir ele.
Gostei + 0
13/04/2005
Fred
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)