# Examples

### [Freeze Users](https://batchforce.octoberswimmer.com/run?query=SELECT%0A++++++++Id%0AFROM%0A++++++++UserLogin%0AWHERE%0A++++++++UserId+IN+%28%0A++++++++++++++++SELECT%0A++++++++++++++++++++++++Id%0A++++++++++++++++FROM%0A++++++++++++++++++++++++User%0A++++++++++++++++WHERE%0A++++++++++++++++++++++++Profile.Name+IN+%28%27Marketing%27%2C+%27Customer+Support%27%29%0A++++++++%29&expr=%7BId%3A+record.Id%2C+IsFrozen%3A+true%7D&object=UserLogin&jobType=1&inputType=1)

Freeze all users with specific profiles by updating `UserLogin` records.

```
$ batchforce update UserLogin -q "SELECT Id FROM UserLogin WHERE UserId IN (SELECT Id FROM User WHERE Profile.Name IN ('Marketing', 'Customer Support'))" '{Id: record.Id, IsFrozen: true}'
```

### [Create Notes from Tasks](https://batchforce.octoberswimmer.com/run?query=SELECT%0A++++++++Id%2C%0A++++++++Description%2C%0A++++++++CreatedDate%2C%0A++++++++WhatId%2C%0A++++++++CreatedBy.Name%2C%0A++++++++CreatedById%0AFROM%0A++++++++Task%0AWHERE%0A++++++++Subject+%3D+%27Note%27+AND%0A++++++++What.Type+%3D+%27Inquiry__c%27+AND%0A++++++++What.RecordType.DeveloperName+%3D+%27Standard%27+AND%0A++++++++IsDeleted+%3D+false%0AORDER+BY%0A++++++++CreatedDate+DESC%0A&expr=%7BTitle%3A+%22Note+from+%22+%2B+record.CreatedBy.Name%2C+FirstPublishLocationId%3A+record.WhatId%2C+CreatedById%3A+record.CreatedById%2C+CreatedDate%3A+record.CreatedDate%2C+PathOnClient%3A+%22Note+from+%22+%2B+record.CreatedBy.Name+%2B+%22.snote%22%2C+VersionData%3A+base64%28escapeHtml%28escapeUnicode%28record.Description%29%29%29%2C+Migrated_From__c%3A+record.Id%7D&object=ContentVersion&jobType=3&inputType=1&externalId=Migrated_From__c)

Create new Notes from Tasks linked to specific SObject records by upserting `ContentVersion` records.

```
batchforce upsert --external-id Migrated_From__c -b 10000 ContentVersion \
--query-all "SELECT Id, Description, CreatedDate, WhatId, CreatedBy.Name, CreatedById FROM Task WHERE Subject = 'Note' and What.Type = 'Inquiry__c' and What.RecordType.DeveloperName = 'Standard' and IsDeleted = false ORDER BY CreatedDate DESC" \
'{Title: "Note from " + record.CreatedBy.Name, FirstPublishLocationId: record.WhatId, CreatedById: record.CreatedById, CreatedDate: record.CreatedDate, PathOnClient: "Note from " + record.CreatedBy.Name + ".snote", VersionData: base64(escapeHtml(escapeUnicode(record.Description))), Migrated_From__c: record.Id}'
```

### [Move Field Value From Most Recent Opportunity Up to Account](https://batchforce.octoberswimmer.com/run?query=SELECT%0A++++++++Id%2C%0A++++++++URL__c%2C%0A++++++++Account.URL__c%2C%0A++++++++AccountId%0AFROM%0A++++++++Opportunity%0AWHERE%0A++++++++URL__c+%21%3D+null+AND%0A++++++++Account.URL+%3D+null%0AORDER+BY%0A++++++++AccountId%2C%0A++++++++CreatedDate+DESC&expr=incr%28record.AccountId%29+%3E+1+%3F+nil+%3A+%7BId%3A+record.AccountId%2C+URL__c%3A+record.URL__c%7D&object=Account&jobType=1&inputType=1)

Get the value of a field from the most recent Opportunity for an Account and copy it up to the parent Account record.

```
$ batchforce update Account -q "SELECT Id, URL__c, Account.URL__c, AccountId FROM Opportunity WHERE URL__c != null AND Account.URL = null ORDER BY AccountId, CreatedDate desc" \
'incr(record.AccountId) > 1 ? nil : {Id: record.AccountId, URL__c: record.URL__c}'
```

### [Move Users to New Role](https://batchforce.octoberswimmer.com/run?context=Id+newRoleId+%3D+%5BSELECT+Id+FROM+UserRole+WHERE+DeveloperName+%3D+%27New_Role%27%5D.Id%3B&expr=%7BId%3A+record.Id%2C+UserRoleId%3A+apex.newRoleId%7D&inputType=1&jobType=1&object=User&query=SELECT+Id+FROM+User+WHERE+UserRole.DeveloperName+%3D+%27Old_Role%27&contextCollapsed=false)

Set the `--context` flag to anonymous apex to use org-specific data in your Expr expression, a Role Id in this example, through the `apex` variable.

```
$ batchforce update User --context "Id newRoleId = [SELECT Id FROM UserRole WHERE DeveloperName = 'New_Role'].Id;" \
  -q "SELECT Id FROM User WHERE UserRole.DeveloperName = 'Old_Role'" \
  '{Id: record.Id, UserRoleId: apex.newRoleId}'
```

### [Migrate Attachments to Files (ContentDocuments)](https://batchforce.octoberswimmer.com/run?expr=let+types+%3D+%7B%0A++%22application%2Fpdf%22+%3A+%22PDF%22%2C%0A++%22application%2Fmsword%22+%3A+%22DOC%22%2C%0A++%22application%2Fvnd.openxmlformats-officedocument.wordprocessingml.document%22+%3A+%22DOCX%22%2C%0A++%22application%2Fvnd.ms-excel%22+%3A+%22XLS%22%2C%0A++%22application%2Fvnd.openxmlformats-officedocument.spreadsheetml.sheet%22+%3A+%22XLSX%22%2C%0A++%22application%2Fvnd.ms-powerpoint%22+%3A+%22PPT%22%2C%0A++%22application%2Fvnd.openxmlformats-officedocument.presentationml.presentation%22+%3A+%22PPTX%22%2C%0A++%22text%2Fplain%22+%3A+%22TXT%22%2C%0A++%22text%2Fcsv%22+%3A+%22CSV%22%2C%0A++%22text%2Fhtml%22+%3A+%22HTML%22%2C%0A++%22application%2Fxml%22+%3A+%22XML%22%2C%0A++%22text%2Fxml%22+%3A+%22XML%22%2C%0A++%22application%2Fjson%22+%3A+%22JSON%22%2C%0A++%22image%2Fjpeg%22+%3A+%22JPG%22%2C%0A++%22image%2Fpng%22+%3A+%22PNG%22%2C%0A++%22image%2Fgif%22+%3A+%22GIF%22%2C%0A++%22image%2Ftiff%22+%3A+%22TIF%22%2C%0A++%22audio%2Fmpeg%22+%3A+%22MP3%22%2C%0A++%22video%2Fmp4%22+%3A+%22MP4%22%2C%0A++%22application%2Fzip%22+%3A+%22ZIP%22%0A%7D%3B%0A%7B%0A++Title%3A+record.Name%2C%0A++Description%3A+record.Description%2C%0A++FirstPublishLocationId%3A+record.ParentId%2C%0A++PathOnClient%3A+%22Attachment.%22+%2B+types%5Brecord.ContentType%5D+%3F%3F+%22unknown%22%2C%0A++VersionData%3A+base64%28fetch%28%22%2Fservices%2Fdata%2Fv64.0%2Fsobjects%2FAttachment%2F%22+%2B+record.Id+%2B+%22%2FBody%22%29%29%0A%7D&inputType=1&jobType=2&object=ContentVersion&query=SELECT+ContentType%2C+Description%2C+Name%2C+Id%2C+ParentId+FROM+Attachment+LIMIT+400000&context=&batchSize=10000)

_Note that there’s a limit on the number ContentVersion records that can be created per day. The maximum it can be increased to by opening a case with Salesforce is 500,000._

```
$ batchforce insert ContentVersion -q "SELECT ContentType, Description, Name, Id, ParentId FROM Attachment LIMIT 400000" 'let types = {
  "application/pdf" : "PDF",
  "application/msword" : "DOC",
  "application/vnd.openxmlformats-officedocument.wordprocessingml.document" : "DOCX",
  "application/vnd.ms-excel" : "XLS",
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" : "XLSX",
  "application/vnd.ms-powerpoint" : "PPT",
  "application/vnd.openxmlformats-officedocument.presentationml.presentation" : "PPTX",
  "text/plain" : "TXT",
  "text/csv" : "CSV",
  "text/html" : "HTML",
  "application/xml" : "XML",
  "text/xml" : "XML",
  "application/json" : "JSON",
  "image/jpeg" : "JPG",
  "image/png" : "PNG",
  "image/gif" : "GIF",
  "image/tiff" : "TIF",
  "audio/mpeg" : "MP3",
  "video/mp4" : "MP4",
  "application/zip" : "ZIP"
};
{
  Title: record.Name,
  Description: record.Description,
  FirstPublishLocationId: record.ParentId,
  PathOnClient: "Attachment." + types[record.ContentType] ?? "unknown",
  VersionData: base64(fetch("/services/data/v64.0/sobjects/Attachment/" + record.Id + "/Body"))
}'
```

### Store Formatted Time Values [Permalink for this section](/content/tools/batchforce/examples/#store-formatted-time-values/index.html)

Format `CreatedDate` in custom fields for Day of Week (e.g. “01-Mon”) and Hour Created using a user-agnostic Timezone.

```
$ batchforce update Lead -q "SELECT Id, CreatedDate, Division__r.Time_Zone__c FROM Lead WHERE Created_Day__c = null" \
 'let t = date(record.CreatedDate, "2006-01-02T15:04:05.000-0700").In(timezone(record.Division__r.Time_Zone__c));
  let day = "0" + string(int(t.Weekday()) + 1) + "-" + t.Format("Mon");
  {Id: record.Id, Created_Day__c: day, Created_Hour__c: t.Format("15")}'
```

### Populate Field From History [Permalink for this section](/content/tools/batchforce/examples/#populate-field-from-history/index.html)

Set a custom `Closed_By__c` field to the User who most recently updated the Stage of an Opportunity to “Closed Lost”.

```
$ batchforce update Opportunity \
  -q "SELECT Id, (SELECT CreatedById, NewValue FROM Histories WHERE Field = 'StageName' ORDER BY CreatedDate DESC) from Opportunity WHERE StageName = 'Closed Lost'" \
  'let history = record.Histories ?? []; let update = filter(history, #.NewValue == "Closed Lost") | first(); update == nil ? nil : {Id: record.Id, Closed_By__c: update.CreatedById}'
```
