Auto Incremento Ainda não resolvido?

Delphi

31/03/2005

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:

    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

Daaneto

Curtidas 0

Respostas

Vinicius2k

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+


GOSTEI 0
Daaneto

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,


GOSTEI 0
POSTAR