Faltando lógica

1 resposta
aix

Bom dia amigos do Guj,

o meu problema é assim:  tenho uma String que é um sql, como nesse SQL tenho alguns JOIN, nessa String preciso concatenar alguns "R." que indicam campos SQL para eu poder informar de que tabela vem esses campos, ou parâmetros de uma função SQL,  o meu problema é que alguns nomes de campos fazem parte do nome da função fazendo adicionar "R." aonde não deve, abaixo tem uma classe de teste, agradeço a quem ajudar.

hoje esta saindo assim:
//o R. neste trecho de código não deve aparecer “AS [Descrição do R.CFOP]”

MEU_Data_Base.dbo.[ARQUIVO_Busca_GLOBAIS_CFOP] (R.CFOP,MEU_Data_Base.dbo.AnoMesToDate (R.Ano,R.Mes)) AS [Descrição do R.CFOP]

devera ser assim:

MEU_Data_Base.dbo.[ARQUIVO_Busca_GLOBAIS_CFOP] (R.CFOP,MEU_Data_Base.dbo.AnoMesToDate (R.Ano,R.Mes)) AS [Descrição do CFOP]

Classe:

/**
 *
 * @author dilnei
 */
public class Teste {


    public static void main(String args[]) {

        StringBuilder formula = new StringBuilder("MEU_Data_Base.dbo.[ARQUIVO_Busca_GLOBAIS_CFOP] (CFOP,MEU_Data_Base.dbo.AnoMesToDate (Ano,Mes)) AS [Descrição do CFOP]");
        new Teste().ajustaCampo(formula, "CFOP");
        new Teste().ajustaCampo(formula, "ano");
        new Teste().ajustaCampo(formula, "mes");

        System.out.println(formula);
    }

        private void ajustaCampo(StringBuilder formula, String nomeDoCampo) {
        // Se a fórmula contem o nome do campo em algum lugar...
        int posicao = formula.toString().toLowerCase().indexOf(nomeDoCampo.toLowerCase());
        while (posicao >= 0) {
            // Verifica se termina com um carater que indique que é o final do campo.
            if (depoisDoCampo(formula, posicao + nomeDoCampo.length())) {
                // Verifica se é um campo, se tem um caracter q indique isto antes do nome do campo.
                posicao = antesDoCampo(formula, posicao);
                if (posicao >= 0) {
                    formula.insert(posicao, "R.");
                }
            }
            String str = formula.toString().toLowerCase();
            posicao = str.indexOf(nomeDoCampo.toLowerCase(), posicao);
            posicao = posicao + nomeDoCampo.length();
            posicao = formula.toString().toLowerCase().indexOf(nomeDoCampo.toLowerCase(), posicao);

        }
    }

    private int antesDoCampo(StringBuilder formula, int posicao) {
        // Obtem o caracter imediatamente anterior.
        String c = formula.substring(posicao - 1, posicao);
        // Se o caracter for algum dos válidos...
        if ("(,\n ".contains(c)) {
            return posicao;
        } else // Se for o colchete...
        if ("[".contains(c)) {
            return posicao - 1;
        }
        return -1;
    }

    private boolean depoisDoCampo(StringBuilder formula, int posicao) {
        // Obtem o caracter imediatamente posterior.
        String c = formula.substring(posicao, posicao + 1);
        // Se o caracter for algum dos válidos...
        return "]),\n ".contains(c);
    }

}

1 Resposta

jaboot

olá aix,

Não está faltando lógica.
Está faltando o StringUtils do apache commons. Vai te ajudar bastante, tem N métodos de procura em Strings.

Valeu!

Criado 22 de janeiro de 2011
Ultima resposta 22 de jan. de 2011
Respostas 1
Participantes 2