` Printed Icetips Article

Icetips Article



Par2: Print Button - More than one report from one button
1998-12-02 -- Dennis Evans
 
>I want to add one more print button on the browse form, which using the control 
>template for print browse button. This is a good tool for printing current browse
record.
>But this tool can only add one button on eash browse form.


Hi all,

You really only need one button to print all your reports.

This is how to do it,

Add a button control to the window, not on a tab - we want the button to be
displayed regardless of the tab.

Call the control ?PrintButton or something.

In the Window manager Init method, after the browse is initialized add these two lines.

Brwx.PrintControl = ?PrintButton
Brwx.PrintProcedure = x

Where x is one larger than the number of update procedures. If you have three browses
and three update procedures then x would be equal to 4.   I would use some equates 
here.

In the control event handling, tab new selection or whereever you want to change 
report procedures, if you want to call more than one report  add this line

  Brwx.PrintProcedure = choice(?CurrentTab)

This property must be set to the sequence number of the report you want to be currently 
active.  This will be the value passed to the run method for the call to the update or
report procedures.

The property can be set pretty much anywhere based on whatever condition you want.

Now the hard part,  in the Window manager Run method use the embed editor rather 
than the embed points for this one Change the method to look like this.

ThisWindow.Run PROCEDURE(USHORT Number,BYTE Request)

ReturnValue          BYTE,AUTO
! Start of "WindowManager Method Data Section"
! [Priority 5000]

! End of "WindowManager Method Data Section"
  CODE
  ! Start of "WindowManager Method Executable Code Section"
  ! [Priority 2500]

  ! Parent Call
  ReturnValue =PARENT.Run(Number,Request)
  ! [Priority 6000]
   omit('####')
  GlobalRequest = Request
  execute Number
     NormalUpdateProcedure
     AnotherUpdateProcedure
  end
  ReturnValue = GlobalResponse
  ! [Priority 8500]
   ####

The above is the template generated, with two update procedures, copy it and then 
omit it out. (Wonderful idea, wish I could take credit. )

Now add these lines

  GlobalRequest = Request
  execute Number
     NormalUpdateProcedure
     AnotherUpdateProcedure
     Report_1( any parameters )
     Report_2( any parameters )
  end
  ReturnValue = GlobalResponse
  ! [Priority 8500]
  ! End of "WindowManager Method Executable Code Section"
  RETURN ReturnValue

Now if you want to print one record, you can use the same report to print one record or 
all the records or a range.

Add the Extended process control template to the report, and check the single record.

Now add some kind of control or condition to the browse that will allow the user to 
decide if they want one record or the all records.

Change the derived Run method to this 

  GlobalRequest = Request
  execute Number
     NormalUpdateProcedure
     AnotherUpdateProcedure
     begin
        if Condition = User Wants All Records
           GlobalRequest = value <> ProcessRecord
        end ! if
        Report_1( any parameters )
     end ! execute option 3
     Report_2( any parameters )
      ...
  end

The report does not care about the value of the request, except if it is equal to the 
equate ProcessRecord.

It is a little more fooling around than a template, but with an execute statement and a 
couple of if else or a case statement you can call all the reports that are related to the

browse from the screen.

The test conditions can be based on the current tab, sort order, range limit or a user 
selection of some kind etc...

This is really simpler than it looks and I think easier than having several buttons 
to call different reports.



Printed May 5, 2024, 1:31 pm
This article has been viewed/printed 35116 times.