Implementarea Unei Note Oss In Sap
INTRODUCERE
Un sistem ERP (Enteprise Resource Planning) este o soluție software din seria aplicațiilor economice, multi-modulară, care integrează toate procesele economice ale întreprinderii cu scopul optimizarii și creșterii eficienței acesteia. Un ERP contribuie decisiv la gestiunea afacerii, ajută în structurarea deciziilor de management prin furnizarea de rapoarte cu un grad foarte ridicat de acuratețe, asigură un timp de răspuns extrem de mic și un mod de organizare relațional al datelor.
Concurența acerbă existentă pe piață, implică nevoia unui management rapid și performant în condițiile în care volumele de date cu care se lucrează sunt imense și sistemele clasice par să fie depășite, de aceea este nevoie de soluții care să permită extragerea rapidă a cunoștințelor necesare în procesul de fundamentare inteligentă al deciziilor.
Un sistem ERP este un sistem informatic de gestiune, un instrument software care facilitează integrarea tuturor informațiilor dintr-o organizație într-o platformă unică. Scopul ERP este să asigure transparența datelor în cadrul unei organizații și să faciliteze accesul la orice tip de informație utilă în desfășurarea activității.
Programele pentru planificarea resurselor întreprinderii, sau ERP, sunt concepute pentru a fi nucleul unei întreprinderi, tind să integreze toate departamentele și funcțiile unei companii într-un singur sistem informatic ce poate servi tuturor necesităților particulare ale oricărui departament.Proiectarea unui singur produs informatic care să răspundă necesităților atât personalului din departamentul financiar, cât si a celor de la resurse umane sau a celor de la producție nu este deloc ușoară, deoarece fiecare departament are propriile lui sisteme informatice specializate și optimizate pentru nevoile particulare proprii. Însă ERP le combină pe toate acestea într-un singur program informatic conectat la o bază de date comună, astfel încât comunicarea interdepartamentală este mult mai facilă.
Având ca denumire în limbajul de specialitate EAI (Enterprise Application Integration), integrarea aplicațiilor la nivel de companie reprezintă, o nouă modalitate de lucru în domeniul software. Întreprinderile au din ce în ce mai puțini informaticieni care concep și scriu aplicații și din ce în ce mai mulți care integrează aplicații. Este de preferat utilizarea și integrarea unei aplicații deja existente, care și -a dovedit utilitatea, decât scrierea unei noi aplicații complexe, care ar trebui să treacă prin etapele de proiectare, testare, generând costuri și riscuri neprevăzute. Entitatea ce trebuie integrată nu mai este un obiect sau o componentă software, ci este o aplicație software. Prin EAI, sistemele informatice ale întreprinderilor se mulează din ce în ce mai bine pe structura procesului de afaceri, în cele mai variate domenii de activitate.
Aplicațiile software de tip ERP pot fi folosite pentru a gestiona procesul de planificare a producției, cumpărare piese de schimb, gestiunea stocurilor, interacțiunea cu furnizorii, furnizarea de servicii pentru clienți. ERP poate include, de asemenea, modulele aplicației pentru aspectele financiare și de resurse umane ale unei afaceri. De obicei, un sistem ERP foloseste sau este integrat cu un sistem de baze de date relaționale și poate fi integrat cu alte sisteme de tip CRM (Customer Relationship Management), SRM (Supplier Relationship Management), SCM (Supply Chain Management). Adoptarea, proiectarea sau implementarea unui sistem ERP este o decizie dificilă și costisitoare pentru orice organizație.
Aceste aspecte, dar și faptul că lucrez la dezvoltarea unui astfel de sistem integrat, m-a făcut să abordez ca temă pentru lucrarea de licență “Implementarea unei note OSS in SAP”. Lucrarea este structurată în 2 capitole, prefațate de o introducere și încheiată cu un set de concluzii. În primul capitol este prezentată compania în cadrul căreia imi efectuez activitatea zilnica și anume Xella Group, iar în cel de-al doilea capitol sunt prezentate câteva noțiuni teoretice și explicații ABAP utilizate în realizarea notelor OSS.
Compania SAP a fost fondată în Germania în 1972 de cinci ingineri IBM. Termenul SAP provine de la Systeme, Andwendungen, Produkte în der Datenverarbeitung care – tradus în engleză – Sisteme, Aplicații, Produse în Prelucrarea Datelor. Fiind dezvoltat în Germania, numele complet al societății-mamă este de SAP AG. SAP are filiale în peste 50 de țări din întreaga lume, de la Argentina către Venezuela, inclusiv în Romania.
În prezent, există mai mult de 44.500 de instalari SAP, în 120 de țări, cu mai mult de 10 de milioane de utilizatori și numărul este în continua crestere.Această lucrare are în primul rând rolul de a evidenția noțiunile generale ale limbajului de programare ABAP și avantajele pe care acesta le oferă, stând la baza celui mai renumit ERP din lume, SAP-ul.
ABAP-ul este un limbaj de programare care permite utilizatorilor customizarea sistemului în funcție de nevoile lor. Este un limbaj usor de învățat pentru persoanele care au cunostințe despre programare și baze de date relaționale. În contrast cu alte limbaje, programele ABAP există în interiorul bazei de date SAP. Ele nu sunt stocate în fișiere ca în alte limbaje.
Modalitatea standard de a rula programele ABAP este realizată cu ajutorul unei tranzacții.Utilizatorul nu va rula programul direct, ci printr-un cod de tranzacție care poate fi accesat fie direct, fie printr-un meniu (care poate fi configurat de către client).
ABAP Workbench include toate instrumentele necesare pentru crearea și modificarea de obiecte ABAP Repository. Cu aceste instrumente, dezvoltatorul poate acoperi întregul ciclu de dezvoltare.
SAP R / 3 este livrat la un client doar cu setările de bază activate, și multe alte procese opționale și caracteristici pe care clientul le poate activa ulterior. La baza SAP R / 3 sunt aproximativ 10.000 de tabele care controlează modul în care procesele sunt executate. SAP oferă partenerilor săi dezvoltatori și un produs numit MiniSAP care conține doar mediul de dezvoltare ABAP, și tabelele de bază fară a conține tabele, programe sau funcții specifice unui anumit proces industrial.
Cheia succesului SAP R/3 a fost strategia de a face soluții deschise, în care aplicațiile pot rula pe mai multe sisteme de operare, baze de date și tehnologii de comunicație. Lista actualelor sisteme suportate de SAP poate fi găsită de asemenea la SAP Service Marketplace, în link-ul către platforma lor, aici putând fi găsite patchuri, corectii (așa numitele OSS Notes) care corectează erorile sau defecțiunile de funcționare standard.
Sistemul SAP ERP are o structură modulară, care conține mai multe module, acestea putând fi accesate în urma conectării în sistem. Sistemul SAP ERP (cunoscut și sub numele de R/3, sau mai nou ECC) prezintă 12 module, care interacționează între ele, acest aspect aducând multe provocări. Aceste module sunt impartita în 3 mari categorii: Financial (FI – Financial Accounting, CO – Controlling, AA – Asset Accounting), Logistics (SD – Sales and Distribution, MM – Material Management), HR (Human Resources).
Fig 1.1 SAP Modules
Human Resources (HR): Se ocupă cu diverse activități realizate în departamentul de resurse umane a unei organizații, cum ar fi, administrare personalului, formarea profesională și managementul evenimentelor, salarizare etc. Acest modul permite utilizatorilor să gestioneze în mod eficient informațiile despre persoanele din organizația lor, și să integreze aceste informații cu "alte module SAP" și cu sisteme externe.
Financial Accounting (FI): Un modul de bază foarte important, conceput pentru satisfacerea tuturor nevoilor financiare și de contabilitate ale unei organizații. În cadrul acestuia managerii modulului financiar, precum și alți manageri din cadrul afacerii pot revizui poziția financiară a societății în timp real.
Sales & Distribution (SD): Modulul SAP vânzari și distribuție este parte a modulului de logistică pe care se sprijină clienții companiei, pornind de la cotațiile, ordine de vânzare și modul de facturare către client. Acesta este strâns integrat cu MM (Material Management) și (planificarea produselor) modulul funcțional, PP (Production Planning). Aceasta permite companiilor de a introduce prețul lor de vânzare către client, verificarea ordinelor de vânzare deschise și prognoza acestora.
Material Management (MM): Este modulul de gestionare a materialelor în SAP. Acest modul este folosit pentru manipularea achizițiilor publice și gestionarea inventarului. Managementul materialelor (MM) este integrat cu alte module, cum ar fi SD (Sales & Distribution), PP (planificarea produselor) și managementul calității (QM – Quality Management).
Succesul unui proiect ERP nu depinde de șansă, în general reprezintă un compromis între cerințele de bussiness ale organizației care va folosi sistemul ERP și posibilitatea de a transcrie aceste cerințe
CAPITOLUL 1.
PREZENTAREA COMPANIEI XELLA GROUP
I.1 Informații generale
Infiintata in anul 2003, Xella International este astazi referinta majora la nivel mondial in productia si comercializarea de materii prime si materiale de constructii de inalta calitate. Din august 2008, Xella este proprietate a companiilor de investitii private PAI Partners si Goldman Sachs Capital Partners.(http://www.ytong.ro/xella_in_romania.php)
Cu trei divizii de materiale de constructii pentru pereti, materiale uscate pentru constructii si var, compania este cel mai mare producator mondial de beton celular autoclavizat, blocuri de silicat de calciu si placi din fibra de gips, Xella fiind inclusa in cartea „Lexikon der deutschen Weltmarktführer“ („Encyclopedia of German World Market Leaders“).
I.2 Cronologie – Succesiunea Evenimentelor XELLA
1929 betonul celular autoclavizat a fost produs pentru prima data in Yxhult, Suedia. Yxhult Anghärdade Gasbetong devine mai tarziu Ytong
1940 Josef Hebel a deschis prima fabrica de productie industriala de elemente pentru constructii
1948 familia Haniel din Duisburg incepe comercializarea materialelor de constructii
1967 blocurile de zidarie Ytong au fost vandute pentru prima data in celebra folie galbena
1968 Haniel este producator de blocuri din silicat de calciu, lider in Germania
2000-2002, Haniel achizitioneaza marcile Fels-Werke, Hebel and Ytong
2002 Haniel se extinde si in China
2003 este anul marcat de lansarea Xella si inaugurarea Centrului de Cercetare si Dezvoltare
2007-2008 se continua extinderea in Europa de Est, China si Rusia
2008 Haniel vinde Xella catre PAI Partners si Goldman Sachs Capital Partners
2009 Xella deschide o noua fabrica Ytong in China si o fabrica de var in Rusia
In acelasi timp, are loc modernizare fabrici Ytong in Bosnia-Hertegovina si Polonia
2010 se deschide prima unitate de productie Ytong din Romania
I.3 Povestea Ytong
Ca pionier in domeniul betonului celular autoclavizat, istoria YTONG incepe in anul 1923, in Suedia, cand arhitectul Axel Joahan Ericksson reuseste sa produca la Institutul Regal de Tehnologie din Stocholm un material extrem de poros, cu izolatie superioara si proprietati de rezistenta la foc, urmand ca materialul sa fie patentat in 1924.
In 1928 a fost acordata licenta pentru productie, iar un an mai tarziu contractantul Karl August Carlén a inceput productia de beton celular autoclavizat (BCA). In 1940, Karl August Carlén are ideea geniala de a crea un nume pentru produsul sau. Astfel, combinand denumirea localitatii in care se afla, Yxhult, si denumirea suedeza pentru BCA – Gasbetong, obtine denumirea pentru produsul sau revolutionar, cunoscut astazi peste tot in lume ca YTONG:
Yxhult + Gasbetong = YTONG
YTONG este primul material de constructie care reuneste toate beneficiile existente in alte materiale de constructie: simplu de prelucrat si usor precum lemnul, rezistent la foc si durabil ca o caramida si cu aceleasi proprietati ecologice de neegalat ca ale silicatului de calciu.
I.4 Trei divizii de business
Materiale de constructii
BCA
Blocuri de silicat de calciu
BCA pentru constructii comerciale
Placi izolatoare minerale
Sisteme de placari
Placi din fibra de gips
Placi de protectie impotriva focului
Panouri de perete uscat din ciment lipit
Var
Var
Piatra de var
I.5 Brandurile Xella
Brandurile Xella inseamna solutii orientate catre client si excelenta in produse.
Xella cuprinde competentele si know-how-ul brandurilor traditionale pe care incearca sa le duca intotdeauna la nivelul urmator. Conceptele si sistemele inovative au dus la dezvoltarea de materiale de constructii eficiente energetic si sustenabile. Acest lucru semnifica apropierea Xella de pietele locale, garantand constructii pe care se poate conta, realizate in timp util si cu costuri optimizate, toate aceste avantaje datorandu-se unor branduri care inseamna calitate inalta, solutii orientate catre client si produse care ofera avantaje convingatoare.
Toate acestea fac din Xella un partener de incredere pentru viitorul constructiilor.
Xella opereza propria activitate de Cercetare si dezvoltare la Emstal si Brück, in apropiere de Berlin. Oamenii de stiinta si tehnicienii de aici lucreaza la procese de testare complexe, care le permit sa verifice si sa asigure calitatea produselor Xella.
Xella ofera materiale de constructii eficiente energetic si sustenabile la nivel global, avand 97 de fabrici in 20 de tari si centre de vanzari in peste 30 de tari.
I.6 Xella in Romania
I.6.1 Portret
Parte a diviziei de materiale de constructii, compania Xella Ro reprezinta in Romania marca Ytong, cel mai mare producator mondial de beton celular autoclavizat.
In luna aprilie 2010 a avut loc deschiderea oficiala a primei facilitati de productie Ytong din Romania, situata langa Ploiesti, in comuna Paulesti, jud. Prahova.
Aceasta este cea mai moderna unitate de productie de BCA din Europa de Est, avand o capacitate de productie de aproximativ 400.000 m³, rezultat al unei investitii de 32 milione euro.
Xella este angajată la o conduită sustenabilă și responsabilă din punct de vedere economic si a implementat Codul de Conduită al Furnizorului, aplicabil la nivel de grup. Am definit principii de bază cu privire la anti-discriminare, respingerea angajării de copii și a muncii forțate, condiții de muncă și libertăți de asociere, anticorupție, confidențialitate și discreție, precum și siguranța, protecția mediului și a sănătății. Dezideratul Xella este aplicarea în afacerile de zi cu zi a condițiilor stabilite în prezentul Cod atât de către furnizorii săi, cât și de subcontractorii acestora. Img 1.7
Dorim ca și furnizorii noștri să adere la aceste principii minimale. Prin urmare, aceasta este baza Codului de Conduită al Furnizorului Xella.
Preambul
Relațiile de afaceri ale companiilor membre Xella Group sunt guvernate, în toate aspectele, de legi, ordonanțe și alte dispoziții legale. Aceste reglementări de anvergură internațională, supranațională, națională și regională reprezintă cadrul pentru relațiile de afaceri ale Xella Group prin, de ex. stipularea normelor și standardelor de producție, produse și servicii sau prin definirea codurilor de practică pentru diferite piețe și stipularea modului în care diversele părți trebuie să acționeze una față de cealaltă. În scopul stabilirii condițiilor pentru existența sa continuă și creșterea sustenabilă este esențial ca Xella să acționeze în aceste limite și să reacționeze flexibil la orice modificare a acestora. În Codul de Conduită Xella Group au fost definite o serie de reguli cu caracter obligatoriu, aplicabile tuturor angajaților. Pentru Xella este firesc ca toți angajații din cadrul Xella Group să se conformeze tuturor legilor si reglementărilor aplicabile și să se asigure că și alți angajați procedează la fel. De asemenea, Compaia pretinde de la furnizorii sai un comportament responsabil în afaceri pe întreg lanțul de furnizare și conformarea acestora la cerințele și reglementările legale în ceea ce privește, printre altele, următoarele subiecte:
Anti-discriminare
Interzicerea angajării copiilor și a muncii forțate
Condiții de muncă și libertatea de asociere
Evitarea conflictelor de interese
Anti-corupție
Confidențialitate, discreție și protecția datelor
Protecția mediului, sănătate și siguranță
I.6.2 Marca Ytong
Cu o istorie de peste 80 de ani, Ytong face parte din galeria selecta a produselor si serviciilor etalon care au primit distinctia "Brand of the Century", acordata de autoritatile germane in anul 2009. Acest lucru inseamna ca cel mai puternic brand de pe piata materialelor de constructii, care a reprezentat intotdeauna o garantie pentru izolare termica optima si calitate garantata, apartine grupului de companii de top care ofera produse nemtesti excelente.
Importanta ecologica si energetica este prioritara in cadrul companiei noastre in procesul de continua imbunatatire a gamei de produse. Xella este membra a “Energy Efficiency Export Initiative”, cale prin care Ministerul Economiei si Tehnologiei din Germania incearca sa implementeze in cat mai multe tari cunostintele si experienta acumulate in domeniul eficientei energetice.
Pachetul de constructii Ytong inseamna materiale de constructii de calitate superioara si include blocuri de zidarie pentru pereti exteriori, pereti interiori si elemente pentru placari si izolatii. Sistemul Ytong include servicii aditionale adaptate fiecarui tip de proiect si raspunde nevoilor individuale ale clientilor.
1.7 Misiunea Xella
Xella livreaza solutii constructive simple si de calitate superioara in intreaga lume. Anticipam tendintele viitoare in constructii si oferim clientilor nostri cele mai performante produse de zidarie din Romania, pentru cladiri durabile si eficiente energetic.
Xella isi consolideaza constant pozitia de garant al produselor de calitate si eficiente energetic pe piata internationala a materialelor de constructii si a materiilor prime. Contam pe experienta si dedicarea angajatilor nostri, calitatea produselor si capacitatea de inovare pentru a dezvolta solutii constructive durabile si sustenabile.
Principalul nostru obiectiv este succesul clientilor, care se traduce implicit prin succesul companiei noastre.
1.7.1 Viziune
Xella uneste sub un singur acoperis forta brandurilor sale, experienta si cunostintele acumulate in piata, precum si idei inovatoare pentru a obtine la final cladiri durabile, eficiente energetic si sigure pentru viitor. Activitatea noastra se bazeaza pe responsabilitate si respect, pentru ca generatiile viitoare sa poata conta pe constructii eficiente.
In activitatea Xella, factorii ecologici si energetici sunt prioritari. In anul 2009, Xella si-a confirmat aceasta pozitie, devenind membra a “Energy Efficiency Export”, initiativa lansata de Ministerul Economiei si Tehnologiei din Germania si care sustine companiile care functioneaza la nivel global in regim de eficienta energetica.
Tot in anul 2009, Ytong, marca cu o istorie de peste 80 de ani, a primit din partea autoritatilor germane distinctia “Brand of the Century”. Ytong este astfel plasat in randul produselor si serviciilor etalon pentru calitatea germana, fiind inclus in cartea „Deutsche Standards. Marken des Jahrhunderts“.
Produsele Ytong sunt certificate la nivel international de Natureplus si IBU – Institut für Bauen und Umwelt, renumite organizatii ecologice internationale pentru mediu si dezvoltare durabila in sectorul constructiilor.
1.7.2 Inovatie
Becurile clasice sunt deja istorie! Prezentul inseamna inovatie!
Pentru Xella inovatie inseamna sa gandim astazi pentru ziua de maine. Lampile de iluminat economice, ca simbol al eficientei energetice si al culturii inovatoare Xella orientata spre viitor, vor insoti angajatii si parteneri nostri in toate activitatile de inovare ale companiei de acum inainte.
Filosofia de inovare
Xella construieste prin inovatie.
Xella, isi propune ca inovarea sa joace un rol-cheie in viitorul nostru. Marile idei, spiritul progresiv si materiale de constructii orientate spre nevoile viitoare fac din Xella o companie inovatoare, ale carei produse de inalta calitate si eficiente energetic o pozitioneaza intr-o liga diferita fata de concurentii sai.
Xella produce materiale de constructii si le distribuie in intreaga lume fiind cel mai mare producator de beton celular. Xella este in mod constant in cautarea de concepte noi si sisteme eficiente care ii vor permite sa ofere partenerilor sai de afaceri produse de calitate superioara, sisteme care ii vor contura mai clar imaginea de companie inovatoare.
Inovarea depinde de idei. Si pentru ca rar se intampla ca ideile sa vina din senin, cultura de inovare Xella este promovata în mod activ si patrunde in fiecare segment al companiei.
MOTTO-ul Companiei: „Ideile tale sunt motorul de inovare“
Xella este interesata de cunostintele fiecaruia dintre angajatii companiei – pentru ca puterea inovatoare a celor aproape 7.000 de persoane bine pregatite reprezinta un potential enorm.
Avand cele mai bune idei pentru succes – Xella construieste prin inovatie! (http://www.ytong.ro/)
CAPITOLUL2.
IMPLEMENTAREA UNEI NOTE OOS FOLOSIND LIMBAJUL DE PROGRAMARE
ABAP
2.1 Noțiuni teoretice ABAP
ABAP (Advanced Business Application Programming) este un limbaj de programare utilizat pentru a dezvolta aplicații pentru SAP R / 3 sistem. Numele ABAP sugerează în primul rând specificul acestui limbaj și faptul că provine dintr-o primă generație de programe ce au inclus conceptul de Logical Database. Limbajul de programare ABAP a fost inițial utilizat de către dezvoltatori pentru a dezvolta platforma SAP R / 3 și a fost, de asemenea, destinat să fie utilizat de către clienții SAP pentru a spori aplicațiile SAP -. clienții pot dezvolta rapoarte personalizate și interfețe de programare ABAP.
Limbajul este destul de ușor de învățat pentru programatori. Abilitatile în programare, cunoașterea proiectarii bazelor de date relaționale și de asemenea, conceptele de programare orientată pe obiecte sunt necesare pentru a crea programe ABAP. (http://www.abapcode.info/)
ABAP-ul este un limbaj de programare de nivel înalt creat de compania germană de software SAP. Sintaxa de ABAP este oarecum similară cu cea a COBOL. Toate programele ABAP depind de baza de date a SAP-ului. Ele nu sunt stocate în fișiere separate externe, cum ar fi în cazul Java sau C + +. În baza de date, codul ABAP există în două forme: cod sursă, care poate fi vizualizat și editat cu instrumentele ABAP Workbench, și codul generat, o reprezentare binară oarecum comparabil cu bytecode Java.
Sistemul runtime este responsabil pentru prelucrarea declarațiilor ABAP, controlul fluxului logic al ecranelor și răspunsul la eventuri (cum ar fi un utilizator făcând clic pe un buton pe ecran); în acest sens, poate fi văzută ca o mașină virtuală comparabil cu Java VM.
O componentă cheie a sistemului Runtime ABAP este Interfața Bazelor de date, care se transformă în baze de date independente de declarații ABAP. Ca să ne dam seama la nivel structural unde s-ar pozitiona și care este rolul acestor programe trebuie să avem în vedere arhitectura sistemului SAP și anume: aplicații furnizate utilizatorului spre a se folosi de ele, ca ca urmare programele ABAP rulează la nivelul de aplicație(application layer) și au rolul de a extrage datele de la nivelul bazei de date și de a le aduce la nivelul de prezentare(interfeței cu utilizatorul). (http://www.abap-code.com)
Fig. 2.1 Arhitectura sistem SAP
Sursa: help.sap.com
Tranzacția cu care se rulează un program în SAP este SE38.
Fig.2.2 Tranzacția de rulare SE38
Sursa: http://sap-online-training.blogspot.it
Aceasta tranzacție poate fi utilizată pentru a:
– rula un program ABAP. Pentru aceasta în field-ul „Program” se introduce numele programului, apoi se apasă butonul „Execute” (F8).
– pentru a vizualiza un program ABAP. Se apasă butonul „Display” și este afișat codul din spatele programului.
– modifică un program ABAP. Se apasă butonul „Change” și se fac modificările dorite. Butonul „Change” poate fi folosit doar în sistemul de Development, și doar de către utilizatorii care dețin un Developement Key.
De asemenea, cu ajutorul acestei tranzacții putem să vedem proprietățile unui program:
– clasa de dezvoltare.
– tipul programului (Ex. Executabil, include, module pool).
Se pot salva variante ale programului, care conțin anumite date de input. Aceste variante pot fi vizualizate cu ajutorul butonului „Variants”. Prin apăsarea butonului „With Variant” putem rula programul dorit pentru a anumită variantă, salvată anterior. De exemplu, putem salva o varianta pentru un program care să ruleze pentru a anumita luna a anului, pentru anumite tipuri de documente.
Ca și în cazul celorlalte limbaje de programare, în limbajul ABAP se poate face debug. În tranzacția SE38 avem butonul „Debugging”. Pentru a activa debugger-ul într-un anumit program / tranzacție, se introduce în fereastra de comanda instructiunea „/h”.
Un alt concept important în SAP este cel de Job. Un Job reprezinta un program sau o succesiune de programe care se pot lansa la anumite date planificate, sau în fucție de apelarea anumitor event-uri.
Tranzacția cu care sunt accesate job-urile este SM37, iar pentru activarea unui job se foloseste SM36.
Un job poatea avea mai multe statusuri:
– Scheduled: job-ul a fost planificat dar nu a fost activat;
– Released: job-ul a fost setat și activat pentru a fi rulat la o anumită ora sau la declansarea unui anumit event;
– Ready: job-ul a fost activat dar din anumite motive înca nu a început executia lui
(poate fi un delay din cauza încărcării sistemului sau suprapunerea cu un alt job);
– Active: job-ul este în execuție;
– Finished: job-ul a terminat de rulat cu succes;
– Canceled: job-ul a fost oprit în timpul rulării din anumite motive (ex. Probleme legate de baze de date, probleme de network, legate de executarea efectivă a programului, întreruperea forțată de către un utilizator);
Cu această tranzacție se pot vizualiza job-urile care au rulat între anumite perioade de timp, care au fost activate de un anumit event sau un anumit user, sau în funcție de programul pe care il lansează.
Fig. 2.3 Tranzacție gestiune job-uri
În imaginea următoare este prezentat un job care rulează 5 programe, cu mai multe variante. Se poate selecta user-ul cu care va rula fiecare variantă și limba în care va rula programul respectiv.
Fig. 2.4 Lista job-uri
ABAP Dictionary permite o gestionare centrala a tuturor datelor definite, utilizate în sistemul R/3. În ABAP Dictionary se pot crea tipuri definite de utilizator (tipuri de elemente de date, structuri și tipuri de tabele), pentru utilizarea în programele de ABAP sau în interfețele de module funcționale. Obiectele bazei de date, cum ar fi tabelele de date și vederile pot fi, de asemenea, definite în dicționarul ABAP și create cu această definiție, în baza de date.
ABAP Dictionary oferă, de asemenea, o serie de servicii care sprijina dezvoltarea programelor. De exemplu, sunt acceptate definirea intrarilor din “Help” (F4 ajutor) și atașarea câmpului “Help” (ajutor F1), la un camp de pe ecran.
Tabelele și vederile bazei de date pot fi definite în ABAP Dictionary. Schimbarile facute în structura tabelului sau a vederilor, sunt automat preluate și în baza de date. Indecșii pot fi definiti în ABAP Dictionary pentru a spori accesul la datele din tabele. Acești indecsi sunt creati de asemenea, în baza de date.
Există trei categorii în ABAP Dictionary:
– Data elements: descriu un tip elementar de definire a tipului de date, lungimea și, eventual, locuri pentru zecimale.
– Structurile: sunt realizate din componente care pot avea orice tip.
– Tipuri de tabele: descriu structura unui tabel intern.
ABAP Dictionary este integrat activ în mediile de dezvoltare și execuție. Fiecare modificare are efect imediat în programele ABAP relevante și screen-urile afectate.
2.2 Tabele în sap
Tabelele sunt containerele de date care există în baza de date relațională. În majoritatea cazurilor există o relație de 1-la-1 între definiția unui tabel în dicționarul ABAP și definiția pe care același tabel o are în baza de date (cu același nume, aceleași coloane). Aceste tabele sunt cunoscute drept "tabele transparente". Aceste tabele sunt standard, și sunt specifice fiecărui modul SAP.
Fig. 2.5 Tabele SAP (http://www.sapnetwork.net/magazines)
Obiectele de bază în definirea datelor în ABAP Dictionary sunt tabelele, elementele bazei de date și domeniile. Domeniul este utilizat în definirea tehnica a câmpurilor tabelului (de exemplu tipul câmpului sau lungimea lui) și data element este utilizat pentru definirea semanticii (de exemplu o descriere scurtă).
Un domeniu descrie valoarea range-ului pentru un câmp. Este definit de tipul de date și lungimea sa. Valoarea range-ului poate fi limitată prin specificarea valorilor fixe.
Un element data descrie semnificația unui domeniu într-un anumit context business. Conține în primul rând câmpul help (F1 – Documentația) și etichetele câmpurilor într-un screen. Un câmp nu este un obiect individual. Este dependent de un tabel și poate fi gestionat numai într-un tabel.
Tabelele pot fi: transparente și structuri.
Un tabel transparent este automat creat în baza de date când este activat în ABAP Dictionary. În acest timp, descrierea, independent față de baza de date în ABAP Dictionary este translatată în limbajul utilizat de sistemul bazei de date. Numele acestui table este același ca și cel al tabelului din ABAP Dictionary. De asemenea, există aceleași field-uri în baza de
date ca și în ABAP Dictionary. Tipurile de date din ABAP Dictionary sunt convertite în tipurile de date corespunzatoare sistemului bazei de date. Ordinea acestor câmpuri însă poate să difere. Aceasta ne permite să inseram noi câmpuri fără a converti tabelul. Când un nou câmp este adăugat, ajustarea tabelei este făcută prin schimbarea catalogului bazei de date (ALTER TABLE). Noul câmp este adăugat tabelului, neținând cont de poziția noului câmp în ABAP Dictionary.
Programele ABAP pot să acceseze un table transparent în două maniere. O primă opțiune ar fi de a accesa informațiile conținute în tabel cu OPEN SQL (or EXEC SQL). Cu cealaltă optiune, tabelul definește o structură tip care este accesată când variabilele (sau tipurile complexe) sunt definite.
De asemenea, putem crea în ABAP Dictionary un tip de date structurat pentru care nu există nici un obiect corespunzător în baza de date. Asemenea tipuri de date sunt numite structuri. Acestea pot fi utilizate și pentru a defini tipurile de variabile.
În definirea unui tabel transparent în ABAP Dictionary, trebuie menținute și setările tehnice. Sunt utilizate pentru a optimiza stocarea cererilor și accesul asupra tabelelor bazei de date. Aceste setări tehnice pot fi utilizate pentru a defini modalitatea prin care un tabel poate fi manevrat când este creat în baza de date.
Tabelul este automat creat în baza de date când este activat în ABAP Dictionary. Aria de stocare pentru selectie (tablespace) și setările pentru alocarea spațiului sunt determinare din setările realizate pentru “data class” și categoria de mărime.
Un index este o structură a bazei de date care este utilizată de server pentru regăsirea rapidă a unei linii într-un tabel. Indexul este compus dintr-o valoare cheie (coloana unei linii) și din identificatorul rowid.
Indexul principal (primary index) este creat împreună cu tabela în mod automat. Putem crea, de asemenea, alți indecși, numiți indecși secundari. Acest lucru este necesar în cazul în care tabelul este frecvent accesat într-un mod care nu este avantajat de sortarea index-ului principal pentru acces. Numărul maxim de indecși secundari pe care îi putem avea este de 9.
Tabelele permit indecși secundari, lucru care poate fi vizualizat utilizând tranzacția SE11->Display Table->Indexes.
Există două tipuri de tabele care nu sunt transparente:
– tabelele "pooled (amestecate)" există ca entități independente în Dicționar ABAP, dar
acestea sunt grupate în tabele fizice mari ("pools"), la nivelul bazei de date. Acestea sunt de tip „match codes” sau tabele „look up”. Tabelele „pooled” sunt de multe ori tabele mici, care dețin, de exemplu, date pentru configurari. Se poate realiza operația SELECT * deoarece vor fi preluate toate coloanele.
– Tabele "Cluster" (BSEG, BSEC) sunt grupate fizic în "clustere", pe baza cheilor primare, de exemplu, să presupunem că un tabel cluster H conține date de "header" despre facturi de vânzare, în timp ce un alt tabel D cluster, deține elementele facturii la nivel de item. Fiecare linie din H va fi apoi grupată fizic cu liniile aferente din D în interiorul unui "tabel cluster" în baza de date. Acest tip de grupare, care este proiectată
pentru a îmbunătăți performanța, de asemenea, există ca funcționalitate și în unele sisteme de baze de date relaționale. Acestea trebuie accesate utilizând cheia primară, altfel sunt foarte greu de accesat. Nu prezintă indecși secundari. Se poate realiza operația SELECT * deoarece vor fi preluate toate coloanele. Efectuarea unei operații asupra mai multor linii este mai eficientă decât operațiunile pentru o singură linie. Prin urmare, totuși este de dorit a se face selecția într-un tabel intern. Funcțiile statistice SQL nu sunt suportate (SUM, AVG, MIN, MAX, etc).
Tabelele interne sunt o caracteristică extrem de importantă a limbajului ABAP. Un tabel intern ar fi definit ca un vector de structuri în C + + sau un vector de obiecte în Java. Principala diferență față de aceste limbaje de programare este că ABAP oferă o colecție de declarații pentru a accesa cu ușurință și manipula conținutul de tabele interne. Trebuie remarcat faptul că ABAP nu acceptă array-uri, singura modalitate de a defini un multi element de obiect de date este de a folosi un tabel intern. Există două tipuri de tabele interne: tabele interne cu linie de header și tabele interne fără linie de header.
Zonele de lucru sunt rânduri unice de date. Ele trebuie să aibă același format ca oricare dintre tabelele interne. Acestea sunt folosite pentru a procesa datele într-o linie internă de tabel la un moment dat.
Fig. 2.6 Work area-Mediu de lucru
Sursa: http://sapinsider.wispubs.com/Articles/Category/ABAP
În cazul tabelelor interne cu linie de header, sistemul creaza în mod automat zona de lucru (work area) , aceasta conținând aceleasi date ca și tabelul intern. Aceasta zona de lucru este numita chiar „Linie de header”. În aceasta zona se vor realiza modificarile sau orice alta operatie asupra conținutului tabelului. Astfel, înregistrarile pot fi inserate direct în tabel sau accesate direct din tabelul intern.
În cazul tabelelor interne fara linie de header, nu este asociata nici o zona de lucru. Acesta trebuie specificata în mod explicit când trebuie să accesam astfel de tabele. În consecinta, aceste tabele nu pot fi accesate în mod direct.
Operatiile care pot fi realizate asupra tabelelor interne sunt următoarele:
– creare (utilizând un anumit tip de data, cu refernta la un alt tabel, cu referinta la o structura existenta, sau prin crearea unei noi structuri);
– popularea tabelului (linie cu linie, utilizând COLLECT, utilizând INSERT);
– copierea tabelelor interne;
– citirea tabelelor interne (utilizând instructiunea Loop – End Loop, sau utilizând instructiunea Read);
– ștergerea tabelelor interne (stergand o linie într-un LOOP, stergand liniile folosind indexul).
Crearea tabelelor
Această operație se realizează cu ajutorul tranzacției SE80, alegând calea „Repository Information System” -> „ABAP Dictionary”. În screen-ul inițial al ABAP Dictionary, trebuie selectat object class “Database table”, inserat numele tabelului și ales Tabelul de mentenanță pentru tabel este afișat:
Fig. 2.7 ABAP Dictionary
În ABAP Dictionary avem mai multe optiuni:
1. Se introduce o descriere sugestivă a tabelului în câmpul “Short text”. În tab-ul “Delivery and Maintenance” se introduce delivery class a tabelului. În acest tab se alege una din opțiunile din dreapta pentru câmpul “Data Browser/Table View Maintenance”. Pentru a avea mai apoi opțiunea în tranzacția SE16 (browser tabele) de a modifica aceste tabele, alegem opțiunea “Table maintenance allowed”.
2. În tab-ul “Fields” se introduc câmpurile tabelului, cu atributele sale.
3. Tab-ul “Maintain the technical settings” se poate accesa și din meniul Goto Technical settings. Acestea sunt un obiect separat și poate fi activat și transportat separate de table.
4. Salvarea tabelului.
5. Activarea tabelului cu ajutorul butonului . Acest pas se face ulterior operației de salvare și este ultimul pas din procesul de creare al tabelelor.
Rezultatul – În timpul activării, tabelul și toți indecșii lui sunt creați în automat în baza de date. Putem să afișăm structura tabelului alegând calea din meniu: Utilities -> Database object -> Display. La activare, este de asemenea creat și obiectul runtime al tabelului. Putem afișa obiectul runtime urmând calea Utilities -> Runtime object -> Display.
Constrangeri.
Toate câmpurile cheie ale tabelului trebuie stocate împreună la începutul tabelului. Un câmp care nu este cheie nu trebuie să apară între două câmpuri cheie.
Este permis să avem un maxim de 16 câmpuri cheie într-un tabel. Lungimea maximă a cheii tabelului este de 255.
Dacă lungimea tabelului este mai mare ca 120, apar restricții în ceea ce privește transportul intrărilor din tabele.
Un tabel nu poate avea mai mult de 249 de câmpuri. Suma lungimilor tuturor câmpurilor este limitată la 1962.
2.3 Realizarea unei note oss în sap
OSS Notes este un serviciu on-line SAP sub forma unui portal care oferă actualizări atat privind patch-uri în diferite module ale SAP dar si informații actualizate cu privire la note SAP. Notele SAP sunt instrucțiuni de corecție pentru erorile sau aspectele constatate în cadrul programelor standard SAP. În cazul în care notele relevante nu se găsesc, clienții SAP pot comunica problema biroului de asistență SAP prin intermediul OSS Notes, cu toate că serviciul nu este extins la obiectele dezvoltate sau modificate de către clienți. OSS Note prevede colectarea de note de corecție pentru obiectele SAP luând în considerare versiunile și datele de lansare.
Serviciul de OSS este disponibil prin intermediul Serviciului SAP marketplace, o colecție de diferite portaluri pentru clienți și parteneri SAP. Instrucțiunile de corecție furnizate de OSS pot fi puse în aplicare în mod automat folosind tranzacția "SNOTE", sau manual, prin implementarea etapelor recomandate de SAP. OSS Note pot fi descărcate și, de asemenea, disponibile în format PDF. Tranzacția "SNOTE", care este, de asemenea, cunoscuta sub numele de nota asistent,oferă si ea un prompt automat la notele OSS relevante care trebuie aplicate sistemului SAP. Pentru a vă loga la OSS, este nevoie de un ID SAP Support Portal OSS. Acest lucru poate fi obținut fie prin administratorul de sistem al clientului SAP sau prin înregistrarea on-line. In cazul in care OSS Notele nu sunt disponibile pentru bug-uri / probleme găsite în programe standard, clienții / partenerii sunt rugați să ridice mesaje clienților furnizand informații complete, împreună cu prioritatea problemei. Bazat pe prioritate și gravitate, SAP va urmări cu clientul iar, în cazuri severe, furnizează chiar ei o rezoluție.
2.3.1 Pasi in implementarea unei note OSS
Inserati tranzactia SNOTE si apasati ENTER
Fig. 2.8 Tranzactia SNOTE
Dupa apasarea tastei ENTER va aparea urmatorul screen
Fig. 2.8 Primul screen SNOTE
In primul rand ne asiguram ca nota are statusul "Can be Implemented" sau "Obsolete version Implemented” si verificam specificatiile de la SAP
Fig. 2.9 SNOTE Log Specificatii pentru implementare
In functie de specificatiile furnizate de analistii SAP OSS vom scrie codul sursa respectand intru totul cele mentionate de ei
Fig. 2.10 Codul sursa vazut in tranzactia SNOTE
Verificam codul si salvam
Fig. 2.11 SNOTE Nota implementata cu succes
Am ales să includ o parte din codul notei, în care se evidentiază sintaxa limbajului de programare ABAP, modalitatea de apelare a altor programe din programul principal și functiile (Anexa 1.).
CONCLUZII
Prezenta lucrare este structurată în două capitole, în primul, am încercat să pun accent pe aspecte generale, privind compania Xella Group, companie în cadrul căreia lucrez. Am reușit să descopăr că trecutul inovator al acesteia oferă mărcii legitimitate, recunoaștere și relevanță în domeniul industriei anvelopelor, oferind o viziune clară și inspirațională. În cel de-al doilea capitol am încercat în primul rând să evidențiez noțiunile generale ale limbajului de programare ABAP și avantajele pe care acesta le oferă, stând la baza celui mai renumit ERP din lume, SAP-ul, iar în al doilea rând am realizat o corectie, mai exact un cod sursa in limbajul de programare ABAP, ce va fi utilizat de Departamentul de FI/CO pentru evitarea raportarilor cu valoare negative. ABAP-ul este limbajul de programare utilizat pentru dezvoltarea platformei SAP R/3 . Utilizarea sa permite clienților SAP să extindă funcționalitatea sistemului. Acesta este un limbaj de programare de nivel înalt care va ajuta la construirea de aplicații, care permit realizarea funcții de afaceri.
ABAP Workbench este o colecție de instrumente folosite pentru a dezvolta, testa și executa programe de ABAP. Cele mai utilizate tool-uri din ABAP Workbench sunt: Object Navigator (tranzacția SE80), ABAP Editor (tranzacția SE38) utilizat în crearea programelor, Screen Painter (SE51) utilizat în crearea screen-urilor pentru proiect.
SAP are toate caracteristicile pe care un sistem bun de tip ERP (Enterprise Resource Planning System) ar trebui să aibă. În primul rând, are funcționalitate modulara, în care se pot oferi soluții pentru toate aspectele de bază ale unei afaceri. SAP-ul are module de resurse umane, financiare, de depozitare și lanțul de aprovizionare, managementul relațiilor cu clienții, managementul vânzarilor, etc Aceste module ofera suficienta flexibilitate, astfel încât acesta poate fi reconfigurat și personalizat în funcție de nevoile de afaceri.
SAP reprezintă cea mai mare companie de software de afaceri și al treilea cel mai mare furnizor independent de software din punct de vedere al veniturilor. Chiar dacă există o concurență acerbă, SAP este încă un lider în software pentru gestionarea resurselor. Soluțiile SAP sunt scalabile și pot fi personalizate în funcție de cerințele de afaceri ale unei întreprinderi.
SAP continuă să se concentreze activitățile sale de tip ERP pe maximizarea resurselor, reducerea costurilor și optimizarea performanței, fiind personalizat pentru afaceri și industrii. Integrarea poate fi cel mai mare beneficiu din toate oferite de SAP. Singurul scop real pentru punerea în aplicare a ERP-ului este reducerea datelor redundante.
În concluzie această lucrare a avut tendința de a arăta si demonstra importanța unui sistem de tip ERP.
BIBLIOGRAFIE
1. Färber G. , Kirchner J., – „ABAP Basics”, 1st edition , Galileo Press, 2007
2. Keller H., Kruger S., – ABAP Objects: Introduction to Programming SAP Applications, SAP Press, 2002
3. Inc. Kogent Learning Solutions – SAP® ABAPTM: Handbook, The Jones and Bartlett Publishers Sap Book Series, 2010
4. Mazzulo J., Wheatley P., – SAP R/3 for Everyone: Step-by-Step Instructions, Practical Advice, and Other Tips and Tricks for Working with SAP, 2005
5. Note individuale de curs, organizate de Pirelli si Crystal Systems
6. „ABAP Development Workbench Basics”
7. http://www.abapcode.info/
8. http://sapexperts.wispubs.com/CRM/Backend/Tags/ABAP
9. http://www.sapnetwork.net/magazines
10. http://sapinsider.wispubs.com/Articles/Category/ABAP
11. help.sap.com
12. http://www.abap-code.com
13. http://www.saptechnical.com/Tips/ABAP/ABAP1.html
14. www.abap.es
15. http://sap-online-training.blogspot.it
16. http://www.erpdb.info/abap-tutorials-for-beginners/
17. http://www.abap-tutorials.com/
18. http://sapbrainsonline.com/abap-tutorial
19. http://tutorialsap.com/abap/abap-insert-into-table-statement.html
20. http://wiki.sdn.sap.com/wiki/
22. http://www.saptraininghub.com/abap-tutorial/
23. http://www.ytong.ro/
24. http://www.ytong.ro/xella_in_romania.php
Codul sursă al notei oss
Program principal
*–––––––––––––––––––––––-*
* Report RK2R%ERK
* Author: YKC Release: 4.6C
* YKC 4.6A/4.5A
* 4.0A/3.1G/3.0A
*–––––––––––––––––––––––-*
* template: RKEVRK2R
* generated by function module: RKE_GENERATE_INTERFACE_ACT
*–––––––––––––––––––––––-*
* program contains the generated forms that are called by function
* modules for actual data transfer to CO-PA (function group KEII)
*–––––––––––––––––––––––-*
type-pools: rkea1, rkei1, kedr.
tables: ce1%erk,
ce4%erk.
constants: c_ce0name like dd02v-tabname value 'CE0%ERK',
c_ce1name like dd02v-tabname value 'CE1%ERK',
c_ce4name like dd02v-tabname value 'CE4%ERK',
rk2axxxx_post like tadir-obj_name value 'RK2A%ERK_POST',
c_uom(3) type c value '_ME'.
data: g_erkrs like tkebl-erkrs value '%ERK'.
types: ys_ce0 like ce0%erk,
ys_ce1 like ce1%erk,
ys_ce4 like ce4%erk.
types: ys_item type ys_ce1,
yt_item type ys_ce1 occurs 0,
yt_ce1 type ys_ce1 occurs 0.
field-symbols: <value>,
<value_source>,
<quantity>,
<uom>.
data: begin of gt_item_tab occurs 0.
* table with created line items
include structure ce1%erk.
data: end of gt_item_tab.
data: begin of gt_item_tab_rec occurs 0.
* table with recorded line items
include structure ce1%erk.
data: end of gt_item_tab_rec.
*-
* data for value/quantity fields …
*-
types: begin of ys_item_val,
dummy,
*+012 %FELD LIKE CE1%ERK-%FELD,
end of ys_item_val.
types: begin of y_summ_data,
dummy,
* value fields
*+012 %FELD LIKE CE1%ERK-%FELD,
end of y_summ_data.
data: begin of gs_reverse_item,
dummy,
* value fields with amount '-1' for reversal
*+012 %FELD LIKE CE1%ERK-%FELD value '-1',
end of gs_reverse_item.
* Caution! Variable for SD document categories that are transferred
* with a reversed sign
tables: t001, "company codes
tkb9f, "assignm. cost el. value fields
tkevg, "control PA by business trans.
cskbv, "cost elements
t258m, "quantity fields
t258i, "condition types
tkeva10, "reset value fields
ceale01, "distribution/ALE
bseg, "FI documents
paprottab. "log table
types: begin of ys_condition_assignment,
condition type t258i-kschl,
val_field type t258i-wertkomp,
sign type t258i-vorzeich,
end of ys_condition_assignment.
types: yt_tkeva10 type table of tkeva10.
data: begin of gt_int_t258i occurs 20,
* assignment of condition types to value fields
kschl like t258i-kschl,
wertkomp like t258i-wertkomp,
vorzeich like t258i-vorzeich,
end of gt_int_t258i.
data: begin of gt_int_t258m occurs 2.
* assignment of quantity fields
include structure t258m.
data: end of gt_int_t258m.
data: begin of gt_int_tkeva10 occurs 20.
* reset value fields
include structure tkeva10.
data: end of gt_int_tkeva10.
data: begin of gt_int_tkb9f occurs 80.
* assignment of cost element groups
include structure tkb9f.
data: end of gt_int_tkb9f.
data: gs_item type ys_ce1,
gs_item_old type ys_ce1,
gt_item type ys_ce1 occurs 0 with header line,
gt_item_rev type ys_ce1 occurs 0 with header line,
gt_item_post type ys_ce1 occurs 0 with header line,
gt_item_post_rev type ys_ce1 occurs 0 with header line,
gs_item_ce4 type ys_ce4,
gt_item_log type ys_ce0 occurs 0 with header line.
types: ys_log like paprottab,
yt_log type ys_log occurs 0.
data: gt_log type yt_log with header line.
data: gs_dbtable type rkei1_ys_dbtable.
types: ys_dbtable_key type rkei1_ys_dbtable_key.
*-
* type for storing references of document numbers …
*-
types: begin of ys_ref,
belnr like cest1-belnr,
posnr like cest1-posnr,
refnr like cest1-belnr,
refpo like cest1-posnr,
end of ys_ref.
types: yt_ref_pv type sorted table of ys_ref
with unique key belnr posnr.
data: gt_ref_pv type yt_ref_pv.
types: yt_ref_new type sorted table of ys_ref
with unique key refnr refpo.
*-
* data for currencies …
*-
data: g_waers_erkrs like acccr-waers,
*-
gs_v_tkebl type line of rkea1_t_v_tkebl,
*-
gt_v_tkelt type rkea1_t_v_tkelt,
gs_v_tkelt type line of rkea1_t_v_tkelt,
*-
gt_v_curr type rkea1_t_v_curr,
gs_v_curr type line of rkea1_t_v_curr,
*-
gs_v_tkeb type rkea1_v_tkeb.
data: g_lin like sy-tabix,
g_reverse type c,
g_read_failed type c,
g_curr_conv_ext(1) type c.
types:
begin of ys_account_t8a00,
kokrs like t8a00-kokrs,
t_pcerl type sorted table of t8a00-pcerl with unique key table line,
t_pcdbv type sorted table of t8a00-pcdbv with unique key table line,
t_pclva type sorted table of t8a00-pclva with unique key table line,
t_pcdif type sorted table of t8a00-pcdif with unique key table line,
end of ys_account_t8a00.
types: yt_account_t8a00 type ys_account_t8a00 occurs 0.
*-
* …
*-
include rvvbtyp.
constants: gc_vbtyp_c like vbtyp_retour value vbtyp_retour.
*-
* …
*-
include lkikai00.
*-
*…………types/data for summarization……………………….. *
*-
types: begin of y_summ_key,
vrgar like cest1-vrgar,
paledger like cest1-paledger,
gjahr like cest1-gjahr,
perio like cest1-perio,
altperio like cest1-altperio,
perde like cest1-perde,
frwae like cest1-frwae,
ce4 like ce4%erk,
kstar like cest1-kstar,
budat like cest1-budat,
fadat like cest1-fadat, "n_853633
copa_awtyp like cest1-copa_awtyp,
copa_aworg like cest1-copa_aworg,
copa_awsys like cest1-copa_awsys,
end of y_summ_key.
types: begin of y_field_fix_s,
belnr like cest1-belnr, "JW HW203779
paledger like cest1-paledger,
kursf like cest1-kursf,
usnam like sy-uname,
hzdat like sy-datum,
rbeln like cest1-rbeln,
* currently merely a summarization within one document is possible due
* to the restrictions of the accounting document (RW-Beleg); thus it
* makes sense to store the reference document number (RBELN)
end of y_field_fix_s.
types: begin of ys_field_s_entry,
key type y_summ_key,
data type y_summ_data,
end of ys_field_s_entry.
data: gt_item_field_s type ys_field_s_entry occurs 0,
gt_item_s type ys_ce1 occurs 0 with header line.
data: gt_field_fix_s type y_field_fix_s occurs 0,
gs_field_fix_s type y_field_fix_s.
*-
*…………types/data for table buffering …………………….. *
*-
*-
* Statistics buffer …
*-
types: begin of y_buffer_statistics,
accesses type i,
hits type i,
end of y_buffer_statistics.
data: begin of gs_statistics,
buffer type y_buffer_statistics,
end of gs_statistics.
*––––––––––––––––––––––––
* Buffer CE4 …
*––––––––––––––––––––––––
types: begin of ys_ce4_key,
aktbo like cest4-aktbo,
paobjnr like cest4-paobjnr,
pasubnr like cest4-pasubnr,
end of ys_ce4_key.
types: begin of ys_ce4_data.
include structure ce4%erk.
types: end of ys_ce4_data.
types: begin of ys_ce4_buffer_entry,
key type ys_ce4_key,
data type ys_ce4_data,
is_in_db(1) type c,
end of ys_ce4_buffer_entry.
data: gt_ce4_buffer type ys_ce4_buffer_entry occurs 0.
data: gs_ce4_statistics type y_buffer_statistics.
*––––––––––––––––––––––––
* Buffer CE1 …
*––––––––––––––––––––––––
types: begin of ys_ce1_acc,
vrgar like cest1-vrgar,
rbeln like cest1-rbeln,
rposn like cest1-rposn,
end of ys_ce1_acc.
types: begin of ys_ce1_data.
include structure ce1%erk.
types: end of ys_ce1_data.
types: begin of ys_ce1_buffer_entry,
acc type ys_ce1_acc,
data type ys_ce1_data,
is_in_db(1) type c,
end of ys_ce1_buffer_entry.
data: gt_ce1_buffer type ys_ce1_buffer_entry occurs 0.
data: gs_ce1_statistics type y_buffer_statistics.
*––––––––––––––––––––––––
* Buffer T001 …
*––––––––––––––––––––––––
types: begin of y_t001_key,
bukrs like t001-bukrs,
end of y_t001_key.
types: begin of y_t001_data.
include structure t001.
types: end of y_t001_data.
types: begin of y_t001_buffer_entry,
key type y_t001_key,
data type y_t001_data,
is_in_db(1) type c,
end of y_t001_buffer_entry.
data: gt_t001_buffer type y_t001_buffer_entry occurs 0.
data: gs_t001_statistics type y_buffer_statistics.
*––––––––––––––––––––––––
*
*––––––––––––––––––––––––
include rkevrk2r_fix.
*–––––––––––––––––––––––-*
* FORM MOVE_ITEM_CE4_TO_ITEM *
*–––––––––––––––––––––––-*
* Routine stellt Merkmale aus CE4 in CE1, falls Feld in CE1 *
* initial ist *
*–––––––––––––––––––––––-*
* –> ITEM_CE4 Struktur CE4 *
* <-> ITEM *
*–––––––––––––––––––––––-*
form move_item_ce4_to_item using is_item_ce4 type ys_ce4
changing xs_item type ys_ce1.
* generated coding:
* if xs_item-%FIELD is initial.
* xs_item-%FIELD = is_item_ce4-%FIELD
* endif.
*+I10
if xs_item-rkaufnr is initial.
xs_item-rkaufnr = is_item_ce4-aufnr .
endif.
endform.
*–––––––––––––––––––––––-*
* FORM MOVE_FIELD_FROM_SEGMENT *
*–––––––––––––––––––––––-*
* Routine stellt das CO-PA Segment im RW-Beleg fuer Merkmale *
* in den Einzelposten *
*–––––––––––––––––––––––-*
* –> ACCIT_PA Segment mit Merkmalen zum Ergebnisobjekt *
*–––––––––––––––––––––––-*
form move_field_from_segment using is_accit_pa type rkei1_ys_accit_pa
changing xs_item type ys_ce1.
* generated coding
* if xs_item-%FIELD is initial.
* xs_item-%FIELD = is_accit_pa-%FIELD
* endif.
*+I16
endform.
*–––––––––––––––––––––––-*
* FORM COMPARE_ITEM_GET_VALUE
*–––––––––––––––––––––––-*
* Vergleicht die Wertfelder zweier Einzelposten und gibt die beiden
* ersten gefunden Werte der Einzelposten zurück.
*
*–––––––––––––––––––––––-*
* –> ITEM_FROM Einzelposten 1
* –> ITEM_TO Einzelposten 2
* <– VALUE_FROM Wert aus EP1
* <– VALUE_TO Wert aus EP2
*–––––––––––––––––––––––-*
form compare_item_get_value using i_item_from type ys_ce1
i_item_to type ys_ce1
changing e_value_from
e_value_to.
* Generated program: Attention! If you change the name of any
* parameter you have to adapt the generating form in function group
* KEG1!!!!
* if i_item_from-%FIELD ne 0 and
* i_item_to-%FIELD ne 0.
* e_value_from = i_item_from-%FIELD.
* e_value_to = i_item_to-%FIELD.
* exit.
* endif.
clear: e_value_from,
e_value_to.
*+I15
endform.
*&–––––––––––––––––––––––*
*& Include RKEVRK2R_FIX
*&–––––––––––––––––––––––*
*
*
*
*–––––––––––––––––––––––-*
* FORM MOVE_CONSTANT_FIELDS
*–––––––––––––––––––––––-*
* Uebertragung fester Felder aus dem RW-Beleg in den Einzelposten
*–––––––––––––––––––––––-*
* –> ACCIT RW-Beleg Position
* ACCCR RW-Beleg Waehrung
* RTYPE Vorgangsart
* DOCTY Belegtyp
* TRACE_MODE Tracemodus
* SMODE Verdichtungsmodus
*–––––––––––––––––––––––-*
FORM move_constant_fields USING is_accit TYPE rkei1_ys_accit
is_acccr TYPE rkei1_ys_acccr
i_rtype
i_docty
is_trace_mode TYPE rkei1_ys_trace_mode
i_smode.
DATA: lt_t_fields TYPE copa_yt_act_trace_it.
CLEAR: gs_item.
MOVE is_accit-mandt TO gs_item-mandt.
MOVE is_accit-paobjnr TO gs_item-paobjnr.
MOVE i_rtype TO gs_item-vrgar.
MOVE sy-uname TO gs_item-usnam.
MOVE sy-datum TO gs_item-hzdat.
MOVE is_accit-budat TO gs_item-budat.
MOVE is_accit-fkdat TO gs_item-fadat.
MOVE is_accit-fbuda TO gs_item-wadat.
*-
* CRM billing: fkdat is not filled
*-
if is_accit-awtyp = 'BEBD'
AND gs_item-fadat is initial.
gs_item-fadat = is_accit-budat. "n_1013595
endif.
move is_accit-fkart to gs_item-fkart.
MOVE is_accit-kokrs TO gs_item-kokrs.
MOVE is_accit-bukrs TO gs_item-bukrs.
MOVE is_accit-werks TO gs_item-werks.
MOVE is_accit-gsber TO gs_item-gsber.
MOVE is_accit-vkorg TO gs_item-vkorg.
MOVE is_accit-vtweg TO gs_item-vtweg.
MOVE is_accit-spart TO gs_item-spart.
MOVE is_accit-prctr TO gs_item-prctr.
MOVE is_accit-pprctr TO gs_item-pprctr.
MOVE is_accit-kunag TO gs_item-kndnr.
MOVE is_accit-matnr TO gs_item-artnr.
*-
* Provide item documents numbers (items except for summarization)
*-
CASE i_docty.
*-
WHEN 'SD'.
*-
MOVE is_accit-awref TO gs_item-rbeln.
IF is_accit-rrrel IS INITIAL OR
( NOT is_accit-rrrel IS INITIAL AND
NOT is_accit-fkart IS INITIAL ).
* SD Rev. Recognition VF44: do not store temp. item number
MOVE is_accit-posnr_sd TO gs_item-rposn.
ENDIF.
*-
WHEN 'FI'.
*-
MOVE is_accit-awref TO gs_item-rbeln.
MOVE is_accit-posnr+4(6) TO gs_item-rposn.
IF NOT is_accit-obzei IS INITIAL AND
is_accit-obzei NE gs_item-rposn+3(3).
MOVE is_accit-obzei TO gs_item-rposn+3(3). "n402480
ENDIF.
*-
WHEN 'MM'.
*-
MOVE is_accit-awref TO gs_item-rbeln.
MOVE is_accit-posnr+4(6) TO gs_item-rposn.
IF NOT is_accit-zeile IS INITIAL AND
is_accit-zeile NE gs_item-rposn+3(3).
MOVE is_accit-zeile TO gs_item-rposn.
ENDIF.
*-
ENDCASE.
* sales order …
MOVE is_accit-aubel TO gs_item-kaufn.
MOVE is_accit-aupos TO gs_item-kdpos.
* sales order (make to order) …
IF is_accit-aubel IS INITIAL.
MOVE is_accit-kdauf TO gs_item-kaufn.
MOVE is_accit-kdpos TO gs_item-kdpos.
IF is_accit-kdauf IS INITIAL.
MOVE is_accit-mat_kdauf TO gs_item-kaufn.
MOVE is_accit-mat_kdpos TO gs_item-kdpos.
ENDIF.
ENDIF.
* CO-order
MOVE is_accit-aufnr TO gs_item-rkaufnr.
* cost object
MOVE is_accit-kstrg TO gs_item-kstrg.
* cost center
MOVE is_accit-kostl TO gs_item-skost.
* project
MOVE is_accit-ps_psp_pnr TO gs_item-pspnr.
IF is_accit-ps_psp_pnr IS INITIAL.
MOVE is_accit-mat_pspnr TO gs_item-pspnr.
ENDIF.
* cost element
CASE i_docty.
WHEN 'SD'.
WHEN 'FI' OR 'MM'.
MOVE is_accit-hkont TO gs_item-kstar.
ENDCASE.
PERFORM alt_perio USING gs_item
is_accit-budat
is_accit-monat
g_erkrs
' '.
MOVE gs_item-perio(4) TO gs_item-gjahr.
MOVE gs_item-perio+4(3) TO gs_item-perde.
MOVE is_accit-awtyp TO gs_item-copa_awtyp.
MOVE is_accit-aworg TO gs_item-copa_aworg.
IF ( i_smode = '1' ) OR
( i_smode = '2' ). "JW HW203779
PERFORM provide_temp_belnr_s USING gs_item.
ENDIF.
MOVE '0' TO gs_item-plikz.
*-
* Trace mode …
*-
IF NOT is_trace_mode-adfl IS INITIAL.
*-
PERFORM trace_new_field_accit USING i_docty
'BUDAT'
'BUDAT'
gs_item-budat
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'FKDAT'
'FADAT'
gs_item-fadat
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'FBUDA'
'WADAT'
gs_item-wadat
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'FKART'
'FKART'
gs_item-fkart
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'KOKRS'
'KOKRS'
gs_item-kokrs
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'BUKRS'
'BUKRS'
gs_item-bukrs
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'WERKS'
'WERKS'
gs_item-werks
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'GSBER'
'GSBER'
gs_item-gsber
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'VKORG'
'VKORG'
gs_item-vkorg
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'VTWEG'
'VTWEG'
gs_item-vtweg
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'SPART'
'SPART'
gs_item-spart
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'PRCTR'
'PRCTR'
gs_item-prctr
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'PPRCTR'
'PPRCTR'
gs_item-pprctr
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'KUNAG'
'KNDNR'
gs_item-kndnr
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'MATNR'
'ARTNR'
gs_item-artnr
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'KDAUF'
'KAUFN'
gs_item-kaufn
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'KDPOS'
'KDPOS'
gs_item-kdpos
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'AUFNR'
'RKAUFNR'
gs_item-rkaufnr
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'KSTRG'
'KSTRG'
gs_item-kstrg
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'KOSTL'
'SKOST'
gs_item-skost
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'PS_PSP_PNR'
'PSPNR'
gs_item-pspnr
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'HKONT'
'KSTAR'
gs_item-kstar
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'AWTYP'
'COPA_AWTYP'
gs_item-copa_awtyp
CHANGING lt_t_fields.
PERFORM trace_new_field_accit USING i_docty
'AWORG'
'COPA_AWORG'
gs_item-copa_aworg
CHANGING lt_t_fields.
PERFORM trace_entry USING 'SD'
gs_item
is_accit
lt_t_fields.
*-
ENDIF. "not is_trace_mode….
ENDFORM. "move_constant_fields
*–––––––––––––––––––––––-*
* FORM COMPLETE_CRITERIA *
*–––––––––––––––––––––––-*
* Routine ermittelt aus der Objektnummer die zugehörigen Merk- *
* male und stellt diese in den Einzelposten, wenn das Merkmal *
* initial ist. *
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab
* ACCIT AC-Doc item *
* TRACE_MODE trace mode *
* SMODE summarization mode *
*–––––––––––––––––––––––-*
FORM complete_criteria TABLES it_dbtable STRUCTURE gs_dbtable
USING is_accit TYPE rkei1_ys_accit
is_trace_mode TYPE rkei1_ys_trace_mode
i_smode.
CONSTANTS: lc_pasubnr LIKE cest1-pasubnr VALUE '0001'.
DATA: ls_ce4_key TYPE ys_ce4_key,
ls_ce4_data TYPE ys_ce4_data,
ls_item_old TYPE ys_ce1.
DATA: lt_t_fields TYPE copa_yt_act_trace_it.
CLEAR gs_item_ce4.
* normal case: complete criteria from PAOBJNR
IF NOT gs_item-paobjnr IS INITIAL.
CLEAR ls_ce4_key.
ls_ce4_key-aktbo = 'X'.
ls_ce4_key-paobjnr = gs_item-paobjnr.
ls_ce4_key-pasubnr = lc_pasubnr.
* Read CE4 from buffer …
PERFORM ce4_read USING ls_ce4_key
ls_ce4_data
g_read_failed.
IF g_read_failed IS INITIAL.
MOVE-CORRESPONDING ls_ce4_data TO gs_item_ce4.
ELSE.
* message (error may not occur, PAOBJNR not in CE4!)
MESSAGE ID 'KE' TYPE 'E' NUMBER '813'
WITH gs_item-paobjnr
c_ce4name
RAISING system_error.
ENDIF.
IF NOT is_trace_mode-adfl IS INITIAL.
* Save item before completion for trace …
ls_item_old = gs_item.
ENDIF.
* Move completed criteria to item …
PERFORM move_item_ce4_to_item USING gs_item_ce4
CHANGING gs_item.
IF NOT is_trace_mode-adfl IS INITIAL.
* Append completed criteria to trace …
PERFORM trace_new_field_p_segment TABLES it_dbtable
USING gs_item_ce4
ls_item_old
CHANGING lt_t_fields.
PERFORM trace_entry USING 'SD'
gs_item
is_accit
lt_t_fields.
ENDIF.
*-
* Clear PAOBJNR in order to redetermine it; if summarization
* is used PAOBJNR is cleared after collection of items (form
* summarize_new_item)
*-
IF ( i_smode IS INITIAL ) OR
( i_smode = '1' ). "JW HW407276
CLEAR gs_item-paobjnr.
ENDIF.
gs_item-pasubnr = lc_pasubnr.
ENDIF. "not gs_item-paobjnr is initial
ENDFORM. "complete_criteria
*–––––––––––––––––––––––-*
* FORM MOVE_CRITERIA_SEGMENT *
*–––––––––––––––––––––––-*
* Routine stellt das CO-PA Segment im RW-Beleg fuer Merkmale *
* in den Einzelposten *
*–––––––––––––––––––––––-*
* –> ACCIT_PA Segment mit Merkmalen zum Ergebnisobjekt *
*–––––––––––––––––––––––-*
FORM move_criteria_segment USING is_accit_pa TYPE rkei1_ys_accit_pa.
CONSTANTS: lc_pasubnr LIKE cest1-pasubnr VALUE '0001'.
* move field if not initial
PERFORM move_field_from_segment USING is_accit_pa
CHANGING gs_item.
* clear PAOBJNR in order to redetermine it
CLEAR gs_item-paobjnr.
gs_item-pasubnr = lc_pasubnr.
ENDFORM. "move_criteria_segment
*–––––––––––––––––––––––-*
* FORM MOVE_VALUE_FIELDS_SEGMENT *
*–––––––––––––––––––––––-*
* Routine stellt das CO-PA Segment im RW-Beleg fuer Wertfelder *
* in den Einzelposten *
*–––––––––––––––––––––––-*
* –> V_TKEBL Ledger/Waehrungstyp
* –> FCURR Fremdwaehrung
* –> ACCCR RW-Beleg Werte
* –> ACCCR_PA Segment mit Wertfeldern
*–––––––––––––––––––––––-*
FORM move_value_fields_segment
USING is_v_tkebl TYPE rkea1_v_tkebl
i_fcurr
is_acccr TYPE rkei1_ys_acccr
is_acccr_pa TYPE rkei1_ys_acccr_pa
CHANGING x_value_moved .
DATA: ls_item TYPE ys_ce1,
l_index LIKE sy-index.
CLEAR ls_item.
READ TABLE gt_item INTO ls_item
WITH KEY paledger = is_v_tkebl-paledger
BINARY SEARCH.
l_index = sy-tabix.
IF sy-subrc NE 0.
MESSAGE ID 'KE' TYPE 'E' NUMBER '475' WITH 'EXT '
is_acccr_pa-awref.
ENDIF.
MOVE-CORRESPONDING is_acccr_pa TO ls_item.
MOVE i_fcurr TO ls_item-frwae.
MOVE is_acccr-kursf TO ls_item-kursf.
MODIFY gt_item FROM ls_item INDEX l_index.
x_value_moved = 'X' .
ENDFORM. "move_value_fields_segment
*–––––––––––––––––––––––-*
* FORM COMPARE_SEGMENT_VALUE *
*–––––––––––––––––––––––-*
* Vergleich zweier Wertfeldsemgente *
*–––––––––––––––––––––––-*
* –> SEG_ONE Segment 1 *
* –> SEG_TWO Segment 2 *
* <– FIELD Tabelle mit unterschiedlichen Feldern *
*–––––––––––––––––––––––-*
FORM compare_segment_value USING seg_one TYPE rkei1_ys_acccr_pa
seg_two TYPE rkei1_ys_acccr_pa
CHANGING et_field TYPE rkei1_yt_field.
DATA: ls_item_one TYPE ys_ce1,
ls_item_two TYPE ys_ce1.
MOVE-CORRESPONDING seg_one TO ls_item_one.
MOVE-CORRESPONDING seg_two TO ls_item_two.
CALL FUNCTION 'COPA_COMPARE_ITEMS'
EXPORTING
i_erkrs = g_erkrs
i_item_one = ls_item_one
i_item_two = ls_item_two
i_compare_fields = 'A'
IMPORTING
et_field = et_field
EXCEPTIONS
OTHERS = 0.
ENDFORM. "compare_segment_value
*–––––––––––––––––––––––-*
* FORM DO_DERIVATION *
*–––––––––––––––––––––––-*
* Anreicherung des CO-PA Einzelpostens
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab
* TRACE_MODE Trace
*–––––––––––––––––––––––-*
FORM do_derivation TABLES it_dbtable STRUCTURE gs_dbtable
USING is_trace_mode TYPE rkei1_ys_trace_mode.
PERFORM derivation_item TABLES it_dbtable
USING gs_item
is_trace_mode.
ENDFORM. "do_derivation
*–––––––––––––––––––––––-*
* FORM DERIVATION_ITEM *
*–––––––––––––––––––––––-*
* Anreicherung des CO-PA Einzelpostens
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab
* <-> ITEM Einzelposten
*–––––––––––––––––––––––-*
FORM derivation_item TABLES it_dbtable STRUCTURE gs_dbtable
USING xs_item TYPE ys_ce1
is_trace_mode TYPE rkei1_ys_trace_mode.
DATA: ls_item0 TYPE ys_ce0,
l_trace_deri TYPE kedr_trace_handle.
* derivation only if the object number is initial; otherwise the
* critera have been determined yet
CHECK xs_item-paobjnr IS INITIAL.
MOVE-CORRESPONDING xs_item TO ls_item0.
CALL FUNCTION 'KEDR_COPA_DERIVE'
EXPORTING
i_erkrs = g_erkrs
i_item = ls_item0
i_derivation_date = ls_item0-budat
i_trace_mode = is_trace_mode-deri
IMPORTING
e_item = ls_item0
e_trace_handle = l_trace_deri
EXCEPTIONS
derivation_failed = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH
sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
MOVE-CORRESPONDING ls_item0 TO xs_item.
IF NOT is_trace_mode-deri IS INITIAL.
* Write trace …
PERFORM trace_derivation USING xs_item
l_trace_deri.
ENDIF.
ENDFORM. "derivation_item
*–––––––––––––––––––––––-*
* FORM CREATE_ITEMS_CURR_TYPE
*–––––––––––––––––––––––-*
* Baut Tabelle mit Einzelposten pro Waehrungstyp auf. Dazu wird
* der bislang vorhandene, lediglich die Merkmale und feste Felder
* enthaltende Einzelposten in eine Einzelpostentabelle kopiert.
*–––––––––––––––––––––––-*
* –> V_TKEBL Waehrungstypen CO-PA
*–––––––––––––––––––––––-*
FORM create_items_curr_type USING it_v_tkebl TYPE rkea1_t_v_tkebl.
CLEAR: gt_item,
gt_item[].
DESCRIBE TABLE it_v_tkebl LINES g_lin.
IF g_lin EQ 0.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
LOOP AT it_v_tkebl INTO gs_v_tkebl WHERE erkrs EQ g_erkrs.
gs_item-paledger = gs_v_tkebl-paledger.
*-
* gt_item contains items with relevant ledgers …
*-
APPEND gs_item TO gt_item.
ENDLOOP.
ENDFORM. "create_items_curr_type
*–––––––––––––––––––––––-*
* FORM MOVE_QUANTITY_SD
*–––––––––––––––––––––––-*
* Uebernahme Fakturawerte/-mengen in die Einzelposten
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab
* –> ACCIT RW-Beleg Position
*–––––––––––––––––––––––-*
FORM move_quantity_sd TABLES it_dbtable STRUCTURE gs_dbtable
USING is_accit TYPE rkei1_ys_accit.
DATA: l_sd_quantity TYPE c,
l_off(3) TYPE p,
ls_dbtable_key TYPE ys_dbtable_key.
ls_dbtable_key-tabname = c_ce0name.
*-
* Is quantity of document relevant?
*-
CHECK is_accit-posar IS INITIAL.
*-
* Build internal table T258m
*-
DESCRIBE TABLE gt_int_t258m LINES g_lin.
READ TABLE gt_int_t258m INDEX 1.
IF ( gt_int_t258m-erkrs NE g_erkrs )
OR ( g_lin = 0 ) .
REFRESH gt_int_t258m.
SELECT * FROM t258m INTO TABLE gt_int_t258m
WHERE erkrs = g_erkrs.
ENDIF.
*-
* Move quantity fields …
*-
LOOP AT gt_int_t258m.
l_sd_quantity = 'X'.
CLEAR ls_dbtable_key-fieldname.
ls_dbtable_key-tabname+3(4) = g_erkrs.
ls_dbtable_key-fieldname = gt_int_t258m-copa_menge.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
IF sy-subrc EQ 0.
*-
ASSIGN COMPONENT it_dbtable-pos_ce1 OF STRUCTURE gs_item
TO <quantity> TYPE it_dbtable-inttype
DECIMALS it_dbtable-decimals.
l_off = STRLEN( ls_dbtable_key-fieldname ).
ls_dbtable_key-fieldname+l_off(3) = '_ME'.
CONDENSE ls_dbtable_key-fieldname NO-GAPS.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
*-
IF sy-subrc = 0.
ASSIGN COMPONENT it_dbtable-pos_ce1 OF STRUCTURE gs_item
TO <uom>.
CASE gt_int_t258m-sd_menge.
WHEN 'FKIMG'. "Menge in VME
<quantity> = is_accit-fkimg.
<uom> = is_accit-vrkme.
WHEN 'FKLMG'. "Menge in LME
<quantity> = is_accit-fklmg.
<uom> = is_accit-meins.
WHEN 'NTGEW'. "Nettogewicht
<quantity> = is_accit-ntgew.
<uom> = is_accit-gewei.
WHEN 'BRGEW'. "Bruttogewicht
<quantity> = is_accit-brgew.
<uom> = is_accit-gewei.
WHEN 'VOLUM'. "Volumen
<quantity> = is_accit-volum.
<uom> = is_accit-voleh.
* BEGIN IS-CWM Coding …
WHEN '/CWM/FKIMG_BEW'.
FIELD-SYMBOLS: <cwm_fkimg_bew> TYPE ANY,
<cwm_valum> TYPE ANY.
*-
ASSIGN COMPONENT '/CWM/FKIMG_BEW'
OF STRUCTURE is_accit TO <cwm_fkimg_bew>.
IF sy-subrc = 0.
<quantity> = <cwm_fkimg_bew>.
ENDIF.
*-
ASSIGN COMPONENT '/CWM/VALUM'
OF STRUCTURE is_accit TO <cwm_valum>.
IF sy-subrc = 0.
<uom> = <cwm_valum>.
ENDIF.
* END IS-CWM Coding …
WHEN OTHERS.
CLEAR l_sd_quantity.
ENDCASE.
* if gc_vbtyp_c cs is_accit-vbtyp and
IF NOT is_accit-shkzg_va IS INITIAL AND
NOT l_sd_quantity IS INITIAL.
<quantity> = <quantity> * ( -1 ).
ENDIF.
*-
ENDIF.
*-
ENDIF.
*-
ENDLOOP.
ENDFORM. "move_quantity_sd
*–––––––––––––––––––––––*
* FORM move_curr_fields *
*–––––––––––––––––––––––*
* Move fields that are relevant for curr. conversion *
*–––––––––––––––––––––––*
* –> IS_V_TKEBL curr. tab. *
* –> I_FCURR foreign curr. *
* –> IS_ACCIT *
* –> IS_ACCCR *
*–––––––––––––––––––––––*
FORM move_curr_fields USING is_v_tkebl TYPE rkea1_v_tkebl
i_fcurr
is_accit TYPE rkei1_ys_accit
is_acccr TYPE rkei1_ys_acccr.
DATA: ls_item TYPE ys_ce1,
l_index LIKE sy-index.
READ TABLE gt_item INTO ls_item
WITH KEY paledger = is_v_tkebl-paledger
BINARY SEARCH.
l_index = sy-tabix.
IF sy-subrc NE 0.
MESSAGE ID 'KE' TYPE 'E' NUMBER '476'.
ENDIF.
IF ls_item-frwae IS INITIAL.
ls_item-kursf = is_acccr-kursf.
ls_item-frwae = i_fcurr.
MODIFY gt_item FROM ls_item INDEX l_index.
ENDIF.
ENDFORM. "move_curr_fields
*–––––––––––––––––––––––-*
* FORM MOVE_VALUE_FIELDS_SD
*–––––––––––––––––––––––-*
* Uebernahme Fakturawerte/-mengen in die Einzelposten
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab
* V_TKEBL Ledger/Waehrungstyp
* TRACE_MODE Trace
* FCURR Fremdwährung
* COND_ATTR Attribut Kondition
* ACCIT RW-Beleg Position
* ACCCR RW-Beleg Waehrung
*–––––––––––––––––––––––-*
FORM move_value_fields_sd TABLES it_dbtable STRUCTURE gs_dbtable
USING is_v_tkebl TYPE rkea1_v_tkebl
is_trace_mode TYPE rkei1_ys_trace_mode
i_fcurr
i_cond_attr
is_accit TYPE rkei1_ys_accit
is_acccr TYPE rkei1_ys_acccr
CHANGING x_value_moved TYPE c .
DATA: ls_dbtable_key TYPE ys_dbtable_key,
ls_item TYPE ys_ce1,
lt_t_fields TYPE copa_yt_act_trace_it.
DATA: l_off(3) TYPE p,
l_index LIKE sy-index,
l_pkey_credit(10) VALUE '50',
l_wrbtr LIKE acccr-wrbtr,
ls_assigned TYPE ys_condition_assignment.
STATICS: l_appl LIKE t258i-kapplke .
ls_dbtable_key-tabname = c_ce0name.
*-
* Get condition assignment from t258i
*-
PERFORM read_t258i USING is_accit
CHANGING ls_assigned.
*-
* If no R/3-assignment exists => read CRM conditions
*-
IF ls_assigned IS INITIAL.
PERFORM read_tkeexcond02 USING is_accit
CHANGING ls_assigned.
ENDIF.
IF NOT ls_assigned IS INITIAL.
IF ls_assigned-val_field IS INITIAL.
SET PARAMETER ID 'ERB' FIELD g_erkrs.
MESSAGE ID 'KE' TYPE 'E' NUMBER '490' WITH is_accit-kschl
g_erkrs.
ENDIF.
ls_dbtable_key-tabname+3(4) = g_erkrs.
ls_dbtable_key-fieldname = ls_assigned-val_field.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
IF sy-subrc = 0.
CLEAR ls_item.
READ TABLE gt_item INTO ls_item
WITH KEY paledger = is_v_tkebl-paledger
BINARY SEARCH.
l_index = sy-tabix.
IF sy-subrc NE 0.
MESSAGE ID 'KE' TYPE 'E' NUMBER '475' WITH 'VBRK'
is_accit-awref.
ENDIF.
ASSIGN COMPONENT it_dbtable-pos_ce1 OF STRUCTURE ls_item
TO <value> TYPE it_dbtable-inttype
DECIMALS it_dbtable-decimals.
l_wrbtr = is_acccr-wrbtr.
*-
* +/- sign logic (Be cautious with program changes here!):
* all values in CO-PA have a positive sign (except for credit memos
* and returns) because e.g. revenues have different signs in SD(+)
* and FI(-); revenue deductions are subtracted from revenues
* with the CO-PA rep. line structure (information system)
* check "copy sign"
*-
IF ( is_accit-koaid EQ 'C'
AND ls_assigned-sign IS INITIAL ).
*-
* Set "copy sign" for accruals obligatory …
*-
MESSAGE ID 'KE/AD' TYPE 'E' NUMBER '243'
WITH ls_assigned-condition
is_accit-kappl
ls_assigned-val_field
g_erkrs.
ENDIF.
*-
IF ( is_accit-aworg NE rkei1_ycs_aworg-corr
AND i_cond_attr EQ 'X'
AND ls_assigned-sign IS INITIAL ).
*-
* Set "copy sign" for condition types
* with variable sign obligatory …
*-
* message id 'KE/AD' type 'E' number '243'
* with ls_assigned-condition
* is_accit-kappl
* ls_assigned-val_field
* g_erkrs.
clear i_cond_attr.
ENDIF.
*-
* Determine sign …
*-
IF ( NOT ls_assigned-sign IS INITIAL
OR i_cond_attr EQ 'X' ).
*-
* Copy +/- sign …
*-
IF is_accit-shkzg_va IS INITIAL.
* Debit postings negative, credit postings positive
l_wrbtr = l_wrbtr * ( -1 ).
ENDIF.
ELSE.
*-
* Sign normal …
*-
IF l_pkey_credit EQ is_accit-bschl.
* Debit posting ( S ) in ACC-Doc with pos. sign,
* Credit posting ( H ) in ACC-Doc with neg. sign
l_wrbtr = l_wrbtr * ( -1 ).
ENDIF.
ENDIF.
IF NOT is_accit-shkzg_va IS INITIAL.
*-
* Credit memos, returns always with a negative sign
*-
l_wrbtr = l_wrbtr * ( -1 ).
ENDIF.
IF NOT is_trace_mode-adfl IS INITIAL.
* Trace data flow …
PERFORM trace_new_field_acccr USING 'SD'
'WRBTR'
ls_dbtable_key-fieldname
ls_assigned-sign
<value>
l_wrbtr
ls_item
is_accit
is_acccr
CHANGING lt_t_fields.
PERFORM trace_entry USING 'SD'
ls_item
is_accit
lt_t_fields.
ENDIF.
<value> = <value> + l_wrbtr.
*-
IF ls_item-frwae IS INITIAL.
ls_item-kursf = is_acccr-kursf.
ls_item-frwae = i_fcurr.
ENDIF.
*-
MODIFY gt_item FROM ls_item INDEX l_index.
x_value_moved = 'X' .
ELSE.
* CO-PA: inconsistency reading fieldtab
MESSAGE ID 'KE' TYPE 'E' NUMBER '891' WITH ls_assigned-val_field
g_erkrs
is_accit-kschl.
ENDIF. "sy-subrc it_dbtable
ELSE.
*-
IF is_accit-kstat NE 'X'.
* Statistical condition types may not be assigned to a value field
SET PARAMETER ID 'ERB' FIELD g_erkrs.
MESSAGE ID 'KE' TYPE 'E' NUMBER '391' WITH is_accit-kschl
g_erkrs
is_accit-hkont.
ENDIF.
*-
ENDIF. "gt_int_t258i
ENDFORM. "move_value_fields_sd
*–––––––––––––––––––––––*
* FORM TRACE_ENTRY *
*–––––––––––––––––––––––*
* Aufnahme Felder in Tracetabelle *
*–––––––––––––––––––––––*
* –> SOURCE *
* ITEM *
* ACCIT *
* T_FIELDS *
*–––––––––––––––––––––––*
FORM trace_entry USING i_source
is_item TYPE ys_ce1
is_accit TYPE rkei1_ys_accit
it_t_fields TYPE copa_yt_act_trace_it.
DATA: ls_ad_trace TYPE copa_actual_data_trace.
STATICS: la_index LIKE sy-index,
la_posnr LIKE accit-posnr.
* trace header
IF la_posnr NE is_accit-posnr_sd.
ADD 1 TO la_index.
la_posnr = is_accit-posnr_sd.
ENDIF.
ls_ad_trace-trace_adfl = la_index.
ls_ad_trace-rbeln = is_item-rbeln.
ls_ad_trace-rposn = is_item-rposn.
ls_ad_trace-vrgar = is_item-vrgar.
ls_ad_trace-erkrs = g_erkrs.
ls_ad_trace-belnr = is_item-belnr.
ls_ad_trace-posnr = is_item-posnr.
ls_ad_trace-paobjnr = is_accit-paobjnr.
ls_ad_trace-glvor = i_source.
ls_ad_trace-sto_belnr = is_item-sto_belnr.
ls_ad_trace-sto_posnr = is_item-sto_posnr.
ls_ad_trace-t_fields[] = it_t_fields[].
* append traced field to trace table
CALL FUNCTION 'COPA_DOCUMENT_TRACE'
EXPORTING
i_action = 'A'
is_ad_trace = ls_ad_trace.
ENDFORM. "trace_entry
*–––––––––––––––––––––––*
* FORM TRACE_NEW_FIELD_P_SEGMENT *
*–––––––––––––––––––––––*
* Aufnahme Felder in Tracetabelle aus Kontierung (CE4_ACCT) *
*–––––––––––––––––––––––*
* DBTABLE *
* ITEM_CE4 *
* ITEM *
* T_FIELDS *
*–––––––––––––––––––––––*
FORM trace_new_field_p_segment
TABLES it_dbtable STRUCTURE gs_dbtable
USING is_item_ce4 TYPE ys_ce4
is_item TYPE ys_ce1
CHANGING xt_t_fields TYPE copa_yt_act_trace_it.
DATA: ls_ad_trace_it TYPE LINE OF copa_yt_act_trace_it.
FIELD-SYMBOLS: <fs_item>, <fs_item_ce4>.
* trace item from accit
ls_ad_trace_it-ewskz = 'E'.
ls_ad_trace_it-source = 'COPA'.
ls_ad_trace_it-sourcetable = 'CE4'.
LOOP AT it_dbtable WHERE pos_ce4 GT 0
AND keyflag = ' '.
* only criteria are relevant here
ASSIGN COMPONENT it_dbtable-pos_ce1 OF STRUCTURE is_item
TO <fs_item> TYPE it_dbtable-inttype.
IF <fs_item> IS INITIAL.
ASSIGN COMPONENT it_dbtable-pos_ce4 OF STRUCTURE is_item_ce4
TO <fs_item_ce4> TYPE it_dbtable-inttype.
ls_ad_trace_it-field = it_dbtable-fieldname.
ls_ad_trace_it-sourcefield = it_dbtable-fieldname.
ls_ad_trace_it-cont_before = <fs_item>.
ls_ad_trace_it-cont_step = <fs_item_ce4>.
ls_ad_trace_it-cont_after = <fs_item_ce4>.
APPEND ls_ad_trace_it TO xt_t_fields.
ENDIF.
ENDLOOP.
ENDFORM. "trace_new_field_p_segment
*–––––––––––––––––––––––*
* FORM TRACE_NEW_FIELD_ACCIT *
*–––––––––––––––––––––––*
* Aufnahme Felder in Tracetabelle aus ACCIT *
*–––––––––––––––––––––––*
* –> SOURCE *
* SOURCEFIELD *
* FIELDNAME *
* VALUE_NEW *
* <-> T_FIELDS *
*–––––––––––––––––––––––*
FORM trace_new_field_accit USING i_source
i_sourcefield
i_fieldname
i_value_new
CHANGING xt_t_fields TYPE copa_yt_act_trace_it.
DATA: ls_ad_trace_it TYPE LINE OF copa_yt_act_trace_it.
*-
* Trace only changes!
*-
CHECK NOT i_value_new IS INITIAL.
*-
* Trace item from accit …
*-
ls_ad_trace_it-ewskz = 'E'.
ls_ad_trace_it-field = i_fieldname.
ls_ad_trace_it-cont_before = ' '.
ls_ad_trace_it-cont_step = i_value_new.
ls_ad_trace_it-cont_after = i_value_new.
ls_ad_trace_it-source = i_source.
ls_ad_trace_it-sourcetable = 'ACCIT'.
ls_ad_trace_it-sourcefield = i_sourcefield.
APPEND ls_ad_trace_it TO xt_t_fields.
ENDFORM. "trace_new_field_accit
*–––––––––––––––––––––––*
* FORM TRACE_NEW_FIELD_ACCCR *
*–––––––––––––––––––––––*
* Aufnahme Felder in Tracetabelle aus ACCCR *
*–––––––––––––––––––––––*
* –> SOURCE *
* SOURCEFIELD *
* FIELDNAME *
* SIGN *
* VALUE_OLD *
* VALUE_NEW *
* ITEM *
* ACCIT *
* ACCCR *
* <-> T_FIELDS *
*–––––––––––––––––––––––*
FORM trace_new_field_acccr USING i_source
i_sourcefield
i_fieldname
i_sign
i_value_old
i_value_new
is_item TYPE ys_ce1
is_accit TYPE rkei1_ys_accit
is_acccr TYPE rkei1_ys_acccr
CHANGING xt_t_fields TYPE copa_yt_act_trace_it.
DATA: ls_ad_trace_it TYPE LINE OF copa_yt_act_trace_it,
l_value LIKE acccr-wrbtr.
*-
* Trace item from acccr …
*-
ls_ad_trace_it-ewskz = 'W'.
ls_ad_trace_it-paledger = is_item-paledger.
ls_ad_trace_it-field = i_fieldname.
ls_ad_trace_it-cont_before = i_value_old.
ls_ad_trace_it-cont_step = i_value_new.
l_value = i_value_old + i_value_new.
ls_ad_trace_it-cont_after = l_value.
ls_ad_trace_it-source = i_source.
ls_ad_trace_it-sourcetable = 'ACCCR'.
ls_ad_trace_it-sourcefield = i_sourcefield.
ls_ad_trace_it-kschl = is_accit-kschl.
ls_ad_trace_it-kstat = is_accit-kstat.
ls_ad_trace_it-kinak = is_accit-kinak.
ls_ad_trace_it-hkont = is_accit-hkont.
ls_ad_trace_it-shkzg_va = is_accit-shkzg_va.
ls_ad_trace_it-sign = i_sign.
ls_ad_trace_it-curtp = is_acccr-curtp.
ls_ad_trace_it-waers = is_acccr-waers.
ls_ad_trace_it-kursf = is_acccr-kursf.
APPEND ls_ad_trace_it TO xt_t_fields.
ENDFORM. "trace_new_field_acccr
*–––––––––––––––––––––––-*
* FORM DO_VALUATION
*–––––––––––––––––––––––-*
* Bewertung des CO-PA Einzelpostens
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab
* TRACE Tracemodus
* CANCEL Kennzeichen, ob Gutschr./Retoure
* PALEDGER Ledger/Waehrungstyp
*–––––––––––––––––––––––-*
FORM do_valuation TABLES it_dbtable STRUCTURE gs_dbtable
USING is_trace_mode TYPE rkei1_ys_trace_mode
i_cancel
i_paledger.
DATA: l_tabix LIKE sy-tabix.
READ TABLE gt_item WITH KEY paledger = i_paledger BINARY SEARCH.
l_tabix = sy-tabix.
IF sy-subrc NE 0.
MESSAGE ID 'KE' TYPE 'E' NUMBER '476'.
ENDIF.
PERFORM valuation_item TABLES it_dbtable
USING gt_item
is_trace_mode
i_cancel.
MODIFY gt_item INDEX l_tabix.
ENDFORM. "do_valuation
*–––––––––––––––––––––––-*
* FORM VALUATION_ITEM
*–––––––––––––––––––––––-*
* Bewertung des CO-PA Einzelpostens
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab
* <-> ITEM Einzelposten
* –> TRACE_MODE Tracemodus
* –> CANCEL Stornierungskennzeichen
*–––––––––––––––––––––––-*
FORM valuation_item TABLES it_dbtable STRUCTURE gs_dbtable
USING xs_item TYPE ys_ce1
is_trace_mode TYPE rkei1_ys_trace_mode
i_cancel.
DATA: l_dbtabname LIKE dd02v-tabname, " value 'CE1%ERK',
l_trace_vaan TYPE kedr_trace_handle,
l_trace_copc TYPE kedr_trace_handle,
lt_valuef LIKE rkepr OCCURS 0 WITH HEADER LINE.
l_dbtabname = c_ce1name.
CALL FUNCTION 'COPA_UPDATE_STANDARD_MEASURES'
EXPORTING
i_tabname = l_dbtabname
i_copa_line_item = xs_item
i_do_not_overwrite = 'X'
IMPORTING
e_copa_line_item = xs_item
TABLES
i_fieldtab = it_dbtable
EXCEPTIONS
conversion_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING error_project_copa.
ENDIF.
CALL FUNCTION 'RKE_PRICING_INTERFACE_ACT'
EXPORTING
i_erkrs = g_erkrs
i_kurst = 'M'
i_bwfkt = '01'
i_storno = i_cancel
i_trace_mode_bean = is_trace_mode-valu
i_trace_mode_copc = is_trace_mode-valu
is_copa_item_input = xs_item
IMPORTING
es_copa_item_output = xs_item
e_trace_handle_bean = l_trace_vaan
e_trace_handle_copc = l_trace_copc
TABLES
it_fieldtab = it_dbtable
xt_wertkomp = lt_valuef
EXCEPTIONS
valuation_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING error_project_copa.
ENDIF.
IF NOT is_trace_mode-valu IS INITIAL.
* Write trace …
PERFORM trace_valuation USING xs_item
l_trace_vaan
l_trace_copc.
ENDIF.
ENDFORM. "valuation_item
*–––––––––––––––––––––––*
* FORM TRACE_VALUATION *
*–––––––––––––––––––––––*
* Aufnahme Einzelposten in Tracetabelle *
*–––––––––––––––––––––––*
* –> IS_ITEM Einzelposten *
* –> I_TRACE_VAAN Traceindex Bewertung *
* –> I_TRACE_COPC Traceindex Kalkulation *
*–––––––––––––––––––––––*
FORM trace_valuation USING is_item TYPE ys_ce1
i_trace_vaan
i_trace_copc.
DATA: ls_ad_trace TYPE copa_actual_data_trace.
MOVE-CORRESPONDING is_item TO ls_ad_trace.
CASE is_item-paledger.
*-
WHEN rkea1_c_paledger-erkrs OR
rkea1_c_paledger-bukrs.
*-
ls_ad_trace-trace_vaan = i_trace_vaan.
ls_ad_trace-trace_copc = i_trace_copc.
*-
CLEAR ls_ad_trace-trace_vaan_tp.
CLEAR ls_ad_trace-trace_copc_tp.
*-
WHEN rkea1_c_paledger-erkpcb OR
rkea1_c_paledger-bukpcb.
*-
CLEAR ls_ad_trace-trace_vaan.
CLEAR ls_ad_trace-trace_copc.
*-
ls_ad_trace-trace_vaan_tp = i_trace_vaan.
ls_ad_trace-trace_copc_tp = i_trace_copc.
*-
ENDCASE.
*-
* Append to trace table …
*-
CALL FUNCTION 'COPA_DOCUMENT_TRACE'
EXPORTING
i_action = 'A'
is_ad_trace = ls_ad_trace.
ENDFORM. "trace_valuation
*–––––––––––––––––––––––*
* FORM TRACE_DERIVATION *
*–––––––––––––––––––––––*
* Aufnahme Einzelposten in Tracetabelle *
*–––––––––––––––––––––––*
* –> IS_ITEM Einzelposten *
* –> I_TRACE_DERI Traceindex Ableitung *
*–––––––––––––––––––––––*
FORM trace_derivation USING is_item TYPE ys_ce1
i_trace_deri.
DATA: ls_ad_trace TYPE copa_actual_data_trace.
MOVE-CORRESPONDING is_item TO ls_ad_trace.
ls_ad_trace-trace_deri = i_trace_deri.
* append to trace table
CALL FUNCTION 'COPA_DOCUMENT_TRACE'
EXPORTING
i_action = 'A'
is_ad_trace = ls_ad_trace.
ENDFORM. "trace_derivation
*–––––––––––––––––––––––-*
* FORM RESET_FIELD
*–––––––––––––––––––––––-*
* Setzt ein Wertfeld zurück auf Null (entspr. Tab. TKEVA10)
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab
* –> PALEDGER Ledger/Waehrungstyp
*–––––––––––––––––––––––-*
FORM reset_field TABLES it_dbtable STRUCTURE gs_dbtable
USING i_paledger.
* This form is OBSOLETE as of release 4.6C ( coding has been replaced
* by subroutine 'update_and_valuate_and_reset'
DATA: ls_dbtable_key TYPE ys_dbtable_key,
l_tabix LIKE sy-tabix.
ls_dbtable_key-tabname = c_ce0name.
*-
* build int. table TKEVA10
*-
DESCRIBE TABLE gt_int_tkeva10 LINES g_lin.
READ TABLE gt_int_tkeva10 INDEX 1.
IF g_lin = 0
OR g_erkrs NE gt_int_tkeva10-erkrs.
REFRESH gt_int_tkeva10.
SELECT * FROM tkeva10 INTO TABLE gt_int_tkeva10
WHERE erkrs = g_erkrs.
ENDIF.
*-
* Get item …
*-
READ TABLE gt_item WITH KEY paledger = i_paledger BINARY SEARCH.
IF sy-subrc NE 0.
MESSAGE ID 'KE' TYPE 'E' NUMBER '476'.
ENDIF.
l_tabix = sy-tabix.
*-
* Check, if reset of the value is desired …
*-
LOOP AT gt_int_tkeva10 WHERE fkart EQ gt_item-fkart
AND wdele EQ 'X'.
ls_dbtable_key-fieldname = gt_int_tkeva10-wertkomp.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
IF sy-subrc = 0.
ASSIGN COMPONENT it_dbtable-pos_ce1 OF STRUCTURE gt_item
TO <value>
TYPE it_dbtable-inttype
DECIMALS it_dbtable-decimals.
IF sy-subrc EQ 0.
* reset value
<value> = 0.
ENDIF.
ELSE.
* CO-PA: error reading fieldtab
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
ENDLOOP.
MODIFY gt_item INDEX l_tabix.
ENDFORM. "reset_field
*–––––––––––––––––––––––-*
* FORM SAVE_ITEM_VALUE
*–––––––––––––––––––––––-*
* Merkt sich die Wertfelder (keine Mengen) eines Einzelpostens
* in Tabelle
*–––––––––––––––––––––––-*
* –> PALEDGER Ledger/Waehrungstyp
*–––––––––––––––––––––––-*
FORM save_item_value USING i_paledger.
CLEAR gs_item_old.
READ TABLE gt_item WITH KEY paledger = i_paledger BINARY SEARCH.
IF sy-subrc NE 0.
MESSAGE ID 'KE' TYPE 'E' NUMBER '476'.
ENDIF.
MOVE-CORRESPONDING gt_item TO gs_item_old.
ENDFORM. "save_item_value
*–––––––––––––––––––––––-*
* FORM COPY_VALUE_CURR_TYPES
*–––––––––––––––––––––––-*
* Logik: es wurde der Einzelposten aus Ledger n an die Bewertung
* uebergeben. Die durch die Bewertung geaenderten Werte und Mengen
* muessen nun in die Einzelposten der anderen Ledger uebernommen
* werden. Durch einen Vergleich der Wertfelder des Einzelpostens
* aus Ledger n vor und nach der Bewertung werden zunaechst die
* geaenderten Felder bestimmt. Anschliessend werden gerade diese
* – nach einer Waehrungsumrechnung – in die anderen Ledger ueber-
* nommen. Falls im User-Exit der Bewertung Felder aus dem Sender-
* beleg geaendert wurden, so werden auch in den anderen Ledgern
* die Werte ueberschrieben.
* Achtung bei Waehrungsumrechnung: evtl. wurde durch manuelle
* Kursaenderungen auf dem Senderbeleg ein abweichender Umrechnungs-
* kurs als in der Tabelle TCURR hinterlegt verwendet. Dieser Kurs
* wurde beim Aufbau der Einzelposten in den unterschiedlichen
* Waehrungstypen verwendet. In diesem Fall darf aber fuer die
* Rueckrechnung der bewerteten Felder aus der Ergebnisbereichs-
* waehrung in die anderen Waehrungstypen nicht der Kurs aus der
* TCURR verwendet werden. Es muss die manuelle Kursaenderung
* beruecksichtigt werden!
*–––––––––––––––––––––––-*
* –> DBTABLE Feldkatalog
* PALEDGER_N Quelle Ledger/Waehrungstyp
* T_PALEDGER_NN Ziel Ledger/Waehrungstyp
*–––––––––––––––––––––––-*
FORM copy_value_curr_types TABLES it_dbtable STRUCTURE gs_dbtable
USING i_paledger_n
it_paledger_nn TYPE rkei1_yt_ledger.
DATA: ls_item_n TYPE ys_ce1,
ls_item_nn TYPE ys_ce1,
ls_item_n_new TYPE ys_ce1,
ls_item_n_old TYPE ys_ce1,
ls_item_old TYPE ys_ce1,
ls_item_val TYPE ys_item_val,
ls_field TYPE rkei1_ys_field,
lt_field TYPE rkei1_yt_field,
ls_ledger TYPE LINE OF rkei1_yt_ledger,
l_amount_item_n LIKE acccr-wrbtr,
l_amount_item_nn LIKE acccr-wrbtr,
l_value_for LIKE acccr-wrbtr,
l_waers_ledger_n LIKE tkeb-waers,
l_waers_ledger_nn LIKE tkeb-waers,
l_convert_ind,
l_index LIKE sy-index,
l_rate LIKE cest1-kursf,
l_rate_foreign LIKE cest1-kursf,
l_continue,
ls_dbtable_key TYPE ys_dbtable_key.
ls_dbtable_key-tabname = c_ce0name.
l_continue = 'X'.
READ TABLE gt_item INTO ls_item_n
WITH KEY paledger = i_paledger_n
BINARY SEARCH.
IF sy-subrc NE 0.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
l_index = sy-tabix.
*-
* Get currency of ledger n of operating concern …
*-
PERFORM get_currency USING g_erkrs
i_paledger_n
ls_item_n-bukrs
CHANGING gt_v_curr.
READ TABLE gt_v_curr INTO gs_v_curr INDEX 1.
IF ( sy-subrc NE 0
OR ls_item_n-paledger NE gs_v_curr-paledger ).
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
l_waers_ledger_n = gs_v_curr-waers.
* Item ledger n after valuation …
MOVE-CORRESPONDING ls_item_n TO ls_item_n_new.
* Item ledger n before valuation …
MOVE-CORRESPONDING gs_item_old TO ls_item_n_old.
* Complete items with other ledgers nn
LOOP AT it_paledger_nn INTO ls_ledger.
LOOP AT gt_item INTO ls_item_nn WHERE paledger EQ ls_ledger-paledger.
* Get currency for ledger nn …
PERFORM get_currency USING g_erkrs
ls_item_nn-paledger
ls_item_nn-bukrs
CHANGING gt_v_curr.
READ TABLE gt_v_curr INTO gs_v_curr INDEX 1.
IF ( sy-subrc NE 0
OR ls_item_nn-paledger NE gs_v_curr-paledger ).
MESSAGE ID 'KE' TYPE 'X' NUMBER '476' RAISING creation_error.
ENDIF.
l_waers_ledger_nn = gs_v_curr-waers.
* Check whether currencies are identical …
IF ( l_waers_ledger_n
EQ l_waers_ledger_nn ).
ls_item_nn = ls_item_n_new.
ls_item_nn-paledger = ls_ledger-paledger.
MODIFY gt_item FROM ls_item_nn.
CLEAR l_continue.
ENDIF.
CHECK NOT l_continue IS INITIAL.
* Determine how to convert …
IF ls_item_nn-frwae NE ls_item_n-frwae.
* Different FRWAE for ledgers:
* Determine adapted rate for conversion
CLEAR l_convert_ind.
ELSE.
l_convert_ind = 'X'.
ENDIF.
IF l_convert_ind IS INITIAL.
* Get conversion factor from ledger n to ledger nn …
PERFORM compare_item_get_value USING ls_item_n_old
ls_item_nn
CHANGING l_amount_item_n
l_amount_item_nn.
IF NOT l_amount_item_n IS INITIAL.
* Other value fields filled: determine conversion factor
CALL FUNCTION 'COPA_CALCULATE_EXCHANGE_RATE'
EXPORTING
i_erkrs = g_erkrs
i_date = ls_item_nn-budat
i_amount_from = l_amount_item_nn
i_currency_from = gs_v_curr-waers
i_amount_to = l_amount_item_n
i_currency_to = l_waers_ledger_n
i_type_of_rate = 'M'
IMPORTING
e_exchange_rate = l_rate
EXCEPTIONS
error_rate = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING error_rate.
ENDIF.
ENDIF. "not l_amount
ENDIF. "l_convert_ind
* Get fields that are changed by valuation
CALL FUNCTION 'COPA_COMPARE_ITEMS'
EXPORTING
i_erkrs = g_erkrs
i_item_one = ls_item_n_old
i_item_two = ls_item_n_new
i_compare_fields = 'A'
IMPORTING
et_field = lt_field
EXCEPTIONS
OTHERS = 0.
DESCRIBE TABLE lt_field LINES g_lin.
IF g_lin GT 0.
LOOP AT lt_field INTO ls_field.
*-
ls_dbtable_key-fieldname = ls_field-fieldname.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
IF sy-subrc = 0.
CASE it_dbtable-datatype.
*-
WHEN 'CURR' OR 'QUAN'.
*-
ASSIGN COMPONENT it_dbtable-pos_ce1
OF STRUCTURE ls_item_nn
TO <value>
TYPE it_dbtable-inttype
DECIMALS it_dbtable-decimals.
ASSIGN COMPONENT it_dbtable-pos_ce1
OF STRUCTURE ls_item_n_new
TO <value_source>
TYPE it_dbtable-inttype
DECIMALS it_dbtable-decimals.
*-
WHEN 'UNIT'.
*-
ASSIGN COMPONENT it_dbtable-pos_ce1
OF STRUCTURE ls_item_nn TO <value>.
ASSIGN COMPONENT it_dbtable-pos_ce1
OF STRUCTURE ls_item_n_new TO <value_source>.
*-
WHEN OTHERS.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
*-
ENDCASE.
*-
IF sy-subrc EQ 0.
*-
IF it_dbtable-datatype EQ 'CURR'.
* Move value after currency conversion
IF l_convert_ind IS INITIAL.
* Direct conversion …
PERFORM convert_to_lf_currency
USING g_erkrs
ls_item_nn-budat
l_waers_ledger_n
<value_source>
gs_v_curr-waers
'F'
CHANGING l_rate
<value>.
ELSE.
* Indirect conversion via foreign currency
* 1st step: conversion back to foreign currency
IF ls_item_n-frwae NE ls_item_nn-frwae.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
* CO-PA: inconsistent foreign currency fields
ENDIF.
l_rate = ls_item_n-kursf.
PERFORM convert_to_lf_currency
USING g_erkrs
ls_item_n-budat
l_waers_ledger_n
<value_source>
ls_item_n-frwae
'F'
CHANGING l_rate
l_value_for.
* 2nd step: conversion to ledger currency
l_rate = ls_item_nn-kursf.
PERFORM convert_to_lf_currency
USING g_erkrs
ls_item_nn-budat
ls_item_nn-frwae
l_value_for
l_waers_ledger_nn
'L'
CHANGING l_rate
<value>.
ENDIF. "l_convert_ind
*-
ELSEIF it_dbtable-datatype EQ 'QUAN'.
<value> = <value_source>.
*-
ELSEIF it_dbtable-datatype EQ 'UNIT'.
<value> = <value_source>.
*-
ENDIF. "it_dbtable-datatype
*-
MODIFY gt_item FROM ls_item_nn.
*-
ENDIF. "sy-subrc assign
ENDIF.
ENDLOOP. "lt_field
*-
ENDIF.
ENDLOOP. "gt_item
ENDLOOP. "it_paledger
ENDFORM. "copy_value_curr_types
*–––––––––––––––––––––––-*
* FORM CONVERT_TO_LF_CURRENCY
*–––––––––––––––––––––––-*
* Waehrungsumrechnung
*–––––––––––––––––––––––-*
* –> ERKRS Ergebnisbereich
* DATE Datum
* CURRENCY_FROM Quellwaehrung
* AMOUNT_FROM Betrag
* CURRENCY_TO Zielwaehrung
* CONVERT_TO Konvertierung Local/Foreign
* <– RATE Kurs
* AMOUNT_TO umgerechneter Betrag
*–––––––––––––––––––––––-*
FORM convert_to_lf_currency USING i_erkrs
i_date
i_currency_from
i_amount_from
i_currency_to
i_convert_to
CHANGING x_rate
e_amount_to.
CLEAR e_amount_to.
CALL FUNCTION 'COPA_CONVERT_TO_LF_CURRENCY'
EXPORTING
i_erkrs = i_erkrs
i_date = i_date
i_currency_from = i_currency_from
i_amount_from = i_amount_from
i_currency_to = i_currency_to
i_rate = x_rate
i_type_of_rate = 'M'
i_convert_to = i_convert_to
IMPORTING
e_exchange_rate = x_rate
e_amount_to = e_amount_to
EXCEPTIONS
conversion_error = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING conversion_error.
ENDIF.
ENDFORM. "convert_to_lf_currency
*&–––––––––––––––––––––––*
*& Form GET_CURRENCY
*&–––––––––––––––––––––––*
* Holen der Waehrung zum Ledger
*–––––––––––––––––––––––-*
* –> ERKRS Ergebnisbereich *
* –> PALEDGER Ledger *
* –> BUKRS Buchungskreis *
* <– V_CURR Waehrung *
*–––––––––––––––––––––––-*
FORM get_currency USING i_erkrs
i_paledger
i_bukrs
CHANGING et_v_curr TYPE rkea1_t_v_curr.
CLEAR et_v_curr[].
CALL FUNCTION 'RKE_CURRENCIES_GET'
EXPORTING
i_erkrs = i_erkrs
i_paledger = i_paledger
i_bukrs = i_bukrs
IMPORTING
et_v_curr = et_v_curr
EXCEPTIONS
erkrs_not_defined = 1
paledger_not_defined = 2
bukrs_not_defined = 3
OTHERS = 4.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " GET_CURRENCY
*–––––––––––––––––––––––-*
* FORM APPEND_ITEMS
*–––––––––––––––––––––––-*
* Aufbau interner Tabelle mit zu verbuchenden Einzelposten
*–––––––––––––––––––––––-*
* <-> FIRST_C Flag für Refresh bei erstem Aufruf
* <-> MIX_LEDGER Flag, falls Anzahl Ledger abweichend v. aktiven
* Ledgern
*–––––––––––––––––––––––-*
FORM append_items CHANGING x_first_c
x_mix_ledger.
DATA: ls_item TYPE ys_ce1,
ls_item_log TYPE ys_ce0,
ls_item_val TYPE ys_item_val,
l_log_active TYPE c,
l_log_test TYPE c,
l_last_belnr TYPE cest1-belnr. "444780
STATICS: la_item_index LIKE sy-index.
* reset flag for first call
IF x_first_c EQ 'X'.
CLEAR gt_item_post[].
x_first_c = ' '.
CLEAR la_item_index.
ENDIF.
* append items to log
CALL FUNCTION 'COPA_DOCUMENT_LOG'
EXPORTING
i_action = 'L'
IMPORTING
e_log_active = l_log_active
e_test = l_log_test.
* count temporary document index
ADD 1 TO la_item_index.
*-
* Append items with temporary document number to internal table
* that will be posted
*-
LOOP AT gt_item INTO ls_item WHERE copa_bwzpt IS INITIAL. "HW369945
IF l_last_belnr <> ls_item-belnr. "HW622885
la_item_index = la_item_index + 1.
l_last_belnr = ls_item-belnr.
ENDIF.
*-
* Delete zero items first …
*-
MOVE-CORRESPONDING ls_item TO ls_item_val.
IF ls_item_val IS INITIAL.
DELETE gt_item.
x_mix_ledger = 'X'.
CONTINUE.
ENDIF.
ls_item-belnr = la_item_index.
* Caution! temporary document number is needed for determination of
* final document number and posting
APPEND ls_item TO gt_item_post.
IF ( NOT l_log_active IS INITIAL ) AND
( NOT l_log_test IS INITIAL ).
PERFORM append_log USING ls_item.
ENDIF.
*- log table KE4ST (test mode only!)
IF NOT l_log_test IS INITIAL. "n_907398
MOVE-CORRESPONDING ls_item TO ls_item_log.
APPEND ls_item_log TO gt_item_log.
ENDIF.
ENDLOOP.
* append revaluated items with temporary document number to internal
* table that will be posted
LOOP AT gt_item INTO ls_item WHERE NOT copa_bwzpt IS INITIAL."HW369945
IF l_last_belnr <> ls_item-belnr. "444780
la_item_index = la_item_index + 1.
l_last_belnr = ls_item-belnr.
ENDIF.
*-
* Delete zero items first …
*-
MOVE-CORRESPONDING ls_item TO ls_item_val.
IF ls_item_val IS INITIAL.
DELETE gt_item.
x_mix_ledger = 'X'.
CONTINUE.
ENDIF.
* add 1 to la_item_index.
ls_item-belnr = la_item_index.
* Caution! temporary document number is needed for determination of
* final document number and posting
APPEND ls_item TO gt_item_post.
IF ( NOT l_log_active IS INITIAL ) AND
( NOT l_log_test IS INITIAL ).
PERFORM append_log USING ls_item.
ENDIF.
*- log table KE4ST (test mode only!)
IF NOT l_log_test IS INITIAL. "n_907398
MOVE-CORRESPONDING ls_item TO ls_item_log.
APPEND ls_item_log TO gt_item_log.
ENDIF.
ENDLOOP.
*-
* Initialize data for next item …
*-
CLEAR: gs_item,
gt_item,
gt_item[].
ENDFORM. "append_items
*–––––––––––––––––––––––-*
* FORM REVERSE_ITEM_SD *
*–––––––––––––––––––––––-*
* Routine ermittelt im Stornofall Einzelposten zu Faktura *
* und bereitet Storno-EP vor *
*–––––––––––––––––––––––-*
* –> ACCIT RW-Beleg Position *
* –> V_TKEBL Ledger/Waehrungstyp *
* –> FIRST_C Flag erster Aufruf *
* <– SUBRC Sy-Subrc *
*–––––––––––––––––––––––-*
FORM reverse_item_sd TABLES it_dbtable STRUCTURE gs_dbtable
USING is_accit STRUCTURE accit
it_v_tkebl TYPE rkea1_t_v_tkebl
x_first_c
e_subrc.
DATA: lt_item_rev TYPE ys_ce1 OCCURS 0 WITH HEADER LINE.
DATA: l_subrc LIKE sy-subrc.
IF x_first_c EQ 'X'.
REFRESH gt_item.
CLEAR gt_ref_pv[].
x_first_c = ' '.
ENDIF.
* check active ledgers
DESCRIBE TABLE it_v_tkebl LINES g_lin.
IF g_lin EQ 0.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
*-
* Fetch items for cancellation
*-
SELECT * FROM (c_ce1name) INTO TABLE lt_item_rev
WHERE vrgar = 'F' AND
rbeln = is_accit-awref_rev AND
rposn = is_accit-posnr_sd AND
( copa_aworg = is_accit-aworg_rev OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
( copa_awtyp = is_accit-awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
copa_bwzpt = ' '.
e_subrc = sy-subrc.
SORT lt_item_rev BY belnr posnr paledger.
IF e_subrc = 0.
PERFORM reverse_items_check CHANGING lt_item_rev[].
PERFORM get_items_periodic_val USING g_erkrs
'F'
CHANGING lt_item_rev[]
gt_ref_pv.
LOOP AT lt_item_rev.
READ TABLE it_v_tkebl INTO gs_v_tkebl
WITH KEY erkrs = g_erkrs
paledger = lt_item_rev-paledger
BINARY SEARCH.
l_subrc = sy-subrc.
IF l_subrc NE 0.
* Don't process item whose ledger is not active any more
DELETE lt_item_rev.
ENDIF.
CHECK l_subrc EQ 0.
MOVE lt_item_rev-belnr TO lt_item_rev-sto_belnr.
MOVE lt_item_rev-posnr TO lt_item_rev-sto_posnr.
* clear lt_item_rev-belnr. "0391865
* clear lt_item_rev-posnr.
PERFORM get_criteria_for_paobjnr USING lt_item_rev.
*-
MOVE is_accit-awref TO lt_item_rev-rbeln.
MOVE is_accit-posnr_sd TO lt_item_rev-rposn.
MOVE is_accit-awtyp TO lt_item_rev-copa_awtyp.
MOVE is_accit-aworg TO lt_item_rev-copa_aworg.
MOVE is_accit-fkart TO lt_item_rev-fkart.
*-
CLEAR lt_item_rev-paobjnr.
*-
MOVE is_accit-fkdat TO lt_item_rev-fadat.
MOVE is_accit-budat TO lt_item_rev-budat.
PERFORM alt_perio USING lt_item_rev
is_accit-budat
is_accit-monat
g_erkrs
' '.
MOVE lt_item_rev-perio(4) TO lt_item_rev-gjahr.
MOVE lt_item_rev-perio+4(3) TO lt_item_rev-perde.
MOVE sy-datum TO lt_item_rev-hzdat.
MOVE sy-uname TO lt_item_rev-usnam.
MULTIPLY-CORRESPONDING lt_item_rev BY gs_reverse_item.
MODIFY lt_item_rev.
ENDLOOP. "lt_item_rev
APPEND LINES OF lt_item_rev TO gt_item.
g_reverse = 'X'.
ENDIF.
ENDFORM. "reverse_item_sd
*–––––––––––––––––––––––*
* FORM get_items_periodic_val *
*–––––––––––––––––––––––*
* Selection of periodically valuated items for passed items *
*–––––––––––––––––––––––*
* –> i_erkrs operating concern *
* –> i_vrgar record type *
* <-> xt_item line items *
* <-> xt_ref_pv table with references *
*–––––––––––––––––––––––*
FORM get_items_periodic_val USING i_erkrs
i_vrgar
CHANGING xt_item TYPE yt_ce1
xt_ref_pv TYPE yt_ref_pv.
DATA: l_subrc_pv LIKE sy-subrc,
lt_item_pv TYPE yt_ce1,
ls_item_pv TYPE ys_ce1,
ls_ref_pv TYPE ys_ref.
*-
* Check whether there are items to be reversed …
*-
READ TABLE xt_item INDEX 1
TRANSPORTING NO FIELDS.
CHECK sy-subrc EQ 0.
*-
* Check if periodic valuation is used …
*-
CALL FUNCTION 'COPA_CHECK_PERIODIC_VAL_ACTIVE'
EXPORTING
i_erkrs = i_erkrs
i_vrgar = i_vrgar
IMPORTING
e_subrc = l_subrc_pv.
CHECK l_subrc_pv EQ 0.
*-
* Select periodically valuated items for documents …
*-
SELECT * FROM (c_ce1name) INTO TABLE lt_item_pv
FOR ALL ENTRIES IN xt_item
WHERE vrgar = xt_item-vrgar
AND paledger = xt_item-paledger
AND rbeln = xt_item-belnr
AND rposn = xt_item-posnr
AND copa_bwzpt = '1'.
IF sy-subrc EQ 0.
*-
* keep table with items sorted
SORT lt_item_pv BY belnr posnr paledger.
LOOP AT lt_item_pv INTO ls_item_pv.
* append per.val. items into table of items
APPEND ls_item_pv TO xt_item.
* save reference "per.val. item <-> orig. item"
ls_ref_pv-belnr = ls_item_pv-belnr.
ls_ref_pv-posnr = ls_item_pv-posnr.
ls_ref_pv-refnr = ls_item_pv-rbeln.
ls_ref_pv-refpo = ls_item_pv-rposn.
INSERT ls_ref_pv INTO TABLE xt_ref_pv.
ENDLOOP.
*-
ENDIF.
ENDFORM. "get_items_periodic_val
*–––––––––––––––––––––––-*
* FORM REVERSE_ITEM_ALL *
*–––––––––––––––––––––––-*
* Prepare items for reversal *
*–––––––––––––––––––––––-*
* –> ACCREV ACC-Doc reversal reference *
* –> REC_TYPE record type *
* –> V_TKEBL Ledger/currency type *
* –> CHECK merely check if item is existing *
* <-> FIRST_C first call *
* <– SUBRC Sy-Subrc *
*–––––––––––––––––––––––-*
FORM reverse_item_all USING is_accrev TYPE accrev
i_rec_type
it_v_tkebl TYPE rkea1_t_v_tkebl
i_check
CHANGING x_first_c
e_subrc.
DATA: l_subrc LIKE sy-subrc,
ls_item_rev TYPE ys_item.
STATICS: lat_item_rev TYPE ys_item OCCURS 0 WITH HEADER LINE,
las_accrev TYPE accrev,
la_subrc LIKE sy-subrc.
CLEAR: e_subrc.
IF x_first_c EQ 'X'.
REFRESH gt_item.
CLEAR gt_ref_pv[].
x_first_c = ' '.
CLEAR: lat_item_rev[], "HW606911
las_accrev,
la_subrc.
ENDIF.
*-
* Check active ledgers …
*-
DESCRIBE TABLE it_v_tkebl LINES g_lin.
IF g_lin EQ 0.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
IF is_accrev NE las_accrev.
*-
* Fetch items for cancellation …
*-
CLEAR: lat_item_rev[].
CASE i_rec_type.
*-
WHEN rkei1_ycs_rec_type-b.
*-
IF is_accrev-awtyp(1) CA 'YZ' "n_721161
OR is_accrev-awtyp EQ 'IDOC'
OR is_accrev-awtyp EQ 'BKPFF' "(note 561175) "n_867943
OR is_accrev-awtyp EQ 'BEBD'. "n_1593239 claim settlement CRM
*-
* Bapi postings
*-
SELECT *
FROM (c_ce1name)
INTO TABLE lat_item_rev
WHERE
vrgar = i_rec_type AND
rbeln = is_accrev-awref_rev AND
* bukrs can't be used for selection due to incomplete cancellation
* of cross company postings
* bukrs = is_accrev-bukrs and
copa_aworg = is_accrev-aworg_rev AND
copa_awtyp = is_accrev-awtyp.
ELSEIF is_accrev-awtyp EQ rkei1_ycs_awtyp-tr_tm "n_731744
*- Treasury document – note 337982
OR is_accrev-awtyp EQ 'CAJO' "n_753546
*- Cash Journal posting
OR is_accrev-awtyp EQ 'FKKSU'
OR is_accrev-awtyp EQ 'FKKCO'
*- Postings from FI-CA
OR is_accrev-awtyp EQ 'WTYD'.
*- Warranty Claim
SELECT * FROM (c_ce1name) INTO TABLE lat_item_rev
WHERE vrgar = i_rec_type AND
rbeln = is_accrev-awref_rev AND
bukrs = is_accrev-bukrs AND
copa_aworg = is_accrev-aworg_rev AND
copa_awtyp = is_accrev-awtyp.
ELSE.
SELECT * FROM (c_ce1name) INTO TABLE lat_item_rev
WHERE vrgar = i_rec_type AND
rbeln = is_accrev-awref_rev AND
gjahr = is_accrev-aworg_rev+4(4) AND
bukrs = is_accrev-aworg_rev(4) AND
( copa_aworg = is_accrev-aworg_rev OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
( copa_awtyp = is_accrev-awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
copa_bwzpt = ' '.
ENDIF.
*-
WHEN rkei1_ycs_rec_type-f.
*-
SELECT * FROM (c_ce1name) INTO TABLE lat_item_rev
WHERE vrgar = i_rec_type AND
rbeln = is_accrev-awref_rev AND
( copa_aworg = is_accrev-aworg_rev OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
( copa_awtyp = is_accrev-awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
copa_bwzpt = ' '.
ENDCASE.
la_subrc = sy-subrc.
las_accrev = is_accrev.
DELETE lat_item_rev WHERE copa_bwzpt EQ '1'.
ENDIF. "is_accrev
e_subrc = la_subrc.
CHECK i_check IS INITIAL.
SORT lat_item_rev BY belnr posnr paledger.
IF e_subrc = 0.
PERFORM reverse_items_check CHANGING lat_item_rev[].
PERFORM get_items_periodic_val USING g_erkrs
i_rec_type
CHANGING lat_item_rev[]
gt_ref_pv.
LOOP AT lat_item_rev INTO ls_item_rev.
READ TABLE it_v_tkebl INTO gs_v_tkebl
WITH KEY erkrs = g_erkrs
paledger = ls_item_rev-paledger
BINARY SEARCH.
l_subrc = sy-subrc.
IF l_subrc NE 0.
* Don't process item whose ledger is not active any more
DELETE TABLE lat_item_rev FROM ls_item_rev.
ENDIF.
CHECK l_subrc EQ 0.
MOVE ls_item_rev-belnr TO ls_item_rev-sto_belnr.
MOVE ls_item_rev-posnr TO ls_item_rev-sto_posnr.
* clear: ls_item_rev-belnr, 0391865
* ls_item_rev-posnr.
PERFORM get_criteria_for_paobjnr USING ls_item_rev.
MOVE is_accrev-awref TO ls_item_rev-rbeln.
MOVE is_accrev-awtyp TO ls_item_rev-copa_awtyp.
MOVE is_accrev-aworg TO ls_item_rev-copa_aworg.
MOVE is_accrev-fkart TO ls_item_rev-fkart.
*-
CLEAR ls_item_rev-paobjnr.
*-
MOVE is_accrev-budat TO ls_item_rev-fadat.
MOVE is_accrev-budat TO ls_item_rev-budat.
PERFORM alt_perio USING ls_item_rev
is_accrev-budat
is_accrev-monat "n_565728
g_erkrs
' '.
MOVE ls_item_rev-perio(4) TO ls_item_rev-gjahr.
MOVE ls_item_rev-perio+4(3) TO ls_item_rev-perde.
MOVE sy-datum TO ls_item_rev-hzdat.
MOVE sy-uname TO ls_item_rev-usnam.
MULTIPLY-CORRESPONDING ls_item_rev BY gs_reverse_item.
MODIFY lat_item_rev FROM ls_item_rev.
ENDLOOP. "lat_item_rev
APPEND LINES OF lat_item_rev TO gt_item.
g_reverse = 'X'.
ENDIF.
ENDFORM. "reverse_item_all
*–––––––––––––––––––––––-*
* FORM REVERSE_OLD_ITEMS *
*–––––––––––––––––––––––-*
* Read existing items and reverse sign for cancellation *
*–––––––––––––––––––––––-*
* –> ACCREV ACC-Doc reversal reference *
* –> REC_TYPE record type *
* –> V_TKEBL Ledger/currency type *
* <-> FIRST_C first call *
* <– SUBRC Sy-Subrc *
*–––––––––––––––––––––––-*
FORM reverse_old_items USING is_accrev STRUCTURE accrev
i_rec_type
it_v_tkebl TYPE rkea1_t_v_tkebl
CHANGING x_first_c
e_subrc.
DATA: lt_item_rev TYPE ys_item OCCURS 0 WITH HEADER LINE.
DATA: l_subrc LIKE sy-subrc.
CLEAR: e_subrc.
IF x_first_c EQ 'X'.
REFRESH gt_item_rev.
* CLEAR gt_ref_pv[]. n_935471
x_first_c = ' '.
ENDIF.
*-
* Check active ledgers …
*-
DESCRIBE TABLE it_v_tkebl LINES g_lin.
IF g_lin EQ 0.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
*-
* Fetch items for cancellation …
*-
CASE i_rec_type.
*-
WHEN rkei1_ycs_rec_type-b.
*-
SELECT * FROM (c_ce1name) INTO TABLE lt_item_rev
WHERE vrgar = i_rec_type AND
rbeln = is_accrev-awref_rev AND
gjahr = is_accrev-aworg_rev+4(4) AND
bukrs = is_accrev-aworg_rev(4) AND
( copa_aworg = is_accrev-aworg_rev OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
( copa_awtyp = is_accrev-awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
copa_bwzpt = ' '.
*-
WHEN rkei1_ycs_rec_type-f.
*-
SELECT * FROM (c_ce1name) INTO TABLE lt_item_rev
WHERE vrgar = i_rec_type AND
rbeln = is_accrev-awref_rev AND
( copa_aworg = is_accrev-aworg_rev OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
( copa_awtyp = is_accrev-awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
copa_bwzpt = ' '.
*-
ENDCASE.
e_subrc = sy-subrc.
IF e_subrc = 0.
SORT lt_item_rev BY belnr posnr paledger. "0444780
PERFORM reverse_items_check CHANGING lt_item_rev[].
PERFORM get_items_periodic_val USING g_erkrs
i_rec_type
CHANGING lt_item_rev[]
gt_ref_pv.
*-
* Prepare items to be reversed …
*-
LOOP AT lt_item_rev.
READ TABLE it_v_tkebl INTO gs_v_tkebl
WITH KEY erkrs = g_erkrs
paledger = lt_item_rev-paledger
BINARY SEARCH.
l_subrc = sy-subrc.
IF l_subrc NE 0.
* Don't process item whose ledger is not active any more
DELETE lt_item_rev.
ENDIF.
CHECK l_subrc EQ 0.
MOVE lt_item_rev-belnr TO lt_item_rev-sto_belnr.
MOVE lt_item_rev-posnr TO lt_item_rev-sto_posnr.
* clear lt_item_rev-belnr. "0391865
* clear lt_item_rev-posnr.
PERFORM get_criteria_for_paobjnr USING lt_item_rev.
MOVE sy-datum TO lt_item_rev-hzdat.
MOVE sy-uname TO lt_item_rev-usnam.
MULTIPLY-CORRESPONDING lt_item_rev BY gs_reverse_item.
MODIFY lt_item_rev.
ENDLOOP. "lt_item_rev
APPEND LINES OF lt_item_rev TO gt_item_rev.
g_reverse = 'X'.
ENDIF.
ENDFORM. "reverse_old_items
*–––––––––––––––––––––––-*
* FORM APPEND_OLD_ITEMS
*–––––––––––––––––––––––-*
* Build table with items to be reversed
*–––––––––––––––––––––––-*
* –> FIRST_C Flag für Refresh bei erstem Aufruf
*–––––––––––––––––––––––-*
FORM append_old_items USING it_tkebl TYPE rkea1_t_v_tkebl
CHANGING x_first_c
x_mix_ledger.
DATA: ls_item_rev TYPE ys_ce1,
l_log_active TYPE c,
l_log_test TYPE c.
STATICS: la_item_index LIKE sy-index.
*-
* Determine mix_ledger …
*-
IF x_mix_ledger IS INITIAL.
PERFORM get_mix_ledger USING it_tkebl
'GT_ITEM_REV'
CHANGING x_mix_ledger.
ENDIF.
IF x_mix_ledger IS INITIAL.
*-
* Reset flag for first call …
*-
IF x_first_c EQ 'X'.
CLEAR gt_item_post_rev[].
x_first_c = ' '.
CLEAR la_item_index.
ENDIF.
*-
* Append items to log …
*-
CALL FUNCTION 'COPA_DOCUMENT_LOG'
EXPORTING
i_action = 'L'
IMPORTING
e_log_active = l_log_active
e_test = l_log_test.
* count temporary document index
* add 1 to la_item_index. "HW361915
*-
* Append items with temporary document number to internal table
* that will be posted
*-
LOOP AT gt_item_rev INTO ls_item_rev.
* count temporary document index
ADD 1 TO la_item_index. "HW361915
ls_item_rev-belnr = la_item_index.
* Caution! temporary document number is needed for determination of
* final document number and posting
APPEND ls_item_rev TO gt_item_post_rev.
IF ( NOT l_log_active IS INITIAL ) AND
( NOT l_log_test IS INITIAL ).
PERFORM append_log USING ls_item_rev.
ENDIF.
ENDLOOP.
*-
* Initialize data for next item …
*-
CLEAR: gt_item_rev[].
ELSE.
PERFORM append_mix_items USING it_tkebl
'GT_ITEM_REV'
CHANGING x_first_c.
ENDIF.
ENDFORM. "append_old_items
*–––––––––––––––––––––––*
* FORM ITEM_SIGN_REVERSE *
*–––––––––––––––––––––––*
* Umkehr Vorzeichen Einzelposten fuer Stornierung *
*–––––––––––––––––––––––*
* –> TABNAME Tabellenname fuer Struktur Einzelposten *
* –> ITEM Einzelposten *
*–––––––––––––––––––––––*
FORM item_sign_reverse USING value(i_tabname)
CHANGING xs_item.
DATA: ls_item1 TYPE ys_ce1,
ls_item0 TYPE ys_ce0,
l_tabname LIKE dd03p-tabname.
l_tabname = i_tabname.
CASE l_tabname(3).
*-
WHEN 'CE0'.
*-
ls_item0 = xs_item.
MULTIPLY-CORRESPONDING ls_item0 BY gs_reverse_item.
xs_item = ls_item0.
*-
WHEN 'CE1'.
*-
ls_item1 = xs_item.
MULTIPLY-CORRESPONDING ls_item1 BY gs_reverse_item.
xs_item = ls_item1.
*-
WHEN OTHERS.
* CO-PA: invalid structure for sign reverse
RAISE program_error.
*-
ENDCASE.
ENDFORM. "item_sign_reverse
*–––––––––––––––––––––––-*
* FORM MOVE_VALUE_FIELDS_FI
*–––––––––––––––––––––––-*
* Uebernahme Buchhaltungsbeleg Werte/Mengen in Einzelposten
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab
* –> V_TKEBL Ledger/Waehrungstyp
* –> FCURR Fremdwährung
* –> CSKBV Kostenart
* –> ACCIT RW-Beleg Position
* –> ACCIT_AX RW-Beleg Position – Anhang
* –> ACCCR RW-Beleg Waehrung
*–––––––––––––––––––––––-*
FORM move_value_fields_fi TABLES
it_dbtable STRUCTURE gs_dbtable
USING
is_v_tkebl TYPE rkea1_v_tkebl
i_fcurr
is_cskbv LIKE cskbv
is_accit TYPE rkei1_ys_accit
is_accit_ax TYPE rkei1_ys_accit_ax
is_acccr TYPE rkei1_ys_acccr
CHANGING
x_value_moved TYPE c .
DATA: ls_dbtable_key TYPE ys_dbtable_key,
ls_item TYPE ys_ce1,
ls_tkeadpc00 LIKE tkeadpc00,
l_erzuo LIKE tkb9f-erzuo,
l_ersch LIKE tkevg-ersch,
l_index LIKE sy-index,
l_xvalue LIKE bseg-dmbtr,
l_acc_type(3) TYPE c,
l_acccr_wrbtr TYPE acccr-wrbtr, "HW617334
l_accit_menge TYPE accit-menge.
CONSTANTS: c_credit_posting TYPE accit-shkzg VALUE 'H', "HW616279
c_debit_posting TYPE accit-shkzg VALUE 'S'.
ls_dbtable_key-tabname = c_ce0name.
*-
* Check if cost-element or account (transfer prices) must be moved …
*-
IF ( is_accit_ax-tp_rel IS INITIAL )
OR ( is_acccr-curtp+1(1) = '0' ) . "HW319156
*
*.A) move cost element: determine settlement structure……………. *
*
CALL FUNCTION 'COPA_GET_SETTLEMENT_STRUCTURE'
EXPORTING
i_erkrs = g_erkrs
i_vrgng = 'RFBU'
i_hkont = is_accit-hkont
i_kokrs = is_accit-kokrs
IMPORTING
e_ersch = l_ersch
e_erzuo = l_erzuo
TABLES
t_tkb9f = gt_int_tkb9f
EXCEPTIONS
incomplete_structure = 1
error_structure = 2
OTHERS = 3.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING error.
ENDIF.
*-
* Move values and quantities …
*-
CLEAR l_xvalue.
LOOP AT gt_int_tkb9f WHERE erkrs = g_erkrs AND
ersch = l_ersch AND
erzuo = l_erzuo.
* In case of revenue recognition quantities are transferred within
* 'move_quantities_sd'
IF gt_int_tkb9f-mwkz = '2'
AND NOT is_accit-rrrel IS INITIAL.
CONTINUE. "HW617334
ENDIF.
ls_dbtable_key-tabname+3(4) = g_erkrs.
ls_dbtable_key-fieldname = gt_int_tkb9f-wrtfld.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
IF sy-subrc = 0.
CLEAR ls_item.
READ TABLE gt_item INTO ls_item
WITH KEY paledger = is_v_tkebl-paledger
BINARY SEARCH.
l_index = sy-tabix.
IF sy-subrc NE 0.
MESSAGE ID 'KE' TYPE 'E' NUMBER '475' WITH 'RFBU'
is_accit-awref.
ENDIF.
ASSIGN COMPONENT it_dbtable-pos_ce1 OF STRUCTURE ls_item
TO <value> TYPE it_dbtable-inttype
DECIMALS it_dbtable-decimals.
*-
* Move unit of measure …
*-
IF gt_int_tkb9f-mwkz = '2'.
CONCATENATE gt_int_tkb9f-wrtfld
c_uom
INTO ls_dbtable_key-fieldname.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
IF sy-subrc = 0.
ASSIGN COMPONENT it_dbtable-pos_ce1 OF STRUCTURE ls_item
TO <uom>.
<uom> = is_accit-meins.
ENDIF.
ENDIF.
*-
* Move values and quantities …
*-
IF gt_int_tkb9f-mwkz IS INITIAL. "Default = Betragsfeld
gt_int_tkb9f-mwkz = '1'.
ENDIF.
l_acccr_wrbtr = is_acccr-wrbtr. "HW617334
l_accit_menge = is_accit-menge.
*-
* +/- sign logic (Be cautious with program changes here!):
* values in the ACC-Doc have the FI sign; that is positive for debit
* postings (S) and negative for credit postings (H); Caution!
* quantities always have a positive sign in the ACC-Doc
*-
IF kstar_erlo CS is_cskbv-katyp.
*-
* Revenue: reverse sign …
*-
IF gt_int_tkb9f-mwkz EQ '1'.
l_acccr_wrbtr = l_acccr_wrbtr * -1.
ELSE.
IF is_acccr-wrbtr GT 0 "HW616279
OR ( is_acccr-wrbtr EQ 0
AND is_accit-shkzg EQ c_debit_posting ).
l_accit_menge = l_accit_menge * -1.
ENDIF.
ENDIF.
*-
ELSE.
*-
* Cost and revenue deductions …
*-
IF gt_int_tkb9f-mwkz EQ '2' "HW616279
AND ( ( is_acccr-wrbtr LT 0 )
OR ( is_acccr-wrbtr EQ 0
AND is_accit-shkzg EQ c_credit_posting ) ).
l_accit_menge = l_accit_menge * -1.
ENDIF.
ENDIF.
CASE gt_int_tkb9f-mwkz.
WHEN '1'.
* Value
<value> = <value> + l_acccr_wrbtr.
l_xvalue = l_xvalue + is_acccr-wrbtr.
WHEN '2'.
* Quantity
<value> = l_accit_menge.
ENDCASE.
ELSE.
* CO-PA: error reading fieldtab
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
ls_item-kursf = is_acccr-kursf.
ls_item-frwae = i_fcurr.
MODIFY gt_item FROM ls_item INDEX l_index.
x_value_moved = 'X' .
ENDLOOP. "gt_int_tkb9f…
* check if values have been transferred completely
IF l_xvalue NE is_acccr-wrbtr.
MESSAGE ID 'KF' TYPE 'E' NUMBER '009' WITH l_ersch l_erzuo
g_erkrs
RAISING wrong_assignment.
ENDIF.
ELSE.
*
*.B) move account: determine account assignment………………….. *
*
CALL FUNCTION 'COPA_TP_CHECK_ACCOUNT'
EXPORTING
i_erkrs = g_erkrs
i_kokrs = is_accit-kokrs
i_hkont = is_accit-hkont
IMPORTING
es_tkeadpc00 = ls_tkeadpc00
EXCEPTIONS
account_not_assigned = 1
assignment_incomplete = 2
OTHERS = 3.
IF sy-subrc <> 0.
* CO-PA: inconsistency reading account assignment
* for transfer prices
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
*-
* Move amounts and quantities ….
*-
CLEAR l_xvalue.
*-
* Assign value field …
*-
ls_dbtable_key-tabname+3(4) = g_erkrs.
ls_dbtable_key-fieldname = ls_tkeadpc00-valfi.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
IF sy-subrc = 0.
CLEAR ls_item.
READ TABLE gt_item INTO ls_item
WITH KEY paledger = is_v_tkebl-paledger
BINARY SEARCH.
l_index = sy-tabix.
IF sy-subrc NE 0.
MESSAGE ID 'KE' TYPE 'E' NUMBER '475' WITH 'RFBU'
is_accit-awref.
ENDIF.
ASSIGN COMPONENT it_dbtable-pos_ce1 OF STRUCTURE ls_item
TO <value> TYPE it_dbtable-inttype
DECIMALS it_dbtable-decimals.
*-
* Assign quanitity field …
*-
IF NOT ls_tkeadpc00-menge IS INITIAL.
ls_dbtable_key-fieldname = ls_tkeadpc00-menge.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
IF sy-subrc = 0.
ASSIGN COMPONENT it_dbtable-pos_ce1 OF STRUCTURE ls_item
TO <quantity> TYPE it_dbtable-inttype
DECIMALS it_dbtable-decimals.
ELSE.
* CO-PA: error reading fieldtab
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
CONCATENATE ls_tkeadpc00-menge c_uom
INTO ls_dbtable_key-fieldname.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
IF sy-subrc = 0.
ASSIGN COMPONENT it_dbtable-pos_ce1 OF STRUCTURE ls_item
TO <uom>.
ELSE.
* CO-PA: error reading fieldtab
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
ENDIF.
*-
* +/- sign logic (Be cautious with program changes here!):
* values in the ACC-Doc have the FI sign; that is positive for debit
* postings (S) and negative for credit postings (H); Caution!
* quantities always have a positive sign in the ACC-Doc!
*-
PERFORM tp_check_account_type USING is_accit
CHANGING l_acc_type.
*-
* Move values and quantities …
*-
IF NOT ls_tkeadpc00-valfi IS INITIAL.
*-
* Move value …
*-
<value> = <value> + is_acccr-wrbtr.
*-
CASE l_acc_type.
WHEN 'ERL'.
* Revenue account
<value> = <value> * -1.
WHEN OTHERS.
* Cost account
ENDCASE.
IF NOT ls_tkeadpc00-menge IS INITIAL.
*-
* Move quantity …
*-
<quantity> = is_accit-menge.
<uom> = is_accit-meins.
*-
CASE l_acc_type.
WHEN 'ERL'.
* Revenue account credit posting …
IF is_acccr-wrbtr GT 0
OR ( is_acccr-wrbtr EQ 0
AND is_accit-shkzg EQ c_debit_posting ).
<quantity> = <quantity> * -1.
ENDIF.
WHEN OTHERS.
* Cost account debit posting …
IF is_acccr-wrbtr LT 0
OR ( is_acccr-wrbtr EQ 0
AND is_accit-shkzg EQ c_credit_posting ).
<quantity> = <quantity> * -1.
ENDIF.
ENDCASE.
*-
ENDIF.
*-
ENDIF. "ls_tkeadpc00-valfi
*-
ELSE.
* CO-PA: error reading fieldtab
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
* Erlös- oder Kostenkonto interpretieren!!
ls_item-kursf = is_acccr-kursf.
ls_item-frwae = i_fcurr.
MODIFY gt_item FROM ls_item INDEX l_index.
x_value_moved = 'X' .
ENDIF. "is_accit_ax-tp_rel…
ENDFORM. "move_value_fields_fi
*–––––––––––––––––––––––*
* FORM TP_CHECK_ACCOUNT_TYPE *
*–––––––––––––––––––––––*
* Verprobung des Kontentyps bei internen Warenbewegungen für *
* die Fortschreibung von Prctr-Transferpreisen. *
* Dazu wird Tabelle T8A00 des EC-PCA gelesen! Die dort hinter- *
* legten Konten können im CO-PA über Tabelle TKEADPC00 fort- *
* geschrieben werden. *
*–––––––––––––––––––––––*
* –> ACCIT RW-Beleg Zeile *
* <– ACC_TYPE Typ des Kontos: Erlös oder nicht *
*–––––––––––––––––––––––*
FORM tp_check_account_type USING is_accit TYPE rkei1_ys_accit
CHANGING e_acc_type.
STATICS: lat_account TYPE yt_account_t8a00,
la_called TYPE c.
DATA: lt_t8a00 LIKE t8a00 OCCURS 0,
ls_t8a00 LIKE t8a00,
ls_account TYPE ys_account_t8a00,
l_not_found.
CLEAR: e_acc_type.
IF la_called IS INITIAL.
SELECT * FROM t8a00 INTO TABLE lt_t8a00 ORDER BY PRIMARY KEY.
LOOP AT lt_t8a00 INTO ls_t8a00.
AT NEW kokrs.
CLEAR ls_account.
ls_account-kokrs = ls_t8a00-kokrs.
ENDAT.
IF NOT ls_t8a00-pcerl IS INITIAL.
INSERT ls_t8a00-pcerl INTO TABLE ls_account-t_pcerl.
ENDIF.
IF NOT ls_t8a00-pcerl IS INITIAL.
INSERT ls_t8a00-pcdbv INTO TABLE ls_account-t_pcdbv.
ENDIF.
IF NOT ls_t8a00-pclva IS INITIAL.
INSERT ls_t8a00-pclva INTO TABLE ls_account-t_pclva.
ENDIF.
IF NOT ls_t8a00-pcdif IS INITIAL.
INSERT ls_t8a00-pcdif INTO TABLE ls_account-t_pcdif.
ENDIF.
AT END OF kokrs.
APPEND ls_account TO lat_account.
ENDAT.
ENDLOOP.
la_called = 'X'.
ENDIF.
l_not_found = 'X'.
READ TABLE lat_account INTO ls_account
WITH KEY kokrs = is_accit-kokrs.
IF sy-subrc EQ 0.
*-
* Check revenue account type …
*-
READ TABLE ls_account-t_pcerl WITH KEY = is_accit-hkont
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
CLEAR l_not_found.
e_acc_type = 'ERL'.
EXIT.
ENDIF.
*-
* Check other account types…
*-
READ TABLE ls_account-t_pcdbv WITH KEY = is_accit-hkont
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
CLEAR l_not_found.
e_acc_type = ' '.
EXIT.
ENDIF.
READ TABLE ls_account-t_pclva WITH KEY = is_accit-hkont
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
CLEAR l_not_found.
e_acc_type = ' '.
EXIT.
ENDIF.
READ TABLE ls_account-t_pcdif WITH KEY = is_accit-hkont
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
CLEAR l_not_found.
e_acc_type = ' '.
EXIT.
ENDIF.
ENDIF.
IF NOT l_not_found IS INITIAL.
* CO-PA inconsistency during check for transfer price accounts: entry
* from table TKEADPC00 not found in table T8A00
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
ENDFORM. "tp_check_account_type
*–––––––––––––––––––––––-*
* FORM REVERSE_ITEM_FI *
*–––––––––––––––––––––––-*
* Routine ermittelt im Stornofall Einzelposten zu FI-Beleg *
* und bereitet Storno-EP vor *
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab *
* –> ACCIT RW-Beleg Position *
* –> V_TKEBL Ledger/Waehrungstyp *
* –> FIRST_C Flag erster Aufruf *
* –> REC_TYPE Vorgangsart *
* <– SUBRC Sy-Subrc *
*–––––––––––––––––––––––-*
FORM reverse_item_fi TABLES it_dbtable STRUCTURE gs_dbtable
USING is_accit STRUCTURE accit
it_v_tkebl TYPE rkea1_t_v_tkebl
x_first_c
i_rec_type
e_subrc.
DATA: lt_item_rev TYPE ys_ce1 OCCURS 0 WITH HEADER LINE.
DATA: l_subrc LIKE sy-subrc.
IF x_first_c EQ 'X'.
REFRESH gt_item.
CLEAR gt_ref_pv[].
x_first_c = ' '.
ENDIF.
DESCRIBE TABLE it_v_tkebl LINES g_lin.
IF g_lin EQ 0.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
*-
* Fetch items for cancellation …
*-
IF is_accit-awtyp = rkei1_ycs_awtyp-ibkpf. "JW HW385631
*-
SELECT * FROM (c_ce1name) INTO TABLE lt_item_rev
WHERE vrgar = i_rec_type AND
rbeln = is_accit-awref_rev AND
gjahr = is_accit-gjahr AND
bukrs = is_accit-bukrs AND
( copa_aworg = is_accit-aworg_rev OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
( copa_awtyp = is_accit-awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
copa_bwzpt = ' '.
e_subrc = sy-subrc.
*-
ELSE.
*-
SELECT * FROM (c_ce1name) INTO TABLE lt_item_rev
WHERE vrgar = i_rec_type AND
rbeln = is_accit-awref_rev AND
gjahr = is_accit-aworg_rev+4(4) AND
bukrs = is_accit-bukrs AND
( copa_aworg = is_accit-aworg_rev OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
( copa_awtyp = is_accit-awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
copa_bwzpt = ' '.
e_subrc = sy-subrc.
*-
ENDIF.
SORT lt_item_rev BY belnr posnr paledger.
IF e_subrc = 0.
PERFORM reverse_items_check CHANGING lt_item_rev[].
PERFORM get_items_periodic_val USING g_erkrs
i_rec_type
CHANGING lt_item_rev[]
gt_ref_pv.
LOOP AT lt_item_rev.
* Check cross-company posting: Items with different ccode but
* identical reference (awref)
IF lt_item_rev-bukrs NE is_accit-bukrs.
e_subrc = '8'.
ENDIF.
CHECK e_subrc EQ '0'.
READ TABLE it_v_tkebl INTO gs_v_tkebl
WITH KEY erkrs = g_erkrs
paledger = lt_item_rev-paledger
BINARY SEARCH.
l_subrc = sy-subrc.
IF l_subrc NE 0.
* Don't process item whose ledger is not active any more
DELETE lt_item_rev.
ENDIF.
CHECK l_subrc EQ 0.
*-
* Create reversed item …
*-
MOVE lt_item_rev-belnr TO lt_item_rev-sto_belnr.
MOVE lt_item_rev-posnr TO lt_item_rev-sto_posnr.
* clear lt_item_rev-belnr. "0391865
* clear lt_item_rev-posnr.
PERFORM get_criteria_for_paobjnr USING lt_item_rev.
MOVE is_accit-awref TO lt_item_rev-rbeln.
MOVE is_accit-awtyp TO lt_item_rev-copa_awtyp.
MOVE is_accit-aworg TO lt_item_rev-copa_aworg.
MOVE is_accit-budat TO lt_item_rev-budat.
PERFORM alt_perio USING lt_item_rev
is_accit-budat
is_accit-monat
g_erkrs
' '.
MOVE lt_item_rev-perio(4) TO lt_item_rev-gjahr.
MOVE lt_item_rev-perio+4(3) TO lt_item_rev-perde.
MOVE sy-datum TO lt_item_rev-hzdat.
MOVE sy-uname TO lt_item_rev-usnam.
MULTIPLY-CORRESPONDING lt_item_rev BY gs_reverse_item.
MODIFY lt_item_rev
.
ENDLOOP. "lt_item_rev
APPEND LINES OF lt_item_rev TO gt_item.
g_reverse = 'X'.
ENDIF.
ENDFORM. "reverse_item_fi
*–––––––––––––––––––––––-*
* FORM REVERSE_ITEM_S *
*–––––––––––––––––––––––-*
* Routine storniert bei Verdichtung alle Einzelposten zu einem *
* Beleg und stellt Stornoposten in interne Tabelle *
* Prämisse: nur komplette Belege werden storniert; im CO-PA *
* ist RBELN aber nicht RPOSN versorgt *
* *
* Achtung bei Stornierung von uebergreifenden Vorgaengen im FI: *
* Die Transaktion FBU8 macht einen Call Transaction auf die *
* FB08 (Storno Einzelbeleg), d.h. jeder Beleg wird separat *
* storniert. Um zu verhindern, dass bei jedem Aufruf alle zum *
* uebergreifenden Vorgang gehoerigen Belege selektiert und somit *
* mehrfach gebucht werden, sind der Bukrs sowie Gjahr zu be- *
* ruecksichtigen (Merke: bei uebergr. Vorg. ist die RBELN fuer *
* alle erzeugten Belege identisch, da zum Zeitpunkt 'Post' *
* vom FI nur eine AWREF fuer alle erzeugten Belege uebergeben *
* wird). *
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab *
* –> ACCIT RW-Beleg Position *
* –> V_TKEBL Ledger/Waehrungstyp *
* –> FIRST_C Flag für ersten Aufruf *
* <– SUBRC Sy-Subrc *
* –> REC_TYPE Vorgangsart *
*–––––––––––––––––––––––-*
FORM reverse_item_s TABLES it_dbtable STRUCTURE gs_dbtable
USING is_accit STRUCTURE accit
it_v_tkebl TYPE rkea1_t_v_tkebl
x_first_c
e_subrc
i_rec_type.
DATA: lt_item_rev TYPE ys_ce1 OCCURS 0 WITH HEADER LINE.
DATA: l_subrc LIKE sy-subrc.
STATICS: la_awref_rev LIKE accit-awref_rev.
*-
* Cancellation may only be executed once per reference doc …
*-
CHECK la_awref_rev NE is_accit-awref_rev
OR x_first_c EQ 'X' .
*-
* Check active ledgers …
*-
DESCRIBE TABLE it_v_tkebl LINES g_lin.
IF g_lin EQ 0.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
IF x_first_c EQ 'X'.
REFRESH gt_item.
CLEAR gt_ref_pv[].
x_first_c = ' '.
ENDIF.
*-
* Fetch items for cancellation …
*-
IF is_accit-awtyp EQ rkei1_ycs_awtyp-bkpf.
*-
* FI documents …
*-
SELECT * FROM (c_ce1name) INTO TABLE lt_item_rev
WHERE vrgar = i_rec_type AND
rbeln = is_accit-awref_rev AND
gjahr = is_accit-aworg_rev+4(4) AND
bukrs = is_accit-bukrs AND
( copa_aworg = is_accit-aworg_rev OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
( copa_awtyp = is_accit-awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
copa_bwzpt = ' '.
*-
ELSEIF is_accit-awtyp EQ rkei1_ycs_awtyp-ibkpf OR "JW HW385631
is_accit-awtyp EQ 'BKPFF'. "HW 745991
*-
* Financial document IDoc …
*-
SELECT * FROM (c_ce1name) INTO TABLE lt_item_rev
WHERE vrgar = i_rec_type AND
rbeln = is_accit-awref_rev AND
gjahr = is_accit-gjahr AND
bukrs = is_accit-bukrs AND
( copa_aworg = is_accit-aworg_rev OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
( copa_awtyp = is_accit-awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
copa_bwzpt = ' '.
*-
ELSE.
*-
* Other documents …
*-
SELECT * FROM (c_ce1name) INTO TABLE lt_item_rev
WHERE vrgar = i_rec_type AND
rbeln = is_accit-awref_rev AND
( copa_aworg = is_accit-aworg_rev OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
( copa_awtyp = is_accit-awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
copa_bwzpt = ' '.
*-
ENDIF. "is_accit-awtyp
e_subrc = sy-subrc.
SORT lt_item_rev BY belnr posnr paledger.
IF e_subrc = 0.
la_awref_rev = is_accit-awref_rev.
PERFORM reverse_items_check CHANGING lt_item_rev[].
PERFORM get_items_periodic_val USING g_erkrs
i_rec_type
CHANGING lt_item_rev[]
gt_ref_pv.
LOOP AT lt_item_rev.
READ TABLE it_v_tkebl INTO gs_v_tkebl
WITH KEY erkrs = g_erkrs
paledger = lt_item_rev-paledger
BINARY SEARCH.
l_subrc = sy-subrc.
IF l_subrc NE 0.
* Don't process item whose ledger is not active any more
DELETE lt_item_rev.
ENDIF.
CHECK l_subrc EQ 0.
MOVE lt_item_rev-belnr TO lt_item_rev-sto_belnr.
MOVE lt_item_rev-posnr TO lt_item_rev-sto_posnr.
* clear lt_item_rev-belnr. "0391865
* clear lt_item_rev-posnr.
PERFORM get_criteria_for_paobjnr USING lt_item_rev.
MOVE is_accit-awref TO lt_item_rev-rbeln.
MOVE is_accit-awtyp TO lt_item_rev-copa_awtyp.
MOVE is_accit-aworg TO lt_item_rev-copa_aworg.
CASE i_rec_type.
*-
WHEN 'F'.
*_
MOVE is_accit-fkart TO lt_item_rev-fkart.
CLEAR lt_item_rev-paobjnr.
MOVE is_accit-fkdat TO lt_item_rev-fadat.
ENDCASE.
MOVE is_accit-budat TO lt_item_rev-budat.
PERFORM alt_perio USING lt_item_rev
is_accit-budat
is_accit-monat
g_erkrs
' '.
MOVE lt_item_rev-perio(4) TO lt_item_rev-gjahr.
MOVE lt_item_rev-perio+4(3) TO lt_item_rev-perde.
MOVE sy-datum TO lt_item_rev-hzdat.
MOVE sy-uname TO lt_item_rev-usnam.
*-
* Reverse sign of line item …
*-
MULTIPLY-CORRESPONDING lt_item_rev BY gs_reverse_item.
MODIFY lt_item_rev.
ENDLOOP. "lt_item_rev
APPEND LINES OF lt_item_rev TO gt_item.
g_reverse = 'X'.
ENDIF.
ENDFORM. "reverse_item_s
*–––––––––––––––––––––––-*
* FORM SUMMARIZE_NEW_ITEM
*–––––––––––––––––––––––-*
* Verdichtung der Einzelposten
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab
* –> FIRST_CS Flag für ersten Aufruf
* –> SMODE Verdichtungsmodus
*–––––––––––––––––––––––-*
FORM summarize_new_item TABLES
it_dbtable STRUCTURE gs_dbtable
USING
it_copied_ledger TYPE rkei1_yt_ledger
* must not contain more than one entry
x_first_c
i_smode
i_ledger
is_trace_mode TYPE rkei1_ys_trace_mode.
DATA: ls_item_field_s TYPE ys_field_s_entry,
ls_item TYPE ys_ce1,
ls_item_old TYPE ys_ce1,
ls_item_ce4 TYPE ys_ce4,
l_copied_ledger LIKE cest1-paledger,
ls_trace TYPE COPA_ACTUAL_DATA_TRACE,
ls_field_fix_s TYPE Y_FIELD_FIX_S,
ls_summarized TYPE YS_CE1.
IF NOT x_first_c IS INITIAL.
CLEAR: gt_item_field_s[],
gt_item_s[],
gt_field_fix_s[].
x_first_c = ' '.
ENDIF.
LOOP AT gt_item INTO ls_item.
*-
* Clear reference to items …
*-
CLEAR: ls_item-rposn,
ls_item-kdpos.
*-
* Get characteristics of segment level for summarization …
*-
MOVE-CORRESPONDING ls_item TO ls_item_ce4.
ls_item_ce4-aufnr = ls_item-rkaufnr.
ls_item_old = ls_item.
*-
* Clear fields that are no segment level characteristic …
*-
* perform apply_tkeoe_mask in program rk2a%erk_post
PERFORM apply_tkeoe_mask IN PROGRAM (rk2axxxx_post)
USING
'1'
'X' " apply conditional usage of characteristics
CHANGING
ls_item_ce4 .
MOVE-CORRESPONDING ls_item_ce4 TO ls_item.
ls_item-rkaufnr = ls_item_ce4-aufnr.
*-
* save characteristics that remain equal for all summarized items of a
* document (attention: may change when it will be possible to
* summarize more than one doucment via accounting document (RW-Beleg))
* no matter if they are in the segment level
* or that should be excluded from summarization because they are
* obligatory in the created items
*-
ls_item-bukrs = ls_item_old-bukrs.
ls_item-kokrs = ls_item_old-kokrs.
ls_item-rkaufnr = ls_item_old-rkaufnr.
ls_item-skost = ls_item_old-skost.
ls_item-pspnr = ls_item_old-pspnr.
ls_item-kstrg = ls_item_old-kstrg.
CASE ls_item-copa_awtyp.
*-
WHEN rkei1_ycs_awtyp-vbrk OR
'VBRR'. "n_1638810
*-
ls_item-vkorg = ls_item_old-vkorg.
ls_item-vtweg = ls_item_old-vtweg.
ls_item-spart = ls_item_old-spart.
ls_item-fkart = ls_item_old-fkart.
ls_item-kaufn = ls_item_old-kaufn.
*-
WHEN OTHERS.
*-
ENDCASE.
*-
* Reset prof.segment (ACCTNR) in order to redetermine it during update
*-
CLEAR ls_item-paobjnr.
*-
* Collect value fields …
*-
MOVE-CORRESPONDING ls_item TO ls_item_field_s-key.
MOVE-CORRESPONDING ls_item TO ls_item_field_s-key-ce4.
ls_item_field_s-key-ce4-aufnr = ls_item-rkaufnr.
MOVE-CORRESPONDING ls_item TO ls_item_field_s-data.
* Caution! Summarization with 'collect'
* –> all fields <> data type I,F,P are regarded as key
COLLECT ls_item_field_s INTO gt_item_field_s.
READ TABLE gt_field_fix_s INDEX sy-tabix
TRANSPORTING NO FIELDS.
IF sy-subrc NE 0.
MOVE-CORRESPONDING ls_item TO gs_field_fix_s.
APPEND gs_field_fix_s TO gt_field_fix_s.
ELSEIF SY-SUBRC = 0 AND
** item has been summarized…
IS_TRACE_MODE IS NOT INITIAL.
**..and trace is active
READ TABLE GT_FIELD_FIX_S INTO LS_FIELD_FIX_S
INDEX SY-TABIX
TRANSPORTING BELNR.
* update trace entry for summarized item: replace BELNR with doc. number of item to be posted
LS_TRACE-BELNR = LS_FIELD_FIX_S-BELNR.
READ TABLE GT_ITEM INTO LS_SUMMARIZED
INDEX 1.
* trace data exists on SD item level
LS_TRACE-RBELN = LS_SUMMARIZED-RBELN.
LS_TRACE-RPOSN = LS_SUMMARIZED-RPOSN.
CALL FUNCTION 'COPA_DOCUMENT_TRACE'
EXPORTING
I_ACTION = 'U'
IS_AD_TRACE = LS_TRACE
I_OLDBELNR = LS_SUMMARIZED-BELNR
EXCEPTIONS
OTHERS = 1.
ENDIF.
MODIFY gt_item FROM ls_item TRANSPORTING paobjnr.
ENDLOOP.
ENDFORM. "summarize_new_item
*–––––––––––––––––––––––-*
* FORM APPEND_ITEMS_S *
*–––––––––––––––––––––––-*
* Aufbau interne Tabelle mit zu verbuchenden verdicht. Einzelposten *
*–––––––––––––––––––––––-*
* –> FIRST_C Flag für Refresh bei erstem Aufruf
*–––––––––––––––––––––––-*
FORM append_items_s USING x_first_c.
DATA: ls_item_field_s TYPE ys_field_s_entry,
ls_item TYPE ys_ce1,
ls_item_log TYPE ys_ce0,
l_paledger_first LIKE cest1-paledger,
l_log_active TYPE c,
l_log_test TYPE c.
STATICS: la_item_index LIKE sy-index.
IF x_first_c EQ 'X'.
CLEAR gt_item_post[].
x_first_c = ' '.
CLEAR la_item_index.
ENDIF.
** append items to log
CALL FUNCTION 'COPA_DOCUMENT_LOG'
EXPORTING
i_action = 'L'
IMPORTING
e_log_active = l_log_active
e_test = l_log_test.
SORT gt_item_s BY belnr posnr paledger vrgar perio paobjnr.
** count item index
ADD 1 TO la_item_index.
LOOP AT gt_item_s INTO ls_item.
* Caution! temporary document number is needed for determination of
* final document number and posting
APPEND ls_item TO gt_item_post.
IF ( NOT l_log_active IS INITIAL ) AND
( NOT l_log_test IS INITIAL ).
PERFORM append_log USING ls_item.
ENDIF.
IF NOT l_log_test IS INITIAL.
* log table KE4ST (test mode only!)
MOVE-CORRESPONDING ls_item TO ls_item_log.
ls_item_log-plikz = 0.
* plikz necessary for display of line items via KE24
APPEND ls_item_log TO gt_item_log.
ENDIF.
IF l_paledger_first IS INITIAL.
l_paledger_first = ls_item-paledger.
ENDIF.
ENDLOOP.
** initialize data
CLEAR: gs_item,
gt_item,
gt_item[],
gt_item_s,
gt_item_s[],
gt_item_field_s[], "HW728409
gt_field_fix_s[].
ENDFORM. "append_items_s
*–––––––––––––––––––––––-*
* FORM PREPARE_ITEMS_S *
*–––––––––––––––––––––––-*
* Ableitung, Bewertung, Rücksetzen, Waerhungsumrechnung bewertete
* Felder fuer verdichtete Einzelposten. Nur fuer Ledger n werden
* die Funktionen ausgefuehrt und die weiteren Ledger daraus er-
* ergaenzt.
*–––––––––––––––––––––––-*
* –> DBTABLE Fieldtab
* –> V_TKEBL Ledger/Waehrungstypen
* PALEDGER_N fuehrendes Ledger n
* TRACE_MODE Tracemodus
* SMODE Verdichtungsmodus
* BTRANS betriebswirtschaftlicher Vorgang
* CANCEL_VAL Stornokennzeichen für Bewertung
*–––––––––––––––––––––––-*
FORM prepare_items_s TABLES it_dbtable STRUCTURE gs_dbtable
USING it_v_tkebl TYPE rkea1_t_v_tkebl
i_paledger_n
it_paledger_nn TYPE rkei1_yt_ledger
* must not contain more than one entry
is_trace_mode TYPE rkei1_ys_trace_mode
i_smode
i_btrans
i_cancel_val.
DATA: ls_item_field_s TYPE ys_field_s_entry,
ls_item TYPE ys_ce1,
l_nr_curr LIKE sy-tabix,
l_cn_curr LIKE sy-index,
l_tabix LIKE sy-tabix,
ls_item_ce4_b1 TYPE ys_ce4,
ls_item_ce4_b2 TYPE ys_ce4,
ls_item_ce4_a TYPE ys_ce4,
l_copied_ledger LIKE cest1-paledger,
l_first_line(1) TYPE c.
CLEAR gt_item[].
*-
* Summarization before derivation, valuation, reset
*-
IF i_smode EQ '2'.
*- Determine number of ledgers
DESCRIBE TABLE it_v_tkebl LINES l_nr_curr.
IF l_nr_curr EQ 0.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
*- Process packages of items
LOOP AT gt_item_field_s INTO ls_item_field_s.
ADD 1 TO l_cn_curr.
MOVE-CORRESPONDING ls_item_field_s-key TO ls_item.
MOVE-CORRESPONDING ls_item_field_s-key-ce4 TO ls_item.
ls_item-rkaufnr = ls_item_field_s-key-ce4-aufnr.
MOVE-CORRESPONDING ls_item_field_s-data TO ls_item.
READ TABLE gt_field_fix_s INTO gs_field_fix_s INDEX sy-tabix.
IF sy-subrc NE 0 OR ls_item-paledger NE gs_field_fix_s-paledger.
*- Inconsistent summarization in CO-PA!
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
MOVE-CORRESPONDING gs_field_fix_s TO ls_item.
ls_item-usnam = sy-uname.
ls_item-hzdat = sy-datum.
APPEND ls_item TO gt_item.
*- Derive and valuate ledger package
IF l_cn_curr EQ l_nr_curr.
l_first_line = 'X'.
LOOP AT gt_item INTO ls_item.
IF l_first_line = 'X'.
*- Call derivation for first item
MOVE-CORRESPONDING ls_item TO ls_item_ce4_b1.
ls_item_ce4_b1-aufnr = ls_item-rkaufnr.
PERFORM derivation_item TABLES it_dbtable
USING ls_item
is_trace_mode.
*-
MOVE-CORRESPONDING ls_item TO ls_item_ce4_a.
ls_item_ce4_a-aufnr = ls_item-rkaufnr.
MODIFY gt_item FROM ls_item.
ELSE.
*- Copy derived characteristics into other ledgers
MOVE-CORRESPONDING ls_item TO ls_item_ce4_b2.
ls_item_ce4_b2-aufnr = ls_item-rkaufnr.
IF ( ls_item_ce4_b2
EQ ls_item_ce4_b1 ).
MOVE-CORRESPONDING ls_item_ce4_a TO ls_item.
ls_item-rkaufnr = ls_item_ce4_a-aufnr.
MODIFY gt_item FROM ls_item.
ELSE.
*- Inconsistent summarization of parallel currencies!
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
ENDIF.
CLEAR: l_first_line,
l_cn_curr.
ENDLOOP.
*- Valuate items
PERFORM update_and_valuate_and_reset TABLES it_dbtable
USING is_trace_mode
i_cancel_val.
*- Append items to summarization table ( GT_ITEM_S )
APPEND LINES OF gt_item TO gt_item_s.
CLEAR gt_item[].
ENDIF.
ENDLOOP.
* –
* Summarization after derivation, valuation, reset
*-
ELSEIF i_smode EQ '1'.
LOOP AT gt_item_field_s INTO ls_item_field_s.
MOVE-CORRESPONDING ls_item_field_s-key TO ls_item.
MOVE-CORRESPONDING ls_item_field_s-key-ce4 TO ls_item.
ls_item-rkaufnr = ls_item_field_s-key-ce4-aufnr.
MOVE-CORRESPONDING ls_item_field_s-data TO ls_item.
READ TABLE gt_field_fix_s INTO gs_field_fix_s INDEX sy-tabix.
IF sy-subrc NE 0 OR ls_item-paledger NE gs_field_fix_s-paledger.
* Inconsistent summarization in CO-PA
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
MOVE-CORRESPONDING gs_field_fix_s TO ls_item.
ls_item-usnam = sy-uname.
ls_item-hzdat = sy-datum.
APPEND ls_item TO gt_item_s.
ENDLOOP. "gt_item_field_s
*-
ELSE.
*- Summarization mode not existing!
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF. "i_smode
ENDFORM. "prepare_items_s
*–––––––––––––––––––––––-*
* FORM DATA_CUSTOMER_FUNCTION
*–––––––––––––––––––––––-*
* Daten lesen/schreiben für User-Exits Verarbeitung RW-Beleg
*–––––––––––––––––––––––-*
* –> MODE Modus: 'R': Daten lesen vor User-Exit
* 'W': Daten schreiben nach User-Exit
* <-> T_ITEM Einzelpostentabelle
* <-> S_ITEM Einzelposten
*–––––––––––––––––––––––-*
FORM data_customer_function USING i_mode
i_function "JW HW551756
CHANGING xt_item TYPE yt_ce1
xs_item TYPE ys_ce1.
CASE i_mode.
WHEN 'R'.
xs_item = gs_item.
IF i_function = '002'. "JW HW551756
xt_item[] = gt_item_post[].
ENDIF. "JW HW551756
WHEN 'W'.
* do not allow deletion of item
IF NOT xs_item IS INITIAL.
gs_item = xs_item.
CLEAR xs_item.
ENDIF.
* enable deletion of items
IF i_function = '002'. "JW HW551756
gt_item_post[] = xt_item[].
CLEAR xt_item[].
ENDIF. "JW HW551756
ENDCASE.
ENDFORM. "data_customer_function
*–––––––––––––––––––––––-*
* FORM OWN_LOGICAL_SYSTEM_GET
*–––––––––––––––––––––––-*
* Holen logisches System
*–––––––––––––––––––––––-*
* <– AWSYS log. System
*–––––––––––––––––––––––-*
FORM own_logical_system_get CHANGING e_awsys.
STATICS: la_awsys_own LIKE acchd-awsys.
*-
* Determine logical system …
*-
IF la_awsys_own IS INITIAL.
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = la_awsys_own
EXCEPTIONS
own_logical_system_not_defined = 1
OTHERS = 2.
IF sy-subrc NE 0.
* own logical system is not obligatory
CLEAR la_awsys_own.
ENDIF.
ENDIF.
e_awsys = la_awsys_own.
ENDFORM. "own_logical_system_get
*–––––––––––––––––––––––-*
* FORM MOVE_REFERENCE_FIELDS
*–––––––––––––––––––––––-*
* Information aus RW-Beleg Key in Einzelposten stellen
*–––––––––––––––––––––––-*
* –> I_AWTYP Objekttyp der rufenden Anwendung
* –> I_AWREF Referenzbelegnummer
* –> I_AWORG Referenzorganisationseinheit
* –> I_AWSYS Logisches System
* –> SMODE Verdichtungsmodus
*–––––––––––––––––––––––-*
FORM move_reference_fields USING i_awtyp
i_awref
i_aworg
i_awsys
i_smode.
DATA: ls_item_post TYPE ys_ce1,
l_awsys_own LIKE acchd-awsys.
*-
* Move reference fields
*-
LOOP AT gt_item_post INTO ls_item_post.
ls_item_post-copa_awtyp = i_awtyp.
ls_item_post-copa_aworg = i_aworg.
ls_item_post-copa_awsys = i_awsys.
ls_item_post-rbeln = i_awref.
MODIFY gt_item_post FROM ls_item_post.
ENDLOOP.
ENDFORM. "move_reference_fields
*–––––––––––––––––––––––-*
* FORM FILL_DOCUMENT_NUMBER
*–––––––––––––––––––––––-*
* Belegnummer besorgen: getrennte Verarbeitung der Stornos und der
* neuen Einzelposten!!! Grund: bei nachträglicher Aktivierung der
* parallelen Währung müssen Einzelposten, die vor der Aktivierung
* gebucht wurden, nun auch storniert werden können.
*–––––––––––––––––––––––-*
* –> V_TKEBL Legder/Waehrungstypen
* MIX_LEDGER Flag fuer Verbuchungsaufruf: es kann Belege geben
* fuer die pro Position die zu bebuchenden Ledger
* u. evtl. auch die Anzahl der Ledger unterschiedlich
* ist -> der Aufruf der Verbuchung muss pro Position
* erfolgen
* CALL_MODE Flag fuer Aufrufmodus (Nachbuchung KE4S)
*–––––––––––––––––––––––-*
FORM fill_document_number USING it_v_tkebl TYPE rkea1_t_v_tkebl
i_mix_ledger
i_call_mode.
IF i_call_mode EQ rkei1_ycs_call_mode-c.
*-
* Get document number for reversed items …
*-
PERFORM get_document_number USING it_v_tkebl
i_mix_ledger
'R'
CHANGING gt_item_post_rev[].
ENDIF.
*-
* Get document number for new items …
*-
PERFORM get_document_number USING it_v_tkebl
i_mix_ledger
' '
CHANGING gt_item_post[].
ENDFORM. "fill_document_number
*–––––––––––––––––––––––-*
* FORM GET_DOCUMENT_NUMBER
*–––––––––––––––––––––––-*
* Belegnummer besorgen: Einzelposten mit mehreren Ledgern bekommen
* die identische Belegnummer!!!
*–––––––––––––––––––––––-*
* –> V_TKEBL Legder/Waehrungstypen
* MIX_LEDGER Flag fuer Verbuchungsaufruf: es kann Belege geben
* fuer die pro Position die zu bebuchenden Ledger
* u. evtl. auch die Anzahl der Ledger unterschiedlich
* ist -> der Aufruf der Verbuchung muss pro Position
* erfolgen
* CHECK Aufrufflag Storno/Normal
* <-> ITEM_POST Tabelle mit Einzelposten
*–––––––––––––––––––––––-*
FORM get_document_number USING it_v_tkebl TYPE rkea1_t_v_tkebl
i_mix_ledger
i_check
CHANGING xt_item_post TYPE yt_item.
DATA: ls_item_post_n TYPE ys_ce1,
ls_item_post_nn TYPE ys_ce1,
lt_item_post TYPE ys_ce1 OCCURS 0 WITH HEADER LINE,
ls_item_post TYPE ys_ce1,
l_belnr LIKE cest1-belnr,
l_belnr_temp LIKE cest1-belnr,
l_rbeln LIKE cest1-rbeln,
l_rposn LIKE cest1-rposn,
l_init TYPE c,
l_nr_curr LIKE sy-index,
l_cn_curr_from LIKE sy-index,
l_cn_curr_to LIKE sy-index.
*-
* Determine number of ledgers/currencies in op. concern …
*-
DESCRIBE TABLE it_v_tkebl LINES l_nr_curr.
IF l_nr_curr EQ 0.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
* initialization for handling per. val. items
l_init = 'X'.
IF i_mix_ledger IS INITIAL.
*-
* All ledgers equal in the document: determine leading ledger
*-
READ TABLE it_v_tkebl INTO gs_v_tkebl INDEX 1.
*-
* Fetch document number …
*-
LOOP AT xt_item_post INTO ls_item_post_n
WHERE paledger EQ gs_v_tkebl-paledger.
l_cn_curr_from = sy-tabix + 1.
l_cn_curr_to = sy-tabix + l_nr_curr – 1.
l_rbeln = ls_item_post_n-rbeln.
l_rposn = ls_item_post_n-rposn.
CALL FUNCTION 'RKE_GET_ACT_DOC_NUMBER'
EXPORTING
erkrs = g_erkrs
gjahr = ls_item_post_n-gjahr
vrgar = ls_item_post_n-vrgar
IMPORTING
belnr = l_belnr.
ls_item_post_n-belnr = l_belnr.
* if period. val. items are involved: save new ref. doc. number
PERFORM change_ref_periodic_val USING l_init
CHANGING ls_item_post_n.
CLEAR l_init.
MODIFY xt_item_post FROM ls_item_post_n.
PERFORM append_log USING ls_item_post_n.
LOOP AT xt_item_post FROM l_cn_curr_from
TO l_cn_curr_to
INTO ls_item_post_nn.
CHECK ( l_rbeln EQ ls_item_post_nn-rbeln AND
l_rposn EQ ls_item_post_nn-rposn ).
* Move document number to other ledgers for item
IF ( ls_item_post_nn-paledger EQ gs_v_tkebl-paledger )
AND ( g_reverse IS INITIAL ).
* Inconsistent ledger sequence for items in CO-PA …
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
ls_item_post_nn-belnr = l_belnr.
* if period. val. items are involved: save new ref. doc. number
PERFORM change_ref_periodic_val USING l_init
CHANGING ls_item_post_nn.
MODIFY xt_item_post FROM ls_item_post_nn.
PERFORM append_log USING ls_item_post_nn.
ENDLOOP.
ENDLOOP.
ELSE.
*-
* Various ledgers per item of the document …
*-
LOOP AT xt_item_post INTO ls_item_post.
IF ls_item_post-belnr IS INITIAL.
* CO-PA: inconsistent temporary document number detected …
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
IF ls_item_post-belnr EQ l_belnr_temp.
ls_item_post-belnr = l_belnr.
ELSE.
l_belnr_temp = ls_item_post-belnr.
CALL FUNCTION 'RKE_GET_ACT_DOC_NUMBER'
EXPORTING
erkrs = g_erkrs
gjahr = ls_item_post-gjahr
vrgar = ls_item_post-vrgar
IMPORTING
belnr = l_belnr.
ls_item_post-belnr = l_belnr.
ENDIF.
* if period. val. items are involved: save new ref. doc. number
PERFORM change_ref_periodic_val USING l_init
CHANGING ls_item_post.
CLEAR l_init.
MODIFY xt_item_post FROM ls_item_post.
PERFORM append_log USING ls_item_post. "0428389
ENDLOOP.
ENDIF. "i_mix_ledger
ENDFORM. "get_document_number
*–––––––––––––––––––––––*
* FORM change_ref_periodic_val *
*–––––––––––––––––––––––*
* Change reference field for period. val. items *
*–––––––––––––––––––––––*
* –> i_init initialization *
* <-> xs_item new item to be posted *
*–––––––––––––––––––––––*
FORM change_ref_periodic_val USING i_init
CHANGING xs_item TYPE ys_ce1.
DATA: ls_ref_new TYPE ys_ref,
ls_ref_pv TYPE ys_ref.
STATICS: lat_ref_new TYPE yt_ref_new.
*-
* Initializiation …
*-
IF NOT i_init IS INITIAL.
CLEAR lat_ref_new.
ENDIF.
*-
* Check reversal of periodically valuated items …
*-
DESCRIBE TABLE gt_ref_pv LINES sy-index.
CHECK sy-index GT 0.
IF NOT xs_item-sto_belnr IS INITIAL.
IF xs_item-copa_bwzpt IS INITIAL.
*-
* Insert reference of orig. item into internal table (keep the
* document number and cancelled document number of the orignal
* item)
*-
ls_ref_new-refnr = xs_item-sto_belnr.
ls_ref_new-refpo = xs_item-sto_posnr.
ls_ref_new-belnr = xs_item-belnr.
ls_ref_new-posnr = xs_item-posnr.
INSERT ls_ref_new INTO TABLE lat_ref_new.
ELSEIF xs_item-copa_bwzpt EQ '1'.
*-
* Find reference of reversal for per. val. item (rem.: periodically
* valuated items contain in field RBELN (ref. doc. no.) the number of
* the original document to which the delta refers!) In this step look
* for the original document of the per. val. item to be cancelled.
*-
READ TABLE gt_ref_pv INTO ls_ref_pv
WITH KEY belnr = xs_item-sto_belnr
posnr = xs_item-sto_posnr
BINARY SEARCH.
IF sy-subrc NE 0.
* Inconsistent processing for period. val. items in CO-PA …
MESSAGE ID 'KE' TYPE 'E' NUMBER '476'.
ENDIF.
*-
* Look for the new doc. number of the cancellation of the orignal
* document of the of the per. val. item to be cancelled and field
* RBELN of cancelled per. val. item
*-
READ TABLE lat_ref_new INTO ls_ref_new
WITH KEY refnr = ls_ref_pv-refnr
refpo = ls_ref_pv-refpo
BINARY SEARCH.
IF sy-subrc NE 0.
* Inconsistent processing for period. val. items in CO-PA …
MESSAGE ID 'KE' TYPE 'E' NUMBER '476'.
ELSE.
xs_item-rbeln = ls_ref_new-belnr.
xs_item-rposn = ls_ref_new-posnr.
ENDIF.
ELSE.
*-
* Inconsistent field COPA_BWZPT for period. val. items in CO-PA …
MESSAGE ID 'KE' TYPE 'E' NUMBER '476'.
*-
ENDIF.
ENDIF.
ENDFORM. "change_ref_periodic_val
*–––––––––––––––––––––––-*
* FORM APPEND_LOG
*–––––––––––––––––––––––-*
* Uebernahme Belegnummern in Protokolltabelle: nur Ledger 01, da
* andere Ledger identische Nummer haben
*–––––––––––––––––––––––-*
* –> ITEM Einzelposten
*–––––––––––––––––––––––-*
FORM append_log USING is_item TYPE ys_ce1.
DATA: ls_log TYPE ys_log,
l_log_active TYPE c.
CALL FUNCTION 'COPA_DOCUMENT_LOG'
EXPORTING
i_action = 'L'
IMPORTING
e_log_active = l_log_active.
CHECK NOT l_log_active IS INITIAL.
CHECK is_item-paledger EQ '01'.
MOVE-CORRESPONDING is_item TO ls_log.
ls_log-erkrs = g_erkrs.
ls_log-vbeln = is_item-rbeln.
ls_log-posnr = is_item-rposn.
CALL FUNCTION 'COPA_DOCUMENT_LOG'
EXPORTING
i_action = 'A'
i_log_item = ls_log
EXCEPTIONS
log_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "append_log
*–––––––––––––––––––––––-*
* FORM POST_ACTUAL_ITEMS
*–––––––––––––––––––––––-*
* Verbuchung der Einzelposten in der Ergebnisrechnung
*–––––––––––––––––––––––-*
* –> V_TKEBL Ledger/Waehrungstypen
* MIX_LEDGER Flag fuer Verbuchungsaufruf: es kann Belege geben
* fuer die pro Position die zu bebuchenden Ledger
* u. evtl. auch die Anzahl der Ledger unterschiedlich
* ist -> der Aufruf der Verbuchung muss pro Position
* erfolgen
* CALL_MODE Flag fuer Aufrufmodus (Nachbuchung KE4S)
*–––––––––––––––––––––––-*
FORM post_actual_items USING it_v_tkebl TYPE rkea1_t_v_tkebl
i_mix_ledger
i_call_mode.
IF i_call_mode EQ rkei1_ycs_call_mode-c.
* Subsequ. transfer of documents: post old, reversed items
PERFORM post_items USING it_v_tkebl
i_mix_ledger
'X'
CHANGING gt_item_post_rev[].
ENDIF.
*-
* Post new items
*-
PERFORM post_items USING it_v_tkebl
i_mix_ledger
g_reverse
CHANGING gt_item_post[].
*-
* Initialize data for next posting
*-
CLEAR: gt_item_post_rev[],
gt_item_post[],
g_reverse,
gt_ref_pv[]. "n_935471
ENDFORM. "post_actual_items
*–––––––––––––––––––––––-*
* FORM POST_ITEMS
*–––––––––––––––––––––––-*
* Verbuchung der Einzelposten in der Ergebnisrechnung
*–––––––––––––––––––––––-*
* –> V_TKEBL Ledger/Waehrungstypen
* MIX_LEDGER Flag fuer Verbuchungsaufruf: es kann Belege geben
* fuer die pro Position die zu bebuchenden Ledger
* u. evtl. auch die Anzahl der Ledger unterschiedlich
* ist -> der Aufruf der Verbuchung muss pro Position
* erfolgen
* REVERSE Aufrufflag Storno/Normal
* <-> ITEM_POST Tabelle mit Einzelposten
*–––––––––––––––––––––––-*
FORM post_items USING it_v_tkebl TYPE rkea1_t_v_tkebl
i_mix_ledger
i_reverse
CHANGING xt_item_post TYPE yt_item.
DATA: lt_item_post TYPE ys_ce1 OCCURS 0 WITH HEADER LINE,
ls_item_post TYPE ys_ce1,
ls_item_post_next TYPE ys_ce1,
l_append TYPE c,
l_index_next LIKE sy-index,
ls_v_tkebl TYPE rkea1_v_tkebl,
lt_copa_paledger TYPE copa_yt_paledger.
FIELD-SYMBOLS: <row> TYPE rkea1_v_tkebl.
*-
* Check active ledgers …
*-
DESCRIBE TABLE it_v_tkebl LINES g_lin.
IF g_lin EQ 0.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
*-
* POST ITEMS …
*-
IF i_mix_ledger IS INITIAL.
*-
* All ledgers are equal in the document
*-
LOOP AT it_v_tkebl ASSIGNING <row>.
APPEND <row>-paledger TO lt_copa_paledger.
ENDLOOP.
CALL FUNCTION 'RKE_POST_ACT_LINE_ITEM'
EXPORTING
erkrs = g_erkrs
check_belnr = ' '
is_reversal = i_reverse
t_paledger = lt_copa_paledger
TABLES
line_item_tab = xt_item_post.
ELSE.
*-
* Various ledgers in document …
*-
LOOP AT xt_item_post INTO ls_item_post.
l_append = 'X'.
l_index_next = sy-tabix + 1.
APPEND ls_item_post-paledger TO lt_copa_paledger.
READ TABLE xt_item_post INTO ls_item_post_next
INDEX l_index_next.
IF ( sy-subrc NE 0 )
OR ( ls_item_post_next-belnr NE ls_item_post-belnr ).
APPEND ls_item_post TO lt_item_post.
CLEAR l_append.
CALL FUNCTION 'RKE_POST_ACT_LINE_ITEM'
EXPORTING
erkrs = g_erkrs
check_belnr = ' '
is_reversal = i_reverse
t_paledger = lt_copa_paledger
TABLES
line_item_tab = lt_item_post.
CLEAR: lt_copa_paledger[],
lt_item_post,
lt_item_post[].
ENDIF.
IF NOT l_append IS INITIAL.
APPEND ls_item_post TO lt_item_post.
ENDIF.
ENDLOOP.
ENDIF. "i_mix_ledger
* clear data for next postings
CLEAR: xt_item_post[].
ENDFORM. "post_items
*–––––––––––––––––––––––-*
* FORM DOC_RECORD *
*–––––––––––––––––––––––-*
* COPA-Belege in Protokolltabelle übernehmen *
*–––––––––––––––––––––––-*
* –> DOCUMENTS logging table
* –> AWTYP object type accounting doc.
* –> AWREF doc. number
* –> AWORG org. data
* –> AWSYS logical system
* –> BUKRS ccode (supplied by FI only!, relev. f. cross comp.)
* –> AWTYP_COPA obj. type COPA
*–––––––––––––––––––––––-*
FORM doc_record TABLES et_documents STRUCTURE acc_doc
USING i_awtyp
i_awref
i_aworg
i_awsys
i_bukrs
i_awtyp_copa.
DATA: l_subrc LIKE sy-subrc,
l_rec_type LIKE tvga-vrgar,
l_rec_type_new LIKE tvga-vrgar,
lt_item_tab_rec TYPE ys_ce1 OCCURS 0 WITH HEADER LINE,"HW316546
l_lin LIKE sy-index,
lt_v_tkebl TYPE rkea1_t_v_tkebl,
ls_v_tkebl TYPE rkea1_v_tkebl,
lt_item_del TYPE yt_ce1,
ls_item TYPE ys_ce1,
ls_item_next TYPE ys_ce1,
l_index_next LIKE sy-tabix,
ls_ledger TYPE rkei1_ys_ledger,
l_belnr LIKE gt_item_tab_rec-belnr,
CIN_BUKRS TYPE BUKRS. "n_1558640
STATICS: lat_ledger TYPE rkei1_yt_ledger.
*-
* Determine active ledgers …
*-
DESCRIBE TABLE lat_ledger LINES l_lin.
IF l_lin EQ 0.
CALL FUNCTION 'RKE_READ_ERKRS_MESSAGE'
EXPORTING
i_erkrs = g_erkrs
IMPORTING
et_v_tkebl = lt_v_tkebl
EXCEPTIONS
not_defined = 1
not_defined_in_client = 2
no_text = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT lt_v_tkebl INTO ls_v_tkebl.
ls_ledger-paledger = ls_v_tkebl-paledger.
INSERT ls_ledger INTO TABLE lat_ledger.
ENDLOOP.
ENDIF.
CLEAR et_documents.
et_documents-awtyp = i_awtyp_copa.
*-
* Determine record type -> usage of index for access to CE1 on database
*-
CASE i_awtyp.
*-
WHEN rkei1_ycs_awtyp-vbrk. "SD-billing
*-
l_rec_type = ' '.
*-
WHEN rkei1_ycs_awtyp-ibkpf. "FI IDoc
*-
l_rec_type = 'B'.
*-
WHEN rkei1_ycs_awtyp-bkpf. "FI-posting
*-
l_rec_type = 'B'.
*-
WHEN rkei1_ycs_awtyp-mkpf. "MM-posting
*-
l_rec_type = ' '.
*-
WHEN rkei1_ycs_awtyp-rmrp. "incoming invoice
*-
l_rec_type = ' '.
*-
WHEN rkei1_ycs_awtyp-auak. "order settlement
*-
l_rec_type = 'C'.
*-
WHEN rkei1_ycs_awtyp-cobk. "cost accounting
*-
perform determine_vrgar_cobk
using
i_awref
i_aworg
changing
l_rec_type.
*-
WHEN OTHERS.
*-
ENDCASE.
IF NOT l_rec_type IS INITIAL.
*-
* Record type ascertainable unambigously …
*-
PERFORM get_line_item TABLES gt_item_tab_rec
USING l_rec_type
i_awtyp
i_awref
i_aworg
i_awsys
i_bukrs
l_subrc.
IF l_subrc NE 0
OR l_rec_type EQ 'C'.
IF l_rec_type EQ 'C'.
INSERT lines of gt_item_tab_rec INTO TABLE lt_item_tab_rec.
CLEAR gt_item_tab_rec.
REFRESH gt_item_tab_rec.
ENDIF.
CASE l_rec_type.
*-
WHEN 'C' OR 'D' .
*-
* MM differences of production orders
* or COBK-allocation of primary costs …
l_rec_type_new = 'B'.
WHEN OTHERS.
ENDCASE.
IF NOT l_rec_type_new IS INITIAL.
PERFORM get_line_item TABLES gt_item_tab_rec
USING l_rec_type_new
i_awtyp
i_awref
i_aworg
i_awsys
i_bukrs
l_subrc.
IF l_subrc NE 0
OR i_awtyp EQ rkei1_ycs_awtyp-auak.
INSERT lines of gt_item_tab_rec INTO TABLE lt_item_tab_rec.
"JW HW420895
CLEAR gt_item_tab_rec. "JW HW420895
REFRESH gt_item_tab_rec. "JW HW420895
l_rec_type_new = 'I'.
PERFORM get_line_item TABLES gt_item_tab_rec
USING l_rec_type_new
i_awtyp
i_awref
i_aworg
i_awsys
i_bukrs
l_subrc.
INSERT lines of lt_item_tab_rec INTO TABLE gt_item_tab_rec.
CLEAR lt_item_tab_rec.
REFRESH lt_item_tab_rec.
ENDIF.
ENDIF.
ENDIF.
ELSE.
*-
* Record type not ascertainable unambigously: MM documents at point
* of time of goods issue (WA) with rec. type 'B' and goods receipt
* with rec. type 'F' (Rel. >=4.6A: (rec. type 'B'))
* revenue recognition billing document (AWTYP = VBRK, GLVOR = RFBU)
*-
PERFORM get_line_item TABLES gt_item_tab_rec
USING 'F'
i_awtyp
i_awref
i_aworg
i_awsys
i_bukrs
l_subrc.
IF I_AWTYP = 'VBRK'. "n_1558640
** in case the excise invoice functionality is active additional line items of
** record type 'B' with the same 'AWREF' exist
SELECT SINGLE J_1IBUKRS INTO CIN_BUKRS
FROM J_1IINDCUS
WHERE J_1IBUKRS = I_BUKRS.
ENDIF.
IF l_subrc NE 0
OR CIN_BUKRS IS NOT INITIAL
** indian company code with excise invoice functionality
OR ( i_aworg(4) = 'CRMB' AND cl_erp_ehp_switch_check=>spe_sfws_ci_1( ) = 'X' ).
** CRM cross-company: internal billing and invoice receipt are posted with
** the same reference key ( AWTYP = BEBD, AWORG = CRMB ), but different record types
INSERT LINES OF gt_item_tab_rec INTO TABLE lt_item_tab_rec. "n_1488071
CLEAR gt_item_tab_rec[].
PERFORM get_line_item TABLES gt_item_tab_rec
USING 'B'
i_awtyp
i_awref
i_aworg
i_awsys
i_bukrs
l_subrc.
INSERT LINES OF lt_item_tab_rec INTO TABLE gt_item_tab_rec. "n_1488071
ENDIF.
ENDIF.
* delete unnecessary ledgers for displaying items: ledger 01 must
* be displayed, if it is not existing display either ledger 03 or
* ledger 04
SORT gt_item_tab_rec BY rbeln rposn belnr posnr paledger.
* delete items with same BELNR to keep one single ledger (HW389861)
LOOP AT gt_item_tab_rec INTO ls_item.
l_index_next = sy-tabix + 1.
READ TABLE gt_item_tab_rec INTO ls_item_next
INDEX l_index_next.
IF sy-subrc EQ 0.
IF ls_item_next-belnr EQ ls_item-belnr AND
ls_item_next-posnr EQ ls_item-posnr.
APPEND ls_item_next TO lt_item_del.
ENDIF.
ENDIF.
ENDLOOP.
* in case of VRGAR I we can have several items with same BELNR
DELETE lt_item_del WHERE PALEDGER = '01' and VRGAR = 'I'.
LOOP AT lt_item_del INTO ls_item.
DELETE TABLE gt_item_tab_rec FROM ls_item.
ENDLOOP.
CLEAR l_belnr.
LOOP AT gt_item_tab_rec.
IF l_belnr NE gt_item_tab_rec-belnr.
*-
* Create one entry for RW-document display (et_document) per
* CO-PA document (belnr)
*-
l_belnr = gt_item_tab_rec-belnr.
*-
* table CEALE01 always contains an entry, if the line item is not
* from the local system (ALE)
*-
SELECT * FROM ceale01 WHERE
belnr EQ gt_item_tab_rec-belnr AND
posnr EQ gt_item_tab_rec-posnr AND
paobjnr EQ gt_item_tab_rec-paobjnr AND
erkrs EQ g_erkrs AND
plikz EQ gt_item_tab_rec-plikz AND
paledger EQ gt_item_tab_rec-paledger AND
vrgar EQ gt_item_tab_rec-vrgar AND
versi EQ gt_item_tab_rec-versi AND
perio EQ gt_item_tab_rec-perio AND
altperio EQ gt_item_tab_rec-altperio AND
pasubnr EQ gt_item_tab_rec-pasubnr.
IF ceale01-logsystem EQ i_awsys. "EP aus anderem System
et_documents-docnr = gt_item_tab_rec-belnr.
et_documents-bukrs = gt_item_tab_rec-bukrs.
APPEND et_documents.
ENDIF.
ENDSELECT.
IF sy-subrc NE '0'. "EP aus lokalem System
et_documents-docnr = gt_item_tab_rec-belnr.
et_documents-bukrs = gt_item_tab_rec-bukrs.
COLLECT et_documents. "JW HW389861
ENDIF.
ENDIF.
ENDLOOP. "gt_item_tab_rec
ENDFORM. "doc_record
*–––––––––––––––––––––––-*
* FORM GET_LINE_ITEM *
*–––––––––––––––––––––––-*
* Select line item from PA table CE1 *
*–––––––––––––––––––––––-*
* –> ITEM_TAB table with line items *
* –> REC_TYPE record typ *
* –> AWTYP object typ Acc-Document *
* –> AWREF number of Acc-Document sender *
* –> AWORG org. data of Acc-Document sender *
* –> AWSYS logical system *
* –> BUKRS company code *
* <– SUBRC *
*–––––––––––––––––––––––-*
FORM get_line_item TABLES et_item_tab STRUCTURE gt_item_tab
USING i_rec_type
i_awtyp
i_awref
i_aworg
i_awsys
value(i_bukrs)
e_subrc.
DATA: l_awsys_own LIKE acchd-awsys,
l_copa_awsys type acchd-awsys, "n_1600939
l_budat TYPE sy-datum,
l_perio TYPE cest1-perio,
l_altperio TYPE cest1-altperio,
l_gjahr TYPE cest1-gjahr.
PERFORM own_logical_system_get CHANGING l_awsys_own.
if l_awsys_own <> i_awsys. "n_1600939
l_copa_awsys = i_awsys.
endif.
*-
* Fetch items …
*-
IF i_awtyp EQ rkei1_ycs_awtyp-bkpf.
*-
IF i_bukrs IS INITIAL.
i_bukrs = i_aworg(4).
ENDIF.
SELECT * INTO TABLE et_item_tab FROM (c_ce1name) WHERE
vrgar EQ i_rec_type AND
rbeln EQ i_awref AND
gjahr EQ i_aworg+4(4) AND
bukrs EQ i_bukrs AND
( copa_awtyp EQ i_awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
( copa_aworg EQ i_aworg OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
copa_awsys eq l_copa_awsys "n_1600939
ORDER BY vrgar rbeln rposn.
*-
IF sy-subrc <> 0. "n_1138337
SELECT * INTO TABLE et_item_tab
FROM (c_ce1name)
WHERE vrgar EQ i_rec_type AND
rbeln EQ i_awref AND
bukrs EQ i_bukrs AND
copa_awtyp EQ i_awtyp AND
copa_aworg EQ i_aworg AND
copa_awsys eq l_copa_awsys "n_1600939
ORDER BY vrgar rbeln rposn.
ENDIF.
*-
*-
ELSEIF i_awtyp EQ rkei1_ycs_awtyp-mkpf.
*-
SELECT * INTO TABLE et_item_tab
FROM (c_ce1name)
WHERE vrgar EQ i_rec_type AND
rbeln EQ i_awref AND
copa_awtyp EQ i_awtyp AND
copa_aworg EQ i_aworg AND
copa_awsys eq l_copa_awsys "n_1600939
ORDER BY vrgar rbeln rposn.
IF sy-subrc NE '0'. "MBHW409867
SELECT SINGLE budat INTO l_budat FROM mkpf
WHERE mblnr = i_awref
AND mjahr = i_aworg(4).
IF sy-subrc = 0.
CALL FUNCTION 'RKE_CONVERT_DATE_TO_LOGNR'
EXPORTING
erkrs = g_erkrs
date = l_budat
IMPORTING
perio = l_perio
perio2 = l_altperio
EXCEPTIONS
i_erkrs_notfound = 1
i_error = 2
i_periv_notedited = 3
i_perspec_invalid = 4
OTHERS = 5.
IF sy-subrc EQ 0.
l_gjahr = l_perio(4).
SELECT * INTO TABLE et_item_tab FROM (c_ce1name) WHERE
vrgar EQ i_rec_type AND
rbeln EQ i_awref AND
gjahr EQ l_gjahr AND
( copa_awtyp EQ i_awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
( copa_aworg EQ i_aworg OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
copa_awsys eq l_copa_awsys "n_1600939
ORDER BY vrgar rbeln rposn.
ENDIF.
ELSE.
SELECT * INTO TABLE et_item_tab FROM (c_ce1name) WHERE
vrgar EQ i_rec_type AND
rbeln EQ i_awref AND
( copa_awtyp EQ i_awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
( copa_aworg EQ i_aworg OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
copa_awsys eq l_copa_awsys "n_1600939
ORDER BY vrgar rbeln rposn.
ENDIF.
ENDIF. "MBHW409867
*-
ELSEIF i_awtyp EQ rkei1_ycs_awtyp-cobk. "HW584090
*-
SELECT * INTO TABLE et_item_tab FROM (c_ce1name) WHERE
vrgar EQ i_rec_type AND
rbeln EQ i_awref AND
kokrs EQ i_aworg AND
( copa_awtyp EQ i_awtyp OR
copa_awtyp = ' ' OR
copa_awtyp IS NULL ) AND
( copa_aworg EQ i_aworg OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
copa_awsys eq l_copa_awsys "n_1600939
ORDER BY vrgar rbeln rposn.
*-
ELSE.
*-
SELECT * INTO TABLE et_item_tab FROM (c_ce1name) WHERE "n_1488071
vrgar EQ i_rec_type AND
rbeln EQ i_awref AND
( copa_awtyp EQ i_awtyp ) AND "n_1000704
( copa_aworg EQ i_aworg OR
copa_aworg = ' ' OR
copa_aworg IS NULL ) AND
copa_awsys eq l_copa_awsys "n_1600939
ORDER BY vrgar rbeln rposn.
ENDIF.
e_subrc = sy-subrc.
DELETE et_item_tab WHERE copa_bwzpt EQ '1'.
ENDFORM. "get_line_item
*–––––––––––––––––––––––-*
FORM doc_display TABLES it_documents STRUCTURE acc_doc
USING i_awtyp
i_awref
i_aworg
i_awsys
i_bukrs "HW397992
i_awtyp_copa.
DATA: eptab TYPE ys_ce0 OCCURS 0 WITH HEADER LINE,
ind TYPE i,
dialog_ke23(40) VALUE 'RKE_KE23_%ERK',
dialog_ke23n(40) VALUE 'RKE_KE23N', " DH 250599
ls_doc TYPE acc_doc. "n_1067081
REPLACE '%ERK' WITH g_erkrs INTO dialog_ke23. " INS PCO
ind = 1.
REFRESH eptab.
LOOP AT it_documents INTO ls_doc
WHERE awtyp EQ i_awtyp_copa
AND display EQ 'X'.
*-
* line item table ITEM_TAB has been filled in
* form COPA_DOCUMENT_RECORD
*-
LOOP AT gt_item_tab_rec WHERE belnr EQ ls_doc-docnr. "n_1067081
MOVE-CORRESPONDING gt_item_tab_rec TO eptab.
APPEND eptab.
ENDLOOP.
IF sy-subrc NE 0. "HW397992
PERFORM doc_record TABLES it_documents
USING i_awtyp
i_awref
i_aworg
i_awsys
i_bukrs
i_awtyp_copa.
LOOP AT gt_item_tab_rec WHERE belnr EQ ls_doc-docnr.
MOVE-CORRESPONDING gt_item_tab_rec TO eptab.
APPEND eptab.
ENDLOOP.
CHECK sy-subrc EQ 0.
ENDIF. "HW397992
* display line item
* im folgenden ausgesternt: Absprung in alte KE23 " DH 250599
* CALL DIALOG DIALOG_KE23 " DH 250599
* EXPORTING " DH 250599
* EP_TAB FROM EPTAB " DH 250599
* INDEX_DISP_EP FROM IND. " DH 250599
* Absprung in neue KE23N " DH 250599
EXPORT ep_tab FROM eptab TO MEMORY ID 'KE23N'. " DH 250599
CALL DIALOG dialog_ke23n AND SKIP FIRST SCREEN " DH 250599
EXPORTING index_ep FROM ind " DH 250599
g_erkrs FROM g_erkrs. " DH 150699
ENDLOOP.
ENDFORM. "doc_display
*–––––––––––––––––––––––-*
FORM alt_perio USING xs_item TYPE ys_ce1
i_budat
i_monat
i_erkrs
i_paledger.
STATICS: as_tkeb TYPE tkeb. "n1532916
DATA: l_perspec LIKE t009b-poper.
IF as_tkeb-erkrs <> i_erkrs. "n1532916
SELECT SINGLE * FROM tkeb "n1532916
INTO as_tkeb "n1532916
WHERE erkrs EQ i_erkrs. "n1532916
ENDIF.
l_perspec = i_monat.
CALL FUNCTION 'RKE_CONVERT_DATE_TO_LOGNR'
EXPORTING
date = i_budat
erkrs = i_erkrs
perspec = l_perspec
IMPORTING
perio = xs_item-perio
perio2 = xs_item-altperio
EXCEPTIONS
i_erkrs_notfound = 2
i_error = 3
i_periv_notedited = 5
i_perspec_invalid = 6
OTHERS = 7.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
IF as_tkeb-useper2i IS INITIAL. "n1532916
CLEAR xs_item-altperio.
ENDIF.
ENDFORM. "alt_perio
*–––––––––––––––––––––––*
FORM get_criteria_for_paobjnr USING i_ce1 TYPE ys_ce1.
"structure ce1%erk.
DATA: i_ce4 TYPE ys_ce4 OCCURS 0 WITH HEADER LINE.
CHECK NOT i_ce1-paobjnr IS INITIAL.
CLEAR i_ce4.
REFRESH i_ce4.
MOVE-CORRESPONDING i_ce1 TO i_ce4.
i_ce4-aufnr = i_ce1-rkaufnr. "n1737730
i_ce4-aktbo = 'X'.
APPEND i_ce4.
CALL FUNCTION 'RKE_GET_CRITERIA_FOR_CE4KEY'
EXPORTING
i_erkrs = g_erkrs
i_use_tkeoe = 'X'
i_pa_type = '1'
TABLES
object_table = i_ce4
EXCEPTIONS
OTHERS = 2.
* call function 'RKE_GET_CRITERIA_FOR_PAOBJNR'
* exporting
* erkrs = g_erkrs
* use_tkeoe = 'X'
* pa_type = '1'
* tables
* object_table = i_ce4
* exceptions
* paobjnr_not_found = 1
* others = 2.
IF sy-subrc EQ 1.
MESSAGE ID 'KE' TYPE 'E' NUMBER '499' WITH i_ce1-paobjnr g_erkrs.
ELSEIF sy-subrc EQ 2.
RAISE program_error.
ELSE.
*-
READ TABLE i_ce4 INDEX 1.
MOVE-CORRESPONDING i_ce4 TO i_ce1.
i_ce1-rkaufnr = i_ce4-aufnr. "n1737730
*-
ENDIF.
ENDFORM. "get_criteria_for_paobjnr
FORM get_criteria_for_acctnr USING i_ce1 TYPE ys_ce1."structure ce1%erk.
DATA: i_ce4 TYPE ys_ce4 OCCURS 0 WITH HEADER LINE.
CHECK NOT i_ce1-paobjnr IS INITIAL.
CLEAR i_ce4.
REFRESH i_ce4.
MOVE-CORRESPONDING i_ce1 TO i_ce4.
i_ce4-aufnr = i_ce1-rkaufnr. "n1737730
i_ce4-aktbo = 'X'.
APPEND i_ce4.
CALL FUNCTION 'RKE_GET_CRITERIA_FOR_ACCTNR'
EXPORTING
i_erkrs = g_erkrs
TABLES
object_table = i_ce4
EXCEPTIONS
OTHERS = 2.
IF sy-subrc EQ 1.
MESSAGE ID 'KE' TYPE 'E' NUMBER '499' WITH i_ce1-paobjnr g_erkrs.
ELSEIF sy-subrc EQ 2.
RAISE program_error.
ELSE.
*-
READ TABLE i_ce4 INDEX 1.
MOVE-CORRESPONDING i_ce4 TO i_ce1.
i_ce1-rkaufnr = i_ce4-aufnr. "n1737730
*-
ENDIF.
ENDFORM. "get_criteria_for_acctnr
*–––––––––––––––––––––––*
FORM check_item_exists USING i_awtyp
i_aworg
i_awsys
i_rbeln
i_rposn
i_vrgar
e_belnr.
DATA: ce1_acc TYPE ys_ce1_acc.
DATA: ce1_data TYPE ys_ce1_data.
ce1_acc-vrgar = i_vrgar.
ce1_acc-rbeln = i_rbeln.
ce1_acc-rposn = i_rposn.
PERFORM ce1_read_reference USING ce1_acc ce1_data g_read_failed.
IF g_read_failed IS INITIAL.
e_belnr = ce1_data-belnr.
ELSE.
CLEAR e_belnr.
ENDIF.
ENDFORM. "check_item_exists
*–––––––––––––––––––––––-*
FORM get_object_number USING line_item TYPE ys_ce0
paobjnr.
DATA: struc_ce0 TYPE ys_ce0,
ce4_tab TYPE ys_ce4 OCCURS 0 WITH HEADER LINE.
DATA: BEGIN OF key_cest4,
aktbo LIKE cest4-aktbo,
paobjnr LIKE cest4-paobjnr,
pasubnr LIKE cest4-pasubnr,
END OF key_cest4.
struc_ce0 = line_item.
CLEAR ce4_tab.
MOVE-CORRESPONDING struc_ce0 TO ce4_tab.
ce4_tab-aufnr = struc_ce0-rkaufnr.
MOVE-CORRESPONDING key_cest4 TO ce4_tab. "damit Initialwerte korrekt
APPEND ce4_tab.
CALL FUNCTION 'RKE_GET_ACCTNR'
EXPORTING
i_erkrs = g_erkrs
i_vorgang = ' '
TABLES
object_table = ce4_tab.
* call function 'RKE_GET_OBJECT_NUMBER'
* exporting
* erkrs = g_erkrs
* pa_type = '1'
* tables
* object_table = ce4_tab.
READ TABLE ce4_tab INDEX 1.
paobjnr = ce4_tab-paobjnr.
ENDFORM. "get_object_number
*
*–––––––––––––––––––––––-*
FORM check_line_item TABLES it_dbtable
USING line_item TYPE ys_ce1.
DATA: struc_ce1 TYPE ys_ce1,
tabname LIKE dd02v-tabname. " value 'CE0%ERK'.
tabname = c_ce1name.
struc_ce1 = line_item.
CALL FUNCTION 'COPA_DOCUMENT_ITEM_CHECK'
EXPORTING
i_line_item = struc_ce1
i_tabname = tabname
TABLES
t_dbtable = it_dbtable
EXCEPTIONS
error_criterion = 1
OTHERS = 2.
line_item = struc_ce1.
ENDFORM. "check_line_item
*–––––––––––––––––––––––-*
* FORM MOVE_ITEM_TO_STRUCTURE
*–––––––––––––––––––––––-*
FORM move_item_to_structure USING line_item
pa_crit LIKE accit_pa
pa_val LIKE acccr_pa.
DATA: ls_ce0 TYPE ys_ce0.
ls_ce0 = line_item.
MOVE-CORRESPONDING ls_ce0 TO pa_crit.
MOVE-CORRESPONDING ls_ce0 TO pa_val.
ENDFORM. "move_item_to_structure
*–––––––––––––––––––––––-*
* FORM INITIALIZE_ITEM
*–––––––––––––––––––––––-*
FORM initialize_item USING i_structure
CHANGING es_line_item.
DATA: ls_ce0 TYPE ys_ce0,
ls_ce1 TYPE ys_ce1.
CASE i_structure.
*-
WHEN 'CE0'.
*-
es_line_item = ls_ce0.
*-
WHEN 'CE1'.
*-
es_line_item = ls_ce1.
*-
ENDCASE.
ENDFORM. "initialize_item
*–––––––––––––––––––––––-*
* FORM MOVE_CRITERIA_TO_ITEM
FORM move_criteria_to_item USING i_structure
is_cest1 LIKE cest1
is_criteria_v LIKE copacrit
CHANGING es_line_item.
DATA: ls_ce0 TYPE ys_ce0,
ls_ce1 TYPE ys_ce1.
CASE i_structure.
*-
WHEN 'CE0'.
*-
IF NOT is_cest1 IS INITIAL.
MOVE-CORRESPONDING is_cest1 TO ls_ce0.
ENDIF.
IF NOT is_criteria_v IS INITIAL.
MOVE-CORRESPONDING is_criteria_v TO ls_ce0.
ENDIF.
es_line_item = ls_ce0.
*-
WHEN 'CE1'.
*-
IF NOT is_cest1 IS INITIAL.
MOVE-CORRESPONDING is_cest1 TO ls_ce1.
ENDIF.
IF NOT is_criteria_v IS INITIAL.
MOVE-CORRESPONDING is_criteria_v TO ls_ce1.
ENDIF.
es_line_item = ls_ce1.
ENDCASE.
ENDFORM. "move_criteria_to_item
*–––––––––––––––––––––––-*
* FORM MOVE_ITEM_TO_CRITERIA
*–––––––––––––––––––––––-*
*
is_line_item
CHANGING es_cest1 LIKE cest1
es_criteria_v LIKE copacrit.
DATA: ls_ce0 TYPE ys_ce0,
ls_ce1 TYPE ys_ce1.
CASE i_structure.
*-
WHEN 'CE0'.
*-
ls_ce0 = is_line_item.
MOVE-CORRESPONDING ls_ce0 TO es_cest1.
MOVE-CORRESPONDING ls_ce0 TO es_criteria_v.
*-
WHEN 'CE1'.
*-
ls_ce1 = is_line_item.
MOVE-CORRESPONDING ls_ce1 TO es_cest1.
MOVE-CORRESPONDING ls_ce1 TO es_criteria_v.
*-
ENDCASE.
ENDFORM. "move_item_to_criteria
*–––––––––––––––––––––––-*
* FORM MOVE_STRUCTURE_TO_ITEM
*–––––––––––––––––––––––-*
*–––––––––––––––––––––––-*
FORM move_structure_to_item USING i_structure
is_accit LIKE accit
is_accit_pa LIKE accit_pa
CHANGING es_line_item.
DATA: ls_ce0 TYPE ys_ce0,
ls_ce1 TYPE ys_ce1.
CASE i_structure.
*-
WHEN 'CE0'.
*-
IF NOT is_accit IS INITIAL.
MOVE-CORRESPONDING is_accit TO ls_ce0.
MOVE is_accit-kunag TO ls_ce0-kndnr.
MOVE is_accit-matnr TO ls_ce0-artnr.
MOVE is_accit-aubel TO ls_ce0-kaufn.
MOVE is_accit-aupos TO ls_ce0-kdpos.
IF is_accit-aubel IS INITIAL.
MOVE is_accit-kdauf TO ls_ce0-kaufn.
MOVE is_accit-kdpos TO ls_ce0-kdpos.
ENDIF.
MOVE is_accit-aufnr TO ls_ce0-rkaufnr.
MOVE is_accit-kostl TO ls_ce0-skost.
MOVE is_accit-ps_psp_pnr TO ls_ce0-pspnr.
ENDIF.
IF NOT is_accit_pa IS INITIAL.
MOVE-CORRESPONDING is_accit_pa TO ls_ce0.
ENDIF.
es_line_item = ls_ce0.
*-
WHEN 'CE1'.
*-
IF NOT is_accit IS INITIAL.
MOVE-CORRESPONDING is_accit TO ls_ce1.
MOVE is_accit-kunag TO ls_ce1-kndnr.
MOVE is_accit-matnr TO ls_ce1-artnr.
MOVE is_accit-aubel TO ls_ce1-kaufn.
MOVE is_accit-aupos TO ls_ce1-kdpos.
IF is_accit-aubel IS INITIAL.
MOVE is_accit-kdauf TO ls_ce1-kaufn.
MOVE is_accit-kdpos TO ls_ce1-kdpos.
ENDIF.
MOVE is_accit-aufnr TO ls_ce1-rkaufnr.
MOVE is_accit-kostl TO ls_ce1-skost.
MOVE is_accit-ps_psp_pnr TO ls_ce1-pspnr.
ENDIF.
IF NOT is_accit_pa IS INITIAL.
MOVE-CORRESPONDING is_accit_pa TO ls_ce1.
ENDIF.
es_line_item = ls_ce1.
*-
ENDCASE.
ENDFORM. "move_structure_to_item
*–––––––––––––––––––––––*
* FORM ITEMS_SEND *
*–––––––––––––––––––––––*
* send items to memory *
*–––––––––––––––––––––––*
* –> I_MEMORY_ID *
*–––––––––––––––––––––––*
FORM items_send USING i_memory_id.
DATA: lt_wa TYPE TABLE OF ys_ce0.
IF NOT i_memory_id IS INITIAL.
lt_wa[] = gt_item_log[].
EXPORT lt_wa TO MEMORY ID i_memory_id.
CLEAR gt_item_log[].
ENDIF.
ENDFORM. "items_send
*–––––––––––––––––––––––*
* FORM ITEMS_RECEIVE *
*–––––––––––––––––––––––*
* Get logged items (e.g. for displaying log) *
*–––––––––––––––––––––––*
* <– ITEMS items *
*–––––––––––––––––––––––*
FORM items_receive USING i_memory_id
CHANGING et_item TYPE rkei1_yt_wa.
FIELD-SYMBOLS: <l_item> TYPE x,
<ls_wa> TYPE x,
<ls_log> TYPE x.
DATA: lt_wa TYPE TABLE OF ys_ce0,
ls_wa TYPE ys_ce0,
ls_log TYPE ys_ce0,
l_item TYPE rkei1_y_wa.
IF NOT i_memory_id IS INITIAL.
*-
* Return from memory …
*-
IMPORT lt_wa FROM MEMORY ID i_memory_id.
LOOP AT lt_wa[] INTO ls_wa.
ASSIGN ls_wa TO <ls_wa> CASTING.
ASSIGN l_item TO <l_item> CASTING.
<l_item> = <ls_wa>.
APPEND l_item TO et_item.
ENDLOOP.
ELSE.
*-
* Return from program …
*-
LOOP AT gt_item_log INTO ls_log.
ASSIGN ls_log TO <ls_log> CASTING.
ASSIGN l_item TO <l_item> CASTING.
<l_item> = <ls_log>.
APPEND l_item TO et_item.
ENDLOOP.
CLEAR gt_item_log[].
ENDIF.
ENDFORM. "items_receive
*–––––––––––––––––––––––*
* FORM CE4_READ *
*–––––––––––––––––––––––*
* Pufferroutine (Lesen Kontierung) *
*–––––––––––––––––––––––*
* –> KEY *
* –> DATA *
* –> READ_FAILED *
*–––––––––––––––––––––––*
FORM ce4_read USING key TYPE ys_ce4_key
data TYPE ys_ce4_data
read_failed.
DATA: entry TYPE ys_ce4_buffer_entry,
insert_mode(1),
index TYPE i,
i_ce4 TYPE ys_ce4 OCCURS 0 WITH HEADER LINE.
CLEAR read_failed.
CLEAR data.
gs_statistics-buffer-accesses = gs_statistics-buffer-accesses + 1.
gs_ce4_statistics-accesses = gs_ce4_statistics-accesses + 1.
READ TABLE gt_ce4_buffer INTO entry
WITH KEY key = key
BINARY SEARCH.
IF sy-subrc = 0.
gs_statistics-buffer-hits = gs_statistics-buffer-hits + 1.
gs_ce4_statistics-hits = gs_ce4_statistics-hits + 1.
IF entry-is_in_db IS INITIAL.
read_failed = 'X'.
ELSE.
data = entry-data.
ENDIF.
ELSE.
index = sy-tabix.
IF sy-subrc = 4.
insert_mode = 'I'.
ELSE.
insert_mode = 'A'.
ENDIF.
CLEAR i_ce4.
REFRESH i_ce4.
i_ce4-aktbo = 'X'.
i_ce4-paobjnr = key-paobjnr.
i_ce4-pasubnr = key-pasubnr.
APPEND i_ce4.
CALL FUNCTION 'RKE_GET_CRITERIA_FOR_ACCTNR'
EXPORTING
i_erkrs = g_erkrs
TABLES
object_table = i_ce4
EXCEPTIONS
OTHERS = 2.
* call function 'RKE_GET_CRITERIA_FOR_PAOBJNR'
* exporting
* erkrs = g_erkrs
* tables
* object_table = i_ce4
* exceptions
* paobjnr_not_found = 1
* others = 2.
IF sy-subrc = 0.
READ TABLE i_ce4 INDEX 1.
MOVE-CORRESPONDING i_ce4 TO data.
entry-is_in_db = 'X'.
ELSE.
CLEAR entry-is_in_db.
read_failed = 'X'.
ENDIF.
entry-key = key.
entry-data = data.
CASE insert_mode.
WHEN 'I'.
INSERT entry INTO gt_ce4_buffer INDEX index.
WHEN 'A'.
APPEND entry TO gt_ce4_buffer.
ENDCASE.
ENDIF.
ENDFORM. "CE4_READ
*–––––––––––––––––––––––*
* FORM CE1_READ_REFERENCE *
*–––––––––––––––––––––––*
* Pufferroutine CE1 via RBELN/RPOSN *
*–––––––––––––––––––––––*
* –> ACC *
* –> DATA *
* –> READ_FAILED *
*–––––––––––––––––––––––*
FORM ce1_read_reference USING acc TYPE ys_ce1_acc
data TYPE ys_ce1_data
read_failed.
DATA: ls_ce1 TYPE ys_ce1.
DATA: entry TYPE ys_ce1_buffer_entry.
DATA: insert_mode(1).
DATA: index TYPE i.
DATA: lin TYPE i.
DESCRIBE TABLE gt_ce1_buffer LINES lin.
IF lin GT 500.
CLEAR gt_ce1_buffer.
REFRESH gt_ce1_buffer.
ENDIF.
CLEAR read_failed.
CLEAR data.
gs_statistics-buffer-accesses = gs_statistics-buffer-accesses + 1.
gs_ce1_statistics-accesses = gs_ce1_statistics-accesses + 1.
READ TABLE gt_ce1_buffer INTO entry
WITH KEY acc = acc
BINARY SEARCH.
IF sy-subrc = 0.
gs_statistics-buffer-hits = gs_statistics-buffer-hits + 1.
gs_ce1_statistics-hits = gs_ce1_statistics-hits + 1.
IF entry-is_in_db IS INITIAL.
read_failed = 'X'.
ELSE.
data = entry-data.
ENDIF.
ELSE.
index = sy-tabix.
IF sy-subrc = 4.
insert_mode = 'I'.
ELSE.
insert_mode = 'A'.
ENDIF.
SELECT * FROM (c_ce1name) INTO ls_ce1 WHERE
vrgar = acc-vrgar AND
rbeln = acc-rbeln AND
rposn = acc-rposn.
EXIT.
ENDSELECT.
IF sy-subrc = 0.
MOVE-CORRESPONDING ls_ce1 TO data.
entry-is_in_db = 'X'.
ELSE.
CLEAR entry-is_in_db.
read_failed = 'X'.
ENDIF.
entry-acc = acc.
entry-data = data.
CASE insert_mode.
WHEN 'I'.
INSERT entry INTO gt_ce1_buffer INDEX index.
WHEN 'A'.
APPEND entry TO gt_ce1_buffer.
ENDCASE.
ENDIF.
ENDFORM. "ce1_read_reference
*–––––––––––––––––––––––*
* FORM T001_READ *
*–––––––––––––––––––––––*
* Pufferroutine *
*–––––––––––––––––––––––*
* –> KEY *
* –> DATA *
* –> READ_FAILED *
*–––––––––––––––––––––––*
FORM t001_read USING key TYPE y_t001_key
data TYPE y_t001_data
read_failed.
DATA: entry TYPE y_t001_buffer_entry.
DATA: insert_mode(1).
DATA: index TYPE i.
CLEAR read_failed.
CLEAR data.
gs_statistics-buffer-accesses = gs_statistics-buffer-accesses + 1.
gs_t001_statistics-accesses = gs_t001_statistics-accesses + 1.
READ TABLE gt_t001_buffer INTO entry
WITH KEY key = key
BINARY SEARCH.
IF sy-subrc = 0.
gs_statistics-buffer-hits = gs_statistics-buffer-hits + 1.
gs_t001_statistics-hits = gs_t001_statistics-hits + 1.
IF entry-is_in_db IS INITIAL.
read_failed = 'X'.
ELSE.
data = entry-data.
ENDIF.
ELSE.
index = sy-tabix.
IF sy-subrc = 4.
insert_mode = 'I'.
ELSE.
insert_mode = 'A'.
ENDIF.
SELECT SINGLE * FROM t001 WHERE bukrs = key-bukrs.
IF sy-subrc = 0.
MOVE-CORRESPONDING t001 TO data.
entry-is_in_db = 'X'.
ELSE.
CLEAR entry-is_in_db.
read_failed = 'X'.
ENDIF.
entry-key = key.
entry-data = data.
CASE insert_mode.
WHEN 'I'.
INSERT entry INTO gt_t001_buffer INDEX index.
WHEN 'A'.
APPEND entry TO gt_t001_buffer.
ENDCASE.
ENDIF.
ENDFORM. "T001_READ
*–––––––––––––––––––––––*
* FORM REVERSE_ITEMS_CHECK *
*–––––––––––––––––––––––*
* Check if table contains pairs of items that are reversed. *
*–––––––––––––––––––––––*
* –> XT_ITEM table with line items *
*–––––––––––––––––––––––*
FORM reverse_items_check CHANGING xt_item TYPE yt_item.
DATA: lt_item_in TYPE yt_item.
FIELD-SYMBOLS: <row_item_in> TYPE ys_item.
lt_item_in[] = xt_item[].
LOOP AT lt_item_in ASSIGNING <row_item_in>
WHERE NOT sto_belnr IS INITIAL.
*-
* Delete items that are already reversed …
*-
DELETE xt_item WHERE belnr EQ <row_item_in>-sto_belnr
AND posnr EQ <row_item_in>-sto_posnr
AND paledger EQ <row_item_in>-paledger.
CHECK sy-subrc EQ 0.
*-
* Original item deleted -> delete reversal, too …
*-
DELETE xt_item WHERE belnr EQ <row_item_in>-belnr
AND posnr EQ <row_item_in>-posnr
AND paledger EQ <row_item_in>-paledger.
ENDLOOP.
ENDFORM. "reverse_items_check
*–––––––––––––––––––––––*
* FORM UPDATE_AND_VALUATE_AND_RESET *
*–––––––––––––––––––––––*
* update standard measures,
* valuate line items,
* reset value fields .
*
* !! global table gt_item must be sorted by paledger
*––––––––––––––––––––––*
FORM update_and_valuate_and_reset
TABLES it_dbtable STRUCTURE gs_dbtable
USING is_trace_mode TYPE rkei1_ys_trace_mode
i_cancel_val.
STATICS: ls_dbtable LIKE gs_dbtable .
DATA: l_dbtabname LIKE dd02v-tabname, " value 'CE1%ERK' ,
ls_dbtable_key TYPE ys_dbtable_key,
l_trace_vaan TYPE kedr_trace_handle,
l_trace_copc TYPE kedr_trace_handle,
l_convert_via_fc TYPE c,
lt_valuef LIKE rkepr OCCURS 0 WITH HEADER LINE,
BEGIN OF ls_ce1 ,
* pointer auf die 4 Einzelposten in gt_item …
ps_ce1_1 TYPE REF TO data ,
ps_ce1_2 TYPE REF TO data ,
ps_ce1_3 TYPE REF TO data ,
ps_ce1_4 TYPE REF TO data ,
END OF ls_ce1 ,
ps_ce1 TYPE REF TO data ,
lt_ce1 TYPE yt_item ,
ls_item TYPE ys_item ,
l_index TYPE i ,
l_function TYPE trwpr-function.
FIELD-SYMBOLS: <ls_item1> TYPE ys_ce1,
<ls_item2> TYPE ys_ce1,
<lfs> .
l_dbtabname = c_ce1name.
LOOP AT gt_item ASSIGNING <ls_item1> .
*-
GET REFERENCE OF <ls_item1> INTO ps_ce1 .
*-
CASE <ls_item1>-paledger .
WHEN '01' .
ls_ce1-ps_ce1_1 = ps_ce1 .
WHEN '02' .
ls_ce1-ps_ce1_2 = ps_ce1 .
WHEN '03' .
ls_ce1-ps_ce1_3 = ps_ce1 .
WHEN '04' .
ls_ce1-ps_ce1_4 = ps_ce1 .
ENDCASE .
*-
ENDLOOP .
CLEAR l_index .
*-
* Convert quantity to standard unit of measure …
*-
DO 4 TIMES .
ADD 1 TO l_index .
ASSIGN COMPONENT l_index OF STRUCTURE ls_ce1 TO <lfs> .
ASSIGN <lfs>->* TO <ls_item1> .
IF sy-subrc EQ 0 . " line item for ledger l_index exists
CALL FUNCTION 'COPA_UPDATE_STANDARD_MEASURES'
EXPORTING
i_tabname = l_dbtabname
i_copa_line_item = <ls_item1>
i_do_not_overwrite = 'X'
IMPORTING
e_copa_line_item = <ls_item1>
TABLES
i_fieldtab = it_dbtable
EXCEPTIONS
conversion_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING error_project_copa.
ENDIF.
ENDIF .
ENDDO .
*-
* Perform CO-PA valuation …
*-
CLEAR l_index .
DO 2 TIMES. " once for legal, once for profit center valuation
ADD 1 TO l_index .
REFRESH lt_ce1 .
UNASSIGN <ls_item1> .
UNASSIGN <ls_item2> .
ASSIGN COMPONENT l_index OF STRUCTURE ls_ce1 TO <lfs> .
ASSIGN <lfs>->* TO <ls_item1> .
IF sy-subrc EQ 0 . " ledger 1 or 3 exists .
ADD 1 TO l_index .
ASSIGN COMPONENT l_index OF STRUCTURE ls_ce1 TO <lfs> .
ASSIGN <lfs>->* TO <ls_item2> .
IF sy-subrc EQ 0 .
APPEND <ls_item2> TO lt_ce1 .
IF ( NOT <ls_item1>-frwae IS INITIAL ) "HW788669
AND ( <ls_item1>-frwae EQ <ls_item2>-frwae ).
l_convert_via_fc = 'X' .
ELSE .
CLEAR l_convert_via_fc .
ENDIF.
ELSE .
CLEAR l_convert_via_fc .
ENDIF .
ELSE .
CLEAR l_convert_via_fc. "JW HW364695
ADD 1 TO l_index .
ASSIGN COMPONENT l_index OF STRUCTURE ls_ce1 TO <lfs> .
ASSIGN <lfs>->* TO <ls_item1> .
ENDIF.
IF <ls_item1> IS ASSIGNED .
CALL FUNCTION 'RKE_PRICING_INTERFACE_ACT'
EXPORTING
i_erkrs = g_erkrs
i_kurst = 'M'
i_convert_via_foreign_currency = l_convert_via_fc
i_bwfkt = '01'
i_storno = i_cancel_val
i_trace_mode_bean = is_trace_mode-valu
i_trace_mode_copc = is_trace_mode-valu
is_copa_item_input = <ls_item1>
IMPORTING
es_copa_item_output = <ls_item1>
e_trace_handle_bean = l_trace_vaan
e_trace_handle_copc = l_trace_copc
TABLES
it_fieldtab = it_dbtable
xt_wertkomp = lt_valuef
xt_item_bukrs = lt_ce1
EXCEPTIONS
valuation_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING error_project_copa.
ENDIF.
IF <ls_item2> IS ASSIGNED . " 2 ledgers involved
LOOP AT lt_ce1 INTO <ls_item2> .
EXIT .
ENDLOOP .
ENDIF.
IF NOT is_trace_mode-valu IS INITIAL.
* Write trace
PERFORM trace_valuation
USING <ls_item1>
l_trace_vaan
l_trace_copc.
ENDIF.
ENDIF. " <ls_item1> is assigned
ENDDO .
ls_dbtable_key-tabname = c_ce0name.
*-
* Build int. table TKEVA10
*-
DESCRIBE TABLE gt_int_tkeva10 LINES g_lin.
READ TABLE gt_int_tkeva10 INDEX 1.
IF g_lin = 0
OR g_erkrs NE gt_int_tkeva10-erkrs.
REFRESH gt_int_tkeva10.
READ TABLE gt_item INDEX 1 INTO ls_item.
*-
CASE ls_item-copa_awtyp.
*-
WHEN rkei1_ycs_awtyp-jhtfk.
*- IS-Media
l_function = 'ISM_TJHTKEVA10_READ'.
PERFORM ism_tkeva10_read USING l_function
CHANGING gt_int_tkeva10[].
*-
WHEN rkei1_ycs_awtyp-jfrk
OR rkei1_ycs_awtyp-jfcp
OR rkei1_ycs_awtyp-jfap.
*-
l_function = 'ISM_TJFTKEVA10_READ'.
PERFORM ism_tkeva10_read USING l_function
CHANGING gt_int_tkeva10[].
*-
WHEN OTHERS.
SELECT * FROM tkeva10
INTO TABLE gt_int_tkeva10
WHERE erkrs = g_erkrs.
ENDCASE.
ENDIF.
*-
* Perform reset value fields ….
*-
CLEAR l_index .
DO 4 TIMES .
ADD 1 TO l_index .
*-
ASSIGN COMPONENT l_index OF STRUCTURE ls_ce1 TO <lfs> .
ASSIGN <lfs>->* TO <ls_item1> .
*-
IF sy-subrc EQ 0 . " line item for ledger l_index exists
LOOP AT gt_int_tkeva10
WHERE fkart EQ <ls_item1>-fkart
AND wdele EQ 'X'.
ls_dbtable_key-fieldname = gt_int_tkeva10-wertkomp.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
IF sy-subrc = 0.
ASSIGN COMPONENT it_dbtable-pos_ce1 OF STRUCTURE <ls_item1>
TO <value> TYPE it_dbtable-inttype
DECIMALS it_dbtable-decimals.
IF sy-subrc EQ 0.
* Reset value field …
<value> = 0.
ENDIF.
ELSE.
* CO-PA: error reading fieldtab
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
ENDLOOP.
ENDIF .
ENDDO .
* modify gt_item index l_tabix.
ENDFORM . "update_and_valuate_and_reset
*-
*
*-
FORM delete_zero_items CHANGING x_mix_ledger. "note 180213
DATA: ls_item_val TYPE ys_item_val,
ls_item TYPE ys_ce1.
LOOP AT gt_item INTO ls_item.
MOVE-CORRESPONDING ls_item TO ls_item_val.
IF ls_item_val IS INITIAL.
DELETE gt_item.
x_mix_ledger = 'X'.
ENDIF.
ENDLOOP.
ENDFORM. "delete_zero_items
*
************************************************************************
FORM reset_field_s TABLES it_dbtable STRUCTURE gs_dbtable
CHANGING ls_item TYPE ys_ce1.
* This form is OBSOLETE as of release 4.6C ( coding has been replaced
* by subroutine 'update_and_valuate_and_reset'
DATA: ls_dbtable_key TYPE ys_dbtable_key,
l_tabix LIKE sy-tabix.
ls_dbtable_key-tabname = c_ce0name.
*-
* Build int. table TKEVA10 …
*-
DESCRIBE TABLE gt_int_tkeva10 LINES g_lin.
READ TABLE gt_int_tkeva10 INDEX 1.
IF g_lin = 0
OR g_erkrs NE gt_int_tkeva10-erkrs.
REFRESH gt_int_tkeva10.
SELECT * FROM tkeva10 INTO TABLE gt_int_tkeva10
WHERE erkrs = g_erkrs.
ENDIF.
*-
* Check, if reset of the value is desired?
*-
LOOP AT gt_int_tkeva10 WHERE fkart EQ ls_item-fkart
AND wdele EQ 'X'.
ls_dbtable_key-fieldname = gt_int_tkeva10-wertkomp.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
IF sy-subrc = 0.
ASSIGN COMPONENT it_dbtable-pos_ce1 OF STRUCTURE ls_item
TO <value> TYPE it_dbtable-inttype
DECIMALS it_dbtable-decimals.
IF sy-subrc EQ 0.
* Reset value …
<value> = 0.
ENDIF.
ELSE.
* CO-PA: error reading fieldtab
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
ENDLOOP.
ENDFORM. "RESET_FIELD_S
************************************************************************
* ************************************************************************
FORM copy_value_curr_types_s TABLES it_dbtable STRUCTURE gs_dbtable
USING i_paledger_n
it_paledger_nn TYPE rkei1_yt_ledger
i_belnr TYPE ys_ce1-belnr.
DATA: ls_item_n TYPE ys_ce1,
ls_item_nn TYPE ys_ce1,
ls_item_n_new TYPE ys_ce1,
ls_item_n_old TYPE ys_ce1,
ls_item_old TYPE ys_ce1,
ls_item_val TYPE ys_item_val,
ls_field TYPE rkei1_ys_field,
lt_field TYPE rkei1_yt_field,
ls_ledger TYPE LINE OF rkei1_yt_ledger,
l_amount_item_n LIKE acccr-wrbtr,
l_amount_item_nn LIKE acccr-wrbtr,
l_value_for LIKE acccr-wrbtr,
l_waers_ledger_n LIKE tkeb-waers,
l_waers_ledger_nn LIKE tkeb-waers,
l_convert_ind,
l_index LIKE sy-index,
l_rate LIKE cest1-kursf,
l_rate_foreign LIKE cest1-kursf,
l_continue,
ls_dbtable_key TYPE ys_dbtable_key,
l_tabix LIKE sy-tabix.
ls_dbtable_key-tabname = c_ce0name.
l_continue = 'X'.
READ TABLE gt_item INTO ls_item_n
WITH KEY paledger = i_paledger_n
belnr = i_belnr.
*-
* Get currency of ledger n of operating concern …
*-
PERFORM get_currency USING g_erkrs
i_paledger_n
ls_item_n-bukrs
CHANGING gt_v_curr.
READ TABLE gt_v_curr INTO gs_v_curr INDEX 1.
IF ( sy-subrc NE 0
OR ls_item_n-paledger NE gs_v_curr-paledger ) .
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
ENDIF.
l_waers_ledger_n = gs_v_curr-waers.
* Item ledger n after valuation
MOVE-CORRESPONDING ls_item_n TO ls_item_n_new.
* Item ledger n before valuation
MOVE-CORRESPONDING gs_item_old TO ls_item_n_old.
*-
* Complete item with other ledger nn …
*-
LOOP AT it_paledger_nn INTO ls_ledger.
READ TABLE gt_item INTO ls_item_nn
WITH KEY paledger = ls_ledger
belnr = i_belnr.
l_tabix = sy-tabix.
*-
* Get currency for ledger nn …
*-
PERFORM get_currency USING g_erkrs
ls_item_nn-paledger
ls_item_nn-bukrs
CHANGING gt_v_curr.
READ TABLE gt_v_curr INTO gs_v_curr INDEX 1.
IF ( sy-subrc NE 0
OR ls_item_nn-paledger NE gs_v_curr-paledger ) .
MESSAGE ID 'KE' TYPE 'X' NUMBER '476' RAISING creation_error.
ENDIF.
l_waers_ledger_nn = gs_v_curr-waers.
*-
* Check whether currencies are identical …
*-
IF l_waers_ledger_n
EQ l_waers_ledger_nn.
ls_item_nn = ls_item_n_new.
ls_item_nn-paledger = ls_ledger-paledger.
MODIFY gt_item FROM ls_item_nn INDEX l_tabix.
CLEAR l_continue.
ENDIF.
CHECK NOT l_continue IS INITIAL.
*-
* Determine how to convert …
*-
IF ls_item_nn-frwae
NE ls_item_n-frwae.
* Different FRWAE for ledgers: determine adapted rate for conversion
CLEAR l_convert_ind.
ELSE.
l_convert_ind = 'X'.
ENDIF.
IF l_convert_ind IS INITIAL.
*-
* Get conversion factor from ledger n to ledger nn …
*-
PERFORM compare_item_get_value USING ls_item_n_old
ls_item_nn
CHANGING l_amount_item_n
l_amount_item_nn.
IF NOT l_amount_item_n IS INITIAL.
* Other value fields filled: determine conversion factor …
CALL FUNCTION 'COPA_CALCULATE_EXCHANGE_RATE'
EXPORTING
i_erkrs = g_erkrs
i_date = ls_item_nn-budat
i_amount_from = l_amount_item_nn
i_currency_from = gs_v_curr-waers
i_amount_to = l_amount_item_n
i_currency_to = l_waers_ledger_n
i_type_of_rate = 'M'
IMPORTING
e_exchange_rate = l_rate
EXCEPTIONS
error_rate = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING error_rate.
ENDIF.
ENDIF. "not l_amount
ENDIF. "l_convert_ind
*-
* Get fields that are changed by valuation …
*-
CALL FUNCTION 'COPA_COMPARE_ITEMS'
EXPORTING
i_erkrs = g_erkrs
i_item_one = ls_item_n_old
i_item_two = ls_item_n_new
i_compare_fields = 'A'
IMPORTING
et_field = lt_field
EXCEPTIONS
OTHERS = 0.
DESCRIBE TABLE lt_field LINES g_lin.
IF g_lin GT 0.
LOOP AT lt_field INTO ls_field.
ls_dbtable_key-fieldname = ls_field-fieldname.
READ TABLE it_dbtable WITH KEY ls_dbtable_key BINARY SEARCH.
IF sy-subrc = 0.
CASE it_dbtable-datatype. "YKC142150
*-
WHEN 'CURR' OR 'QUAN'. "YKC142150
*-
ASSIGN COMPONENT it_dbtable-pos_ce1
OF STRUCTURE ls_item_nn
TO <value> TYPE it_dbtable-inttype
DECIMALS it_dbtable-decimals.
ASSIGN COMPONENT it_dbtable-pos_ce1
OF STRUCTURE ls_item_n_new
TO <value_source> TYPE it_dbtable-inttype
DECIMALS it_dbtable-decimals.
*-
WHEN 'UNIT'. "YKC142150
*-
ASSIGN COMPONENT it_dbtable-pos_ce1 "YKC142150
OF STRUCTURE ls_item_nn
TO <value>. "YKC142150
ASSIGN COMPONENT it_dbtable-pos_ce1 "YKC142150
OF STRUCTURE ls_item_n_new
TO <value_source>. "YKC142150
*-
WHEN OTHERS. "YKC142150
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'. "YKC142150
*-
ENDCASE. "YKC142150
IF sy-subrc EQ 0.
IF it_dbtable-datatype EQ 'CURR'.
*-
* Move value after currency conversion …
*-
IF l_convert_ind IS INITIAL.
*-
* Direct conversion …
*-
PERFORM convert_to_lf_currency
USING g_erkrs
ls_item_nn-budat
l_waers_ledger_n
<value_source>
gs_v_curr-waers
'F'
CHANGING l_rate
<value>.
ELSE.
*-
* Indirect conversion via foreign currency
* 1st step: conversion back to foreign currency
*-
IF ls_item_n-frwae
NE ls_item_nn-frwae.
MESSAGE ID 'KE' TYPE 'X' NUMBER '476'.
* CO-PA: inconsistent foreign currency fields
ENDIF.
l_rate = ls_item_n-kursf.
PERFORM convert_to_lf_currency
USING g_erkrs
ls_item_n-budat
l_waers_ledger_n
<value_source>
ls_item_n-frwae
'F'
CHANGING l_rate
l_value_for.
*-
* 2nd step: conversion to ledger currency …
*-
l_rate = ls_item_nn-kursf.
PERFORM convert_to_lf_currency
USING g_erkrs
ls_item_nn-budat
ls_item_nn-frwae
l_value_for
l_waers_ledger_nn
'L'
CHANGING l_rate
<value>.
ENDIF. "l_convert_ind
*-
ELSEIF it_dbtable-datatype EQ 'QUAN'. "45B ins.
<value> = <value_source>. "45B ins.
*-
ELSEIF it_dbtable-datatype EQ 'UNIT'. "YKC142150
<value> = <value_source>. "YKC142150
*-
ENDIF. "it_dbtable-datatype
*-
MODIFY gt_item FROM ls_item_nn INDEX l_tabix.
ENDIF. "sy-subrc assign
ENDIF.
ENDLOOP. "lt_field
*-
ENDIF.
ENDLOOP. "it_paledger
ENDFORM. " COPY_VALUE_CURR_TYPES_S
*
************************************************************************
FORM provide_temp_belnr_s CHANGING gs_item TYPE ys_ce1.
STATICS: temp_belnr LIKE cest1-belnr.
ADD 1 TO temp_belnr.
gs_item-belnr = temp_belnr.
ENDFORM. " PROVIDE_TEMP_BELNR
************************************************************************
FORM save_item_value_s USING ls_item TYPE ys_ce1.
CLEAR gs_item_old.
MOVE-CORRESPONDING ls_item TO gs_item_old.
ENDFORM. " SAVE_ITEM_VALUE_S
************************************************************************
FORM prepare_items_before_s
TABLES it_dbtable STRUCTURE gs_dbtable
USING i_paledger_n
it_paledger_nn TYPE rkei1_yt_ledger
is_trace_mode TYPE rkei1_ys_trace_mode
i_btrans
i_cancel.
DATA: ls_item TYPE ys_ce1,
ll_tabix LIKE sy-tabix.
* Complete items with other ledgers nn
READ TABLE gt_item INTO ls_item
WITH KEY paledger = i_paledger_n
BINARY SEARCH.
ll_tabix = sy-tabix.
* Save item of ledger n before valuation
PERFORM save_item_value_s USING ls_item.
*-
* Valuate item of ledger n …
*-
PERFORM valuation_item TABLES it_dbtable
USING ls_item
is_trace_mode
i_cancel.
*-
* Reset value fields only for billing …
*-
IF i_btrans = 'SD00'.
PERFORM reset_field_s TABLES it_dbtable
CHANGING ls_item.
ENDIF.
MODIFY gt_item FROM ls_item INDEX ll_tabix.
*-
* Convert and copy fields of valuation to other items with another
* ledger …
*-
PERFORM copy_value_curr_types_s TABLES it_dbtable
USING i_paledger_n
it_paledger_nn
ls_item-belnr.
ENDFORM. " PREPARE_ITEMS_BEFORE_S
* Ende JW HW203779
*–––––––––––––––––––––––*
* FORM READ_T258I *
*–––––––––––––––––––––––*
FORM read_t258i USING is_accit TYPE accit
CHANGING xs_assigned TYPE ys_condition_assignment.
STATICS: at_t258i TYPE TABLE OF t258i,
as_t258i TYPE t258i,
a_erkrs TYPE tkeb-erkrs.
DATA: l_appl TYPE t258i-kapplke,
ls_t258i TYPE t258i,
ls_t685a TYPE t685a.
CLEAR xs_assigned.
IF is_accit-kappl = 'M' .
l_appl = 'M' .
ELSEIF is_accit-kappl(1) = 'J'. "HW370936
l_appl = is_accit-kappl.
ELSE .
l_appl = 'V' .
ENDIF .
*-
* Build T258I …
*-
DESCRIBE TABLE at_t258i LINES sy-tfill.
IF sy-tfill EQ 0
OR g_erkrs NE as_t258i-erkrs
OR l_appl NE as_t258i-kapplke.
REFRESH at_t258i.
SELECT * FROM t258i INTO TABLE at_t258i
WHERE erkrs = g_erkrs AND
kapplke = l_appl.
SORT at_t258i BY kschl.
as_t258i-erkrs = g_erkrs.
as_t258i-kapplke = l_appl.
ENDIF.
*-
* Get condition assignment …
*-
READ TABLE at_t258i INTO ls_t258i
WITH KEY kschl = is_accit-kschl BINARY SEARCH.
IF sy-subrc = 0.
xs_assigned-condition = ls_t258i-kschl.
xs_assigned-val_field = ls_t258i-wertkomp.
xs_assigned-sign = ls_t258i-vorzeich.
ELSE.
*-
* SD condition type created with reference to MM condition type?
*-
IF l_appl = 'M'. "HW370936
SELECT SINGLE * FROM t685a INTO ls_t685a
WHERE kappl = 'V'
AND kschl = is_accit-kschl
AND rkappl = 'M'.
CHECK sy-subrc EQ 0.
SELECT SINGLE * FROM t258i INTO ls_t258i
WHERE erkrs = g_erkrs
AND kapplke = 'V'
AND kschl = is_accit-kschl.
CHECK sy-subrc EQ 0.
xs_assigned-condition = ls_t258i-kschl.
xs_assigned-val_field = ls_t258i-wertkomp.
xs_assigned-sign = ls_t258i-vorzeich.
ENDIF.
ENDIF.
ENDFORM. "read_t258i
*–––––––––––––––––––––––*
* FORM READ_TKEEXCOND01 *
*–––––––––––––––––––––––*
FORM read_tkeexcond02 USING is_accit TYPE accit
CHANGING xs_assigned TYPE ys_condition_assignment.
STATICS: at_tkeexcond02 TYPE TABLE OF tkeexcond02,
as_tkeexcond02 TYPE tkeexcond02.
DATA: ls_tkeexcond02 TYPE tkeexcond02.
CLEAR xs_assigned.
*-
* Build TKEEXCOND02 …
*-
DESCRIBE TABLE at_tkeexcond02 LINES sy-tfill.
IF sy-tfill EQ 0 OR
g_erkrs NE as_tkeexcond02-erkrs.
REFRESH at_tkeexcond02.
SELECT * FROM tkeexcond02 INTO TABLE at_tkeexcond02
WHERE erkrs = g_erkrs.
SORT at_tkeexcond02 BY cond.
as_tkeexcond02-erkrs = g_erkrs.
ENDIF.
*-
* Get condition assignment …
*-
READ TABLE at_tkeexcond02 INTO ls_tkeexcond02
WITH KEY cond = is_accit-kschl BINARY SEARCH.
IF sy-subrc = 0.
xs_assigned-condition = ls_tkeexcond02-cond.
xs_assigned-val_field = ls_tkeexcond02-valuefield.
xs_assigned-sign = ls_tkeexcond02-sign.
ENDIF.
ENDFORM. "read_tkeexcond02
*–––––––––––––––––––––––*
* FORM APPEND_LEDGER
*–––––––––––––––––––––––*
FORM append_ledger USING i_paledger TYPE tkebl-paledger
CHANGING xt_ledger TYPE table.
APPEND i_paledger TO xt_ledger.
ENDFORM. "append_ledger
*–––––––––––––––––––––––*
* FORM DETERMINE_ACT_LEDGERS
*–––––––––––––––––––––––*
FORM determine_act_ledgers USING i_gjahr TYPE cest1-gjahr
it_tkebl TYPE rkea1_t_v_tkebl
i_item_tab
CHANGING xt_act_ledger TYPE rkea1_t_v_tkebl.
FIELD-SYMBOLS: <lt_item> TYPE table.
DATA: l_tp_active TYPE rkea1_flag,
lt_tkebl TYPE rkea1_t_v_tkebl,
ls_tkebl TYPE LINE OF rkea1_t_v_tkebl,
ls_item TYPE ys_item,
l_kokrs TYPE tka00-kokrs.
CLEAR xt_act_ledger[].
lt_tkebl = it_tkebl.
*-
* Determine table with items to post …
*-
CASE i_item_tab.
WHEN 'GT_ITEM'.
ASSIGN gt_item[] TO <lt_item>.
* Cancellation with ke4s
WHEN 'GT_ITEM_REV'.
ASSIGN gt_item_rev[] TO <lt_item>.
ENDCASE.
READ TABLE <lt_item> INTO ls_item INDEX 1.
l_kokrs = ls_item-kokrs.
CALL FUNCTION 'COPA_CHECK_CO_AREA'
EXPORTING
i_gjahr = i_gjahr
i_kokrs = l_kokrs
IMPORTING
* ES_TKA00 =
* ES_TKA01 =
e_tp_active = l_tp_active
EXCEPTIONS
OTHERS = 1
.
CHECK sy-subrc = 0.
LOOP AT lt_tkebl INTO ls_tkebl.
CASE ls_tkebl-paledger.
WHEN '03' OR '04'.
CHECK l_tp_active IS INITIAL.
DELETE lt_tkebl INDEX sy-tabix.
ENDCASE.
ENDLOOP.
xt_act_ledger[] = lt_tkebl[].
ENDFORM. "determine_act_ledgers
*–––––––––––––––––––––––-*
* FORM GET_MIX_LEDGER
*–––––––––––––––––––––––-*
FORM get_mix_ledger USING it_tkebl TYPE rkea1_t_v_tkebl
i_check_table
CHANGING x_mix_ledger.
TYPES: BEGIN OF ys_ledger,
paledger TYPE tkebl-paledger,
END OF ys_ledger,
yt_ledger TYPE ys_ledger OCCURS 10.
DATA: lt_item TYPE ys_ce1 OCCURS 10,
ls_item TYPE ys_item,
ls_item_val TYPE ys_item_val,
l_from_idx TYPE sy-tabix,
l_to_idx TYPE sy-tabix,
lt_rev_ledger TYPE yt_ledger,
lt_act_ledger TYPE yt_ledger,
l_last_belnr TYPE cest1-belnr,
l_active_ledgers TYPE sy-tfill,
ls_tkebl TYPE v_tkebl.
* if only one currency is active -> mix ledger check not necessary
DESCRIBE TABLE it_tkebl LINES l_active_ledgers.
* check l_active_ledgers ne '1'.
*-
* Determine table with items to check …
*-
CASE i_check_table.
*-
WHEN 'GT_ITEM'.
*-
lt_item[] = gt_item[].
*-
* Called by transaction ke4s
*-
WHEN 'GT_ITEM_REV'.
*-
lt_item[] = gt_item_rev[].
*-
ENDCASE.
*-
* Determine active ledgers …
*-
LOOP AT it_tkebl INTO ls_tkebl.
PERFORM append_ledger USING ls_tkebl-paledger
CHANGING lt_act_ledger.
ENDLOOP.
*-
* Compare reversal ledgers with active ones …
*-
LOOP AT lt_item INTO ls_item.
* Set mix_ledger for zero items …
MOVE-CORRESPONDING ls_item TO ls_item_val.
IF ls_item_val IS INITIAL.
x_mix_ledger = 'X'. EXIT.
ENDIF.
CHECK l_last_belnr <> ls_item-belnr.
l_last_belnr = ls_item-belnr.
* Select packages of reversal ledgers according to BELNR
l_from_idx = sy-tabix + 1.
l_to_idx = sy-tabix + l_active_ledgers – 1.
PERFORM append_ledger USING ls_item-paledger
CHANGING lt_rev_ledger.
LOOP AT lt_item INTO ls_item
FROM l_from_idx
TO l_to_idx.
CHECK ls_item-belnr = l_last_belnr.
PERFORM append_ledger USING ls_item-paledger
CHANGING lt_rev_ledger.
ENDLOOP.
* Reversal ledgers equal active ones?
IF lt_rev_ledger <> lt_act_ledger.
x_mix_ledger = 'X'. EXIT.
ENDIF.
CLEAR lt_rev_ledger[].
ENDLOOP.
ENDFORM. "get_mix_ledger
*–––––––––––––––––––––––-*
* FORM APPEND_MIX_ITEMS
*–––––––––––––––––––––––-*
* temporary document number assignment according to BELNR
*–––––––––––––––––––––––-*
FORM append_mix_items USING it_tkebl TYPE rkea1_t_v_tkebl
i_item_tab
CHANGING x_first_c.
FIELD-SYMBOLS: <lt_item> TYPE table,
<lt_item_post> TYPE table.
DATA: ls_item TYPE ys_ce1,
ls_item_log TYPE ys_ce0,
l_log_active TYPE c,
l_log_test TYPE c,
l_last_belnr TYPE cest1-belnr,
l_temp_belnr TYPE cest1-belnr,
l_from_idx TYPE sy-index,
l_to_idx TYPE sy-index,
l_active_ledgers TYPE sy-tfill,
l_current_line TYPE sy-tabix.
*-
* Determine table with items to be posted …
*-
CASE i_item_tab.
*-
WHEN 'GT_ITEM'.
*-
ASSIGN: gt_item[] TO <lt_item>,
gt_item_post[] TO <lt_item_post>.
*-
* Reversal via transaction KE4S …
*-
WHEN 'GT_ITEM_REV'.
*-
ASSIGN: gt_item_rev[] TO <lt_item>,
gt_item_post_rev[] TO <lt_item_post>.
*-
ENDCASE.
* Reset flag for first call
IF x_first_c EQ 'X'.
* clear gt_item_post[].
CLEAR <lt_item_post>.
x_first_c = ' '.
ENDIF.
*-
* Append items to log …
*-
CALL FUNCTION 'COPA_DOCUMENT_LOG'
EXPORTING
i_action = 'L'
IMPORTING
e_log_active = l_log_active
e_test = l_log_test.
*-
* Get number of active ledgers …
*-
DESCRIBE TABLE it_tkebl LINES l_active_ledgers.
LOOP AT <lt_item> INTO ls_item.
* Assign temporary document number according to BELNR
CHECK l_last_belnr <> ls_item-belnr.
l_current_line = sy-tabix.
l_last_belnr = ls_item-belnr.
l_temp_belnr = l_temp_belnr + 1.
ls_item-belnr = l_temp_belnr.
APPEND ls_item TO <lt_item_post>.
IF ( NOT l_log_active IS INITIAL ) AND
( NOT l_log_test IS INITIAL ).
PERFORM append_log USING ls_item.
ENDIF.
*-
* Select packages of items to be posted with the same BELNR
*-
l_from_idx = l_current_line + 1.
l_to_idx = l_current_line + l_active_ledgers – 1.
LOOP AT <lt_item> INTO ls_item
FROM l_from_idx
TO l_to_idx.
CHECK ls_item-belnr = l_last_belnr.
ls_item-belnr = l_temp_belnr.
APPEND ls_item TO <lt_item_post>.
IF ( NOT l_log_active IS INITIAL ) AND
( NOT l_log_test IS INITIAL ).
PERFORM append_log USING ls_item.
ENDIF.
ENDLOOP.
ENDLOOP.
*-
* Append items to global logging table (test mode only!)
*-
IF NOT l_log_test IS INITIAL.
LOOP AT <lt_item> INTO ls_item.
MOVE-CORRESPONDING ls_item TO ls_item_log.
APPEND ls_item_log TO gt_item_log.
ENDLOOP.
ENDIF.
* initialize data for next item
CLEAR: <lt_item>.
ENDFORM. "append_mix_items
*–––––––––––––––––––––––-*
* FORM APPEND_REV_ITEMS
*–––––––––––––––––––––––-*
* -> IT_TKEBL contains reversal ledgers *
* -> I_CANCELLATIION_LEVEL level on which the cancellation is *
* processed: DOCUMENT/POSITION *
* <-> FIRST_C flag; first call *
* <-> MIX_LEDGER flag; reversal ledgers are not equal to *
* active ones
**–––––––––––––––––––––––-
FORM append_rev_items USING it_tkebl TYPE rkea1_t_v_tkebl
i_cancellation_level
CHANGING x_first_c
x_mix_ledger.
DATA: ls_item TYPE ys_item.
*-
* Check if reversal ledgers are equal to active ones
*-
IF x_mix_ledger IS INITIAL.
PERFORM get_mix_ledger USING it_tkebl
'GT_ITEM'
CHANGING x_mix_ledger.
ENDIF.
*-
* Reversal items with mixed ledgers …
*-
IF NOT x_mix_ledger IS INITIAL.
*-
CASE i_cancellation_level.
* cancellation per position (sd document)
WHEN 'POSITION'.
PERFORM append_items CHANGING x_first_c
x_mix_ledger.
* cancellation per document (fi document; copa_document_reverse)
WHEN 'DOCUMENT'.
PERFORM append_mix_items USING it_tkebl
'GT_ITEM'
CHANGING x_first_c.
ENDCASE.
*-
* Reversal ledgers equal to active ones …
*-
ELSE.
PERFORM append_items CHANGING x_first_c
x_mix_ledger.
ENDIF.
ENDFORM. "append_rev_items
*–––––––––––––––––––––––-*
* FORM REFRESH_POSTING_TAB *
*–––––––––––––––––––––––-*
FORM refresh_posting_tab.
CLEAR gt_item_post[].
ENDFORM. "REFRESH_POSTING_TAB
*&–––––––––––––––––––––––*
*& Form ism_TKEVA10_READ
*&–––––––––––––––––––––––*
FORM ism_tkeva10_read USING i_function TYPE trwpr-function
CHANGING xt_tkeva10 TYPE yt_tkeva10.
CALL FUNCTION i_function
EXPORTING
in_erkrs = g_erkrs
TABLES
itkeva10 = xt_tkeva10[].
ENDFORM. " ism_TKEVA10_READ
*–––––––––––––––––––––––-*
* FORM DETERMINE_VRGAR_COBK *
*–––––––––––––––––––––––-*
* determine alternative record type D (defined in OKEV) *
*–––––––––––––––––––––––-*
* –> AWREF CO-document number *
* –> AWORG CO-area *
* <– REC_TYPE record typ *
*–––––––––––––––––––––––-*
form determine_vrgar_cobk
using
i_awref
i_aworg
changing
vrgar.
data: kokrs type cobk-kokrs,
vrgng type cobk-vrgng,
gjahr type cobk-gjahr,
repid type repid value 'RK2OXXXX'.
*** default record type 'D'
vrgar = 'D'.
*** determine CO business transaction
check not i_aworg is initial.
kokrs = i_aworg.
select single vrgng gjahr from cobk into (vrgng, gjahr)
where
kokrs = kokrs and
belnr = i_awref.
check not vrgng is initial.
*** read customizing (KSII-OKEV)
replace 'XXXX' with sy-repid+4(4) into repid.
perform get_vrgar in program (repid)
using
kokrs
vrgng
gjahr
changing
vrgar.
endform.
*–––––––––––––––––––––––-*
* FORM SET_CURR_FIELDS_TP *
*–––––––––––––––––––––––-*
FORM set_curr_fields_tp USING is_v_tkebl TYPE rkea1_v_tkebl
is_acccr TYPE rkei1_ys_acccr.
DATA: ls_item_tp TYPE ys_ce1,
ls_item_legal TYPE ys_ce1,
l_paledger_legal TYPE tkebl-paledger,
l_index LIKE sy-index.
*** get item in prctr-view
READ TABLE gt_item INTO ls_item_tp
WITH KEY
paledger = is_v_tkebl-paledger
BINARY SEARCH.
IF sy-subrc = 0.
l_index = sy-tabix.
ELSE.
MESSAGE ID 'KE' TYPE 'E' NUMBER '476'.
ENDIF.
CHECK ls_item_tp-frwae IS INITIAL.
** use rate of corresponding legal ledger
CASE is_v_tkebl-paledger.
WHEN rkea1_c_paledger-erkpcb.
l_paledger_legal = rkea1_c_paledger-erkrs.
WHEN rkea1_c_paledger-bukpcb.
l_paledger_legal = rkea1_c_paledger-bukrs.
ENDCASE.
** copy legal currency information to prctr-view
READ TABLE gt_item INTO ls_item_legal
WITH KEY
paledger = l_paledger_legal
BINARY SEARCH.
IF sy-subrc = 0.
ls_item_tp-kursf = ls_item_legal-kursf.
ls_item_tp-frwae = ls_item_legal-frwae.
ELSE.
* no reference item available
CASE l_paledger_legal.
WHEN rkea1_c_paledger-erkrs.
MESSAGE ID 'KE' TYPE 'E' NUMBER '476'.
WHEN rkea1_c_paledger-bukrs.
** company code currency not active: use document currency as FRWAE
ls_item_tp-frwae = is_acccr-waers.
ls_item_tp-kursf = is_acccr-kursf.
ENDCASE.
ENDIF.
**
MODIFY gt_item FROM ls_item_tp INDEX l_index.
ENDFORM. "SET_CURR_FIELDS_TP
*–––––––––––––––––––––––-*
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Implementarea Unei Note Oss In Sap (ID: 116336)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
