Buon pomeriggio.
alla fin fine anche mi rendo conto che il tuo approccio volto a sfruttare maggiormente il server sql, sarebbe senz'altro migliore e performante. Vorrei chiarire che è solo la mia scarsa conoscenza ovviamente non professionale, che mi ha portato ad andare avanti determinando la data servizio attraverso php.
Vorrei fare il punto.
Avrei in pratica due tabelle in cui vengono registrati i servizi assegnati a degli autisti:
serv_master e serv_detail.
La popolazione di queste avviene attraverso due form.
Nel primo viene impostata la data in cui va effettuato il servizio e il dato viene memorizzato in $_SESSION affinché possa restare a disposizione per tutti gli inserimenti successivi, relativi allo stesso giorno.
In occasione dei cambi di stagione (anno scolastico ) e anno solare, questo stesso form ha dei campi aggiuntivi che restano nascosti in base ad una imput "radiobutton", che servono ad aggiornare eventualmente la tabella delle festività e quella dei periodi dell'anno in base ai quali sono in vigore diversi orari relativi alle corse dei bus di linea.
Le due tabelle serv_master e serv_detail servono da base dati e anche da archivio. E' da esse infatti che vengono ricavati i dati per mostrare agli autisti quali servizi devono svolgere:
quindi ho una view generale che mostra i dati prelevati con la select che preleva tutti i campi e che mostra quindi i servizi attribuiti a tutti gli autisti con un intervallo va da due gg avanti, e indietro di un mesetto rispetto la data corrente.
e ho una view per autista dove vengono prelevati i dati relativi a 2 gg dopo la data corrente.
Ogni autista vede cosi i propri servizi e non quelli degli altri, ed è interessato a vedere i servizi per il giorno dopo o tuttalpiù due giorni avanti. (poi magari gli inserirò un form "search" per vedersi i servizi che ha fatto nell'ultimo periodo, ma questo al momento non è essenziale).
queste sono le due tabelle serv_master e detail
MariaDB [gbgarage_test]> DESCRIBE gbgar_serv_master;
+-----------+----------------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------------------------------------------+------+-----+---------+----------------+
| ID_MASTER | int(5) | NO | PRI | NULL | auto_increment |
| AUTISTA | varchar(30) | YES | | NULL | |
| STATO | enum('operativo','riposo','ferie','indisponibile') | YES | | NULL | |
| DATA | date | YES | | NULL | |
| NOTE | varchar(255) | YES | | NULL | |
+-----------+----------------------------------------------------+------+-----+---------+----------------+
5 rows in set (0,001 sec)
MariaDB [gbgarage_test]> DESCRIBE gbgar_serv_detail;
+---------------------+--------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------------------------------+------+-----+---------+----------------+
| ID | int(5) | NO | PRI | NULL | auto_increment |
| ID_MASTER | int(5) | YES | MUL | NULL | |
| TIPOLOGIA | enum('tpl','noleggio','officina','') | YES | | NULL | |
| MACCHINA | varchar(20) | YES | | NULL | |
| SERVIZI_DA_SVOLGERE | varchar(255) | YES | | NULL | |
| ID_CORSA | int(5) | YES | MUL | NULL | |
+---------------------+--------------------------------------+------+-----+---------+----------------+
6 rows in set (0,001 sec)
la tabella detail è collegata ovviamente alla tabella master col campi id_master ma anche alla tabella "corse" col campo id_corse.
la tabella corse è cosi composta:
DESCRIBE gbgar_corse;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| ID_CORSA | int(3) | NO | PRI | NULL | auto_increment |
| ID_TM | int(3) | YES | MUL | NULL | |
| LINEA | varchar(50) | YES | | NULL | |
| PARTENZA | int(5) | YES | MUL | NULL | |
| ORARIO_CORSA | time | YES | | NULL | |
| ARRIVO | int(5) | YES | MUL | NULL | |
| FINE_CORSA | time | YES | | NULL | |
| KM | float | YES | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
8 rows in set (0,001 sec)
A sua volta questa è collegata ad altre due tabelle:
alla tabella tm(tabelle di marcia) e alla tabella fermate: a quest'ultima con due campi. (partenza e fine_corsa)
la tabella "tabelle_marcia"
4 rows in set (0,001 sec)
MariaDB [gbgarage_test]> SELECT * FROM gbgar_tab_marcia;
+-------+-------------+-----------+-------------+
| ID_TM | TABELLA | PERIODO | FREQUENZA |
+-------+-------------+-----------+-------------+
| 1 | 913 lun-sab | invernale | scolastica |
| 2 | 912 lun-sab | invernale | scolastica |
| 3 | 919 lun-sab | estivo | feriale |
| 4 | 811 | invernale | giornaliera |
| 5 | 811 | invernale | scolastica |
+-------+-------------+-----------+-------------+
5 rows in set (0,001 sec)
Questo perché la tabella delle tabelle di marcia (scusa il gioco involontario di parole), mi fornisce una selezione delle corse in base all'orario in vigore.
(qui ti ho messo un estratto e non la struttura perchè appare più chiaro)
Sono infatti le tabelle di marcia (TM) ad essere legate al tipo di giorno (invernale, scolastico, festivo etc...) Quindi se una tabella è festiva non conterrà corse che sono solo feriali ma può contenere corse che restano invariate, cioè che non dipendono dalla festività ma solo dal periodo, e via dicendo.
ad es: il record con id 4 è la tab 811 invernale e giornaliera:
in essa c'è la corsa della linea 151 delle 18.30 che va fatta effettuata sempre da settembre a giugno.
per cui mi tocca avere una ridondanza inevitabile per gestire tutte queste situazioni: in questo caso infatti hi due record con tabella 811.
Nella tabella corse la corsa delle 18.30 della linea 811 essendo invernale e giornaliera avrà valore 4 nella colonna di collegamento (id_tm), la corsa della linea 151 ma delle 14.00 avrà id_tm= 5 perchè la tabella in cui è compresa è sempre la 811 ma solo scolastica in fatti questa corsa la domenica e festivi non esiste.
E poi una tabella di marcia può essere assegnata in toto ad un autista ma è raro, di solito sono spezzate.
Per cui un autista può dover eseguire una corsa della tabella 811 e poi una della tabella 813 .
Quindi ho dovuto fare una scelta e impostare il form per assegnare le corse e non le tabelle.
L'altra tabella mi da le ubicazioni delle fermate.
MariaDB [gbgarage_test]> DESCRIBE gbgar_fermate;
+------------+------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------------------+------+-----+---------+----------------+
| ID_FERMATA | int(5) | NO | PRI | NULL | auto_increment |
| UBICAZIONE | varchar(50) | YES | | NULL | |
| TIPO | enum('capolinea','transito') | YES | | NULL | |
+------------+------------------------------+------+-----+---------+----------------+
3 rows in set (0,001 sec)
Questa poi mi tornerà utile per abbinare percorsi e corse e creare un vademecum sui percorsi delle linee.
Quindi estraendo i dati da queste tabelle ho ottenuto che ogni servizio assegnato può essere un noleggio e quindi va descritto e amen o una corsa di servizio tpl (linea) ed in questo caso anziché descritto va solo selezionato tra una lista di tutte le corse in carico al vettore.
In base al giorno e al periodo questa lista è diversificata.
ed è qui che entra in gioco il tuo diverso approccio che non riesco però ad adattare. :-(
Ciliegina sulla torta, nella lista delle corse "papabili" quelle già assegnate per lo stesso giorno, non ricompaiono, cosi non possono erroneamente essere selezionate/assegnate due volte.
Anche gli autisti sono elencati in una tabella a se ma questi devono essere sempre tutti disponibili nella select del form con cui i servizi vengono assegnati, perché ad un autista si deve poter assegnare un servizio noleggio e, con un inserimento a se stante, per la stessa data anche una corsa tpl.
Un pezzetto alla volta, salvo qualche dettaglio che sicuramente va perfezionato, questo era il mio obiettivo.
Tuttavia, il tuo approccio mi interessa anche solo per il gusto di saperlo:
In teoria tu dicevi di creare una tabella calendario ma per quanto ci abbia pensato non riesco a capire come potrei adottare il tuo approccio al mio caso.
In ogni caso grazie per tutto.
Filippo P.