Page 2 of 3

Re: Report Drill Down

PostPosted: Fri Jan 29, 2016 7:13 pm
by reinaldocrespo
Hey James;

And these licenses are very expensive running from US$4000 to US$9000.


I thought it was odd those prices you quoted. Here is link to prices from the webpage https://www.fast-report.com/en/buy/#!/VCL%20(Embarcadero%20RAD%20Studio|Delphi|C++%20Builder)/FastReport%205%20VCL/

Its $199. But, again, don't bother buying from them directly unless you are using Delphi or some .net.


Reinaldo.

Re: Report Drill Down

PostPosted: Fri Jan 29, 2016 7:38 pm
by Marcelo Via Giglio
Hola,


you can see some samples in this link http://www.fast-report.com:8097/ fastreport is able to export the report to many formats, one of them is html, then can be easy to use FR for web systems.

regards

Marcelo Vía

Re: Report Drill Down

PostPosted: Sat Jan 30, 2016 4:47 am
by James Bott
Reinaldo,

Thanks for the clarification.

James

Re: Report Drill Down

PostPosted: Sat Jan 30, 2016 4:48 am
by James Bott
I remember seeing something about a drill-down some time ago, so I searched the forum and found this thread:

viewtopic.php?f=3&t=29853&p=169687&hilit=tree+browse&sid=3087ff7956eeff8bfcbab81e27c81485#p169687

It contains a discussion of using a tree and browse to create a drill-down report.

James

Re: Report Drill Down

PostPosted: Sat Jan 30, 2016 7:03 am
by James Bott
Rienaldo,

The prices I was looking at were site licenses. I assume you need one for each client.

James

Re: Report Drill Down

PostPosted: Sat Jan 30, 2016 9:50 am
by Silvio.Falconi
antonio,
I not understood why it cannot make with Treport

I found
http://www.infosol.com/crystal-reports- ... rill-down/

http://www.sdn.sap.com/irj/scn/index?ri ... ayout=true


We can add at
METHOD SayData(nRow, nCol, nLine) CLASS TRColumn

If ::lDrill

baction to a user function where the user can show what he want show ...

Endif

Re: Report Drill Down

PostPosted: Sat Jan 30, 2016 10:02 am
by Antonio Linares
Silvio,

You mean from the preview, right ?

We have a metafile there, we should detect where the user double clicks and then create a new metafile at runtime and open it, I guess

Re: Report Drill Down

PostPosted: Sat Jan 30, 2016 10:56 am
by Silvio.Falconi
yes,
I think can be supported only for numbers fields but i not understood good if it can be extended also to all format fields

I remember on Metafile if the user make double click he call the zoom !!!

Re: Report Drill Down

PostPosted: Sat Jan 30, 2016 10:59 am
by Silvio.Falconi
the field drill must have a box arround ( see the film I send you on post forum)

Re: Report Drill Down

PostPosted: Sat Jan 30, 2016 12:48 pm
by Silvio.Falconi
Antonio,
use this this small test to make the drill
Code: Select all  Expand view

#include "fivewin.ch"
#include "Splitter.ch"
#include "ord.ch"
#include "xbrowse.ch"

Static oWnd
static cFwhPath   := "c:\work\fwh\"

REQUEST DBFCDX

Function Main()
DEFINE WINDOW oWnd MDI

    DEFINE BUTTONBAR oBar OF oWnd SIZE 60, 60 2007

    DEFINE STATUSBAR oStatusBar PROMPT "
Some tests" OF oWnd

ACTIVATE WINDOW oWnd ;
           ON INIT customer()

//-------------------------------------------------------------------------------------------------------------------//

   init procedure PrgInit
   SET DATE ITALIAN
   SET CENTURY ON
   SET TIME FORMAT TO "
HH:MM:SS"
   SET EPOCH TO YEAR(DATE())-50

   SET DELETED ON
   SET EXCLUSIVE OFF

   RDDSETDEFAULT( "
DBFCDX" )

   XbrNumFormat( 'E', .t. )
   SetKinetic( .f. )
   SetGetColorFocus()
   SetBalloon( .t. )
return

//-----------------------------------------------------------------------------------------//

    Function Customer()

       LOCAL oWnd, oDlg, oExpBar, aPanel[3], oBrw, oCol, oSplitV, aCampos ,;
          cQry, oQry, oError,oWndCli
      local oFont,oTree

   local nGrpClr     := RGB(255,250,220)
   local nTotClr     := RGB(200,255,200)

   DEFINE FONT oFont NAME "
TAHOMA" SIZE 0,-14


      IF oWndCli == NIL

            *  DbUseArea( .T., "
DBFCDX", "CUSTOMER.DBF", "CUSTOMER", .T., .F.)

            *   dbselectarea( "
CUSTOMER" )

           oTree:=MakeTree()

          DEFINE WINDOW oWndCli ;
             TITLE  "
Test Drill" ;
             BORDER SINGLE MDICHILD OF oWnd



          oExpBar = TExplorerBar():New( 00, 00, 200, oWndCli:nHeight, oWndCli )

          aPanel[1] = oExpBar:AddPanel( "
CLIENTES", "Clientes32" )
          aPanel[1]:lSpecial = .t.
          aPanel[1]:AddLink( "
Nuevo    ", , "nuevo16" )
          aPanel[1]:AddLink( "
Modificar", , "modifi16" )
          aPanel[1]:AddLink( "
Eliminar ", , , "elimi16" )


          aPanel[2] = oExpBar:AddPanel( "
REPORTES", "print32" )
          aPanel[2]:AddLink( "
Report Drill", {|| oBrw:report() }, "repo1" )

          aPanel[3] = oExpBar:AddPanel( "
SALIDA", "salir32" )
          aPanel[3]:AddLink( "
Salir", {|| oWndCli:End() }, "salir16" )





          oBrw := TXBrowse():New( oWndCli )



                aBrowse   := { { { || "
" }, i18n("HireDate"), 50, }  ,;
                                { { || AGE }, i18n("
Age"), 120, } ,;
                               { { || SALARY }, i18n("
Salary"), 80,NumPict ( 12, 2 ) } }


         FOR i := 1 TO Len(aBrowse)
                   oCol := oBrw:AddCol()
                   oCol:bEditValue := aBrowse[ i, 1 ]
               *   oCol:bStrData := aBrowse[ i, 1 ]
                   oCol:cHeader  := aBrowse[ i, 2 ]
                   oCol:nWidth   := aBrowse[ i, 3 ]
                        if !Empty(aBrowse[ i, 4 ])
                            oCol:cEditPicture:=aBrowse[ i, 4 ]
                           Endif
          NEXT




    WITH OBJECT oBrw
       :nDataType:= 1
       :SetTree( oTree)
      :nStretchCol         := 1
      :lDisplayZeros       := .f.
      :bChange             := { || CUST->( DBGOTO( oBrw:oTreeItem:Cargo[ 4 ] ) ) }
      :bLock               := { || CUST->( RLOCK() ) }
      :bUnLock             := { || CUST->( DBUNLOCK() ) }
      :bClrStd             := { || { CLR_BLACK, If( oBrw:oTreeItem:nLevel == 1, nGrpClr, ;
                                                If( oBrw:oTreeItem:cPrompt == "
Sub-Total", nTotClr, ;
                                                CLR_WHITE ) ) } }

             :nMarqueeStyle    := MARQSTYLE_HIGHLROW
             :nColDividerStyle := LINESTYLE_BLACK
             :nStretchCol      := STRETCHCOL_LAST
             :lColDividerComplete := .t.
             :nHeaderHeight := 30
             :nLeft := 203
             :l2007 := .t.
             :lFooter := .f.
             :lRecordSelector := .t.
             :bClrStd := {|| IF( RecNo() % 2 == 0, {CLR_BLACK, CLR_WHITE}, {0, RGB(203,226,254)} ) }

      // Bitmaps
             WITH OBJECT :aCols[ 1 ]
             :cHeader  := "
State/City"
             :AddBitmap( {  FWRArrow(), FWDArrow(), cFwhPath + "
bitmaps\16x16\reset.bmp" } )
            :cFooter          := "
GRAND TOTAL"
      END

      // When Group is closed show totals. When open show totals at bottom
      // Allow edit of columns and save data to DBF, update group and grand totals
      WITH OBJECT :aCols[ 3 ]
         :bEditValue       := { |x| If( oBrw:oTreeItem:lOpened, 0, ;
                                    If( x == nil, oBrw:oTreeItem:Cargo[ 2 ], ;
                                    CUST->AGE := oBrw:oTreeItem:Cargo[ 2 ] := x ) ) }
         :nTotal           := oTree:Cargo[ 2 ]
         //
         :nEditType        := EDIT_GET
         :bEditWhen        := { || oBrw:oTreeItem:nLevel > 1 .and. oBrw:oTreeItem:cPrompt != "
Sub-Total" }
         :bOnChange        := { |o,nOld| oBrw:oTreeItem:Parent():Cargo[ 2 ] += ( o:Value - nOld ), oBrw:Refresh() }
      END




      WITH OBJECT :aCols[ 4 ]
         :bEditValue       := { |x| If( oBrw:oTreeItem:lOpened, 0, ;
                                    If( x == nil, oBrw:oTreeItem:Cargo[ 3 ], ;
                                    CUST->SALARY := oBrw:oTreeItem:Cargo[ 3 ] := x ) ) }
         :nTotal           := oTree:Cargo[ 3 ]
         //
         :nEditType        := EDIT_GET
         :bEditWhen        := { || oBrw:oTreeItem:nLevel > 1 .and. oBrw:oTreeItem:cPrompt != "
Sub-Total" }
         :bOnChange        := { |o,nOld| oBrw:oTreeItem:Parent():Cargo[ 3 ] += ( o:Value - nOld ), oBrw:Refresh() }
      END

      //
      :CreateFromCode()
   END



          oBrw:CreateFromCode()

          @ 00,201 SPLITTER oSplitV VERTICAL ;
             PREVIOUS CONTROLS oExpBar ;
             HINDS CONTROLS oBrw ;
             SIZE 1, oWndCli:nHeight PIXEL ;
             OF oWndCli ;
             3DLOOK UPDATE

         * oSplitV:lStatic:=.t.

          SET MESSAGE OF oWndCli TO "
Customer "

          oBrw:SetFocus()

          ACTIVATE WINDOW oWndCli MAXIMIZED ;
             ON RESIZE( oExpBar:AdjLeft(), oSplitV:AdjClient(), oSplitV:AdjRight() ) ;
             VALID( oWndCli := NIL, .t. )
       ELSE
          oWndCli:Restore()
          oWndCli:SetFocus()
       ENDIF

       RETURN



//-----------------------------------------------------------------------------------//


static function MakeTree()

   field STATE,CODE,CITY

   local cPath    := cFwhPath + "
samples\"
   local oTree, oState, oCity

   USE ( cPath + "
STATES" ) NEW SHARED
   INDEX ON CODE TAG CODE TO STMP MEMORY
   USE ( cPath + "
CUSTOMER" ) NEW ALIAS CUST SHARED
   INDEX ON STATE+CITY TAG STATE TO CTMP MEMORY
   SET RELATION TO STATE INTO STATES
   GO TOP

   TREE oTree
   oTree:Cargo    := { "
", 0, 0.00, 0 }
   do while ! CUST->( eof() )
      TREEITEM oState PROMPT STATES->NAME CARGO { CTOD( "
" ), 0, 0.00, 0 }
      TREE
         do while STATES->NAME == oState:cPrompt .and. ! CUST->( eof() )
            TREEITEM oCity PROMPT CUST->CITY ;
               CARGO { CUST->HIREDATE, CUST->AGE, CUST->SALARY, CUST->( RECNO() ) }
            oState:Cargo[ 2 ]    += oCity:Cargo[ 2 ]
            oState:Cargo[ 3 ]    += oCity:Cargo[ 3 ]
            CUST->( DbSkip( 1 ) )
         enddo
         TREEITEM "
Sub-Total" CARGO oState:Cargo
         oTree:Cargo[ 2 ]  += oState:Cargo[ 2 ]
         oTree:Cargo[ 3 ]  += oState:Cargo[ 3 ]
      ENDTREE

   enddo
   ENDTREE

return oTree

//-----------------------------------------------------------------------------------//


1. how create a link on metafile ? perhaps we must modify the metafile class ?

Re: Report Drill Down

PostPosted: Sat Jan 30, 2016 1:35 pm
by cnavarro
Yes, this example is good

Image

Re: Report Drill Down

PostPosted: Sat Jan 30, 2016 6:18 pm
by James Bott
Issues about reports:

The real challenge is to get the customer to think about what information they really need.

In the early days, I had customers telling me they wanted a printout of all their sales. This was often over a hundred pages.

Then I asked them, what are you going to do with that? They thought about it for a few days, and then came up with something like, "Find the 10 best selling items, and the 10 worst." I told them I could do that on a one page report! And better still they didn't need to print it, but they could view it on their computer screen whenever they wanted and have up to the minute information. This made them happy.

So, while a drill-down report is useful, it probably isn't as useful as a more concise report that gives them just the information they need.

The next step is to figure out what the information means, and what should be done with that information. If possible, the software should handle it.

For instance, were the worst selling items, worse just because they ran out of stock? If so, the software could flag this and recommend reordering immediately. The software could watch the rate of sales and predict when an item is going to run out of stock and when that time period gets close to the expected delivery time for reorder, then the software should notify that it is time for reorder.

Reports are only a tool for users to help them make decisions. When we figure out what they are trying to accomplish we can attempt to move that decision making process into the software.

Re: Report Drill Down

PostPosted: Sat Jan 30, 2016 7:08 pm
by nageswaragunupudi
Mr James

I fully agree.

Re: Report Drill Down

PostPosted: Sun Jan 31, 2016 2:38 am
by dutch
I agree with James. The result means conclude Details and Summary to one and they will look when they have problem and need to see in deep. But it will take more time for produce every time you do. I think 2 reports are enough, Summary for normal and Details when you need more in deep details (sometime).

Re: Report Drill Down

PostPosted: Sun Jan 31, 2016 8:10 am
by Massimo Linossi
James, you're completely right.
It's better to ask in a selection dialog before the printing if you need a detailed or synthetic report.