EXCEL UPLOAD — RAP

Herkese Merhaba,
Bu detaylı rehberde, Large Object (LOB) olarak kabul edilen Excel dosyalarını RAP (Restful Applicatşon Programming) liste raporlarında CRUD (Create, Read, Update, Delete) işlemleriyle nasıl lokalden yükleyeceğinizi adım adım anlatıyorum. LOB kavramını, ATTACHMENT, MIMETYPE ve FILENAME özelliklerini açıklayarak başlayacak, ardından örnek bir senaryo üzerinden (iş başvurusu adaylarının CV’lerini yükleme) kod örnekleriyle süreci detaylandıracağız. Bu sayede, büyük boyutlu Excel dosyalarını verimli bir şekilde yönetebilir ve uygulamanızın veri işleme kapasitesini artırabilirsiniz.
LOB, büyük boyuttaki yapılar için kullanılan bir kavramdır. Görsel, PDF, Excel, txt ya da Word dosyaları birer LOB’dur. Genel LOB’ler hakkındaki bilgi aşağıdaki gibidir.
LOB lar
· Attachment,
· Mime type,
· Filename
Aracılığıyla modellenir.
Attachment alanı, LOB’un kendisini RAWSTRING formatında içerir. ATTACHMENT, genellikle LOB (Large Object) tipindeki veriyi temsil eder. Bu, veritabanında saklanan büyük boyutlu dosyanın kendisidir. Bu dosya herhangi bir formatta olabilir (PDF, resim, video, ses dosyası, belge vb.).
MIMETYPE, ATTACHMENT’ın (ek dosyanın) türünü belirtir. Bu, alıcı uygulamanın (örneğin, bir web tarayıcısı veya bir e-posta istemcisi) dosyayı nasıl işleyeceğini (örneğin, hangi uygulamayla açacağını veya nasıl görüntüleyeceğini) belirlemesine yardımcı olur.
- Özellikleri:
- Metin tabanlı bir etikettir (örneğin, “application/pdf”, “image/jpeg”, “video/mp4”).
- Dosyanın içeriği hakkında bilgi verir.
- Web sunucuları ve tarayıcılar arasında dosya türlerini belirtmek için yaygın olarak kullanılır.
- Örnek: Bir resim dosyasının MIMETYPE değeri “image/jpeg” veya “image/png” olabilir. Bir PDF belgesinin MIMETYPE değeri ise “application/pdf” olur.
FILENAME (Dosya Adı):
- İşlevi: FILENAME, ATTACHMENT’ın (ek dosyanın) orijinal adını belirtir. Bu, kullanıcının dosyayı kaydederken veya açarken göreceği addır.
- Özellikleri:
- Dosyanın adını ve uzantısını içerir (örneğin, “rapor.pdf”, “resim.jpg”).
- Dosyanın içeriği hakkında doğrudan bilgi vermez, ancak kullanıcının dosyayı tanımasına yardımcı olur.
- Dosya sisteminde saklanırken veya indirilirken kullanılır.
Spesifik olarak excel upload yapmak için aşağıdaki kod parçası kullanılır.

Örnek Program: Bir iş başvurusunda bulunan adayların bilgilerini tutan bir Liste raporu hazırlayalım. Bir satıra tıklandığında, ilgili adayın CV’si excel formatında upload edilebilir olsun. Ve diğer formattaki dosya tiplerine kapalı olsun.
- Tablo oluşturunuz. ZCANDIDATE

@EndUserText.label : 'Candidates Table'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zcandidate {
key client : abap.clnt not null;
key applicationid : abap.char(10) not null;
name : abap.char(40);
lastname : abap.char(40);
email : abap.char(50);
phone : abap.char(11);
country : abap.char(50);
city : abap.char(50);
address : abap.char(200);
createdby : abp_creation_user;
username : usalias;
attachement : abap.rawstring(214748);
filename : abap.char(128);
mimetype : abap.char(128);
createdat : abp_creation_tstmpl;
lastchangedby : abp_lastchange_user;
lastchangedat : abp_lastchange_tstmpl;
locallastchangedat : abp_locinst_lastchange_tstmpl;
}
2) Tabloyu referans alan bir Interface View yaratınız.

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Candidate Interface View'
@Metadata.ignorePropagatedAnnotations: true
@ObjectModel.usageType:{
serviceQuality: #X,
sizeCategory: #S,
dataClass: #MIXED
}
define view entity ZI_CANDIDATE as select from zcandidate
{
key applicationid as Applicationid,
name as Name,
lastname as Lastname,
email as Email,
phone as Phone,
country as Country,
city as City,
address as Address,
createdby as Createdby,
username as Username,
attachement as Attachement,
filename as Filename,
mimetype as Mimetype,
createdat as Createdat,
lastchangedby as Lastchangedby,
lastchangedat as Lastchangedat,
locallastchangedat as Locallastchangedat
}
3) Tabloya sağ tıklayınız > Generate ABAP Repository Objects

OData UI Service seçeneğini seçiniz > Next diyiniz.

4) Tablonuzun bulunduğu paketi seçiniz > Next

Next diyiniz

Next diyiniz.

Finish’e basınız.

Aşağıdaki componentler otomatik olarak yaratılacaktır.

Şu an elimizde CRUD (Create-Read-Update-Delete) operasyonlarını yapan bir uygulama var.
5) Program tarafından oluiturulan Composition View’e gidiniz ve aşağıdaki annotasyonları veriniz.

@Metadata.allowExtensions: true
@EndUserText.label: '###GENERATED Core Data Service Entity'
@AccessControl.authorizationCheck: #CHECK
define root view entity ZC_CANDIDATE
provider contract transactional_query
as projection on ZR_CANDIDATE
{
key Applicationid,
Name,
Lastname,
@Semantics.eMail.address: true
Email,
@Semantics.telephone.type: [ #CELL ]
// @Semantics.telephone.number :true
Phone,
Country,
City,
Address,
Createdby,
Username,
@Semantics.largeObject : {
mimeType: 'Mimetype',
fileName: 'Filename',
contentDispositionPreference: #INLINE,
acceptableMimeTypes: [ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ] }
Attachement,
Filename,
@Semantics.mimeType: true
Mimetype,
Createdat,
Lastchangedby,
Lastchangedat,
Locallastchangedat
}
6) Metadata Extension dosyasında iligili alanlar

@Metadata.layer: #CORE
@UI.headerInfo.title.type: #STANDARD
@UI.headerInfo.title.value: 'Applicationid'
@UI.headerInfo.description.type: #STANDARD
@UI.headerInfo.description.value: 'Applicationid'
annotate view ZC_CANDIDATE with
{
@EndUserText.label: 'Applicationid'
@UI.facet: [ {
label: 'General Information',
id: 'GeneralInfo',
purpose: #STANDARD,
position: 10 ,
type: #IDENTIFICATION_REFERENCE
} ]
@UI.identification: [ {
position: 10 ,
label: 'Applicationid'
} ]
@UI.lineItem: [ {
position: 10 ,
label: 'Applicationid'
} ]
@UI.selectionField: [ {
position: 10
} ]
Applicationid;
@EndUserText.label: 'Name'
@UI.identification: [ {
position: 20 ,
label: 'Name'
} ]
@UI.lineItem: [ {
position: 20 ,
label: 'Name'
} ]
@UI.selectionField: [ {
position: 20
} ]
Name;
@EndUserText.label: 'Lastname'
@UI.identification: [ {
position: 30 ,
label: 'Lastname'
} ]
@UI.lineItem: [ {
position: 30 ,
label: 'Lastname'
} ]
@UI.selectionField: [ {
position: 30
} ]
Lastname;
@EndUserText.label: 'Email'
@UI.identification: [ {
position: 40 ,
label: 'Email'
} ]
@UI.lineItem: [ {
position: 40 ,
label: 'Email'
} ]
@UI.selectionField: [ {
position: 40
} ]
Email;
@EndUserText.label: 'Phone'
@UI.identification: [ {
position: 50 ,
label: 'Phone'
} ]
@UI.lineItem: [ {
position: 50 ,
label: 'Phone'
} ]
@UI.selectionField: [ {
position: 50
} ]
// @UI: {
//// lineItem: [{ type: #AS_ADDRESS }]
// }
Phone;
@EndUserText.label: 'Country'
@UI.identification: [ {
position: 60 ,
label: 'Country'
} ]
@UI.lineItem: [ {
position: 60 ,
label: 'Country'
} ]
@UI.selectionField: [ {
position: 60
} ]
Country;
@EndUserText.label: 'City'
@UI.identification: [ {
position: 70 ,
label: 'City'
} ]
@UI.lineItem: [ {
position: 70 ,
label: 'City'
} ]
@UI.selectionField: [ {
position: 70
} ]
City;
@EndUserText.label: 'Address'
@UI.identification: [ {
position: 80 ,
label: 'Address'
} ]
@UI.lineItem: [ {
position: 80 ,
label: 'Address'
} ]
@UI.selectionField: [ {
position: 80
} ]
Address;
@UI.identification: [ {
position: 90
} ]
@UI.lineItem: [ {
position: 90
} ]
@UI.selectionField: [ {
position: 90
} ]
Createdby;
@UI.identification: [ {
position: 100
} ]
@UI.lineItem: [ {
position: 100
} ]
@UI.selectionField: [ {
position: 100
} ]
Username;
@EndUserText.label: 'Attachement'
@UI.identification: [ {
position: 110 ,
label: 'Attachement'
} ]
@UI.lineItem: [ {
position: 110 ,
label: 'Attachement'
} ]
@UI.lineItem: [{ importance: #HIGH }]
Attachement;
@EndUserText.label: 'Filename'
@UI.identification: [ {
position: 120 ,
label: 'Filename'
} ]
@UI.lineItem: [ {
position: 120 ,
label: 'Filename'
} ]
@UI.selectionField: [ {
position: 120
} ]
@UI.lineItem: [{ importance: #HIGH }]
Filename;
@EndUserText.label: 'Mimetype'
@UI.identification: [ {
position: 130 ,
label: 'Mimetype'
} ]
@UI.lineItem: [ {
position: 130 ,
label: 'Mimetype'
} ]
@UI.selectionField: [ {
position: 130
} ]
@UI.lineItem: [{ importance: #HIGH }]
Mimetype;
@UI.identification: [ {
position: 140
} ]
@UI.lineItem: [ {
position: 140
} ]
@UI.selectionField: [ {
position: 140
} ]
Createdat;
@UI.identification: [ {
position: 150
} ]
@UI.lineItem: [ {
position: 150
} ]
@UI.selectionField: [ {
position: 150
} ]
Lastchangedby;
@UI.identification: [ {
position: 160
} ]
@UI.lineItem: [ {
position: 160
} ]
@UI.selectionField: [ {
position: 160
} ]
Lastchangedat;
@UI.identification: [ {
position: 170
} ]
@UI.lineItem: [ {
position: 170
} ]
@UI.selectionField: [ {
position: 170
} ]
Locallastchangedat;
}
7) Uygulamaya ait Screen Shoots

Görüldüğü üzere sadece excel olan dosyaları seçtiriyor.

Eğer farklı bir dosya tipini verirsek aşağıdaki uyarıyı alırız.

Bir konunun daha sonuna gelmiş bulunmaktayız. İyi günler dilerim😇
