Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Acentuação em Grid do Mestre Detalhe Boa noite. Tenho um form Mestre Detalhe que funciona tudo perfeitamente. Só que quando incluo um produto que tenha acentuação ele simplesmente envia tudo codificado, exemplo: Aliança Ele adiciona como: ALIANÇA Já olhei em outros posts e até mesmo pelo google mas não encontro nada que resolva. Obrigado. Segue meu código: ...
CM
Acentuação em Grid do Mestre Detalhe  
Boa noite.
Tenho um form Mestre Detalhe que funciona tudo perfeitamente.
Só que quando incluo um produto que tenha acentuação ele simplesmente envia tudo codificado, exemplo:
Aliança
Ele adiciona como:
ALIANÇA

Já olhei em outros posts e até mesmo pelo google mas não encontro nada que resolva.

Obrigado.

Segue meu código:

  1. <?php
  1. <?php
  2. class ComprasFormMaster extends TPage
  3. {
  4.     protected $form// form
  5.     protected $detail_list;
  6.     
  7.     public function __construct()
  8.     {
  9.         parent::__construct();
  10.    
  11.         // creates the form
  12.         $this->form = new BootstrapFormBuilder('form_Compras');
  13.         $this->form->setFormTitle('REGISTRO COMPRA');
  14.         $this->form->setFieldSizes('100%');
  15.         
  16.         // master fields
  17.         $id_compra         = new TEntry('id_compra');
  18.         $data_compra       = new TDate('data_compra');
  19.         $tipo_compra_txt   = new TEntry('tipo_compra_txt');
  20.         $finalizada        = new TEntry('finalizada');
  21.         $finalizada        = new THidden('finalizada');
  22.        
  23.         $criteria = new TCriteria;
  24.         $criteria->setProperty('order''nome_cliente');
  25.         $cliente_id = new  ">TDBSeekButton('cliente_id''ourorio''form_Compras''Clientes''nome_cliente''cliente_id''cliente_txt'$criteria);
  26.         $cliente_txt = new TEntry('cliente_txt');
  27.         $cliente_txt->setEditable(FALSE);
  28.         
  29.        // define ação de saída do campo
  30.         $cliente_id->setExitAction(new TAction(array($this'onExitCliente')));
  31.         
  32.         $cliente_cep             = new THidden('cliente_cep');
  33.         $cliente_endereco_tipo   = new THidden('cliente_endereco_tipo');
  34.         $cliente_endereco        = new THidden('cliente_endereco');
  35.         $cliente_endereco_numero = new THidden('cliente_endereco_numero');
  36.         $cliente_bairro          = new THidden('cliente_bairro');
  37.         $cliente_cidade          = new THidden('cliente_cidade');
  38.         $cliente_estado          = new THidden('cliente_estado');
  39.         $cliente_telefone        = new THidden('cliente_telefone');
  40.         $cliente_nascimento      = new THidden('cliente_nascimento');
  41.         $cliente_identidade      = new THidden('cliente_identidade');
  42.         $cliente_email           = new THidden('cliente_email');
  43.         $cliente_cpf             = new THidden('cliente_cpf');
  44.        
  45.         $anexo_nf_joia_cliente   = new TFile('anexo_nf_joia_cliente');
  46.         $vendedor_txt            = new TEntry('vendedor_txt');
  47.         $vendedor_id             = new THidden('vendedor_id');
  48.         $loja_id                 = new TEntry('loja_id');
  49.         $loja_id                 = new THidden('loja_id');
  50.         $loja_txt                = new TEntry('loja_txt');
  51.         $finalizada              = new TEntry('finalizada');
  52.         $movimento_fechado       = new TEntry('movimento_fechado');
  53.         $movimento_fechado_em    = new TDate('movimento_fechado_em');
  54.         $valor_total             = new TDate('valor_total');
  55.         
  56.        //Campos Obrigatórios
  57.         $cliente_id->addValidation('Id do Cliente', new TRequiredValidator);
  58.         $cliente_txt->addValidation('Nome do Cliente', new TRequiredValidator);
  59.         $data_compra->addValidation('Data da Compra', new TRequiredValidator);
  60.     
  61.         // máscara Master
  62.         $data_compra ->setDatabaseMask('yyyy-mm-dd');
  63.         $data_compra ->setMask('dd/mm/yyyy');
  64.         $data_compra->setValue(date("Y-m-d"));
  65.         $loja_id->setValue(TSession::getValue('userunitid')) ; //id da unidade
  66.         $loja_id->setEditable(FALSE);
  67.         $loja_txt->setValue(TSession::getValue('userunitname')); //nome da unidade
  68.         $loja_txt->setEditable(FALSE);
  69.         $vendedor_txt->setEditable(FALSE);
  70.         $vendedor_txt->setValue(TSession::getValue('username')); //nome do usuário
  71.         $vendedor_id->setValue(TSession::getValue('userid'));//id usuario
  72.         $finalizada->setValue('1'); 
  73.         
  74.         // set sizes Master
  75.         $cliente_id->setSize('100%');
  76.         $cliente_txt->setSize('100%');
  77.         $vendedor_txt->setSize('100%');
  78.         $loja_txt->setSize('100%');
  79.         // detail fields
  80.         $detail_uniqid            = new THidden('detail_uniqid');
  81.         $detail_id_automatico     = new THidden('detail_id_automatico');
  82.         $detail_loja_sub_id       = new THidden('detail_loja_sub_id');
  83.         $detail_loja_sub_txt      = new THidden('detail_loja_sub_txt');
  84.         $detail_vendedor_sub_id   = new THidden('detail_vendedor_sub_id');
  85.         $detail_vendedor_sub_txt  = new THidden('detail_vendedor_sub_txt');
  86.         $detail_quantidade        = new TEntry('detail_quantidade');
  87.         $detail_quantidade        = new TNumeric('detail_quantidade'2''''true);
  88.         $detail_unidade           = new TEntry('detail_unidade');
  89.         $detail_descricao         = new TEntry('detail_descricao');
  90.         $detail_valor_unit        = new TEntry('detail_valor_unit');
  91.         $detail_subtotal          = new TEntry('detail_subtotal');
  92.         $detail_tipo_compra_id    = new TDBCombo('detail_tipo_compra_id''ourorio''ComprasTipo''id_tipo_compra''descricao','descricao');
  93.         $detail_tipo_compra_txt   = new TEntry('detail_tipo_compra_txt');
  94.         $detail_tipo_compra_txt   = new THidden('detail_tipo_compra_txt');
  95.         $detail_kilate_id         = new TDBCombo('detail_kilate_id''ourorio''ComprasKilate''id_kilate''descricao_kilate','descricao_kilate');
  96.         $detail_kilate_txt        = new TEntry('detail_kilate_txt');
  97.         $detail_kilate_txt        = new THidden('detail_kilate_txt');
  98.         $detail_valor_unit->setEditable(FALSE);
  99.         $detail_subtotal->setEditable(FALSE);
  100.         
  101.         // define ação ao Sair doo Campo
  102.         $detail_quantidade->setExitAction(new TAction(array($this'onUpdateTotal')));
  103.         
  104.         // define ação ao alterar a Combo
  105.         $detail_kilate_id->setChangeAction(new TAction(array($this'onChangeKilate')));
  106.         $detail_tipo_compra_id->setChangeAction(new TAction(array($this'onChangeTipoCompra')));
  107.         
  108.         // mascara detalhes
  109.         $detail_descricao->forceUpperCase();
  110.         $detail_unidade->forceUpperCase();
  111.         $detail_unidade->setValue('GR');
  112.         $detail_quantidade->setNumericMask(2',''.'truetrue);
  113.         $detail_valor_unit->setNumericMask(2',''.'true);
  114.         $detail_subtotal->setNumericMask(2',''.'true);
  115.         
  116.         if (!empty($id_compra))
  117.         {
  118.             $id_compra->setEditable(FALSE);
  119.         }
  120.         
  121.         // master fields
  122.         $row $this->form->addFields ([new TLabel('Código')], [$id_compra] ,
  123.                                        [new TLabel('Data')], [$data_compra] ,
  124.                                        [new TLabel('Oper.')], [$vendedor_txt],
  125.                                        [new THidden('Loja')], [$loja_txt]);
  126.         $row->layout = ['col-sm-1','col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-2','col-sm-0','col-3'];
  127.         
  128.         $row $this->form->addFields( [new TLabel('Anexo N.F. Joia')], [$anexo_nf_joia_cliente],
  129.                                        [new TLabel('ID')], [$cliente_id],
  130.                                        [new TLabel('Cliente')], [$cliente_txt]);
  131.         $row->layout = ['col-sm-1''col-sm-2','col-sm-1''col-sm-2','col-sm-1''col-sm-5'];
  132.         
  133.                                         
  134.         $row $this->form->addFields([new THidden('CEP')], [$cliente_cep],
  135.                                       [new THidden('Tipo')], [$cliente_endereco_tipo],
  136.                                       [new THidden('Endereço')], [$cliente_endereco],
  137.                                       [new THidden('Numero')], [$cliente_endereco_numero],
  138.                                       [new THidden('Bairro')], [$cliente_bairro],
  139.                                       [new THidden('Cidade')], [$cliente_cidade],
  140.                                       [new THidden('Estado')], [$cliente_estado],
  141.                                       [new THidden('Telefone')], [$cliente_telefone],
  142.                                       [new THidden('Nasc')], [$cliente_nascimento],
  143.                                       [new THidden('Identidade')], [$cliente_identidade],
  144.                                       [new THidden('Email')], [$cliente_email],
  145.                                       [new THidden('CPF')], [$cliente_cpf],
  146.                                       [new THidden('Op. ID')], [$vendedor_id]);
  147.         $row->layout = ['col-sm-1','col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-sm-4','col-sm-1','col-sm-2','col-sm-1''col-sm-2''col-sm-1','col-sm-2''col-sm-1','col-sm-2''col-sm-1','col-sm-2''col-sm-1','col-sm-2''col-sm-1','col-sm-2''col-sm-1','col-sm-2'];
  148.         
  149.         $row $this->form->addFields([new THidden('ID')], [$loja_id] );
  150.         $row->layout = ['col-sm-1''col-sm-3','col-sm-1''col-sm-3','col-sm-1','col-sm-3'];
  151.         
  152.         // detail fields
  153.         $this->form->addContent( ['<h4>Item(s) da Compra</h4><hr>'] );
  154.         $this->form->addFields( [$detail_uniqid] );
  155.         $this->form->addFields( [$detail_id_automatico] );
  156.         
  157.         $row $this->form->addFields( [new TLabel('Tipo')], [$detail_tipo_compra_id],
  158.                                        [new TLabel('Kilate')], [$detail_kilate_id],
  159.                                        [new TLabel('Quant')], [$detail_quantidade],
  160.                                        [new TLabel('Unidade')], [$detail_unidade] );
  161.         $row->layout = ['col-sm-1''col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-sm-2'];
  162.         
  163.         $row $this->form->addFields([new THidden('TipoTxt')], [$detail_tipo_compra_txt],
  164.                                        [new THidden('KilateTxt')], [$detail_kilate_txt]);
  165.         $row->layout = ['col-sm-1''col-sm-2','col-sm-1','col-sm-2'];
  166.         
  167.         
  168.         $row $this->form->addFields( [new TLabel('Produto')], [$detail_descricao],
  169.                                        [new TLabel('Valor')], [$detail_valor_unit],                                  
  170.                                        [new TLabel('Subtotal')], [$detail_subtotal]);
  171.         $row->layout = ['col-sm-1''col-sm-5','col-sm-1','col-sm-2','col-sm-1','col-sm-2'];
  172.     
  173.         $btn_add TButton::create('add', [$this'onDetailAdd'], 'Lança Produto''fa:plus-circle green');
  174.         $btn_add->getAction()->setParameter('static','1');
  175.         $this->form->addFields( [], [$btn_add] );
  176.         
  177.         
  178.         $this->detail_list = new BootstrapDatagridWrapper(new TDataGrid);
  179.         $this->detail_list->setId('ComprasSub_list');
  180.         $this->detail_list->generateHiddenFields();
  181.         $this->detail_list->style "min-width: 700px; width:100%;margin-bottom: 10px";
  182.         
  183.         // items
  184.         $this->detail_list->addColumn( new TDataGridColumn('uniqid''Uniqid''center') )->setVisibility(false);
  185.         $this->detail_list->addColumn( new TDataGridColumn('id_automatico''Id''center') )->setVisibility(false);
  186.         $quant $this->detail_list->addColumn( new TDataGridColumn('quantidade''Quant''right'50) );
  187.         $this->detail_list->addColumn( new TDataGridColumn('unidade''Unid''center'50) );
  188.         $this->detail_list->addColumn( new TDataGridColumn('descricao''Descrição''left'100) );
  189.         $this->detail_list->addColumn( new TDataGridColumn('tipo_compra_txt''Tipo''left'50) );
  190.         $this->detail_list->addColumn( new TDataGridColumn('kilate_txt''Kilate''left'50) );
  191.         $vlr_unit $this->detail_list->addColumn( new TDataGridColumn('valor_unit''Valor Unit''right'50) );
  192.         $this->detail_list->addColumn( new TDataGridColumn('loja_sub_id''Loja Id''left'100) )->setVisibility(false);
  193.         $this->detail_list->addColumn( new TDataGridColumn('loja_sub_txt''Loja txt''left'100) )->setVisibility(false);
  194.         $this->detail_list->addColumn( new TDataGridColumn('vendedor_sub_id''Vendedor id''left'100) )->setVisibility(false);
  195.         $this->detail_list->addColumn( new TDataGridColumn('vendedor_sub_txt''Vendedor txt''left'100) )->setVisibility(false);
  196.         $this->detail_list->addColumn( new TDataGridColumn('tipo_compra_id''Tipo Compra Id''left'50))->setVisibility(false);
  197.         $this->detail_list->addColumn( new TDataGridColumn('kilate_id''Kilate Id''left'50) )->setVisibility(false);
  198.  
  199.         $formula '={quantidade} * {valor_unit}';
  200.         $st $this->detail_list->addColumn( new TDataGridColumn($formula'SubTotal''right'100) );
  201.         
  202.         // definir o método do transformador sobre o Valor
  203.         $format_value = function($value) {
  204.             if (is_numeric($value))
  205.             {
  206.                 return ' ' number_format($value2',''.');
  207.             }
  208.             return $value;
  209.             };
  210.         $st->setTransformer($format_value);
  211.         $vlr_unit->setTransformer($format_value);
  212.         $quant->setTransformer($format_value);
  213.         
  214.         
  215.         // detail actions
  216.         $btn_edita_item = new TDataGridAction([$this'onDetailEdit'] );
  217.         //$btn_edita_item->setDisplayCondition( array($this, 'mostrar') );
  218.         $btn_edita_item->setFields( ['uniqid''*'] );    
  219.         
  220.         
  221.         $btn_deleta_item = new TDataGridAction([$this'onDetailDelete']);
  222.         //$btn_deleta_item->setDisplayCondition( array($this, 'mostrar') );
  223.         $btn_deleta_item->setField('uniqid');
  224.         
  225.         // add the actions to the datagrid
  226.         $this->detail_list->addAction($btn_edita_item_t('Edit'), 'fa:edit blue');
  227.         $this->detail_list->addAction($btn_deleta_item_t('Delete'), 'far:trash-alt red');
  228.        
  229.         
  230.         $this->detail_list->createModel();
  231.         
  232.         $panel = new TPanelGroup;
  233.         $panel->add($this->detail_list);
  234.         $panel->getBody()->style 'overflow-x:auto';
  235.         $this->form->addContent( [$panel] );
  236.         
  237.         $btn_gravar $this->form->addAction'SALVAR',  new TAction([$this'onSave'], ['static'=>'1']), 'fa:save white');
  238.         $btn_gravar->class 'btn btn-sm btn-primary';
  239.         
  240.         $btn_voltar $this->form->addAction('VOLTAR',new TAction(array('ComprasList','onReload')),'far:arrow-alt-circle-left white');
  241.         $btn_voltar->class 'btn btn-sm btn-danger';
  242.         
  243.         //BOTÃO PARA GERAR PDF
  244.         $btn_print $this->form->addAction('RECIBO COMPRA', new TAction(array($this'OnPDF')),'far:arrow-alt-circle-left white');
  245.         $btn_print->class 'btn btn-sm btn-secondary';
  246.         
  247.         
  248.         //BOTÃO FINALIZAR
  249.         //$btn_finaliza = $this->form->addAction('FINALIZA', new TAction(array($this, 'onConfirma')),'far:arrow-alt-circle-left white');
  250.         //$btn_finaliza->class = 'btn btn-sm btn-secondary';
  251.         
  252.             
  253.         // create the page container
  254.         $container = new TVBox;
  255.         $container->style 'width: 100%';
  256.         // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  257.         $container->add(TBreadCrumb::create(['COMPRAS''REGISTRO DE COMPRA']));
  258.         $container->add($this->form);
  259.         parent::add($container);
  260.     }
  261.     
  262.     public function mostrar$object )
  263.         {
  264.         if ($object->finalizada == 1)
  265.         {
  266.         return TRUE;
  267.         }
  268.         return FALSE;
  269.         } 
  270.         
  271.     /**
  272.      * Clear form
  273.      * @param $param URL parameters
  274.      */
  275.     public function onClear($param)
  276.     {
  277.         $this->form->clear(TRUE);
  278.     }
  279.     
  280.     /**
  281.      * Add detail item
  282.      * @param $param URL parameters
  283.      */
  284.     public function onDetailAdd$param )
  285.     {
  286.         try
  287.         {
  288.             $this->form->validate();
  289.             $data $this->form->getData();
  290.         
  291.             (new TRequiredValidator)->validate("Tipo de Compra"$data->detail_tipo_compra_id);
  292.             (new TRequiredValidator)->validate("Kilate do Produto"$data->detail_kilate_id);
  293.             (new TRequiredValidator)->validate("Quantidade"$data->detail_quantidade);
  294.             (new TRequiredValidator)->validate("Unidade"$data->detail_unidade);
  295.             (new TRequiredValidator)->validate("Produto"$data->detail_descricao);
  296.             
  297.             $uniqid = !empty($data->detail_uniqid) ? $data->detail_uniqid uniqid();
  298.             
  299.             $grid_data = [];
  300.             $grid_data['uniqid'] = $uniqid;
  301.             $grid_data['id_automatico'] = $data->detail_id_automatico;
  302.             $grid_data['quantidade'] = $data->detail_quantidade;
  303.             $grid_data['descricao'] = $data->detail_descricao;
  304.             $grid_data['unidade'] = $data->detail_unidade;
  305.             $grid_data['valor_unit'] = $data->detail_valor_unit;
  306.             $grid_data['subtotal'] = $data->detail_subtotal;
  307.             $grid_data['tipo_compra_id'] = $data->detail_tipo_compra_id;
  308.             $grid_data['tipo_compra_txt'] = $data->detail_tipo_compra_txt;
  309.             $grid_data['kilate_id'] = $data->detail_kilate_id;
  310.             $grid_data['kilate_txt'] = $data->detail_kilate_txt;
  311.             $grid_data['loja_sub_id'] = $data->loja_id;
  312.             $grid_data['loja_sub_txt'] = $data->loja_txt;
  313.             $grid_data['vendedor_sub_id'] = $data->vendedor_id;
  314.             $grid_data['vendedor_sub_txt'] = $data->vendedor_txt;
  315.         
  316.             // insert row dynamically
  317.             $row $this->detail_list->addItem( (object) $grid_data );
  318.             $row->id $uniqid;
  319.             
  320.             TDataGrid::replaceRowById('ComprasSub_list'$uniqid$row);
  321.             
  322.             // clear detail form fields
  323.             $data->detail_uniqid '';
  324.             $data->detail_id_automatico '';
  325.             $data->detail_quantidade '';
  326.             $data->detail_descricao '';
  327.             $data->detail_unidade '';
  328.             $data->detail_valor_unit '';
  329.             $data->detail_subtotal '';
  330.             $data->detail_tipo_compra_id '';
  331.             $data->detail_tipo_compra_txt '';
  332.             $data->detail_kilate_id '';
  333.             $data->detail_kilate_txt '';
  334.             $data->detail_loja_sub_id '';
  335.             $data->detail_loja_sub_txt '';
  336.             $data->detail_vendedor_sub_id '';
  337.             $data->detail_vendedor_sub_txt '';
  338.             
  339.             // send data, do not fire change/exit events
  340.             TForm::sendData'form_Compras'$datafalsefalse );
  341.         }
  342.         catch (Exception $e)
  343.         {
  344.             $this->form->setData$this->form->getData());
  345.             new TMessage('error'$e->getMessage());
  346.         }
  347.     }
  348.     
  349.     /**
  350.      * Edit detail item
  351.      * @param $param URL parameters
  352.      */
  353.     public static function onDetailEdit$param )
  354.     {
  355.         $data = new stdClass;
  356.         $data->detail_uniqid             $param['uniqid'];
  357.         $data->detail_id_automatico      $param['id_automatico'];
  358.         $data->detail_quantidade         $param['quantidade'];
  359.         $data->detail_descricao          $param['descricao'];
  360.         $data->detail_unidade            $param['unidade'];
  361.         $data->detail_valor_unit         $param['valor_unit'];
  362.         $data->detail_subtotal           $param['subtotal'];
  363.         $data->detail_tipo_compra_id     $param['tipo_compra_id'];
  364.         $data->detail_tipo_compra_txt    $param['tipo_compra_txt'];
  365.         $data->detail_kilate_id          $param['kilate_id'];
  366.         $data->detail_kilate_txt         $param['kilate_txt'];
  367.         $data->detail_loja_sub_id        $param['detail_loja_sub_id'];
  368.         $data->detail_loja_sub_txt       $param['detail_loja_sub_txt'];
  369.         $data->detail_vendedor_sub_id    $param['detail_vendedor_sub_id'];
  370.         $data->detail_vendedor_sub_txt   $param['detail_vendedor_sub_txt'];
  371.         // send data, do not fire change/exit events
  372.         TForm::sendData'form_Compras'$datafalsefalse );
  373.         
  374.     }
  375.     
  376.     /**
  377.      * Delete detail item
  378.      * @param $param URL parameters
  379.      */
  380.     public static function onDetailDelete$param )
  381.     {
  382.         // clear detail form fields
  383.         $data = new stdClass;
  384.         $data->detail_uniqid '';
  385.         $data->detail_id_automatico '';
  386.         $data->detail_quantidade '';
  387.         $data->detail_descricao '';
  388.         $data->detail_unidade '';
  389.         $data->detail_valor_unit '';
  390.         $data->detail_subtotal '';
  391.         $data->detail_tipo_compra_id '';
  392.         $data->detail_tipo_compra_txt '';
  393.         $data->detail_kilate_id '';
  394.         $data->detail_kilate_txt '';
  395.         $data->detail_loja_sub_id '';
  396.         $data->detail_loja_sub_txt '';
  397.         $data->detail_vendedor_sub_id '';
  398.         $data->detail_vendedor_sub_txt '';
  399.         
  400.         // send data, do not fire change/exit events
  401.         TForm::sendData'form_Compras'$datafalsefalse );
  402.         
  403.         // remove row
  404.         TDataGrid::removeRowById('ComprasSub_list'$param['uniqid']);
  405.     }
  406.     
  407.     /**
  408.      * Load Master/Detail data from database to form
  409.      */
  410.     public function onEdit($param)
  411.     {
  412.         try
  413.         {
  414.             TTransaction::open('ourorio');
  415.                
  416.             if (isset($param['key']))
  417.             {
  418.                 $key $param['key'];
  419.                 
  420.                 $object = new Compras($key);
  421.                 
  422.                 
  423.                  //Bloquear campos de acordo com o Status 
  424.                 if ($object->finalizada=='0'
  425.                   { 
  426.                    TDate::enableField('form_Compras''data_compra');
  427.                    TDBCombo::enableField('form_Compras''cliente_id');
  428.                     ">TDBSeekButton::enableField('form_Compras''cliente_id');
  429.                    TButton::enableField('form_Compras''btn_limpar');
  430.                    TButton::enableField('form_Compras''btn_salvar'); 
  431.                   }
  432.                if ($object->finalizada=='1'
  433.                   { 
  434.                    TDate::disableField('form_Compras''data_compra');
  435.                    TDBCombo::disableField('form_Compras''cliente_id');
  436.                    TButton::disableField('form_Compras''btn_limpar');
  437.                    TButton::disableField('form_Compras''btn_salvar'); 
  438.                   }
  439.                    
  440.                    
  441.                 $items  ComprasSub::where('compra_id''='$key)->load();
  442.                 
  443.                 foreach( $items as $item )
  444.                 {
  445.                     $item->uniqid uniqid();
  446.                     $row $this->detail_list->addItem$item );
  447.                     $row->id $item->uniqid;
  448.                 }
  449.                 $this->form->setData($object);
  450.                 TTransaction::close();
  451.             }
  452.             else
  453.             {
  454.                 $this->form->clear(TRUE);
  455.             }
  456.         }
  457.         catch (Exception $e// in case of exception
  458.         {
  459.             new TMessage('error'$e->getMessage());
  460.             TTransaction::rollback();
  461.         }
  462.     }
  463.     
  464.     /**
  465.      * Save the Master/Detail data from form to database
  466.      */
  467.     public function onSave($param)
  468.     {
  469.         try
  470.         {
  471.             // open a transaction with database
  472.             TTransaction::open('ourorio');
  473.             
  474.             $data $this->form->getData();
  475.             $this->form->validate();
  476.             
  477.             $master = new Compras;
  478.             $master->fromArray( (array) $data);
  479.             $master->store();
  480.             
  481.             ComprasSub::where('compra_id''='$master->id_compra)->delete();
  482.             
  483.             if( $param['ComprasSub_list_quantidade'] )
  484.             {
  485.                 foreach( $param['ComprasSub_list_quantidade'] as $key => $item_id )
  486.                 {
  487.                     $detail = new ComprasSub;
  488.                     $detail->quantidade       $param['ComprasSub_list_quantidade'][$key];
  489.                     $detail->descricao        $param['ComprasSub_list_descricao'][$key];
  490.                     $detail->unidade          $param['ComprasSub_list_unidade'][$key];
  491.                     $detail->valor_unit       $param['ComprasSub_list_valor_unit'][$key];
  492.                     $detail->tipo_compra_id   $param['ComprasSub_list_tipo_compra_id'][$key];
  493.                     $detail->tipo_compra_txt  $param['ComprasSub_list_tipo_compra_txt'][$key];
  494.                     $detail->kilate_id        $param['ComprasSub_list_kilate_id'][$key];
  495.                     $detail->kilate_txt       $param['ComprasSub_list_kilate_txt'][$key];
  496.                     $detail->loja_sub_id      $param['ComprasSub_list_loja_sub_id'][$key];
  497.                     $detail->loja_sub_txt     $param['ComprasSub_list_loja_sub_txt'][$key];
  498.                     $detail->vendedor_sub_id  $param['ComprasSub_list_vendedor_sub_id'][$key];
  499.                     $detail->vendedor_sub_txt $param['ComprasSub_list_vendedor_sub_txt'][$key];
  500.                     $detail->compra_id       $master->id_compra;
  501.                     
  502.                     $detail->subtotal = ($detail->quantidade $detail->valor_unit);
  503.                     
  504.                     $master->valor_total += $detail->subtotal;
  505.                     $detail->store();
  506.                 }
  507.             }
  508.                     //FINALIZAR A VENDA
  509.                     $master->finalizada 1;
  510.                     $master->store();
  511.             
  512.             TTransaction::close(); // close the transaction
  513.             
  514.             TForm::sendData('form_Compras', (object) ['id' => $master->id_compra]);
  515.      
  516.             TToast::show('show','COMPRA GRAVADA COM SUCESSO!''center''fas fa-check');
  517.             AdiantiCoreApplication::loadPage'ComprasList' );
  518.             exit;
  519.             
  520.         }
  521.         catch (Exception $e// in case of exception
  522.         {
  523.             new TMessage('error'$e->getMessage());
  524.             $this->form->setData$this->form->getData() ); // keep form data
  525.             TTransaction::rollback();
  526.         }
  527.     }
  528.     
  529.      public function OnPDF($param)
  530.     {
  531.     
  532.      // open a transaction with database 'samples'
  533.       TTransaction::open('ourorio');
  534.             
  535.      // load all customers
  536.      $repository = new TRepository('ComprasSub');
  537.      $criteria = new TCriteria;
  538.      $ComprasSub $repository->load($criteria);
  539.      
  540.      $data $this->form->getData('ComprasSub');
  541.      $this->form->validate();
  542.   
  543.      $pdf = new TPDFDesigner;
  544.      $pdf->fromXml('app/reports/recibo_compra_cliente.pdf.xml');
  545.    
  546.    // cabeçalho
  547.      $pdf->replace('{id_compra}',$data->id_compra);
  548.      $pdf->replace('{data_compra}',DateTime::createFromFormat('Y-m-d'$data->data_compra)->format'd/m/Y' ));
  549.      $pdf->replace('{cliente_txt}',utf8_decode($data->cliente_txt));
  550.      $pdf->replace('{endereco_tipo}',utf8_decode($data->cliente_endereco_tipo), 00'L');
  551.      $pdf->replace('{endereco_numero}',utf8_decode($data->cliente_endereco_numero), 00'L');
  552.      $pdf->replace('{endereco}',utf8_decode($data->cliente_endereco), 00'L');
  553.      $pdf->replace('{bairro}',utf8_decode($data->cliente_bairro), 00'L');
  554.   
  555.      $pdf->replace('{cpf}',utf8_decode($data->cliente_cpf), 00'L');
  556.      $pdf->replace('{identidade}',utf8_decode($data->cliente_identidade), 00'L');
  557.      $pdf->replace('{telefone}',utf8_decode($data->cliente_telefone), 00'L');
  558.      $pdf->replace('{nascimento}',DateTime::createFromFormat('Y-m-d'$data->cliente_nascimento)->format'd/m/Y' ));
  559.      $pdf->replace('{cidade}',utf8_decode($data->cliente_cidade), 00'L');
  560.      $pdf->replace('{estado}',utf8_decode($data->cliente_estado), 00'L');
  561.      $pdf->replace('{email}',utf8_decode($data->cliente_email), 00'L');
  562.    
  563.      $pdf->replace('{vendedor_txt}',utf8_decode($data->vendedor_txt));
  564.      $pdf->replace('{loja_txt}',utf8_decode($data->loja_txt));
  565.      $pdf->replace('{loja_id}',utf8_decode($data->loja_id));
  566.     
  567.      $pdf->generate();
  568.      $fill TRUE
  569.      // Itens do Pedido
  570.              $tot 0;  // acrescentei aqui
  571.              
  572.              
  573.              foreach ($ComprasSub as $pedido_list)
  574.                  {
  575.                  if($pedido_list->compra_id == $data->id_compra)  // alterei aqui para testar
  576.                  {
  577.                     $pdf->gotoAnchorX('detalhes');
  578.                     $pdf->Ln(20);
  579.                     $pdf->Cell(5012utf8_decode($pedido_list->quantidade), 00'R');
  580.                     $pdf->Cell(2512utf8_decode($pedido_list->unidade), 00'R');
  581.                     $pdf->Cell(10012utf8_decode($pedido_list->descricao), 00'L');
  582.                     $pdf->Cell(17012utf8_decode($pedido_list->kilate_txt), 00'R');
  583.                     $pdf->Cell(5012utf8_decode($pedido_list->tipo_compra_txt), 00'R');
  584.                     $pdf->Cell(11512number_format((double)$pedido_list->valor_unit2',''.'), 00'R');
  585.                     $pdf->Cell(7012number_format((double)$pedido_list->subtotal2',''.'), 00'R');
  586.                     
  587.                     $tot $tot $pedido_list->subtotal;  // acrescentei aqui
  588.                     
  589.                     // grid background
  590.                     $fill = !$fill;
  591.                }
  592.             }      
  593.     
  594.      $pdf->Ln(4);
  595.      $pdf->SetX(18); 
  596.      $pdf->Cell(57014utf8_decode(""),'B','R'$fill);
  597.        
  598.      $pdf->Ln(20);
  599.      $pdf->SetX(50);
  600.      $pdf->Cell(53014utf8_decode("Total R$ "number_format((double)$tot2',''.')),0,0,'R');   // acrescentei aqui
  601.      
  602.      $pdf->Ln(50);
  603.      $pdf->SetX(18); 
  604.      $pdf->MultiCell(56014utf8_decode("      Eu, "utf8_decode($data->cliente_txt) . ", declaro, para todos os fins, de direito e sob as penas da Lei 12.683 de * de julho de 2012 e  artigos 155, 156 e 157 todos do Código Penal Brasileiro, em todas as esferas,em juízo ou fora dele, ser o(a) legítimo(a) Proprietário(a) do(s) objeto(s) e/ou ouro velho que, no presente ato vendo a Quality Serviços e Comércio de Metais Preciosos Ltda, declarando ainda que não transfiro em caráter absoluto nenhuma de minhas responsabilidades a referida empresa quanto a procedência, descrição e autenticidade do(s) objeto(s) e/ou ouro velho o(s) qual(is) foi(ram) por mim legalmente adquirido(s) e está(ão) livre(s) e desembaraçada(s) de quaisquer ônus ou pendência(s).
  605.       Respondo sempre e, em quaisquer circunstâncias, pelos termos desta Declaração a qual assino em via única."),0,'J'$fill);
  606.      
  607.      $pdf->Ln(200);
  608.      $pdf->SetX(20);
  609.      $pdf->Cell(56014,DateTime::createFromFormat('Y-m-d'$data->data_compra)->format'd' ). ' de ' .DateTime::createFromFormat('Y-m-d'$data->data_compra)->format'M' ). ' de ' .DateTime::createFromFormat('Y-m-d'$data->data_compra)->format'Y' ),0,0,'L');  
  610.      
  611.    
  612.     // inicio do rodapé
  613.      $pdf->SetY(-25);
  614.      $pdf->SetFont('Arial'''8);
  615.      $pdf->setFontColorRGB'#000000' );
  616.      $pdf->Cell(59010utf8_decode('Pág. ').$pdf->PageNo().' de {nb}',0,0,'R');
  617.      $pdf->SetY(-25);
  618.      $pdf->Cell(14010utf8_decode('Sistema Gestor OuroRio © 2021 '),0,0,'R');
  619.      $pdf->SetY(-25);
  620.      $pdf->Cell(340,10,utf8_decode("Impresso em ".date("d/m/Y H:i:s"."")),0,1,'R');
  621.      $pdf->SetY(-25);
  622.      $pdf->Cell(420,10,utf8_decode(" Por ".TSession::getValue('username')),0,1,'R'); //nome do usuário 
  623.      // fim do rodapé
  624.     
  625.    
  626.      $file="app/output/Recibo - ".$data->loja_txt.".pdf"
  627.     
  628.      if (!file_exists($file) OR is_writable($file))
  629.      {
  630.      $pdf->save($file);
  631.    
  632.      //Abrir PDF em Janela Modal dentro do Sistema
  633.      $window TWindow::create($data->loja_txt0.80.8);
  634.                 $object = new TElement('object');
  635.                 $object->data  $file;
  636.                 $object->type  'application/pdf';
  637.                 $object->style "width: 100%; height:calc(100% - 10px)";
  638.                 $window->add($object);
  639.                 $window->show();
  640.                 
  641.      }
  642.      else
  643.      {
  644.      throw new Exception(_t('Permission denied') . ': ' $file);
  645.      } 
  646.     
  647.      TToast::show('success','RECIBO GERADO COM SUCESSO!''top left''fas fa-check');
  648.     
  649.      TTransaction::close();
  650.      AdiantiCoreApplication::loadPage'ComprasList' );
  651.      exit;
  652.     
  653.      }
  654.     // CÓDIGO PARA PASSAR DADOS DO CLIENTE AOS CAMPOS
  655.     public static function onExitCliente($param)
  656.     {
  657.         $cliente_id $param['cliente_id']; // get the product code
  658.         try
  659.         {
  660.             TTransaction::open('ourorio');
  661.             $cliente = new Clientes($cliente_id); // reads the product
  662.             
  663.             $obj = new StdClass;
  664.             $obj->cliente_cep             = ($cliente->cep);
  665.             $obj->cliente_endereco_tipo   = ($cliente->endereco_tipo);
  666.             $obj->cliente_endereco        = ($cliente->endereco);
  667.             $obj->cliente_endereco_numero = ($cliente->endereco_numero);
  668.             $obj->cliente_bairro          = ($cliente->bairro);
  669.             $obj->cliente_cidade          = ($cliente->cidade);
  670.             $obj->cliente_estado          = ($cliente->estado);
  671.             $obj->cliente_telefone        = ($cliente->telefone);
  672.             $obj->cliente_nascimento      = ($cliente->data_nascimento);
  673.             $obj->cliente_identidade      = ($cliente->identidade);
  674.             $obj->cliente_email           = ($cliente->email);
  675.             $obj->cliente_cpf             = ($cliente->cpf);
  676.                      
  677.             TTransaction::close();
  678.             TForm::sendData('form_Compras'$obj);
  679.         }
  680.         catch (Exception $e)
  681.         {
  682.             new TMessage('error'$e->getMessage());
  683.             $this->form->setData$this->form->getData() ); // keep form data
  684.             TTransaction::rollback();
  685.         }
  686.     }
  687.      // CÓDIGO PARA PASSAR VALORES DO COMBO KILATE AO CAMPO VALOR UNITÁRIO E DESCRIÇÃO
  688.     public static function onChangeKilate($param)
  689.     {
  690.         $detail_kilate_id $param['detail_kilate_id']; // get the product code
  691.  
  692.         try
  693.         {
  694.             TTransaction::open('ourorio');
  695.             $kilate = new ComprasKilate($detail_kilate_id); // reads the product
  696.       
  697.             $obj = new StdClass;
  698.             $obj->detail_valor_unit  number_format($kilate->valor_unit2',''.');
  699.             $obj->detail_kilate_txt  utf8_decode($kilate->descricao_kilate);
  700.             
  701.             // CÁLCULO DO PRODUTO
  702.             
  703.             $detail_quantidade     = (double) str_replace(['.'','], ['''.'], $param['detail_quantidade']);
  704.             $obj->detail_subtotal  number_format($kilate->valor_unit $detail_quantidade2',''.'); 
  705.                   
  706.             TScript::create('setTimeout(function() { $("input[name=\'detail_quantidade\']").focus() }, 500);');
  707.             
  708.             TTransaction::close();
  709.             TForm::sendData('form_Compras'$obj);
  710.         }
  711.         catch (Exception $e)
  712.         {
  713.             new TMessage('error'$e->getMessage());
  714.             $this->form->setData$this->form->getData() ); // keep form data
  715.             TTransaction::rollback();
  716.         }
  717.     }
  718.  // CÓDIGO PARA CALCULAR VALOR TOTAL DOS PRODUTOS
  719.     public static function onUpdateTotal($param)
  720.     {
  721.         $detail_valor_unit = (double) str_replace(['.'','], ['''.'], $param['detail_valor_unit']);
  722.         $detail_quantidade     = (double) str_replace(['.'','], ['''.'], $param['detail_quantidade']);
  723.         $obj = new StdClass;    
  724.         $obj->detail_subtotal number_format( ($detail_valor_unit $detail_quantidade), 2',''.');
  725.         TForm::sendData('form_Compras'$obj);
  726.     }
  727.   
  728.   
  729.   // CÓDIGO PARA PASSAR VALORES DO COMBO TIPO DE COMPRA AO CAMPO DO DETALHE
  730.     public static function onChangeTipoCompra($param)
  731.     {
  732.         $detail_tipo_compra_id $param['detail_tipo_compra_id']; // get the product code
  733.         try
  734.         {
  735.             TTransaction::open('ourorio');
  736.             $tipo_compraId     = new ComprasTipo($detail_tipo_compra_id); // reads the product
  737.            
  738.       
  739.             $obj = new StdClass;
  740.             $obj->detail_tipo_compra_txt  = ($tipo_compraId->descricao);
  741.             
  742.             TScript::create('setTimeout(function() { $("input[name=\'detail_kilate_id\']").focus() }, 500);');
  743.            
  744.             TTransaction::close();
  745.             TForm::sendData('form_Compras'$obj);
  746.         }
  747.         catch (Exception $e)
  748.         {
  749.             new TMessage('error'$e->getMessage());
  750.             $this->form->setData$this->form->getData() ); // keep form data
  751.             TTransaction::rollback();
  752.         }
  753.     }
  754.     
  755.     public static function onConfirma($param)
  756.     {
  757.     $action = new TAction(array(__CLASS__'ConfirmarCompra'));
  758.     $action->setParameters($param);
  759.     
  760.     new TQuestion('Confirma os Dados da Compra ?'$action);
  761.     } 
  762.     
  763.     public static function ConfirmarCompra$param )
  764.     {
  765.     try
  766.     {
  767.     TTransaction::open('ourorio');
  768.     $repository = new TRepository('Compras');
  769.     
  770.     TToast::show('show','COMPRA REGISTRADA COM SUCESSO!''center''fas fa-check');
  771.     AdiantiCoreApplication::loadPage'ComprasList' );
  772.     //TPage::openFile('app/output/Recibo.pdf'); 
  773.     
  774.     
  775.     TTransaction::close();
  776.     }
  777.     catch (Exception $e)
  778.     {
  779.     new TMessage('error''Error ' $e->getMessage());
  780.     TTransaction::rollback();
  781.     }
  782.     } 
  783.     
  784. }
  785. ?>

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (24)


MG

Veja este artigo:

https://www.adianti.com.br/forum/pt/view_572?acentos-utf-8
CM

Marcelo já havia visto este post.
Como o próprio Pablo explicou que nas próximas versões ja viria corrigido.

E este post é de 2013.

Não resolve, inclusive a classe TConnection já está desta forma.

Esse meu problema só acontece no detalhe. O mestre está correto.
MG

Verificou o charset/collation do banco/tabela?
CM

Uso:

Charset: utf8mb4
Collation:utf8mb4_general_ci
MG

Veja se este artigo pode ajudar?
https://pt.stackoverflow.com/questions/72139/qual-codifica%C3%A7%C3%A3o-de-caracteres-collation-devo-usar-em-mysql
NR

Qual a versão do Adianti? Se não me engano, esse problema ocorria ao adicionar um item de forma estática na grid, mas foi corrigido na última versão.
CM

Oi Nataniel. Estou com a última mais atualizada. Studio: 5
Framework: 7
NR

A última versão do Studio é a 7.0.0 e a do framework é a 7.3.0
CM

Eu enviei pelo telefone. Mas as minhas versões são essas mesmas Nataniel.
Studio: 7.0.0
Framework: 7.3.0
CM

Marcelo, já havia lido este site.
Fiz a modificação, mas não adiantou.
MG

Claudio
Se o Nataniel ( que é um dos adm do Fw) não conseguiu te ajudar!!!
Aqui comigo isso não ocorre.
O meu studio está usando a última versão do FW e meus projetos também e não tive problemas.
Não sei como ajudar mais.

CM

Imagino Marcelo. Sei que o Nataniel é o fera do FW.
Obrigado pela ajuda.
Vou me virar aqui.
Abraço
CM

Nataniel, será que haveria possibilidade de ver se o Pablo pode ajudar?
Rapaz, só falta isso pra terminar meu sistema, tenho que entregar ao Cliente semana que vem e não consigo resolver esse problema.
Até aqui não encontrei nada que ajude.
Obrigado.
B

Cláudio,

Já tentou apelar para como converter a string
  1. <?php
  2.         if ( mb_detect_encoding($string'UTF-8'true)!='UTF-8' ){
  3.             //$string= iconv('ISO-8859-1', 'UTF-8', $string);
  4.             $string utf8_encode($string);
  5.             //$string = mb_convert_encoding($string, 'UTF-8');
  6.         }
  7. ?>


Pelo que vc já está ultima versão do FrameWork e o banco já está em UTF-8. A minha sugestão é algo meio tentativa e erro.
CM

Boa tarde Bjverde.
Poderia explicar como e onde aplico esse código?
Sou novato. Rsrs
Obrigado
B

Cláudio vc tentar fazer setTransformer


  1. <?php 
  2. $descricao $this->detail_list->addColumn( new TDataGridColumn('descricao''Descrição''left'100) );
  3. $formatDescricaoString = function($value) {
  4.         if ( mb_detect_encoding($value'UTF-8'true)!='UTF-8' ){
  5.             //$value= iconv('ISO-8859-1', 'UTF-8', $value);
  6.             $value utf8_encode($value);
  7.             //$value = mb_convert_encoding($value, 'UTF-8');
  8.         }
  9.         return $value;
  10. };
  11. $descricao->setTransformer($formatDescricaoString);
  12. ?>
CM

Nada feito irmão. Fica na mesma.
É incrível como um problema ocorre e não temos a quem recorrer a não ser os amigos do fórum. Não existe suporte.
O próprio Pablo não dá nem as caras no fórum pra ajudar as pessoas, sei que ele não tem obrigação e muito menos tempo pra isso.
Mas acho que em certos momentos deveria aparecer pra dá uma luz.
Estou encrencado em um problema que é do próprio framework e não consigo resolver, até no grupo do Telegram a galera está tentando ajudar.
Lamentável.
NR

Cole aqui a função ttable_replace_row_by_id do arquivo lib/adianti/include/ttable/ttable.js, quero ver um detalhe.
CM

Oi Nataniel, segue.

  1. <?php
  2. function ttable_replace_row_by_id(table_ididrow)
  3. {
  4.     if ($('#' table_id ' tbody').find('#'+id).length 0) {
  5.         $('#' table_id ' tbody').find('#'+id).replaceWith(atob(row));
  6.     }
  7.     else {
  8.         $('#' table_id ' tbody').append(atob(row));
  9.     }
  10. ?>
NR

Você deve estar rodando a versão 7.0 do Framework, a partir da 7.1 essa função foi modificada.

Como você criou o projeto? Baixou o Studio e criou um novo projeto? Se sim, a versão padrão do framework que vem com o Studio é a 7.0.

Para atualizar a base de códigos para os próximos projetos criados com o Studio, veja o link abaixo:
https://www.adianti.com.br/forum/pt/view_6407?dica-em-video-como-atualizar-na-ad

Para atualizar projetos já existentes:
https://www.adianti.com.br/framework-migration
CM

Versão atualizada para 7.1, mas não resolveu o problema.

Segue o código modificado após a atualização.

  1. <?php
  2. function ttable_replace_row_by_id(table_ididrow)
  3. {
  4.     if ($('#' table_id ' tbody').find('#'+id).length 0) {
  5.         $('#' table_id ' tbody').find('#'+id).replaceWith(base64_decode(row));
  6.     }
  7.     else {
  8.         $('#' table_id ' tbody').append(base64_decode(row));
  9.     }
  10. ?>
B

Cláudio,

Baixa um versão limpa do Adianti 7.3 (só frame work, sem o template) e testa só essa tela com mestra detalhe. Para ver se resolve o problema
CM

O que você diz com versão limpa?
Baixar uma nova versão do Framerork 7.3?
Vou fazer isso amanhã.
Hoje estou morto.
Me inscrevi no seu canal hoje hein!!
Obrigado irmão.
CM

Bjverde boa tarde.
Não adiantou. Tudo na mesma irmão.
Que coisa isso, não é possível que um problema desse não tenha solução.