8 Ekim 2009 Perşembe

IFS/Centura The End.

Merhaba,
IFS üzerine çalışmakta olduğum Uzmar Gemi İnşaa AŞ. den
"2009 Mayıs" tarihinde ayrıldım. Dolayısıyla artık IFS framework ve Centura ile
ilgili çalışmıyorum. Centura ve IFS hakkındaki muhtemelen son
yazılarımı, eski notlarımdan hareketle,
"2009 Ekim" ayında hazırlamış bulunuyorum. Faydalı olmasını umarım.

Bu nokta yeni IFS geliştiricilere tavsiyem bloğumdaki
centura ile ilgili pdf ve videoları , konuyla ilgili yazılarımı
ve zaten ellerindeki hazır örnek IFS exe sinin
centura kodlarını iyi incelemeleri olacaktır.

Akılda tutulması gereken bir diğer nokta,
esas itibariyle centura ile de örneğin delphi ile yapılan her uygulama
gerçekleştirilebilir ve gerçekleştirilmektedir. Centura ile şu yapılamaz,
bu yapılamazları çok dinleyen biri olarak aynı tepkilerin sizi yıldırmasına
izin vermemenizi tavsiye ediyorum. Ayrıca Centura, IFS tekelindeki bir ide değildir.
Bu ideyi Win32 Development için turkiyede kullanmakta olan,
görüştüğüm firmalar da vardır.
Centura IDE sini Team Developer ismiyle geliştirmekte olan
Unify firmasının web sitesini, daha fazla bilgi için inceleyebilirsiniz.

http://www.unify.com/Products/TeamDeveloper/default.aspx

http://www.unify.com/products/teamdeveloper/videos/ide/td_5.2_themed_ide.html

Gelecekte IFS Applications .net te çalışacak gibi görünüyor.
Centura kodlarını .net ortamına geçimekle ilgili çözümler sunan
IceTeaGroup firmasının, IFS uygulamasını örnek uygulama olarak göstermekte olduğu
aşağıdaki sayfayı ziyaret edebilirsiniz.

http://www.iceteagroup.com/Porting/CaseStudies.aspx

Bundan sonraki yazılarım genellikle yeni işim olan Oracle Database Yönetimi
ve linux üzerine olacak sanırım.

İyi çalışmalar.

Centura - Kaydetme öncesi kontrol

Kaydet butonuna basıldığında önce bir kontrol gerçekleştirmek istiyorum. Duruma göre kaydedilecek veya bir mesaj gösterilecek ve kaydetme iptal edilecek. Nasıl yaparım ?
Önce ihtiyacımız olan değişkenleri forma ekleyelim.
Number: nDegerListesindeKacTaneVar
Boolean: bBasariliMi

İlgili cTableWindow veya cFormWindow 'a ait "action" tabına eğer önceden eklenmediyse On PM_DataSourceSave olayı eklenilir. Önceden bu olaya kod yazılmış ise değişiklik yapılır.Şimdi de bu gereklilikleri gerçekleştirelim.
On PM_DataSourceSave
! kod buradan basladi
Select Case wParam
Case METHOD_Execute
Set bBasariliMi = DbPLSQLBlock(c_hSql,"
BEGIN
SELECT count(*)
INTO :frmShopOrd.nDegerListesindeKacTaneVar
FROM &AO.UZMAR_OPER_TANIM_LOV
WHERE tanim =:tbwShopOrderOperation.colOperationDescription;
END;")
If bBasariliMi
If nDegerListesindeKacTaneVar < 1
Call SalSendClassMessage (PM_DataSourceSave, wParam, lParam )
! kod burada bitti

Centura - Tablomda veri var mı?

Aşağıdaki örnekteki fonksiyonu kullanarak,
herhangibir cTableWindow veya cChildWindow
içinde satır olup olmadığı test edebilirsiniz.

If SalTblAnyRows( mytablename, 0 , 0 )
..çeşitli işler..

SalTblAnyRows( mytablename, 0 , 0 ) : bu satır eğer data varsa TRUE döndürecektir.

Centura - TableWindow Refresh

Table window

refresh
*****************************
!!CB!! 174
Call tbwEngPartStructureConsistOf.DataSourceRefresh( METHOD_Execute )

IFS - Kısa Yoldan Ekrana Yetki Verme

Oracle daki IFS application owner schema da (Orneğin IFSAPP ), aşağıdakine benzer
plsql kodu uygulanarak istenilen ekrana kolayca yetki verilebilir.
Bu iş admin.exe arayüzünden bazen çok zor yapılabiliyor.

BEGIN
ifsapp.Security_SYS.Grant_Pres_Object( 'frmWorkOrderReportInTab', 'UZM_BAKIM', 'TRUE', 'TRUE' );
commit;
EXCEPTION
WHEN OTHERS THEN
rollback;
raise;
END;

Kullanım Detayları
******************************
ifsapp.Security_SYS.Grant_Pres_Object('yetkiverilecekekranismi','Rol_ismi','TRUE','TRUE')

CENTURA - TableWindow a süzerek data getirme

On SAM_Click
Set sOlusturulanSql = "doc_class = 'EYS' "
! ---------------------------------------------------------------------
! ---------------------------------------------------------------------
Call SalSendMsg( tbwUzmarDocIssues, PM_DataSourceUserWhere, METHOD_Execute, SalHStringToNumber( sOlusturulanSql ) )
Call SalSendMsg( tbwUzmarDocIssues, PM_DataSourcePopulate, METHOD_Execute, 0 )

Centura - Tablomda veri var mı?

Aşağıdaki örnekteki fonksiyonu kullanarak,
herhangibir cTableWindow veya cChildWindow dan
miras alınarak yapılmış object içinde
satır olup olmadığı test edebilirsiniz.


If SalTblAnyRows( mytablename, 0 , 0 )
..çeşitli işler..


SalTblAnyRows( mytablename, 0 , 0 ) : bu satır eğer data varsa TRUE döndürecektir.

Centura - TableWindow un kaçıncı satırındayım?

TableWindow.RecNo
------------------------
nContext = SalTblQueryContext ( hWndTbl )

Centura - Tarih

Örnek
******************************************
!!CB!! 173
On SAM_Click
If SalIsValidDateTime(df1)
Set df1 = SalFmtFormatDateTime ( (SalStrToDate(df1) + 1), 'dd.MM.yyyy' )
Else
Call SalMessageBox('Girilen tarih gg.aa.yyyy formatında olmalıdır. (Örn.

01.11.2010)','HATA!',MB_Ok)
Call SalSetFocus ( df1 )


Bir sonraki günü nasıl bulurum?
*******************************
Set dDateDegisken = dDateDegisken + 1

Yukarıdaki komut satırı,
dDateDegisken içerisindeki tarihe bir gun
eklenmesini sağlayacaktır.




Bir string değerin valid bir tarih olup
olmadığını nasıl test edebilirim ?
*****************************************
If SalIsValidDateTime(df1)
.......gecerli bir tarih degeriyse yapilacak cesitli isler
Else
.......gecerli bir tarih degeriyse yapilacak cesitli isler




Bir tarih değerini istenen formatta
nasıl yazdırabilirim?
********************************************
Set df1 = SalFmtFormatDateTime ( dBirDate ), 'dd.MM.yyyy' )




KULLANILABİLECEK FORMAT AÇIKLAMALARI
**************************************************************

Valid date/time picture format values:

Value Item Appearance
M month 1-12
MM month 01-12
MMM month Jan-Dec
MMMM month January-December
d day 1-31
dd day 01-31
ddd day Mon-Sun
dddd day Monday-Sunday
yy year 00-99
yyyy year 0000-9999
hh hour 1-12
hhhh hour 0-24
mm minutes 0-59
ss seconds 0-59
mmmmmm microseconds 000000-999999
AMPM AM/PM The AM/PM indicator
Examples of date/time picture format mappings:

Date/Time Picture Meaning
d MMMM, yyyy 9 January, 1992
dddd, MMMM d, yyyy Friday, February 7, 1992
M/d/yy 3/18/92
dd-MM-yyyy 18-03-1992
d “of” MMMM, yyyy 9 of January, 1992
M/d/yy-hh.mm.ss AMPM 2/3/92-12.23.15 AM

Centura - Form açılışında label a tarih yazmak

On SAM_Create
...Set df1 = SalFmtFormatDateTime ( SalDateCurrent() , 'dd.MM.yyyy' )
...Call SalSendClassMessage ( SAM_Create, wParam, lParam )

Centura - Veri tipi dönüşümleri

String ten sayıya dönüşüm (SalStrToNumber)
******************************************

SalStrToNumber komutunu stringten sayıya dönüşüm
gerekli olduğunda kullanın. Foksiyon otomatik
yuvarlama yapmaktadır.

strString : Sayıya dönüştürmek istene string deger
nNumber : dönüşüm sonucu .

Örn :
Set nNumber = SalStrToNumber ( '100,22' ) !nNumber=100
Set nNumber = SalStrToNumber ( '100,51' ) !nNumber=101
Set nNumber = SalStrToNumber ( '100.51' )
!nNumber=0 çevirme esnasında hata oluşursa 0 dönecektir.

Sayıdan string e dönüşüm
************************
nLength = SalNumberToStr ( nNumber, nDecimalPlaces, strString )
veya
strString = SalNumberToStrX ( nNumber, nDecimalPlaces )

Bir sayıyı string e çevirmek için kullanın


nNumber Number. Dönüştürülecek sayı.
nDecimalPlaces Number. strString e eklenecek virgülden sonraki basamak sayısı.
0 verirseniz sadece tam sayı kısmı dönüştürülecektir.

strString Number tipine dönüştürülen string değer.

nLength , ondalık basamaklar ile beraber strString uzunluğudur.

strString ,nNumber değerinin string e çevirilmiş halidir.


String ten date e dönüşüm
************************

dtDateTime = SalStrToDate ( strString )

String bir değeri date/time değerine dönüştürmek için kullanın.
SalStrToDate fonksiyonu sistem tarih formatını kullanır.
Format sorunu durumlarında SalDateConstruct fonksiyonu
işinize yarayacaktır. Aşağıdaki örneklerde bu fonksiyonda
kullanılmıştır.

Örnek
! Set dDeneme = SalDateConstruct ( nYear, nMonth, nDay, nHour, nMinute, nSecond )
! Aşağıdaki iki satırda dDeneme isimli Date/Time değişkene atama yapılmaktadır.
Set dDeneme = SalDateConstruct ( 2009, 01, 26, 11, 10, 05 )
Set dDeneme = SalStrToDate ( '2009-01-26-10.43.43.480000' )
Call SalDateToStr(dDeneme, df2)

Date ten string e dönüşüm
*************************
nLength = SalDateToStr ( dtDateTime, strDate )

Bir date/time değerini string değerine dönüştürür.
Eğer parametre olarak DATETIME_Null gönderilmiş ise
-1 döndürür.

Parametreler

dtDateTime Date/Time. String e dönüştürülecek değer.

strDate . Dönüştürülmüş string değer.

nLength, dönüştürülen string uzunluğudur.

Örnek:
Call SalDateToStr ( SalDateCurrent ( ), df2 )
!df2 edit box unda şu anki tarih görüntülenir.


Aşağıdaki fonksiyonlar da incelenebilir.
SalFmtFormatDateTime
SalFmtFormatNumber
SalFmtIsValidPicture
SalFmtGetPicture
SalFmtSetPicture

PlSql içerisinde bekleme

Bazen PlSql kodu içerisinde bekleme yaratmak gerekebilir. Bu tür durumlarda
aşağıdaki yöntem kullanılmalıdır.

Örnek
**********************
/* 60 sn. bekleme */

execute dbms_lock.sleep(60);


/* 1 saat bekleme */

execute dbms_lock.sleep(3600);


SLEEP Procedure
***********************
Bu procedure kullanıcı session ını, verilen süre kadar askıya alır.

Syntax

DBMS_LOCK.SLEEP (
seconds IN NUMBER);

Parametre açıklaması
****************************
seconds
Askıya alınmanın kaç saniye süreceğini belirtir.

En küçük bekleme miktarı saniyenin yüzde biri kadar olabilir.
Örneğin, 1.95 geçerli bir zaman değeridir.

Verilen string için MD5 değerini döndüren oracle func.

CREATE OR REPLACE FUNCTION get_md5_val (p_in VARCHAR2)
RETURN VARCHAR2
IS
--bu fonksiyon verilen string icin md5 degeri hesaplar
l_hash VARCHAR2 (2000);
BEGIN
l_hash :=RAWTOHEX(UTL_RAW.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.md5 (input_string=> p_in)));
RETURN l_hash;
END;


Örnek
**********************

select get_md5_val ('abc') from dual