Na maioria das vezes é útil utilizar componentes de listas conhecidos como Combobox ou Dropdown para mostrar relacionamentos de dados entre tabelas e de uma forma amigável exibir a descrição dos itens de dados e manipular seu identificador único. Para isto o Web Dynpro nos disponibiliza componentes e classes no qual nos permite manipular dados através de objetos e persisti-los em um banco de dados relacional usando o Open SQL ou SAP Persistence Service. Um relacionamento de dados mais simples é criado através de duas tabelas, sendo uma tabela pai que contem os dados mestres e uma filho que contem um ou mais identificadores relacionados ao pai. Um modo de fácil de identificar e tradicional de utilizar relacionamentos em um banco de dados é através de chaves estrangeiras, uma chave estrangeira é um campo, que aponta para a chave primária de outra tabela ou da mesma tabela. Ou seja, passa a existir uma relação entre duas tabelas ou de uma única tabela. A finalidade da chave estrangeira é garantir a integridade dos dados referenciais, pois apenas serão permitidos valores que supostamente vão aparecer na base de dados e estão ligados ao registro mestre.
Foreign Key: Chaves Estrangeiras
Exibindo Relacionamentos
1 – Crie uma nova tabela transparente para os tipos de cargos e a ative, use a imagem abaixo para referencia:
2 – Crie uma nova tabela transparente para os participantes e inclua o campo para referencia chamado CARGOID da tabela cargos criada logo acima. Após ativar a tabela clique no campo de referencia para o CARGOID e clique no ícone (chave amarela) Foreign Key localizado na barra de ferramenta da sua tabela para criar um relacionamento entre as tabelas:
3 – Relacione os campos identificadores das duas tabelas:
4 – Assim que salvar e ativar sua tabela, clique na aba Entry Help/Check para ver a ligação entre as tabelas:
5 – Abra a transação SE16 e crie novos registros para a tabela de cargo:
6 – Caso queira pode criar um modelo de dados no Data Modeler para seus relacionamentos:
7 – Crie um componente Web Dynpro e no contexto do Controller crie um node para a tabela de participante e um node para a tabela de cargo e os importe para o contexto da sua View. No node para o cargo escolha a propriedade Cardinality como o valor 0..n. Use os elementos web adequados para cada tipo de campo de sua tabela, para o relacionamento use o elemento DropDownByIndex. Use a figura abaixo como referencia:
8 – Use os códigos abaixo para os respectivos métodos, salve, ative seu componente e crie sua aplicação:
9 – Digite os valores para cada tipo de campo e clique no botão de enviar:
10 – Você pode conferir os valores dos dados e o conteúdo do identificador do relacionamento entre as tabelas:
Exemplo:
Neste exemplo criamos duas tabelas no banco de dados SAP MAxDB através do dicionário de dados ABAP e as relacionamos através da chave primaria e uma chave estrangeira. Usamos um elemento Web Dynpro para tornar este relacionamento amigável, exibindo assim a descrição do relacionamento mas manipulando seu identificador e os persistindo através do SAP Persistence Service.
ABAP
ONACTIONACAO_BOTAO_ENVIAR
method ONACTIONACAO_BOTAO_ENVIAR . * // Gravar dados wd_this->ONGRAVAR( ). endmethod.
WDDOINIT
method WDDOINIT . * // Recupera dados do contexto Data: context_node type ref to if_wd_context_node. * // Cria tabela interna do tipo da tabela do node Data: it_cargo type STANDARD TABLE OF if_main=>element_ZTCARGO, wa_cargos like line of it_cargo. * // Seleciona dados da tabela Pai select * from ztcargo into table it_cargo. * // Recupera node do contexto context_node = wd_context->get_child_node( name = 'ZTCARGO'). * // liga tabela interna a tabela do node context_node->BIND_TABLE( it_cargo ). endmethod.
ONGRAVAR
method ONGRAVAR . * // Recupera dados do controlador DATA lo_nd_usuario_controler TYPE REF TO if_wd_context_node. DATA lo_el_usuario_controler TYPE REF TO if_wd_context_element. DATA ls_usuario_controler TYPE wd_this->Element_usuario_controler. DATA lv_usuario_login TYPE wd_this->Element_usuario_controler-usuario_login. lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ). lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ). * // Recupera Nome lo_el_usuario_controler->get_attribute( EXPORTING name = `USUARIO_LOGIN` IMPORTING value = lv_usuario_login ). * // Recupera Sobrenome DATA lv_sobrenome TYPE wd_this->Element_usuario_controler-sobrenome. lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ). lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ). lo_el_usuario_controler->get_attribute( EXPORTING name = `SOBRENOME` IMPORTING value = lv_sobrenome ). * // Recupera Salario DATA lv_salario TYPE wd_this->Element_usuario_controler-salario. lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ). lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ). lo_el_usuario_controler->get_attribute( EXPORTING name = `SALARIO` IMPORTING value = lv_salario ). * // Recupera Data DATA lv_data TYPE wd_this->Element_usuario_controler-data. lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ). lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ). lo_el_usuario_controler->get_attribute( EXPORTING name = `DATA` IMPORTING value = lv_data ). * // Recupera Genero DATA lv_genero TYPE wd_this->Element_usuario_controler-genero. lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ). lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ). lo_el_usuario_controler->get_attribute( EXPORTING name = `GENERO` IMPORTING value = lv_genero ). * // Recupera Ativo DATA lv_ativo TYPE wd_this->Element_usuario_controler-ativo. lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ). lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ). lo_el_usuario_controler->get_attribute( EXPORTING name = `ATIVO` IMPORTING value = lv_ativo ). * // Recupera Observacao DATA lv_observacao TYPE wd_this->Element_usuario_controler-observacao. lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ). lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ). lo_el_usuario_controler->get_attribute( EXPORTING name = `OBSERVACAO` IMPORTING value = lv_observacao ). * // Retorna valores do dropdown by index * // Retorna conexto do node DATA: context_node type ref to if_wd_context_node. * // Cria tabela baseado no tipo do node DATA: it_cargo type STANDARD TABLE OF if_main=>element_ZTCARGO, wa_cargo like line of it_cargo, index type i. * // chama o node requerido context_node = wd_context->get_child_node( name = 'ZTCARGO'). * // Recupera o indice selecionado index = context_node->GET_LEAD_SELECTION_INDEX( ). * // Recupera os valores atraves do indice context_node->GET_STATIC_ATTRIBUTES( exporting index = index importing STATIC_ATTRIBUTES = wa_cargo ). * // Declara variáveis DATA : guid TYPE zGuid, nome TYPE ZNome, sobrenome TYPE ZSobrenome, cargo TYPE ZCARGOID, salario TYPE Zsal, data_adm TYPE Zdata, genero TYPE ZGenero, ativo TYPE Zativo, observacao TYPE ZObservacao. * // Alimenta dados. nome = LV_USUARIO_LOGIN. sobrenome = LV_SOBRENOME. cargo = WA_CARGO-CARGOID. salario = LV_SALARIO. data_adm = LV_DATA. genero = LV_GENERO. ativo = LV_ATIVO. observacao = LV_OBSERVACAO. * // Gera GUID CALL FUNCTION 'GUID_CREATE' IMPORTING ev_guid_16 = guid. * // Cria persistencia * // Declara classe Actor e Persistencia DATA: agente TYPE REF TO ZCA_PARTICIPANTE, participante TYPE REF TO ZCL_PARTICIPANTE. * // Cria agente da classe actor AGENTE = ZCA_PARTICIPANTE=>AGENT. * // cria persistencia try. participante = AGENTE->CREATE_PERSISTENT( guid ). catch CX_OS_OBJECT_EXISTING. ENDTRY. * // Alimenta objeto de persistencia PARTICIPANTE->SET_NOME( NOME ). PARTICIPANTE->SET_SOBRENOME( SOBRENOME ). PARTICIPANTE->SET_CARGOID( CARGO ). PARTICIPANTE->SET_DATA( DATA_ADM ). PARTICIPANTE->SET_SALARIO( SALARIO ). PARTICIPANTE->SET_GENERO( GENERO ). PARTICIPANTE->SET_ATIVO( ATIVO ). PARTICIPANTE->SET_OBSERVACAO( OBSERVACAO ). * // Grava e finaliza persistencia TRY. COMMIT WORK. * // Exibe mensagem data lo_api_controller type ref to if_wd_controller. data lo_message_manager type ref to if_wd_message_manager. lo_api_controller ?= wd_This->Wd_Get_Api( ). * // Chama método de menssagem CALL METHOD lo_api_controller->GET_MESSAGE_MANAGER RECEIVING MESSAGE_MANAGER = lo_message_manager. * // Exibe mensagem CALL METHOD lo_message_manager->REPORT_SUCCESS EXPORTING MESSAGE_TEXT = 'Dados Inseridos com Sucesso'. ENDTRY. endmethod.