Ordenar Datagrid(detail) do formulario Master/Detais Pessoal, Tenho um formulário mestre/detalhe onde o datagrid do detalhe tem uma coluna data e eu queria apresentar sempre ordenado por essa coluna, porém não consegui ordenar de forma alguma. Alguém teria um exemplo desse datagrid(detail) ordenado no formado do padrão do framework? Agradeço desde já toda a ajuda que for possível. ...
VC
Ordenar Datagrid(detail) do formulario Master/Detais  
Pessoal,

Tenho um formulário mestre/detalhe onde o datagrid do detalhe tem uma coluna data e eu queria apresentar sempre ordenado por essa coluna, porém não consegui ordenar de forma alguma.

Alguém teria um exemplo desse datagrid(detail) ordenado no formado do padrão do framework?

Agradeço desde já toda a ajuda que for possível.


 
  1. <?php
  2. /**
  3. * BzmViagemForm Master/Detail
  4. * @author <your name here>
  5. */
  6. class BzmViagemForm extends TPage
  7. {
  8. protected $form; // form
  9. protected $detail_list;
  10. /**
  11. * Page constructor
  12. */
  13. use Adianti\base\AdiantiFileSaveTrait;
  14. public function __construct()
  15. {
  16. parent::__construct();
  17. // creates the form
  18. $this->form = new BootstrapFormBuilder('form_BzmViagem');
  19. $this->form->setFormTitle('Cadastro de Viagens');
  20. // $this->form->setFieldSizes('100%');
  21. $this->form->generateAria(); // automatic aria-label
  22. $this->form->appendPage('Viagem');
  23. // master fields
  24. $ID_VIAGEM = new TEntry('ID_VIAGEM');
  25. $FK_ID_NAVIO = new TDBCombo('FK_ID_NAVIO', 'datasiop', 'navio', 'ID_NAVIO', 'NOME','NOME');
  26. $FK_ID_AGENTE = new TDBCombo('FK_ID_AGENTE', 'datasiop', 'BzmAgente', 'ID_AGENTE', 'NOME','NOME');
  27. $DATA_PREV_CHEGADA = new TDate('DATA_PREV_CHEGADA');
  28. $DATA_PREV_ATRACACAO = new TDate('DATA_PREV_ATRACACAO');
  29. $DATA_PREV_PARTIDA = new TDate('DATA_PREV_PARTIDA');
  30. $FK_ID_TIPO_OPERACAO = new TDBCombo('FK_ID_TIPO_OPERACAO', 'datasiop', 'BzmTipoOperacao', 'ID_TIPO_OPERACAO', 'DESCRICAO','DESCRICAO');
  31. $RESUMO_CARGA = new TEntry('RESUMO_CARGA');
  32. $BERCO = new TCombo('BERCO');
  33. $QTDE_MANIFESTO = new TEntry('QTDE_MANIFESTO');
  34. $PRANCHA = new TEntry('PRANCHA');
  35. $BORDO = new TCombo('BORDO');
  36. $IDC_GUINCHO_BORDO = new TCombo('IDC_GUINCHO_BORDO');
  37. $IDC_GRAB_BORDO = new TCombo('IDC_GRAB_BORDO');
  38. $IDC_STATUS = new TCombo('IDC_STATUS');
  39. $IDC_CONFIRMADO = new TCombo('IDC_CONFIRMADO');
  40. $IDC_CONFIRMADO->addItems(['S'=>'Sim','N'=>'Não']);
  41. $IDC_GRAB_BORDO->addItems(['S'=>'Sim','N'=>'Não']);
  42. $IDC_GUINCHO_BORDO->addItems(['S'=>'Sim','N'=>'Não']);
  43. $BERCO->addItems(['100'=>'100','101'=>'101','102'=>'102','103'=>'103','104'=>'104','105'=>'105','106'=>'106']);
  44. $BORDO->addItems(['B'=>'BOMBORDO','E'=>'ESTIBORDO','N'=>'NÃO DEFINIDO']);
  45. $IDC_STATUS->addItems(['E'=>'ESPERADO','A'=>'ATRACADO','F'=>'FINALIZADO','C'=>'CANCELADO']);
  46. $IDC_CONFIRMADO->enableSearch();
  47. $IDC_GRAB_BORDO->enableSearch();
  48. $IDC_GUINCHO_BORDO->enableSearch();
  49. $BERCO->enableSearch();
  50. $BORDO->enableSearch();
  51. $IDC_STATUS->enableSearch();
  52. $DATA_PREV_ATRACACAO->setmask('dd/mm/yyyy');
  53. $DATA_PREV_ATRACACAO->setdatabasemask('yyyy-mm-dd');
  54. $DATA_PREV_PARTIDA->setmask('dd/mm/yyyy');
  55. $DATA_PREV_PARTIDA->setdatabasemask('yyyy-mm-dd');
  56. $DATA_PREV_CHEGADA->setmask('dd/mm/yyyy');
  57. $DATA_PREV_CHEGADA->setdatabasemask('yyyy-mm-dd');
  58. $RESUMO_CARGA->forceUpperCase();
  59. $RESUMO_CARGA->setMaxLength(50);
  60. $PRANCHA->setMaxLength(3);
  61. $PRANCHA->setmask(000);
  62. $QTDE_MANIFESTO->setnumericmask(0,',','.',true);
  63. $FK_ID_NAVIO->addValidation('Navio:', new TRequiredValidator);
  64. $FK_ID_AGENTE->addValidation('Agente:', new TRequiredValidator);
  65. $IDC_STATUS->addValidation('Status:', new TRequiredValidator);
  66. $BERCO->addValidation('Berço:', new TRequiredValidator);
  67. $IDC_CONFIRMADO->addValidation('Confirmado:', new TRequiredValidator);
  68. $QTDE_MANIFESTO->addValidation('Qtde Manifesto:', new TRequiredValidator);
  69. $BORDO->addValidation('Bordo:', new TRequiredValidator);
  70. $PRANCHA->addValidation('Prancha:', new TRequiredValidator);
  71. $IDC_GUINCHO_BORDO->addValidation('Guincho Bordo', new TRequiredValidator);
  72. $IDC_GRAB_BORDO->addValidation('Grab Bordo:', new TRequiredValidator);
  73. $DATA_PREV_CHEGADA->addValidation('Data Prev Chegada:', new TRequiredValidator);
  74. $DATA_PREV_PARTIDA->addValidation('Data Prev Partida:', new TRequiredValidator);
  75. $FK_ID_TIPO_OPERACAO->addValidation('Tipo Operação:', new TRequiredValidator);
  76. $ID_VIAGEM->setSize('10%');
  77. $FK_ID_NAVIO->setSize('50%');
  78. $FK_ID_AGENTE->setSize('50%');
  79. $DATA_PREV_ATRACACAO->setSize('15%');
  80. $DATA_PREV_PARTIDA->setSize('15%');
  81. $DATA_PREV_CHEGADA->setSize('15%');
  82. $RESUMO_CARGA->setSize('20%');
  83. $IDC_STATUS->setSize('20%');
  84. $BERCO->setSize('10%');
  85. $IDC_CONFIRMADO->setSize('8%');
  86. $QTDE_MANIFESTO->setSize('15%');
  87. $BORDO->setSize('15%');
  88. $PRANCHA->setSize('5%');
  89. $IDC_GUINCHO_BORDO->setSize('8%');
  90. $IDC_GRAB_BORDO->setSize('8%');
  91. $FK_ID_TIPO_OPERACAO->setSize('20%');
  92. // detail fields
  93. $detail_uniqid = new THidden('detail_uniqid');
  94. $detail_ID_OCORRENCIA = new THidden('detail_ID_OCORRENCIA');
  95. $detail_id_tp_ocorrencia = new TDBCombo('detail_id_tp_ocorrencia', 'datasiop', 'tipo_ocorrencia', 'ID_TIPO_OCORRENCIA', 'DESCRICAO','DESCRICAO');
  96. $detail_DATA_OCORRENCIA = new TDate('detail_DATA_OCORRENCIA');
  97. $detail_HORA_INI = new TTime('detail_HORA_INI');
  98. $detail_HORA_FIM = new TTime('detail_HORA_FIM');
  99. $detail_DATA_OCORRENCIA->setmask('dd/mm/yyyy');
  100. $detail_DATA_OCORRENCIA->setdatabasemask('yyyy-mm-dd');
  101. if (!empty($ID_VIAGEM))
  102. {
  103. $ID_VIAGEM->setEditable(FALSE);
  104. }
  105. // master fields
  106. $this->form->addFields( [ new TLabel('Id:') ], [ $ID_VIAGEM ] );
  107. $this->form->addFields( [ new TLabel('Navio:') ], [ $FK_ID_NAVIO ] );
  108. $this->form->addFields( [ new TLabel('Agente:') ], [ $FK_ID_AGENTE ] );
  109. $this->form->addFields( [ new TLabel('Data Prev. Chegada:') ], [ $DATA_PREV_CHEGADA ] );
  110. $this->form->addFields( [ new TLabel('Data Prev. Atracação:') ], [ $DATA_PREV_ATRACACAO ] );
  111. $this->form->addFields( [ new TLabel('Data Prev. Partida:') ], [ $DATA_PREV_PARTIDA ] );
  112. $this->form->addFields( [ new TLabel('Tipo Operação:') ], [ $FK_ID_TIPO_OPERACAO ] );
  113. $this->form->addFields( [ new TLabel('Resumo Carga:') ], [ $RESUMO_CARGA ] );
  114. $this->form->addFields( [ new TLabel('Berço:') ], [ $BERCO ] );
  115. $this->form->addFields( [ new TLabel('Qtde Manifesto:') ], [ $QTDE_MANIFESTO ] );
  116. $this->form->addFields( [ new TLabel('Prancha:') ], [ $PRANCHA ] );
  117. $this->form->addFields( [ new TLabel('Bordo:') ], [ $BORDO ] );
  118. $this->form->addFields( [ new TLabel('Guincho de Bordo:') ], [ $IDC_GUINCHO_BORDO ] );
  119. $this->form->addFields( [ new TLabel('Grab de Bordo:') ], [ $IDC_GRAB_BORDO ] );
  120. $this->form->addFields( [ new TLabel('Status:') ], [ $IDC_STATUS ] );
  121. $this->form->addFields( [ new TLabel('Confirmado:') ], [ $IDC_CONFIRMADO ] );
  122. // detail fields
  123. $this->form->addContent( ['<h4><b>Ocorrências S.O.F:</b></h4><hr>'] );
  124. $this->form->addFields( [$detail_uniqid] );
  125. $this->form->addFields( [$detail_ID_OCORRENCIA] );
  126. // $this->form->addFields( [new TLabel('Id:')], [$detail_id_ocorrencia] );
  127. $this->form->addFields( [ new TLabel('Tipo Ocorrência:') ], [ $detail_id_tp_ocorrencia ] );
  128. $this->form->addFields( [new TLabel('Data Ocorrência:')], [$detail_DATA_OCORRENCIA] );
  129. $this->form->addFields( [new TLabel('Hora Ini:')], [$detail_HORA_INI] );
  130. $this->form->addFields( [new TLabel('Hora Fim:')], [$detail_HORA_FIM] );
  131. $detail_ID_OCORRENCIA->setSize('10%');
  132. $detail_id_tp_ocorrencia->setSize('50%');
  133. $detail_DATA_OCORRENCIA->setSize('10%');
  134. $detail_HORA_INI->setSize('07%');
  135. $detail_HORA_FIM->setSize('07%');
  136. $detail_HORA_INI->setMinLength(5);
  137. $detail_HORA_FIM->setMinLength(5);
  138. $add = TButton::create('add', [$this, 'onDetailAdd'], 'Gravar', 'fa:plus-circle green');
  139. $add->getAction()->setParameter('static','1');
  140. $this->form->addFields( [], [$add] );
  141. $this->detail_list = new BootstrapDatagridWrapper(new TDataGrid);
  142. $this->detail_list->setId('ocorrencia_list');
  143. $this->detail_list->generateHiddenFields();
  144. $this->detail_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";
  145. // items
  146. $this->detail_list->addColumn( new TDataGridColumn('uniqid', 'Uniqid', 'center') )->setVisibility(false);
  147. $this->detail_list->addColumn( new TDataGridColumn('ID_OCORRENCIA', 'Id', 'center') )->setVisibility(false);
  148. $dt = $this->detail_list->addColumn( new TDataGridColumn('DATA_OCORRENCIA', 'Data', 'left') );
  149. $pi = $this->detail_list->addColumn( new TDataGridColumn('id_tp_ocorrencia', 'Tipo ocorrência', 'left') );
  150. $this->detail_list->addColumn( new TDataGridColumn('HORA_INI', 'Hora Ini', 'left') );
  151. $this->detail_list->addColumn( new TDataGridColumn('HORA_FIM', 'Hora Fim', 'left') );
  152. $pi->setTransformer(function($value){
  153. return tipo_ocorrencia::findInTransaction('datasiop', $value)->DESCRICAO;
  154. });
  155. $dt->setTransformer( function($value, $object, $row) {
  156. if ($value)
  157. {
  158. try
  159. {
  160. $date = new DateTime($value);
  161. return $date->format('d/m/Y');
  162. }
  163. catch (Exception $e)
  164. {
  165. return $value;
  166. }
  167. }
  168. return $value;
  169. });
  170. // detail actions
  171. $action1 = new TDataGridAction([$this, 'onDetailEdit'] );
  172. $action1->setFields( ['uniqid', '*'] );
  173. $action2 = new TDataGridAction([$this, 'onDetailDelete']);
  174. $action2->setField('uniqid');
  175. // add the actions to the datagrid
  176. $this->detail_list->addAction($action1, _t('Edit'), 'fa:edit blue');
  177. $this->detail_list->addAction($action2, _t('Delete'), 'far:trash-alt red');
  178. $this->detail_list->createModel();
  179. // $scroll = new TScroll();
  180. // $scroll->setSize(1000,110);
  181. // $scroll->add($this->detail_list);
  182. // $this->form->addContent( [$scroll] );
  183. $panel = new TPanelGroup;
  184. $panel->add($this->detail_list);
  185. $panel->getBody()->style = 'overflow-x:auto';
  186. $this->form->addContent( [$panel] );
  187. $this->form->addAction( 'Salvar', new TAction([$this, 'onSave'], ['static'=>'1']), 'fa:save green');
  188. $this->form->addAction( 'Limpar', new TAction([$this, 'onClear']), 'fa:eraser red');
  189. // create the page container
  190. $container = new TVBox;
  191. $container->style = 'width: 100%';
  192. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  193. $container->add($this->form);
  194. parent::add($container);
  195. }
  196. /**
  197. * Clear form
  198. * @param $param URL parameters
  199. */
  200. public function onClear($param)
  201. {
  202. $this->form->clear(TRUE);
  203. }
  204. /**
  205. * Add detail item
  206. * @param $param URL parameters
  207. */
  208. public function onDetailAdd( $param )
  209. {
  210. try
  211. {
  212. $data = $this->form->getData();
  213. $this->form->validate();
  214. if ((empty($data->detail_id_tp_ocorrencia)) || (empty($data->detail_DATA_OCORRENCIA)) || (empty($data->detail_HORA_INI)) || (empty($data->detail_HORA_FIM)) )
  215. {
  216. throw new Exception('Campos: Tipo Ocorrência, Data Ocorrência, Hora Inicio e Hora fim são obrigatórios');
  217. }
  218. if ( $data->detail_HORA_INI == '00:00')
  219. {
  220. throw new Exception('Hora inicial inválida');
  221. }
  222. if ( $data->detail_HORA_FIM == '00:00')
  223. {
  224. throw new Exception('Hora Final inválida');
  225. }
  226. /** validation sample
  227. if (empty($data->fieldX))
  228. {
  229. throw new Exception('The field fieldX is required');
  230. }
  231. **/
  232. $uniqid = !empty($data->detail_uniqid) ? $data->detail_uniqid : uniqid();
  233. $grid_data = [];
  234. $grid_data['uniqid'] = $uniqid;
  235. $grid_data['ID_OCORRENCIA'] = $data->detail_ID_OCORRENCIA;
  236. $grid_data['id_tp_ocorrencia'] = $data->detail_id_tp_ocorrencia;
  237. $grid_data['DATA_OCORRENCIA'] = $data->detail_DATA_OCORRENCIA;
  238. $grid_data['HORA_INI'] = $data->detail_HORA_INI;
  239. $grid_data['HORA_FIM'] = $data->detail_HORA_FIM;
  240. // insert row dynamically
  241. $row = $this->detail_list->addItem( (object) $grid_data );
  242. $row->id = $uniqid;
  243. TDataGrid::replaceRowById('ocorrencia_list', $uniqid, $row);
  244. // clear detail form fields
  245. $data->detail_uniqid = '';
  246. $data->detail_ID_OCORRENCIA = '';
  247. $data->detail_id_tp_ocorrencia = '';
  248. $data->detail_DATA_OCORRENCIA = '';
  249. $data->detail_HORA_INI = '';
  250. $data->detail_HORA_FIM = '';
  251. // send data, do not fire change/exit events
  252. TForm::sendData( 'form_BzmViagem', $data, false, false );
  253. }
  254. catch (Exception $e)
  255. {
  256. $this->form->setData( $this->form->getData());
  257. new TMessage('error', $e->getMessage());
  258. }
  259. }
  260. /**
  261. * Edit detail item
  262. * @param $param URL parameters
  263. */
  264. public static function onDetailEdit( $param )
  265. {
  266. $data = new stdClass;
  267. $data->detail_uniqid = $param['uniqid'];
  268. $data->detail_ID_OCORRENCIA = $param['ID_OCORRENCIA'];
  269. $data->detail_id_tp_ocorrencia = $param['id_tp_ocorrencia'];
  270. $data->detail_DATA_OCORRENCIA = TDate::date2br($param['DATA_OCORRENCIA']);
  271. $data->detail_HORA_INI = $param['HORA_INI'];
  272. $data->detail_HORA_FIM = $param['HORA_FIM'];
  273. // send data, do not fire change/exit events
  274. TForm::sendData( 'form_BzmViagem', $data, false, false );
  275. }
  276. /**
  277. * Delete detail item
  278. * @param $param URL parameters
  279. */
  280. public static function onDetailDelete( $param )
  281. {
  282. // clear detail form fields
  283. $data = new stdClass;
  284. $data->detail_uniqid = '';
  285. $data->detail_ID_OCORRENCIA = '';
  286. $data->detail_id_tp_ocorrencia = '';
  287. $data->detail_DATA_OCORRENCIA = '';
  288. $data->detail_HORA_INI = '';
  289. $data->detail_HORA_FIM = '';
  290. // send data, do not fire change/exit events
  291. TForm::sendData( 'form_BzmViagem', $data, false, false );
  292. // remove row
  293. TDataGrid::removeRowById('ocorrencia_list', $param['uniqid']);
  294. }
  295. /**
  296. * Load Master/Detail data from database to form
  297. */
  298. public function onEdit($param)
  299. {
  300. try
  301. {
  302. TTransaction::open('datasiop');
  303. if (isset($param['key']))
  304. {
  305. $key = $param['key'];
  306. $object = new BzmViagem($key);
  307. $items = ocorrencia::where('id_viagem', '=', $key)->load();
  308. foreach( $items as $item )
  309. {
  310. $item->uniqid = uniqid();
  311. $row = $this->detail_list->addItem( $item );
  312. $row->id = $item->uniqid;
  313. }
  314. $this->form->setData($object);
  315. TTransaction::close();
  316. }
  317. else
  318. {
  319. $this->form->clear(TRUE);
  320. }
  321. }
  322. catch (Exception $e) // in case of exception
  323. {
  324. new TMessage('error', $e->getMessage());
  325. TTransaction::rollback();
  326. }
  327. }
  328. /**
  329. * Save the Master/Detail data from form to database
  330. */
  331. public function onSave($param)
  332. {
  333. try
  334. {
  335. // open a transaction with database
  336. TTransaction::open('datasiop');
  337. $data = $this->form->getData();
  338. $this->form->validate();
  339. $master = new BzmViagem;
  340. $master->fromArray( (array) $data);
  341. $master->store();
  342. ocorrencia::where('id_viagem', '=', $master->ID_VIAGEM)->delete();
  343. if( $param['ocorrencia_list_id_tp_ocorrencia'] )
  344. {
  345. foreach( $param['ocorrencia_list_id_tp_ocorrencia'] as $key => $item_id )
  346. {
  347. $detail = new ocorrencia;
  348. $detail->id_tp_ocorrencia = $param['ocorrencia_list_id_tp_ocorrencia'][$key];
  349. $detail->DATA_OCORRENCIA = $param['ocorrencia_list_DATA_OCORRENCIA'][$key];
  350. $detail->HORA_INI = $param['ocorrencia_list_HORA_INI'][$key];
  351. $detail->HORA_FIM = $param['ocorrencia_list_HORA_FIM'][$key];
  352. $detail->id_viagem = $master->ID_VIAGEM;
  353. $detail->store();
  354. }
  355. }
  356. TTransaction::close(); // close the transaction
  357. TForm::sendData('form_BzmViagem', (object) ['id' => $master->ID_VIAGEM]);
  358. new TMessage('info', AdiantiCoreTranslator::translate('Record saved'));
  359. }
  360. catch (Exception $e) // in case of exception
  361. {
  362. new TMessage('error', $e->getMessage());
  363. $this->form->setData( $this->form->getData() ); // keep form data
  364. TTransaction::rollback();
  365. }
  366. }
  367. }

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 (1)


NR

Para esse tipo de mestre detalhe em que os detalhes são adicionados estaticamente à grid, acredito que seja mais fácil fazer via javascript. Deve ter vários exemplos de reordenação de tabelas com jquery na net, veja se encontra algo.