Problema ID com Trigger

Caros colegas,

As tabelas do meu sistema têm um campo ID_<nome_tabela> que é um numérico sequencial e a Primary Key delas. Esse campo é incrementado por uma Trigger no evento Before Insert do banco de dados (não do SC para evitar problemas de concorrência e melhorar a performance). Essa trigger apenas pega o maior sequencial da tabela e soma 1. Não uso o auto-incremento do MySQL porque teria problemas com replicação de dados entre bases de desenvolvimento e produção.
Pois bem, o meu problema é o seguinte: criei dois formulários do tipo Grid Editável e o primeiro possui uma ligação para o segundo através de um campo Label, passando o ID do registro para que o segundo formulário exiba os detalhes apenas referentes ao id do registro. Seria como um pedido no primeiro e os detalhes no segundo (como o exemplo do SC mesmo). Reconheço que seria a opção ideal o uso do Mestre/Detalhe, mas, por não querer exibir os dois formulários juntos a ligação ficou melhor. Só que sempre que insiro um registro novo, mesmo após salvar, ele não recupera o campo ID. O valor para Insert está com [Auto-incremente manual] e ele todo funciona bem, tanto no Insert quanto no Update mas, ao chamar o link passando o ID do registro inserido ele passa vazio. Não sei se é BUG do SC7, pois o campo está com o valor do ID. Se eu reordenar os registros ele já consegue enviar o ID.
Fazem idéia do que pode ser isso?

Você informa ao sc qual sua PK?
Você diz a aplicação que este campo é auto-increment ao SC?

Na opção SQl do formuláriomarque os campos que fazem parte das chaves exclusivas e primárias.

Em editar campos do Formulário marque o campo PK e selecione o valor do Banco de dados na inserção e alteração.

Eu tenho 2 campos que identificam o registro, conforme abaixo:

  • Um ID inteiro sequencial burro que sozinho é a PK da tabela incrementado por Trigger do banco de dados. Esse está definido como chave única e PK no formulário e como auto-incremento(automático).
  • Um código negocial que não faz parte da PK, pois pode repetir desde que em empresa diferente. A empresa é um ID também presente na tabela e não PK. Essa repetição na mesma empresa eu trato nos eventos onBeforeInsert e onBeforaUpdate do formulário e ela funciona bem.

Para ficar mais claro segue abaixo o script de criação de uma das tabelas com o relatado problema:

CREATE TABLE linha (
id_linha int(5) unsigned NOT NULL,
cod_linha varchar(6) COLLATE utf8_unicode_ci NOT NULL,
descricao varchar(25) COLLATE utf8_unicode_ci NOT NULL,
id_empresa int(5) unsigned NOT NULL,
ind_bloqueado char(1) COLLATE utf8_unicode_ci NOT NULL,
usuario_atualizacao int(5) unsigned NOT NULL,
data_atualizacao datetime NOT NULL,
PRIMARY KEY (id_linha),
KEY idx_cod_linha (cod_linha),
KEY fk_linha_empresa_empresa (id_empresa),
CONSTRAINT fk_linha_empresa_empresa FOREIGN KEY (id_empresa) REFERENCES empresa (id_empresa)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Fiz novos testes aqui mudando o campo para AUTO-INCREMENT no MySQL e usando definição no valor de inser no SC para auto-incremento automático e mesmo assim ocorre o erro quando passamos o campo como parãmetro para uma ligação por campo do tipo especial Label. Minha conclusão é de que estamos diante de um BUG da V7.

Seguem dumps das tabelas, sendo que a [linha] tem o ID incrementado por Trigger e a [linha_old] tem o ID auto-incremento e foi criada para testar. Ressalto que o problema persistiu nas duas formas/tabelas.



– Estrutura da tabela linha

CREATE TABLE IF NOT EXISTS linha (
id_linha int(5) unsigned NOT NULL,
cod_linha varchar(6) COLLATE utf8_unicode_ci NOT NULL,
descricao varchar(25) COLLATE utf8_unicode_ci NOT NULL,
id_empresa int(5) unsigned NOT NULL,
ind_bloqueado char(1) COLLATE utf8_unicode_ci NOT NULL,
usuario_atualizacao int(5) unsigned NOT NULL,
data_atualizacao datetime NOT NULL,
PRIMARY KEY (id_linha),
KEY idx_cod_linha (cod_linha),
KEY fk_linha_empresa_empresa (id_empresa)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


– Gatilhos linha

DROP TRIGGER IF EXISTS tg_linha_bi;
DELIMITER //
CREATE TRIGGER tg_linha_bi BEFORE INSERT ON linha
FOR EACH ROW BEGIN
set new.id_linha = (select ifNull(max(id_linha), 0) + 1 from linha);
END
//
DELIMITER ;


– Restrições para as tabelas dumpadas


– Restrições para a tabela linha

ALTER TABLE linha
ADD CONSTRAINT fk_linha_empresa_empresa FOREIGN KEY (id_empresa) REFERENCES empresa (id_empresa);



– Estrutura da tabela linha_old

CREATE TABLE IF NOT EXISTS linha_old (
id_linha int(5) unsigned NOT NULL AUTO_INCREMENT,
cod_linha varchar(6) COLLATE utf8_unicode_ci NOT NULL,
descricao varchar(25) COLLATE utf8_unicode_ci NOT NULL,
id_empresa int(5) unsigned NOT NULL,
ind_bloqueado char(1) COLLATE utf8_unicode_ci NOT NULL,
usuario_atualizacao int(5) unsigned NOT NULL,
data_atualizacao datetime NOT NULL,
PRIMARY KEY (id_linha),
KEY idx_cod_linha (cod_linha),
KEY fk_linha_empresa_empresa (id_empresa)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=13 ;