Tabular: fast patterns for dynamic banding of measures by 'effective date'?

I've implemented
http://www.powerpivotpro.com/2012/04/aged-debtorsdynamic-banding-in-dax/ but it's very slow - 5min+ to render a simple excel pivot table that's filtered to 2 invoices from a model that's ~130meg and has around 500k invoice payment
schedule rows in the largest fact table. Cube deployed to server as opposed to power pivot/excel. I changed some of the logic to get rid of the 'as at' dynamic filtering in the linked blog and use a timeline instead to select all the dates from
the beginning of time to my effective date, but it's still 30sec+ refreshes.. Just wondering if there's better patterns out there that use v2 dax and are faster. My transposing might've also introduced some inefficient logic because I don't have a central
'transactional' table to work from.
My model looks like - [table](relevant columns,...)
[invoice](invoice date) 1:m [payment schedule](due date, amount due) 1:m [Payment] (payment amt, payment date)
in words: an invoice is raised. An invoice can be made up of part payments that are due at different times, a payment can be for part or all of a payment schedule.
The model works for 'as at now' reporting, but I'd like to implement a banded aged debtor report as at a specific date in a way that is usable.
My current implementation doesn't include all the features and it's already pushing a minute of excel processing for a very filtered subset of data. Don't want to imagine how long it'd take for the full set.
some data
-- invoices
SELECT *
FROM (Values
(1,'1 jan 2015'),
(2,'15 jan 2015'),
(3,'20 jan 2015'),
(4,'21 jan 2015')
) as t(InvoiceID,InvoiceDate)
--payment schedule
SELECT *
FROM (Values
(1,1,'1 feb 2015',$100),
(2,2,'15 feb 2015',$50),
(3,2,'15 mar 2015',$50),
(4,3,'20 feb 2015',$50),
(5,3,'20 mar 2015',$50),
(6,4,'21 feb 2015',$25),
(7,4,'21 mar 2015',$25),
(8,4,'21 apr 2015',$25),
(9,4,'21 may 2015',$25)
) as t(PaymentScheduleID,InvoiceID,DateDue,AmountDue)
-- payments
SELECT *
FROM (Values
(1,1,'10 Jan 2015',$50),
(2,1,'11 Jan 2015',$50),
(3,2,'10 feb 2015',$50),
(4,4,'25 feb 2015',$50)
) as t(PaymentID,PaymentScheduleID,DatePaid,AmountPaid)
The bands I have are
BandID Band Label BandStart BandEnd
1 Future -999999999 -31
2 Current -30 0
3 1-30 days 1 30
4 31-60 days 31 60
5 61-90 days 61 90
6 91-120 days 91 120
7 120+ days 121 999999999
anything due more than 30 days into the future is 'future', anything due in the next 30 days is current, anything that's due in the past is overdue.
The 'effective date' filter should exclude any invoices that were raised in after the effective date and exclude any payments made after the effective date.
expected output:
Thanks
Jakub @ Adelaide, Australia Blog

See if the blog below helps:
https://cwebbi.wordpress.com/category/dax

Similar Messages

  • Can I purchase different plug ins for garage band sucha amps and effects

    Are there plug in I can purchase for garage band such as effect and or more amps or drum sounds?   Thanks Tom

    Not for the ios version of GarageBand, unfortunately.

  • Design patterns for Dynamic Class Loading

    Hi,
    I have to develop a program for uni that dynamically loads classes based on names in a text file. All the classes subclass an abstract class with a constructor that takes one argument. This means I can't use the Class.forName(className).newInstance() method of class loading. I have researched some design patterns I could use and have come up with the following 3:
    Factory pattern; "Robocode" pattern (not it's real name, but Robocode uses it); and, the "one I made up myself" pattern.
    The robocode pattern instantiates a class using the default no-argument constructor then immediately sets all properties that shoud have been provided in the constructor:
    Object o = Class.forName(myClass).newInstance();
    o.setProperty(property);Personally I think this is ugly and a cheap fix instead of doing it properly.
    My own pattern finds the constructor that takes the arguments I need then calls it to create the object:
    Class c = Class.forName(myClass);
    Constructor cons = c.getConstructor(new Class[]{Class.forName("java.lang.String")});
    Object o = cons.newInstance(new Object[]{"hello"});What's the best to use? Are there any other patterns I should consider?

    My own pattern finds the constructor that takes the
    arguments I need then calls it to create the object:
    Class c = Class.forName(myClass);
    Constructor cons = c.getConstructor(new
    Class[]{Class.forName("java.lang.String")});
    Object o = cons.newInstance(new Object[]{"hello"});
    I have followed this basic 'pattern' several times though I would use
    Constructor cons = c.getConstructor(new Class[]{String.class});
    It works great.

  • For Dynamic Credit Check replacing Material Availability date with Delivery date

    Hi All,
    Our client has this requirement, where they want to change the standard SAP functionality which Checks whether a schedule line item in a sales order is with in horizon or not based on "Material Availability Date" VBEP-MBDAT. They want in place of this Delivery date of schedule line should be used i.e. VBEP-EDATU. I did some research and found out that this could be done technically by updating the BADI "BADI_SD_CM".
    Now we are stuck as to what needs to be changed? has anybody worked on this kind of requirement before?
    Please share your past experience.
    Thanks and Regards,
    Prateek Maheshwari.

    As you know, VBELN-Currency-POSNR-ETENR-MBDAT is standard exposure key of sales order but my ex-colleague changed it into VBELN-Currency-POSNR to compress exposure data for certain CCA.
    In this case, of course, that CCA should meet some biz requirements(User-exit. etc) like no partial delivery. etc.... for integrity of exposures..
    This case is different because you want to change value of key....and it's Date!!!!
    Anyway I think it's techinically possible but it's very risky in live system because existing exposures would be not removed even if delivered, changed, deleted or blocked.
    So you have to delete all exposures and rebuild after program changed.
    I'm writing it's possible now but I refused when my customer want to change it because I don't have any way to rebuild huge data in live system.

  • How to change the Display Pattern for Decimal Fields dynamically

    hi all,
    Can any one help me how to change the display pattern for decimal fields dynamically???
    Currently I am using z,zzz,zzz,zz9.999 Display pattern for Quantity Field. If the value is blank it is displaying as 0.000 on the Screen. But I don't want this to be printed.
    Please help me how to solve this ASAP.
    Thanks,
    Prabhu

    Hi,
    Alternatively you can handle it in the context.
    In the context area, click on the quantity. In the bottom, click on the conditions tab, and put a condition
    <quan field> NE initial.
    So the field will not be printed if there is no value.
    Regards,
    Vidya Chowdhary A.

  • Indexing on regular expression seach for dynamic pattern

    Hello All,
    Would it be possible to create any index for regular expression search (REGEXP_LIKE) for 'dynamic' pattern?
    If the pattern is static, then we can create FBI, but is there any way for dynamic patterns? Please advise.
    Regards,
    Hari

    Thanks Dom, I have never used Oracle Text. Would it be possible to provide some sample code for above requirement.
    Regards,
    Hari

  • DAX Dynamic Banding | Calculated Member based on Calculated Field

    Good morning,
    I've created a Power Pivot model that measures the blood glucose levels of clinical patients at specific times of the day. The requirement is that this metric, let's call it GlucoseLevel, is always averaged as it wouldn't make sense to sum up the values.
    To meet this first requirement, I set the "Summarize By" property of the GlucoseLevel column to "Average".
    The second requirement is to band the GlucoseLevel values so that groups of people can be measured by this band rather than by the individual measure values. I created a banding table in Excel and then imported it into the Power Pivot model. The banding table
    has three columns (BandName, MinValue and MaxValue) and has the following values:
    VERYLOW: Min Value = 0; Max Value = 3.99
    OK: Min Value = 4; Max Value = 6.99
    WARNING: Min Value = 7; Max Value = 10.99CRITICAL: Min Value = 11; Max Value = 30.00
    It is at this point where I face my challenge. I have a GlucoseLevel measure and I have a banding table. Great. The challenge is: How do I create a calculated, dynamic
    member that will look at my GlucoseLevel measure (at whatever level), do a lookup to my banding table, and then return the "BandName" column from the Banding table at that specific level? So to clarify what I mean by level: I want to be able
    to view the bandings at Year level, or a Month level, or even at a week level. Then depending on what level I am at, my measure should have a Band associated to it.
    I've tried to solve this issue in a couple of ways:
    Attempt 1
    Create a calculated column in my fact table that contains a nested IF statement to manually band my GlucoseLevel values. This works fine if I view my data at the lowest level of granularity, however
    it does not work if I start looking at my data at the day, week, month etc. levels
    Attempt 2
    1.) Create a calculated field (not a calculated column) that averages my GlucoseLevel measure. This is cool because it will average my measure at whatever level I am viewing it at. Let's call
    this field Bob...
    2.) Band my measure Bob by creating another calculated field (called PatientBand). This field uses my banding table (described earlier) in conjunction with my calculated field Bob. This works perfectly, except for one big flaw: Excel sees this banding field
    as a measure, and not as something that I can use as a column / row...
    So my question is: Can I trick Excel into viewing my PatientBand calculated field as an attribute, and not as a measure? And if not, how do I get around this challenge? Here is the DAX formula that I used to create my second calculated field "PatientBand":
    PatientBand:=CALCULATE(
        VALUES (Bandings[BandName]);
        FILTER (
            Bandings; 
            Test[Bob] >= Bandings[MinValue]
         && Test[Bob] <= Bandings[MaxValue]
    Thanks!

    So there are 2 ways that I can think of for doing that.
    1) if you are only using MDX clients like Excel or Reporting services you can create a text based measure that returns the banding name. (Note that this sort of approach does not work at the moment with PowerView as it only displays numeric measures). This
    would effectively let you show a label next to a reading as opposed to moving the reading under a given banding column.
    Banding Name :=
    CALCULATE (
        VALUES ( Bands[BandName] ),
        FILTER (
            Bands,
            [Average of GlucoseReading] >= Bands[BandMin]
                && [Average of GlucoseReading] <= Bands[BandMax]
                && NOT ( ISBLANK ( [Average of GlucoseReading] ) )
    2) This next approach will show the results exactly as you had them in your sample screenshots. It just takes a slight bending of the DAX. I'm using a SUMX here, not because I want to sum anything, but because the "X" version of SUMX basically loops over
    every row in the specified table and sums the expression in the second parameter. I have setup the second parameter so that it only returns a single value for the average if it is in the appropriate banding. 
    Banded Average:=IF (
        HASONEVALUE ( Bands[BandName] ),
        SUMX(
            'Bands',
            IF (
                NOT ( ISBLANK ( [Average of GlucoseReading] ) )
                    && [Average of GlucoseReading] >= MIN ( Bands[BandMin] )
                    && [Average of GlucoseReading] <= MIN ( Bands[BandMax] ),
                AVERAGE(Readings[GlucoseReading]),
                BLANK()
    ,AVERAGE(Readings[GlucoseReading])
    http://darren.gosbell.com - please mark correct answers

  • PCI-6542 card for dynamic genration and static control

    Hello
    I am using only one PCI -6542 card. I want to use few channels for dynamic signal. These are control signals for the ADC. While the conversion is in progress I want to use remaining signals for switching relays for measurement.
    Application requirements are as follows.
    Channel 0-14 are for dynamic genration for giving control signal to ADC.
    Channel 15-31 are for static control bits for relays.
    Requirement is pattern should be running continiously and parallely I shoud able to switch the ralay. It can be in any order and any seqence as per the demand.
    Thanks and Reards
    Amol

    Hello
    I can able to solve this problem. For your referance I have attached here the code. Which works for this.
    Thanks and Regards
    Amol
    Attachments:
    application.vi ‏65 KB

  • What is the best design pattern for this problem?

    No code to go with the question. I am trying to settle on the best design pattern for the problem before I code. I want to use an Object Oriented approach.
    I have included a basic UML diagram of what I was thinking so far. 
    Stated simply, I have three devices; Module, Wired Modem, and Wireless Modem.
    In the Device Under Test parent class, I have put the attributes that are variable from device to device, but common to all of them.
    In the child classes, I have put the attributes that are not variable to each copy of that device. The attributes are common across device types. I was planning to use controls in the class definition that have the data set to a default value, since it doesn't change for each serial number of that device. For example, a Module will always have a Device Type ID of 1. These values are used to query the database.
    An example query would be [DHR].[GetDeviceActiveVersions] '39288', 1, '4/26/2012 12:18:52 PM'
    The '1' is the device type ID, the 39288 is the serial number, and the return would be "A000" or "S002", for example.
    So, I would be pulling the Serial Number and Device Type ID from the Device Under Test parent and child, and passing them to the Database using a SQL string stored in the control of the Active Versions child class of Database.
    The overall idea is that the same data is used to send multiple queries to the database and receiving back various data that I then evaluate for pass of fail, and for date order.
    What I can't settle on is the approach. Should it be a Strategy pattern, A Chain of Command pattern, a Decorator pattern or something else. 
    Ideas?

    elrathia wrote:
    Hi Ben,
    I haven't much idea of how override works and when you would use it and why. I'm the newest of the new here. 
    Good. At least you will not be smaking with a OPPer dOOPer hammer if I make some gramatical mistake.
    You may want to look at this thread in the BreakPoint where i trie to help Cory get a handle on Dynamic Dispatching with an example of two classes that inherit from a common parent and invoke Over-ride VIs to do the same thing but with wildly varying results.
    The example uses a Class of "Numeric"  and a sibling class "Text" and the both implement an Add method.
    It is dirt simple and Cory did a decent job of explaining it.
    It just be the motivation you are looking for.
    have fun!
    Ben
    Ben Rayner
    I am currently active on.. MainStream Preppers
    Rayner's Ridge is under construction

  • Cannot perform insert/update on tabular form, because of dynamic action

    Hello all,
    I have created dynamic action which computes value from several tabular form cells.
    This functionality works nice, when I change value in associated cell then the computed value is changed by the dynamic action.
    But I am not able to insert or update the row in tabular form when the dynamic action is enabled. When I set condition to "Never", then the row is inserted or updated without any problems.
    Any guess where is the problem?
    Apex version: 4.1.1.00.23
    Jiri

    Ok, below are details related to my DA. Sorry for the poor description in previous posts.
    Triggered by: Chnage event
    Selection type: jQuery Selector
    jQuery Selector
    td[headers='SPECIESCODE'] input,td[headers='MEASURETYPE'] input,td[headers='TRUNKLOGID'] input,td[headers='LOGCLASS'] input,td[headers='LENGTH'] input,td[headers='PIECES'] input,td[headers='DIAMETER'] inputTrue Actions:
    *1.*
    //get element id which was changed by user
    var v_elementid = (jQuery(this.triggeringElement).attr('id'));
    switch(v_elementid.substr(0,3))
      case "f05":
       //assign value from triggered element to hidden field     
       $s("P210_HIDDEN_SPECIES",jQuery(this.triggeringElement).val());   
       //assign actual values also to other hidden elements     
       $s("P210_HIDDEN_MEASURE",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='MEASURETYPE'] input").val());
       $s("P210_HIDDEN_TRUNKLOGID",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='TRUNKLOGID'] input").val());
       $s("P210_HIDDEN_LOGCLASS",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='LOGCLASS'] input").val()); 
       $s("P210_HIDDEN_LENGTH",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='LENGTH'] input").val()); 
       $s("P210_HIDDEN_PIECES",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='PIECES'] input").val()); 
       $s("P210_HIDDEN_DIAMETER",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='DIAMETER'] input").val()); 
       break;
      case "f06":
       $s("P210_HIDDEN_MEASURE",jQuery(this.triggeringElement).val());
       //assign actual values also to other hidden elements     
       $s("P210_HIDDEN_SPECIES",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='SPECIESCODE'] input").val());
       $s("P210_HIDDEN_TRUNKLOGID",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='TRUNKLOGID'] input").val());
       $s("P210_HIDDEN_LOGCLASS",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='LOGCLASS'] input").val()); 
       $s("P210_HIDDEN_LENGTH",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='LENGTH'] input").val()); 
       $s("P210_HIDDEN_PIECES",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='PIECES'] input").val()); 
       $s("P210_HIDDEN_DIAMETER",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='DIAMETER'] input").val());      
       break;
      case "f07":
       $s("P210_HIDDEN_TRUNKLOGID",jQuery(this.triggeringElement).val());
       //assign actual values also to other hidden elements     
       $s("P210_HIDDEN_MEASURE",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='MEASURETYPE'] input").val());
       $s("P210_HIDDEN_SPECIES",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='SPECIESCODE'] input").val());
       $s("P210_HIDDEN_LOGCLASS",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='LOGCLASS'] input").val()); 
       $s("P210_HIDDEN_LENGTH",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='LENGTH'] input").val()); 
       $s("P210_HIDDEN_PIECES",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='PIECES'] input").val()); 
       $s("P210_HIDDEN_DIAMETER",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='DIAMETER'] input").val());
       break;
    }*2.*
    //get element id which was changed by user
    var v_elementid = (jQuery(this.triggeringElement).attr('id'));
    switch(v_elementid.substr(0,3))
      case "f09":
       $s("P210_HIDDEN_LOGCLASS",jQuery(this.triggeringElement).val());
       //assign actual values also to other hidden elements     
       $s("P210_HIDDEN_MEASURE",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='MEASURETYPE'] input").val());
       $s("P210_HIDDEN_TRUNKLOGID",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='TRUNKLOGID'] input").val());
       $s("P210_HIDDEN_SPECIES",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='SPECIESCODE'] input").val());
       $s("P210_HIDDEN_LENGTH",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='LENGTH'] input").val()); 
       $s("P210_HIDDEN_PIECES",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='PIECES'] input").val()); 
       $s("P210_HIDDEN_DIAMETER",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='DIAMETER'] input").val());      
       break;
      case "f12":
       $s("P210_HIDDEN_LENGTH",jQuery(this.triggeringElement).val());
       //assign actual values also to other hidden elements     
       $s("P210_HIDDEN_MEASURE",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='MEASURETYPE'] input").val());
       $s("P210_HIDDEN_TRUNKLOGID",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='TRUNKLOGID'] input").val());
       $s("P210_HIDDEN_SPECIES",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='SPECIESCODE'] input").val());
       $s("P210_HIDDEN_LOGCLASS",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='LOGCLASS'] input").val());
       $s("P210_HIDDEN_PIECES",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='PIECES'] input").val()); 
       $s("P210_HIDDEN_DIAMETER",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='DIAMETER'] input").val());
       break;
      case "f13":
       $s("P210_HIDDEN_PIECES",jQuery(this.triggeringElement).val());
       //assign actual values also to other hidden elements     
       $s("P210_HIDDEN_MEASURE",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='MEASURETYPE'] input").val());
       $s("P210_HIDDEN_TRUNKLOGID",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='TRUNKLOGID'] input").val());
       $s("P210_HIDDEN_SPECIES",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='SPECIESCODE'] input").val());
       $s("P210_HIDDEN_LENGTH",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='LENGTH'] input").val()); 
       $s("P210_HIDDEN_LOGCLASS",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='LOGCLASS'] input").val());
       $s("P210_HIDDEN_DIAMETER",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='DIAMETER'] input").val());  
       break;
      case "f14":
       $s("P210_HIDDEN_DIAMETER",jQuery(this.triggeringElement).val());
       //assign actual values also to other hidden elements     
       $s("P210_HIDDEN_MEASURE",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='MEASURETYPE'] input").val());
       $s("P210_HIDDEN_TRUNKLOGID",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='TRUNKLOGID'] input").val());
       $s("P210_HIDDEN_SPECIES",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='SPECIESCODE'] input").val());
       $s("P210_HIDDEN_LENGTH",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='LENGTH'] input").val()); 
       $s("P210_HIDDEN_PIECES",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='PIECES'] input").val()); 
       $s("P210_HIDDEN_LOGCLASS",jQuery(this.triggeringElement).parents("tr:first").find("td[headers='LOGCLASS'] input").val());
       break;
    }*3.*
    call PL/SQL function (values from hidden fields are used as input params)
    begin
    :P210_HIDDEN_VOLUME :=  function(:P210_HIDDEN_SPECIES,:P210_HIDDEN_MEASURE,:P210_HIDDEN_TRUNKLOGID,:P210_HIDDEN_LOGCLASS,:P210_HIDDEN_LENGTH,:P210_HIDDEN_DIAMETER,:P210_HIDDEN_PIECES, :G_USERLANG);
    end;*4.*
    here I want to set computed value from hidden field to VOLUME cell in tabular form. And it seems there is some problem, because not only the corresponding VOLUME cell is changed, but also several other cells. I realized that also several cells which are hidden to user has same value as computed VOLUME field. Including ROWID and then the insert/update operations are not done.
    // find the VOLUME-Field and set it to the computed value
    jQuery(this.triggeringElement).parents("tr:first").find("td[headers='VOLUME'] input").val($v("P210_HIDDEN_VOLUME"));I hope I have provide more information and somebody will be able to he help me. maybe the problem is clear, but with my poor jQuery knowledge i am not able to find it.
    Thanks in advance!
    -Jiri
    Edited by: Jiri N. on Aug 10, 2012 3:24 AM

  • Can I use differnet patterns for a "digital pattern match start trigger"

    Hello,
    Currently I would like use different patterns for a trigger the PCIe-6537 board to start capture data, for example, two patterns: 1101 and 1100 in digital IO lines line0:3, whenever one of this two pattern happens, start capture.
    It seems like "digital pattern match" in DAQmx trigger can use one pattern only.
    thanks!

    Hi tt_ni,
    Pattern I/O only allows the acquisition
    based off of one pattern. This is a “limitation” of the hardware based on the
    registers being set a certain way and monitoring a change from that. You could
    add external circuitry to OR your patterns and based the pattern I/O off of the
    output of that external circuitry. The other option is to look at an FPGA
    option.
    Mark E.
    Precision DC Product Support Engineer
    National Instruments
    Digital Multimeters (DMMs) and LCR Meters
    Programmable Power Supplies and Source Measure Units

  • Re: pattern for persistance management: the solution?

    Thanks to Forte France consulting group and Marc Sonnet (Forte
    France), here is one solution for our problem.
    We don't have test it yet but this seems pretty good.
    thanks for all your replies,
    Corinne Barbat
    ____________________________ S&eacute;parateur R&eacute;ponse ________________________________
    Objet : Re: Bloated clients (was: pattern for persistance management
    Auteur : [email protected] &agrave; _INTERNET
    Date : 23/10/98 00:41
    Geoff,
    Fromhat I've understood of Forte's partitioning behaviour, the only
    way to get rid of b, c, d and e Projects from the client partition is by
    deploying them as a shared library and having the Client dynamically
    load them at run-time. Any other way, including creating a complex
    structure of interfaces to avoid the client referencing the other
    projects directly, or even deploying the Server projects as another
    Application, will not prevent these projects from being included in the
    Client Partition.
    The problem I guess is that when we think along the lines of components
    we immediately associate them with Service Objects. Clearly, it's the
    Project and not the SO which can be classified as a component in Forte.
    The questions I have is : Now that we know how Forte's Partioning
    mechanism works, would it significantly impact the way we partition our
    Apps ? I'm not so sure.
    Eric
    ----Original Message Follows----
    Date: Thu, 22 Oct 1998 14:52:29 -0400
    From: Geoff Puterbaugh <[email protected]>
    To: [email protected]
    Subject: Bloated clients (was: pattern for persistance management)
    Reply-To: Geoff Puterbaugh <[email protected]>
    This topic is of keen interest to me as well. At my customer's
    urging, I wrote a little test application spread across
    four or five projects, each supplying the next..
    a << b << c << d << e
    The projects b,c,d, and e each contain a class and a service
    object based on that class. I partitioned it (a client
    partition and four server partitions for b c d e) and made
    a distribution. Then I looked at the client partition
    and discovered b c d e were projects for it!
    If you code-generate this and run fcompile, you will see
    that all the code for all the projects in the entire chain
    of supplier projects winds up in the client partition.
    To be clear about this, if project e contains a class X,
    you will see the source code for X.init and all other
    X methods in the client partition.
    This appears to be the default behavior, and the open
    question is how to change the default behavior, if that
    can be done.
    All my best,
    Geoff
    P.S. If e uses GenericDBMS as a supplier, it will show up
    in the client too. Of course!
    This is at least my understanding as of today.
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>
    Get Your Private, Free Email at http://www.hotmail.com
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>

    Thanks to Forte France consulting group and Marc Sonnet (Forte
    France), here is one solution for our problem.
    We don't have test it yet but this seems pretty good.
    thanks for all your replies,
    Corinne Barbat
    ____________________________ S&eacute;parateur R&eacute;ponse ________________________________
    Objet : Re: Bloated clients (was: pattern for persistance management
    Auteur : [email protected] &agrave; _INTERNET
    Date : 23/10/98 00:41
    Geoff,
    Fromhat I've understood of Forte's partitioning behaviour, the only
    way to get rid of b, c, d and e Projects from the client partition is by
    deploying them as a shared library and having the Client dynamically
    load them at run-time. Any other way, including creating a complex
    structure of interfaces to avoid the client referencing the other
    projects directly, or even deploying the Server projects as another
    Application, will not prevent these projects from being included in the
    Client Partition.
    The problem I guess is that when we think along the lines of components
    we immediately associate them with Service Objects. Clearly, it's the
    Project and not the SO which can be classified as a component in Forte.
    The questions I have is : Now that we know how Forte's Partioning
    mechanism works, would it significantly impact the way we partition our
    Apps ? I'm not so sure.
    Eric
    ----Original Message Follows----
    Date: Thu, 22 Oct 1998 14:52:29 -0400
    From: Geoff Puterbaugh <[email protected]>
    To: [email protected]
    Subject: Bloated clients (was: pattern for persistance management)
    Reply-To: Geoff Puterbaugh <[email protected]>
    This topic is of keen interest to me as well. At my customer's
    urging, I wrote a little test application spread across
    four or five projects, each supplying the next..
    a << b << c << d << e
    The projects b,c,d, and e each contain a class and a service
    object based on that class. I partitioned it (a client
    partition and four server partitions for b c d e) and made
    a distribution. Then I looked at the client partition
    and discovered b c d e were projects for it!
    If you code-generate this and run fcompile, you will see
    that all the code for all the projects in the entire chain
    of supplier projects winds up in the client partition.
    To be clear about this, if project e contains a class X,
    you will see the source code for X.init and all other
    X methods in the client partition.
    This appears to be the default behavior, and the open
    question is how to change the default behavior, if that
    can be done.
    All my best,
    Geoff
    P.S. If e uses GenericDBMS as a supplier, it will show up
    in the client too. Of course!
    This is at least my understanding as of today.
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>
    Get Your Private, Free Email at http://www.hotmail.com
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>

  • Dynamic display of Measure in SSAS

    Hi All,
    I have a requirement where i need to show count of Customers under a Sales Person. For this we created a Measure with Count of Customers. But Users want to see this Measure only when they select Sales Person Dimension on Pivot. That means this Measure should
    be in hidden mode by default. Only when user selected Sales Person on Columns or rows, this Measure should be displayed.
    Can you please let me know how to implement this.
    Thanks in advance.
    Regards,
    Attaluri

    Hi Attaluri,
    If I understand you correctly, you access the cube using Excel and want to hide the measure except when user selected Sales Person on Columns or rows, right? Base on my research, we don't have a direct option to dynamically hide the measures currently. If
    you have any concerns about this feature, you can submit a feedback at
    http://connect.microsoft.com/SQLServer/Feedback and hope it is resolved in the next release of service pack or product.
    We appreciate your comprehension.
    Regards,
    Charlie Liao
    TechNet Community Support

  • Re: Bloated clients (was: pattern for persistancemanagement)

    Geoff,
    From what I've understood of Forte's partitioning behaviour, the only way to get rid of b, c, d and e Projects from the client partition is by
    deploying them as a shared library and having the Client dynamically
    load them at run-time. Any other way, including creating a complex
    structure of interfaces to avoid the client referencing the other
    projects directly, or even deploying the Server projects as another
    Application, will not prevent these projects from being included in the
    Client Partition.
    The problem I guess is that when we think along the lines of components
    we immediately associate them with Service Objects. Clearly, it's the
    Project and not the SO which can be classified as a component in Forte.
    The questions I have is : Now that we know how Forte's Partioning
    mechanism works, would it significantly impact the way we partition our
    Apps ? I'm not so sure.
    Eric
    ----Original Message Follows----
    Date: Thu, 22 Oct 1998 14:52:29 -0400
    From: Geoff Puterbaugh <[email protected]>
    To: [email protected]
    Subject: Bloated clients (was: pattern for persistance management)
    Reply-To: Geoff Puterbaugh <[email protected]>
    This topic is of keen interest to me as well. At my customer's
    urging, I wrote a little test application spread across
    four or five projects, each supplying the next..
    a << b << c << d << e
    The projects b,c,d, and e each contain a class and a service
    object based on that class. I partitioned it (a client
    partition and four server partitions for b c d e) and made
    a distribution. Then I looked at the client partition
    and discovered b c d e were projects for it!
    If you code-generate this and run fcompile, you will see
    that all the code for all the projects in the entire chain
    of supplier projects winds up in the client partition.
    To be clear about this, if project e contains a class X,
    you will see the source code for X.init and all other
    X methods in the client partition.
    This appears to be the default behavior, and the open
    question is how to change the default behavior, if that
    can be done.
    All my best,
    Geoff
    P.S. If e uses GenericDBMS as a supplier, it will show up
    in the client too. Of course!
    This is at least my understanding as of today.
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>
    Get Your Private, Free Email at http://www.hotmail.com
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>

    Geoff,
    From what I've understood of Forte's partitioning behaviour, the only way to get rid of b, c, d and e Projects from the client partition is by
    deploying them as a shared library and having the Client dynamically
    load them at run-time. Any other way, including creating a complex
    structure of interfaces to avoid the client referencing the other
    projects directly, or even deploying the Server projects as another
    Application, will not prevent these projects from being included in the
    Client Partition.
    The problem I guess is that when we think along the lines of components
    we immediately associate them with Service Objects. Clearly, it's the
    Project and not the SO which can be classified as a component in Forte.
    The questions I have is : Now that we know how Forte's Partioning
    mechanism works, would it significantly impact the way we partition our
    Apps ? I'm not so sure.
    Eric
    ----Original Message Follows----
    Date: Thu, 22 Oct 1998 14:52:29 -0400
    From: Geoff Puterbaugh <[email protected]>
    To: [email protected]
    Subject: Bloated clients (was: pattern for persistance management)
    Reply-To: Geoff Puterbaugh <[email protected]>
    This topic is of keen interest to me as well. At my customer's
    urging, I wrote a little test application spread across
    four or five projects, each supplying the next..
    a << b << c << d << e
    The projects b,c,d, and e each contain a class and a service
    object based on that class. I partitioned it (a client
    partition and four server partitions for b c d e) and made
    a distribution. Then I looked at the client partition
    and discovered b c d e were projects for it!
    If you code-generate this and run fcompile, you will see
    that all the code for all the projects in the entire chain
    of supplier projects winds up in the client partition.
    To be clear about this, if project e contains a class X,
    you will see the source code for X.init and all other
    X methods in the client partition.
    This appears to be the default behavior, and the open
    question is how to change the default behavior, if that
    can be done.
    All my best,
    Geoff
    P.S. If e uses GenericDBMS as a supplier, it will show up
    in the client too. Of course!
    This is at least my understanding as of today.
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>
    Get Your Private, Free Email at http://www.hotmail.com
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>

  • Is there a design pattern for this?

    I'm looking for a solution to a design problem I have.
    For a restaurant booking system I need a number of different opening times describing when you can and cannot book. These opening times are essentially Jodatime Period objects. There's a set of opening times spanning a week and these are repeated for every week (a default set of opening times) however it's possible to override these opening times say for a specific day.
    The domain model would be something like a Restaurant class holding 2 Lists of OpeningTime objects one for defaultOpeningTimes and the other for overiddenOpeningTimes the overidden ones get used if they exist for the requested time period. However the database model would be a bit messy as I'd have 2 lists mapping to the same table (OpeningTime). Is that a good idea? Perhaps there's a design pattern for this, if someone could point me in the right direction I'd be very grateful, or perhaps this is the best solution? Thanks!

    jduprez wrote:
    But why do you put the logic in the database too (I'm no DB expert and I didn't know these concepts until I read your post, but that's what a dynamic view based on derived values looks like to me): performance (1 round-trip instead of two)?Hi jduprez. Long time no speakee.
    I guess part of it is that I spent many years as a DBA and modeller, and really appreciate what it's taught me about design. Also, databases are (or should be) designed from the ground up to provide data-directed requests optimally, and include all sorts of nice stuff like transaction handling that aid consistency, as well as speed.
    That said: I HATE SQL. Think Coliseum, with that emblazoned in 60-foot high letters around its walls, and it might come close to just how much I hate that so-called "language". I hate its form; I hate it's inconsistencies; I hate the fact that something like what OP is trying to do is NOT an easy task (and might involve the creation of a table that simply contains Dates, just in order to satisfy Boolean logic).
    However, once you work it out, a database view (at least from the database's standpoint; JDBC I'm not so sure about) is just like any other Table - and that I DO like.
    Programs are good at processing parameterized (ugh) temporal information; databases are good at persistence and high volume. Those two may meet at some point, but I reckon it's going to take another Codd (or Joda) before it does.
    - that's clearer to 90% of the dev team (my biased numbers, based on 50% of Java developers having decent knowledge of SQL and much less than that having the advanced SQL knowledge which I rank your suggestion at)Sounds to me like you'll get the solution that matches the skills you have then. Is that what you really want, if a better one is available?
    - that doesn't require investigating the if of your suggestion (JDBC support)Agreed, but only because my JDBC knowledge isn't what it could be. I'd also be surprised if it doesn't support access to a named view, since they were designed to be equivalent to Tables.
    - the Op is using DAOs, so it's possible, if profiling does show this is hampering performances, to change that with no impact on the client code that calls the DAO.There's no doubt that a database solution is much higher level than a programming one; but, as I said, it's what they were designed to do. And tinkering around with program optimization has the feel of a "hacker's solution" to me. Not that there's any particular problem with that - I do it quite often when I have no control over my source - but I also try to keep in mind what the "actual" problem is.
    Winston

Maybe you are looking for