Olá.
Estou desenvolvendo uma integração Fluig x RM e preciso ter os dados ta tabela de matrícula no período letivo dentro de um dataset do Fluig. Porém quando tento realizar esta busca recebo o erro:
Character reference "" is an invalid XML character
Alguém já recebeu este erro, ou sabe o que poderia ser?
Documentação da view em questão: http://api.totvs.com.br/devrm/bo_rm/EduMatricPLData.html?Objeto=EduMatricPLData
Código do Dataset abaixo
// Programa responsável por integrar com os Webservices do RM
// Para executar o programa, seguir os passos abaixo:
// 1) Adicionar o arquivo abaixo ao seu projeto:
// http://tdn.totvs.com/download/attachments/211064343/DataClientfluig.js
// 2) Inclua um serviço no Fluig com o nome WSDATASERVER apontando para
// http://localhost:8051/wsDataServer/MEX?singlewsdl (substituir localhost pelo IP e Porta do servidor RM)//.
function createDataset(fields, constraints, sortFields)
{
/* Prepararação das variaveis */
//usuário e senha do aplicativo RM. O mesmo utilizado para logar no sistema e que tenha permissão de
//acesso ao cadastro que deseja utilizar
var usuario = "mestre";
var senha = "totvs";
//importante passar no contexto o mesmo código de usuário usado para logar no webservice
var context = "CODCOLIGADA=1;CODFILIAL=1;CODSISTEMA=S;CODUSUARIO=mestre"
//o filtro pode ser qualquer campo da visão, por exemplo CODCOLIGADA=1 AND CODFILIAL = 1
var filtro = "1=1";
var retorno = dcReadView("EduMatricPLData", context, usuario, senha, filtro);
//Caso deseje utilizar as contraints do formulário
//var parsedConstraints = parseConstraints(constraints, true);
//var retorno = authService.readView("EduMatricPLData", parsedConstraints.filter, parsedConstraints.context, senha, filtro);
var xmlResultados = new XML(retorno);
for(var i = 0; i < xmlResultados.SMatricPL.length(); i++)
{
var dataset = DatasetBuilder.newDataset();
dataset.addColumn('CODCOLIGADA');
dataset.addColumn('RA');
dataset.addColumn('IDHABILITACAOFILIAL');
dataset.addColumn('IDPERLET');
dataset.addColumn('CODFILIAL');
dataset.addColumn('CODSTATUS');
dataset.addColumn('DTMATRICULA');
dataset.addColumn('PERIODO');
dataset.addColumn('NOMEALUNO');
dataset.addColumn('CODTIPOCURSO');
dataset.addColumn('NOMECURSO');
dataset.addColumn('CONTADOR');
dataset.addRow(new Array(
xmlResultados.SMatricPL[i].CODCOLIGADA.toString(),
xmlResultados.SMatricPL[i].RA.toString(),
xmlResultados.SMatricPL[i].IDHABILITACAOFILIAL.toString(),
xmlResultados.SMatricPL[i].IDPERLET.toString(),
xmlResultados.SMatricPL[i].CODFILIAL.toString(),
xmlResultados.SMatricPL[i].CODSTATUS.toString(),
xmlResultados.SMatricPL[i].DTMATRICULA.toString(),
xmlResultados.SMatricPL[i].PERIODO.toString(),
xmlResultados.SMatricPL[i].NOMEALUNO.toString(),
xmlResultados.SMatricPL[i].CODTIPOCURSO.toString(),
xmlResultados.SMatricPL[i].NOMECURSO.toString(),
i));
}
// retorna...
return dataset;
}
/**'
* A API de autenticação da Totvs baseia no "Basic access authentication" do HTTP.
* Código Java para autenticação
* Programa responsável por integrar com os Webservices do RM
* Exemplo dev valores para os parâmetros
* @param string Usuario = "mestre";
* @param string Senha = "senha";
*/
function getWebService(Usuario, Senha){
var Nome_Servico = "wsDataServer";
var Caminho_Servico = "com.totvs.WsDataServer";
var dataServerService = ServiceManager.getServiceInstance(Nome_Servico);
if(dataServerService == null){
throw "Servico nao encontrado: " + Nome_Servico;
}
var serviceLocator = dataServerService.instantiate(Caminho_Servico);
if(serviceLocator == null){
throw "Instancia do servico nao encontrada: " + Nome_Servico + " - " + Caminho_Servico;
}
var service = serviceLocator.getRMIwsDataServer();
if(service == null){
throw "Instancia do dataserver do invalida: " + Nome_Servico + " - " + Caminho_Servico;
}
var serviceHelper = dataServerService.getBean();
if(serviceHelper == null){
throw "Instancia do service helper invalida: " + Nome_Servico + " - " + Caminho_Servico;
}
var authService = serviceHelper.getBasicAuthenticatedClient(service, "com.totvs.IwsDataServer", Usuario, Senha);
if(serviceHelper == null){
throw "Instancia do auth service invalida: " + Nome_Servico + " - " + Caminho_Servico;
}
return authService;
}
function dcReadView(dataservername, context, usuario, senha, filtro)
{
// carrega o webservice...
var authService = getWebService(usuario, senha);
// lê os dados da visão respeitando o filtro passado
var viewData = new String(authService.readView(dataservername, filtro, context));
return viewData;
}
function dcReadRecord(dataservername, context, usuario, senha, primaryKey)
{
// carrega o webservice...
var authService = getWebService(usuario, senha);
// lê os dados do registro respeitando a pk passada
try
{
var recordData = new String(authService.readRecord(dataservername, primaryKey, context));
}
catch (e)
{
var recordData = new String(authService.getSchema(dataservername, context));
}
return recordData;
}
function dcSaveRecord(dataservername, context, usuario, senha, xml)
{
// carrega o webservice...
var authService = getWebService(usuario, senha);
// salva o registro de acordo com o xml passado
var pk = new String(authService.readRecord(dataservername, xml, context));
return pk;
}
//Transforma o conceito de constraints do Fluig para o Filtro do TBC.
function parseConstraints(constraints, filterRequired)
{
// inicializa o resultado...
var result = [];
result.context = "";
// inicializa o filtro...
var filter = "";
// varre as contraints...
for (con in constraints) {
var fieldName = con.getFieldName().toUpperCase();
if (fieldName == "RMSCONTEXT")
{
result.context = con.getInitialValue();
continue;
}
filter += "(";
if (fieldName == "RMSFILTER")
{
filter += con.getInitialValue();
}
else
{
if (con.getInitialValue() == con.getFinalValue() || isEmpty(con.getFinalValue()))
{
filter += con.getFieldName();
var isLike = false;
switch(con.getConstraintType())
{
case ConstraintType.MUST:
filter += " = ";
break;
case ConstraintType.MUST_NOT:
filter += " = ";
break;
case ConstraintType.SHOULD:
filter += " LIKE ";
isLike = true;
break;
case ConstraintType.SHOULD_NOT:
filter += " NOT LIKE ";
isLike = true;
break;
}
filter += getFormattedValue(con.getInitialValue(), isLike);
}
else
{
filter += con.getFieldName();
filter += " BETWEEN ";
filter += getFormattedValue(con.getInitialValue(), false);
filter += " AND ";
filter += getFormattedValue(con.getFinalValue(), false);
}
}
filter += ") AND ";
}
if (filter.length == 0)
{
if(filterRequired){
filter = "1=1";
}
else{
filter = "1=1";
}
}
else
filter = filter.substring(0, filter.length-5);
// guarda o filtro...
result.filter = filter;
// retorna o resultado...
return result;
}
function isEmpty(str) {
return (!str || 0 === str.length);
}
function getFormattedValue(value, isLike){
if(isLike){
return "'%" + value + "%'";
}
else{
return "'" + value + "'";
}
}
function getXMLFromString(xmlString) {
var factory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
var parser = factory.newDocumentBuilder();
var is = new org.xml.sax.InputSource();
is.setCharacterStream(new java.io.StringReader(xmlString));
return parser.parse(is);
}
function abrirPesquisa(DATASET_ID, dataFields, resultFields, type, title){
window.open("/webdesk/zoom.jsp" +
"?datasetId=" +
DATASET_ID +
"&dataFields=" +
dataFields +
"&resultFields=" +
resultFields +
"&type=" +
type+
"&title=" +
title
, "zoom", "status,scroolbars=no,width=600,height=350,top=0,left=0");
}
function checkIsPK(result, qtd){
var lines = result.split('\r');
if(lines.length == 1){
var pk = result.split(';');
if(pk.length == qtd)
return;
}
throw result;
}
function ChekExist(result)
{
var lines = result.split('\r');
if(lines.length > 1)
return true
else
return false;
}
function replaceValue(text, columnName, newValue){
if ((newValue != null) && (newValue.trim() != ""))
{
var regex = new RegExp("<" + columnName + ">(.*?)<\\/" + columnName + ">", "g");
var replaceText = "<" + columnName + ">" + newValue + "</" + columnName + ">";
return text.replace(regex, replaceText);
}
else
return text;
}
function isEmpty(str) {
return (!str || 0 === str.length);
}