SAPUI5 Create Deep Entity

fiori

Create Deep Entity Nedir? Nerede kullanılır?

Merhaba, bu yazımızda SAPUI5 Create Deep Entity konusunu ele alacağız. Öncelikle bunu nasıl bir durumda kullanabiliriz ondan bahsedelim. Örneğin bir başlık verisine bağlı bir veya daha fazla kalem verisini sapui5 uygulamasından Sap‘ye aktaracaksak bunu kullanabiliriz. Alternarif olarak normal create ile kalem verisini for ile dönerek tek tek kaydedebiliriz. Bu şekilde her kalem verisi için sapui5 dan Sap’ye tek tek gideceği için çok fazla zaman kaybı olacaktır. Bu da büyük verilerde çok fazla gecikme anlamına geliyor. Fakat bu işlemi create deep entity ile tek seferde çok daha hızlı bir şekilde yapmış oluruz.

Create Deep Entity Nasıl Kullanılır?

Şimdi adım adım giderek nasıl yapabileceğimizi görelim. İlk olarak Segw işlem koduna giderek bir gateway projesi oluşturalım. Ben daha önceki yazılarımızda kullandığımız gatewap projesi üzerinden gideceğim. Projeyi oluşturduktan sonra bize bir başlık bir de kalem verisi için entity gerekiyor. Bunları da oluşturuyoruz. Burada dikkat etmemiz gereken nokta başlık ve kalem entity arasında en az bir ortak key alan olması gerekiyor. Çünkü bir sonraki aşamalarda bunları birbirine bağlayacağız.

Entity Oluşturma

sapui5
2 create segw 1
3 create segw
4 create segw

Entityler Arası İlişki

Şimdi entitylerimizi oluşturduk. Sıra geldi bunları birbirine bağlamaya. Associations kısmına gelerek sağ tıklayalım ve create diyelim. Karşımıza bir popup ekran açılacak. Buradan association name alanına bağlantımızın ismini, entity type alanlarına ise soldaki alana başlık sağdaki alana ise kalem verilerinin entitysini, cardinality alanına ise aralarında nasıl bir ilişki kurulacağını girelim. navigation propery alanına ise başlık verilerinin içerisinde kalem verileri hangi isimde bulunacak onu yazıyoruz. Next butonuna basıyoruz ve sonraki ekranda entitylerimizi oluştururken de söylediğim bu entityleri birbirine bağlayan key alanları yazıyoruz. Next butonuna bazıyoruz ve bitiriyoruz.

5 create segw
6 create segw
7 create segw
8 create segw

Servis ve Classların Generate Edilmesi

Entityler arası ilişkilerimizi de oluşturduk. Bu aşamadan sonra ilk defa oluşturduysak odata servisimizin ve classların oluşması için, ilk defa oluşturmuyorsak da güncelleme yapmak için generate sol üstte bulunan kırmızı generate butonuna basıyoruz.

Dpc Ext Create Deep Entity Redefine

Sol tarafta Runtime Artifacts kısmında classlarımız ve servisimiz var. O kısımda sonu dpc ext yazana çift tıklıyoruz ve açılan ekranda tekrar dpc ext olana tıklıyoruz. Sol tarafta methods içerisinde /iwbep/if_mgw_appl_srv_runtime altında Create_Deep_Entity olduğunu göreceksiniz. Sağ tıklayıp Redefine diyelim. Buradaki amaç normalde kendisi varsayılan olarak içerisini dolduruyor. Bu exit methodlar ile müdahale ediyoruz. Bu method içerisini örnek olarak aşağıdaki kodlar gibi kendi entitynize uygun kodlar yazabilirsiniz. Daha sonra aktif edip çıkabilirsiniz.


  METHOD /iwbep/if_mgw_appl_srv_runtime~create_deep_entity.
    DATA: lt_header TYPE zcl_zmogw_odata_mpc=>tt_etheader,
          ls_header TYPE zcl_zmogw_odata_mpc=>ts_etheader,
          lt_item   TYPE zcl_zmogw_odata_mpc=>tt_etitem,
          ls_item   TYPE zcl_zmogw_odata_mpc=>ts_etitem.
    
    "1-İçerisinde kalem verilerini de içeren data provide yapısı
    "2-headertoitemnav olan yer ilişkiyi oluştururken
    "  navigation property alanına verdiğimiz isim olması gerekiyor.
    DATA: BEGIN OF ls_headeritem.
            INCLUDE TYPE zcl_zmogw_odata_mpc=>ts_etheader.
            DATA: headertoitemnav TYPE zcl_zmogw_odata_mpc=>tt_etitem,
          END OF ls_headeritem.
    
    "Burada başlık entity ismi olması gerekiyor.
    CASE iv_entity_name.
      WHEN 'EtHeader'.
        io_data_provider->read_entry_data(
                  IMPORTING es_data = ls_headeritem ).

        CLEAR: ls_header.
        REFRESH lt_item.
        
        "Provide kısmından normal başlık ve kalem verilerini alıyoruz.
        MOVE-CORRESPONDING ls_headeritem TO ls_header.
        lt_item[] = ls_headeritem-headertoitemnav[].
    ENDCASE.
    
    "Geri dönüş olarak provide yapımızı veriyoruz. Değilse hata alırız.
    copy_data_to_ref(
      EXPORTING
        is_data = ls_headeritem
      CHANGING
        cr_data = er_deep_entity
     ).

  ENDMETHOD.

Şunlara Dikkat Et!

Provide yapısında kalem verilerinin alınması için yazdığımız kısımda isim olarak entityler arası ilişkiyi oluşturma aşamasındaki navigation property alanındaki ismi vermemiz gerekiyor. Bundan ayrı olarak eğer gelen verileriniz içerisinde tarih tipinde boş bir alan var ise bu alanı copy to ref ile geri gönderirken hata verecektir. Tarih tipindeki alanlarınızı doldurun.

SAPUI5 Uygulamasında Kullanımı

SAPUI5 View Yapısı

Örnek olarak başlık ve kalem entity yapımıza uygun bir sapui5 ekranı tasarladım. Çok basit bir ekran oldu ama umarım konuyu anlamanız açısından yeterli olur. Sapui5 View oluştururken üst kısımda başlık verilerinin girilebileceği bir form, alt kısımda ise kalem verilerinin girilebileceği bir tablo bulunmakta. Birden çok kalem girilebilmekte. Örnek olarak aşağıda görebilirsiniz.


<mvc:View xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" xmlns:f="sap.ui.layout.form"
	controllerName="ZMOP_ODATA_TEST1.ZMOP_ODATA_TEST1.controller.Main" xmlns:html="http://www.w3.org/1999/xhtml">
	<App>
		<pages>
			<Page title="Teknopati">
				<content>
					<VBox class="sapUiSmallMargin">
						<f:Form id="formPersonel" editable="true" ariaLabelledBy="Title1">
							<f:layout>
								<f:ResponsiveGridLayout labelSpanXL="4" labelSpanL="4" labelSpanM="4" labelSpanS="12" adjustLabelSpan="false" emptySpanXL="0" emptySpanL="4"
									emptySpanM="2" emptySpanS="2" columnsXL="2" columnsL="1" columnsM="1" singleContainerFullSize="false"/>
							</f:layout>
							<f:formContainers>
								<f:FormContainer ariaLabelledBy="Title2">
									<f:formElements>
										<f:FormElement label="Personel Numarası">
											<f:fields>
												<Input type="Number" value="{mainView>/Pernr}"/>
											</f:fields>
										</f:FormElement>
										<f:FormElement label="Personelin Adı">
											<f:fields>
												<Input type="Text" value="{mainView>/Cname}"/>
											</f:fields>
										</f:FormElement>
										<f:FormElement label="Personelin Yaşı">
											<f:fields>
												<Input type="Number" value="{mainView>/Age}"/>
											</f:fields>
										</f:FormElement>
									</f:formElements>
								</f:FormContainer>
							</f:formContainers>
						</f:Form>
					</VBox>
					<HBox alignItems="Center" justifyContent="Center">
						<VBox class="sapUiSmallMargin" alignItems="Center" justifyContent="Center" width="400px">
							<Table contextualWidth="auto" mode="None" keyboardMode="Edit" class="sapUiLargeMarginEnd" items="{path:'mainView>/List'}"
								noDataText="Herhangi bir giriş yok">
								<headerToolbar>
									<Toolbar>
										<Title text="Teknopati.net Deep Create" level="H2"/>
										<ToolbarSpacer/>
										<Button text="Ekle" icon="sap-icon://add" press="fnOnAdd"/>
									</Toolbar>
								</headerToolbar>
								<items>
									<ColumnListItem press="methodMainTableSelected" id="id_list_item1">
										<cells>
											<Text text="{mainView>Pernr}"/>
											<Input type="Text" value="{mainView>WPlace}"/>
											<Input type="Number" value="{mainView>NWork}"/>
										</cells>
									</ColumnListItem>
								</items>
								<!--// Tablo Başlıkları - Başlangıç	-->
								<columns >
									<Column hAlign="Center" visible="false">
										<header>
											<Label text="Personel Numarası" design="Bold"/>
										</header>
									</Column>
									<Column hAlign="Center">
										<header>
											<Label text="Çalışma Yeri" design="Bold"/>
										</header>
									</Column>
									<Column hAlign="Center" width="8rem">
										<header>
											<Label text="Çalışma Süresi" design="Bold"/>
										</header>
									</Column>
								</columns>
								<!--// Tablo Başlıkları - Bitiş	-->
							</Table>
						</VBox>
					</HBox>
				</content>
				<footer>
					<Toolbar>
						<ToolbarSpacer/>
						<Button text="Kaydet" icon="sap-icon://save" type="Default" press="fnOnSave"/>
					</Toolbar>
				</footer>
			</Page>
		</pages>
	</App>
</mvc:View>
14 create segw

SAPUI5 Controller Yapısı

Sapui5 Controller kısmında Sap’de create deep entity içerisindeki provide yapısının koruyarak başlık ve kalem verilerini doldurmalıyız. Özellikle kalem verilerinin içinde olduğu propertynin ismine dikkat etmeniz gerekiyor. Provide yapısını oluşturduktan sonra verilerimizi servisimize create methodu ile gönderiyoruz. Entity set alanına ise başlık verilerimizin olduğu entity set ismini yazıyoruz. Aşağıda bu örnek için benim kullandığım sapui5 controller yapısını görebilirsiniz.


sap.ui.define([
	"sap/ui/core/mvc/Controller",
	"sap/ui/model/json/JSONModel",
	"sap/m/MessageToast"
], function (Controller, JSONModel, MessageToast) {
	"use strict";

	var jsonModelMain, oDataModel;

	var dialogBusy = new sap.m.BusyDialog();
	dialogBusy.setText("İşlem sürüyor, lütfen bekleyiniz..");

	return Controller.extend("ZMOP_ODATA_TEST1.ZMOP_ODATA_TEST1.controller.Main", {

		onInit: function () {
			oDataModel = this.getOwnerComponent().getModel();
			jsonModelMain = new JSONModel();
			jsonModelMain.setProperty("/List", []);
			jsonModelMain.setSizeLimit(10000);
			this.getView().setModel(jsonModelMain, "mainView");
		},

		fnOnAdd: function () {
			var data = jsonModelMain.getProperty("/List");
			var line = {
				Pernr: jsonModelMain.getProperty("/Pernr"),
				NWork: '',
				WPlace: ''
			};
			data.push(line);
			jsonModelMain.setProperty("/List", data);
		},

		fnOnSave: function () {
			dialogBusy.open();
			var data = jsonModelMain.getProperty("/List");
			var header = {
				Pernr: jsonModelMain.getProperty("/Pernr"),
				Cname: jsonModelMain.getProperty("/Cname"),
				Age: jsonModelMain.getProperty("/Age"),
				HeaderToItemNav: []
			};

			jQuery.each(data, function (index, item) {
				var line = {
					Pernr: item.Pernr,
					NWork: item.NWork,
					WPlace: item.WPlace
				};
				header.HeaderToItemNav.push(line);
			});

			oDataModel.create("/EtHeaderSet", header, {
				async: true,
				success: function (resp) {
					dialogBusy.close();
					MessageToast.show("Kayıt Başarılı!");
				},
				error: function (resp) {
					dialogBusy.close();
					MessageToast.show("Kayıt sırasında bir hata oluştu!");
				}
			});
		}

	});

});
E-bültene Abone Ol Merak etmeyin. Spam yapmayacağız.

Yazar

Merhaba, Kocaeli Üniversitesi Bilişim Sistemleri Mühendisliği Bölümü'nden 2019 yılında mezun oldum. Daha sonra Sap sektöründe çalışma hayatına başladım. Burada elimden geldiğince tecrübelerimi sizinle paylaşacağım.

İlgili Yazılar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Hızlı yorum için giriş yapın.

Başka Yazı Yok

Kayıt Ol

Zaten üye misiniz? Giriş Yap

Giriş Yap

Henüz üyeliğiniz yok mu? Kayıt Ol