Metallitööstusettevõte · 2026
Laserlõikuse nimekiri Monitor ERP-st
Monitor ERP andmed laserlõikusele kindlas formaadis: ainult veel planeerimata detailid, alati värske, õigete kuupäevadega ja ilma käsitsi kopeerimiseta.
Eesmärk
Nimekirja ülesanne oli koondada Monitor ERP-st laserlõikuse jaoks vajalikud andmed kindla valemi järgi ja kindlas formaadis. Tootmise planeerimine ise käib Monitoris, mis töötab veebis ja on tootmise ainus andmebaas. Nimekiri seda ei asenda. See võtab Monitorist välja ainult need detailid, mis on laserile vaja, näiteks veel planeerimata detailid, õige versiooniga detailikoodi ja materjali märke. Siis annab see need edasi kujul, mida laser vajab, ilma et keegi peaks andmeid käsitsi välja kirjutama või ümber vormistama.
Tulemus numbrites
Mis muutus
Enne 9,7 s
0.5 s
andmete kirjutamine Excelisse, umbes 20 korda kiirem
Enne 2 000
4600+
rida jõuab nimekirja, vana kopeerimine lõikas 2 000 juures ära
Enne kõik
0
juba planeeritud detaili, mida tuleb nimekirjast käsitsi välja noppida
Enne 107 kirjapilti
1 kuju
versiooninumbrid ühtsel kujul nagu joonisefailide nimedes (.r1, .p0)
Enne käsitsi
2 min
tagant uuenevad andmed ise, vanad andmed muutuvad punaseks
Olukord
Metallitööstusettevõttes käib tootmise planeerimine Monitor ERP-s, mis töötab veebis ja on kogu tootmise andmebaas. Laserlõikus vajab sealt aga andmeid kindlas kujus: ainult veel planeerimata detailid, õige versiooniga detailikoodid, materjali seis ja kuupäevad. Need koondas Monitorist kokku üks Exceli fail. Aastatega oli sellest saanud keeruline pusle: SQL-päringud, API-kutsed, Exceli andmeühendused, filtrid ja VBA-makrod, kõik üksteisest sõltuvad. Kui üks tükk muutus, läks mujal midagi katki, ja keegi ei teadnud enam täpselt, mis millest sõltub.
Lisaks olid faili raportid kirjutatud Monitori vana versiooni G4 andmebaasi jaoks, aga andmed tulid nüüd G5-st. Seal olid peaaegu kõik tabelid ja väljad teise nimega, nii et faili päringud tuli ükshaaval ümber kirjutada.
Ka nimekirjaga endaga oli muresid. Seal olid ka juba planeeritud detailid. Osa ridu kadus mõne päevaga vaikselt ära. Kuupäevad võisid olla päeva võrra nihkes. Suur osa andmetest ei jõudnud nimekirja üldse. Kokkuvõttes ei saanud nimekirja päriselt usaldada.
Suurem osa tööst ei olnud koodi kirjutamine, vaid uurimine. Monitori ekraanil on igal veerul selge nimi, aga andmebaasis on üle 1 500 tabeli ja kuskil pole kirjas, milline väli millisele ekraaniveerule vastab. Iga oletust kontrollisin samamoodi: võtsin mõned tellimused, mille õiget vastust ekraanilt teadsin, ja vaatasin, kas andmebaas annab sama. Mõni oletus pidas vastu, mõni osutus täpselt tagurpidi ja mõnda väärtust polnud andmebaasis üldse olemas. Iga probleemi juures on kirjas ka see, mis esimese hooga ei töötanud.
Piirangud
- Tootmistarkvara ennast muuta ei saanud. Andmeid sai ainult lugeda ja isegi proovi pärast ei tohtinud Monitoris ühtegi operatsiooni ümber tõsta.
- Andmebaasis on üle 1 500 tabeli ja G5-s on enamikul neist uus nimi. Ekraaniveergude ja andmebaasiväljade vastavust pole kuskil kirjas ja SQL Anywhere süsteemitabelid on teistsugused kui tavalistel andmebaasidel, nii et isegi ühe tabeli veergude nimekiri nõudis mitu katset.
- Päringud käisid kaugühenduse kaudu kliendi arvutis ja tulemused tulid tagasi ükshaaval. Iga vale oletus maksis aega, seega pidi iga kontrollpäring olema enne läbi mõeldud.
- Kõige tähtsam info, ehk kas detail on juba planeeritud, polnud kuskil kirjas.
- Nimekirja kuju pidi jääma samaks, sest laserlõikus kasutab andmeid just selles formaadis. Excel on siin ainult vahelüli Monitori ja laserlõikuse vahel, mitte töökeskkond.
- Mitu viga tuli välja alles pärast mitu päeva kasutamist. Ühest proovikäivitusest ei piisanud.
Lahendus
Kuidas lahendasin
G4 → G5
Faili raportid (koosluste, laoseisu, planeerimise, tellimuste ja tarnete nimekirjad) lugesid andmeid Monitor G4 andmebaasi kujul. G5-s olid peaaegu kõik nimed teised.
G4 tabelid olid rootsikeelsete lühenditega: tootmistellimus oli torder_huvud, detail artikel, müügitellimuse rida korderrad. G5-s on need ManufacturingOrder, Part ja CustomerOrderRow, ja sama lugu on väljadega. Mõni vana tabel jagunes uues süsteemis kaheks, näiteks aadressid, ja mõni seos, mis oli varem eraldi vaates, on nüüd hoopis üks väli rea küljes.
Käisin raportid läbi ükshaaval, lihtsamast keerulisemani. Iga tabeli ja välja vaste panin kirja ühte kaardistusdokumenti koos sellega, kas see on kinnitatud päris andmete peal või alles oletus. Nii ei pidanud järgmise raporti juures sama asja uuesti välja uurima.
Mis ei töötanud: nime järgi arvamine. Tarnete nimekirjas tundus vana „päise detailinumbri” loogiline vaste olevat väli nimega PartConfigurationId, aga sellist välja detailitabelis polnudki ja päring kukkus. Õige vaste leidus alles siis, kui vaatasin müügitellimuse rea kõik 141 välja päris andmetega läbi. Sealt tuli välja ka see, et tootmistellimuse number, mis G4-s tuli eraldi vaatest, on G5-s otse rea küljes.
Üks asi jäi õnneks samaks. Joonise PDF-faili tee leitakse vanade failitabelite kaudu ja need on G5-s alles ning töötavad muutmata. Samuti ei vajanud muutmist ükski VBA abifunktsioon (pildi otsimine, PDF-i lisamine, filtrite koostamine), sest need ei puutu andmebaasi. Nii piirdus töö päringutega ja nimekirja kuju, mida laserlõikus kasutab, jäi samaks.
Andmed
Nimekirjas olid ka detailid, mis olid juba planeeritud. Need tuli käsitsi välja noppida.
Mis ei töötanud: esimene kandidaat oli prioriteediplaani „Include” linnuke, sest see paistis ekraanil just õigete ridade juures. Otsisin andmebaasist kõik väljad, mille nimes on „include”. Neid oli üle viiekümne, puudumiskoodidest käibemaksumääradeni, aga ükski ei kuulunud tootmistellimustele. Monitori juhend kinnitas põhjuse: see linnuke on ainult ajutine valik, millega planeerija märgib read nupuvajutuse jaoks (näiteks ümberplaneerimine), ja andmebaasi seda ei salvestata. Ainus sarnane väli, „kas operatsioon on prioriteediplaanis”, oli kõigil 7 470 aktiivsel operatsioonil sama väärtusega, nii et see ei eraldanud midagi.
Mis lõpuks töötas: õige vihje tuli tellija poolt. Monitori API-s on tootmisoperatsioonil väli BundleId, mida API kirjeldus nimetab lihtsalt „operatsioonide kogumi ühiseks tunnuseks”. Kui planeerija kaasab read planeeringusse, saavad need ühise BundleId. Tavalistel ridadel on väli tühi.
Ka see polnud kuskil üheselt kirjas ja vale filter oleks vaikselt vajalikke detaile nimekirjast välja jätnud. Seega võrdlesin enne kasutamist Monitori ekraanil värviliselt märgitud ja tavalisi ridu andmebaasi kirjetega mitme töökäsu ja operatsiooni peal. Kõigil värvilistel ridadel oli BundleId olemas, tavalistel mitte ühelgi. Alles siis lisasin päringusse filtri BundleId IS NULL. Nüüd jõuavad nimekirja ainult need detailid, mida pole veel kellegi planeeringusse kaasatud.
Materjal
Nimekirjas pidi olema näha ka see, kas detaili materjal on välja antud, ehk sama „R” või „C” märge, mida Monitor ekraanil näitab.
Monitoris tähendab „R”, et operatsiooniks on materjali vaja, aga seda pole veel välja antud, ja „C”, et materjal on välja antud. Andmebaasis leidsin operatsiooni juurest välja, millel oli ainult kaks väärtust, 0 ja 1. Loogiline oletus oli, et 1 tähendab „materjal puudub”.
Mis ei töötanud: oletus oli täpselt tagurpidi. Kui võrdlesin tulemust Monitori ekraaniga, olid kõik „R” read nimekirjas „C”. Kogu andmebaasis oli 0-ga ridu umbes 921 000 ja 1-ga umbes 206 000, aga ainult arvude põhjal polnud võimalik öelda, kumb tähendus on õige. Seda näitas alles ekraan.
Teine lõks oli ridade kokkutõmbamine. Üks detail võib olla mitmel operatsioonil, millest ühe materjal on välja antud ja teise oma mitte. Kui sellised read kokku tõmmata, valib andmebaas nende seast suvalise ja märge on vahel õige, vahel vale. Nüüd on iga operatsioon eraldi real koos tellimuse numbriga, nii et märge kuulub alati õigele reale.
Andmekvaliteet
Detailikoodid said vale lõpu, sest versiooninumbrit oli andmebaasis kirjutatud 107 eri moel (P.2, REV1, R.0 ja palju käsitsi sisestatud vigu).
Nimekirjas peab detailikood olema sama kujuga nagu joonisefailide nimedes: detailinumber, punkt ja versioon, näiteks .r1 või .p0. Andmebaasis on see info kahes kohas. Osal detailidel on versioon juba numbri sees, teistel tuleb see tellimuse juurest eraldi versioonitabelist.
Lihtne otsi-ja-asenda siin ei aidanud, sest iga uus reegel tõi välja järgmise erijuhu. REV.1 tuleb teha .r1, aga PRE.0 tuleb teha .p0, mitte .r0. Kui versioon on juba numbri sees, ei tohi seda teist korda lisada, muidu tekib lõpp .r0.r0. Numbri sees võib versioon olla suure tähega (.R3, .P1) ja siis tuleb see teha väikseks, et nimekiri poleks kirju. Kui versiooni pole üldse, saab detail lõpu .p0.
Kirjutasin loogika, mis leiab versiooninumbri üles ükskõik millisest kujust, ja kontrollisin seda kõigi 107 variandi peal. Iga detail saab nüüd õige lõpu.
Versiooninumbri lisamine tõi kaasa veel ühe vea: andmebaasi ühendus (ODBC) katkestas päringu teatega „Invalid string or buffer length”. Otsisin põhjuse samm-sammult. Põhipäring töötas, ka versioonitabeli liitmine töötas, viga tekkis alles siis, kui versiooni tekst detailikoodi külge liideti. Lahendus oli teisendada tekstiväljad enne liitmist kindla pikkusega tekstiks, millega ühendus toime tuleb.
Loogika
Read kadusid mõne päevaga nimekirjast ega tulnud enam tagasi.
Makro kontrollis ainult neid ridu, mis olid parajasti nähtaval. Kui detail oli korra planeeritud ja seetõttu peidetud, ei vaadatud seda enam kunagi üle, isegi kui see planeeringust hiljem eemaldati. Ühe käivitusega seda ei märganud, sest peidetud ridu kogunes aeglaselt, päevade jooksul. Nüüd tehakse enne igat filtreerimist kõik read uuesti nähtavaks ja kontrollitakse üle.
Lisaks lõikas vana kopeerimine nimekirja 2000 rea juures ära, kuigi ridu oli üle 4600. Nüüd leitakse andmete suurus automaatselt.
Kuupäevad
Planeeritud alguskuupäev oli vahel päeva võrra nihkes, kuigi lõppkuupäev tundus õige.
Monitor salvestab kellaajad UTC järgi. Operatsioon, mis algab 11. märtsil Eesti aja järgi, on andmebaasis kirjas kui 10. märts kell 22.00. Vana päring võttis sellest lihtsalt kuupäeva ja detail sai päev varasema alguse. Lõppkuupäev tundus õige, sest see on salvestatud kella 21.59 peale ja jääb UTC järgi samale päevale. Nüüd teisendatakse aeg enne kuupäeva võtmist Eesti aega.
Monitor näitab kuupäevi kujul aasta, nädal ja päev: 26113 on 2026. aasta 11. nädala kolmas päev. Nimekiri näitab neid nüüd samas kujus, et keegi ei peaks peast ümber arvutama. Seadsin ka veerud samasse järjekorda nagu tootmistarkvaras. Lisandus ka tellimuse numbri veerg: nii on näha, kui sama detail on kahel eri töökäsul ja ainult üks neist on planeeritud.
Usaldusväärsus
Keegi ei teadnud, kas ekraanil olevad andmed on värsked või mitu tundi vanad.
Fail uuendab andmeid avamisel ja siis iga kahe minuti järel. Viimase uuenduse kellaaeg on alati näha ja kui ühendus katkeb, muutub see punaseks.
Osa vigu tuli Excelist endast. Andmeühenduse uuendamisel võib Excel veergude asukohti muuta ja OneDrive’i automaatne salvestamine võib käivituda keset makro tööd. Lisasin veakäsitluse ja kaitse automaatsalvestuse vastu, nii et pooleli jäänud töö ei jäta Excelit käsitsi arvutamise režiimi ega salvesta poolikut vahetulemust.
Kiirus
Uuendamine oli aeglane ja kõik arvasid, et süüdi on andmete pärimine tootmistarkvarast.
Mõõtsin enne, kui midagi muutsin. Kõik 199 päringut võtsid kokku vaid umbes 2,8 sekundit. Päris pidur oli Excel ise, kuhu andmeid kirjutati üks rida korraga. Kui kirjutada kõik korraga ühe massiivina, läks Exceli osa umbes 20 korda kiiremaks: 9,7 sekundilt 0,5 sekundile.
Hilinemine
Nimekirja taheti ka sama hilinemise numbrit tööpäevades, mida Monitori prioriteediplaan ekraanil näitab.
Valem ise on lihtne: uue lõppkuupäeva ja planeeritud lõppkuupäeva vahe tööpäevades, samas aasta-nädal-päev kujus, mida Monitor kasutab. Raske oli leida uut lõppkuupäeva ennast.
Mis ei töötanud: esimene valem andis õige vastuse (−2) just sellel tellimusel, mille peal seda proovisin. Järgmisel tellimusel, kus ekraan näitas 0, andis sama valem −9. Sealt edasi kontrollisin iga kandidaati mitme tellimuse peal korraga: tellimuse, sõlme ja operatsiooni kuupäevad, operatsiooni planeeritud päevade tabel ja prioriteediplaani ettepanekute tabelid. Mõni variant andis osale tellimustest õige vastuse, aga ükski ei andnud õiget vastust kõigile.
Kõige selgem oli üks tellimus, kus ekraan näitas −8 tööpäeva. Uus lõppkuupäev oli märtsi lõpus, aga selle tellimuse iga kuupäev andmebaasis oli aprillis. Otsitavat kuupäeva polnud seal lihtsalt olemas. Proovisin selle ka ise välja arvutada Monitori juhendis kirjeldatud järelejäänud tööaja valemiga, aga selle operatsiooni järelejäänud töö oli umbes kolm minutit. Sellega ei saa seletada ligi kahenädalast nihet.
Lõpuks andis vastuse juhend: uus lõppkuupäev arvutatakse iga kord uuesti hetke kellaajast, kõigi prioriteediplaanis eespool olevate operatsioonide järelejäänud ajast ja töökeskuste võimsusest. See on väike planeerimismootor Monitori programmi sees. Tulemust ei salvestata andmebaasi ja seda ei anna välja ka API. Andmebaasis on küll väli NewFinishDate, aga see oli tühi kõigil umbes 1,16 miljonil real.
Lihtsustatud asendus, ehk päevad tänasest planeeritud lõpuni, andis samal tellimusel −30, mitte −8. Selle asemel, et panna nimekirja number, mis on vahel õige ja vahel vale, jätsin selle veeru välja ja kirjutasin põhjuse üles. Vale hilinemise number on hullem kui number, mida pole.
Tulemus
Laserlõikus saab nüüd Monitorist nimekirja, mis uueneb ise, sisaldab ainult veel planeerimata detaile ja annab märku, kui andmed on vanad. Planeerimine ise jääb Monitori. Nimekiri ainult koondab sealt selle, mida laser vajab, ja just selles kujus.
Ütlesin ausalt ka selle, mida teha ei saa. Kaks väärtust arvutab Monitor ainult hetkeks ega salvesta neid kuhugi: vastav väli oli tühi kõigil umbes 1,16 miljonil real. Nende väljamõtlemise asemel kirjutasin üles põhjuse ja pakkusin välja realistlikud edasised võimalused.
Keegi ei pea enam andmeid Monitorist käsitsi välja kirjutama, ümber vormistama ega kontrollima, kas mõni detail on juba planeeritud.
Mida see väärt on? Metallitööstuses tähendab üks vahele jäänud või kaks korda planeeritud detail seisvat masinat, kiirtellimust või hilinenud tarnet, mis maksab tihti sadu kuni tuhandeid eurosid korraga. Nimekiri, mis võtab andmed alati värskelt Monitorist ja jätab juba planeeritud detailid välja, vähendab just selliseid vigu. (Hinnang põhineb tüüpilisel allhanketehasel, mitte kliendi raamatupidamisel.)
Edasi
Järgmine loogiline samm on automaatsed teated hilinevate tellimuste ja materjalipuuduse kohta, otse Monitori andmete põhjal.