PD
Conversão de datas e valores monetários
Fechado
Ao longo de muito tempo ajudando a responder dúvidas aqui no fórum, percebemos algumas questões repetidas, como é o caso de conversões de formatos de data e também de valores monetários no momento de salvar e editar formulários. Por isso resolvi escrever este artigo, para explicar como tratar valores em Reais, e também datas no formato brasileiro sempre que formos editar e salvar registros em um formulário.
Inicialmente, vou explicar somente alguns trechos do programa, e no final colocarei um link para o programa completo. Neste cenário apresentado, temos um programa simples de cadastro de filmes com campos como: id, título, autor, data da compra, e valor. Claro que em um programa real precisaríamos de muitas outras informações, mas como o propósito aqui não é construir um programa real para cadastro de livros, e sim demonstrar conversões de valores, ele vai servir bem.
Começamos pelo método construtor, onde temos a definição do formulário e dos campos. O campo de data (dt_compra) é do tipo TDate. Para que ele seja apresentado com a máscara correta no formulário, é preciso executar o método setMask() indicando a máscara correta para o formato brasileiro. Já o campo de valor é do tipo TEntry, e nesse caso utilizamos o método setNumericMask() para definir a quantidade de separadores decimais, os caracteres separadores e um booleano ao final. Este booleano indica se a máscara deve ser removida no post (TRUE) ou não. É importante utilizarmos TRUE, para que o valor seja recebido no Post sem a formatação.
Já na continuação da classe, no método onSave(), precisamos realizar a conversão dos valores antes de salvar os dados do formulário. O campo numérico (valor) não precisa ser convertido, pois a função setNumericMask() já indicou em seu último parâmetro (TRUE), que a formatação deve ser removida. Já o campo de data (dt_compra) precisa ser convertido do formato d/m/Y para Y-m-d, que é o mais usado em bases de dados. Para isso, usamos o método DateTime::format() que é nativo do PHP.
Assim como convertemos o valor no momento de salvar, também precisamos fazer no momento de carregar os dados para o formulário. Neste caso, o campo de data (dt_compra) que na base de dados está no formato Y-m-d, precisa ser convertido para o formato usado no formulário que é d/m/Y. Para tal, também vamos usar o método DateTime::format() que é nativo do PHP.
pastebin.com/jEGBUFkh
Inicialmente, vou explicar somente alguns trechos do programa, e no final colocarei um link para o programa completo. Neste cenário apresentado, temos um programa simples de cadastro de filmes com campos como: id, título, autor, data da compra, e valor. Claro que em um programa real precisaríamos de muitas outras informações, mas como o propósito aqui não é construir um programa real para cadastro de livros, e sim demonstrar conversões de valores, ele vai servir bem.
Começamos pelo método construtor, onde temos a definição do formulário e dos campos. O campo de data (dt_compra) é do tipo TDate. Para que ele seja apresentado com a máscara correta no formulário, é preciso executar o método setMask() indicando a máscara correta para o formato brasileiro. Já o campo de valor é do tipo TEntry, e nesse caso utilizamos o método setNumericMask() para definir a quantidade de separadores decimais, os caracteres separadores e um booleano ao final. Este booleano indica se a máscara deve ser removida no post (TRUE) ou não. É importante utilizarmos TRUE, para que o valor seja recebido no Post sem a formatação.
- <?php
- class LivroForm extends TPage
- {
- protected $form; // form
- public function __construct( $param )
- {
- parent::__construct();
- // parte da criação do form...
- $this->form = new TQuickForm('form_Livro');
- // parte da criação dos campos...
- $id = new TEntry('id');
- $dt_compra = new TDate('dt_compra');
- $valor = new TEntry('valor');
- // definição de mascara
- $dt_compra->setMask('dd/mm/yyyy');
- // definição de formato numerico
- $valor->setNumericMask(2,',', '.', true);
- // restante do construtor
- }
- // ...
- ?>
Já na continuação da classe, no método onSave(), precisamos realizar a conversão dos valores antes de salvar os dados do formulário. O campo numérico (valor) não precisa ser convertido, pois a função setNumericMask() já indicou em seu último parâmetro (TRUE), que a formatação deve ser removida. Já o campo de data (dt_compra) precisa ser convertido do formato d/m/Y para Y-m-d, que é o mais usado em bases de dados. Para isso, usamos o método DateTime::format() que é nativo do PHP.
- <?php
- public function onSave( $param )
- {
- try {
- TTransaction::open('samples'); // abre a transação
- $object = new Livro; // cria um objeto vazio
- $data = $this->form->getData(); // obtém os dados do form
- $object->fromArray( (array) $data); // carrega o objeto com os dados
- // AQUI CONVERSÃO PARA SALVAR OS DADOS
- $object->dt_compra = DateTime::createFromFormat('d/m/Y', $object->dt_compra)->format( 'Y-m-d' );
- $object->store(); // salva o objeto
- // obtém o id do objeto
- $data->id = $object->id;
- $this->form->setData($data); // preenche o formulário
- TTransaction::close(); // fecha a transação
- new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
- }
- // ...
- }
- ?>
Assim como convertemos o valor no momento de salvar, também precisamos fazer no momento de carregar os dados para o formulário. Neste caso, o campo de data (dt_compra) que na base de dados está no formato Y-m-d, precisa ser convertido para o formato usado no formulário que é d/m/Y. Para tal, também vamos usar o método DateTime::format() que é nativo do PHP.
- <?php
- public function onEdit( $param )
- {
- try {
- if (isset($param['key'])) {
- $key = $param['key']; // obtém o parâmetro $key
- TTransaction::open('samples'); // abre a transação
- $object = new Livro($key); // instancia o Active Record
- // AQUI CONVERSÃO PARA CARREGAR OS DADOS
- $object->dt_compra = DateTime::createFromFormat('Y-m-d', $object->dt_compra)->format( 'd/m/Y' );
- $this->form->setData($object); // preenche o form
- TTransaction::close(); // fecha a transação
- }
- else {
- $this->form->clear();
- }
- }
- // ...
- }
- ?>
pastebin.com/jEGBUFkh
Pablo,
Tenho um formulário mestre detalhes que ao inserir itens do detalhe perde a formatação dos campos do mestre.
Ao inserir o primeiro item, perde parcialmente e ao inserir o segundo item perde completamente a formatação dos campos do mestre.
Pablo,
Tenho um formulário mestre detalhes que ao inserir itens do detalhe perde a formatação dos campos do mestre.
Ao inserir o primeiro item, perde parcialmente e ao inserir o segundo item perde completamente a formatação dos campos do mestre.