Adobe Interactive Forms : validation via e-mails

Les formulaires interactifs Adobe peuvent être utilisés de deux façons différentes :

  • Online : intégré par exemple dans une application Web Dynpro
  • Offline : renvoyé par exemple au serveur SAP par le biais d’un mail ou d’un Web Service

Nous verrons ici comment renvoyer au serveur SAP les données renseignées au sein du pdf via l’utilisation d’un e-mail.

Soit par exemple la table spécifique YTADOBE_FROM_WS qui contiendra un ensemble de noms/prénoms et qui sera alimentée par un pdf interactif :

La première étape consiste en la création d’une bapi permettant la mise à jour de cette table :

On retrouve en entrée le nom et le prénom à enregistrer :

On retourne le code retour de l’opération :

Mise à jour de la table :

La bapi étant maintenant créée et opérationnelle, la seconde étape consiste en création de la classe d’extraction des données du PDF. Pour ce faire, nous pouvons nous baser sur la classe standard CL_FP_INBOUND_HANDLER qui pourra vous donner un bon exemple de ce qu’il est possible de faire.

La classe doit implémenter l’interface IF_INBOUND_EXIT_BCS :

Ajouter une instance statique à votre propre classe parmi les attributs :

Implémentez la méthode IF_INBOUND_EXIT_BCS~CREATE_INSTANCE comme suit :

Enfin, implémentez la méthode IF_INBOUND_EXIT_BCS~PROCESS_INBOUND afin d’y coder votre logique d’extraction des données du PDF :

METHOD if_inbound_exit_bcs~process_inbound.

TYPE-POOLS:
*   Pull in the iXML type group :
ixml.

DATA:
*   Déclaration des objets locaux :
lo_document       TYPE REF TO if_document_bcs,
lo_fp             TYPE REF TO if_fp,
lo_pdfobj         TYPE REF TO if_fp_pdf_object,
lo_converter      TYPE REF TO cl_abap_conv_in_ce,
lo_ixml           TYPE REF TO if_ixml,
lo_streamfactory  TYPE REF TO if_ixml_stream_factory,
lo_istream        TYPE REF TO if_ixml_istream,
lo_xml_document   TYPE REF TO if_ixml_document,
lo_parser         TYPE REF TO if_ixml_parser,
lo_node           TYPE REF TO if_ixml_node,
*   Déclaration des structures locales :
ls_pdf_table      TYPE bcss_dbpc,
ls_pdf_line       TYPE solix,
*   Déclaration des variables locales :
lv_pdf_xstring    TYPE xstring,
lv_pdf_form_data  TYPE xstring,
lv_formxml        TYPE string,
lv_strchecked     TYPE string,
lv_nom            TYPE text50,
lv_prenom         TYPE text50.

* Get the email document that was sent :
lo_document = io_sreq->get_document( ).

* Get the interactive form attachment.
ls_pdf_table = lo_document->get_body_part_content( 2 ).

CLEAR lv_pdf_xstring.
* Convert the pdf table into an xstring.
LOOP AT ls_pdf_table-cont_hex INTO ls_pdf_line.
CONCATENATE lv_pdf_xstring ls_pdf_line-line INTO lv_pdf_xstring IN BYTE MODE.
ENDLOOP.

* Get a reference to the form processing class :
lo_fp = cl_fp=>get_reference( ).

* Get a reference to the PDF Object class :
lo_pdfobj = lo_fp->create_pdf_object( ).
* Set the pdf in the PDF Object :
lo_pdfobj->set_document( pdfdata = lv_pdf_xstring ).
* Set the PDF Object to extract data the Form data :
lo_pdfobj->set_extractdata( ).
* Execute call to ADS :
lo_pdfobj->execute( ).

* Get the PDF Form data.
lo_pdfobj->get_data( IMPORTING formdata = lv_pdf_form_data ).
* Convert the xstring form data to string so it can be processed using the iXML classes :
lo_converter = cl_abap_conv_in_ce=>create( input = lv_pdf_form_data ).
lo_converter->read( IMPORTING data = lv_formxml ).

* Get a reference to iXML object :
lo_ixml = cl_ixml=>create( ).

* Get iStream object from StreamFactory :
lo_streamfactory = lo_ixml->create_stream_factory( ).
lo_istream = lo_streamfactory->create_istream_string( lv_formxml ).

* Create an XML Document class that will be used to process the XML :
lo_xml_document = lo_ixml->create_document( ).

* Create the Parser class :
lo_parser = lo_ixml->create_parser( stream_factory = lo_streamfactory
istream = lo_istream
document = lo_xml_document ).

* Parse the XML
lo_parser->parse( ).

* Recherche de la balise « NOM » dans la structure du PDF :
lo_node = lo_xml_document->find_from_name( name = ‘NOM’ ).
* Récupération de la valeur :
lv_nom = lo_node->get_value( ).
* Recherche de la balise « PRENOM » dans la structure du PDF :
lo_node = lo_xml_document->find_from_name( name = ‘PRENOM’ ).
* Récupération de la valeur :
lv_prenom = lo_node->get_value( ).

* Mise à jour des données :
CALL FUNCTION ‘YCALLBACK_ADOBE_FORM’
EXPORTING
i_nom    = lv_nom
i_prenom = lv_prenom.

ENDMETHOD.

Votre classe d’extraction du pdf est prête, il ne reste plus qu’à effectuer le paramétrage permettant de préciser au système que lorsqu’un mail entrant arrive et que celui-ci est assigné à un certain destinataire (nous voulons par exemple extraire et intégrer les pdf qui sont seulement envoyé à « process_pdf@mycompany.com »), il faut alors passer dans notre classe de traitement.

Pour cela, dirigez-vous en transaction SO50 et précisez-y le nom de votre classe de traitement associé à l’adresse e-mail du destinataire concerné :

Cette adresse e-mail doit être associée à un utilisateur SAP de type « SERVICE » et ayant le profil « S_A.SCON » :

Les mails destinés à notre adresse de traitement (par exemple « process_pdf@mycompany.com) devant arriver dans SAP, il ne vous reste plus qu’à créer une règle de routage au niveau de votre serveur SMTP pour rediriger ces e-mails du serveur SMTP vers SAP 😉

Parce que rien ne vaut un exemple concret pour illustrer tout cela, une petite démo s’impose !

Soit la table YTADOBE_FROM_WS :

Nous voulons créer « Monsieur Test 6 », pour ce faire renseignez le formulaire avec les données concernant ce monsieur et cliquez sur l’enveloppe afin d’envoyer le formulaire par e-mail :

Cliquez sur « Joindre » :

Un nouveau message Outlook est préchargé à l’écran avec le formulaire en pièce jointe, l’utilisateur peut ainsi y préciser l’adresse e-mail du destinataire (en fait l’adresse que vous aurez paramétré au niveau de votre serveur SMTP via votre règle de routage SMTP vers SAP), un sujet ainsi qu’un corps :

Après envoie, on peut voir que le mail apparait bien dans la file d’attente des mails entrants via la transaction SOIN :

En double cliquant sur la pièce jointe le formulaire apparaît :

A la réception du mail entrant, on passe alors dans notre classe paramétrée en SO50 et l’entrée est créée :

Ci-dessous la classe CL_FP_INBOUND_HANDLER qui pourra également sans doute vous être utile :

Méthode CREATE_INSTANCE :

METHOD if_inbound_exit_bcs~create_instance.

IF cl_fp_inbound_handler=>instance IS INITIAL.
CREATE OBJECT cl_fp_inbound_handler=>instance.
ENDIF.
ro_ref = cl_fp_inbound_handler=>instance.

ENDMETHOD.

Méthode PROCESS_INBOUND :

METHOD if_inbound_exit_bcs~process_inbound.

DATA: lo_document             TYPE REF TO if_document_bcs,
lo_sender               TYPE REF TO if_sender_bcs,
ls_body_part_attributes TYPE        bcss_dbpa,
ls_body_part_content    TYPE        bcss_dbpc,
lv_ad_smtpadr           TYPE        ad_smtpadr,
lv_hex                  TYPE        solix,
lv_pdf                  TYPE        fpcontent,
lv_log_handle           TYPE        balloghndl,
ls_bal_msg              TYPE        bal_s_msg,
lv_counter              TYPE        i,
lv_ctr_pdf              TYPE        i,
lv_doc_type(3)          TYPE        c,
lv_log_entry(255)       TYPE        c,
lv_value                TYPE        string,
lx_document_bcs         TYPE REF TO cx_document_bcs,
lx_fp_offline           TYPE REF TO cx_fp_offline.

* get email
lo_document = io_sreq->get_document( ).
* initialize application log
lv_log_handle  = int_create_log( ).
lv_log_entry   = ‘Email-Eingangsverarbeitung gestartet …'(001).
ls_bal_msg-msgty    = ‘I’.
ls_bal_msg-detlevel = 1.
int_add_log( iv_log_handle = lv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry  ).
CLEAR lv_log_entry.
* log general information about the email
* sender
lo_sender = io_sreq->get_sender( ).
lv_log_entry = ‘Absender: &'(002).
lv_value = lo_sender->address_string( ).
REPLACE ‘&’ WITH lv_value INTO lv_log_entry.
ls_bal_msg-detlevel = 2.
int_add_log( iv_log_handle = lv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry  ).
* recipients
LOOP AT it_recipients INTO lv_ad_smtpadr.
lv_log_entry = ‘Empfänger: &'(003).
REPLACE ‘&’ WITH lv_ad_smtpadr INTO lv_log_entry.
int_add_log( iv_log_handle = lv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry  ).
ENDLOOP.
* subject
lv_value     = lo_document->get_subject( ).
lv_log_entry = ‘Titel: &'(004).
REPLACE ‘&’ WITH lv_value INTO lv_log_entry.
ls_bal_msg-detlevel = 2.
int_add_log( iv_log_handle = lv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry  ).
CLEAR ls_body_part_content.
CLEAR ls_bal_msg.

* get all email parts
lv_counter = lo_document->get_body_part_count( ).

* find all PDF attachments and process them
DO lv_counter TIMES.
CLEAR ls_body_part_content.
CLEAR ls_body_part_content.
TRY.
ls_body_part_attributes = lo_document->get_body_part_attributes( im_part = sy-index  ).
lv_doc_type = ls_body_part_attributes-doc_type.
TRANSLATE lv_doc_type TO UPPER CASE.
IF lv_doc_type = ‘PDF’.
ADD 1 TO lv_ctr_pdf.
lv_log_entry = ‘>Dateiname: &'(005).
REPLACE ‘&’ WITH ls_body_part_attributes-filename INTO lv_log_entry.
ls_bal_msg-msgty    = ‘I’.
ls_bal_msg-detlevel = 2.
int_add_log( iv_log_handle = lv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry ).
ls_body_part_content = lo_document->get_body_part_content( sy-index ).
ENDIF.

CATCH cx_document_bcs INTO lx_document_bcs.
lv_log_entry = lx_document_bcs->get_text( ).
ls_bal_msg-msgty    = ‘E’.
ls_bal_msg-detlevel = 3.
int_add_log( iv_log_handle = lv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry  ).
*       set bcs status & T100 message
es_t100msg-msgid = ‘FPUICHK’.
es_t100msg-msgno = 100.
es_t100msg-msgty = ‘E’.
int_split_message( EXPORTING iv_message_text = lv_log_entry
IMPORTING ev_msgv1        = es_t100msg-msgv1
ev_msgv2        = es_t100msg-msgv2
ev_msgv3        = es_t100msg-msgv3
ev_msgv4        = es_t100msg-msgv4 ).
CLEAR ls_bal_msg.
ENDTRY.

IF ls_body_part_content IS NOT INITIAL.
CLEAR lv_pdf.
*     convert body part to xstring
LOOP AT ls_body_part_content-cont_hex INTO lv_hex.
CONCATENATE lv_pdf lv_hex-line INTO lv_pdf IN BYTE MODE.
ENDLOOP.
TRY.
*         process PDF form
me->int_process_pdf( iv_pdf        = lv_pdf
iv_log_handle = lv_log_handle ).
CATCH cx_fp_offline INTO lx_fp_offline.
IF NOT lx_fp_offline->previous IS INITIAL.
lv_log_entry = lx_fp_offline->previous->get_text( ).
ELSE.
lv_log_entry = lx_fp_offline->get_text( ).
ENDIF.
ls_bal_msg-msgty    = ‘E’.
ls_bal_msg-detlevel = 3.
int_add_log( iv_log_handle = lv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry  ).
CLEAR ls_bal_msg.
*         set bcs status & T100 message
es_t100msg-msgid = ‘FPUICHK’.
es_t100msg-msgno = 100.
es_t100msg-msgty = ‘E’.
int_split_message( EXPORTING iv_message_text = lv_log_entry
IMPORTING ev_msgv1        = es_t100msg-msgv1
ev_msgv2        = es_t100msg-msgv2
ev_msgv3        = es_t100msg-msgv3
ev_msgv4        = es_t100msg-msgv4 ).
CLEAR ls_bal_msg.
ENDTRY.
ENDIF.
ENDDO.
IF  lv_ctr_pdf IS INITIAL.
ls_bal_msg-msgty    = ‘I’.
ls_bal_msg-detlevel = 2.
lv_log_entry        = ‘Kein PDF im Anhang gefunden'(006).
int_add_log( iv_log_handle = lv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry  ).
ENDIF.

CLEAR ls_bal_msg.
lv_log_entry        = ‘… Email-Eingangsverarbeitung beendet'(007).
ls_bal_msg-msgty    = ‘I’.
ls_bal_msg-detlevel = 2.
int_add_log( iv_log_handle = lv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry  ).
* save the application log entries
int_save_log( iv_log_handle = lv_log_handle ).
ENDMETHOD.

Méthode INT_PROCESS_PDF :

METHOD int_process_pdf.

DATA: lo_fp             TYPE REF TO if_fp,
lo_pdf_object     TYPE REF TO if_fp_pdf_object,
lo_handler        TYPE REF TO if_fp_offline,
lv_xml_data       TYPE        fpcontent,
lv_form_name      TYPE        fpname,
lv_handler_name   TYPE        seoclsname,
ls_bal_msg        TYPE        bal_s_msg,
lx_fp_runtime     TYPE REF TO cx_fp_runtime,
lx_sxml           TYPE REF TO cx_sxml_parse_error,
lx_fp_api         TYPE REF TO cx_fp_api,
lx_xslt           TYPE REF TO cx_transformation_error,
lx_dyn_call       TYPE REF TO cx_sy_dyn_call_error,
lv_log_entry(255) TYPE c,
lv_value          TYPE string.

TRY.
*     get forms processing reference
lo_fp = cl_fp=>get_reference( ).

*     create PDF object
lo_pdf_object = lo_fp->create_pdf_object( ).

*     set document, i.e. PDF form
lo_pdf_object->set_document( pdfdata = iv_pdf ).

*     set task ‘extract data’
lo_pdf_object->set_task_extractdata( ).

*     execute, i.e. call ADS
lo_pdf_object->execute( ).

*     get XML data
lo_pdf_object->get_data( IMPORTING formdata = lv_xml_data ).

*     read form name from XML data
lv_form_name        = me->int_find_formname( iv_xmldata = lv_xml_data ).
ls_bal_msg-detlevel = 3.
ls_bal_msg-msgty    = ‘I’.
IF lv_form_name IS INITIAL.
ls_bal_msg-msgty  = ‘E’.
lv_log_entry      = ‘Formularname im Datenstrom nicht gefunden'(008).
int_add_log( iv_log_handle = iv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry ).
EXIT.
ENDIF.
lv_log_entry        = ‘Formularname: &'(009).
REPLACE ‘&’ WITH lv_form_name INTO lv_log_entry.
int_add_log( iv_log_handle = iv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry ).

*     get offline handler
lv_handler_name = cl_fp_wb_helper=>form_get_offline_handler( iv_name = lv_form_name ).
lv_log_entry = ‘Eingangsverarbeitung: &'(010).
REPLACE ‘&’ WITH lv_handler_name INTO lv_log_entry.
int_add_log( iv_log_handle = iv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry ).

*     get handler instance
CALL METHOD (lv_handler_name)=>if_fp_offline~get_instance
RECEIVING
ro_instance = lo_handler.

*     remove form name from XML data
CALL TRANSFORMATION fp_remove_formname
SOURCE XML lv_xml_data
RESULT XML lv_xml_data.

*     invoke offline handler with PDF form and XML data
lv_log_entry = ‘Verarbeitungsanfang…'(011).
int_add_log( iv_log_handle = iv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry ).
lo_handler->handle_pdf( iv_form_name = lv_form_name
iv_pdf       = iv_pdf
iv_xml       = lv_xml_data ).
lv_log_entry = ‘…Verarbeitungsende'(012).
int_add_log( iv_log_handle = iv_log_handle
is_bal_msg    = ls_bal_msg
iv_freetext   = lv_log_entry ).

CATCH cx_fp_runtime INTO lx_fp_runtime.
RAISE EXCEPTION TYPE cx_fp_offline
EXPORTING
textid   = cx_fp_offline=>cx_fp_offline
previous = lx_fp_runtime.
CATCH cx_sxml_parse_error INTO lx_sxml.
RAISE EXCEPTION TYPE cx_fp_offline
EXPORTING
textid   = cx_fp_offline=>cx_fp_offline
previous = lx_sxml.
CATCH cx_fp_api INTO lx_fp_api.
RAISE EXCEPTION TYPE cx_fp_offline
EXPORTING
textid   = cx_fp_offline=>cx_fp_offline
previous = lx_fp_api.
CATCH cx_transformation_error INTO lx_xslt.
RAISE EXCEPTION TYPE cx_fp_offline
EXPORTING
textid   = cx_fp_offline=>cx_fp_offline
previous = lx_xslt.
CATCH cx_sy_dyn_call_error INTO lx_dyn_call.
RAISE EXCEPTION TYPE cx_fp_offline
EXPORTING
textid   = cx_fp_offline=>cx_fp_offline
previous = lx_dyn_call.
ENDTRY.

ENDMETHOD.

Méthode INT_FIND_FORMNAME :

METHOD int_find_formname.

DATA lo_reader TYPE REF TO if_sxml_reader.

CLEAR rv_formname.

lo_reader = cl_sxml_string_reader=>create( iv_xmldata ).

WHILE lo_reader->node_type <> if_sxml_node=>co_nt_final AND rv_formname IS INITIAL.
lo_reader->read_next_node( ).

*   Search node in XML
IF lo_reader->node_type = if_sxml_node=>co_nt_value.
IF lo_reader->prefix = ‘fpoffline’ AND lo_reader->name = ‘form’. « #EC NOTEXT
MOVE lo_reader->value TO rv_formname.
ENDIF.
ENDIF.
ENDWHILE.

ENDMETHOD.

Méthode INT_CREATE_LOG :

METHOD int_create_log.

DATA: ls_log_header TYPE bal_s_log.

* initialization
ls_log_header-object      = ‘FP’.
ls_log_header-aldate_del  = sy-datum + 14.

* Create a new protocol file
CALL FUNCTION ‘BAL_LOG_CREATE’
EXPORTING
i_s_log                 = ls_log_header
IMPORTING
e_log_handle            = rv_log_handle
EXCEPTIONS
log_header_inconsistent = 1
OTHERS                  = 2.
ASSERT sy-subrc = 0.

ENDMETHOD.

Méthode INT_ADD_LOG :

METHOD int_add_log.

DATA: ls_param TYPE bal_s_mdef.

IF NOT iv_freetext IS INITIAL.
*   Vorbelegungen für Meldungen lesen
CALL FUNCTION ‘BAL_GLB_MSG_DEFAULTS_GET’
IMPORTING
e_s_msg_defaults = ls_param.
*   Detaillierungsgrad ändern
IF ls_param-detlevel <> is_bal_msg-detlevel.
ls_param-detlevel = is_bal_msg-detlevel.
*     Vorbelegungen für Meldungen setzen
CALL FUNCTION ‘BAL_GLB_MSG_DEFAULTS_SET’
EXPORTING
i_s_msg_defaults      = ls_param
EXCEPTIONS
defaults_inconsistent = 2
OTHERS                = 3.
ASSERT sy-subrc = 0.
ENDIF.

*   add a log entry as free text to a specific protocol
CALL FUNCTION ‘BAL_LOG_MSG_ADD_FREE_TEXT’
EXPORTING
i_log_handle     = iv_log_handle
i_msgty          = is_bal_msg-msgty
i_text           = iv_freetext
EXCEPTIONS
log_not_found    = 1
msg_inconsistent = 2
log_is_full      = 3
OTHERS           = 4.
ASSERT sy-subrc = 0.

ELSE.
* add a log entry to a specific protocol
CALL FUNCTION ‘BAL_LOG_MSG_ADD’
EXPORTING
i_log_handle     = iv_log_handle
i_s_msg          = is_bal_msg
EXCEPTIONS
log_not_found    = 1
msg_inconsistent = 2
log_is_full      = 3
OTHERS           = 4.
ASSERT sy-subrc = 0.
ENDIF.

ENDMETHOD.

Méthode INT_SAVE_LOG :

METHOD int_save_log.

DATA lt_handle TYPE bal_t_logh.

* Save all collected log entries.
INSERT iv_log_handle INTO TABLE lt_handle.
CALL FUNCTION ‘BAL_DB_SAVE’
EXPORTING
i_save_all       = abap_true
i_t_log_handle   = lt_handle
EXCEPTIONS
log_not_found    = 1
save_not_allowed = 2
numbering_error  = 3
OTHERS           = 4.
ASSERT sy-subrc = 0.

ENDMETHOD.

Méthode INT_SPLIT_MESSAGE :

METHOD int_split_message.

DATA: ls_str      TYPE string,
ls_buff(50) TYPE c.

ls_str  = iv_message_text.

ls_buff = ls_str .
ev_msgv1  = ls_buff.

SHIFT ls_str BY 50 PLACES LEFT.
ls_buff = ls_str.
ev_msgv2 = ls_buff.

SHIFT ls_str BY 50 PLACES LEFT.
ls_buff = ls_str.
ev_msgv3 = ls_buff.

SHIFT ls_str BY 50 PLACES LEFT.
ls_buff = ls_str.
ev_msgv4 = ls_buff.

ENDMETHOD.

Publicités

3 commentaires sur “Adobe Interactive Forms : validation via e-mails

  1. Bonjour,
    Je suis actuellement entrain de tester ce tuto je rencontre un petit problème.
    Je vois bien mon mail et ma pièce jointe dans la SOIN, par contre ma table n’est pas mise à jour.
    J’ai l’impression de ne pas passer dans la Méthode PROCESS_INBOUND j’ai rajouté un point d’arret (Externe) le programme n’arrete pas.
    Pour info
    j’ai fait un copier coller du code utilisé d’extraction des données du PDF :
    IF_INBOUND_EXIT_BCS~PROCESS_INBOUND

    Avez vous une idée?

    Je vous remercie d’avance.

  2. Effectivement on ne passe pas dans les points d’arrêt à ce niveau là. Pour tester votre paramétrage SO50 vous pouvez simuler celle-ci à l’aide du report ci-dessous, vous devriez pouvoir ainsi vous arrêter dans votre point d’arrêt :

    *&———————————————————————*
    *& Report Y_SO50_EXIT
    *&———————————————————————*
    REPORT y_so50_exit.

    *———————————————————————-*
    * DECLARATION GLOBALES *
    *———————————————————————-*
    TYPES:
    * Déclaration des types globaux :
    BEGIN OF ty_range_att_type,
    zatt TYPE c LENGTH 4,
    zdesc TYPE char50,
    END OF ty_range_att_type.

    DATA:
    * Déclaration des objets globaux :
    go_pdfmail TYPE REF TO if_inbound_exit_bcs,
    go_cont TYPE REF TO cl_gui_custom_container,
    go_req TYPE REF TO cl_send_request_bcs,
    go_addr TYPE REF TO cl_cam_address_bcs,
    go_document TYPE REF TO cl_document_bcs,
    go_maint TYPE REF TO cl_ibnd_rules_maint_bcs,
    * Déclaration des tables internes globales :
    gt_rc TYPE bcsy_smtpa,
    gt_doc TYPE bcsy_sodoc,
    gt_solix TYPE solix_tab,
    gt_text TYPE bcsy_text,
    * Déclaration des structures globales :
    gs_x TYPE bcss_t100m,
    gs_text TYPE soli,
    * Déclaration des variables globales :
    gv_rc TYPE i,
    gv_len TYPE i,
    gv_filename TYPE string.
    *———————————————————————-*

    *———————————————————————-*
    * DECLARATION LOCALES *
    *———————————————————————-*
    DATA:
    * Déclaration des tables internes locales :
    lt_range_att_type TYPE TABLE OF ty_range_att_type,
    lt_bcsy_smtp2 TYPE bcsy_smtp2,
    * Déclaration des structures locales :
    ls_range_att_type TYPE ty_range_att_type.
    *———————————————————————-*

    *———————————————————————-*
    * ECRAN DE SELECTION *
    *———————————————————————-*
    PARAMETERS:
    p_file TYPE tdlen255 LOWER CASE,
    p_file1 TYPE ad_smtpadr LOWER CASE,
    p_file2 TYPE seoclsname LOWER CASE,
    p_file3(3).
    *———————————————————————-*

    *———————————————————————-*
    * AT SELECTION-SCREEN events *
    *———————————————————————-*
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

    DATA:
    * Déclaration des tables internes :
    gt_file TYPE filetable,
    * Déclaration des structures :
    gs_file TYPE file_table,
    * Déclaration des variables :
    gv_user_action TYPE i.

    * Méthode de sélection du fichier :
    CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
    default_extension = ‘*’
    file_filter = ‘*’
    CHANGING
    file_table = gt_file
    rc = gv_rc
    user_action = gv_user_action
    EXCEPTIONS
    file_open_dialog_failed = 1
    cntl_error = 2
    error_no_gui = 3
    not_supported_by_gui = 4
    OTHERS = 5.

    READ TABLE gt_file INTO gs_file INDEX 1.
    * Récupération du nom de fichier :
    p_file = gs_file-filename.

    AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file3.

    REFRESH:
    * Rafraichissement des tables internes locales :
    lt_range_att_type.

    ls_range_att_type-zatt = ‘PDF’.
    ls_range_att_type-zdesc = ‘PDF’.
    APPEND ls_range_att_type TO lt_range_att_type.
    ls_range_att_type-zatt = ‘XLS’.
    ls_range_att_type-zdesc = ‘XLS’.
    APPEND ls_range_att_type TO lt_range_att_type.

    CALL FUNCTION ‘F4IF_INT_TABLE_VALUE_REQUEST’
    EXPORTING
    retfield = ‘ZDESC’
    dynpprog = sy-repid
    dynpnr = sy-dynnr
    dynprofield = ‘P_FILE3’
    value_org = ‘S’
    TABLES
    value_tab = lt_range_att_type.

    AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file2.

    CLEAR:
    * Rafraichissement des tables internes locales :
    lt_bcsy_smtp2.

    CREATE OBJECT:
    go_cont EXPORTING container_name = ‘CCONT’,
    go_maint EXPORTING io_cont = go_cont.

    go_maint->read_smtp_entries( IMPORTING et_entries = lt_bcsy_smtp2 ).

    CALL FUNCTION ‘F4IF_INT_TABLE_VALUE_REQUEST’
    EXPORTING
    retfield = ‘CLS_NAME’
    dynpprog = sy-repid
    dynpnr = sy-dynnr
    dynprofield = ‘P_FILE2’
    value_org = ‘S’
    TABLES
    value_tab = lt_bcsy_smtp2.

    *———————————————————————-*
    * START-OF-SELECTION *
    *———————————————————————-*
    START-OF-SELECTION.

    gv_filename = p_file.

    cl_gui_frontend_services=>gui_upload(
    EXPORTING filename = gv_filename
    filetype = ‘BIN’
    IMPORTING filelength = gv_len
    CHANGING data_tab = gt_solix
    EXCEPTIONS OTHERS = 1 ).

    CHECK sy-subrc = 0.

    go_req = cl_send_request_bcs=>create( ).
    go_addr = cl_cam_address_bcs=>create_internet_address( i_address_string = p_file1 ).
    go_req->setu_sender( go_addr ).
    go_req->set_tech_sender( go_addr ).

    gs_text = ‘Hello’.
    APPEND gs_text TO gt_text.

    go_document = cl_document_bcs=>create_document(
    i_type = ‘RAW’
    i_text = gt_text
    i_length = ‘0’
    i_subject = ‘Dummy text’ ).

    go_document->add_attachment( i_attachment_type = p_file3
    i_attachment_subject = ‘My attachment’
    i_att_content_hex = gt_solix ).
    go_req->setu_document( i_document = go_document ).

    * Create object reference of type class :
    CALL METHOD (p_file2)=>if_inbound_exit_bcs~create_instance
    RECEIVING
    ro_ref = go_pdfmail.

    * Casting of object reference to interface :
    go_pdfmail->process_inbound(
    EXPORTING io_sreq = go_req
    it_recipients = gt_rc
    it_doctypes = gt_doc
    IMPORTING e_retcode = gv_rc es_t100msg = gs_x ).

  3. En effet ce programme est très pratique j’ai pu voir la source de mon problème grâce à lui.

    J’utilisais un formulaire que j’avais généré à partir du WSDL
    En debugge je ne voyais pas mes deux zones de saisie « NOM » et « PRENOM » dans le variable lv_formxml conclusion le node
    lo_node = lo_xml_document->find_from_name( name = ’NOM’ ) ne trouvais pas le libellé et j’avais un vilain dump lors du lv_nom = lo_node->get_value( ).
    Pour corriger le problème j’ai dû rajouter dans l’interface dans les variables globales mes deux champs puis dans layout j’ai effectué le mapping à partir du WSDL

    Je tiens encore à vous remercier pour votre aide mais aussi pour ce tutoriel

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

w

Connexion à %s