Coluna link para Tab


#1

boa tarde,

Estava tentando um cadastro quando me deparei com a seguinte situação.
Tenho uma tela de cadastro com 2 Tabs linkadas.
A coluna chave da primeira tab chama-se Tabela_ID.
A coluna a ser linkada na segunda tab chama-se TabelaFilha_ID.

O problema concentra-se em ao tentar buscar o valor para montar o where na tab1 ele procura a coluna TabelaFilha_ID especificamente.

Vi 3 alternativas:

  1. colo mais uma coluna no dicionario do Adempiere para representar a colunas da tab1 a ser linkada
  2. faço um select na tabela da tab1 para encontrar o nome da coluna chave e pegar seu valor.
  3. implemento o where qualificado. (O problema é colocar todas as questões referentes a permissao estaticamente.).

A principio implementei a segunda alternativa:

Classe: GridTab
Metodo: public void query (boolean onlyCurrentRows, int onlyCurrentDays, int maxRows)…

Antes +-Linha 574:
				String value = Env.getContext(m_vo.ctx, m_vo.WindowNo, lc);
Depois:
				String value = Env.getContext(m_vo.ctx, m_vo.WindowNo, lc);
				if( value.equals("") ) {
					lc = getLinkColumnNameTo();
					value = Env.getContext(m_vo.ctx, m_vo.WindowNo, lc);
				}

Adicionei o seguint metodo:

	public String getLinkColumnNameTo() {
		StringBuilder sb = new StringBuilder();
		sb.append("SELECT "); 
		sb.append("col.columnname "); 
		sb.append("FROM ad_column col "); 
		sb.append("where ad_table_id = "); 
		sb.append("( "); 
		sb.append("   select "); 
		sb.append("   t1.ad_table_id "); 
		sb.append("   from ad_tab t1 "); 
		sb.append("   where t1.ad_tab_id= "); 
		sb.append("   ( "); 
		sb.append("      select "); 
		sb.append("      ad_tab_id "); 
		sb.append("      from ad_tab "); 
		sb.append("      where ad_window_id=? "); 
		sb.append("      and seqno < (select max(t3.seqno) from ad_tab t3 where t3.ad_tab_id=?) "); 
		sb.append("      and tablevel < "); 
		sb.append("      ( "); 
		sb.append("         select "); 
		sb.append("         max(t3.tablevel) "); 
		sb.append("         from ad_tab t3 "); 
		sb.append("         where t3.ad_tab_id=? "); 
		sb.append("      ) "); 
		sb.append("   ) "); 
		sb.append(") "); 
		sb.append("and col.iskey='Y' ");
		
		String columnLinked = null;
		
		try
		{
			PreparedStatement pstmt = DB.prepareStatement(sb.toString(), null);
			pstmt.setInt(1, m_vo.AD_Window_ID);
			pstmt.setInt(2, m_vo.AD_Tab_ID);
			pstmt.setInt(3, m_vo.AD_Tab_ID);
			ResultSet rs = pstmt.executeQuery();
			if (rs.next())
				columnLinked = rs.getString(1);
			rs.close();
			pstmt.close();
		}
		catch (SQLException e)
		{
			log.log(Level.SEVERE, "Problema ao recuperar a column link da tab", e);
		}		
		return columnLinked;
	}

O que vcs acham? Tem algum outra forma de linkar a tab sem reescrever todo o where?


#2

Obs.: Essa implementação ocasionou efeito colateral em algumas verificações e resolvi abortar revertendo a classe a versão do repositório.
No fim acabei colocando a coluna da tabela filho igual a da tabela pai.