Jump to content

Composing 2 records only


mclisa81

Recommended Posts

Hi,

 

I have 44 data files that I'm pulling in one at a time into my template and composing only the first and last record of each for proof pdfs. I am going in and modifying the rule each time, changing the last record since they are all different record counts. I'm sure there's a way to automate this to make it less painful. Any help is appreciated.

 

var ranges = [ 1, 225 ];
function CheckRanges(val)
{
 for (var i in ranges)
   if (val == ranges[i] || ((ranges[i] instanceof Array) && val >= ranges[i][0] && val <= ranges[i][1]))
     return true;
 return false;
}
FusionPro.Composition.composeThisRecord = CheckRanges(CurrentRecordNumber());
return FusionPro.Composition.composeThisRecord;

 

Thanks in advance,

Lisa

Link to comment
Share on other sites

Is that in an OnJobStart rule? I think you can assign a variable for a global data file object which uses your input data file. Then you count the total records and use that as your secondary element in var ranges:

 

myData = new ExternalDataFileEx(GetFileName(FusionPro.Composition.inputFileName), ",") //assuming CSV data
totalRecords = myData.recordCount;
var ranges = [ 1, totalRecords ];
// your function, etc.

 

Admittedly, I have not tried this yet, but I think the logic is valid.

Link to comment
Share on other sites

Actually, as long as pre-processing is occurring, FusionPro already knows how many records there are. That information is accessible through "FusionPro.Composition.totalRecordCount".

 

If your job is imposing, then pre-processing is already occurring. Otherwise, you'll need to specifically tell the job to pre-process by putting this in an OnJobStart rule:

FusionPro.Composition.forcePreprocessing = true;

 

Then it's just a matter of making the following edit to your OnRecordStart code:

var ranges = [ 1, [color="Red"]FusionPro.Composition.totalRecordCount[/color] ];
function CheckRanges(val)
{
 for (var i in ranges)
   if (val == ranges[i] || ((ranges[i] instanceof Array) && val >= ranges[i][0] && val <= ranges[i][1]))
     return true;
 return false;
}
FusionPro.Composition.composeThisRecord = CheckRanges(CurrentRecordNumber());

 

Or more succinctly:

FusionPro.Composition.composeThisRecord = [1,FusionPro.Composition.totalRecordCount].indexOf(CurrentRecordNumber()) > -1

Link to comment
Share on other sites

Hi Ste,

 

I've already finished this job, however, I'm now trying your suggestions since they're a few less steps. Both of them are composing the first record (1) only. Any ideas?

 

On Job Start

FusionPro.Composition.forcePreprocessing = true;

 

On Record Start

var ranges = [ 1, FusionPro.Composition.totalRecordCount ];
function CheckRanges(val)
{
 for (var i in ranges)
   if (val == ranges[i] || ((ranges[i] instanceof Array) && val >= ranges[i][0] && val <= ranges[i][1]))
     return true;
 return false;
}
FusionPro.Composition.composeThisRecord = CheckRanges(CurrentRecordNumber());

 

 

Thanks

Lisa

Link to comment
Share on other sites

I've already finished this job, however, I'm now trying your suggestions since they're a few less steps. Both of them are composing the first record (1) only. Any ideas?

I would add some calls to the Print function and look at the log file to trace what's going on. Try adding this to the end of your OnRecordStart rule:

Print("FusionPro.Composition.totalRecordCount=" + FusionPro.Composition.totalRecordCount);
Print("CurrentRecordNumber()=" + CurrentRecordNumber());
Print("FusionPro.Composition.composeThisRecord=" + 
FusionPro.Composition.composeThisRecord);

Link to comment
Share on other sites

Sorry, Lisa, I should have given that a try before I posted it as a solution. I think what's happening is that OnRecordStart is being called during pre-processing to determine the total number of records that will be generated. Since the range is set to "1" and "totalRecords" (which is unknown at the time of pre-processing), pre-processing will determine that only one record will be created thus making the total records 1. You'd have to add the following to tell pre-processing that all records should be composed when you're pre-processing the job so that the totalRecordCount is accurate:

var ranges = [ 1, FusionPro.Composition.totalRecordCount ];
function CheckRanges(val)
{
 for (var i in ranges)
   if (val == ranges[i] || ((ranges[i] instanceof Array) && val >= ranges[i][0] && val <= ranges[i][1]))
     return true;
 return false;
}

FusionPro.Composition.composeThisRecord = [color="Red"]FusionPro.Composition.inPreprocessing || [/color]CheckRanges(CurrentRecordNumber());

 

Alternatively, you could determine the total number of records yourself by incrementing a variable each time a record is pre-processed:

[color="red"]this.total = this.total || 0;
if (FusionPro.Composition.inPreprocessing)
  ++this.total;[/color]

var ranges = [ 1, [color="Red"]this.total[/color] ];
function CheckRanges(val)
{
 for (var i in ranges)
   if (val == ranges[i] || ((ranges[i] instanceof Array) && val >= ranges[i][0] && val <= ranges[i][1]))
     return true;
 return false;
}

FusionPro.Composition.composeThisRecord = CheckRanges(CurrentRecordNumber());

Link to comment
Share on other sites

Okay, I see what's happening. The thing is, when you do preprocessing, the preprocessing pass figures out which records to compose ahead of time, generally for figuring out imposition stacking. So records that are skipped (composeThisRecord = false) at preprocessing are not included in the totalRecordCount. Therefore, you need to tell FusionPro to skip records only during the main composition pass, not during preprocessing. The easiest way to do that for this case is like so:

FusionPro.Composition.composeThisRecord = FusionPro.Composition.inPreprocessing || [1,FusionPro.Composition.totalRecordCount].indexOf(CurrentRecordNumber()) > -1;

Link to comment
Share on other sites

Hi Jason,

 

Here is my final code ...

 

On Job Start

FusionPro.Composition.forcePreprocessing = true;

 

On Record Start

FusionPro.Composition.composeThisRecord = FusionPro.Composition.inPreprocessing || [1,FusionPro.Composition.totalRecordCount].indexOf(CurrentRecordNumber()) > -1;

 

Lisa

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...