Autor Tópico: Problema ID com Trigger  (Lida 3193 vezes)

Erikson Flávio

  • Iniciante
  • **
  • Mensagens: 77
    • Email
Problema ID com Trigger
« Online: Abril 29, 2013, 05:15:54 pm »
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?
Desenvolvedor PHP/Java/Oracle/MySQL - Veterano
ScriptCase - Intermediário

Caroline

  • Iniciante
  • **
  • Mensagens: 77
Re:Problema ID com Trigger
« Responder #1 Online: Abril 30, 2013, 02:11:05 pm »
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.
Plugins Scriptcase:
Gerador de etiquetas: http://infinitusweb.net.br/pluginsc/6/etiquetaspdf/

Erikson Flávio

  • Iniciante
  • **
  • Mensagens: 77
    • Email
Re:Problema ID com Trigger
« Responder #2 Online: Abril 30, 2013, 06:13:12 pm »
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;
« Última modificação: Maio 04, 2013, 03:42:18 pm por Erikson Flávio »
Desenvolvedor PHP/Java/Oracle/MySQL - Veterano
ScriptCase - Intermediário

Erikson Flávio

  • Iniciante
  • **
  • Mensagens: 77
    • Email
Re:Problema ID com Trigger
« Responder #3 Online: Maio 07, 2013, 02:43:51 am »
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.
Desenvolvedor PHP/Java/Oracle/MySQL - Veterano
ScriptCase - Intermediário

Erikson Flávio

  • Iniciante
  • **
  • Mensagens: 77
    • Email
Re:Problema ID com Trigger
« Responder #4 Online: Maio 07, 2013, 08:55:24 am »
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 ;

« Última modificação: Maio 07, 2013, 09:00:56 am por Erikson Flávio »
Desenvolvedor PHP/Java/Oracle/MySQL - Veterano
ScriptCase - Intermediário