Sorun Cevaplayalım

İşinizle ilgili öngörüler edinin, gerçek zamanlı bilgilere göre karar alın.

SAP Eğitim ve Sertifika Dönemleri

Uzmanlığınızı ve deneyiminizi SAP çözümleri kullanarak tasdik edin.

Çözüm Ekibi Başvurusu

Kullanıcılara hızlı ve pratik çözümler üreterek görev almak isteyenler.

ABAP ABAP'ta Temel Aritmetik İşlemler

Övünç DİNÇ

Çözüm Ekibi
Kayıtlı Üye
Katılım
8 Eki 2016
Mesajlar
928
Tepki puanı
246
Konum
İzmir
Kullandığınız SAP Modülleri
  1. SAP MM
  2. SAP PP
Katılım Bölgesi
  1. İzmir
1582222357021.png


ABAP'ta toplama, çıkarma, çarpma ve bölme işlemlerini yürütmek için gerekli tüm değişkenleri belirttikten sonra bu aşamada atamaları kullanarak aritmetik işlemleri kolayca gerçekleştirebilirsiniz. Örneğin, eğer NUMBER01 ve NUMBER02 alanlarının içeriğini toplamak istiyorsanız, aşağıdaki ifadeyi kullanabilirsiniz:

Kod:
result = number01 + number02.

Sentaks ile ilgili olarak, aritmetik işlemin kendisinin eşittir işaretinin sağına yazılması gerektiğine dikkat etmelisiniz. NUMBER01 ve NUMBER02 alanları hesaplama işlemi sonrasında dahi ilk içeriklerini muhafaza etmeye devam ederken işlemin sonucu eşittir işaretinin solundaki alana atılır. Ancak, eşittir işaretinin solundaki alan değişir: Hesaplama işleminden sonra, RESULT alanı yeni bir içeriğe sahip olur ve bu içerik eskisinin yerini alır.

Aritmetik İşlemlerde Boşluk Karakteri
  • Doğru sentaksa ilişkin bir başka önemli nokta boş karakterlerin kullanılmasıdır. Örnekteki, eşittir işaretinden ve artı (+) işareti gibi bir aritmetik operatörden önce ve sonra boşluk karakteri kullanmalısınız. İleride, karmaşık ifadeler ve çoklu parantezler kullanmanız gerekirse, her parantezden önce ve sonra boşluk karakteri eklemeniz gerekir. En az bir boşluk eklemek gerektiğini unutmayın, ancak birden fazla boşluk ta ekleyebilirsiniz.
Bu yazım düzeninin nedeni, bazı işlevlerin herhangi bir boşluk karakteri olmadan direkt olarak yazılmasıdır. Boşluk karakterleri sistemin aritmetik işlemler ve diğer fonksiyonlar arasında ayrım yapmasına yardımcı olmak için gereklidir.

Eğer NUMBER02 değişkenin içeriğine sabit bir değer eklemek isterseniz (örneğin, 2), buna uygun ifadeyi şöyle oluşturmanız gerekir:

Kod:
number02 = number01 + 2.

Yine, eşittir işaretinin solundaki değişkenin eski içerği yenisi ile değiştirilir. Tabii ki, aynı değişkenin içeriğine de sabit bir değer ekleyebilirsiniz. Örneğin; sayaç ile sonucu 1 artırabilirsiniz. Buna uygun ifade şöyle olacaktır:

Kod:
number01 = number01 + 1.

Bir kez daha, aynı prensip geçerlidir: İşlem değeri eşittir işaretinin sağında belirlenir. Örnekte, NUMBER01 içeriğine 1 sayısı eklenir. İşlemin sonucu daha sonra eşittir işaretinin solundaki değişkene atılır. Başka bir deyişle: NUMBER01 yeni bir içeriğe sahiptir.

Buna karşılık; çıkarma, çarpma ve bölme işlemleri için de gösterim benzerdir:

Kod:
result = number01 – number02.
result = number01 * number02.
result = number01 / number02.

Çıkarma işlemi için aritmetik operatör olarak eksi işaretini (-), çarpma için yıldız (*) ve bölme için eğik çizgi (/) işaretini kullanmalısınız. Aritmetik operatörler yerine ADD, SUBTRACT, MULTIPLY ve DIVIDE anahtar kelimelerini de kullanabiliriz. Ancak bu anahtar kelimeler pratikte sık kullanılmadığından, bu sitedeki örneklerde kullanmayacağız.

Temel önkoşullar öğretildikten sonra, şimdi ayrıntılara bakabiliriz. Burada, eski bir atasözü "Şeytan ayrıntılarda gizlidir" geçerlidir. Örneğin, tüm alanlar aynı özelliklere sahip değildir veya birbiri ile uyumlu değildir.

Uyumlu ve Dönüştürülebilir Veri Nesneleri
Eğer farklı alanlar aynı özelliklere sahipse, bu tip alanlar uyumlu veri nesneleri (compatible data objects) olarak adlandırılır. Çünkü, bunların tüm teknik özellikleri (tip, alan uzunluğu, ondalık basamağı) tamamen aynıdır. Eğer nitelikler uyumlu ise, alanlar dönüştürülebilir veri nesneleri (convertible data objects) olarak adlandırılır. Bu durumda, veri türlerinin uygun dönüşüm kuralları kullanılarak uyumlu bir türe dönüştürülmesi gerekir. Dönüşüm mümkün değilse sistem sentaks (söz dizimi) veya çalıştırma hatası verir.

Birçok dönüşüm kuralının SAP sisteminde zaten kayıtlı olduğunu bilmek rahatlatıcıdır. Eğer uygun ifadeleri belirtirseniz bu kurallara dayanarak, sistem bir veri türünü başka bir veri türüne dönüştürür. Bu kurallar size ihtiyacınız olan sonuçları üretiyorsa, dönüşüm sorunsuz çalışır. Ne yazık ki, bu her zaman böyle değildir, ve mevcut kurallar kümesi akla gelebilecek tüm senaryoları kapsamaz.

Hata Kaynakları
  • İstemesek te kabul etmeliyiz ki; dönüştürülemeyen veri tiplerinden kaynaklanan çalışma hatalarından çoğu kez geliştiricilerin kendileri sorumludur. Örneğin, bir tarih alanına yıldızları (*) ve özel karakterleri kaydetmeye çalışmak için hiçbir mantıklı neden yoktur ancak bu durum meydana gelir. İleri düzey geliştiriciler bile, özellikle mevcut uygulamaları değiştirmek zorundalarsa, bazen bu hataları üretirler. Aynı hatalar diğer sistemlerden veri taşıma sırasında da oluşabilir. Yani, henüz yeni başlarken bu hatalardan biriyle karşılaşırsanız panik yapmanıza gerek yoktur.
Dönüşüm Kuralları
Dönüşüm kuralları bir kaynak alanın içeriğinin, hedef alanına nasıl girileceğini tanımlar. Kaynak alanları, şimdiye kadar gördüğünüz ondalıklı sayılar için p veri türü ve tamsayılar için i veri türü gibi farklı veri türlerine sahip olabilirler. Tarih ve saat alanları veya karakter dizeleri için diğer veri türleri de mevcut olduğundan, dönüşüm kuralları her bir veri türü için kaynak alanın içeriği hedef alana girildiğinde gerçekleşecek süreci belirtir. Diğer bir deyişle, dönüşüm kuralları bir tamsayı alanına ondalıklı sayı eklerseniz, bir tarih alanının içeriğine ondalıklı sayı eklerseniz veya karakter bir alana bir ondalıklı sayı yazarsanız neler olduğunu tanımlar. Örnek olarak bir dönüşüm kuralına bakalım.

Eğer, kaynak p tipinde bir veri nesnesi ve hedef i tipinde bir veri nesnesi (örneğin, bir tamsayı) ise, sistem kaynak alanın ondalık basamaklarını yukarı veya aşağı yuvarlar ve içeriği sağa hizalanmış olarak hedef alana atar. Hedefin uzunluğunun yeterli olması durumunda, alan soldan sıfırlarla doldurulur; aksi halde, bir aşım veya çalıştırma hatası oluşur. Örneğin, eğer ondalıklı sayı olan 4.44'ü bir tamsayı alanına atarsanız, tam sayı alanının içeriği 4 olacaktır. Eğer ondalıklı sayı olan 5.55'i bir tamsayı alanına atarsanız, alanının içeriği 6 olacaktır.

Eğer sayısal işlem birkaç farklı veri türünü içeriyorsa; ABAP, işlemi çalıştırmadan önce tüm veri türlerini en yüksek veri türüne dönüştürür. Sonra dönüştürülen değerleri kullanarak işlemi yürütür ve sonucu (gerekliyse, dönüşüm kurallarını kullanarak) sonuç alanına atar.

Tamsayılar, Ondalıklı Sayılar, Üslü Sayılar
  • Örneğin, sayısal işlem tamsayılar, ondalıklı sayılar ve üslü sayılar içeriyorsa, üslü sayılar en yüksek veri tipini temsil eder. İlk adımda, tam sayılar ondalıklı sayılara çevrilir; daha sonra, tüm sayılar üslü sayılara dönüştürülür; en son olarak, işlem üslü sayılar kullanılarak gerçekleştirilir. Bundan sonra, üslü sayı değeri dönüşüm kurallarına göre sonuç alanına atanır. Tahmin edebileceğiniz gibi, hesaplamanın doğruluğu sonuç alanının veri türüne bağlıdır.
İşleri en başından mümkün olduğunca basit tutmak için, her zaman veri nesnelerinizi mümkün olduğunca uyumlu tuttuğunuzdan emin olun. Dönüşüm ile ilgili hiç bir şeyi atlamadığımızdan emin olmak için bu noktada sayısal işlemler için orijinal ABAP komutu olan COMPUTE anahtar kelimesinden bahsetmeliyiz. COMPUTE anahtar sözcüğünü kullanarak bir toplama işlemi için sözdizimi aşağıdaki gibidir:

Kod:
COMPUTE result = number01 + number02.

Gördüğünüz gibi, tek fark deyimin uzun olmasıdır, ancak okunabilirlik artmaz. Neyse ki, COMPUTE anahtar kelimesinin kullanımı isteğe bağlıdır. Gerçek hayatta, hemen hemen hiç kullanılmaz. Çoğu geliştiriciler kısaltılmış biçimi kullanır ve sistem her iki biçimde de tamamen aynı şekilde çalışır. Bu yüzden biz de bu sitede COMPUTE anahtar sözcüğünü kullanımdan çıkaracak ve aşağıdaki gibi kısaltılmış gösterimi kullanacağız.

Kod:
result = number01 + number02.

Bölme İşleminin Özellikleri
ABAP ortamındaki hesaplamalara ilişkin olarak, toplama, çıkarma ve çarpma işlemleri herhangi bir sorun teşkil etmez. Ancak, bölme işlemleri daha yakından bakmayı gerektirir. Bölme işlemi sonunda, bazen ondalık basamaklı sonuç almak isterken, diğer zamanlarda tamsayılar ile kalansız bölme yapmak isteyeceksiniz. Ayrıca bölme işlemi sonucunda sadece kalan ilginizi çekebilir. ABAP bu farklı senaryolar için farklı ifadeler sunar.

Daha önce de tarif edildiği gibi, bir bölme işlemi en basit şekilde bir eğik çizgi (/) ile temsil edilir:

Kod:
DATA number01 TYPE p DECIMALS 2 VALUE '4.56'.
DATA number02 LIKE number01 VALUE '5.67'.
DATA result LIKE number01.
result = number02 / number01.

Eğer sonucu hesaplamak için bir elektronik hesap makinesi kullanırsanız 1,243421053 rakamını üretir. Fakat ABAP ne yapacak? Tüm değişkenler aynı şekilde bildirilmiştir. Bir ondalıklı sayı (cebirsel işareti dahil olmak üzere), maksimum 16 bayt büyüklüğündedir ve bu 32 basamağa eşittir. Sistem kesin sonucu üretecek -ABAP'ta ondalıklı sayılar için hesaplama doğruluğu maksimum 14 ondalık basamaktır- ancak bizim daha önce iki ondalık basamak içerek diye bildirdiğimiz hedef değişkene atamak üzere ondalık basamak sayısını azaltmak için bunu yuvarlayacaktır. ABAP değeri 1,24'e yuvarlar.

Eğer tamsayılardan oluşan bir bölme sonucu elde etmek istiyorsanız, ifadeyi yeniden yazmanız ve eğik çizgi yerine DIV operatörü kullanmanız gerekir:

Kod:
result = number02 DIV number01.

Diğer tüm önkoşullar değişmeden kalırsa, tamsayılardan oluşan bölme sonuç olarak 1 değerini üretir. Hedef değişkenin iki ondalık basamağı olduğundan, ifadeyi çalıştırdıktan sonra içeriği 1,00 olur.

Üçüncü senaryoda, tam sayılardan oluşan bölmenin kalanıyla ilgileniyoruz. Burada, MOD işlemini kullanırız ve böylece ifade şu şekilde oluşur:

Kod:
result = number02 MOD number01.

Yine, tüm diğer faktörlerin değişmeden kaldığını varsayarsak ve böylece tamsayılardan oluşan bölme sonucu 1 ise, kalanı 1.11 olur. İki ondalık basamağı dahil olmak üzere bu kalan, hedef değişkene aktarılır ve hedef değişkenin içeriği 1.11 olur.

1.5 Saat
  • Bu tip hesaplamaların gerçek hayatla alakalı olup olmadığını merak ediyor olabilirsiniz. Eğer öyleyse, birçok sistemde zaman değerinin saat ve dakika cinsinden değil ondalık değerlerle girildiği gerçeğini düşünün. (Örneğin, "1,5 Saat") Bu ondalık değerleri Saat ve dakikaya dönüştürmek için, burada açıklanan farklı bölme seçeneklerini kullanmanız gerekir.
 
Üst