Entrada Form Prezados, Estou criando um sistema para Almoxarifado, onde no mesmo eu tenho um formulário mestre detalhe com alguns campos que necessito, porém a listagem dos produtos que serão entregues ao invés de aparecer o nome do produto esta aparecendo o código, eu preciso que apareça no nome do produto que é o campo "descricao" da tabela estoque. Já tentei de tudo, porém sem sucesso, segue an...
FS
Entrada Form  
Prezados,

Estou criando um sistema para Almoxarifado, onde no mesmo eu tenho um formulário mestre detalhe com alguns campos que necessito,
porém a listagem dos produtos que serão entregues ao invés de aparecer o nome do produto esta aparecendo o código, eu preciso que apareça no nome do produto que é o campo "descricao" da tabela estoque. Já tentei de tudo, porém sem sucesso, segue anexo o código gerado pelo studio pro. Se algué poder me ajudar, agradeço.

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


MG

Fernando, você criou os relacionamentos no banco e no seu model?
Como está se model?
FS

Sim. minhas tabelas estão relacionadas, porém no model não estou entendendo se eu relaciono na Tabela Entrada ou na Tabela Itens ou se é na tabela Estoque.
MG

Neste caso, o produto é relacionado com todos estes informados.
Vc deveria ter um foreign key. de produtos.
Nas tabelas informadas, no model existem os relacionamentos?
Posta os models pra podermos verificar!
FS

 
  1. <?php
  2. /**
  3. * Entrada Active Record
  4. * @author <your-name-here>
  5. */
  6. class Entrada extends TRecord
  7. {
  8. const TABLENAME = 'entrada';
  9. const PRIMARYKEY= 'id';
  10. const IDPOLICY = 'serial'; // {max, serial}
  11. /**
  12. * Constructor method
  13. */
  14. public function __construct($id = NULL, $callObjectLoad = TRUE)
  15. {
  16. parent::__construct($id, $callObjectLoad);
  17. parent::addAttribute('nfe');
  18. parent::addAttribute('data_entrada');
  19. parent::addAttribute('data_compra');
  20. parent::addAttribute('fornecedor_id');
  21. }
  22. }
FS

 
  1. <?php
  2. /**
  3. * Estoque Active Record
  4. * @author <your-name-here>
  5. */
  6. class Estoque extends TRecord
  7. {
  8. const TABLENAME = 'estoque';
  9. const PRIMARYKEY= 'id';
  10. const IDPOLICY = 'serial'; // {max, serial}
  11. /**
  12. * Constructor method
  13. */
  14. public function __construct($id = NULL, $callObjectLoad = TRUE)
  15. {
  16. parent::__construct($id, $callObjectLoad);
  17. parent::addAttribute('descricao');
  18. parent::addAttribute('qtd');
  19. parent::addAttribute('qtd_minima');
  20. parent::addAttribute('unidade');
  21. parent::addAttribute('valor_unitario');
  22. parent::addAttribute('observacao');
  23. }
  24. }
FS

 
  1. <?php
  2. /**
  3. * Itens Active Record
  4. * @author <your-name-here>
  5. */
  6. class Itens extends TRecord
  7. {
  8. const TABLENAME = 'itens';
  9. const PRIMARYKEY= 'id';
  10. const IDPOLICY = 'serial'; // {max, serial}
  11. /**
  12. * Constructor method
  13. */
  14. public function __construct($id = NULL, $callObjectLoad = TRUE)
  15. {
  16. parent::__construct($id, $callObjectLoad);
  17. parent::addAttribute('estoque_id');
  18. parent::addAttribute('entrada_id');
  19. parent::addAttribute('saida_id');
  20. parent::addAttribute('qtd');
  21. }
  22. }
FS

Estou criando um formulário master detalhe onde eu pego a Tabela de Entrada onde é master a Tabela Itens que é o detalhe.
MG

Fernando, não há a implementação do relacionamento com 'produto', por isso você não consegue recuperar a descrição.
É preciso implementar, veja o exemplo abaixo e onde está descrito 'contrato', troque por 'produto':
Você deve implementar nos models que se relacionam com produtos, para poder recupera o nome. Aí é só usar "$produto->descricao".
 
  1. <?php
  2. /**
  3. * Method set_contrato
  4. * Sample of usage: $caso_uso->contrato = $object;
  5. * @param $object Instance of Contrato
  6. */
  7. public function set_contrato(Contrato $object)
  8. {
  9. $this->contrato = $object;
  10. $this->contrato_id = $object->id;
  11. }
  12. /**
  13. * Method get_contrato
  14. * Sample of usage: $caso_uso->contrato->attribute;
  15. * @returns Contrato instance
  16. */
  17. public function get_contrato()
  18. {
  19. // loads the associated object
  20. if (empty($this->contrato))
  21. $this->contrato = new Contrato($this->contrato_id);
  22. // returns the associated object
  23. return $this->contrato;
  24. }
  25. ?>
FS

vou postar aqui meu form, mesmo assim não acha a informação
 
  1. <?php
  2. /**
  3. * EntradaForm Master/Detail
  4. * @author <your name here>
  5. */
  6. class EntradaForm extends TPage
  7. {
  8. protected $form; // form
  9. protected $detail_list;
  10. /**
  11. * Page constructor
  12. */
  13. public function __construct()
  14. {
  15. parent::__construct();
  16. // creates the form
  17. $this->form = new BootstrapFormBuilder('form_Entrada');
  18. $this->form->setFormTitle('Entrada');
  19. // master fields
  20. $id = new TEntry('id');
  21. $nfe = new TEntry('nfe');
  22. $data_entrada = new TDate('data_entrada');
  23. $data_compra = new TDate('data_compra');
  24. $fornecedor_id = new TDBUniqueSearch('fornecedor_id', 'i9vaxalmoxarifado', 'Fornecedor', 'id', 'razao');
  25. // detail fields
  26. $detail_id = new THidden('detail_id');
  27. $detail_estoque_id = new TDBUniqueSearch('detail_estoque_id', 'i9vaxalmoxarifado', 'Estoque', 'id', 'descricao');
  28. $detail_qtd = new TEntry('detail_qtd');
  29. if (!empty($id))
  30. {
  31. $id->setEditable(FALSE);
  32. }
  33. // master fields
  34. $this->form->addFields( [new TLabel('Id')], [$id] );
  35. $this->form->addFields( [new TLabel('Nfe')], [$nfe] );
  36. $this->form->addFields( [new TLabel('Data Entrada')], [$data_entrada] );
  37. $this->form->addFields( [new TLabel('Data Compra')], [$data_compra] );
  38. $this->form->addFields( [new TLabel('Fornecedor Id')], [$fornecedor_id] );
  39. // detail fields
  40. $this->form->addContent( ['<h4>Details</h4><hr>'] );
  41. $this->form->addFields( [$detail_id] );
  42. $this->form->addFields( [new TLabel('Estoque Id')], [$detail_estoque_id] );
  43. $this->form->addFields( [new TLabel('Qtd')], [$detail_qtd] );
  44. $add = TButton::create('add', [$this, 'onSaveDetail'], 'Register', 'fa:save');
  45. $this->form->addFields( [], [$add] )->style = 'background: whitesmoke; padding: 5px; margin: 1px;';
  46. $this->detail_list = new BootstrapDatagridWrapper(new TQuickGrid);
  47. $this->detail_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";
  48. $this->detail_list->setId('Entrada_list');
  49. // items
  50. $this->detail_list->addQuickColumn('Estoque Id', '$estoque->descricao', 'left', 100);
  51. $this->detail_list->addQuickColumn('Qtd', 'qtd', 'left', 100);
  52. // detail actions
  53. $this->detail_list->addQuickAction( 'Edit', new TDataGridAction([$this, 'onEditDetail']), 'id', 'fa:edit blue');
  54. $this->detail_list->addQuickAction( 'Delete', new TDataGridAction([$this, 'onDeleteDetail']), 'id', 'fa:trash red');
  55. $this->detail_list->createModel();
  56. $panel = new TPanelGroup;
  57. $panel->add($this->detail_list);
  58. $panel->getBody()->style = 'overflow-x:auto';
  59. $this->form->addContent( [$panel] );
  60. $btn = $this->form->addAction( _t('Save'), new TAction([$this, 'onSave']), 'fa:save');
  61. $btn->class = 'btn btn-sm btn-primary';
  62. $this->form->addAction( _t('Clear'), new TAction([$this, 'onClear']), 'fa:eraser red');
  63. // create the page container
  64. $container = new TVBox;
  65. $container->style = 'width: 90%';
  66. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  67. $container->add($this->form);
  68. parent::add($container);
  69. }
  70. /**
  71. * Clear form
  72. * @param $param URL parameters
  73. */
  74. public function onClear($param)
  75. {
  76. $this->form->clear(TRUE);
  77. TSession::setValue(__CLASS__.'_items', array());
  78. $this->onReload( $param );
  79. }
  80. /**
  81. * Save an item from form to session list
  82. * @param $param URL parameters
  83. */
  84. public function onSaveDetail( $param )
  85. {
  86. try
  87. {
  88. TTransaction::open('i9vaxalmoxarifado');
  89. $data = $this->form->getData();
  90. /** validation sample
  91. if (empty($data->fieldX))
  92. {
  93. throw new Exception('The field fieldX is required');
  94. }
  95. **/
  96. $items = TSession::getValue(__CLASS__.'_items');
  97. $key = empty($data->detail_id) ? 'X'.mt_rand(1000000000, 1999999999) : $data->detail_id;
  98. $items[ $key ] = array();
  99. $items[ $key ]['id'] = $key;
  100. $items[ $key ]['estoque_id'] = $data->detail_estoque_id;
  101. $items[ $key ]['qtd'] = $data->detail_qtd;
  102. TSession::setValue(__CLASS__.'_items', $items);
  103. // clear detail form fields
  104. $data->detail_id = '';
  105. $data->detail_estoque_id = '';
  106. $data->detail_qtd = '';
  107. TTransaction::close();
  108. $this->form->setData($data);
  109. $this->onReload( $param ); // reload the items
  110. }
  111. catch (Exception $e)
  112. {
  113. $this->form->setData( $this->form->getData());
  114. new TMessage('error', $e->getMessage());
  115. }
  116. }
  117. /**
  118. * Load an item from session list to detail form
  119. * @param $param URL parameters
  120. */
  121. public static function onEditDetail( $param )
  122. {
  123. // read session items
  124. $items = TSession::getValue(__CLASS__.'_items');
  125. // get the session item
  126. $item = $items[ $param['key'] ];
  127. $data = new stdClass;
  128. $data->detail_id = $item['id'];
  129. $data->detail_estoque_id = $item['estoque_id'];
  130. $data->detail_qtd = $item['qtd'];
  131. // fill detail fields
  132. TForm::sendData( 'form_Entrada', $data );
  133. }
  134. /**
  135. * Delete an item from session list
  136. * @param $param URL parameters
  137. */
  138. public static function onDeleteDetail( $param )
  139. {
  140. // reset items
  141. $data = new stdClass;
  142. $data->detail_estoque_id = '';
  143. $data->detail_qtd = '';
  144. // clear form data
  145. TForm::sendData('form_Entrada', $data );
  146. // read session items
  147. $items = TSession::getValue(__CLASS__.'_items');
  148. // get detail id
  149. $detail_id = $param['key'];
  150. // delete the item from session
  151. unset($items[ $detail_id ] );
  152. // rewrite session items
  153. TSession::setValue(__CLASS__.'_items', $items);
  154. // delete item from screen
  155. TScript::create("ttable_remove_row_by_id('Entrada_list', '{$detail_id}')");
  156. }
  157. /**
  158. * Load the items list from session
  159. * @param $param URL parameters
  160. */
  161. public function onReload($param)
  162. {
  163. // read session items
  164. $items = TSession::getValue(__CLASS__.'_items');
  165. $this->detail_list->clear(); // clear detail list
  166. if ($items)
  167. {
  168. foreach ($items as $list_item)
  169. {
  170. $item = (object) $list_item;
  171. $row = $this->detail_list->addItem( $item );
  172. $row->id = $list_item['id'];
  173. }
  174. }
  175. $this->loaded = TRUE;
  176. }
  177. /**
  178. * Load Master/Detail data from database to form/session
  179. */
  180. public function onEdit($param)
  181. {
  182. try
  183. {
  184. TTransaction::open('i9vaxalmoxarifado');
  185. if (isset($param['key']))
  186. {
  187. $key = $param['key'];
  188. $object = new Entrada($key);
  189. $items = Itens::where('entrada_id', '=', $key)->load();
  190. $session_items = array();
  191. foreach( $items as $item )
  192. {
  193. $item_key = $item->id;
  194. $session_items[$item_key] = $item->toArray();
  195. $session_items[$item_key]['id'] = $item->id;
  196. $session_items[$item_key]['estoque_id'] = $item->estoque_id;
  197. $session_items[$item_key]['qtd'] = $item->qtd;
  198. }
  199. TSession::setValue(__CLASS__.'_items', $session_items);
  200. $this->form->setData($object); // fill the form with the active record data
  201. $this->onReload( $param ); // reload items list
  202. TTransaction::close(); // close transaction
  203. }
  204. else
  205. {
  206. $this->form->clear(TRUE);
  207. TSession::setValue(__CLASS__.'_items', null);
  208. $this->onReload( $param );
  209. }
  210. }
  211. catch (Exception $e) // in case of exception
  212. {
  213. new TMessage('error', $e->getMessage());
  214. TTransaction::rollback();
  215. }
  216. }
  217. /**
  218. * Save the Master/Detail data from form/session to database
  219. */
  220. public function onSave()
  221. {
  222. try
  223. {
  224. // open a transaction with database
  225. TTransaction::open('i9vaxalmoxarifado');
  226. $data = $this->form->getData();
  227. $master = new Entrada;
  228. $master->fromArray( (array) $data);
  229. $this->form->validate(); // form validation
  230. $master->store(); // save master object
  231. // delete details
  232. $old_items = Itens::where('entrada_id', '=', $master->id)->load();
  233. $keep_items = array();
  234. // get session items
  235. $items = TSession::getValue(__CLASS__.'_items');
  236. if( $items )
  237. {
  238. foreach( $items as $item )
  239. {
  240. if (substr($item['id'],0,1) == 'X' ) // new record
  241. {
  242. $detail = new Itens;
  243. }
  244. else
  245. {
  246. $detail = Itens::find($item['id']);
  247. }
  248. $detail->estoque_id = $item['estoque_id'];
  249. $detail->qtd = $item['qtd'];
  250. $detail->entrada_id = $master->id;
  251. $detail->store();
  252. $keep_items[] = $detail->id;
  253. }
  254. }
  255. if ($old_items)
  256. {
  257. foreach ($old_items as $old_item)
  258. {
  259. if (!in_array( $old_item->id, $keep_items))
  260. {
  261. $old_item->delete();
  262. }
  263. }
  264. }
  265. TTransaction::close(); // close the transaction
  266. // reload form and session items
  267. $this->onEdit(array('key'=>$master->id));
  268. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  269. }
  270. catch (Exception $e) // in case of exception
  271. {
  272. new TMessage('error', $e->getMessage());
  273. $this->form->setData( $this->form->getData() ); // keep form data
  274. TTransaction::rollback();
  275. }
  276. }
  277. /**
  278. * Show the page
  279. */
  280. public function show()
  281. {
  282. // check if the datagrid is already loaded
  283. if (!$this->loaded AND (!isset($_GET['method']) OR $_GET['method'] !== 'onReload') )
  284. {
  285. $this->onReload( func_get_arg(0) );
  286. }
  287. parent::show();
  288. }
  289. }
  290. </your>
FS

 
  1. <?php
  2. /**
  3. * Itens Active Record
  4. * @author <your-name-here>
  5. */
  6. class Itens extends TRecord
  7. {
  8. const TABLENAME = 'itens';
  9. const PRIMARYKEY= 'id';
  10. const IDPOLICY = 'serial'; // {max, serial}
  11. private $estoque;
  12. /**
  13. * Constructor method
  14. */
  15. public function __construct($id = NULL, $callObjectLoad = TRUE)
  16. {
  17. parent::__construct($id, $callObjectLoad);
  18. parent::addAttribute('estoque_id');
  19. parent::addAttribute('entrada_id');
  20. parent::addAttribute('saida_id');
  21. parent::addAttribute('qtd');
  22. }
  23. /**
  24. * Method set_estoque
  25. * Sample of usage: $itens->estoque = $object;
  26. * @param $object Instance of Estoque
  27. */
  28. public function set_estoque(Estoque $object)
  29. {
  30. $this->estoque = $object;
  31. $this->estoque_id = $object->id;
  32. }
  33. /**
  34. * Method get_estoque
  35. * Sample of usage: $itens->estoque->attribute;
  36. * @returns Estoque instance
  37. */
  38. public function get_estoque()
  39. {
  40. // loads the associated object
  41. if (empty($this->estoque))
  42. $this->estoque = new Estoque($this->estoque_id);
  43. // returns the associated object
  44. return $this->estoque;
  45. }
  46. }
FS

A linha 63 é onde esta o problema, nela eu preciso que aparece a descrição, na lógica da forma que eu coloquei era para puxar a informação, porém não puxa.
MG

Fernando, mas no Model estoque vc tem a coluna "descricao"?

Se no model estoque vc tiver a ligação para produto, mas só se tiver, deveria ser algo assim?

$this->estoque->produto->descricao
FS

vou postar aqui minhas tabelas, para ver se entende,
FS

-- --------------------------------------------------------

--
-- Estrutura para tabela `entrada`
--

CREATE TABLE IF NOT EXISTS `entrada` (
`id` int(11) NOT NULL,
`nfe` varchar(255) DEFAULT NULL,
`data_entrada` date DEFAULT NULL,
`data_compra` date DEFAULT NULL,
`fornecedor_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

--
-- Estrutura para tabela `estoque`
--

CREATE TABLE IF NOT EXISTS `estoque` (
`id` int(11) NOT NULL,
`descricao` varchar(255) DEFAULT NULL,
`qtd` int(11) DEFAULT NULL,
`qtd_minima` int(11) DEFAULT NULL,
`unidade` varchar(20) DEFAULT NULL,
`valor_unitario` decimal(6,2) DEFAULT NULL,
`observacao` text
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

--
-- Estrutura para tabela `fornecedor`
--

CREATE TABLE IF NOT EXISTS `fornecedor` (
`id` int(11) NOT NULL,
`razao` varchar(255) DEFAULT NULL,
`fantasia` varchar(255) DEFAULT NULL,
`cpfcnpj` varchar(18) DEFAULT NULL,
`ie` varchar(30) DEFAULT NULL,
`endereco` text,
`bairro` varchar(40) DEFAULT NULL,
`cep` varchar(10) DEFAULT NULL,
`municipio` varchar(60) DEFAULT NULL,
`uf` varchar(2) DEFAULT NULL,
`telefone` varchar(30) DEFAULT NULL,
`celular` varchar(30) DEFAULT NULL,
`observacao` text
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

--
-- Fazendo dump de dados para tabela `fornecedor`
--


CREATE TABLE IF NOT EXISTS `itens` (
`id` int(11) NOT NULL,
`estoque_id` int(11) NOT NULL,
`entrada_id` int(11) DEFAULT NULL,
`saida_id` int(11) DEFAULT NULL,
`qtd` int(11) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8;


--
-- Estrutura para tabela `pa`
--

CREATE TABLE IF NOT EXISTS `pa` (
`id` int(11) NOT NULL,
`pa` varchar(50) DEFAULT NULL,
`cnpj` varchar(18) DEFAULT NULL,
`telefone` varchar(30) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Estrutura para tabela `saida`
--

CREATE TABLE IF NOT EXISTS `saida` (
`id` int(11) NOT NULL,
`nome` varchar(255) DEFAULT NULL,
`pa_id` int(11) NOT NULL,
`dt_saida` date DEFAULT NULL,
`tipo_envio_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
FS

a tabela itens é onde eu relaciono com as demais entrada e estoque.
FS

Muito obrigado pela a ajuda, com o conjunto de todas as ideias por meio deste e publicação no facebook, consegui achar a solução e até mesmo aprender mais sobre este framework.