ricardo80

Salvar resultado do SELECT em um array e percorrer ele

14 posts in this topic

Bom dia, sou iniciante no webdev, na verdade no mundo da PCSoft...

estou fazendo meus estudos sem usar analyses...aqui na empresa fizemos a conexão direta...com sqlconnect...até ai tudo bem...

agora quero salvar o resultado do meu sql em um array....e naõ sei como fazer....

IF abreBanco() THEN

//ESSE AQUI FUNFA	

	IF  SQLExec("SELECT id,login,senha,field1 FROM usuario","tmp_usuario") = False THEN

		SQLInfo()

		Error("CÓDIGO.:" + SQL.Error,"MENSAGEM.:"+SQL.MesError)

	ELSE

		SQLTable("tmp_usuario",TABLE_DADOS) //aqui passa o resultado da sqlexec pro controle table	

	END

	SQLClose("tmp_usuario")

	fechaBanco()

END

passar todo o resultado do sql tudo bem, o que eu quero é pegar o sql inteiro...em vez de indicar os campos...trazer SELECT * FROM usuario;

e depois programar o controle TABLE dinamicamente com os campos que eu quero.....

 

não sei se ficou claro...

Share this post


Link to post
Share on other sites

"agora quero salvar o resultado do meu sql em um array", aqui eu entendi que quer salvar o resultado.
"o que eu quero é pegar o sql inteiro", aqui que quer salvar o código sql.


 

Share this post


Link to post
Share on other sites

No caso de salvar o resultado da query, uma vez que já tenha conectado com sucesso e possa dar um 'for each' nos registros deve ser apenas alimentar o array com os dados.

Em conexão hfsql, é mais fácil, basta usar o FileToMemory()

Share this post


Link to post
Share on other sites

Ananias, eu quero o resultado, mas usando sqlconnect, como eu faço isso?

 

Share this post


Link to post
Share on other sites

Veja:
ResExec
 = SQLExec("SELECT CUSTNAME FROM INVOICE", "QRY1")
IF ResExec = True THEN
        SQLFirst("QRY1")
        // Transfer the name into LIST_NAME
        WHILE NOT SQL.Out
                ListAdd(LIST_NAME, SQLCol("QRY1", 1))    // Aqui pode usar algum código para alimentar uma variável array
                SQLNext("QRY1")
        END
ELSE
        // ProcessError
END
SQLClose("QRY1")

Share this post


Link to post
Share on other sites
44 minutos atrás, Ananias Guerra disse:

Veja:
ResExec
 = SQLExec("SELECT CUSTNAME FROM INVOICE", "QRY1")
IF ResExec = True THEN
        SQLFirst("QRY1")
        // Transfer the name into LIST_NAME
        WHILE NOT SQL.Out
                ListAdd(LIST_NAME, SQLCol("QRY1", 1))    // Aqui pode usar algum código para alimentar uma variável array
                SQLNext("QRY1")
        END
ELSE
        // ProcessError
END
SQLClose("QRY1")

e aqui....eu consigo por exemplo SQLCol("QRY1"NOME_DA_COLUNA) ???

Sei que são questões básicas..mas não achei em algum coisa nesse sentido

Share this post


Link to post
Share on other sites
1 hora atrás, Ananias Guerra disse:

Dá uma olhada nessa. Pelo que vi é pelo índice da coluna.

https://help.windev.com/?3072004&name=sqlassociate_function

Fica meio na contra-mão, imagina uma situação de uma tabela com 47 colunas...dai precisaria fazer  ListAdd(LIST_NAME, SQLCol("QRY1", [INDICE])) 

 

deveria ou deve ter algum modo mais simples de fazer isso....

Alguma alma caridosa sabe..ehehehee

Share this post


Link to post
Share on other sites

A vantagem de usar Analisys é simplificar e aumentar a produtividade, algo q todos buscam, agora se não usar a Analisys, vai ter um certo trabalho como vc mesmo percebeu, e ai nesse caso não vejo muito o q fazer. Talvez algum colega tenha alguma ideia mas como disse sem usar Analisys, não conheço forma de simplificar o processo.

Share this post


Link to post
Share on other sites
21 horas atrás, Cassiano disse:

A vantagem de usar Analisys é simplificar e aumentar a produtividade, algo q todos buscam, agora se não usar a Analisys, vai ter um certo trabalho como vc mesmo percebeu, e ai nesse caso não vejo muito o q fazer. Talvez algum colega tenha alguma ideia mas como disse sem usar Analisys, não conheço forma de simplificar o processo.

é que neste projeto que estamos tentando estruturar aqui, eu vou conectar em uma base de dados( em um servidor da nuvem), e depois de passar por essa conexão, ele vai acessar a base de dados do cliente( servidor do cliente)

Share this post


Link to post
Share on other sites

Ricardo quando você usa SQLExec você ja tem um array em memória com o resulta, as funções SQL permitem navegar entre os registro de várias formas, agora se quer vincular o resltado a uma variável existe o SQLAssociate()

outra questão se usar o HOpenConnect fica muito mais fácil pois pode usar DataSources, ai vai ter a disposição FileToMemory() e pode trabalhar com arrays associativos 
http://leonardo-vilani.blogspot.com/2015/05/em-meu-post-anterior-demonstrei-como.html

Share this post


Link to post
Share on other sites

Bom dia Vilani, estou migrando para analysis, agora estou com um problema assim....

usando este código

IF abreBanco() THEN

    wComandoSQL    is string    = "SELECT descricao,chave FROM GENIND WHERE trim(ALIAS1)='%1' order by ordem asc"    

    wComandoSQL = StringBuild(wComandoSQL,NoSpace(rAlias))

    rGenInd is Data Source

    IF  executaSQL(wComandoSQL,rGenInd,False)  THEN

        rControle.DeleteAll()

        rControle.Add("") // CRIA UM EM BRANCO

        HReadFirst(rGenInd)

        WHILE NOT HOut(rGenInd)

            ListAdd(rControle,NoSpace(rGenInd.descricao)+gLink((rGenInd.chave)))

            HReadNext(rGenInd)

        END                

    ELSE

        Info(HErrorInfo())

        HFreeQuery(rGenInd)

        HCloseConnection(Conexao)        

    END    

    HFreeQuery(rGenInd)

    HCloseConnection(Conexao)

END

ele preenche o combo sem problemas, agora eu quero fazer é preencher um table control, estou usando a mesma técnica, mas ele esta trazendo somente um registro...

a minha função executaSQL;

PROCEDURE executaSQL(rComandoSQL is string,rDataSource is Data Source,rSetPath is boolean = False):boolean



IF rSetPath = True THEN

    executaSetSearch_path()

END



IF HExecuteSQLQuery(rDataSource,Conexao,hQueryWithoutCorrection,rComandoSQL) THEN

    RESULT True

ELSE

    Info(HErrorInfo())

    RESULT False

END

e a função executaSetSearch_path

PROCEDURE executaSetSearch_path():boolean

wComando is string = "SET search_path TO %1,public"

wComando = StringBuild(wComando,PU_Schema)

xxx is Data Source

IF HExecuteSQLQuery(xxx, Conexao, hQueryWithoutCorrection, wComando) THEN

    HFreeQuery(xxx)

    RESULT True

ELSE

    Info(ErrorInfo())

    HFreeQuery(xxx)

    RESULT False

END

não sei o pq esta acontecendo isso de trazer apenas um registro, e eu executando o comando direto no banco, funciona normal....

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