TIMEDIFF

alonzo

Well-known member
Ciao, non riesco a far visualizzare in custom_function il tempo trascorso tra due datetime con la funzione che segue.
[pre]
<?php
$Query = "SELECT NUM,
DATE_FORMAT( Ora_entrata, '%d-%m-%Y %k:%i:%s' ) AS Ora_entrata,
DATE_FORMAT( Ora_uscita, '%d-%m-%Y %k:%i:%s' ) AS Ora_uscita,
TIMEDIFF( Ora_uscita , Ora_entrata ) AS Tempo_impiegato
FROM REPSVET_2019
ORDER BY REPSVET_2019.Ora_entrata ASC";
?>
[/pre]
Ho provato anche a creare una vista (che funziona) ma non riesco ad importarne la colonna Tempo_impiegato da "Field type specific parameters" Lookup table...da inserire in un terzo campo.
E' realizzabile?
[pre]
You are using DaDaBIK version 9.0-Monterosso enterprise, installed on 25.11.2018 (installation code: 126015952a0b5455cd), the latest version of DaDaBIK is 9.2-Monterosso released on 07.11.2018
You are not running the last release of DaDaBIK, the release you are running might have bugs and security holes, see the official change log for further information. You can upgrade DaDaBIK here.
PHP Version: 7.0.31
mysql version: 5.6.41-84.1-log
Web server: Apache
Client: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
[/pre]
 

eugenio

Administrator
Staff member
Ciao,
non credo di aver capito bene il problema; riguardo alla prima parte vedo la query ma non il resto della custom function, prova ad aggiungere qua il codice per riprodurre l'errore (se in effetti c'e' un errore) o il comportamento anomale e uno screenshot o una descrizione di cosa viene visualizzato.
 

alonzo

Well-known member
Quello di cui avrei bisogno che in un campo di una tabella che elenca degli interventi, si vedesse nella griglia, dopo l'inserimento, la differenza oraria tra la data/ora di entrata e quella di uscita.
Ho provato ho realizzare una funzione da richiamare su quel campo ma non ci sono riuscito, poi ho provato a creare una vista uguale alla tabella con in più il campo del "tempo impiegato" che genera automaticamente se pesca dalla tabella, ma che ovviamente non può sostituire la tabella per gli inserimenti.
Poi ho provato a togliere insert alla vista e a sostituirlo con un pulsante personalizzato che portasse all'insert sulla tabella...nada de nada.
Ce la farò?
 

alonzo

Well-known member
Provo a riassumere sperando di essere più chiaro.
Abbiamo una tabella e una vista uguale alla tabella. La vista ha il campo della differenza oraria calcolato e riempito
Nella tabella ho provato in 3 modi ad ottenere in un campo il risultato della differenza oraria del datetime inserito in due campi.

1.tentativo fallito:
richiamata questa funzione nel campo in cui si desidera aggiungere il risultato della differenza oraria
[pre]
function dadabik_calculate_time($Query){
$sql = "SELECT TIMEDIFF( esce , entra ) AS durata\n"
. "FROM tab19\n"
. "ORDER BY tab19.entra ASC";
}
[/pre]
2. tentativo fallito:
nel campo della tabella in cui si desidera aggiungere il risultato della differenza oraria inserisco i riferimenti alla vista
[pre]
Lookup table name tab2
Lookup table primary Num
Lookup table linked fields durata
Lookup table order by entra
Lookup table Order asc
[/pre]
ma purtroppo non lo vede proprio! Forse perchè richiama i campi di una vista

3. tentativo fallito
provo con un hook una sorta di inganno con i buttons dove cliccando sul tasto inserisci nella vista si accede all'insert della tabella e salvando si accede alla griglia della vista, ma non ci riesco
[pre]
$hooks ['tab2'] ['insert'] ['before'] = 'dadabik_change_page';
function dadabik_change_page ()
{
global $site_url, $dadabik_main_file;
header ('location:'.$site_url.$dadabik_main_file.'?tablename='.urlencode('tab19').'&function=show_resultgrid');
exit();
[/pre]

inoltre ho un problema nel problema:
quando aggiungo un campo in una tabella in MySql e poi clicco in add fields in DB Synchro, mi ricarica di nuovo tutti i campi della tabella e devo rifarne le formattazioni...

Non c'è pace tra gli ulivi
 

eugenio

Administrator
Staff member
Probabilmente la soluzione più semplice (faccio riferimento al penultimo messaggio) è quella della vista, dovrebbe essere sufficiente nascondere il campo "tempo impiegato" dalla form di inserimento e renderlo "disabled" nella form di edit. Se la vista è una semplice "copia" della tabella con in più il campo "tempo impiegato", l'inserimento dovrebbe funzionare senza problemi, quindi dovrai semplicemente usare la vista al posto della tabella.

Riguardo al secondo problema qua https://dadabik.com/forum/read.php?1,20730 è stato segnalato che capita quando si cambia l'ordine dei campi nel database (NON in dadabik); è un caso abbastanza particolare e non so se è il tuo caso, se non lo fosse apri un nuovo post specifico per questo secondo problema.
 

alonzo

Well-known member
[08] Error: during query execution. INSERT INTO `................The DBMS server said: SQLSTATE[HY000]: General error: 1471 The target table ............ of the INSERT is not insertable-into
 

eugenio

Administrator
Staff member
Qua ci sono le regole (mysql 5.6) per determinare se una vista è aggiornabile:

https://dev.mysql.com/doc/refman/5.6/en/view-updatability.html

rientri in uno dei casi in cui NON è aggiornabile?

Prova a postare qua l'elenco dei campi della tabella e la query che hai utilizzato per creare la vista.
 

alonzo

Well-known member
[pre]
SELECT *, TIMEDIFF( Ora_uscita , Ora_entrata ) AS Tempo_impiegato
FROM TABELLA1
[/pre]
 

eugenio

Administrator
Staff member
Credo sia un bug o un limite non documentato di mysql; quel TIMEDIFF rende la view non aggiornabile, eliminandolo il problema non sussiste.

Potresti abbandonare l'idea della view e aggiungere un campo alla tabella, campo da impostare come "campo calcolato" (in effetti è un campo calcolato), scrivendo il codice opportuno nella calculated field function.
 

alonzo

Well-known member
devo prima aggiornare i campi della tabella con quello aggiunto (Tempo_impiegato) in mysql ma il problema è che, come detto prima, mi aggiorna tutti i campi della tabella. Si può fare manualmente?
 

eugenio

Administrator
Staff member
Se non è stato cambiato ordine campi e hai aggiunto il nuovo campo alla fine i campi già esistenti non dovrebbero essere toccati, se lo sono apri un nuovo thread relativo a questo secondo problema,
 

alonzo

Well-known member
Ho inserito il campo (poi aprirò un nuovo thread) con questa funzione ma non ottengo nulla
[pre]
function dadabik_calculate_time($Query){
$sql = "SELECT TIMEDIFF( Ora_uscita , Ora_entrata ) AS Durata\n"
. "FROM TABELLA\n"
. "ORDER BY TABELLA.Ora_entrata ASC";
}
[/pre]
 

eugenio

Administrator
Staff member
Questa non è una calculated field function, qua hai solo assegnato ad una variabile $sql una query senza fare nulla.

Ti consiglio di guardare il file custom_functions.php, c'è la documentazione relativa a come scriverle ed un esempio. Io tramite forum, quando si tratta di codice custom dell'utente, posso dare indicazioni di massima, fare piccole correzioni, spesso fornisco già piccole porzioni di codice ma tutto il resto va oltre il normale supporto tecnico previsto.
 

alonzo

Well-known member
[pre]
function dadabik_calculate_Durata($parameters_ar){
if ( $parameters_ar['Ora_uscita'] !== '' && !is_null($parameters_ar['Ora_uscita']) && $parameters_ar['Ora_entrata'] !== '' && !is_null($parameters_ar['Ora_entrata'])){
return ($parameters_ar['Ora_uscita'] - $parameters_ar['Ora_entrata']);
}
else{
return NULL;
}

}
[/pre]
Questo è la funzione che ho creato e che dovrebbe calcolare la data come differenza dei due orari, rispettivamente di entrata e di uscita: la sintassi è corretta il problema è che non da risultati. Grazie per l'aiuto ricevuto fino ad ora.
 

eugenio

Administrator
Staff member
I parametri che ti arrivano sono stringhe, non puoi calcolarne la differenza in minuti facendo una semplice sottrazione, devi prima convertirli in un oggetto datetime e poi usare i metodi opportuni.
Qua:
http://php.net/manual/en/datetime.diff.php
trovi la documentazione.
 
Top