ABAP objelerinin çeviri süreci ilkel yöntemlerle yapılması sebebiyle her zaman yazılım geliştiricilerin kabusu olmuştur. Bu proje, ABAP objelerinin çeviri sürecini SAP RPA ürünü ile otomatize etmektedir.
1.Giriş
Projenin kullanımı oldukça basit. Yüklenilen excel dosyasından çeviri dili ve çevirisini ABAP objeleriyle eşleştirerek RPA süreci tamamlanmaktadır. Süreç tamamlandıktan sonra, çevrilen objelerin içinde olduğu request (slxt işlem kodu aracılığı ile) RPA tarafından oluşturulmaktadır. Ek olarak bu requesti screen-shot alarak kullanıcıya mail atmaktadır.
2.Kullanım Alanları
- Roll-out Projeleri
- Yeni yazılan/çevirisi olmayan ürünün birden fazla dile çeviri ihtiyacı
- ABAP sözlükte yer alan çevirisi yapılmamış Z’li objelerin (çok sayıda) bu ürün ile kolayca çevirisinin yapılması.
3.Avantajları
- Çeviriye harcanılan zamandan tasarruf
- Kullanıcı bazlı çeviri hatalarını minimuma indirme
- Çeviriye harcanılan eforu oranında düşürme ()
- Birden fazla dile aynı anda çeviri imkanı
4.ABAP Objeleris
- Hali hazırda yer alan ABAP Objeleri;
- Data Element
- Message Class
- Smartforms
- AdobeForms
- Eklenebilecek ABAP Objeleri;
- Domain
- Structure
- Table
- Table Type
- Menu Area
- Reports (with screens)
- Proje tasarımına uygun olmayan ABAP Objeleri;
- Text Tables
5. RPA’ in Detaylı Yapısı
- Projede her ABAP objesi için ayrı bir workflow oluşturulmuştur.
- Bir tane REUSE workflow içinde oluşturulan workflowlar çağrılmaktadır.
- RPA’in hangi workflowu çağıracağını excel içindeki ‘Entry Sheet’ kısmında belirleyebiliyoruz.
- RPA, ABAP Objelerinin obje ismi, çeviri dili gibi bilgilerini ayrı ayrı oluşturulan ‘Sheet’ lerden (örneğin; Data Element) okumaktadır.
- Yeni eklenecek ABAP objeleri için yeni bir workflow, bu workflowu MAIN workflowuna REUSE etme ve excel dosyasını güncelleme yeterli olacaktır.
- RPA’in çeviri işlemini yapacağı sistem bilgileri, kullanıcı ismi ve şifresi, request ismi gibi bilgiler excelden okunabilir, RPA Cloud Factory’den de tanımlanabilir. (Örnek excel dosyasında da ‘Request Sheet’ i mevcut fakat RPA Cloud Factory’den okunması tercih edildi.)
Not: ‘Mesaj, Data Element, Domain, Reports’ gibi ABAP objelerinin çeviri arayüzü hemen hemen aynı olduğu için genel bir ‘Criteria’ tanımlayarak benzer arayüze sahip objelerde dinamik programlama yöntemi de kullanılabilir.
5.1.Workflow

5.1.1. Data Element
- SE63 işlem koduna gidilir .
- Transport Object tıklanır. Transport Object(Döngü burada başlamalıdır.)
- Excel dosyasındaki Data element çeviri bilgilerinin satır sayısı kadar döngüye sokulur.
- Data element objesi bilgileri girilir.
- Çeviri yapılacak alanlar excel dosyasındaki sütunlarla eşleştirilir.
5.1.2.Mesaj
- SE63 işlem koduna gidilir .
- Mesaj Sınıfı, Mesaj Numarası girilir. (Döngü burada başlamalıdır.)
- Excel dosyasındaki Data element çeviri bilgilerinin satır sayısı kadar döngüye sokulur.
- Orijinal Dil ve Hedef Dil; Go to-> Translation aşaması ile girilir.
- Çeviri yapılır.
5.1.3.Smartforms
- SE63 işlem koduna gidilir .
- Other Text tıklanır .(Döngü burada başlamalı ya da SSF arayüzünde F3 keystroke kullanılarak da başlatılabilir.)
- Excel dosyasındaki Smartforms bilgileri RPA tarafından filtrelenir. Deep Structure yapısı kullanılarak Smartforms ismi ve bilgileri internal table a atılır. Deep Structure büyüklüğü kadar döngüye sokulur.
- Arama butonu yardımı ile SSF objesi bulunup tıklanır.
- Smartforms objesi bilgileri SSF arayüzünde girilir.
- Burada 2 tane GUI Containersbulunur. Üstte yer alan Container objenin orijinal yapısıdır. Buradaki satır sayısı scroll-down yaparak hesaplanır.
- Click ‘Copy Source Text’ (SHIFT F8) tıklanarak orijinal yapı kopyalanır.
- Alttaki Container tipinde Paragraf tipi ’ ile başlamayan satırlar excel dosyasındaki verilerle karşılaştırılıp çeviriler satır satır yapılır. Bottom Container ‘daki ‘/’ excel dosyasındaki verilerle karşılaştırılır ve çeviriler satır satır yapılır.
- Üstteki Container dan döngü sayısı bittiğinde‘Save and Active’ butonuna tıklanarak çeviri süreci tamamlanır.
5.1.4.Adobeforms
- SE63 işlem koduna gidilir .
- Other Text tıklanır .(Döngü burada başlamalı ya da PDFB arayüzünde F3 keystroke kullanılarak da başlatılabilir.)
- Excel dosyasındaki Adobeforms bilgileri RPA tarafından filtrelenir. Deep Structure yapısı kullanılarak Adobeforms ismi ve bilgileri internal table a atılır. Deep Structure büyüklüğü kadar döngüye sokulur.
- Burada 2 tane GUI Containers yapısı karşımıza çıkacak. Üstteki Container orijinal yapısıdır. Copy Source Text (SHIFT F8) diyerek orijinal yapı kopyalanır.
- The data in the ‘/’ veriler bir değişkene atılır. Satır satır veriler excel dosyasındaki verilerle karşılaştırılıp REPLACE fonksiyonu ile yeni bir değişkene atılıp data set edilir.
- Süreç Save and Active diyerek tamamlanır.
5.1.5.Main Translation
- RPA Cloud Factory’den veriler Declare-Get metotlarıyla çekilir.
- Excel yüklemek için UI Designer’dan basit bir excel yükleme Popup ı tasarlanır.
- Tasarlanan Popup tan dosyanın path i global değişkene atılır.
- RPA excel metotlarıyla elimizdeki path ile excel verileri çekilir. (Her sheet için ayrı bir global internal table kullanıldı.)
- Oluşturulan workflow lar Reuse metodu ile çağrılır.
- Workflow lar bittikten hemen sonra SLXT işlem koduna gidilir ve gerekli bilgiler (Object Processor, Date, All languages, Workbench request gibi) girilerek işlem kodu yürütülür.
- Gelen ekranda her sayfanın RPA screen-shot metodu ile ekran görüntüsü alınıp RPA Cloud Factory’de tanımlanan mail adresine oluşturulan request ile ilgili bilgiler mail atılır. RPA Cloud Factory.

6.Önemli Notlar
- Her Workflow başlangıcında SAP Logon sayfası çağrılmalıdır.
- killSAP fonksiyonları her Workflow başlangıcında ve bitişlerinde çağrılmalıdır.
- Her Workflow başlangıcı Start Application ile başlamalıdır, Close Application ile bitmelidir.
- Excel dosyasındaki Entry Sheet verileri ‘X’ li ise workflow lar başlamalı, ‘X’ li değilse workflowlar sc.endStep() fonksiyonları ile sonlandırılmalıdır.
7.Önemli Kod Blokları
- Excel verilerini çekme
//Get Entry Details
/****************************************************************************************************************************/
ctx.excel.sheet.activate(“Entry”);
var row1 = ctx.excel.sheet.getLastRow(“A1”);
var col1 = ctx.excel.sheet.getLastColumn(“A1”);
rootData.ExcelData.Entry = ctx.excel.sheet.getFullRangeValues(“A”,1,String.fromCharCode(64+col1),row1-1,””);
//Get Data Element Details
//****************************************************************************************************************************
ctx.excel.sheet.activate(“Data Element”);
var row2 = ctx.excel.sheet.getLastRow(“A1”);
var col2 = ctx.excel.sheet.getLastColumn(“A1”);
rootData.ExcelData.DataElement = ctx.excel.sheet.getFullRangeValues(“A”,1,String.fromCharCode(64+col2),row2-1,””);
//Get Smartforms Details
//****************************************************************************************************************************
ctx.excel.sheet.activate(“Smartforms”);
var row3 = ctx.excel.sheet.getLastRow(“A1”);
var col3 = ctx.excel.sheet.getLastColumn(“A1”);
rootData.ExcelData.SmartForms = ctx.excel.sheet.getFullRangeValues(“A”,1,String.fromCharCode(64+col3),row3-1,””)
//Get Adobe Forms Details
/****************************************************************************************************************************/
ctx.excel.sheet.activate(“Adobe Forms”);
var row4 = ctx.excel.sheet.getLastRow(“A1”);
var col4 = ctx.excel.sheet.getLastColumn(“A1”);
rootData.ExcelData.AdobeForms = ctx.excel.sheet.getFullRangeValues(“A”,1,String.fromCharCode(64+col4),row4-1,””);
//Get Message Details
//****************************************************************************************************************************
ctx.excel.sheet.activate(“Message”);
var row5 = ctx.excel.sheet.getLastRow(“A1”);
var col5 = ctx.excel.sheet.getLastColumn(“A1”);
rootData.ExcelData.Message = ctx.excel.sheet.getFullRangeValues(“A”,1,String.fromCharCode(64+col5),row5-1,””);
//Get Request Details
//****************************************************************************************************************************
ctx.excel.sheet.activate(“Request”);
var row6 = ctx.excel.sheet.getLastRow(“A1”);
var col6 = ctx.excel.sheet.getLastColumn(“A1”);
rootData.ExcelData.Request= ctx.excel.sheet.getFullRangeValues(“A”,1,String.fromCharCode(64+col6),row6-1,””);
- killSAP
function killSAP(){
var __result = ctx.wmi.query(‘Win32_Process’, [ ‘ProcessId’, ‘Name’, ‘ExecutionState’ ], “Name=’saplogon.exe’”);
if(__result.length > 0) {
for(var __counter = 0; __counter<__result.length; __counter++) {
ctx.sleep(500);
var __result2 = ctx.wmi.query(‘Win32_Process’, [ ‘ProcessId’, ‘Name’, ‘ExecutionState’ ], “ProcessId=”+__result[__counter].ProcessId);
if(__result2.length > 0) {
ctx.wmi.killProcess(__result2[0].ProcessId);
}
}
ctx.log(“All running instances of process ‘saplogon.exe’ have been killed.”, e.logIconType.Info);
}
else {
ctx.log(“No found running instance of process ‘saplogon.exe’.”, e.logIconType.Warning);
}
}
- Ekran görüntüsü metodu
var path = “C:\\Users\\” + ctx.options.userName + “\\Desktop\\” + “name.png”;
ctx.screenshot({ ID: “usr”,
X: 0,
Y: 127,
CX: 1920,
CY: 884,
File: path });
- Ekran görüntüsü alınan resmi mail body e binary olarak embed etme
ctx.base64.encodeStream(ctx.fso.file.read(path, e.file.encoding.Binary));
body_text += ‘<img src=””data:image/png;base64,’” + ctx.base64.encodestream(ctx.fso.file.read(path, e.file.encoding.binary))+’”>’;
8.Excel Yapısı
Entry Sheet
Work Flow | Check |
Message Class | X |
Data Element | X |
Adobe Forms | X |
SmartForms | X |
Domain |
- Message
Message Class | Message Number | Source Text | Target Text | Source Lang | Target Lang |
ZMO_TEST | 000 | No data found. | keine Daten gefunden | EN | DE |
ZMO_TEST | 001 | Please choose the company code. | Lütfen şirket kodunu seçin. | EN | TR |
ZMO_TEST | 002 | Tax number is not correct. | Vergi numarasi doğru değil. | EN | TR |
- Data element
Data Element | Source Text | DTEXT(55) | REPTEXT(40) | SCRTEXT_L(40) | SCRTEXT_M(20) | SCRTEXT_S(10) | Source Lang | Target Lang |
ZMO_DE_01 | Name and surname | Adı Soyadı | Adı Soyadı | Adı Soyadı | Adı Soyadı | Ad.Soyad. | enUS | trTR |
ZMO_DE_02 | Adress Information | Adres Bilgileri | Adres Bilgileri | Adres Bilgileri | Adres Bilgileri | Adres Blg | enUS | trTR |
ZMO_DE_03 | Phone Number | Telefon Numarası | Telefon Numarası | Telefon Numarası | Telefon Numarası | Tel.No | enUS | trTR |
- Adobeforms
Adobe Forms Name | Source Text | Target Text | Source Lang | Target Lang |
ZMO_TEST12 | enUS | deDE | ||
ZMO_TEST12 | INVOICE NO | RECHNUNG NR | enUS | deDE |
ZMO_TEST12 | INVOICE DATE | RECHNUNGS DATUM | enUS | deDE |
ZMO_TEST12 | SALES ORDER NO/DATE | VERKAUFSAUFTRAG NR/DATUM | enUS | deDE |
- Smartforms
Smartforms | Source Text | Target Text | Source Lang | Target Lang |
ZMO_DENEME | enUS | trTR | ||
ZMO_DENEME | Plate Number: | Plaka Numarası: | enUS | trTR |
ZMO_DENEME | Region | Bolge | enUS | trTR |
ZMO_DENEME | Waybill Number: | Irsaliye No: | enUS | trTR |
ZMO_DENEME | Region | Bolge | enUS | trTR |
ZMO_DENEME | Amoung of Contrat: | Kontrat Miktarı: | enUS | trTR |
ZMO_DENEME | Material: | Malzeme: | enUS | trTR |
ZMO_DENEME | Driver Name: | Sürücü Adı: | enUS | trTR |
ZMO_DENEME | Date: | Tarih: | enUS | trTR |
ZMO_DENEME | Weighing No: | Tartım No: | enUS | trTR |
ZMO_DENEME | TEL : E-MAIL: | TEL : E-MAIL: | enUS | trTR |
ZMO_DENEME | WEIGHBRIDGE RECEIPT | TARTIM FISI | enUS | trTR |
ZMO_DENEME | Weighbridge No : | Irsaliye No: | enUS | trTR |
ZMO_DENEME | Company Name: | Sirket : | enUS | trTR |
ZMO_DENEME | Amount of Coming: | Gelen Miktar: | enUS | trTR |
ZMO_DENEME | Amount of Remaining: | Kalan Miktar: | enUS | trTR |
ZMO_DENEME | Quality Inspection Lot: | Kalite Muayene Lotu: | enUS | trTR |
ZMO_DENEME | PO number: | Satin Alma No: | enUS | trTR |
ZMO_DENEME | Carrier: | Nakliye | enUS | trTR |
- Request
Request Description | Processing Date | Processor |
06.07.2021 Translation | 6.07.2021 | mokay |
Projenin uygulanışını izlemek için ”SAP iRPA ile Toplu Çeviri” demomuza göz atın.