;

Prakticky jsem nezažil ERP projekt, kde by neprobíhalo žádné změnové řízení

23. 12. 2020
Doba čtení: 3 minuty

Sdílet

Autor: Asseco Solutions
Při definování rozsahu projektu nikdy nejsou obě strany schopny domyslet všechny detaily, a to je právě důsledek změnových řízení. Důležité je, aby všechny důvody změnových řízení byly vždy zavčas podchyceny a měly transparentní a jednoznačnou argumentaci, říká Lukáš Ontl, vedoucí oddělení inovací a rozvoje produktů, Asseco Solutions.

Procesní a diskrétní výroba vyžadují každá odlišný přístup k implementaci a provozu ERP systémů. V čem se oba typy výroby z hlediska ERP nejvíce liší a jaké mají požadavky na ERP systém?

Pro diskrétní výrobu je charakteristické to, že se vyrábí přesný počet kusů ve výrobní dávce podle přesně definovaného kusovníku.  Též se jí dá říci výroba nespojitá, jelikož mezi jednotlivými fázemi (operacemi) přetváření vstupních materiálů na výrobek mohou nastávat prodlevy. Typickým zástupcem diskrétní výroby je například strojírenství nebo elektrotechnický průmysl.

To je hlavní rozdíl od procesní (kontinuální) výroby. Zde je pohyb – proces přetváření vstupních surovin na výrobek kontinuální, bez přerušení nebo sadou kontinuálních procesů. Zástupcem procesní výroby je např. potravinářství nebo chemický průmysl.

V obou případech jsou určitá specifika, která je třeba zohlednit při implementaci ERP systémů. Pro procesní výrobu je nutná podpora proměnných receptur, pro konkrétní výrobní dávku. Například pro různé koncentrace vstupních surovin. Velmi významnou je i podpora dohledatelnosti vazeb šarží vstupních surovin a šarží hotových produktů.

Pro diskrétní výrobu je specifické plánování jednotlivých výrobních operací na jednotlivých pracovištích. Zásadní je optimální využití disponibilních kapacit při současném dodržení výrobního postup a minimalizování prostojů a potřeby přenastavení strojů. Klíčové ji i plánování nákupu vstupních materiálů tak, aby byli k dispozici v potřebný čas, avšak s nutností min. skladové zásoby.

Jakou roli hraje podle vašeho názoru správa změn (change management) při implementaci ERP systému?

Změnové řízení hraje při implementaci ERP zásadní roli. Prakticky jsem nezažil projekt, kde by žádné změnové řízení neprobíhalo. Při definování rozsahu projektu nikdy nejsou obě strany schopny domyslet všechny detaily a to je právě důsledek změnových řízení. Důležité je, aby všechny důvody změnových řízení byly vždy zavčas podchyceny a měly transparentní a jednoznačnou argumentaci.

Jaká jsou dnes z hlediska zákaznické firmy největší rizika plynoucí ze zrušení projektu implementace ERP systému?

ERP systém je pro zákazníky nástroj, který jim pomáhá řídit a rozvíjet jejich business. Hlavní riziko plynoucí ze zrušení projektu implementace ERP systému spočívá především v nedosažení benefitů, které má ERP systém přinést. Těmito benefity jsou zvýšení efektivity práce, podpora obchodu, optimalizace procesů, sjednocení systémů, atd.. Samozřejmě všechny tyto benefity lze převést i do ekonomických ukazatelů. Kromě toho zrušení projektu představuje i vícenáklady spojené s případným restartem projektu v budoucnu.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »