Erro de chave estrangeira em Composição Senhores, boa noite, estou com um problema para resolver com relação a uma chave estrangeira! A classe principal é a Solução que é composta pelas classes Soro e Hormônio. Ao tentar gravar no banco de dados as informações digitadas pelo usuário, está ocorrendo erro de chave estrangeira, conforme é mostrado na imagem em anexo. As classes estão aqui abaixo: Formulario que recebe o...
TS
Erro de chave estrangeira em Composição  
Fechado
Senhores, boa noite, estou com um problema para resolver com relação a uma chave estrangeira!

A classe principal é a Solução que é composta pelas classes Soro e Hormônio. Ao tentar gravar no banco de dados as informações digitadas pelo usuário, está ocorrendo erro de chave estrangeira, conforme é mostrado na imagem em anexo. As classes estão aqui abaixo:
Formulario que recebe os dados
 
  1. <?php
  2. class FrmSolucao extends TPage
  3. {
  4. private $form;
  5. private $datagrid_primeira_aplicacao;
  6. private $datagrid_segunda_aplicacao;
  7. function __construct()
  8. {
  9. parent::__construct();
  10. //$this->form = new TQuickForm('form_Solucao');
  11. $this->form = new TQuickForm('form_solucao');
  12. $this->form->class = 'tform'; // change CSS class
  13. $this->form->style = 'display: table;width:70%; margin-left:50px;'; // change style
  14. //$this->form->setFormTitle('Aplicação de hormônios');
  15. $notebook = new BootstrapNotebookWrapper(new TNotebook(300, 350));
  16. $this->form->add($notebook);
  17. parent::include_css('app/resources/custom-notebook.css');
  18. // creates the containers for each notebook page
  19. $tbl_solucao = new TTable;
  20. $tbl_hormonio = new TTable;
  21. $tbl_soro = new TTable;
  22. $tbl_pAplicacao = new TTable;
  23. $tbl_sAplicacao = new TTable;
  24. $tbl_solucao->style = "margin: 2px;width:100%;";
  25. $tbl_pAplicacao->style = "margin: 4px";
  26. $tbl_sAplicacao->style = "margin: 4px";
  27. $tbl_hormonio->style = "margin: 4px";
  28. $tbl_soro->style = "margin: 4px";
  29. ####Campos primeira página######
  30. 2427Solucao = new THidden('idSolucao');
  31. $cmbReproducao = new ">TDBSeekButton('idReproducao','dbwf',$this->form->getName(),'Reproducao','codigo','idReproducao','cod_reproducao');
  32. $cod_reproducao = new TEntry('cod_reproducao');
  33. $pVolTotalAplicado = new TEntry('pVolTotalAplicado');
  34. $pVolTotalAplicado->setTip('Volume total de solução a ser aplicado na primeira aplicação em mg');
  35. $sVolTotalAplicado = new TEntry('sVolTotalAplicado');
  36. $sVolTotalAplicado->setTip('Volume total de solução a ser aplicado na segunda aplicação em mg');
  37. //validações
  38. $cod_reproducao->setExitAction(new TAction(array($this,'onSelect')));
  39. ####Adicionando os campos na aba do notebook####
  40. $tbl_solucao->addRowSet(new TLabel(''),2427Solucao);
  41. $tbl_solucao->addRowSet(new TLabel('REPRODUÇÃO..:'),$cmbReproducao);
  42. $tbl_solucao->addRowSet(new TLabel('Nº..........:'),$cod_reproducao);
  43. $tbl_solucao->addRowSet(new TLabel('VOL. TOTAL 1ª APLICAÇÃO..:'),$pVolTotalAplicado);
  44. $tbl_solucao->addRowSet(new TLabel('VOL. TOTAL 2ª APLICAÇÃO..:'),$sVolTotalAplicado);
  45. #####Campos segunda Pagina#####
  46. $lista_soro = new TMultiField('lista_soro');
  47. $nome_soro = new TEntry('nomeSoro');
  48. $desc_soro = new TEntry('descSoro');
  49. $valor_soro = new TEntry('valorSoro');
  50. $qtdeSoroAplicKvP = new TEntry('qtdeSoroAplicKvP');
  51. $totalSoroAplicacao = new TEntry('totalSoroAplicacao');
  52. ####Adicionando os campos na aba do notebook####
  53. $row = $tbl_soro->addRow();
  54. $cell = $row->addCell(new TLabel('<b><h4>..::SORO::..</h4></b>'));
  55. $cell->valign = 'top';
  56. $lista_soro->setHeight(150);
  57. $lista_soro->setClass('Soro');
  58. $lista_soro->addField('nomeSoro','NOME'.':',$nome_soro,150);
  59. $lista_soro->addField('descSoro','DESCRIÇÃO'.':',$desc_soro,150);
  60. $lista_soro->addField('valorSoro','VALOR EM R$'.':',$valor_soro,70);
  61. $lista_soro->addField('qtdeSoroAplicKvP','TOTAL A SER APLICADO'.':',$qtdeSoroAplicKvP,70);
  62. $lista_soro->addField('totalSoroAplicacao','TOTAL SORO EM R$'.':',$totalSoroAplicacao,70);
  63. $row=$tbl_soro->addRow();
  64. $row->addCell($lista_soro);
  65. #####Campos terceira Página#######
  66. $lista_hormonio = new TMultiField('lista_hormonio');
  67. $nome_hormonio = new TEntry('nomeHormonio');
  68. $desc_hormonio = new TEntry('descHormonio');
  69. $valor_hormonio = new TEntry('valorHormonio');
  70. $qtdeHormonioAplicKvP = new TEntry('qtdeHormonioAplicKvP');
  71. $totalHormonioAplicacao = new TEntry('totalHormonioAplicacao');
  72. ####Adicionando os campos na aba do notebook####
  73. $row = $tbl_hormonio->addRow();
  74. $cell = $row->addCell(new TLabel('<b><h4>..::HORMÔNIO::..</h4></b>'));
  75. $cell->valign = 'top';
  76. $lista_hormonio->setHeight(150);
  77. $lista_hormonio->setClass('Hormonio');
  78. $lista_hormonio->addField('nomeHormonio','NOME'.':',$nome_hormonio,150);
  79. $lista_hormonio->addField('descHormonio','DESCRIÇÃO'.':',$desc_hormonio,150);
  80. $lista_hormonio->addField('valorHormonio','VALOR EM R$'.':',$valor_hormonio,70);
  81. $lista_hormonio->addField('qtdeHormonioAplicKvP','TOTAL A SER APLICADO'.':',$qtdeHormonioAplicKvP,70);
  82. $lista_hormonio->addField('totalHormonioAplicacao','TOTAL HORMÔNIO EM R$'.':',$totalHormonioAplicacao,70);
  83. $row=$tbl_hormonio->addRow();
  84. $row->addCell($lista_hormonio);
  85. #####Campos quarta Página#####
  86. //$row = $tbl_pAplicacao->addRow();
  87. $this->datagrid_primeira_aplicacao = new TQuickGrid;
  88. $this->datagrid_primeira_aplicacao->disableDefaultClick();
  89. $this->datagrid_primeira_aplicacao->addQuickColumn('Número', 'numero', 'center', 70);
  90. $this->datagrid_primeira_aplicacao->addQuickColumn('Identificação', 'identMatriz', 'right', 180);
  91. $this->datagrid_primeira_aplicacao->addQuickColumn('Peso', 'pesoMatriz', 'center', 180);
  92. $this->datagrid_primeira_aplicacao->addQuickColumn('Volume a Injetar', 'fone', 'left', 120);
  93. $this->datagrid_primeira_aplicacao->createModel();
  94. $row1 = $tbl_pAplicacao->addRow();
  95. $row1->addCell($this->datagrid_primeira_aplicacao);
  96. //$row->addCell($tbl_pAplicacao);
  97. #####Campos Quinta Página#####
  98. $this->datagrid_segunda_aplicacao = new TQuickGrid;
  99. $this->datagrid_segunda_aplicacao->disableDefaultClick();
  100. $this->datagrid_segunda_aplicacao->addQuickColumn('Code', 'code', 'right', 70);
  101. $this->datagrid_segunda_aplicacao->addQuickColumn('Name', 'name', 'left', 180);
  102. $this->datagrid_segunda_aplicacao->addQuickColumn('Address', 'address', 'left', 180);
  103. $this->datagrid_segunda_aplicacao->addQuickColumn('Phone', 'fone', 'left', 120);
  104. $this->datagrid_segunda_aplicacao->createModel();
  105. $row2 = $tbl_sAplicacao->addRow();
  106. $row2->addCell($this->datagrid_segunda_aplicacao);
  107. //$this->form->addQuickAction(_t('Save'), new TAction(array($this, 'onSave')), 'fa:floppy-o');
  108. //$this->form->addQuickAction(_t('New'), new TAction(array($this, 'onClear')), 'bs:plus-sign green');
  109. $notebook->appendPage('Totais Solução', $tbl_solucao);
  110. $notebook->appendPage('Soro', $tbl_soro);
  111. $notebook->appendPage('Hormônio', $tbl_hormonio);
  112. $notebook->appendPage('1ª Aplicação', $tbl_pAplicacao);
  113. $notebook->appendPage('2ª Aplicação', $tbl_sAplicacao);
  114. $save_button=new TButton('save');
  115. $save_button->setAction(new TAction(array($this, 'onSave')), _t('Save'));
  116. $save_button->setImage('fa:floppy-o');
  117. // create an new button (edit with no parameters)
  118. $new_button=new TButton('new');
  119. $new_button->setAction(new TAction(array($this, 'onEdit')), _t('New'));
  120. $new_button->setImage('fa:plus-square green');
  121. $list_button=new TButton('list');
  122. $list_button->setAction(new TAction(array('FrmListaReproducao','onReload')), _t('Back to the listing'));
  123. $list_button->setImage('fa:table blue');
  124. $this->form->setFields(array(2427Solucao, $cmbReproducao, $cod_reproducao, $pVolTotalAplicado, $sVolTotalAplicado, $lista_soro, $save_button, $new_button, $list_button));
  125. $buttons = new THBox;
  126. $buttons->add($save_button);
  127. $buttons->add($new_button);
  128. $buttons->add($list_button);
  129. //$this->form->add($buttons);
  130. // vertical box container
  131. $container = new TVBox;
  132. $container->style = 'width: 60%; margin-left:5%;';
  133. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  134. $container->add(TPanelGroup::pack('Aplicação de Hormônios',$this->form));
  135. $container->add($buttons);
  136. parent::add($container);
  137. }
  138. public function onSave()
  139. {
  140. try
  141. {
  142. TTransaction::open('dbwf');
  143. $this->form->validate(); // validate form data
  144. $object =$this->form->getData('Solucao'); // create an empty object
  145. 2427Reproducao = $object->idSolucao;
  146. $data = $this->form->getData(); // get form data as array
  147. $object->fromArray( (array) $data); // load the object with data
  148. $object->pVolTotalAplicado = str_replace(',','.', $object->pVolTotalAplicado);
  149. $object->sVolTotalAplicado = str_replace(',','.', $object->sVolTotalAplicado);
  150. if($object->lista_soro)
  151. {
  152. foreach($object->lista_soro as $soro)
  153. {
  154. $object->addSoro($soro);
  155. }
  156. }
  157. if($object->lista_hormonio)
  158. {
  159. foreach($object->lista_hormonio as $hormonio)
  160. {
  161. $object->addHormonio($hormonio);
  162. }
  163. }
  164. $object->store(); // save the object
  165. // get the generated idSolucao
  166. $data->idSolucao = $object->idSolucao;
  167. $this->form->setData($data); // fill form data
  168. TTransaction::close(); // close the transaction
  169. new TMessage('info','Registro Gravado com sucesso!');
  170. }
  171. catch(Exception $e)
  172. {
  173. new TMessage('Erro ao gravar o registro!', $e->getMessage()); // shows the exception error message
  174. $this->form->setData( $this->form->getData() ); // keep form data
  175. TTransaction::rollback(); //
  176. }
  177. }
  178. public function onReload()
  179. {
  180. $this->datagrid_primeira_aplicacao->clear();
  181. try
  182. {
  183. }
  184. catch(Exception $e)
  185. {
  186. // shows the exception error message
  187. new TMessage('Erro ao carregar os registros', $e->getMessage());
  188. // undo all pending operations
  189. TTransaction::rollback();
  190. }
  191. }
  192. public function onEdit()
  193. {
  194. }
  195. public static function onSelect($params)
  196. {
  197. $DSPV = 0.5;
  198. $DDPV = 5.0;
  199. if(isset($params['cod_reproducao'])&& $params['cod_reproducao'])
  200. {
  201. try
  202. {
  203. TTransaction::open('dbwf');
  204. $rep = new Reproducao($params['idReproducao']);
  205. $obj = new StdClass;
  206. $obj->pVolTotalAplicado = number_format(($DSPV * $rep->pesoGeralMatriz),2,'.',',');
  207. $obj->sVolTotalAplicado = number_format(($DDPV * $rep->pesoGeralMatriz),2,'.',',');
  208. TForm::sendData('form_solucao',$obj);
  209. TTransaction::close();
  210. }
  211. catch(Exception $e)
  212. {
  213. new TMessage('error', '<b>Erro</b> ' . $e->getMessage());
  214. TTransaction::rollback();
  215. }
  216. }
  217. }
  218. }
  219. ?>

Classe que possui a composição</B>
 
  1. <?php
  2. /**
  3. * Solucao Active Record
  4. * @author <your-name-here>
  5. */
  6. class Solucao extends TRecord
  7. {
  8. const TABLENAME = 'solucao';
  9. const PRIMARYKEY= 'idSolucao';
  10. const IDPOLICY = 'max'; // {max, serial}
  11. private $reproducao;
  12. private $soros;
  13. private $hormonios;
  14. private $aplicacao_hormonios;
  15. /**
  16. * Constructor method
  17. */
  18. public function __construct(2427 = NULL, $callObjectLoad = TRUE)
  19. {
  20. parent::__construct(2427, $callObjectLoad);
  21. parent::addAttribute('pVolTotalAplicado');
  22. parent::addAttribute('sVolTotalAplicado');
  23. parent::addAttribute('idReproducao');
  24. }
  25. /**
  26. * Method set_reproducao
  27. * Sample of usage: $solucao->reproducao = $object;
  28. * @param $object Instance of Reproducao
  29. */
  30. public function set_reproducao(Reproducao $object)
  31. {
  32. $this->reproducao = $object;
  33. $this->idreproducao = $object->id;
  34. }
  35. /**
  36. * Method get_reproducao
  37. * Sample of usage: $solucao->reproducao->attribute;
  38. * @returns Reproducao instance
  39. */
  40. public function get_reproducao()
  41. {
  42. // loads the associated object
  43. if (empty($this->reproducao))
  44. $this->reproducao = new Reproducao($this->idreproducao);
  45. // returns the associated object
  46. return $this->reproducao;
  47. }
  48. /**
  49. * Method addSoro
  50. * Add a Soro to the Solucao
  51. * @param $object Instance of Soro
  52. */
  53. public function addSoro(Soro $object)
  54. {
  55. $this->soros[] = $object;
  56. }
  57. /**
  58. * Method getSoros
  59. * Return the Solucao' Soro's
  60. * @return Collection of Soro
  61. */
  62. public function getSoros()
  63. {
  64. return $this->soros;
  65. }
  66. /**
  67. * Method addHormonio
  68. * Add a Hormonio to the Solucao
  69. * @param $object Instance of Hormonio
  70. */
  71. public function addHormonio(Hormonio $object)
  72. {
  73. $this->hormonios[] = $object;
  74. }
  75. /**
  76. * Method getHormonios
  77. * Return the Solucao' Hormonio's
  78. * @return Collection of Hormonio
  79. */
  80. public function getHormonios()
  81. {
  82. return $this->hormonios;
  83. }
  84. /**
  85. * Method addAplicacaoHormonio
  86. * Add a AplicacaoHormonio to the Solucao
  87. * @param $object Instance of AplicacaoHormonio
  88. */
  89. public function addAplicacaoHormonio(AplicacaoHormonio $object)
  90. {
  91. $this->aplicacao_hormonios[] = $object;
  92. }
  93. /**
  94. * Method getAplicacaoHormonios
  95. * Return the Solucao' AplicacaoHormonio's
  96. * @return Collection of AplicacaoHormonio
  97. */
  98. public function getAplicacaoHormonios()
  99. {
  100. return $this->aplicacao_hormonios;
  101. }
  102. /**
  103. * Reset aggregates
  104. */
  105. public function clearParts()
  106. {
  107. $this->soros = array();
  108. $this->hormonios = array();
  109. $this->aplicacao_hormonios = array();
  110. }
  111. /**
  112. * Load the object and its aggregates
  113. * @param 2427 object ID
  114. */
  115. public function load(2427)
  116. {
  117. // load the related Soro objects
  118. $repository = new TRepository('Soro');
  119. $criteria = new TCriteria;
  120. $criteria->add(new TFilter('idSolucao', '=', 2427));
  121. $this->soros = $repository->load($criteria);
  122. // load the related Hormonio objects
  123. $repository = new TRepository('Hormonio');
  124. $criteria = new TCriteria;
  125. $criteria->add(new TFilter('idSolucao', '=', 2427));
  126. $this->hormonios = $repository->load($criteria);
  127. // load the related AplicacaoHormonio objects
  128. $repository = new TRepository('AplicacaoHormonio');
  129. $criteria = new TCriteria;
  130. $criteria->add(new TFilter('idSolucao', '=', 2427));
  131. $this->aplicacao_hormonios = $repository->load($criteria);
  132. // load the object itself
  133. return parent::load(2427);
  134. }
  135. /**
  136. * Store the object and its aggregates
  137. */
  138. public function store()
  139. {
  140. // store the object itself
  141. parent::store();
  142. // delete the related Soro objects
  143. $criteria = new TCriteria;
  144. $criteria->add(new TFilter('idSolucao', '=', $this->id));
  145. $repository = new TRepository('Soro');
  146. $repository->delete($criteria);
  147. // store the related Soro objects
  148. if ($this->soros)
  149. {
  150. foreach ($this->soros as $soro)
  151. {
  152. unset($soro->idSoro);
  153. $soro->idSolucao = $this->id;
  154. $soro->store();
  155. }
  156. }
  157. // delete the related Hormonio objects
  158. $criteria = new TCriteria;
  159. $criteria->add(new TFilter('idsolucao', '=', $this->id));
  160. $repository = new TRepository('Hormonio');
  161. $repository->delete($criteria);
  162. // store the related Hormonio objects
  163. if ($this->hormonios)
  164. {
  165. foreach ($this->hormonios as $hormonio)
  166. {
  167. unset($hormonio->idHormonio);
  168. $hormonio->idSolucao = $this->id;
  169. $hormonio->store();
  170. }
  171. }
  172. // delete the related AplicacaoHormonio objects
  173. $criteria = new TCriteria;
  174. $criteria->add(new TFilter('idsolucao', '=', $this->id));
  175. $repository = new TRepository('AplicacaoHormonio');
  176. $repository->delete($criteria);
  177. // store the related AplicacaoHormonio objects
  178. if ($this->aplicacao_hormonios)
  179. {
  180. foreach ($this->aplicacao_hormonios as $aplicacao_hormonio)
  181. {
  182. unset($aplicacao_hormonio->idAplicacaoHormonio);
  183. $aplicacao_hormonio->idSolucao = $this->id;
  184. $aplicacao_hormonio->store();
  185. }
  186. }
  187. }
  188. /**
  189. * Delete the object and its aggregates
  190. * @param 2427 object ID
  191. */
  192. public function delete(2427 = NULL)
  193. {
  194. 2427 = isset(2427) ? 2427 : $this->id;
  195. // delete the related Soro objects
  196. $repository = new TRepository('Soro');
  197. $criteria = new TCriteria;
  198. $criteria->add(new TFilter('idSolucao', '=', 2427));
  199. $repository->delete($criteria);
  200. // delete the related Hormonio objects
  201. $repository = new TRepository('Hormonio');
  202. $criteria = new TCriteria;
  203. $criteria->add(new TFilter('idSolucao', '=', 2427));
  204. $repository->delete($criteria);
  205. // delete the related AplicacaoHormonio objects
  206. $repository = new TRepository('AplicacaoHormonio');
  207. $criteria = new TCriteria;
  208. $criteria->add(new TFilter('idSolucao', '=', 2427));
  209. $repository->delete($criteria);
  210. // delete the object itself
  211. parent::delete(2427);
  212. }
  213. }
  214. ?>

Classe Soro
 
  1. <?php
  2. /**
  3. * Soro Active Record
  4. * @author <your-name-here>
  5. */
  6. class Soro extends TRecord
  7. {
  8. const TABLENAME = 'soro';
  9. const PRIMARYKEY= 'idSoro';
  10. const IDPOLICY = 'max'; // {max, serial}
  11. /**
  12. * Constructor method
  13. */
  14. public function __construct(2427 = NULL, $callObjectLoad = TRUE)
  15. {
  16. parent::__construct(2427, $callObjectLoad);
  17. parent::addAttribute('nomeSoro');
  18. parent::addAttribute('descSoro');
  19. parent::addAttribute('valorSoro');
  20. parent::addAttribute('qtdeAplicSoroKvP');
  21. parent::addAttribute('valorSoroAplicacao');
  22. parent::addAttribute('idSolucao');
  23. }
  24. }
  25. ?>

Classe Hormonio
 
  1. <?php
  2. /**
  3. * Hormonio Active Record
  4. * @author <your-name-here>
  5. */
  6. class Hormonio extends TRecord
  7. {
  8. const TABLENAME = 'hormonio';
  9. const PRIMARYKEY= 'idHormonio';
  10. const IDPOLICY = 'max'; // {max, serial}
  11. /**
  12. * Constructor method
  13. */
  14. public function __construct(2427 = NULL, $callObjectLoad = TRUE)
  15. {
  16. parent::__construct(2427, $callObjectLoad);
  17. parent::addAttribute('nomeHormonio');
  18. parent::addAttribute('descHormonio');
  19. parent::addAttribute('valorHormonio');
  20. parent::addAttribute('qtdeAplicKvP');
  21. parent::addAttribute('idSolucao');
  22. parent::addAttribute('valorHormonioAplicacao');
  23. }
  24. }
  25. ?>

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


LC

No método store ai da classe solução, faz um delete ai em soro que é relacionada com solução, acho q é isso, só que não esta deixando deletar por causa do foreign criado dentro do banco entre as tabelas, eu acho que é isso.
LC

No método store ai da classe solução, faz um delete ai em soro que é relacionada com solução, acho q é isso, só que não esta deixando deletar por causa do foreign criado dentro do banco entre as tabelas, eu acho que é isso.
PD

www.adianti.com.br/forum/pt/view_1993?duvida-sobre-o-composicao-mant