dreimer Posted December 17, 2014 Share Posted December 17, 2014 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 Quote Link to comment Share on other sites More sharing options...
step Posted December 17, 2014 Share Posted December 17, 2014 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. Quote Link to comment Share on other sites More sharing options...
dreimer Posted December 18, 2014 Author Share Posted December 18, 2014 Attached is the data I am using for set-up. Saved them as text tab delimited so I could post here. Thanks step. I'm sure an array may be the way to go but not sure how to do that.55740_Proof.txtStoreList.txt Quote Link to comment Share on other sites More sharing options...
Dan Korn Posted December 18, 2014 Share Posted December 18, 2014 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"); Quote Link to comment Share on other sites More sharing options...
dreimer Posted December 18, 2014 Author Share Posted December 18, 2014 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. Quote Link to comment Share on other sites More sharing options...
dreimer Posted December 18, 2014 Author Share Posted December 18, 2014 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??? TIAThreePerLine.pdf Quote Link to comment Share on other sites More sharing options...
Dan Korn Posted December 18, 2014 Share Posted December 18, 2014 (edited) 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 December 18, 2014 by Dan Korn typo Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.