private int getAD_Element_ID(final String columnName) {
    if (Check.isEmpty(columnName, true)) {
      return -1;
    }

    //
    // Search from local cache first
    Integer elementId = columnName2elementId.get(columnName);
    if (elementId != null) {
      return elementId;
    }

    final I_AD_Element element = M_Element.get(getCtx(), columnName);
    if (element == null) {
      return -1;
    }
    elementId = element.getAD_Element_ID();
    columnName2elementId.put(columnName, elementId);
    return elementId;
  }
  /**
   * Process
   *
   * @return info
   * @throws Exception
   */
  protected String doIt() throws Exception {
    if (p_target_AD_Table_ID == 0)
      throw new AdempiereSystemError("@NotFound@ @AD_Table_ID@ " + p_target_AD_Table_ID);
    if (p_source_AD_Table_ID == 0)
      throw new AdempiereSystemError("@NotFound@ @AD_Table_ID@ " + p_source_AD_Table_ID);
    if (log.isLoggable(Level.INFO))
      log.info(
          "Source AD_Table_ID="
              + p_source_AD_Table_ID
              + ", Target AD_Table_ID="
              + p_target_AD_Table_ID);

    MTable targetTable = new MTable(getCtx(), p_target_AD_Table_ID, get_TrxName());
    MColumn[] targetColumns = targetTable.getColumns(true);
    if (targetColumns.length > 0)
      // TODO: dictionary message
      throw new AdempiereSystemError("Target table must not have columns");

    MTable sourceTable = new MTable(getCtx(), p_source_AD_Table_ID, get_TrxName());
    MColumn[] sourceColumns = sourceTable.getColumns(true);

    for (int i = 0; i < sourceColumns.length; i++) {
      MColumn colTarget = new MColumn(targetTable);
      PO.copyValues(sourceColumns[i], colTarget);
      colTarget.setAD_Table_ID(targetTable.getAD_Table_ID());
      colTarget.setEntityType(targetTable.getEntityType());
      // special case the key -> sourceTable_ID
      if (sourceColumns[i].getColumnName().equals(sourceTable.getTableName() + "_ID")) {
        String targetColumnName = new String(targetTable.getTableName() + "_ID");
        colTarget.setColumnName(targetColumnName);
        // if the element doesn't exist, create it
        M_Element element = M_Element.get(getCtx(), targetColumnName);
        if (element == null) {
          element =
              new M_Element(getCtx(), targetColumnName, targetTable.getEntityType(), get_TrxName());
          if (targetColumnName.equalsIgnoreCase(targetTable.getTableName() + "_ID")) {
            element.setColumnName(targetTable.getTableName() + "_ID");
            element.setName(targetTable.getName());
            element.setPrintName(targetTable.getName());
          }
          element.saveEx(get_TrxName());
        }
        colTarget.setAD_Element_ID(element.getAD_Element_ID());
        colTarget.setName(targetTable.getName());
        colTarget.setDescription(targetTable.getDescription());
        colTarget.setHelp(targetTable.getHelp());
      }
      // special case the UUID column -> sourceTable_UU
      if (sourceColumns[i].getColumnName().equals(sourceTable.getTableName() + "_UU")) {
        String targetColumnName = new String(targetTable.getTableName() + "_UU");
        colTarget.setColumnName(targetColumnName);
        // if the element doesn't exist, create it
        M_Element element = M_Element.get(getCtx(), targetColumnName);
        if (element == null) {
          element =
              new M_Element(getCtx(), targetColumnName, targetTable.getEntityType(), get_TrxName());
          if (targetColumnName.equalsIgnoreCase(targetTable.getTableName() + "_UU")) {
            element.setColumnName(targetTable.getTableName() + "_UU");
            element.setName(targetTable.getTableName() + "_UU");
            element.setPrintName(targetTable.getTableName() + "_UU");
          }
          element.saveEx(get_TrxName());
        }
        colTarget.setAD_Element_ID(element.getAD_Element_ID());
        colTarget.setName(targetTable.getName());
        colTarget.setDescription(targetTable.getDescription());
        colTarget.setHelp(targetTable.getHelp());
      }
      colTarget.setIsActive(sourceColumns[i].isActive());
      colTarget.saveEx(get_TrxName());
      // TODO: Copy translations
      m_count++;
    }

    //
    return "#" + m_count;
  } //	doIt
  /**
   * Process
   *
   * @return message
   * @throws Exception
   */
  protected String doIt() throws Exception {
    // TODO Error handling
    String sql = null;
    try {
      int no;
      Trx trx = Trx.get(get_TrxName(), false);
      // Create Elements from ColumnNames
      sql =
          "SELECT DISTINCT ColumnName, Name, Description, Help, EntityType "
              + "FROM	AD_COLUMN c WHERE NOT EXISTS "
              + "(SELECT 1 FROM AD_ELEMENT e "
              + " WHERE UPPER(c.ColumnName)=UPPER(e.ColumnName))"
              + " AND c.isActive = 'Y'";
      PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName());
      ResultSet rs = pstmt.executeQuery();
      while (rs.next()) {
        String columnName = rs.getString(1);
        String name = rs.getString(2);
        String desc = rs.getString(3);
        String help = rs.getString(4);
        String entityType = rs.getString(5);
        M_Element elem = new M_Element(getCtx(), columnName, entityType, get_TrxName());
        elem.setDescription(desc);
        elem.setHelp(help);
        elem.setPrintName(name);
        elem.save();
      }
      pstmt.close();
      rs.close();
      trx.commit(true);
      // Create Elements for Process Parameters which are centrally maintained
      sql =
          "SELECT DISTINCT ColumnName, Name, Description, Help, EntityType "
              + " FROM	AD_PROCESS_PARA p "
              + " WHERE NOT EXISTS "
              + " (SELECT 1 FROM AD_ELEMENT e "
              + " WHERE UPPER(p.ColumnName)=UPPER(e.ColumnName))"
              + " AND p.isCentrallyMaintained = 'Y'"
              + " AND p.isActive = 'Y'";
      pstmt = DB.prepareStatement(sql, get_TrxName());
      rs = pstmt.executeQuery();
      while (rs.next()) {
        String columnName = rs.getString(1);
        String name = rs.getString(2);
        String desc = rs.getString(3);
        String help = rs.getString(4);
        String entityType = rs.getString(5);
        // TODO AD_SEQ system !!!
        M_Element elem = new M_Element(getCtx(), columnName, entityType, get_TrxName());
        elem.setDescription(desc);
        elem.setHelp(help);
        elem.setPrintName(name);
        elem.save();
      }
      pstmt.close();
      rs.close();
      trx.commit(true);
      log.info("Adding missing Element Translations");
      sql =
          "INSERT INTO AD_ELEMENT_TRL (AD_Element_ID, AD_LANGUAGE, AD_Client_ID, AD_Org_ID,"
              + " IsActive, Created, CreatedBy, Updated, UpdatedBy,"
              + " Name, PrintName, Description, Help, IsTranslated)"
              + " SELECT m.AD_Element_ID, l.AD_LANGUAGE, m.AD_Client_ID, m.AD_Org_ID,"
              + " m.IsActive, m.Created, m.CreatedBy, m.Updated, m.UpdatedBy,"
              + " m.Name, m.PrintName, m.Description, m.Help, 'N'"
              + " FROM	AD_ELEMENT m, AD_LANGUAGE l"
              + " WHERE	l.IsActive = 'Y' AND l.IsSystemLanguage = 'Y'"
              + " AND	AD_Element_ID || AD_LANGUAGE NOT IN "
              + " (SELECT AD_Element_ID || AD_LANGUAGE FROM AD_ELEMENT_TRL)";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      log.info("Creating link from Element to Column");
      sql =
          "UPDATE	AD_COLUMN c"
              + " SET		AD_Element_id ="
              + " 	(SELECT AD_Element_ID FROM AD_ELEMENT e"
              + " 	WHERE UPPER(c.ColumnName)=UPPER(e.ColumnName))"
              + " 	WHERE AD_Element_ID IS NULL";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      log.info("Deleting unused Elements");
      sql =
          "DELETE	AD_ELEMENT_TRL"
              + " 	WHERE	AD_Element_ID IN"
              + " 	(SELECT AD_Element_ID FROM AD_ELEMENT e "
              + " 	WHERE NOT EXISTS"
              + " 	(SELECT 1 FROM AD_COLUMN c WHERE UPPER(e.ColumnName)=UPPER(c.ColumnName))"
              + " 	AND NOT EXISTS"
              + " 	(SELECT 1 FROM AD_PROCESS_PARA p WHERE UPPER(e.ColumnName)=UPPER(p.ColumnName)))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows deleted: " + no);
      trx.commit(true);

      sql =
          "DELETE	AD_ELEMENT e"
              + " 	WHERE AD_Element_ID >= 1000000 AND NOT EXISTS"
              + " 	(SELECT 1 FROM AD_COLUMN c WHERE UPPER(e.ColumnName)=UPPER(c.ColumnName))"
              + " 	AND NOT EXISTS"
              + " 	(SELECT 1 FROM AD_PROCESS_PARA p WHERE UPPER(e.ColumnName)=UPPER(p.ColumnName))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows deleted: " + no);
      trx.commit(true);

      //	Columns
      log.info("Synchronize Column");
      sql =
          " 	UPDATE AD_COLUMN c"
              + " 		SET	(ColumnName, Name, Description, Help) ="
              + " 	           (SELECT ColumnName, Name, Description, Help"
              + " 	            FROM AD_ELEMENT e WHERE c.AD_Element_ID=e.AD_Element_ID),"
              + " 			Updated = SYSDATE"
              + " 	WHERE EXISTS (SELECT 1 FROM AD_ELEMENT e "
              + " 				WHERE c.AD_Element_ID=e.AD_Element_ID"
              + " 				  AND (c.ColumnName <> e.ColumnName OR c.Name <> e.Name "
              + " 					OR NVL(c.Description,' ') <> NVL(e.Description,' ') OR NVL(c.Help,' ') <> NVL(e.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Fields should now be synchronized
      log.info("Synchronize Field");
      sql =
          " 	UPDATE AD_FIELD f"
              + " 		SET (Name, Description, Help) = "
              + " 	            (SELECT e.Name, e.Description, e.Help"
              + " 	            FROM AD_ELEMENT e, AD_COLUMN c"
              + " 	    	    WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),"
              + " 			Updated = SYSDATE"
              + " 	WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'"
              + " 	 AND EXISTS (SELECT 1 FROM AD_ELEMENT e, AD_COLUMN c"
              + " 				WHERE f.AD_Column_ID=c.AD_Column_ID"
              + " 				  AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL"
              + " 				  AND (f.Name <> e.Name OR NVL(f.Description,' ') <> NVL(e.Description,' ') OR NVL(f.Help,' ') <> NVL(e.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Field Translations
      log.info("Synchronize Field Translations");
      sql =
          "UPDATE AD_FIELD_TRL trl"
              + " SET Name = (SELECT e.Name FROM AD_ELEMENT_TRL e, AD_COLUMN c, AD_FIELD f"
              + "			WHERE e.AD_LANGUAGE=trl.AD_LANGUAGE AND e.AD_Element_ID=c.AD_Element_ID "
              + "			  AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),"
              + "	Description = (SELECT e.Description FROM AD_ELEMENT_TRL e, AD_COLUMN c, AD_FIELD f"
              + "			WHERE e.AD_LANGUAGE=trl.AD_LANGUAGE AND e.AD_Element_ID=c.AD_Element_ID "
              + "			  AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),"
              + "	Help = (SELECT e.Help FROM AD_ELEMENT_TRL e, AD_COLUMN c, AD_FIELD f"
              + "			WHERE e.AD_LANGUAGE=trl.AD_LANGUAGE AND e.AD_Element_ID=c.AD_Element_ID "
              + "			  AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),"
              + "	IsTranslated = (SELECT e.IsTranslated FROM AD_ELEMENT_TRL e, AD_COLUMN c, AD_FIELD f"
              + "			WHERE e.AD_LANGUAGE=trl.AD_LANGUAGE AND e.AD_Element_ID=c.AD_Element_ID "
              + "			  AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),"
              + "	Updated = SYSDATE"
              + " WHERE EXISTS (SELECT 1 FROM AD_FIELD f, AD_ELEMENT_TRL e, AD_COLUMN c"
              + "		WHERE trl.AD_Field_ID=f.AD_Field_ID"
              + "		  AND f.AD_Column_ID=c.AD_Column_ID"
              + "		  AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL"
              + "		  AND trl.AD_LANGUAGE=e.AD_LANGUAGE"
              + "		  AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'"
              + "		  AND (trl.Name <> e.Name OR NVL(trl.Description,' ') <> NVL(e.Description,' ') OR NVL(trl.Help,' ') <> NVL(e.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Fields should now be synchronized
      log.info("Synchronize PO Field");
      sql =
          "UPDATE AD_FIELD f"
              + " SET Name = (SELECT e.PO_Name FROM AD_ELEMENT e, AD_COLUMN c"
              + " 			WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),"
              + " 	Description = (SELECT e.PO_Description FROM AD_ELEMENT e, AD_COLUMN c"
              + " 			WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),"
              + " 	Help = (SELECT e.PO_Help FROM AD_ELEMENT e, AD_COLUMN c"
              + " 			WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),"
              + " 	Updated = SYSDATE"
              + " WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'"
              + " AND EXISTS (SELECT 1 FROM AD_ELEMENT e, AD_COLUMN c"
              + " 		WHERE f.AD_Column_ID=c.AD_Column_ID"
              + " 		  AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL"
              + " 		  AND (f.Name <> e.PO_Name OR NVL(f.Description,' ') <> NVL(e.PO_Description,' ') OR NVL(f.Help,' ') <> NVL(e.PO_Help,' '))"
              + " 		  AND e.PO_Name IS NOT NULL)"
              + " AND EXISTS (SELECT 1 FROM AD_TAB t, AD_WINDOW w"
              + " 		WHERE f.AD_Tab_ID=t.AD_Tab_ID"
              + " 		  AND t.AD_Window_ID=w.AD_Window_ID"
              + " 		  AND w.IsSOTrx='N')";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Field Translations
      log.info("Synchronize PO Field Translations");
      sql =
          " UPDATE AD_FIELD_TRL trl"
              + " SET Name = (SELECT e.PO_Name FROM AD_ELEMENT_TRL e, AD_COLUMN c, AD_FIELD f"
              + " 		WHERE e.AD_LANGUAGE=trl.AD_LANGUAGE AND e.AD_Element_ID=c.AD_Element_ID"
              + " 		  AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),"
              + " Description = (SELECT e.PO_Description FROM AD_ELEMENT_TRL e, AD_COLUMN c, AD_FIELD f"
              + " 		WHERE e.AD_LANGUAGE=trl.AD_LANGUAGE AND e.AD_Element_ID=c.AD_Element_ID "
              + " 		  AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),"
              + " Help = (SELECT e.PO_Help FROM AD_ELEMENT_TRL e, AD_COLUMN c, AD_FIELD f"
              + " 		WHERE e.AD_LANGUAGE=trl.AD_LANGUAGE AND e.AD_Element_ID=c.AD_Element_ID"
              + " 		  AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),"
              + " IsTranslated = (SELECT e.IsTranslated FROM AD_ELEMENT_TRL e, AD_COLUMN c, AD_FIELD f"
              + " 		WHERE e.AD_LANGUAGE=trl.AD_LANGUAGE AND e.AD_Element_ID=c.AD_Element_ID "
              + " 		  AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),"
              + " Updated = SYSDATE"
              + " WHERE EXISTS (SELECT 1 FROM AD_FIELD f, AD_ELEMENT_TRL e, AD_COLUMN c"
              + " 	WHERE trl.AD_Field_ID=f.AD_Field_ID"
              + " 	  AND f.AD_Column_ID=c.AD_Column_ID"
              + " 	  AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL"
              + " 	  AND trl.AD_LANGUAGE=e.AD_LANGUAGE"
              + " 	  AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'"
              + " 	  AND (trl.Name <> e.PO_Name OR NVL(trl.Description,' ') <> NVL(e.PO_Description,' ') OR NVL(trl.Help,' ') <> NVL(e.PO_Help,' '))"
              + " 	  AND e.PO_Name IS NOT NULL)"
              + " AND EXISTS (SELECT 1 FROM AD_FIELD f, AD_TAB t, AD_WINDOW w"
              + " 	WHERE trl.AD_Field_ID=f.AD_Field_ID"
              + " 	  AND f.AD_Tab_ID=t.AD_Tab_ID"
              + " 	  AND t.AD_Window_ID=w.AD_Window_ID"
              + " 	  AND w.IsSOTrx='N')";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Fields from Process
      log.info("Synchronize Field from Process");
      sql =
          "UPDATE AD_FIELD f"
              + " SET Name = (SELECT p.Name FROM AD_PROCESS p, AD_COLUMN c WHERE p.AD_Process_ID=c.AD_Process_ID"
              + " 			AND c.AD_Column_ID=f.AD_Column_ID),"
              + " 	Description = (SELECT p.Description FROM AD_PROCESS p, AD_COLUMN c WHERE p.AD_Process_ID=c.AD_Process_ID"
              + " 			AND c.AD_Column_ID=f.AD_Column_ID),"
              + " 	Help = (SELECT p.Help FROM AD_PROCESS p, AD_COLUMN c WHERE p.AD_Process_ID=c.AD_Process_ID"
              + " 			AND c.AD_Column_ID=f.AD_Column_ID),"
              + " 	Updated = SYSDATE"
              + " WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'"
              + " AND EXISTS (SELECT 1 FROM AD_PROCESS p, AD_COLUMN c"
              + " 		WHERE c.AD_Process_ID=p.AD_Process_ID AND f.AD_Column_ID=c.AD_Column_ID"
              + " 		AND (f.Name<>p.Name OR NVL(f.Description,' ')<>NVL(p.Description,' ') OR NVL(f.Help,' ')<>NVL(p.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Field Translations from Process
      log.info("Synchronize Field Trl from Process Trl");
      sql =
          "UPDATE AD_FIELD_TRL trl"
              + " SET Name = (SELECT p.Name FROM AD_PROCESS_TRL p, AD_COLUMN c, AD_FIELD f"
              + " 			WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID"
              + " 			AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_LANGUAGE=trl.AD_LANGUAGE),"
              + " 	Description = (SELECT p.Description FROM AD_PROCESS_TRL p, AD_COLUMN c, AD_FIELD f"
              + " 			WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID"
              + " 			AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_LANGUAGE=trl.AD_LANGUAGE),"
              + " 	Help = (SELECT p.Help FROM AD_PROCESS_TRL p, AD_COLUMN c, AD_FIELD f "
              + " 			WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID"
              + " 			AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_LANGUAGE=trl.AD_LANGUAGE),"
              + " 	IsTranslated = (SELECT p.IsTranslated FROM AD_PROCESS_TRL p, AD_COLUMN c, AD_FIELD f"
              + " 			WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID"
              + " 			AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_LANGUAGE=trl.AD_LANGUAGE),"
              + " 	Updated = SYSDATE"
              + " WHERE EXISTS (SELECT 1 FROM AD_PROCESS_TRL p, AD_COLUMN c, AD_FIELD f"
              + " 		WHERE c.AD_Process_ID=p.AD_Process_ID AND f.AD_Column_ID=c.AD_Column_ID"
              + " 		AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_LANGUAGE=trl.AD_LANGUAGE"
              + " 		AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'"
              + " 		AND (trl.Name<>p.Name OR NVL(trl.Description,' ')<>NVL(p.Description,' ') OR NVL(trl.Help,' ')<>NVL(p.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Sync Parameter ColumnName
      sql =
          "UPDATE	AD_PROCESS_PARA f"
              + " SET	ColumnName = (SELECT e.ColumnName FROM AD_ELEMENT e"
              + " 			WHERE UPPER(e.ColumnName)=UPPER(f.ColumnName))"
              // +" 			WHERE e.ColumnName=f.ColumnName)"
              + " WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'"
              + " AND EXISTS (SELECT 1 FROM AD_ELEMENT e"
              + " WHERE UPPER(e.ColumnName)=UPPER(f.ColumnName)"
              + " AND e.ColumnName<>f.ColumnName)";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Parameter Fields
      sql =
          "UPDATE	AD_PROCESS_PARA p"
              + " SET	IsCentrallyMaintained = 'N'"
              + " WHERE	IsCentrallyMaintained <> 'N'"
              + " AND NOT EXISTS (SELECT 1 FROM AD_ELEMENT e WHERE p.ColumnName=e.ColumnName)";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Parameter Fields
      log.info("Synchronize Process Parameter");
      sql =
          "UPDATE AD_PROCESS_PARA f"
              + " SET Name = (SELECT e.Name FROM AD_ELEMENT e"
              + " 			WHERE e.ColumnName=f.ColumnName),"
              + " 	Description = (SELECT e.Description FROM AD_ELEMENT e"
              + " 			WHERE e.ColumnName=f.ColumnName),"
              + " 	Help = (SELECT e.Help FROM AD_ELEMENT e"
              + " 			WHERE e.ColumnName=f.ColumnName),"
              + " 	Updated = SYSDATE"
              + " WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'"
              + " AND EXISTS (SELECT 1 FROM AD_ELEMENT e"
              + " 		WHERE e.ColumnName=f.ColumnName"
              + " 		  AND (f.Name <> e.Name OR NVL(f.Description,' ') <> NVL(e.Description,' ') OR NVL(f.Help,' ') <> NVL(e.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Parameter Translations
      log.info("Synchronize Process Parameter Trl");
      sql =
          "UPDATE AD_PROCESS_PARA_TRL trl"
              + " SET Name = (SELECT et.Name FROM AD_ELEMENT_TRL et, AD_ELEMENT e, AD_PROCESS_PARA f"
              + " 			WHERE et.AD_LANGUAGE=trl.AD_LANGUAGE AND et.AD_Element_ID=e.AD_Element_ID"
              + " 			  AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),"
              + " 	Description = (SELECT et.Description FROM AD_ELEMENT_TRL et, AD_ELEMENT e, AD_PROCESS_PARA f"
              + " 			WHERE et.AD_LANGUAGE=trl.AD_LANGUAGE AND et.AD_Element_ID=e.AD_Element_ID"
              + " 			  AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),"
              + " 	Help = (SELECT et.Help FROM AD_ELEMENT_TRL et, AD_ELEMENT e, AD_PROCESS_PARA f"
              + " 			WHERE et.AD_LANGUAGE=trl.AD_LANGUAGE AND et.AD_Element_ID=e.AD_Element_ID"
              + " 			  AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),"
              + " 	IsTranslated = (SELECT et.IsTranslated FROM AD_ELEMENT_TRL et, AD_ELEMENT e, AD_PROCESS_PARA f"
              + " 			WHERE et.AD_LANGUAGE=trl.AD_LANGUAGE AND et.AD_Element_ID=e.AD_Element_ID"
              + " 			  AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),"
              + " 	Updated = SYSDATE"
              + " WHERE EXISTS (SELECT 1 FROM AD_ELEMENT_TRL et, AD_ELEMENT e, AD_PROCESS_PARA f"
              + " 			WHERE et.AD_LANGUAGE=trl.AD_LANGUAGE AND et.AD_Element_ID=e.AD_Element_ID"
              + " 			  AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID"
              + " 			  AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'"
              + " 			  AND (trl.Name <> et.Name OR NVL(trl.Description,' ') <> NVL(et.Description,' ') OR NVL(trl.Help,' ') <> NVL(et.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Workflow Node - Window
      log.info("Synchronize Workflow Node from Window");
      sql =
          "UPDATE AD_WF_NODE n"
              + " SET Name = (SELECT w.Name FROM AD_WINDOW w"
              + " 			WHERE w.AD_Window_ID=n.AD_Window_ID),"
              + " 	Description = (SELECT w.Description FROM AD_WINDOW w"
              + " 			WHERE w.AD_Window_ID=n.AD_Window_ID),"
              + " 	Help = (SELECT w.Help FROM AD_WINDOW w"
              + " 			WHERE w.AD_Window_ID=n.AD_Window_ID)"
              + " WHERE n.IsCentrallyMaintained = 'Y'"
              + "  AND EXISTS  (SELECT 1 FROM AD_WINDOW w"
              + " 		WHERE w.AD_Window_ID=n.AD_Window_ID"
              + " 		  AND (w.Name <> n.Name OR NVL(w.Description,' ') <> NVL(n.Description,' ') OR NVL(w.Help,' ') <> NVL(n.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Workflow Translations - Window
      log.info("Synchronize Workflow Node Trl from Window Trl");
      sql =
          "UPDATE AD_WF_NODE_TRL trl"
              + " SET Name = (SELECT t.Name FROM AD_WINDOW_TRL t, AD_WF_NODE n"
              + " 			WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID"
              + " 			  AND trl.AD_LANGUAGE=t.AD_LANGUAGE),"
              + " 	Description = (SELECT t.Description FROM AD_WINDOW_TRL t, AD_WF_NODE n"
              + " 			WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID"
              + " 			  AND trl.AD_LANGUAGE=t.AD_LANGUAGE),"
              + " 	Help = (SELECT t.Help FROM AD_WINDOW_TRL t, AD_WF_NODE n"
              + " 			WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID"
              + " 			  AND trl.AD_LANGUAGE=t.AD_LANGUAGE)"
              + " WHERE EXISTS (SELECT 1 FROM AD_WINDOW_TRL t, AD_WF_NODE n"
              + " 		WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID"
              + " 		  AND trl.AD_LANGUAGE=t.AD_LANGUAGE AND n.IsCentrallyMaintained='Y' AND n.IsActive='Y'"
              + " 		  AND (trl.Name <> t.Name OR NVL(trl.Description,' ') <> NVL(t.Description,' ') OR NVL(trl.Help,' ') <> NVL(t.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Workflow Node - Form
      log.info("Synchronize Workflow Node from Form");
      sql =
          "UPDATE AD_WF_NODE n"
              + " SET (Name, Description, Help) = (SELECT f.Name, f.Description, f.Help"
              + " 		FROM AD_FORM f"
              + " 		WHERE f.AD_Form_ID=n.AD_Form_ID)"
              + " WHERE n.IsCentrallyMaintained = 'Y'"
              + " AND EXISTS  (SELECT 1 FROM AD_FORM f"
              + " 		WHERE f.AD_Form_ID=n.AD_Form_ID"
              + " 		  AND (f.Name <> n.Name OR NVL(f.Description,' ') <> NVL(n.Description,' ') OR NVL(f.Help,' ') <> NVL(n.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Workflow Translations - Form
      log.info("Synchronize Workflow Node Trl from Form Trl");
      sql =
          " UPDATE AD_WF_NODE_TRL trl"
              + " SET (Name, Description, Help) = (SELECT t.Name, t.Description, t.Help"
              + " 	FROM AD_FORM_TRL t, AD_WF_NODE n"
              + " 	WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Form_ID=t.AD_Form_ID"
              + " 	  AND trl.AD_LANGUAGE=t.AD_LANGUAGE)"
              + " WHERE EXISTS (SELECT 1 FROM AD_FORM_TRL t, AD_WF_NODE n"
              + " 		WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Form_ID=t.AD_Form_ID"
              + " 		  AND trl.AD_LANGUAGE=t.AD_LANGUAGE AND n.IsCentrallyMaintained='Y' AND n.IsActive='Y'"
              + " 		  AND (trl.Name <> t.Name OR NVL(trl.Description,' ') <> NVL(t.Description,' ') OR NVL(trl.Help,' ') <> NVL(t.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Workflow Node - Report
      log.info("Synchronize Workflow Node from Process");
      sql =
          "UPDATE AD_WF_NODE n"
              + " SET (Name, Description, Help) = (SELECT f.Name, f.Description, f.Help"
              + " 		FROM AD_PROCESS f"
              + " 		WHERE f.AD_Process_ID=n.AD_Process_ID)"
              + " WHERE n.IsCentrallyMaintained = 'Y'"
              + " AND EXISTS  (SELECT 1 FROM AD_PROCESS f"
              + " 		WHERE f.AD_Process_ID=n.AD_Process_ID"
              + " 		  AND (f.Name <> n.Name OR NVL(f.Description,' ') <> NVL(n.Description,' ') OR NVL(f.Help,' ') <> NVL(n.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Workflow Translations - Form
      log.info("Synchronize Workflow Node Trl from Process Trl");
      sql =
          "UPDATE AD_WF_NODE_TRL trl"
              + " SET (Name, Description, Help) = (SELECT t.Name, t.Description, t.Help"
              + " FROM AD_PROCESS_TRL t, AD_WF_NODE n"
              + " WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Process_ID=t.AD_Process_ID"
              + "  AND trl.AD_LANGUAGE=t.AD_LANGUAGE)"
              + " WHERE EXISTS (SELECT 1 FROM AD_PROCESS_TRL t, AD_WF_NODE n"
              + " WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Process_ID=t.AD_Process_ID"
              + "  AND trl.AD_LANGUAGE=t.AD_LANGUAGE AND n.IsCentrallyMaintained='Y' AND n.IsActive='Y'"
              + "  AND (trl.Name <> t.Name OR NVL(trl.Description,' ') <> NVL(t.Description,' ') OR NVL(trl.Help,' ') <> NVL(t.Help,' ')))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //  Need centrally maintained flag here!
      log.info("Synchronize PrintFormatItem Name from Element");
      sql =
          "UPDATE AD_PRINTFORMATITEM pfi"
              + " SET Name = (SELECT e.Name "
              + " FROM AD_ELEMENT e, AD_COLUMN c"
              + " WHERE e.AD_Element_ID=c.AD_Element_ID"
              + " AND c.AD_Column_ID=pfi.AD_Column_ID)"
              + " WHERE pfi.IsCentrallyMaintained='Y'"
              + " AND EXISTS (SELECT 1 "
              + " FROM AD_ELEMENT e, AD_COLUMN c"
              + " WHERE e.AD_Element_ID=c.AD_Element_ID"
              + " AND c.AD_Column_ID=pfi.AD_Column_ID"
              + " AND e.Name<>pfi.Name)"
              + " AND EXISTS (SELECT 1 FROM AD_CLIENT"
              + " WHERE AD_Client_ID=pfi.AD_Client_ID AND IsMultiLingualDocument='Y')";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      log.info("Synchronize PrintFormatItem PrintName from Element");
      sql =
          "UPDATE AD_PRINTFORMATITEM pfi"
              + " SET PrintName = (SELECT e.PrintName "
              + " FROM AD_ELEMENT e, AD_COLUMN c"
              + " WHERE e.AD_Element_ID=c.AD_Element_ID"
              + " AND c.AD_Column_ID=pfi.AD_Column_ID)"
              + " WHERE pfi.IsCentrallyMaintained='Y'"
              + " AND EXISTS (SELECT 1 "
              + " FROM AD_ELEMENT e, AD_COLUMN c, AD_PRINTFORMAT pf"
              + " WHERE e.AD_Element_ID=c.AD_Element_ID"
              + " AND c.AD_Column_ID=pfi.AD_Column_ID"
              + " AND LENGTH(pfi.PrintName) > 0"
              + " AND e.PrintName<>pfi.PrintName"
              + " AND pf.AD_PrintFormat_ID=pfi.AD_PrintFormat_ID"
              + " AND pf.IsForm='N' AND IsTableBased='Y')"
              + " AND EXISTS (SELECT 1 FROM AD_CLIENT "
              + " WHERE AD_Client_ID=pfi.AD_Client_ID AND IsMultiLingualDocument='Y')";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      log.info("Synchronize PrintFormatItem Trl from Element Trl (Multi-Lingual)");
      sql =
          "UPDATE AD_PRINTFORMATITEM_TRL trl"
              + " SET PrintName = (SELECT e.PrintName"
              + " FROM AD_ELEMENT_TRL e, AD_COLUMN c, AD_PRINTFORMATITEM pfi"
              + " WHERE e.AD_LANGUAGE=trl.AD_LANGUAGE"
              + " AND e.AD_Element_ID=c.AD_Element_ID"
              + " AND c.AD_Column_ID=pfi.AD_Column_ID"
              + " AND pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID)"
              + " WHERE EXISTS (SELECT 1 "
              + " FROM AD_ELEMENT_TRL e, AD_COLUMN c, AD_PRINTFORMATITEM pfi, AD_PRINTFORMAT pf"
              + " WHERE e.AD_LANGUAGE=trl.AD_LANGUAGE"
              + " AND e.AD_Element_ID=c.AD_Element_ID"
              + " AND c.AD_Column_ID=pfi.AD_Column_ID"
              + " AND pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID"
              + " AND pfi.IsCentrallyMaintained='Y'"
              + " AND LENGTH(pfi.PrintName) > 0"
              + " AND (e.PrintName<>trl.PrintName OR trl.PrintName IS NULL)"
              + " AND pf.AD_PrintFormat_ID=pfi.AD_PrintFormat_ID "
              + " AND pf.IsForm='N' AND IsTableBased='Y')"
              + " AND EXISTS (SELECT 1 FROM AD_CLIENT "
              + " WHERE AD_Client_ID=trl.AD_Client_ID AND IsMultiLingualDocument='Y')";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      log.info("Synchronize PrintFormatItem Trl (Not Multi-Lingual)");
      sql =
          "UPDATE AD_PRINTFORMATITEM_TRL trl"
              + " SET PrintName = (SELECT pfi.PrintName"
              + " FROM AD_PRINTFORMATITEM pfi"
              + " WHERE pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID)"
              + " WHERE EXISTS (SELECT 1 "
              + " FROM AD_PRINTFORMATITEM pfi, AD_PRINTFORMAT pf"
              + " WHERE pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID"
              + " AND pfi.IsCentrallyMaintained='Y'"
              + " AND LENGTH(pfi.PrintName) > 0"
              + " AND pfi.PrintName<>trl.PrintName"
              + " AND pf.AD_PrintFormat_ID=pfi.AD_PrintFormat_ID "
              + " AND pf.IsForm='N' AND pf.IsTableBased='Y')"
              + " AND EXISTS (SELECT 1 FROM AD_CLIENT "
              + " WHERE AD_Client_ID=trl.AD_Client_ID AND IsMultiLingualDocument='N')";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      log.info("Reset PrintFormatItem Trl where not used in base table");
      sql =
          "UPDATE AD_PRINTFORMATITEM_TRL trl"
              + " SET PrintName = NULL"
              + " WHERE PrintName IS NOT NULL"
              + " AND EXISTS (SELECT 1"
              + " FROM AD_PRINTFORMATITEM pfi"
              + " WHERE pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID"
              + " AND pfi.IsCentrallyMaintained='Y'"
              + " AND (LENGTH (pfi.PrintName) = 0 OR pfi.PrintName IS NULL))";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      /**
       * SELECT e.PrintName "Element", pfi.PrintName "FormatItem", trl.AD_Language, trl.PrintName
       * "Trl" FROM AD_Element e INNER JOIN AD_Column c ON (e.AD_Element_ID=c.AD_Element_ID) INNER
       * JOIN AD_PrintFormatItem pfi ON (c.AD_Column_ID=pfi.AD_Column_ID) INNER JOIN
       * AD_PrintFormatItem_Trl trl ON (pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID) WHERE
       * pfi.AD_PrintFormatItem_ID=?
       */

      //	Sync Names - Window
      log.info("Synchronizing Menu with Window");
      sql =
          "UPDATE	AD_MENU m"
              + " SET		Name = (SELECT Name FROM AD_WINDOW w WHERE m.AD_Window_ID=w.AD_Window_ID),"
              + " Description = (SELECT Description FROM AD_WINDOW w WHERE m.AD_Window_ID=w.AD_Window_ID)"
              + " WHERE	m.AD_Window_ID IS NOT NULL"
              + "  AND m.Action = 'W'"
              + "  AND m.IsCentrallyMaintained='Y' AND m.IsActive='Y'";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      sql =
          "UPDATE	AD_MENU_TRL mt"
              + " SET		Name = (SELECT wt.Name FROM AD_WINDOW_TRL wt, AD_MENU m "
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID "
              + " AND mt.AD_LANGUAGE=wt.AD_LANGUAGE),"
              + " Description = (SELECT wt.Description FROM AD_WINDOW_TRL wt, AD_MENU m "
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID "
              + " AND mt.AD_LANGUAGE=wt.AD_LANGUAGE),"
              + " IsTranslated = (SELECT wt.IsTranslated FROM AD_WINDOW_TRL wt, AD_MENU m "
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID "
              + " AND mt.AD_LANGUAGE=wt.AD_LANGUAGE)"
              + " WHERE EXISTS (SELECT 1 FROM AD_WINDOW_TRL wt, AD_MENU m "
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID "
              + " AND mt.AD_LANGUAGE=wt.AD_LANGUAGE"
              + " AND m.AD_Window_ID IS NOT NULL"
              + " AND m.Action = 'W'"
              + " AND m.IsCentrallyMaintained='Y' AND m.IsActive='Y'"
              + ")";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      // Sync Names - Process
      log.info("Synchronizing Menu with Processes");
      sql =
          "UPDATE	AD_MENU m"
              + " SET		Name = (SELECT p.Name FROM AD_PROCESS p WHERE m.AD_Process_ID=p.AD_Process_ID),"
              + " Description = (SELECT p.Description FROM AD_PROCESS p WHERE m.AD_Process_ID=p.AD_Process_ID)"
              + " WHERE m.AD_Process_ID IS NOT NULL"
              + " AND m.Action IN ('R', 'P')"
              + " AND m.IsCentrallyMaintained='Y' AND m.IsActive='Y'";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      sql =
          "UPDATE	AD_MENU_TRL mt"
              + " SET		Name = (SELECT pt.Name FROM AD_PROCESS_TRL pt, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID"
              + " AND mt.AD_LANGUAGE=pt.AD_LANGUAGE),"
              + " Description = (SELECT pt.Description FROM AD_PROCESS_TRL pt, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID"
              + " AND mt.AD_LANGUAGE=pt.AD_LANGUAGE),"
              + " IsTranslated = (SELECT pt.IsTranslated FROM AD_PROCESS_TRL pt, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID"
              + " AND mt.AD_LANGUAGE=pt.AD_LANGUAGE)"
              + " WHERE EXISTS (SELECT 1 FROM AD_PROCESS_TRL pt, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID"
              + " AND mt.AD_LANGUAGE=pt.AD_LANGUAGE"
              + " AND m.AD_Process_ID IS NOT NULL"
              + " AND m.Action IN ('R', 'P')"
              + " AND m.IsCentrallyMaintained='Y' AND m.IsActive='Y'"
              + ")";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Sync Names = Form
      log.info("Synchronizing Menu with Forms");
      sql =
          "UPDATE	AD_MENU m"
              + " SET		Name = (SELECT Name FROM AD_FORM f WHERE m.AD_Form_ID=f.AD_Form_ID),"
              + " Description = (SELECT Description FROM AD_FORM f WHERE m.AD_Form_ID=f.AD_Form_ID)"
              + " WHERE m.AD_Form_ID IS NOT NULL"
              + " AND m.Action = 'X'"
              + " AND m.IsCentrallyMaintained='Y' AND m.IsActive='Y'";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      sql =
          "UPDATE	AD_MENU_TRL mt"
              + " SET		Name = (SELECT ft.Name FROM AD_FORM_TRL ft, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID"
              + " AND mt.AD_LANGUAGE=ft.AD_LANGUAGE),"
              + " Description = (SELECT ft.Description FROM AD_FORM_TRL ft, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID"
              + " AND mt.AD_LANGUAGE=ft.AD_LANGUAGE),"
              + " IsTranslated = (SELECT ft.IsTranslated FROM AD_FORM_TRL ft, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID"
              + " AND mt.AD_LANGUAGE=ft.AD_LANGUAGE)"
              + " WHERE EXISTS (SELECT 1 FROM AD_FORM_TRL ft, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID"
              + " AND mt.AD_LANGUAGE=ft.AD_LANGUAGE"
              + " AND m.AD_Form_ID IS NOT NULL"
              + " AND m.Action = 'X'"
              + " AND m.IsCentrallyMaintained='Y' AND m.IsActive='Y'"
              + ")";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Sync Names - Workflow
      log.info("Synchronizing Menu with Workflows");
      sql =
          "UPDATE	AD_MENU m"
              + " SET		Name = (SELECT p.Name FROM AD_WORKFLOW p WHERE m.AD_Workflow_ID=p.AD_Workflow_ID),"
              + " Description = (SELECT p.Description FROM AD_WORKFLOW p WHERE m.AD_Workflow_ID=p.AD_Workflow_ID)"
              + " WHERE m.AD_Workflow_ID IS NOT NULL"
              + " AND m.Action = 'F'"
              + " AND m.IsCentrallyMaintained='Y' AND m.IsActive='Y'";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      sql =
          "UPDATE	AD_MENU_TRL mt"
              + " SET		Name = (SELECT pt.Name FROM AD_WORKFLOW_TRL pt, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID"
              + " AND mt.AD_LANGUAGE=pt.AD_LANGUAGE),"
              + " Description = (SELECT pt.Description FROM AD_WORKFLOW_TRL pt, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID"
              + " AND mt.AD_LANGUAGE=pt.AD_LANGUAGE),"
              + " IsTranslated = (SELECT pt.IsTranslated FROM AD_WORKFLOW_TRL pt, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID"
              + " AND mt.AD_LANGUAGE=pt.AD_LANGUAGE)"
              + " WHERE EXISTS (SELECT 1 FROM AD_WORKFLOW_TRL pt, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID"
              + " AND mt.AD_LANGUAGE=pt.AD_LANGUAGE"
              + " AND m.AD_Workflow_ID IS NOT NULL"
              + " AND m.Action = 'F'"
              + " AND m.IsCentrallyMaintained='Y' AND m.IsActive='Y'"
              + ")";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //	Sync Names = Task
      log.info("Synchronizing Menu with Tasks");
      sql =
          "UPDATE	AD_MENU m"
              + " SET		Name = (SELECT Name FROM AD_TASK f WHERE m.AD_Task_ID=f.AD_Task_ID),"
              + " Description = (SELECT Description FROM AD_TASK f WHERE m.AD_Task_ID=f.AD_Task_ID)"
              + " WHERE m.AD_Task_ID IS NOT NULL"
              + " AND m.Action = 'T'"
              + " AND m.IsCentrallyMaintained='Y' AND m.IsActive='Y'";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      sql =
          "UPDATE	AD_MENU_TRL mt"
              + " SET		Name = (SELECT ft.Name FROM AD_TASK_TRL ft, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID"
              + " AND mt.AD_LANGUAGE=ft.AD_LANGUAGE),"
              + " Description = (SELECT ft.Description FROM AD_TASK_TRL ft, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID"
              + " AND mt.AD_LANGUAGE=ft.AD_LANGUAGE),"
              + " IsTranslated = (SELECT ft.IsTranslated FROM AD_TASK_TRL ft, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID"
              + " AND mt.AD_LANGUAGE=ft.AD_LANGUAGE)"
              + " WHERE EXISTS (SELECT 1 FROM AD_TASK_TRL ft, AD_MENU m"
              + " WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID"
              + " AND mt.AD_LANGUAGE=ft.AD_LANGUAGE"
              + " AND m.AD_Task_ID IS NOT NULL"
              + " AND m.Action = 'T'"
              + " AND m.IsCentrallyMaintained='Y' AND m.IsActive='Y'"
              + ")";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //  Column Name + Element
      log.info("Synchronizing Column with Element");
      sql =
          "UPDATE AD_COLUMN c"
              + " SET (Name,Description,Help) ="
              + " (SELECT e.Name,e.Description,e.Help "
              + " FROM AD_ELEMENT e WHERE c.AD_Element_ID=e.AD_Element_ID)"
              + " WHERE EXISTS "
              + " (SELECT 1 FROM AD_ELEMENT e "
              + " WHERE c.AD_Element_ID=e.AD_Element_ID"
              + " AND c.Name<>e.Name)";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      sql =
          "UPDATE AD_COLUMN_TRL ct"
              + " SET Name = (SELECT e.Name"
              + " FROM AD_COLUMN c INNER JOIN AD_ELEMENT_TRL e ON (c.AD_Element_ID=e.AD_Element_ID)"
              + " WHERE ct.AD_Column_ID=c.AD_Column_ID AND ct.AD_LANGUAGE=e.AD_LANGUAGE)"
              + " WHERE EXISTS "
              + " (SELECT 1 FROM AD_COLUMN c INNER JOIN AD_ELEMENT_TRL e ON (c.AD_Element_ID=e.AD_Element_ID)"
              + " WHERE ct.AD_Column_ID=c.AD_Column_ID AND ct.AD_LANGUAGE=e.AD_LANGUAGE"
              + " AND ct.Name<>e.Name)";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  rows updated: " + no);
      trx.commit(true);

      //  Table Name + Element
      log.info("Synchronizing Table with Element");
      sql =
          "UPDATE AD_TABLE t "
              + "SET (Name,Description) = (SELECT e.Name,e.Description FROM AD_ELEMENT e "
              + "WHERE t.TableName||'_ID'=e.ColumnName) "
              + "WHERE EXISTS (SELECT 1 FROM AD_ELEMENT e "
              + "WHERE t.TableName||'_ID'=e.ColumnName "
              + "AND t.Name<>e.Name)";
      no = DB.executeUpdate(sql, false, get_TrxName());
      trx.commit(true);

      log.info("  rows updated: " + no);
      sql =
          "UPDATE AD_TABLE_TRL tt"
              + " SET Name = (SELECT e.Name "
              + " FROM AD_TABLE t INNER JOIN AD_ELEMENT ex ON (t.TableName||'_ID'=ex.ColumnName)"
              + " INNER JOIN AD_ELEMENT_TRL e ON (ex.AD_Element_ID=e.AD_Element_ID)"
              + " WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_LANGUAGE=e.AD_LANGUAGE)"
              + " WHERE EXISTS (SELECT 1 "
              + " FROM AD_TABLE t INNER JOIN AD_ELEMENT ex ON (t.TableName||'_ID'=ex.ColumnName)"
              + " INNER JOIN AD_ELEMENT_TRL e ON (ex.AD_Element_ID=e.AD_Element_ID)"
              + " WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_LANGUAGE=e.AD_LANGUAGE"
              + " AND tt.Name<>e.Name)";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  trl rows updated: " + no);
      trx.commit(true);

      //  Trl Table Name + Element
      sql =
          "UPDATE AD_TABLE t"
              + " SET (Name,Description) = (SELECT e.Name||' Trl', e.Description "
              + " FROM AD_ELEMENT e "
              + " WHERE SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=e.ColumnName)"
              + " WHERE TableName LIKE '%_Trl'"
              + " AND EXISTS (SELECT 1 FROM AD_ELEMENT e "
              + " WHERE SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=e.ColumnName"
              + " AND t.Name<>e.Name)";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  trl rows updated: " + no);
      trx.commit(true);

      sql =
          " UPDATE AD_TABLE_TRL tt"
              + " SET Name = (SELECT e.Name || ' **'"
              + " FROM AD_TABLE t INNER JOIN AD_ELEMENT ex ON (SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=ex.ColumnName)"
              + " INNER JOIN AD_ELEMENT_TRL e ON (ex.AD_Element_ID=e.AD_Element_ID)"
              + " WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_LANGUAGE=e.AD_LANGUAGE)"
              + " WHERE EXISTS (SELECT 1 "
              + " FROM AD_TABLE t INNER JOIN AD_ELEMENT ex ON (SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=ex.ColumnName)"
              + " INNER JOIN AD_ELEMENT_TRL e ON (ex.AD_Element_ID=e.AD_Element_ID)"
              + " WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_LANGUAGE=e.AD_LANGUAGE"
              + " AND t.TableName LIKE '%_Trl'"
              + " AND tt.Name<>e.Name)";
      no = DB.executeUpdate(sql, false, get_TrxName());
      log.info("  trl rows updated: " + no);
      trx.commit(true);

    } catch (Exception e) {
      log.log(Level.SEVERE, "@Failed@: " + e.getLocalizedMessage(), e);
      throw e;
    }

    return "@OK@";
  }