Skip to main content
Question

Creating a 'foreach' style loop in pipelines

  • December 11, 2023
  • 0 replies
  • 901 views

MattMakris
Forum|alt.badge.img+7

Is there a way to do create a loop in Pipelines that runs a set number of times? For example, I want to run it x times based on user input: When a record is updated, it will make X copies of it based on a "clone quantity" field in the updated record. Thanks!



------------------------------
Matt Makris
------------------------------

Forum|alt.badge.img+9
  • Quickbase Alumni
  • December 11, 2023

Your simplest solution would be as Mark suggested in this post and utilize a helper table to build your upsert. 

A more complex solution would be to use a for loop (in theory so don't hold me to it 100%) that might look like:  

{% set payload = [] %} OR [%set payload = '' %}

{% for i in range(a.counter_field) %}

build a json object you put into the payload or append a csv row if you go the importfromcsv route

{% endfor %}

The idea is to set an arbitrary array or string and loop through your counter to build a collection for upsert (REST API) or CSV string to use ImportFromCSV (HTTP API). It would be very difficult to test but you could try and build the payload on the fly inside of the Quickbase Request Channel body input. 



------------------------------
Chayce Duncan
------------------------------

  • Quickbase Alumni
  • December 12, 2023

There are two methods to do this,

Method 1:

You can create a jinja for each loop with in the make reqeust step. The jinja for each will create a body and you can use that body and send it to qb api to create X copies.

Method 2: 
Create a Parent table with just numbers, and connect that to your main table which is the child table. Replace the "Clone quantiy" field with the lookup field. Use the parent table in your pipeline, when every a record is created in the main table. The pipeline will query the parent table, and use the condition to limit the records to number entered. and a simple for each will run for every record in the parent table, and you can put any step with in the for each loop.



------------------------------
ved prasad
------------------------------

Forum|alt.badge.img+6
  • Quickbase Staff
  • December 13, 2023

As others have mentioned, there are multiple ways to accomplish this.  However I believe the jinja method is much easier than the others.  In your situation the jinja doesn't need to build the payload, it just needs to create a loop.

The regex step uses the value from the updated record in step A ("copy_count" in my example) to generate the loop:

Hope that helps!



------------------------------
Doug Henning
------------------------------

DwightMunson1
Forum|alt.badge.img+8
  • Quickbase Alumni
  • December 14, 2023

This should give you a good start. To me as long as you understand a little Jinja and API this is the easiest route to go. You may have to adjust depending on what data you're creating the records with. Such as date formatting or casting to a certain data type. 

Step A: Trigger, with field for quantity of records to create
Step B: Make a Request
URL: https://api.quickbase.com/v1/records
Method: POST
Content type: application/json
Body: 

{
  "to": "tableId", {# Table Name #}
  "mergeFieldId": 3, {# Your Key Field - only needed if you're going to update records, not create new #}
  "data": [ {% for x in range(a.counter_field) %}
    {
       "FID": { {# Foreign Key #}
        "value": "{{a.field_label | int}}" {# I always cast numeric foreign keys to an int #}
      },
      "FID": { {# Field Label#}
        "value": {{a.field_label}}
      },
      "FID": { {# Field Label#}
        "value": {{a.field_label}}
      },
      "FID": { {# Field Label#}
        "value": "{{a.field_label}}"
      }
    }
  {% if loop.last == false %},{% endif %}
  {%- endfor %} 
  ]
}



------------------------------
Dwight Munson
------------------------------