Jump to content
c3ejo0

contrução de uma query

Recommended Posts

c3ejo0

Olá

Tenho um formulario e o resultado pretendido após o seu preenchimento é a construção de uma query:

Neste momento ja consigo obter um query básica (Select ColunaX, Coluna Y from TabelaABC where colunaX =123, colunaY = 321 order by colunaX desc).

O meu proximo passo é conseguir inserir mais do que um valor(separados por virgulas) em cada coluna na textbox que define os resultados a filtrar (....Where coluna X = XPTO) escrevesse: ...Where ColunaX IN(valor1, valor2,...)

em termos de codigo tenho isto:

public ResultSet getFinalResult(String [] column, String[] filtraRegistos, String [] ordReg ){
			for(int k =0; k<filtraRegistos.length; k++){

				//condicao = condicao+" and "+column[k]+" IN ("+filtraRegistos[k]+ ")"; 
				condicao = condicao+ " and " +column[i]+" like '"+filtraRegistos[k]+"'";

Eu consigo obter cada um dos valores inseridos na textbox separados por virgula por filtraRegistos ser um array de Strings. O problema é que só é enviado um valor para cada coluna. Cada valor inserido a mais na textbox é enviado para a coluna seguinte. Tendo por base a imagem fica 657 para a coluna A, 2139 para a coluna B e 24 para a coluna C.

Pensei em fazer um ciclo para percorrer as colunas e outro dentro deste para percorrer filtraRegistos, so que nao me dei bem com isso.

Alguem me pode dar alguma dica?

Edit: Pensava que dava para fazer upload de imagens :confused:

Share this post


Link to post
Share on other sites
rippp

eu nao percebi bem o que querias mas para teres varios valores sera algo do genero

SELECT * FROM `shirts` WHERE `color` IN ('red','white','blue');


Java, Android developerhttp://minimalcode.net

Share this post


Link to post
Share on other sites
c3ejo0

O meu problema não é bem esse. Vou então tentar explicar o melhor que conseguir (se desse para fazer upload de imagens, metia um printscreen e era mais fácil.)

1) Através do formulário o utilizador consegue escolher as colunas que pretende ver e restringir os resultados das respectivas colunas de acordo com os valores inseridos numa textbox que existe à frente do nome de cada coluna

2)de acordo com o código que apresentei no post anterior: column recebe a lista de colunas que o utilizador pretende ver e    filtraRegistos recebe os valores para restringir os resultados.

 

de acordo  com:

SELECT * FROM `shirts` WHERE `color` IN ('red','white','blue');

Imaginemos que a tabela shirts tem as colunas color, size, price, available. O que me está a acontecer é que cada uma das cores é passada para a coluna seguinte e fica desta forma:

select * from shirts where color IN(red) and size IN(white) and price IN(blue).

Tenho um ciclo para percorrer os registos que o utilizador pretende filtrar e onde depois é escrita essa parte da query:

for(int k =0; k<filtraRegistos.length; k++){
		condicao = condicao+" and "+column[k]+" IN ("+filtraRegistos[k]+ ")";

O meu problema é como é que consigo dizer que os valores existentes em filtraResultados correspondem a uma dada coluna e não um valor para cada coluna que é o que esta a acontecer. Penso que se trata de trabalhar com strings mas nao estou a conseguir

Espero que tenha sido mais esclarecedor.

Share this post


Link to post
Share on other sites
Rechousa

se desse para fazer upload de imagens, metia um printscreen e era mais fácil.

Olá,

Mas dá... Colocas a imagem num servidor teu ou, num gratuíto, como por exemplo o http://www.imageshack.us/ e depois podes usar aqui.

Exemplo de uma imagem que coloquei no http://www.imageshack.us/:

imagemrm.th.jpg

Espero que tenha sido mais esclarecedor.

Mesmo assim sinto que não percebi muito bem qual o problema. Coloca a imagem ;)


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
KTachyon

Imaginemos que a tabela shirts tem as colunas color, size, price, available. O que me está a acontecer é que cada uma das cores é passada para a coluna seguinte e fica desta forma:

select * from shirts where color IN(red) and size IN(white) and price IN(blue).

Tenho um ciclo para percorrer os registos que o utilizador pretende filtrar e onde depois é escrita essa parte da query:

for(int k =0; k<filtraRegistos.length; k++){
		condicao = condicao+" and "+column[k]+" IN ("+filtraRegistos[k]+ ")";

O meu problema é como é que consigo dizer que os valores existentes em filtraResultados correspondem a uma dada coluna e não um valor para cada coluna que é o que esta a acontecer. Penso que se trata de trabalhar com strings mas nao estou a conseguir

Espero que tenha sido mais esclarecedor.

A ver se percebo. Do interface recebes 2 arrays, um com a coluna e outro com o filtro. Não é própriamente uma abordagem correcta, mas, pronto, passa... se garantires que os dois arrays são do mesmo tamanho.

O que pode acontecer dessa forma é gerares uma query com

select * from shirts where color IN(red) and color IN(white) and color IN(blue)

Isto, caso, para cada filtro esteja associada a coluna correspondente. E, claramente não será o que pretendes.

O que tens que fazer é concatenar primeiro todos os valores que correspondem à mesma coluna e só depois adicionas à query:

Hashtable<String, String> column_filter = new Hashtable<String, String>();

for (int k = 0; k < column.length; k++) {
    String filter = column_filter.get(column[k]);

    if (filter == null)
        filter = filtraRegistos[k];
    else
        filter += ", " + filtraRegistos[k];

    column_filter.put(column[k], filter);
}

Enumeration<String> keys = column_filter.keys();

while (keys.hasMoreElements()) {
    String key = keys.nextElement();
    condicao = condicao + " and " + key + " IN (" + column_filter.get(key) + ")";
}

Agora, tens é que garantir que nos arrays vem:

color     red
color     white
color     blue

Depois, não estou a ver como queres fazer a comparação de preços, visto que estás a utilizar o IN, mas isso já é outro problema ;)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
c3ejo0

Rechousa, obrigado pela dica, Aqui fica a imagem:

print1l.jpg

Agora com a imagem pode ser que ajude mais. Por exemplo: quero filtrar os resultados para que da colunaA aparecam só os registos com 675 e 2139 e simultaneamente na colunaB só os registos 3. O que me acontece é que o 2139 passa para a coluna B e o 3 passa para a colunaC

KTachyon, penso que me conseguiste entender e por isso segui a tua abordagem, mas sem mto sucesso!

a String filter fica-me sempre a null e portanto vai fazer sempre filter = filterRegistos[k]. Dentro do ciclo, filter vai tendo cada um dos valores( 675, 2139 e 3) e a column[k] também vai sempre aumentando. Isto é Coluna A-->675, ColunaB -->2139, ColunaC --> 3. Ou seja o problema persiste. ;)

E também nao consigo aceder além do Enumeration.

Obrigado!

Share this post


Link to post
Share on other sites
KTachyon

No filtraRegistos[] estás a separar os dados que foram colocados no filtro (no interface) por vírgula, não é? Se sim, tens que construir os dois arrays em paralelo, adicionando a mesma coluna ao array column[] sempre que estás a obter dados do mesmo campo.

Ou seja, quando estás a inserir os dois valores do primeiro campo no filtraRegistos[], tens que inserir em paralelo a mesma coluna de alguma forma. À mão seria qualquer coisa do género:

filtraRegistos[0] = 675;
column[0] = "Coluna A";

filtraRegistos[1] = 2139;
column[1] = "Coluna A";

filtraRegistos[2] = 24;
column[2] = "Coluna B";

Claro que isto seria feito num ciclo, em que terias uma variável que tem a coluna actual e outra com o filtro que separas:

//lista_de_colunas[], lista_de_filtros[], tamanho igual, correspondentes aos valores dos campos

for (int i = 0; i < lista_de_colunas.length; i++) {
    StringTokenizer st = new StringTokenizer(lista_de_filtros[i], ", ");
    String colunaActual = lista_de_colunas[i];

    while (st.hasMoreTokens()) {
        filtraRegistos[i] = st.nextToken();
        column[i] = colunaActual;
    }
}

Claro que pode já formatar tudo aqui de forma a poder ser criada a query na base de dados (utilizando, por base a uma Hashtable e a lista de colunas:

//column[], lista_de_filtros[], tamanho igual, correspondentes aos valores dos campos

Hashtable<String, String> filtros = new Hashtable<String, String>();

for (int i = 0; i < columns.length; i++) {
    StringTokenizer st = new StringTokenizer(lista_de_filtros[i], ", ");

    String filtro = null;

    while (st.hasMoreTokens()) {
        if (filtro == null)
            filtro = st.nextToken();
        else
            filtro += ", " + st.nextToken();
    }
    
    filtros.put(column[i], filtro);
}

Mas também parece um bocado estranho, visto que os valores já vêm separados por vírgula de origem ;)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
brunoais

Não!!! Não!!! Não!!!!!!!

O StringTokenizer já não é para se usar! Foi uma tentativa de fazer algo que afinal é má ideia!!!!

Em vez disso deve-se usar o split() (da class String) ou usar a class Scanner.

Por exemplo, um desses códigos seria:

//lista_de_colunas[], lista_de_filtros[], tamanho igual, correspondentes aos valores dos campos

for (int i = 0; i < lista_de_colunas.length; i++) {
    Scanner st = new Scanner(lista_de_filtros[i]).useDelimiter(",") ;
    String colunaActual = lista_de_colunas[i];

    while (st.hasNext()) {
        filtraRegistos[i] = st.next();
        column[i] = colunaActual;
    }
}


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
KTachyon

Lol. Tass, mas é irrelevante, o que interessa é a ideia do que ele tem que fazer. A Hashtable também não se deve usar.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
KTachyon

Porque a Hashtable foi feita a pensar em aplicações threaded. Utiliza recursos extra se estiveres a utilizar em situações em que não precisas de paralelismo. Nesses casos deve-se utilizar o HashMap. E quando precisas de sincronismo, também tens uma implementação do HashMap.

Da mesma forma que já não se deve utilizar Vector, mas sim ArrayList.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
brunoais

No caso que indiquei não é a performance que está em jogo. É mesmo a qualidade e a estabilidade do código que está em jogo!

Se leres o javadoc em relação àquela classe podes ver que está lá indicado que a classe só existe por motivos de compatibilidade!


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
c3ejo0

Olá. tenho andado ocupado com outras coisas e doente e infelizmente nao tenho pegado nisto.

Tentei o que foi dito aqui anteriormente e estranhamente nao tenho obtido os resultados pretendidos.  ;) Continuo a obter um registo por coluna!! Alguma ideia ou sugestão!?!

Share this post


Link to post
Share on other sites
c3ejo0

Finalmente consegui corrigir este erro.  O problema estava mesmo na parte de envio de dados da página (javascript). Ao enviar os dados eles ja iam separados por virgulas por estarem dentro de um array. Entao fiz com que essa separacao fosse feita com ; Na parte da servlet em que recebo os valores, faço entao o split por ; E pronto resolveu a questao.

Agradeço ao  brunoais e ao KTachyon pelos seus contributos.

Cumps

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.