Complex Mail Merge (CSV to Word, CSV to PDF, or Other) - csv

QUESTION:
How do you write an ifStatement for Word or for PDF to calculate multiple rows per matching result?
USEAGE:
What I am trying to do seems fairly straight forward and was very easy when I was able to use MS Access 15 years ago, but with Access being not a possibility anymore, I am hoping somebody has a reasonable solution.
The WHAT:
I am trying to generate Statements/Invoices from a CSV (or spreadsheet of any format) into a nice report layout. Let's say the columns look like this:
First Name | Last Name | Account | Address | Item | Description | Item Total
Jane | Smith | 123 | 111 Main St | Ice Cream | it's really cold | $100.00
This is super easy and I can do in Word within 10 minutes and make it "pretty".
BUT what if there are multiple Items per invoice?
So maybe the CSV looks like:
First Name | Last Name | Account | Address | Item | Description | Item Total
Jane | Smith | 123 | 111 Main St | Ice Cream | it's really cold | $100.00
Jane | Smith | 123 | 111 Main St | Hot Dogs | all beef, all the time | $200.00
I still want there to only be 1 invoice per person but not sure how to do an if statement in Word that would say "If there are multiple items per person, put them on a new row, then total them all together"
I would be glad to have the CSV go into a PDF fillable form if I could get the multiple rows to work - I just cannot figure that portion out.
Other options: I looked at OpenOffice "Base" but couldn't get a nice form for a very custom Report. I researched briefly on how to do something like this on AWS, but without any luck. I don't think Microsoft has anything like Access anymore

You can use Word's Catalogue/Directory Mailmerge facility for this (the terminology depends on the Word version). To see how to do so with any mailmerge data source supported by Word, check out my Microsoft Word Catalogue/Directory Mailmerge Tutorial at:
http://www.msofficeforums.com/mail-merge/38721-microsoft-word-catalogue-directory-mailmerge-tutorial.html
or:
http://www.gmayor.com/Zips/Catalogue%20Mailmerge.zip
The tutorial covers everything from list creation to the insertion & calculation of values in multi-record tables in letters. Do read the tutorial before trying to use the mailmerge document included with it.
Depending on what you're trying to achieve, the field coding for this can be complex. However, since the tutorial document includes working field codes for all of its examples, most of the hard work has already been done for you - you should be able to do little more than copy/paste the relevant field codes into your own mailmerge main document, substitute/insert your own field names and adjust the formatting to get the results you desire. For some worked examples, see the attachments to the posts at:
http://www.msofficeforums.com/mail-merge/9180-mail-merge-duplicate-names-but-different-dollar.html#post23345
http://www.msofficeforums.com/mail-merge/11436-access-word-creating-list-multiple-records.html#post30327
Another option would be to use a DATABASE field in a normal ‘letter’ mailmerge main document and a macro to drive the process. An outline of this approach can be found at: http://answers.microsoft.com/en-us/office/forum/office_2010-word/many-to-one-email-merge-using-tables/8bce1798-fbe8-41f9-a121-1996c14dca5d
Conversely, if you're using a relational database or, Excel workbook with a separate table with just a single instance of each of the grouping criteria, a DATABASE field in a normal ‘letter’ mailmerge main document could be used without the need for a macro. An outline of this approach can be found at:
https://answers.microsoft.com/en-us/msoffice/forum/msoffice_word-mso_winother-mso_2010/mail-merge-to-a-word-table-on-a-single-page/4edb4654-27e0-47d2-bd5f-8642e46fa103
For a working example, see:
http://www.msofficeforums.com/mail-merge/37844-mail-merge-using-one-excel-file-multiple.html
The problem with the DATABASE field, though, is that it won't provide the totals you're after. Nevertheless, if you're going down the macro route, it wouldn't take too much more code to append a totals row to the resulting table.
Alternatively, you may want to try one of the Many-to-One Mail Merge add-ins, from:
Graham Mayor at http://www.gmayor.com/ManyToOne.htm; or
Doug Robbins at https://onedrive.live.com/?cid=5AEDCB43615E886B&id=5AEDCB43615E886B!566
PS: While I'm cognisant of StackOverflow's preference for the substance of answers to be posted here rather than linked to, the complexity in this case is far too great to deal with that way, besides which, one can't post the actual field codes or a document containing them here.

Related

How to loop transpose function for every row containing a specific character on Google Sheets?

This is what I have (each "|" symbol indicates a new column on the same row)
John | Doe
Manager
NY
123-45-67
Fax: 987-54-32
a#b
Jane
Assistant
CA
234-56-78
c#d
Mike | Brown
Analyst | Intern
CA
345-67-89
e#f
However, I am trying to get it to look like the below on Google Sheets:
John Doe | Manager | [empty] | NY | 123-45-67 | Fax: 987-54-32 | a#b
Jane | Assistant | [empty] | CA | 234-56-78 | [empty] | c#d
Mike Brown | Analyst | Intern | CA | 345-67-89 | [empty] | e#f
The names are all formatted in bold font so I can use that property as my identifier to be able to merge last names and first names into the same column. However, not sure how I can leave a column empty if a fax number exists in one record and it doesn't in another.
I ultimately want it to be able to create a new record row after each cell that has a "#" character in it. How much of this is possible? If it can be done, how much of it can be done and how can it be done in Google Sheets?
It took some work, but this can be done without a script, through use of built in functions in the sheet. I will put a link to an example below in a comment, but I cannot promise to keep it there forever. But here is the method.
STEP 0: Add appropriate headers in row 1 for sanity. Reserve column A for a record locator, to be built later. Thus, in the example above "John" sits in B2 and "Doe" is in C2.
STEP 1: Build a column for each type of field, and indicate whether the value is that type. For instance, my column D determines if something is an email with the (draggable) formula =iferror(find("#",B2)>0,false). In column E I determine if something is a name. You could use the bolding idea, but I went for =or((row()=2),D1), which says either I am the first row of data, or the preceding row was an email. This too gets dragged. Similarly to test for states: =and((LEN(B2)=2),(B2=upper(B2))), fax =(upper(mid(B2,1,3))="FAX"), ID =and((len(B2)=9),mid(B2,4,1)="-",mid(B2,7,1)="-"), and finally anything else must be a job =not(or(D2,E2,F2,G2,H2)).
STEP 2: Construct the value from the 2 potential columns. If the second is empty, just the first. Otherwise names get a space between and anything else gets "and" between. =if(ISBLANK(C2),B2,if(E2,B2&" "&C2,B2&" and "&C2))
STEP 3: Construct the record type based on which things were true. I put the type names in the header row, so they will match later, which makes this formula a bit impenetrable, but I hope you get the idea: =if(D2,$S$1,if(E2,$N$1,if(F2,$P$1,if(G2,$R$1,if(H2,$Q$1,if(I2,$O$1,"error")))))). Now in A2 I append the record number to the job type, where the record number is how many names we have met so far, thus (also draggable) =K2&countif($E$2:$E2,true). [The idea of building a key this way comes from Prashanth
STEP 4: I left column L blank for neatness so the results are separate from the input and calculations, and then I put a record number in column M as follows =(row()-1). And now we apply vlookup across the rest of the row to get each field by matching it to the column header of the desired output (name|job|state|ID|fax|email) as follows =vlookup(N$1&$M2,$A:$K,10,false), which is built to be draggable both to the rightmost column (email) and the bottom row (row 4 for record 3, in our example). Missing data show up as #N/A (if you find that ugly, an IfError can make it say something nicer).
I hope this illustrates not only a result, but also a method, with which you could tinker if you saw fit.

How to organise form responses in Google Spreadsheets

So I'm trying to set up an online invitation and I have it set up so that once the form is sent, the responses get stored in a Google spreadsheet.
Here's a basic version of the invitation:
http://jsfiddle.net/ax1ncdmu/7/
Then at the bottom there's a send button which sends the info off to the spreadsheet.
My problem is that when its sent, it looks like this in the spreadsheet:
guest0 | guest1 | guest2 | mealChoice0 | mealChoice1 | mealChoice2
-------------------------------------------------------------------
Tom | Dick | Harry | Meat | Meat | Fish
Which isn't ideal, as the number of guests per invitation can change and it's hard to match up the name with their own meal choice.
Idealy, the spreadsheet would be laid out like this:
Name | Meal Choice
-------|-------------
Tom | Meat
Dick | Meat
Harry | Fish
But I'm not sure if that's even possible? Or maybe beyond my coding knowledge...
I was trying to think whether it would be best to somehow incorporate it into multiple forms or somehow have all the names already present in the spreadsheet to reference and add on the meal choices accordingly?
Anyway, I'm open to suggestion, even if it's that it's not even possible :)
Thanks
Edit: Also, this might be useful:
http://pastebin.com/FD6QqpJQ
This is the gs script that I found which handles the data. Maybe this is what has to change, but its kinda beyond my level of coding unfortunately :/
This formula works for your sample data - can you modify it to work with your actual sheet:
={"Name","Meal Choice";TRANSPOSE(FILTER(2:2,IFERROR(FIND("guest",1:1),0))),TRANSPOSE(FILTER(2:2,IFERROR(FIND("meal",1:1),0)))}
You can see it working in this sample sheet: https://goo.gl/gvsTfw
I think that the logic isn't optimal. Instead of having one form with fixed number por invitees, I think that will be better to have one form with three questions:
Subject of the invitation
Invitee name
Meal choice
Some of advantages of the above approach are
that the resulting answers will be displayed as expected
the same form could be used for several events/invitations

Creating SQL Table layout for dynamic document

I apologize if this question is vague, but I'll try to be as clear as possible. I've been given a task where I'm to take a text file, store its content in SQL Server 2008, and automate the creation of a form letter given certain inputs. I've been able to break it into the following generic structure (pay no attention to the content, it's just generic text, but the situational break-down is similar):
Welcome [User],
[if #purchase = true, add this paragraph]
Thank you for purchasing the [device / subscription / subscription and device]
from this business on [date].
[#purchase = true and #return = true, add this paragraph]
I'm sorry you returned it!
...
Signed,
[Author]
[Author Image]
Assuming I'm already able to bring in all the necessary variables (user, purchase, return, date, device or device and subscription or subscription only), how should I go about storing the letter pieces in SQL? would it be considered fine to have a structure like the following:
+-------+-----------------+----------+--------+
| Order | Text | purchase | return |
+-------+-----------------+----------+--------+
| 1 | (1st paragraph) | TRUE | null |
| 2 | (2nd paragraph) | TRUE | FALSE |
+-------+-----------------+----------+--------+
Where I store the contents of the first paragraph as:
Thank you for purchasing the [device / subscription / subscription and device]
from this business on [date].
And then write a stored procedure to piece it together based on the Boolean columns, and find/Replace the bracketed bits with input variables to output the entire letter as a string? It doesn't seem like it would be able to handle much variability, to be honest. Maybe breaking down the document into paragraph and sentence tables?
My ultimate goal would be to output this to either a report I create or, perhaps more ideally, to a Word document (though this is probably a whole different bit of research). Am I way off base here? Any insight is helpful.
you can use replace in select statment
for example
SELECT replace(replace(Text, 'device', #deviceVaribale), 'subscription', #subscriptionVaribale) FROM Order

Maintaing test users in cucumber steps

In my tests I have to work with different types of users and environments. At the moment I am manually updating the users since we don't have many features. However we will be adding many new features that will make it very difficult to update all files manually. Most of these are needed in the Given step. Example:
Scenario:
Given I am signed in as "user1#example.com"
I would like to change this to:
Scenario
Given I am signed in as "user1"
"user1" could stored in a csv file or in a db. Can either of these be done? If so which is the recommended method?
The CSV file would have something like:
user1,user1#example.com
user2,user2#example.com
user3,user3#example.com
A table in a db:
| id | user | email |
| 1 | user1 | user1#example.com |
| 2 | user2 | user2#example.com |
Seems using the db might be easier to maintain if it can be done. As always your help is appreciated.
The usual way to abstract test case details in Cucumber is through the use of "Scenario Outlines":
https://github.com/cucumber/cucumber/wiki/Scenario-Outlines
Using a Scenario Outline is equivalent to storing test case data in a CSV file, but it has the advantage of keeping the test case info right there in the .feature file.
If you follow this convention, all parts of the test workflow can be edited in the same place - this actually makes maintenance of the test cases easier than if the test outline and the individual test cases are segregated into separate text files (or segregated between a .feature file and a database instance).

Is it more performant to have rows or columns in sql?

If I have to save many strings that are related and that may be dividied in different languages: What's the best way to do it?
I think I have the following options. Option 1 and 3 is the most clear solution to me. They have more columns, but result in fewer rows.
Option 2 and 4 are the most flexible ones (I could dynamically add new string_x without changing the database). They have only three columns but they will result in many rows.
Option 5 would result in many tables.
Option 1:
id | string_1 | string_2 | string_3 | string_4 | ... | string_n | lang
Option 2 *(where name would be string_1 or string_2 etc.)*
id | name | lang
Option 3
id | string_1 | string_2 | string_3 | string_4 | ... | string_n
id | lang | stringid
Option 4
id | lang | stringid
id | name
Option 5
id | string_1 | lang
id | string_2 | lang
id | ... |lang
I'm using it to store precached html values for multiple views (one line view, two lines, long description, etc.), if this is of interest.
Option 1 and 3 are not recommended, as you end up with the language (which is data) in the field name. You have to change the database design if you want to add another language.
Option 5 is not recommended, as you end up with the string identifider (which is data) in the table name. You have to change the database design if you want to add another string.
Option 2 or 4 would work fine. Option 4 is more normalised, as you don't have duplicate string names, but option 2 might be easier to work with if you enter values directly into the table view.
Having many rows in a table is not a problem, that's what the database system is built for.
Although I've not had to specifically deal with multi-language interfaces, and if that is all its purpose is, is a translation, I would to option 1, but swapped, something like
id English French German Spanish, etc...
So you would basically have a master column (such as English) as a "primary" word that is always populated, then as available, the other language columns get filled in. This way, you can keep adding as many "words" as you need, and if they get populated across all the different languages, so be it... If not, you still have a "primary" value that could be used.
It depends on a lot of other things. First of all, how many strings could there be? How many languages could there be? To simplify things, let's say if either of those numbers are greater than 5, then options 1 and 3 are infeasible.
Before I go any further, you should definitely look into implementing multi-language functionality outside of the database. In PHP you can use Gettext and put your translation data in flat files. This is a better idea for multiple reasons, the main ones being performance and ease of use with external translators.
If you absolutely must do this in a database then you should use a table structure similar to this:
id | string | language
An example entry would be:
welcome_message | Hello, World! | english
Which I think you've described in Option 2. To clarify, depending on the amount of different languages and different strings, you should use a single table with a fixed number of fields.
If you support only a few languages, you might also consider a schema in which each language is its own column:
ID EN ES FR Etc...
This is less normalized than your option 4, but it is very easy to work with. We have built our database translations like this. As we develop code, we create string resources fill in the English text. Later, a translator fills in the strings of their language.