How to use rdbms as users data store in a form authentication webapp?

Hi,ALL!
WLS 10.3
This is part of web.xml:
<security-constraint>
     <web-resource-collection>
          <web-resource-name>secureweb</web-resource-name>
          <url-pattern>/secureweb/*</url-pattern>
     </web-resource-collection>
     <auth-constraint>
          <role-name>Users</role-name>
     </auth-constraint>
</security-constraint>
<login-config>
     <auth-method>FORM</auth-method>
     <form-login-config>
          <form-login-page>/login.htm</form-login-page>
          <form-error-page>/login_fail.jsp</form-error-page>
     </form-login-config>
</login-config>
Every time I want to access web page in /secureweb/,it takes me to /login.htm,and when I want to login on from /login.htm,it takes me to /login_fail.jsp,so I think there is nothing wrong with web.xml but WLS's configuration.
There is only one Security Realm called "myrealm" in my domain,and besides the DefaultAuthenticator and DefaultIdentityAsserter,I created a new SQL Authencator called sql_auth in front of them,after that,I created tables(USERS,GROUPS,GROUPMEMBERS) in my Oracle database accordding to the configurations in sql_auth,and insert some user data.
But it never successed when I used the data in the database to test the authentication,it allways go to the /login_fail.jsp page...
What's wrong there?
Best Regards!
Edited by: Linyin.Huang on Jun 18, 2009 5:02 AM

Hello,these are the SQLs from the "provider specific" configuration tab in my SQLAuthenticator,in fact,it's provided by WLS,and I have never modified them:
SQL Get Users Password:SELECT U_PASSWORD FROM USERS WHERE U_NAME = ?
SQL Set User Password:UPDATE USERS SET U_PASSWORD = ? WHERE U_NAME = ?
SQL User Exists:SELECT U_NAME FROM USERS WHERE U_NAME = ?
SQL List Users:SELECT U_NAME FROM USERS WHERE U_NAME LIKE ?
SQL Create User:INSERT INTO USERS VALUES ( ? , ? , ? )
SQL Remove User:DELETE FROM USERS WHERE U_NAME = ?
SQL List Groups:SELECT G_NAME FROM GROUPS WHERE G_NAME LIKE ?
SQL Group Exists:SELECT G_NAME FROM GROUPS WHERE G_NAME = ?
SQL Create Group:INSERT INTO GROUPS VALUES ( ? , ? )
SQL Remove Group:DELETE FROM GROUPS WHERE G_NAME = ?
SQL Is Member:SELECT G_MEMBER FROM GROUPMEMBERS WHERE G_NAME = ? AND G_MEMBER = ?
SQL List Member Groups:SELECT G_NAME FROM GROUPMEMBERS WHERE G_MEMBER = ?
SQL List Group Members:SELECT G_MEMBER FROM GROUPMEMBERS WHERE G_NAME = ? AND G_MEMBER LIKE ?
SQL Remove Group Memberships:DELETE FROM GROUPMEMBERS WHERE G_MEMBER = ? OR G_NAME = ?
SQL Add Member To Group:INSERT INTO GROUPMEMBERS VALUES( ?, ?)
SQL Remove Member From Group:DELETE FROM GROUPMEMBERS WHERE G_NAME = ? AND G_MEMBER = ?
SQL Remove Group Member:DELETE FROM GROUPMEMBERS WHERE G_NAME = ?
SQL Get User Description:SELECT U_DESCRIPTION FROM USERS WHERE U_NAME = ?
SQLSet User Description:UPDATE USERS SET U_DESCRIPTION = ? WHERE U_NAME = ?
SQL Get Group Description:SELECT G_DESCRIPTION FROM GROUPS WHERE G_NAME = ?
SQL Set Group Description:UPDATE GROUPS SET G_DESCRIPTION = ? WHERE G_NAME = ?
And these are the SQLs for creating tables(Oracle 11G):
CREATE TABLE USERS(
U_NAME VARCHAR2(50) PRIMARY KEY,
U_PASSWORD VARCHAR2(50) NOT NULL,
U_DESCRIPTION VARCHAR2(50) NOT NULL);
CREATE TABLE GROUPS(
G_NAME VARCHAR2(50) PRIMARY KEY,
G_DESCRIPTION VARCHAR2(50) NOT NULL);
CREATE TABLE GROUPMEMBERS(
G_NAME VARCHAR2(50) NOT NULL,
G_MEMBER VARCHAR2(50) NOT NULL,
CONSTRAINT PK_GROUPMEMBERS PRIMARY KEY(G_NAME,G_MEMBER));
INSERT INTO USERS(U_NAME,U_PASSWORD,U_DESCRIPTION)VALUES('usera','passworda','userdesa');
INSERT INTO GROUPS(G_NAME,G_DESCRIPTION)VALUES('groupa','groupdesa');
INSERT INTO GROUPMEMBERS(G_NAME,G_MEMBER)VALUES('groupa','usera');
COMMIT;
I still can't see any users or groups in my SQLAuthenticator...
Thank you!
Edited by: Linyin.Huang on Jun 18, 2009 1:39 PM

Similar Messages

  • How to use ADO(Microsoft ActiveX Data Objective 2.8 Library) to execute the store procedure of database in SQL server

    how to use ADO(Microsoft ActiveX Data Objective 2.8 Library) to execute the store procedure of database in SQL server?
    Does any body can tell me about this?
    thanks
    [email protected]

    Hi 
    Did you succeed to execute the procedure?
    How ?
    Thanks
    Shimon Zerbib

  • R/3 User Data store in Portal....?

    Hi All,
    Can anybody tell me what is the necessity of using R/3 as a user data store (UME) in Portal ?
    What are advantages of it over Portal UME ? In what scenarios can we use R/3 as a user datastore in Portal and how can we make well advantage of it ?
    Any help in this regards would be highly appreciated. Full points would be rewarded for usefull answers.
    Regards,
    Anil Kumar

    Hi,
    Imagine a scenario when most users need data only from r/3 what a bother replicating same users again in Portal - Look at it from administration point of view! and role assignment in sap backend , so many issues.
    Consider that you have built a huge list of users, then you add Portal. How tough to keep portal user profile uptodate with backend.
    This is an important reason in my view, single storage of users - optimum use of database space and efficieny and administrative conveniency.
    Regards,
    Harish

  • How to Use Transient View Objects to Store Session-level Global Variables

    hi
    Please consider section "40.8.5 How to Use Transient View Objects to Store Session-level Global Variables"
    at http://download.oracle.com/docs/cd/E14571_01/web.1111/b31974/bcstatemgmt.htm#ADFFD19610
    Based on this documentation I created the example application
    at http://www.consideringred.com/files/oracle/2010/ProgrammaticalViewObjectAndRollbackApp-v0.01.zip
    It behaves as show in the screencast at http://screencast.com/t/qDvSQCgpvYdd
    Its Application Module has a Transient View Object instance "MyEmployeesContextVOVI", as master for the child View Object instance "EmpInCtxJobVI".
    On rollback the Transient View Object instance keeps its row and attribute values.
    Also when passivation and activation is forced (using jbo.ampool.doampooling=false ) the Transient View Object instance seems to keep its row and attribute values.
    questions:
    - (q1) Why does the expression #{bindings.MyEmployeesContextVOVIIterator.dataControl.transactionDirty} evaluate as true when a Transient View Object instance attribute value is changed (as shown in screencast at http://screencast.com/t/qDvSQCgpvYdd )?
    - (q2) What would be a robust approach to make a Transient View Object instance more self-contained, and manage itself to have only one single row (per instance) at all times (and as such removing the dependency on the Application Module prepareSession() as documented in "5. Create an empty row in the view object when a new user begins using the application module.")?
    many thanks
    Jan Vervecken

    Thanks for your reply Frank.
    q1) Does sample 90 help ? http://blogs.oracle.com/smuenchadf/examples/
    Yes, the sample from Steve Muench does help, "90. Avoiding Dirtying the ADF Model Transaction When Transient Attributes are Set [10.1.3] "
    at http://blogs.oracle.com/smuenchadf/examples/#90
    It does point out a difference in marking transactions dirty by different layers of the framework, "... When any attribute's value is changed through an ADFM binding, the ADFM-layer transaction is marked as dirty. ...".
    This can be illustrate with a small change in the example application
    at http://www.consideringred.com/files/oracle/2010/ProgrammaticalViewObjectAndRollbackApp-v0.02.zip
    It now shows the result of both these expressions on the page ...
    #{bindings.MyEmployeesContextVOVIIterator.dataControl.transactionDirty}
    #{bindings.MyEmployeesContextVOVIIterator.dataControl.dataProvider.transaction.dirty}... where one can be true and the other false respectively.
    See also the screencast at http://screencast.com/t/k8vgNqdKgD
    Similar to the sample from Steve Muench, another modification to the example application introduces MyCustomADFBCDataControl
    at http://www.consideringred.com/files/oracle/2010/ProgrammaticalViewObjectAndRollbackApp-v0.03.zip
    public class MyCustomADFBCDataControl
      extends JUApplication
      @Override
      public void setTransactionModified()
        ApplicationModule vApplicationModule = (ApplicationModule)getDataProvider();
        Transaction vTransaction = vApplicationModule.getTransaction();
        if (vTransaction.isDirty())
          super.setTransactionModified();
    }Resulting in what seems to be more consistent/expected transaction (dirty) information,
    see also the screencast at http://screencast.com/t/756yCs1L1
    Any feedback on why the ADF Model layer is so eager to mark a transaction dirty is always welcome.
    Currently, question (q2) remains.
    regards
    Jan

  • How to use the admin user account in reports and dashboards?

    Hi Everyone,
    I want to use the admin user account in report and dashboard connections. But the Hyperion is automatically using the current user's credentials to fetch data.
    Hyperion 11.1.1.1
    Thanks
    Syantan

    This has been posted in the essbase forum > How to use the admin user account in reports and dashboards?
    Cheers
    John
    http://john-goodwin.blogspot.com/

  • How to use Reference type of Data Element

    Hi guys, is there anyone could give me a trace how to use reference type of data element.
    More details i'm going to reach is:
    I create 2 tables:
    eq.
    1. table ZFIRST has field X with data element ZFX (Data element i declared).
    2. table ZSECOND has field Y.
    Here at field Y (second table) I'm going to declare a new data element say it ZFY, but in ZFY I'm going to use the data element as i declared before (ZFX). Is it possible if I do it using reference type data element (SE11)?
    I already did this way, but I got error :
    Field Y: Reference ZFX to class w/o interface cannot be used in DB table ZSECOND
    What does it mean?. Did I miss something about using reference data element type?.
    This error occurs when I activate ZSECOND table. However in creating ZFY (reference) to data element ZFX, there is no error occur.
    The point is I need to RE-declared existing data element and ot put existing data element(ZFX) to my current table (ZSECOND).
    Any helpful will be highly appreciated.
    Thanks.
    Edited by: dinivian dondi on Nov 4, 2010 8:30 AM

    Field Y: Reference ZFX to class w/o interface cannot be used in DB table ZSECOND
    What does it mean?. Did I miss something about using reference data element type?.
    Apparently system doesn't allow you to type a transparent table field with deep type. This refers to references and tables types as components. The RDBMS (Relational DB Management System) cannot interpret this componenets correclty and mapp them to TABLEs in DB.
    So I am affraid you won't be able to type table component with reference to other data element.
    The point is I need to RE-declared existing data element and ot put existing data element(ZFX) to my current table (ZSECOND).
    Sorry but I don't get it, could you please explain this more clearly. Maybe then we can think of some workaround for you.
    Regards
    Marcin

  • Okay so I set up my Time Capsule already and is now backing up 2 of my iMacs. Works great. What I want to know is how to use the TC to directly store files? I want to do this to delete some files but still have them on the TC for future reference..

    Okay so I set up my Time Capsule already and is now backing up 2 of my iMacs. Works great. What I want to know is how to use the TC to directly store files? I want to do this to delete some files on iMac 20inch but still have them on the TC for future reference..eg some movies on iTunes. I want to directly save them on the drive so I can delete them from iTunes and gain some storage. (Ps on iMac 20 inch (it's almost full - 320 GB) when I enter time machine, a tab comes up on finder which reads "Time Machine backups" it's able to be ejected like a disc or a connected device. On the iMac 20 inch, I dragged some files onto there as if using it like a hard drive. Is this the correct method? Then I went to my 27inch iMac and saw the "Time Machine Backups" hoping to see the files I dragged from the 20inch iMac. But the files were not there except a folder that said "Backups.backupdb". Can someone help me?

    It's not a good idea to use a network disk for both Time Machine backups and other things.  By design Time Machine will eventually consume all the space on its output disk, which will then cause problem for your other files.  I'd store those other files on an external disk connected to the Time Capsule.  The problem with that is that Time Machine will only back up files that are local to your Mac.  That means that you'll only have one copy of the files on or attached to your Time Capsule.
    By the way, you've been misled by poor field labeling on this forum into typing a large part of your message into the field intended for the subject.  In the future just type a short summary of your post into that field and type the whole message into the field below that.

  • How to use TRUNC function with dates in Expression Builder in OBIEE.

    Hi There,
    How to use TRUNC function with dates in Expression Builder in OBIEE.
    TRUNC (SYSDATE, 'MM') returns '07/01/2010' where sysdate is '07/15/2010' in SQL. I need to use the same thing in expression builder in BMM layer logical column.
    Thanks in advance

    use this instead:
    TIMESTAMPADD(SQL_TSI_DAY, ( DAYOFMONTH(CURRENT_DATE) * -1) + 1, CURRENT_DATE)

  • How to use clob or blob data type in OWB

    how to use clob or blob data type in OWB?
    if OWB not surport these data type,how can i extract the large data type from data source

    The same question was asked just two days ago No Data Found: ORA-22992
    Nikolai Rochnik

  • Hello !  pls give some ti[ps how to use bapi's for data uploading?

    hello !
      pls give some ti[ps how to use bapi's for data uploading?
    regards,
    Arjun

    Hi,
    See the below report extract:
    where it_data is having uploaded data.
    LOOP AT<b> it_data</b> INTO wa_data.
        line_count = sy-tabix.
        "Date Validation
        CONCATENATE wa_data-uplft_date4(4) wa_data-uplft_date2(2) wa_data-uplft_date+0(2)
        INTO wa_data-uplft_date.
        "READ TABLE it_ekko INTO wa_ekko WITH KEY lifnr = wa_data-vendor.
        LOOP AT it_ekko_temp INTO wa_ekko_temp WHERE lifnr = wa_data-vendor.
          IF wa_ekko_temp-kdatb <= wa_data-uplft_date AND wa_ekko_temp-kdate >= wa_data-uplft_date.
            MOVE-CORRESPONDING wa_ekko_temp TO wa_ekko.
            APPEND wa_ekko TO it_ekko.
          ENDIF.
        ENDLOOP.
        "IF sy-subrc = 0 AND wa_ekko-kdatb <= wa_data-uplft_date AND wa_ekko-kdate >= wa_data-uplft_date.
        LOOP AT it_ekko INTO wa_ekko.
          wa_data_header-pstng_date = wa_data-uplft_date.
          wa_data_header-doc_date = sy-datum.
          wa_data_header-bill_of_lading = wa_data-bill_of_lad.
          wa_data_header-ref_doc_no = wa_data-del_no.
          CONCATENATE wa_data-header_text1 '-'
                      wa_data-header_text2 '-'
                      wa_data-header_text3 '-'
                      wa_data-header_text4
                      into wa_data_header-HEADER_TXT.
          IF wa_data-indicator = 'Y'.
            wa_data_item-material = '000000000000200568'.
          ELSE.
            wa_data_item-material = '000000000000200566'.
          ENDIF.
          LOOP AT it_ekpo INTO wa_ekpo WHERE ebeln = wa_ekko-ebeln AND matnr = wa_data_item-material.
            "Collect Item Level Data
            wa_data_item-plant = '1000'.
            wa_data_item-stge_loc = '1001'.
            wa_data_item-move_type = '101'.
            wa_data_item-vendor = wa_data-vendor.
            wa_data-qnty = wa_data-qnty / 1000.
            wa_data_item-entry_qnt = wa_data-qnty.
            wa_data_item-po_pr_qnt = wa_data-qnty.
            wa_data_item-entry_uom = 'KL'.
            wa_data_item-entry_uom_iso = 'KL'.
            wa_data_item-orderpr_un = 'KL'.
            wa_data_item-orderpr_un_iso = 'KL'.
            wa_data_item-no_more_gr = 'X'.
            wa_data_item-po_number = wa_ekpo-ebeln.
            wa_data_item-po_item = wa_ekpo-ebelp.
            wa_data_item-unload_pt = wa_data-unload_pt.
            wa_data_item-mvt_ind = 'B'.
            APPEND wa_data_item TO it_data_item.
            CLEAR wa_data_item.
          ENDLOOP.
          CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
            EXPORTING
              goodsmvt_header = wa_data_header
              goodsmvt_code   = goodsmvt_code
              testrun         = 'X'
            TABLES
              goodsmvt_item   = it_data_item
              return          = return.
          READ TABLE return INTO wa_return WITH KEY type = 'S'.
          IF sy-subrc <> 0.
            DESCRIBE TABLE return LINES sy-tfill.
            IF sy-tfill = 0.
              CALL FUNCTION <b>'BAPI_GOODSMVT_CREATE'</b>   
            EXPORTING
                  goodsmvt_header = wa_data_header
                  goodsmvt_code   = goodsmvt_code
                  testrun         = ' '
                TABLES
                  goodsmvt_item   = it_data_item
                  return          = return.
              CALL FUNCTION <b>'BAPI_TRANSACTION_COMMIT'</b>
               EXPORTING
                 WAIT          = 'X'
              IMPORTING
                RETURN        =
            ENDIF.
          ENDIF.
          LOOP AT return INTO wa_return.
            WRITE: 'Messsage TYPE  ', wa_return-type,
                  /,'ID  ', wa_return-id,
                  /, 'Number  ', wa_return-number,
                  /, 'Message  ', wa_return-message,
                  /, 'Long Text  ', wa_return-message_v1,
                                    wa_return-message_v2,
                                    wa_return-message_v3,
                                    wa_return-message_v4,
                 /, 'Failed at line', line_count.
          ENDLOOP.
          CLEAR: wa_ekko, wa_ekpo, wa_data, it_data_item[], wa_data_header.
        ENDLOOP.
    Reward if useful!

  • How to use touchpad to sign electronic signature on website form?

    how to use touchpad to sign electronic signature on website form?

    website is related to personal information i am completing for new job (background check). You will not be able to access site they provided user name/password. After completing the form the instructions are to hold left button on mouse in my case trackpad and sign the form ..no luck. I added microsoft mouse as another alternative to trackpad still no luck. Apple support is closed today. Any help is appreciated.

  • How to use stack canvas in tab canvas in oracle forms

    hi all,
    how to use stack canvas in tab canvas in oracle forms. please if any one help out in this.

    Hi
    u can simply create a button in ur tab canvas in this button pls write the following as an example...
    SHOW_VIEW('STACKED_CANVAS');
    GO_ITEM ('SAL'); -- Pls note this item should be navigable and visible in ur stacked canvas form
    HIDE_VIEW('TAB_CANVAS');In order to return back to ur tab_canvas pls create a button in this button pls write the following...
    HIDE_VIEW('STACKED_CANVAS');
    SHOW_VIEW('TAB_CANVAS');
    GO_BLOCK('EMP');
    GO_ITEM ('EMPNO'); -- Pls note this item should be navigable and visible in ur stacked canvas form
    Hope this helps...
    Regards,
    Abdetu...

  • What do you recommend to use as an offline data store, since SQL CE support is not in VS 2013?

    A few years back I was architecting an occasionally connected .Net desktop application. 
    VS 2010 was offering full support for Microsoft Sync Framework and SQL CE with Entity Framework. 
    This seemed like the perfect marriage, so I ran with it, and the resulting software solution is still successfully running in production, years later. 
    Jump forward to today, and I am architecting a new occasionally connected .Net desktop application. 
    I was really looking forward to taking advantage of the advances made by Microsoft in using the tools built into VS 2013. 
    However, what I discovered has dumbfounded me.  VS 2013 has no designer support for Sync Framework, and worse, built in support for SQL CE has been completely removed, including the ability to generate Entity Framework models from a
    CE database using the designer. 
    My question to the community is, what tools should I be using to solve the problem of offline storage in my brand new .Net application? 
    I am aware of ErikEJ’s SQL Server Compact Toolbox, which brings back some support for these features in VS 2013, but it is not as fully featured as the VS 2010 native support was, plus it does not have the institutional “Microsoft” stamp on it. 
    I am building a multimillion dollar corporate solution that I will have to support for many years.
     I would like to have some comfort that the technologies I select, today, will still be supported 5 years from now, unlike the way Microsoft has discontinued supporting Sync Framework and CE in the most recent VS. 
    I can accept open source technologies, because there is a community behind them, or off the shelf corporate solutions, since they will be driven by financial gain, but I have trouble committing to a solution that is solely supported by an individual,
    even if that person is a very talented Microsoft MVP.
    Some of the features of SQL CE that I would like to keep are
    Built in encryption of the file on disk
    Easy querying with an ORM, like Entity Framework
    Tools to easily sync up the offline data store with values from SQL Server (even better if this can be done remotely, such as over WCF)
    Does not require installation of additional software on the client machine, as SQL Express would
    Please, provide your feedback to let me know how you have achieved this, without resorting to simply using an older version of VS or Management Studio. 
    Thank you.

    Hello,
    Based on your description, you can try to use SQL Server 2012 Express LocalDB.
    LocalDB is created specifically for developers. It is very easy to install and requires no management, but it offers the same T-SQL language, programming surface and client-side providers as the regular SQL Server Express.
    SQL Server LocalDB can work with Entity Framework and ADO.NET Syc Framework. However, there is no built-in encryption feature in LocalDB which
    can let you encrypt database. You should decrypt/encrypt data on your own, for example, using
    Cryptographic Functions
    Reference:SQL Express v LocalDB v SQL Compact Edition
    Regards,
    Fanny Liu
    If you have any feedback on our support, please click here.
    Fanny Liu
    TechNet Community Support

  • How to Auto-Populate a User Data Picker?

    I understand how User Data Pickers work (mostly).  We have used them during the shell creation process to allow the creator to specify which users may access the shell and in what user groups they will be placed.  This works fine— as the shell is created, these users are added and assigned to their respective groups.
    From the documentation, User Data Pickers are supposed to support auto-population, but the system does not allow me to select a suitable source from which to pull.  For example, the shell attribute form contains a User Data Picker that contains the name of the PM that was assigned to the shell.  Say I have a BP in that shell on which I want the PM’s name to appear.  I’m thinking I would place a User Data Picker on the BP and auto-populate that field from the shell attribute user data picker, but uDesigner doesn’t allow the attribute form as source as it does for other DE types.  This is important as this field, the PM’s name, must be located on the BP if I’m to use it in a LiveCycle report.
    Short of having the user select the name again within the BP, how do I pass the names of shell members that were selected during shell creation using User Data Pickers?
    Thanks.

    That works!  Thanks Rich for clarifying your above posts with the screenshots. 
    Rich’s solution as it worked for me:
    1.  Add a User Data Picker to the shell attribute form.
    2.  Add a DE of DD SYS Medium Name to the shell attribute form.  The DD type appears critical here and was my mistake in the past.
    3.  Auto-populate the DE created in step 2: Source Name-->Data Picker; Source Element-->uuu_user_name (in this case).
    4.  On the BP, place the same DE as step 2 and auto-populate (or link) it to the same DE on the shell attribute form.
    What I didn’t expect:
    1. User Data Pickers on BPs cannot reference User Data Pickers on shell attribute forms.  Why do we need additional fields to link two other fields of the same type?
    2. In operation the auto-populate, setup in step 3 above, occurs immediately as if it were a formula instead of just populating upon the shell creation stup as it would on BP creation.

  • How to use subroutine in user-exit program

    Hi Experts,
        I have a requirement in user-exit where i have to use some lines of code in several times. So i want to use Perform and perform inside the exit (i.e. Include ZXXX). But it is not recognizing the form part of the ubroutime and gives error.
                 Please let me know how to use the Perform and form statement in the exit or is there any way to  write repeated code once but used no of times in exit program.
    Thanks
    Ajit

    I'm sorry, I was overly harsh there. Please accept my apologies.  But I do despair sometime!
    Consider the structure of a function group and it should be clear - you need to remember that INCLUDES are just repositories of code. If you take the contents out of the include and put them into the main program, then this is what you get:
    function-pool xrsr.        
    * Global data definition.
    function exit_saplrrs0_001.
    * the source code within the zxrsru01 include.
    endfunction.
    Now, what you're trying to do, is create a form in your include. You can't do that, because you end up with:
    function-pool xrsr.        
    * Global data definition.
    function exit_saplrrs0_001.
      perform xyz.
      form xyz.
      endform.
    endfunction.
    And you can't have a FORM defined inside a function module definition. The solution is to put it outside the function module. If you follow the process suggested above, you end up with
    function-pool xrsr.        
    * Global data definition.
    function exit_saplrrs0_001.
      perform xyz.
    endfunction.
    form xyz. " This will be in LXRSRF01
    endform.
    Do you see how it works now?

Maybe you are looking for