Pegar valor de dataset no formulário

Bom dia!

Sei que já existe uma resposta para essa pergunta, mas ainda não consegui entender, então vamos lá.

Na pergunta anterior: https://forum.fluig.com/3365-pegar-valor-de-dataset-em-formulario

me indicaram este link: http://tdn.totvs.com/display/public/fluig/Desenvolvimento+de+Datasets#DesenvolvimentodeDatasets-ViaTagsnoFormul%C3%A1rio.

Só que após passar muita raiva com vários métodos diferentes na documentação e que nenhum me ajudava, resolvi postar outra pergunta.

Tenho um formulário em que quero buscar o nome do cliente, o código e a loja a partir do CNPJ.

Todos estes dados estão na SA1 do Protheus.

Fiz o seguinte código:


var c1 = DatasetFactory.createConstraint("A1_CGC", cgcCliente, cgcCliente, ConstraintType.MUST);

var constraints = new Array(c1);
var sortingFields = new Array("A1_CGC");
var returnFields = new Array("A1_NOME", "A1_COD", "A1_LOJA");
var dataset = DatasetFactory.getDataset("SA1100", returnFields, constraints, sortingFields);

for(var i = 0; i < dataset.values.length; i++) {
   nomeCliente = dataset.getValue(i, "A1_NOME");
   codigoCliente = dataset.getValue(i, "A1_COD");
   lojaCliente = dataset.getValue(i, "A1_LOJA");
}

Ao dar console.log nesses caras, recebo o seguinte erro:


TypeError: dataset.getValue is not a function

Cansei de procurar na documentação. Lá está muito confuso. Alguém poderia me dar uma luz?

Amigo me responda uma coisa, esse código você está executando diretamente pelo Javascript? Pois no JS o comando para dar o “get” muda, ele passa a ser nomeCliente = dataset.getValue[i].A1_NOME;
Faça esse teste por favor.

Estou colocando o codigo completo para copiar e colar logo abaixo na resposta.

Porque não pode ser um código só? Um método só? Para a mesma pergunta há várias respostas diferentes…

Isso fica muito confuso.

Bom dia, Matheus.

Ao invés de usar "dataset.getValue", tente usar isso:


var campo =  dataset.values[i]["nome_do_campo"];

Essa propriedade "Values" do dataset, recupera todas as linhas dele e nesse caso, está pegando linha por linha (dentro do for com chave i) e trazendo a coluna desejada.

Além disso, outro detalhe que reparei é que você está colocando constraints, sorting fields e return fields, porém pelo o que entendi, esse dataset é customizado e, por ser customizado, para realizar com sucesso esses "filtros", precisa ser desenvolvido a leitura desses dados na criação do dataset (Documentação). Caso esse seja um dataset "Interno", não tem problema realizar os "filtros".

Espero ter ajudado.

Att., Matheus

Matheus, será que é tão difícil assim criar só um método?

Já vi três métodos pra fazer a mesma coisa:

  1. O que eu fiz no código
  2. O que foi passado no comentário da minha pergunta;
  3. O código que você passou.

Tá vendo o quanto isso é confuso?

Realmente isso é bem confuso, no começo penei pra pegar todas essas coisas. Esse método de pegar o campo no dataset funciona para eventos de formulário e para criação de datasets, com o tempo você pega isso.

Funcionou perfeitamente o código que você passou. Valeu Matheus!

Magina, se possível marcar essa reposta como solução.

Matheus o x da questão é que se voce está fazendo por dataset esse filtro, ele entende de um jeito, ja se voce está fazendo por JS ele entende de outro. Mas o importante que agora voce tem as duas maneiras :wink:

Quais são “os dois jeitos”?
Tem isso na documentação?
Quando eu uso um e quando eu uso o outro?
E mais: será possível criar um jeito só?

Os dois jeitos sao “dataset.getValue(i,“campo”);” e “dataset.values[i][“campo”];”. O primeiro serve para eventos de formulário e criação de datasets e o segundo serve para o javascript do formulário.

Matheus Felipe,

Por gentileza tente utilizar o código abaixo:


var c1 = DatasetFactory.createConstraint("A1_CGC", cgcCliente, cgcCliente, ConstraintType.MUST);

var constraints = new Array(c1);
var sortingFields = new Array("A1_CGC");
var returnFields = new Array("A1_NOME", "A1_COD", "A1_LOJA");
var dataset = DatasetFactory.getDataset("SA1100", returnFields, constraints, sortingFields);

for(var i = 0; i < dataset.values.length; i++) {
   nomeCliente = dataset.getValue[i].A1_NOME;
   codigoCliente = dataset.getValue[i].A1_COD;
   lojaCliente = dataset.getValue[i].A1_LOJA;
}

Apenas lembrando o que o colega Matheus postou na resposta acima, não se esqueça de adicionar a biblioteca ao seu HTML:


<script type="text/javascript" src="/webdesk/vcXMLRPC.js"></script>

Retorno: TypeError: dataset.getValue is undefined, can’t access property 0 of it

No final, o código que funcionou foi:


var c1 = DatasetFactory.createConstraint("A1_CGC", cgcCliente, cgcCliente, ConstraintType.MUST);
var constraints = new Array(c1);

var sortingFields = new Array("A1_CGC");
var returnFields = new Array("A1_NOME", "A1_COD", "A1_LOJA");

var dataset = DatasetFactory.getDataset("SA1100", returnFields, constraints, sortingFields);

for(var i = 0; i < dataset.values.length; i++) {

   nomeCliente = dataset.values[i]["A1_NOME"];
   codigoCliente = dataset.values[i]["A1_COD"];
   lojaCliente = dataset.values[i]["A1_LOJA"];   

}

Obrigado, xará!