Charts: how do I determine when the mouse is in the plot area

I'm trying to implement logic that will do the following:
Panning plot within plot display area by clicking and dragging mouse
If the user clicks and drags in the chart plot area (the region where the chart plot actually displays, not including the axes, legends, titles, etc.), I want to be able to provide the effect of panning the plot (e.g. similar to grabbing and dragging a map in Google maps) within the plot display. This makes the most sense, of course, if the user has zoomed in to some level and the entire plot is no longer fully visible within the display.
Zooming on a plot
If the user places the mouse somewhere in the chart plot area and uses their mouse wheel, I want to be able to provide the effect of zooming in and out of the plot. The plot area itself must remain at its original size, just the representation of the plot needs to simulate the effect of being zoomed in or out on.
Thoughts, suggestions, ...
To make the zoom and pan effect, my thought was to adjust the axes bounds as appropriate to simulate these effects. The trick for some of what I'm planning on doing is finding out where the mouse is in the plot area (not the whole chart) so that I can find the x,y offsets from the plot origin (which appears to be in the upper left - at the chart level anyway). For panning, I don't think I care what the offset is, just that it's within the plot. For zooming, I may need to know where the mouse is in the plot so that the zooming could be centered on that location in the plot. This makes me think that it would also be helpful to find out how to translate the mouse x,y pixel position to a corresponding x,y value in the plot data domain.
I've been experimenting with attaching event handlers to detect various mouse actions and what information can be gleaned from these events. So far I have not found anything that allows me to determine the bounds of the plot region in the overall chart. I can get the mouse x,y position, but I don't know where it is in relation to the plot area bounds. I don't want to initiate a pan of a plot if the user happens to drag their mouse somewhere outside the plot area (i.e. over an axis, legend, etc.). Also, it would not make sense to start a zoom on the chart unless the mouse is over the plot.
Please let me know if this seems to be a reasonable approach, and if not, please suggest any ideas for alternatives. Any help, ideas and suggestions regarding how to solve these issues and/or determine this information would be welcome.

I experimented a bit and it seems the plot-content is the Group containing, well, the content of the plot. So in a line chart it's the smallest rectangle containing all the lines and the graphic at the data point (little circles, by default). What you probably need instead is the chart-plot-background.
Here's a quick example of a panning chart. There are probably better ways to manage the mouse dragging (it behaves somewhat badly if you drag out of the plot area and then back in, for example) but it gives you the basic idea. My original idea of adding a mouse directly to the plot area failed as the event doesn't get propagated to the plot region if you click on part of the plot content (a line, for example).
import java.util.Random;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.geometry.Point2D;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Region;
import javafx.stage.Stage;
public class PanningChart extends Application {
  @Override
  public void start(Stage primaryStage) {
    final NumberAxis xaxis = new NumberAxis("x", 0, 10, 1);
    final NumberAxis yaxis = new NumberAxis("y", 0, 100, 10);
    final LineChart<Number, Number> chart = new LineChart<>(xaxis, yaxis);
    chart.setAnimated(false);
    chart.setData(createData());
    final Region plotArea = (Region) chart.lookup(".chart-plot-background");
    final DoubleProperty lastMouseX = new SimpleDoubleProperty();
    final DoubleProperty lastMouseY = new SimpleDoubleProperty();
    chart.setOnMousePressed(new EventHandler<MouseEvent>() {
      @Override
      public void handle(MouseEvent event) {
        final double x = event.getX();
        final double y = event.getY();
        if (plotArea.getBoundsInParent().contains(new Point2D(x, y))) {
          lastMouseX.set(x);
          lastMouseY.set(y);
    chart.setOnMouseDragged(new EventHandler<MouseEvent>() {
      @Override
      public void handle(MouseEvent event) {
        final double x = event.getX();
        final double y = event.getY();
        if (plotArea.getBoundsInParent().contains(new Point2D(x, y))) {
          moveAxis(xaxis, x, lastMouseX);
          moveAxis(yaxis, y, lastMouseY);
    final BorderPane root = new BorderPane();
    root.setCenter(chart);
    primaryStage.setScene(new Scene(root, 600, 400));
    primaryStage.show();
  private void moveAxis(NumberAxis axis, double mouseLocation,
      DoubleProperty lastMouseLocation) {
    double scale = axis.getScale();
    double delta = (mouseLocation - lastMouseLocation.get()) / scale;
    axis.setLowerBound(axis.getLowerBound() - delta);
    axis.setUpperBound(axis.getUpperBound() - delta);
    lastMouseLocation.set(mouseLocation);
  private ObservableList<Series<Number, Number>> createData() {
    final ObservableList<Data<Number, Number>> data = FXCollections
        .observableArrayList();
    final Random rng = new Random();
    for (int x = 0; x <= 10; x++) {
      data.add(new Data<Number, Number>(x, rng.nextDouble() * 100));
    return FXCollections.singletonObservableList(new Series<Number, Number>(data));
  public static void main(String[] args) {
    launch(args);
998038 wrote:On a slightly different (but related) subject, where can I find an up-to-date source of information that describes the IDs and class names that JavaFX uses? I assume the ".plot-content" is pertaining to the ID of the chart plot area (or plot "child" of the chart?). Where can I find the names of the various objects that can be "looked up"?I generally try to avoid lookups as they feel a bit fragile. However occasionally there seems to be no other way, as in this case. The [url http://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html]CSS reference guide documents the css class substructure of each Node type.

Similar Messages

  • When I upgraded from v4 to v5 my bookmarks was lost. I do have the one that is in the firefox toolbar. Apparently I had a bookmarks add-on. V5 changed my browser how can I determine what the program was and if the bookmarks are still there?

    When I upgraded from v4 to v5 my bookmarks was lost. I do have the one that is in the firefox toolbar. Apparently I had a bookmarks add-on. V5 changed my browser how can I determine what the program was and if the bookmarks are still there?

    Start Firefox in <u>[[Safe Mode|Safe Mode]]</u> to check if one of the extensions (Firefox/Tools > Add-ons > Extensions) or if hardware acceleration is causing the problem (switch to the DEFAULT theme: Firefox/Tools > Add-ons > Appearance).
    *Do NOT click the Reset button on the Safe Mode start window or otherwise make changes.
    *https://support.mozilla.org/kb/Safe+Mode
    *https://support.mozilla.org/kb/Troubleshooting+extensions+and+themes
    Websites remembering you and automatically log you in is stored in a cookie.
    *Create an allow Cookie Exception to keep such a cookie, especially for secure websites and if cookies expire when Firefox is closed.
    *Tools > Options > Privacy > Cookies: Exceptions
    In case you are using "Clear history when Firefox closes":
    *do not clear Cookies
    *do not clear Site Preferences
    *Tools > Options > Privacy > Firefox will: "Use custom settings for history": [X] "Clear history when Firefox closes" > Settings
    *https://support.mozilla.org/kb/Clear+Recent+History
    Note that clearing "Site Preferences" clears all exceptions for cookies, images, pop-up windows, software installation, and passwords.
    Clearing cookies will remove all specified (selected) cookies including cookies that have an allow exception and cookies from plugins.

  • Async tcp client and server. How can I determine that the client or the server is no longer available?

    Hello. I would like to write async tcp client and server. I wrote this code but a have a problem, when I call the disconnect method on client or stop method on server. I can't identify that the client or the server is no longer connected.
    I thought I will get an exception if the client or the server is not available but this is not happening.
    private async void Process()
    try
    while (true)
    var data = await this.Receive();
    this.NewMessage.SafeInvoke(Encoding.ASCII.GetString(data));
    catch (Exception exception)
    How can I determine that the client or the server is no longer available?
    Server
    public class Server
    private readonly Dictionary<IPEndPoint, TcpClient> clients = new Dictionary<IPEndPoint, TcpClient>();
    private readonly List<CancellationTokenSource> cancellationTokens = new List<CancellationTokenSource>();
    private TcpListener tcpListener;
    private bool isStarted;
    public event Action<string> NewMessage;
    public async Task Start(int port)
    this.tcpListener = TcpListener.Create(port);
    this.tcpListener.Start();
    this.isStarted = true;
    while (this.isStarted)
    var tcpClient = await this.tcpListener.AcceptTcpClientAsync();
    var cts = new CancellationTokenSource();
    this.cancellationTokens.Add(cts);
    await Task.Factory.StartNew(() => this.Process(cts.Token, tcpClient), cts.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
    public void Stop()
    this.isStarted = false;
    foreach (var cancellationTokenSource in this.cancellationTokens)
    cancellationTokenSource.Cancel();
    foreach (var tcpClient in this.clients.Values)
    tcpClient.GetStream().Close();
    tcpClient.Close();
    this.clients.Clear();
    public async Task SendMessage(string message, IPEndPoint endPoint)
    try
    var tcpClient = this.clients[endPoint];
    await this.Send(tcpClient.GetStream(), Encoding.ASCII.GetBytes(message));
    catch (Exception exception)
    private async Task Process(CancellationToken cancellationToken, TcpClient tcpClient)
    try
    var stream = tcpClient.GetStream();
    this.clients.Add((IPEndPoint)tcpClient.Client.RemoteEndPoint, tcpClient);
    while (!cancellationToken.IsCancellationRequested)
    var data = await this.Receive(stream);
    this.NewMessage.SafeInvoke(Encoding.ASCII.GetString(data));
    catch (Exception exception)
    private async Task Send(NetworkStream stream, byte[] buf)
    await stream.WriteAsync(BitConverter.GetBytes(buf.Length), 0, 4);
    await stream.WriteAsync(buf, 0, buf.Length);
    private async Task<byte[]> Receive(NetworkStream stream)
    var lengthBytes = new byte[4];
    await stream.ReadAsync(lengthBytes, 0, 4);
    var length = BitConverter.ToInt32(lengthBytes, 0);
    var buf = new byte[length];
    await stream.ReadAsync(buf, 0, buf.Length);
    return buf;
    Client
    public class Client
    private TcpClient tcpClient;
    private NetworkStream stream;
    public event Action<string> NewMessage;
    public async void Connect(string host, int port)
    try
    this.tcpClient = new TcpClient();
    await this.tcpClient.ConnectAsync(host, port);
    this.stream = this.tcpClient.GetStream();
    this.Process();
    catch (Exception exception)
    public void Disconnect()
    try
    this.stream.Close();
    this.tcpClient.Close();
    catch (Exception exception)
    public async void SendMessage(string message)
    try
    await this.Send(Encoding.ASCII.GetBytes(message));
    catch (Exception exception)
    private async void Process()
    try
    while (true)
    var data = await this.Receive();
    this.NewMessage.SafeInvoke(Encoding.ASCII.GetString(data));
    catch (Exception exception)
    private async Task Send(byte[] buf)
    await this.stream.WriteAsync(BitConverter.GetBytes(buf.Length), 0, 4);
    await this.stream.WriteAsync(buf, 0, buf.Length);
    private async Task<byte[]> Receive()
    var lengthBytes = new byte[4];
    await this.stream.ReadAsync(lengthBytes, 0, 4);
    var length = BitConverter.ToInt32(lengthBytes, 0);
    var buf = new byte[length];
    await this.stream.ReadAsync(buf, 0, buf.Length);
    return buf;

    Hi,
    Have you debug these two applications? Does it go into the catch exception block when you close the client or the server?
    According to my test, it will throw an exception when the client or the server is closed, just log the exception message in the catch block and then you'll get it:
    private async void Process()
    try
    while (true)
    var data = await this.Receive();
    this.NewMessage.Invoke(Encoding.ASCII.GetString(data));
    catch (Exception exception)
    Console.WriteLine(exception.Message);
    Unable to read data from the transport connection: An existing   connection was forcibly closed by the remote host.
    By the way, I don't know what the SafeInvoke method is, it may be an extension method, right? I used Invoke instead to test it.
    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click
    HERE to participate the survey.

  • How do i determine what the "other" usage is on my iPad (3.5 gig)

    how do i determine what the "other" usage is on my iPad (3.5 gig)

    Hey there, I seem to have an issue with the 'other' usage thing.
    On my computer and ipod, it shows like this:
    when I dont even have more than 2+GB in music and less than 1gb in apps and pictures.
    I am on iOS5.1.1 because I had many problems with the Wi-Fi bug for iOS6 (no, it didnt fix for me with 6.0.1)
    I am very frustatred because I cant even sync music anymore. AndI dont want to do a reset because it takes me 3+ hours to transfer my music.
    any help}?

  • Mac shut down due to problem; I rebooted fine. how do I determine what the problem was?

    mac shut down due to problem; I rebooted fine. how do I determine what the problem was?

    When shut down and rebooted, the Mac OS X does background maintenance on the system. That can solve minor issues.
    Beyond this, it is a good idea to run Disk Repair yourself just to make sure.
    Reboot with the option key held down. On the screen that comes up select the Recovery disk icon and Continue.
    On the next screen Clcik Disk Utility and Continue.
    In DU, in the list on the left select the drive to be repaired - click the item that is indented to the right, not an an item whose name starts on the far left.
    Click First Aid, then Repair Disk.
    After that is done, quit DU and restart as usual.

  • How do I determined if the USB ports are working?

    How can I determine if the USB ports are working.  Macbook Pro i7.
    Thanks for any help.  This is a new computer to me migrating from a PC system.

    Blessings to those who are able to reply with possible answers.   I am sorry....but I have spent days working on getting my two USB ports to work also.  I basically use the USB ports for a wireless mouse and various flashdrives/memory sticks.  I have a MacBook Pro 2011 Snow Leopard 10.6.8  I have tried software update, SMC and PRAM resets, battery reset, hardware test, creating a new user account....and browsing and reading numerous discussion boards.....awgh!  I have stopped short of using my install DVD (fear of loosing data), upgrading to Lion or Mountain Lion (some fear of loosing an application that might not be compatible), contacting an Apple Store (AppleCare or whatever--live 2 hours away + fear of expense), and of course, trashing the laptop.  Does anyone out there have any possible solutions?   I see I am not alone.  --A frustrated first-time Apple products owner.

  • How to get ONLY the data shown in the plot area (Chart)

    My chart history length are 120000, often I don't need to save the whole
    buffer, just the data shown in the plot area?
    Richard Pettersen

    Hi Richard,
    you haven't said which version of LabVIEW you're using, so I've assumed 6.1, although this should be fine for older versions too.
    I put down a chart with a scrollbar, so I could go through the old data, and put an indicator attached to the x-scale->Range->minimum and x-scale->Range->maximum. These followed the displayed elements in the chart as I scrolled through the data. You can therefore link in the chart history (history data property of the chart) with a array subset to retrieve the appropriate portion.
    Be aware though. The minimum and maximum that the chart is showing on the x-scale may not be a part of the history data. E.g. if I set the history length to 1000 points, and produce on the first run, 1000 points, then my minimum and maximum are a
    t say 899 and 999. I then produce a second set of data, 1000 points long, and my min and max move to 1899 and 1999. As my history data is only 1000 long, I can scroll back to 1000 OK, but my min and max used as indexes don't relate anymore. The array of data is from 0 to 999, but my indexes can run from 1000 to 1999. So I have to add in a check that sees how much data is available before attempting to index, and then it's down to the flow of the program to try to work out where the data actually is (I'll leave that one to you - you'll need to keep track of the history data compared to the maximum (shown just after a point is added though this then makes a mess of your data! - possible to keep a track of new minimum when adding new data : the maximum (which will show once new data goes on) minus the history length gives the minimum that can be scrolled to - subtract this from all max's and min's to get real offset into the data - history length can be got from the history data and an a
    rray size sub .vi)
    Obviously there's no problem if you're clearing the graph everytime you either plot new data, or reach maximum capacity on the history data as the indexes return to zero.
    Hope that helps
    S.
    // it takes almost no time to rate an answer

  • With a PDF Dynamic form using show/hide actions, how to ensure that when the completed form is saved, closed and re-opened, the form still show the fields as before it was closed?

    With a PDF Dynamic form using show/hide actions, how to ensure that when the completed form is saved, closed and re-opened, the form still show the fields as before it was closed?
    I have developed a form with fields hidden by default, that become visible based on box ticked or radio button selections.
    My problem is that, when I close the form and re-open it, it comes back to it's default presentation, regardless of the information already recorded in the form (including in the now hidden fields.
    How to correct that
    Thanks in advance for any hint you can provide.

    I've had the same problem. This solved it...
    Go to the "Form properties..." in the File-menu. Select "Run-time" to the left and in the box "Scripting" Preserve scripting changes to form when saved: choose Automatically (Script-based state changes are saved locally in an insecure fashion. This option cannot be used for certified forms).
    Hope it works for you to...

  • How to stop PO output when the indicators are updated with a prog. **URGENT

    Hi,
    I have developed a update prg which will update the Final invoice indicator and Goods reciept indicator in SRM as well as in R/3 only for 'ORDERED' PO's. This was done using BBP_PO_PD_UPDATE FM. Everything is working fine, all the indicators are getting updated as expected both in SRM and R/3.
    Only problem is that when the indicators are updated in SRM, PO Output is getting generated which should not happen.
    Do you have any idea how to stop the OUTPUT.
    This is very urgent.
    BR,
    Parvez.

    PO output
    PO Output problems
    disable PO output on po change in SRM

  • How do I know when the buffer flushed all the data out?

    I am using a very high sampling rate (500000 Hz) and acquire 1024 data points continuously.   It takes 370000 data points in 10 second.   I use a counter to help with the retrigger PFI line.   I have a huge buffer so that I can make sure that the buffer is not overflowed.  The code is attached below.  My problem is that the data acquisition is done so fast (in 10 seconds)  but the processing of the data is not.  In :nEvent, I basically save and plot the data.  The saving process is not slow.   However, our videocard is so SSSSLOOOW and can not keep up with realtime data display.    After the user is done collecting the data, they do not want to wait for the screen to plot the data from the buffer.   So after the data collection is done, I basically stop the plotting process but we still need to flush the data out from the buffer for saving.  My question is that how can I tell when the buffer is empty.
    Thanks,
    Yajai
    m_task = std::auto_ptr<CNiDAQmxTask>(new CNiDAQmxTask("aiTask"));
    m_counter = std::auto_ptr<CNiDAQmxTask>(new CNiDAQmxTask("coTask"));
    m_task->Stream.Timeout = -1;
    //Create a channel
    m_task->AIChannels.CreateVoltageChannel(physicalChannel, "",
    static_cast<DAQmxAITerminalConfiguration>(DAQmxAITerminalConfigurationRse), minimum, maximum,
    DAQmxAIVoltageUnitsVolts);
    m_task->Timing.ConfigureSampleClock(counterSource, sampleRate,DAQmxSampleClockActiveEdgeRising,DAQmxSampleQuantityModeContinuousSamples, samplesPerChannel);
    m_task->Stream.Buffer.InputBufferSize = samplesPerChannel * 2000;
    m_counter->COChannels.CreatePulseChannelFrequency(counterChannel, "coChannel", DAQmxCOPulseFrequencyUnitsHertz, DAQmxCOPulseIdleStateLow, 0, sampleRate, 0.5);
    m_counter->Timing.ConfigureImplicit(DAQmxSampleQuantityModeFiniteSamples, samplesPerChannel);
    m_task->Control(DAQmxTaskVerify);
    m_counter->Control(DAQmxTaskVerify);
    m_counter->Triggers.StartTrigger.ConfigureDigitalEdgeTrigger(
    referenceTriggerSource, DAQmxDigitalEdgeStartTriggerEdgeRising);
    m_counter->Triggers.StartTrigger.Retriggerable = true;
    m_taskRunning = true;
    m_counter->Start();
    // Set up the graph
    m_Graph.Plots.RemoveAll();
    for (unsigned int i = 0; i < m_task->AIChannels.Count; i++)
    m_Graph.Plots.Add();
    m_Graph.Plots.Item(i+1).LineColor = m_colors[i % 8];
    // Create Multi-channel Reader
    m_reader = std::auto_ptr<CNiDAQmxAnalogMultiChannelReader>(new CNiDAQmxAnalogMultiChannelReader(m_task->Stream));
    m_reader->InstallEventHandler(*this, OnEvent);
    m_reader->ReadMultiSampleAsync(samplesPerChannel, m_data);

    Yajai,
    I'm a little confused about your acquisiton. Do you intend for it to be
    finite, or continuous? I'm also unclear about your rates. You state
    that you are acquiring 1024 samples at 500kHz, yet you get only 370k
    samples in 10 seconds. Are you periodically acquiring 1024 samples at
    500kHz?  Do you do any reads other than the final m_reader->ReadMultiSampleAsync(samplesPerChannel, m_data)? Could you provide the code where you stop the plotting process?
    Thanks,
    Ryan V.
    Ryan Verret
    Product Marketing Engineer
    Signal Generators
    National Instruments

  • I am planning to switch to the "iPhone for Life Plan" with unlimited data.  How do i determine what the balance is on my equipment installment plan?

    I am planning to switch to the "iPhone for Life Plan" with unlimited data.  How do i determine what the balance is on my equipment installment plan?

    Yes I am considering switching from the VZ Edge to Sprint iPhone for Life plan.
    Thanks,
    Adrian
    >> Personal information removed to comply with the Verizon Wireless Terms of Service <<
    Edited by:  Verizon Moderator

  • How do we determine if the BW system is running  slow?

    Dear BWers,
    How do we determine if the BW system is running slow? I have a situation where it is taking about 1 hr 30 min to load 700,000 records from the application server with direct mapping and no major transformations. How do i conclude if my BW system is running slow? Is there any documentation on this or benchmarks to analyze this? All and any help is appreciated.
    Thanks
    Raj

    The time taken to load depends on a few factors like the following:
    1. network bandwidth
    2. system memory on the application server.
    3. available processes in the application server to start the job
    Make sure to load the master data, activate them and also apply change run before you load the transaction data. If you have secondary indexes, make sure you delete them before laoding data. I will suggest to have sequential load and put all the processes in a process chain. Where ever you can, try to split the package size. But in your case, the no of records is not that much and so you should be fine with one info package.
    Ravi Thothadri

  • How can i determine what the most recent os my imac will run?

    How can i determine what the most recent os my iMac will run?
    Serial Number QP6*****VUW
    Processor 2.16 GHz Intel Core 2 Duo
    Currently running Version 10.5.8
    <Edited by Host>

    You CAN run 10.7, but I don't advise it, buy the 10.6.3 upgrade disk from the Apple Store online and then backup files off the machine and upgrade to 10.6.3., then Software Update to 10.6.8 would be the BEST option for your older hardware and it will run most all of your 10.5 software and be faster than 10.5 or 10.7.
    If you go to 10.7 it won't run nearly any of your 10.5 software and you will have to buy all new ones for a machine that's getting a little bit dated, near it's end of life stage. 10.7 will slow your machine down, especially with low RAM.
    http://roaringapps.com/apps:table
    At your machines stage, the hard drive is getting old, the vents are clogged up with dust and it's going to cost a bit to get the drive etc upgraded. You can if you wish, but 10.7 really needs more RAM (4GB) and a faster hard drive.
    But your still subjected to the video card going out etc.
    IMO upgrade to 10.6.8 and stay there until the wheels fall off, then buy a new 10.8 machine being released after this summer or 10.9 machine.
    Harden your Mac against malware attacks

  • How do I set up InDesign cross-document Text Anchor Hyperlinks so that when the files are moved, they remain active?

    I’m combining several InDesign files into one PDF, with several hundred text links across the different sections, as well as within each. The cross-document (section) Text Anchor Hyperlinks work fine in my workspace - but when I change the file location, they are no longer active (other links, bookmarks remain intact).
    How do I set up InDesign cross-document Text Anchor Hyperlinks so that when the files are moved, they remain active? 

    They seem to be a lot of extra work, and I don't see what the additional benefit is. I have several hundred links to do. I would appreciate learning what the benefit is, as I don't mind the extra effort if it will deliver the desired results.

  • How we can see when the condition records created.

    Hi,
    How we can see when the condition records created ( Valid from and Valid to ) ? And also how we can see the changes made in the Condition records?
    Regards,
    jyothi.

    Hello,
    you can display the condtion records in transaction VK13.
    Here you have the posibillity to display the changes of the condtion records.
    Please goto VK13
    > Enter your selection criteria
       > Enviroment
          > changes
    But you can also create a condtion list. and the you can display more than one condition record:
    Please have a look at the transation V/LD - Pricing Report
    For example: conditon list 14 for taxes.
    Here you get an overview of tax condtions.
    I hope that the information are helpful.
    Regards
    Claudia
    If you are satisfied with the answer, please give Reward Points.

Maybe you are looking for