ABAP--一个极好的调用外部java程序的Search Help Exit的实例(RFC好例子)

 

Connecting to an external source via Java Connector
(By Bob Billings)
 
 
In the process of SAP Order Entry (VA01) it became necessary to provide a “fuzzy” search help from an external source using the Java Connector for a material lookup. I.e. SAP does not store all the possible search options to return a material number. Additional searchable fields related to a material are maintained in an external system and we want to search on these fields.
ABAP--一个极好的调用外部java程序的Search Help Exit的实例(RFC好例子)_第1张图片
The way this was accomplished was through an Elementary search help that used the search help exit to connect via a remote function call to the Java Connector. The Elementary search help was then added to a Collective search help via the Included search help list and connected using the parameter assignment button. 
Three code snippets follow:
  • The function call which accepts the request and processes the results,
  • the remote function which is merely a conduit to and from the remote destination, and
  • a part of the Java code that accepts input from SAP and returns an internal table of results.
ABAP--一个极好的调用外部java程序的Search Help Exit的实例(RFC好例子)_第2张图片
ABAP--一个极好的调用外部java程序的Search Help Exit的实例(RFC好例子)_第3张图片
ABAP--一个极好的调用外部java程序的Search Help Exit的实例(RFC好例子)_第4张图片
ABAP--一个极好的调用外部java程序的Search Help Exit的实例(RFC好例子)_第5张图片
 
The global data top include for the actual exit contains the following:
 
type-pools shlp.
type-pools f4typ. "Brücke zu alten F4-Bausteinen
tables: ddshdefsh. "Tabelle der Default-Suchhilfen
 
 
data %shlpname like dd30v-shlpname.   
constants: par%domname like ddshfprop-fieldname value 'DOMNAME',
           par%value like ddshfprop-fieldname value 'VALUE',
           par%text like ddshfprop-fieldname value 'TEXT',
           par%_low like ddshfprop-fieldname value'_LOW',
           par%_high like ddshfprop-fieldname value'_HIGH',
           par%_text like ddshfprop-fieldname value'_TEXT',
           par%rollname like ddshfprop-fieldname value 'ROLLNAME',
           par%tabname like ddshfprop-fieldname value 'TABNAME'.
 
Search help exit definition:
 
FUNCTION Z_F4_ZMAT_EXIT.
*"----------------------------------------------------------------------
*"*"Local interface:
*" TABLES
*"      SHLP_TAB TYPE SHLP_DESCR_TAB_T
*"      RECORD_TAB STRUCTURE SEAHLPRES
*" CHANGING
*"     VALUE(SHLP) TYPE SHLP_DESCR_T
*"     VALUE(CALLCONTROL) LIKE DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"----------------------------------------------------------------------
 data: matnr like mara-matnr,
       maktx like makt-maktx,
       desc like makt-maktx,
       recs_to_return like lfa1-bbsnr,
       recs_returned like lfa1-bbsnr,
 
      is_selopt    like DDSHSELOPT,
       is_shlp_tab like line of shlp_tab,
       is_interface like line of shlp_tab-interface.
 
 data: begin of it_return occurs 0.
         include structure ZPM_RETURN.
 data: end of it_return.
 
 data: begin of is_disp,
         filler type char005,
         matnr like mara-matnr,
         maktx like makt-maktx,
       end   of is_disp.
 
 data: is_return like line of it_return.
 
*************************************************************
 Case callcontrol-step.
*************************************************************
 
    when 'SELONE' or 'PRESEL1' or 'PRESEL' or 'DISP'.
      exit.
 
    when 'SELECT'.
 
      clear: is_disp.
      refresh: record_tab.
** Find the search item & number of lines to return
      read table shlp_tab index 1 into is_shlp_tab.
      read table is_shlp_tab-interface index 1 into is_interface.
      if not is_interface-value is initial.
        maktx = is_interface-value.
      else.
        read table shlp-selopt index 1 into is_selopt.
        maktx = is_selopt-low.
      endif.
      recs_to_return = callcontrol-maxrecords.
 
** call dummy FM that is remotely enabled. The Java listener
** is looking for destination SAP_JAVA
      CALL FUNCTION 'Z_RFC_TO_PM'
        DESTINATION 'SAP_JAVA'
       EXPORTING
         MAKTG             = maktx
         max_lines         = recs_to_return
       IMPORTING
         COUNT             = recs_returned
       TABLES
         RESULT_TAB        = it_return.
 
      if recs_returned > 0.
** put the return table into search help display table
        loop at it_return into is_return.
          is_disp-matnr = is_return-matnr.
          is_disp-maktx = is_return-maktx.
          append is_disp to record_tab.
        endloop.
      else.
        is_disp-matnr = '*************'.
        is_disp-maktx = 'Nothing returned'.
        append is_disp to record_tab.
      endif.
      callcontrol-step = 'DISP'.
      exit.
 
    when others.
      exit.
   endcase.
 
ENDFUNCTION.
 
 
** Remotely enabled function module
FUNCTION Z_RFC_TO_PM.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*"     VALUE(MAKTG) LIKE MAKT-MAKTG
*"     VALUE(MAX_LINES) LIKE LFA1-BBSNR
*" EXPORTING
*"     VALUE(COUNT) LIKE LFA1-BBSNR
*" TABLES
*"      RESULT_TAB STRUCTURE ZPM_RETURN
*"----------------------------------------------------------------------
 
ENDFUNCTION.
 


This is the method in server class that handles incoming RFC calls:
 
  public void handleRequest(JCO.Function pFunction) throws java.lang.Exception
    {
        String className = resolveClassName(pFunction.getName());
 
        if (className != null)
        {
            IMethod method = (IMethod) Class.forName(className).newInstance();
            method.execute(pFunction.getImportParameterList(),
                           pFunction.getExportParameterList(),
                           pFunction.getTableParameterList());
        } else
        {
            //Throw JCO.AbapException if we don't handle Function.
            throw new NotSupportedException();
        }
    }
 
And this one does the work:
 
    public void execute(JCO.ParameterList pImportParameters,
                        JCO.ParameterList pExportParameters,
                        JCO.ParameterList pTableParameters) throws PMVSException
    {
        JCO.Table table = pTableParameters.getTable("RESULT_TAB");
        String searchString = pImportParameters.getString("MAKTG");
        int maxReturn = new Integer(pImportParameters.getString("MAX_LINES")).intValue();
 
        try
        {
            ValuesCollection[] results = search(searchString, maxReturn);
 
            if (results != null)
            {
                String count = "" + results.length;
                pExportParameters.setValue(count, "COUNT");
                for (int i = 0; i<results.length; i++)
                {
                    DisplayAttrValue[] vals;
                    String partnum;
                    String desc;
 
                    //Get part num
                    vals = results[i].get("A-ManufacturerPartNumber");
                    partnum = vals.length > 0 ? vals[0].getDisplayString() : "null";
 
                    //Get description
                    vals = results[i].get("A-Description");
                    desc = vals.length > 0 ? vals[0].getDisplayString() : "null";
 
                    if (partnum.length() > 18)
                    {
                        partnum = partnum.substring(0,18);
                    }
                    if (desc.length() > 40)
                    {
                        desc = desc.substring(0,40);
                    }
                    table.appendRow();
                    table.setValue(partnum, "MATNR");
                    table.setValue(desc, "MAKTX");
                }
                pTableParameters.setValue(table, "RESULT_TAB");
            } else
            {
                pExportParameters.setValue("0", "COUNT");
            }
        } catch (Exception exc)
        {
            exc.printStackTrace();
        }
    }

你可能感兴趣的:(java)