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:

  1. Crie a procedure MKR_CORRIGIR_FORMULARIOS_DO_SISTEMA;
  2. 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
Ferramentas pessoais