Ihan noin katsomatta koodia (en jaksa ), itse tekisin tällä periaatteella. Laske jokaisen päivämäärän summa hashtauluun, jossa on avaimena tuo päivämäärä.
eli:
1) Käyt läpi jokaisen worklogin (kuten olet tehnyt), otat sieltä sen arvon jonka haluat "laskea yhteen"
2) katsot päivämäärän
3) katsot summa- hashtaulusta saman päivämäärän arvon
4a) jos arvo on nolla luot uuden avaimen
4b) jos arvo <>0 lisäät tuohon summaan
5) ja (molempien kohdalla) lopuksi tallennat hashtauluun
Sitten käytät tuota summataulua missä ikinä nyt haluatkaan.
Ihan noin katsomatta koodia (en jaksa ), itse tekisin tällä periaatteella. Laske jokaisen päivämäärän summa hashtauluun, jossa on avaimena tuo päivämäärä.
eli:
1) Käyt läpi jokaisen worklogin (kuten olet tehnyt), otat sieltä sen arvon jonka haluat "laskea yhteen"
2) katsot päivämäärän
3) katsot summa- hashtaulusta saman päivämäärän arvon
4a) jos arvo on nolla luot uuden avaimen
4b) jos arvo <>0 lisäät tuohon summaan
5) ja (molempien kohdalla) lopuksi tallennat hashtauluun
Sitten käytät tuota summataulua missä ikinä nyt haluatkaan.
Hei, hommaa ei voi tehdä SQL-lauseilla suoraan kantaan, koska ohjelma voi mennä rikki.. siis pitää käyttä JIRA API:a
Hei, ei se Jira mene rikki yhdestä ylimääräisestä kantaa lukevasta yhteydestä. Jos menee, lähetä bugiraportti kehittäjille.
Mutta vastaus alkuperäiseen kysymykseen, jos tolla APIlla haluat sen tehdä: käy läpi worklogit, ja jos worklogin päivälle ei ole aiempia tapahtumia, alusta sille laskuri ykköseksi, muuten kasvata olemassaolevaa laskuria yhdellä.
Ihan noin katsomatta koodia (en jaksa ), itse tekisin tällä periaatteella. Laske jokaisen päivämäärän summa hashtauluun, jossa on avaimena tuo päivämäärä.
eli:
1) Käyt läpi jokaisen worklogin (kuten olet tehnyt), otat sieltä sen arvon jonka haluat "laskea yhteen"
2) katsot päivämäärän
3) katsot summa- hashtaulusta saman päivämäärän arvon
4a) jos arvo on nolla luot uuden avaimen
4b) jos arvo <>0 lisäät tuohon summaan
5) ja (molempien kohdalla) lopuksi tallennat hashtauluun
Sitten käytät tuota summataulua missä ikinä nyt haluatkaan.
Tein nyt Hashtablen mutta en tiedä miten lasken saman päivämäärän omaavat keyt yhteen, tässä koodi:
Oikeasti, jos meinaat tehdä noin pitkiä metodeja voisit ainakin kattoa ettei puolet koodista ole kommentoitu pois, tuo "koodi näkymä" ei muutenkaan ole kovin selkeä...
Samoin muuttujien nimiä voisi miettiä vähän, sulla näyttää tuolla olevan peräkkäin i ii ja iii, muuttuja joka pitää sisällään kuukauden m viimeisen päivän on lastDate jne.
Hashtaulun idea taisi olla, että avaimena on joku päivämäärää identifioiva ja avaimena sen päivän summa, eli jos sulla on tarkoituksena laskea jokaisen päivän kaikkien työntekijöiden käyttämä aika yhteensä niin periaate olisi tämänsuuntainen:
Koodi:
public class MapTest {
public MapTest() {
Map<Integer, Long> workLogCounter = new HashMap<Integer, Long>();
int month = 6;
int year = 2011;
Calendar calendar = Calendar.getInstance();
calendar.set(year, month -1, 1);
int lastDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
for (int i=1; i<=lastDayOfMonth; ++i) {
workLogCounter.put(i, 0L);
}
}
}
Tuossa on taulu jossa avaimena kuukauden päivä. Kun pitää sille päivälle lisätä jotain, haet sen vanhan summan ja lisäät siihen päälle. Avaimena tietysti vois olla myös toi sun käyttämä date.toString jos se yksilöisi sen päivän (ettei mukaan tule sen tarkempaa aikaa).
Olen kuitenkin pahoillani, jiran api on vieras ja tota koodia on aika raskasta lukea, mutta tuntuu että tuohon on varmasti 10 järkevämpääkin ratkaisua.
Tein nyt Hashtablen mutta en tiedä miten lasken saman päivämäärän omaavat keyt yhteen, tässä koodi:
Koodi:
...
Hashtable numbers = new Hashtable();
...
while (worklogIterator.hasNext()) {
...
long timeSpent = itr.getTimeSpent();
numbers.put( iss.getKey() + "_" + startDate, timeSpent);
}
...
Miksi tallennat sun kirjanpitoon (numbers) jotain kummallista getTimeSpent()-arvoa? Saattaisi olla taktisempaa sen sijasta tallentaa numero, joka kertoo montako worklogia kyseisenä päivänä oli.
Miksi tallennat sun kirjanpitoon (numbers) jotain kummallista getTimeSpent()-arvoa? Saattaisi olla taktisempaa sen sijasta tallentaa numero, joka kertoo montako worklogia kyseisenä päivänä oli.
En ajatellutkaan tuota.
Tässä on kuitenkin GUI johon worklogit pitäisi ladata JSON-formaatissa:
Katsoin sun alkuperäistä tuhansien rivien koodiviidakkoa. Oliko sun ongelma siis se että obj.put(...) kutsu otti talteen ainoastaan päivälle startDate viimeiseksi syötetyn arvon? Eli sulla on muuttuja x = 2, ja sun pitäisi lisätä siihen arvo 5, mutta sijoitus x = 5 ei tee niin, joten kysyt apua foorumilta.
Katsoin sun alkuperäistä tuhansien rivien koodiviidakkoa. Oliko sun ongelma siis se että obj.put(...) kutsu otti talteen ainoastaan päivälle startDate viimeiseksi syötetyn arvon? Eli sulla on muuttuja x = 2, ja sun pitäisi lisätä siihen arvo 5, mutta sijoitus x = 5 ei tee niin, joten kysyt apua foorumilta.
Maksaako joku sulle rahaa ton tekemisestä?
Tuote tulee myyntiin Atlassian Marketplacen ja ei ole varmaa, että ostaako sitä kukaan.
Jätitkö tarkoituksella vastaamatta ensimmäiseen kysymykseeni? Leikitaan että vastasit siihen "kyllä". Oletetaan lisäksi, että oikeasti et halua laskea yhteen Worklogeja, vaan Worklogien timeSpent-arvoja. Yritän nyt vääntää rautalangasta mitä kannattaisi tehdä, jos nuo mun oletukset pitää kutinsa.
Alkuperäinen koodisi näytti jokseenkin tältä:
Lainaus:
Alkuperäinen kirjoittaja traitor
Koodi:
while (worklogIterator.hasNext())
{
Worklog itr = worklogIterator.next();
startDate = itter.format(itr.getStartDate());
long timeSpent = itr.getTimeSpent();
obj.put(startDate,timeSpent / 3600);
}
Tuossa jokainen läpikäyty worklog (yli)kirjoittaa timeSpent-arvonsa obj-rakenteen avaimelle startDate. Oletan siis nyt, että yritit kysyä miten ylikirjoittamisen sijasta se lisättäisiin sen avaimen takana olevaan arvoon?
Mitä tuosta puuttuu? Ihan oikein worklogin timeSpent-arvon haet kutsulla itr.getTimeSpent(), sekä tallennat lopullisen timeSpent-arvon tuon startDate-avaimen taakse obj.put() kutsulla. Enää puuttuu miten timeSpent-arvoon lisätään startDate-avaimella jo entuudesta ollut arvo, jos sellainen siellä oli.
Miten se ehkä entuudestaan löytyvä arvo haetaan? Googlen ensimmäinen tulosobj-muuttujan tyypistä JSONObject ohjasi sen javadocciin. Tiedät jo, että startDate-avaimelle tallennettu arvo on tyyppiä long, eli saadaksesi ulos kyseiselle avaimelle sijoitetun long-arvon, lienee parasta kutsua metodia getLong().
Kannattaa huomata että tuon getLong() metodin määrittelyssä kerrotaan, että "throws JSONException if the key is not found". Koska ensimmäistä worklogia käsitellessä ko. avaimelle ei ole tallennettu mitään, näin tulee tapahtumaan. Se lienee ihan sama haluatko pistää sinne nollan jo ennen kuin rupeat käymään läpi worklogeja, vai hiljennätkö sen JSONExceptionin kiinni try-catchillä.
Tätäkö hait? Tarvitsetko vielä mallisuorituksen miten saat tuohon timeSpent-muuttujasi lisättyä arvon obj.getLong(startDate) * 3600 ennen kuin syötät sen obj.put() kutsuun?
Tätäkö hait? Tarvitsetko vielä mallisuorituksen miten saat tuohon timeSpent-muuttujasi lisättyä arvon obj.getLong(startDate) * 3600 ennen kuin syötät sen obj.put() kutsuun?
Mä symppaan jos olet ekaa Java-juttuasi tekemässä, mutta jos ylitsepääsemättömäksi kompastuskiveksi muodostuu get- ja set-metodeilla käpisteltävän muuttujan arvon kasvatus, ehkä voisi olla hyvä vielä opetella vähän lisää ohjelmoinnin alkeita ennen kuin lähtee kaupittelemaan tekemiänsä ohjelmia. Siinä voi ihmiset pettyä pahemman kerran.
Mä symppaan jos olet ekaa Java-juttuasi tekemässä, mutta jos ylitsepääsemättömäksi kompastuskiveksi muodostuu get- ja set-metodeilla käpisteltävän muuttujan arvon kasvatus, ehkä voisi olla hyvä vielä opetella vähän lisää ohjelmoinnin alkeita ennen kuin lähtee kaupittelemaan tekemiänsä ohjelmia. Siinä voi ihmiset pettyä pahemman kerran.
Kiitos tästä, nyt se toimii kuten pitääkin.
Juu siinä olet oikeassa, että minun ei ainakaan räätälöityjä plugareita kannata lähteä tekemään asiakkaille projekteina ennen kuin osaan kunnolla Javaa. Mutta tässä plugarissa ei ole mitään valmiiksisaamis deadlineä.
En tiedä miksei kukaan ole tätä vielä sanonut ellei sitten mennyt ohi, mutta eikös JIRAssa ole ihan natiivina nuo kaikki (harvat) featuret mitä tässä on ajettu takaa? JIRA kuitenkin on proikkarointityökalu issue trackerilla eikä vain issue tracker.
En tiedä miksei kukaan ole tätä vielä sanonut ellei sitten mennyt ohi, mutta eikös JIRAssa ole ihan natiivina nuo kaikki (harvat) featuret mitä tässä on ajettu takaa? JIRA kuitenkin on proikkarointityökalu issue trackerilla eikä vain issue tracker.
Tein tuotteen erään asikkaan tarjouspyynnöstä, koska halusivat Timesheetin.