RC
Criteria não gera o filtro correto com o operador IN
Bom dia,
Esta acontecendo o seguinte problema:
SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$2" LINE 1: ...OM socio WHERE (ativo = $1 AND cargo_funcao_id in $2 AND sex... ^
Verifiquei que a sql não foi corretamente gerada:
SELECT id, sexo_id, cargo_funcao_id, estado_civil_id, nome, cpf, rg, matricula, ade, email, data_nascimento, cadastrado, pai, mae, data_admissao, foto, ativo, cidade_nascimento, departamento, revisado FROM socio WHERE (ativo = '1' AND cargo_funcao_id in '2,11,14,1' AND sexo_id in '2,1' AND estado_civil_id in '2,6')
O problema é nos filtro com operador IN, como pode se ver na sql acima: cargo_funcao_id in '2,11,14,1' AND sexo_id in '2,1' AND estado_civil_id in '2,6'
O correto seria ficar assim: cargo_funcao_id in (2,11,14,1) AND sexo_id in (2,1) AND estado_civil_id in (2,6)
Peço ajuda e agradeço!!!
Segue abaixo a classe de controle:
Esta acontecendo o seguinte problema:
SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$2" LINE 1: ...OM socio WHERE (ativo = $1 AND cargo_funcao_id in $2 AND sex... ^
Verifiquei que a sql não foi corretamente gerada:
SELECT id, sexo_id, cargo_funcao_id, estado_civil_id, nome, cpf, rg, matricula, ade, email, data_nascimento, cadastrado, pai, mae, data_admissao, foto, ativo, cidade_nascimento, departamento, revisado FROM socio WHERE (ativo = '1' AND cargo_funcao_id in '2,11,14,1' AND sexo_id in '2,1' AND estado_civil_id in '2,6')
O problema é nos filtro com operador IN, como pode se ver na sql acima: cargo_funcao_id in '2,11,14,1' AND sexo_id in '2,1' AND estado_civil_id in '2,6'
O correto seria ficar assim: cargo_funcao_id in (2,11,14,1) AND sexo_id in (2,1) AND estado_civil_id in (2,6)
Peço ajuda e agradeço!!!
Segue abaixo a classe de controle:
- <?php
- <?php
- class EmailMarketingForm extends TPage
- {
- protected $form;
- private $formFields = [];
- private static $database = 'socium';
- private static $activeRecord = 'Socio';
- private static $primaryKey = 'id';
- private static $formName = 'form_Socio';
- /**
- * Form constructor
- * @param $param Request
- */
- public function __construct( $param )
- {
- parent::__construct();
- // creates the form
- $this->form = new BootstrapFormBuilder(self::$formName);
- // define the form title
- $this->form->setFormTitle("E-mail Marketing");
- $ativo = new TRadioGroup('ativo');
- $sexo_id = new TDBCheckGroup('sexo_id', 'socium', 'Sexo', 'id', '{descricao}','descricao asc' );
- $estado_civil_id = new TDBCheckGroup('estado_civil_id', 'socium', 'EstadoCivil', 'id', '{descricao}','descricao asc' );
- $cargo_funcao_id = new TDBSelect('cargo_funcao_id', 'socium', 'CargoFuncao', 'id', '{descricao}','descricao asc' );
- $email_assunto = new TEntry('email_assunto');
- $email_mensagem = new THtmlEditor('email_mensagem');
- $email_assunto->addValidation("Assunto do e-mail", new TRequiredValidator());
- $email_mensagem->addValidation("E-mail", new TRequiredValidator());
- $ativo->addItems(['1'=>'Ativo','0'=>'Inativo',''=>'Ambos']);
- $estado_civil_id->setBreakItems(3);
- $email_assunto->setMaxLength(200);
- $ativo->setLayout('horizontal');
- $sexo_id->setLayout('horizontal');
- $estado_civil_id->setLayout('horizontal');
- $ativo->setUseButton();
- $sexo_id->setUseButton();
- $estado_civil_id->setUseButton();
- $sexo_id->setValueSeparator(',');
- $estado_civil_id->setValueSeparator(',');
- $cargo_funcao_id->setValueSeparator(',');
- $ativo->setSize(90);
- $sexo_id->setSize(90);
- $estado_civil_id->setSize(90);
- $email_assunto->setSize('100%');
- $cargo_funcao_id->setSize(270, 130);
- $email_mensagem->setSize('100%', 600);
- //carrega o template de email
- $arquivo = 'app/resources/emailpadrao.html';
- if( is_file($arquivo) )
- {
- $email_mensagem->setValue( file_get_contents($arquivo) );
- }
- $row1 = $this->form->addFields([new TLabel("Situação:", null, '14px', null)],[$ativo],[new TLabel("Sexo:", null, '14px', null)],[$sexo_id]);
- $row2 = $this->form->addFields([new TLabel("Estado Civil:", null, '14px', null)],[$estado_civil_id],[new TLabel("Cargo/Função:", null, '14px', null)],[$cargo_funcao_id]);
- $row3 = $this->form->addContent([new TFormSeparator("", '#333333', '18', '#eeeeee')]);
- $row4 = $this->form->addFields([new TLabel("Assunto:", '#ff0000', '14px', null)],[$email_assunto]);
- $row5 = $this->form->addFields([new TLabel("E-mail:", '#ff0000', '14px', null)],[$email_mensagem]);
- // create the form actions
- $btn_onsave = $this->form->addAction("Enviar E-mail", new TAction([$this, 'onSave']), 'fas:mail-bulk #ffffff');
- $btn_onsave->addStyleClass('btn-warning');
- // vertical box container
- $container = new TVBox;
- $container->style = 'width: 100%';
- $container->class = 'form-container';
- $container->add(TBreadCrumb::create(["Sócios","E-mail Marketing"]));
- $container->add($this->form);
- parent::add($container);
- }
- public function onSave($param = null)
- {
- try
- {
- TTransaction::open(self::$database); // open a transaction
- TTransaction::dump();
- $messageAction = null;
- $this->form->validate(); // validate form data
- $data = $this->form->getData(); // get form data as array
- $this->form->setData($data); // fill form data
- //prepara os critérios de filtro
- $repository = new TRepository(self::$activeRecord);
- $criteria = new TCriteria;
- if (isset($data->ativo) AND ( (is_scalar($data->ativo) AND $data->ativo !== '') OR (is_array($data->ativo) AND (!empty($data->ativo)) )) )
- {
- $criteria->add( new TFilter('ativo', '=', $data->ativo) );
- }
- if (isset($data->cargo_funcao_id) AND ( (is_scalar($data->cargo_funcao_id) AND $data->cargo_funcao_id !== '') OR (is_array($data->cargo_funcao_id) AND (!empty($data->cargo_funcao_id)) )) )
- {
- $criteria->add( new TFilter('cargo_funcao_id', 'in', $data->cargo_funcao_id) );
- }
- if (isset($data->sexo_id) AND ( (is_scalar($data->sexo_id) AND $data->sexo_id !== '') OR (is_array($data->sexo_id) AND (!empty($data->sexo_id)) )) )
- {
- $criteria->add( new TFilter('sexo_id', 'in', $data->sexo_id) );
- }
- if (isset($data->estado_civil_id) AND ( (is_scalar($data->estado_civil_id) AND $data->estado_civil_id !== '') OR (is_array($data->estado_civil_id) AND (!empty($data->estado_civil_id)) )) )
- {
- $criteria->add( new TFilter('estado_civil_id', 'in', $data->estado_civil_id) );
- }
- Uteis::debug($criteria->dump());
- $socios = $repository->load($criteria, FALSE);
- Uteis::debug($socios);
- TTransaction::close(); // close the transaction
- /**
- // To define an action to be executed on the message close event:
- $messageAction = new TAction(['className', 'methodName']);
- **/
- new TMessage('info', AdiantiCoreTranslator::translate('Record saved'), $messageAction);
- }
- catch (Exception $e) // in case of exception
- {
- //</catchAutoCode>
- new TMessage('error', $e->getMessage()); // shows the exception error message
- $this->form->setData( $this->form->getData() ); // keep form data
- TTransaction::rollback(); // undo all pending operations
- }
- }
- public function onShow($param = null)
- {
- }
- }
- ?>
Verifica ai se $data->sexo_id esta chegando ai como array
Para o IN da certo ele tem q receber um array
Obrigado Leandro Coelho
funcionou perfeitamente.
Achei estranho o TDBCheckGroup e o TDBSelect não mandarem os dados em formato de array.