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_admis...
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:
 
  1. <?php
 
  1. <?php
  2. class EmailMarketingForm extends TPage
  3. {
  4. protected $form;
  5. private $formFields = [];
  6. private static $database = 'socium';
  7. private static $activeRecord = 'Socio';
  8. private static $primaryKey = 'id';
  9. private static $formName = 'form_Socio';
  10. /**
  11. * Form constructor
  12. * @param $param Request
  13. */
  14. public function __construct( $param )
  15. {
  16. parent::__construct();
  17. // creates the form
  18. $this->form = new BootstrapFormBuilder(self::$formName);
  19. // define the form title
  20. $this->form->setFormTitle("E-mail Marketing");
  21. $ativo = new TRadioGroup('ativo');
  22. $sexo_id = new TDBCheckGroup('sexo_id', 'socium', 'Sexo', 'id', '{descricao}','descricao asc' );
  23. $estado_civil_id = new TDBCheckGroup('estado_civil_id', 'socium', 'EstadoCivil', 'id', '{descricao}','descricao asc' );
  24. $cargo_funcao_id = new TDBSelect('cargo_funcao_id', 'socium', 'CargoFuncao', 'id', '{descricao}','descricao asc' );
  25. $email_assunto = new TEntry('email_assunto');
  26. $email_mensagem = new THtmlEditor('email_mensagem');
  27. $email_assunto->addValidation("Assunto do e-mail", new TRequiredValidator());
  28. $email_mensagem->addValidation("E-mail", new TRequiredValidator());
  29. $ativo->addItems(['1'=>'Ativo','0'=>'Inativo',''=>'Ambos']);
  30. $estado_civil_id->setBreakItems(3);
  31. $email_assunto->setMaxLength(200);
  32. $ativo->setLayout('horizontal');
  33. $sexo_id->setLayout('horizontal');
  34. $estado_civil_id->setLayout('horizontal');
  35. $ativo->setUseButton();
  36. $sexo_id->setUseButton();
  37. $estado_civil_id->setUseButton();
  38. $sexo_id->setValueSeparator(',');
  39. $estado_civil_id->setValueSeparator(',');
  40. $cargo_funcao_id->setValueSeparator(',');
  41. $ativo->setSize(90);
  42. $sexo_id->setSize(90);
  43. $estado_civil_id->setSize(90);
  44. $email_assunto->setSize('100%');
  45. $cargo_funcao_id->setSize(270, 130);
  46. $email_mensagem->setSize('100%', 600);
  47. //carrega o template de email
  48. $arquivo = 'app/resources/emailpadrao.html';
  49. if( is_file($arquivo) )
  50. {
  51. $email_mensagem->setValue( file_get_contents($arquivo) );
  52. }
  53. $row1 = $this->form->addFields([new TLabel("Situação:", null, '14px', null)],[$ativo],[new TLabel("Sexo:", null, '14px', null)],[$sexo_id]);
  54. $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]);
  55. $row3 = $this->form->addContent([new TFormSeparator("", '#333333', '18', '#eeeeee')]);
  56. $row4 = $this->form->addFields([new TLabel("Assunto:", '#ff0000', '14px', null)],[$email_assunto]);
  57. $row5 = $this->form->addFields([new TLabel("E-mail:", '#ff0000', '14px', null)],[$email_mensagem]);
  58. // create the form actions
  59. $btn_onsave = $this->form->addAction("Enviar E-mail", new TAction([$this, 'onSave']), 'fas:mail-bulk #ffffff');
  60. $btn_onsave->addStyleClass('btn-warning');
  61. // vertical box container
  62. $container = new TVBox;
  63. $container->style = 'width: 100%';
  64. $container->class = 'form-container';
  65. $container->add(TBreadCrumb::create(["Sócios","E-mail Marketing"]));
  66. $container->add($this->form);
  67. parent::add($container);
  68. }
  69. public function onSave($param = null)
  70. {
  71. try
  72. {
  73. TTransaction::open(self::$database); // open a transaction
  74. TTransaction::dump();
  75. $messageAction = null;
  76. $this->form->validate(); // validate form data
  77. $data = $this->form->getData(); // get form data as array
  78. $this->form->setData($data); // fill form data
  79. //prepara os critérios de filtro
  80. $repository = new TRepository(self::$activeRecord);
  81. $criteria = new TCriteria;
  82. if (isset($data->ativo) AND ( (is_scalar($data->ativo) AND $data->ativo !== '') OR (is_array($data->ativo) AND (!empty($data->ativo)) )) )
  83. {
  84. $criteria->add( new TFilter('ativo', '=', $data->ativo) );
  85. }
  86. 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)) )) )
  87. {
  88. $criteria->add( new TFilter('cargo_funcao_id', 'in', $data->cargo_funcao_id) );
  89. }
  90. 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)) )) )
  91. {
  92. $criteria->add( new TFilter('sexo_id', 'in', $data->sexo_id) );
  93. }
  94. 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)) )) )
  95. {
  96. $criteria->add( new TFilter('estado_civil_id', 'in', $data->estado_civil_id) );
  97. }
  98. Uteis::debug($criteria->dump());
  99. $socios = $repository->load($criteria, FALSE);
  100. Uteis::debug($socios);
  101. TTransaction::close(); // close the transaction
  102. /**
  103. // To define an action to be executed on the message close event:
  104. $messageAction = new TAction(['className', 'methodName']);
  105. **/
  106. new TMessage('info', AdiantiCoreTranslator::translate('Record saved'), $messageAction);
  107. }
  108. catch (Exception $e) // in case of exception
  109. {
  110. //</catchAutoCode>
  111. new TMessage('error', $e->getMessage()); // shows the exception error message
  112. $this->form->setData( $this->form->getData() ); // keep form data
  113. TTransaction::rollback(); // undo all pending operations
  114. }
  115. }
  116. public function onShow($param = null)
  117. {
  118. }
  119. }
  120. ?>

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (2)


LC

Verifica ai se $data->sexo_id esta chegando ai como array
Para o IN da certo ele tem q receber um array
RC

Obrigado Leandro Coelho
funcionou perfeitamente.
Achei estranho o TDBCheckGroup e o TDBSelect não mandarem os dados em formato de array.