Kaikki oikeudet tietenkin pidätetään. Viimeinen versio ohjelmasta löytyy seuraavasta linkistä: moijari.com:5002
Edellisestä terttu postista on kulunut jo sen verran paljon aikaa (tuo aiempi satunnaislukugeneraattori+=opinnäyte) että nyt tuli tarve jatkaa. Tässä postissa ei aiemmasta poiketen ole mukana koodia, tämä on enemmänkin pohdiskelua tai jaarittelua (25000 sivuhakua muuten). Olen aiemmin kirjoittanut vierasavainten käsittelyn syöttölomaketta varten (https://moijari.com/?p=260)(https://moijari.com/?p=209). Seuraavaksi ohjelmassa on save nappulan tarvitsema prosessien hallinta. Nämä ovat oikeastaan saman toiminnon toistoa. Tällä hetkellä ajatuksena on, että “vierasavainkäsittelyn” lisäksi tarvitaan ainakin:
-ehtolause (esimerkiksi tilaus-toimitus tietovirrassa toimituspäivä<=kuluvapäivä (toimitetaan vasta toimituspäivänä), ja toimitus-laskutus tietovirrassa toimitettu==”1″ (laskutetaan vasta toimituksen jälkeen), varastosaldon laskennassa vapaasaldo>tilattumäärä) (sallitaan tilaus vain kun varastossa tilattu määrä tuotteita)
-perusavainten täyttäminen (kun luodaan tilaus, tai automaattisesti uusi toimitus tai lasku).
-laskutoimitus (tilauksen summa=rivin summa, varastosaldo=varastosaldo+määrä, jne)
-summaus (tilauksen laskutettu määrä, kun tilauksessa on useampia laskuja)
-sijoitus (toimitettu=”1″, laskutettu=”1″ jne.)
Seuraavassa tilaus-sovelluksen määrittelyt:
('tilausnumero', 'tilauksen asiakasnumero', 'tilauksen asiakkaan nimi', 'tilauspäivä', 'tilauksen summa') ('tilausnumero', 'tilausrivin numero', 'tilauksen tuotenumero', 'tilauksen tuotteen nimi', 'tilauksen tuotteen hinta', 'tilattu määrä', 'rivin summa'
Ja seuraavassa tilauksen vierasavaimen päässä olevat tiedot asiakas ja tuote-sovellukset:
('asiakasnumero', 'asiakkaan nimi', 'asiakkaan osoite', 'asiakkaan postinumero', 'asiakkaan postitmp') ('tuotenumero', 'tuotteen nimi', 'tuotteen hinta')
Ja seuraavassa noiden väliset suhteet:
('sovellus'="tilaus", 'fromsovellus'="asiakas", 'tosovellus'="tilaus") ('sovellus'="tilaus", 'fromsovellus'="tuote", 'tosovellus'="tilaus")
Eli kun täytetään tilaus tietueita, samanlaiset sarakkeet haetaan asiakas sovelluksesta. Tilauksen otsakkeessa on kentät tilauksen asiakasnumero ja tilauksen asiakkaan nimi, joita vastaavat kentät ovat asiakasnumero ja asiakkaan nimi. Tilauksen riveillä taas on tilauksen tuotteen numero, tilauksen tuotteen nimi ja tilauksen tuotteen hinta. Jos tilaustietueille on määritelty yksilöivä tieto jommasta kummasta, loput kentät täytetään automaattisesti. Mikä tahansa tilauksella oleva asiakkaan (tai tuotteen) tieto voidaan täyttää, jos se on yksilöivä, muut kentät täytetään automaattisesti. Jos esimerkiksi täytetään asiakkaalle numero 1000, nimi haetaan automaattisesti, jos tuo asiakas numero 1000 on olemassa(lähde tietovirta). Jos tilauksen tuotteen hintaan täytetään 10€, tuotteen muut tiedot haetaan tuotteelta, jonka hinta on ainoana tuotteena 10€.
Seuraavassa laajennetaan tätä koko tilaus-toimitus-laskutus tietovirtaan:
('tilausnumero', 'tilauksen asiakasnumero', 'tilauksen asiakkaan nimi', 'tilauspäivä', 'tilauksen summa') ('tilausnumero', 'tilausrivin numero', 'tilauksen tuotenumero', 'tilauksen tuotteen nimi', 'tilauksen tuotteen hinta', 'tilattu määrä', 'tilauksen toimitettu määrä', 'tilauksen laskutettu määrä', 'tilausrivin summa') ('toimitusnumero', 'toimituksen asiakasnumero', 'toimituksen asiakkaan nimi', 'toimituksen tilauspäivä', 'toimituspäivä', 'toimituksen summa') ('toimitusnumero', 'toimitusrivin numero', 'toimituksen tuotenumero', 'toimituksen tuotteen nimi', 'toimituksen tuotteen hinta', 'toimituksen tilattu määrä', 'toimitettu määrä', 'rivin summa') ('laskunumero', 'laskun asiakasnumero', 'laskun asiakkaan nimi', 'laskun päivä', 'tilauspäivä', 'toimituspäivä', 'eräpäivä', 'laskun summa') ('laskunumero', 'laskurivin numero', 'tuotenumero', 'tuotteen nimi', 'tuotteen hinta', 'laskurivin tilattu määrä', 'laskurivin toimitettu määrä', 'laskutettu määrä', 'rivin summa') ('asiakasnumero', 'asiakkaan nimi', 'asiakkaan osoite', 'asiakkaan postinumero', 'asiakkaan postitmp') ('tuotenumero', 'tuotteen nimi', 'tuotteen hinta', 'tuotteen varastosaldo')
Huomaathan että tässä ei ole esimerkiksi osoitteita, ne lisätään tarvittaessa. Ajatus on löytää tekniset toiminnot, joilla ne saadaan toimimaan. Seuraavassa tietovirtamääritykset koko prosessista:
('sovellus'="tilaus", 'fromsovellus'="asiakas", 'tosovellus'="tilaus") ('sovellus'="tilaus", 'fromsovellus'="tuote", 'tosovellus'="tilaus") ('sovellus'="tilaus", 'fromsovellus'="tilaus", 'tosovellus'="toimitus") ('sovellus'="toimitus", 'fromsovellus'="toimitus", 'tosovellus'="laskutus")
Lisäsin edelliseen tilaussovellukseen kentät ’tilauksen toimitettu määrä’ ja ’tilauksen laskutettu määrä’ havainnollistaakseni prosessin kulkua takaisinpäin. Ensimmäisessä tilausriville saadaan tieto, kuinka paljon tilausriviä on toimitettu, ja se kopioituu yksiselitteisesti toimituksen toimitettu määrä kentästä. Jos tilausriviä on toimitettu useammassa toimituksessa, sen pitäisi olla tietysti summa näistä riveistä.
Laskussa on taas ‘laskun tilattu määrä’ kenttä, joka tulee yksiselitteisesti tilauksesta. Kenttä toimii esimerkkinä, jossa kenttä ei tule prosessin edellisestä vaiheesta vaan hyppää taaksepäin. Ilmeinen vaihtoehto olisi lisätä:
('sovellus'="laskutus", 'fromsovellus'="tilaus", 'tosovellus'="laskutus")
mutta tässä on muitakin kenttiä (asiakkaan tiedot, tuotetiedot), jotka kopioituisivat. Tässä taas laskulla voi jossakin tapauksessa olla useampia tilauksia, jolloin laskun tilattu määrä kenttään tulisi niiden summa. Hmmmm.
Samoin lisäsin tuotetietoihin ‘tuotteen vapaasaldo’-kentän. Se havainnollistaa ulkopuolista kenttää, jota ei talleteta käsiteltävään sovellukseen, mutta sillä kuitenkin tehdään käsittelyä tai laskentaa ja se talletetaan sovelluksen ulkopuolelle. Tässä oletetetaan että meillä on vain yksi varasto ja toimitukset lähtevät samana päivänä (vapaasaldo tietysti vaihtelee toimituspäivästä(-ajasta) johtuen), oikeasti ‘vapaasaldo’ olisi esimerkiksi (‘varasto’, ‘varastopaikka’, ‘tuotenumero’, ‘toimituspäivä’, ‘vapaasaldo’) tai vastaavalla tietueella. Edellisistä ‘varasto’ olisi valinnaisena tietona tilauksessa tai asiakkaalle määriteltäisiin lähin varasto, tai se voitaisiin päätellä yksiselitteisesti toimituksessa.
Laskussa on myös ‘laskun toimitettu määrä’ joka tulee yksiselitteisesti toimituksesta/toimituksista.
Jos järjestelmässä olisi asiakaskohtainen hinta, esimerkiksi (‘tuotenumero’, ‘asiakasnumero’, ‘tuotteen hinta’), vierasavainhaku palauttaisi kaksi tietuetta, tuotekohtaisen tuotteen hinnan ja asiakaskohtaisen hinnan (jos molemmat olisivat syötettynä). Yksinkertaisessa versiossa tilauksen tekijä valitsisi useammasta vaihtoehdosta, se toimisi myös muissa valinnoissa (jos esimerkiksi toimittajan valinta tilauksella palauttaisi kaksi toimittajaa). Hmmm.
Tässä on versio tilauksesta, ja toimituksesta jossa varasto on tilauksen riveillä ja toimituksessa toimituksen otsakkeella. Tässä tapauksessa jos tilatut tavarat tulevat varastoista 1 ja 2 tilaus jakaantuu kahdeksi toimitukseksi (esimerkiksi tuotevarastolle ja tarvikevarastolle).
('tilausnumero', 'tilauksen asiakasnumero', 'tilauksen asiakkaan nimi', 'tilauspäivä', 'tilauksen summa') ('tilausnumero', 'tilausrivin numero', 'tilauksen tuotenumero', 'tilauksen tuotteen nimi', 'tilauksen tuotteen hinta', 'tilattu määrä', 'varasto', 'tilauksen toimitettu määrä', 'tilauksen laskutettu määrä', 'tilausrivin summa') ('toimitusnumero', 'toimittava varasto', 'toimituksen asiakasnumero', 'toimituksen asiakkaan nimi', 'toimituksen tilauspäivä', 'toimituspäivä', 'toimituksen summa') ('toimitusnumero', 'toimitusrivin numero', 'toimituksen tuotenumero', 'toimituksen tuotteen nimi', 'toimituksen tuotteen hinta', 'toimituksen tilattu määrä', 'toimitettu määrä', 'rivin summa')