User-defined function in order by?

Hey guys.  We're trying to port our postgres db to Oracle, and I'm stumbling on this one issue.  We have columns called 'sortSequences', which are arbitrarily long arrays of integers.  For POC purposes, I am using varray(), but that probably won't work as an production implementation, because of it's strongly-defined size.  Anyway, the crux of the problem is that I need to be able to select * from foo order by sortSequence, where the ordering evaluation is custom code.  The array of integers essentially represent infinite-precision math, and we have a deterministic algorithm for comparing them, but one cannot simply produce a value from them (which I think prevents me from using a map member function in a user-defined object type.)  In other words, we don't really care what the values are, we are just using them collectively as a sorting index.  An aggregate function didn't look like the right answer, and a simple scalar function is out of the question.  We were looking at domain indexes, but it's not clear to me that even if we created an operator bound to our user-defined type that the db would use that function for order by evaluation...
Can anybody think of a solution for this problem?  If we absolutely have to live without this functionality, we can replicate it in app code, but we wish to avoid that at all costs...
thanks,
brian

Doesn't look very promising for a general case.
Even for short sequences and moderate number values the computed numbers to order by are quite large.
with
data_table as
(select '[10,1,1]' csv from dual union all
select '[1,5,-1]' from dual union all
select '[1,1,1,1]' from dual union all
select '[3,-5,1,3,2]' from dual union all
select '[1,1,2]' from dual union all
select '[1,20]' from dual union all
select '[2]' from dual union all
select '[1,7,1]' from dual
mapped as
(select csv,
        lvl,
        item - min(item) over (order by null rows between unbounded preceding and unbounded following) n,
        max(item) over (order by null rows between unbounded preceding and unbounded following) -
        min(item) over (order by null rows between unbounded preceding and unbounded following) m,
        max(lvl) over (order by null rows between unbounded preceding and unbounded following) x
   from (select csv,
                level lvl,
                to_number(regexp_substr(t_csv,'[^,]+',1,level)) item
           from (select csv,
                        ltrim(rtrim(csv,']'),'[') t_csv
                   from data_table
         connect by level <= regexp_count(csv,',') + 1
                and prior csv = csv
                and prior sys_guid() is not null
joined as
(select l.csv,l.lvl,nvl(m.n,0) n,l.m,row_number() over (partition by l.csv order by l.lvl desc) rn
   from mapped m
        right outer join
        (select csv,lvl,m
           from (select level lvl,
                        (select max(m) from mapped) m
                           from dual
                         connect by level <= (select max(x) from mapped))
                cross join
                (select csv from data_table)
        ) l
     on l.csv = m.csv
    and l.lvl = m.lvl
order by csv,lvl
select csv,o
  from (select csv,rn,o
          from joined
         model
         partition by (csv)
         dimension by (lvl)
         measures (rn,n,m,0 o)
         rules
         (o[lvl] = (nvl(o[cv(lvl) - 1],0) + n[cv(lvl)]) * m[cv(lvl)])
where rn = 1
order by o
CSV
O
[1,1,1,1]
61035000
[1,1,2]
61046875
[1,5,-1]
62562500
[1,7,1]
63375000
[1,20]
68359375
[2]
68359375
[3,-5,1,3,2]
78223925
[10,1,1]
148921875

Similar Messages

  • Multi mapping question using user defined function

    Hi,
    I have a message with multiple occuring nodes (i.e. one message with multiple orders (header + detail)) that I need to map to a idoc. I need to filter out of the source based on order type (in header) from creating an idoc.. How do I do it using user defined function + message mappping ?
    mad

    All - Thanks much.. Here is my requirement that is no solved by regular mapping
    <Root>
    <Recordset>
      <Ordheader>
        <ord>
        <ord_type>
      </Ordheader>
       <Ord_line>
         <ord>
         <Linnum>
       </Ord_line>
      </Recordset>
    <Recordset>
      <Ordheader>
        <ord>
        <ord_type>
      </Ordheader>
       <Ord_line>
         <ord>
         <Linnum>
       </Ord_line>
    </Recordset>
    <Root>
    As you see above, each recordset has order transaction. One Root message can contain multiple of these. So, when I map to the IDOC, I want to filter out any ord_type <> XX.
    If I use regular graphical map, it only looks at first recordset and accepts all or rejects all.
    I need to use UDF. In the UDF, what comes in as input ? Resultset is output -correct ? Now how do I usse graphical mapping with UDF to generate the correct target info

  • User defined function to find difference between dates

    format of dtActivityStartDate/dtActivityFinishDate: 2010-09-17 14:50:51.150
    usdFuncTimeCalc (vcActivityName,dtActivityStartDate, dtActivityFinishDate) -- user defined function
    i need to calculate time elapsed for that type of activity following are the rules:
    (If Process Request is the activity)
    Working Days: Monday through Saturday
    Hours of Operation: 9AM – 5PM
    only working hours of day need to the counted like for example if it is sep 15 11 Am is dtActivityStartDate & Sep 17 is dtActivityFinishDate is 10 Am. then time elapsed is 11am to 5pm on sep 15 , 9 to 5 on sep 16 & 9 to 10 on sep 17 so total should be
    6+ 8 + 1 = 15 hours + minutes.
    format of date time: 2010-09-17 14:50:51.150
    vcActivityName = Process Request
    Don't worry about process request...

    I hv modified the code to make it more generic inorder to suit any timings (customizable) from Monday - Saturday.
    declare
      -- ** b u s i n e s s _ h o u r s **
      -- business_hours returns the number of work houts (9 am through 5 pm,
      -- Monday through Saturday) between in_start_dt and in_end_dt.
      -- If in_start_dt > in_end_dt, the results will be <= 0.
      -- Holidays are not considered.
      in_start_dt DATE := to_date('15-SEP-2010 11:00:00','DD-MON-RRRR HH24:MI:SS');
      in_end_dt   DATE := to_date('17-SEP-2010 10:00:00','DD-MON-RRRR HH24:MI:SS');
      d          NUMBER; -- Hours of either start_dt or end_dt after midnight
      end_dt     DATE := GREATEST(in_start_dt, in_end_dt); -- In case dates were in wrong order
      return_val NUMBER; -- Total number of working hours
      start_dt   DATE := LEAST(in_start_dt, in_end_dt); -- In case dates were in wrong order
      start_time number := 9;
      end_time   number := 17;
    BEGIN
      WITH all_days AS(
        SELECT start_dt + LEVEL - 1 AS a_dt
          FROM dual
        CONNECT BY LEVEL <= 1 + TRUNC(end_dt) - TRUNC(start_dt))
          --SELECT SUM(12)
           SELECT SUM(end_time-start_time)
            INTO return_val
            FROM all_days
           WHERE TO_CHAR(a_dt,'Dy','NLS_DATE_LANGUAGE = ''ENGLISH''') NOT IN ('Sun');
      dbms_output.put_line('Return_Val_1 : '||return_val);
      -- Adjust hours from start_dt, if necessary
      IF TO_CHAR(start_dt, 'Dy', 'NLS_DATE_LANGUAGE = ''ENGLISH''') NOT IN ('Sun') THEN
         -- Calculate nbr of hours passed from midnight
         d := 24 * (start_dt - TRUNC(start_dt));
         dbms_output.put_line('d:'||d);
         IF d >= end_time THEN -- d has passed 5 PM (end_time)
            -- Don't count start_dt if it has passed the closing hours
            return_val := return_val - (end_time-start_time);
            dbms_output.put_line('if-d:'||return_val);
         ELSIF d > start_time and d < end_time THEN -- d has passed 9 AM but less than 5 PM
            -- Don't count the part of start_dt which has passed the opening hours
            return_val := return_val - (d - start_time);
            dbms_output.put_line('else-d:'||return_val);
         END IF;
      END IF;
      dbms_output.put_line('');
      dbms_output.put_line('Return_Val_2 : '||return_val);
      -- Adjust hours from end_dt, if necessary
      IF TO_CHAR(end_dt, 'Dy', 'NLS_DATE_LANGUAGE = ''ENGLISH''') NOT IN ('Sun') THEN
         d := 24 * (end_dt - TRUNC(end_dt));
         dbms_output.put_line('d:'||d);
        IF d <= 9 THEN -- d < 9 AM
           -- Don't count end_dt itself
           return_val := return_val - (end_time-start_time);
           dbms_output.put_line('if-d:'||return_val);
        ELSIF d > start_time and d < end_time THEN -- d > 5 PM
          -- Don't count part of end_dt
          return_val := return_val - (end_time - d);
          dbms_output.put_line('else-d:'||return_val);
        END IF;
      END IF;
      dbms_output.put_line('');
      dbms_output.put_line('Return_Val_3 : '||return_val);
      IF in_start_dt > in_end_dt THEN
          return_val := -return_val;
      END IF;
      dbms_output.put_line('');
      dbms_output.put_line('Return_Val_4 : '||return_val);
    END;Plz note the following points of the code :
    1) You'll need to convert it a function, I just made it a declare..begin..end; block.
    2) I hv used the same timings for start & end as you hv mentioned.
    3) The 2 variables "start_time" and "end_time" take the opening & closing business hours respectively in a 24 hour format.
    4) You might want to remove the DBMS_OUTPUT ... stmts which I had added for debugging.
    It was an interesting code block to analyze ... :-)

  • User defined function to set a default value of a column

    Hi All
    Can we use user defined function to set a default value of a column ??
    for example:
    create or replace  function test1  return number is
    begin
    return 10;
    end;
    create table testt
    (id  as test1,
      name varchar2(20));
    error:
    ORA-02000: missing ( keywordThanks
    Ashwani

    174313 wrote:
    MichaelS for showing example to use function in table ddl , otherwise i was thinking we cannot use function in table ddl as per error I received.That was an example of a virtual column.
    ORA-04044: procedure, function, package, or type is not allowed hereUsing PL/SQL code like that raises 2 basic problems. If that PL/SQL code for the calculating the column default breaks, what happens to the SQL insert statements against that table. These will need to fail as the table definition depends on the PL/SQL code. This is problematic as this dependency simply increases the complexity of the SQL object.
    The 2nd issue is performance. PL/SQL code needs to be executed by the PL/SQL engine. This means a context switch from the SQL engine to the PL/SQL engine in order to determine the default value for that column. Context switching is a performance overhead.
    So even if it was possible to use a PL/SQL function as parameter for the SQL default clause, I would not be that keen to use it.

  • User-defined function(java)

    hi expects,
    how to write user defined finction in javain meesage mapping.please help me.

    Hi Rohit,
    In order to create UDFs, you need to have a basic idea about using Core Java. Also, based on the kind of functonality of the code, you will need to know if you require any extra jar files.
    To create a UDF, all you need to do is click on LHS icon in the graphical mapping editor. Also, keep in min that the input and otput of a udf is always in strings.
    To test your functions, you can either use the test tab present in the mapping editor or you can even use the following editor(blog by Sravya):-
    /people/sravya.talanki2/blog/2006/07/24/integrating-java-editor-in-xi-integration-stack
    I think info will be enough for you to start off with creating and using UDFs:)
    This link for User Defined Functions,
    http://help.sap.com/saphelp_nw04/helpdata/en/d9/718e40496f6f1de10000000a1550b0/content.htm
    Writing use defrined functions in XI is quite simple. Create a simple UDF, give the import parameters and then just go ahead with the logic coding and then return the output from the UDF.
    Just remember that all inputs and outputs to an UDF are always Strings.
    Cheers...
    Vasu
    <b>** REward Points if found useful **</b>

  • Need user define function for the message  mapping structure

    Hi All
    I am new to XI.I need the java code for Udf for the following structure.
    i have two input and one out put as error.
    order_nos----
    user define function-------error message
    order_details----
    num of orders---- i.e. 10
    order_details------ i.e. whole order records details
    1.i have to compare the 1st  input with 2nd one means if the ist input contain 10 means there are 10 orders in 2nd input.if not then i have to give error message .
    2.then i have to check the fields in 2nd input has no null values.if no values the output will be error message.
    Edited by: Rohit Kumar on Dec 18, 2008 4:43 PM

    Hi Sudhir
    thanks for your continues help.i need some help so that i can fulfill my requirmrnt
    this is my message mapping xml.
    <?xml version="1.0" encoding="UTF-8" ?>
    - <ns0:methodCall_MT xmlns:ns0="http://www.dfdsf">
      <num_orders>10</num_orders>
      <test_mode />
    - <order_x>                        ( which is order details)
      <order_id>t78tyu8t</order_id>
      <order_date />
      <mfg_id />
      <catalog_id />
      <first_name />
      <last_name />
      <recipient />
      <message />
      <address1 />
      <address2 />
      <address3 />
      <city />
      <state />
      <zip />
      <country />
      <country_code />
      <phone />
      <subtotal />
      <tax />
      <shipping />
      <total />
      <shopatron_total />
      <fulfiller_total />
      <shipment_id />
    - <additional_info>
      <in_store_pickup />
    - <express_shipping>
      <express_shipping_flag />
      <express_shipping_text />
      <express_shipping_arrival />
      </express_shipping>
      </additional_info>
    - <discount>
      <discount_description />
      <discount_percentage />
      <discount_total />
      </discount>
      <lang_id />
      <currency_id />
      <packing_list />
      <num_items />
    - <items>
      <item_id />
      <quantity />
      <price />
      <part_number />
      <fulfiller_total />
      <shopatron_total />
    - <options>
      <option_x />
      </options>
      </items>
      </order_x>
      </ns0:methodCall_MT>
    this my mapping where under one element number elements are there.when i am excuting the code to check the null value its always giving the there is null val but i have filled evrything.its due to first its checking the order_x and which will be always null.uder this all data will be filled.please suggest what to change in the udf.the code  given by u is working fine but its failing in this scenario because it getting the parent filed is null.

  • Java class within user defined function

    Hi all,
    in order to have a JDBC-lookup java function "globally" in XI i created a java class and imported it to XI as an imported Archive (i have to do the lookup within a mapping). I then can include the class to a user defined function. However the problem is now that this works fine within one Software Component Version but when i want to use it in several SWCV i have to import the jar to every SWCV. My question is therefore if anybody has already had this problem and if there is another possible solution - maybe deploying the class to XI using SDM?
    Thank you for your thoughts.
    Mathias

    hi Markus,
    >>>>My question is therefore if anybody has already had this problem and if there is another possible solution - maybe deploying the class to XI using SDM?
    if you do that then you'll have to remember about it
    every time you import a new SP or upgreade your XI
    this is not standard so SAP may always overwrite it
    and your interfaces will stop working
    consider importing it for every SWCV  
    Regards,
    michal

  • How to add user defined functions in Menu bar of a Selection Screen?

    Hi,
    Can anybody please suggest me that how can I add user defined functions in the menu bar of a Selection Screen?
    Regards
    s@k

    Dear Amit,
    I am referring to the standard SAP program: RIEQUI20.
    On the initial screen, there are 3 tabs.
    Code:
    SELECTION-SCREEN BEGIN OF TABBED BLOCK tab FOR 25 LINES.
    SELECTION-SCREEN TAB (20) tab1 USER-COMMAND ucomm1
                         DEFAULT SCREEN 001.
    SELECTION-SCREEN TAB (20) tab2 USER-COMMAND ucomm2
                         DEFAULT SCREEN 002.
    SELECTION-SCREEN TAB (20) tab3 USER-COMMAND ucomm2
                         DEFAULT SCREEN 003.
    SELECTION-SCREEN END OF BLOCK tab.
    AT SELECTION-SCREEN.
      CLEAR gv_okcode.
      gv_okcode = sy-ucomm.
      CLEAR sy-ucomm.
      CASE gv_okcode.
        WHEN 'IH08'.
          CALL TRANSACTION 'IH08'. "Equipment Selection
        WHEN 'IW29'.
          CALL TRANSACTION 'IW29'. "Notification Selection
        WHEN 'IW39'.
          CALL TRANSACTION 'IW39'. "Order List Selection
        WHEN OTHERS.
      ENDCASE.
    *   Check date:                                         
      IF NOT datuv IS INITIAL                            
      AND NOT datub IS INITIAL.                         
        IF datub >= datuv.                              
        ELSE.                                           
          MESSAGE e884(ih) WITH datuv datub.            
        ENDIF.                                           
      ENDIF.                                             
      IF variant IS INITIAL AND
         dy_vari IS INITIAL.
        PERFORM get_default_variant_f14 USING variant.
      ENDIF.
      PERFORM variant_existence_f14 USING variant.
      IF datuv IS INITIAL.
        datuv = sy-datum.
      ENDIF.
      IF datub IS INITIAL.
        datub = sy-datum.
      ENDIF.
      IF sy-ucomm = 'ADDR'.
        PERFORM adress_sel_f01 USING 'EQUIR'.
      ENDIF.
      PERFORM check_parnr_f76.
    *  AT SELECTION SCREEN OUTPUT
    AT SELECTION-SCREEN OUTPUT.
      STATICS: l_slset TYPE sy-slset.
    *--- Set initial variant
      PERFORM variant_init_f14 USING 'INST' 'INST' 'INST' 'RIEQUI20'.
      IF variant IS INITIAL AND
         dy_vari IS INITIAL AND
        gv_variant_flag IS INITIAL.
        PERFORM get_default_variant_f14 USING variant.
        gv_variant_flag = 'X'.
      ENDIF.
    *--- Set Icon for adress-button
      PERFORM set_icon_f01 USING dy_adrfl ad_icon text-ad0 text-ad1.
    *--- get classification data from select option
    *--- (if new variant or if called via submit or F3)
      IF ( l_slset NE sy-slset ) OR
         ( s_comw[] IS NOT INITIAL AND gt_clsd_comw[] IS INITIAL ).
        l_slset = sy-slset.
        gv_class_old = dy_class.
        gv_klart_old = dy_klart.
        PERFORM copy_selopt_comw_f79 TABLES gt_clsd_comw s_comw.
        PERFORM class_search_init_f77 USING 'EQUI'.
      ENDIF.
    *--- set Icon for classification
      LOOP AT gt_clsd_comw TRANSPORTING NO FIELDS          
                          WHERE atcod > '0'.               
        EXIT.                                              
      ENDLOOP.                                             
      IF sy-subrc IS INITIAL.
        gv_comw_flag = 'X'.
      ELSE.
        CLEAR gv_comw_flag.
      ENDIF.
      PERFORM set_icon_f01 USING gv_comw_flag cl_icon text-cl0 text-cl1.
      CALL METHOD cl_uid_cust=>selection_screen_output.
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR variant.
      PERFORM variant_inputhelp_f14 USING variant 'RIEQUI20'.
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR dy_parnr.
      PERFORM f4_for_parnr_f76.
    AT SELECTION-SCREEN ON BLOCK clse.
      IF dy_class NE gv_class_old
        OR dy_klart NE gv_klart_old.
        gv_class_old = dy_class.
        gv_klart_old = dy_klart.
        CLEAR gv_comw_flag.
        REFRESH gt_clsd_comw.
        REFRESH s_comw.
      ENDIF.
      PERFORM class_exist_f77 USING dy_klart dy_class 'DY_CLASS'.
      IF sy-ucomm = 'COMW'.
        CALL FUNCTION 'IHCLSD_VALUATION_POPUP'
          EXPORTING
            i_klart               = dy_klart
            i_class               = dy_class
            i_language            = sy-langu
            i_key_date            = sy-datum
            i_also_subclasses     = dy_subcl
          TABLES
            ct_comw               = gt_clsd_comw
          EXCEPTIONS
            exc_no_class          = 1
            exc_klart_not_allowed = 2.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.
    *--- fill classification data in select option
        PERFORM copy_comw_selopt_f79 TABLES gt_clsd_comw s_comw.
      ENDIF.
      IF sy-ucomm = 'ONLI'.
        sscrfields-ucomm = sy-ucomm.
      ENDIF.
    Regards
    s@k
    Edited by: siemens.a.k on Jan 15, 2010 10:10 AM

  • Calling user defined function in Oracle BI Answers?

    Hi
    I am new in Oracle BI . I want to use the user defined function in Oracle BI Answers as a column,function written in Oracle database to calculate the Sales Revenue.
    I am using Oracle BI Standard Edition One and Oracle 10g database.
    Please suggest me.
    Thanks
    Nusrat

    Search for EVALUATE function you can call function and pass parameters
    Example:
    EVALUATE Function
    This function is intended for scalar and analytic
    calculations.
    Syntax: EVALUATE('DB_Function(%1)', {
    Comma separated Expression})
    Example: SELECT
    e.lastname,sales.revenue,EVALUATE('dense_rank()
    over(order by %1
    )',sales.revenue) FROM sales s, employee e;

  • How to migrate sql server 2000 user defined function returns table

    Hi,
    How do I capture the SQL Server 200 user defined function that returns table? Is this supported in the current version of Oracle Migration Workbench? I am using the latest version - Release 9.2.0.1.0 with SQL SERVER 2000 plug-in.
    I was able to capture the SQL Server 2000 user defined function that returns string and smalldatetime but not the functions return table during the migrate data source stage.
    Thanks in Advance,
    Susan

    Susan,
    This is not currently supported. The next release of the Oracle Migration Workbench (due very soon), will do a better job of catching this mad reporting an error. We are looking into a suitable mapping and have created bug # 2355073 - TABLE DEFINITIONS NOT ACCEPTED FOR TABLE FUNCTIONS to track this issue.
    Once possible solution we are looking into is using the object type to emulate. Here is an example from the bug:
    Original table
    SQL> create table tabela (a number, b number, c number, d number);
    SQL> insert some values...
    SQL> select * from tabela;
    A B C D
    1 1 1 1
    2 2 2 2
    3 3 3 3
    4 4 4 4
    SQL Server 2000 code
    CREATE FUNCTION FUNCRETORNATABELA()
    RETURNS TABLE
    AS
    RETURN SELECT A,B,C,D FROM TABELA
    SELECT A,B,C,D
    FROM FUNCRETORNATABELA()
    ORDER BY A
    Oracle code (workaround)
    SQL> create or replace type MyObjType as object (
    2 a number, b number, c number, d number);
    3 /
    Type created.
    SQL> create or replace type MyTabType as table of MyObjType;
    2 /
    Type created.
    SQL> create or replace function teste return Mytabtype pipelined as
    2 aa MyObjType := MyObjType(null, null, null, null);
    3 cursor c1 is select a,b,c,d from tabela;
    4 begin
    5 open c1;
    6 loop
    7 fetch c1 into aa.a, aa.b, aa.c, aa.d;
    8 exit when c1%NOTFOUND;
    9 pipe row (aa);
    10 end loop;
    11 close c1;
    12 return;
    13 end;
    14 /
    Function created.
    SQL> select * from table(teste);
    A B C D
    1 1 1 1
    2 2 2 2
    3 3 3 3
    4 4 4 4
    SQL> select a, c from table(teste) order by c desc;
    A C
    4 4
    3 3
    2 2
    1 1
    Donal

  • Find the Database where user defined function is ??

    Hi,
      I have one user defined function , but i couldn't find where the function is and where the function is using.. anyone pls help me to overcome this one.
    Thanks

    Hi again,
    This is a combination of both previews response. I used
    Latheesh's script to execute, but since  sys.sql_expression_dependencie contains  information in the current database, therefore I used
    Praveen Rayan idea of using sp_MSforeachdb in order to check all databases (I used sp_MSforeachdb and not sp_foreachdb as I recomend to do usually).
    DECLARE @ObjectName NVARCHAR(100)
    SET @ObjectName = N'Ariely' --Give your function
    Declare @MyQuery NVARCHAR(MAX) = N'
    USE [?]
    SELECT DISTINCT
    SourceSchema = OBJECT_SCHEMA_NAME(sed.referencing_id)
    ,SourceObject = OBJECT_NAME(sed.referencing_id)
    ,ReferencedDB = ISNULL(sre.referenced_database_name, DB_NAME())
    ,ReferencedSchema = ISNULL(sre.referenced_schema_name,
    OBJECT_SCHEMA_NAME(sed.referencing_id))
    ,ReferencedObject = sre.referenced_entity_name
    FROM sys.sql_expression_dependencies sed
    CROSS APPLY sys.dm_sql_referenced_entities(OBJECT_SCHEMA_NAME(sed.referencing_id) + ''.'' + OBJECT_NAME(sed.referencing_id), ''OBJECT'') sre
    WHERE sed.referenced_entity_name like ''%' + @ObjectName + '%'' AND sre.referenced_entity_name like ''%' + @ObjectName + '%''
    PRINT @MyQuery
    EXEC sp_MSforeachdb @MyQuery
    I hope that ths give you what you need :-)
    [Personal Site]  [Blog]  [Facebook]

  • Whether i would write user-defined function convert euro into rupee or USD

    hi expects,
       whether it need to right user defined functions for convert the currency into euro or any other currency  into rupee or USD.as my client is having business in different region.please help me.
    Edited by: santosh kumar sethis on Apr 24, 2008 10:39 AM

    I suggest to use a UDF and call an RFC function\BAPI in the ERP system.
    Currency conversion values  are maintained in the ERP system by the Financial people so you'll have the most updated rates.(maybe even according to the date of purchase)
    So 3 scenarios come to mind:
    1. if the message is send from a 3rd party system or from ERP ,the currency must be converted already in the message,
    2.the RFC of the ERP will do the conversion or you.
    3.Find a currency conversion web service that has parameters of date and currency so you'll do the conversion as accurate as possible.
    bare in mind:
    there might be inconsistency of the money values due to the change in currency from the time the order was placed in the system till the time of entering the SAP .ask for the advise of a financial person so you wont do any mistakes in conversion.
    ANY WAY - don't use hard coded constants in XI mapping for currency conversion.
    Good luck.
    Nimrod

  • Writing user defined function the same way as the oracle functions

    Hi Guys,
    In one of the interviews , I have attended the guy asked me to write a user defined function which will take the column name and list all the values .
    For example
    Table Name:Employees
    Column Name: Employee_Name
    Employee_name
    Scott
    Ivgun
    Jack
    Shane
    The query should be in this fromat
    SELECT col_agg(Employee_name) emp_name from Employees;
    The output shoulld be
    Emp_names
    scott,ivgun,jack,shane
    Please let me know if this is possible
    Any suggestions will be highly appreciated.
    Thanks,
    Ranjan

    You could certainly write a user defined aggregate function if you like...
    e.g. this function will aggregate strings into a CLOB...
    create or replace type clobagg_type as object
      text clob,
      static function ODCIAggregateInitialize(sctx in out clobagg_type) return number,
      member function ODCIAggregateIterate(self in out clobagg_type, value in clob) return number,
      member function ODCIAggregateTerminate(self in clobagg_type, returnvalue out clob, flags in number) return number,
      member function ODCIAggregateMerge(self in out clobagg_type, ctx2 in clobagg_type) return number
    create or replace type body clobagg_type is
      static function ODCIAggregateInitialize(sctx in out clobagg_type) return number is
      begin
        sctx := clobagg_type(null) ;
        return ODCIConst.Success ;
      end;
      member function ODCIAggregateIterate(self in out clobagg_type, value in clob) return number is
      begin
        self.text := self.text || value ;
        return ODCIConst.Success;
      end;
      member function ODCIAggregateTerminate(self in clobagg_type, returnvalue out clob, flags in number) return number is
      begin
        returnValue := self.text;
        return ODCIConst.Success;
      end;
      member function ODCIAggregateMerge(self in out clobagg_type, ctx2 in clobagg_type) return number is
      begin
        self.text := self.text || ctx2.text;
        return ODCIConst.Success;
      end;
    end;
    create or replace function clobagg(input clob) return clob
      deterministic
      parallel_enable
      aggregate using clobagg_type;
    SQL> select trim(',' from clobagg(ename||',')) as enames from emp;
    ENAMES
    SMITH,ALLEN,WARD,JONES,MARTIN,BLAKE,CLARK,SCOTT,KING,TURNER,ADAMS,JAMES,FORD,MILLER
    SQL> ed
    Wrote file afiedt.buf
      1  with t as
      2    (select 'PFL' c1, 0 c2,110 c3 from dual union all
      3     select 'LHL', 0 ,111 from dual union all
      4     select 'PHL', 1, 111 from dual union all
      5     select 'CHL', 2, 111 from dual union all
      6     select 'DHL', 0, 112 from dual union all
      7     select 'VHL', 1, 112 from dual union all
      8     select 'CPHL', 0, 114 from dual union all
      9     select 'WDCL', 1, 114 from dual union all
    10     select 'AHL' ,2 ,114 from dual union all
    11     select 'NFDL', 3, 114 from dual)
    12  --
    13  -- end of test data
    14  --
    15  select trim(clobagg(c1||' ')) as c1, c3
    16  from (select * from t order by c3, c2)
    17  group by c3
    18* order by c3
    SQL> /
    C1                                     C3
    PFL                                   110
    LHL CHL PHL                           111
    DHL VHL                               112
    CPHL AHL NFDL WDCL                    114Ok, it's more than just a function as it uses an object type linking into the internals of the ODCI... but it does what you ask. :)

  • Idoc to cXMLmapping..user defined function help

    hello Everybody,
                              I am new to XI and I am working on a new mapping.  In a nutshell, the requirement is to concat the TDLine of segment E1EDPT2 and map the data to comments of the cXML. The segment E1EDPT2 is segment in E1EDP01( Purchase Order line item segment) This the data that is coming from the vendor text of the SRM system.  This needs to repeat for each line item in the Purchase Order.  I have created a user defined function which concats the TD lines but I am not able to differenciate the tD line for other line items.  Please help.  I would appreciate it if anyone could share the User Defined function which suits my needs.
    Thanks!
    <E1EDP01>  (PO lIne Item 1)
         <E1EDPT1 SEGMENT="1">
              <TDID>F01</TDID>
              <TSSPRAS>E</TSSPRAS>
              <TSSPRAS_ISO>EN</TSSPRAS_ISO>
           <E1EDPT2 SEGMENT="1">
                 <TDLINE>XI mapping test - Newline1</TDLINE>
                 <TDFORMAT>*</TDFORMAT>
           </E1EDPT2>
           <E1EDPT2 SEGMENT="1">
                 <TDLINE>Line1- text2 end</TDLINE>
                 <TDFORMAT>*</TDFORMAT>
           </E1EDPT2>
           <E1EDPT2 SEGMENT="1">
                 <TDLINE>Line1 - text3</TDLINE>
                <TDFORMAT>*</TDFORMAT>
           </E1EDPT2>
         </E1EDPT1>
    </E1EDP01>
    <E1EDP01>  ( PO lien item 2)   
         <E1EDPT1 SEGMENT="1">
              <TDID>F01</TDID>
              <TSSPRAS>E</TSSPRAS>
              <TSSPRAS_ISO>EN</TSSPRAS_ISO>
         <E1EDPT2 SEGMENT="1">
               <TDLINE>XI mapping test - line2</TDLINE>
               <TDFORMAT>*</TDFORMAT>
         </E1EDPT2>
      </E1EDPT1>
    </E1EDP01>

    Hi,
    Please create context UDF which will concatenate all TDLine. Afterwards pass to this function TDLine with changed context to E1EDPT1.
    In this function you need to concat full input array.
    Regards,
    Wojciech

  • Error in conditional map using User Defined Function

    All,
    In my mapping I basically have a user defined function that returns the filename of my inbound file from the adapter-specific message attributes (file adapter).  I know this is coded properly because if I simply assign this function to my destination field I can see the filename in the payload XML.
    However if I conditionally check that returned value using if,then,else I get an error message stating:
    "During the application mapping com/sap/xi/tf/_MaterialData2ZcustProdMastMulti_ a com.sap.aii.utilxi.misc.api.BaseRuntimeException was thrown: RuntimeException in Message-Mapping transformation"
    Essentially in my if I'm checking if the value returned by my user defined function is equal to the constant "SOMECONSTANT" then I'm setting my destination field to some other constant value.  Otherwise it's equal to a different constant value.
    Any thoughts?

    Claus,
    Thanks for the help.  I actually had figured the problem out on my own.  Sorry for not updating the thread sooner.  What happened was this (as I suspected it wasn't related to my user defined function).  For the newbies out there (of which I'm one) the problem was I was comparing strings in the graphical mapping tool using the Boolean "EQUALS" rather than the Text "EQUALSS".
    Can you give yourself points for solving

Maybe you are looking for

  • CR XIr2 and CR 2008 in BOE XI 3.1

    I am looking for a document detailing how to install CR XIr2 and CR 2008 on same client. I need both of these apps to be able to post to BOE XI 3.1 is this possible? How will I be able to tell once a report is published if it is a r2 or a 2008 versio

  • Song Not found

    I have had to delete and reload my entire song-list to iTunes about 7 times now. Randomly, about half of the songs on my iTunes always get that little exclamation point thing next to them and says the song could not be found, and I always have to re-

  • Ringer Sound doesn't work for phone calls.

    I can't get my iPhone 4S sound to work for receiving phone calls.  Sound selected along with vibrate for phone calls.  Miss calls everytime.  Volume turned up and turned on.

  • Read return values in CC Extension Panel

    I am trying to read some information back to a javascript file in a CC extension panel. I am trying this which according to all the samples and documentation should work. >> js/host/main.js var getEnvironment = function(){     var res = "1234";     w

  • I cant restore my ipod touch 2g. First it was error 2005, then 9 and finally it now says error 2009. What can I do?

    Please help me. I have to restore my ipod, for it has frozen. Everytime i hit restore a new erroe appears. First it was 2005, then 9 and finally 2009. What can I do?