Jump to content

Better Way to write my rule


dreimer

Recommended Posts

So I have a rule using my main data linking to an external data source and the rule works the way I want but was wondering how I can clean it up. Basically the if statements are going through the data to decide which return function to use based on the last Store Number field populated. I have attached how the rule works with all 15 stores populated. I have included only a portion of the rule since it has too many characters. TIA

 

var XDF = new ExternalDataFileEx("StoreList.csv", "\,");
var a = XDF.FindRecord("Number", Field("Store1"));
var b = XDF.FindRecord("Number", Field("Store2"));
var c = XDF.FindRecord("Number", Field("Store3"));
var d = XDF.FindRecord("Number", Field("Store4"));
var e = XDF.FindRecord("Number", Field("Store5"));
var f = XDF.FindRecord("Number", Field("Store6"));
var g = XDF.FindRecord("Number", Field("Store7"));
var h = XDF.FindRecord("Number", Field("Store8"));
var i = XDF.FindRecord("Number", Field("Store9"));
var j = XDF.FindRecord("Number", Field("Store10"));
var k = XDF.FindRecord("Number", Field("Store11"));
var l = XDF.FindRecord("Number", Field("Store12"));
var m = XDF.FindRecord("Number", Field("Store13"));
var n = XDF.FindRecord("Number", Field("Store14"));
var o = XDF.FindRecord("Number", Field("Store15"));
if ((Field("Store1") != "") && (Field("Store2") == ""))
{
  return "<span>" + "<b>" + XDF.GetFieldValue(a, 1) + "</span>" + " " + XDF.GetFieldValue(a, 6);
}
if ((Field("Store2") != "") && (Field("Store3") == ""))
{
  return "<span>" + "<b>" + XDF.GetFieldValue(a, 1) + "</span>" + " " + XDF.GetFieldValue(a, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(b, 1) + "</span>" + " " + XDF.GetFieldValue(b, 6);
}
if ((Field("Store3") != "") && (Field("Store4") == ""))
{
  return "<span>" + "<b>" + XDF.GetFieldValue(a, 1) + "</span>" + " " + XDF.GetFieldValue(a, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(b, 1) + "</span>" + " " + XDF.GetFieldValue(b, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(c, 1) + "</span>" + " " + XDF.GetFieldValue(c, 6);
}
if ((Field("Store4") != "") && (Field("Store5") == ""))
{
  return "<span>" + "<b>" + XDF.GetFieldValue(a, 1) + "</span>" + " " + XDF.GetFieldValue(a, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(b, 1) + "</span>" + " " + XDF.GetFieldValue(b, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(c, 1) + "</span>" + " " + XDF.GetFieldValue(c, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(d, 1) + "</span>" + " " + XDF.GetFieldValue(d, 6);
}
if ((Field("Store5") != "") && (Field("Store6") == ""))
{
  return "<span>" + "<b>" + XDF.GetFieldValue(a, 1) + "</span>" + " " + XDF.GetFieldValue(a, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(b, 1) + "</span>" + " " + XDF.GetFieldValue(b, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(c, 1) + "</span>" + " " + XDF.GetFieldValue(c, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(d, 1) + "</span>" + " " + XDF.GetFieldValue(d, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(e, 1) + "</span>" + " " + XDF.GetFieldValue(e, 6);
}
if ((Field("Store6") != "") && (Field("Store7") == ""))
{
  return "<span>" + "<b>" + XDF.GetFieldValue(a, 1) + "</span>" + " " + XDF.GetFieldValue(a, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(b, 1) + "</span>" + " " + XDF.GetFieldValue(b, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(c, 1) + "</span>" + " " + XDF.GetFieldValue(c, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(d, 1) + "</span>" + " " + XDF.GetFieldValue(d, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(e, 1) + "</span>" + " " + XDF.GetFieldValue(e, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(f, 1) + "</span>" + " " + XDF.GetFieldValue(f, 6);
}
if ((Field("Store7") != "") && (Field("Store8") == ""))
{
  return "<span>" + "<b>" + XDF.GetFieldValue(a, 1) + "</span>" + " " + XDF.GetFieldValue(a, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(b, 1) + "</span>" + " " + XDF.GetFieldValue(b, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(c, 1) + "</span>" + " " + XDF.GetFieldValue(c, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(d, 1) + "</span>" + " " + XDF.GetFieldValue(d, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(e, 1) + "</span>" + " " + XDF.GetFieldValue(e, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(f, 1) + "</span>" + " " + XDF.GetFieldValue(f, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(g, 1) + "</span>" + " " + XDF.GetFieldValue(g, 6);
}
if ((Field("Store8") != "") && (Field("Store9") == ""))
{
  return "<span>" + "<b>" + XDF.GetFieldValue(a, 1) + "</span>" + " " + XDF.GetFieldValue(a, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(b, 1) + "</span>" + " " + XDF.GetFieldValue(b, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(c, 1) + "</span>" + " " + XDF.GetFieldValue(c, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(d, 1) + "</span>" + " " + XDF.GetFieldValue(d, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(e, 1) + "</span>" + " " + XDF.GetFieldValue(e, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(f, 1) + "</span>" + " " + XDF.GetFieldValue(f, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(g, 1) + "</span>" + " " + XDF.GetFieldValue(g, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(h, 1) + "</span>" + " " + XDF.GetFieldValue(h, 6);
}
if ((Field("Store9") != "") && (Field("Store10") == ""))
{
  return "<span>" + "<b>" + XDF.GetFieldValue(a, 1) + "</span>" + " " + XDF.GetFieldValue(a, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(b, 1) + "</span>" + " " + XDF.GetFieldValue(b, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(c, 1) + "</span>" + " " + XDF.GetFieldValue(c, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(d, 1) + "</span>" + " " + XDF.GetFieldValue(d, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(e, 1) + "</span>" + " " + XDF.GetFieldValue(e, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(f, 1) + "</span>" + " " + XDF.GetFieldValue(f, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(g, 1) + "</span>" + " " + XDF.GetFieldValue(g, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(h, 1) + "</span>" + " " + XDF.GetFieldValue(h, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(i, 1) + "</span>" + " " + XDF.GetFieldValue(i, 6);
}
if ((Field("Store10") != "") && (Field("Store11") == ""))
{
  return "<span>" + "<b>" + XDF.GetFieldValue(a, 1) + "</span>" + " " + XDF.GetFieldValue(a, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(b, 1) + "</span>" + " " + XDF.GetFieldValue(b, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(c, 1) + "</span>" + " " + XDF.GetFieldValue(c, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(d, 1) + "</span>" + " " + XDF.GetFieldValue(d, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(e, 1) + "</span>" + " " + XDF.GetFieldValue(e, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(f, 1) + "</span>" + " " + XDF.GetFieldValue(f, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(g, 1) + "</span>" + " " + XDF.GetFieldValue(g, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(h, 1) + "</span>" + " " + XDF.GetFieldValue(h, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(i, 1) + "</span>" + " " + XDF.GetFieldValue(i, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(j, 1) + "</span>" + " " + XDF.GetFieldValue(j, 6);
}
if ((Field("Store11") != "") && (Field("Store12") == ""))
{
  return "<span>" + "<b>" + XDF.GetFieldValue(a, 1) + "</span>" + " " + XDF.GetFieldValue(a, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(b, 1) + "</span>" + " " + XDF.GetFieldValue(b, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(c, 1) + "</span>" + " " + XDF.GetFieldValue(c, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(d, 1) + "</span>" + " " + XDF.GetFieldValue(d, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(e, 1) + "</span>" + " " + XDF.GetFieldValue(e, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(f, 1) + "</span>" + " " + XDF.GetFieldValue(f, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(g, 1) + "</span>" + " " + XDF.GetFieldValue(g, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(h, 1) + "</span>" + " " + XDF.GetFieldValue(h, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(i, 1) + "</span>" + " " + XDF.GetFieldValue(i, 6)
  + " | " + "<span>" + "<b>" + XDF.GetFieldValue(j, 1) + "</span>" + " " + XDF.GetFieldValue(j, 6)
  + "<p>" + "<span>" + "<b>" + XDF.GetFieldValue(k, 1) + "</span>" + " " + XDF.GetFieldValue(k, 6);
}

Sample Output.pdf

Link to comment
Share on other sites

Could you explain better what you're trying to do? At first glance, it looks like you could just put those fields into an array and filter out the empty ones. Then you could join them with a pipe and replace every other pipe with a paragraph tag. But I'd need a better explanation and possibly to see the data to give you a better answer.
Link to comment
Share on other sites

Yes, loops and arrays are your friends, especially if your code has a bunch of lines that are basically repeats of each other with a number incremented.

 

Here's what I came up with:

var XDF = new ExternalDataFileEx("StoreList.txt", "\t");
var stores = [];
for (var i = 1; i <= 15; i++)
   stores.push(Field("Store" + i));
stores = stores.filter(String);
var result = "";
for (var i in stores)
{
   var XDF_row = XDF.FindRecord("Number", stores[i]);
   var markup = "<b>" + TaggedFromRaw(XDF.GetFieldValue(XDF_row, 1)) + "</b>&[size="3"]#[/size]32;" + TaggedFromRaw(XDF.GetFieldValue(XDF_row, 6));
   if (result)
       result += ((i % 2) ? " | " : "<p>\n");
   result += markup;
}
return result;

Actually, one of the most complicated parts of this is the logic to get two stores on each line. If you had one store on each line, it would be simpler:

var XDF = new ExternalDataFileEx("StoreList.txt", "\t");
var stores = [];
for (var i = 1; i <= 15; i++)
   stores.push(Field("Store" + i));
stores = stores.filter(String);
var result = [];
for (var i in stores)
{
   var XDF_row = XDF.FindRecord("Number", stores[i]);
   result.push("<b>" + TaggedFromRaw(XDF.GetFieldValue(XDF_row, 1)) + "</b>&[size="3"]#[/size]32;" + TaggedFromRaw(XDF.GetFieldValue(XDF_row, 6)));
}
return result.join("<p>\n");

Link to comment
Share on other sites

Wow, thanks for the codes Dan! Way less coding than what I was doing, but I figured there was an easier way. There actually is not a request to have just two stores per line, depending on the length of names they would like three per line but I had no idea on how to make that flow without possibly wrapping a phone number to a new line away for the store name.

 

Is there a place where I can find out what all these things in the code are actually doing so I can understand them and try to learn to use this kind of coding?

 

Thanks again. I will try these.

Link to comment
Share on other sites

So I attached another example of how three locations they would want on one line. Tried changing up your codes provided and can't seem to get anything to work. If I eliminate the two per requirement my biggest problem would be suppressing the pipe when not needed when the next store starts a new line. Maybe a table would work??? TIA

ThreePerLine.pdf

Link to comment
Share on other sites

Is there a place where I can find out what all these things in the code are actually doing so I can understand them and try to learn to use this kind of coding?

A good place to start would be to follow the links at the bottom of my signature to the JavaScript Guide and Reference. And read other threads on this forum. There are also a lot of JavaScript tutorials on the web; the problem with those, though, is that many of them focus less on the JavaScript language itself as they do on using web browser-specific functions to do client-side web programming, which isn't really directly relevant to what you would do for writing rules in FusionPro. But the language itself is basically the same. Other than that, learning to code, and to build FusionPro templates, is like how you to get to Carnegie Hall: practice.

So I attached another example of how three locations they would want on one line. Tried changing up your codes provided and can't seem to get anything to work.

If you want to always have three on every line (except perhaps the last), then just change the 2 in this line:

        result += ((i % 2) ? " | " : "<p>\n");

to 3, like so:

        result += ((i % 3) ? " | " : "<p>\n");

There actually is not a request to have just two stores per line, depending on the length of names they would like three per line but I had no idea on how to make that flow without possibly wrapping a phone number to a new line away for the store name.

Right, you don't always want the same number per line; you want whatever will fit. I think what you need to accomplish that is to use text measurement to measure each line, starting with one store, then adding more, until it doesn't fit, and then backing off one. This coding is a bit more complicated, and I'm not sure I have time to help with that, although, if I did, I would need to see more of the job to know exactly how to code it.

If I eliminate the two per requirement my biggest problem would be suppressing the pipe when not needed when the next store starts a new line.

Right, but FusionPro doesn't really have a callback or anything to let you know when it's flowing text to a new line; that's why you need to measure in a rule and then feed it pre-broken lines to do something like that.

Maybe a table would work??? TIA

You could use a table, and that would work. But that's all about having the same number of cells in each row, which is different than your sample output.

Edited by Dan Korn
typo
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...