sexta-feira, 8 de abril de 2016

WX - Como alterar a conexão ao DB do user Groupware via código, usando servidor A ou servidor B (local/remoto)?



Fonte - Forum - Adriano



Prezados,

Como alterar a conexão ao DB do user Groupware via código, usando servidor A ou servidor B (local/remoto)?




gpwLogin (Função)

Conecta um usuário para um aplicativo que está usando o groupware usuário. Esta função verifica se o usuário está registrado no banco de dados de groupware usuário. Se o usuário é identificado, o aplicativo é iniciado automaticamente usando os direitos definidos para este usuário.

Nota : No janela de login é aberta automaticamente: o login e senha estão diretamente passada em parâmetro para a função. O login e senha poderia ter sido inserido em uma janela de conexão personalizada (veja o exemplo).

gpwLogin: http://doc.pcsoft.fr/en-US/?3041001

// Recuperar o login em uma janela de costume
Entrada é seqüência de
senha é cadeia
aberta ( WIN_ MyLoginWindow , Acesso , senha )
// Verifique o login
n Res é int = gpwLogin ( login , senha )
// Se o login falhar
IF n Res < > gpwOk ENTÃO
LIGAR n Res
CASE gpwError : Erro ( "Erro ao inicializar o groupware." )
CASE gpwUnknownUser : Erro ( "usuário desconhecido". )
CASO gpwInvalidPassword : Erro ( "senha inválida" )
END
EndProgram ()
END
// Recuperar o primeiro nome do usuário
FirstName é cadeia = gpwGetUserInfo ( gpwInfoFirstName )
Informações ( "Bem-vindo" + FirstName )


gpwOpenConnection (Função)

Abre uma conexão com um banco de dados específico de cliente / servidor para gerenciar os arquivos de groupware usuário no modo cliente / servidor. A conexão permanece aberta até o final da aplicação.

gpwOpenConnection é usado para definir e abrir uma conexão para os arquivos de dados de groupware usuário. Para usar a mesma conexão para todos os arquivos de dados do aplicativo, tudo que você tem a fazer é usar HChangeConnection . Em seguida, gpwOpen é utilizado para especificar a localização dos ficheiros de dados utilizados para administrar os direitos, assim como a localização dos ficheiros de dados usados ​​para identificar os utilizadores.

Nota: A partir da versão 19, HFSQL é o novo nome da HyperFileSQL.

// Use os arquivos de groupware usuário com um banco de dados MySQL
IF gpwOpenConnection ( "gpwCt" , "Test" , "PasswordMySQL" , ...
"Apollon_server" , "TEST" , hNativeAccessMySQL ) = False ENTÃO
erro ( ErrorInfo ())
ELSE
// os arquivos de groupware usuário
// são criados automaticamente
// se o usuário tem direitos sobre MySQL.
n Res é int = gpwOpen ()
// Se o login falhar
IF n Res <> gpwOk ENTÃO
LIGAR n Res
CASE gpwError :
Erro ( "Erro na inicialização." , ErrorInfo ())
CASE gpwUnknownUser :
Erro ( "usuário desconhecido". )
CASO gpwInvalidPassword :
Erro ( "senha inválida" )
END
END
// usar a mesma conexão para todos os arquivos de dados
HChangeConnection ( "* " , " gpwCt " )
Traço ( HNbRec ( CEDEX ))
END


// Altere a senha para os arquivos de groupware usuário
// pela programação
// Exemplo com o GPWUSER

Parâmetros da conexão com
CNT_GPWu_HFCS ..Provider = hAccessHFClientServer
CNT_GPWu_HFCS ..User = "UserHFServer"
CNT_GPWu_HFCS ..Password = "PasswordHFServer"
CNT_GPWu_HFCS ..Server = "HFServer"
CNT_GPWu_HFCS ..Database = "GPWu"
CNT_GPWu_HFCS ..CryptMethod = hCryptNo

// Abra o ERRO:
Erro ( HErrorInfo () + CR + ErrorInfo ())


gpwOpenConnection: http://doc.pcsoft.fr/en-US/?3041007&name=gpwopenconnection_function

Exemplo:

//Para alterar a conexão ao DB do user groupware via código, usando servidor A ou servidor B (local/remoto).

gpwInitAnalysis()

gpwUser is Data Source

CNT_GPWu_HFCS is Connection

sPasswordGPWu is string = "PCSGPW2001"

// Parâmetros da conexão
CNT_GPWu_HFCS..Provider = hAccessHFClientServer
CNT_GPWu_HFCS..User = "UserHFServer"
CNT_GPWu_HFCS..Password = "PasswordHFServer"
CNT_GPWu_HFCS..Server = "HFServer"
CNT_GPWu_HFCS..Database = "GPWu"
CNT_GPWu_HFCS..CryptMethod = hCryptNo

// Abre a conexão
gpwOpenConnection(CNT_GPWu_HFCS)
HChangeConnection(gpwUser,CNT_GPWu_HFCS)
HPass(gpwUser, sPasswordGPWu)
HCreationIfNotFound(gpwUser)
HChangePassword(gpwUser, "TEST")

CASE ERROR:
Error(HErrorInfo() + CR + ErrorInfo())







WX - CONSUMINDO UM WEBSERVICE COM WINDEV, WEBDEV E WINDEV MOBILE



Fonte - forum - Adriano



//Webservice
//############################################################################
XML_Retorno is string = ""

RetornoXml is a ws_mobile_configResponse

RetornoXml = ws_mobile_config(29121974,4199491800,"SELECT")

XML_Retorno = RetornoXml.ws_mobile_configResult

XML_RetornoBuffer is Buffer = UTF8ToAnsi(XML_Retorno)
//############################################################################

XmlDoc is XMLDocument
XmlDoc = XMLOpen(XML_RetornoBuffer,fromString)
NoXml is xmlNode
FOR EACH NoXml OF XmlDoc.Xml.Retorno on NoXml

t010_MobileConfig.t010_Codigo = XmlDoc.Xml.Retorno.NoXml.NG0030_Codigo
t010_MobileConfig.t010_Descricao = XmlDoc.Xml.Retorno.NoXml.NG0030_Descricao
t010_MobileConfig.t010_Valor = XmlDoc.Xml.Retorno.NoXml.NG0030_Valor
t010_MobileConfig.t010_Status = XmlDoc.Xml.Retorno.NoXml.NG0030_Status
HAdd(t010_MobileConfig)

END


-------


//Webservice
//############################################################################
XML_Retorno is string = ""

Retorno is a ws_treino_select_bairroResponse

Retorno = ws_treino_select_bairro(29121974,4199491800,"SELECT")

XML_Retorno = Retorno.ws_treino_select_bairroResult

Info(XML_Retorno)
//############################################################################


Retorno DO Select

<Xml>
<Retorno>

<NoXml id="1"><codigo>1</codigo><bairro>CENTRO</bairro></NoXml> //Registro 1
<NoXml id="2"><codigo>2</codigo><bairro>SAO CRISTOVAO</bairro></NoXml> //Registro 2
<NoXml id="3"><codigo>3</codigo><bairro>CAPAO DA IMBUIA</bairro></NoXml> //Registro 3

<TOTAL>3</TOTAL>

</Retorno>
</Xml>



<Xml><Retorno><NoXml id="1"><codigo>1</codigo><bairro>CENTRO</bairro></NoXml><NoXml id="2"><codigo>2</codigo><bairro>SAO CRISTOVAO</bairro></NoXml><NoXml id="3"><codigo>3</codigo><bairro>CAPAO DA IMBUIA</bairro></NoXml><NoXml id="4"><codigo>4</codigo><bairro>Taruma</bairro></NoXml><TOTAL>4</TOTAL></Retorno></Xml>




//-----------------------------------------------------------------------------------------------------------------




//Modelo de consumo de webservice
//############################################################################
XML_Retorno is string = "" //Variavel que pega o resultado e exibe na tela

Retorno is a ws_treino_select_bairroResponse //Response = Envio

Retorno = ws_treino_select_bairro(29121974,4199491800,"SELECT")

XML_Retorno = Retorno.ws_treino_select_bairroResult //Result = Resultado

Info(XML_Retorno)

EDT_Retorno = XML_Retorno
//############################################################################



Retorno DO Insert

<Xml>
<Retorno>

<NoXml id="0">
<OK>Gravou com Sucesso!</OK> //Incluiu com sucesso
</NoXml>

<TOTAL>1</TOTAL>

</Retorno>
</Xml>


//-----------------------------------------------------------------------------------------------------------------



//Modelo de consumo de webservice
//############################################################################
XML_Retorno is string = "" //Variavel que pega o resultado e exibe na tela

Retorno is a ws_treino_insert_bairroResponse

Retorno = ws_treino_insert_bairro(29121974,4199491800,"INSERT",EDT_Codigo,EDT_Bairro)

XML_Retorno = Retorno.ws_treino_insert_bairroResult //Result = Resultado

Info(XML_Retorno)

EDT_Retorno = XML_Retorno
//############################################################################


<Xml><Retorno><ng0020_bairro id="0"><OK>Gravou com Sucesso!</OK></ng0020_bairro><TOTAL>1</TOTAL></Retorno></Xml><ng0020_bairro id="0"><ERRO>ACAO INVALIDA</ERRO></ng0020_bairro>


<Xml>
<Retorno>

<NoXml id="1"><codigo>1</codigo><bairro>CENTRO</bairro></NoXml>
<NoXml id="2"><codigo>2</codigo><bairro>SAO CRISTOVAO</bairro></NoXml>
<NoXml id="3"><codigo>3</codigo><bairro>CAPAO DA IMBUIA</bairro></NoXml>
<NoXml id="4"><codigo>4</codigo><bairro>Boqueirao</bairro></NoXml> //-----> Registro Alterado com sucesso

<TOTAL>4</TOTAL>

</Retorno>
</Xml>



//------------------------------------------------------------------------------------------------------------------


//Modelo de consumo de webservice
//############################################################################
XML_Retorno is string = "" //Variavel que pega o resultado e exibe na tela

Retorno is a ws_treino_delete_bairroResponse //Vaio via Drag in Drop

Retorno = ws_treino_delete_bairro(29121974,4199491800,"DELETE") // Executa o comando de exclusao dos registros

XML_Retorno = Retorno.ws_treino_delete_bairroResult //Result = Resultado

Info(XML_Retorno)

EDT_Retorno = XML_Retorno //Exibe o retorno
//############################################################################



<Xml><Retorno><ng0020_bairro id="0"><OK>Deletou com Sucesso!</OK></ng0020_bairro><TOTAL>1</TOTAL></Retorno></Xml><ng0020_bairro id="0"><ERRO>ACAO INVALIDA</ERRO></ng0020_bairro>


//Pelo Select Obtenho que nao tenho mais registros


<NoXml id="0"><Erro>NENHUM REGISTRO!</Erro></NoXml><TOTAL>0</TOTAL></Retorno></Xml>

//-------------------------------


Segue aqui outro exemplo de procedures, podem converter para classe esses códigos automatizando assim a leitura.

<Xml>
<Retorno>
<NoXml id="1">
<TJogadorID>2</TJogadorID>
<TNome>Neri</TNome>
<TClassificacao>600</TClassificacao>
<TFone>1</TFone>
<TFoto>1</TFoto>
</NoXml>
<NoXml id="2">
<TJogadorID>1</TJogadorID>
<TNome>Adriano Boller</TNome>
<TClassificacao>1</TClassificacao>
<TFone>1</TFone>
<TFoto>1</TFoto>
</NoXml>
<Total>2</Total>
</Retorno>
</Xml>



CODIGO GLOBAL CODE

//Global do Projeto
arrXml_Tags is array of strings //Nome das Tags

arrXml_TagResult is array of strings //Conteudo das Tags Resultado

gsGloXmlResultado is string = ""

GloTotalRegistros is int = 0

GloXml is string



//OPEN DA JANELA
pws_listar_jogador(0)

ws_listar_jogadores()



Procedure ArrayDeleteDuplicateBoller(ArrayResultado is array of strings)

x, NaoAchou is int = 0

ArrayResultadoNovo is array of strings

nTotal is int = ArrayCount(ArrayResultado)

LOOP (nTotal)

x += 1

NaoAchou = ArraySeek(ArrayResultadoNovo,asLinearFirst,ArrayResultado[x])

IF NaoAchou = -1

Add(ArrayResultadoNovo,ArrayResultado[x])

END

END

RESULT (ArrayResultadoNovo)



Procedure IdentificarTagsNoXml(XmlConteudo)

x, Inicial, Final, Tamanho is int = 0

Tag, Anterior is string = ""

IF XmlConteudo <> "" THEN

XmlConteudo = NoAccent(XmlConteudo)
XmlConteudo = Replace(XmlConteudo,CR,"")
XmlConteudo = Replace(XmlConteudo,Charact(13),"")
XmlConteudo = Replace(XmlConteudo,Charact(10),"")

Total is int = Length(XmlConteudo)

LOOP (Total)

x += 1

IF XmlConteudo[[x]] = "<"
Inicial = x+1
ELSE IF XmlConteudo[[x]] = ">"
Final = x
IF Final <= Inicial THEN
Final = 0
END
END

IF Inicial > 0 AND Final > 0 AND Final > Inicial

Tamanho = Final - Inicial

Tag = Middle(XmlConteudo,Inicial,Tamanho)

//IGNORAR AS TAGS DE FECHAMENTO E ID
IF Middle(Tag,1,1) = "/" OR PositionOccurrence(Upper(Tag),"ID=",firstRank,FromBeginning) > 0
Tag = ""
END

//VALIDA TAGS DO NÓ
IF Tag <> "" AND Tamanho > 0 AND Anterior <> Tag AND Upper(Tag) <> "XML" AND Upper(Tag) <> "RETORNO" AND Upper(Tag) <> "TOTAL"

Anterior = Tag

//DEBUG
//add(arrXml_Tags,Tag +" / "+ Inicial +" / "+ Final +" / "+ Tamanho )
//INFO(TAG)

Add(arrXml_Tags,Tag) //VAR GLOBAL: arrXml_Tags

END

END

END

END


//INSIRA O TARGETCODE


//TARGET CODE ANDROID

arrXml_Tags = ArrayDeleteDuplicateBoller(arrXml_Tags)


//TARGET CODE IOS

ArrayDeleteDuplicate(arrXml_Tags,tccIgnoreSpace)

//TARGET CODE

RESULT (arrXml_Tags)



Procedure LeituraGravacaoXml(XmlRetorno,Tabela)

buf_Foto is Buffer = ""

//Processamento
//<login_id>3</login_id>
//<login_email>teste@teste.com</login_email>
//<login_nome>Usuario teste</login_nome>
//<login_senha>123</login_senha>
//<login_status>1</login_status>
//<login_admin>0</login_admin>

LocalizarTagsEmXml(XmlRetorno)

//Exibindo o resultado
XmlRetorno = ""

X, T is int = 0

QTD_TAGS is int = ArrayCount(arrXml_Tags)

QTD_Resultados is int = ArrayCount(arrXml_TagResult)

IF Tabela = "TJogador"
HDeleteAll(TJogador)
//else...
END

LOOP (QTD_Resultados)

X += 1
T += 1

XmlRetorno += arrXml_Tags[T] + ": " + arrXml_TagResult[X] + CR

IF Tabela = "TJogador"
IF T = 1
TJogador.TJogadorID = arrXml_TagResult[X]
ELSE IF T = 2
TJogador.TNome = arrXml_TagResult[X]
ELSE IF T = 3
TJogador.TClassificacao = arrXml_TagResult[X]
ELSE IF T = 4
TJogador.TFone = arrXml_TagResult[X]
ELSE IF T = 5
buf_Foto = arrXml_TagResult[X]
TJogador.TFoto = Uncrypt(buf_Foto,"",cryptNone)
HAdd(TJogador)
END
//else...
END

IF T = QTD_TAGS THEN
T = 0
XmlRetorno += CR
END

END



Procedure LocalizarTagsEmXml(XML_Retorno is string)

//Variaveis
nXposicaoinicial is int = 0
nXposicaofinal is int = 0

X is int = 0

//Exemplo
//<Xml>
//<Retorno>
//<NoXml ID="3"> // <------------------------ motivo do erro
//<login_id>3</login_id>
//<login_email>teste@teste.com</login_email>
//<login_nome>Usuario teste</login_nome>
//<login_senha>123</login_senha>
//<login_status>1</login_status>
//<login_admin>0</login_admin>
//</NoXml> // <------------------------ motivo do erro
//<Total>1</Total>
//</Retorno>
//</Xml>


//iOS - Apple (iPhone / iPad / iPod)
IF IniOSMode() = True THEN

T, N is int = 0

RegistroXml is string

NoXml is string

i is int = 1

NoXml = XMLExtractString(XML_Retorno,"NoXml",i)

//FUNCAO IDENTIFICA TAG
IdentificarTagsNoXml(XML_Retorno)

nQtde_Registros is int = XMLExtractString(gsGloXmlResultado,"Total") //5

LOOP (nQtde_Registros)

T = 0

N += 1

RegistroXml = PegaNoXml(XML_Retorno,N)

NoXml = XMLExtractString(RegistroXml,"NoXml",i)

FOR EACH stag OF arrXml_Tags //VAR GLOBAL

temp is string = XMLExtractString(NoXml,stag)

Add(arrXml_TagResult, temp )

END

END



//Android
ELSE IF InAndroidMode() = True

T, N is int = 0

IdentificarTagsNoXml(XML_Retorno) //FUNCAO IDENTIFICA TAG

nQtde_tags is int = ArrayCount(arrXml_Tags)

TagRegistro, RegistroXml is string

TagValor is string

nQtde_Registros is int = XMLExtractString(gsGloXmlResultado,"Total") //5

LOOP (nQtde_Registros)

T = 0

N += 1

RegistroXml = PegaNoXml(XML_Retorno,N) //corta

LOOP (nQtde_tags)

T += 1

TagRegistro = arrXml_Tags[T]

TagValor = XMLExtractString(RegistroXml,TagRegistro)

IF TagValor <> ""

Add(arrXml_TagResult,TagValor)

END

END

END

END

RESULT arrXml_TagResult



Procedure PegaNoXml(RetornoXml, NoXmlId) //outra procedure para facilitar, que nem dizia Jac, vamos por partes...

Inicio, Final, Tamanho is int = 0

NoXml is string = "<Xml><Retorno>"

IF RetornoXml <> "" AND NoXmlId > 0 THEN

Inicio = PositionOccurrence(RetornoXml,"<NoXml ID="+Charact(34)+NoXmlId+Charact(34)+">",firstRank,FromBeginning)
IF Inicio = 0 THEN
Inicio = PositionOccurrence(RetornoXml,"<NoXml id="+Charact(34)+NoXmlId+Charact(34)+">",firstRank,FromBeginning)
IF Inicio = 0 THEN
Inicio = PositionOccurrence(RetornoXml,"<NoXml Id="+Charact(34)+NoXmlId+Charact(34)+">",firstRank,FromBeginning)
END
END

IF NoXmlId = 1
Final = PositionOccurrence(RetornoXml,"</NoXml>",firstRank,FromBeginning)
ELSE
Final = PositionOccurrence(RetornoXml,"</NoXml>",nextRank,FromBeginning)
END

Tamanho = Final - Inicio

NoXml += Middle(RetornoXml,Inicio,Tamanho)

END

NoXml += "</NoXml></Retorno></Xml>"

NoXml = Replace(NoXml,CR,"")
NoXml = Replace(NoXml,Charact(13),"")
NoXml = Replace(NoXml,Charact(10),"")

RESULT NoXml



Procedure pws_listar_jogador(id is int)

//LIMPAR VARIAVEIS GLOBAIS
ArrayDeleteAll(arrXml_Tags)

ArrayDeleteAll(arrXml_TagResult)

gsGloXmlResultado = ""

GloTotalRegistros = 0

GloXml = ""


//leitura do webservice
Xml_retorno is string
retornoXml is a ws_listar_jogadorResponse
retornoXml = ws_listar_jogador("20872",id)
Xml_retorno = retornoXml.ws_listar_jogadorResult
Xml_retorno = UTF8ToAnsi(Xml_retorno) //vai trazer tudo foto etc
gsGloXmlResultado = Xml_retorno
GloTotalRegistros = XMLExtractString(gsGloXmlResultado,"Total") //5

//<Xml>
// <Retorno>
// <NoXml id="1">
// <TJogadorID>2</TJogadorID>
// <TNome>Neri</TNome>
// <TClassificacao>600</TClassificacao>
// <TFone>1</TFone>
// <TFoto>1</TFoto>
// </NoXml>
// <NoXml id="2">
// <TJogadorID>1</TJogadorID>
// <TNome>Adriano Boller</TNome>
// <TClassificacao>1</TClassificacao>
// <TFone>1</TFone>
// <TFoto>1</TFoto>
// </NoXml>
// <Total>2</Total>
// </Retorno>
// </Xml>


//leitura do xml
HDeleteAll(TJogador)

LeituraGravacaoXml(Xml_retorno,"TJogador")


RESULTADO




Publicado em abril, 06 2016 - 7:14 PM
Prezados,

Na janela do aplicativo em local procedures:

Procedure ws_listar_jogadores()
x is int = 0
ok, registro is boolean

ok = HExecuteQuery(QRY_ranking_jogadores,hQueryDefault)
IF ok = True
FOR EACH QRY_ranking_jogadores
x += 1
ok = HExecuteQuery(QRY_Update_Ranking,hQueryDefault,x,QRY_ranking_jogadores.TJogadorID)
END
END

ok = HExecuteQuery(QRY_ranking_jogadores,hQueryDefault)
IF ok = True THEN
FOR EACH QRY_ranking_jogadores
registro = HFound(QRY_ranking_jogadores)
IF registro = True THEN
LooperAdd(LOOP_Ranking, QRY_ranking_jogadores.TRanking + TAB + QRY_ranking_jogadores.TNome + TAB + QRY_ranking_jogadores.TFone + TAB + QRY_ranking_jogadores.TClassificacao + TAB + QRY_ranking_jogadores.TFoto)
END
END
END

LooperDisplay(WIN_Lista_Jogadores.LOOP_Ranking,taReExecuteQuery)

LooperDisplay(WIN_Lista_Jogadores.LOOP_Ranking,taInit)




Teste

Teste
teste