Tenho uma tabela filha onde preciso pedir 2 campos:
- Estado
- Cidade
Os dois campos tenho um dataset customizado pegando em um banco externo. No formulário usando um select para em formato de combo selecionar.
Porém após informado o estado eu preciso filtrar as cidades apenas daquele estado.
Como fazer? Tentei colocar o onchange no campo porém o mesmo não está executando.
Abraços
Eu passei por uma situação parecida. Para fazer essa seleção de estado e cidade acabei optando por usar um zoomField (http://tdn.totvs.com/pages/releaseview.action?pageId=75270483#DesenvolvimentodeFormulários-Zoom).
Após carregar os campos de um zoom eu deixo o outro bloqueado e na function setSelectedZoomItem(selectedItem) eu utilizei o método reloadZoomFilterValues que recarrega os valores de um zoomField criando o filtro assim no dataSet de cidade.
function setSelectedZoomItem(selectedItem) {
if(selectedItem.inputName == "estado") {
reloadZoomFilterValues("cidade", "idUf," + selectedItem.id);
}
}
O método setSelectedZoomItem é executando sempre que trocado o valor de um zoomField.
O método reloadZoomFilterValues cria uma constraint para o campo passado ("idUf," + selectedItem.id), no dataset do zoomDestino ("cidade") e atualizando os valores do zoomField.
Exemplo de zoomField para cidade consultando do dataset dsCidades trazendo o nome da cidade como resultado:
<div class="form-group">
<label class="label-fields" for="tipo">Cidade</label>
<div class="input-group">
<input type="zoom" class="form-control" name="cidade" id="cidade"
data-zoom="{'displayKey':'nome','datasetId':'dsCidades','fields':[
{'field':'nome','label':'Cidade','standard': 'true', 'search':'true'}
]}">
<div class="input-group-addon zoom-preview">
<span class="fluigicon fluigicon-zoom-in"></span>
</div>
</div>
</div>
EDIT: código DataSet: No código eu crio um SQL e monsto os filtros para esse SQL com as constraints passadas.
A constraint nome filtra quando é digitado algo no ZoomField.
A constraint idUf é o filtro de estado.
function getSQL(constraints) {
var filtro = "";
if (constraints != null) {
for (var i = 0; i < constraints.length; i++) {
if (constraints[i].fieldName == "nome") {
filtro += " and descricao like UPPER('%" +constraints[i].initialValue + "%')";
}
if (constraints[i].fieldName == "idUf" && constraints[i].initialValue && constraints[i].initialValue != "") {
filtro += " and idUnidadeFederativa = " + constraints[i].initialValue;
}
}
}
return ' select idUnidadeFederativa, idCidade, descricao'+
' from cidade'+
' where idnAtivo = 1'+
filtro +
' order by descricao';
}
Como você montou no dataset para ler a constraint?
Adicionei um exeplo de como monto o SQL de acordo com as contraints do ZoomField
Gulherme muito obrigado desde já, no cabeçalho da solicitação funcionou 100%. Porém quando utilizo ao adicionar um item (tabela filha do formulário) ele não está filtrando, acredito que não esteja rodando o setSelectedZoomItem. Chegou a testar em uma tabela filha?
Cheguei sim, esqueci de falar, a função setSelectedZoomItem vai no seu JavaScript. Você está criando o zoom dinamicamente?
Está dentro do HTML do formulário mesmo e coloquei no JavaScript do HTML também. No cabeçalho funciona, porém na tabela filha (pois serão vários itens) não roda. Veja:
function setSelectedZoomItem(selectedItem) {
if(selectedItem.inputName == "comUFOrigem") {
reloadZoomFilterValues("comCidOrigem", "CODETDMUNICIPIO," + selectedItem.CODETD);
}
}
</script>
No caso em que precisei usar eu não criei o componente dinamicamente, deixei ele estático. Entendi errado sua pergunta de antes, não cheguei a testar em uma tabela filha.
Guilherme achei o problema! Erro meu. No item o Fluig adiciona o número do item no nome do componente, exemplo “comCidade__1”, então precisei tratar antes. Mas ficou TOP!