Foxhound is the better* Database Monitor for SQL Anywhere.
*better: More thorough, more relevant, more effective.
...more Alerts, more All Clears, more details, more control in your hands.
|
Breck Carter
Last modified: December 23, 1996
mail to: bcarter@bcarter.com
[Home]
How can I move a field to the bottom of the last page in a DataWindow? That's where I need to put a signature line in a printed report. The summary band is a good place to start because it appears only once at the end of the report. Unfortunately, the summary band normally appears immediately after the detail data. If the last page is half full the summary band will appear in the middle of the page. One approach is to expand the summary band to fill the rest of the page and push the signature line down to the bottom of the band, as shown in Figure 1. |
Figure 1: Signature Line At The Bottom
Here's how it can be done, step by step:
Figure 2 shows the corresponding steps in PowerScript. |
Figure 2: Moving The Summary Signature Field
integer li_RC long ll_row_count string ls_error long ll_first_row long ll_last_row long ll_header_height long ll_detail_height long ll_page_height long ll_summary_height long ll_signature_y // Fill the DataWindow. li_RC = this.dw_page.SetTransObject ( SQLCA ) if li_RC <> 1 then MessageBox ( "Error", "SetTransObject failed" ) halt close end if ll_row_count = this.dw_page.retrieve() if ll_row_count < 0 then MessageBox ( "Error", "Retrieve failed" ) halt close end if // Turn on print preview so the size of the DataWindow // page will agree with the final printed copy. ls_error = this.dw_page.modify & ( "DataWindow.print.preview=yes" ) if ls_error <> "" then MessageBox ( "Error", "Modify print.preview failed" ) halt close end if // Make the last page the visible one so that expressions // involving FirstRowOnPage and LastRowOnPage will // return values that apply to the last page. li_RC = this.dw_page.ScrollToRow & ( this.dw_page.RowCount() ) if li_RC <> 1 then MessageBox ( "Error", "ScrollToRow failed" ) halt close end if // Get the total height of the header band plus all the detail // bands on the last page. ll_header_height = long ( this.dw_page.describe & ( "DataWindow.header.height" ) ) if ll_header_height <= 0 then MessageBox ( "Error", "Describe header.height failed" ) halt close end if ll_first_row = long ( this.dw_page.describe & ( "DataWindow.FirstRowOnPage" ) ) if ll_first_row <= 0 then MessageBox ( "Error", "Describe FirstRowOnPage failed" ) halt close end if ll_last_row = long ( this.dw_page.describe & ( "DataWindow.LastRowOnPage" ) ) if ll_last_row <= 0 then MessageBox ( "Error", "Describe LastRowOnPage failed" ) halt close end if ll_detail_height = long ( this.dw_page.describe & ( "DataWindow.detail.height" ) ) if ll_detail_height <= 0 then MessageBox ( "Error", "Describe detail.height failed" ) halt close end if ll_page_height & = ll_header_height & + ( ll_detail_height & * ( ll_last_row - ll_first_row + 1 ) ) // Expand the summary band to fill the last page. // The magic number 4050 is a few units smaller than the // full page size to avoid problems printing the last page. // This number may require adjustment by trial and error. ll_summary_height = 4050 - ll_page_height ls_error = this.dw_page.modify & ( "DataWindow.summary.height=" & + string ( ll_summary_height ) ) if ls_error <> "" then MessageBox ( "Error", "Modify summary.height failed" ) halt close end if // Move the signature field to the bottom of the // expanded summary band. // The magic number 60 was chosen to position the signature // field above the bottom edge of the summary band by a // sufficient margin to avoid problems printing the last page. // This number may require adjustment by trial and error. ll_signature_y = ll_summary_height - 60 ls_error = this.dw_page.modify & ( "signature.y=" & + string ( ll_signature_y ) ) if ls_error <> "" then MessageBox ( "Error", "Modify signature.y failed" ) halt close end if |
This example assumes a simple DataWindow with a header band and a few detail rows on each page plus a summary band at the end. The page height calculation will more complicated if group headers and trailers are being used. If groups are involved an alternative approach might be more attractive: Put the signature field in the DataWindow footer band. Unlike the summary band, the footer automatically appears at the bottom of the page (that's good) but it also appears on every page (not so good). Figure 3 shows the expression to use in Properties - Expressions - Visible to make the signature field invisible on every page except the last. |
Figure 3: Footer Signature Visible Only On Last Page
if ( page() = pageCount(), 1, 0 ) |
The footer band may not be the ideal solution. Even though the signature line can be made invisible, the empty space is not available for printing detail rows. If that's unacceptable then the complexity of the summary band solution might not be so bad after all. |