Loletar dados de usuário usando multi database Bom dia a Todos! Me deparei com uma situação que não consegui resolver mesmo aqui no forum! No sistema que estou desenvolvendo em multidatabase, uma das tabelas deve coletar os dados de usuario, uma agregação. A questão é que como transaction do unit_database aberta, os dados po permission não podem ser coletados, então no get_usuario abri uma outra transação, mas infelizmente, quan...
RT
Loletar dados de usuário usando multi database  
Bom dia a Todos!
Me deparei com uma situação que não consegui resolver mesmo aqui no forum!
No sistema que estou desenvolvendo em multidatabase, uma das tabelas deve coletar os dados de usuario, uma agregação.
A questão é que como transaction do unit_database aberta, os dados po permission não podem ser coletados, então no get_usuario abri uma outra transação, mas infelizmente, quando faço isso, não consigo mais continuar na unit_database, mesmo fechando a transação com a base de permission.
Neste caso, como seria o procedimento correto?

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)


NR

O que você quer dizer com "não consigo mais continuar na unit_database"?

Aparece alguma mensagem?
RT

Obrigado pelo interesse Nataniel!

No modelo de fluxo (Fluxo.php), há um get_usuario, que busca as informações do usuário que gerou o registro.
Já no controller de listagem do fluxo, este get entra em ação e coleta os dados trocando da base de dados da "unit_database" (estou usando multi database), para "permissions".
Ocorre que quando eu abro a nova transaction, a anterior, para de funcionar e a listagem é interrompida logo na primeira linha de coleta (claro, mudei a transação).
Me mesmo tentando reativar, não carrega mais e tenho que recarregar o FormList.

Sei que estou errando no metoodo de coleta destes dados no outro banco de dados, mas não consegui encontrar a informação para fazer da forma correta.
Para facilitar, irei postar os dois codigos:

Fluxo - Classe de modelo, get_usuario, no final do codigo:
 
  1. <?php
  2. /**
  3. * Fluxo Active Record
  4. * @author <your-name-here>
  5. */
  6. class Fluxo extends TRecord
  7. {
  8. const TABLENAME = 'fluxo';
  9. const PRIMARYKEY= 'id';
  10. const IDPOLICY = 'serial'; // {max, serial}
  11. private $system_user;
  12. private $grupo_pagamento;
  13. private $contas_empresa;
  14. private $usuario;
  15. private $origem;
  16. /**
  17. * Constructor method
  18. */
  19. public function __construct($id = NULL, $callObjectLoad = TRUE)
  20. {
  21. parent::__construct($id, $callObjectLoad);
  22. parent::addAttribute('data_lancamento');
  23. parent::addAttribute('valor');
  24. parent::addAttribute('debito_credito');
  25. parent::addAttribute('descritivo');
  26. parent::addAttribute('documento_pagador');
  27. parent::addAttribute('id_usuario');
  28. parent::addAttribute('forma_pagamento');
  29. parent::addAttribute('conta_empresa');
  30. parent::addAttribute('saldo_anterior');
  31. parent::addAttribute('id_conta_origem');
  32. }
  33. public function set_grupo(GrupoPagamento $object)
  34. {
  35. $this->grupo = $object;
  36. $this->grupo_pagamento = $object->id;
  37. }
  38. public function get_grupo()
  39. {
  40. // loads the associated object
  41. if (empty($this->id_grupo))
  42. $this->grupo = new GrupoPagamento($this->forma_pagamento);
  43. if (is_null($this->grupo->nome)){
  44. $this->grupo->nome = 'Op. interna';
  45. }
  46. // returns the associated object
  47. return $this->grupo;
  48. }
  49. public function set_conta(ContasEmpresa $object)
  50. {
  51. $this->conta = $object;
  52. $this->conta_empresa = $object->id;
  53. }
  54. public function get_conta()
  55. {
  56. // loads the associated object
  57. if (empty($this->id_conta))
  58. $this->conta = new ContasEmpresa($this->conta_empresa);
  59. // returns the associated object
  60. return $this->conta;
  61. }
  62. public function get_saldo()
  63. {
  64. $saldo_final = $this->saldo_anterior + $this->valor;
  65. return $saldo_final;
  66. }
  67. public function set_origem(Pagar $object)
  68. {
  69. $this->origem = $object;
  70. $this->id_conta_origem = $object->id;
  71. }
  72. public function get_origem()
  73. {
  74. if (!empty($this->id_conta_origem))
  75. $this->origem = new Pagar($this->id_conta_origem);
  76. return $this->origem;
  77. }
  78. public function set_usuario(SystemUser $object)
  79. {
  80. //TTransaction::open('permission');
  81. $this->usuario = $object;
  82. $this->id_usuario = $object->id;
  83. //TTransaction::close;
  84. //TTransaction::open('unit_database');
  85. }
  86. public function get_usuario()
  87. {
  88. TTransaction::open('permission');
  89. if (!empty($this->id_usuario))
  90. $this->usuario = new SystemUser($this->id_usuario);
  91. return $this->usuario;
  92. TTransaction::close;
  93. TTransaction::open('unit_database');
  94. }
  95. }
  96. </code>

Listagem do Fluxo (somente exibindo os registros

 
  1. <?php
  2. /**
  3. * FluxoList Listing
  4. * @author <your name here>
  5. */
  6. class FluxoList extends TPage
  7. {
  8. protected $form; // registration form
  9. protected $datagrid; // listing
  10. protected $pageNavigation;
  11. protected $formgrid;
  12. protected $deleteButton;
  13. protected $util;
  14. protected $object;
  15. use Adianti\base\AdiantiStandardListTrait;
  16. /**
  17. * Page constructor
  18. */
  19. use SystemChangeLogTrait;
  20. public function __construct()
  21. {
  22. parent::__construct();
  23. $this->util = new Util;
  24. $this->setDatabase('unit_database'); // defines the database
  25. $this->setActiveRecord('Fluxo'); // defines the active record
  26. $this->setDefaultOrder('id', 'asc'); // defines the default order
  27. $this->setLimit(10);
  28. // $this->setCriteria($criteria) // define a standard filter
  29. $this->addFilterField('id', '=', 'id'); // filterField, operator, formField
  30. $this->addFilterField('data_lancamento', '>=', 'data_ini'); // filterField, operator, formField
  31. $this->addFilterField('data_lancamento', '<=', 'data_fim'); // filterField, operator, formField
  32. $this->addFilterField('valor', '=', 'valor'); // filterField, operator, formField
  33. $this->addFilterField('debito_credito', '=', 'debito_credito'); // filterField, operator, formField
  34. $this->addFilterField('documento_pagador', '=', 'documento_pagador'); // filterField, operator, formField
  35. $this->addFilterField('forma_pagamento', '=', 'forma_pagamento'); // filterField, operator, formField
  36. $this->addFilterField('conta_empresa', '=', 'conta_empresa'); // filterField, operator, formField
  37. // creates the form
  38. $this->form = new BootstrapFormBuilder('form_search_Fluxo');
  39. $this->form->setFormTitle('Fluxo de caixa - movimento de conta(s) ');
  40. // create the form fields
  41. $id = new TEntry('id');
  42. $data_ini = new TDate('data_ini');
  43. $data_fim = new TDate('data_fim');
  44. $valor = new TEntry('valor');
  45. $debito_credito = new TCombo('debito_credito');
  46. $documento_pagador = new TEntry('documento_pagador');
  47. $forma_pagamento = new TDBCombo('forma_pagamento', 'unit_database', 'GrupoPagamento', 'id', 'nome');
  48. $conta_empresa = new TDBCombo('conta_empresa', 'unit_database', 'ContasEmpresa', 'id', '{agencia} - {n_conta} - {banco}');
  49. $conta_empresa->setDefaultOption(false);
  50. // add the fields
  51. //$this->form->addFields( [ new TLabel('Id') ], [ $id ] );
  52. $row = $this->form->addFields(
  53. [ new TLabel('Conta para consulta:') , $conta_empresa ]
  54. );
  55. $row->layout = ['col-md-12'];
  56. $row = $this->form->addFields(
  57. [ new TLabel('Lançamentos entre:') , $data_ini ],
  58. [ new TLabel('Lançamentos até:') , $data_fim ],
  59. [ new TLabel('Tipo de lançamentos:') , $debito_credito ],
  60. [ new TLabel('Pesquisar por valor:') , $valor ]
  61. );
  62. $row->layout = ['col-sm-6 col-md-3','col-sm-6 col-md-3','col-sm-6 col-md-3','col-sm-6 col-md-3' ];
  63. $row = $this->form->addFields(
  64. [ new TLabel('Documento Pagador:') , $documento_pagador ],
  65. [ new TLabel('Forma de Pagamento:') , $forma_pagamento ]
  66. );
  67. $row->layout = ['col-sm-6 col-md-6','col-sm-6 col-md-6'];
  68. // set sizes
  69. $this->form->setFieldSizes('100%');
  70. $debito_credito->addItems(
  71. ['D'=>'Débito',
  72. 'C'=>'Cédito']
  73. );
  74. $data_ini->setMask('dd/mm/yyyy');
  75. $data_ini->setDatabaseMask('yyyy-mm-dd');
  76. $data_fim->setMask('dd/mm/yyyy');
  77. $data_fim->setDatabaseMask('yyyy-mm-dd');
  78. // keep the form filled during navigation with session data
  79. $this->form->setData( TSession::getValue(__CLASS__.'_filter_data') );
  80. // add the search form actions
  81. $btn = $this->form->addAction(_t('Find'), new TAction([$this, 'onSearch']), 'fa:search');
  82. $btn->class = 'btn btn-sm btn-primary';
  83. //$this->form->addActionLink(_t('New'), new TAction(['FluxoForm', 'onEdit']), 'fa:plus green');
  84. $this->form->addAction('Limpar', new TAction( [$this, 'clear'] ), 'fa:eraser red');
  85. // creates a Datagrid
  86. $this->datagrid = new BootstrapDatagridWrapper(new TDataGrid);
  87. $this->datagrid->style = 'width: 100%';
  88. //$this->datagrid->style = 'min-width: 1250px';
  89. $this->datagrid->datatable = 'true';
  90. //$dataLancamento = $this->util->getDateTimeMaskBR($object->data_pagamento);
  91. // creates the datagrid columns
  92. $column_id = new TDataGridColumn('id', 'Id', 'right','8%');
  93. $column_saldo_anterior = new TDataGridColumn('saldo_anterior', 'S/anterior', 'right','10%');
  94. $column_data_lancamento = new TDataGridColumn('data_lancamento', 'Lançamento', 'center','15%');
  95. $column_valor = new TDataGridColumn('valor', 'Valor', 'right','10%');
  96. $column_debito_credito = new TDataGridColumn('debito_credito', 'D/C', 'center','5%');
  97. $column_descritivo = new TDataGridColumn('descritivo', 'Descritivo', 'left','20%');
  98. $column_documento_pagador = new TDataGridColumn('documento_pagador', 'Documento','center','10%');
  99. $column_forma_pagamento = new TDataGridColumn('{grupo->nome}', 'Pagamento', 'left');
  100. $column_conta_empresa = new TDataGridColumn('{conta->n_conta}', 'Conta', 'left','10%');
  101. $column_saldo = new TDataGridColumn('saldo', 'Saldo', 'right','10%');
  102. //$column_origem = new TDataGridColumn('{origem->pessoa->fantasia}', 'Origem', 'left');
  103. //Aqui ocorre o erro, então comentei a linha
  104. $column_usuario = new TDataGridColumn('{usuario->name}', 'Usuário', 'left');
  105. // add the columns to the DataGrid
  106. $this->datagrid->addColumn($column_id,);
  107. $this->datagrid->addColumn($column_conta_empresa);
  108. $this->datagrid->addColumn($column_data_lancamento);
  109. $this->datagrid->addColumn($column_saldo_anterior);
  110. $this->datagrid->addColumn($column_debito_credito);
  111. $this->datagrid->addColumn($column_valor);
  112. $this->datagrid->addColumn($column_saldo);
  113. $this->datagrid->addColumn($column_descritivo);
  114. $this->datagrid->addColumn($column_documento_pagador);
  115. $this->datagrid->addColumn($column_forma_pagamento);
  116. //$this->datagrid->addColumn($column_origem);
  117. // a exibição da coluna
  118. $this->datagrid->addColumn($column_usuario);
  119. // define the transformer method over image
  120. $column_debito_credito->setTransformer( function($value, $object, $row )
  121. {
  122. $div = new TElement('span');
  123. $div->add($value);
  124. if ($value == 'D')
  125. {
  126. $div->style = 'color: red';
  127. }
  128. else{
  129. $div->style = 'color:blue';
  130. }
  131. return $div;
  132. });
  133. $column_valor->setTransformer( function($value, $object, $row )
  134. {
  135. if (is_numeric($value))
  136. {
  137. $div = new TElement('span');
  138. $div->add($this->util->getMoneyMask($value));
  139. return $div;
  140. }
  141. }
  142. );
  143. $column_saldo_anterior->setTransformer( function($value, $object, $row) {
  144. if (is_numeric($value))
  145. {
  146. if ($value >0)
  147. {
  148. $div = new TElement('span');
  149. $div->style = 'color: blue;';
  150. }
  151. if ($value < 0)
  152. {
  153. $div = new TElement('span');
  154. $div->style = 'color: red;';
  155. }
  156. if ($value == 0)
  157. {
  158. $div = new TElement('span');
  159. }
  160. $div->add($this->util->getMoneyMask($value));
  161. return $div;
  162. }
  163. });
  164. $column_saldo->setTransformer( function($value, $object, $row) {
  165. if (is_numeric($value))
  166. {
  167. if ($value >0)
  168. {
  169. $div = new TElement('span');
  170. $div->style = 'color: blue;';
  171. }
  172. if ($value < 0)
  173. {
  174. $div = new TElement('span');
  175. $div->style = 'color: red;';
  176. }
  177. if ($value == 0)
  178. {
  179. $div = new TElement('span');
  180. }
  181. $div->add($this->util->getMoneyMask($value));
  182. return $div;
  183. }
  184. });
  185. // define the transformer method over image
  186. $column_data_lancamento->setTransformer( function($value, $object, $row) {
  187. if ($value)
  188. {
  189. try
  190. {
  191. $date = new DateTime($value);
  192. return $date->format('d/m/Y - H:i');
  193. }
  194. catch (Exception $e)
  195. {
  196. return $value;
  197. }
  198. }
  199. return $value;
  200. });
  201. // creates the datagrid column actions
  202. $column_data_lancamento->setAction(new TAction([$this, 'onReload']), ['order' => 'data_lancamento']);
  203. $column_valor->setAction(new TAction([$this, 'onReload']), ['order' => 'valor']);
  204. $column_debito_credito->setAction(new TAction([$this, 'onReload']), ['order' => 'debito_credito']);
  205. $column_forma_pagamento->setAction(new TAction([$this, 'onReload']), ['order' => 'forma_pagamento']);
  206. //$action1 = new TDataGridAction(['FluxoForm', 'onEdit'], ['id'=>'{id}']);
  207. //$action2 = new TDataGridAction([$this, 'onDelete'], ['id'=>'{id}']);
  208. //$this->datagrid->addAction($action1, _t('Edit'), 'far:edit blue');
  209. // $this->datagrid->addAction($action2 ,_t('Delete'), 'far:trash-alt red');
  210. // create the datagrid model
  211. $this->datagrid->createModel();
  212. // creates the page navigation
  213. $this->pageNavigation = new TPageNavigation;
  214. $this->pageNavigation->setAction(new TAction([$this, 'onReload']));
  215. $panel = new TPanelGroup('Dados da conta consultada:', 'white');
  216. $dados_conta = new TTextDisplay($this->getContaInfo(), 'default');
  217. $ddos_conta->style = 'width:100%';
  218. $panel->add($dados_conta);
  219. $panel->add($this->datagrid);
  220. //$panel->getBody()->style = 'overflow-x:auto';
  221. $panel->addFooter($this->pageNavigation);
  222. // header actions
  223. $dropdown = new TDropDown(_t('Export'), 'fa:list');
  224. $dropdown->setPullSide('right');
  225. $dropdown->setButtonClass('btn btn-default waves-effect dropdown-toggle');
  226. $dropdown->addAction( _t('Save as CSV'), new TAction([$this, 'onExportCSV'], ['register_state' => 'false', 'static'=>'1']), 'fa:table blue' );
  227. $dropdown->addAction( _t('Save as PDF'), new TAction([$this, 'onExportPDF'], ['register_state' => 'false', 'static'=>'1']), 'far:file-pdf red' );
  228. $panel->addHeaderWidget( $dropdown );
  229. //var_dump(TSession::getValue(__CLASS__ . '_filter_data'));
  230. // vertical box container
  231. $container = new TVBox;
  232. $container->style = 'width: 100%';
  233. $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  234. $container->add($this->form);
  235. $container->add($panel);
  236. parent::add($container);
  237. }
  238. public function clear()
  239. {
  240. $this->clearFilters();
  241. $this->onReload();
  242. }
  243. public function getContaInfo()
  244. {
  245. if (TSession::getValue(__CLASS__ . '_filter_data'))
  246. {
  247. $dataConta = TSession::getValue(__CLASS__ . '_filter_data');
  248. TTransaction::open('unit_database');
  249. $Conta = new ContasEmpresa($dataConta->conta_empresa);
  250. $telefoneBanco = $this->util->getFoneMask($Conta->telefone);
  251. $saldo_final = $this->util->getMoneyMask($Conta->saldo_final);
  252. $card = new TCardView;
  253. $infoCard = (object) [ 'title' =>'<p><b style="margin-right: 10px;">Conta: </b>'. $Conta->n_conta.'<b style="margin-right: 10px; margin-left: 10px;"> Agência:</b>'.$Conta->agencia.'</p>',
  254. 'banco' => '<p class="label label-success"style="width:100%; line-height: 22px; display:block;">'.$Conta->banco.'</p>',
  255. 'gerente'=>'<p style="line-height: 8px;"><b>Gerente: </b>'.$Conta->gerente.'</p>',
  256. 'telefone'=> '<p style="line-height: 8px;"><b>Telefone: </b>'.$telefoneBanco.' <b>Ramal:</b> '. $Conta->ramal.'</p>',
  257. 'saldo'=> '<p style="line-height: 8px;"><b>Saldo atual na conta:</b></p>',
  258. 'valor_saldo'=> '<p style="line-height: 8px;"> <label class="label label-success text-right" style="width:100%;">'.$saldo_final.'</label></p>',
  259. 'color' => '#57D557'
  260. ];
  261. $card->addItem($infoCard);
  262. $card->setTitleAttribute('title');
  263. $card->setColorAttribute('color');
  264. $card->setItemTemplate(
  265. '{banco}
  266. {gerente}
  267. {telefone}
  268. {saldo}
  269. {valor_saldo}'
  270. );
  271. TTransaction::close();
  272. return $card;
  273. } // se tem registro da sessão
  274. }
  275. public function getExtendInfoForPopover()
  276. {
  277. }
  278. }
  279. </code>
</your>