Professional Documents
Culture Documents
ZDMS_CONTROLE_REVISAO
Manoel Messner
CPMBraxis
22/10/2007
Data:21.10.2007
Verso:00
Pg.: 2/40
Elaborado por:
ndice
SUGESTES DE BEST PRACTICES WEBDYNPRO ................................... 4
Utilizar o Component Controller para variveis e mtodos globais, ou seja, acessveis a todas as Views do DC. ......................................................................................................................................... 4 Criar um Custom Controller para acesso ao modelo (RFCs) e neste criamos os mtodos para executar cada uma das RFCs do DC. ..................................................................................................... 4 Ns de RFCs: ......................................................................................................................................... 4
Data:21.10.2007
Verso:00
Pg.: 3/40
Elaborado por:
Data:21.10.2007
Verso:00
Pg.: 4/40
Elaborado por:
Criar um Custom Controller para acesso ao modelo (RFCs) e neste criamos os mtodos para executar cada uma das RFCs do DC.
No Custom Controller podemos iniciar o contexto de cada RFC no wdDoInit:
public void wdDoInit(){ //@@begin wdDoInit() // RFC de pesquisa do Codigo Parceiro para o usuario Zdpnmm028_Input input028 = new Zdpnmm028_Input(); wdContext.nodeZdpnmm028_Input().bind(input028);
Ns de RFCs:
No n de input da RFC selecionar apenas os parmetros/tabelas de entrada para o processamento da RFC e no n de output selecionar o retorno: CPMBraxis | Sugestes de Best Practices WebDynpro 4
Data:21.10.2007
Verso:00
Pg.: 5/40
Elaborado por:
Para possibilitar a Internacionalizao, no colocar mensagens e/ou ttulos de tela ou match code no cdigo do componente (hard code). As mensagens e ttulos de Match Code ou de telas devem ser incluidas no Message Pool do componente:
Data:21.10.2007
Verso:00
Pg.: 6/40
Elaborado por:
Uso
A API application configuration habilita a definio e uso de sets de propriedades para a aplicao que fica disponvel para os components em tempo de execuo.
Procedimento
Definindo o global application properties:
..
1. Inclua um arquivo Java padro de propriedades chamado sap.application.global.properties no diretrio META-INF da aplicao EAR (neste diretrio j existe o application.xml e o application-j2ee-engine.xml ).
Data:21.10.2007
Verso:00
Pg.: 7/40
Elaborado por:
Uso
Para abrir uma configurao permitindo a leitura e modificao, deve-se primeiro conectar o Configuration Manager, com o mdulo que gerencia o configuration tree.
Requisito
Para conectar o Configuration Manager, voc deve adicionar a referncia ao Configuration Service no SAP-specific deployment descriptor de sua aplicao que o, application-j2ee-engine.xml.
Data:21.10.2007
Verso:00
Pg.: 8/40
Elaborado por:
O application-j2ee-engine.xml fico da seguinte forma: <reference reference-type="hard"> <reference-target provider-name="sap.com" target-type="service">configuration</referencetarget> </reference> <provider-name>sap.com</provider-name>
Data:21.10.2007
Verso:00
Pg.: 9/40
Elaborado por:
Procedimento
1. Para acessar o Properties nos components da aplicao utilize::
Context ctx = new InitialContext(); ApplicationConfigHandlerFactory cfgHandler = (ApplicationConfigHandlerFactory)ctx.lookup("ApplicationConfiguration"); java.util.Properties appProps = cfgHandler.getApplicationProperties(); if (appProps==null) { //some reaction if no application properties are available. } else { //extract properties String dir = appProps.getProperty(DIR); } O Properties instance que voc obtem uma cpia do properties da aplicao. Portanto, alguma modificao que voc fizer no afetar outros mtodos que acessem o properties.
Data:21.10.2007
Verso:00
Pg.: 10/40
Elaborado por:
Fazer o mapping deste n para o Component Controller e para a View que receber os parmetros:
10
Data:21.10.2007
Verso:00
Pg.: 11/40
Elaborado por:
11
Data:21.10.2007
Verso:00
Pg.: 12/40
Elaborado por:
Na View principal, criar um action chamado Voltar, incluir um boto (ou LinkToAction) com texto Voltar e ligar este action com este boto. Adicionar no Required Controllers da View principal a Interface View da window principal:
Criar uma Public Part no DC (context menu New Public Part). Inserir o componente na Public Part (context menu Add to Public Part). Realizar as seguintes aes:
12
Data:21.10.2007
Verso:00
Pg.: 13/40
Elaborado por:
o o o o
Rebuild do DC, verificando a existncia de erros. Build do DC (context menu Development Component -> Build). Deploy do DC (context menu Development Component -> Deploy). Check-in e Ativao da atividade (Perspective DTR).
13
Data:21.10.2007
Verso:00
Pg.: 14/40
Elaborado por:
No DC chamador (origem):
No context menu de DC MetaData / DC Definition / Used DCs selecionar ADD Used DC e escolher o Public Part do DC que ser chamado:
No Diagram View, selecionar Embed an existing component e clicar na rea Used Web Dynpro Components para escolher a Interface Controller do DC que ser chamado:
Colocar o nome (exemplo: nome da especificao + IC: Zdplpl035IC). Selecionar o componente que ser chamado clicando em Browse.
14
Data:21.10.2007
Verso:00
Pg.: 15/40
Elaborado por:
Obs.: O campo Lifecycle controla se o componente ser criado automaticamente pelo WebDynpro (createOnDemand) ou ser criado manualmente no cdigo da view (manual). Clicar em Finish. Fazer o mapping do n de parmetros da Interface Controller do DC que ser chamado com o contexto da View que ir cham-lo, habilitando assim a passagem dos parmetros.
Criar um novo Embed View selecionando a opo Embed Interface View of a Component instance:
15
Data:21.10.2007
Verso:00
Pg.: 16/40
Elaborado por:
16
Data:21.10.2007
Verso:00
Pg.: 17/40
Elaborado por:
Nas Views dos dois DCs, criar os respectivos Outbound Plug e Inbound Plug:
Na View, identificar o lugar aonde o outro DC ser chamado, e utilizar o seguinte cdigo:
//popular o n de parmetro
wdContext.currentParamIn_Zdplpl035Element().setRevisao(wdContext().getRevision() );
17
Data:21.10.2007
Verso:00
Pg.: 18/40
Elaborado por:
wdThis.wdFirePlugZdplpl035Out();
Para que o mtodo wdDoInit do Used DC seja executado toda vez que for chamado, este deve ser criado manualmente:
Na View que chamar o outro DC, habilitar o Component Usage do DC no Required Controllers:
Na View, identificar o lugar aonde o outro DC ser chamado, e utilizar o seguinte cdigo:
//@@begin javadoc:onActionZdplmm005(ServerEvent) /** Executa o DC: Zdplmm005. */ //@@end public void onActionZdplmm005(com.sap.tc.webdynpro.progmodel.api.IWDCustomEvent wdEvent) { //@@begin onActionZdplmm005(ServerEvent) // Cria manualmente o Used DC
18
Data:21.10.2007
Verso:00
Pg.: 19/40
Elaborado por:
wdThis.wdGetZdplmm005ICComponentUsage().createComponent(); // Seta os parametros wdContext.currentParamNaveg005Element().setSy_tcode(...); wdContext.currentParamNaveg005Element().setGroupCode(...); // Executa o DC Zdplmm005 wdThis.wdFirePlugToZdplmm005Out(); //@@end } //@@begin javadoc:onPlugFromZdplmm005In(ServerEvent) /** Retorno do DC: Zdplmm005. */ //@@end public void onPlugFromZdplmm005In(com.sap.tc.webdynpro.progmodel.api.IWDCustomEvent wdEvent ) { //@@begin onPlugFromZdplmm005In(ServerEvent) if (wdThis.wdGetZdplmm005ICComponentUsage().hasActiveComponent()) wdThis.wdGetZdplmm005ICComponentUsage().deleteComponent(); //@@end }
19
Data:21.10.2007
Verso:00
Pg.: 20/40
Elaborado por:
20
Data:21.10.2007
Verso:00
Pg.: 21/40
Elaborado por:
21
Data:21.10.2007
Verso:00
Pg.: 22/40
Elaborado por:
22
Data:21.10.2007
Verso:00
Pg.: 23/40
Elaborado por:
} } else { wdThis.wdFirePlugToZdplmm001_0110(); } }
23
Data:21.10.2007
Verso:00
Pg.: 24/40
Elaborado por:
24
Data:21.10.2007
Verso:00
Pg.: 25/40
Elaborado por:
5 Inicializa o contexto da View ligado (bind) na Table, com os valores do n da RFC no Custom Controller (neste caso o n T_Programarme):
public void wdDoInit() { //@@begin wdDoInit() IT_ProgramarmeNode rme = wdThis.wdGetZdplmm016CustController().wdGetContext().nodeT_Programarme(); for (int i=0; i<rme.size(); i++) { IT_RMEElement rmeElement = wdContext.nodeT_RME().createT_RMEElement(); WDCopyService.copyCorresponding(rme.getT_ProgramarmeElementAt(i), rmeElement); rmeList.add(rmeElement); } wdContext.nodeT_RME().bind(rmeList); //@@end } //@@begin others private List rmeList = new ArrayList(); // Collecion para fazer o Bind na Table
25
Data:21.10.2007
Verso:00
Pg.: 26/40
Elaborado por:
//@@end
26
Data:21.10.2007
Verso:00
Pg.: 27/40
Elaborado por:
Resultado:
27
Data:21.10.2007
Verso:00
Pg.: 28/40
Elaborado por:
Match Code
No Contexto da View crie um n com o atributo para o InputField:
Ex: + Campos - UnidadeProjeto
Insira na View um InputField e na propriedade value atribua o contexto acima. Na View crie um mtodo para retornar um SimpleValueSet:
//@@begin javadoc:simpleValueSet() /** * Cria Ajuda de Pesquisa (Match Code). * @param atributo Atributo do contexto ligado a um InputField * @param titulo Titulo do Match Code * @param node Nome do N dos atributos * @return IModifiableSimpleValueSet ValueSet do Match Code */ //@@end public com.sap.typeservices.IModifiableSimpleValueSet simpleValueSet(java.lang.String atributo, java.lang.String titulo) { //@@begin simpleValueSet() ICamposNode camposNode = wdContext.nodeCampos(); IWDAttributeInfo attributeInfo = camposNode.getNodeInfo().getAttribute(atributo); ISimpleTypeModifiable attributeType = attributeInfo.getModifiableSimpleType(); attributeType.setFieldLabel(titulo); IModifiableSimpleValueSet valueSet = attributeType.getSVServices().getModifiableSimpleValueSet(); valueSet.clear(); return valueSet; //@@end }
28
Data:21.10.2007
Verso:00
Pg.: 29/40
Elaborado por:
In NW04 the TableSorter implements the functionality to display the sort icons in the column headers and to store the sort state for each column. In NW04s this functionality is generically provided by the Table-UIElement itself. The new TableSorter is now based on the new onSort-event of the Table UI element instead of the onAction-event of the TableColumn UI element. The sort a and sort order icons are automatically displayed for sortable tables.
29
Data:21.10.2007
Verso:00
Pg.: 30/40
Elaborado por:
The new TableSorter uses a java.util.Map to define alternative comparators instead of an Array because this solution is more flexible for further enhancements. As key for the map, the column ID is used.
Support of grouped columns: The new TableSorter can deal with GroupedColumns, which
were added in NW04s.
The previous TableSorter could only sort those olumns which were directly bound to an attribute of the table's root context node. Attributes of non-singleton child nodes of this node, which were displayed in the same table, were not sortable. The NW04sTableSorter can now sort these columns too.
1.
Declare a new context attribute TableSorter of type com.sap.tc.webdynpro.tests.utils.TableSorter within the view controller context. Declare a new action with name Sort (or SortCustomers in this example) and with the associated action event handler onActionSort() to the view controller. Implement the following source code in the wdDoModifyView()-hook-method of the view controller:
public static void wdDoModifyView() { //@@begin wdDoModifyView if (firstTime) {
2.
3.
30
Data:21.10.2007
Verso:00
Pg.: 31/40
Elaborado por:
IWDTable table = (IWDTable) view.getElement("CustomerTable"); wdContext.currentContextElement().setCustomerTableSorter( new TableSorter(table, wdThis.wdGetSortCustomersAction(), null, new String[] { "CustomerTable_Name" })); } //@@end }
4.
Organize imports within the view controller class so that import com.sap.tc.webdynpro.tests.utils.TableSorter; is added. Implement the following source code in the action event handler onActionSort() (or onActionSortCustomers in this example).
//@@begin javadoc:onActionSortCustomers(ServerEvent) /** Declared validating event handler. */ //@@end public void onActionSortCustomers(...) { //@@begin onActionSortCustomers(ServerEvent) wdContext.currentContextElement().getCustomerTableSorter().sort( wdEvent, wdContext.nodeCustomers()); //@@end }
5.
Ordem Crescente
31
Data:21.10.2007
Verso:00
Pg.: 32/40
Elaborado por:
Ordem Decrescente
Procedimento:
1 - Copie a classe TableSorter.java para o "src/packages" na estrutura de diretrio: com.sap.tc.webdynpro.tests.utils
Obs: Crie a estrutura de diretrios acima na aba Navigator. Em cima do src/packages, selecione no context menu New / Other / Simple / Folder.
Data:21.10.2007
Verso:00
Pg.: 33/40
Elaborado por:
33
Data:21.10.2007
Verso:00
Pg.: 34/40
Elaborado por:
byte[] bufx = new byte[nbytes]; System.arraycopy(buf, 0, bufx, 0, nbytes); repFile = new Rcgrepfile(); repFile.setOrblk(bufx); wdContext.currentZdpnmm141_InputElement().modelObject().addT_Data(repFile); } byteArray.close(); wdContext.currentZdpnmm141_InputElement().modelObject().setI_Process("U"); wdContext.currentZdpnmm141_InputElement().modelObject().setI_File( "/usr/sap/tmp/" + filename); wdContext.currentZdpnmm141_InputElement().modelObject().setI_Leng( conteudo.length); wdContext.currentZdpnmm141_InputElement().modelObject().execute(); wdContext.nodeZdpnmm141_Output().bind( wdContext.currentZdpnmm141_InputElement().modelObject().getOutput()); if (wdContext.nodeT_Return().size() > 0) { rfc_ok = false; // EXIBE MSG ERRO } // Mensagem de Erro
No contexto da view deve-se criar um n chamado File com dois atributos: - Binary do tipo binary - Filename do tipo String Inserimos um UI Element FileUpload na view e setamos as seguintes propriedades: - data = File.Binary - fileName = File.Filename No mtodo wdDoInit inicializamos o contexto File:
IPrivateZdplmm016_0110View.IFileElement fileElement = wdContext.createFileElement(); wdContext.nodeFile().bind(fileElement); IWDAttributeInfo attInfo = wdContext.nodeFile().getNodeInfo().getAttribute("Binary"); ISimpleTypeModifiable type = attInfo.getModifiableSimpleType(); IWDModifiableBinaryType binaryType = (IWDModifiableBinaryType) type;
34
Data:21.10.2007
Verso:00
Pg.: 35/40
Elaborado por:
if (upl) . //@@end }
Na View principal, cria no contexto um n e um atributo do tipo (IWDWindow Java Native Type) para guardar a instncia do window e poder fech-lo posteriormente:
35
Data:21.10.2007
Verso:00
Pg.: 36/40
Elaborado por:
Na View Principal:
- Cria um Action para exibir o window e este pode ser ligado ao evento onAction de algum elemento UI da view:
public void onActionShowOMRME(...) { //@@begin onActionShowOMRME(ServerEvent)
36
Data:21.10.2007
Verso:00
Pg.: 37/40
Elaborado por:
// Encontra o "window" IWDWindowInfo windowInfo = (IWDWindowInfo)wdComponentAPI. getComponentInfo().findInWindows("Zdplmm023WindowOMRME"); // Cria o "window" IWDWindow window = wdComponentAPI.getWindowManager().createWindow(windowInfo,true); // Seta o posicionamento do "window" window.setWindowPosition(500,130); // Exibe o "window" window.open(); // Salva a instncia do "Window" no contexto wdContext.currentPopupElement().setWindowInstance(window); //@@end }
No Component Controller: - Cria-se dois eventos para avisar a View Principal de que um item foi selecionado na Window ou que esta simplesmente foi fechada (Aba Events):
37
Data:21.10.2007
Verso:00
Pg.: 38/40
Elaborado por:
Eventos criados no exemplo: OMRMEClosedEvent e OMRMESelectedEvent Criaremos um mtodo para cada evento no Component Controller (Aba Methods):
public void fireOMRMESelectedEvent( ) { //@@begin fireOMRMESelectedEvent() wdThis.wdFireEventOMRMESelectedEvent(); //@@end } public void fireOMRMEClosedEvent( ) { //@@begin fireOMRMEClosedEvent() wdThis.wdFireEventOMRMEClosedEvent(); //@@end }
Obs.: Estes mtodos sero chamados na View do window criado. Na View Principal: - Criaremos dois Event Handler para serem executados quando a view do window chamar os eventos criados no Component Controller, avisando que um item foi selecionado ou que a window foi fechada (Aba Methods com Event Hander selecionado):
38
Data:21.10.2007
Verso:00
Pg.: 39/40
Elaborado por:
public void handleOMRMESelectedEvent(...) { //@@begin handleOMRMESelectedEvent(ServerEvent) seta o contexto... // Pega o window "Zdplmm023Window0MRME" e fecha-o IWDWindow window = wdContext.currentPopupElement().getWindowInstance(); window.destroy(); //@@end } public void handleOMRMEClosedEvent(...) { //@@begin handleOMRMEClosedEvent(ServerEvent) // Pega o window "Zdplmm023Window0MRME" e fecha-o IWDWindow window = wdContext.currentPopupElement().getWindowInstance(); window.destroy(); //@@end }
Na View do Window criado: - Criamos dois Action para chamarem os eventos criados no Component Controller
39
Data:21.10.2007
Verso:00
Pg.: 40/40
Elaborado por:
public void onActionOMRMESelected(...) { //@@begin onActionOMRMESelected(ServerEvent) wdThis.wdGetZdplmm023CompController().fireOMRMESelectedEvent(); //@@end } public void onActionOMRMEClosed(...) { //@@begin onActionOMRMEClosed(ServerEvent) wdThis.wdGetZdplmm023CompController().fireOMRMEClosedEvent(); //@@end }
O Action onActionOMRMESelected pode ser ligado ao evento onLeadSelect de um Table ou onAction de um Button. E o Action onActionOMRMEClosed pode ser ligado a um Button ou LinkToAction para fechar o window. Obs.: Para que a View possa utilizar os mtodos pblicos fire... citados acima, o Component Controller deve estar disponvel para a View. Caso ainda no esteja, v na aba Properties da View (ao lado da aba Layout) e selecione-o na window Required Controllers.
40