HB
Cálculo entre duas datas
Pessoal,
Tenho um campo de DATA INICIAL ($safinicial), um de DATA FINAL ($saffinal) e um outro que vai receber o RESULTADO ($safdia), sendo este último um TEntry (ver o código PHP abaixo).
Criei o método abaixo e no momento de executar a aplicação está mostrando um erro na tela e também um erro de PHP.
Alguém pode me ajudar?
Tenho um campo de DATA INICIAL ($safinicial), um de DATA FINAL ($saffinal) e um outro que vai receber o RESULTADO ($safdia), sendo este último um TEntry (ver o código PHP abaixo).
Criei o método abaixo e no momento de executar a aplicação está mostrando um erro na tela e também um erro de PHP.
Alguém pode me ajudar?
- <?php
- public static function onDiaSafra($param)
- {
- try
- {
- if ($param['key'])
- {
- TTransaction::open('safra');
- $safra = new Safra ($param['key']);
- TTransaction::close();
- }
- if ($safra) // NESTE PONTO É A LINHA 105 DO ERRO PHP.
- {
- $safinicial = new DateTime($param['safinicial']);
- $saffinal = new DateTime($param['saffinal']);
- $object = new stdClass();
- $object->safdia = $safinicial->diff($saffinal);
- TForm::sendData(self::$formName, $object);
- }
- }
- catch (Exception $e)
- {
- new TMessage('error', $e->getMessage());
- }
- }
- ?>
Tem algo estranho no fechamento dos b locos!
Veja que você isola a variável $safra na condição de existir um $param['key'].
Se não existir, então a variável $safra não existe, dando o erro na linha mencionada.
Eu arrumaria tudo da seguinte forma:
Marcelo, agradeço pela ajuda.
Em relação ao erro PHP, você está certo, fiz o fechamento da chave erro, e tem hora que passa o "olho" tantas vezes no código que não consegue enxergar o óbvio, mais uma vez obrigado.
A action fica no campo de DATA FINAL ($saffinal), e quando seleciono a data, emite a mensagem de exceção tratada pelo próprio framework abaixo:
Objeto 31/01/2018 não encontrado em safra
Sabe o que pode ser?
Faz o seguinte.
Dá um var_dump no $param, no início da action.
Veja que valor está vindo em "key"!
Marcelo, dá uma olhada aí
/var/www/controle_de_safra/app/control/cadastros/SafraForm.php:101:
array (size=18)
'class' => string 'SafraForm' (length=9)
'method' => string 'onDiaSafra' (length=10)
'static' => string '1' (length=1)
'id' => string '' (length=0)
'safra' => string '2017' (length=4)
'descricao' => string '2017/2017' (length=9)
'safinicial' => string '01/01/2018' (length=10)
'saffinal' => string '22/01/2018' (length=10)
'safdia' => string '' (length=0)
'indireta' => string '' (length=0)
'encerrada' => string '' (length=0)
'_field_value' => string '22/01/2018' (length=10)
'_field_id' => string 'tdate_1875487402' (length=16)
'_field_name' => string 'saffinal' (length=8)
'_form_name' => string 'list_Safra' (length=10)
'_field_data' => string 'plugin_bootstrapMaterialDatePicker=%5Bobject%20Object%5D&dtp=dtp_pSUZg' (length=70)
'key' => string '22/01/2018' (length=10)
'ajax_lookup' => string '1' (length=1)
José
Se sua chave é uma data, ela está no formato errado, deveria ser "2018-01-22".
Geralmente "key" deveria vir a primary key da tabela.
Sua primary key é a data?
Não. É o próprio id gerado pelo framework. Veja minha model Safra.class.php
José
Tudo bem, mas algo no seu "__construct" mudou isso.
Pois é possível definir no construct os parâmetros enviados para uma action.
Vasculhe seu "__construct" ou poste para podermos ajudar.
Veja o código Marcelo.
José,
Este form é chamado de um "list", certo?
Como está sendo passado o "key" do list para o "form"?
Dá uma olhada na List
José
Não consegui identificar por que está assumindo o key como a data.
Mas pude perceber que o registro é novo, pois se observar no "dump", o "id" está nulo.
Quando o método cadastrar é chamado, em aponta para onShow do form, este está vazio.
Neste método onShow, geralmente iniciamos limpando o formulário. No seu caso não faz nada.
1) Primeira tentativa de solução, mude este método para limpar o form.
2) Ao sair do campo, uma classe e um método é executado na barra de endereços do navegador, veja o que é passado depois do "&method?id=???&key=???"
Ao usar a função exitAction, o atributo key é preenchido com o valor do campo ao qual a ação está vinculada, nesse caso a data final da safra.
Mas se a ideia é só fazer um cálculo entre as datas inicial e final, qual a necessidade de instanciar uma safra? Todas as informações que você precisa estão na variável $param.
Nataniel,
Eu sinceramente não sabia disso!
Grato.
Nataniel e Marcelo, agradeço a vocês pela a ajuda.
Resolvi fazer este cálculo no onSave porque mais a frente vai ser mais útil pra mim e da forma abaixo deu certo, calculou corretamente.