1996Äê .µÚ50ÆÚ .Èí¼þÓë±à³Ì


±à³Ì¼¼ÇÉ


PowerBuilderÓ¦Óÿª·¢ÏµÁн²×ù(7)

ÀûÓÃSetActionCodeº¯Êý¿ØÖÆDataWindow

»ªÌìм¼Êõ¿ª·¢¹«Ë¾¡¡ÕŽ¡×Ë

DataWindow¿Ø¼þµÄһЩʼþÓÐÒ»¸ö¶¯×÷Âë²Ù×ÝÕâ¸öʼþÖ®ºóµÄȱʡ¶¯×÷¡£ÔÚPow-erBuilder 4.0ÖÐÎÒÃÇ¿ÉÒÔʹÓÃSetAction-Codeº¯Êý,À´ÉèÖÃÕâ¸ö¶¯×÷ÂëµÄÖµÒÔ¿ØÖÆÔÚÕâЩʼþ·¢ÉúºóµÄ´¦Àí¹ý³Ì¡£(ÔÚPowerBuilder 5.0ÖÐ,ÓÉÓÚʼþ¿ÉÒÔÓзµ»ØÊýÖµ,ËùÒÔ²ÉÓ÷µ»ØÒ»¸öÕûÐÍÊýÖµÀ´È¡´úSetActionCodeº¯Êý,±ÈÈçʹÓÃreturn 1È¡´úSetActionCode(1),µ«»ù±¾µÄʹÓùæÔòÁ½ÕßÊÇÏàͬµÄ¡£)DataWindow¿Ø¼þÖÐÏÂÁÐʼþʹÓö¯×÷Âë:
CLICKED
DBERROR
ITEMCHANGED
ITEMERROR
PRINTPAGE
RETRIEVEROW
RETRIEVESTART
UPDATESTART
ÓÐЧµÄ¶¯×÷ÂëÖµºÍÓ¦µ±µÄ´¦Àí¹ý³ÌËæÊ¼þµÄ²»Í¬¶ø²»Í¬¡£

Clicked Event

ÎÞÂÛºÎʱ,µ±Óû§ÔÚDataWindow¿Ø¼þÉϵã»÷ʱ,CLICKEDʼþ±»´¥·¢¡£Èç¹ûµã»÷ÔÚÒ»¸öÓÐЧµÄÐÐÉÏ,ÄÇôDataWindow½«×Ô¶¯°Ñ´ËÐÐ×÷Ϊµ±Ç°ÐС£Èç¹ûÄã²»Ïë»»ÐÐ,¾Í¿ÉÒÔʹÓÃSetActionCodeÀ´Í£Ö¹¡£
0 ½øÐл»ÐкÍCLICKEDʼþ¡£(ȱʡ)
1 Í£Ö¹´¦ÀíCLICKEDʼþ¡£
ÀýÈç:ÏÂÃæÒ»¶Î´úÂëÖ»ÔÊÐíÓû§µã»÷ÔÚ×Ô¼ºµÄÓû§ºÅÉÏ¡£
//Clicked Event
//We'll assume there is an instance variable with the current user's
//User ID:string is_user_id
long ll_row
string ls_user_id
ll_row =GetClickedRow()
//No need to continue if the user didn't click on a valid row
if ll_row£¼1 then
return
end if
ls_user_id=GetItemString(11_row,"user_id")
//If the user_id is not the current user then disallow row change
if ls-user-id£¼£¾is-user-id then
beep(1)
SetActionCode(1)
return
end if

ItemChanged Event

DataWindow ITEMCHANGEDʼþ¿ÉÒÔÓм¸ÖÖ²»Í¬µÄ²Ù×÷:½ÓÊÜǰһ×ֶεÄÐÂÖµ,ÒòÓдíÎ󶸾ܾø½ÓÊÜÐÂÖµ,¾Ü¾øÐÂÖµµ«ÊǼÌÐøÆäËüµÄ´¦Àí¹ý³Ì¡£ÕâЩֵÈçÏÂ:
0 ½ÓÊÜеÄÊý¾ÝÖµ¡£(ȱʡ)
1 ¾Ü¾øÐµÄÊý¾ÝÖµ¡£(Æô¶¯ItemEr-rorʼþ)
2 ¾Ü¾øÐµÄÊý¾ÝÖµµ«Êǽ¹µã¸Ä±ä¡£
ÔÚITEMCHANGEDʼþÖÐʹÓÃSetAction-Codeº¯Êý¿ÉÒÔ½øÐжà×ֶεĽ»²æÈ·ÈÏ¡£ÀýÈç,ÒøÐÐϵͳÖÐΪȷÈÏAccount StatusÊÇ·ñ¿ÉÒÔתΪInactive,¾ÍÐè¼ìÑéBalance×Ö¶ÎÊÇ·ñΪÁã:
//ItemChanged Event
Decimal (2) ld_balance //Customer Account Balance
Long ll_currow // Current Row Number
String ls_column_name //The name of the column that changed
String ls_status //Customer Account Status
ll_currow=this.GetRow()
ls_column_name=this.GetColumnName()
CHOOSE CASE ls_column_name
...
...
CASE "STATUS"
ls_status=this.GetText()
//If STATUS is Inactive
IF ls_status= "I" THEN
ld_balance=this.GetItemDecimal (ll_currow,"BALANCE")
IF ld_balance£¼£¾0 THEN
//SET AN ERROR
this.SetActionCode(1)
RETURN
ELSE
//ACCERT THE VALUE
this.SetActionCode(0) /* not required since 0 is default */
RETURN
END IF
END IF
END CHOOSE
ÔÚ³ÌÐòÖÐ,SetActionCodeº¯Êý²»Ò»¶¨ÒªÔÚ×îºóÒ»ÐÐ,µ«ÊÇÓÉÓÚÆäËûDataWindowº¯Êý¿ÉÄÜ»áÖØÖö¯×÷Â롣ΪÁ˱ÜÃâÕâ¸öÎÊÌâ,Ò»°ãÔÚSetActionCodeºóÃæÁ¢¼´Ö´ÐÐRe-turn½áÊøÕâ¸ö³ÌÐò¶Î¡£
ÔÚITEMCHANGEDʼþÖÐʹÓÃSetAc-tionCodeº¯ÊýÓÃ;ÊÇ¿ÉÒÔ¸ø¸Ã×Ö¶ÎÒ»¸öÐÂÖµ,¶ø²»ÊÇÓû§ÊäÈëµÄÄÇÑù¡£ÀýÈç:Óû§½«ÈÕÆÚÊäÈëΪÐÇÆÚÈÕ,µ«ÊÇÎÒÃÇÏ£Íû½«Æä¸ÄΪÔÚ´ËÖ®ºóµÄµÚÒ»¸ö·ÇÐÝÏ¢ÈÕ¡£ÊµÏÖÕâÒ»¹¦Äܲ¢²»ÏñÏëÏóµÄÄÇÑù¼òµ¥:
//ItemChanged Event
date ldt_process //process date
long ll_currow // Current Row Number
string ls_column_name // The name of the column that changed
ll_currow=this.GetRow()
ls_column_name=this.GetColumnName()
CHOOSE CASE ls_column_name
...
...
CASE "process_date"
ldt_process=f_get_next_bus_date(date(this.GetText()))
´íÎó this.SetText(ldt_process)
this.AcceptText()
...
Ö´ÐÐÉÏÊö´úÂë,ϵͳ½«½øÈëËÀÑ­»·¡£ÒòΪÓÃAcceptTextº¯Êý¸Ä±äÈÕÆÚµÄͬʱ,Ò²´¥·¢ITEMCHANGEDʼþ,Ö»Êǵ±Ç°ÁÐÈÔÔÚprocess-dataÁÐÉÏ,ÕâÑù¾Íµ¼Ö¶ÑÕ»Òç³ö¡£Òò´ËÔÚITEMCHANGEDʼþÖв»ÄÜʹÓÃAc-ceptTextº¯Êý,ӦʹÓÃÎÒÃÇÕâÀï½éÉܵÄSe-tActionCodeÕâÒ»º¯ÊýÀ´Íê³ÉÕâÒ»¹¦ÄÜ:
CASE "process_date"
ldt_process=f_get_next_bus_date(date(this.GetText()))
ÕýÈ· this.SetItemText(ll_currow,"process_date",ldt_process)//set value in buffer
this.SetActionCode(2) // reject edit control value
RETURN
ÔÚPrimary!BufferÖн«process_dateµÄÖµÖÃΪldt_process,SetActionCode(2)ÞðÆúÓû§ÔÚedit¿Ø¼þÖÐÊäÈëµÄÖµ(ÐÇÆÚÈÕ),²¢ÔÊÐí¸Ä±ä½¹µã(ûÓдíÎó·¢Éú)¡£

ItemError Event

ÔÚÈκÎʱºò,µ±Ò»¸öDateWindowÁÐûÓÐͨ¹ýÓÐЧÐÔ¼ìÑé»òÕßÕâ¸öÖµÔÚITEM-CHANGEDʼþÖб»¾Ü¾øÊ±,ITEMER-RORʼþÆô¶¯¡£ÈçͬITEMCHANGEDʼþÒ»Ñù,ËüµÄ¶¯×÷ÂëÒ²¿ÉÒÔÉèÖÃΪ½ÓÊÜ»ò¾Ü¾øÕâ¸ö×ֶεÄÐÂÊäÈëÖµ¡£Ëü»¹¿ÉÒÔÔھܾøÐÂֵʱ,¾ö¶¨ÊÇ·ñÈ¡Ïû´íÎóÐÅÏ¢¿òµÄÏÔʾ¡£ITEMERRORʼþµÄ¶¯×÷Âë¿ÉÒÔÊÇ:
0 ¾Ü¾øÐµÄÊý¾ÝÖµ²¢ÇÒÏÔʾ´íÎóÐÅÏ¢;(ȱʡ)
1 ¾Ü¾øÐµÄÊý¾ÝÖµ¶ø²»ÏÔʾ´íÎóÐÅÏ¢;
2 ½ÓÊÜеÄÊý¾ÝÖµ;
3 ¾Ü¾øÐµÄÊý¾ÝÖµµ«ÊÇÔÊÐí¸Ä±ä½¹µã¡£
Èç¹ûÎÒÃÇÏëÒªÔÚÒ»ÌØ¶¨ÇøÓòÏÔʾһ¸öÓû§×Ô¶¨ÒåµÄ´íÎóÐÅÏ¢À´´úÌæPower-Builder±¾Éí´íÎóÐÅÏ¢¿ò,ÎÒÃÇ¿ÉÒÔʹÓÃSetActionCodeÀ´È¡Ïû±ê×¼µÄÐÅÏ¢¿ò¡£ÀýÈç,ÔÚÇ°ÃæÀý×ÓÖÐ,µ±ÊÕÖ§²î¶î²»ÊÇ0ÊÇ0ʱ,ÎÒÃǾͿÉÒÔÓÃÕâÒ»·½·¨ÏÔʾһ¸ö´íÎóÐÅÏ¢:
//ItemError Event
Long 11_Currow /* Current Row Number */
String ls_column_name /* The name of the column that changed */
ll_currow=this.GetRow()
ls_column_name=this.GetColumnName
CHOOSE CASE s_column_name
CASE "status"
MessageBox("Error","Account cannot be changed to Inactive"+ "Balance is not zero.")
this.SetActionCode(1)
RETURN
...
END CHOOSE
ÔÚITEMERRORʼþÖÐʹÓÃSetAc-tionCode,ÎÒÃǾͿÉÒÔÓÐÑ¡ÔñµØºöÂÔDataWindow¶ÔÏóµÄÒ»¸öÁÐÖÐÊäÈëµÄÓÐЧÐÔ¹æÔò¡£ÀýÈç,ÔÚÊÕÖ§²î¶îÖÐ,ÎÒÃÇÓÐÏÂÃæÕâ¸öÓÐЧÐÔ¹æÔò:
Real(GetText())£¼=10000
¿Í»§ÊÕÖ§²î¶î²»Ó¦³¬¹ý10,000Ôª,Èç¹ûÎÒÃÇÔÊÐíʹÓù«Ë¾ÕÊ»§µÄ¿Í»§¿ÉÒÔ³¬¹ý10,000,ÎÒÃÇ¿ÉÒÔʹÓÃÈçÏ·½Ê½:
//ItemError Event
CHOOSE CASE ls_column_name
CASE "balance"
// Allow balance over ¡ç10,000 on Corportate accounts
IF ld_balance not £¼=10000 AND ls_type="C"
this.SetActionCode(2)
RETURN
END IF
...
ÎÒÃÇÒ²¿ÉÒÔÏñÇ°ÃæITEMCHANGEDʼþÄÇÑùÔÚPrinary!BufferÖоܾøÐÂÊäÈëµÄÖµ²¢ÌîÈëÐÂÖµ,Ö»ÊÇÔÚÕâÀォ¶¯×÷ÂëÖÃΪ3¡£

DBError Event

ÔÚÖ´ÐÐÁËdw.Retrieve,dw.Update()º¯Êý»òǶÈëʽSQLÓï¾ä²¢·¢ÉúÁËÒ»¸öÊý¾Ý¿â´íÎó(SQLCodeµÈÓÚ-1)ʱ,´¥·¢DBErrorʼþ¡£Ðí¶àPower-BuilderµÄ¿ª·¢É̶¼ÔÚΪÕâÖÖÇé¿öÉè¼ÆÁ˱ê×¼µÄÊý¾Ý¿â´íÎóÐÅÏ¢ÏÔʾ¡£ÎªÁËʹPowerBuilder²»ÏÔʾȱʡµÄÊý¾Ý¿â´íÎóÐÅÏ¢,ÎÒÃÇ¿ÉÒÔʹÓÃSetActioncode¡£DBErrorʼþµÄ¶¯×÷ÂëÖµÈçÏÂ:
0 ÏÔʾ´íÎóÐÅÏ¢¡£(ȱʡ)
1 ²»ÏÔʾ´íÎóÐÅÏ¢¡£
ÀýÈç:
//DBError event
MessageBox("Êý¾Ý¿â´íÎó","´íÎóÖµ"+string(this.DBErrorCode)+&
"´íÎóÐÅϢΪ:"+this.DBErrorMessage(),StopSign!)
//Supress PB generated DB Error Message.
this.Set ActionCode(1)
return

PrintPage

PRINTPAGEʼþÊÇÔÚÖ´ÐÐdw.Print()º¯ÊýÖ®ºó,Êý¾Ý´«Ë͸ø´òÓ¡»ú֮ǰ´¥·¢¡£µ±´òÓ¡Ò»¸öDataWindowʱ,Äã¿ÉÔÚ´òӡ֮ǰÉèÖö¯×÷ÂëÀ´Ìø¹ýÒ»Ò³¡£PRINT-PAGEʼþµÄ¶¯×÷ÂëÈçÏÂ:
0 ²»Ìø¹ýÒ»Ò³;(ȱʡ)
1 Ìø¹ýÒ»Ò³¡£
ÈçÄú´òËã´òÓ¡Ê±Ìø¹ýÒ»Ò³,Äã¿ÉÒÔÔÚÖÐPRINTPAGE±àÂëÈçÏÂ:
//Printpage event
this.SetActionCode(1)

RetrieveRow

´ÓÊý¾Ý¿â·þÎñÆ÷ÖÐÿ´Î½ÓÊÜÁËÒ»ÐмǼ¾ùÆô¶¯REIRIEVEROWʼþ¡£ÔÚÕâ¸öʼþÖÐ,Äã¿ÉÒÔÉèÖÃÒ»¶¯×÷ÂëÀ´Í£Ö¹¼ìË÷¡£ÏÂÃæÊÇRE-TRIEVEROWʼþµÄÓÐЧ¶¯×÷Âë:
0 ¼ÌÐø¡£(ȱʡ)
1 Í£Ö¹¼ìË÷¡£
Èç¹ûÒ»¸öDataWindow½«ÃüÖкܶàÐÐ,²¢ÇÒÄãÏ£ÍûÔÚ¼ìË÷µ½Ò»¶¨Á¿ºóÍ£Ö¹¡£Äã¿ÉÒÔÔÚRETRIEVEROWʼþÖÐʹÓÃSetActionCode:
//RetrieveRow event
//Instance variable Long il_count
...
IF il_count++£¾ 100 THEN
// Maximum rows retrieved,stip retrieval
this.SetActionCode(1)
RETURN
END IF
µ±ÓÃÀ´¸ø±»¼ìË÷ÐмÆÊýµÄÁÙʱ±äÁ¿il_countµÄÖµ³¬¹ý100ʱ,¼ìË÷½«Í£Ö¹¡£
×¢Òâ:ÔÚRETRIEVEROWʼþÖдæÔÚ´úÂë,ÄÇô¼ìË÷ÿһÐж¼»á´¥·¢Ê¼þ,Õ⽫½µµÍ¼ìË÷µÄËÙ¶È¡£
RetrieveStart
RETRIEVESTARTʼþÔÚdw.Retrieve()º¯ÊýÖ®ºó,²úÉúSQL´«Ë͸ø·þÎñÆ÷֮ǰ´¥·¢¡£
ÔÚÒ»Ð©ÌØ¶¨³¡ºÏ¿ÉÄÜÐèÒªÔÚ¿ªÊ¼Ò»¸ö¼ìË÷֮ǰֹͣËü¡£ÔÚRetrieveStartʼþÖе͝×÷Âë:
0 ¼ÌÐø¡£(ȱʡ)
1 ²»¼ìË÷¡£
ÀýÈç:ÎÒÃÇÈÃÒ»¸öÓû§ÊäÈë¼ìË÷±ê×¼µÄ´°¿Ú,ÔÚRETRIEVESTARTÖÐÅжϷµ»ØÐÐÊýÊÇ·ñÌ«¶à,ÒÔ¾ö¶¨Í£Ö¹¼ìË÷²¢ÇÒÈÃÓû§ËõС¼ìË÷·¶Î§¡£
//Retrieve Start event
Int li_count /*Expected Retrieve Count */
...
//Get count of Rows to be retrieved
...
IF li_count£¾1000 THEN
MessageBox("Stop","Please narrow your search",stop!)
This.SetActionCode(1)
RETURN
END IF
...

UpdateStart

ÕâÒ»ÔÚÖ´ÐÐUpdate()º¯ÊýÖ®ºó,²úÉúµÄÐÞ¸ÄSQLÓï¾ä´«Ë͸ø·þÎñÆ÷֮ǰ´¥·¢¡£
ͨ¹ýÉèÖÃÕâÒ»¶¯×÷Âë,Äã¿ÉÒÔ×èÖ¹Ð޸Ĵ«Ë͸ø·þÎñÆ÷¡£UPDATESTARTʼþµÄ¶¯×÷ÂëÈçÏÂ:
0 ¼ÌÐø¡£(ȱʡ)
1 ²»Ð޸ġ£
Èç¹ûÄãÒª×èÖ¹Ö´ÐÐÐÞ¸ÄÓï¾ä,ÔÚUP-DATESTARTʼþÖÐʹÓÃÏÂÁдúÂë:
//UpdateStart event
...
this.SetActionCode(1)
RETURN
...

×Û¡¡Êö

ÔںܶàÇé¿öÏÂ,ÉèÖö¯×÷ÂëÊǷdz£ÓÐÓõġ£ÕâÀïµÄÀý×Ó,ÈÃÄã¶ÔÆäÖм¸ÖÖÇé¿öÓÐÒ»¸öÁ˽⡣µ±Äã¶ÔʹÓÃPowerScript±àÂëÓÐÁ˸ü¶àµÄ¾­Ñéºó,Äã»á·¢ÏÖSetActionCodeÊǷdz£ÓÐÓõġ£
±¾°æÔðÈα༭¡¡ÁõÏþÁú