RL
Filtro de campo BIT
Bom dia. Estou com um problema para filtrar um campo do tipo BIT.
Abaixo está a estrutura do TRecord (Cliente.class.php):
Os campos: FG_EX_CLIENTE, FG_BLOQUEADO e ST_ATIVO são campos do tipo BIT no banco MS SQL, como mostrado abaixo:
Abaixo segue o código da listagem do tipo TPage (ClienteList.class.php) apenas onde estão os campos de busca:
Anexo estou enviando uma imagem do print da tela que mostra como ficou o campo de busca.
Quando seleciono SIM, a busca funciona corretamente trazendo apenas os campos com valor "1" do banco. Porém quando seleciono NÃO a busca trás todos os registros independente do valor.
Eu já verifiquei o resultado do campo de busca e os valores enviados para o método addFilterField() estão corretos. Não estou conseguindo avançar desse ponto por isso peço a ajuda de vocês.
Obrigado.
Abaixo está a estrutura do TRecord (Cliente.class.php):
- <?php
- public function __construct($id = NULL, $callObjectLoad = TRUE)
- {
- parent::__construct($id, $callObjectLoad);
- parent::addAttribute('id_revenda') ; // Id da Revenda
- parent::addAttribute('id_mercado') ; // Id do Tipo de mercado
- parent::addAttribute('id_pconta') ; // Id do Plano de conta
- parent::addAttribute('id_ender_cob') ; // Id do Endereço de cobrança
- parent::addAttribute('id_ender_ent') ; // Id do Endereço de entrega
- parent::addAttribute('id_vendedor') ; // Id do vendedor
- parent::addAttribute('vl_credito_limt'); // Valor do limite de crédito
- parent::addAttribute('vl_credito_disp'); // Valor do crédito disponível
- parent::addAttribute('nm_email') ; // E-mail de contato
- parent::addAttribute('fg_ex_cliente') ; // Se é um ex-cliente ou não
- parent::addAttribute('fg_bloqueado') ; // Se o cliente está bloqueado para compra
- parent::addAttribute('dt_serasa') ; // Data de consulta no SERASA
- parent::addAttribute('nr_lat') ; // Número da latitude (para mapeamento/rota)
- parent::addAttribute('nr_lgt') ; // Número da longitude (para mapeamento/rota)
- parent::addAttribute('st_ativo') ; // Se o cliente está ativo ou não
- parent::addAttribute('nm_login') ; // Nome do login
- parent::addAttribute('dt_upd') ; // Data da última alteração
- }
- ?>
Os campos: FG_EX_CLIENTE, FG_BLOQUEADO e ST_ATIVO são campos do tipo BIT no banco MS SQL, como mostrado abaixo:
COLUNA TIPO
-------------------- ----------
id_cliente int
id_revenda int
id_mercado int
id_pconta int
id_ender_cob int
id_ender_ent int
id_vendedor int
vl_credito_limt decimal
vl_credito_disp decimal
nm_email varchar
fg_ex_cliente bit
fg_bloqueado bit
dt_serasa date
nr_lat float
nr_lgt float
st_ativo bit
nm_login varchar
dt_upd datetime2
(18 rows affected)
Abaixo segue o código da listagem do tipo TPage (ClienteList.class.php) apenas onde estão os campos de busca:
- <?php
- public function __construct()
- {
- parent::__construct();
- $criteria = TCriteria::create(['id_revenda'=> TSession::getValue('id_revenda')]);
- $this->setDatabase('base');
- $this->setActiveRecord('Cliente');
- $this->setDefaultOrder('id_cliente', 'asc');
- $this->setCriteria($criteria);
- $this->addFilterField('id_cliente' , '=');
- $this->addFilterField('id_mercado' , '=');
- $this->addFilterField('id_vendedor' , '=');
- $this->addFilterField('fg_ex_cliente', '=');
- $this->addFilterField('fg_bloqueado' , '=');
- $this->addFilterField('st_ativo' , '=');
- // creates the form
- $this->form = new BootstrapFormBuilder('form_Cliente');
- $this->form->setFormTitle('Cliente');
- // create the form fields
- $id_cliente = new TDBUniqueSearch('id_cliente', 'base', 'Cliente' , 'id_cliente' , 'id_revenda' );
- $id_mercado = new TDBCombo('id_mercado' , 'base', 'Mercado' , 'id_mercado' , 'nm_mercado' );
- $id_vendedor = new TDBCombo('id_vendedor' , 'base', 'Vendedor' , 'id_vendedor' , 'id_vendedor');
- $fg_ex_cliente = new TCombo('fg_ex_cliente');
- $fg_bloqueado = new TCombo('fg_bloqueado' );
- $st_ativo = new TCombo('st_ativo' );
- $fg_ex_cliente->addItems(CM_Vetores::SimNao());
- $fg_bloqueado-> addItems(CM_Vetores::SimNao());
- $st_ativo-> addItems(CM_Vetores::SimNao());
- // add the fields
- $this->form->addFields([ new TLabel('Cliente') ], [ $id_cliente ], [ new TLabel('Ex-Cliente')], [ $fg_ex_cliente]);
- $this->form->addFields([ new TLabel('Mercado') ], [ $id_mercado ], [ new TLabel('Bloqueado') ], [ $fg_bloqueado ]);
- $this->form->addFields([ new TLabel('Vendedor')], [ $id_vendedor], [ new TLabel('Ativo') ], [ $st_ativo ]);
- // keep the form filled during navigation with session data
- $this->form->setData( TSession::getValue('Cliente_filter_data') );
- ?>
Anexo estou enviando uma imagem do print da tela que mostra como ficou o campo de busca.
Quando seleciono SIM, a busca funciona corretamente trazendo apenas os campos com valor "1" do banco. Porém quando seleciono NÃO a busca trás todos os registros independente do valor.
Eu já verifiquei o resultado do campo de busca e os valores enviados para o método addFilterField() estão corretos. Não estou conseguindo avançar desse ponto por isso peço a ajuda de vocês.
Obrigado.
Quando o valor de um campo é = 0 pode acontecer de ser interpretado como nulo ou vazio em alguns ifs e talvez por isso a busca esteja trazendo todos os resultados. Veja a função setBooleanMode da classe TCombo, ela pode ser útil nesse caso pois substitui internamente os valores 0 e 1 por 1 e 2 na hora do post.
Bom dia Nataniel. Obrigado pela dica!
Eu acabei mudando o armazenamento no banco para TINYINT e esto alterei as funções da minha biblioteca. Agora além de usar minha biblioteca eu também consigo usar o método setBooleanMode.
Abs,