Auto Incremento Ainda não resolvido?
Exite alguma solução bem resolvida para o problema dos campos de auto incremento?
Estou tendo problema com este tipo de campo. É exibido a mensagem: Field ´ID´ must have a value.
Procurei aqui no fórum soluções para este problema, mas todas que achei (e não foram poucas!) aparentam ser gambiarras.
Exemplos:
- Ter uma consulta para verificar o maior valor do campo atualmente, para poder colocar como valor do campo de auto incremento.
- Verificar qual o próximo valor do Generator e atribuir ao campo de auto incremento, usando algo semelhante a: SELECT GEN_ID(Generator, 1) FROM RDB$DATABASE
- Ter uma tabela extra que guarda os valores utilizados e atribuir ao campo de auto incremento;
- Abandonar o uso dos componente Data-Awares e fazer na marra as inserções/atualizações/remoções com instruções SQL.
Não entendo como uma coisa tão simples dá tanto trabalho.
Se é auto incremento, por que não é realizado automaticamente este incremento?
Pelo que entendi do processo de inserção de um registro, o DBExpress gera a instrução SQL para inserção/atualização/etc, etc, etc, através do comando ApplyUpdate, tornando efetiva as modificações feitas no banco de dados.
Até aí tudo certo.
Para uma inserção será gerado uma instrução SQL ´INSERT INTO xxxxx bla bla bla´. Então por que não é gerado o valor do auto incremento?
Se for feito na mão, no editor do banco de dados, não passando o valor do campo auto incremento dá certo. Por que com o Delphi não dá certo?
Estou usando o Delphi 6 + Firebird 1.5.
Uso o seguinte Trigger:
CREATE TRIGGER SENSOR_BI FOR SENSOR
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(GEN_SENSOR_ID,1);
END
Na Aplicação utilizo o seguinte código:
Estou tendo problema com este tipo de campo. É exibido a mensagem: Field ´ID´ must have a value.
Procurei aqui no fórum soluções para este problema, mas todas que achei (e não foram poucas!) aparentam ser gambiarras.
Exemplos:
- Ter uma consulta para verificar o maior valor do campo atualmente, para poder colocar como valor do campo de auto incremento.
- Verificar qual o próximo valor do Generator e atribuir ao campo de auto incremento, usando algo semelhante a: SELECT GEN_ID(Generator, 1) FROM RDB$DATABASE
- Ter uma tabela extra que guarda os valores utilizados e atribuir ao campo de auto incremento;
- Abandonar o uso dos componente Data-Awares e fazer na marra as inserções/atualizações/remoções com instruções SQL.
Não entendo como uma coisa tão simples dá tanto trabalho.
Se é auto incremento, por que não é realizado automaticamente este incremento?
Pelo que entendi do processo de inserção de um registro, o DBExpress gera a instrução SQL para inserção/atualização/etc, etc, etc, através do comando ApplyUpdate, tornando efetiva as modificações feitas no banco de dados.
Até aí tudo certo.
Para uma inserção será gerado uma instrução SQL ´INSERT INTO xxxxx bla bla bla´. Então por que não é gerado o valor do auto incremento?
Se for feito na mão, no editor do banco de dados, não passando o valor do campo auto incremento dá certo. Por que com o Delphi não dá certo?
Estou usando o Delphi 6 + Firebird 1.5.
Uso o seguinte Trigger:
CREATE TRIGGER SENSOR_BI FOR SENSOR
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(GEN_SENSOR_ID,1);
END
Na Aplicação utilizo o seguinte código:
Application.CreateForm(TFrmCadastroSensor, frmCadastroSensor); dm.cdsSensor.insert; If frmCadastroSensor.ShowModal = MROK Then Begin dm.cdsSensor.ApplyUpdates(0); End Else Begin dm.cdsSensor.Cancel; End;
Daaneto
Curtidas 0
Respostas
Vinicius2k
31/03/2005
Colega,
O problema, realmente, é simples... e a solução também (E não é ´gambiarra´):
Apenas ajuste a propriedade [b:65ea78d096]Required[/b:65ea78d096] do TField de ID para [b:65ea78d096]False[/b:65ea78d096], tanto no SQLDataSet quanto no ClientDataSet.
A ID será gerada pela Trigger + Generator no momento da efetiva inserção do lado do servidor. Nota : Vc só irá vê-la (a ID) após um Refresh do ClientDataSet.
A outra solução, com o uso da função GEN_ID, também não é ´gambiarra´ e é mais utilizada quando se é necessário ter a ID gerada antes de enviar o update para o banco, como, por exemplo, em master-details onde se necessita da ID do registro ´pai´ para atribuir aos ´filhos´.
T+
O problema, realmente, é simples... e a solução também (E não é ´gambiarra´):
Apenas ajuste a propriedade [b:65ea78d096]Required[/b:65ea78d096] do TField de ID para [b:65ea78d096]False[/b:65ea78d096], tanto no SQLDataSet quanto no ClientDataSet.
A ID será gerada pela Trigger + Generator no momento da efetiva inserção do lado do servidor. Nota : Vc só irá vê-la (a ID) após um Refresh do ClientDataSet.
A outra solução, com o uso da função GEN_ID, também não é ´gambiarra´ e é mais utilizada quando se é necessário ter a ID gerada antes de enviar o update para o banco, como, por exemplo, em master-details onde se necessita da ID do registro ´pai´ para atribuir aos ´filhos´.
T+
GOSTEI 0
Daaneto
31/03/2005
A solução apresentada funcionou perfeitamente. Fiquei muito contente em descobrir que a solução é realmente muito simples.
Estava preocupado, pois existem inúmeras perguntas semelhantes a que fiz e com respostas que são gambiarras, como havia comentado anteriormente.
Muito obrigado pela ajuda,
Estava preocupado, pois existem inúmeras perguntas semelhantes a que fiz e com respostas que são gambiarras, como havia comentado anteriormente.
Muito obrigado pela ajuda,
GOSTEI 0