lunes, 4 de junio de 2012

Programación BOL/GenIL Crear nuevo bloque (4/7)

Seguimos con la programación BOL/GenIL y ahora vamos a ver que necesitamos para que la clase que hemos creado pueda crear, borrar y modificar entradas

  • Creación de entradas
    Voy a intentar que la creación de entradas sea de la forma más sencilla posible, con los campos clave crearemos la entrada en la tabla y luego volvemos a recuperar la tabla en los objetos. Debemos ampliar el método IF_GENIL_APPL_INTLAY~CREATE OBJECTS
    DATAls_parameters TYPE crmt_name_value_pair,
         ls_estructura
    TYPE ztabla_bol,
         lt_request_obj 
    TYPE crmt_request_obj_tab..

    * Creo una entrada en la tabla con los datos que van en la tabla de parámetros
      
    READ TABLE it_parameters INTO ls_parameters WITH KEY name = 'ACT_GUID'.
      
    IF sy-subrc 0.
        ls_estructura
    -act_guid ls_parameters-value.
      
    ENDIF.
      
    READ TABLE it_parameters INTO ls_parameters WITH KEY name = 'ID'.
      
    IF sy-subrc 0.
        ls_estrucutra
    -id ls_parameters-value.
      
    ENDIF.

    * Inserto la entrada en la tabla
      
    INSERT ztabla_bol FROM ls_estrucutra.

      
    me->if_genil_appl_intlay~get_objectsit_request_objects lt_request_obj
                                           iv_root_list       
    iv_root_list ).
  • Modificación de datos
    Para modificar los datos primero es necesario bloquearlos, para eso ampliaremos el método IF_GENIL_ALTERNATIVE_DSIL~LOCK_OBJECTS y luego modificarlos ampliando el método IF_GENIL_APPL_INTLAY~MODIFY_OBJECTS
    • Método IF_GENIL_ALTERNATIVE_DSIL~LOCK_OBJECTS
      El objetivo de este método es bloquear el objeto para que no pueda ser modificado en el mismo momento por otra sesión. Realmente del bloqueo se encarga el objeto al que está asociado nuestro bloque, en este caso una tarea. Por lo tanto lo único que necesitamos es que el método informe de que todo es OK.
      FIELD-SYMBOLS <ls_object> LIKE LINE OF ct_object_list.

        
      LOOP AT ct_object_list ASSIGNING <ls_object>.
          <ls_object>
      -success abap_true.
        
      ENDLOOP.
    •  Método IF_GENIL_APPL_INTLAY~MODIFY_OBJECTS
      Este método obtiene los campos modificados y modifica la BD. Si tenemos datos obligatorios en este método también podemos controlarlos para no modificar la BD si no se están informando.
      DATAlv_objeto TYPE REF TO if_genil_cont_root_object,
           lv_id 
      TYPE ztabla_bol-id,
           lv_props_obj 
      TYPE REF TO if_genil_obj_attr_properties,
           lt_changed_attr 
      TYPE crmt_attr_name_tab,
           ls_attributes   
      TYPE zestructura_bol,
           ls_objeto
      TYPE ztabla_bol.

        
      FIELD-SYMBOLS<new> TYPE simple,
                     <old> 
      TYPE simple,
                     <name> 
      TYPE name_komp.

        lv_expo 
      iv_root_list->get_first( ).

        
      WHILE lv_objeto IS BOUND.

      *   Comprobamos si han habido modificaciones
          
      IF lv_expo->get_delta_flag( ) = if_genil_cont_simple_object=>delta_changed.
      *     Obtenemos las propiedades de los atributos
            lv_props_obj 
      lv_expo->get_attr_props_obj( ).
      *     Comprobamos cuales se han modificado
            
      CALL METHOD lv_props_obj->get_name_tab_4_property
              
      EXPORTING
                iv_property 
      if_genil_obj_attr_properties=>modified
              
      IMPORTING
                et_names    
      lt_changed_attr.

      *     ID
            
      CALL METHOD lv_objeto->get_key
              
      IMPORTING
                es_key 
      lv_id.

      *     Atributos de la estrucutra
            
      CALL METHOD lv_objeto->get_attributes
              
      IMPORTING
                es_attributes 
      ls_attributes.

      *     Obtengo la entrada en la tabla
            
      SELECT SINGLE INTO ls_objeto
              
      FROM ztabla_bol
              
      WHERE id lv_id.

            
      LOOP AT lt_changed_attr ASSIGNING <name>.
              
      ASSIGN COMPONENT  <name> OF STRUCTURE ls_objeto TO <old>.
              
      ASSIGN COMPONENT <name> OF STRUCTURE ls_attributes TO <new>.
              <old> 
      <new>.
            
      ENDLOOP.

            
      UPDATE ztabla_bol FROM ls_objeto.

          
      ENDIF.

          lv_objeto
      iv_root_list->get_next( ).
        
      ENDWHILE.
    • Borrado de entradas
      Para borrar simplemente obtendremos el ID y borramos sin más. Hay que ampliar el método IF_GENIL_APPL_ALTERNATIVE_DSIL~DELETE_OBJECTS
      DATAlv_id TYPE ztabla_bol-id.
        
      FIELD-SYMBOLS<obj> TYPE crmt_genil_obj_inst_line.

        
      LOOP AT ct_object_list ASSIGNING <obj>.
      * Obtengo el ID de la tabla
          
      CALL METHOD cl_crm_genil_container_tools=>get_key_from_object_id
            
      EXPORTING
              iv_object_name 
      <obj>-object_name
              iv_object_id   
      <obj>-object_id
            
      IMPORTING
              es_key         
      lv_id.

      * Borro la entrada en la tabla
          
      DELETE FROM ztabla_bol WHERE id lv_id.

        
      ENDLOOP.
Con esto finalizamos las modificaciones en la clase de control de nuestro nuevo bloque

Relacionado:
Programación BOL/GenIL (1/.)
Programación BOL/GenIL (2/.)
Programación BOL/GenIL (3/.)
Programación BOL/GenIL (5/.)  
Programación BOL/GenIL.(7/7)