Mi s-a cerut sa fac o chestie, va explic mai jos. Pe care n-o s-o fac ca “nu e timp” si ca e aiurea sa ma plateasca si pe mine si pe un coleg pentru cat ar dura s-o fac. ROI mic. Daca nu cumva se poate mai usor si nu stiu eu.
Eu lucrez acum (si) cu un modul din SAP care se numeste Master Data Governance. Care e foarte misto dar un pic under-developed pentru deceniul asta. Ceea ce e si mai misto, ca asa castig eu bani multi.
Introducere, pentru aia care s-au pierdut din momentul in care am scris SAP, companiile au nevoie de calitatea datelor din sistemele lor. Secolul ( sau poate doar deceniul) asta este despre date si calitatea datelor. Ca sa poti sa faci analize si proiectii competente.
Datele tranzactionale generate automatizat de sisteme sunt ok. Robotii nu-s prosti si handicapati ca noi.
Celelalte generate de “mana omului” sunt ca …penis.
Imaginati-va companii in care oamenii introduc date despre materiale, despre clienti. Despre. De capul lor. Asa te trezesti cu 17000 de adrese fara zipcode, in conditiile in care in mai multe aplicatii , unele legale, codul asta postal e obligatoriu. Si vrei sa muti datele astea dintr-un sistem unde n-ai niciun fel de reguli intr-unul “compliant” ( sunt Raducioiu, nu stiu cuvantul potrivit) cu standardele. Si nu merge.
Asa ca companiile au evoluat de la Master Data Management la Master Data Governance. Adica baga un apasaci datele alea “in calculator”, dar nu devin active si folosite in toata compania imediat. Nu, ca poate a introdus cacaturi. Intra intr-un proces de aprobare, isi mai dau si altii cu parerea, mai experti decat el si daca e ok, intra in sistem. Despre procesul asta de aprobare e vorba in “Governance” si din asta sug bani.
Ajunge cu introducerea.
In MDG ai modele de date. Va arat acum unu “standard” dezvoltat deja de SAP, pentru Business Partner ( clienti si furnizori ). Din motive de discretie si contract nu va pot arata fix ce lucrez, adica un model custom.
Entity types alea sunt un concept complex, pe care nu am sa-l dezvolt, dar ganditi-va la ele ca la niste structuri de date. Ca sunt linii, ca sunt doar un camp, nu conteaza – structuri, nu intram in detalii.
Cand introduci date, mii si zeci de mii de intrari si cand sunt mai multi care fac asta, ar trebui sa te asiguri ca nu introduci duplicate. Si ar trebui sa rulezi ceva queries, sau sa cauti prin datele introduse cumva ca sa te asiguri ca nu a introdus deja cineva clientul ala, in cazul de sus. Doar ca nu asa functioneaza angajatii. Pe angajati ii doare in pula. Nici un select nu stiu sa scrie, nici un excel n-ar deschide. Consuma timp. Motiv pentru care tre’ sa faci un proces automat care verifica el si le arata la prosti pe ecran, ba, eu cred ca esti pe cale ssa introduci un duplicat, ia da o geana ici ( sub ici , pui un link unde da omu’ tau click si ii aduce potentialul duplicat). Si ala vede mai departe ce face.
Sapu’ s-a gandit si la asta, si are ceva “built in”, ca sa nu stai sa scrii cod gramada, ca handicapatu'( asa li se spunea in Romania la programatori, pe vremea cand nu plateau impozit pe venit) .
Si clicka-clicka, iti faci o aplicatie de cautare, cu un profil pe care il configurezi cam ca mai jos.
Ai niste campuri , un mod de cautare, vezi aici HA, de la Hanna, care stie cu fuzzy search si alte manele .
Gen distanta dintre cuvinte (Damerau – Levenshtein) pe care am implementat-o si eu manual acum vreo 5 ani si care era un chin pentru baza de date. Not anymore.
Mai vedeti acolo ceva pondere in relevanta penru stabilirea candidatului la a fi duplicat si ordinea de cautare.
Boon. Asta a fost introducerea de fapt.
Vedeti acolo LATITUDE SI LONGITUDE. S-a cerut sa verific daca o locatie e duplicat. In afara de nume, astea-s doua coordonate utile in stabilirea acestui fapt. Ar mai fi tara si oras, dar sa nu ne pierdem in detalii.
Si-am zis simplu: Faci exact match pe geolocatie si daca e match, hai cu duplicatul. Acolo nu-i chiar exact match ca e exact match pe fiecare coordonata, ceea ce nu-i corect. Deloc. Da-n fine pot sa concatenez campurile alea intr-unu, iar apoi am exact match pe locatie.
Clientul vine si zice ca nu e asa, ca vrea fuzzy match, fie, merge si aia. dar vrea o toleranta cu raza de 5km .
Suna simplu, si eu as pune conditii d-astea daca as fi client. Dar.
Coordonatele geografice standard de GPS sunt in radiani ( nu au subunitatile de grad in minute si secunde – care-i o porcarie, intre noi fie vorba) ci in fractiune de grad (decimals), dar tot aia e.
Problema cu Pamantul e doua. Una e ca e rotund ( azi mi-as dori sa fie plat, unde-s aia cu Societatea Pamantului Plat sa fac un lobby cu ei ca sa fie plat) , a doua e ca nici chiar asa de rotund nu e.
Pe a doua o trecem la toleranta si ramanem cu prima.
Si daca e rotund ai sistemul asta de impartire de sfera.
Linii paralele pe latitudine si nu asa de paralele pe longitudine.
Ceea ce inseamna ca latitudinea se poate transforma in mod direct in km – vreo 110 mii si ceva pe grad, dar longitudinea nu. Ca daca esti la polul geografic ai toate gradele intr-un milimetru (punct).
Desigur ca exista transformare matematica pentru a calcula longitudinea in km de la un punct de referinta, si nu-i chiar complicata. Long. Km = Cosinus ( Lat. Rad. ) x Lungimea unui grad de longitudine la ecuator – adica unde latitudinea e 0.
La prima vedere nu-i greu. La a doua vedere trebuie sa mai fac 2 campuri cu Latitudine si Longitudine in KM. Sa le calculez la introducere pentru fiecare locatie. Si sa le normez tot la 5km. Adica deplasarea pe linia ecuatorului , din punctul de longitudine 0, va avea valoarea , nu 5, ci 1.
Si sa le compar pe alea – DAAAR, tot nu e ok, ca o raza de 5km in jurul unui punct nu are multe de aface cu fuzzines si cu Damerau – Levenshtein. E alta matematica.
Eu obtin o granularite exprimata in spatii patrate, ca patratul negru de mai jos. Ei vor o continuitate determinata de raza unui cerc.
Eh, nu pot sa construiesc o transformare matematica prin care sa mapez o proiectie plana in cercuri. Ca fie se suprapun fie am zone de “umbra”. Daca nu intelegeti ce spun ar cam fi fost momentul sa inchideti pagina acum 20 de randuri.
Pot sa rezolv problema cu o matrice de distante, intre fiecare si fiecare locatie. Sau la momentul la care se calculeaza duplicatele sa scriu eu propria functie care verifica coordonatele introduse versus toate celelalte , sau versus toate intr-un range, ca nu suntem idioti. Dar asta nu mai e clicka-clicka, stiu s-o fac, dar pe urma tre’ sa integrez cu standardul de clicka-clicka si aci nu mai e usor si prin urmare nu merita sa platesti niste mii de euro ( vorbesc de client) pentru diferenta de precizie.
Nu, nu va cer sfatu’, doar ma laud si va intreb daca jobul vostru’ e la fel de mishteaux.
Asta ca sa aveti ce face pana la down time, ca eu sigur am.
Vezi ca cei de la ESRI au un modul pentru SAP care face chiar chestii din astea. Integreaza functionalitati de GIS in SAP. In alta ordine de idei, exista sdk-uri pe net (JS, .NET) care implementeza exact asemenea functii de geolocatie si de comparare coordante geo. Unele sunt open source. Tu primesti la input coord GPS in format WGS84 (proiectie Mercator sau WebMercator cel mai probabil). Daca nu ma inseala memoria (sunt cativa ani de cand nu am mai facut din astea), ar trebui sa transformi in sexazecimal (grade minute secunde). Ai putea sa te uiti la secunde si sa… Read more »
Nu-mi trebuie nimic in grade minute si secunde. Coordonatele GPS trebuiesc transformate in kilometri. Adica deplasarea in radiani de la 0,0 trebuie mapata in kilometri. Exista pentru .js, pentru .net, nu ma intereseaza n-am ce face cu ele. Am si zis ca nu e problema sa transform astea. E un rahat de cosinus. Acolo. Si distanta stiu cum se calculeaza. Problema-i cand vrei sa integrezi asta in serviciul de duplicate check oferit deja in pachet. Si cand tre’ sa faci calculul de distante dintre coordonatele introduse de utilizator versus cele * mii, sau zeci de mii de locatii deja introduse… Read more »
O alta solutie este sa folosesti Google Maps API, in mod free (pana la 5000 interogari pe zi, parca) si faci apel de web service catre Google cu valorile X si Y si iti intoarce distanta de diferenta
Solutia asta e gresita din mai multe motive. Te rog, nu mai sugera nimanui sa foloseasca genul asta de API pentru integrarea in produse pentru care oamenii platesc licente de sute de mii de euro si dezvoltarea inca pe atat. Macar pentru faptul ca poate oamenii astia nu sunt de acord sa le faca google tracing si profiling. Ca altfel am fi lucrat toti cu cod de pe github sau de pe stackoverflow. P.S. Cum am spus. Nu caut o solutie. Stiu sa fac singur asta. Si ar fi chiar amuzant. Doar ca nu e realist utila si n-o sa… Read more »
Ref Google Api sau altele,putem continua pe mail, daca doresti
Nu cred ca e cazul, deja s-au sesizat aia care platesc banii ca oamenii lor cer cam multe fite fara trebuinta reala iar acum se uita sa mai taie din ele. Dar ideea e tot aia. Stiu cum se face bucata aia pentru care gasesti API fara sa apelez la integrarea cu produse externe care nu au cum sa fie mai rapide decat un calcul efectuat local. Doar ca integrarea de la “rezultat”, fie ca-i oferit de mine in framework-ul standard e partea complexa si cauzatoare de efort. P.S. Eu inteleg ideea cu de ce sa te mai obosesti sa… Read more »
Doar de amuzamentul discutiei. Stii tu un astfel de API care poate sa raspunda la 5-10 000 de astfel de interogari in mai putin de 0.1 secunde? Toate, nu fiecare. Ca daca-i peste depasesc deja timpul de raspuns al functionalitatii standard pe celelalte campuri.
Nefiind de specialitate, am întrebat în altă parte și mi s-a zis:
“Gata, am citit, dar tot n-am inteles care e marea dilema. Cel mai simplu ar fi sa foloseasca cele doua coordonate ortogonale pe sfera (unghiurile Euler), sa calculeze separat cele doua distante corespunzatoare diferentei in latitudine si longitudine, iar apoi s-o aleaga pe cea mai mare dintre ele. In felul asta, cercul devine patrat. Probabil ca stie si el asta, dar a rescrie o harta folosind o metrica diferita de cea local euclidiana cere efort si bani mai multi.”
Am zis mai sus . Nu calculul distanței e marea problemă. Poate pentru cineva din afara SAP asta pare provocarea, dar nu.
Faptul că am o funcție blackbox care calculează duplicate pe bază de diferența liniară a valorilor din câmpuri . Și că indiferent dacă ești pe o sferă / cub , când faci proiecția în plan – variația coordonatelor de poziție te înscrie într-un patrat , iar distanta e un cerc descris de o rază dintr-un punct descris de coordonatele de poziție și că ( vezi mai jos ) …
Daca specs cere sa prelucrezi 10000 inregistrari in max 0.1 secunde, atunci nu e treaba de apelat api-uri externe, clar.
Folosesc in mod curent atat google cloud cat si esri si aws (conturi platite, enterprise) si nu se incadreaza in cerintele astea.
P.s. Conturile enterprise nu au profiling-ul de care vorbeai. Da, pe tarlaua mea cloud-ul e in standard.
(->urmare la și că ) … Am fost optimist. La 10k queries + calcul de distante și de transformare de coordonate durează 0.25 secunde de secunde. În producție probabil merge mai repede că e sistemul mai bun. Dacă fac un singur query și iau toate locațiile și calculez distanțele dintre ele mă aștept să fie sub 0.1 secunde, dar agregat cu căutarea de duplicate executată de SAP pentru celelalte câmpuri va fi pe la minim 0.2 secunde Estimez 0.25. Așa că. Ar trebui să fac ceva profiling pe coordonate. Gen să îmi aleg ceva Range în funcție de coordonatele de… Read more »
foarte interesant. imi dau seama ca daca cere clientul, cere, dar altfel, nu e cel mai safe sa se caute pe baza codului unic de furnizor, gen cui, siret, etc? ca si daca are fix aceeasi adresa, si se schimba ca persoana juridica, teoretic ar trebui un nou cont, nu? cred ca practic nu prea face nimeni asta, dar totusi…
eu sunt curioasa sincer ce se intampla de la “Si ala vede mai departe ce face.”, daca il lasa sa treaca mai departe si cu duplicatul gasit. :))
Ei sunt furnizorul. Trimit echipamente la clienți. Clienții le vând la unii la alții , că nu sunt chiar șireturi. Uneori afla de locațiile alea și de potențiali clienți pe care trebuie să îi bântuie să le propună o achiziție. Ce spui tu cu cont nou e valabil pentru obiectul de date “client ” Acolo e vorba de o locație unde se desfășoară “operațiuni”. Nu-i sediu social , sau ceva și pot fi mai mulți clienți într-un singur loc. Acum se discută dacă să se impună un prag de asemănare peste care userului să îi fie refuzată introducerea , sau… Read more »
Oare nu e complicat cu facturarea dupa? Probabil adresa de facturare ramane aceeasi.
As paria pe a doua varianta (sorry) :)) Nu de alta, dar daca voiau sa ii lase sa isi faca de cap nu te mai aduceau, iar sa le respinga ceva nu le convine ca si concept cred
Nu prea are treaba cu facturarea. obiectul asta e introdus sa le foloseasca agentilor de vanzari ca sa stie unde opereaza aia, ce se opereaza acolo, ca sa poata sa ii spameze pe aia cu “nu vreti sa va dam un echipament?”
La cat costa o magaoaie ca aia si ce face nu cred ca ii printeaza o eticheta cu adresa de livrare dintr-un SO si-o pun pe firma de logistica.
Gen mining rigs, dar nu d-alea de bitcoini, lol.
Nici macar nu au SAP pentru altceva decat master data. Au alte sisteme pentru procesele lor de ERP/CRM.
Pe de alta parte daca vor aia, stiu cum se face, e posibil si e foarte bine pentru mine. Eu speram la go live pe 15 aprilie, dar nu cred pana in mai.