30 Nisan 2009 Perşembe

Nasıl TableWindow kolonunun arka plan rengi değiştirilir?

TableWindow kolonuna ait arkaplan rengini değiştirmek için XSalTblSetColumnBackColor
fonksiyonu kullanılabilir. Bu fonksiyon xsal2_32.dll içerisindeki tablewindow
external fonksiyonlarından birisidir. External fonksiyonlar arasında olmaması durumunda aşağıdaki kod ile kolayca ekleyebilirsiniz.

!!CB!! 145
Function: XSalTblSetColumnBackColor
Description: BOOL XSalTblSetColumnBackColor(
HWND p_hwndCol,
COLORREF p_cBackColor );
Export Ordinal: 0
Returns
Boolean: BOOL
Parameters
Window Handle: HWND
Number: LONG



Bu fonksiyon kullanılarak aşağıda verilen kod orneğini değiştirerek kendi istediğiniz sütunların rengini değiştirebilirsiniz.

!!CB!! 173
On SAM_CreateComplete
Call SalSendClassMessage ( SAM_CreateComplete, wParam, lParam )
Call XSalTblSetColumnBackColor( tbwUzmarGunYmk.colnMiktar1, COLOR_LightGreen )
Call XSalTblSetColumnBackColor( tbwUzmarGunYmk.colnMiktar2, COLOR_LightGreen )
Call XSalTblSetColumnBackColor( tbwUzmarGunYmk.colnMiktar3, COLOR_LightGreen )
Call XSalTblSetColumnBackColor( tbwUzmarGunYmk.colnMiktar4, COLOR_LightGreen )
Call XSalTblSetColumnBackColor( tbwUzmarGunYmk.colnMiktar5, COLOR_LightGreen )
Call XSalTblSetColumnBackColor( tbwUzmarGunYmk.colsAciklama, COLOR_LightGreen )
On PM_DataSourcePopulate
Call SalSendClassMessage ( PM_DataSourcePopulate, wParam, lParam )
Call XSalTblSetColumnBackColor( tbwUzmarGunYmk.colnMiktar1, COLOR_LightGreen )
Call XSalTblSetColumnBackColor( tbwUzmarGunYmk.colnMiktar2, COLOR_LightGreen )
Call XSalTblSetColumnBackColor( tbwUzmarGunYmk.colnMiktar3, COLOR_LightGreen )
Call XSalTblSetColumnBackColor( tbwUzmarGunYmk.colnMiktar4, COLOR_LightGreen )
Call XSalTblSetColumnBackColor( tbwUzmarGunYmk.colnMiktar5, COLOR_LightGreen )
Call XSalTblSetColumnBackColor( tbwUzmarGunYmk.colsAciklama, COLOR_LightGreen )

27 Nisan 2009 Pazartesi

Centura ekranlarımıza makyaj yapalım.

Pekçok yazılımda kullanılan GUI tekniklerinden, grid sutun/satırlarının renklendirilmesi ve TAB yerine ENTER kullanımı, hem kullanıcı eğitimleri hem de kullanım açısından avantajlar yaratmaktadır. Sonraki makalede TAB yerine ENTER tuşunun kullanılması ve centura tablewindow sutununun renklendirmesi konularını anlatacağım. Bu teknikler kullanılarak hazırlanmış form örneği aşağıdadır.

17 Nisan 2009 Cuma

LOV icin filtreleme örneği

cColumn altındaki action alanına aşağıdakine benzer
kod yazılarak lov un filtrelenmesi sağlanabilir.

On PM_DataItemLovUserWhere
...Return SalHStringToNumber("ALANADINEYSEO='biseybisey'")

'biseybisey' yerine :i_hWndFrame.frmTRHAKTEVZI.tblDetail.coldDated
gibi bir referans ile örneğin bir table veya
formdan data alarak lov u filtrelemek te mümkündür.

burada ALANADINEYSEO, LOV a temel olan view deki
fieldname i temsil etmektedir.

Bir Centura penceresini, başka bir pencereden belirli bir kaydı seçerek açma

Bir ekrandan diğerine, parametre
aktararak geçiş, kullanıcıya hız kazandıran bir opsiyondur.
Bu makalede centurada bunun nasıl yapıldığına
ilişkin bir örnek uygulama inceleyeceğiz.

Örneğimiz nasıl çalışır?
---------------------
Parametre göndererek açmak istediğimiz formun adı X olsun.

Önce global bir değişken tanımlıyoruz.
Sonra X formunu açan window, belirli bir durumda
(Örn. içindeki bir buton tıklanılınca) bu global
değişkeni set ediyor ve X formunu açıyor.
X formu kendi açılış olayında da bu parametre dolu mu acaba diye
kontrol ediyor. Eğer doluysa kayıtlarımızı bu
parametreye göre filtreliyoruz.

Adım adım anlatmak gerekirse...


*******1************************
Formların üzerindeki bölgede gerekli global değişken tanımlanır.

variables
------------
!!CB!! 223
String: __g_sGecici



*******1************************


*******2************************


Açılacak forma aşağıdaki koda benzer kod eklenir. Bu forma X formu diyelim.

variables
------------
!!CB!! 118
String: sGeciciSql


Actions
------------
!!CB!! 173
On SAM_CreateComplete
If __g_sGecici != STRING_Null
Set sGeciciSql = "dagitim_no = '" || __g_sGecici || "'"
Call SalSendMsg(
hWndForm,
PM_DataSourceUserWhere, METHOD_Execute,
SalHStringToNumber( sGeciciSql )
)
Call SalSendMsg( hWndForm, PM_DataSourcePopulate, METHOD_Execute, 0 )
Call SalSendClassMessage ( SAM_CreateComplete, wParam, lParam )
On SAM_Close
Set __g_sGecici = STRING_Null
Call SalSendClassMessage ( SAM_Close, wParam, lParam )

*******2************************

*******3************************
X formunu açacak forma aşağıdaki kod eklenir.

Actions
------------
!!CB!! 139
Set __g_sGecici = tbwUzmarDokDagitim.colsDagitimNo
Call SalCreateWindow( 'frmUzmarDokDagitim', hWndMDI )


*******3************************

8 Nisan 2009 Çarşamba

Table window-kayıtlar arasında dolaşma ve bir kolona focus örneği

Sonraki kayıt ve belirli bir sütuna focus örneği.
*************************************************
If tbwUzmarGunYmk.DataContextNext( METHOD_Inquire )
...Call tbwUzmarGunYmk.DataContextNext( METHOD_Execute )
...Set nGecici = SalTblQueryContext ( tbwUzmarGunYmk )
...Call SalTblSetFocusCell ( tbwUzmarGunYmk, nGecici, colnMiktar1, 0, 1 )

tbwUzmarGunYmk : table window ismi
nGecici : number türündeki değişken. tbwUzmarGunYmk a ait "Variable" tabında
tanımlanmış olmalıdır.
colnMiktar1 : focus olunacak kolon.

SalTblQueryContext ( tbwUzmarGunYmk ) bize üzerinde bulunduğumuz
satır/row numarasını döndürmektedir.

Burada eğer varsa sonraki satıra hareket ediliyor ve oradaki
colnMiktar1 isimli kolon seçiliyor. ileri, geri,sonkayıt,ilkkayıt
a gitme işlemleri için kullanılabilecek fonksiyon listesi aşağıdadır.

DataContextFirst --ilk kayıt
DataContextLast --son kayıt
DataContextNext --sonraki kayıt
DataContextPrevious --önceki kayıt

ENTER tuşu da TAB gibi davransın istiyorum. Nasıl yaparım?

Bu iş için aşağıdakine benzeyen bir kod, tablewindow kolonunun action una yazılarak kullanılabilir. Burada yapılan kısaca, ENTER e basıldığı anda forma
"TAB a basıldı" mesajının gönderilmesinden ibarettir.

On WM_CHAR
...If (( wParam = VK_Tab ) OR (wParam = VK_Enter))
......Call SalSendMsg ( colnMiktar1, WM_KEYDOWN, VK_Tab, 0 )

Form açılırken bir edit box içine bir değer nasıl girilir?

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

Bu örnek kod ile, form açılışında, "df1" isimli edit box(cDataField) içerisine çalışılan bilgisayardaki tarih bilgisi kopyalanmaktadır. Buradaki
SalFmtFormatDateTime fonksiyonu, parametre olarak verilen date değerini verilen
kriterlere göre formatlamaktadır.
Sonuçta df1 in içerdiği değer "07.04.2009" gibi string bir değer olacaktır.

"Call SalSendClassMessage ( SAM_Create, wParam, lParam )" satırı
inheritance ile ilgilidir. cDataField classında da On SAM_Create
olayında yapılacak işler belirlidir. Eğer bu satırı yazmaz isek
ata sınıfa ait On SAM_Create olay kodları çalışmayacaktır.

2 Nisan 2009 Perşembe

Centura ile tarih işlemleri nasıl yapılır?

Ö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



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 )

srtDate değeri, dtDateTime değişkeninin string e dönüşmüş halidir.



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

Yukarıdaki fonksiyon aynı zamanda date i string e çevirmenizide sağlamış olur.
Ek olarak tip dönüşümleri ile ilgili yukarıdaki fonksiyonlar da kullanılabilir.

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