Algumas vezes eu via que um objeto havia sido marcado como modificado na camada VAR e quando ia comparar via que esse objeto não tinha alteração alguma em relação ao layer inferior, no entanto, ele estava lá e estava marcado.

Por conta disso eu tentei desenvolver um job que fizesse justamente essa comparação, mas tava dando muita cabeçada e resolvi das uma pesquisada e encontrei o script abaixo, que faz exatamente isso, aqui.

Comentários do autor traduzido:

Nosso cliente solicitou um job para remover copias idênticas do layer VAR.
Por alguma razão desconhecida, alguns objetos da AOT são tocados no layer var, mas na verdade são cópias idênticas. Quando o desenvolvedor comparar o objeto na camada var com qualquer outro layer inferior (BUS, SYS etc.) o ax mostra como cópia identica.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
static void FindAndDeleteIdenticalObjects(Args _args)
{
  SysTreeNode         comparable1,        comparable2;
  TreeNode            curLevelTreeNode,   upperLevelTreeNode;
  UtilIdElements      utilElements,       joinUtilElements;
  ;
 
  while select UtilElements
    where UtilElements.utilLevel      == UtilEntryLevel::var              &&
         (UtilElements.recordType     == UtilElementType::Form            ||
          Utilelements.recordType     == UtilElementType::Report          ||
          Utilelements.recordType     == UtilElementType::Table           ||
          Utilelements.recordType     == UtilElementType::Class           ||
          Utilelements.recordType     == UtilElementType::Enum            ||
          Utilelements.recordType     == UtilElementType::ExtendedType)
  {
    select firstonly recid from joinUtilElements
        where joinUtilElements.utilLevel    !=  UtilElements.utilLevel      &&
              joinUtilElements.name         ==  UtilElements.name           &&
              joinUtilElements.recordType   ==  UtilElements.recordType;
 
    if (joinUtilElements.RecId)
    {
      curLevelTreeNode      = SysTreeNode::findNodeInLayer(UtilElements.recordType, UtilElements.name, UtilElements.parentId, UtilElements.utilLevel);
      upperLevelTreeNode    = SysTreeNode::getLayeredNode(curLevelTreenode, 1);
      comparable1           = SysTreeNode::newTreeNode(curLevelTreeNode);
      comparable2           = SysTreeNode::newTreeNode(upperLevelTreeNode);
 
      if (SysCompare::silentCompare(comparable1, comparable2))
      {
        info(strFmt("Element name: %1, Element type: %2", UtilElements.name, enum2str(UtilElements.recordType)));
//Para remover os objetos iguais, descomente a linha abaixo
//        curLevelTreeNode.AOTdelete();
      }
    }
  }
}

Obs.: O código acima apenas irá exibir em uma janela info os objetos que foram encontrados duplicados, para também fazer a remoção, basta tirar os sinais de comentário da linha indicada no código.

[]s
Pichler