which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
1383 lines
34 KiB
C
Executable File
1383 lines
34 KiB
C
Executable File
/* r4report.c (c)Copyright Sequiter Software Inc., 1991-1994. All rights reserved. */
|
|
#include "d4all.h"
|
|
#ifdef S4WINDOWS
|
|
#include <commdlg.h>
|
|
#endif
|
|
|
|
#define ABS(x) ((x<0)?-1*(x):x)
|
|
|
|
void S4FUNCTION expr4calc_reset( CODE4 S4PTR * ) ;
|
|
|
|
/* Function: report4index_type()
|
|
PARAMETERS: none
|
|
DESCRIPTION: used by the CR executable to determine the index
|
|
RETURNS: an integer value, defined in r4report.h, specifying the index */
|
|
|
|
int S4FUNCTION report4index_type()
|
|
{
|
|
#ifdef S4MDX
|
|
return r4mdx;
|
|
#endif
|
|
|
|
#ifdef S4NDX
|
|
return r4ndx;
|
|
#endif
|
|
|
|
#ifdef S4CLIPPER
|
|
return r4cli;
|
|
#endif
|
|
|
|
#ifdef S4FOX
|
|
return r4fox;
|
|
#endif
|
|
}
|
|
|
|
/* FOR A DESCRIPTION SEE THE CODEREPORTER MANUAL */
|
|
PREPORT4 S4FUNCTION report4init( RELATE4 *relate )
|
|
{
|
|
REPORT4 *r4 ;
|
|
CODE4 *code_base;
|
|
#ifdef S4WINDOWS
|
|
LOGFONT lfont;
|
|
#endif
|
|
|
|
if( !relate )
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
code_base = relate->code_base;
|
|
|
|
/* you can only have one report open at a time */
|
|
if( code_base->num_reports != 0 )
|
|
{
|
|
e4describe( code_base, e4report, E4_REP_ONE, 0, 0 );
|
|
return NULL;
|
|
}
|
|
|
|
/* allocate the REPORT4 structure */
|
|
r4 = (REPORT4 *) u4alloc_free( code_base, sizeof(REPORT4) ) ;
|
|
if ( r4 == 0 )
|
|
{
|
|
e4describe( code_base, e4report, E4_REP_REPALLOC, 0, 0 );
|
|
return NULL ;
|
|
}
|
|
|
|
/* reset the list members */
|
|
memset( &r4->groups, 0, sizeof(r4->groups) );
|
|
memset( &r4->styles, 0, sizeof(r4->styles) );
|
|
memset( &r4->active_objects, 0, sizeof(r4->active_objects) );
|
|
memset( &r4->obj_type_info, 0, sizeof(r4->obj_type_info) );
|
|
|
|
/* set the code_base, relate, and default_date_format members */
|
|
r4->code_base = code_base ;
|
|
r4->relate = relate ;
|
|
#ifdef S4WINDOWS
|
|
lstrcpy( r4->default_date_format, code_base->date_format );
|
|
#else
|
|
strcpy( r4->default_date_format, code_base->date_format );
|
|
#endif
|
|
|
|
/* turn off auto_open of index files */
|
|
r4->code_base->auto_open = 0;
|
|
|
|
/* set the default margin and page size */
|
|
r4->margin_left = 250;
|
|
r4->margin_right = 250;
|
|
r4->report_width = 8000 ;
|
|
r4->report_height = 11000;
|
|
|
|
/* set the default symbols */
|
|
r4->decimal_point = '.' ;
|
|
r4->thousand_separator = ',' ;
|
|
r4->currency_symbol[0] = '$';
|
|
r4->currency_symbol[1] = '\0';
|
|
|
|
/* by default output is to the screen */
|
|
r4->output_code = r4->output_handle = 1;
|
|
|
|
/* default units of display are points: applys to the CR executable */
|
|
r4->units = UNIT4POINTS ;
|
|
|
|
/* no grid by default: applys to the CR executable */
|
|
r4->sensitivity_x = r4->sensitivity_y = 0;
|
|
|
|
/* by default save report with pathnames */
|
|
r4->pathnames = 1;
|
|
|
|
/* create the default style */
|
|
#ifdef S4WINDOWS
|
|
/* if not being called by the CR executable */
|
|
if( !code_base->s4cr2 )
|
|
{
|
|
memset( &lfont, 0, sizeof(R4LOGFONT) );
|
|
strcpy(lfont.lfFaceName,"MS Serif" );
|
|
#ifdef S4GERMAN
|
|
style4create( (PREPORT4)r4, (PR4LOGFONT)&lfont, (char *)"Normal", (R4COLORREF)NULL, (int)10 );
|
|
#else
|
|
style4create( (PREPORT4)r4, (PR4LOGFONT)&lfont, (char *)"Plain Text", (R4COLORREF)NULL, (int)10 );
|
|
#endif
|
|
r4->active_style = (PSTYLE4)l4first( &r4->styles );
|
|
}
|
|
#else
|
|
#ifdef S4GERMAN
|
|
style4create( r4, "Normal", 0, NULL, 0, NULL );
|
|
#else
|
|
style4create( r4, "Plain Text", 0, NULL, 0, NULL );
|
|
#endif
|
|
r4->active_style = (PSTYLE4)l4first( &r4->styles );
|
|
#endif
|
|
|
|
/* create the title/summary and page header/footer groups */
|
|
group4create_title_summary( r4 );
|
|
group4create_pgheader_pgfooter( r4 );
|
|
|
|
if( r4 )
|
|
r4->code_base->num_reports = 1;
|
|
else
|
|
r4->code_base->num_reports = 0;
|
|
|
|
return r4 ;
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
/* frees the windows font associated with the object by releasing the
|
|
font from the objects windows device context. This function is
|
|
only used through the report4free_styles fctn */
|
|
void report4set_obj_font_free( OBJ4 *obj )
|
|
{
|
|
OBJ4 *obj_on;
|
|
HDC hDC;
|
|
|
|
obj_on = (OBJ4 *)l4first( &obj->contained );
|
|
while( obj_on )
|
|
{
|
|
report4set_obj_font_free( obj_on );
|
|
obj_on = (OBJ4 *)l4next( &obj->contained, obj_on );
|
|
}
|
|
|
|
hDC = GetDC( obj->hWnd );
|
|
SelectObject( hDC, GetStockObject(SYSTEM_FONT) );
|
|
ReleaseDC( obj->hWnd, hDC );
|
|
}
|
|
|
|
#endif
|
|
|
|
void report4free_styles( REPORT4 *report )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
GROUP4 *group_on;
|
|
AREA4 *area_on;
|
|
OBJ4 *obj_on;
|
|
#endif
|
|
STYLE4 *style_on, *style_next;
|
|
|
|
/* if this is a report in windows de-select the font from the device context
|
|
of every object */
|
|
#ifdef S4WINDOWS
|
|
if( report->page_header_footer )
|
|
{
|
|
area_on = (AREA4 *)l4first( &report->page_header_footer->header_areas );
|
|
while( area_on )
|
|
{
|
|
obj_on = (OBJ4 *)l4first( &area_on->objects );
|
|
while( obj_on )
|
|
{
|
|
report4set_obj_font_free( obj_on );
|
|
obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
|
|
}
|
|
area_on = (AREA4 *)l4next( &report->page_header_footer->header_areas, area_on );
|
|
}
|
|
|
|
area_on = (AREA4 *)l4first( &report->page_header_footer->footer_areas );
|
|
while( area_on )
|
|
{
|
|
obj_on = (OBJ4 *)l4first( &area_on->objects );
|
|
while( obj_on )
|
|
{
|
|
report4set_obj_font_free( obj_on );
|
|
obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
|
|
}
|
|
area_on = (AREA4 *)l4next( &report->page_header_footer->footer_areas, area_on );
|
|
}
|
|
}
|
|
|
|
group_on = (GROUP4 *)l4first( &report->groups );
|
|
while( group_on )
|
|
{
|
|
area_on = (AREA4 *)l4first( &group_on->header_areas );
|
|
while( area_on )
|
|
{
|
|
obj_on = (OBJ4 *)l4first( &area_on->objects );
|
|
while( obj_on )
|
|
{
|
|
report4set_obj_font_free( obj_on );
|
|
obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
|
|
}
|
|
area_on = (AREA4 *)l4next( &group_on->header_areas, area_on );
|
|
}
|
|
|
|
area_on = (AREA4 *)l4first( &group_on->footer_areas );
|
|
while( area_on )
|
|
{
|
|
obj_on = (OBJ4 *)l4first( &area_on->objects );
|
|
while( obj_on )
|
|
{
|
|
report4set_obj_font_free( obj_on );
|
|
obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
|
|
}
|
|
area_on = (AREA4 *)l4next( &group_on->footer_areas, area_on );
|
|
}
|
|
group_on = (GROUP4 *)l4next( &report->groups, group_on );
|
|
}
|
|
#endif
|
|
|
|
/* free the STYLE4 structures in the style list */
|
|
style_on = (STYLE4 *)l4first( &report->styles );
|
|
while( style_on )
|
|
{
|
|
style_next = (STYLE4 *)l4next( &report->styles, style_on );
|
|
style4free( report, style_on );
|
|
style_on = style_next;
|
|
}
|
|
}
|
|
|
|
|
|
/* SEE the CODEREPORTER MANUAL FOR A DESCRIPTION */
|
|
void S4FUNCTION report4free( REPORT4 *r4, int free_relate, int close_files )
|
|
{
|
|
GROUP4 *group_on, *group_next;
|
|
RELATE4 *relate;
|
|
POUT4OBJ o4obj;
|
|
|
|
if ( r4 == 0 ) return ;
|
|
|
|
if( r4->code_base->num_reports != 1 )
|
|
{
|
|
e4describe( r4->code_base, e4report, E4_REP_NONE, 0, 0 ) ;
|
|
}
|
|
|
|
r4->code_base->num_reports = 0 ;
|
|
|
|
/* free the report name and file_name */
|
|
if( r4->report_name )
|
|
u4free( r4->report_name );
|
|
|
|
if( r4->report_file_name )
|
|
u4free( r4->report_file_name );
|
|
|
|
/* free the reports styles */
|
|
report4free_styles( r4 );
|
|
|
|
/* free the page header/footer group */
|
|
if( r4->page_header_footer )
|
|
{
|
|
group4free( r4->page_header_footer );
|
|
r4->page_header_footer = NULL;
|
|
}
|
|
|
|
/* free all the other groups */
|
|
group_on = (GROUP4 *)l4first( &r4->groups );
|
|
while( group_on )
|
|
{
|
|
group_next = (GROUP4 *)l4next( &r4->groups, group_on );
|
|
group4free( group_on );
|
|
group_on = group_next;
|
|
}
|
|
|
|
/* free the additional record buffers in the DATA4 structures in the relation
|
|
*/
|
|
relate = r4->relate;
|
|
while( relate )
|
|
{
|
|
if( relate->old_record )
|
|
{
|
|
u4free( relate->old_record );
|
|
relate->old_record = NULL;
|
|
}
|
|
relate4next( &relate );
|
|
}
|
|
|
|
/* if the free relate flag was set, free the relate */
|
|
if (free_relate)
|
|
relate4free(r4->relate, close_files);
|
|
|
|
/* free the printer name */
|
|
if( r4->printer_name )
|
|
u4free( r4->printer_name );
|
|
|
|
/* free all calculations/totals in the calc list */
|
|
expr4calc_reset( r4->code_base ) ;
|
|
|
|
/* free up the memory pools for totals and calcs */
|
|
mem4release( r4->code_base->total_memory ) ;
|
|
r4->code_base->total_memory = 0 ;
|
|
mem4release( r4->code_base->calc_memory ) ;
|
|
r4->code_base->calc_memory = 0 ;
|
|
|
|
/* free the report caption */
|
|
if( r4->report_caption )
|
|
{
|
|
u4free( r4->report_caption );
|
|
}
|
|
|
|
/* free the output data file name */
|
|
if( r4->dfile_name )
|
|
u4free( r4->dfile_name );
|
|
|
|
/* free any data file output OUT4OBJ structs */
|
|
while( (o4obj = (POUT4OBJ)l4pop(&r4->output_objs)) != NULL )
|
|
u4free( o4obj );
|
|
|
|
u4free( r4 ) ;
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
/* Get an information context for either the specified or default printer */
|
|
HDC S4FUNCTION report4get_printerIC ( REPORT4 *report )
|
|
{
|
|
char szPrinter [64] ;
|
|
char *szDevice, *szDriver, *szOutput ;
|
|
|
|
if ( report->printer_name == 0 )
|
|
{
|
|
GetProfileString( "windows", "device", ",,,", szPrinter, 80 ) ;
|
|
|
|
if ( ! (szDevice = strtok( szPrinter, ",")) ) return 0 ;
|
|
if ( ! (szDriver = strtok( NULL, ", ")) ) return 0 ;
|
|
if ( ! (szOutput = strtok( NULL, ", ")) ) return 0 ;
|
|
}
|
|
else
|
|
{
|
|
GetProfileString( "devices", report->printer_name, "=,", szPrinter, 80) ;
|
|
szDevice = report->printer_name ;
|
|
if ( ! (szDriver = strtok( szPrinter, ", ")) ) return 0 ;
|
|
if ( ! (szOutput = strtok( NULL, ", ")) ) return 0 ;
|
|
}
|
|
|
|
return CreateIC (szDriver, szDevice, szOutput, NULL) ;
|
|
}
|
|
|
|
/* Get the device context for the default printer */
|
|
HDC S4FUNCTION report4get_printerDC ( void )
|
|
{
|
|
static char szPrinter [80] ;
|
|
char *szDevice, *szDriver, *szOutput ;
|
|
|
|
GetProfileString( "windows", "device", ",,,", szPrinter, 80 ) ;
|
|
|
|
if ( ! (szDevice = strtok( szPrinter, ",")) ) return 0 ;
|
|
if ( ! (szDriver = strtok( NULL, ", ")) ) return 0 ;
|
|
if ( ! (szOutput = strtok( NULL, ", ")) ) return 0 ;
|
|
|
|
return CreateDC (szDriver, szDevice, szOutput, NULL) ;
|
|
}
|
|
|
|
/* Create the output fonts for printing */
|
|
void report4output_screen_fonts( REPORT4 *report )
|
|
{
|
|
STYLE4 *style_on;
|
|
#ifdef S4WIN32
|
|
LOGFONT *plf;
|
|
#else
|
|
PR4LOGFONT plf;
|
|
#endif
|
|
int tempval;
|
|
|
|
style_on = (STYLE4 *)l4first( &report->styles );
|
|
while( style_on )
|
|
{
|
|
if( !style_on->printer_font )
|
|
{
|
|
#ifdef S4WIN32
|
|
plf = &( style_on->ntFont ) ;
|
|
#else
|
|
plf = &( style_on->lfont ) ;
|
|
#endif
|
|
/* due to the different resolution of the printer and screen we have
|
|
to temporarily change the lfHeight member of the LOGFONT struct and
|
|
create a font for printing */
|
|
tempval = plf->lfHeight;
|
|
plf->lfHeight = -MulDiv(style_on->point_size,
|
|
GetDeviceCaps(report->printerDC,LOGPIXELSY),72);
|
|
|
|
style_on->printer_font = CreateFontIndirect((const LOGFONT FAR*)plf);
|
|
plf->lfHeight = tempval;
|
|
|
|
}
|
|
style_on = (STYLE4 *)l4next( &report->styles, style_on );
|
|
}
|
|
}
|
|
|
|
|
|
/* USED FOR CREATING A DIALOG TEMPLATE ON THE FLY, this is used to create
|
|
the dialog used during printing in windows to allow cancellation of the
|
|
printing process, the only reason this function is necessary is because
|
|
we do not use a resource file with the CodeBase DLL */
|
|
GLOBALHANDLE NewDlgTemplate(DWORD Style, WORD X, WORD Y, WORD CX, WORD CY,
|
|
LPSTR Menu, LPSTR Class, LPSTR Text,
|
|
LPSTR TypeFace, WORD PtSize)
|
|
{
|
|
DlgTemplateHeader far *lpDT;
|
|
LPSTR lpsztemp;
|
|
GLOBALHANDLE hDTemplate;
|
|
long needed_size;
|
|
|
|
needed_size = sizeof( DlgTemplateHeader ) + lstrlen(Menu) + 1 +
|
|
lstrlen(Class) + 1 + lstrlen(Text) + 1;
|
|
|
|
if( TypeFace[0] )
|
|
needed_size += lstrlen(TypeFace) + 1 + sizeof(short);
|
|
|
|
hDTemplate = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, needed_size );
|
|
|
|
if( hDTemplate == NULL )
|
|
return hDTemplate;
|
|
|
|
lpDT = (DlgTemplateHeader far * )GlobalLock( hDTemplate );
|
|
|
|
lpDT->dtStyle = WS_VISIBLE | Style;
|
|
lpDT->dtX = X;
|
|
lpDT->dtY = Y;
|
|
lpDT->dtCX = CX;
|
|
lpDT->dtCY = CY;
|
|
lpsztemp = ((LPSTR)lpDT) + sizeof( *lpDT );
|
|
lpsztemp = (char far *)memcpy( lpsztemp, Menu, ((lstrlen(Menu)>80)?81:lstrlen(Menu)+1) );
|
|
lpsztemp = (char far *)memcpy( lpsztemp, Class, ((lstrlen(Class)>80)?81:lstrlen(Class)+1) );
|
|
lpsztemp = (char far *)memcpy( lpsztemp, Text, ((lstrlen(Text)>80)?81:lstrlen(Text)+1) );
|
|
|
|
if( TypeFace[0] )
|
|
{
|
|
*((short far *)lpsztemp) = PtSize;
|
|
memcpy( lpsztemp+sizeof(short), TypeFace,((lstrlen(TypeFace)>80)?81:lstrlen(TypeFace)+1) );
|
|
lpDT->dtStyle |= DS_SETFONT;
|
|
}
|
|
|
|
GlobalUnlock( hDTemplate );
|
|
|
|
return hDTemplate;
|
|
}
|
|
|
|
/* USED FOR CREATING A DIALOG TEMPLATE ON THE FLY, this is used to create
|
|
the dialog used during printing in windows to allow cancellation of the
|
|
printing process, the only reason this function is necessary is because
|
|
we do not use a resource file with the CodeBase DLL */
|
|
BOOL AddDlgItem( GLOBALHANDLE DlgTmp, DWORD Style, WORD X, WORD Y, WORD CX,
|
|
WORD CY, LPSTR Class, LPSTR Text, BYTE DataLen, LPSTR Data,
|
|
int id )
|
|
{
|
|
DlgTemplateHeader far *lpDT;
|
|
DlgItemTemplateHeader far *lpDIT;
|
|
LPSTR lpsztemp;
|
|
GLOBALHANDLE hDTemplate;
|
|
unsigned new_size, BlockSize;
|
|
|
|
BlockSize = TemplateSize( DlgTmp );
|
|
|
|
new_size = BlockSize + sizeof(DlgItemTemplateHeader) +
|
|
lstrlen(Class) + 1 + lstrlen(Text) + 1 + 1;
|
|
|
|
hDTemplate = GlobalReAlloc( DlgTmp, new_size, GMEM_ZEROINIT | GMEM_MOVEABLE );
|
|
|
|
if( hDTemplate == NULL )
|
|
return FALSE;
|
|
|
|
lpDT = (DlgTemplateHeader far * )GlobalLock( hDTemplate );
|
|
|
|
lpDIT = (DlgItemTemplateHeader far *)(((LPSTR)lpDT)+BlockSize);
|
|
lpDIT->dtilX = X;
|
|
lpDIT->dtilY = Y;
|
|
lpDIT->dtilCX = (CX < lpDT->dtCX)?CX:lpDT->dtCX;
|
|
lpDIT->dtilCY = (CY < lpDT->dtCY)?CY:lpDT->dtCY;
|
|
lpDIT->dtilID = id;
|
|
lpDIT->dtilStyle = WS_VISIBLE | WS_CHILD | Style;
|
|
|
|
lpsztemp = (char far *)(lpDIT)+sizeof(*lpDIT);
|
|
lpsztemp = (char far *)memcpy( lpsztemp, Class, ((lstrlen(Class)>80)?81:lstrlen(Class)+1) );
|
|
lpsztemp = (char far *)memcpy( lpsztemp, Text, ((lstrlen(Text)>80)?81:lstrlen(Text)+1) );
|
|
|
|
if( DataLen )
|
|
memcpy( lpsztemp, Data, DataLen );
|
|
|
|
lpDT->dtItemCount++;
|
|
|
|
GlobalUnlock( hDTemplate );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* USED FOR CREATING A DIALOG TEMPLATE ON THE FLY, this is used to create
|
|
the dialog used during printing in windows to allow cancellation of the
|
|
printing process, the only reason this function is necessary is because
|
|
we do not use a resource file with the CodeBase DLL */
|
|
int TemplateSize( GLOBALHANDLE hDlgTmp )
|
|
{
|
|
DlgTemplateHeader far *lpDT;
|
|
LPSTR lpstr, lpbase;
|
|
int isize;
|
|
int i;
|
|
|
|
lpDT = (DlgTemplateHeader far *)GlobalLock( hDlgTmp );
|
|
lpbase = (LPSTR)lpDT;
|
|
lpstr = (LPSTR)( lpDT + 1 );
|
|
isize = sizeof( *lpDT );
|
|
lpstr = lpbase+(isize+=(lstrlen(lpstr)+1));
|
|
lpstr = lpbase+(isize+=(lstrlen(lpstr)+1));
|
|
lpstr = lpbase+(isize+=(lstrlen(lpstr)+1));
|
|
|
|
if((lpDT->dtStyle)&DS_SETFONT)
|
|
{
|
|
isize += sizeof(short);
|
|
lpstr += sizeof(short);
|
|
lpstr = lpbase+(isize+=(lstrlen(lpstr)+1));
|
|
}
|
|
|
|
for( i = 0; i < lpDT->dtItemCount; i++ )
|
|
{
|
|
lpstr = lpbase+(isize+=sizeof(DlgItemTemplateHeader));
|
|
lpstr = lpbase+(isize+=(lstrlen(lpstr)+1));
|
|
lpstr = lpbase+(isize+=(lstrlen(lpstr)+1));
|
|
if( *lpstr )
|
|
{
|
|
isize += *lpstr;
|
|
lpstr += *lpstr;
|
|
}
|
|
isize++;
|
|
}
|
|
|
|
GlobalUnlock( hDlgTmp );
|
|
return isize;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* registers window classes for the output window and the page window
|
|
**************************************************************************/
|
|
int report4register_classes( PREPORT4 report )
|
|
{
|
|
WNDCLASS wc;
|
|
HINSTANCE reginst;
|
|
|
|
if( report->hWnd == NULL )
|
|
{
|
|
#ifdef S4RDB
|
|
MessageBox( NULL, "No parentwindow in report structure.", "Error", MB_OK );
|
|
#endif
|
|
return -1;
|
|
}
|
|
#ifdef S4WIN32
|
|
reginst = (HINSTANCE)GetWindowLong( report->hWnd, GWL_HINSTANCE );
|
|
#else
|
|
reginst = (HINSTANCE)GetWindowWord( report->hWnd, GWW_HINSTANCE );
|
|
#endif
|
|
wc.cbClsExtra = 0;
|
|
wc.hInstance = reginst;
|
|
wc.hCursor = LoadCursor(NULL,IDC_WAIT);
|
|
wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
|
|
wc.lpszMenuName = NULL;
|
|
wc.style = CS_DBLCLKS | CS_GLOBALCLASS;
|
|
wc.lpfnWndProc = PreViewProc;
|
|
wc.cbWndExtra = 18;
|
|
wc.hIcon = NULL;
|
|
wc.lpszClassName = "PreViewWin";
|
|
#ifdef S4RDB
|
|
if( (RegisterClass( &wc )) == NULL )
|
|
{
|
|
MessageBox( NULL, "Failed to register PreViewWin class", "ERROR", MB_OK );
|
|
return -1;
|
|
}
|
|
#else
|
|
RegisterClass( &wc );
|
|
#endif
|
|
|
|
wc.hbrBackground = GetStockObject( WHITE_BRUSH );
|
|
wc.lpfnWndProc = OutputPageProc;
|
|
wc.lpszClassName = "OutputPageWin";
|
|
#ifdef S4RDB
|
|
if( (RegisterClass( &wc )) == NULL )
|
|
{
|
|
MessageBox( NULL, "Failed to register OutputPageWin class", "ERROR", MB_OK );
|
|
return -1;
|
|
}
|
|
#else
|
|
RegisterClass( &wc );
|
|
#endif
|
|
|
|
wc.lpszClassName = "MouseEat";
|
|
wc.lpfnWndProc = MouseEatProc;
|
|
#ifdef S4RDB
|
|
if( (RegisterClass( &wc )) == NULL )
|
|
{
|
|
MessageBox( NULL, "Failed to register MouseEat class", "ERROR", MB_OK );
|
|
return -1;
|
|
}
|
|
#else
|
|
RegisterClass( &wc );
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* recursively calculates the position (x,y) and size (w,h) of an object and
|
|
* all the contained objects in device coordinates
|
|
****************************************************************************/
|
|
|
|
#ifdef S4WINDOWS
|
|
#ifdef __cplusplus
|
|
void report4obj_to_dev(OBJ4 *obj, HDC hDC )
|
|
#else
|
|
void report4obj_to_dev(obj, hDC )
|
|
OBJ4 *obj ;
|
|
HDC hDC ;
|
|
#endif
|
|
#else
|
|
#ifdef __cplusplus
|
|
void report4obj_to_dev(OBJ4 *obj )
|
|
#else
|
|
void report4obj_to_dev(obj )
|
|
OBJ4 *obj ;
|
|
#endif
|
|
#endif
|
|
{
|
|
OBJ4 *obj_on;
|
|
#ifdef S4WINDOWS
|
|
POINT pt[2];
|
|
|
|
/* use the device context */
|
|
pt[0].x = (int)obj->x;
|
|
pt[0].y = (int)obj->y;
|
|
pt[1].x = (int)obj->w;
|
|
pt[1].y = (int)obj->h;
|
|
LPtoDP( hDC, pt, 2 );
|
|
obj->dev_x = pt[0].x;
|
|
obj->dev_y = ABS(pt[0].y);
|
|
obj->dev_w = pt[1].x;
|
|
obj->dev_h = ABS(pt[1].y);
|
|
#else
|
|
/* in the non-windows case we simply transfer the 1000's of an inch
|
|
values */
|
|
obj->dev_x = (obj->x);
|
|
obj->dev_y = (obj->y);
|
|
obj->dev_w = (obj->w);
|
|
obj->dev_h = (obj->h);
|
|
#endif
|
|
|
|
obj_on = (OBJ4 *)l4first( &obj->contained );
|
|
while( obj_on )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
report4obj_to_dev( obj_on, hDC );
|
|
#else
|
|
report4obj_to_dev( obj_on );
|
|
#endif
|
|
obj_on = (OBJ4 *)l4next( &obj->contained, obj_on );
|
|
}
|
|
return;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* calculates group and object sizes in device coordinates
|
|
***************************************************************************/
|
|
#ifdef S4WINDOWS
|
|
#ifdef __cplusplus
|
|
void report4calc_obj_dev(REPORT4 *report, HDC hDC )
|
|
#else
|
|
void report4calc_obj_dev(report, hDC )
|
|
REPORT4 *report ;
|
|
HDC hDC ;
|
|
#endif
|
|
#else
|
|
#ifdef __cplusplus
|
|
void report4calc_obj_dev(REPORT4 *report )
|
|
#else
|
|
void report4calc_obj_dev(report )
|
|
REPORT4 *report ;
|
|
#endif
|
|
#endif
|
|
{
|
|
GROUP4 *group_on;
|
|
AREA4 *area_on;
|
|
OBJ4 *obj_on;
|
|
#ifdef S4WINDOWS
|
|
POINT pt[2];
|
|
|
|
SetMapMode( hDC, MM_HIENGLISH );
|
|
SetMapMode( hDC, MM_ANISOTROPIC );
|
|
|
|
if( report->output_code == 0 )
|
|
{
|
|
pt[0].x = (int)(report->margin_left - report->hard_margin_left);
|
|
pt[0].y = (int)(report->margin_top - report->hard_margin_top);
|
|
pt[1].x = (int)(report->margin_right - report->hard_margin_right);
|
|
pt[1].y = (int)(report->margin_bottom - report->hard_margin_bottom);
|
|
}
|
|
else
|
|
{
|
|
pt[0].x = (int)(report->margin_left);
|
|
pt[0].y = (int)(report->margin_top);
|
|
pt[1].x = (int)(report->margin_right);
|
|
pt[1].y = (int)(report->margin_bottom);
|
|
}
|
|
LPtoDP( hDC, pt, 2 );
|
|
report->dev_margin_left = pt[0].x;
|
|
report->dev_margin_top = ABS(pt[0].y);
|
|
report->dev_margin_right = pt[1].x;
|
|
report->dev_margin_bottom = ABS(pt[1].y);
|
|
#else
|
|
report->dev_margin_left = (report->margin_left);
|
|
report->dev_margin_right = (report->margin_right);
|
|
report->dev_margin_top = (report->margin_top);
|
|
report->dev_margin_bottom = (report->margin_bottom);
|
|
#endif
|
|
|
|
group_on = report->page_header_footer;
|
|
if( group_on )
|
|
{
|
|
area_on = (AREA4 *)l4first( &group_on->header_areas );
|
|
while( area_on )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
pt[0].x = 0;
|
|
pt[0].y = (UINT)area_on->height;
|
|
LPtoDP( hDC, pt, 1 );
|
|
area_on->height_dev = ABS(pt[0].y);
|
|
#else
|
|
area_on->height_dev = (area_on->height);
|
|
#endif
|
|
obj_on = (OBJ4 *)l4first( &area_on->objects );
|
|
while( obj_on )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
report4obj_to_dev( obj_on, hDC );
|
|
#else
|
|
report4obj_to_dev( obj_on );
|
|
#endif
|
|
obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
|
|
}
|
|
area_on = (AREA4 *)l4next( &group_on->header_areas, area_on );
|
|
}
|
|
|
|
area_on = (AREA4 *)l4first( &group_on->footer_areas );
|
|
while( area_on )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
pt[0].x = 0;
|
|
pt[0].y = (UINT)area_on->height;
|
|
LPtoDP( hDC, pt, 1 );
|
|
area_on->height_dev = ABS(pt[0].y);
|
|
#else
|
|
area_on->height_dev = (area_on->height);
|
|
#endif
|
|
|
|
obj_on = (OBJ4 *)l4first( &area_on->objects );
|
|
while( obj_on )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
report4obj_to_dev( obj_on, hDC );
|
|
#else
|
|
report4obj_to_dev( obj_on );
|
|
#endif
|
|
obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
|
|
}
|
|
area_on = (AREA4 *)l4next( &group_on->footer_areas, area_on );
|
|
}
|
|
}
|
|
|
|
group_on = (GROUP4 *)l4first( &report->groups );
|
|
while( group_on )
|
|
{
|
|
area_on = (AREA4 *)l4first( &group_on->header_areas );
|
|
while( area_on )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
pt[0].x = 0;
|
|
pt[0].y = (UINT)area_on->height;
|
|
LPtoDP( hDC, pt, 1 );
|
|
area_on->height_dev = ABS(pt[0].y);
|
|
#else
|
|
area_on->height_dev = (area_on->height);
|
|
#endif
|
|
|
|
obj_on = (OBJ4 *)l4first( &area_on->objects );
|
|
while( obj_on )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
report4obj_to_dev( obj_on, hDC );
|
|
#else
|
|
report4obj_to_dev( obj_on );
|
|
#endif
|
|
obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
|
|
}
|
|
area_on = (AREA4 *)l4next( &group_on->header_areas, area_on );
|
|
}
|
|
|
|
area_on = (AREA4 *)l4first( &group_on->footer_areas );
|
|
while( area_on )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
pt[0].x = 0;
|
|
pt[0].y = (UINT)area_on->height;
|
|
LPtoDP( hDC, pt, 1 );
|
|
area_on->height_dev = ABS(pt[0].y);
|
|
#else
|
|
area_on->height_dev = (area_on->height);
|
|
#endif
|
|
|
|
obj_on = (OBJ4 *)l4first( &area_on->objects );
|
|
while( obj_on )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
report4obj_to_dev( obj_on, hDC );
|
|
#else
|
|
report4obj_to_dev( obj_on );
|
|
#endif
|
|
obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
|
|
}
|
|
area_on = (AREA4 *)l4next( &group_on->footer_areas, area_on );
|
|
}
|
|
group_on = (GROUP4 *)l4next( &report->groups, group_on );
|
|
}
|
|
}
|
|
|
|
|
|
/* make a call to the relate4query_set() function */
|
|
int S4FUNCTION report4querySet( PREPORT4 report, char S4PTR *expr )
|
|
{
|
|
return relate4query_set( report->relate, expr );
|
|
}
|
|
|
|
/* make a call to the relate4sort_set() function */
|
|
int S4FUNCTION report4sortSet( PREPORT4 report, char S4PTR *expr )
|
|
{
|
|
return relate4sort_set( report->relate, expr );
|
|
}
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4caption( PREPORT4 report, char S4PTR *caption )
|
|
{
|
|
if( report == NULL )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if( report->report_caption )
|
|
u4free( report->report_caption );
|
|
|
|
report->report_caption = NULL;
|
|
|
|
if( !caption )
|
|
return 0;
|
|
|
|
report->report_caption = (char *)u4alloc_free( report->code_base, strlen(caption)+1 );
|
|
if( !report->report_caption )
|
|
{
|
|
e4describe( report->code_base, e4report, E4_REP_CAPALLOC, 0, 0 );
|
|
return -1;
|
|
}
|
|
|
|
strcpy( report->report_caption, caption );
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4groupHardResets( PREPORT4 report, int reset_flag )
|
|
{
|
|
int temp;
|
|
|
|
if( !report )
|
|
return -1;
|
|
|
|
if( reset_flag < 0 )
|
|
{
|
|
e4describe( report->code_base, e4parm, E4_REP_BADRESET, 0, 0 );
|
|
return -1;
|
|
}
|
|
|
|
temp = report->hard_resets_flag;
|
|
report->hard_resets_flag = reset_flag;
|
|
|
|
return temp;
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
/* Calls the printer setup/seletion common dialog in Windows */
|
|
void S4FUNCTION report4printerSelect( PREPORT4 report )
|
|
{
|
|
static PRINTDLG pd;
|
|
|
|
memset( &pd, 0, sizeof(PRINTDLG) );
|
|
pd.lStructSize = sizeof( PRINTDLG );
|
|
pd.hwndOwner = report->hWnd;
|
|
pd.Flags = PD_RETURNDC | PD_PRINTSETUP;
|
|
pd.hDevMode = NULL;
|
|
pd.hDevNames = NULL;
|
|
|
|
if( PrintDlg( &pd ) != 0 )
|
|
{
|
|
report->printerDC = pd.hDC;
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4output( PREPORT4 report, int output_handle, int use_styles )
|
|
{
|
|
if( ! report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
report->output_handle = output_handle;
|
|
report->use_styles = use_styles;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4pageSize( PREPORT4 report, long pg_height, long pg_width, int unit_type )
|
|
{
|
|
long pgh = pg_height, pgw = pg_width;
|
|
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if( unit_type )
|
|
{
|
|
pgw = (long)( pg_width * 100 );
|
|
pgh = (long)(((float)pg_height * 1000.0)/6.0 + 0.5 );
|
|
}
|
|
|
|
report->report_width = pgw- report->margin_left - report->margin_right;
|
|
report->report_height = pgh - report->margin_top - report->margin_bottom;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4margins( PREPORT4 report, long left, long right, long top, long bottom, int unit_type )
|
|
{
|
|
long rm = right, lm = left, tm = top, bm = bottom;
|
|
|
|
if( !report )
|
|
{
|
|
/*error message; */
|
|
return -1;
|
|
}
|
|
|
|
if( unit_type )
|
|
{
|
|
rm = right * 100;
|
|
lm = left * 100;
|
|
tm = (int)(((float)top*1000.0)/6.0);
|
|
bm = (int)(((float)bottom*1000.0)/6.0);
|
|
}
|
|
|
|
report->report_width = report->report_width + report->margin_left + report->margin_right;
|
|
report->report_height = report->report_height + report->margin_top + report->margin_bottom;
|
|
|
|
report->margin_right = rm;
|
|
report->margin_left = lm;
|
|
report->margin_top = tm;
|
|
report->margin_bottom = bm;
|
|
|
|
report->report_width = report->report_width - rm - lm;
|
|
report->report_height = report->report_height - tm - bm;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4currency( PREPORT4 report, char *currency )
|
|
{
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if( !currency )
|
|
report->currency_symbol[0] = '\0';
|
|
else
|
|
u4ncpy( report->currency_symbol, currency, sizeof(report->currency_symbol) );
|
|
return 0;
|
|
}
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4decimal( PREPORT4 report, char decimal )
|
|
{
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
report->decimal_point = decimal;
|
|
return 0;
|
|
}
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4separator( PREPORT4 report, char separator )
|
|
{
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
report->thousand_separator = separator;
|
|
return 0;
|
|
}
|
|
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4titlePage( PREPORT4 report, int title_page )
|
|
{
|
|
int temp;
|
|
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if( title_page < 0 )
|
|
{
|
|
e4describe( report->code_base, e4parm, E4_REP_BADTITLE, 0, 0 );
|
|
return -1;
|
|
}
|
|
|
|
temp = report->pgbrk_title;
|
|
report->pgbrk_title = title_page;
|
|
|
|
return temp;
|
|
}
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4toScreen( PREPORT4 report, int to_screen )
|
|
{
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if( to_screen < 0 )
|
|
{
|
|
e4describe( report->code_base, e4parm, E4_REP_BADSCREEN, 0, 0 );
|
|
return -1;
|
|
}
|
|
|
|
if( to_screen > 0 )
|
|
report->output_code = to_screen;
|
|
else
|
|
report->output_code = 0;
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4parent( PREPORT4 report, HWND parent )
|
|
{
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
report->hWnd = parent;
|
|
return 0;
|
|
}
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
HDC S4FUNCTION report4printerDC( PREPORT4 report, HDC hDC )
|
|
{
|
|
HDC temp;
|
|
|
|
if( !report )
|
|
{
|
|
return (HDC)-1;
|
|
}
|
|
|
|
temp = report->printerDC;
|
|
report->printerDC = hDC;
|
|
|
|
return temp;
|
|
}
|
|
#endif
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4dateFormat( PREPORT4 report, char *date_format )
|
|
{
|
|
if( !report || !date_format )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
u4ncpy( report->default_date_format, date_format, sizeof(report->default_date_format) );
|
|
return 0;
|
|
}
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4pageSizeGet( PREPORT4 report, long *page_width,
|
|
long *page_height )
|
|
{
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
*page_width = report->dev_page_width;
|
|
*page_height = report->dev_page_height;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4pageMarginsGet( PREPORT4 report, long S4PTR *margin_left,
|
|
long S4PTR *margin_right, long S4PTR *margin_top, long S4PTR *margin_bottom )
|
|
{
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
*margin_right = report->dev_margin_right;
|
|
*margin_left = report->dev_margin_left;
|
|
*margin_bottom = report->dev_margin_bottom;
|
|
*margin_top = report->dev_margin_top;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/* SEE THE CODEREPORTER MANUAL */
|
|
int S4FUNCTION report4dataDo( PREPORT4 report )
|
|
{
|
|
char *f4info;
|
|
FIELD4INFO *f4infoi;
|
|
DATA4 *dfile;
|
|
POUT4OBJ oobj;
|
|
long bsize = 8198;
|
|
int rc, i, trl;
|
|
PGROUP4 group;
|
|
|
|
if( !report->output_group || !report->dfile_name || report->output_objs.n_link <= 0 )
|
|
{
|
|
e4describe( report->code_base, e4rep_data, E4_REP_NODSETUP, (char *)0, (char *)0 );
|
|
return -1;
|
|
}
|
|
|
|
/* allocate an array of FIELD4INFO structures */
|
|
f4info = (char *)u4alloc_er( report->code_base, (report->output_objs.n_link+1)*sizeof(FIELD4INFO) );
|
|
if( !f4info )
|
|
{
|
|
e4describe( report->code_base, e4rep_data, E4_REP_NODCREATE, report->dfile_name, (char *)0 );
|
|
return -1;
|
|
}
|
|
|
|
/* fill the FIELD4INFO structures */
|
|
oobj = NULL;
|
|
for( i = 0; i < report->output_objs.n_link; i++ )
|
|
{
|
|
f4infoi = (FIELD4INFO *)(f4info + i * sizeof(FIELD4INFO) );
|
|
oobj = (POUT4OBJ)l4next( &report->output_objs, oobj );
|
|
f4infoi->name = (char *)u4alloc_free( report->code_base, strlen(oobj->obj->field_name)+1 );
|
|
strcpy( f4infoi->name, oobj->obj->field_name );
|
|
f4infoi->type = oobj->obj->field_type;
|
|
f4infoi->len = oobj->obj->field_len;
|
|
f4infoi->dec = oobj->obj->field_dec;
|
|
}
|
|
|
|
trl = report->code_base->read_only;
|
|
report->code_base->read_only = 0;
|
|
|
|
/* create the new data file */
|
|
dfile = d4create( report->code_base, report->dfile_name, (FIELD4INFO *)f4info, NULL );
|
|
if( !dfile )
|
|
{
|
|
e4describe( report->code_base, e4rep_data, E4_REP_NODCREATE, report->dfile_name, (char *)0 );
|
|
u4free( f4info );
|
|
report->code_base->read_only = trl;
|
|
return -1;
|
|
}
|
|
report->code_base->read_only = trl;
|
|
|
|
/* associate the fields in the new data file with the output objects in the
|
|
report */
|
|
oobj = NULL;
|
|
for( i = 0; i < report->output_objs.n_link; i++ )
|
|
{
|
|
oobj = (POUT4OBJ)l4next( &report->output_objs, oobj );
|
|
oobj->obj->field = d4field( dfile, oobj->obj->field_name );
|
|
}
|
|
|
|
/* temporarily remove all the internal group flags */
|
|
group = (PGROUP4) l4first( &report->groups );
|
|
while( group )
|
|
{
|
|
group->trepeat_header = group->repeat_header;
|
|
group->tswap_header = group->swap_header;
|
|
group->tswap_footer = group->swap_footer;
|
|
group->treset_page = group->reset_page;
|
|
group->treset_pagenum = group->reset_pagenum;
|
|
|
|
group->repeat_header = 0;
|
|
group->swap_header = 0;
|
|
group->swap_footer = 0;
|
|
group->reset_page = 0;
|
|
group->reset_pagenum = 0;
|
|
group = (PGROUP4)l4next( &report->groups, group );
|
|
}
|
|
|
|
report->for_dbf = 1;
|
|
report->data_file = dfile;
|
|
report->rcount = 0;
|
|
report->dfile_buf = NULL;
|
|
|
|
/* allocate as large a buffer as you can */
|
|
while( report->dfile_buf == NULL )
|
|
{
|
|
report->dfile_buf = (char *)u4alloc_free( report->code_base, bsize );
|
|
if( report->dfile_buf == NULL )
|
|
bsize -= 1000;
|
|
if( bsize <= 0 )
|
|
break;
|
|
}
|
|
if( report->dfile_buf == NULL )
|
|
#ifndef __SC__
|
|
return 0;
|
|
#else
|
|
return 0;
|
|
#endif
|
|
|
|
/* set up the new datafile for fast writing */
|
|
file4seq_write_init( &report->dfile_seq, &dfile->file, (long)d4record_position(dfile,1L),
|
|
report->dfile_buf, (unsigned)bsize );
|
|
d4append_start( dfile, 0 );
|
|
if( f4info )
|
|
{
|
|
for( i = 0; i < report->output_objs.n_link; i++ )
|
|
{
|
|
f4infoi = (FIELD4INFO *)(f4info + i * sizeof(FIELD4INFO) );
|
|
u4free( f4infoi->name );
|
|
}
|
|
u4free( f4info );
|
|
}
|
|
|
|
/* start the report */
|
|
report4pageInit( report );
|
|
#ifdef S4WINDOWS
|
|
if( report->hWnd2 )
|
|
{
|
|
ReleaseCapture();
|
|
DestroyWindow( report->hWnd2 );
|
|
report->hWnd2 = NULL;
|
|
}
|
|
while( (rc = report4generatePage( report, 0 )) >= 0 )
|
|
#else
|
|
while( (rc = report4generatePage( report )) >= 0 )
|
|
#endif
|
|
{
|
|
if( rc == 2 )
|
|
break;
|
|
}
|
|
/* clean up after the report */
|
|
report4pageFree( report );
|
|
|
|
report->for_dbf = 0;
|
|
|
|
/* flush the buffer to the new data file */
|
|
file4seq_write_flush( &report->dfile_seq );
|
|
report->data_file->file.is_exclusive = 1;
|
|
report->data_file->num_recs = report->rcount;
|
|
d4update_header( report->data_file, 1, 1 );
|
|
d4close( report->data_file );
|
|
|
|
if( report->dfile_buf )
|
|
{
|
|
u4free( report->dfile_buf );
|
|
report->dfile_buf = NULL;
|
|
}
|
|
|
|
group = (PGROUP4) l4first( &report->groups );
|
|
while( group )
|
|
{
|
|
group->repeat_header = group->trepeat_header;
|
|
group->swap_header = group->tswap_header;
|
|
group->swap_footer = group->tswap_footer;
|
|
group->reset_page = group->treset_page;
|
|
group->reset_pagenum = group->treset_pagenum;
|
|
|
|
group = (PGROUP4)l4next( &report->groups, group );
|
|
}
|
|
|
|
oobj = NULL;
|
|
for( i = 0; i < report->output_objs.n_link; i++ )
|
|
{
|
|
oobj = (POUT4OBJ)l4next( &report->output_objs, oobj );
|
|
oobj->obj->field = NULL;
|
|
}
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef S4VBASIC
|
|
|
|
int S4FUNCTION report4decimal_v( PREPORT4 report, char *decimal )
|
|
{
|
|
if ( c4parm_check( report->code_base, 1, "report4decimal():" ) ) return -1 ;
|
|
|
|
#ifndef S4VB_DOS
|
|
return report4decimal( report, (char) decimal[0] ) ;
|
|
#else
|
|
return report4decimal( report, (char) c4str(decimal)[0] ) ;
|
|
#endif
|
|
}
|
|
|
|
int S4FUNCTION report4separator_v( PREPORT4 report, char *separator )
|
|
{
|
|
if ( c4parm_check( report->code_base, 1, "report4decimal():" ) ) return -1 ;
|
|
|
|
#ifndef S4VB_DOS
|
|
return report4separator( report, (char) separator[0] ) ;
|
|
#else
|
|
return report4separator( report, (char) c4str(separator)[0] ) ;
|
|
#endif
|
|
}
|
|
|
|
#ifdef S4VB_DOS
|
|
|
|
int S4FUNCTION report4caption_v ( PREPORT4 report, char *caption )
|
|
{
|
|
return report4caption( report, c4str(caption) ) ;
|
|
}
|
|
|
|
int S4FUNCTION report4currency_v ( PREPORT4 report, char *currency )
|
|
{
|
|
return report4currency( report, c4str(currency) ) ;
|
|
}
|
|
|
|
int S4FUNCTION report4dateFormat_v( PREPORT4 report, char *format )
|
|
{
|
|
return report4dateFormat( report, c4str(format) ) ;
|
|
}
|
|
|
|
int S4FUNCTION report4querySet_v( PREPORT4 report, char *query_expr )
|
|
{
|
|
return report4querySet( report, c4str(query_expr) );
|
|
}
|
|
|
|
|
|
int S4FUNCTION report4sortSet_v( PREPORT4 report, char *sort_expr )
|
|
{
|
|
return report4sortSet( report, c4str(sort_expr) );
|
|
}
|
|
|
|
#endif /* S4VB_DOS */
|
|
#endif /* S4VBASIC */
|
|
|
|
|