Aug 23, 2023 06:51 AM
I am working on a base with one table that has a record of all my fabric purchases, their respective lengths and widths. I want to create a my second table as a list of patterns and the length and width requirements for the fabric necessary to complete the pattern and have it automatically pull what fabrics I have that are eligible for the project based on the length and width criteria of the pattern. Is this possible?
Aug 23, 2023 11:16 AM - edited Aug 23, 2023 01:39 PM
Yes, but it's a little complicated... Here's an example base for you to reference:
https://airtable.com/appT736eIWPC4dfbt/shrjuX8ojLYH7Tqjd
The reason why this is complicated is because Airtable doesn't support doing math in rollup fields without reducing it to a single number (as far as I know, here's the help page on it: https://support.airtable.com/docs/rollup-field-reference ), nor does it support doing math in a formula field that uses values from a lookup field. Otherwise, you'd be able to generate two truth tables (one for width, one for length), and then apply to the list of fabrics, like how in Excel you could use SUMPRODUCT to filter a range based on multiple criteria.
What we're going to do is abuse the fact that regular expressions allow us to use numbers, and importantly, numbers from other fields. (Otherwise, if you just had a static set of numbers across all patterns, you could just set the conditions in the lookup field, as in: https://support.airtable.com/docs/conditional-counts-lookups-and-rollups.)
One caveat: you will have to link every fabric to every pattern for this to work (well, every fabric you'd like to consider using in a pattern). You can set up an automation to do this; or you can do it once, and then copy and paste it whenever you create a new record.
So, to start, we have two tables: Fabrics and Patterns
The width and length are integer fields. If you regularly work with decimals/fractions, we'll need to convert them to whole numbers (by multiplying by 10, 100, 100, etc.). And obviously, the complicated bit is in the formula and rollup fields.
Here's the formula for the field {Dimensions in Ticks}:
Name & "§" & REPT("x", Width) & REPT("y", Length)
Name & "§" & REPT("x", {Width (Decimal)} * 10) & REPT("y", {Length (Decimal)} * 10)
Here's the formula for the field {Eligible Fabrics}:
SUBSTITUTE(
REGEX_REPLACE(
REGEX_REPLACE(
ARRAYJOIN(values, "¶"),
"([^¶]+)§x{" & Width & ",}y{" & Length & ",}",
"$1"),
"[^¶]+§[xy]+¶?",
""),
"¶",
", "
)
and here's the version for decimal width and length:
SUBSTITUTE(
REGEX_REPLACE(
REGEX_REPLACE(
ARRAYJOIN(values, "¶"),
"([^¶]+)§x{" & ({Width (Decimal)} * 10) & ",}y{" & ({Length (Decimal)} * 10) & ",}",
"$1"),
"[^¶]+§[xy]+¶?",
""),
"¶",
", "
)
To adapt the code to your needs, just change the field names to those in your base, and if using decimal measurements, add zeroes to the "10" to suit the number of decimal places.
It's best to explain it from the inside out, since each function builds on the previous one.
ARRAYJOIN(values, "¶")
First, we join all the {Dimensions in Ticks} entries with the pilcrow/paragraph mark (¶, again chosen because it's not commonly used), this will tell us where one entry ends and where another begins.
REGEX_REPLACE(
[results of the previous step],
"([^¶]+)§x{" & Width & ",}y{" & Length & ",}",
"$1"
)
We then use the REGEX_REPLACE function to search for all entries that have at least the number of ticks ("x" and "y") of the dimensions of the pattern, and replace them with just the name of the fabric. The regular expression query is structured as follows:
([^¶]+) | § | x{" & Width & ",} | y{" & Length & ",} |
Capture (save) all characters that are not a pilcrow | Match § character (used to separate name from dimensions) | x{a,b} means match instances of "x", from a minimum of "a" repetitions to a maximum of "b" repetitions. In this case, we're matching x, if there are at least {Width} number of x. By leaving out "b", there's no maximum limit to the number of "x" it can match. | This is the same as the previous expression for width; with both expressions, we're only matching those entries that have both the width and length required. |
When the function finds a match, we tell it to replace it with the captured group ($1). So, for example, if "Fabric A§xxxxxyy" is eligible, it'll become just "Fabric A", if not, nothing happens to it.
REGEX_REPLACE(
[results of the previous step]
"[^¶]+§[xy]+¶?",
""
)
The next step is to remove all the ineligible fabrics. We can identify these by the fact that they'll still have the § character.
[^¶]+ | § | [xy]+ | ¶? |
Match all characters that are not a pilcrow, i.e. the fabric name | Match § character, which now indicates that this entry was not matched in the previous step | Match all "x" and "y" characters. | Optionally match a pilcrow. Entries are separated by pilcrows, except at the end of the rollup. |
SUBSTITUTE(
[results of the previous step]
"¶",
", "
)
Finally we just replace all the remaining pilcrows (from the end of valid entries) with commas.
EDIT: Fixed up the formatting, cleaned up the regex, and changed "height" to "length", because we're talking about fabrics, not rectangles.
Aug 23, 2023 07:13 PM
@Andy_Lin1 approach is also interesting. Converting length to string length is a good idea.
@readbetsyread How about a slightly different approach than the automatic calculation, using Share link?
I made some changes to Andy_Lin1's and you can take a look at it.
Airtable - Cloth/Pattern Dimension Comparison
There is an Open URL field in the Patterns2 table.
The URL formula looks like this
"https://airtable.com/appKyvhgxaIfXMisy/shrof9oAs31P4uzSs/tblMSekfrw9g7lXvX"&
"?filterGreaterOrEqual_Width=" & {Width} &
"&filterGreaterOrEqual_Length=" & {Length}
Clicking on this will open a shareview of the Fabrics table, and URL filtering will extract only those fabrics that match the criteria.
Once you have determined the fabric, copy the Name and paste it into the Fabrics link table.
Aug 23, 2023 10:33 PM
@Sho Wow, I didn't know that you could filter a shared view in such a way. Thanks for teaching me something new!