Inconsistências nas tabelas FR *
De Wiki.Softwell
Aqui você encontrará solução para alguns dos problemas que podem ocorrer na estrutura interna das tabelas do Maker.
Formulário não encontrados na exportação do WAR
Se o sistema que você estiver tentando exportar para WAR/JAR apresentar erros de Formulário não encontrado ou algo similiar no sistema gerado e não apresenta este erro quando você usa o webrun.war genérico, provavelmente você tem formulários que estão no mesmo banco de dados mas não fazem parte do seus sistema, por isso, não são exportados junto com os demais formulários do sistema. Para solucionar tal situação é necessário localizar todos os formulários que estão associados a eventos ou propriedades de botão, grades e outros componentes e que não estão vinculados ao sistema, e vinculá-los (não copie) através do repositório.
Há uma procedure que automatiza este processo, para tal faça o seguinte:
- Crie a procedure MKR_CORRIGIR_FORMULARIOS_DO_SISTEMA;
- Execute-a passando o código (3 letras) do sistema com problemas;
execute MKR_CORRIGIR_FORMULARIOS_DO_SISTEMA 'COD';
Código para MS-SQL Server:
CREATE PROCEDURE dbo.MKR_CORRIGIR_FORMULARIOS_DO_SISTEMA @SIS varchar(3)
AS
BEGIN
WHILE (EXISTS(select *
from FR_PROPRIEDADE P
INNER JOIN FR_FORMULARIO f on (cast(f.FRM_CODIGO as varchar) = p.PRO_VALOR) --Exclue os formulários que não existem
INNER JOIN FR_FORMULARIO_SISTEMA fs on (fs.FRM_CODIGO = p.FRM_CODIGO) and
(fs.SIS_CODIGO = @SIS)
where (P.PRO_NOME='CodigoForm')
and (isNumeric(p.PRO_VALOR) = 1)
and (p.PRO_VALOR not in ('-1', '0'))
and (p.PRO_VALOR not in (select cast(fs2.FRM_CODIGO as varchar)
from FR_FORMULARIO_SISTEMA fs2
where (fs2.SIS_CODIGO = @SIS)))))
BEGIN
-- Insere os formulários no sistema
insert into FR_FORMULARIO_SISTEMA (FRM_CODIGO, SIS_CODIGO)
select distinct
case
when isNumeric(p.PRO_VALOR) = 1 then cast(cast(p.PRO_VALOR as float) as int)
else null
end, @SIS
from FR_PROPRIEDADE P
INNER JOIN FR_FORMULARIO f on (cast(f.FRM_CODIGO as varchar) = p.PRO_VALOR) --Exclue os formulários que não existem
INNER JOIN FR_FORMULARIO_SISTEMA fs on (fs.FRM_CODIGO = p.FRM_CODIGO) and
(fs.SIS_CODIGO = @SIS)
where (P.PRO_NOME='CodigoForm')
and (isNumeric(p.PRO_VALOR) = 1)
and (p.PRO_VALOR not in ('-1', '0'))
and (p.PRO_VALOR not in (select cast(fs2.FRM_CODIGO as varchar)
from FR_FORMULARIO_SISTEMA fs2
where (fs2.SIS_CODIGO = @SIS)))
END
WHILE (EXISTS(select *
from FR_PARAMETRO p
LEFT OUTER JOIN FR_FORMULARIO f on (f.FRM_GUID = p.PAR_VALOR)
INNER JOIN FR_FORMULARIO f1 on (cast(f1.FRM_CODIGO as varchar)= case
when (len(p.PAR_VALOR) > 10) then
cast(f.FRM_CODIGO as varchar)
else
p.PAR_VALOR
end) --Exclue os formulários que não existem
INNER JOIN FR_FORMULARIO_SISTEMA fs on (fs.FRM_CODIGO = p.FRM_CODIGO) and
(fs.SIS_CODIGO = @SIS)
where ((p.PAR_NOME = 'Código de Formulário') or (p.PAR_NOME = 'Cod.Formulario')) and
(case
when (len(p.PAR_VALOR) > 10) then
cast(f.FRM_CODIGO as varchar)
else
p.PAR_VALOR
end not in (select cast(fs2.FRM_CODIGO as varchar)
from FR_FORMULARIO_SISTEMA fs2
where (fs2.SIS_CODIGO = @SIS)))))
BEGIN
insert into FR_FORMULARIO_SISTEMA (FRM_CODIGO, SIS_CODIGO)
select distinct
case
when (len(p.PAR_VALOR) > 10) then
cast(f.FRM_CODIGO as varchar)
else
cast(cast(p.PAR_VALOR as float) as int)
end as c1, @SIS
from FR_PARAMETRO p
LEFT OUTER JOIN FR_FORMULARIO f on (f.FRM_GUID = p.PAR_VALOR)
INNER JOIN FR_FORMULARIO f1 on (cast(f1.FRM_CODIGO as varchar) = case
when (len(p.PAR_VALOR) > 10) then
cast(f.FRM_CODIGO as varchar)
else
p.PAR_VALOR
end) --Exclue os formulários que não existem
INNER JOIN FR_FORMULARIO_SISTEMA fs on (fs.FRM_CODIGO = p.FRM_CODIGO) and
(fs.SIS_CODIGO = @SIS)
where ((p.PAR_NOME = 'Código de Formulário') or (p.PAR_NOME = 'Cod.Formulario')) and
(case
when (len(p.PAR_VALOR) > 10) then
cast(f.FRM_CODIGO as varchar)
else
p.PAR_VALOR
end not in (select cast(fs2.FRM_CODIGO as varchar)
from FR_FORMULARIO_SISTEMA fs2
where (fs2.SIS_CODIGO = @SIS)))
END
END
Obs: A procedure abaixo foi feita para MS-SQL Server, mas pode ser adaptada facilmente para outros SGDB's.
Problemas de FK entre FR_FORMULARIO e FR_FORMULARIO_SISTEMA
Se você experimentar mensagens de erro do tipo:
"Violation of PRIMARY KEY constraint 'PK_FR_FORMULARIO_SISTEMA'. Cannot insert duplicate key in object 'dbo.FR_FORMULARIO_SISTEMA"
Provavelmente houve algum erro na criação das estruturas das FRs e a chave estrangeira entra as tabelas FR_FORMULARIO e FR_FORMULARIO_SISTEMA não foi criada. Para corrigir tal problema, primeiro, remova o lixo da tabela FR_FORMULARIO com o comando abaixo:
delete from FR_FORMULARIO_SISTEMA where FRM_CODIGO not in (select FRM_CODIGO from FR_FORMULARIO)
Depois, crie a chave estrangeira entre as duas tabelas de acordo a sintaxe do seu banco, esta FK é do tipo CASCADE, ou seja, quando se deleta um formulário o registro correspondente é removido da tabela FR_FORMULARIO_SISTEMA.
Subformulários sem tabulação
Se o seus subformulários foram criados em versões muito antigas do Maker, talvez seja necessário setar a propriedade Tabular dos subformulários para True (Verdadeiro), posi as versões antigas ignoravam tal propriedade e sempre consideravam o valor como True. Para ativar a tabulação de todos os subformulários de um banco de dados de uma só vez crie e execute a procedure abaixo (SQL Server).
CREATE PROCEDURE FR_TABULAR_TODOS_OS_SUBFORMS
AS
BEGIN
DECLARE
@FRM_CODIGO INT,
@COM_CODIGO INT,
@PRO_NOME VARCHAR(100),
@PRO_VALOR VARCHAR(5000)
DECLARE FR_FIX CURSOR FOR
select P.FRM_CODIGO, P.COM_CODIGO, P.PRO_NOME, P.PRO_VALOR from FR_COMPONENTE C
left join FR_PROPRIEDADE P on (P.COM_CODIGO=C.COM_CODIGO) and (P.PRO_NOME='Tabular')
where (C.COM_TIPO='D')
OPEN FR_FIX
FETCH NEXT FROM FR_FIX INTO @FRM_CODIGO, @COM_CODIGO, @PRO_NOME, @PRO_VALOR
WHILE @@FETCH_STATUS = 0
BEGIN
if(@PRO_NOME is null)
insert into FR_PROPRIEDADE (FRM_CODIGO, COM_CODIGO, PRO_NOME, PRO_VALOR) values (@FRM_CODIGO, @COM_CODIGO, @PRO_NOME, 'True')
else
update FR_PROPRIEDADE set PRO_VALOR = 'True' where (FRM_CODIGO=@FRM_CODIGO) and (COM_CODIGO=@COM_CODIGO) and (PRO_NOME=@PRO_NOME);
FETCH NEXT FROM FR_FIX INTO @FRM_CODIGO, @COM_CODIGO, @PRO_NOME, @PRO_VALOR
END
CLOSE FR_FIX
DEALLOCATE FR_FIX
END
