web dynpro for abap tips and tricks v01

Upload: a

Post on 19-Oct-2015

37 views

Category:

Documents


0 download

DESCRIPTION

WebDynpro

TRANSCRIPT

  • www.zbalai.com 1 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    WebDynproforABAPTipsandTricks/BestPractices27.01.2010

    ContentsIntroduction............................................................................................................................................2

    Summary.............................................................................................................................................2

    WebDynproforABAP.........................................................................................................................2

    Prerequisites.......................................................................................................................................2

    Tipsandtricks.........................................................................................................................................3

    Wheretostorebusinesslogic?...........................................................................................................3

    Howtosimplifycontextreading/writing?..........................................................................................4

    Usestructurevsfields.........................................................................................................................5

    HandleDropdownByKey.....................................................................................................................6

    HowtocallSmartformsfromWebDynpro?......................................................................................8

    HowtocallAdobeFormsfromWebDynpro?..................................................................................10

    Appendix...............................................................................................................................................12

    Thehelperclass.................................................................................................................................12

    Softwarecomponentsused..............................................................................................................18

    Aboutthedevelopers.......................................................................................................................18

    References........................................................................................................................................18

    Keywords...........................................................................................................................................18

  • www.zbalai.com 2 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    Introduction

    SummaryThisisacollectionoftipsandtricksandsomebestpracticesweencounteredinourprojectsusingWebDynproforABAP(WD4A).Mygoalisnottoexplaintheoreticbackground,buttogiveyoueasytousesolutionsyoucansparetimewithanthusdeliverbetterfunctionalitytoyourclients.

    Afewyearspassedbysincethe2006publishingofWebDynproforABAP(PraxisbuchWebDynproforABAP)fromU.Hoffman.Asclientsreallystartedtousethisnewdevelopmentenvironmentthereisroomfornewexperiencetobeshared.

    WebDynproforABAPThisdevelopmentenvironmentisabreviatedoftenlikeWD4A,butWDA,WDF4AorWDforABAPcanbeseenaswell.AccordingtoWikipedia,itisaproprietarywebapplicationuserinterfacetechnologydevelopedbySAPAG.ItexistsinaJava(WebDynproforJava,WDJorWD4J)andanABAPflavor.BasicallyyoucandevelopinternetorintranetapplicationsusinganIDEfullyintegratedintothestandardSE80ObjectNavigator.InthissenseitissimilartoBusinessServerPages(BSP),butitismuchmorerobustandhasabiggercollectionofstandardUIelements.

    PrerequisitesToclearlyunderstandthefollowingtextyouwillneed

    1. GoodunderstandingofObjectOrientedABAP2. BasicWebDynproconceptslikecontextorhookmethods3. ExperienceinWD4Adevelopment

  • www.zbalai.com 3 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    Tipsandtricks

    Wheretostorebusinesslogic?AsabeginnerIstoredquitemuchlogicinmymaincomponentcontroller.NowItrytoseparatereusablelogicawayfromthecomponenttoassistanceclassandtootherbusinessclassesasseenonthefollowingillustration.

    Thiswayyoucanusebusinessroutinesagainorevenchange/copyassitanceclassforanotherpurpose.

    Insteadofdeployingyourmethodshere

    youputthemintotheassistanceclass.Thiswayyouhaveagoodoverviewintheleftbrowser.

    FormoreinformationoncodearchitecturereadWD4AfromU.HoffmannchapterModelofLayerSeparationp185.

  • www.zbalai.com 4 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    Howtosimplifycontextreading/writing?About60%ormoreofsoftwarecostsismaintenance(BoehmB.SoftwareEngineeringEconomics).Themorecodelinesyouhave,themoremaintenancecostsappearsinyourbudget.Soitmakessensetominimizethenumberofcodelines.SAPstandarddevelopersseemedtoignorethisfactbydevelopingcontextaccessforWD4A.ThisisthestandardwayusingWebDynproCodeWizardtogeneratecode:

    methodDEMO_READ_CONTEXT1.DATAlo_nd_userTYPEREFTOif_wd_context_node.DATAlo_nd_usr01TYPEREFTOif_wd_context_node.DATAlo_el_usr01TYPEREFTOif_wd_context_element.DATAls_usr01TYPEwd_this>element_usr01.*navigatefromtovialeadselectionlo_nd_user=wd_context>get_child_node(name=wd_this>wdctx_user).*navigatefromtovialeadselectionlo_nd_usr01=lo_nd_user>get_child_node(name=wd_this>wdctx_usr01).*getelementvialeadselectionlo_el_usr01=lo_nd_usr01>get_element().*getalldeclaredattributeslo_el_usr01>get_static_attributes(IMPORTINGstatic_attributes=ls_usr01).endmethod.

    Asusuallyeachviewmethodisreading/writingoneormorecontextnodes,youcanhavehundredsofunnecessarylinesinyourprogramandthousandsinyoursystem.

    Insteadofthese14linesitispossibletoreadcontextintwo.

    methodDEMO_READ_CONTEXT2.DATAls_usr01TYPEwd_this>element_usr01.wd_this>o_context_helper>get_attributes(exportingpath='USER/USR01'importingvalues=ls_usr01).endmethod.

    Otherprogrammersdidtrytosimplifythiscodeclutter,butthenicestsolutionisfromMarcCawood.Hehadtheideaandthefirstsolutionofintegratingahelperclassandusingittoreachthecontext.

  • www.zbalai.com 5 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    Youhaveapriceforthesesimplification:youneedahelperclass,whatyouneedtoinitializeintheWDOINIThookmethodofyourcomponent:

    methodwddoinit.createobjectwd_this>o_context_helperexportingcontext=wd_context.endmethod.Thishelperclassyoufindintheappendix.

    UsestructurevsfieldsThisadvicemaynotbenewforyou,Istillfinditimportanttomentionit:Insteadofusingindividualfieldsitissimplertousecomplerestructures.

    methodINIT_USER_FIELDS1.data:lv_bnametypexubname,lv_datfmtypexudatfm,lv_hdesttypexuhdest,lv_menuetypexumenue,lv_langutypexulangu.wd_assist>init_user_fields1(exportingbname=lv_bnamedatfm=lv_datfmhdest=lv_hdestmenue=lv_menuelangu=lv_langu).wd_this>o_context_helper>set_attribute(exportingpath='USER/USR01/BNAME'value=lv_bname).wd_this>o_context_helper>set_attribute(exportingpath='USER/USR01/DATFM'value=lv_datfm).wd_this>o_context_helper>set_attribute(exportingpath='USER/USR01/HDEST'value=lv_hdest).wd_this>o_context_helper>set_attribute(exportingpath='USER/USR01/MENUE'value=lv_menue).wd_this>o_context_helper>set_attribute(exportingpath='USER/USR01/LANGU'value=lv_langu).endmethod.Thiswayittakes15lines.

    methodINIT_USER_FIELDS2.data:ls_usr01typeusr01.

  • www.zbalai.com 6 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    *Callassistanceclasstoinitfieldswd_assist>init_user_fields2(exportingusr01=ls_usr01).*Setcontextwd_this>o_context_helper>set_attributes(exportingpath='USER/USR01'values=ls_usr01).endmethod.Thiswaythesametakes3lines.

    HandleDropdownByKeyDropdownlistarenotadvisedbyusabilityexpertsforexamplebyJakobNielseninHomepageUsabilitystillitisastandardandwidelyusedtoolinWD4A.Youwillneeditforexampleforlanguageorcountryselection.

    ToourgreatsurprisetheWD4Aengineisfillingdropdownbykeyforcertaindomains,forothersnot.Fordomains,thathavedirectvaluesassignedeverythingisfilledautomatically.Ifadomainhasvaluesindirectlythroughatable,novaluesarefilled.

  • www.zbalai.com 7 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    Soifyouhaveadropdownbykeyfieldwiththisdomain,novalueswillbefilledautomatically.YouhavetocallwellhiddenSET_ATTRIBUTE_VALUE_SETofIF_WD_CONTEXT_NODE_INFO,whatyoufindbycallingGET_NODE_INFOofthenodeobject.

    methodSET_COUNTRY_VALUES1.data:lo_node_infotypereftoif_wd_context_node_info.datalo_nd_t005typereftoif_wd_context_node.data:ls_t005ttypet005t,lt_t005ttypetableoft005t.data:lt_valuesettypewdr_context_attr_value_list,l_valuetypewdr_context_attr_value."Getnodelo_nd_t005=wd_context>get_child_node(name=wd_this>wdctx_t005).lo_node_info=lo_nd_t005>get_node_info()."Selectcountrylinesselect*fromt005tintotablelt_t005twherespras=sylangu."Putcountrylinesintovaluesetloopatlt_t005tintols_t005t.l_valuevalue=ls_t005tland1.l_valuetext=ls_t005tlandx.insertl_valueintotablelt_valueset.endloop."Assignvaluesetcallmethodlo_node_info>set_attribute_value_set(exportingname='LAND1'value_set=lt_valueset).endmethod.

    ThiscodecanbefurtheroptimizedbyahelpermethodinZBITS_WD_CONTEXT_HELPER:

  • www.zbalai.com 8 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    methodset_country_values2.data:lt_valuesettypewdr_context_attr_value_list,l_valuetypewdr_context_attr_value.data:ls_t005ttypet005t,lt_t005ttypetableoft005t."Selectcountrylinesselect*fromt005tintotablelt_t005twherespras=sylangu."Putcountrylinesintovaluesetloopatlt_t005tintols_t005t.l_valuevalue=ls_t005tland1.l_valuetext=ls_t005tlandx.insertl_valueintotablelt_valueset.endloop."Assignvaluesetwd_this>o_context_helper>set_attribute_value_set(exportingpath='T005'name='LAND1'value_set=lt_valueset).endmethod.

    HowtocallSmartformsfromWebDynpro?AdobeFormsisthenewtechnology,butsometimesitisnotimplementedyetoryoujusthavetheanexistingforminSmartforms.ThisiswhyIpreparedasimpleexampletocallaSmartformsinWD4A.YouwillhaveabuttoncalledPrintFormorsomethinglikethatpointingontothismethod.Thecallingaction/methodlookslikethis:methodONACTIONSHOW_SMARTFORM.data:l_pdfstringtypexstring."Selectforprintwd_assist>prepare_smartforms(importingp_pdf=l_pdfstring)."Callprintcl_wd_runtime_services=>attach_file_to_response(i_filename='smartform.pdf'i_content=l_pdfstringi_mime_type='application/pdf'i_in_new_window=abap_falsei_inplace=abap_false).endmethod.

  • www.zbalai.com 9 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    Thereisanassistanceclassmethodbehind:methodprepare_smartforms."###SMARTFORMSPDFCALLdata:lv_buffertypexstring.data:lv_stringtypestring.data:lv_fnamtypers38l_fnam.data:lv_bytecounttypei.data:lt_linestypetableoftline.data:ls_linetypetline.data:l_pdfstringtypexstring.data:l_xlinetypexstring.data:ls_ssfctrloptypessfctrlop."ControlParametersdata:ls_output_optionstypessfcompop."OutputOptionsdata:ls_job_output_infotypessfcrescl."JobOutputInfodata:ls_job_output_optionstypessfcresop."JobOutputOptions"Smartformscustomerparameterdata:ls_booktypeppftbook.callfunction'SSF_FUNCTION_MODULE_NAME'exportingformname='SPPFDEMO_BOOK'importingfm_name=lv_fnam.ls_ssfctrlopno_dialog='X'.ls_ssfctrlopgetotf='X'.ls_ssfctrloppreview='X'.ls_output_optionstdnoprev='X'.ls_output_optionstdtitle=sytitle.ls_output_optionstdnewid='X'."Callsmartformscallfunctionlv_fnamexportingcontrol_parameters=ls_ssfctrlopoutput_options=ls_output_optionsis_book=ls_bookimportingjob_output_info=ls_job_output_infojob_output_options=ls_job_output_optionsexceptionsformatting_error=1internal_error=2send_error=3user_canceled=4others=5."ConverttoPDFcallfunction'CONVERT_OTF'exportingformat='PDF'importingbin_filesize=lv_bytecounttablesotf=ls_job_output_infootfdatalines=lt_lines

  • www.zbalai.com 10 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    exceptionserr_conv_not_possible=1err_bad_otf=2.loopatlt_linesintols_line."intol_line.lv_string=ls_line.exportmy_data=lv_stringtodatabufferlv_buffer.importmy_datatol_xlinefromdatabufferlv_bufferinchartohexmode.concatenatel_pdfstringl_xlineintol_pdfstringinbytemode.endloop.p_pdf=l_pdfstring.endmethod."prepare_smartformsTheSmartformsfunctioniscalledtogeneratetheforminOTFformat.ThenthisOTFisconvertedtoPDFandstoredinparameterp_pdf.

    HowtocallAdobeFormsfromWebDynpro?Youcanfindmanydifferentmethodstocallanadobeform.Ifitisenoughtohaveaprintformbutton,thatdeliversyouaPDF,youcanusethefollowingtwomethods.

    Thecallingaction/methodlookslikethis:methodONACTIONSHOW_ADOBE_FORM.data:l_pdfstringtypexstring."Selectforprintwd_assist>prepare_adobe_forms(importingp_pdf=l_pdfstring)."Callprintcl_wd_runtime_services=>attach_file_to_response(i_filename='adobe_form.pdf'i_content=l_pdfstringi_mime_type='application/pdf'i_in_new_window=abap_falsei_inplace=abap_false).endmethod.Theuserclickingontheprintformbuttonhastohaveadefaultprinter.(UsuallyLOCL)

  • www.zbalai.com 11 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    Thereisanassistanceclassmethodbehind:methodprepare_adobe_forms.*"###ADOBEFORMSPDFCALLdata:lv_funcnametypefuncname.data:ls_outputparamstypesfpoutputparams.data:ls_formoutputtypefpformoutput.callfunction'FP_FUNCTION_MODULE_NAME'exportingi_name='FP_TEST_DATE'importinge_funcname=lv_funcname.ls_outputparamsnodialog='X'."suppressprinterdialogpopupls_outputparamsgetpdf='X'."launchprintpreviewcallfunction'FP_JOB_OPEN'changingie_outputparams=ls_outputparamsexceptionscancel=1usage_error=2system_error=3internal_error=4others=5.callfunctionlv_funcname*exporting*/1bcdwb/docparams=fp_docparamsimporting/1bcdwb/formoutput=ls_formoutputexceptionsusage_error=1system_error=2internal_error=3others=4.callfunction'FP_JOB_CLOSE'exceptionsusage_error=1system_error=2internal_error=3others=4.p_pdf=ls_formoutputpdf.endmethod."prepare_adobe_forms

  • www.zbalai.com 12 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    Appendix

    ThehelperclassYoualsofindthesepartsintextfiles:http://www.zbalai.com/_abap/content/420_web_dynpro_for_abap_tips_and_tricks/HELPER.txthttp://www.zbalai.com/_abap/content/420_web_dynpro_for_abap_tips_and_tricks/HELPER_METHODS.txt

    Toeasilyuploadthehelperclassyouneedtoswitchtoimplementationpublicandprivatesection.Publicsection:*"*publiccomponentsofclassZBITS_WD_CONTEXT_HELPER*"*donotincludeothersourcefileshere!!!publicsection.dataO_CONTEXTtypereftoIF_WD_CONTEXT_NODE.methodsGET_ATTRIBUTEimporting!PATHtypeSTRINGexportingvalue(VALUE)typeDATA.methodsGET_ATTRIBUTESimporting!PATHtypeSTRINGexporting!VALUEStypeDATA.methodsSET_ATTRIBUTEimporting!PATHtypeSTRING!VALUEtypeDATA.methodsSET_ATTRIBUTESimporting!PATHtypeSTRING!VALUEStypeDATA.methodsGET_STATIC_ATTRIBUTES_TABLEimporting!PATHtypeSTRING!FROMtypeIdefault1!TOtypeIdefault2147483647exporting!TABLEtypeANYTABLE.typepoolsABAP.methodsBIND_TABLEimporting!PATHtypeSTRING!NEW_ITEMStypeANYTABLE!SET_INITIAL_ELEMENTStypeABAP_BOOLdefaultABAP_TRUE!INDEXtypeIoptional.methodsIS_CHANGED_BY_CLIENTimporting!PATHtypeSTRINGreturningvalue(FLAG)typeABAP_BOOL.methodsGET_NODEimporting!PATHtypeSTRINGreturningvalue(RESULT)typereftoIF_WD_CONTEXT_NODE.

  • www.zbalai.com 13 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    methodsSET_CONTEXTimporting!CONTEXTtypereftoIF_WD_CONTEXT_NODE.methodsCONSTRUCTORimporting!CONTEXTtypereftoIF_WD_CONTEXT_NODEoptional.methodsSET_LEAD_SELECTIONimporting!PATHtypeSTRING!ELEMENTtypereftoIF_WD_CONTEXT_ELEMENT.methodsRESET_CHANGED_BY_CLIENTimporting!PATHtypeSTRING.methodsSET_CHANGED_BY_CLIENTimporting!PATHtypeSTRING!FLAGtypeABAP_BOOL.

    Privatesection:privatesection.methodsGET_ELEMENT_PATHimporting!PATHtypeSTRINGexporting!ELPATHtypeSTRING!ATTRIBUTEtypeDATA.methodsGET_ELEMENTimporting!PATHtypeSTRINGreturningvalue(ELEMENT)typereftoIF_WD_CONTEXT_ELEMENT.

    Methods:methodbind_table.*********************************************************************data:lo_nodetypereftoif_wd_context_node.*********************************************************************"Validatenecessaryobjectinitialisationchecko_contextisbound."Gettheelementlo_node=get_node(path).lo_node>bind_table(exportingnew_items=new_itemsset_initial_elements=set_initial_elementsindex=index).endmethod.methodCONSTRUCTOR.o_context=context.endmethod.methodGET_ATTRIBUTE.*********************************************************************

  • www.zbalai.com 14 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    DATA:lv_elpathTYPEstring,lv_attributeTYPEstring,lo_elementTYPEREFTOif_wd_context_element.*********************************************************************"ValidatenecessaryobjectinitialisationCHECKo_contextISBOUND."Determineelementpathandattributenameget_element_path(EXPORTINGpath=pathIMPORTINGelpath=lv_elpathattribute=lv_attribute)."Gettheelementlo_element=get_element(lv_elpath).lo_element>get_attribute(EXPORTINGname=lv_attributeIMPORTINGvalue=value).endmethod.methodget_attributes.*********************************************************************data:lo_nodetypereftoif_wd_context_node.*********************************************************************"Validatenecessaryobjectinitialisationchecko_contextisbound."Gettheelementlo_node=get_node(path).lo_node>get_static_attributes(importingstatic_attributes=values).endmethod.methodGET_NODE.*********************************************************************DATA:lv_pathTYPEstring,lt_pathTYPETABLEOFstring,lv_indexTYPEi,lv_lengthTYPEi,lo_nodeTYPEREFTOif_wd_context_node.*********************************************************************"ValidatenecessaryobjectinitialisationCHECKme>o_contextISBOUND."ReadthepathintoatableSPLITpathAT'/'INTOTABLElt_path."GetthepathdepthDESCRIBETABLElt_pathLINESlv_length."RootattributesIFlv_length=0.lo_node=me>o_context.ENDIF."Followthepathlv_index=0.LOOPATlt_pathINTOlv_path.lv_index=lv_index+1.

  • www.zbalai.com 15 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    IFlv_index=1."Getfirstnodeinthepathlo_node=me>o_context>get_child_node(lv_path).ELSE."Getnextnodedownthepathlo_node=lo_node>get_child_node(lv_path).ENDIF.ENDLOOP.result=lo_node.endmethod.methodget_static_attributes_table.*********************************************************************data:lo_nodetypereftoif_wd_context_node.*********************************************************************"Validatenecessaryobjectinitialisationchecko_contextisbound."Gettheelementlo_node=get_node(path).lo_node>get_static_attributes_table(exportingfrom=fromto=toimportingtable=table).endmethod.methodIS_CHANGED_BY_CLIENT.*********************************************************************data:lo_nodetypereftoif_wd_context_node.*********************************************************************"Validatenecessaryobjectinitialisationchecko_contextisbound."Gettheelementlo_node=get_node(path).flag=lo_node>IS_CHANGED_BY_CLIENT().endmethod.methodRESET_CHANGED_BY_CLIENT.*********************************************************************data:lo_nodetypereftoif_wd_context_node.*********************************************************************"Validatenecessaryobjectinitialisationchecko_contextisbound."Gettheelementlo_node=get_node(path).lo_node>RESET_CHANGED_BY_CLIENT().endmethod.methodSET_ATTRIBUTE.*********************************************************************DATA:lv_elpathTYPEstring,

  • www.zbalai.com 16 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    lv_attributeTYPEstring,lo_elementTYPEREFTOif_wd_context_element.*********************************************************************"ValidatenecessaryobjectinitialisationCHECKo_contextISBOUND."Determineelementpathandattributenameget_element_path(EXPORTINGpath=pathIMPORTINGelpath=lv_elpathattribute=lv_attribute)."Gettheelementlo_element=get_element(lv_elpath).lo_element>set_attribute(EXPORTINGname=lv_attributevalue=value).endmethod.methodset_attributes.*********************************************************************data:lo_nodetypereftoif_wd_context_node.*********************************************************************"Validatenecessaryobjectinitialisationchecko_contextisbound."Gettheelementlo_node=get_node(path).lo_node>set_static_attributes(exportingstatic_attributes=values).endmethod.methodSET_CHANGED_BY_CLIENT.*********************************************************************data:lo_nodetypereftoif_wd_context_node.*********************************************************************"Validatenecessaryobjectinitialisationchecko_contextisbound."Gettheelementlo_node=get_node(path).lo_node>SET_CHANGED_BY_CLIENT(flag).endmethod.methodSET_CONTEXT.o_context=context.endmethod.methodset_lead_selection.*********************************************************************data:lo_nodetypereftoif_wd_context_node.*********************************************************************"Validatenecessaryobjectinitialisationchecko_contextisbound."Gettheelement

  • www.zbalai.com 17 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    lo_node=get_node(path).lo_node>set_lead_selection(exportingelement=element).endmethod.methodGET_ELEMENT.*********************************************************************DATA:lo_nodeTYPEREFTOif_wd_context_node.*********************************************************************"ValidatenecessaryobjectinitialisationCHECKme>o_contextISBOUND.lo_node=get_node(path).element=lo_node>get_element().endmethod.methodGET_ELEMENT_PATH.*********************************************************************DATA:lv_pathTYPEstring,lt_pathTYPETABLEOFstring,lv_indexTYPEi,lv_lengthTYPEi,lv_lengm1TYPEi.*********************************************************************"ReadthepathintoatableSPLITpathAT'/'INTOTABLElt_path."GetthepathdepthDESCRIBETABLElt_pathLINESlv_length.lv_lengm1=lv_length1."Followthepathlv_index=0.LOOPATlt_pathINTOlv_path.lv_index=lv_index+1.IFlv_index

  • www.zbalai.com 18 Web_Dynpro_for_ABAP_Tips_and_Tricks_V07

    SoftwarecomponentsusedSAPECC6.0SAPFrontend7.10

    AboutthedevelopersMarcCawoodisanexperiencedSAPdeveloperwithreferencesinWD4Afield.ZsoltBalai([email protected])authorofthisdocumentisanSAP/InternettechnicalconsultantanddeveloperworkinginHR/FI/CO/MM/SDmodules.HeiscurrentlyemployedbyBitsAGandisavailableforprojectsinSwitzerland.

    References[1]HoffmanUlliWebDynproforABAP,SAP/GalileoPress(2006).

    [2]BoehmB.SoftwareEngineeringEconomics,PrenticeHall(1981).

    [3]JakobNielsen&MarieTahirHomepageUsablityNewRiders(2001).

    KeywordsWD4A,WDA,WDF4A,WebDynproforABAP,tipsandtricks,bestpractices,simplecontextreading