ravasiolorenzo Posted April 22, 2016 Share Posted April 22, 2016 Ciao a tutti! sono nuovo di questo forum e volevo chiedervi già un favore. sto facendo in access un daabatabe per il mio capo.. molto semplice piccola azienda quindi di utilizzo limitato ma trovo difficoltà nello sviluppare una sua richiesta. in una maschera di riassunto finale devo potergli mostrare tutti i costi (ovvero - costo materiali, costo lavorazioni esterne, costo trattamenti termici), il prezzo di vendita della commessa, il totale delle spese e il guadagno.. fino a qui tutto ok. inoltre lui mi ha richiesto di aggiungere un al' altro tipo di spesa ovvero COSTO LAVORAZIONE OPERAI. io ho una tabella lavorazioni (con ID,nomelavorazione,costoorario) e una lavorazioni_eseguite, con dentro nome dipendente commessa lavorazione e ore di lavorazione.. io devo poter trovare tutte le lavorazioni fatte su una commessa (quindi con una normale SELECT) e qua ok ma poi devo moltiplicare le ore per ogni costoorario della lavorazione ad esse annessa! ovvero se io per una commessa faccio 3 ore dilavorazione1,5 di lavorazione2 ecc alla fine devo poter ottenere questo risultato: tot=(costoorario1 * oredilavorazione1) + (costoorario2 * oredilavorazione2) + ..ecc ma non riesco a trovare una combinazione giusta di SQL che renda possibile questa cosa! mi sono impuntato sulla SELECT ma non so se è corretta perche so che può restituire solo valori ma se faccio DoCmd.RunSQL(stringa) mi dice "prevista function o variabile" eppure tutte le librerie sono presenti per utilizzo anche INSERT INTO ecc..non riesco proprio a capire come sviluppare questa parte di programma! per favore aiuto! Quote Link to comment Share on other sites More sharing options...
Devil_Mcry Posted April 24, 2016 Share Posted April 24, 2016 Ciao, a primo sguardo quello che vuoi fare è complicato dal fatto che manca almeno una tabella, che è in realtà una relazione N,N tra tabella_lavorazione e lavorazione_eseguite. Come fai a legare l'ID della tabella lavorazioni alle ore lavorate per una data commessa? Quando hai progettato il DB hai utilizzato una metodologia formale per la realizzazione o sei andato a intuito? Ovviamente in quanto stiamo parlando di query devi fare una SELECT su qualcosa ma a naso credo che nel tuo caso siano query annidate Considera che sono anni che di lavoro molto con l'SQL, quindi la query sotto potrebbe non essere ottimizzata, in ogni caso dovresti fare qualcosa del tipo (ti metto gli schemi usati da me ma ovviamente per te sarà diverso anche perchè manca una relazione). CREATE TABLE costi(ID int,orelavorate int); CREATE TABLE costoore(ID int,costoora int); Prima query, conto totale delle ore per la stessa operazione (che è rappresentata da ID, viene da se che ID in ore è chiave primaria, in costi non) SELECT ID, SUM(orelavorate) as orelavorate FROM costi GROUP BY ID Questo ritorna la somma delle ore della stessa lavorazione, a questo punto si annida la query con un'altra di moltiplicazione SELECT costoore.ID, costoore.costoora*costi.orelavorate AS parziale FROM costoore, (SELECT ID, SUM(orelavorate) as orelavorate FROM costi GROUP BY ID) AS costi WHERE costi.ID=ore.ID Questa seconda query che annida la prima ti ritorna un elenco di costi veri (Xore * costo orario) mostrandoti anche l'ID Puoi vedere l'esempio fatto al volo qui http://sqlfiddle.com/#!9/23792/2 dove c'è sia il concetto di somma che prodotto. C'è una leggera differenza nel fatto che nell'esempio costoore l'ho chiamato ore solo per velocità ma quando ho poi scritto qui mi sono reso conto che magari era equivocabile Come ti dicevo però nel tuo testo mancano delle informazioni, ovvero la relazione tra la tabella con i costi orari e quella con le lavorazioni. Questo esempio che ti ho fatto è concettualmente quello che devi andare a fare tu ma potrebbe mancare una condizione di WHERE o HAVING a seconda di come strutturi la query e manca una JOIN quasi di sicuro. Insomma as is non funziona ma dovrebbe darti la soluzione del problema. Ivan Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.