From c979e35631032575ee1716180c3e744c29f06cc8 Mon Sep 17 00:00:00 2001 From: Steven Mortimer Date: Fri, 21 Aug 2020 21:49:48 -0400 Subject: [PATCH] Version bump, no need to wait for dplyr --- DESCRIPTION | 4 +- NEWS.md | 9 +- R/bulk-operation.R | 3 +- R/compatibility.R | 24 +- R/create-metadata.R | 3 +- R/create.R | 3 +- R/delete-metadata.R | 3 +- R/delete.R | 3 +- R/query.R | 3 +- R/update-metadata.R | 3 +- R/update.R | 3 +- R/upsert-metadata.R | 3 +- R/upsert.R | 3 +- R/utils-query.R | 2 +- README.Rmd | 21 +- README.md | 45 ++- docs/404.html | 2 +- docs/CODE_OF_CONDUCT.html | 2 +- docs/CONTRIBUTING.html | 2 +- docs/LICENSE-text.html | 2 +- docs/LICENSE.html | 2 +- docs/SECURITY.html | 2 +- docs/SUPPORT.html | 2 +- docs/articles/getting-started.html | 47 +-- .../empty-anchor.js | 15 - .../header-attrs-2.3/header-attrs.js | 12 + docs/articles/index.html | 2 +- docs/articles/passing-control-args.html | 50 +-- .../empty-anchor.js | 15 - .../header-attrs-2.3/header-attrs.js | 12 + docs/articles/supported-queries.html | 96 ++--- .../empty-anchor.js | 15 - .../figure-html/run-performance-test-1.png | Bin 64458 -> 47927 bytes .../header-attrs-2.3/header-attrs.js | 12 + .../transitioning-from-RForcecom.html | 80 ++-- .../empty-anchor.js | 15 - .../header-attrs-2.3/header-attrs.js | 12 + docs/articles/working-with-attachments.html | 122 ++++--- .../empty-anchor.js | 15 - .../header-attrs-2.3/header-attrs.js | 12 + docs/articles/working-with-bulk-apis.html | 57 +-- .../empty-anchor.js | 15 - .../figure-html/unnamed-chunk-7-1.png | Bin 62746 -> 62163 bytes .../header-attrs-2.3/header-attrs.js | 12 + docs/articles/working-with-metadata.html | 14 +- .../empty-anchor.js | 15 - .../header-attrs-2.3/header-attrs.js | 12 + docs/articles/working-with-reports.html | 24 +- .../empty-anchor.js | 15 - .../header-attrs-2.3/header-attrs.js | 12 + docs/authors.html | 2 +- docs/index.html | 63 ++-- docs/news/index.html | 32 +- docs/pkgdown.yml | 4 +- docs/reference/VERB_n.html | 4 +- docs/reference/accepted_controls_by_api.html | 4 +- .../accepted_controls_by_operation.html | 10 +- docs/reference/bind_query_resultsets.html | 4 +- .../build_manifest_xml_from_list.html | 4 +- .../build_metadata_xml_from_list.html | 4 +- docs/reference/build_proxy.html | 4 +- docs/reference/build_soap_xml_from_list.html | 4 +- docs/reference/catch_errors.html | 4 +- docs/reference/catch_unknown_api.html | 4 +- docs/reference/check_and_encode_files.html | 11 +- .../collapse_list_with_dupe_names.html | 4 +- .../combine_parent_and_child_resultsets.html | 4 +- docs/reference/compact2.html | 4 +- docs/reference/drop_attributes.html | 4 +- .../drop_attributes_recursively.html | 4 +- docs/reference/drop_empty_recursively.html | 4 +- docs/reference/drop_nested_child_records.html | 4 +- .../extract_nested_child_records.html | 4 +- .../extract_records_from_xml_node.html | 4 +- .../extract_records_from_xml_nodeset.html | 4 +- ...t_records_from_xml_nodeset_of_records.html | 4 +- docs/reference/filter_valid_controls.html | 4 +- docs/reference/flatten_tbl_df.html | 4 +- .../reference/format_headers_for_verbose.html | 4 +- docs/reference/format_report_row.html | 4 +- docs/reference/get_os.html | 4 +- .../guess_object_name_from_soql.html | 4 +- docs/reference/index.html | 61 +++- docs/reference/is_legit_token.html | 4 +- .../list_extract_parent_and_child_result.html | 4 +- ...analytics_folder_child_operations_url.html | 4 +- ...make_analytics_folder_collections_url.html | 4 +- .../make_analytics_folder_operations_url.html | 4 +- ...make_analytics_folder_share_by_id_url.html | 4 +- ...analytics_folder_share_recipients_url.html | 4 +- .../make_analytics_folder_shares_url.html | 4 +- ...analytics_notification_operations_url.html | 4 +- ...ke_analytics_notifications_limits_url.html | 4 +- ...make_analytics_notifications_list_url.html | 4 +- docs/reference/make_base_metadata_url.html | 4 +- docs/reference/make_base_rest_url.html | 4 +- docs/reference/make_base_soap_url.html | 4 +- .../make_bulk_batch_details_url.html | 4 +- .../reference/make_bulk_batch_status_url.html | 4 +- docs/reference/make_bulk_batches_url.html | 4 +- docs/reference/make_bulk_create_job_url.html | 4 +- docs/reference/make_bulk_delete_job_url.html | 4 +- .../make_bulk_end_job_generic_url.html | 4 +- .../reference/make_bulk_get_all_jobs_url.html | 4 +- .../make_bulk_get_all_query_jobs_url.html | 4 +- docs/reference/make_bulk_get_job_url.html | 4 +- docs/reference/make_bulk_job_records_url.html | 4 +- .../reference/make_bulk_query_result_url.html | 4 +- docs/reference/make_bulk_query_url.html | 4 +- docs/reference/make_chatter_users_url.html | 4 +- docs/reference/make_composite_batch_url.html | 4 +- docs/reference/make_composite_url.html | 4 +- docs/reference/make_dashboard_copy_url.html | 4 +- .../make_dashboard_describe_url.html | 4 +- ...e_dashboard_filter_operators_list_url.html | 4 +- ...dashboard_filter_options_analysis_url.html | 4 +- docs/reference/make_dashboard_status_url.html | 4 +- docs/reference/make_dashboard_url.html | 4 +- docs/reference/make_dashboards_list_url.html | 4 +- docs/reference/make_login_url.html | 4 +- .../make_parameterized_search_url.html | 4 +- docs/reference/make_query_url.html | 4 +- docs/reference/make_report_copy_url.html | 4 +- docs/reference/make_report_create_url.html | 4 +- docs/reference/make_report_describe_url.html | 4 +- docs/reference/make_report_execute_url.html | 4 +- docs/reference/make_report_fields_url.html | 4 +- ...make_report_filter_operators_list_url.html | 4 +- docs/reference/make_report_instance_url.html | 4 +- .../make_report_instances_list_url.html | 4 +- docs/reference/make_report_query_url.html | 4 +- .../make_report_type_describe_url.html | 4 +- .../reference/make_report_types_list_url.html | 4 +- docs/reference/make_report_url.html | 4 +- docs/reference/make_reports_list_url.html | 4 +- docs/reference/make_rest_describe_url.html | 4 +- docs/reference/make_rest_objects_url.html | 4 +- docs/reference/make_rest_record_url.html | 242 ++++++++++++ docs/reference/make_search_url.html | 4 +- docs/reference/make_soap_xml_skeleton.html | 4 +- docs/reference/make_verbose_httr_message.html | 4 +- docs/reference/map_sf_type_to_r_type.html | 4 +- docs/reference/merge_null_to_na.html | 4 +- docs/reference/message_w_errors_listed.html | 4 +- docs/reference/metadata_type_validator.html | 4 +- .../parameterized_search_control.html | 21 +- .../parse_error_code_and_message.html | 242 ++++++++++++ docs/reference/parse_report_detail_rows.html | 4 +- docs/reference/patched_tempdir.html | 257 +++++++++++++ docs/reference/rDELETE.html | 4 +- docs/reference/rGET.html | 4 +- docs/reference/rPATCH.html | 4 +- docs/reference/rPOST.html | 4 +- docs/reference/rPUT.html | 4 +- docs/reference/records_list_to_tbl.html | 4 +- .../remove_empty_linked_object_cols.html | 4 +- docs/reference/return_matching_controls.html | 4 +- docs/reference/rforcecom.bulkAction.html | 4 +- docs/reference/rforcecom.bulkQuery.html | 4 +- docs/reference/rforcecom.create.html | 4 +- docs/reference/rforcecom.delete.html | 4 +- .../rforcecom.getObjectDescription.html | 4 +- .../rforcecom.getServerTimestamp.html | 4 +- docs/reference/rforcecom.login.html | 4 +- docs/reference/rforcecom.query.html | 4 +- docs/reference/rforcecom.retrieve.html | 4 +- docs/reference/rforcecom.search.html | 4 +- docs/reference/rforcecom.update.html | 4 +- docs/reference/rforcecom.upsert.html | 4 +- docs/reference/salesforcer-package.html | 4 +- docs/reference/salesforcer_state.html | 4 +- docs/reference/session_id_available.html | 4 +- docs/reference/set_null_elements_to_na.html | 4 +- .../set_null_elements_to_na_recursively.html | 4 +- docs/reference/sf_abort_job_bulk.html | 4 +- docs/reference/sf_access_token.html | 4 +- .../sf_analytics_notification_create.html | 4 +- .../sf_analytics_notification_delete.html | 4 +- .../sf_analytics_notification_describe.html | 4 +- .../sf_analytics_notification_update.html | 4 +- .../sf_analytics_notifications_limits.html | 4 +- .../sf_analytics_notifications_list.html | 4 +- docs/reference/sf_auth.html | 4 +- docs/reference/sf_auth_check.html | 4 +- docs/reference/sf_auth_refresh.html | 4 +- docs/reference/sf_batch_details_bulk.html | 4 +- docs/reference/sf_batch_status_bulk.html | 4 +- docs/reference/sf_build_cols_spec.html | 4 +- docs/reference/sf_close_job_bulk.html | 4 +- docs/reference/sf_control.html | 4 +- docs/reference/sf_convert_lead.html | 4 +- docs/reference/sf_copy_report.html | 26 +- docs/reference/sf_create.html | 8 +- docs/reference/sf_create_attachment.html | 47 ++- .../sf_create_attachment_bulk_v1.html | 8 +- docs/reference/sf_create_attachment_rest.html | 8 +- docs/reference/sf_create_attachment_soap.html | 8 +- docs/reference/sf_create_batches_bulk.html | 4 +- docs/reference/sf_create_bulk_v1.html | 4 +- docs/reference/sf_create_bulk_v2.html | 4 +- docs/reference/sf_create_job_bulk.html | 4 +- docs/reference/sf_create_job_bulk_v1.html | 4 +- docs/reference/sf_create_job_bulk_v2.html | 4 +- docs/reference/sf_create_metadata.html | 4 +- docs/reference/sf_create_report.html | 26 +- docs/reference/sf_create_rest.html | 4 +- docs/reference/sf_create_soap.html | 4 +- .../sf_dashboard_components_describe.html | 4 +- docs/reference/sf_dashboard_copy.html | 4 +- docs/reference/sf_dashboard_delete.html | 4 +- docs/reference/sf_dashboard_describe.html | 4 +- .../sf_dashboard_filter_operators_list.html | 4 +- .../sf_dashboard_filter_options_analysis.html | 4 +- docs/reference/sf_dashboard_refresh.html | 4 +- docs/reference/sf_dashboard_results.html | 4 +- .../sf_dashboard_set_sticky_filter.html | 4 +- docs/reference/sf_dashboard_status.html | 4 +- docs/reference/sf_dashboard_update.html | 4 +- docs/reference/sf_dashboards_list.html | 4 +- docs/reference/sf_delete.html | 8 +- docs/reference/sf_delete_attachment.html | 316 ++++++++++++++++ docs/reference/sf_delete_bulk_v1.html | 4 +- docs/reference/sf_delete_bulk_v2.html | 4 +- docs/reference/sf_delete_job_bulk.html | 4 +- docs/reference/sf_delete_metadata.html | 4 +- docs/reference/sf_delete_report.html | 26 +- docs/reference/sf_delete_report_instance.html | 16 +- docs/reference/sf_delete_rest.html | 4 +- docs/reference/sf_delete_soap.html | 4 +- docs/reference/sf_describe_metadata.html | 4 +- docs/reference/sf_describe_object_fields.html | 4 +- docs/reference/sf_describe_objects.html | 4 +- docs/reference/sf_describe_report.html | 27 +- docs/reference/sf_describe_report_type.html | 26 +- docs/reference/sf_download_attachment.html | 66 +++- docs/reference/sf_empty_recycle_bin.html | 4 +- docs/reference/sf_end_job_bulk.html | 4 +- docs/reference/sf_execute_report.html | 33 +- docs/reference/sf_find_duplicates.html | 4 +- docs/reference/sf_find_duplicates_by_id.html | 4 +- docs/reference/sf_format_date.html | 4 +- docs/reference/sf_format_datetime.html | 4 +- docs/reference/sf_format_time.data.frame.html | 4 +- docs/reference/sf_format_time.list.html | 4 +- docs/reference/sf_get_all_jobs_bulk.html | 4 +- .../reference/sf_get_all_query_jobs_bulk.html | 4 +- docs/reference/sf_get_dashboard_data.html | 4 +- docs/reference/sf_get_deleted.html | 4 +- docs/reference/sf_get_job_bulk.html | 4 +- docs/reference/sf_get_job_records_bulk.html | 4 +- .../sf_get_report_instance_results.html | 18 +- docs/reference/sf_get_updated.html | 4 +- docs/reference/sf_guess_cols.html | 4 +- docs/reference/sf_input_data_validation.html | 4 +- docs/reference/sf_job_batches_bulk.html | 4 +- docs/reference/sf_list_api_limits.html | 4 +- docs/reference/sf_list_metadata.html | 4 +- docs/reference/sf_list_objects.html | 4 +- docs/reference/sf_list_report_fields.html | 26 +- .../sf_list_report_filter_operators.html | 27 +- docs/reference/sf_list_report_instances.html | 17 +- docs/reference/sf_list_report_types.html | 26 +- docs/reference/sf_list_reports.html | 59 ++- docs/reference/sf_list_resources.html | 4 +- docs/reference/sf_list_rest_api_versions.html | 4 +- docs/reference/sf_merge.html | 4 +- docs/reference/sf_query.html | 4 +- docs/reference/sf_query_bulk_v1.html | 4 +- docs/reference/sf_query_bulk_v2.html | 4 +- docs/reference/sf_query_report.html | 27 +- docs/reference/sf_query_result_bulk.html | 4 +- docs/reference/sf_query_result_bulk_v1.html | 4 +- docs/reference/sf_query_result_bulk_v2.html | 4 +- docs/reference/sf_read_metadata.html | 4 +- docs/reference/sf_rename_metadata.html | 4 +- docs/reference/sf_reorder_cols.html | 4 +- docs/reference/sf_report_folder_children.html | 4 +- docs/reference/sf_report_folder_create.html | 4 +- docs/reference/sf_report_folder_delete.html | 4 +- docs/reference/sf_report_folder_describe.html | 4 +- .../sf_report_folder_share_delete.html | 4 +- .../sf_report_folder_share_describe.html | 4 +- .../sf_report_folder_share_recipients.html | 4 +- .../sf_report_folder_share_update.html | 4 +- .../sf_report_folder_shares_add.html | 4 +- .../sf_report_folder_shares_list.html | 4 +- .../sf_report_folder_shares_update.html | 4 +- docs/reference/sf_report_folder_update.html | 4 +- docs/reference/sf_report_folders_list.html | 4 +- docs/reference/sf_reset_password.html | 4 +- docs/reference/sf_rest_list.html | 4 +- docs/reference/sf_retrieve.html | 8 +- docs/reference/sf_retrieve_metadata.html | 4 +- .../sf_retrieve_metadata_check_status.html | 4 +- docs/reference/sf_retrieve_rest.html | 4 +- docs/reference/sf_retrieve_soap.html | 4 +- docs/reference/sf_run_bulk_operation.html | 4 +- docs/reference/sf_run_bulk_query.html | 4 +- docs/reference/sf_run_report.html | 33 +- docs/reference/sf_search.html | 4 +- docs/reference/sf_server_timestamp.html | 4 +- docs/reference/sf_session_id.html | 4 +- docs/reference/sf_set_password.html | 4 +- docs/reference/sf_submit_query_bulk.html | 4 +- docs/reference/sf_undelete.html | 4 +- docs/reference/sf_update.html | 8 +- docs/reference/sf_update_attachment.html | 344 ++++++++++++++++++ .../sf_update_attachment_bulk_v1.html | 249 +++++++++++++ docs/reference/sf_update_attachment_rest.html | 248 +++++++++++++ docs/reference/sf_update_attachment_soap.html | 248 +++++++++++++ docs/reference/sf_update_bulk_v1.html | 4 +- docs/reference/sf_update_bulk_v2.html | 4 +- docs/reference/sf_update_metadata.html | 4 +- docs/reference/sf_update_report.html | 26 +- docs/reference/sf_update_rest.html | 4 +- docs/reference/sf_update_soap.html | 4 +- docs/reference/sf_upload_complete_bulk.html | 4 +- docs/reference/sf_upsert.html | 8 +- docs/reference/sf_upsert_bulk_v1.html | 4 +- docs/reference/sf_upsert_bulk_v2.html | 4 +- docs/reference/sf_upsert_metadata.html | 4 +- docs/reference/sf_upsert_rest.html | 4 +- docs/reference/sf_upsert_soap.html | 4 +- docs/reference/sf_user_info.html | 4 +- docs/reference/sf_write_csv.html | 4 +- docs/reference/simplify_report_metadata.html | 4 +- docs/reference/stop_w_errors_listed.html | 4 +- docs/reference/token_available.html | 4 +- docs/reference/unbox_list_elements.html | 261 +++++++++++++ .../unbox_list_elements_recursively.html | 261 +++++++++++++ docs/reference/unnest_col.html | 4 +- docs/reference/valid_metadata_list.html | 4 +- .../validate_get_all_jobs_params.html | 4 +- docs/reference/warn_w_errors_listed.html | 4 +- docs/reference/xmlToList2.html | 4 +- docs/reference/xml_drop_and_unlist.html | 4 +- .../xml_drop_and_unlist_recursively.html | 4 +- .../xml_extract_parent_and_child_result.html | 4 +- docs/reference/xml_nodeset_to_df.html | 4 +- docs/sitemap.xml | 30 ++ index.Rmd | 19 +- index.md | 45 ++- vignettes/transitioning-from-RForcecom.Rmd | 2 +- 343 files changed, 4319 insertions(+), 1102 deletions(-) delete mode 100644 docs/articles/getting-started_files/accessible-code-block-0.0.1/empty-anchor.js create mode 100644 docs/articles/getting-started_files/header-attrs-2.3/header-attrs.js delete mode 100644 docs/articles/passing-control-args_files/accessible-code-block-0.0.1/empty-anchor.js create mode 100644 docs/articles/passing-control-args_files/header-attrs-2.3/header-attrs.js delete mode 100644 docs/articles/supported-queries_files/accessible-code-block-0.0.1/empty-anchor.js create mode 100644 docs/articles/supported-queries_files/header-attrs-2.3/header-attrs.js delete mode 100644 docs/articles/transitioning-from-RForcecom_files/accessible-code-block-0.0.1/empty-anchor.js create mode 100644 docs/articles/transitioning-from-RForcecom_files/header-attrs-2.3/header-attrs.js delete mode 100644 docs/articles/working-with-attachments_files/accessible-code-block-0.0.1/empty-anchor.js create mode 100644 docs/articles/working-with-attachments_files/header-attrs-2.3/header-attrs.js delete mode 100644 docs/articles/working-with-bulk-apis_files/accessible-code-block-0.0.1/empty-anchor.js create mode 100644 docs/articles/working-with-bulk-apis_files/header-attrs-2.3/header-attrs.js delete mode 100644 docs/articles/working-with-metadata_files/accessible-code-block-0.0.1/empty-anchor.js create mode 100644 docs/articles/working-with-metadata_files/header-attrs-2.3/header-attrs.js delete mode 100644 docs/articles/working-with-reports_files/accessible-code-block-0.0.1/empty-anchor.js create mode 100644 docs/articles/working-with-reports_files/header-attrs-2.3/header-attrs.js create mode 100644 docs/reference/make_rest_record_url.html create mode 100644 docs/reference/parse_error_code_and_message.html create mode 100644 docs/reference/patched_tempdir.html create mode 100644 docs/reference/sf_delete_attachment.html create mode 100644 docs/reference/sf_update_attachment.html create mode 100644 docs/reference/sf_update_attachment_bulk_v1.html create mode 100644 docs/reference/sf_update_attachment_rest.html create mode 100644 docs/reference/sf_update_attachment_soap.html create mode 100644 docs/reference/unbox_list_elements.html create mode 100644 docs/reference/unbox_list_elements_recursively.html diff --git a/DESCRIPTION b/DESCRIPTION index 83672c03..3b6ff7ef 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: salesforcer Title: An Implementation of 'Salesforce' APIs Using Tidy Principles -Version: 0.2.0.9000 -Date: 2020-08-17 +Version: 0.2.1 +Date: 2020-08-21 Description: Functions connecting to the 'Salesforce' Platform APIs (REST, SOAP, Bulk 1.0, Bulk 2.0, Metadata, Reports and Dashboards) . diff --git a/NEWS.md b/NEWS.md index 3504e9ab..8ad069d0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,11 +1,16 @@ -## salesforcer 0.2.0.9000 +## salesforcer 0.2.1 ### Dependencies * **CAUTION: This release requires {dplyr 1.0.0} because {dplyr 1.0.1} introduced a bug in `bind_rows()` with how it binds lists where the list elements have differing lengths. This is documented in tidyverse/dplyr#5417 and r-lib/vctrs#1073. The - timeline for a fix is unknown as of Aug 16, 2020.** + timeline for a fix is unknown as of Aug 16, 2020.** You can install the older + version of {dplyr} using the following command: + + ```r + remotes::install_version("dplyr", "1.0.0") + ``` ### Features diff --git a/R/bulk-operation.R b/R/bulk-operation.R index 251139a5..20605c0b 100644 --- a/R/bulk-operation.R +++ b/R/bulk-operation.R @@ -72,7 +72,8 @@ sf_create_job_bulk <- function(operation = c("insert", "delete", "upsert", "upda control_args$operation <- operation if(is_present(line_ending)) { - deprecate_warn("0.1.3", "sf_create_job_bulk(line_ending = )", "sf_create_job_bulk(LineEndingHeader = )", + deprecate_warn("0.1.3", "salesforcer::sf_create_job_bulk(line_ending = )", + "sf_create_job_bulk(LineEndingHeader = )", details = paste0("You can pass the line ending directly ", "as shown above or via the `control` argument.")) control_args$LineEndingHeader <- list(`Sforce-Line-Ending` = line_ending) diff --git a/R/compatibility.R b/R/compatibility.R index bf239130..4f81c515 100644 --- a/R/compatibility.R +++ b/R/compatibility.R @@ -37,7 +37,7 @@ #' @export rforcecom.login <- function(username, password, loginURL="https://login.salesforce.com/", apiVersion="35.0"){ - deprecate_soft("0.1.0", "rforcecom.login()", "sf_auth()") + deprecate_soft("0.1.0", "salesforcer::rforcecom.login()", "sf_auth()") if(!is.null(loginURL)){ options(salesforcer.login_url = loginURL) @@ -70,7 +70,7 @@ rforcecom.login <- function(username, password, loginURL="https://login.salesfor #' @export rforcecom.getServerTimestamp <- function(session){ - deprecate_soft("0.1.0", "rforcecom.getServerTimestamp()", "sf_server_timestamp()") + deprecate_soft("0.1.0", "salesforcer::rforcecom.getServerTimestamp()", "sf_server_timestamp()") result <- sf_server_timestamp() # format like rforcecom.getServerTimestamp() @@ -92,7 +92,7 @@ rforcecom.getServerTimestamp <- function(session){ #' @export rforcecom.getObjectDescription <- function(session, objectName){ - deprecate_soft("0.1.0", "rforcecom.getObjectDescription()", "sf_describe_objects()") + deprecate_soft("0.1.0", "salesforcer::rforcecom.getObjectDescription()", "sf_describe_objects()") obj_dat <- sf_describe_objects(object_names = objectName, api_type="SOAP")[[1]] @@ -117,7 +117,7 @@ rforcecom.getObjectDescription <- function(session, objectName){ #' @export rforcecom.create <- function(session, objectName, fields){ - deprecate_soft("0.1.0", "rforcecom.create()", "sf_create()") + deprecate_soft("0.1.0", "salesforcer::rforcecom.create()", "sf_create()") fields <- as.data.frame(as.list(fields), stringsAsFactors = FALSE) created_records <- sf_create(input_data = fields, object_name = objectName) @@ -155,7 +155,7 @@ rforcecom.retrieve <- function(session, objectName, offset=NULL, order=NULL, inverse=NULL, nullsLast=NULL){ - deprecate_soft("0.1.0", "rforcecom.retrieve()", "sf_retrieve()") + deprecate_soft("0.1.0", "salesforcer::rforcecom.retrieve()", "sf_retrieve()") # Make SOQL fieldList <- paste(fields, collapse=", ") @@ -208,7 +208,7 @@ rforcecom.retrieve <- function(session, objectName, #' @export rforcecom.update <- function(session, objectName, id, fields){ - deprecate_soft("0.1.0", "rforcecom.update()", "sf_update()") + deprecate_soft("0.1.0", "salesforcer::rforcecom.update()", "sf_update()") fields <- as.data.frame(as.list(fields), stringsAsFactors = FALSE) fields$id <- id @@ -230,7 +230,7 @@ rforcecom.update <- function(session, objectName, id, fields){ #' @export rforcecom.delete <- function(session, objectName, id){ - deprecate_soft("0.1.0", "rforcecom.delete()", "sf_delete()") + deprecate_soft("0.1.0", "salesforcer::rforcecom.delete()", "sf_delete()") invisible(sf_delete(id, object_name = objectName)) # rforcecom.delete returns NULL if successful?? @@ -254,7 +254,7 @@ rforcecom.upsert <- function(session, objectName, externalIdField, externalId, fields){ - deprecate_soft("0.1.0", "rforcecom.upsert()", "sf_upsert()") + deprecate_soft("0.1.0", "salesforcer::rforcecom.upsert()", "sf_upsert()") fields[externalIdField] <- externalId fields <- as.data.frame(as.list(fields), stringsAsFactors = FALSE) @@ -276,7 +276,7 @@ rforcecom.upsert <- function(session, objectName, #' @export rforcecom.search <- function(session, queryString){ - deprecate_soft("0.1.0", "rforcecom.search()", "sf_search()") + deprecate_soft("0.1.0", "salesforcer::rforcecom.search()", "sf_search()") queryString <- paste0("FIND {", queryString, "}", sep="") resultset <- sf_search(search_string = queryString, is_sosl=TRUE) @@ -297,7 +297,7 @@ rforcecom.search <- function(session, queryString){ #' @export rforcecom.query <- function(session, soqlQuery, queryAll=FALSE){ - deprecate_soft("0.1.0", "rforcecom.query()", "sf_query()") + deprecate_soft("0.1.0", "salesforcer::rforcecom.query()", "sf_query()") sf_query(soql=soqlQuery, queryall=queryAll) } @@ -324,7 +324,7 @@ rforcecom.bulkQuery <- function(session, max_attempts=100, verbose=FALSE){ - deprecate_soft("0.1.0", "rforcecom.bulkQuery()", "sf_query()") + deprecate_soft("0.1.0", "salesforcer::rforcecom.bulkQuery()", "sf_query()") sf_query(soql = soqlQuery, object_name = object, @@ -375,7 +375,7 @@ rforcecom.bulkAction <- function(session, max_attempts=100, verbose=FALSE){ - deprecate_soft("0.1.0", "rforcecom.bulkAction()", "sf_bulk_operation()") + deprecate_soft("0.1.0", "salesforcer::rforcecom.bulkAction()", "sf_bulk_operation()") operation <- match.arg(operation) res <- sf_bulk_operation(input_data = data, diff --git a/R/create-metadata.R b/R/create-metadata.R index 6a85d157..614e1528 100644 --- a/R/create-metadata.R +++ b/R/create-metadata.R @@ -90,8 +90,7 @@ sf_create_metadata <- function(metadata_type, control_args$operation <- "insert" if(is_present(all_or_none)) { - deprecate_warn("0.1.3", - "sf_create_metadata(all_or_none = )", + deprecate_warn("0.1.3", "salesforcer::sf_create_metadata(all_or_none = )", "sf_create_metadata(AllOrNoneHeader = )", details = paste0("You can pass the all or none header directly ", "as shown above or via the `control` argument.")) diff --git a/R/create.R b/R/create.R index 06a6b89e..49c8fcf7 100644 --- a/R/create.R +++ b/R/create.R @@ -52,7 +52,8 @@ sf_create <- function(input_data, control_args$operation <- "insert" if(is_present(all_or_none)) { - deprecate_warn("0.1.3", "sf_create(all_or_none = )", "sf_create(AllOrNoneHeader = )", + deprecate_warn("0.1.3", "salesforcer::sf_create(all_or_none = )", + "sf_create(AllOrNoneHeader = )", details = paste0("You can pass the all or none header directly ", "as shown above or via the `control` argument.")) control_args$AllOrNoneHeader <- list(allOrNone = tolower(all_or_none)) diff --git a/R/delete-metadata.R b/R/delete-metadata.R index 96f1e219..99614779 100644 --- a/R/delete-metadata.R +++ b/R/delete-metadata.R @@ -42,8 +42,7 @@ sf_delete_metadata <- function(metadata_type, control_args$operation <- "delete" if(is_present(all_or_none)) { - deprecate_warn("0.1.3", - "sf_delete_metadata(all_or_none = )", + deprecate_warn("0.1.3", "salesforcer::sf_delete_metadata(all_or_none = )", "sf_delete_metadata(AllOrNoneHeader = )", details = paste0("You can pass the all or none header directly ", "as shown above or via the `control` argument.")) diff --git a/R/delete.R b/R/delete.R index 7850dd8f..50343f29 100644 --- a/R/delete.R +++ b/R/delete.R @@ -53,7 +53,8 @@ sf_delete <- function(ids, control_args$operation <- "delete" if(is_present(all_or_none)) { - deprecate_warn("0.1.3", "sf_delete(all_or_none = )", "sf_delete(AllOrNoneHeader = )", + deprecate_warn("0.1.3", "salesforcer::sf_delete(all_or_none = )", + "sf_delete(AllOrNoneHeader = )", details = paste0("You can pass the all or none header directly ", "as shown above or via the `control` argument.")) control_args$AllOrNoneHeader <- list(allOrNone = tolower(all_or_none)) diff --git a/R/query.R b/R/query.R index 85ae5773..1fcd684b 100644 --- a/R/query.R +++ b/R/query.R @@ -61,7 +61,8 @@ sf_query <- function(soql, control_args$operation <- if(queryall) "queryall" else "query" if(is_present(page_size)) { - deprecate_warn("0.1.3", "sf_query(page_size = )", "sf_query(QueryOptions = )", + deprecate_warn("0.1.3", "salesforcer::sf_query(page_size = )", + "sf_query(QueryOptions = )", details = paste0("You can pass the page/batch size directly ", "as shown above or via the `control` argument.")) control_args$QueryOptions <- list(batchSize = as.integer(page_size)) diff --git a/R/update-metadata.R b/R/update-metadata.R index 4b65d391..68c73959 100644 --- a/R/update-metadata.R +++ b/R/update-metadata.R @@ -65,8 +65,7 @@ sf_update_metadata <- function(metadata_type, control_args$operation <- "update" if(is_present(all_or_none)) { - deprecate_warn("0.1.3", - "sf_update_metadata(all_or_none = )", + deprecate_warn("0.1.3", "salesforcer::sf_update_metadata(all_or_none = )", "sf_update_metadata(AllOrNoneHeader = )", details = paste0("You can pass the all or none header directly ", "as shown above or via the `control` argument.")) diff --git a/R/update.R b/R/update.R index 1689140d..bfd15122 100644 --- a/R/update.R +++ b/R/update.R @@ -49,7 +49,8 @@ sf_update <- function(input_data, control_args$operation <- "update" if(is_present(all_or_none)) { - deprecate_warn("0.1.3", "sf_update(all_or_none = )", "sf_update(AllOrNoneHeader = )", + deprecate_warn("0.1.3", "salesforcer::sf_update(all_or_none = )", + "sf_update(AllOrNoneHeader = )", details = paste0("You can pass the all or none header directly ", "as shown above or via the `control` argument.")) control_args$AllOrNoneHeader <- list(allOrNone = tolower(all_or_none)) diff --git a/R/upsert-metadata.R b/R/upsert-metadata.R index a45b5058..c971672a 100644 --- a/R/upsert-metadata.R +++ b/R/upsert-metadata.R @@ -68,8 +68,7 @@ sf_upsert_metadata <- function(metadata_type, control_args$operation <- "upsert" if(is_present(all_or_none)) { - deprecate_warn("0.1.3", - "sf_upsert_metadata(all_or_none = )", + deprecate_warn("0.1.3", "salesforcer::sf_upsert_metadata(all_or_none = )", "sf_upsert_metadata(AllOrNoneHeader = )", details = paste0("You can pass the all or none header directly ", "as shown above or via the `control` argument.")) diff --git a/R/upsert.R b/R/upsert.R index 3b93afe4..5c4d9374 100644 --- a/R/upsert.R +++ b/R/upsert.R @@ -55,7 +55,8 @@ sf_upsert <- function(input_data, control_args$operation <- "upsert" if(is_present(all_or_none)) { - deprecate_warn("0.1.3", "sf_upsert(all_or_none = )", "sf_upsert(AllOrNoneHeader = )", + deprecate_warn("0.1.3", "salesforcer::sf_upsert(all_or_none = )", + "sf_upsert(AllOrNoneHeader = )", details = paste0("You can pass the all or none header directly ", "as shown above or via the `control` argument.")) control_args$AllOrNoneHeader <- list(allOrNone = tolower(all_or_none)) diff --git a/R/utils-query.R b/R/utils-query.R index 86130f66..7fabe51f 100644 --- a/R/utils-query.R +++ b/R/utils-query.R @@ -672,7 +672,7 @@ records_list_to_tbl <- function(x, bind_query_resultsets <- function(resultset, next_records){ # HOLD ON INTRODUCING THIS BECAUSE IT CREATES A {{data.table}} DEPENDENCY - # deprecate_warn("0.2.1", "bind_query_resultsets()", "safe_bind_rows()", + # deprecate_warn("0.2.1", "salesforcer::bind_query_resultsets()", "safe_bind_rows()", # details = paste0("Consider safe_bind_rows() which silently combines ", # "all columns regardless if there are mixed datatypes ", # "in a single column.")) diff --git a/README.Rmd b/README.Rmd index 6d48f8de..4db4b6aa 100644 --- a/README.Rmd +++ b/README.Rmd @@ -20,7 +20,7 @@ options(tibble.print_min = 5L, tibble.print_max = 5L) [![CRAN Status](https://www.r-pkg.org/badges/version/salesforcer)](https://cran.r-project.org/package=salesforcer) [![Lifecycle: Maturing](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://www.tidyverse.org/lifecycle/#maturing) [![Monthly Downloads](https://cranlogs.r-pkg.org/badges/last-month/salesforcer)](https://cran.r-project.org/package=salesforcer) -[![Coverage Status](https://codecov.io/gh/StevenMMortimer/salesforcer/branch/master/graph/badge.svg)](https://codecov.io/gh/StevenMMortimer/salesforcer?branch=master) +[![Coverage Status](https://codecov.io/gh/StevenMMortimer/salesforcer/branch/main/graph/badge.svg)](https://codecov.io/gh/StevenMMortimer/salesforcer?branch=main) {salesforcer} is an R package that connects to Salesforce Platform APIs using @@ -50,7 +50,22 @@ Package features include: and list ids of records deleted (`sf_get_deleted()`) or updated (`sf_get_updated()`) within a specific timeframe * Passing API call control parameters such as, "All or None", "Duplicate Rule", - "Assignment Rule" execution and many more! + "Assignment Rule" execution and many more! + +**CAUTION: The most recent release, {salesforcer 0.2.1}, requires {dplyr 1.0.0} +because {dplyr 1.0.1} introduced a bug in `bind_rows()` with how it binds +lists where the list elements have differing lengths. This is documented in +tidyverse/dplyr#5417 and r-lib/vctrs#1073. The timeline for a fix is unknown as +of August 2020, but a new version of {salesforcer} (0.2.2) will be released +immediately following the {dplyr} fix.** + +You can install the older version of {dplyr} using the following command: + +```r +# remove.packages("dplyr") +# install.packages("remotes") +remotes::install_version("dplyr", "1.0.0") +``` ## Table of Contents * [Installation](#installation) @@ -69,7 +84,7 @@ Package features include: ## Installation ```{r, eval = FALSE} -# install the current CRAN version (0.2.0) +# install the current CRAN version (0.2.1) install.packages("salesforcer") # or get the development version on GitHub diff --git a/README.md b/README.md index e7315dd9..37682567 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Maturing](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://www [![Monthly Downloads](https://cranlogs.r-pkg.org/badges/last-month/salesforcer)](https://cran.r-project.org/package=salesforcer) [![Coverage -Status](https://codecov.io/gh/StevenMMortimer/salesforcer/branch/master/graph/badge.svg)](https://codecov.io/gh/StevenMMortimer/salesforcer?branch=master) +Status](https://codecov.io/gh/StevenMMortimer/salesforcer/branch/main/graph/badge.svg)](https://codecov.io/gh/StevenMMortimer/salesforcer?branch=main) {salesforcer} is an R package that connects to Salesforce Platform APIs @@ -51,6 +51,23 @@ Package features include: - Passing API call control parameters such as, “All or None”, “Duplicate Rule”, “Assignment Rule” execution and many more\! +**CAUTION: The most recent release, {salesforcer 0.2.1}, requires {dplyr +1.0.0} because {dplyr 1.0.1} introduced a bug in `bind_rows()` with how +it binds lists where the list elements have differing lengths. This is +documented in tidyverse/dplyr\#5417 and r-lib/vctrs\#1073. The timeline +for a fix is unknown as of August 2020, but a new version of +{salesforcer} (0.2.2) will be released immediately following the {dplyr} +fix.** + +You can install the older version of {dplyr} using the following +command: + +``` r +# remove.packages("dplyr") +# install.packages("remotes") +remotes::install_version("dplyr", "1.0.0") +``` + ## Table of Contents - [Installation](#installation) @@ -69,7 +86,7 @@ Package features include: ## Installation ``` r -# install the current CRAN version (0.2.0) +# install the current CRAN version (0.2.1) install.packages("salesforcer") # or get the development version on GitHub @@ -168,8 +185,8 @@ created_records #> # A tibble: 2 x 2 #> id success #> -#> 1 0033s000013wZZ3AAM TRUE -#> 2 0033s000013wZZ4AAM TRUE +#> 1 0033s0000149YhZAAU TRUE +#> 2 0033s0000149YhaAAE TRUE ``` ### Query @@ -194,8 +211,8 @@ queried_records #> # A tibble: 2 x 3 #> Id FirstName LastName #> -#> 1 0033s000013wZZ3AAM Test Contact-Create-1 -#> 2 0033s000013wZZ4AAM Test Contact-Create-2 +#> 1 0033s0000149YhZAAU Test Contact-Create-1 +#> 2 0033s0000149YhaAAE Test Contact-Create-2 ``` **NOTE**: In the example above, you’ll notice that the `"Account.Name"` @@ -232,8 +249,8 @@ updated_records #> # A tibble: 2 x 2 #> id success #> -#> 1 0033s000013wZZ3AAM TRUE -#> 2 0033s000013wZZ4AAM TRUE +#> 1 0033s0000149YhZAAU TRUE +#> 2 0033s0000149YhaAAE TRUE ``` ### Bulk Operations @@ -270,8 +287,8 @@ created_records #> # A tibble: 2 x 4 #> Id Success Created Error #> -#> 1 0033s000013wZXhAAM TRUE TRUE NA -#> 2 0033s000013wZXiAAM TRUE TRUE NA +#> 1 0033s0000149YheAAE TRUE TRUE NA +#> 2 0033s0000149YhfAAE TRUE TRUE NA # query large recordsets using the Bulk API my_soql <- sprintf("SELECT Id, @@ -286,8 +303,8 @@ queried_records #> # A tibble: 2 x 3 #> Id FirstName LastName #> -#> 1 0033s000013wZXhAAM Test Contact-Create-1 -#> 2 0033s000013wZXiAAM Test Contact-Create-2 +#> 1 0033s0000149YheAAE Test Contact-Create-1 +#> 2 0033s0000149YhfAAE Test Contact-Create-2 # delete these records using the Bulk 2.0 API deleted_records <- sf_delete(queried_records$Id, "Contact", api_type = "Bulk 2.0") @@ -295,8 +312,8 @@ deleted_records #> # A tibble: 2 x 4 #> Id sf__Id sf__Created sf__Error #> -#> 1 0033s000013wZXhAAM 0033s000013wZXhAAM FALSE NA -#> 2 0033s000013wZXiAAM 0033s000013wZXiAAM FALSE NA +#> 1 0033s0000149YheAAE 0033s0000149YheAAE FALSE NA +#> 2 0033s0000149YhfAAE 0033s0000149YhfAAE FALSE NA ``` ### Using the Metadata API diff --git a/docs/404.html b/docs/404.html index 83d34c3c..a7870270 100644 --- a/docs/404.html +++ b/docs/404.html @@ -95,7 +95,7 @@ salesforcer - 0.2.0 + 0.2.1 diff --git a/docs/CODE_OF_CONDUCT.html b/docs/CODE_OF_CONDUCT.html index 16ad0644..08abd186 100644 --- a/docs/CODE_OF_CONDUCT.html +++ b/docs/CODE_OF_CONDUCT.html @@ -95,7 +95,7 @@ salesforcer - 0.2.0.9999 + 0.2.1 diff --git a/docs/CONTRIBUTING.html b/docs/CONTRIBUTING.html index 59b215dc..e4f1f8a9 100644 --- a/docs/CONTRIBUTING.html +++ b/docs/CONTRIBUTING.html @@ -95,7 +95,7 @@ salesforcer - 0.2.0.9999 + 0.2.1 diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index 8d9ad3b1..93ca8c8a 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -95,7 +95,7 @@ salesforcer - 0.2.0.9999 + 0.2.1 diff --git a/docs/LICENSE.html b/docs/LICENSE.html index afd9baa7..501212f5 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -95,7 +95,7 @@ salesforcer - 0.2.0.9999 + 0.2.1 diff --git a/docs/SECURITY.html b/docs/SECURITY.html index 35a7d2c8..fad4676a 100644 --- a/docs/SECURITY.html +++ b/docs/SECURITY.html @@ -95,7 +95,7 @@ salesforcer - 0.2.0.9999 + 0.2.1 diff --git a/docs/SUPPORT.html b/docs/SUPPORT.html index 2ef45cbb..95a655c1 100644 --- a/docs/SUPPORT.html +++ b/docs/SUPPORT.html @@ -95,7 +95,7 @@ salesforcer - 0.2.0.9999 + 0.2.1 diff --git a/docs/articles/getting-started.html b/docs/articles/getting-started.html index 06f2aeaf..18c516ff 100644 --- a/docs/articles/getting-started.html +++ b/docs/articles/getting-started.html @@ -46,7 +46,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -126,15 +126,15 @@ -
+
@@ -144,12 +144,17 @@

2018-03-12

Authentication

-

First, load the salesforcer package and login. There are two ways to authenticate: 1) OAuth 2.0 and 2) Basic Username-Password. It is recommended to use OAuth 2.0 so that passwords do not have to be shared/embedded within scripts. User credentials will be stored in locally cached file entitled “.httr-oauth-salesforcer” in the current working directory.

-
suppressWarnings(suppressMessages(library(dplyr)))
+

First, load the {salesforcer} package and login. There are two ways to authenticate:

+
    +
  1. OAuth 2.0
  2. +
  3. Basic Username-Password
  4. +
+

It is recommended to use OAuth 2.0 so that passwords do not have to be shared/embedded within scripts. User credentials will be stored in locally cached file entitled .httr-oauth-salesforcer in the current working directory.

+
library(dplyr, warn.conflicts = FALSE)
 library(salesforcer)
 sf_auth()

Setting up your own Connected App for OAuth

-

Just a note, that it’s not necessary to setup your own Connected App in Salesforce to use OAuth 2.0 authentication. The only difference is that the authentication will be run through the client created and associated with the salesforcer package. By using the package client, you will NOT be giving access to Salesforce to anyone, the package is just the medium for you to connect to your own data. If you wanted more control you would specify those options like so:

+

Just a note, that it’s not necessary to setup your own Connected App in Salesforce to use OAuth 2.0 authentication. The only difference is that the authentication will be run through the client created and associated with the {salesforcer} package. By using the package client, you will NOT be giving access to Salesforce to anyone, the package is just the medium for you to connect to your own data. If you wanted more control you would specify those options like so:

options(salesforcer.consumer_key = "012345678901-99thisisatest99connected33app22key")
 options(salesforcer.consumer_secret = "Th1s1sMyConsumerS3cr3t")
 
@@ -185,8 +190,8 @@ 

#> # A tibble: 2 x 2 #> id success #> <chr> <lgl> -#> 1 0033s000013YBQtAAO TRUE -#> 2 0033s000013YBQuAAO TRUE

+#> 1 0033s0000149YicAAE TRUE +#> 2 0033s0000149YidAAE TRUE

@@ -199,8 +204,8 @@

#> # A tibble: 2 x 4 #> sObject Id FirstName LastName #> <chr> <chr> <chr> <chr> -#> 1 Contact 0033s000013YBQtAAO Test Contact-Create-1 -#> 2 Contact 0033s000013YBQuAAO Test Contact-Create-2

+#> 1 Contact 0033s0000149YicAAE Test Contact-Create-1 +#> 2 Contact 0033s0000149YidAAE Test Contact-Create-2

@@ -219,9 +224,9 @@

#> # A tibble: 2 x 3 #> Id FirstName LastName #> <chr> <chr> <chr> -#> 1 0033s000013YBQtAAO Test Contact-Create-1 -#> 2 0033s000013YBQuAAO Test Contact-Create-2

-

You’ll notice that the "Account.Name" column does not appear in the results. This is because the SOAP and REST APIs do not return any Account information if it does not exist on the record and there is no reliable way to extract and rebuild the empty columns based on the query string. If there were Account information, an additional column titled "Account.Name" would appear in the results. Note, that the Bulk 1.0 and Bulk 2.0 APIs will return "Account.Name" as a column of all NA values for this query because they return results differently.

+#> 1 0033s0000149YicAAE Test Contact-Create-1 +#> 2 0033s0000149YidAAE Test Contact-Create-2
+

NOTE: In the example above, you’ll notice that the "Account.Name" column does not appear in the results. This is because the SOAP and REST APIs only return an empty Account object for the record if there is no relationship to an account ( see #78). There is no reliable way to extract and rebuild the empty columns based on the query string. If there were Account information, an additional column titled "Account.Name" would appear in the results. Note, that the Bulk 1.0 and Bulk 2.0 APIs will return "Account.Name" as a column of all NA values for this query because they return results differently.

@@ -236,8 +241,8 @@

#> # A tibble: 2 x 2 #> id success #> <chr> <lgl> -#> 1 0033s000013YBQtAAO TRUE -#> 2 0033s000013YBQuAAO TRUE

+#> 1 0033s0000149YicAAE TRUE +#> 2 0033s0000149YidAAE TRUE

@@ -248,8 +253,8 @@

#> # A tibble: 2 x 2 #> id success #> <chr> <lgl> -#> 1 0033s000013YBQtAAO TRUE -#> 2 0033s000013YBQuAAO TRUE

+#> 1 0033s0000149YicAAE TRUE +#> 2 0033s0000149YidAAE TRUE

@@ -276,9 +281,9 @@

#> # A tibble: 3 x 3 #> id success created #> <chr> <lgl> <lgl> -#> 1 0033s000013YBQvAAO TRUE FALSE -#> 2 0033s000013YBQwAAO TRUE FALSE -#> 3 0033s000013YBOFAA4 TRUE TRUE

+#> 1 0033s0000149YihAAE TRUE FALSE +#> 2 0033s0000149YiiAAE TRUE FALSE +#> 3 0033s0000149YimAAE TRUE TRUE

diff --git a/docs/articles/getting-started_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/getting-started_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6..00000000 --- a/docs/articles/getting-started_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/getting-started_files/header-attrs-2.3/header-attrs.js b/docs/articles/getting-started_files/header-attrs-2.3/header-attrs.js new file mode 100644 index 00000000..dd57d92e --- /dev/null +++ b/docs/articles/getting-started_files/header-attrs-2.3/header-attrs.js @@ -0,0 +1,12 @@ +// Pandoc 2.9 adds attributes on both header and div. We remove the former (to +// be compatible with the behavior of Pandoc < 2.8). +document.addEventListener('DOMContentLoaded', function(e) { + var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); + var i, h, a; + for (i = 0; i < hs.length; i++) { + h = hs[i]; + if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 + a = h.attributes; + while (a.length > 0) h.removeAttribute(a[0].name); + } +}); diff --git a/docs/articles/index.html b/docs/articles/index.html index ca901718..3a04d3a8 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -95,7 +95,7 @@ salesforcer - 0.2.0 + 0.2.1

diff --git a/docs/articles/passing-control-args.html b/docs/articles/passing-control-args.html index ed36577b..892a024b 100644 --- a/docs/articles/passing-control-args.html +++ b/docs/articles/passing-control-args.html @@ -46,7 +46,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -126,7 +126,7 @@ -
+
@@ -145,18 +145,22 @@

2020-07-08

The new control argument

-

This new feature can be seen in the sf_create (and many other functions) as control=list(...). The dots mean that you can pass any number of controls directly into the function. For example, the following code will create a record, but prevent its creation from showing up in the Chatter feeds by setting the DisableFeedTrackingHeader.

-
new_contact <- c(FirstName = "Jenny",
+

This new feature can be seen in the sf_create (and many other functions) as control=list(...). The dots mean that you can pass any number of controls directly into the function.

+

First, authenticate and load any required packages for your analysis.

+
library(salesforcer)
+sf_auth()
+

In the example below, we demonstrate how to create a record, but use the control arguments to prevent its creation from showing up in the Chatter feeds by setting the DisableFeedTrackingHeader.

+
new_contact <- c(FirstName = "Jenny",
                  LastName = "Williams",
                  Email = "jennyw@gmail.com")
 record1 <- sf_create(new_contact,
                      object_name = "Contact",
                      DisableFeedTrackingHeader = list(disableFeedTracking = TRUE))
 record1
-#> # A tibble: 1 x 3
-#>   success errors.statusCode   errors.message                                    
-#>   <lgl>   <chr>               <chr>                                             
-#> 1 FALSE   DUPLICATES_DETECTED Another contact record has the same email address.
+#> # A tibble: 1 x 2 +#> success errors +#> <lgl> <list> +#> 1 FALSE <list [1]>

You will notice that the argument DisableFeedTrackingHeader can be included right into the function without any documentation existing for it in the sf_create function. This is because the dots (...) allow you to pass over a dozen different control parameters and that documentation would be tedious to create and maintain over multiple functions in the package. However, you will notice in the documentation entry for the control argument there is a link to a function called sf_control which you can use to directly to pass into control or simply to review its documentation of all the possible control parameters and their defaults. This is where you can review the various control options in more detail before trying to set them.

You may have also noticed that the argument DisableFeedTrackingHeader was formatted as a list with an element inside called disableFeedTracking set to TRUE. This may seem redundant but there are two reasons for this. First, this is exactly how the Salesforce APIs documents these options, which are typically referred to as “headers” because they are passed as a named header of the HTTP request and then the header fields and values are provided for that header. Second, some headers have multiple fields and values so a list is the only way to provide multiple named fields and values under a single header entity.

@@ -171,7 +175,7 @@

  • runAsCurrentUser - Make sure that sharing rules for the current user are enforced when duplicate rules run by setting this property to true. Use the sharing rules specified in the class for the request by setting this property to false. If no sharing rules are specified, Apex code runs in system context and sharing rules for the current user are not enforced.

  • Specifying these arguments requires a list structure in R, which may seem redundant in some cases, but is necessary to follow in order to build the API request correctly.

    -
    # override the duplicate rules ...
    +
    # override the duplicate rules ...
     record2 <- sf_create(new_contact,
                          object_name = "Contact",
                          DuplicateRuleHeader = list(allowSave = TRUE,
    @@ -181,7 +185,7 @@ 

    #> # A tibble: 1 x 2 #> id success #> <chr> <lgl> -#> 1 0033s000013YBR3AAO TRUE +#> 1 0033s0000149YirAAE TRUE # ... or succumb to the duplicate rules record3 <- sf_create(new_contact, @@ -190,17 +194,17 @@

    includeRecordDetails = FALSE, runAsCurrentUser = TRUE)) record3 -#> # A tibble: 1 x 3 -#> success errors.statusCode errors.message -#> <lgl> <chr> <chr> -#> 1 FALSE DUPLICATES_DETECTED Another contact record has the same email address.

    +#> # A tibble: 1 x 2 +#> success errors +#> <lgl> <list> +#> 1 FALSE <list [1]>

    Per the description above, note that setting allowSave=TRUE will not override rules where the “Action on Create” for a rule is set to “Block”. If the duplicate rule’s action is “Allow” with an alert, then setting allowSave=TRUE means the record will be created with no warning message. If allowSave=FALSE, then the record will be prevented from being created. For additional information on the DuplicateRuleHeader, please see the Salesforce documentation at: https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_header_duplicateruleheader.htm

    Finally, you may notice during your use that only certain control arguments are permitted based on the API. For example, the DuplicateRuleHeader is not implemented in the REST API like it is in the SOAP API. In the example below you should take note of two things:

    1. When using the REST API and setting the DuplicateRuleHeader, then you will notice a warning that the header was ignored. You will receive warnings when trying to set any control parameters for an API or operation that does not recognize that particular control.

    2. In this example, you cannot bypass the duplicate rule alert to create the record if using the REST API like you can with the SOAP API.

    -
    record4 <- sf_create(new_contact,
    +
    record4 <- sf_create(new_contact,
                          object_name = "Contact",
                          DuplicateRuleHeader = list(allowSave = FALSE,
                                                     includeRecordDetails = FALSE,
    @@ -209,19 +213,19 @@ 

    #> Warning: Ignoring the following controls which are not used in the REST API: #> DuplicateRuleHeader record4 -#> # A tibble: 1 x 3 -#> success errors.statusCode errors.message -#> <lgl> <chr> <chr> -#> 1 FALSE DUPLICATES_DETECTED Another contact record has the same email address.

    +#> # A tibble: 1 x 2 +#> success errors +#> <lgl> <list> +#> 1 FALSE <list [1]>

    Creating the control argument with sf_control

    If this type of control structure is new to you, take a look at the documentation for the glm and glm.control functions. The way these two functions behave is exactly how functions like sf_create and sf_control work with each other. As demonstrated above you can pass any number of arbitrary controls into the function and they are all gathered up into the control by control = list(...). However, you can specify the control directly like this:

    -
    sf_query("SELECT Id, Name FROM Account LIMIT 1000",
    +
    sf_query("SELECT Id, Name FROM Account LIMIT 1000",
              object_name = "Account",
              control = sf_control(QueryOptions = list(batchSize = 200)))
    -#> # A tibble: 13 x 2
    +#> # A tibble: 11 x 2
     #>   Id                 Name                                
     #>   <chr>              <chr>                               
     #> 1 0013s00000zFgA6AAK KEEP Test Account With Child Records
    @@ -229,7 +233,7 @@ 

    #> 3 0016A0000035mJEQAY GenePoint #> 4 0016A0000035mJCQAY United Oil & Gas, UK #> 5 0016A0000035mJDQAY United Oil & Gas, Singapore -#> # … with 8 more rows

    +#> # … with 6 more rows

    diff --git a/docs/articles/passing-control-args_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/passing-control-args_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6..00000000 --- a/docs/articles/passing-control-args_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/passing-control-args_files/header-attrs-2.3/header-attrs.js b/docs/articles/passing-control-args_files/header-attrs-2.3/header-attrs.js new file mode 100644 index 00000000..dd57d92e --- /dev/null +++ b/docs/articles/passing-control-args_files/header-attrs-2.3/header-attrs.js @@ -0,0 +1,12 @@ +// Pandoc 2.9 adds attributes on both header and div. We remove the former (to +// be compatible with the behavior of Pandoc < 2.8). +document.addEventListener('DOMContentLoaded', function(e) { + var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); + var i, h, a; + for (i = 0; i < hs.length; i++) { + h = hs[i]; + if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 + a = h.attributes; + while (a.length > 0) h.removeAttribute(a[0].name); + } +}); diff --git a/docs/articles/supported-queries.html b/docs/articles/supported-queries.html index 0e024618..fc1d0aa1 100644 --- a/docs/articles/supported-queries.html +++ b/docs/articles/supported-queries.html @@ -46,7 +46,7 @@ salesforcer - 0.2.0 + 0.2.1

    @@ -126,7 +126,7 @@ -
    +
    @@ -191,11 +191,11 @@

    #> # A tibble: 10 x 3 #> Id FirstName LastName #> <chr> <chr> <chr> -#> 1 0033s000013YAdhAAG Test Contact-Create-Compatibility -#> 2 0033s000013YB7iAAG Test Contact-Create-2 -#> 3 0033s000013YAnLAAW Test Contact-Create-3 -#> 4 0033s000013YAnMAAW Test Contact-Create-4 -#> 5 0033s000013YBFbAAO Test Contact-Create-1 +#> 1 0033s000013wlpjAAA Test Contact-Create-1 +#> 2 0033s000013wlpkAAA Test Contact-Create-2 +#> 3 0033s000013wm08AAA Test Contact-Create-Compatibility +#> 4 0033s000013wlpeAAA Test Contact-Create-2 +#> 5 0033s000012Nd6FAAS Jenny Williams #> # … with 5 more rows queried_records <- sf_query(soql, api_type = "SOAP") @@ -203,11 +203,11 @@

    #> # A tibble: 10 x 3 #> Id FirstName LastName #> <chr> <chr> <chr> -#> 1 0033s000013YAdhAAG Test Contact-Create-Compatibility -#> 2 0033s000013YB7iAAG Test Contact-Create-2 -#> 3 0033s000013YAnLAAW Test Contact-Create-3 -#> 4 0033s000013YAnMAAW Test Contact-Create-4 -#> 5 0033s000013YBFbAAO Test Contact-Create-1 +#> 1 0033s000013wlpjAAA Test Contact-Create-1 +#> 2 0033s000013wlpkAAA Test Contact-Create-2 +#> 3 0033s000013wm08AAA Test Contact-Create-Compatibility +#> 4 0033s000013wlpeAAA Test Contact-Create-2 +#> 5 0033s000012Nd6FAAS Jenny Williams #> # … with 5 more rows

    @@ -253,13 +253,14 @@

    res <- microbenchmark::microbenchmark( qry("REST"), qry("SOAP"), - times = 5 + times = 5, + unit = "s" ) res -#> Unit: milliseconds +#> Unit: seconds #> expr min lq mean median uq max neval -#> qry("REST") 436.5536 500.2485 570.3217 502.2868 599.0305 813.4891 5 -#> qry("SOAP") 1865.7755 1959.3787 2189.5823 1989.6856 2088.0991 3044.9728 5 +#> qry("REST") 0.5350182 0.5402298 0.5657159 0.5782125 0.5795702 0.5955489 5 +#> qry("SOAP") 1.8384984 1.9858533 2.3996804 1.9916697 2.2584836 3.9238971 5 suppressWarnings(suppressMessages( ggplot2::autoplot(res) + @@ -283,7 +284,7 @@

    ) ) #> Request failed [400]. Retrying in 1 seconds... -#> Request failed [400]. Retrying in 2.9 seconds... +#> Request failed [400]. Retrying in 3.5 seconds... #> Error : API_ERROR: Aggregate Relationships not supported in Bulk V2 Query with CSV content type # aggregate query @@ -296,8 +297,8 @@

    api_type = "Bulk 2.0" ) ) -#> Request failed [400]. Retrying in 1.4 seconds... -#> Request failed [400]. Retrying in 1 seconds... +#> Request failed [400]. Retrying in 1.1 seconds... +#> Request failed [400]. Retrying in 3.4 seconds... #> Error : API_ERROR: Aggregate Relationships not supported in Bulk Query

    The two queries above were trying to pull all the contacts for each account and then get a count of how many contacts there are per account. If you have a lot of records, using the REST API to return these results may not be feasible. Even though the Bulk APIs cannot handle the same query, they can pull down massive amounts of data quickly. In this case you can pull down all of the Contact records and all of the Account records and then perform the calculation using dplyr, like so:

    contacts <- sf_query("SELECT Id, FirstName, Account.Id
    @@ -314,7 +315,7 @@ 

    `Contact.FirstName` = FirstName), by = c("Id" = "Account.Id")) nested_query_recs -#> # A tibble: 613 x 4 +#> # A tibble: 415 x 4 #> Id Name Contact.Id Contact.FirstNa… #> <chr> <chr> <chr> <chr> #> 1 0013s00000zFdu… KEEP Test Account With Chil… 0033s000012Nkzw… KEEP @@ -322,22 +323,22 @@

    #> 3 0013s00000zFdu… KEEP Test Account With Chil… 0033s000012Nkzy… KEEP #> 4 0013s00000zFdu… KEEP Test Account With Chil… 0033s000012Nkzz… KEEP #> 5 0013s00000zFdu… KEEP Test Account With Chil… 0033s000012Nl00… KEEP -#> # … with 608 more rows +#> # … with 410 more rows aggregate_query_recs <- nested_query_recs %>% group_by(Id) %>% summarize(.groups = 'drop', contacts_n = sum(!is.na(Contact.Id))) aggregate_query_recs -#> # A tibble: 14 x 2 +#> # A tibble: 12 x 2 #> Id contacts_n #> <chr> <int> #> 1 0013s00000zFdugAAC 300 #> 2 0013s00000zFgA6AAK 0 -#> 3 0013s000010x6GcAAI 99 -#> 4 0013s000010xA6AAAU 99 -#> 5 0013s000010xAdKAAU 99 -#> # … with 9 more rows

    +#> 3 0013s000011ImcVAAS 99 +#> 4 0016A0000035mJ4QAI 2 +#> 5 0016A0000035mJ5QAI 1 +#> # … with 7 more rows

    The second reason to not use the Bulk APIs is that there is a performance overhead associated with every bulk (asynchronous) job that involves checking the status of the job until it succeeds or fails before retrieving the results.

    The example below is provided so that you can take this code as an example to run your own performance test of queries that return 10K, 100K, 1M+ records to see where the Bulk APIs outperform the REST API.

    qry_compare <- function(api_type){
    @@ -352,7 +353,8 @@ 

    qry_compare("REST"), qry_compare("Bulk 1.0"), qry_compare("Bulk 2.0"), - times = 5 + times = 5, + unit = "s" )

    Note that the Bulk 1.0 API requires users to specify the target object along with their submitted SOQL. This is because it is needed when creating the bulk job that will manage and execute the query.

    queried_records <- sf_query(soql, api_type = "Bulk 1.0")
    @@ -372,11 +374,11 @@ 

    #> # A tibble: 99 x 4 #> Id sf__Id sf__Created sf__Error #> <chr> <chr> <lgl> <lgl> -#> 1 0033s000013YBRXAA4 0033s000013YBRXAA4 FALSE NA -#> 2 0033s000013YBRYAA4 0033s000013YBRYAA4 FALSE NA -#> 3 0033s000013YBRZAA4 0033s000013YBRZAA4 FALSE NA -#> 4 0033s000013YBRaAAO 0033s000013YBRaAAO FALSE NA -#> 5 0033s000013YBRbAAO 0033s000013YBRbAAO FALSE NA +#> 1 0033s0000149YjPAAU 0033s0000149YjPAAU FALSE NA +#> 2 0033s0000149YjQAAU 0033s0000149YjQAAU FALSE NA +#> 3 0033s0000149YjRAAU 0033s0000149YjRAAU FALSE NA +#> 4 0033s0000149YjSAAU 0033s0000149YjSAAU FALSE NA +#> 5 0033s0000149YjTAAU 0033s0000149YjTAAU FALSE NA #> # … with 94 more rows # ... and finally delete the account @@ -384,7 +386,7 @@

    #> # A tibble: 1 x 2 #> id success #> <chr> <lgl> -#> 1 0013s000010xAdKAAU TRUE

    +#> 1 0013s000011ImcVAAS TRUE

    @@ -400,7 +402,7 @@

    FROM Contact WHERE Account.Id != null" ) -#> # A tibble: 513 x 3 +#> # A tibble: 315 x 3 #> Id FirstName Account.Name #> <chr> <chr> <chr> #> 1 0033s000012Nl0rAAC KEEP KEEP Test Account With Child Records @@ -408,7 +410,7 @@

    #> 3 0033s000012Nl0tAAC KEEP KEEP Test Account With Child Records #> 4 0033s000012Nl0uAAC KEEP KEEP Test Account With Child Records #> 5 0033s000012Nl0vAAC KEEP KEEP Test Account With Child Records -#> # … with 508 more rows

    +#> # … with 310 more rows

    Sometimes you may notice that the requested relationship fields do not appear in the query results. This is because the SOAP and REST APIs do not return any related object information if it does not exist on the record and there is no reliable way to extract and rebuild the empty columns based on the query string. In the example below, if there were Account information an additional column titled "Account.Name" would appear in the results.

    # child-to-parent relationship (e.g. Account.Name from Contact record)
     sf_query(
    @@ -416,15 +418,15 @@ 

    FROM Contact WHERE Account.Id = null" ) -#> # A tibble: 679 x 2 +#> # A tibble: 56 x 2 #> Id FirstName #> <chr> <chr> -#> 1 0033s000013YAdhAAG Test -#> 2 0033s000013YB7iAAG Test -#> 3 0033s000013YAnLAAW Test -#> 4 0033s000013YAnMAAW Test -#> 5 0033s000013YBFbAAO Test -#> # … with 674 more rows

    +#> 1 0033s000013wlpjAAA Test +#> 2 0033s000013wlpkAAA Test +#> 3 0033s000013wm08AAA Test +#> 4 0033s000013wlpeAAA Test +#> 5 0033s000012Nd6FAAS Jenny +#> # … with 51 more rows

    Note, that the Bulk 1.0 and Bulk 2.0 APIs will return "Account.Name" as a column of all NA values for this query because they return results differently.

    Finally, one aspect to note is that the Bulk 2.0 API does not support child-to-parent-grandparent relationships as seen in the example below:

    try(
    @@ -444,7 +446,7 @@ 

    (SELECT Id, FirstName FROM Contacts) FROM Account" ) -#> # A tibble: 514 x 4 +#> # A tibble: 316 x 4 #> Id Name Contact.FirstName Contact.Id #> <chr> <chr> <chr> <chr> #> 1 0013s00000zFgA… KEEP Test Account With Chil… <NA> <NA> @@ -452,7 +454,7 @@

    #> 3 0013s00000zFdu… KEEP Test Account With Chil… KEEP 0033s000012Nkz… #> 4 0013s00000zFdu… KEEP Test Account With Chil… KEEP 0033s000012Nkz… #> 5 0013s00000zFdu… KEEP Test Account With Chil… KEEP 0033s000012Nkz… -#> # … with 509 more rows

    +#> # … with 311 more rows

    At first glance this query may appear the same as a lookup query on the Contact object that includes the account id and name. However, the small difference is that every Account is included, regardless of whether or not they have a Contact. This can be helpful when you want to ensure a query contains all of the parent records and their child records, if they exist. Also, note that the plural object name is used inside the nested query (“Contacts” instead of “Contact”).

    Finally, a parent-to-child nested query can also contain a child-to-parent lookup relationship within it. Below is an example where the Owner Id on the Contact is included so you can know who is responsible for the Contacts under each Account.

    sf_query(
    @@ -460,7 +462,7 @@ 

    (SELECT Id, FirstName, Owner.Id FROM Contacts) FROM Account" ) -#> # A tibble: 514 x 5 +#> # A tibble: 316 x 5 #> Name Contact.FirstName Contact.Id Contact.Owner.Id Owner.Id #> <chr> <chr> <chr> <chr> <chr> #> 1 KEEP Test Accoun… <NA> <NA> <NA> 0056A00000… @@ -468,7 +470,7 @@

    #> 3 KEEP Test Accoun… KEEP 0033s000012N… 0056A000000MPRj… 0056A00000… #> 4 KEEP Test Accoun… KEEP 0033s000012N… 0056A000000MPRj… 0056A00000… #> 5 KEEP Test Accoun… KEEP 0033s000012N… 0056A000000MPRj… 0056A00000… -#> # … with 509 more rows

    +#> # … with 311 more rows
    diff --git a/docs/articles/supported-queries_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/supported-queries_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6..00000000 --- a/docs/articles/supported-queries_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/supported-queries_files/figure-html/run-performance-test-1.png b/docs/articles/supported-queries_files/figure-html/run-performance-test-1.png index b558053756f5c3e3dd38b00e9597712e184150e7..26058242f8925904f231e20b683722545d22f20d 100644 GIT binary patch literal 47927 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

    yJEBNPwQ{Sn7uc0 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 D+GFeV diff --git a/docs/articles/supported-queries_files/header-attrs-2.3/header-attrs.js b/docs/articles/supported-queries_files/header-attrs-2.3/header-attrs.js new file mode 100644 index 00000000..dd57d92e --- /dev/null +++ b/docs/articles/supported-queries_files/header-attrs-2.3/header-attrs.js @@ -0,0 +1,12 @@ +// Pandoc 2.9 adds attributes on both header and div. We remove the former (to +// be compatible with the behavior of Pandoc < 2.8). +document.addEventListener('DOMContentLoaded', function(e) { + var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); + var i, h, a; + for (i = 0; i < hs.length; i++) { + h = hs[i]; + if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 + a = h.attributes; + while (a.length > 0) h.removeAttribute(a[0].name); + } +}); diff --git a/docs/articles/transitioning-from-RForcecom.html b/docs/articles/transitioning-from-RForcecom.html index 54140d40..782209ba 100644 --- a/docs/articles/transitioning-from-RForcecom.html +++ b/docs/articles/transitioning-from-RForcecom.html @@ -46,7 +46,7 @@ salesforcer - 0.2.0 + 0.2.1

    @@ -126,7 +126,7 @@ -
    +
    -

    While writing the {salesforcer} package we were keenly aware that many folks are already using the RForcecom package to connect to Salesforce. In order to foster adoption and switching between the packages {salesforcer} replicates the functionality of many RForcecom functions so that you will only need to swap out library(RForcecom) for library(salesforcer) and still have your production tested scripts perform as usual.

    +

    While writing the {salesforcer} package we were keenly aware that many folks are already using the {RForcecom} package to connect to Salesforce. In order to foster adoption and switching between the packages {salesforcer} replicates the functionality of many {RForcecom} functions so that you will only need to swap out library(RForcecom) for library(salesforcer) and still have your production tested scripts perform as usual.

    Authentication

    -

    {salesforcer} supports OAuth 2.0 authentication which is preferred, but for backward compatibility provides the username-password authentication routine implemented by RForcecom. Here is an example running the function from each of the packages side-by-side and producing the same result.

    +

    {salesforcer} supports OAuth 2.0 authentication which is preferred, but for backward compatibility provides the username-password authentication routine implemented by {RForcecom}. Here is an example running the function from each of the packages side-by-side and producing the same result.

    # the RForcecom way
     session1 <- RForcecom::rforcecom.login(username, paste0(password, security_token),
                                            apiVersion=getOption("salesforcer.api_version"))
    @@ -166,12 +166,12 @@ 

    #> "{MASKED}" "https://na122.salesforce.com/" #> apiVersion #> "48.0"

    -

    Note that we must set the API version here because calls to session will not create a new sessionId and then we are stuck with version 35.0 (the default from RForcecom::rforcecom.login). Some functions in {salesforcer} implement API calls that are only available after version 35.0.

    +

    Note that we must set the API version here because calls to session will not create a new sessionId and then we are stuck with version 35.0 (the default from RForcecom::rforcecom.login()). Some functions in {salesforcer} implement API calls that are only available after version 35.0.

    CRUD Operations

    -

    “CRUD” operations (Create, Retrieve, Update, Delete) in the RForcecom package only operate on one record at a time. One benefit to using the {salesforcer} package is that these operations will accept a named vector (one record) or an entire data.frame or tbl_df of records to churn through. However, rest assured that the replicated functions behave exactly the same way if you are hesitant to making the switch.

    +

    “CRUD” operations (Create, Retrieve, Update, Delete) in the {RForcecom} package only operate on one record at a time. One benefit to using the {salesforcer} package is that these operations will accept a named vector (one record) or an entire data.frame or tbl_df of records to churn through. However, rest assured that the replicated functions behave exactly the same way if you are hesitant to making the switch.

    object <- "Contact"
     fields <- c(FirstName="Test", LastName="Contact-Create-Compatibility")
     
    @@ -179,13 +179,13 @@ 

    result1 <- RForcecom::rforcecom.create(session, objectName=object, fields) result1 #> id success -#> 1 0033s000013YBTDAA4 true +#> 1 0033s0000149YkwAAE true # replicated in salesforcer package result2 <- salesforcer::rforcecom.create(session, objectName=object, fields) result2 #> id success -#> 1 0033s000013YBQ1AAO TRUE

    +#> 1 0033s0000149YeIAAU TRUE

    Here is an example showing the reduction in code of using {salesforcer} if you would like to create multiple records.

    n <- 2
     new_contacts <- tibble(FirstName = rep("Test", n),
    @@ -201,8 +201,8 @@ 

    } rforcecom_results #> id success -#> 1 0033s000013YBTIAA4 true -#> 2 0033s000013YBA0AAO true +#> 1 0033s0000149Yl1AAE true +#> 2 0033s0000149Yl6AAE true # the better way in salesforcer to do multiple records salesforcer_results <- sf_create(new_contacts, object_name="Contact") @@ -210,53 +210,53 @@

    #> # A tibble: 2 x 2 #> id success #> <chr> <lgl> -#> 1 0033s000013YBTNAA4 TRUE -#> 2 0033s000013YBTOAA4 TRUE

    +#> 1 0033s0000149YlBAAU TRUE +#> 2 0033s0000149YlCAAU TRUE

    Query

    -

    {salesforcer} also has better printing and type-casting when returning query result thanks to features of the readr package.

    +

    {salesforcer} also has better printing and type-casting when returning query result thanks to features of the {readr} package.

    this_soql <- "SELECT Id, Email FROM Contact LIMIT 5"
     
     # the RForcecom way
     result1 <- RForcecom::rforcecom.query(session, soqlQuery = this_soql)
     result1
    -#>                   Id
    -#> 1 0033s000013YAdhAAG
    -#> 2 0033s000013YB7iAAG
    -#> 3 0033s000013YAnLAAW
    -#> 4 0033s000013YAnMAAW
    -#> 5 0033s000013YBFbAAO
    +#>                   Id            Email
    +#> 1 0033s000013wlpjAAA             <NA>
    +#> 2 0033s000013wlpkAAA             <NA>
    +#> 3 0033s000013wm08AAA             <NA>
    +#> 4 0033s000013wlpeAAA             <NA>
    +#> 5 0033s000012Nd6FAAS jennyw@gmail.com
     
     # replicated in salesforcer package
     result2 <- salesforcer::rforcecom.query(session, soqlQuery = this_soql)
     result2
    -#> # A tibble: 5 x 1
    -#>   Id                
    -#>   <chr>             
    -#> 1 0033s000013YAdhAAG
    -#> 2 0033s000013YB7iAAG
    -#> 3 0033s000013YAnLAAW
    -#> 4 0033s000013YAnMAAW
    -#> 5 0033s000013YBFbAAO
    +#> # A tibble: 5 x 2
    +#>   Id                 Email           
    +#>   <chr>              <chr>           
    +#> 1 0033s000013wlpjAAA <NA>            
    +#> 2 0033s000013wlpkAAA <NA>            
    +#> 3 0033s000013wm08AAA <NA>            
    +#> 4 0033s000013wlpeAAA <NA>            
    +#> 5 0033s000012Nd6FAAS jennyw@gmail.com
     
     # the better way in salesforcer to query
     salesforcer_results <- sf_query(this_soql)
     salesforcer_results
    -#> # A tibble: 5 x 1
    -#>   Id                
    -#>   <chr>             
    -#> 1 0033s000013YAdhAAG
    -#> 2 0033s000013YB7iAAG
    -#> 3 0033s000013YAnLAAW
    -#> 4 0033s000013YAnMAAW
    -#> 5 0033s000013YBFbAAO
    +#> # A tibble: 5 x 2 +#> Id Email +#> <chr> <chr> +#> 1 0033s000013wlpjAAA <NA> +#> 2 0033s000013wlpkAAA <NA> +#> 3 0033s000013wm08AAA <NA> +#> 4 0033s000013wlpeAAA <NA> +#> 5 0033s000012Nd6FAAS jennyw@gmail.com

    Describe

    -

    The RForcecom package has the function rforcecom.getObjectDescription() which returns a data.frame with one row per field on an object. The same function in {salesforcer} is named sf_describe_object_fields() and also has better printing and datatype casting by using tibbles.

    +

    The {RForcecom} package has the function rforcecom.getObjectDescription() which returns a data.frame with one row per field on an object. The same function in {salesforcer} is named sf_describe_object_fields() and also has better printing and datatype casting by using tibbles.

    # the RForcecom way
     result1 <- RForcecom::rforcecom.getObjectDescription(session, objectName='Account')
     
    @@ -266,7 +266,7 @@ 

    # the better way in salesforcer to get object fields result3 <- salesforcer::sf_describe_object_fields('Account') result3 -#> # A tibble: 69 x 39 +#> # A tibble: 68 x 39 #> aggregatable aiPredictionFie… autoNumber byteLength calculated caseSensitive #> <chr> <chr> <chr> <chr> <chr> <chr> #> 1 true false false 18 false false @@ -274,7 +274,7 @@

    #> 3 true false false 18 false false #> 4 true false false 765 false false #> 5 true false false 120 false false -#> # … with 64 more rows, and 33 more variables: compoundFieldName <chr>, +#> # … with 63 more rows, and 33 more variables: compoundFieldName <chr>, #> # createable <chr>, custom <chr>, defaultedOnCreate <chr>, #> # defaultValue <list>, deprecatedAndHidden <chr>, digits <chr>, #> # externalId <chr>, extraTypeInfo <chr>, filterable <chr>, groupable <chr>, @@ -284,7 +284,7 @@

    #> # queryByDistance <chr>, referenceTo <chr>, relationshipName <chr>, #> # restrictedPicklist <chr>, scale <chr>, searchPrefilterable <chr>, #> # soapType <chr>, sortable <chr>, type <chr>, unique <chr>, updateable <chr>

    -

    In the future more features will be migrated from RForcecom to make the transition as seamless as possible.

    +

    In the future more features will be migrated from {RForcecom} to make the transition as seamless as possible.

    diff --git a/docs/articles/transitioning-from-RForcecom_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/transitioning-from-RForcecom_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6..00000000 --- a/docs/articles/transitioning-from-RForcecom_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/transitioning-from-RForcecom_files/header-attrs-2.3/header-attrs.js b/docs/articles/transitioning-from-RForcecom_files/header-attrs-2.3/header-attrs.js new file mode 100644 index 00000000..dd57d92e --- /dev/null +++ b/docs/articles/transitioning-from-RForcecom_files/header-attrs-2.3/header-attrs.js @@ -0,0 +1,12 @@ +// Pandoc 2.9 adds attributes on both header and div. We remove the former (to +// be compatible with the behavior of Pandoc < 2.8). +document.addEventListener('DOMContentLoaded', function(e) { + var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); + var i, h, a; + for (i = 0; i < hs.length; i++) { + h = hs[i]; + if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 + a = h.attributes; + while (a.length > 0) h.removeAttribute(a[0].name); + } +}); diff --git a/docs/articles/working-with-attachments.html b/docs/articles/working-with-attachments.html index 49592fb5..2c66665c 100644 --- a/docs/articles/working-with-attachments.html +++ b/docs/articles/working-with-attachments.html @@ -46,7 +46,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -126,15 +126,15 @@ -
    +
    @@ -145,8 +145,7 @@

    2020-06-07

    Attachments in Salesforce

    Almost all records in Salesforce support attachments. Attachments are just blob data storage for an associated ParentId. A ParentId is the 18-character Salesforcer Id of the record that the attachment belongs to. To get started creating and updating attachments, first, load the {salesforcer} and {dplyr} packages and login, if needed.

    -
    library(dplyr)
    -library(here)
    +
    library(dplyr, warn.conflicts = FALSE)
     library(salesforcer)
     sf_auth()

    The Attachment data, for example, the attachment’s Id, ParentId, Name, Body, ModifiedDate, and other attributes are stored in the Attachment object, a Standard Object in Salesforce.

    @@ -160,7 +159,7 @@

  • Uploading large batches of files using the Bulk API, which zips the files before upload
  • Uploading local files as Attachments (SOAP and REST)

    -

    When uploading an attachment stored locally (i.e. on your computer), you can provide an absolute or relative path to the current working directory. If the Name column is omitted, then the name of the attachment as it appears in Salesforce will be the same as the base file name and extension. For example, if the path provided is “/Documents/attachments/doc1.pdf”, then the Name field will be set to “doc1.pdf”. In the sample code below we are leveraging the here package to consistently create relative paths. Although, this is not required, it is encouraged to increase the portability of your code.

    +

    When uploading an attachment stored locally (i.e. on your computer), you can provide an absolute or relative path to the current working directory. If the Name column is omitted, then the name of the attachment as it appears in Salesforce will be the same as the base file name and extension. For example, if the path provided is “/Documents/attachments/doc1.pdf”, then the Name field will be set to “doc1.pdf”.

    In the example below, we upload three attachments to two different parent records. Note: Make sure to replace the paths and ParentIds in the example below with file paths that exist on your local machine and Ids of records in your Salesforce org.

    # define the ParentIds where the attachments will be shown in Salesforce
     parent_record_id1 <- "0016A0000035mJ4"
    @@ -188,11 +187,11 @@ 

    #> # A tibble: 6 x 2 #> id success #> <chr> <lgl> -#> 1 00P3s00000ZKqJuEAL TRUE -#> 2 00P3s00000ZKqGCEA1 TRUE -#> 3 00P3s00000ZKqFSEA1 TRUE -#> 4 00P3s00000ZKqM7EAL TRUE -#> 5 00P3s00000ZKqMCEA1 TRUE +#> 1 00P3s00000ZOz1HEAT TRUE +#> 2 00P3s00000ZOz2REAT TRUE +#> 3 00P3s00000ZOz2KEAT TRUE +#> 4 00P3s00000ZOz2WEAT TRUE +#> 5 00P3s00000ZOz2bEAD TRUE #> # … with 1 more row

    @@ -208,11 +207,11 @@

    #> # A tibble: 6 x 4 #> Id Body Name ParentId #> <chr> <chr> <chr> <chr> -#> 1 00P3s00000ZK… /services/data/v48.0/sobjects/Attachmen… old-logo… 0016A0000035… -#> 2 00P3s00000ZK… /services/data/v48.0/sobjects/Attachmen… logo.png 0016A0000035… -#> 3 00P3s00000ZK… /services/data/v48.0/sobjects/Attachmen… cloud.png 0016A0000035… -#> 4 00P3s00000ZK… /services/data/v48.0/sobjects/Attachmen… logo.png 0016A0000035… -#> 5 00P3s00000ZK… /services/data/v48.0/sobjects/Attachmen… old-logo… 0016A0000035… +#> 1 00P3s00000ZO… /services/data/v48.0/sobjects/Attachmen… logo.png 0016A0000035… +#> 2 00P3s00000ZO… /services/data/v48.0/sobjects/Attachmen… old-logo… 0016A0000035… +#> 3 00P3s00000ZO… /services/data/v48.0/sobjects/Attachmen… cloud.png 0016A0000035… +#> 4 00P3s00000ZO… /services/data/v48.0/sobjects/Attachmen… old-logo… 0016A0000035… +#> 5 00P3s00000ZO… /services/data/v48.0/sobjects/Attachmen… logo.png 0016A0000035… #> # … with 1 more row

    Before downloading the attachments using the Body it is important to consider whether the attachment names are repeated or duplicates. If so, then the attachments with the same exact name will be overwritten on the local filesystem as they are downloaded. To avoid this problem there are two common strategies:

      @@ -236,45 +235,78 @@

      # download all of the attachments for a single ParentId record to their own folder download_result <- mapply(sf_download_attachment, - queried_attachments$Body, - queried_attachments$Name, - queried_attachments$Path) + body = queried_attachments$Body, + name = queried_attachments$Name, + path = queried_attachments$Path) download_result -#> /services/data/v48.0/sobjects/Attachment/00P3s00000ZKqFSEA1/Body -#> TRUE -#> /services/data/v48.0/sobjects/Attachment/00P3s00000ZKqGCEA1/Body -#> TRUE -#> /services/data/v48.0/sobjects/Attachment/00P3s00000ZKqJuEAL/Body -#> TRUE -#> /services/data/v48.0/sobjects/Attachment/00P3s00000ZKqMCEA1/Body -#> TRUE -#> /services/data/v48.0/sobjects/Attachment/00P3s00000ZKqMHEA1/Body -#> TRUE -#> /services/data/v48.0/sobjects/Attachment/00P3s00000ZKqM7EAL/Body -#> TRUE

    -

    Uploading large batches using the Bulk API

    -

    The SOAP and REST APIs are good for working with a few attachments at a time. However, the Bulk API can be invoked using api_type=“Bulk 1.0” to automatically take a data.frame or tbl_df of Attachment field data and create a ZIP file with CSV manifest that is required by that API to upload In the example above we downloaded the 3 attachments each belonging to 2 different parent records. Assuming that I have a directory on my computer

    -
    # create the attachment metadata required (Name, Body, ParentId)
    +#>                               /services/data/v48.0/sobjects/Attachment/00P3s00000ZOz2REAT/Body 
    +#>     "/var/folders/s2/1mxmzrg52tx7l0pg8lq1320w0000gn/T//RtmpQDoLOc/0016A0000035mJ4QAI/logo.png" 
    +#>                               /services/data/v48.0/sobjects/Attachment/00P3s00000ZOz2KEAT/Body 
    +#> "/var/folders/s2/1mxmzrg52tx7l0pg8lq1320w0000gn/T//RtmpQDoLOc/0016A0000035mJ4QAI/old-logo.png" 
    +#>                               /services/data/v48.0/sobjects/Attachment/00P3s00000ZOz1HEAT/Body 
    +#>    "/var/folders/s2/1mxmzrg52tx7l0pg8lq1320w0000gn/T//RtmpQDoLOc/0016A0000035mJ4QAI/cloud.png" 
    +#>                               /services/data/v48.0/sobjects/Attachment/00P3s00000ZOz2gEAD/Body 
    +#> "/var/folders/s2/1mxmzrg52tx7l0pg8lq1320w0000gn/T//RtmpQDoLOc/0016A0000035mJ5QAI/old-logo.png" 
    +#>                               /services/data/v48.0/sobjects/Attachment/00P3s00000ZOz2bEAD/Body 
    +#>     "/var/folders/s2/1mxmzrg52tx7l0pg8lq1320w0000gn/T//RtmpQDoLOc/0016A0000035mJ5QAI/logo.png" 
    +#>                               /services/data/v48.0/sobjects/Attachment/00P3s00000ZOz2WEAT/Body 
    +#>    "/var/folders/s2/1mxmzrg52tx7l0pg8lq1320w0000gn/T//RtmpQDoLOc/0016A0000035mJ5QAI/cloud.png"
    +
    +
    +

    +Updating Attachments

    +

    Once an Attachment record is created, you are still able to update the content and metadata (Name, IsPrivate, and OwnerId) for the record. The sf_update_attachment() function works just like sf_update() except that you will need to include the Body column where the content of the attachment is help. NOTE: If you just want to update the metadata and not the Attachment content itself, you can simply use sf_update() to modify fields other than the Body field on the record.

    +

    The example below demonstrates how to add an attachment to a record, then download it, zip it, re-upload to the record in order to save disk space in your Org.

    +
    # upload a PDF to a particular record as an Attachment
    +file_path <- system.file("extdata",
    +                         "data-wrangling-cheatsheet.pdf",
    +                         package = "salesforcer")
    +parent_record_id <- "0036A000002C6MmQAK" # replace with your own ParentId!
    +attachment_details <- tibble(Body = file_path, ParentId = parent_record_id)
    +create_result <- sf_create_attachment(attachment_details)
    +
    +# download, zip, and re-upload the PDF
    +pdf_path <- sf_download_attachment(sf_id = create_result$id[1])
    +zipped_path <- paste0(pdf_path, ".zip")
    +zip(zipped_path, pdf_path, flags = "-qq") # quiet zipping messages
    +attachment_details <- tibble(Id = create_result$id, Body = zipped_path)
    +sf_update_attachment(attachment_details)
    +#> # A tibble: 1 x 2
    +#>   id                 success
    +#>   <chr>              <lgl>  
    +#> 1 00P3s00000ZOz2lEAD TRUE
    +

    There is a function sf_delete_attachment(), which simply wraps sf_delete() so feel free to use for clarity in your code that you’re working with attachments use sf_delete().

    +
    sf_delete_attachment(ids = create_result$id)
    +#> # A tibble: 1 x 2
    +#>   id                 success
    +#>   <chr>              <lgl>  
    +#> 1 00P3s00000ZOz2lEAD TRUE
    +# sf_delete(ids = create_result$id) # would also work
    +

    Uploading large batches of attachments using the Bulk API

    +

    The SOAP and REST APIs are good for working with a few attachments at a time. However, the Bulk API can be invoked using api_type=“Bulk 1.0” to automatically take a data.frame or tbl_df of Attachment field data and create a ZIP file with CSV manifest that is required by that API to upload. In the example above, we downloaded the three attachments each belonging to two different parent records. Assuming that I have run that code and the files are in that my computer I can demonstrate that all of them can be uploaded at once using the Bulk 1.0 API.

    +
    # create the attachment metadata required (Name, Body, ParentId)
     attachment_details <- queried_attachments %>%
       mutate(Body = file.path(Path, Name)) %>%
       select(Name, Body, ParentId)
    -
    result <- sf_create_attachment(attachment_details, api_type="Bulk 1.0")
    +
    result <- sf_create_attachment(attachment_details, api_type="Bulk 1.0")
     result
     #> # A tibble: 6 x 4
     #>   Id                 Success Created Error
     #>   <chr>              <lgl>   <lgl>   <lgl>
    -#> 1 00P3s00000ZKqMMEA1 TRUE    TRUE    NA   
    -#> 2 00P3s00000ZKqMNEA1 TRUE    TRUE    NA   
    -#> 3 00P3s00000ZKqMOEA1 TRUE    TRUE    NA   
    -#> 4 00P3s00000ZKqMPEA1 TRUE    TRUE    NA   
    -#> 5 00P3s00000ZKqMQEA1 TRUE    TRUE    NA   
    +#> 1 00P3s00000ZOz2qEAD TRUE    TRUE    NA   
    +#> 2 00P3s00000ZOz2rEAD TRUE    TRUE    NA   
    +#> 3 00P3s00000ZOz2sEAD TRUE    TRUE    NA   
    +#> 4 00P3s00000ZOz2tEAD TRUE    TRUE    NA   
    +#> 5 00P3s00000ZOz2uEAD TRUE    TRUE    NA   
     #> # … with 1 more row
    +

    NOTE: As of v48.0 (Spring ’20), it does not appear that the Bulk 2.0 API supports working with Attachments, so the Bulk 1.0 API must be used for bulk functionality.

    +

    Finally, you are able to update Attachments with the Bulk API just as shown above in the REST/SOAP API examples.

    Extending to Documents and Other Blob Data

    The commands for working with Attachments also work for uploading documents and other blob data as well. Documents are just like Attachments in Salesforce except instead of having an associated ParentId they have an associated FolderId where the blob will be associated with upon creation. Here is a brief example of uploading a PDF (“Document”) to a Folder

    -
    # the function supports inserting all types of blob content, just update the 
    +
    # the function supports inserting all types of blob content, just update the 
     # object_name argument to add the PDF as a Document instead of an Attachment
     document_details <- tibble(Name = "Data Wrangling Cheatsheet - Test 1",
                                Description = "RStudio cheatsheet covering dplyr and tidyr.",
    @@ -288,9 +320,9 @@ 

    #> # A tibble: 1 x 2 #> id success #> <chr> <lgl> -#> 1 0153s000001gYu4AAE TRUE

    +#> 1 0153s000001w0T9AAI TRUE

    With Documents, users are also able to save storage by specifying a Url instead of a a file path where the Body content is stored locally. Specifying the Url field will reference the URL instead of uploading into the Salesforce org, thereby saving space if limited in your organization.

    -
    cheatsheet_url <- "https://rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf"
    +
    cheatsheet_url <- "https://rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf"
     document_details <- tibble(Name = "Data Wrangling Cheatsheet - Test 2",
                                Description = "RStudio cheatsheet covering dplyr and tidyr.",
                                Url = cheatsheet_url,
    @@ -301,7 +333,7 @@ 

    #> # A tibble: 1 x 2 #> id success #> <chr> <lgl> -#> 1 0153s000001gYu9AAE TRUE

    +#> 1 0153s000001w0TEAAY TRUE
    @@ -126,7 +126,7 @@ -
    +
    @@ -145,7 +145,7 @@

    2020-07-12

    Using the Bulk API

    First, load the {salesforcer} and {dplyr} packages and login, if needed.

    -
    suppressWarnings(suppressMessages(library(dplyr)))
    +
    library(dplyr, warn.conflicts = FALSE)
     library(salesforcer)
     sf_auth()

    For really large inserts, updates, deletes, upserts, and queries you can just add api_type = "Bulk 1.0" to most functions to get the benefits of using the Bulk API instead of the SOAP or REST APIs. The change you have to make from using the REST API to the Bulk 1.0 API as simple as adding api_type="Bulk 1.0" to your function arguments. First, let’s build a tbl_df with two new records to be created.

    @@ -163,8 +163,8 @@

    #> # A tibble: 2 x 2 #> id success #> <chr> <lgl> -#> 1 0033s000013YBUaAAO TRUE -#> 2 0033s000013YBUbAAO TRUE +#> 1 0033s0000149YlHAAU TRUE +#> 2 0033s0000149YlIAAU TRUE # Bulk bulk_created_records <- sf_create(new_contacts[3:4,], @@ -174,8 +174,8 @@

    #> # A tibble: 2 x 4 #> Id Success Created Error #> <chr> <lgl> <lgl> <lgl> -#> 1 0033s000013YBUuAAO TRUE TRUE NA -#> 2 0033s000013YBUvAAO TRUE TRUE NA

    +#> 1 0033s0000149YlfAAE TRUE TRUE NA +#> 2 0033s0000149YlgAAE TRUE TRUE NA

    @@ -187,8 +187,8 @@

    #> # A tibble: 2 x 4 #> Id Success Created Error #> <chr> <lgl> <lgl> <lgl> -#> 1 0033s000013YBUwAAO TRUE TRUE NA -#> 2 0033s000013YBUxAAO TRUE TRUE NA +#> 1 0033s0000149YlkAAE TRUE TRUE NA +#> 2 0033s0000149YllAAE TRUE TRUE NA # query bulk my_soql <- sprintf("SELECT Id, @@ -203,8 +203,8 @@

    #> # A tibble: 2 x 3 #> Id FirstName LastName #> <chr> <chr> <chr> -#> 1 0033s000013YBUwAAO Test Contact-Create-1 -#> 2 0033s000013YBUxAAO Test Contact-Create-2 +#> 1 0033s0000149YlkAAE Test Contact-Create-1 +#> 2 0033s0000149YllAAE Test Contact-Create-2 # delete bulk deleted_records <- sf_delete(queried_records$Id, object_name=object, api_type="Bulk 1.0") @@ -212,8 +212,8 @@

    #> # A tibble: 2 x 4 #> Id Success Created Error #> <chr> <lgl> <lgl> <lgl> -#> 1 0033s000013YBUwAAO TRUE FALSE NA -#> 2 0033s000013YBUxAAO TRUE FALSE NA

    +#> 1 0033s0000149YlkAAE TRUE FALSE NA +#> 2 0033s0000149YllAAE TRUE FALSE NA

    @@ -249,11 +249,11 @@

    #> # A tibble: 10 x 4 #> Id Success Created Error #> <chr> <lgl> <lgl> <lgl> -#> 1 0033s000013YBVEAA4 TRUE TRUE NA -#> 2 0033s000013YBVFAA4 TRUE TRUE NA -#> 3 0033s000013YBVGAA4 TRUE TRUE NA -#> 4 0033s000013YBVHAA4 TRUE TRUE NA -#> 5 0033s000013YBVIAA4 TRUE TRUE NA +#> 1 0033s0000149YluAAE TRUE TRUE NA +#> 2 0033s0000149YlvAAE TRUE TRUE NA +#> 3 0033s0000149YlwAAE TRUE TRUE NA +#> 4 0033s0000149YlxAAE TRUE TRUE NA +#> 5 0033s0000149YlyAAE TRUE TRUE NA #> # … with 5 more rows created_records_v2 <- sf_create(new_contacts[11:20,], @@ -263,11 +263,11 @@

    #> # A tibble: 10 x 7 #> sf__Id sf__Created sf__Error FirstName LastName My_External_Id_… #> <chr> <lgl> <lgl> <chr> <chr> <chr> -#> 1 0033s… TRUE NA Test Contact… Bulk-46000-k -#> 2 0033s… TRUE NA Test Contact… Bulk-46000-l -#> 3 0033s… TRUE NA Test Contact… Bulk-46000-m -#> 4 0033s… TRUE NA Test Contact… Bulk-46000-n -#> 5 0033s… TRUE NA Test Contact… Bulk-46000-o +#> 1 0033s… TRUE NA Test Contact… Bulk-62976-k +#> 2 0033s… TRUE NA Test Contact… Bulk-62976-l +#> 3 0033s… TRUE NA Test Contact… Bulk-62976-m +#> 4 0033s… TRUE NA Test Contact… Bulk-62976-n +#> 5 0033s… TRUE NA Test Contact… Bulk-62976-o #> # … with 5 more rows, and 1 more variable: test_number__c <dbl>

    @@ -281,13 +281,14 @@

    res <- microbenchmark::microbenchmark( bulk1_query(), bulk2_query(), - times=8 + times=8, + unit = "s" ) res #> Unit: seconds -#> expr min lq mean median uq max neval -#> bulk1_query() 8.195603 8.398375 8.729189 8.581101 9.044724 9.589512 8 -#> bulk2_query() 6.879304 6.943748 8.640519 7.046924 8.683199 16.897109 8 +#> expr min lq mean median uq max neval +#> bulk1_query() 8.465201 8.650781 8.908351 8.926604 9.183635 9.279567 8 +#> bulk2_query() 7.062541 7.094679 7.403501 7.401601 7.620701 7.931506 8 suppressWarnings(suppressMessages( ggplot2::autoplot(res) + diff --git a/docs/articles/working-with-bulk-apis_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/working-with-bulk-apis_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6..00000000 --- a/docs/articles/working-with-bulk-apis_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/working-with-bulk-apis_files/figure-html/unnamed-chunk-7-1.png b/docs/articles/working-with-bulk-apis_files/figure-html/unnamed-chunk-7-1.png index 3d81033dcd528ef49266d51dc762b7d09f6c60a6..cdcaf52e75ea64effb521b8f65750cba60b324e3 100644 GIT binary patch literal 62163 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 KtH01&0WPwQUnV1&t=T4~h2U9><;UJ;A; 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 T^@gw`4*quU+~dUCPN4r6VbMZa literal 62746 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 xc80vF%7Vs2(%fvtf4sjGwvp%je; :first-child"); + var i, h, a; + for (i = 0; i < hs.length; i++) { + h = hs[i]; + if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 + a = h.attributes; + while (a.length > 0) h.removeAttribute(a[0].name); + } +}); diff --git a/docs/articles/working-with-metadata.html b/docs/articles/working-with-metadata.html index 3a028ed1..73a8c484 100644 --- a/docs/articles/working-with-metadata.html +++ b/docs/articles/working-with-metadata.html @@ -46,7 +46,7 @@ salesforcer - 0.2.0 + 0.2.1

    @@ -126,7 +126,7 @@ -
    +
    @@ -146,8 +146,8 @@

    2019-07-26

    Retrieving Object Metadata

    One common use case for the Metadata API is retrieving information about an object (fields, permissions, etc.). First, load the {salesforcer}, {dplyr}, and {purrr} packages and login, if needed.

    -
    suppressWarnings(suppressMessages(library(dplyr)))
    -suppressWarnings(suppressMessages(library(purrr)))
    +
    library(dplyr, warn.conflicts = FALSE)
    +library(purrr)
     library(salesforcer)
     sf_auth()

    You can use the sf_read_metadata() function to return a list of objects and their metadata. In the example below we retrieve the metadata for the Account and Contact objects. Note that the metadata_type argument is “CustomObject”. Standard Objects are an implementation of CustomObjects, so they are returned using that metadata type.

    @@ -191,7 +191,7 @@

    The data is returned as a list because object definitions are highly nested representations. You may notice that we are missing some really specific details, such as, the picklist values of a field with type “Picklist”. You can get that information using
    sf_describe_object_fields(). Here is an example using sf_describe_object_fields() where we get a tbl_df with one row for each field on the Account object:

    acct_fields <- sf_describe_object_fields("Account")
     acct_fields %>% select(name, label, length, soapType, type)
    -#> # A tibble: 69 x 5
    +#> # A tibble: 68 x 5
     #>   name           label            length soapType    type     
     #>   <chr>          <chr>            <chr>  <chr>       <chr>    
     #> 1 Id             Account ID       18     tns:ID      id       
    @@ -199,7 +199,7 @@ 

    #> 3 MasterRecordId Master Record ID 18 tns:ID reference #> 4 Name Account Name 255 xsd:string string #> 5 Type Account Type 40 xsd:string picklist -#> # … with 64 more rows +#> # … with 63 more rows # show the picklist selection options for the Account Type field acct_fields %>% diff --git a/docs/articles/working-with-metadata_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/working-with-metadata_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6..00000000 --- a/docs/articles/working-with-metadata_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/working-with-metadata_files/header-attrs-2.3/header-attrs.js b/docs/articles/working-with-metadata_files/header-attrs-2.3/header-attrs.js new file mode 100644 index 00000000..dd57d92e --- /dev/null +++ b/docs/articles/working-with-metadata_files/header-attrs-2.3/header-attrs.js @@ -0,0 +1,12 @@ +// Pandoc 2.9 adds attributes on both header and div. We remove the former (to +// be compatible with the behavior of Pandoc < 2.8). +document.addEventListener('DOMContentLoaded', function(e) { + var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); + var i, h, a; + for (i = 0; i < hs.length; i++) { + h = hs[i]; + if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 + a = h.attributes; + while (a.length > 0) h.removeAttribute(a[0].name); + } +}); diff --git a/docs/articles/working-with-reports.html b/docs/articles/working-with-reports.html index c42fc07d..a4a6e517 100644 --- a/docs/articles/working-with-reports.html +++ b/docs/articles/working-with-reports.html @@ -46,7 +46,7 @@ salesforcer - 0.2.0 + 0.2.1

    @@ -126,7 +126,7 @@ -
    +
    @@ -187,7 +187,7 @@

    #> 5 0036A000002… John 23 Steven Mortimer 0016A000003… #> # … with 9 more rows, and 3 more variables: `Account Name` <chr>, `Billing #> # City` <chr>, `Account Owner` <chr>

    -

    Note that the sf_run_report() function will, by default, run the report asynchronously. This means that a report instance will be requested and then the function will wait to retrieve the results. The advantage to using an asynchronous report is that the results of such a report are stored for 24 hours and can be retrieved again saving CPU resources, if needed. A more in-depth discussion on synchronous vs. asynchronous reports is available here https://developer.salesforce.com/docs/atlas.en-us.api_analytics.meta/api_analytics/sforce_analytics_rest_api_get_reportdata.htm. However, for reports with a relatively small number of records a synchronous report may be faster without having to do the round trip of creating then querying a report instance.

    +

    Note that the sf_run_report() function will, by default, run the report asynchronously. This means that a report instance will be requested and then the function will wait to retrieve the results. The advantage to using an asynchronous report is that the results of such a report are stored for 24 hours and can be retrieved again saving CPU resources, if needed. A more in-depth discussion on synchronous vs. asynchronous reports is available here https://developer.salesforce.com/docs/atlas.en-us.api_analytics.meta/api_analytics/sforce_analytics_rest_api_get_reportdata.htm. However, for reports with a relatively small number of records a synchronous report may be faster without having to do the round trip of creating then querying a report instance.

    @@ -231,11 +231,11 @@

    #> # A tibble: 5 x 8 #> `Contact ID` `First Name` `test number` `Contact Owner` `Account ID` #> <chr> <chr> <dbl> <chr> <chr> -#> 1 0036A000002… Jack 99 Steven Mortimer 0016A000003… -#> 2 0036A000002… John 23 Steven Mortimer 0016A000003… -#> 3 0036A000002… Sean NA Steven Mortimer 0016A000003… -#> 4 0036A000002… Tim NA Steven Mortimer 0016A000003… -#> 5 0036A000002… Rose NA Steven Mortimer 0016A000003… +#> 1 0033s000012… KEEP 1000 Steven Mortimer 0013s00000z… +#> 2 0033s000012… KEEP 1000 Steven Mortimer 0013s00000z… +#> 3 0033s000012… KEEP 1000 Steven Mortimer 0013s00000z… +#> 4 0033s000012… KEEP 1000 Steven Mortimer 0013s00000z… +#> 5 0033s000012… KEEP 1000 Steven Mortimer 0013s00000z… #> # … with 3 more variables: `Account Name` <chr>, `Billing City` <chr>, `Account #> # Owner` <chr>

    I was able to determine some of the potential ways to filter by first reviewing the reportFilters element in the existing report metadata and also reviewing the list of report filter operators.

    @@ -279,13 +279,13 @@

    Second, Salesforce has a few API endpoints that tell you the fields on the report or the report type, more generally, and all the ways you can declare a filter on a particular field type and. The reportTypeMetadata element returned on the report description also has detailed information on how to filter the report. For example, it already contains the start and end dates that would be applied when using the “LAST_MONTH” filter value on a date field.

    report_details$reportTypeMetadata$standardDateFilterDurationGroups[[6]]$standardDateFilterDurations[[1]]
     #> $endDate
    -#> [1] "2020-06-30"
    +#> [1] "2020-07-31"
     #> 
     #> $label
     #> [1] "Last Month"
     #> 
     #> $startDate
    -#> [1] "2020-06-01"
    +#> [1] "2020-07-01"
     #> 
     #> $value
     #> [1] "LAST_MONTH"
    @@ -390,7 +390,7 @@

  • Double check Salesforce’s Reports and Dashboards REST API Developer Guide to see whether if your report type would be supported or limited in some way.

  • -
  • Review query unit tests at: https://github.com/StevenMMortimer/salesforcer/blob/main/tests/testthat/test-reporty.R. These unit tests were written to cover a variety of use cases and to track any changes made between newly released versions of the Salesforce API (typically 4 each year). These tests are an excellent source of examples that may be helpful in troubleshooting your own case.

  • +
  • Review report unit tests at: https://github.com/StevenMMortimer/salesforcer/blob/main/tests/testthat/test-report.R. These unit tests were written to cover a variety of use cases and to track any changes made between newly released versions of the Salesforce API (typically 4 each year). These tests are an excellent source of examples that may be helpful in troubleshooting your own case.

  • Roll up your sleeves and dive into the source code for the {salesforcer} package. The main scripts to review are:

  • diff --git a/docs/index.html b/docs/index.html index 505e1c48..0984b6c2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -54,7 +54,7 @@ salesforcer - 0.2.0.9999 + 0.2.1
    @@ -170,6 +170,11 @@
  • Recover (sf_undelete()) or delete from the Recycle Bin (sf_empty_recycle_bin()) and list ids of records deleted (sf_get_deleted()) or updated (sf_get_updated()) within a specific timeframe
  • Passing API call control parameters such as, “All or None”, “Duplicate Rule”, “Assignment Rule” execution and many more!
  • +

    CAUTION: The most recent release, {salesforcer 0.2.1}, requires {dplyr 1.0.0} because {dplyr 1.0.1} introduced a bug in bind_rows() with how it binds lists where the list elements have differing lengths. This is documented in tidyverse/dplyr#5417 and r-lib/vctrs#1073. The timeline for a fix is unknown as of August 2020, but a new version of {salesforcer} (0.2.2) will be released immediately following the {dplyr} fix.

    +

    You can install the older version of {dplyr} using the following command:

    +
    # remove.packages("dplyr")
    +# install.packages("remotes")
    +remotes::install_version("dplyr", "1.0.0")

    Table of Contents

    @@ -195,18 +200,18 @@

    Installation

    -
    # install the current CRAN version (0.2.0)
    +
    # install the current CRAN version (0.2.1)
     install.packages("salesforcer")
     
     # or get the development version on GitHub
    -# install.packages("devtools")
    -devtools::install_github("StevenMMortimer/salesforcer")
    +# install.packages("remotes") +remotes::install_github("StevenMMortimer/salesforcer")

    If you encounter an issue while using this package, please file a minimal reproducible example on GitHub.

    Vignettes

    -

    The README below outlines the basic package functionality. For more information please feel free to browse the pkgdown site at https://StevenMMortimer.github.io/salesforcer which contains the following vignettes:

    +

    The README below outlines the basic package functionality for more detailed notes on how to utilize the features of this package consider reading the following vignettes:

    • Getting Started
    • Supported Queries
    • @@ -230,7 +235,7 @@

    • Basic Username-Password
    • It is recommended to use OAuth 2.0 so that passwords do not have to be shared or embedded within scripts. User credentials will be stored in locally cached file entitled “.httr-oauth-salesforcer” in the current working directory. Also, note that if you use OAuth 2.0 authentication then the package will automatically refresh it so you will not have to call sf_auth() during each session if you have a cached “.httr-oauth-salesforcer” file in the working directory. The cache file is named that way to not conflict with the “.httr-oauth” files created by other packages.

      -
      library(dplyr, warn.conflicts = FALSE)
      +
      library(dplyr, warn.conflicts = FALSE)
       library(salesforcer)
       
       # Using OAuth 2.0 authentication
      @@ -241,7 +246,7 @@ 

      password = "{PASSWORD_HERE}", security_token = "{SECURITY_TOKEN_HERE}")

      After logging in with sf_auth(), you can check your connectivity by looking at the information returned about the current user. It should be information about you!

      -
      # pull down information of person logged in
      +
      # pull down information of person logged in
       # it's a simple easy call to get started 
       # and confirm a connection to the APIs
       user_info <- sf_user_info()
      @@ -254,7 +259,7 @@ 

      Create

      Salesforce has objects and those objects contain records. One default object is the “Contact” object. This example shows how to create two records in the Contact object.

      -
      n <- 2
      +
      n <- 2
       new_contacts <- tibble(FirstName = rep("Test", n),
                              LastName = paste0("Contact-Create-", 1:n))
       created_records <- sf_create(new_contacts, object_name = "Contact")
      @@ -262,14 +267,14 @@ 

      #> # A tibble: 2 x 2 #> id success #> <chr> <lgl> -#> 1 0033s000013Y9dcAAC TRUE -#> 2 0033s000013Y9ddAAC TRUE

      +#> 1 0033s0000149YezAAE TRUE +#> 2 0033s0000149Yf0AAE TRUE

      Query

      Salesforce has proprietary form of SQL called SOQL (Salesforce Object Query Language). SOQL is a powerful tool that allows you to return the attributes of records on almost any object in Salesforce including Accounts, Contacts, Tasks, Opportunities, even Attachments! Below is an example where we grab the data we just created including Account object information for which the Contact record is associated with.

      -
      my_soql <- sprintf("SELECT Id, 
      +
      my_soql <- sprintf("SELECT Id, 
                                  Account.Name, 
                                  FirstName, 
                                  LastName 
      @@ -281,15 +286,15 @@ 

      #> # A tibble: 2 x 3 #> Id FirstName LastName #> <chr> <chr> <chr> -#> 1 0033s000013Y9dcAAC Test Contact-Create-1 -#> 2 0033s000013Y9ddAAC Test Contact-Create-2

      -

      You’ll notice that the "Account.Name" column does not appear in the results. This is because the SOAP and REST APIs do not return any Account information if it does not exist on the record and there is no reliable way to extract and rebuild the empty columns based on the query string. If there were Account information, an additional column titled "Account.Name" would appear in the results. Note, that the Bulk 1.0 and Bulk 2.0 APIs will return "Account.Name" as a column of all NA values for this query because they return results differently.

      +#> 1 0033s0000149YezAAE Test Contact-Create-1 +#> 2 0033s0000149Yf0AAE Test Contact-Create-2
      +

      NOTE: In the example above, you’ll notice that the "Account.Name" column does not appear in the results. This is because the SOAP and REST APIs only return an empty Account object for the record if there is no relationship to an account ( see #78). There is no reliable way to extract and rebuild the empty columns based on the query string. If there were Account information, an additional column titled "Account.Name" would appear in the results. Note, that the Bulk 1.0 and Bulk 2.0 APIs will return "Account.Name" as a column of all NA values for this query because they return results differently.

      Update

      After creating records you can update them using sf_update(). Updating a record requires you to pass the Salesforce Id of the record. Salesforce creates a unique 18-character identifier on each record and uses that to know which record to attach the update information you provide. Simply include a field or column in your update dataset called “Id” and the information will be matched. Here is an example where we update each of the records we created earlier with a new first name called “TestTest”.

      -
      # Update some of those records
      +
      # Update some of those records
       queried_records <- queried_records %>%
         mutate(FirstName = "TestTest")
       
      @@ -298,15 +303,15 @@ 

      #> # A tibble: 2 x 2 #> id success #> <chr> <lgl> -#> 1 0033s000013Y9dcAAC TRUE -#> 2 0033s000013Y9ddAAC TRUE

      +#> 1 0033s0000149YezAAE TRUE +#> 2 0033s0000149Yf0AAE TRUE

      Bulk Operations

      For really large operations (inserts, updates, upserts, deletes, and queries) Salesforce provides the Bulk 1.0 and Bulk 2.0 APIs. In order to use the Bulk APIs in {salesforcer} you can just add api_type = "Bulk 1.0" or api_type = "Bulk 2.0" to your functions and the operation will be executed using the Bulk APIs. It’s that simple.

      The benefits of using the Bulk API for larger datasets is that the operation will reduce the number of individual API calls (organization usually have a limit on total calls) and batching the requests in bulk is usually quicker than running thousands of individuals calls when your data is large. Note: the Bulk 2.0 API does NOT guarantee the order of the data submitted is preserved in the output. This means that you must join on other data columns to match up the Ids that are returned in the output with the data you submitted. For this reason, Bulk 2.0 may not be a good solution for creating, updating, or upserting records where you need to keep track of the created Ids. The Bulk 2.0 API would be fine for deleting records where you only need to know which Ids were successfully deleted.

      -
      # create contacts using the Bulk API
      +
      # create contacts using the Bulk API
       n <- 2
       new_contacts <- tibble(FirstName = rep("Test", n),
                              LastName = paste0("Contact-Create-", 1:n))
      @@ -315,8 +320,8 @@ 

      #> # A tibble: 2 x 4 #> Id Success Created Error #> <chr> <lgl> <lgl> <lgl> -#> 1 0033s000013Y9dhAAC TRUE TRUE NA -#> 2 0033s000013Y9diAAC TRUE TRUE NA +#> 1 0033s0000149Yf4AAE TRUE TRUE NA +#> 2 0033s0000149Yf5AAE TRUE TRUE NA # query large recordsets using the Bulk API my_soql <- sprintf("SELECT Id, @@ -331,8 +336,8 @@

      #> # A tibble: 2 x 3 #> Id FirstName LastName #> <chr> <chr> <chr> -#> 1 0033s000013Y9dhAAC Test Contact-Create-1 -#> 2 0033s000013Y9diAAC Test Contact-Create-2 +#> 1 0033s0000149Yf4AAE Test Contact-Create-1 +#> 2 0033s0000149Yf5AAE Test Contact-Create-2 # delete these records using the Bulk 2.0 API deleted_records <- sf_delete(queried_records$Id, "Contact", api_type = "Bulk 2.0") @@ -340,14 +345,14 @@

      #> # A tibble: 2 x 4 #> Id sf__Id sf__Created sf__Error #> <chr> <chr> <lgl> <lgl> -#> 1 0033s000013Y9dhAAC 0033s000013Y9dhAAC FALSE NA -#> 2 0033s000013Y9diAAC 0033s000013Y9diAAC FALSE NA

      +#> 1 0033s0000149Yf4AAE 0033s0000149Yf4AAE FALSE NA +#> 2 0033s0000149Yf5AAE 0033s0000149Yf5AAE FALSE NA

      Using the Metadata API

      Salesforce is a very flexible platform in that it provides the Metadata API for users to create, read, update and delete their entire Salesforce environment from objects to page layouts and more. This makes it very easy to programmatically setup and teardown the Salesforce environment. One common use case for the Metadata API is retrieving information about an object (fields, permissions, etc.). You can use the sf_read_metadata() function to return a list of objects and their metadata. In the example below we retrieve the metadata for the Account and Contact objects. Note that the metadata_type argument is “CustomObject”. Standard Objects are an implementation of CustomObjects, so they are returned using that metadata type.

      -
      read_obj_result <- sf_read_metadata(metadata_type = 'CustomObject',
      +
      read_obj_result <- sf_read_metadata(metadata_type = 'CustomObject',
                                           object_names = c('Account', 'Contact'))
       
       read_obj_result[[1]][c('fullName', 'label', 'sharingModel', 'enableHistory')]
      @@ -385,9 +390,9 @@ 

      #> $fields$type #> [1] "Picklist"

      The data is returned as a list because object definitions are highly nested representations. You may notice that we are missing some really specific details, such as, the picklist values of a field with type “Picklist”. You can get that information using sf_describe_object_fields(). Here is an example using sf_describe_object_fields() where we get a tbl_df with one row for each field on the Account object:

      -
      acct_fields <- sf_describe_object_fields('Account')
      +
      acct_fields <- sf_describe_object_fields('Account')
       acct_fields %>% select(name, label, length, soapType, type)
      -#> # A tibble: 69 x 5
      +#> # A tibble: 68 x 5
       #>   name           label            length soapType    type     
       #>   <chr>          <chr>            <chr>  <chr>       <chr>    
       #> 1 Id             Account ID       18     tns:ID      id       
      @@ -395,7 +400,7 @@ 

      #> 3 MasterRecordId Master Record ID 18 tns:ID reference #> 4 Name Account Name 255 xsd:string string #> 5 Type Account Type 40 xsd:string picklist -#> # … with 64 more rows +#> # … with 63 more rows # show the picklist selection options for the Account Type field acct_fields %>% @@ -485,7 +490,7 @@

      Dev status

    • CRAN Status
    • Lifecycle: Maturing
    • Monthly Downloads
    • -
    • Coverage Status
    • +
    • Coverage Status

    diff --git a/docs/news/index.html b/docs/news/index.html index 6a0a338d..6b4727ef 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -95,7 +95,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -179,24 +179,36 @@
    -
    +

    -salesforcer 0.2.0.9999

    +salesforcer 0.2.1 +
    +

    +Dependencies

    +
      +
    • +CAUTION: This release requires {dplyr 1.0.0} because {dplyr 1.0.1} introduced a bug in bind_rows() with how it binds lists where the list elements have differing lengths. This is documented in tidyverse/dplyr#5417 and r-lib/vctrs#1073. The timeline for a fix is unknown as of Aug 16, 2020. You can install the older version of {dplyr} using the following command:
    • +
    +
    remotes::install_version("dplyr", "1.0.0")
    +

    Features

      -
    • None yet!
    • +
    • Add support for the defaultLimit argument in sf_search() to be able to restrict the number of records from each individual object when searching across one or more objects.
    • +
    • Add support for updating attachments with the sf_update_attachments() function (#79).
    • +
    • Add support for downloading attachments just by its Id. In addition, the sf_download_attachment() function returns the file path of the downloaded content instead of a logical indicating success.

    Bug fixes

      -
    • None yet!
    • +
    • Fix bug introduced in {salesforcer 0.2.0} which could not stack records with errors longer than length 1. The new solution is to always return the errors column as a list, which is coerced to length 1 for the record (#66).
    • +
    • Fix bug in sf_search() that was passing "true"/"false" instead of actual boolean value for the spellCorrection parameter in the POST body.

    @@ -205,11 +217,17 @@

    salesforcer 0.2.0 release

    +
    +

    +Dependencies

    +
      +
    • CAUTION: This release only has automated test coverage on R 4.0.0 or greater. Users should still be able to install and run using R (>= 3.6.0). However, it is recommended to upgrade to R 4.0.0 or greater.
    • +
    +

    Features

      -
    • CAUTION: This release only has automated test coverage on R 4.0.0 or greater. Users should still be able to install and run using R (>= 3.6.0); however, it is recommended to upgrade to R 4.0.0 or greater.

    • Add experimental support for the Reports and Dashboards REST API.

    • Add support for Bulk 2.0 queries that was added in Salesforce version 47.0 (Winter ’20). CAUTION: The Bulk 2.0 API is now the default API when using sf_query_bulk() or sf_run_bulk_query(). Please test prior to upgrading in a production environment where you are running bulk queries.

    • diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 9f3528fb..025b3d43 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -1,4 +1,4 @@ -pandoc: 2.7.3 +pandoc: '2.10' pkgdown: 1.5.1 pkgdown_sha: ~ articles: @@ -10,7 +10,7 @@ articles: working-with-bulk-apis: working-with-bulk-apis.html working-with-metadata: working-with-metadata.html working-with-reports: working-with-reports.html -last_built: 2020-07-21T18:55Z +last_built: 2020-08-22T01:39Z urls: reference: https://stevenmmortimer.github.io/salesforcer/reference article: https://stevenmmortimer.github.io/salesforcer/articles diff --git a/docs/reference/VERB_n.html b/docs/reference/VERB_n.html index d03a07d9..e67c529f 100644 --- a/docs/reference/VERB_n.html +++ b/docs/reference/VERB_n.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/accepted_controls_by_api.html b/docs/reference/accepted_controls_by_api.html index b67d88d1..a4c1f920 100644 --- a/docs/reference/accepted_controls_by_api.html +++ b/docs/reference/accepted_controls_by_api.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/accepted_controls_by_operation.html b/docs/reference/accepted_controls_by_operation.html index 38be3546..f1967dc2 100644 --- a/docs/reference/accepted_controls_by_operation.html +++ b/docs/reference/accepted_controls_by_operation.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    @@ -189,9 +189,9 @@

    Return the Accepted Control Arguments by Operation

    accepted_controls_by_operation(
    -  operation = c("delete", "undelete", "hardDelete", "convertLead", "merge", "insert",
    -    "update", "upsert", "query", "queryall", "retrieve", "resetPassword",
    -    "describeSObjects")
    +  operation = c("create", "insert", "update", "upsert", "delete", "undelete",
    +    "hardDelete", "query", "queryall", "retrieve", "convertLead", "merge",
    +    "describeSObjects", "resetPassword")
     )
    diff --git a/docs/reference/bind_query_resultsets.html b/docs/reference/bind_query_resultsets.html index f370d89b..8b271a1f 100644 --- a/docs/reference/bind_query_resultsets.html +++ b/docs/reference/bind_query_resultsets.html @@ -100,7 +100,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -184,7 +184,7 @@
    diff --git a/docs/reference/build_manifest_xml_from_list.html b/docs/reference/build_manifest_xml_from_list.html index 8561583e..867ebd73 100644 --- a/docs/reference/build_manifest_xml_from_list.html +++ b/docs/reference/build_manifest_xml_from_list.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/build_metadata_xml_from_list.html b/docs/reference/build_metadata_xml_from_list.html index 8ff708f7..2b60f441 100644 --- a/docs/reference/build_metadata_xml_from_list.html +++ b/docs/reference/build_metadata_xml_from_list.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/build_proxy.html b/docs/reference/build_proxy.html index 6b7fa169..591644e4 100644 --- a/docs/reference/build_proxy.html +++ b/docs/reference/build_proxy.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/build_soap_xml_from_list.html b/docs/reference/build_soap_xml_from_list.html index 73c8c629..923b6907 100644 --- a/docs/reference/build_soap_xml_from_list.html +++ b/docs/reference/build_soap_xml_from_list.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/catch_errors.html b/docs/reference/catch_errors.html index 7b7abffc..b2fb4ecd 100644 --- a/docs/reference/catch_errors.html +++ b/docs/reference/catch_errors.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/catch_unknown_api.html b/docs/reference/catch_unknown_api.html index 5dadbc73..228cb5aa 100644 --- a/docs/reference/catch_unknown_api.html +++ b/docs/reference/catch_unknown_api.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/check_and_encode_files.html b/docs/reference/check_and_encode_files.html index 9f138087..1af97acf 100644 --- a/docs/reference/check_and_encode_files.html +++ b/docs/reference/check_and_encode_files.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    @@ -194,6 +194,13 @@

    Check that file paths exist and data is encoded if specified

    Note

    This function is meant to be used internally. Only use when debugging.

    +

    See also

    + +
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/combine_parent_and_child_resultsets.html b/docs/reference/combine_parent_and_child_resultsets.html index 6f0a4f1d..f4850c6f 100644 --- a/docs/reference/combine_parent_and_child_resultsets.html +++ b/docs/reference/combine_parent_and_child_resultsets.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/compact2.html b/docs/reference/compact2.html index 087a0c40..be3240df 100644 --- a/docs/reference/compact2.html +++ b/docs/reference/compact2.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/drop_attributes.html b/docs/reference/drop_attributes.html index 65ed971b..6e44c162 100644 --- a/docs/reference/drop_attributes.html +++ b/docs/reference/drop_attributes.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/drop_attributes_recursively.html b/docs/reference/drop_attributes_recursively.html index 4cdfffe5..5f0ae057 100644 --- a/docs/reference/drop_attributes_recursively.html +++ b/docs/reference/drop_attributes_recursively.html @@ -99,7 +99,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -183,7 +183,7 @@
    diff --git a/docs/reference/drop_empty_recursively.html b/docs/reference/drop_empty_recursively.html index 84265d68..6705b541 100644 --- a/docs/reference/drop_empty_recursively.html +++ b/docs/reference/drop_empty_recursively.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/drop_nested_child_records.html b/docs/reference/drop_nested_child_records.html index 658fe223..7ae10245 100644 --- a/docs/reference/drop_nested_child_records.html +++ b/docs/reference/drop_nested_child_records.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/extract_nested_child_records.html b/docs/reference/extract_nested_child_records.html index 2294f382..b3d19ae4 100644 --- a/docs/reference/extract_nested_child_records.html +++ b/docs/reference/extract_nested_child_records.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/extract_records_from_xml_node.html b/docs/reference/extract_records_from_xml_node.html index 0f89a7df..0194fee5 100644 --- a/docs/reference/extract_records_from_xml_node.html +++ b/docs/reference/extract_records_from_xml_node.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/extract_records_from_xml_nodeset.html b/docs/reference/extract_records_from_xml_nodeset.html index af2c708e..fbb10097 100644 --- a/docs/reference/extract_records_from_xml_nodeset.html +++ b/docs/reference/extract_records_from_xml_nodeset.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/extract_records_from_xml_nodeset_of_records.html b/docs/reference/extract_records_from_xml_nodeset_of_records.html index 077843b7..61094a29 100644 --- a/docs/reference/extract_records_from_xml_nodeset_of_records.html +++ b/docs/reference/extract_records_from_xml_nodeset_of_records.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/filter_valid_controls.html b/docs/reference/filter_valid_controls.html index 0e5fa753..fa883153 100644 --- a/docs/reference/filter_valid_controls.html +++ b/docs/reference/filter_valid_controls.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/flatten_tbl_df.html b/docs/reference/flatten_tbl_df.html index 5eea72db..993660ce 100644 --- a/docs/reference/flatten_tbl_df.html +++ b/docs/reference/flatten_tbl_df.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/format_headers_for_verbose.html b/docs/reference/format_headers_for_verbose.html index 93ea49d8..2c25eb67 100644 --- a/docs/reference/format_headers_for_verbose.html +++ b/docs/reference/format_headers_for_verbose.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/format_report_row.html b/docs/reference/format_report_row.html index 411b3574..397c9b53 100644 --- a/docs/reference/format_report_row.html +++ b/docs/reference/format_report_row.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/get_os.html b/docs/reference/get_os.html index 90d76a78..5ce02dc4 100644 --- a/docs/reference/get_os.html +++ b/docs/reference/get_os.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/guess_object_name_from_soql.html b/docs/reference/guess_object_name_from_soql.html index 53d65a50..ea85c365 100644 --- a/docs/reference/guess_object_name_from_soql.html +++ b/docs/reference/guess_object_name_from_soql.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/index.html b/docs/reference/index.html index 088a3b8f..e3a59722 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -95,7 +95,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -193,7 +193,7 @@

    Reference

    Authentication

    -

    Functions to authenticate

    +

    Function to authenticate to your Salesforce Org.

    @@ -212,7 +212,7 @@

    Query/Search Functions

    -

    Functions to query and search records

    +

    Functions to query and search records.

    @@ -237,7 +237,7 @@

    CRUD Functions

    -

    Functions to create, retrieve, update, and delete records.

    +

    Functions to perform create, retrieve, update, and delete (CRUD) operations on records.

    @@ -253,18 +253,6 @@

    sf_create_attachment()

    - -

    Create Attachments

    - - - -

    sf_download_attachment()

    - -

    Download an Attachment

    - -

    sf_retrieve()

    @@ -306,11 +294,48 @@

    +

    Attachment Functions

    +

    Convenience functions to work with attachments.

    + + + + + + + + + + +

    sf_create_attachment()

    + +

    Create Attachments

    + + + +

    sf_download_attachment()

    + +

    Download an Attachment

    + + + +

    sf_update_attachment()

    + +

    Update Attachments

    + + + +

    sf_delete_attachment()

    + +

    Delete Attachments

    +

    Bulk API Functions

    -

    Convenience functions to perform async CRUD and query operations

    +

    Convenience functions to perform async CRUD and query operations.

    @@ -626,7 +651,7 @@

    Backward Compatibility with RForcecom

    -

    Functions that mirror RForcecom to ease code transitions between salesforcer and RForcecom.

    +

    Functions that mimic {RForcecom} to ease code transitions between {salesforcer} and {RForcecom}.

    diff --git a/docs/reference/is_legit_token.html b/docs/reference/is_legit_token.html index 4d9f3eb4..577e4c27 100644 --- a/docs/reference/is_legit_token.html +++ b/docs/reference/is_legit_token.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1

    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/list_extract_parent_and_child_result.html b/docs/reference/list_extract_parent_and_child_result.html index d42ee271..5c4c6fe6 100644 --- a/docs/reference/list_extract_parent_and_child_result.html +++ b/docs/reference/list_extract_parent_and_child_result.html @@ -100,7 +100,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -184,7 +184,7 @@
    diff --git a/docs/reference/make_analytics_folder_child_operations_url.html b/docs/reference/make_analytics_folder_child_operations_url.html index 401bfa60..39af0d1a 100644 --- a/docs/reference/make_analytics_folder_child_operations_url.html +++ b/docs/reference/make_analytics_folder_child_operations_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_analytics_folder_collections_url.html b/docs/reference/make_analytics_folder_collections_url.html index e3937575..7e5b3be4 100644 --- a/docs/reference/make_analytics_folder_collections_url.html +++ b/docs/reference/make_analytics_folder_collections_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_analytics_folder_operations_url.html b/docs/reference/make_analytics_folder_operations_url.html index dedac708..0dacbf6d 100644 --- a/docs/reference/make_analytics_folder_operations_url.html +++ b/docs/reference/make_analytics_folder_operations_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_analytics_folder_share_by_id_url.html b/docs/reference/make_analytics_folder_share_by_id_url.html index 198c8b48..08c260f6 100644 --- a/docs/reference/make_analytics_folder_share_by_id_url.html +++ b/docs/reference/make_analytics_folder_share_by_id_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_analytics_folder_share_recipients_url.html b/docs/reference/make_analytics_folder_share_recipients_url.html index 3e21ea16..cd97e01d 100644 --- a/docs/reference/make_analytics_folder_share_recipients_url.html +++ b/docs/reference/make_analytics_folder_share_recipients_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_analytics_folder_shares_url.html b/docs/reference/make_analytics_folder_shares_url.html index d2683401..c47a680a 100644 --- a/docs/reference/make_analytics_folder_shares_url.html +++ b/docs/reference/make_analytics_folder_shares_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_analytics_notification_operations_url.html b/docs/reference/make_analytics_notification_operations_url.html index 1acbf0e4..708d5209 100644 --- a/docs/reference/make_analytics_notification_operations_url.html +++ b/docs/reference/make_analytics_notification_operations_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_analytics_notifications_limits_url.html b/docs/reference/make_analytics_notifications_limits_url.html index 34f1d8eb..c7322395 100644 --- a/docs/reference/make_analytics_notifications_limits_url.html +++ b/docs/reference/make_analytics_notifications_limits_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_analytics_notifications_list_url.html b/docs/reference/make_analytics_notifications_list_url.html index 3a1fb023..6c3a6131 100644 --- a/docs/reference/make_analytics_notifications_list_url.html +++ b/docs/reference/make_analytics_notifications_list_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_base_metadata_url.html b/docs/reference/make_base_metadata_url.html index 29851e75..027a45ed 100644 --- a/docs/reference/make_base_metadata_url.html +++ b/docs/reference/make_base_metadata_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_base_rest_url.html b/docs/reference/make_base_rest_url.html index 74eba2f6..a77439bb 100644 --- a/docs/reference/make_base_rest_url.html +++ b/docs/reference/make_base_rest_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_base_soap_url.html b/docs/reference/make_base_soap_url.html index 4cc951fe..43d02bc5 100644 --- a/docs/reference/make_base_soap_url.html +++ b/docs/reference/make_base_soap_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_bulk_batch_details_url.html b/docs/reference/make_bulk_batch_details_url.html index f45d0ec9..c8bc2d81 100644 --- a/docs/reference/make_bulk_batch_details_url.html +++ b/docs/reference/make_bulk_batch_details_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_bulk_batch_status_url.html b/docs/reference/make_bulk_batch_status_url.html index 6df2356b..6eb9a4ee 100644 --- a/docs/reference/make_bulk_batch_status_url.html +++ b/docs/reference/make_bulk_batch_status_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_bulk_batches_url.html b/docs/reference/make_bulk_batches_url.html index 17b57c4f..3b945795 100644 --- a/docs/reference/make_bulk_batches_url.html +++ b/docs/reference/make_bulk_batches_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_bulk_create_job_url.html b/docs/reference/make_bulk_create_job_url.html index ac4a5c88..d8f629d2 100644 --- a/docs/reference/make_bulk_create_job_url.html +++ b/docs/reference/make_bulk_create_job_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_bulk_delete_job_url.html b/docs/reference/make_bulk_delete_job_url.html index bc136978..841ea121 100644 --- a/docs/reference/make_bulk_delete_job_url.html +++ b/docs/reference/make_bulk_delete_job_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_bulk_end_job_generic_url.html b/docs/reference/make_bulk_end_job_generic_url.html index a4057a3a..3ba607c0 100644 --- a/docs/reference/make_bulk_end_job_generic_url.html +++ b/docs/reference/make_bulk_end_job_generic_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_bulk_get_all_jobs_url.html b/docs/reference/make_bulk_get_all_jobs_url.html index 0327664e..1b060e91 100644 --- a/docs/reference/make_bulk_get_all_jobs_url.html +++ b/docs/reference/make_bulk_get_all_jobs_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_bulk_get_all_query_jobs_url.html b/docs/reference/make_bulk_get_all_query_jobs_url.html index 70bcd51e..4d95a89f 100644 --- a/docs/reference/make_bulk_get_all_query_jobs_url.html +++ b/docs/reference/make_bulk_get_all_query_jobs_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_bulk_get_job_url.html b/docs/reference/make_bulk_get_job_url.html index da79d1a3..9ce7b0ef 100644 --- a/docs/reference/make_bulk_get_job_url.html +++ b/docs/reference/make_bulk_get_job_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_bulk_job_records_url.html b/docs/reference/make_bulk_job_records_url.html index 614844a6..563a5190 100644 --- a/docs/reference/make_bulk_job_records_url.html +++ b/docs/reference/make_bulk_job_records_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_bulk_query_result_url.html b/docs/reference/make_bulk_query_result_url.html index b82f238a..4c63bc37 100644 --- a/docs/reference/make_bulk_query_result_url.html +++ b/docs/reference/make_bulk_query_result_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_bulk_query_url.html b/docs/reference/make_bulk_query_url.html index 9a92364c..164b11df 100644 --- a/docs/reference/make_bulk_query_url.html +++ b/docs/reference/make_bulk_query_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_chatter_users_url.html b/docs/reference/make_chatter_users_url.html index a8f6cef3..ddb68911 100644 --- a/docs/reference/make_chatter_users_url.html +++ b/docs/reference/make_chatter_users_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_composite_batch_url.html b/docs/reference/make_composite_batch_url.html index 9af5d4e5..89de4a6f 100644 --- a/docs/reference/make_composite_batch_url.html +++ b/docs/reference/make_composite_batch_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_composite_url.html b/docs/reference/make_composite_url.html index f8992046..705688bd 100644 --- a/docs/reference/make_composite_url.html +++ b/docs/reference/make_composite_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_dashboard_copy_url.html b/docs/reference/make_dashboard_copy_url.html index 0044c9a0..718eadef 100644 --- a/docs/reference/make_dashboard_copy_url.html +++ b/docs/reference/make_dashboard_copy_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_dashboard_describe_url.html b/docs/reference/make_dashboard_describe_url.html index 80e036d5..f0be9e4d 100644 --- a/docs/reference/make_dashboard_describe_url.html +++ b/docs/reference/make_dashboard_describe_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_dashboard_filter_operators_list_url.html b/docs/reference/make_dashboard_filter_operators_list_url.html index ba74eb55..1870ad86 100644 --- a/docs/reference/make_dashboard_filter_operators_list_url.html +++ b/docs/reference/make_dashboard_filter_operators_list_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_dashboard_filter_options_analysis_url.html b/docs/reference/make_dashboard_filter_options_analysis_url.html index 52cb9d11..24510ac9 100644 --- a/docs/reference/make_dashboard_filter_options_analysis_url.html +++ b/docs/reference/make_dashboard_filter_options_analysis_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_dashboard_status_url.html b/docs/reference/make_dashboard_status_url.html index 0e5185e0..e15f9784 100644 --- a/docs/reference/make_dashboard_status_url.html +++ b/docs/reference/make_dashboard_status_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_dashboard_url.html b/docs/reference/make_dashboard_url.html index 547f2d8d..f473cf15 100644 --- a/docs/reference/make_dashboard_url.html +++ b/docs/reference/make_dashboard_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_dashboards_list_url.html b/docs/reference/make_dashboards_list_url.html index 74384173..5c5f4ff1 100644 --- a/docs/reference/make_dashboards_list_url.html +++ b/docs/reference/make_dashboards_list_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_login_url.html b/docs/reference/make_login_url.html index 19728a40..49a4941f 100644 --- a/docs/reference/make_login_url.html +++ b/docs/reference/make_login_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_parameterized_search_url.html b/docs/reference/make_parameterized_search_url.html index ace9faef..a2613337 100644 --- a/docs/reference/make_parameterized_search_url.html +++ b/docs/reference/make_parameterized_search_url.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/make_query_url.html b/docs/reference/make_query_url.html index 08153bd6..e9addf16 100644 --- a/docs/reference/make_query_url.html +++ b/docs/reference/make_query_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_report_copy_url.html b/docs/reference/make_report_copy_url.html index 1f918e1b..5c5b434b 100644 --- a/docs/reference/make_report_copy_url.html +++ b/docs/reference/make_report_copy_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_report_create_url.html b/docs/reference/make_report_create_url.html index ac22c20d..dd6241d1 100644 --- a/docs/reference/make_report_create_url.html +++ b/docs/reference/make_report_create_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_report_describe_url.html b/docs/reference/make_report_describe_url.html index c706673a..68a46283 100644 --- a/docs/reference/make_report_describe_url.html +++ b/docs/reference/make_report_describe_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_report_execute_url.html b/docs/reference/make_report_execute_url.html index 3d8dda21..79fa5c83 100644 --- a/docs/reference/make_report_execute_url.html +++ b/docs/reference/make_report_execute_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_report_fields_url.html b/docs/reference/make_report_fields_url.html index 845ebcea..01978ae2 100644 --- a/docs/reference/make_report_fields_url.html +++ b/docs/reference/make_report_fields_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_report_filter_operators_list_url.html b/docs/reference/make_report_filter_operators_list_url.html index 11ef51bb..f21deb24 100644 --- a/docs/reference/make_report_filter_operators_list_url.html +++ b/docs/reference/make_report_filter_operators_list_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_report_instance_url.html b/docs/reference/make_report_instance_url.html index 017d7408..1e3218b8 100644 --- a/docs/reference/make_report_instance_url.html +++ b/docs/reference/make_report_instance_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_report_instances_list_url.html b/docs/reference/make_report_instances_list_url.html index a5f16505..aa4bcd50 100644 --- a/docs/reference/make_report_instances_list_url.html +++ b/docs/reference/make_report_instances_list_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_report_query_url.html b/docs/reference/make_report_query_url.html index 0d336ed2..b0ca3600 100644 --- a/docs/reference/make_report_query_url.html +++ b/docs/reference/make_report_query_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_report_type_describe_url.html b/docs/reference/make_report_type_describe_url.html index a99e2945..c7d22e0a 100644 --- a/docs/reference/make_report_type_describe_url.html +++ b/docs/reference/make_report_type_describe_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_report_types_list_url.html b/docs/reference/make_report_types_list_url.html index 203c9760..a9fb3f01 100644 --- a/docs/reference/make_report_types_list_url.html +++ b/docs/reference/make_report_types_list_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_report_url.html b/docs/reference/make_report_url.html index 6a7b1b82..7913ce8a 100644 --- a/docs/reference/make_report_url.html +++ b/docs/reference/make_report_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_reports_list_url.html b/docs/reference/make_reports_list_url.html index 5cdfd1f2..d89ada53 100644 --- a/docs/reference/make_reports_list_url.html +++ b/docs/reference/make_reports_list_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_rest_describe_url.html b/docs/reference/make_rest_describe_url.html index 60ac51cc..c2e1bb41 100644 --- a/docs/reference/make_rest_describe_url.html +++ b/docs/reference/make_rest_describe_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_rest_objects_url.html b/docs/reference/make_rest_objects_url.html index d993b1f1..b71227f2 100644 --- a/docs/reference/make_rest_objects_url.html +++ b/docs/reference/make_rest_objects_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_rest_record_url.html b/docs/reference/make_rest_record_url.html new file mode 100644 index 00000000..4435b399 --- /dev/null +++ b/docs/reference/make_rest_record_url.html @@ -0,0 +1,242 @@ + + + + + + + + +REST Individual Record URL Generator — make_rest_record_url • salesforcer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    REST Individual Record URL Generator

    +
    + +
    make_rest_record_url(object, sf_id)
    + + +

    Note

    + +

    This function is meant to be used internally. Only use when debugging.

    + +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.5.1.

    +
    + +
    +
    + + + + + + + + + + + diff --git a/docs/reference/make_search_url.html b/docs/reference/make_search_url.html index b6bdbd9d..83a583de 100644 --- a/docs/reference/make_search_url.html +++ b/docs/reference/make_search_url.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_soap_xml_skeleton.html b/docs/reference/make_soap_xml_skeleton.html index dc598316..2fc13a78 100644 --- a/docs/reference/make_soap_xml_skeleton.html +++ b/docs/reference/make_soap_xml_skeleton.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/make_verbose_httr_message.html b/docs/reference/make_verbose_httr_message.html index d81dd741..84708fa2 100644 --- a/docs/reference/make_verbose_httr_message.html +++ b/docs/reference/make_verbose_httr_message.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/map_sf_type_to_r_type.html b/docs/reference/map_sf_type_to_r_type.html index a77f8597..61a7ccd7 100644 --- a/docs/reference/map_sf_type_to_r_type.html +++ b/docs/reference/map_sf_type_to_r_type.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/merge_null_to_na.html b/docs/reference/merge_null_to_na.html index 3b43dead..e559002b 100644 --- a/docs/reference/merge_null_to_na.html +++ b/docs/reference/merge_null_to_na.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/message_w_errors_listed.html b/docs/reference/message_w_errors_listed.html index e6afb120..6c13877c 100644 --- a/docs/reference/message_w_errors_listed.html +++ b/docs/reference/message_w_errors_listed.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/metadata_type_validator.html b/docs/reference/metadata_type_validator.html index 11afeb92..c8391b22 100644 --- a/docs/reference/metadata_type_validator.html +++ b/docs/reference/metadata_type_validator.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/parameterized_search_control.html b/docs/reference/parameterized_search_control.html index d48adb60..d9491f13 100644 --- a/docs/reference/parameterized_search_control.html +++ b/docs/reference/parameterized_search_control.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    @@ -195,6 +195,7 @@

    Auxiliary for Controlling Parametrized Searches

    fields_scope = c("ALL", "NAME", "EMAIL", "PHONE", "SIDEBAR"), fields = NULL, overall_limit = 2000, + default_limit = 200, spell_correction = TRUE ) @@ -203,24 +204,30 @@

    Arg objects -

    character; objects to search and return in the response. Multiple +

    character; objects to search and return in the response. Multiple objects can be provided as a character vector

    fields_scope -

    character; scope of fields to search in order to limit the resources +

    character; scope of fields to search in order to limit the resources used and improve performance

    fields -

    character; one or more fields to return in the response for each +

    character; one or more fields to return in the response for each sobject specified. If no fields are specified only the Ids of the matching records are returned.

    overall_limit -

    numeric; the maximum number of results to return across -all sobject parameters specified.

    +

    numeric; the maximum number of results to return across +all objects in the search.

    + + + default_limit +

    numeric; the maximum number of results to return for +each of the specified objects. This parameter is ignored if the objects argument +is left NULL.

    spell_correction diff --git a/docs/reference/parse_error_code_and_message.html b/docs/reference/parse_error_code_and_message.html new file mode 100644 index 00000000..6247a950 --- /dev/null +++ b/docs/reference/parse_error_code_and_message.html @@ -0,0 +1,242 @@ + + + + + + + + +Function to parse out the message and status code of an HTTP error — parse_error_code_and_message • salesforcer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Assuming the error code is less than 500, this function will return the

    +
    + +
    parse_error_code_and_message(x)
    + + +

    Note

    + +

    This function is meant to be used internally. Only use when debugging.

    + +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.5.1.

    +
    + +
    +
    + + + + + + + + + + + diff --git a/docs/reference/parse_report_detail_rows.html b/docs/reference/parse_report_detail_rows.html index a46ec694..c23307bf 100644 --- a/docs/reference/parse_report_detail_rows.html +++ b/docs/reference/parse_report_detail_rows.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1

    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/patched_tempdir.html b/docs/reference/patched_tempdir.html new file mode 100644 index 00000000..7fa559e8 --- /dev/null +++ b/docs/reference/patched_tempdir.html @@ -0,0 +1,257 @@ + + + + + + + + +Create a temporary directory path without a double slash — patched_tempdir • salesforcer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    This function fixes a long standing bug in R where the +tempdir function will return a path with an +extra slash.

    +
    + +
    patched_tempdir()
    + + +

    Value

    + +

    character; a string representing the temp directory path +without containing a double slash

    +

    Note

    + +

    This function is meant to be used internally. Only use when debugging.

    +

    See also

    + + + +

    Examples

    +
    if (FALSE) { +patched_tempdir() +}
    +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.5.1.

    +
    + +
    +
    + + + + + + + + + + + diff --git a/docs/reference/rDELETE.html b/docs/reference/rDELETE.html index abfe87cc..acb79599 100644 --- a/docs/reference/rDELETE.html +++ b/docs/reference/rDELETE.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/rGET.html b/docs/reference/rGET.html index db52e7a6..f912183d 100644 --- a/docs/reference/rGET.html +++ b/docs/reference/rGET.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/rPATCH.html b/docs/reference/rPATCH.html index 50553cf8..7a10c426 100644 --- a/docs/reference/rPATCH.html +++ b/docs/reference/rPATCH.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/rPOST.html b/docs/reference/rPOST.html index 9cf7cf42..e32cc9ed 100644 --- a/docs/reference/rPOST.html +++ b/docs/reference/rPOST.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/rPUT.html b/docs/reference/rPUT.html index cfc91677..f181aa88 100644 --- a/docs/reference/rPUT.html +++ b/docs/reference/rPUT.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/records_list_to_tbl.html b/docs/reference/records_list_to_tbl.html index fd72dd84..bc59089a 100644 --- a/docs/reference/records_list_to_tbl.html +++ b/docs/reference/records_list_to_tbl.html @@ -99,7 +99,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -183,7 +183,7 @@
    diff --git a/docs/reference/remove_empty_linked_object_cols.html b/docs/reference/remove_empty_linked_object_cols.html index 488405ec..7ba14652 100644 --- a/docs/reference/remove_empty_linked_object_cols.html +++ b/docs/reference/remove_empty_linked_object_cols.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/return_matching_controls.html b/docs/reference/return_matching_controls.html index e8e0ce77..236dda43 100644 --- a/docs/reference/return_matching_controls.html +++ b/docs/reference/return_matching_controls.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/rforcecom.bulkAction.html b/docs/reference/rforcecom.bulkAction.html index 3266f401..899acea6 100644 --- a/docs/reference/rforcecom.bulkAction.html +++ b/docs/reference/rforcecom.bulkAction.html @@ -99,7 +99,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -184,7 +184,7 @@ diff --git a/docs/reference/rforcecom.bulkQuery.html b/docs/reference/rforcecom.bulkQuery.html index cecbebd7..41901079 100644 --- a/docs/reference/rforcecom.bulkQuery.html +++ b/docs/reference/rforcecom.bulkQuery.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -183,7 +183,7 @@ diff --git a/docs/reference/rforcecom.create.html b/docs/reference/rforcecom.create.html index b8f0e72c..41f8525b 100644 --- a/docs/reference/rforcecom.create.html +++ b/docs/reference/rforcecom.create.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -183,7 +183,7 @@ diff --git a/docs/reference/rforcecom.delete.html b/docs/reference/rforcecom.delete.html index 9092c682..ffd3cc9b 100644 --- a/docs/reference/rforcecom.delete.html +++ b/docs/reference/rforcecom.delete.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -183,7 +183,7 @@ diff --git a/docs/reference/rforcecom.getObjectDescription.html b/docs/reference/rforcecom.getObjectDescription.html index cf073b26..0a8f4c71 100644 --- a/docs/reference/rforcecom.getObjectDescription.html +++ b/docs/reference/rforcecom.getObjectDescription.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -183,7 +183,7 @@ diff --git a/docs/reference/rforcecom.getServerTimestamp.html b/docs/reference/rforcecom.getServerTimestamp.html index 3c4fad0c..13535f4c 100644 --- a/docs/reference/rforcecom.getServerTimestamp.html +++ b/docs/reference/rforcecom.getServerTimestamp.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -183,7 +183,7 @@ diff --git a/docs/reference/rforcecom.login.html b/docs/reference/rforcecom.login.html index 3463a9b7..8c2bcfc0 100644 --- a/docs/reference/rforcecom.login.html +++ b/docs/reference/rforcecom.login.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -183,7 +183,7 @@ diff --git a/docs/reference/rforcecom.query.html b/docs/reference/rforcecom.query.html index 19e4fb60..95338fe5 100644 --- a/docs/reference/rforcecom.query.html +++ b/docs/reference/rforcecom.query.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -183,7 +183,7 @@ diff --git a/docs/reference/rforcecom.retrieve.html b/docs/reference/rforcecom.retrieve.html index ea033d32..1e8eb7d2 100644 --- a/docs/reference/rforcecom.retrieve.html +++ b/docs/reference/rforcecom.retrieve.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -183,7 +183,7 @@ diff --git a/docs/reference/rforcecom.search.html b/docs/reference/rforcecom.search.html index b50e27f6..89d12f5f 100644 --- a/docs/reference/rforcecom.search.html +++ b/docs/reference/rforcecom.search.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -183,7 +183,7 @@ diff --git a/docs/reference/rforcecom.update.html b/docs/reference/rforcecom.update.html index 2d0bb6b4..d52dbc1f 100644 --- a/docs/reference/rforcecom.update.html +++ b/docs/reference/rforcecom.update.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -183,7 +183,7 @@ diff --git a/docs/reference/rforcecom.upsert.html b/docs/reference/rforcecom.upsert.html index 6281633a..dc9aa3c2 100644 --- a/docs/reference/rforcecom.upsert.html +++ b/docs/reference/rforcecom.upsert.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -183,7 +183,7 @@ diff --git a/docs/reference/salesforcer-package.html b/docs/reference/salesforcer-package.html index 6b18f8a8..2fad20bc 100644 --- a/docs/reference/salesforcer-package.html +++ b/docs/reference/salesforcer-package.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -180,7 +180,7 @@
    diff --git a/docs/reference/salesforcer_state.html b/docs/reference/salesforcer_state.html index bd954ecb..74724523 100644 --- a/docs/reference/salesforcer_state.html +++ b/docs/reference/salesforcer_state.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/session_id_available.html b/docs/reference/session_id_available.html index e367e320..cd06e0a8 100644 --- a/docs/reference/session_id_available.html +++ b/docs/reference/session_id_available.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/set_null_elements_to_na.html b/docs/reference/set_null_elements_to_na.html index a7701da5..e27c24d6 100644 --- a/docs/reference/set_null_elements_to_na.html +++ b/docs/reference/set_null_elements_to_na.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/set_null_elements_to_na_recursively.html b/docs/reference/set_null_elements_to_na_recursively.html index 5c5dbad8..3c0ae4a3 100644 --- a/docs/reference/set_null_elements_to_na_recursively.html +++ b/docs/reference/set_null_elements_to_na_recursively.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_abort_job_bulk.html b/docs/reference/sf_abort_job_bulk.html index 3b0000e4..28acc579 100644 --- a/docs/reference/sf_abort_job_bulk.html +++ b/docs/reference/sf_abort_job_bulk.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_access_token.html b/docs/reference/sf_access_token.html index 923cc031..6f361090 100644 --- a/docs/reference/sf_access_token.html +++ b/docs/reference/sf_access_token.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_analytics_notification_create.html b/docs/reference/sf_analytics_notification_create.html index 1b70fc4e..f96f9cfd 100644 --- a/docs/reference/sf_analytics_notification_create.html +++ b/docs/reference/sf_analytics_notification_create.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_analytics_notification_delete.html b/docs/reference/sf_analytics_notification_delete.html index 4354d897..e698d27e 100644 --- a/docs/reference/sf_analytics_notification_delete.html +++ b/docs/reference/sf_analytics_notification_delete.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_analytics_notification_describe.html b/docs/reference/sf_analytics_notification_describe.html index c0c32b4b..60fc2c17 100644 --- a/docs/reference/sf_analytics_notification_describe.html +++ b/docs/reference/sf_analytics_notification_describe.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_analytics_notification_update.html b/docs/reference/sf_analytics_notification_update.html index 0a728b1f..824679d0 100644 --- a/docs/reference/sf_analytics_notification_update.html +++ b/docs/reference/sf_analytics_notification_update.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_analytics_notifications_limits.html b/docs/reference/sf_analytics_notifications_limits.html index ca55fae0..f1cbc1b5 100644 --- a/docs/reference/sf_analytics_notifications_limits.html +++ b/docs/reference/sf_analytics_notifications_limits.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_analytics_notifications_list.html b/docs/reference/sf_analytics_notifications_list.html index 78a57dff..58626e2b 100644 --- a/docs/reference/sf_analytics_notifications_list.html +++ b/docs/reference/sf_analytics_notifications_list.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_auth.html b/docs/reference/sf_auth.html index d40901b2..d0946684 100644 --- a/docs/reference/sf_auth.html +++ b/docs/reference/sf_auth.html @@ -102,7 +102,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -186,7 +186,7 @@
    diff --git a/docs/reference/sf_auth_check.html b/docs/reference/sf_auth_check.html index d3ba3045..7eb7dc87 100644 --- a/docs/reference/sf_auth_check.html +++ b/docs/reference/sf_auth_check.html @@ -101,7 +101,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -185,7 +185,7 @@
    diff --git a/docs/reference/sf_auth_refresh.html b/docs/reference/sf_auth_refresh.html index d5334371..31701ecc 100644 --- a/docs/reference/sf_auth_refresh.html +++ b/docs/reference/sf_auth_refresh.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_batch_details_bulk.html b/docs/reference/sf_batch_details_bulk.html index 1dab5101..662c478d 100644 --- a/docs/reference/sf_batch_details_bulk.html +++ b/docs/reference/sf_batch_details_bulk.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_batch_status_bulk.html b/docs/reference/sf_batch_status_bulk.html index c9c050d3..c9f6eb66 100644 --- a/docs/reference/sf_batch_status_bulk.html +++ b/docs/reference/sf_batch_status_bulk.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_build_cols_spec.html b/docs/reference/sf_build_cols_spec.html index 11f19685..8b254718 100644 --- a/docs/reference/sf_build_cols_spec.html +++ b/docs/reference/sf_build_cols_spec.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_close_job_bulk.html b/docs/reference/sf_close_job_bulk.html index 2a84bdc6..dd251dba 100644 --- a/docs/reference/sf_close_job_bulk.html +++ b/docs/reference/sf_close_job_bulk.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_control.html b/docs/reference/sf_control.html index 44ba9f58..7517a545 100644 --- a/docs/reference/sf_control.html +++ b/docs/reference/sf_control.html @@ -99,7 +99,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -183,7 +183,7 @@
    diff --git a/docs/reference/sf_convert_lead.html b/docs/reference/sf_convert_lead.html index fa641376..8f2bd50e 100644 --- a/docs/reference/sf_convert_lead.html +++ b/docs/reference/sf_convert_lead.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_copy_report.html b/docs/reference/sf_copy_report.html index 73e92b51..3fb9b884 100644 --- a/docs/reference/sf_copy_report.html +++ b/docs/reference/sf_copy_report.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    @@ -230,9 +230,29 @@

    Value

    +

    Salesforce Documentation

    + + + + +

    See also

    - +

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_create.html b/docs/reference/sf_create.html index e7744600..7d9f4ea5 100644 --- a/docs/reference/sf_create.html +++ b/docs/reference/sf_create.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    @@ -207,7 +207,9 @@

    Arg input_data

    named vector, matrix, data.frame, or -tbl_df; data can be coerced into a data.frame

    +tbl_df; data can be coerced into a data.frame. If performing an +update, upsert, or delete operation, then one column or +field must be the Id of the record to modify or delete.

    object_name diff --git a/docs/reference/sf_create_attachment.html b/docs/reference/sf_create_attachment.html index be8c9744..89f960f7 100644 --- a/docs/reference/sf_create_attachment.html +++ b/docs/reference/sf_create_attachment.html @@ -100,7 +100,7 @@ salesforcer - 0.2.0 + 0.2.1

    @@ -184,7 +184,7 @@
    @@ -197,8 +197,8 @@

    Create Attachments

    sf_create_attachment(
    -  input_data,
    -  object_name = "Attachment",
    +  attachment_input_data,
    +  object_name = c("Attachment", "Document"),
       api_type = c("SOAP", "REST", "Bulk 1.0", "Bulk 2.0"),
       control = list(...),
       ...,
    @@ -209,13 +209,14 @@ 

    Arg - - + + @@ -259,18 +260,30 @@

    Note

    You can only create or update documents to a maximum size of 5 MB. The REST API allows you to insert or update blob data limited to 50 MB of text data or 37.5 MB of base64–encoded data.

    -

    References

    +

    Salesforce Documentation

    -

    https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_attachment.htm

    -

    https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_document.htm

    -

    https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_sobject_insert_update_blob.htm

    + + + + +

    See also

    + +

    Examples

    if (FALSE) { # upload two PDFs from working directory to a particular record as Attachments file_path1 <- here::here("doc1.pdf") file_path2 <- here::here("doc2.pdf") -parent_record_id <- "0033s00000zLbgs" +parent_record_id <- "0036A000002C6MmQAK" attachment_details <- tibble(Body = c(file_path1, file_path2), ParentId = rep(parent_record_id, 2)) result <- sf_create_attachment(attachment_details) @@ -280,7 +293,7 @@

    Examp document_details <- tibble(Name = "doc1.pdf", Description = "Test Document 1", Body = file_path1, - FolderId = "00l6A000001EgIwQAK", + FolderId = "00l6A000001EgIwQAK", # replace with your FolderId! Keywords = "example,test,document") result <- sf_create_attachment(document_details, object_name = "Document") diff --git a/docs/reference/sf_create_attachment_bulk_v1.html b/docs/reference/sf_create_attachment_bulk_v1.html index ffe00602..4772a45f 100644 --- a/docs/reference/sf_create_attachment_bulk_v1.html +++ b/docs/reference/sf_create_attachment_bulk_v1.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1

    @@ -180,7 +180,7 @@
    @@ -189,8 +189,8 @@

    Create Attachments using Bulk 1.0 API

    sf_create_attachment_bulk_v1(
    -  input_data,
    -  object_name = "Attachment",
    +  attachment_input_data,
    +  object_name = c("Attachment", "Document"),
       content_type = "ZIP_CSV",
       control,
       ...,
    diff --git a/docs/reference/sf_create_attachment_rest.html b/docs/reference/sf_create_attachment_rest.html
    index 399038e4..2debd2fb 100644
    --- a/docs/reference/sf_create_attachment_rest.html
    +++ b/docs/reference/sf_create_attachment_rest.html
    @@ -96,7 +96,7 @@
           
           
             salesforcer
    -        0.2.0
    +        0.2.1
           
         
     
    @@ -180,7 +180,7 @@
       
    @@ -189,8 +189,8 @@

    Create Attachment using REST API

    sf_create_attachment_rest(
    -  input_data,
    -  object_name = "Attachment",
    +  attachment_input_data,
    +  object_name = c("Attachment", "Document"),
       control,
       ...,
       verbose = FALSE
    diff --git a/docs/reference/sf_create_attachment_soap.html b/docs/reference/sf_create_attachment_soap.html
    index 15bcef44..56148d88 100644
    --- a/docs/reference/sf_create_attachment_soap.html
    +++ b/docs/reference/sf_create_attachment_soap.html
    @@ -96,7 +96,7 @@
           
           
             salesforcer
    -        0.2.0
    +        0.2.1
           
         
     
    @@ -180,7 +180,7 @@
       
    @@ -189,8 +189,8 @@

    Create Attachment using SOAP API

    sf_create_attachment_soap(
    -  input_data,
    -  object_name = "Attachment",
    +  attachment_input_data,
    +  object_name = c("Attachment", "Document"),
       control,
       ...,
       verbose = FALSE
    diff --git a/docs/reference/sf_create_batches_bulk.html b/docs/reference/sf_create_batches_bulk.html
    index 75fc8482..04b92a88 100644
    --- a/docs/reference/sf_create_batches_bulk.html
    +++ b/docs/reference/sf_create_batches_bulk.html
    @@ -97,7 +97,7 @@
           
           
             salesforcer
    -        0.2.0
    +        0.2.1
           
         
     
    @@ -181,7 +181,7 @@
       
    diff --git a/docs/reference/sf_create_bulk_v1.html b/docs/reference/sf_create_bulk_v1.html index a33e4a0c..45195e49 100644 --- a/docs/reference/sf_create_bulk_v1.html +++ b/docs/reference/sf_create_bulk_v1.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_create_bulk_v2.html b/docs/reference/sf_create_bulk_v2.html index 7f2e5e9b..53d657ce 100644 --- a/docs/reference/sf_create_bulk_v2.html +++ b/docs/reference/sf_create_bulk_v2.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_create_job_bulk.html b/docs/reference/sf_create_job_bulk.html index 2f9267a1..4dde4309 100644 --- a/docs/reference/sf_create_job_bulk.html +++ b/docs/reference/sf_create_job_bulk.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_create_job_bulk_v1.html b/docs/reference/sf_create_job_bulk_v1.html index 5643fbcc..317f74b1 100644 --- a/docs/reference/sf_create_job_bulk_v1.html +++ b/docs/reference/sf_create_job_bulk_v1.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_create_job_bulk_v2.html b/docs/reference/sf_create_job_bulk_v2.html index c93e9e39..af9a3cab 100644 --- a/docs/reference/sf_create_job_bulk_v2.html +++ b/docs/reference/sf_create_job_bulk_v2.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_create_metadata.html b/docs/reference/sf_create_metadata.html index 41129602..d428ddd9 100644 --- a/docs/reference/sf_create_metadata.html +++ b/docs/reference/sf_create_metadata.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_create_report.html b/docs/reference/sf_create_report.html index bb878d64..4e2c7fa7 100644 --- a/docs/reference/sf_create_report.html +++ b/docs/reference/sf_create_report.html @@ -101,7 +101,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -185,7 +185,7 @@
    @@ -249,9 +249,29 @@

    Value

    +

    Salesforce Documentation

    + + + + +

    See also

    - +

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_create_rest.html b/docs/reference/sf_create_rest.html index b2f29cc0..1779b293 100644 --- a/docs/reference/sf_create_rest.html +++ b/docs/reference/sf_create_rest.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_create_soap.html b/docs/reference/sf_create_soap.html index 28e4e9dc..4ad32c17 100644 --- a/docs/reference/sf_create_soap.html +++ b/docs/reference/sf_create_soap.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_dashboard_components_describe.html b/docs/reference/sf_dashboard_components_describe.html index 58829591..aa11c423 100644 --- a/docs/reference/sf_dashboard_components_describe.html +++ b/docs/reference/sf_dashboard_components_describe.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_dashboard_copy.html b/docs/reference/sf_dashboard_copy.html index 10f36cf1..133e525f 100644 --- a/docs/reference/sf_dashboard_copy.html +++ b/docs/reference/sf_dashboard_copy.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_dashboard_delete.html b/docs/reference/sf_dashboard_delete.html index 4cd260b7..3c7087a0 100644 --- a/docs/reference/sf_dashboard_delete.html +++ b/docs/reference/sf_dashboard_delete.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_dashboard_describe.html b/docs/reference/sf_dashboard_describe.html index 959438f9..3382b946 100644 --- a/docs/reference/sf_dashboard_describe.html +++ b/docs/reference/sf_dashboard_describe.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_dashboard_filter_operators_list.html b/docs/reference/sf_dashboard_filter_operators_list.html index 10f39e81..dd9445e1 100644 --- a/docs/reference/sf_dashboard_filter_operators_list.html +++ b/docs/reference/sf_dashboard_filter_operators_list.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_dashboard_filter_options_analysis.html b/docs/reference/sf_dashboard_filter_options_analysis.html index 8b62ac5f..7c609ff6 100644 --- a/docs/reference/sf_dashboard_filter_options_analysis.html +++ b/docs/reference/sf_dashboard_filter_options_analysis.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_dashboard_refresh.html b/docs/reference/sf_dashboard_refresh.html index 60488ee2..a9484e0b 100644 --- a/docs/reference/sf_dashboard_refresh.html +++ b/docs/reference/sf_dashboard_refresh.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_dashboard_results.html b/docs/reference/sf_dashboard_results.html index f19417ec..b9cf70d8 100644 --- a/docs/reference/sf_dashboard_results.html +++ b/docs/reference/sf_dashboard_results.html @@ -99,7 +99,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -183,7 +183,7 @@
    diff --git a/docs/reference/sf_dashboard_set_sticky_filter.html b/docs/reference/sf_dashboard_set_sticky_filter.html index fe0c3042..5a0ae172 100644 --- a/docs/reference/sf_dashboard_set_sticky_filter.html +++ b/docs/reference/sf_dashboard_set_sticky_filter.html @@ -105,7 +105,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -189,7 +189,7 @@
    diff --git a/docs/reference/sf_dashboard_status.html b/docs/reference/sf_dashboard_status.html index 2f971757..c5dee393 100644 --- a/docs/reference/sf_dashboard_status.html +++ b/docs/reference/sf_dashboard_status.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_dashboard_update.html b/docs/reference/sf_dashboard_update.html index de745a95..73a5ce7d 100644 --- a/docs/reference/sf_dashboard_update.html +++ b/docs/reference/sf_dashboard_update.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_dashboards_list.html b/docs/reference/sf_dashboards_list.html index 8e498613..2af2d820 100644 --- a/docs/reference/sf_dashboards_list.html +++ b/docs/reference/sf_dashboards_list.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_delete.html b/docs/reference/sf_delete.html index bd0b9766..7cf6151b 100644 --- a/docs/reference/sf_delete.html +++ b/docs/reference/sf_delete.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    @@ -207,8 +207,8 @@

    Arg

    +tbl_df; if not a vector, there must be a column called Id (case +insensitive) that can be passed in the request.

    diff --git a/docs/reference/sf_delete_attachment.html b/docs/reference/sf_delete_attachment.html new file mode 100644 index 00000000..8f300ddb --- /dev/null +++ b/docs/reference/sf_delete_attachment.html @@ -0,0 +1,316 @@ + + + + + + + + +Delete Attachments — sf_delete_attachment • salesforcer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Experimental lifecycle

    +

    This function is a wrapper around sf_delete that accepts a list +of Ids and assumes that they are in the Attachment object and should be deleted. +This function is solely provided as a convenience and to provide the last +attachment function to parallel the CRUD functionality for all other records.

    +
    + +
    sf_delete_attachment(
    +  ids,
    +  object_name = c("Attachment"),
    +  api_type = c("SOAP", "REST", "Bulk 1.0", "Bulk 2.0"),
    +  ...,
    +  verbose = FALSE
    +)
    + +

    Arguments

    +
    input_data

    named vector, matrix, data.frame, or -tbl_df; data can be coerced into a data.frame. The input must -contain a column entitled 'Body' with an absolute or relative file path -(unless creating a Document using a Url) along with other required fields depending -on the object. See the details below for the other required fields when creating -Attachments and Documents.

    attachment_input_data

    named vector, matrix, +data.frame, or tbl_df; data can be coerced into a +data.frame. The input must contain a column entitled 'Body' with an +absolute or relative file path (unless creating a Document using a Url) +along with other required fields depending on the object.If performing an +update operation, then one column or field of the input must be +the Id of the record to modify.

    object_name
    ids

    vector, matrix, data.frame, or -tbl_df; if not a vector, there must be a column called Id (case-insensitive) -that can be passed in the request

    object_name
    + + + + + + + + + + + + + + + + + + + + + +
    ids

    vector, matrix, data.frame, or +tbl_df; if not a vector, there must be a column called Id (case +insensitive) that can be passed in the request.

    object_name

    character; the name of the Salesforce object that the +function is operating against (e.g. "Account", "Contact", "CustomObject__c").

    api_type

    character; one of "REST", "SOAP", +"Bulk 1.0", or "Bulk 2.0" indicating which API to use when +making the request.

    ...

    arguments passed to sf_control or further downstream +to sf_bulk_operation

    verbose

    logical; an indicator of whether to print additional +detail for each API call, which is useful for debugging. More specifically, when +set to TRUE the URL, header, and body will be printed for each request, +along with additional diagnostic information where available.

    + +

    Value

    + +

    tbl_df with details of the deleted records

    +

    Note

    + +

    Because the SOAP and REST calls chunk data into batches of 200 records +the AllOrNoneHeader will only apply to the success or failure of every batch +of records and not all records submitted to the function.

    +

    See also

    + + + +

    Examples

    +
    if (FALSE) { +# upload a PDF to a particular record as an Attachment +file_path <- system.file("extdata", + "data-wrangling-cheatsheet.pdf", + package = "salesforcer") +parent_record_id <- "0036A000002C6MmQAK" # replace with your own ParentId! +attachment_details <- tibble(Body = file_path, ParentId = parent_record_id) +create_result <- sf_create_attachment(attachment_details) + +# now delete the attachment +# note that the function below is just running the following! +# sf_delete(ids = create_result$id) +sf_delete_attachment(ids = create_result$id) +}
    +
    + + + + +
    + + +
    +

    Site built with pkgdown 1.5.1.

    +
    + +
    + + + + + + + + + + + + diff --git a/docs/reference/sf_delete_bulk_v1.html b/docs/reference/sf_delete_bulk_v1.html index a6ade32e..d54dd491 100644 --- a/docs/reference/sf_delete_bulk_v1.html +++ b/docs/reference/sf_delete_bulk_v1.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_delete_bulk_v2.html b/docs/reference/sf_delete_bulk_v2.html index 0da65cd7..7c107d99 100644 --- a/docs/reference/sf_delete_bulk_v2.html +++ b/docs/reference/sf_delete_bulk_v2.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_delete_job_bulk.html b/docs/reference/sf_delete_job_bulk.html index 97b58d89..19f771fa 100644 --- a/docs/reference/sf_delete_job_bulk.html +++ b/docs/reference/sf_delete_job_bulk.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_delete_metadata.html b/docs/reference/sf_delete_metadata.html index ceda4b79..aaff69d8 100644 --- a/docs/reference/sf_delete_metadata.html +++ b/docs/reference/sf_delete_metadata.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_delete_report.html b/docs/reference/sf_delete_report.html index 621eb0ec..93fba14f 100644 --- a/docs/reference/sf_delete_report.html +++ b/docs/reference/sf_delete_report.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    @@ -215,9 +215,29 @@

    Value

    logical indicating whether the report was deleted. This function will return TRUE if successful in deleting the report.

    +

    Salesforce Documentation

    + + + + +

    See also

    - +

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_delete_report_instance.html b/docs/reference/sf_delete_report_instance.html index 33f732ce..ac73c3f6 100644 --- a/docs/reference/sf_delete_report_instance.html +++ b/docs/reference/sf_delete_report_instance.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    @@ -221,9 +221,19 @@

    Value

    logical indicating whether the report instance was deleted. This function will return TRUE if successful in deleting the report instance.

    +

    Salesforce Documentation

    + + + + +

    See also

    - +

    Other Report Instance functions: +sf_get_report_instance_results(), +sf_list_report_instances()

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_delete_rest.html b/docs/reference/sf_delete_rest.html index d499dfe2..3bd01c7a 100644 --- a/docs/reference/sf_delete_rest.html +++ b/docs/reference/sf_delete_rest.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_delete_soap.html b/docs/reference/sf_delete_soap.html index 97f22c6b..2ee18253 100644 --- a/docs/reference/sf_delete_soap.html +++ b/docs/reference/sf_delete_soap.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_describe_metadata.html b/docs/reference/sf_describe_metadata.html index 72e118bb..b3d28bf8 100644 --- a/docs/reference/sf_describe_metadata.html +++ b/docs/reference/sf_describe_metadata.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_describe_object_fields.html b/docs/reference/sf_describe_object_fields.html index 57f2bc94..4f73b135 100644 --- a/docs/reference/sf_describe_object_fields.html +++ b/docs/reference/sf_describe_object_fields.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_describe_objects.html b/docs/reference/sf_describe_objects.html index 3529f01b..32d386f3 100644 --- a/docs/reference/sf_describe_objects.html +++ b/docs/reference/sf_describe_objects.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_describe_report.html b/docs/reference/sf_describe_report.html index d0e9f953..62fe4fc1 100644 --- a/docs/reference/sf_describe_report.html +++ b/docs/reference/sf_describe_report.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    @@ -228,11 +228,32 @@

    Details
  • Report metadata gives information about the report as a whole. Tells you such things as, the report type, format, the fields that are summaries, row or column groupings, filters saved to the report, and so on.

  • Report type metadata tells you about all the fields available in the report type, those you can filter, and by what filter criteria.

  • Report extended metadata tells you about the fields that are summaries, groupings, and contain record details in the report.

  • + + +

    Salesforce Documentation

    + + + +

    See also

    - +

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_describe_report_type.html b/docs/reference/sf_describe_report_type.html index 9b09ce03..eecef36a 100644 --- a/docs/reference/sf_describe_report_type.html +++ b/docs/reference/sf_describe_report_type.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    @@ -224,9 +224,29 @@

    Value

    +

    Salesforce Documentation

    + + + + +

    See also

    - +

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_download_attachment.html b/docs/reference/sf_download_attachment.html index 90abe9fe..9ebb67bc 100644 --- a/docs/reference/sf_download_attachment.html +++ b/docs/reference/sf_download_attachment.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    @@ -192,34 +192,82 @@

    Download an Attachment

    attachment body, file name, and path.

    -
    sf_download_attachment(body, name, path = ".")
    +
    sf_download_attachment(
    +  body,
    +  name = NULL,
    +  sf_id = NULL,
    +  object_name = c("Attachment", "Document"),
    +  path = "."
    +)

    Arguments

    - + - + + + + + + + + + - +
    body

    character; a URL path to the body of the attachment in Salesforce, -typically retrieved via query on the Attachment object

    character; a URL path to the body of the attachment in +Salesforce, typically retrieved by sf_query on the Attachment +object. Alternatively, you can specify the Salesforce Id of the Attachment.

    name

    character; the name of the file you would like to save the content to

    character; the name of the file you would like to save the +content to. Note that you should include the file extension in this name +and if this argument is left NULL, then a query will be made to +determine the name and file extension needed. This process may result in a +slower download process, so attempt to provide the body and name arguments +whenever possible for the best performance.

    sf_id

    character; a Salesforce generated Id that uniquely +identifies a record.

    object_name

    character; the name of the Salesforce object that the +function is operating against (e.g. "Account", "Contact", "CustomObject__c").

    path

    character; a directory path where to create file, defaults to the -current directory.

    character; a directory path where to create file, defaults +to the current directory.

    +

    Value

    + +

    character; invisibly return the file path of the downloaded +content

    +

    Salesforce Documentation

    + + + + + +

    See also

    + +

    Examples

    if (FALSE) { -queried_attachments <- sf_query("SELECT Body, Name +# downloading all attachments for a Parent record +# if your attachment name doesn't include the extension, then you can use the +# ContentType column to append it to the Name, if needed +queried_attachments <- sf_query("SELECT Id, Body, Name, ContentType FROM Attachment WHERE ParentId = '0016A0000035mJ5'") mapply(sf_download_attachment, queried_attachments$Body, queried_attachments$Name) + +# downloading an attachment by its Id +# (the file name will be the same as it exists in Salesforce) +sf_download_attachment(sf_id = queried_attachments$Id[1]) }
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_end_job_bulk.html b/docs/reference/sf_end_job_bulk.html index abc41f10..a78f209b 100644 --- a/docs/reference/sf_end_job_bulk.html +++ b/docs/reference/sf_end_job_bulk.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_execute_report.html b/docs/reference/sf_execute_report.html index 2e9426d6..df2b81a2 100644 --- a/docs/reference/sf_execute_report.html +++ b/docs/reference/sf_execute_report.html @@ -103,7 +103,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -187,7 +187,7 @@
    @@ -327,14 +327,33 @@

    Details
  • reportFilters

  • -

    See also

    +

    Salesforce Documentation

    + + - + +

    See also

    + +

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_find_duplicates.html b/docs/reference/sf_find_duplicates.html index 94314783..f1457d5b 100644 --- a/docs/reference/sf_find_duplicates.html +++ b/docs/reference/sf_find_duplicates.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_find_duplicates_by_id.html b/docs/reference/sf_find_duplicates_by_id.html index cc58db7a..2ade631c 100644 --- a/docs/reference/sf_find_duplicates_by_id.html +++ b/docs/reference/sf_find_duplicates_by_id.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_format_date.html b/docs/reference/sf_format_date.html index 8b3c4539..d628dbed 100644 --- a/docs/reference/sf_format_date.html +++ b/docs/reference/sf_format_date.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_format_datetime.html b/docs/reference/sf_format_datetime.html index 75254c02..ca42b53b 100644 --- a/docs/reference/sf_format_datetime.html +++ b/docs/reference/sf_format_datetime.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_format_time.data.frame.html b/docs/reference/sf_format_time.data.frame.html index e8a2cda9..92a75be0 100644 --- a/docs/reference/sf_format_time.data.frame.html +++ b/docs/reference/sf_format_time.data.frame.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_format_time.list.html b/docs/reference/sf_format_time.list.html index 2be4ac50..3155d0e1 100644 --- a/docs/reference/sf_format_time.list.html +++ b/docs/reference/sf_format_time.list.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_get_all_jobs_bulk.html b/docs/reference/sf_get_all_jobs_bulk.html index dc8e25b5..72e8ef3b 100644 --- a/docs/reference/sf_get_all_jobs_bulk.html +++ b/docs/reference/sf_get_all_jobs_bulk.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_get_all_query_jobs_bulk.html b/docs/reference/sf_get_all_query_jobs_bulk.html index c86f0ea1..914b922f 100644 --- a/docs/reference/sf_get_all_query_jobs_bulk.html +++ b/docs/reference/sf_get_all_query_jobs_bulk.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_get_dashboard_data.html b/docs/reference/sf_get_dashboard_data.html index 090b5eb9..fc39acb8 100644 --- a/docs/reference/sf_get_dashboard_data.html +++ b/docs/reference/sf_get_dashboard_data.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_get_deleted.html b/docs/reference/sf_get_deleted.html index 695d5ba2..4b8570da 100644 --- a/docs/reference/sf_get_deleted.html +++ b/docs/reference/sf_get_deleted.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_get_job_bulk.html b/docs/reference/sf_get_job_bulk.html index ee7ae047..9bd48b14 100644 --- a/docs/reference/sf_get_job_bulk.html +++ b/docs/reference/sf_get_job_bulk.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_get_job_records_bulk.html b/docs/reference/sf_get_job_records_bulk.html index c2632165..e8677956 100644 --- a/docs/reference/sf_get_job_records_bulk.html +++ b/docs/reference/sf_get_job_records_bulk.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_get_report_instance_results.html b/docs/reference/sf_get_report_instance_results.html index 92751c56..c0dcdebd 100644 --- a/docs/reference/sf_get_report_instance_results.html +++ b/docs/reference/sf_get_report_instance_results.html @@ -99,7 +99,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -183,7 +183,7 @@
    @@ -290,9 +290,21 @@

    Note

    +

    Salesforce Documentation

    + + + + +

    See also

    - +

    Other Report Instance functions: +sf_delete_report_instance(), +sf_list_report_instances()

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_get_updated.html b/docs/reference/sf_get_updated.html index 3364ee08..050e2e45 100644 --- a/docs/reference/sf_get_updated.html +++ b/docs/reference/sf_get_updated.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_guess_cols.html b/docs/reference/sf_guess_cols.html index 6f58d272..740c9ddb 100644 --- a/docs/reference/sf_guess_cols.html +++ b/docs/reference/sf_guess_cols.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_input_data_validation.html b/docs/reference/sf_input_data_validation.html index 32355f54..a2b400f3 100644 --- a/docs/reference/sf_input_data_validation.html +++ b/docs/reference/sf_input_data_validation.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_job_batches_bulk.html b/docs/reference/sf_job_batches_bulk.html index c1a9835c..c8674a5f 100644 --- a/docs/reference/sf_job_batches_bulk.html +++ b/docs/reference/sf_job_batches_bulk.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_list_api_limits.html b/docs/reference/sf_list_api_limits.html index 819c6bc7..a601f509 100644 --- a/docs/reference/sf_list_api_limits.html +++ b/docs/reference/sf_list_api_limits.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_list_metadata.html b/docs/reference/sf_list_metadata.html index 34e7536b..eced32a1 100644 --- a/docs/reference/sf_list_metadata.html +++ b/docs/reference/sf_list_metadata.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_list_objects.html b/docs/reference/sf_list_objects.html index e8e63636..d1147e6c 100644 --- a/docs/reference/sf_list_objects.html +++ b/docs/reference/sf_list_objects.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_list_report_fields.html b/docs/reference/sf_list_report_fields.html index 4d946dde..ea6067d1 100644 --- a/docs/reference/sf_list_report_fields.html +++ b/docs/reference/sf_list_report_fields.html @@ -100,7 +100,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -184,7 +184,7 @@
    @@ -237,9 +237,29 @@

    Value

    +

    Salesforce Documentation

    + + + + +

    See also

    - +

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_list_report_filter_operators.html b/docs/reference/sf_list_report_filter_operators.html index 5272e338..4114f499 100644 --- a/docs/reference/sf_list_report_filter_operators.html +++ b/docs/reference/sf_list_report_filter_operators.html @@ -99,7 +99,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -183,7 +183,7 @@
    @@ -217,9 +217,30 @@

    Value

    tbl_df by default, or a list depending on the value of argument as_tbl

    +

    Salesforce Documentation

    + + + + +

    See also

    - +

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_list_report_instances.html b/docs/reference/sf_list_report_instances.html index 8a0d9f83..07a62a8c 100644 --- a/docs/reference/sf_list_report_instances.html +++ b/docs/reference/sf_list_report_instances.html @@ -99,7 +99,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -183,7 +183,7 @@
    @@ -222,9 +222,20 @@

    Value

    tbl_df by default, or a list depending on the value of argument as_tbl

    +

    Salesforce Documentation

    + + + + +

    See also

    - +

    Other Report Instance functions: +sf_delete_report_instance(), +sf_get_report_instance_results()

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_list_report_types.html b/docs/reference/sf_list_report_types.html index 6bc5bc3a..3bf6eef4 100644 --- a/docs/reference/sf_list_report_types.html +++ b/docs/reference/sf_list_report_types.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    @@ -213,9 +213,29 @@

    Value

    tbl_df by default, or a list depending on the value of argument as_tbl

    +

    Salesforce Documentation

    + + + + +

    See also

    - +

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_list_reports.html b/docs/reference/sf_list_reports.html index b07ab233..594b4ad5 100644 --- a/docs/reference/sf_list_reports.html +++ b/docs/reference/sf_list_reports.html @@ -54,8 +54,9 @@ @@ -99,7 +100,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -183,18 +184,19 @@

    Experimental lifecycle

    -

    Displays a list of up to 200 tabular, matrix, or summary reports that you -recently viewed. To get a full list of reports by format, name, and other +

    Displays a list of full list of reports based on the Report object. If +recent is up to 200 tabular, matrix, or summary reports that you +recently viewed. To get additional details on reports by format, name, and other fields, use a SOQL query on the Report object.

    -
    sf_list_reports(recent = TRUE, as_tbl = TRUE, verbose = FALSE)
    +
    sf_list_reports(recent = FALSE, as_tbl = TRUE, verbose = FALSE)

    Arguments

    @@ -203,10 +205,11 @@

    Arg

    +return all reports in the Org. By default, this argument is set to FALSE +meaning that all of the reports, not just the most recently viewed reports +are returned. Note that the default behavior of the reports list endpoint in +the Reports and Dashboards REST API is only the most recently viewed up to +200 reports.

    @@ -228,22 +231,44 @@

    Value

    argument as_tbl

    Note

    -

    This function will only return up to 200 of recently viewed reports. For -a COMPLETE list you must use sf_query on the report object.

    +

    This function will only return up to 200 of recently viewed reports when the +recent argument is set to TRUE. For a complete details you must +use sf_query on the report object.

    +

    Salesforce Documentation

    + + + + +

    See also

    - +

    Examples

    if (FALSE) { -# return up to 200 recently viewed reports +# to return all possible reports, which is queried from the Report object reports <- sf_list_reports() # return the results as a list reports_as_list <- sf_list_reports(as_tbl=FALSE) -# to return all possible reports, which is queried from the Report object -all_reports <- sf_list_reports(recent=FALSE) +# return up to 200 recently viewed reports +all_reports <- sf_list_reports(recent=TRUE) }
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_list_rest_api_versions.html b/docs/reference/sf_list_rest_api_versions.html index 7eba1698..86f7965f 100644 --- a/docs/reference/sf_list_rest_api_versions.html +++ b/docs/reference/sf_list_rest_api_versions.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_merge.html b/docs/reference/sf_merge.html index 701f0c37..39647f4e 100644 --- a/docs/reference/sf_merge.html +++ b/docs/reference/sf_merge.html @@ -100,7 +100,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -184,7 +184,7 @@
    diff --git a/docs/reference/sf_query.html b/docs/reference/sf_query.html index 1f997b39..b0031eb0 100644 --- a/docs/reference/sf_query.html +++ b/docs/reference/sf_query.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_query_bulk_v1.html b/docs/reference/sf_query_bulk_v1.html index e740fe48..49729510 100644 --- a/docs/reference/sf_query_bulk_v1.html +++ b/docs/reference/sf_query_bulk_v1.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_query_bulk_v2.html b/docs/reference/sf_query_bulk_v2.html index 6c445def..1a2c6296 100644 --- a/docs/reference/sf_query_bulk_v2.html +++ b/docs/reference/sf_query_bulk_v2.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_query_report.html b/docs/reference/sf_query_report.html index 37adc0ac..c074ddd4 100644 --- a/docs/reference/sf_query_report.html +++ b/docs/reference/sf_query_report.html @@ -99,7 +99,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -183,7 +183,7 @@
    @@ -248,9 +248,30 @@

    Details property of a report. For more information, please review the Salesforce documentation in detail HERE. Additional references are provided in the "See Also" section.

    +

    Salesforce Documentation

    + + + + +

    See also

    - +
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_query_result_bulk_v1.html b/docs/reference/sf_query_result_bulk_v1.html index 664b4813..8ab00d46 100644 --- a/docs/reference/sf_query_result_bulk_v1.html +++ b/docs/reference/sf_query_result_bulk_v1.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_query_result_bulk_v2.html b/docs/reference/sf_query_result_bulk_v2.html index 689603e5..297b87c5 100644 --- a/docs/reference/sf_query_result_bulk_v2.html +++ b/docs/reference/sf_query_result_bulk_v2.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_read_metadata.html b/docs/reference/sf_read_metadata.html index 60f54a6e..e32241d0 100644 --- a/docs/reference/sf_read_metadata.html +++ b/docs/reference/sf_read_metadata.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_rename_metadata.html b/docs/reference/sf_rename_metadata.html index b57331a3..4d299ee7 100644 --- a/docs/reference/sf_rename_metadata.html +++ b/docs/reference/sf_rename_metadata.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_reorder_cols.html b/docs/reference/sf_reorder_cols.html index 611816cb..2f43f6d7 100644 --- a/docs/reference/sf_reorder_cols.html +++ b/docs/reference/sf_reorder_cols.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_report_folder_children.html b/docs/reference/sf_report_folder_children.html index 256affce..5a66580c 100644 --- a/docs/reference/sf_report_folder_children.html +++ b/docs/reference/sf_report_folder_children.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_report_folder_create.html b/docs/reference/sf_report_folder_create.html index 7e99db1b..fb38537e 100644 --- a/docs/reference/sf_report_folder_create.html +++ b/docs/reference/sf_report_folder_create.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_report_folder_delete.html b/docs/reference/sf_report_folder_delete.html index eefdec57..b9cc14c9 100644 --- a/docs/reference/sf_report_folder_delete.html +++ b/docs/reference/sf_report_folder_delete.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_report_folder_describe.html b/docs/reference/sf_report_folder_describe.html index fa2d46a7..4eb59308 100644 --- a/docs/reference/sf_report_folder_describe.html +++ b/docs/reference/sf_report_folder_describe.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_report_folder_share_delete.html b/docs/reference/sf_report_folder_share_delete.html index 68956481..a3ce8463 100644 --- a/docs/reference/sf_report_folder_share_delete.html +++ b/docs/reference/sf_report_folder_share_delete.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_report_folder_share_describe.html b/docs/reference/sf_report_folder_share_describe.html index 8da772b0..ec5199c8 100644 --- a/docs/reference/sf_report_folder_share_describe.html +++ b/docs/reference/sf_report_folder_share_describe.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_report_folder_share_recipients.html b/docs/reference/sf_report_folder_share_recipients.html index 0adec613..77852f69 100644 --- a/docs/reference/sf_report_folder_share_recipients.html +++ b/docs/reference/sf_report_folder_share_recipients.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_report_folder_share_update.html b/docs/reference/sf_report_folder_share_update.html index 1cfcf125..6fe47a5a 100644 --- a/docs/reference/sf_report_folder_share_update.html +++ b/docs/reference/sf_report_folder_share_update.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_report_folder_shares_add.html b/docs/reference/sf_report_folder_shares_add.html index 19ec34cf..9a7bb6a1 100644 --- a/docs/reference/sf_report_folder_shares_add.html +++ b/docs/reference/sf_report_folder_shares_add.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_report_folder_shares_list.html b/docs/reference/sf_report_folder_shares_list.html index df263adb..3027c048 100644 --- a/docs/reference/sf_report_folder_shares_list.html +++ b/docs/reference/sf_report_folder_shares_list.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_report_folder_shares_update.html b/docs/reference/sf_report_folder_shares_update.html index 1adad10e..7ca6f6dc 100644 --- a/docs/reference/sf_report_folder_shares_update.html +++ b/docs/reference/sf_report_folder_shares_update.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_report_folder_update.html b/docs/reference/sf_report_folder_update.html index a76bb46a..d1e07520 100644 --- a/docs/reference/sf_report_folder_update.html +++ b/docs/reference/sf_report_folder_update.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_report_folders_list.html b/docs/reference/sf_report_folders_list.html index 7946b5eb..f3ab5365 100644 --- a/docs/reference/sf_report_folders_list.html +++ b/docs/reference/sf_report_folders_list.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_reset_password.html b/docs/reference/sf_reset_password.html index 86fcf9a1..ee47e249 100644 --- a/docs/reference/sf_reset_password.html +++ b/docs/reference/sf_reset_password.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_rest_list.html b/docs/reference/sf_rest_list.html index 67bbd9d4..da913b7d 100644 --- a/docs/reference/sf_rest_list.html +++ b/docs/reference/sf_rest_list.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_retrieve.html b/docs/reference/sf_retrieve.html index 6c6bcb39..aea1b2ec 100644 --- a/docs/reference/sf_retrieve.html +++ b/docs/reference/sf_retrieve.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    @@ -207,8 +207,8 @@

    Arg

    +tbl_df; if not a vector, there must be a column called Id (case +insensitive) that can be passed in the request.

    diff --git a/docs/reference/sf_retrieve_metadata.html b/docs/reference/sf_retrieve_metadata.html index f643a7ff..8c255a33 100644 --- a/docs/reference/sf_retrieve_metadata.html +++ b/docs/reference/sf_retrieve_metadata.html @@ -99,7 +99,7 @@ salesforcer - 0.2.0 + 0.2.1 @@ -183,7 +183,7 @@
    diff --git a/docs/reference/sf_retrieve_metadata_check_status.html b/docs/reference/sf_retrieve_metadata_check_status.html index 7429bc9e..87927cf7 100644 --- a/docs/reference/sf_retrieve_metadata_check_status.html +++ b/docs/reference/sf_retrieve_metadata_check_status.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_retrieve_rest.html b/docs/reference/sf_retrieve_rest.html index e095dca5..9b94ccdf 100644 --- a/docs/reference/sf_retrieve_rest.html +++ b/docs/reference/sf_retrieve_rest.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_retrieve_soap.html b/docs/reference/sf_retrieve_soap.html index 99e9d09f..a6190558 100644 --- a/docs/reference/sf_retrieve_soap.html +++ b/docs/reference/sf_retrieve_soap.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_run_bulk_operation.html b/docs/reference/sf_run_bulk_operation.html index b16b0251..0a780815 100644 --- a/docs/reference/sf_run_bulk_operation.html +++ b/docs/reference/sf_run_bulk_operation.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_run_bulk_query.html b/docs/reference/sf_run_bulk_query.html index e0d7761f..91529978 100644 --- a/docs/reference/sf_run_bulk_query.html +++ b/docs/reference/sf_run_bulk_query.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_run_report.html b/docs/reference/sf_run_report.html index 507fa704..d8753357 100644 --- a/docs/reference/sf_run_report.html +++ b/docs/reference/sf_run_report.html @@ -100,7 +100,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -184,7 +184,7 @@
    @@ -298,14 +298,33 @@

    Details without total rows and given options to filter, and select the Top N as function arguments rather than forcing the user to create an entire list of reportMetadata.

    -

    See also

    +

    Salesforce Documentation

    + + - + +

    See also

    + +

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_search.html b/docs/reference/sf_search.html index b7b38cdf..f81edbd7 100644 --- a/docs/reference/sf_search.html +++ b/docs/reference/sf_search.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_server_timestamp.html b/docs/reference/sf_server_timestamp.html index 84d0963b..3fa059aa 100644 --- a/docs/reference/sf_server_timestamp.html +++ b/docs/reference/sf_server_timestamp.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_session_id.html b/docs/reference/sf_session_id.html index 967b452f..e170ac9a 100644 --- a/docs/reference/sf_session_id.html +++ b/docs/reference/sf_session_id.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_set_password.html b/docs/reference/sf_set_password.html index 4ee17ff5..06edcca4 100644 --- a/docs/reference/sf_set_password.html +++ b/docs/reference/sf_set_password.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_submit_query_bulk.html b/docs/reference/sf_submit_query_bulk.html index 69d30b43..f275fa66 100644 --- a/docs/reference/sf_submit_query_bulk.html +++ b/docs/reference/sf_submit_query_bulk.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_undelete.html b/docs/reference/sf_undelete.html index 303e7df8..05bc2a0f 100644 --- a/docs/reference/sf_undelete.html +++ b/docs/reference/sf_undelete.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_update.html b/docs/reference/sf_update.html index 99d3d369..054f0163 100644 --- a/docs/reference/sf_update.html +++ b/docs/reference/sf_update.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    @@ -207,7 +207,9 @@

    Arg

    +tbl_df; data can be coerced into a data.frame. If performing an +update, upsert, or delete operation, then one column or +field must be the Id of the record to modify or delete.

    diff --git a/docs/reference/sf_update_attachment.html b/docs/reference/sf_update_attachment.html new file mode 100644 index 00000000..ed0e1e88 --- /dev/null +++ b/docs/reference/sf_update_attachment.html @@ -0,0 +1,344 @@ + + + + + + + + +Update Attachments — sf_update_attachment • salesforcer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Experimental lifecycle

    +

    This function will allow you to update attachments (and other blob data, such as +Documents) by providing the Id of the attachment record and the file paths +(absolute or relative) to media that you would like to upload to Salesforce +along with other supported metadata for this operation (Name, +Body, IsPrivate, and OwnerId).

    +
    + +
    sf_update_attachment(
    +  attachment_input_data,
    +  object_name = c("Attachment"),
    +  api_type = c("SOAP", "REST", "Bulk 1.0", "Bulk 2.0"),
    +  control = list(...),
    +  ...,
    +  verbose = FALSE
    +)
    + +

    Arguments

    +
    recent

    logical; an indicator of whether to return the 200 most recently viewed reports or to invoke a query on the Report object to -return all reports in the Org. By default, this argument is set to TRUE -meaning that only the most recently viewed reports are returned because this -is the default behavior of the reports list endpoint in the Reports and -Dashboards REST API.

    as_tbl
    ids

    vector, matrix, data.frame, or -tbl_df; if not a vector, there must be a column called Id (case-insensitive) -that can be passed in the request

    fields
    input_data

    named vector, matrix, data.frame, or -tbl_df; data can be coerced into a data.frame

    object_name
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    attachment_input_data

    named vector, matrix, +data.frame, or tbl_df; data can be coerced into a +data.frame. The input must contain a column entitled 'Body' with an +absolute or relative file path (unless creating a Document using a Url) +along with other required fields depending on the object.If performing an +update operation, then one column or field of the input must be +the Id of the record to modify.

    object_name

    character; the name of the Salesforce object that the +function is operating against (e.g. "Account", "Contact", "CustomObject__c").

    api_type

    character; one of "REST", "SOAP", +"Bulk 1.0", or "Bulk 2.0" indicating which API to use when +making the request.

    control

    list; a list of parameters for controlling the behavior of +the API call being used. For more information of what parameters are available +look at the documentation for sf_control.

    ...

    arguments passed to sf_control or further downstream +to sf_bulk_operation

    verbose

    logical; an indicator of whether to print additional +detail for each API call, which is useful for debugging. More specifically, when +set to TRUE the URL, header, and body will be printed for each request, +along with additional diagnostic information where available.

    + +

    Value

    + +

    tbl_df with details of the created records

    +

    Note

    + +

    The length of any file name can’t exceed 512 bytes (per Bulk 1.0 API). +The SOAP API create call restricts these files to a maximum size of 25 MB. For a file +attached to a Solution, the limit is 1.5 MB. The maximum email attachment size is 3 MB. +You can only create or update documents to a maximum size of 5 MB. The REST API +allows you to insert or update blob data limited to 50 MB of text data or 37.5 MB +of base64–encoded data.

    +

    Salesforce Documentation

    + + + + + +

    See also

    + + + +

    Examples

    +
    if (FALSE) { +# upload a PDF to a particular record as an Attachment +file_path <- system.file("extdata", + "data-wrangling-cheatsheet.pdf", + package = "salesforcer") +parent_record_id <- "0036A000002C6MmQAK" # replace with your own ParentId! +attachment_details <- tibble(Body = file_path, ParentId = parent_record_id) +create_result <- sf_create_attachment(attachment_details) + +# download, zip, and re-upload the PDF +pdf_path <- sf_download_attachment(sf_id = create_result$id[1]) +zipped_path <- paste0(pdf_path, ".zip") +zip(zipped_path, pdf_path) +attachment_details <- tibble(Id = create_result$id, Body = zipped_path) +update_result <- sf_update_attachment(attachment_details) +}
    +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.5.1.

    +
    + +
    +
    + + + + + + + + + + + diff --git a/docs/reference/sf_update_attachment_bulk_v1.html b/docs/reference/sf_update_attachment_bulk_v1.html new file mode 100644 index 00000000..d078168a --- /dev/null +++ b/docs/reference/sf_update_attachment_bulk_v1.html @@ -0,0 +1,249 @@ + + + + + + + + +Update Attachments using Bulk 1.0 API — sf_update_attachment_bulk_v1 • salesforcer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Update Attachments using Bulk 1.0 API

    +
    + +
    sf_update_attachment_bulk_v1(
    +  attachment_input_data,
    +  object_name = c("Attachment"),
    +  content_type = "ZIP_CSV",
    +  control,
    +  ...,
    +  verbose = FALSE
    +)
    + + +

    Note

    + +

    This function is meant to be used internally. Only use when debugging.

    + +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.5.1.

    +
    + +
    +
    + + + + + + + + + + + diff --git a/docs/reference/sf_update_attachment_rest.html b/docs/reference/sf_update_attachment_rest.html new file mode 100644 index 00000000..b3179e58 --- /dev/null +++ b/docs/reference/sf_update_attachment_rest.html @@ -0,0 +1,248 @@ + + + + + + + + +Update Attachment using REST API — sf_update_attachment_rest • salesforcer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Update Attachment using REST API

    +
    + +
    sf_update_attachment_rest(
    +  attachment_input_data,
    +  object_name = c("Attachment"),
    +  control,
    +  ...,
    +  verbose = FALSE
    +)
    + + +

    Note

    + +

    This function is meant to be used internally. Only use when debugging.

    + +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.5.1.

    +
    + +
    +
    + + + + + + + + + + + diff --git a/docs/reference/sf_update_attachment_soap.html b/docs/reference/sf_update_attachment_soap.html new file mode 100644 index 00000000..a9e6c11b --- /dev/null +++ b/docs/reference/sf_update_attachment_soap.html @@ -0,0 +1,248 @@ + + + + + + + + +Update Attachment using SOAP API — sf_update_attachment_soap • salesforcer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Update Attachment using SOAP API

    +
    + +
    sf_update_attachment_soap(
    +  attachment_input_data,
    +  object_name = c("Attachment"),
    +  control,
    +  ...,
    +  verbose = FALSE
    +)
    + + +

    Note

    + +

    This function is meant to be used internally. Only use when debugging.

    + +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.5.1.

    +
    + +
    +
    + + + + + + + + + + + diff --git a/docs/reference/sf_update_bulk_v1.html b/docs/reference/sf_update_bulk_v1.html index 8b4cd39f..9254eda6 100644 --- a/docs/reference/sf_update_bulk_v1.html +++ b/docs/reference/sf_update_bulk_v1.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_update_bulk_v2.html b/docs/reference/sf_update_bulk_v2.html index c2d705cb..4c5c1105 100644 --- a/docs/reference/sf_update_bulk_v2.html +++ b/docs/reference/sf_update_bulk_v2.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_update_metadata.html b/docs/reference/sf_update_metadata.html index f92e9efe..c491dec3 100644 --- a/docs/reference/sf_update_metadata.html +++ b/docs/reference/sf_update_metadata.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_update_report.html b/docs/reference/sf_update_report.html index ca946f3d..1742b3dc 100644 --- a/docs/reference/sf_update_report.html +++ b/docs/reference/sf_update_report.html @@ -99,7 +99,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -183,7 +183,7 @@
    @@ -232,9 +232,29 @@

    Value

    +

    Salesforce Documentation

    + + + + +

    See also

    - +

    Examples

    if (FALSE) { diff --git a/docs/reference/sf_update_rest.html b/docs/reference/sf_update_rest.html index e712baa6..117e4b4e 100644 --- a/docs/reference/sf_update_rest.html +++ b/docs/reference/sf_update_rest.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_update_soap.html b/docs/reference/sf_update_soap.html index e2211f3e..42c62ffd 100644 --- a/docs/reference/sf_update_soap.html +++ b/docs/reference/sf_update_soap.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_upload_complete_bulk.html b/docs/reference/sf_upload_complete_bulk.html index 214ad89d..2d92988e 100644 --- a/docs/reference/sf_upload_complete_bulk.html +++ b/docs/reference/sf_upload_complete_bulk.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_upsert.html b/docs/reference/sf_upsert.html index 6dc37771..1ef9172f 100644 --- a/docs/reference/sf_upsert.html +++ b/docs/reference/sf_upsert.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    @@ -208,7 +208,9 @@

    Arg input_data

    named vector, matrix, data.frame, or -tbl_df; data can be coerced into a data.frame

    +tbl_df; data can be coerced into a data.frame. If performing an +update, upsert, or delete operation, then one column or +field must be the Id of the record to modify or delete.

    object_name diff --git a/docs/reference/sf_upsert_bulk_v1.html b/docs/reference/sf_upsert_bulk_v1.html index 769fc17c..e89c7dba 100644 --- a/docs/reference/sf_upsert_bulk_v1.html +++ b/docs/reference/sf_upsert_bulk_v1.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1

    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_upsert_bulk_v2.html b/docs/reference/sf_upsert_bulk_v2.html index 459d2454..dc1def97 100644 --- a/docs/reference/sf_upsert_bulk_v2.html +++ b/docs/reference/sf_upsert_bulk_v2.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_upsert_metadata.html b/docs/reference/sf_upsert_metadata.html index 5c4c25a5..805b122b 100644 --- a/docs/reference/sf_upsert_metadata.html +++ b/docs/reference/sf_upsert_metadata.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/sf_upsert_rest.html b/docs/reference/sf_upsert_rest.html index d8e42497..77698ccf 100644 --- a/docs/reference/sf_upsert_rest.html +++ b/docs/reference/sf_upsert_rest.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_upsert_soap.html b/docs/reference/sf_upsert_soap.html index 2d348f56..71bd8c8e 100644 --- a/docs/reference/sf_upsert_soap.html +++ b/docs/reference/sf_upsert_soap.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/sf_user_info.html b/docs/reference/sf_user_info.html index 46645bf2..2a0acebe 100644 --- a/docs/reference/sf_user_info.html +++ b/docs/reference/sf_user_info.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/sf_write_csv.html b/docs/reference/sf_write_csv.html index 04da71db..93bc3691 100644 --- a/docs/reference/sf_write_csv.html +++ b/docs/reference/sf_write_csv.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/simplify_report_metadata.html b/docs/reference/simplify_report_metadata.html index bc48a1d1..72594939 100644 --- a/docs/reference/simplify_report_metadata.html +++ b/docs/reference/simplify_report_metadata.html @@ -100,7 +100,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -184,7 +184,7 @@
    diff --git a/docs/reference/stop_w_errors_listed.html b/docs/reference/stop_w_errors_listed.html index 2f01116e..52742f3e 100644 --- a/docs/reference/stop_w_errors_listed.html +++ b/docs/reference/stop_w_errors_listed.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/token_available.html b/docs/reference/token_available.html index 116a6fdf..e47f6cbd 100644 --- a/docs/reference/token_available.html +++ b/docs/reference/token_available.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/unbox_list_elements.html b/docs/reference/unbox_list_elements.html new file mode 100644 index 00000000..d2709261 --- /dev/null +++ b/docs/reference/unbox_list_elements.html @@ -0,0 +1,261 @@ + + + + + + + + +Unlist all list elements of length 1 if they are not a list — unbox_list_elements • salesforcer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    This function wraps a simple modify_if function +to "unbox" list elements. This is helpful when the as_list +returns elements of XML and the element value is kept as a list of length 1, +even though it could be a single primitive data type (e.g. logical, +character, etc.).

    +
    + +
    unbox_list_elements(x)
    + +

    Arguments

    + + + + + + +
    x

    list; a list to be cleaned.

    + +

    Value

    + +

    list containing NA in place of NULL element values.

    +

    Note

    + +

    This function is meant to be used internally. Only use when debugging.

    + +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.5.1.

    +
    + +
    +
    + + + + + + + + + + + diff --git a/docs/reference/unbox_list_elements_recursively.html b/docs/reference/unbox_list_elements_recursively.html new file mode 100644 index 00000000..66a2a420 --- /dev/null +++ b/docs/reference/unbox_list_elements_recursively.html @@ -0,0 +1,261 @@ + + + + + + + + +Recursively unlist all list elements of length 1 if they are not a list — unbox_list_elements_recursively • salesforcer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    This function wraps a simple modify_if function +to recursively "unbox" list elements. This is helpful when the +as_list returns elements of XML and the element value is +kept as a list of length 1, even though it could be a single primitive data +type (e.g. logical, character, etc.).

    +
    + +
    unbox_list_elements_recursively(x)
    + +

    Arguments

    + + + + + + +
    x

    list; a list to be cleaned.

    + +

    Value

    + +

    list containing "unboxed" list elements.

    +

    Note

    + +

    This function is meant to be used internally. Only use when debugging.

    + +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.5.1.

    +
    + +
    +
    + + + + + + + + + + + diff --git a/docs/reference/unnest_col.html b/docs/reference/unnest_col.html index 48168b54..b6016aff 100644 --- a/docs/reference/unnest_col.html +++ b/docs/reference/unnest_col.html @@ -97,7 +97,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -181,7 +181,7 @@
    diff --git a/docs/reference/valid_metadata_list.html b/docs/reference/valid_metadata_list.html index acac22e6..1adfdf18 100644 --- a/docs/reference/valid_metadata_list.html +++ b/docs/reference/valid_metadata_list.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/validate_get_all_jobs_params.html b/docs/reference/validate_get_all_jobs_params.html index d50da406..06352b72 100644 --- a/docs/reference/validate_get_all_jobs_params.html +++ b/docs/reference/validate_get_all_jobs_params.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/warn_w_errors_listed.html b/docs/reference/warn_w_errors_listed.html index c6df89e2..9eff25f9 100644 --- a/docs/reference/warn_w_errors_listed.html +++ b/docs/reference/warn_w_errors_listed.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/reference/xmlToList2.html b/docs/reference/xmlToList2.html index 10b16ba8..cc24f171 100644 --- a/docs/reference/xmlToList2.html +++ b/docs/reference/xmlToList2.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/xml_drop_and_unlist.html b/docs/reference/xml_drop_and_unlist.html index 52054eb1..4dc0b575 100644 --- a/docs/reference/xml_drop_and_unlist.html +++ b/docs/reference/xml_drop_and_unlist.html @@ -100,7 +100,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -184,7 +184,7 @@
    diff --git a/docs/reference/xml_drop_and_unlist_recursively.html b/docs/reference/xml_drop_and_unlist_recursively.html index e23fc576..fb4972db 100644 --- a/docs/reference/xml_drop_and_unlist_recursively.html +++ b/docs/reference/xml_drop_and_unlist_recursively.html @@ -98,7 +98,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -182,7 +182,7 @@
    diff --git a/docs/reference/xml_extract_parent_and_child_result.html b/docs/reference/xml_extract_parent_and_child_result.html index fc9c7dd5..8740a88c 100644 --- a/docs/reference/xml_extract_parent_and_child_result.html +++ b/docs/reference/xml_extract_parent_and_child_result.html @@ -100,7 +100,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -184,7 +184,7 @@
    diff --git a/docs/reference/xml_nodeset_to_df.html b/docs/reference/xml_nodeset_to_df.html index b364ef7c..272ab68e 100644 --- a/docs/reference/xml_nodeset_to_df.html +++ b/docs/reference/xml_nodeset_to_df.html @@ -96,7 +96,7 @@ salesforcer - 0.2.0 + 0.2.1
    @@ -180,7 +180,7 @@
    diff --git a/docs/sitemap.xml b/docs/sitemap.xml index c3192173..dd70c0ae 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -249,6 +249,9 @@ https://stevenmmortimer.github.io/salesforcer/reference/make_rest_objects_url.html + + https://stevenmmortimer.github.io/salesforcer/reference/make_rest_record_url.html + https://stevenmmortimer.github.io/salesforcer/reference/make_search_url.html @@ -273,9 +276,15 @@ https://stevenmmortimer.github.io/salesforcer/reference/parameterized_search_control.html + + https://stevenmmortimer.github.io/salesforcer/reference/parse_error_code_and_message.html + https://stevenmmortimer.github.io/salesforcer/reference/parse_report_detail_rows.html + + https://stevenmmortimer.github.io/salesforcer/reference/patched_tempdir.html + https://stevenmmortimer.github.io/salesforcer/reference/rDELETE.html @@ -489,6 +498,9 @@ https://stevenmmortimer.github.io/salesforcer/reference/sf_delete.html + + https://stevenmmortimer.github.io/salesforcer/reference/sf_delete_attachment.html + https://stevenmmortimer.github.io/salesforcer/reference/sf_delete_bulk_v1.html @@ -744,6 +756,18 @@ https://stevenmmortimer.github.io/salesforcer/reference/sf_update.html + + https://stevenmmortimer.github.io/salesforcer/reference/sf_update_attachment.html + + + https://stevenmmortimer.github.io/salesforcer/reference/sf_update_attachment_bulk_v1.html + + + https://stevenmmortimer.github.io/salesforcer/reference/sf_update_attachment_rest.html + + + https://stevenmmortimer.github.io/salesforcer/reference/sf_update_attachment_soap.html + https://stevenmmortimer.github.io/salesforcer/reference/sf_update_bulk_v1.html @@ -798,6 +822,12 @@ https://stevenmmortimer.github.io/salesforcer/reference/token_available.html + + https://stevenmmortimer.github.io/salesforcer/reference/unbox_list_elements.html + + + https://stevenmmortimer.github.io/salesforcer/reference/unbox_list_elements_recursively.html + https://stevenmmortimer.github.io/salesforcer/reference/unnest_col.html diff --git a/index.Rmd b/index.Rmd index b17726af..99070a4d 100644 --- a/index.Rmd +++ b/index.Rmd @@ -18,7 +18,7 @@ options(tibble.print_min = 5L, tibble.print_max = 5L) [![CRAN Status](https://www.r-pkg.org/badges/version/salesforcer)](https://cran.r-project.org/package=salesforcer) [![Lifecycle: Maturing](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://www.tidyverse.org/lifecycle/#maturing) [![Monthly Downloads](https://cranlogs.r-pkg.org/badges/last-month/salesforcer)](https://cran.r-project.org/package=salesforcer) -[![Coverage Status](https://codecov.io/gh/StevenMMortimer/salesforcer/branch/master/graph/badge.svg)](https://codecov.io/gh/StevenMMortimer/salesforcer?branch=master) +[![Coverage Status](https://codecov.io/gh/StevenMMortimer/salesforcer/branch/main/graph/badge.svg)](https://codecov.io/gh/StevenMMortimer/salesforcer?branch=main)
    @@ -53,6 +53,21 @@ Package features include: * Passing API call control parameters such as, "All or None", "Duplicate Rule", "Assignment Rule" execution and many more! +**CAUTION: The most recent release, {salesforcer 0.2.1}, requires {dplyr 1.0.0} +because {dplyr 1.0.1} introduced a bug in `bind_rows()` with how it binds +lists where the list elements have differing lengths. This is documented in +tidyverse/dplyr#5417 and r-lib/vctrs#1073. The timeline for a fix is unknown as +of August 2020, but a new version of {salesforcer} (0.2.2) will be released +immediately following the {dplyr} fix.** + +You can install the older version of {dplyr} using the following command: + +```r +# remove.packages("dplyr") +# install.packages("remotes") +remotes::install_version("dplyr", "1.0.0") +``` + ## Table of Contents * [Installation](#installation) * [Vignettes](#vignettes) @@ -70,7 +85,7 @@ Package features include: ## Installation ```{r, eval = FALSE} -# install the current CRAN version (0.2.0) +# install the current CRAN version (0.2.1) install.packages("salesforcer") # or get the development version on GitHub diff --git a/index.md b/index.md index fc3fd93a..1844658f 100644 --- a/index.md +++ b/index.md @@ -10,7 +10,7 @@ Maturing](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://www [![Monthly Downloads](https://cranlogs.r-pkg.org/badges/last-month/salesforcer)](https://cran.r-project.org/package=salesforcer) [![Coverage -Status](https://codecov.io/gh/StevenMMortimer/salesforcer/branch/master/graph/badge.svg)](https://codecov.io/gh/StevenMMortimer/salesforcer?branch=master) +Status](https://codecov.io/gh/StevenMMortimer/salesforcer/branch/main/graph/badge.svg)](https://codecov.io/gh/StevenMMortimer/salesforcer?branch=main)
    @@ -52,6 +52,23 @@ Package features include: - Passing API call control parameters such as, “All or None”, “Duplicate Rule”, “Assignment Rule” execution and many more\! +**CAUTION: The most recent release, {salesforcer 0.2.1}, requires {dplyr +1.0.0} because {dplyr 1.0.1} introduced a bug in `bind_rows()` with how +it binds lists where the list elements have differing lengths. This is +documented in tidyverse/dplyr\#5417 and r-lib/vctrs\#1073. The timeline +for a fix is unknown as of August 2020, but a new version of +{salesforcer} (0.2.2) will be released immediately following the {dplyr} +fix.** + +You can install the older version of {dplyr} using the following +command: + +``` r +# remove.packages("dplyr") +# install.packages("remotes") +remotes::install_version("dplyr", "1.0.0") +``` + ## Table of Contents - [Installation](#installation) @@ -70,7 +87,7 @@ Package features include: ## Installation ``` r -# install the current CRAN version (0.2.0) +# install the current CRAN version (0.2.1) install.packages("salesforcer") # or get the development version on GitHub @@ -168,8 +185,8 @@ created_records #> # A tibble: 2 x 2 #> id success #> -#> 1 0033s000013wZZDAA2 TRUE -#> 2 0033s000013wZZEAA2 TRUE +#> 1 0033s0000149YezAAE TRUE +#> 2 0033s0000149Yf0AAE TRUE ``` ### Query @@ -194,8 +211,8 @@ queried_records #> # A tibble: 2 x 3 #> Id FirstName LastName #> -#> 1 0033s000013wZZDAA2 Test Contact-Create-1 -#> 2 0033s000013wZZEAA2 Test Contact-Create-2 +#> 1 0033s0000149YezAAE Test Contact-Create-1 +#> 2 0033s0000149Yf0AAE Test Contact-Create-2 ``` **NOTE**: In the example above, you’ll notice that the `"Account.Name"` @@ -232,8 +249,8 @@ updated_records #> # A tibble: 2 x 2 #> id success #> -#> 1 0033s000013wZZDAA2 TRUE -#> 2 0033s000013wZZEAA2 TRUE +#> 1 0033s0000149YezAAE TRUE +#> 2 0033s0000149Yf0AAE TRUE ``` ### Bulk Operations @@ -270,8 +287,8 @@ created_records #> # A tibble: 2 x 4 #> Id Success Created Error #> -#> 1 0033s000013wZZIAA2 TRUE TRUE NA -#> 2 0033s000013wZZJAA2 TRUE TRUE NA +#> 1 0033s0000149Yf4AAE TRUE TRUE NA +#> 2 0033s0000149Yf5AAE TRUE TRUE NA # query large recordsets using the Bulk API my_soql <- sprintf("SELECT Id, @@ -286,8 +303,8 @@ queried_records #> # A tibble: 2 x 3 #> Id FirstName LastName #> -#> 1 0033s000013wZZIAA2 Test Contact-Create-1 -#> 2 0033s000013wZZJAA2 Test Contact-Create-2 +#> 1 0033s0000149Yf4AAE Test Contact-Create-1 +#> 2 0033s0000149Yf5AAE Test Contact-Create-2 # delete these records using the Bulk 2.0 API deleted_records <- sf_delete(queried_records$Id, "Contact", api_type = "Bulk 2.0") @@ -295,8 +312,8 @@ deleted_records #> # A tibble: 2 x 4 #> Id sf__Id sf__Created sf__Error #> -#> 1 0033s000013wZZIAA2 0033s000013wZZIAA2 FALSE NA -#> 2 0033s000013wZZJAA2 0033s000013wZZJAA2 FALSE NA +#> 1 0033s0000149Yf4AAE 0033s0000149Yf4AAE FALSE NA +#> 2 0033s0000149Yf5AAE 0033s0000149Yf5AAE FALSE NA ``` ### Using the Metadata API diff --git a/vignettes/transitioning-from-RForcecom.Rmd b/vignettes/transitioning-from-RForcecom.Rmd index bf3f2122..bbdf4b94 100644 --- a/vignettes/transitioning-from-RForcecom.Rmd +++ b/vignettes/transitioning-from-RForcecom.Rmd @@ -39,7 +39,7 @@ implemented by {RForcecom}. Here is an example running the function from each of the packages side-by-side and producing the same result. ```{r auth, include = FALSE} -suppressWarnings(suppressMessages(library(dplyr))) +library(dplyr, warn.conflicts = FALSE) library(salesforcer) username <- Sys.getenv("SALESFORCER_USERNAME")