Value contract with overall value and material list

Hi
I want to use value contract in CRM.
Is there is any option except using product range/assortment to maintain list of materials and overall value for the contract?

Hi,
follow this link
http://help.sap.com/saphelp_46c/helpdata/en/75/ee0f4055c811d189900000e8322d00/content.htm
You will get the idea about item category W in value contract (WK )
and also about the price conditions in item and header level.
Edited by: redriver on Nov 28, 2011 6:31 AM

Similar Messages

  • Purchase Order and Contract - controlling overall value

    Our process has the following steps - The total amount in the order to the vendor is fixed. Indivdual services have rates fixed, but quantities are not fixed ie, the quantity can vary from 0 to any upper number subject to the overall value of the order. I tried the following:
    Created a contract (ME31K) with the services and rates entered (quantity kept as 1). Overall value entered as the contract limit. PO created (ME21N) and Contract details and overall limits entered. Service items adopted from the contract and the 'No Limit' box checked for individual services. All service quantities maintained as 1 no, rates copied from contract.
    With this my expectation was that the system will allow multuiple service entry sheets for each of the services upto the limit specified by the contract. However the system allowed Service Entry for value exceeding the overall limit of the contract.
    What other configuration needs to be done to make sure that beyond the overall value limit, system does not allow service entry.
    Thanks in advance for your help
    Deepak

    You say that
    1. you have created the contract with overall service limits.
    2. you now referred this contract and created the PO
    PO created (ME21N) and Contract details and overall limits entered. Service items adopted from the contract and the 'No Limit' box checked for individual services. All service quantities maintained as 1 no, rates copied from contract.
    Please remove the No limit check and keep only the value in contract limits. The system would then force you to enter the additional value in unplanned services during SES creation. The same applies when you are using Other Limits (Mentioned limit in other Limits tab in PO creation)
    If it does not work, check message settings for message # SE 347, 364, 365 & 366.
    If it still does not work, please open an OSS message to SAP.
    Thanks & regards
    AHP

  • PO Line Item wise gross value for combination of WBS and Material Group

    Hello,
    Our requirement is to get report for PO Line Item wise gross value for combination of WBS and Material Group. Standard report ME2J gives net price but not gross value for Material Line items. Please let me know if any standard report( or ME2J) will suffice this requirement.
    Regards,
    Milind Dumbre

    Dear Milind
    No standard report available to get the PO Line Item wise gross value for combination of WBS and Material Group. Please go for development by taking reference ME2J.
    Warm regards
    Ramakrishna

  • How to create a contract with one supplier and two dealers?

    Hi Gurus,
    I have a contract with a supplier (eg. Apple), but the products and services are supplied by two dealers.
    The supplier is the manufacturer and with whom the negotiation of prices is made.
    The dealers are those who make the delivery of the products and services and who the payment is done.
    How can I create a contract with these characteristics in SRM 7.0?
    I don't want to create two contracts with same products and services for two suppliers (Dealer_1 and Dealer_2).
    How can this be handled through business partner type "Vendor"?
    In "Partner" section in "Header" --> "Basic data", I can only add 1 vendor.
    The system is:
    Component software: SRM_SERVER
    Release: 700
    Level: 0008
    Support package: SAPKIBKV08
    Thanks in advance and best regards,
    Alonso Valenzuela

    Hi Wadim,
    I have a similar requirement to create order lines in an existing contract with reference using  BAPI_CUSTOMERCONTRACT_CHANGE.  The order lines get created in the contract. However, the condition types from the order line which i'm referencing are not getting referenced and are not getting added in the Contract's line after referencing.
    Did you come across any such issue ? If yes , could you suggest the solution ?
    Regards,
    Venkat.

  • Value Contract with dummy material.

    I want to create a contract with Dummy material for a certain value of amount then want to create release orders for other materials with reference to this contract.
    For example - I want to enter into a contract with a customer for amount £10000 for a period 1 year let's say for Any Electrical equipements.
    and with reference to this contract I want to release 5-10 materails which I am not sure any material which will be required by customer.
    The reference should be made with this contract and values from release order billed to customer needs to be updated to the contract
    - The requirement is that a dummy material is entered at contract with certain amount in place of actual consumable materials in release order.
    Kindly help
    Thanks & best regards
    Atree

    Hi Atree,
    it is not necessary a dummy material
    use assortment module WS01 for the list of materials you need in contract and add the assortment to the contract
    Thanks,
    Zoltan.

  • Width/height/x/y value mismatch with the reality and what is coded

    hello there everyone,
    hope i got the title right..,
    so here goes the problem i need your opinion and help to solve:
    application definition:
    i have this desktop flash application that will go fullscreen what this application do is loading external asset (mostlySWF) and play it inside this application. Each external asset will be place inside a container/holder (empty movie clip created by code), each of this container have it's own dimension ( width, height, x, y).my code all working without any warning nor error.oh and i also have an image.jpg/png as it's background and place at the bottom of display list (depth = 0), the image is customly made with using photoshop and each container location and dimension also measured there so it just needed to be writen down is the XML file..,
    the problem:
    the bug is when i loaded some image of those background image each container width,height,x,y  will mismatch with what i have in the XML file.
    the funny thing is when i trace the value of each container width,height,x,y it value is the same with what the XML has yet by seeing with eye you know that is wrong..,
    here's the code i used:
    var myXML:XML; //to hold the loaded xml file
    var SWFList:XMLList; //used to hold a list of all external swf source,atribute and etc
    var xmlLoader:URLLoader = new URLLoader(); //intance of URLloader class used to XML file
    var totalSWF:int; //hold the total number of external swf there is to be loaded
    var mainContainer:MovieClip =new MovieClip();//act as the main container
    var SWFContainer:MovieClip; //hold the loaded SWF as it's child
    var swfLoader:Loader; //instance of loader class used to load the external swf
    var myCounter:int = 0; //used to track how many external swf has been loaded and added to stage
    var bgImageURL:String;//hold the url of the background image
    var imageLoader:Loader;//intance of loader class used to load background image
    // Stage Setting
    //========================================================================================
    this.stage.align = StageAlign.TOP_LEFT;
    this.stage.scaleMode = StageScaleMode.NO_SCALE ;
    this.stage.displayState = StageDisplayState.FULL_SCREEN;
    //load the xml file
    //======================================================================================== ==
    xmlLoader.load(new URLRequest("FlashBlock[s].xml"));
    xmlLoader.addEventListener(Event.COMPLETE, processXML);
    function processXML(e:Event):void
        e.target.removeEventListener(Event.COMPLETE , processXML);
        myXML = new XML(e.target.data);
        bgImageURL = myXML.Background.text();
        SWFList = myXML.BLOCK;
        totalSWF = myXML.BLOCK.length();   
        doSizeUpMainContainer();
        loadBackgroundImage();
    function doSizeUpMainContainer():void
        //resizing the mainContainer dimension
        //in this case i just make the size the same as the screen dimension
        addChild(mainContainer);
        mainContainer.graphics.beginFill(0xFD562D, 0);
        mainContainer.graphics.drawRect(0,0, stage.stageWidth, stage.stageHeight);
        mainContainer.graphics.endFill();
    function loadBackgroundImage():void
        //load the background image
        imageLoader = new Loader();
        imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBgImageLoadComplete);
        imageLoader.load(new URLRequest(bgImageURL));
    function onBgImageLoadComplete(e:Event):void
        e.target.removeEventListener(Event.COMPLETE, onBgImageLoadComplete);
        mainContainer.addChild(imageLoader.content);
        imageLoader.x = (stage.stageWidth - imageLoader.content.width)/2;
        imageLoader.y = (stage.stageHeight - imageLoader.content.height)/2;
        loadSWF();
    function loadSWF():void
        swfLoader = new Loader();
        swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE , swfSetting);
        swfLoader.load(new URLRequest(SWFList[myCounter].@source));
    function swfSetting(e:Event):void
        e.target.removeEventListener(Event.COMPLETE , swfSetting);
       SWFContainer = new MovieClip();
        mainContainer.addChild(SWFContainer);
        // i did this so i can resize the movieclip size to what i need..,
        SWFContainer.graphics.beginFill(0xff6633, 0);
        SWFContainer.graphics.drawRect(0,0, Number(SWFList[myCounter].@width), Number(SWFList[myCounter].@height));
        SWFContainer.graphics.endFill();
        SWFContainer.x = SWFList[myCounter].@left;
        SWFContainer.y = SWFList[myCounter].@top;
        SWFContainer.addChild(e.target.content);
        //load and add another SWFContainer untill all swf listed in the swf added
        if(myCounter < (totalSWF-1))
            myCounter++;
            swfLoader = null;
            loadSWF();
    i really do not have any idea why this could happen and how to solve it..,
    any help would be greatly apprecited cause i'm literally meeting a dead end with this bug..,

    hello there kglad,
    thanks for responding in this thread..,
    i did what you told me :
    i did check all of my loader instance till myLoader.parent.parent.parent and it return 1 for every single one of them
    but by removiing the "this.stage.displayState = StageDisplayState.FULL_SCREEN;"
    i do get new error which is:
    TypeError: Error #1009: Cannot access a property or method of a null object reference.
        at slideshow_fla::MainTimeline/doAspectRatio()
    well from what it tokd me it came from my slideshow swf..,(this swf also fully code and has nothing placed on stage by manually)
    the thing is in my mine swf code i never refer to what external asset property, i just told to load it and when the load is complete i put it in the display list..,
    from googling i suspect that it played to early beacause i put the script in the first frame of the timeline of slideshow.swf
    and for the moment i'm trying to find what error do cause it..,
    (but why this didn't happen all the time??)
    here is the slideshow code:
    import fl.transitions.*;
    import fl.transitions.easing.*;
    import flash.display.*
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    //list of global variables
    var mySlideSpeed:Number; //determine how long each image displayed
    var myTransitionName:String; //the name of the transition to be used
    var myxmlList : XMLList;//reference to the list of the image
    var myTotal:int;     //total of image to be displayed
    var myImage:Loader;//load the image into the container
    var tempWidth:int;
    var tempHeight:int;
    var myTraansitionInDuration:int = 2;//the duration of transition in effect
    var myTraansitionOutDuration:int = 2;//the duration of transition out effect
    var myThumbHolderArray : Array = [];//to hold each thumbimage of the image
    var Counter : Number = 0; //to count how many image has been successfully loaded
    var myMC : MovieClip = new MovieClip(); //as the container of the picture so that it can be manipulated with transition manager
    var container: MovieClip = new MovieClip();//hold the image after transition
    var myImageTracker :Number = 0; //to know which image is in the stage
    var myTimer :Timer; //the timer
    var myTM:TransitionManager = new TransitionManager(myMC);//instance of transitionmanager class;used to give transition effect the image
    //creating the loader instance n loading the file
        var myXML:XML;
        var XMLLoader :URLLoader = new URLLoader();
        XMLLoader.addEventListener(Event.COMPLETE, processXML);
        var base:String = this.root.loaderInfo.url;
        base = base.substr(0, base.lastIndexOf("/") + 1);
        XMLLoader.load(new URLRequest(base + "slideshow.xml"));
    function processXML(e:Event):void
        e.target.removeEventListener(Event.COMPLETE, processXML);
        XML.ignoreWhitespace = true;
        myXML =new XML(e.target.data) ;
        mySlideSpeed = Number(myXML.transition.@slidespeed) + myTraansitionInDuration + myTraansitionOutDuration ;
        myTimer = new Timer (mySlideSpeed*1000);
        myTimer.addEventListener(TimerEvent.TIMER, imageRemover);
        myTransitionName = myXML.transition.@name;
        myxmlList = myXML.IMAGE;
        myTotal = myXML.IMAGE.length();
        imageLoader();
    function imageLoader():void
        for (var i:Number = 0; i < myTotal; i++)
            var imageURL:String = base + myxmlList[i];
            var myLoader:Loader = new Loader();
            myLoader.load(new URLRequest(imageURL));
            myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete)
            //transfering each thumb image loaded to a variable to be able to be refered back when the show is running
            myThumbHolderArray.push(myLoader);
    function onComplete(e:Event):void
        Counter ++;
        if(Counter == myTotal)
            e.target.removeEventListener(Event.COMPLETE, onComplete);
            showStarter();
    function showStarter():void
            addChild(container);
            addChild(myMC);
    //        myMC.x = container.x = myMC.y = container.x = 0;
            doAspectRatio();
            imageSlider();
    function doAspectRatio():void
        for (var i:Number = 0; i < myTotal; i++)
            myImage = Loader (myThumbHolderArray[i]);
            if (myImage.width > myImage.height)
                tempWidth = myImage.width;
                tempHeight = myImage.height;
                //supposedly to access the container dimension holding this swf as it's child
                myImage.width = this.parent.width;
                myImage.height = (tempHeight * this.parent.height)/tempWidth ;
            else if (myImage.width < myImage.height)
                tempWidth = myImage.width;
                tempHeight = myImage.height;
                myImage.height = this.parent.height;
                myImage.width = (tempWidth * this.parent.width)/tempHeight ;
    function imageSlider():void
        if (getChildIndex(container)== 1)
            swapChildren(myMC, container);
        myImage = Loader (myThumbHolderArray[myImageTracker]);
        myMC.addChild(myImage);
        //center the image
        myImage.x = (this.parent.width - myImage.width)/2;
        myImage.y = (this.parent.height - myImage.height)/2;
        if (myTransitionName == 'Fly')
            myTM.startTransition({type:Fly, direction:Transition.IN, duration:myTraansitionInDuration, easing:None.easeIn, startPoint:7});
        else
        if (myTransitionName == 'Zoom')
            myTM.startTransition({type:Zoom, direction:Transition.IN, duration:myTraansitionInDuration, easing:Strong.easeIn});
        else
        if (myTransitionName == 'Photo')
            myTM.startTransition({type:Photo, direction:Transition.IN, duration:myTraansitionInDuration, easing:None.easeIn});
        else
        if (myTransitionName == 'Squeeze')
            myTM.startTransition({type:Squeeze, direction:Transition.IN, duration:myTraansitionInDuration, easing:Strong.easeIn, dimension:0});
        else
            myTM.startTransition({type:Fade, direction:Transition.IN, duration:myTraansitionInDuration, easing:Strong.easeIn});
        myTM.addEventListener("allTransitionsInDone", holdDelay);
    function holdDelay(e:Event):void
        this.removeEventListener("allTransitionsInDone", holdDelay);
        myTimer.start();
        container.addChild(myImage);
        if (getChildIndex(myMC)== 1)
            swapChildren(container, myMC);
    function imageRemover(e:Event):void
        myImageTracker ++;
        if (myImageTracker == myTotal)
            myImageTracker =0;
        imageSlider();
    and by the way can you tell me the reason you told me to remove "this.stage.displayState = StageDisplayState.FULL_SCREEN;" line ??

  • Value contract with multiple P.Rs

    Dear Gurus
    Please suggest
    I need to create value contract for  1200 corode, with reference to P.R.  Here i am unable to create P.R for the same amount because system not allowing me to enter more than 10 digits,
    i was trying to create multiple line items with same material code that also not allowing.
    finally i decided to create multiple P.Rs, each P.R for 99 corode.
    Is there any provision to adopt multiple P.Rs for Value contract, otherwise please suggest any other way.
    Best regards
    srinivas.

    I dint receive the answer i am closing this issue.

  • Audigy 2 Value - Trouble with Newest Drivers and Equali

    Just got my Audigy 2 Value yesterday. I know its an old model, but I found a new one for a bargain price. Anyway, I initially installed everything from the CD. The driver installed along with the mixer, equalizer, Creative console, etc... When I realized how old the driver was on the CD (2004) I uninstall it, wiped everything clean with DriverCleaner and installed the newest drivers for Audigy (July 08). I discovered the ones on the website don't include all the various applications such as the mixer and equalizer. Just an basic version of the creative console.
    I browsed the CD and installed just the apps I wanted -Mixer, Equalizer,Speaker Settings and Calibrator and Diagnostics. They all work fine save for the Equalizer. It just closes with an error message. Its not the most critical piece - the mixer is where I can at least adjust the bass and treble - but I would like to have it if possible.
    Any ideas on getting the Equalizer to run with Windows XP and the newest Audigy drivers Are there any up-to-date downloads available on the Creative website with all the CD applications? The fact they are four years old vs. a new driver is most likely the problem. I did not install any of the Creative MediaSource applications. Just wanted the driver only. Would the lastest downloads for them possible have all those apps in current form (or are the install CD ones all I can get)? Thanks for you help!

    BJ,
    You can check the product information system requirement from the product page.
    http://us.creative.com/products/product.asp?category=&subcategory=204&product=0653 &nav=systemRequirements
    Jason

  • Data Migration of Contracts with periodic billing and revenue recognition

    Hello Experts,
    I am trying to develop a legacy data migration plan for Contracts with periodic billing plan and revenue recognition.
    Example of the scenario is given below:
    Customer signed a contract for one year starting 01/01/2009.
    Customer is billed quartely, billed in advance.
    SAP going live on 04/01/2009
    Customer is billed for 3 months and also for initial set up fees.
    Revenue recognition is done monthly.
    We have to migrate this contract to SAP.
    Billing document posting may be necessay as it affects revenue recognition which spans across the total contract period.
    Any ideas how to do this?
    Thanks  A Lot
    Anil
    Edited by: Anil  Jose on Sep 17, 2008 9:38 PM

    Hi Anil
    How did you manage this? We also had the same problem in one of our contracts and what we did was that we copied the contracts from the legacy with the full value. That is suppose SAP went live on 1st April, 2009 and the contract was created on 1st January 2009 for a value of suppose 100 USD, with the first billing being done on 1st Jan for 33.33 USD for 4 months. We first created the contract with a validity from 1st Jan 2009 in the new system. We billed it with a billing type that we created that did not actually create new accounting entries as the accounting entries had already been created in the legacy system. In the new system then we recognised the revenue till the go live, so that the actual value remaining of the contract reduced. Then we started the billing plan of the contract from 1st of April 2009 for the remaining amount. So next invoice was created on 1st april for 33.33 USD. Can you share your solution.
    Regards
    Indranill

  • API to create value set with attribute values ?

    Hi
    I was hoping someone might be able to help with this question.
    I am creating a series of value set values using fnd_flex_val_api.create_independent_vset_value and fnd_flex_val_api.create_dependent_vset_value as part of a migration.
    These APIs do not allow you to pass in attribute column values.
    How can you create a value set value which has attribute values populated ? Is there another API does anyone know ?
    Thanks a lot
    Scott

    All APIs are listed in Oracle Integration Repository
    http://irep.oracle.com/index.html
    API User Notes - HTML Format [ID 236937.1]
    R12.0.[3-4] : Oracle Install Base Api / Open Interface Setup Test [ID 427566.1]
    Oracle Trading Community Architecture API User Notes, June 2003 [ID 241320.1]
    Technical Uses of Customer Interface and TCA-API [ID 269121.1]
    Pelase also check below:
    Api's in EBS
    Re: Api's in EBS
    http://sairamgoudmalla.blogspot.com/2009/05/script-to-find-oracle-apis-for-any.html
    API
    Fixed Asset API
    List of API
    Re: List of APIs
    Oracle Common Application Components API Reference Guide
    download.oracle.com/docs/cd/B25284_01/current/acrobat/jta115api.pdf
    List of APIs and open interface R12
    Re: List of APIs and open interface R12
    Regard
    Helios

  • Report for Customer and Material list

    Dear Experts,
      Is there any Std. reprot to list all customers under particular sales org and also the material for each customer deals with.
      Input only sales org.
    Please advise,
    Regards,
    Siva

    hi,
    Go for MCTA report ....anter the sales org as the criteria and get the out put .
    You need to drill down til last to get the material list.
    hope this will help you !!
    Rgards,
    Krishna O

  • Task Total Slack Calculated values mismatching with the values in reporting database

    Hi,
    We require 'Task Total Slack' as one of the items in a report for Project Server 2010. We're developing the reports using SSRS wherein the SQL Queries are fired on the reporting database of Project Server 2010.
    We've come across a situation wherein the total slack values from reporting database for tasks are mismatching with the values that are seen in either PWA or Project Professional for total slack field. We also could not find a consistent factor by which
    the slack is multiplied for reflecting in the database in case the Slack in days was being converted into Hours in reporting databse.
    Is there a definite way that these values are being represented in reporting database which is quite different from the way these values are seen in Project Professional? Please help resolving this issue.

    Hi Abhijit PS,
    Can you give an example of the mismatch? Also you could tell us if this is happening for all tasks and all projects. Your concern may be seen from 2 different points of view:
    Either this is indeed a bug with a slack of 2 days for example in Project Pro and 4 days in your report from the reporting DB. In this case, you should check if the projects have been published correctly and if the Reporting DB is correctly sync'ed with
    the draft DB.
    Or it could be the normal behavior and it is just a matter of finding why. For example, the durations are stored in the DB in minutes, meaning that a 1day duration might be stored as 480 if you have 8 working hours in a day (8*60).
    Hope this helps,
    Guillaume Rouyre, MBA, MVP, P-Seller |

  • PO with both service and material

    Dear all
    Can anyone give a structure of PO which invoves both Service and Material component and both are inseperable.
    Service tax is applicable on service portion and VAT is applicable on material.
    Thanks in advance

    hi,
    As per your requirement create PO with 2 line items
    Line Item 10  for service : item cat D, a/assignment K , material group etc
    select service master or text (at service details tab in item level)
    select relevant tax code with service tax. (invoice tab)
    line item 20
    here enter material master, price, plant etc.
    select appropriate tax code with VAT ( invoice tab)
    save
    say PO created 4500018024
    Now When you receive the service perform service entry sheet (ML81N) for 4500018024 item 10
    accept and save
    When you receive the material perform MIGO for 4500018024 item 20
    finally when you got the invoice
    Perform MIRO against PO no ( no need to enter item ) and select Goods/Service items
    It will select both line item simulate and post
    and if you want to Perform MIRO separately then
    in MIRO enter 4500018024 item 10
    and then 4500018024 item 20.
    that's it

  • Collect in an internal table with keys plant and material

    Hi ,
    I have an output internal table with material , plant and var quantitites .
    I would like to use Collect statement and sum the quantities but do it by plant and material .
    How do I specify that i want to do it on plant or material ?
    Thanks !

    hi here is an example like urs..
    DATA: BEGIN OF seats,
            carrid TYPE sflight-carrid,
            connid TYPE sflight-connid,
            seatsocc TYPE sflight-seatsocc,
          END OF seats.
    DATA seats_tab LIKE HASHED TABLE OF seats
                   WITH UNIQUE KEY carrid connid.
    SELECT carrid connid seatsocc
           FROM sflight
           INTO seats.
      COLLECT seats INTO seats_tab.
    ENDSELECT.
    check for help..
    http://www.sts.tu-harburg.de/teaching/sap_r3/ABAP4/collect.htm
    regards,
    venkat

  • I have recently swapped my iPhone for a new Samsung S4 contract with new sim and number, but when people with iPhones message me they are sending as iMessage.

    I have taken out a new contract with a Samsung S4 as the mobile device. It has a new sim card I got with the contract and new number. However, when friends with iPhones message me it is sending from their phone as iMessage meaning I am not receiving texts from them. Is this a fault on their side or mine? How do I fix the problem so I am receiving messages from them instead of it sending as iMessage and not received on my phone. Please help

    Read here regarding what you should have done & how to fix:
    http://support.apple.com/kb/HT5661

Maybe you are looking for

  • Print Quality Bad from MacBook Pro

    From my G4, OS 9.1, printing to my Brother 2070N has always been terrific. Now, from MacBook Pro, 10.5.6 the text looks bad, like a coarse screen has been applied. I see nowhere in the Page Set-up to check that the correct resolution has been selecte

  • How to compare standard texts used in Sapscripts different Environments

    Hello Gurus, I need to compare the standards texts found in different environments. 1. I would like to know if there is a program /Tcode that does this. 2. In what table are the standard texts kept? 3. How can I access the contents of another environ

  • Roles in ChaRM

    Hello, Is there any way to create new roles in ChaRM? Like a Change Manager, I want to create one role say change analyst. Is this possible? How can I do that? Thanks and Regards, Rajeev

  • Transferring apps to a new mac

    I've had a macbook for about 3 years now and I have accumulated a large quantity of applications on it. I am thinking about upgrading to a MacBook Pro. My question is this: How do I move my applications over to the new computer. The two biggies are A

  • When I open my iPhoto it says that my photo library is either in use by another application or has become unreadable, what do I do to fix this?

    It tells me that i should shut down and restart my computer, and if the problem still continues, to reopen it while keeping the option and command keys pressed. I have tried both of these but niether seem to work. The last option is to try restoring