Before aggregation - incorrect values

Hello,
I am using Calculated Key Figure with time of aggregation calculation = "before aggregation" and then I use this CKF in columns. Some rows are calculated correctly, but some of them are not. And when I check the key figure definition for those incorrect in monitor query I can see the way how it is calculated and everything seems to be OK in the row 1 (picture) , but in row 2 the value is incorrect.
<a href="http://raisik.webz.cz/key_fig1.JPG">http://raisik.webz.cz/key_fig1.JPG</a>
Any idea why?
Thanks for any help.
Regards
Pavel

Hi Agrima,
            Check here.....
http://help.sap.com/saphelp_nw04/helpdata/en/6f/56853c08c7aa11e10000000a11405a/content.htm
Thanks,
Vijay.

Similar Messages

  • Exception Aggregation (Average) displaying incorrect values after EHP1 Upgr

    Hi All,
    Exception Aggregation (Average) displaying incorrect values after EHP1 Upgrade in our BW system
    We have recently upgraded the system to EHP1. After the upgrade some of the queries where we are using Exception Aggregation (Average) started giving the incorrect values.
    Eg. We are displaying three Key Figures KF1, KF2 and KF3 (=KF1 %A KF2) against Store Hierarchy. In KF3 we are using Exception Aggregation (Average) on a characteristic 0PLANT.
    There are 14 rows against 0PLANT and out of those 2 rows are blank for KF1, so for KF3. When it is calculating the average of these key figures its dividing the total value by 12 instead of 14 which is not correct in our case. Earlier it was dividing the total by 14.       
    So in this case 'Average' and "Average of all values <>0" are behaving the same way.
    Kindly provide some inputs on this.
    Best Regards,
    Sachin Verma
    +44 7506740018

    Hi,
    Thanks for viewing the thread. And happy to let you know that the issue was resolved.
    The solution was:
    Two formulas (local) were created, one including the formula variable with replacement path for ZD1, with exception aggregation on ZD1, and the other with formula variable with replacement path for ZD2, with exception aggregation on ZD2. Both these formulas are hidden.
    Another formula (local) was created for u2018time takenu2019 = formula with ZD1 u2013 formula with ZD2, with exception aggregation total on u2018ZDOCNOu2019.
    For the second instance, when one requires exception aggregation on records that has multiple values for keys, a nesting of formulas can be done displaying only the ones required.
    For e.g. a formula with exception aggregation on say characteristic u2018item no.u2019 can be hidden, and included in another formula for exception aggregation on characteristic u2018document no.u2019. This is a typical case where one can achieve calculation before aggregation for a calculated key figure, formula or a counter.
    Hope it might help someone, and saves time and effort for a similar issue posted.
    Also would like to keep this thread open for exploring better solutions.   
    Regards,
    Vijay

  • Calculated key figures from multicubes before aggregation

    Hi,
    I am calculating a total using a calculated key figure
    that has one key figure from a multicube and two other key figures from another multicube.
    Also I factor the total using a variable with a replacement path on the dummy attribute (Constant) to "force" the calculation at the material level.
    Cost = Cost(CUBE1) / Quantity(CUBE1) * Quantity(Cube2) * ZVRMATER1
    Problem:
    If I split the calculation this works before aggregation at the material level. Also this works fine using calculations that use key figures that must be calculated before aggregation if they all are from the same cube at the time.  The required formula above will not work (zero divide) since during selection the OLAP processor retrieves in phases and with value 0 from the key figure of CUBE2.
    Any suggestion on how to solve this without new back-end development?
    Thanks.

    Hi,
    I am calculating a total using a calculated key figure
    that has one key figure from a multicube and two other key figures from another multicube.
    Also I factor the total using a variable with a replacement path on the dummy attribute (Constant) to "force" the calculation at the material level.
    Cost = Cost(CUBE1) / Quantity(CUBE1) * Quantity(Cube2) * ZVRMATER1
    Problem:
    If I split the calculation this works before aggregation at the material level. Also this works fine using calculations that use key figures that must be calculated before aggregation if they all are from the same cube at the time.  The required formula above will not work (zero divide) since during selection the OLAP processor retrieves in phases and with value 0 from the key figure of CUBE2.
    Any suggestion on how to solve this without new back-end development?
    Thanks.

  • Calculated key figures before aggregation

    Hi,
    I'm having trouble creating a new calculated key figure. Here's the situation.
    I have two key figures: stock, value A. Now I want to create a new calculated key figure (in 3.x) using both key figures. The calculation would look something like: "stock * (value A == 0)". Now I want this key figure to work before aggregation. When creating this calculated key figure however I am unable to set the aggregation setting to before aggregation. Now, with any other key figure besides stock, this is no problem. Something like "profit * value A == 0)" works fine and I can set the aggregation setting to before aggregation. I suspect the reason I can't use stock in a calculated key figure set the calculate before aggregation is because of the exception aggregation of the stock key figure. It's set to last value in exception aggregation.
    Does anyone know how to solve this problem? Thanks in advance.
    Alex

    Hi Alex,
    please read this:
    http://help.sap.com/saphelp_nw2004s/helpdata/en/75/21054da1392649948e5b94e4fc4bce/frameset.htm
    http://help.sap.com/saphelp_nw2004s/helpdata/en/80/1a62f8e07211d2acb80000e829fbfe/frameset.htm
    The reason that somtimes the propertie is available or not depends on the key figure type - e.g. if it is complex or not. I think that here is a lot of info available in the forum.
    Regards,
    Adem

  • How to calculate key figure before aggregation for complex formular?

    Hi, buddies
    <b>Here's the simplified senario</b>:
    I have a cube, in which the characteristics are 'Calendar Day' and 'Hour' (values are 01~24), and the key figures are stored by day and by hour.
    What I need is very simple, a query to display calculated key figures only by Calendar Day. I don't need Hour information.
    So I create a query: column charact is Calendar Day, rows are several calculated key figures.
    <b>Now the problem is that</b>:
    if I don't put 'Hour' as row in the query, I'll get WRONG result. But if I put 'Hour' as row in the query, I'll get CORRECT result, but all the 'Hour' details will display, which should be hided.
    <b>I know the reason is that</b>:
    the calculated key figure that I create should be calucated before aggregation, not after. But since the formular is pretty complex, I can't change the 'Time of Aggregation Calculation' in key figure's property. (It's greyed out.) So I have to put 'Hour' as row in the query to force calcuation 'before aggregation' in query and set the property 'Calculate Result As...' as 'Summary'.
    <b>My question</b> is:
    whether there's any other way to force calcuation 'before aggregation', so I don't have to put 'Hour' in the query.
    If no, is there a simple way to hide the 'Hour' details and only display summary result ON THE QUERY LEVEL? (
    <i>I can hide detail lines by using web template, or maybe using VB in excel. But I can't use either of them. I want to hide the details on the QUERY LEVEL. So I can use the query directly in any other reporting tools, like Visual Composer.</i>)
    Any idea?
    Wei

    Hi, Sudeepta
    Thanks for your reply.
    I did try to set 'No display' for 'Hour'. The result is that the Characteristics 'Hour' doesn't appear on the query result, but the detailed line of key figures still display on the result. It looks like the followings: (I put summaries on the top/right)
    Date  1/1  1/2  Overall result
    KPI1    10        11   22  (sum line)
    KPI2    20        21   41  (sum line)
    KPI1    12        13   25  (detailed line)
    KPI2    13        13   26  (detailed line)
    KPI1    11        12   23  (detailed line)
    KPI2    12        12   24  (detailed line)
    I want to suppress all the detailed lines and leave sum lines on the result.

  • Bex Issue : before aggregation

    Hi,
    I have a problem in Bex that I thought to solve with the "before aggregration" option in Bex Analyzer but this doesn't seem to be possible.
    My query looks initially like this for 1 shipment 1344601 that is linked to 2 deliveries
    Shipment Delivery Del.Quantity Counter Del.Quantity/Count
    1344601   81209721  41.160 KG     2      20.580 KG      
    1344601   81209722  14.840 KG     1      14.840 KG
    Resultrow .............56.000 KG     3       35.420 KG
    This 35.420 KG is the right total delivery quantity for shipment 1344601. Note that counter is calculated via a formula with before aggregation. Also the Del. Quantity is included in a formula with before calculation.
    When I now remove the drilldown on the delivery my result is wrong :
    Shipment      Del.Quantity Counter Del.Quantity/Count
    1344601       56.000 KG    3       18.666.67 KG
    Resultrw     56.000 KG    3       18.666.67 KG
    The system is dividing 56.000 KG by 3 which leads to an incorrect result of 18.666.67 KG.
    ==> My problem is that I can't put the Del.Quantity/Count on calculation before aggregation, although Del.Quantity and Counter that are used in the calculation have both calculation before aggregation.
    Via a little trick (include the calculation in a new calculated keyfigure where I multiply it by 1) I could put it on calculation before aggregation but then the query execution fails.
    Does anyone know a solution for this behaviour as I think lots of you might have faced similar situations and I would like to avoid to solve this in data staging as this doesn't seem unsolvable in Bex to me...
    Message was edited by: Wim

    Hi,
    As per the my knowledge, we can use the properties of Before Aggregation in Bex Analyser.
    for ex. when u excute your query, by default the result of the calculated key figure is generated after aggregation. But we can change this property to before aggregation by going to context menu of the calculated key figure for the analyer.
    But it is considered as a bad practice in SAP.
    If you want to use this option in query designer it not available,
    because when we use calculated key figure in formulas it calculate as after aggregation. If you want to change it, we can change at analyser level.
    Hope u understood.
    Regards,
    Vamsi
    Assign points if useful.

  • Warning before aggregation is osbsolete

    Hi guru's
    I'm migrating our BW system and in some queries we have the message Warning calculation before aggregation is obsolete.
    We still use BW 3.x analyzer.
    when i execute queries the message is only a warning and i can see result in my reports.
    i need to check the data but do you know if the message is a warning because this functionnality does not existe in BI 7 analyzer tool and if i use Bex 3.x will the data be correct ?
    Thanks
    Cyril

    Good day Cyril,
    When you migrate a query which has CKF with 'Before Aggregation', you will be requested to change it to 'after aggregation'. After turning on the option for 'After Aggregation query behaves same as what it used to do in BEx 3.5 with option 'B4 Ag'gregation'. Results are same.
    The use of BEFORE aggregation was removed as this can cause a drain on the system resources and therefore cause performance problems. For this reason it was made obsolete with the 7.x system. The OLAP processor handles data differently in the 7.x systems so removing the before aggregation option should not cause too many problems for customers migrating over.
    With this in mind, however, there are differences to BEFORE and AFTER aggregation. It may not affect the calculations you are using in your queries but you must be aware that some calculations are carried out at different times and this can cause hiccups. Most note-worthy would be when formulae are used and when replacement path variables are needed. In some cases, the necessary calculations may not be carried out and the figures may not be available which would not have been an issue in the 3.x system using before aggregation. 
    Check out SAP Note 1151957 which is excellent for understanding how the OLAP processor carries out calculations. It also details the differences between BEFORE and AFTER aggregation and should be very helpful for you going forward - particularly if you use formulae or replacement path functions.
    Be aware that there are differences and there may be queries where you get a red X instead of a value. In most cases, this means rewriting a formula so that the processor can now accomodate the aggregation you need to achieve.
    Hope this helps, Cyril.
    Regards,
    Karen

  • Before aggregation in NW2004s

    Hi All,
    We moved to NW2004S but we are still using BEx3.5
    I have created a simple calculated kf(say Amt) at ODS level (Amt = qty*price).
    The Amt numbers are coming incorrectly.I have used Before aggregation and it throws me an error " Before aggregation is not allowed for Amt".
    Can some one please explain how can i achieve this.?
    Thanks in advance.
    Regards,
    Raj

    refer:
    Before Aggregation in NW2004s(BI7)
    /message/3943188#3943188 [original link is broken]

  • Calculation before aggregation

    Hello BW Guru's
    What does this calculation before aggregation mean ?
    In which situation we use the above setting ?
    when we can use this option in Modelling and when we can use this option in reporting ?
    I am zero with this.. please explain me with a real time example.
    Full points will be assured for the best answer
    many thanks in advance,
    NIru.

    Hi,
    An aggregate is a materialized, aggregated view of the data in an InfoCube. In an aggregate, the dataset of an InfoCube is saved redundantly and persistently in a consolidated form into the database.
    How to create Aggregate for the cube.(for the example shown below)
    step1
    go to rsa1 transaction code , right click on the cube --->maintain aggregates ---create by your self
    Step2
    in the dimension Drag Region give the name of the aggregate .
    after dragging in the aggregation selection type you will find * . that means it is assigned for all characteristics value.
    or
    right click on the * and select fixed value as NY( this will give aggregation values only for NY)
    but in the example i have take * it is for all characteristic value ( means for all values NY and CA)
    Step3
    Now place the curser on the sigma symbol and activate the aggregate.
    Step4
    Now load the data to the cube , befor loading the data to the cube it a good practice of switching of the aggregate and switch on after loading.
    this option can be obtain at top menu aggregate---> switch on of for queries that means the aggregates are available for the reporting to view.
    by doing this this will increase the load performance and also the execution of the query will be fast
    Step6
    now open the report and execute
    The scenario below shows you how to count the results of a calculated key figure in the BEx Query Designer.
    You have loaded the following data into your InfoCube:
    Before Aggregation
    Region/     Customer  /Sales Volume USD
    NY /     A     /400
    NY/     B     /200
    NY/     C     /50
    CA/     A     /800
    CA/     C     /300
    After Aggregation
    Region/                SalesVolumeUSD
    NY/                        650
    CA/                       1100
    Overall result                 1750
    hope this is clear
    Santosh
    Edited by: Santhosh Nagaraj on Oct 29, 2009 3:35 AM

  • Before aggregation - versions

    Hi guys,
    I have been dealing with my issue for several months and havent found any solution.
    I have two basic key figures which I need to multiply between each other.
    Normaly it first aggregate and than multiply (which gives me wrong result) and when I use <b>before aggregation</b> It gives me <u>0 result</u> because those key figures are uploaded on different <b>Versions</b>. (one is actual - # and the other is version 20). So the it always multiply 0.
    The reason for different versions is that one is Standard per unit (uploaded on the version 20) while the other one is Actual number of Units ( version #)
    Do you have any idea how to work around this?
    Thank you very much!!

    You can try out this in your develpment system.
    Create a New keyfigure and Add it to Infocube and activate it. In update rules, Use update Method 'Formula'. there you can multiply already existing Keyfigures.Save the update rules and activate...makes ure update rules,transfer rules and infocube are active...
    Now reload the data again...no problem if you have data already.
    Filter the Qurey with 'last request loaded' its availabe under datapackage dimension..
    Check whether you got values as required.if it not,delete this request and delete remove keyfigurte from update rules and infoprovider..
    If it is working fine,you can try to reload all the data again without deleting,using export datasource.

  • Incorrect values in available budget in report S_KI4_38000050

    Dear Experts,
    We are getting incorrect values in available budget column against Fun/Fund center -commitment item in report S_KI4_38000050.
    Actually we have posted entries against fund center/commitment item without releasing budget and it allowed post entries due to deactivated availability control.
    Before Posting FI entry:
    Release Budget=0
    Assigned=0
    Available=0
    Commitment=0
    After Posting entry of Rs. 5000
    Release=0
    Assigned= -5000
    Available=5000
    Commitment= -5000
    Ques-1 Why available is 5000?
    Now if I released some amount say 10000 then,
    Release=10000
    Assigned= -5000
    Available=15000
    Commitment= -5000
    Ques-2 How to correct values mentioned above?
    As I think, the correct values should be:
    Release=10000
    Assigned= 5000
    Available=5000
    Commitment= 5000
    Regards
    Shishir

    Experts...Waiting for your suggestions..

  • Bug-fix needs your vote: queries w/ joins against SQLite return incorrect values because Adobe treats PK col as alias for rowid when it should not

    For someone new to Adobe the forums and products can be bewildering. I've been advised to repost something I posted in Flash Data Integration in this forum.
    Here is the link to the post I put there:
    http://forums.adobe.com/message/2363777#2363777
    I have reported this bug: http://bugs.adobe.com/jira/browse/FB-23750
    I gather bugs get fixed if people vote for them to be fixed. Please vote for it to be fixed. It is serious, and you might not even realize you're suffering from it because the incorrect values returned by the query will seem perfectly plausible.
    If the link above doesn't work, here it is again:
    When I execute the following query in Flex and/or Lita:
    select wrdid, uspelling from WRD WHERE uspelling = 'wingeard'
    the results are:
    uspelling...wrdid
    wingeard   3137
    Look at what comes back when I execute this query using .NET provider by  Robert Simpson for SQLite and SQLite Manager by Mrinal Kant:
    SELECT     rowid, wrdid, uspelling
    FROM         WRD
    WHERE     (uspelling = 'wingeard')
    rowid.......wrdid...........uspelling
    3137........3042............wingeard
    No wonder none of my queries with joins is working correctly in Flex.
    wrdid is defined as "int" not INTEGER.
    http://www.sqlite.org/lang_createtable.html (see INTEGER PRIMARY KEY section):
    "The special behavior of INTEGER PRIMARY KEY is only available if the type name is exactly "INTEGER" (in any mixture of upper and lower case.)  Other integer type names like "INT" or "BIGINT" or "SHORT INTEGER" or "UNSIGNED INTEGER" causes the primary key column to behave as an ordinary table column with integer affinity and a unique index, not as an alias for the rowid."  [emphasis added]
    Now, I happen to think the SQLite developers made a mistake here in failing to follow standards, preferring not to break legacy code. They'd rather break current code instead???  I would not characterize this as a "corner case" and the bug-at-hand is de facto evidence of that.

    Did you try running the queries I posted? What were your results with those?
    What I am seeing is that when I use "int PRIMARY KEY" in a CREATE TABLE statement, that column becomes the special "rowid" column. I believe this is also what you are seeing.
    However, what confuses me is how you're getting a table with three columns "rowid", "id", and "name" in the first place. When I run this SQL...
    CREATE TABLE test
    id int PRIMARY KEY,
    name String
    ...I get a table with two columns: a normal column named "name", and a special primary key column named "id", which for this table is identical to the column represented by the rowid identifier.
    However, if I understand correctly, your table has three columns, "id", "name", and the special primary key column (i.e. "rowid"). Is that right? Can you give me the SQL that was used to create the table, or tell me how the table was created (e.g. if you used a tool like Lita) so I can try to re-create your exact situation? That would really be very very helpful -- it was the only detail that was missing in your last post, so I had to guess on that one detail.
    I tried something else to re-create your situation. I ran the following statement:
    CREATE TABLE test
    id int
    name String
    That gave me a table with two real columns plus the rowid column. Then I ran the three insert statements on that table, and when I ran the select statement I got the expected result:
    id     name
    1     one
    2     two
    7     seven
    Again, I'm guessing that your table was created differently than my test table, and that's the explanation for the difference.
    Some other possibilities to consider:
    The screen shot doesn't show a SQLResult object, so it seems that you're using some wrapper library or code to execute the query, or at least that you've copied the SQLResult.data Array to another variable named results. Although it seems less likely to me, it's possible that somewhere in that code something is getting scrambled. (But I'd rather rule out AIR as the underlying cause first before attempting to explore those paths.)
    As a side note, if you really want the database to have three columns (the special rowid column and your two columns id and name), and you don't want id to be the special rowid column, then it sounds to me like you don't actually want to define id as the primary key. If you just want the id column to have a constraint that prevents duplicate values, you can define it as a UNIQUE column:
    CREATE TABLE test
    id int UNIQUE,
    name String
    That gives you the same database-enforced constraint of not allowing duplicate values, but it tells the database explicitly that id isn't the same thing as the rowid primary key. (You can still join another table to the id column even if it's not defined as the primary key.)
    P.S. I'm sure you don't mean it this way, but using gigantic red text comes across like shouting -- it's very "loud". I'm trying my best to understand the issue you're having and help you resolve it, and using multiple colors and font sizes doesn't really make your post any more or less clear. Just because I ask you questions, or say that I'm seeing different results than you, doesn't mean I don't believe that you're seeing the results you're seeing. I've definitely seen strange variations and cases where something happens on my computer but others can't duplicate it on their computers -- so I believe that you are getting the results you're getting. I'm just trying to figure out how to make it so that I can also get those results, so that I can pass that on to the engineers who are in a position to make changes.

  • Warning "Time of Calculation 'Before Aggregation' is obsolete" in BI 7.0

    Hi Friends,
    We have recently upgraded our BW system from BW 3.1 to BI 7.0. While executing one of the query in BI 7.0 i am getting the Warning Message "Time of Calculation 'Before Aggregation' is obsolete". I can run the query by ignoring the message and get the results. But I am not getting the correct result for some of the calculated key figures which has setting for Time of calculation as "Before Aggregation".
    After doing some research i found that before aggregation is not allowed in BI 7.0. We are using queries created in 3.x environment. There is some work around which talks about creating new calculated key figure with after aggregation setting and all. But in my case it not feasible as there are so many queries based on those calculated key figures.
    Does any one had the similar situation? Is there any other way to correct this problem?
    I would appreciate your help in this regards.
    Thanks,
    Manmit

    Hi
    Try SAP notes 935903.
    Symptom
    Calculated Key Figures "Existance Indicator" with aggregation behaviour "Before Aggregation" will get now with NW 2004s warning popup "Time of calculation 'Before Aggregation' is obsolete" during execution.
    this may be helpful.
    Also Check the below thread
    /message/2986338#2986338 [original link is broken]
    Regards
    Shilpa
    Edited by: Shilpa Vinayak on Oct 10, 2008 4:23 AM

  • How to fix 'Unexpected error: Incorrect value: Location URL' in WSDL

    Hi All,
    Using SOAMANAGER  transaction, I created a service ECC_CUSTOMERQUOTEERPCRTRC and its binding 'ECC_CUSTOMERQUOTEERPCRTRC_binding' using the Create Service option under the tab Configurations and using the web service definition 'ECC_CUSTOMERQUOTEERPCRTRC'.  When I click on the link "Open WSDL document for selected binding" under the tab 'Overview', I get the following XML code in the popup window for the WSDL.
    - <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    - <soap:Body>
    - <soap:Fault>
      <faultcode>soap:Server</faultcode>
      <faultstring>Unexpected error: Incorrect value: Location URL for subject IF {http</faultstring>
    - <detail xmlns:slibfault="http://xml.sap.com/2005/11/esi/slib/fault/">
      <slibfault:timestamp>Wed, 17 Nov 2010 22:29:02 GMT</slibfault:timestamp>
    - <slibfault:exception>
      <slibfault:text>Incorrect value: Location URL for subject IF {http://sap.com/xi/APPL/Global2}:CustomerQuoteERPCreateRequestConfirmation_In not found</slibfault:text>
      <slibfault:position program="CL_SIDL_SUBJECT_ADAPTER=======CP" include="CL_SIDL_SUBJECT_ADAPTER=======CM006" line="47" />
      </slibfault:exception>
      </detail>
      </soap:Fault>
      </soap:Body>
      </soap:Envelope>
    The XML code for nthe WSDL displays an error 'Unexpected error: Incorrect value: Location URL for subject IF '. It looks like the code could find the required URL. Please let me know how to fix this error.
    Thanks in advance.
    --R D

    Hello.
    In SOAMANAGER delete your "unexpected" service (endpoint).
    Then create it again.
    If same error will occurs - try to delete all definitions of this service (include sicf-transaction) and then create it completely again.
    Hope it helps.

  • Java returning incorrect values for width and height of a Tiff image

    I have some TIFF images (sorry, I cannot post them b/c of there confidential nature) that are returning the incorrect values for the width and height. I am using Image.getWidth(null) and have tried the relevant methods from BufferedImage. When I open the same files in external viewers (Irfanview, MS Office Document Imaging) they look fine and report the "correct" dimensions. When I re-save the files, my code works fine. Obviously, there is something wrong with the files, but why would the Java code fail and not the external viewers? Is there some way I can detect file problems?
    Here is the code, the relevant section is in the print() routine.
    * ImagePrinter.java
    * Created on Feb 27, 2008
    * Created by tso1207
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.print.PageFormat;
    import java.awt.print.PrinterException;
    import java.io.File;
    import java.io.IOException;
    import java.util.Iterator;
    import javax.imageio.ImageIO;
    import javax.imageio.ImageReader;
    import javax.imageio.stream.FileImageInputStream;
    import javax.imageio.stream.ImageInputStream;
    import com.shelter.io.FileTypeIdentifier;
    public class ImagePrinter extends FilePrintable
       private final ImageReader _reader;
       private final int _pageCount;
       private final boolean _isTiff;
       //for speed we will hold current page info in memory
       private Image _image = null;
       private int _imgWidth = 0;
       private int _imgHeight = 0;
       private int _currentPage = -1;
       public ImagePrinter(File imageFile) throws IOException
          super(imageFile);
          ImageInputStream fis = new FileImageInputStream(getFile());
          Iterator readerIter = ImageIO.getImageReaders(fis);
          ImageReader reader = null;
          while (readerIter.hasNext())
             reader = (ImageReader) readerIter.next();
          reader.setInput(fis);
          _reader = reader;
          int pageCount = 1;
          String mimeType = FileTypeIdentifier.getMimeType(imageFile, true);
          if (mimeType.equalsIgnoreCase("image/tiff"))
             _isTiff = true;
             pageCount = reader.getNumImages(true);
          else
             _isTiff = false;
          _pageCount = pageCount;
       public int print(java.awt.Graphics g, java.awt.print.PageFormat pf, int pageIndex)
          throws java.awt.print.PrinterException
          int drawX = 0, drawY = 0;
          double scaleRatio = 1;
          if (getCurrentPage() != (pageIndex - getPageOffset()))
             try
                setCurrentPage(pageIndex - getPageOffset());
                setImage(_reader.read(getCurrentPage()));
                setImgWidth(getImage().getWidth(null));
                setImgHeight(getImage().getHeight(null));
             catch (IndexOutOfBoundsException e)
                return NO_SUCH_PAGE;
             catch (IOException e)
                throw new PrinterException(e.getLocalizedMessage());
             if (!_isTiff && getImgWidth() > getImgHeight())
                pf.setOrientation(PageFormat.LANDSCAPE);
             else
                pf.setOrientation(PageFormat.PORTRAIT);
          Graphics2D g2 = (Graphics2D) g;
          g2.translate(pf.getImageableX(), pf.getImageableY());
          g2.setClip(0, 0, (int) pf.getImageableWidth(), (int) pf.getImageableHeight());
          scaleRatio =
             (double) ((getImgWidth() > getImgHeight())
                ? (pf.getImageableWidth() / getImgWidth())
                : (pf.getImageableHeight() / getImgHeight()));
          //check the scale ratio to make sure that we will not write something off the page
          if ((getImgWidth() * scaleRatio) > pf.getImageableWidth())
             scaleRatio = (pf.getImageableWidth() / getImgWidth());
          else if ((getImgHeight() * scaleRatio) > pf.getImageableHeight())
             scaleRatio = (pf.getImageableHeight() / getImgHeight());
          int drawWidth = getImgWidth();
          int drawHeight = getImgHeight();
          //center image
          if (scaleRatio < 1)
             drawX = (int) ((pf.getImageableWidth() - (getImgWidth() * scaleRatio)) / 2);
             drawY = (int) ((pf.getImageableHeight() - (getImgHeight() * scaleRatio)) / 2);
             drawWidth = (int) (getImgWidth() * scaleRatio);
             drawHeight = (int) (getImgHeight() * scaleRatio);
          else
             drawX = (int) (pf.getImageableWidth() - getImgWidth()) / 2;
             drawY = (int) (pf.getImageableHeight() - getImgHeight()) / 2;
          g2.drawImage(getImage(), drawX, drawY, drawWidth, drawHeight, null);
          g2.dispose();
          return PAGE_EXISTS;
        * <br><br>
        * Created By: TSO1207 - John Loyd
        * @since version XXX
        * @return
       public int getPageCount()
          return _pageCount;
       public void destroy()
          setImage(null);
          try
             _reader.reset();
             _reader.dispose();
          catch (Exception e)
          System.gc();
        * <br><br>
        * Created By: TSO1207 - John Loyd
        * @since Mar 25, 2008
        * @return
       public Image getImage()
          return _image;
        * <br><br>
        * Created By: TSO1207 - John Loyd
        * @since Mar 25, 2008
        * @return
       public int getImgHeight()
          return _imgHeight;
        * <br><br>
        * Created By: TSO1207 - John Loyd
        * @since Mar 25, 2008
        * @return
       public int getImgWidth()
          return _imgWidth;
        * <br><br>
        * Created By: TSO1207 - John Loyd
        * @since Mar 25, 2008
        * @param image
       public void setImage(Image image)
          _image = image;
        * <br><br>
        * Created By: TSO1207 - John Loyd
        * @since Mar 25, 2008
        * @param i
       public void setImgHeight(int i)
          _imgHeight = i;
        * <br><br>
        * Created By: TSO1207 - John Loyd
        * @since Mar 25, 2008
        * @param i
       public void setImgWidth(int i)
          _imgWidth = i;
        * <br><br>
        * Created By: TSO1207 - John Loyd
        * @since Mar 25, 2008
        * @return
       public int getCurrentPage()
          return _currentPage;
        * <br><br>
        * Created By: TSO1207 - John Loyd
        * @since Mar 25, 2008
        * @param i
       public void setCurrentPage(int i)
          _currentPage = i;
    }Edited by: jloyd01 on Jul 3, 2008 8:26 AM

    Figured it out. The files have a different vertical and horizontal resolutions. In this case the horizontal resolution is 200 DPI and the vertical is 100 DPI. The imgage width and height values are based on those resolution values. I wrote a section of code to take care of the problem (at least for TIFF 6.0)
       private void setPageSize(int pageNum) throws IOException
          IIOMetadata imageMetadata = _reader.getImageMetadata(pageNum);
          //Get the IFD (Image File Directory) which is the root of all the tags
          //for this image. From here we can get all the tags in the image.
          TIFFDirectory ifd = TIFFDirectory.createFromMetadata(imageMetadata);
          double xPixles = ifd.getTIFFField(256).getAsDouble(0);
          double yPixles = ifd.getTIFFField(257).getAsDouble(0);
          double xRes = ifd.getTIFFField(282).getAsDouble(0);
          double yres = ifd.getTIFFField(283).getAsDouble(0);
          int resUnits = ifd.getTIFFField(296).getAsInt(0);
          double imageWidth = xPixles / xRes;
          double imageHeight = yPixles / yres;
          //if units are in CM convert ot inches
          if (resUnits == 3)
             imageWidth = imageWidth * 0.3937;
             imageHeight = imageHeight * 0.3937;
          //convert to pixles in 72 DPI
          imageWidth = imageWidth * 72;
          imageHeight = imageHeight * 72;
          setImgWidth((int) Math.round(imageWidth));
          setImgHeight((int) Math.round(imageHeight));
          setImgAspectRatio(imageWidth / imageHeight);
       }

Maybe you are looking for