Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
Un proiettore economico, che fa della portabilità e immediatezza i suoi punti di forza. Adatto per una camera da letto o per la casa vacanze, è basato su sistema proprietario Linux ma offre piena compatibilità ufficiale a Netflix
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
Un notebook sviluppato in collaborazione con GoPro ma che risponde al meglio alle necessità di tutti coloro che creano contenuti video: robustezza, design, potenza di calcolo e funzionalità si abbinano al meglio tra di loro, pur se a prezzo di un costo elevato per via della tanta memoria onboard
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090
Ho affidato ai due modelli lo stesso mestiere ma non lo stesso identico prompt: trasformare una storia illustrata in un video usando una RTX 3090 e modelli locali. Ne sono usciti due film, due applicazioni e due idee opposte di efficienza. Fucina, progettata con Fable 5, colpisce di più nei primi secondi. Storyboard Studio, costruito con ChatGPT/Codex, regge meglio sulla distanza e vince il confronto complessivo, ma di stretta misura
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-10-2009, 18:12   #1
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
[SQL]Non riesco ad implementare una join

Ciao a tutti

Ho queste due tabelle:

Codice:
tblLavori

ID (pk)
PersonaId (int)
DataEvento (Date)
CodiceEvento (varchar)
NumeroEventi (int)

tblTurni
ID_Persona
Monday (int)
Tuesday (int)
Wednesday (int)
Thursday (int)
Friday (int)
Saturday (int)
Sunday (int)
nella tblTurni, all'interno dei giorni della settimana vengono inseriti il numero massimo di eventi che una persona può produrre per il corrispondente giorno.

Ora, non riesco a creare una relazione fra queste due tabelle in base al giorno dell'evento, cioè tra tblLavori.DataEvento e tblTurni.Monday, Tuesday & Co.

Come dovrei procedere?

Grazie mille

RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 04-10-2009, 18:33   #2
first register
Member
 
L'Avatar di first register
 
Iscritto dal: Oct 2008
Messaggi: 326
Se ho capito bene tu vorresti verificare SE al giorno DataEvento (Date) la persona è di turno a disposizione per un evento ?

Dai un occhiata alla funzione dayname

DAYNAME(tblLavori.DataEvento)

Ultima modifica di first register : 04-10-2009 alle 18:56.
first register è offline   Rispondi citando il messaggio o parte di esso
Old 04-10-2009, 19:03   #3
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da first register Guarda i messaggi
Se ho capito bene tu vorresti verificare SE al giorno DataEvento (Date) la persona è di turno a disposizione per un evento ?

Dai un occhiata alla funzione dayname

DAYNAME(tblLavori.DataEvento)
Ciao e grazie per aver risposto

Il problema non è la funzione con la quale ricavare il nome del giorno

Per rispondere alla tua domanda: Io devo solo accertarmi che se il turno del giorno 'Monday' vale "2", non devo inserire in tblLavori.NumeroEventi un valore superiore a 2.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2009, 07:23   #4
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Ciao.

Per risolvere un modo potrebbe essere:
Cappotto la tabella dei giorni della settimana perche' cosi' non mi serve

(PS: Cappottare = termine tecnico ambivalente che sta per "normalizzare" o "denormalizzare", a seconda dei casi. Qui e' "normalizzare")

Codice:
CREATE VIEW vs_turni AS
SELECT ID_PERSONA, 1 AS giorno, Monday AS MaxEventi FROM tblTurni
UNION ALL
SELECT ID_PERSONA, 2, Tuesday FROM tblTurni
UNION ALL
SELECT ID_PERSONA, 3, Wednesday FROM tblTurni
UNION ALL
...
UNION ALL
SELECT ID_PERSONA, 7, Sunday FROM tblTurni
Poi vado a cercare un modo per ricavare, data una data specifica,, il giorno della settimana da 1 a 7. Per semplicita' qui chiamo questa funzione DayOfWeek(data). Ciascun motore la implementa modo quasi diverso.
E con questi faccio la Join

Codice:
SELECT * FROM tblLavori tb
       JOIN vs_turni vs ON
       (
          tb.PersonaID = vs.ID_Persona
         AND DayOfWeek(tb.Dataevento) = vs.giorno
       )
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 06-10-2009 alle 07:40.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2009, 07:37   #5
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Ma prestazionalmente (e anche per quanto riguarda la leggibilità) non sarebbe più efficiente fare una semplice if a livello di codice dato che *immagino* che questo sia un controllo di qualche tipo in seguito ad un immissione di dati?
Così bisogna fare questa join pesantuccia su tutta la tabella, mentre in quel caso bastano due select e un if male che vada.
(magari basta anche solo una select ma la mattina presto sò troppo rinco. )
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2009, 10:35   #6
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Innanzitutto grazie per aver risposto

Il check in effetti dev'essere effettuato prima dell'immisione dei dati, per evitare che in uno stesso giorno, magari per sbaglio, si inseriscano più eventi di quanti ne possa fare la persona, o quanto meno, un gestore si preoccupi di avvisare l'utente che c'è qualcosa che non va.

Inizialmente avevo pensato ad un trigger del tipo 'before_insert', ma poi mi sono chiesto come avrebbe potuto interagire con l'utente e ho ritenuto che fosse un pò troppo complicato.

Al momento ho risolto 'via codice'.

@gugoXX:

Ho seguito le tue indicazioni ed in effetti è quello che stavo cercando

@^TigerShark^: potresti spiegarmi meglio cosa intendi, soprattutto in merito al discorso 'prestazionale'

Grazie ancora.

RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2009, 14:51   #7
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
beh...
se come ho capitato devi fare questo controllo prima del salvataggio sul db in seguito all'immissione dell'utente allora io farei semplicemente qualcosa del genere:
Codice:
int numeroEventi = new TblLavoriAdapter().getNumeroEventi(personId, date)[0].NumeroEventi;
Database.TurniRow row = new tblTurni().getTurni(personId)[0];
if (row[date.DayOfWeek] > numeroEventi)
    throw Exception;
E' un esempio scritto ad cazzum che non funziona se non crei gli adapters..
Il primo presuppone una query del tipo:
Codice:
SELECT NumeroEventi 
FROM TblLavori 
WHERE ID = @personId AND DataEvento = @date
e il secondo qualcosa di simile:
Codice:
SELECT *
FROM TblTurni
WHERE ID_Persona = @personId
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2009, 15:23   #8
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
beh...
>CUT<
Se dovessi lavorare con gli adapter, dataset o altro, andrebbe bene anche la tua idea credo.

Il fatto è che quest'applicazione è legata ad nhibernate. Risulta quindi più semplice implementare le entità su viste o tabelle già esistenti.

Altro problema, ma questo esula un pò dal 3d, è che non avendo noi a disposizione tools per la reportistica neanche di minimo livello, siamo purtroppo costretti a crearci dei 'report' direttamente lavorando sulle viste del database
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2009, 17:10   #9
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
vabbè...
lo puoi fare anche con NHibernate, basta utilizzare HQL o quello che vuoi al posto delle query.
L'importante è farti restituire per una persona il numero massimo di turni per ogni giorno e il numero attuale di turni per quel giorno e quindi applicare l'if.
In questo modo hai due banalissime select da scrivere in HQL o in quello che vuoi (equivalenti a quelle che ho scritto per gli adapter) e un if che controlla un'unica condizione.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix HONOR CHOICE Projector Air Pro: piccolo, portati...
ASUS ProArt GoPro Edition è il notebook compatto per chi crea ASUS ProArt GoPro Edition è il notebook c...
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090 Fable e Sol a confronto: due cartoni animati cre...
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile Il tablet rugged leggero e sottile: Lenovo Think...
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot AMD Advancing AI 2026: l'hardware AMD per le ela...
Batterie allo stato solido sempre pi&ugr...
OPPO Reno 16 Series, l'editing di foto e...
È gara a chi ne ha violate di più: Claud...
I nuovi Redmi Note 17 arrivano su Amazon...
Il meglio di Amazon in 3 minuti di lettu...
Stanco dell'intelligenza artificiale su ...
L'IA Gemini entra nel portafoglio enterp...
Fusione nucleare: CFS chiude il pi&ugrav...
Google: prevista una produzione mostruos...
Rischia l'arresto per aver piallato lo s...
Colpo di scena nel packaging: TSMC copia...
Spenti i timori sull'IA e Microsoft vola...
Nothing Phone (3) a 519€: fotocamera 50M...
10 milioni di auto prodotte, ma il vero ...
ECOVACS T50 PRO OMNI Gen3 in offerta a 3...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:26.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v