Kategori arşivi: SAP Business Objects Design Studio

Sap BO Lumira Designer tarih fonksiyonları (date functions)

Sap BO Lumira Designer’da (eski adı Sap BO Design Studio) Date (DateObject) (UTC) veri tipi geldi. Global değişkenler (global variables) Date veri tipinde tanımlanamıyorlar, Date objesi kod bloğu içinde tanımlanabiliyor/kullanılabiliyor.

Date objesi createUTC ile oluşturulurken aylar 1-12 arasında değil 0-11 arasında tanımlanıyor.

Date objesinin getUTCDay fonksiyonu haftanın kaçıncı günü olduğunu döndürüyor. Dönüş değerleri 0-6 arasında, 0 Pazar, 6 Cumartesi.

Amaç içinde bulunulan haftanın ilk gününü (pazartesi) bulmak. İlk yöntem Date objesinin valueOf fonksiyonunu farketmeden önce yazdığım/geliştirdiğim yöntem. İkinci yöntem (doğru, kolay, kısa, olması gereken yöntem) valueOf fonksiyonu ile hesapladığım yöntem.

lumira_designer__date_functions__get_week_start__first_method.txt
lumira_designer__date_functions__get_week_start__second_method.txt

---------------------------------------
---------------------------------------

LIB_DATE.get_current_week_start()

var day_of_week_0 = [1,2,3,4,5,6];
var day_of_week_1 = [0];
day_of_week_1.pop();
var day_of_week_2 = [1];
var day_of_week_3 = [1,2];
var day_of_week_4 = [1,2,3];
var day_of_week_5 = [1,2,3,4];
var day_of_week_6 = [1,2,3,4,5];
var day_of_week_temp = [0];
day_of_week_temp.pop();

var lv_today_YYYYMMDD = APPLICATION.getInfo().dateNowInternalFormat;

var lv_year_YYYY = Convert.subString(lv_today_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_today_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_today_YYYYMMDD, 6, 8);

var lv_year_int_YYYY = Convert.stringToInt(lv_year_YYYY);
var lv_month_int_MM = Convert.stringToInt(lv_month_MM);
var lv_day_int_DD = Convert.stringToInt(lv_day_DD);

var lv_today_DATE = Date.createUTC(lv_year_int_YYYY, lv_month_int_MM-1, lv_day_int_DD); // UTC months 0-11

if ( lv_today_DATE.getUTCDay() == 1 ) { // 0-6 Monday
	day_of_week_temp = day_of_week_1;
} else if ( lv_today_DATE.getUTCDay() == 2 ) { // 0-6 Tuesday
	day_of_week_temp = day_of_week_2;
} else if ( lv_today_DATE.getUTCDay() == 3 ) { // 0-6 Wednesday
	day_of_week_temp = day_of_week_3;
} else if ( lv_today_DATE.getUTCDay() == 4 ) { // 0-6 Thursday
	day_of_week_temp = day_of_week_4;
} else if ( lv_today_DATE.getUTCDay() == 5 ) { // 0-6 Friday
	day_of_week_temp = day_of_week_5;
} else if ( lv_today_DATE.getUTCDay() == 6 ) { // 0-6 Saturday
	day_of_week_temp = day_of_week_6;
} else if ( lv_today_DATE.getUTCDay() == 0 ) { // 0-6 Sunday
	day_of_week_temp = day_of_week_0;
}
day_of_week_temp.forEach(function(elm, ind) {
	lv_today_YYYYMMDD = LIB_DATE.get_previous_day(lv_today_YYYYMMDD);
});

var lv_current_week_start_YYYYMMDD = lv_today_YYYYMMDD;

return lv_current_week_start_YYYYMMDD;

---------------------------------------
---------------------------------------

LIB_DATE.get_previous_day(p_date(String))

var lv_today_YYYYMMDD = p_date;

var lv_year_YYYY = Convert.subString(lv_today_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_today_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_today_YYYYMMDD, 6, 8);

var lv_year_int = Convert.stringToInt(lv_year_YYYY);
var lv_month_int = Convert.stringToInt(lv_month_MM);
var lv_day_int = Convert.stringToInt(lv_day_DD);

var lv_previous_day = "";

if (lv_day_int != 1) {
	lv_previous_day = lv_year_YYYY + lv_month_MM + LIB_DATE.get_two_digit_month_or_day(lv_day_int-1);
} else {
	if (lv_month_int != 1) { // go previous month
		lv_previous_day = lv_year_YYYY + LIB_DATE.get_two_digit_month_or_day(lv_month_int-1) + LIB_DATE.get_two_digit_month_or_day(LIB_DATE.get_previous_month_days(p_date));
	} else { // go previous month and year
		lv_previous_day = Convert.floatToString(lv_year_int-1,"###0") + LIB_DATE.get_two_digit_month_or_day(12) + LIB_DATE.get_two_digit_month_or_day(LIB_DATE.get_previous_month_days(p_date));
	}
}

return lv_previous_day;

---------------------------------------
---------------------------------------

LIB_DATE.get_previous_month_days(p_date(String))

var lv_previous_month_start_YYYYMMDD = LIB_DATE.get_previous_month_start(p_date);

var lv_year_YYYY = Convert.subString(lv_previous_month_start_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_previous_month_start_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_previous_month_start_YYYYMMDD, 6, 8);

var lv_year_int_YYYY = Convert.stringToInt(lv_year_YYYY);
var lv_month_int_MM = Convert.stringToInt(lv_month_MM);
var lv_day_int_DD = Convert.stringToInt(lv_day_DD);

var lv_previous_month_days = 0;

if (lv_month_MM=="01" || lv_month_MM=="03" || lv_month_MM=="05" || lv_month_MM=="07" || lv_month_MM=="08" || lv_month_MM=="10" || lv_month_MM=="12") {
	lv_previous_month_days = 31;
} else if (lv_month_MM=="04" || lv_month_MM=="06" || lv_month_MM=="09" || lv_month_MM=="11") {
	lv_previous_month_days = 30;
} else  if (lv_month_MM=="02") {
	if ( Math.floor(lv_year_int_YYYY/4)*4 == lv_year_int_YYYY ) {
		// leap year
		lv_previous_month_days = 29;
	} else {
		lv_previous_month_days = 28;
	}
}

return lv_previous_month_days;

---------------------------------------
---------------------------------------

LIB_DATE.get_today()

return APPLICATION.getInfo().dateNowInternalFormat;

---------------------------------------
---------------------------------------

LIB_DATE.get_two_digit_month_or_day(p_day_or_month(int))

if (p_day_or_month < 10) {
	return "0"+Convert.floatToString(p_day_or_month,"#0");
} else {
	return Convert.floatToString(p_day_or_month,"#0");
}

---------------------------------------
---------------------------------------

LIB_DATE.get_week_start(p_date(String))

var day_of_week_0 = [1,2,3,4,5,6];
var day_of_week_1 = [0];
day_of_week_1.pop();
var day_of_week_2 = [1];
var day_of_week_3 = [1,2];
var day_of_week_4 = [1,2,3];
var day_of_week_5 = [1,2,3,4];
var day_of_week_6 = [1,2,3,4,5];
var day_of_week_temp = [0];
day_of_week_temp.pop();

var lv_today_YYYYMMDD = p_date;

var lv_year_YYYY = Convert.subString(lv_today_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_today_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_today_YYYYMMDD, 6, 8);

var lv_year_int_YYYY = Convert.stringToInt(lv_year_YYYY);
var lv_month_int_MM = Convert.stringToInt(lv_month_MM);
var lv_day_int_DD = Convert.stringToInt(lv_day_DD);

var lv_today_DATE = Date.createUTC(lv_year_int_YYYY, lv_month_int_MM-1, lv_day_int_DD); // UTC months 0-11

if ( lv_today_DATE.getUTCDay() == 1 ) { // 0-6 Monday
	day_of_week_temp = day_of_week_1;
} else if ( lv_today_DATE.getUTCDay() == 2 ) { // 0-6 Tuesday
	day_of_week_temp = day_of_week_2;
} else if ( lv_today_DATE.getUTCDay() == 3 ) { // 0-6 Wednesday
	day_of_week_temp = day_of_week_3;
} else if ( lv_today_DATE.getUTCDay() == 4 ) { // 0-6 Thursday
	day_of_week_temp = day_of_week_4;
} else if ( lv_today_DATE.getUTCDay() == 5 ) { // 0-6 Friday
	day_of_week_temp = day_of_week_5;
} else if ( lv_today_DATE.getUTCDay() == 6 ) { // 0-6 Saturday
	day_of_week_temp = day_of_week_6;
} else if ( lv_today_DATE.getUTCDay() == 0 ) { // 0-6 Sunday
	day_of_week_temp = day_of_week_0;
}
day_of_week_temp.forEach(function(elm, ind) {
	lv_today_YYYYMMDD = LIB_DATE.get_previous_day(lv_today_YYYYMMDD);
});

var lv_week_start_YYYYMMDD = lv_today_YYYYMMDD;

return lv_week_start_YYYYMMDD;

---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------

LIB_DATE.get_current_week_start_2()

var lv_today_YYYYMMDD = APPLICATION.getInfo().dateNowInternalFormat;

var lv_year_YYYY = Convert.subString(lv_today_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_today_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_today_YYYYMMDD, 6, 8);

var lv_year_int_YYYY = Convert.stringToInt(lv_year_YYYY);
var lv_month_int_MM = Convert.stringToInt(lv_month_MM);
var lv_day_int_DD = Convert.stringToInt(lv_day_DD);

var lv_today_DATE = Date.createUTC(lv_year_int_YYYY, lv_month_int_MM-1, lv_day_int_DD); // UTC months 0-11

var lv_current_week_start_YYYYMMDD = "";

if ( lv_today_DATE.getUTCDay() == 1 ) { // 0-6 Monday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,0);
} else if ( lv_today_DATE.getUTCDay() == 2 ) { // 0-6 Tuesday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,-1);
} else if ( lv_today_DATE.getUTCDay() == 3 ) { // 0-6 Wednesday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,-2);
} else if ( lv_today_DATE.getUTCDay() == 4 ) { // 0-6 Thursday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,-3);
} else if ( lv_today_DATE.getUTCDay() == 5 ) { // 0-6 Friday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,-4);
} else if ( lv_today_DATE.getUTCDay() == 6 ) { // 0-6 Saturday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,-5);
} else if ( lv_today_DATE.getUTCDay() == 0 ) { // 0-6 Sunday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,-6);
}

return lv_current_week_start_YYYYMMDD;

---------------------------------------
---------------------------------------

LIB_DATE.get_relative_date(p_date(String),p_n(int))

var lv_today_YYYYMMDD = p_date;

var lv_year_YYYY = Convert.subString(lv_today_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_today_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_today_YYYYMMDD, 6, 8);

var lv_year_int_YYYY = Convert.stringToInt(lv_year_YYYY);
var lv_month_int_MM = Convert.stringToInt(lv_month_MM);
var lv_day_int_DD = Convert.stringToInt(lv_day_DD);

var lv_today_DATE = Date.createUTC(lv_year_int_YYYY, lv_month_int_MM-1, lv_day_int_DD); // UTC months 0-11

var lv_today_utc_value = lv_today_DATE.valueOf();

var lv_relative_utc_value = lv_today_utc_value + (p_n * 24 * 60 * 60 * 1000);

var lv_relative_date_DATE = Date.createUTC(1970, 0, 1, 0, 0, 0, lv_relative_utc_value);

var lv_relative_date_YYYYMMDD = lv_relative_date_DATE.toSapDateString();

return lv_relative_date_YYYYMMDD;

---------------------------------------
---------------------------------------

LIB_DATE.get_today()

return APPLICATION.getInfo().dateNowInternalFormat;

---------------------------------------
---------------------------------------

LIB_DATE.get_two_digit_month_or_day(p_day_or_month(int))

if (p_day_or_month < 10) {
	return "0"+Convert.floatToString(p_day_or_month,"#0");
} else {
	return Convert.floatToString(p_day_or_month,"#0");
}

---------------------------------------
---------------------------------------

LIB_DATE.get_week_start_2(p_date(String))

var lv_today_YYYYMMDD = p_date;

var lv_year_YYYY = Convert.subString(lv_today_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_today_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_today_YYYYMMDD, 6, 8);

var lv_year_int_YYYY = Convert.stringToInt(lv_year_YYYY);
var lv_month_int_MM = Convert.stringToInt(lv_month_MM);
var lv_day_int_DD = Convert.stringToInt(lv_day_DD);

var lv_today_DATE = Date.createUTC(lv_year_int_YYYY, lv_month_int_MM-1, lv_day_int_DD); // UTC months 0-11

var lv_current_week_start_YYYYMMDD = "";

if ( lv_today_DATE.getUTCDay() == 1 ) { // 0-6 Monday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,0);
} else if ( lv_today_DATE.getUTCDay() == 2 ) { // 0-6 Tuesday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,-1);
} else if ( lv_today_DATE.getUTCDay() == 3 ) { // 0-6 Wednesday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,-2);
} else if ( lv_today_DATE.getUTCDay() == 4 ) { // 0-6 Thursday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,-3);
} else if ( lv_today_DATE.getUTCDay() == 5 ) { // 0-6 Friday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,-4);
} else if ( lv_today_DATE.getUTCDay() == 6 ) { // 0-6 Saturday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,-5);
} else if ( lv_today_DATE.getUTCDay() == 0 ) { // 0-6 Sunday
	lv_current_week_start_YYYYMMDD = LIB_DATE.get_relative_date(lv_today_YYYYMMDD,-6);
}

return lv_current_week_start_YYYYMMDD;

---------------------------------------
---------------------------------------

Sap BO Design Studio Tarih Fonksiyonları (Date Functions)

Sap BO Design Studio’da (1.x) tarih hesaplamaları veri kaynaklarında yapılması gerekiyor. Design Studio’da tarih fonksiyonları yer almıyor. Bu ihtiyaç için Karol Kalisz Design Studio Sdk ile ücretsiz ve açık kaynak Simple Date Object Component @github geliştirmiş.

Sap BO Lumira Designer’da (2.x) tarih hesaplamaları için Date (DateObject) dahili olarak yer alıyor. Global değişken tipi olarak seçilemiyor ama kod bloğunda var d1 = Date.createNow(); şeklinde kullanılabiliyor.

Bu Design Studio eklentisini kullanmadan tarih hesaplamalarını yapmak için yazdığım fonksiyonlar: (Burada en önemlisi get_previous_day ile önceki güne gitme fonksiyonu, n elemanlı dizi tanımlayıp n gün öncesine gidilebiliyor. WebI deki RelativeDate gibi)

design_studio_lib_date.txt

---------------------------------------
---------------------------------------

Global Variables
----------------

gv_date_current_month_array(String)(Array)
gv_date_current_month_concatenated_string(String)
gv_date_current_quarter_array(String)(Array)
gv_date_current_quarter_concatenated_string(String)
gv_date_current_year_array
gv_date_current_year_concatenated_string
gv_date_full_array
gv_date_full_concatenated_string
gv_date_full_not_concatenated_string
gv_date_last_month_array
gv_date_last_month_concatenated_string
gv_date_yesterday_array
gv_date_yesterday_concatenated_string

---------------------------------------
---------------------------------------

LIB_DATE
--------

---------------------------------------
---------------------------------------

LIB_DATE.get_current_month_start()

var lv_today_YYYYMMDD = APPLICATION.getInfo().dateNowInternalFormat;

var lv_year_YYYY = Convert.subString(lv_today_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_today_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_today_YYYYMMDD, 6, 8);

var lv_current_month_start_YYYYMMDD = lv_year_YYYY+lv_month_MM+"01";

return lv_current_month_start_YYYYMMDD;

---------------------------------------
---------------------------------------

LIB_DATE.get_current_quarter_start()

var lv_today_YYYYMMDD = APPLICATION.getInfo().dateNowInternalFormat;

var lv_year_YYYY = Convert.subString(lv_today_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_today_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_today_YYYYMMDD, 6, 8);

var lv_current_quarter_start_YYYYMMDD = "";

if (lv_month_MM =="01" || lv_month_MM =="02" || lv_month_MM =="03") {
	lv_current_quarter_start_YYYYMMDD = lv_year_YYYY + "01" + "01";
} else if (lv_month_MM =="04" || lv_month_MM =="05" || lv_month_MM =="06") {
	lv_current_quarter_start_YYYYMMDD = lv_year_YYYY + "04" + "01";
} else if (lv_month_MM =="07" || lv_month_MM =="08" || lv_month_MM =="09") {
	lv_current_quarter_start_YYYYMMDD = lv_year_YYYY + "07" + "01";
} else if (lv_month_MM =="10" || lv_month_MM =="11" || lv_month_MM =="12") {
	lv_current_quarter_start_YYYYMMDD = lv_year_YYYY + "10" + "01";
}

return lv_current_quarter_start_YYYYMMDD;

---------------------------------------
---------------------------------------

LIB_DATE.get_current_year_start()

var lv_today_YYYYMMDD = APPLICATION.getInfo().dateNowInternalFormat;

var lv_year_YYYY = Convert.subString(lv_today_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_today_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_today_YYYYMMDD, 6, 8);

var lv_current_year_start_YYYYMMDD = lv_year_YYYY+"01"+"01";

return lv_current_year_start_YYYYMMDD;

---------------------------------------
---------------------------------------

LIB_DATE.get_current_year_start()

var lv_today_YYYYMMDD = APPLICATION.getInfo().dateNowInternalFormat;

var lv_year_YYYY = Convert.subString(lv_today_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_today_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_today_YYYYMMDD, 6, 8);

var lv_current_year_start_YYYYMMDD = lv_year_YYYY+"01"+"01";

return lv_current_year_start_YYYYMMDD;

---------------------------------------
---------------------------------------

LIB_DATE.get_last_month_start()

var lv_today_YYYYMMDD = APPLICATION.getInfo().dateNowInternalFormat;

var lv_year_YYYY = Convert.subString(lv_today_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_today_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_today_YYYYMMDD, 6, 8);

var lv_last_month_start_YYYYMMDD = "";

var lv_year_int = Convert.stringToInt(lv_year_YYYY);
var lv_month_int = Convert.stringToInt(lv_month_MM);
var lv_day_int = Convert.stringToInt(lv_day_DD);

if (lv_month_int==1) {
	lv_last_month_start_YYYYMMDD = Convert.floatToString(lv_year_int-1,"###0")+"12"+"01";
} else {
	lv_last_month_start_YYYYMMDD = lv_year_YYYY+LIB_DATE.get_two_digit_month_or_day(lv_month_int-1)+"01";
}

return lv_last_month_start_YYYYMMDD;

---------------------------------------
---------------------------------------

LIB_DATE.get_previous_day(p_date(String))

var lv_today_YYYYMMDD = p_date;

var lv_year_YYYY = Convert.subString(lv_today_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_today_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_today_YYYYMMDD, 6, 8);

var lv_year_int = Convert.stringToInt(lv_year_YYYY);
var lv_month_int = Convert.stringToInt(lv_month_MM);
var lv_day_int = Convert.stringToInt(lv_day_DD);

var lv_previous_day = "";

if (lv_day_int != 1) {
	lv_previous_day = lv_year_YYYY + lv_month_MM + LIB_DATE.get_two_digit_month_or_day(lv_day_int-1);
} else {
	if (lv_month_int != 1) { // go previous month
		lv_previous_day = lv_year_YYYY + LIB_DATE.get_two_digit_month_or_day(lv_month_int-1) + LIB_DATE.get_two_digit_month_or_day(LIB_DATE.get_previous_month_days(p_date));
	} else { // go previous month and year
		lv_previous_day = Convert.floatToString(lv_year_int-1,"###0") + LIB_DATE.get_two_digit_month_or_day(12) + LIB_DATE.get_two_digit_month_or_day(LIB_DATE.get_previous_month_days(p_date));
	}
}

return lv_previous_day;

---------------------------------------
---------------------------------------

LIB_DATE.get_previous_month_days(p_date(String))

var lv_previous_month_start_YYYYMMDD = LIB_DATE.get_previous_month_start(p_date);

var lv_year_YYYY = Convert.subString(lv_previous_month_start_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_previous_month_start_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_previous_month_start_YYYYMMDD, 6, 8);

var lv_year_int_YYYY = Convert.stringToInt(lv_year_YYYY);
var lv_month_int_MM = Convert.stringToInt(lv_month_MM);
var lv_day_int_DD = Convert.stringToInt(lv_day_DD);

var lv_previous_month_days = 0;

if (lv_month_MM=="01" || lv_month_MM=="03" || lv_month_MM=="05" || lv_month_MM=="07" || lv_month_MM=="08" || lv_month_MM=="10" || lv_month_MM=="12") {
	lv_previous_month_days = 31;
} else if (lv_month_MM=="04" || lv_month_MM=="06" || lv_month_MM=="09" || lv_month_MM=="11") {
	lv_previous_month_days = 30;
} else  if (lv_month_MM=="02") {
	if ( Math.floor(lv_year_int_YYYY/4)*4 == lv_year_int_YYYY ) {
		// leap year
		lv_previous_month_days = 29;
	} else {
		lv_previous_month_days = 28;
	}
}

return lv_previous_month_days;

---------------------------------------
---------------------------------------

LIB_DATE.get_previous_month_start(p_date(String))

var lv_date_YYYYMMDD = p_date;

var lv_year_YYYY = Convert.subString(lv_date_YYYYMMDD, 0, 4);
var lv_month_MM = Convert.subString(lv_date_YYYYMMDD, 4, 6);
var lv_day_DD = Convert.subString(lv_date_YYYYMMDD, 6, 8);

var lv_previous_month_start_YYYYMMDD = "";

var lv_year_int = Convert.stringToInt(lv_year_YYYY);
var lv_month_int = Convert.stringToInt(lv_month_MM);
var lv_day_int = Convert.stringToInt(lv_day_DD);

if (lv_month_int==1) {
	lv_previous_month_start_YYYYMMDD = Convert.floatToString(lv_year_int-1,"###0")+"12"+"01";
} else {
	lv_previous_month_start_YYYYMMDD = lv_year_YYYY+LIB_DATE.get_two_digit_month_or_day(lv_month_int-1)+"01";
}

return lv_previous_month_start_YYYYMMDD;

---------------------------------------
---------------------------------------

LIB_DATE.get_today()

return APPLICATION.getInfo().dateNowInternalFormat;

---------------------------------------
---------------------------------------

LIB_DATE.get_two_digit_month_or_day(p_day_or_month(int))

if (p_day_or_month < 10) {
	return "0"+Convert.floatToString(p_day_or_month,"#0");
} else {
	return Convert.floatToString(p_day_or_month,"#0");
}

---------------------------------------
---------------------------------------

LIB_DATE.get_year(p_date(String))

return Convert.subString(p_date, 0, 4);

---------------------------------------
---------------------------------------

LIB_DATE.get_year_month(p_date(String))

return Convert.subString(p_date, 0, 6);

---------------------------------------
---------------------------------------

LIB_DATE.get_year_quarter(p_date(String))

var lv_year_YYYY = Convert.subString(p_date, 0, 4);
var lv_month_MM = Convert.subString(p_date, 4, 6);
var lv_day_DD = Convert.subString(p_date, 6, 8);

var lv_year_quarter_YYYYQN = "";

if (lv_month_MM == "01" || lv_month_MM == "02" || lv_month_MM == "03") {
	lv_year_quarter_YYYYQN = lv_year_YYYY + "Q1";
} else if (lv_month_MM == "04" || lv_month_MM == "05" || lv_month_MM == "06") {
	lv_year_quarter_YYYYQN = lv_year_YYYY + "Q2";
} else if (lv_month_MM == "07" || lv_month_MM == "08" || lv_month_MM == "09") {
	lv_year_quarter_YYYYQN = lv_year_YYYY + "Q3";
} else if (lv_month_MM == "10" || lv_month_MM == "11" || lv_month_MM == "12") {
	lv_year_quarter_YYYYQN = lv_year_YYYY + "Q4";
}

return lv_year_quarter_YYYYQN;

---------------------------------------
---------------------------------------

LIB_DATE.initialize_date_arrays_for_filtering()

var lv_date_temp = "";
var lv_date_temp_formatted = "";

var lv_today_YYYYMMDD = LIB_DATE.get_today();
var lv_current_month_start_YYYYMMDD = LIB_DATE.get_current_month_start();
var lv_current_month_YYYYMM = LIB_DATE.get_year_month(lv_today_YYYYMMDD);
var lv_last_month_start_YYYYMMDD = LIB_DATE.get_last_month_start();
var lv_last_month_YYYYMM = LIB_DATE.get_year_month(lv_last_month_start_YYYYMMDD);
var lv_current_quarter_start_YYYYMMDD = LIB_DATE.get_current_quarter_start();
var lv_current_quarter_YYYYQN = LIB_DATE.get_year_quarter(lv_today_YYYYMMDD);
var lv_current_year_start_YYYYMMDD = LIB_DATE.get_current_year_start();
var lv_current_year_YYYY = LIB_DATE.get_year(lv_today_YYYYMMDD);

gv_date_full_concatenated_string = "";
gv_date_full_not_concatenated_string = "";
gv_date_current_month_concatenated_string = "";
gv_date_last_month_concatenated_string = "";
gv_date_current_quarter_concatenated_string = "";
gv_date_current_year_concatenated_string = "";

var lv_caldays_array = DS_DAYS.getMembers("DAY", 2000);

lv_caldays_array.forEach(function(sel, ind) {
	lv_date_temp = sel.internalKey;
	lv_date_temp_formatted = Convert.subString(lv_date_temp,4,6)+"/"+Convert.subString(lv_date_temp,6,8)+"/"+Convert.subString(lv_date_temp,0,4);
	gv_date_full_array.push(lv_date_temp);
	gv_date_full_concatenated_string = gv_date_full_concatenated_string + ";" + lv_date_temp_formatted;
	gv_date_full_not_concatenated_string = gv_date_full_not_concatenated_string + ";!" + lv_date_temp_formatted;
	// current month
	if ( lv_current_month_YYYYMM == LIB_DATE.get_year_month(lv_date_temp) ) {
		gv_date_current_month_array.push(lv_date_temp);
		gv_date_current_month_concatenated_string = gv_date_current_month_concatenated_string + ";" + lv_date_temp_formatted;
	}
	// last month
	if ( lv_last_month_YYYYMM == LIB_DATE.get_year_month(lv_date_temp) ) {
		gv_date_last_month_array.push(lv_date_temp);
		gv_date_last_month_concatenated_string = gv_date_last_month_concatenated_string + ";" + lv_date_temp_formatted;
	}
	// current quarter
	if ( lv_current_quarter_YYYYQN == LIB_DATE.get_year_quarter(lv_date_temp) ) {
		gv_date_current_quarter_array.push(lv_date_temp);
		gv_date_current_quarter_concatenated_string = gv_date_current_quarter_concatenated_string + ";" + lv_date_temp_formatted;
	}
	// current year
	if ( lv_current_year_YYYY == LIB_DATE.get_year(lv_date_temp) ) {
		gv_date_current_year_array.push(lv_date_temp);
		gv_date_current_year_concatenated_string = gv_date_current_year_concatenated_string + ";" + lv_date_temp_formatted;
	}
});

gv_date_full_concatenated_string = Convert.subString(gv_date_full_concatenated_string, 1); // lv_date_concatenation.length
gv_date_full_not_concatenated_string = Convert.subString(gv_date_full_not_concatenated_string, 1);
gv_date_current_month_concatenated_string = Convert.subString(gv_date_current_month_concatenated_string, 1);
gv_date_last_month_concatenated_string = Convert.subString(gv_date_last_month_concatenated_string, 1);
gv_date_current_quarter_concatenated_string = Convert.subString(gv_date_current_quarter_concatenated_string, 1);
gv_date_current_year_concatenated_string = Convert.subString(gv_date_current_year_concatenated_string, 1);

/*
if (gv_date_full_concatenated_string == "") {
	gv_date_full_concatenated_string = gv_date_full_not_concatenated_string;
}
if (gv_date_current_month_concatenated_string == "") {
	gv_date_current_month_concatenated_string = gv_date_full_not_concatenated_string;
}
if (gv_date_last_month_concatenated_string == "") {
	gv_date_last_month_concatenated_string = gv_date_full_not_concatenated_string;
}
if (gv_date_current_quarter_concatenated_string == "") {
	gv_date_current_quarter_concatenated_string = gv_date_full_not_concatenated_string;
}
if (gv_date_current_year_concatenated_string == "") {
	gv_date_current_year_concatenated_string = gv_date_full_not_concatenated_string;
}
*/

if (gv_date_full_concatenated_string == "") {
	gv_date_full_concatenated_string = "01/01/2100";
}
if (gv_date_current_month_concatenated_string == "") {
	gv_date_current_month_concatenated_string = "01/01/2100";
}
if (gv_date_last_month_concatenated_string == "") {
	gv_date_last_month_concatenated_string = "01/01/2100";
}
if (gv_date_current_quarter_concatenated_string == "") {
	gv_date_current_quarter_concatenated_string = "01/01/2100";
}
if (gv_date_current_year_concatenated_string == "") {
	gv_date_current_year_concatenated_string = "01/01/2100";
}

---------------------------------------
---------------------------------------

sap design studio dashboard oturum zaman aşımı hatası

Sap Design Studio ile geliştirilen ve sürekli açık kalması gereken dashboard lar için aşağıdaki hatalar alınıyorsa sebebi aşağıdaki durum olabilir.

Hatalar:
“An error occured: Please restart the application. Most likely your session is not valid anymore.”
“Analysis Application: Server Session Timeout”

Yukarıdaki hataların alındığı senaryoda Yük Dengeleyici (Load Balancer, LB) arkasında iki web sunucusu (Tomcat, W1 ve W2) yer alıyor, iki web sunucusu da tek uygulama (application, AP) sunucusuna bağlanıyor.

Tomcat ve Web Intelligence Processing Server larda oturum zaman aşımı süresi 60 dk olarak atanmış durumda. Design Studio (Analysis Application) servisinin oturum zaman aşımı süresi 20 dk kod içinde belirtildiği için (hardcoded) değiştirilemiyor. (Kaynak 1)

Geliştirilen dashboard timer (zamanlayıcı) bileşeni (component) ile 17 dk da bir veri kaynaklarını yeniliyor ve oturumun sonlanmamasını sağlıyor. Ama zaman zaman yukarıdaki hatalar alınabiliyordu. Sebebini dashboard u uygulama sunucusu (AP) üzerindeki tomcat ten açık bırakarak tespit ettik. Uygulama sunucusu üzerinden açılan dashboard larda oturum zaman aşımı hatası alınmadı. Hata sebebi Yük Dengeleyicinin (Load Balancer) zaman aşımı süresiydi. Yük Dengeleyicinin zaman aşımı süresi arttırıldı, session sticky (yapışkan oturum) özelliği aktifleştirildi.

Kaynaklar:
1) Design Studio Idle Session Timeout
2) Sap BO Webi Oturum Zamanaşımı (Session Timeout)
3) Timeout settings in BI Platform 4.x

sap design studio veri kaynakları yüklenmemesi problem çözümü

Sap Business Objects (BO) Design Studio ile geliştirilen dashboard ta “Data source not loaded” hatası alındığında. Veya “Cannot load InfoProvider DSL (data provider DS: Exception occurred during creation)” hatası alındığında. Veya dashboard yerel bilgisayarda (localhost) başarılı bir şekilde çalışıp sunucuda çalıştırıldığında veri kaynakları yüklenmesi ile ilgili problem yaşanıyorsa. Aşağıdaki yöntem uygulanarak çözümlenebilir.

CMC (Central Management Console) den Design Studio servisinin (Analysis Applicatin Service) parametrelerine aşağıdaki parametreyi eklemek hatayı düzeltebilir. CMC > Servers > Analysis Application Server > Properties > Command Line Parameters. Aşağıdaki parametre çift tırnaklar ile birlikte parametrelerin sonuna bir boşluk bırakılarak eklenebilir.

“-Dbusinessobjects.connectivity.directory=D:\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\dataAccess\connectionServer”

Kaynak tartışma:
Design Studio constantly crashes on launchpad
BusinessObjects Explorer The creation of the data source object tree failed

sap design studio dropdown box özel sıralama (custom sort)

Sap Design Studio ile dashboard (gösterge paneli) geliştirilirken dropdown box bileşeni (component) ile bir seçim yapılması sağlanıyorsa ve dropdown box taki değerler harf sıralaması ile değil de isteğe bağlı özel sıralanmak isteniyorsa, aşağıdaki adımlar izlenebilir.

Veri kaynağımızın adı DS_DROPDOWN_DATA_SOURCE olsun. Sıralamak istediğimiz universe objesi ddSortId (t.sortid) olsun. Dropdown bileşeninde kullanılmak istenen universe objesi ddName (t.name) olsun. Böyle bir durumda sorguyu ddSortId objesine göre sıralanmış olarak alsak da, initial view da ddSortId ye göre sıralasak da dropdown bileşenindeki değerler ddName objesine göre sıralı olarak gelecektir. SortId ye göre sıralamak için “ddSortId and ddName” objesini aşağıdaki gibi oluştururuz.

lpad(t.sortid,10,'0')||t.name -- "ddSortId and ddName"

DS_DROPDOWN_DATA_SOURCE veri kaynağı sorgusunu “ddSortId and ddName” e göre sıralı olarak alırız. Performansı etkilememek için tercihsel olarak Initial view da herhangi bir sıralama yapmayız. Sonra da gösterge panelinin On Startup kısmında aşağıdaki kod ile “ddSortId and ddName” objesinin ilk 10 karakterinden sonrasını (sıralamak için geçici olarak birleştirdiğimiz kısmını) ayırıp Dropdown bileşenine istediğimiz sıra ile eklemiş oluruz.

var dropdownMembersAscending = DS_DROPDOWN_DATA_SOURCE.getMembers("_ddSortId_and_ddName_", 1000);

businessMembersAscending.forEach(function(element, index) {

  DROPDOWN_BUSINESS.addItem(Convert.subString(element.internalKey, 10), Convert.subString(element.text, 10));

});

sap design studio geomap basemap urls

Genel yakınlık (odaklanma), enlem ve boylam formatı:
/{z}/{x}/{y}

Sap Design Studio yakınlık (odaklanma), enlem ve boylam formatı:
/{LOD}/{X}/{Y}

Open Street Map format for Sap Design Studio
http://tile.openstreetmap.org/{LOD}/{X}/{Y}.png

Arc GIS Online ESRI
http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{LOD}/{X}/{Y}

Nokia HERE
http://1.base.maps.cit.api.here.com/maptile/2.1/maptile/newest/normal.day/{LOD}/{X}/{Y}/256/png8?app_id=DemoAppId01082013GAL&app_code=AJKnXv84fjrb0KIHawS0Tg

Stamen Watercolor
http://tile.stamen.com/watercolor/{LOD}/{X}/{Y}.png

Stamen Toner
http://tile.stamen.com/toner/{LOD}/{X}/{Y}.png

Open Cycle Map
http://a.tile.opencyclemap.org/cycle/{LOD}/{X}/{Y}.png
http://a.tile.opencyclemap.org/transport/{LOD}/{X}/{Y}.png

Kaynak:
SCN Geo_Map Basemap URL

sap design studio base64 imaj

Sap Design Studio ile dashboard geliştirilirken küçük görsel öğeler için (resim, grafik, imaj, png, jpg, image) html’nin küçük görselleri base64 kodları ile satıriçi (inline) gösterimi kullanılabilir. Bu da bizim taşınabilir görseller oluşturabilmemizi sağlar.

Design Studio’da çoğu komponent css class özelliği atanarak ve custom css dosyasında bu css class’ın özellikleri kodlanarak belirlenir; ama TEXT komponenti için satıriçi css stili (style) yazılabilir. Bu sayede text komponentin arkaplan görseli için base64 kodlaması ile taşınabilir küçük imajlar veya ikonlar yapılabilir.

Not 1: Base64 resim kodlaması büyük boyutlu resimler için kullanılamaz.
Not 2: Jpg veya Jpeg formatındaki imajlarda transparanlık (transparency) sağlanamaz transparan kısımlar içeren görseller için png formatı kullanılmalıdır.

Örnek bir text komponenti css style özelliğinde base64 imaj kodlaması:


background-repeat: no-repeat;
background-size: contain;
background-image: url('data:image/png;base64,SDVJjdlfskj6uı27==');

Çevrimiçi (online) imaj base64 çeviciler internette mevcut. https://www.base64-image.de/ – Base64 Image Encoder