|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[MySql]Aiutino per una View
Ciao a tutti
Ho una tabella così composta: Codice:
ID_Mese; ID_Dipendente; giorno; base; differenza; totale; //contenente valori del tipo: ID_Mese = 1; ID_Dipendente = 23; giorno = 01; base = 5.50; variazione = 0; differenza = 0; //oppure per un giorno diverso: ID_Mese = 1; ID_Dipendente = 23; giorno = 02; base = 5.50; variazione = 3.50 differenza = -2.00; Codice:
ID_Dipendente -- 01 -- 02 -- 03 -- 04 -- (etc.. sono i giorni del mese)
23 5.50 <- base
23 0.00 <- variazione
23 0.00 <- differenza
5.50 <- base
3.50 <-variazione
-2.00 <- differenza
*Solo per chiarezza sono su righe diverse, in realtà questa vista dovrebbe avere 3 righe per ogni dipendente.
Grazie mille RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per avere tre righe per ogni utente basta fare una UNION associando ai vari campi lo stesso nome.
(SELECT ID, Base AS Dato From Tabella) UNION (SELECT ID, Diffrenza AS Dato From Tabella) UNION (SELECT ID, Varianza AS Dato From Tabella) |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Inizio ad avere problemi con queste union.
Fin quando mi limito ad un solo giorno, va bene, ma se i giorni sono più di uno, oppure durante uno stesso giorno ci sono state più lavorazioni non ne vengo fuori Ad esempio, il tipo di visualizzazione che io dovrei ricavare dovrebbe essere così: Codice:
ID_Dipendente giorno1 giorno2 giorno3 1 5 5 5 1 0 3 6 1 0 -2 1 ID_Mese ID_Dipendente ParametroBase OreLavorate DifferenzaDaParametroBase
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Quello che puoi ottenere è questo: Codice:
ID_Dipendente giorno base differenza varianza 1 1 5 0 0 1 2 5 3 -2 1 3 5 6 1 |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
al momento ho arzigogolato così creandomi una vista con un'altra tabella
Codice:
SELECT codicelavoro, 'counter' as 'dayCounter' from PIfeb_2008
union
select codicelavoro, parbase from oredelta WHERE (select substring("dayCounter", 4) = oredelta.giorno)
union
select oredelta.codicelavoro, (PIfeb_2008.sab2 - oredelta.parbase) from PIfeb_2008, oredelta where (select substring("dayCounter", 4) = oredelta.giorno)
//inserito in un for
//è piuttosto lento ma almeno inizio ad avere il tipo di visualizzazione che mi serve
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Appunto...inserito in un for
In ogni caso con una query molto semplice puoi ottenere il risultato che ti ho scritto e riprendere i dati pari pari. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
considerando che le tabelle sono due: PIfeb_2008 e oredelta Codice:
try
{
int days = Thread.CurrentThread.CurrentCulture.Calendar.GetDaysInMonth(2008, 2);
string[] g = new string[days];
string select = "SELECT codicelavoro ";
for(int count = 1; count <= days; ++count)
{
DateTime dt = new DateTime(2008, 2, count);
g[days -1] = dt.ToString("ddd");
s += ", '" + g[days -1 ] + count + "' AS giorno "
//considerando la query che ho tirato fuori nel post precedente... come posso continuare qui?!?
}
RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non ho ben capito quale sia il problema e cosa vuoi fare...
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Allora, la query che utilizzo in mysql e funziona (per un giorno per volta però) è: Codice:
SELECT codicelavoro, sab2 as giorno from PIfeb_2008
union
select codicelavoro, parbase from oredelta WHERE (select substring("sab2", 4) = oredelta.giorno)
union
select oredelta.codicelavoro, (PIfeb_2008.sab2 - oredelta.parbase) from PIfeb_2008, oredelta where (select substring("sab2", 4) = oredelta.giorno)
PIfeb_2008 che ha come colonne: codicelavoro ven1 sab2 dom3 lun4 etc... mentre invece oredelta ha come colonne: codicelavoro giorno parbase facendo la query da mysql come mi hai suggerito tu per le union, io non faccio altro che prendere il valore contenuto in "ven1", per esempio "8.00"; dato che in oredelta i giorni sono memorizzati con il numero e non con il nome, per esempio: giorno = 1, confronto solo le sottostringhe e mi ricavo il parametrobase da oredelta(per esempio 9.00) Con la query di sopra, lui giorno per giorno prende le ore lavorate, le confronta con quelle del parametro e mi dice se ci sono differenze oppure no. Nell'applicazione uso il datetime per ricavarmi il nome dei giorni per oredelta, in modo da poter applicare la query. Quello che non riesco a fare, è ovviamente mettere il tutto nel "for"
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
PIfeb_2008 che ha come colonne:
codicelavoro ven1 sab2 dom3 lun4 etc... Chi l'ha progettata questa tabella ??? Chi l'ha scritta dovrebbe farsi una bella ripassata alle regole basi dei DBMS Una cattiva base dati ti porta a creare cattivo codice |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Io purtroppo al database non posso apportare cambi di mia iniziativa La tabella però viene creata a run-time dal programma, in base ad una notevole quantità di variabili.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
E' veramente una tabella assurda
Non fare più la union, non conviene. Fai semplicemente una query: SELECT *, substring(oredelta.giorno, 4) AS ordine FROM oredelta JOIN PIfeb_2008 ON oredelta.codicelavoro = PIfeb_2008.codicelavoro ORDER BY ordine ASC; A questo punto semplicemente ti scorri i risultati, ti ricavi giorno e lo usi per indicizzare la colonna. A quel punto fai la differenza fra parbase e quello scritto nella rispettiva colonna. |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Assolutamente no...basta fare le differenze tramite codice.
Posta un po' quello che viene fuori dalla query con dei dati di esempio. |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Codice:
SELECT *, substring("ven1", 4) AS ordine FROM PIfeb_2008
JOIN
oredelta ON PIfeb_2008.codicelavoro = oredelta.codicelavoro ORDER BY ordine ASC;
Codice:
codicelavoro ven1 sab2 codicelavoro giorno parbase ordine 6999 8 6 6999 1 8 1 6999 8 6 6999 2 12 1 6999 8 6 6999 3 9 1
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Togli pure "substring("ven1", 4) As ordine" (al posto di "ven1" ci doveva essere oredelta.giorno) tanto mi sembra che giorno sia solo un numero e non il giorno espresso a lettere e numeri. Aggiungi un "ORDER BY giorno".
Fammi capire...al giorno 1 è sempre associato ven, al giorno 2 sab e così via oppure possono cambiare ? Se sono fissi (mi sembra che tu li stia ricavando dal mese): Codice:
Recordset rs = faiQuery(query);
do
{
day = rs.get("giorno");
DateTime dt = new DateTime(2008, 2, day);
string dayField = dt.ToString("ddd") + string.ToString(day);
hours.add(day, rs.get(dayField));
bases.add(day, rs.get("parbase"));
diffs.add(day, rs.get("parbase") - rs.get(dayField));
rs.moveNext();
}
while(rs.hasNext());
Ultima modifica di cionci : 08-02-2008 alle 18:43. |
|
|
|
|
|
#18 | ||
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Cambiano in base al mese scelto. In pratica succede questo: In una schermata l'utente sceglie il mese di lavoro, viene creata una griglia che contiene il codice lavoro del dipendente, e poi, tante colonne per quanti sono i giorni del mese scelto. Ma questo solo per l'elaborazione mensile finale. Quote:
uhm.. devo cercare di capire qual'è l'equivalente di un recordset in C#. Ma poi, tralasciando per un secondo l'orrore del mio codice, almeno per cercare di tirare fuori il risultato desiderato, e poi andare a raffinare la soluzione, ieri ero riuscito a fare questo (considerando il tuo suggerimento delle union) Codice:
int days = Thread.CurrentThread.CurrentCulture.Calendar.GetDaysInMonth(2008, 2);
string[] g = new string[days];
string s = "SELECT codicelavoro ";
for(int count = 1; coun <= days; ++count)
{
//codice che mi legge dalla tabella i vari "nomeGiornoNumeroGiorno"
DateTime dt = new DateTime(2008, 2, count);
g[days - 1] = dt.ToString("ddd");
s += ", " + g[days - 1] + count + " AS 'giorno' ";
}
s += "FROM PIfeb_2008 UNION SELECT codicelavoro ";
//qui dovrei aggiungere un altro for per scorrere i "parametroBase" dalla tabella oredelta
for(int count = 1; count <= days; ++count)
{
s += ", parbase AS 'giorno' ";
}
s += "FROM oredelta ";
//senza considerare ancora di fare la differenza fra i valori di base e gli effettivi.
Codice:
codicelavoro-----giorno-----giorno1-----giorno2-----giorno3 6999 5 5 7 6999 8 8 8 8 8 8 6999 6 6 6 6 6 6 la prima riga è corretta e la legge da PIfeb_2008 e dove non ci sono valori, è vuota La seconda e terza riga invece, sono completamente errate, perchè riporta il valore in tutti i giorni, nel senso che il risultato avrebbe dovuto invece essere: Codice:
codicelavoro-----giorno-----giorno2 6999 5 5 6999 8 6 P.S.: Ma c'è modo di formattare le tabelle?!?!?
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
||
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Comunque ho guardato e te la adatto: Codice:
foreach (DataRow myDataRow in myDataTable.Rows)
{
day = myDataRow["giorno"];
DateTime dt = new DateTime(2008, 2, day);
string dayField = dt.ToString("ddd") + string.ToString(day);
hours.add(day, myDataRow[dayField]);
bases.add(day, myDataRow["parbase"]);
diffs.add(day, myDataRow["parBase"] - myDataRow[dayField]);
}
|
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Perdonami
Ma non riesco a capire il codice Allora: Codice:
try
{
int days = GetDaysInMonth(2008, 2);
DbClass db = new DbClass();
db.OpenConnection();
string s = "SELECT *, giorno FROM oredelta " +
"JOIN " +
"PIfeb_2008 ON oredelta.codicelavoro = PIfeb_2008.codicelavoro ORDER BY giorno ASC ";
MySqlDataAdapter mda = new MySqlDataAdapter(select, db.ActiveConnection);
DataTable dt = new DataTable();
mda.Fill(dt);
foreach(DataRow r in dt.Rows)
{
//non riesco ad adattare il codice
}
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:33.




















