SAP CPQ Setup and Administration Guide
SAP CPQ Setup and Administration Guide
1 Administration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.1 Formula Builder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
CTX Syntax Builder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Table Tag Builder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2 Global Information (GI) Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Creating GI Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Retrieving GI Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3 Object Identifier (System ID). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.4 SAP CPQ Administrator Analytics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22
1.5 Supported Browsers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.6 Tags and Expressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.7 Setup Home. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23
2 Product Administration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1 Attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Controlling Attribute Access Rights via Iron Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Attribute Container. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Attribute Quantity. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Attributes Spanning Multiple Columns. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42
Import/Export Attribute Translations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .43
Attribute Values as Line Items. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44
Autocomplete Attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Creating Attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
ItemQuantity Attribute. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
2.2 Products. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Product Editor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Code Matching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Rules Administration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
BOM Administration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Bulk Product Import/Export. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Custom Configurator XSLT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Discontinue or Replace Simple Products. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Drilldown. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .74
Create Product Alias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Product Attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Product Copy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Product Display Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5 Workflow-Approvals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
5.1 Workflow Actions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Conditional Reconfigure Action. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Auto Quote Expiration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Action Details. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Approval Reminder Action. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Global Condition for Quote Action. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
5.2 Outbound SAP CPQ Emails. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
5.3 Notifications. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
Notification Implementation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
Approval via PDA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
One-click Approval HTML Email Template. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .347
5.4 Email Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
5.5 Approval Rules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
Parallel Approval. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
Approval Process Administration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .366
Approval Rules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Submit Upstream. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .379
5.6 Statuses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
6 Pricing/Calculations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
6.1 Cart Fields Administration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Status - User Group Grid. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Adding/Removing Editable Fields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Editable Quote Comment Field. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Recurring Rolled-Up Fields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Rolled-Up Cost and Margin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
6.2 Pricebooks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .406
Effective Dates for Price Book Entries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
Pricing Dynamic Part Numbers and Attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Promotions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
6.3 Currencies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
6.4 Markets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
6.5 Market Visibility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
6.6 Discounts/Multipliers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
6.7 Discount Priorities. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
6.8 Total Amount Limit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
6.9 Margin Health. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Create Margin Health Indicators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Margin Health Design and Visibility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Margin Health Action. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
6.10 Margin Health Indicators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
6.11 Margin Health Design and Visibility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
6.12 Country Sales Tax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
6.13 Edit Item Cost on Cart. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
6.14 Preserve Original Currency Rates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
6.15 Recurring and Non-Recurring Prices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .448
6.16 Rounding Setup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
6.17 Shipping. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
6.18 State Sales Tax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
6.19 Price Code in Pricing Calculations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
8 UI Design. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
8.1 Branding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
8.2 Custom Category UI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
8.3 Catalog Layout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
8.4 Freeze Templates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
8.5 Product Configuration Templates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
8.6 Product Details Templates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
8.7 Products to Product Details Templates Mappings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
8.8 Responsive Templates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
8.9 Styles and Images. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
8.10 Top Menu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
8.11 Responsive Design Customizations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Prerequisites. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .480
Knockout Extension Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Customization Examples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Advanced Customization Examples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Server Side Rendering. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Manage Custom CSS/JS Files with File Manager. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .540
Upgrade Templates to Newer Versions with Newer Releases. . . . . . . . . . . . . . . . . . . . . . . . . . 542
8.12 Customized HTML Templates and Fixes for Breaking Changes. . . . . . . . . . . . . . . . . . . . . . . . . . . 543
10 Scripting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
10.1 Create a Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609
10.2 Custom Actions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
10.3 Custom Calculations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
10.4 Script Workbench. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
14 Security. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
14.1 Automatic Data Deletion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
Blocked Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734
General Deletion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738
Audit Trail Deletion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742
14.2 Personally Identifiable Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744
Personal Data Log. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Sensitive Personally Identifiable Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
View/Export Personally Identifiable Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
14.3 WSDL Management and SSL Certificates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
Certificate Management. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
WSDL Management. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752
14.4 Access Rights. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Assign Access Rights for Setup Sections. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754
Assign Access Rights for Setup Sections and Entities. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755
Assign Access Rights Administrators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 756
Access Rights and Custom Table Deployment. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .756
14.5 DKIM Support for Outbound Emails. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 756
Tags and expressions are a powerful part of SAP CPQ. To help reduce errors and simplify the process, the
Formula Builder is available to create expressions.
To access the Formula Builder, click the button next to the field where the expression is applied.
This button is available anytime an expression can be used. Clicking a Formula Builder button brings up the
Formula Builder window. Formula Builder changes according to the settings the expression is created for.
For example, if an expression is being added for a Rule (see the chapter on RulesRules Administration [page
65]) or Trigger (see the chapter on TriggersTriggers [page 94]), then an additional Triggers/Rules box will be
displayed with the Formula Builder. In addition, if you are building an expression that is related to a quote, such
as quote visibility rules, then the window will look like the figure on the left. The basic principles for using the
Formula Builder are the same despite what setting the expression is being created for.
The Formula Builder window is divided into two sections. The main box at the bottom is where the expression is
formed. Expressions can be typed in manually, if necessary, and in certain instances, phrases can be entered
into the box to be displayed to the user. The Check Syntax button checks the expression to ensure that the tags
The top section of the Formula Builder windows contains boxes to build the expression. In most cases, to build
an expression, you select the attribute, value, sequence, and so on, that an action is performed on, then select
the action. The top section is also categorized. To the right, you have operators, and to the left you have
context-sensitive options divided into 3 tabs (Variables, Actions / Conditions (depends on the context),
Sequences). Note that you sometimes see Actions, while other times you see Conditions as the second tab,
depending on the context. Sometimes both are unavailable. When the Syntax Checker opens, it activates the
tab that contains the most appropriate options for the given context.
An Select Operator box is available in every Formula Builder window to create conditional statements and
Boolean logic. Click the operator in the box and then click Insert Operator into the expression. In most cases,
the operator is added in its full syntax, with all parenthesis, and you only need to fill in the parameters. This
formula is an example of an expression using an operator: [AND](<*ANYSEL(Hard
To create an expression in the Formula Builder, select an action/condition/variable, then (if needed) select
attributes. Attribute values can also be selected for the expression if necessary. Click the Insert button to add
the new tag to the expression. Sequences can also be used in expressions by selecting the sequence from the
Select Operator box in the Sequence tab, then selecting the sequence for it (see the chapter on
SequencesSequences [page 131]).
The attributes displayed in the box are only the ones selected for that product or category, depending on what
you are creating the expression for (applies to all Formula Builder windows. If a certain object, attribute or an
attribute value isn’t available, make sure it’s checked, selected, or even created for the settings the expression
is being created for.
The actions are also different for each Formula Builder window. For information on what an action does, check
Attribute Data TagsAttribute Data Tags [page 695]. This topic also contains information on the proper way to
join tags and create expressions. While the Formula Builder aids in the process of creating expressions, tags
need to be joined and built correctly in order for the expression to function accurately.
Note that building some variables is complicated if you use syntax checker alone. Such is the case with <*
CTX(…) *> and <* TABLE(…) *> objects. When you need to insert these variables, select them from the list.
A new button appears (for example Construct TABLE tag), and clicking it brings up a new popup window where
you can build your complex tag.
Once you have finished building your complex tag, you can insert it into syntax builder window and continue
building the rest of your formula. For more information on complex tags and their builders, refer to Table Tag
Builder [page 15] and CTX Syntax BuilderCTX Syntax Builder [page 14].
Each Formula Builder also has a Visualize button that can ease formula creation.
Since SAP CPQ formulas are essentially expressions and not the algorithm (the program), a tree control can be
used to display them. Tag names are colored blue and operators are colored green.
Tags are displayed as nodes that can have children nodes if the tag has arguments. If another tag is in the
argument of a tag, same definition is recurrently applied.
As exception, tags that take comma/colon and comma/colon/bar arguments are shown differently.
[OR](a,b,c)
Special operator IF is shown as a main node with tree child nodes representing condition, true and false
branches.
It only allows you to select tags and objects that make a valid formula. CTX objects are selected from dropdown
lists, until you select all required elements. As you select objects, the CTX formula is dynamically rebuilt to
display your CTX formula.
As you select CTX objects from the dropdown lists, there’s a possibility that you encounter objects, which
require an argument to be entered. You can easily spot these types of objects as another dropdown list (or free
input text field) displays to the right of the one you've selected.
When you've finished building your formula, click Insert to have it transferred to the syntax checker (that
invoked CTX syntax builder). Make sure that you've made selections in every offered dropdown list. If you leave
any dropdown in –select– state, your formula is incomplete. If you try to insert such a formula, an error
message displays, and CTX syntax builder window can't be closed, leaving you the opportunity to fix your
selection. This way, there’s small possibility that you manage to build a CTX formula that isn’t valid.
The <* TABLE (…) *> tag is used to fetch data from data tables uploaded by customers. It allows users to
use SQL aggregate functions: MIN, MAX, AVG, SUM, COUNT, as well as match upper and match lower. You can
also retrieve records greater than some entered value.
● EXACT
A default function. It returns anything that is selected, without any data filtering. It's similar to the AUX tag
behavior - the difference is that AUX must use the = operator for conditions. The typical TABLE tag based
on the EXACT function looks like this:
<* TABLE (SELECT price FROM priceBook WHERE productId = 5 ) *>
The EXACT function reveals a classic SQL Select statement. If the statement returns more than one record
from the database, only the first one returned is the result of the <* TABLE(…) *> tag. If you need the last
one, you can change sorting direction. Since there’s no guarantee on order SQL server return records, if
you don't use sorting, it's best to prepare data and use queries in such way that they return unique records.
● MIN
A function that returns minimal value from all the results that are meeting the given criteria. The typical
TABLE tag based on MIN function looks like this:
<* TABLE (SELECT MIN (price) FROM priceBook WHERE productId = 5 ) *>
The MIN function returns one record, the minimal one among all the records that satisfy given conditions.
● MAX
A function that returns maximal value from all the results that are meeting the given criteria. The typical
TABLE tag based on MAX function looks like this:
<* TABLE (SELECT MAX (price) FROM priceBook WHERE productId = 5 ) *>
The MAX function returns one record, the greatest one among all the records that satisfy the given
conditions.
● COUNT
A function that counts all records that meet the given conditions. The typical TABLE tag based on the
COUNT function looks like this:
<* TABLE (SELECT COUNT (price) FROM priceBook WHERE productId = 5 ) *>
The COUNT function returns one record.
The returned results can be sorted Ascending, Descending, or not sorted at all. Only the column that contains
results can be sorted. When match upper or match lower condition operator is used, sorting is first
performed by the column that is used in condition, and then by resulting column.
Table tag builder is invoked from the Formula Builder. On the list of tags, there’s a TABLE tag listed. When it’s
selected, a Construct TABLE tag button appears. This button is visible only when the TABLE tag is selected in
the list of tags.
Clicking Construct TABLE tag opens the Table Tag Builder window.
In Table Tag Builder, you first need to select a table from which you’re fetching the data. It's the dropdown
labeled From Table. Next to the dropdown is the Preview Table Data button, which enables you to preview the
first 25 rows of your uploaded table. It's meant to allow administrators to construct TABLE tags by showing
them data sample of the selected table.
The table shows only first 25 records. It's meant to preview table structure rather than check table data. Since
custom tables can be huge, it's not recommended to fetch large amounts of data since it tends to result in
timeouts and stress to server.
After selecting the table, you need to select a function that returns data. The dropdown list you need is labeled
Return. The default is EXACT function. Afterwards, you need to choose a column from which you wish to fetch
the data from the From Column dropdown list.
The data can be sorted by that column, but it's optional. If you like, you can choose the sorting type to be
ascending, descending, or to leave it as None, which is a default option. If you want sorting to be precise, you
need to define the data type in that column (numbers, text, or dates). The data type needs to be set correctly,
or else you can get incorrect sorting. For example, f you sort numbers as if they were text, the output is: 1,
10, 2, 3, 4, 5,…
When you define the column you wish to use, you need to set the conditions on that column, in order to fetch
only the rows that you need. You can add as many conditions as you wish. New conditions are added by clicking
You have a Syntax Builder button there, so you can easily construct formulas for your conditions. Every
condition has a Column Type. It’s necessary because the SQL that fetches your data is different depending on
whether the comparison is done with numeric values, text values, or date values. If an error message displays
when you test the formula, recheck your column types. There’s a possibility that you’re fetching a column
whose values can’t be converted to the data type you wish. For example, you can't convert abc to the numeric
type, but you can enter numbers that correspond to that string.
After defining the data and the conditions, you can click Build Formula link, and you can preview the resulting
TABLE tag constructed. The area that displays your generated TABLE tag is editable, so you can alter the SQL
yourself. However, if you alter SQL manually, and then click Build Formula again, your complete formula is lost
and replaced by newly generated TABLE tag formula, based on what you selected from dropdown lists. Thus,
make sure that you alter SQL manually only once you've defined it enough with the Table Tag Builder. You can
use the Test Formula link when you finish editing the TABLE tag. When you click on it, your SQL is executed and
you’re presented with the data it returned. If you had an error in your SQL, it doesn't return any data. Instead,
an error message displays, giving you a clue what you did wrong.
While testingTABLE tags, if you used any formulas in your conditions, you must replace them temporarily with
values you expect formulas to evaluate to. For example, if you had a condition that contains “product_color
= ';#;<* CATCODE(selected_color_attribute) *>;#;'”, you must alter your condition to state: -
“product_color = 'blue'“. This alteration is necessary, since the CATCODE formula (and all other
formulas) is context-dependent, and can't be parsed in the Table Tag Builder. In the sample above, it simply
doesn’t know about the “selected_color_attribute” attribute, so it can't return its catalog code. Once
you're satisfied with the results, you can click on Use This Formula button, and your TABLE tag is checked for
errors. If it's OK, it's transferred to the Syntax Checker that invoked the Table Tag Builder.
The <* TABLE(…) *> tag supports adding multiple conditions to your data query. The typical condition is
defined by the name of the column being tested, and by the matching criteria.
The typical example is: “give me price of the product that has a catalog code ABC”. Price is defined in one
column, and every price has its catalog code in the catalog_code column. So, our criteria instructs that
catalog_code is ABC. Use the following query in SQL:
Now, we can use multiple conditions. For example, if quantity affects the price, we need to treat the quantity
column in the same table. The SQL now looks like this:
In this way, we can add as many conditions as we like. They’re all concatenated with AND operator, meaning
that all the conditions must be met in order to fetch the data.
Operators are words or characters typically used in SQL statements as conjunctions for several conditions.
Depending on data types you expect in a condition column, not all condition operators are available. The
supported operators are:
⇐ Number; Date
● begins with
This operator is typically used to search string columns. It’s used to search if there’s data in a column that
begins with string provided as a parameter. This only works on text column types. It’s translated to the SQL
LIKE clause, with % at the end - searching for strings that begin with preset parameter and can end with
anything.
Example
● ends with
This operator is typically used to search string columns. It’s used to search if there’s data in a column that
ends with string provided as a parameter. This only works on text column types. It’s translated to the SQL
LIKE clause, with % at the beginning – searching for strings that end with preset parameter and can begin
with anything.
Example
● matches
This operator is typically used to search string columns. It’s used to search if there’s data in a column that
contains string provided as a parameter. This only work on text column types. It’s translated to the SQL
LIKE clause, with % at the beginning and with % on the end – searching for strings that begin with anything
and end with anything, but must contain provided string.
● match lower
This only works on numeric and date column types. This operator is typically used for doing some sort of
rounding of the input parameter in condition.
Example
There's a table that contains prices for products. It typically has 3 columns: product_catalog_code,
order_quantity, and price. For a given product, price varies depending on quantity. However, in the
prices table, there are prices defined for quantities 1, 5, 10, 50. So, since there isn't “7” as a value for
quantity in prices table, you need to set up a condition that uses the nearest lower value for the
quantity column. In this case, select column order_quantity and the match lower operator.
Enter a formula that reads quantity attribute. (that is the source of “7” in the previous example). If
you click the Rebuild button, you get SQL that looks like: SELECT TOP 1 price FROM table WHERE
quantity<7 ORDER BY quantity DESC. This way you have set up the condition to form a price
based on quantity. You still need additional condition that identifies the product by part number (that
condition uses the typical = operator). When this condition is added, you have a complete query:
The query finally fetches the price for a given catalog code and quantity “5”. (first one less than the
input value - 7).
● match upper
This only works on numeric and date column types. This operator is similar to match lower. The only
difference is that it gets the first record that has greater value than the given reference. If you use the
example for match lower as reference, match upper selects the row with quantity value of 10 (the first
one greater than 7).
Example
SELECT TOP 1 price FROM table WHERE quantity>7 ORDER BY quantity ASC
● Inclusive and noninclusive options define if you use < operator or < = operator. The choice between these
options depends on whether you wish the formula to include a boundary from a condition, or not.
Global Information (GI) variables contain values that can be read by any product or quote.
This comprehensive way of holding information allows values to be passed among quotes and products
through the simple use of a tag. GI variables can be defined as a quote property, within a product model, or as a
separate cart level aggregate. No matter where the GI was defined, it is available across all categories and
products.
● Explicitly, GI variables are created by using the tag setGI in product rules, triggers, and so on.
To create a GI variable within an expression, use the tag <*setGI(key,value)*>. This tag can be used
anywhere that an expression can be built: rules, triggers, calculated fields, and so on. To create the GI,
enter a key by which the value is retrieved, then enter the value that the GI holds. The value can be text or
numeric, from a static value to a dynamic value using another expression. For example, to create a GI in an
expression, enter this formula: <*setGI(k100,100)*> (key = k100, value = 100).
● Implicitly, GI variables are created via cart aggregates and quote custom fields.
To create GI variables this way, go to Setup Quotes Cart Level Aggregates . By clicking Add New, the
window for creating a new GI variable displays. Specify the following:
○ GI Name – The key name by which the value of GI is retrieved.
○ Expression – Enter value for GI. It can be any text, numerical value, or expression.
Remember
A GI variable is also created implicitly when a quote custom field is created in Setup Quotes Custom
Fields (see the chapter on Custom Fields [page 272]).
Retrieving a value can be done by simply using the tag <*GI(key)*>. This tag can be used anywhere where
the value of the GI is needed. In addition, GI variables are accessible by Microsoft Word generated documents
(see Create Document Generation Template [page 189]). This is done by using the tag «ST_GI(key)». Using
this tag in a word quote document will display the value of the specified GI variable.
The only way to get customer info for the configuration is using the <*AUX*> tag, customer info table and
<*GI(customerID)*> as a condition. When a user does not select a customer, but when the customer gets
populated from CRM, we can get customer ID using GI tag <*GI(CUSTOMERID)*>.
Note
See Appendix A for a complete list of tags, including GI Tags [page 714].
Different objects in SAP CPQ have their own unique identifiers or system IDs.
● products
● attributes
● attribute values
● categories
● product types
● tabs
● configuration templates
● details templates
● user types
● shipping method
System ID is one of the fields that are displayed when you add or edit an existing object. It’s displayed under the
name field or next to it (such as the Attribute Value object form). System ID is created automatically based on
the name that you, as an administrator, type in the name field. As soon as you finish typing and leave the name
field, either by clicking elsewhere or by pressing Tab on the keyboard, the System ID field is populated with the
value that is unique for this object. System ID is constructed by replacing the spaces in the object name with
underscores and adding the suffix _cpq at the end. For example, if you create product with name Product
One, SAP CPQ creates the system ID with value Product_One_cpq. If this value is already assigned to some
another product, SAP CPQ attempts to create Product_One_1_cpq, then Product_One_2_cpq, and so on.
System ID can be modified. However, if you edit an object, the system ID is displayed as read-only. In order to
make it editable, click Edit. This action makes the field editable, but displays the warning message as well. If
you try to change the system ID and it happens that the same system ID already exists, an error message is
displayed. When you’re defining the attribute value, the system ID is created based on the attribute value code
(not display value) + attribute name. Additionally, when you export products, the column Product System ID is
added to the Microsoft Excel file.
When you import products, the system decides, based on the Product System ID column, whether the product
is going to be updated or created. If the column has a value for the particular product (represented by a row in
the Microsoft Excel file) this product is going to be created if the system ID doesn’t exist in the SAP CPQ, or
updated if it already exists. If column is missing or it’s empty, SAP CPQ assigns a system ID to the product the
same way as if the administrator created product manually.
The System Performance and the Business Performance pages provide high-level information about system
errors and quotes.
System Performance
The System Performance page displays the number of logged errors in the current session, the current day, and
the previous week. Additionally, you can access the Log and Developer Console [page 759] from this page.
Business Performance
The Business Performance page contains a tabular overview of all quotes created in the tenant and the details
on quotes and users who created them. Outside the table, there’s also the total number of created quotes, the
total, and the average quote amount. To filter data, use the date fields above the table. Additionally, you can
filter each column by entering the search term in the dedicated box and clicking Search. The filtering lets you
get an insight on the business performance, which is useful for planning future steps.
This topic contains the list of browsers currently supported by SAP CPQ.
For SAP CPQ to function properly, enable cookies and Javascript for all browsers.
Tags are used to obtain values from different SAP CPQ entities. The expressions are used for generating text or
calculating values based on the configuration data.
Tags can be used in many areas of SAP CPQ. Three major areas are a product model, quote, and document
generation templates. They’re used for obtaining values from the following SAP CPQ entities - Products,
Expressions are used for dynamically generating text or calculating values based on the configuration data.
Expressions can use string data, numeric data, math functions, if/then statements, and SAP CPQ tags.
Once logged in, you can access the administrative side by clicking Setup, which is located in the main
navigation toolbar on the left side of the page. Clicking this button displays the Setup Home page.
On the left side of the page, menu links for accessing the different administrative sections are available.
Clicking on any menu link with this icon expands the menu, displaying a number of submenu links. Main
navigation toolbar is always available on the left side of the screen. Most administrative sections in SAP CPQ
have the same look and feel.
● Storage Status in Current Month - two graphs visually representing the usage of the file system and the
database. There’s also a numerical representation of the total and used storage space in gigabytes.
● Total Storage Usage Per Month - graphical and numerical overview of the total storage usage per months
for images, documents, proposals and the database.
● Active Users - the tenant name and the respective number of total users, active and inactive users. By
default, users with @sap.com, @calliduscloud.com and @webcominc.com email domains are excluded
from the total number of users in a tenant, and therefore, they’re excluded from the total number of active
and unused users. In this context, active users are all users with a license, regardless of whether they’re
blocked, expired, and so on.
● User Activity in Current Month - the total number of user and administrator logins and the number of
created users. Clicking View opens a grid with a detailed overview for each user.
In the top-right corner of the shell bar, the following icons are located:
● Help
- clicking this icon opens the SAP CPQ online help page with more information about the page you’re
currently on in a new tab.
● Exit Setup - - clicking this icon redirects you to the SAP CPQ landing page.
● Log-out - clicking this icon logs you out of the current SAP CPQ environment.
The following topics explain the administration of products and attributes in the SAP CPQ Setup.
2.1 Attributes
Attributes are the building blocks of a product’s configuration. They can be used as a list of values selected by
the user, a calculation, a free input by the user, a display of text to the user, and many other ways.
An attribute is defined by a name, values, and type. User can create new attributes in a few ways. They can be
created individually through the Product Setup Wizard or through the Attribute administrative section. Both
allow creating one attribute at a time. If there’s need to create many attributes at a time, user can use the
Import Attribute administrative section (discussed in the Attribute Import [page 106] topic). All attributes
created in the system are available to all products. They’re then added to the product where further definition is
done, such as pricing, part numbers, and so on. An attribute can only be added to a product if it has been first
added to the category that the product is in. Only then it’s possible to use it in the product. If the attribute is
created through the Product Setup Wizard, though, then it’s added to the category and the product in the
single step of creating the attribute.
The Attributes section in the Setup allows managing all attributes that exist in the system. To access this
subsection select Attributes under the Products section. From this screen, attributes can be added, deleted,
edited, or copied. Clicking the Add New button brings up a blank attribute definition page:
Note
If you’re using the Value Code or Attribute Value in the rules of a product, any changes made to these values
in the attribute administration are made in the rules also. A change isn’t pushed to every area of the
product definition, though. So, it’s recommended that you always use the value code of an attribute value in
rules and calculations. Then any changes should be done only on the Attribute (Display) Value.
This initial screen has room for 5 values. More than 5 can be created by selecting Add More Values.
Using Iron Python, you can define whether an attribute is read-only, editable, or hidden.
● Read-only – attribute is disabled but it’s possible to set or change attribute value through Iron Python and
regular rules. In other words, the attribute behaves as if it was editable (in its default state), except that the
end user can’t interact with the attribute on the UI.
● Editable – attribute is enabled. This is default state of each attribute
● Hidden – attribute isn’t displayed in the Configurator.
This feature allows administrators to have attributes appear differently to various user types, or become read-
only once the quote reaches a certain status, or have a set of attributes that are read-only for certain user-
types, and so on. The Hidden option in Iron Python is an extension and override of Attribute Visibility
Restrictions that you can define in the Setup. Whatever you configure there’s reflected on the Hidden property
of the attribute, with the ability to be overridden by an Iron Python script.
Example 1
The snippet demonstrates how an Iron Python script can be used to check whether the particular attributes
should be made read-only based on the user-type. The script triggers when the configurator is entered to
configure the product. This
if User.UserType.Name == 'Customer':
Product.Attr("Interior Color").Access = AttributeAccess.ReadOnly
Product.Attr("Exterior Color").Access = AttributeAccess.ReadOnly
Example 2
In this example, the Iron Python script disables two attributes – “Interior Color” and “Exterior Color” only if the
quote status is Negotiation. The script triggers when the configurator is used to configure the product. When
the quote gets its status changed to Negotiation, two attributes get disabled.
Example 3
This example demonstrates how administrators are able to update the attribute value even if the attribute is
marked as read-only. The underlying Iron Python script of the Update value button is as follows:
Clicking the button updates the attribute-value through scripting even though the attribute is read-only.
Related Information
Rather than writing complex product rules where attributes need to be dynamically added to a configuration,
the administrator can use attribute containers which can be dynamically expanded, either by a set of attributes
or another product. A container has a table-like structure. Its columns are defined in attribute administration.
Its rows can be added and deleted in rules or manually during configuration. Each cell can have some value
according to its column definition.
Access Hidden Container Columns in Knockout Context in Responsive Design [page 39]
This feature allows access to information in hidden container columns in responsive design.
● column name
● whether the column is a stand-alone or an attribute
● display type - label, text box, check box, drop down list, list box...
● column total (optional)
When an attribute is referenced in a column with the display type Label, the attribute display value is visible in
the configurator.
Types of Columns
You’re allowed to define a container without any product and attribute. If this is the case, then its rows are just a
collection of cell values. For example: user defines a container with two columns ”Name” and ”Description”
both as text box stand alone columns. During configuration, you can enter a value in each row for both
columns.
Finally, you can define a container with products. In this case, each container row represents a product.
Columns of such container are stand alone columns and product attributes. Its rows are union of cell values
and selected product attribute values. Such container can be marked as line item in the product - then all its
rows appear in the cart as child line items of the main item. For example: First you define several products then
create a container with columns as some of attributes used in those products. During configuration of such
container each row is a product, and the user is able to edit that product attribute in line of container row.
The column value can be calculated automatically with a specific formula. The label column formula is
evaluated each time, while other column type formulas are evaluated only once when a row is added.
In the following case: a user defines text box columns "First Name", "Last Name" and the label column "Full
Name" with the following calculation formula: <*CTX(MyContainer.CurrentRow.Column(First
Name).Get)*><*CTX(MyContainer.CurrentRow.Column(Last Name).Get)*>as well as another text
box column "Date Added" with the following calculation formula: <*CTX(Date)*>. The "Full Name" column
value is updated every time when "First Name" or "Last Name" column value is changed while "Date Added" is
calculated only once when a row is added.
Depending on selected display option on product attribute details, the container column shows the selected
attribute value code (formula equivalent <*valuecode(attribute name)*>) or selected attribute display
value (formula equivalent <*value(attribute name)*>) where in case of attribute type User Input or
Computed - Date attribute display value gets validated against valid date string. Here is the list of attribute
display options that shows selected attribute value in container column:
● Button
● Display Only Text
● File Attachment
● Free Form exact match w. Otherwise option
● Free Form, Exact Match
● Free Form, Match lower
● Free Form, Match upper
● Free Form, Set Match lower
● Free Form, Set Match upper
● Free Input, no Matching
● Hidden calculated, Match lower
● Hidden calculated, Match upper
The rest of the attribute display options shows selected attribute value code.
For each container column is possible to define permissions per user type group. Possible values are:
● Hidden
● Read Only
● Editable
● Required
This allows, for example to hide a column from users of some user type group, make a column read only, make
it required, and so on. Default permission for all user type groups is Editable. Choosing a value from All
permissions sets that value to all user type groups. In the configurator, if there's any row that has an unfilled
column that was marked as Required in the admin, it makes the whole container invalid. You can validate
container state with the <*CTX( Container(AttributeContainerName).IsValid )*> tag.
Container columns can be sorted and viewed in the configurator in ascending and descending order. Column
sorting doesn’t affect the actual order on the quote. To sort a container column, click the column heading. An
arrow displays in the top-right corner of the column heading, showing whether column sorting is ascending or
descending. To switch between ascending and descending sort order, click the arrow. Numbers and strings
stored in a text field are sorted in the same way they’re sorted in Microsoft Excel spreadsheets.
Related Information
Container rows are added or deleted during configuration, manually by user or by a product rule. In
administration, it’s possible to define minimum and maximum constraints and whether or not rows can be
added, deleted, or moved.
When you set up the attribute container, choose more than one product that can be added to it, and the user
clicks to add a row during configuration, they’re introduced with the list of defined products that can be added.
Users must select one product per row. If there are no products in container or there’s just one, then you can
use a following tag in rules to add rows: Container(X).Rows.Add(2) (2 is the number of rows that are
added). On the other hand, if there’s more than one product in a container, following tag should be used in rules
for adding rows: Container(X).Product(A).Add(2) and Container(X).Product(B).Add(4) to add
two rows of product A, and four rows of product B in the container X.
Validation Rules
User can also define validation rules that display appropriate messages to users if container is configured to
some invalid state. If validation condition evaluates to 1, it’s assumed that validation rule is broken and its
message is displayed below the container.
Container Actions
In administration, one can define actions that user can execute on container rows - add, delete, copy, reorder,
edit, and so on.
Properties
Container can also have one or more properties. If a calculation formula for a property is defined, it’s evaluated
on each configuration modification. On the other hand, user can leave calculation formula empty and set
container property from parent product rule with CTX tag. Container is defined globally so its execution
product context is unknown at design time. Hence, the user shouldn’t reference some parent attributes values
directly from container but use properties instead. From the parent, product set a property from a rule, and use
that property inside the container. So, properties should be used as data container for interaction between
container and parent product.
Propagation of attribute values from parent product to child container products may result in different
container state (totals, properties, and so on) which may further trigger a new rule execution in the parent
product, which leads to another propagation of parent attribute values to containers. This loop execution may
decrease performance, especially if there’s more than one container in the parent product, and is limited only
to several repetitions. Therefore, avoid any dependency loops between parent product and child container
products if you’re using Transfer to container option.
Edit Row
If a container uses products, then the container's row represents that product. By editing a container cell,
which is a product attribute in the configurator, the user actually edits the row product attribute inline from the
container. If the Edit row action is available for that container, the user is able to open the configurator for the
row product and configure it same way as if it was opened from the catalog. This allows the user to edit more
attributes, not just those visible from the container columns. Once a user finishes configuration of that
container row and clicks save button, they’re returned back to the parent product and the container columns
for that row are refreshed with the newly configured attributes. During configuration of a container row in its
separate configurator, rules of the parent product are executed along with rules of the row product.
The user can select, de-select row, add product to the quote or edit existing item. Typically, there’s a checkbox
on each row, which serves for user to select this row – meaning they would like to add it to the cart. Once the
row is selected, container knows the product ID of this row, because it’s looked up based on part number. To
enable users to search for and add simple products in configurator, based on their part number, you should go
to the Columns tab in Attribute and add two new columns. When adding the first column, set Text Box as its
Display type and set Product Part Number as its Column Type. When adding the second column, set Stand
Alone Column as its Column Type and set Selector Check Box as its Display Type.
When the user selects one or several rows in the container, and clicks Add To Quote:
● If a product is marked as System and attribute container is marked as a line item, SAP CPQ adds line items
for each selected product (found based on part number). Attribute container itself isn't added to the quote
as line item. When user clicks Edit on any of these products in the quote, SAP CPQ takes the user to the
parent product
● If a product is marked as Collection and attribute container is marked as line item, SAP CPQ adds line
items for each selected product (found based on part number). Attribute container itself isn't added to the
quote as line item. Users are able to delete separate items from the quote.
● If a product is marked as Configurable and attribute container is marked as line item, SAP CPQ adds line
items for each selected product (found based on part number). Attribute container itself isn't added to the
quote as line item. When user clicks on Edit for main item, SAP CPQ takes the user to the product
configuration page.
Container paging provides the ability not to show all rows for that container at once, but subdivide them into
pages instead. Via the checkbox Enable Paging for Container on particular container (if it’s checked) and the
dropdown menu Default number of rows per container page, that are in the Attributes section in the Setup, you
define if paging is available and how many rows are available per container page by default. If the checkbox
Enable Paging for Container isn’t checked, then no paging is available. From the dropdown menu Default
number of rows per container page, you can choose how many rows are preselected by default per container
page. Available rows per page are 5, 10, 20, 50 or 100. Paging is located at the bottom of the container page. If
the container contains a selectable column (type Selector Check Boxor Selector Radio Button), then 2 radio
buttons are shown on the bottom (Show All and Show Selected), and the user is able to choose which rows are
shown between these two selections.
On the user side, in the Show itemsdropdown menu, the user can change the default preselection of the
number of container rows to be shown per page. This change will be applied on the administrator side as well,
so the next time the user comes to this product they changed, the preselected value for items per page is
selected.
Related Information
You’re able to specify the number of row copies and to select which fields or columns are copied.
To turn on this functionality, the administrator can check the checkbox Allow multiple copy in container setup.
On the user side, when the user clicks Copy row, a pop-up with the following fields appears:
Related Information
Procedure
You can find more information on how to create an attribute in Creating Attributes [page 50].
3. Define the following columns:
This formula sums Total of column named Price A and Total of column named Price B.
4. Click Save.
Related Information
Four Iron Python events are available in attribute container setup. These events trigger when the particular
container action is performed.
You can set actions for these events in attribute containers in the Setup.
These events trigger only on a user interaction. If the container is manipulated through another script (such as
adding a new row through another Iron Python script), these events don’t trigger. Having these events exposed
enables you to attach the Iron Python script to them. It's useful to have these events available in case you want
to make decisions during container manipulation. Each event has a list of available arguments and particular
context. For more information on available context and arguments, refer to the Scripting Help .
Related Information
This procedure contains instructions on making container rows collapsible in responsive design.
Context
In SAP CPQ responsive design, container rows aren’t collapsible by default. On the other hand, SAP CPQ
classic design uses XSLT files to render the page, making it’s easy to modify the XSLT file and enable the
collapse and expand functionality. While there’s no system option to enable this feature in responsive design,
you can enable it via customization.
Procedure
SAP CPQ is now instructed to render containers using the custom template instead of the standard one.
7. Customize the custom template the following way:
a. Enter this code at the beginning of the template:
<style>
.label-inline label{
display: inline-block !important;
}
</style>
<script type="text/javascript">
var expandingContainersModel = {};
cpq.ready(function() {
expandingContainersModel = {
expandedContainers: ko.observableArray([]),
isExpanded: function(id) {
return this.expandedContainers.indexOf(id) > -1;
},
expandCollapse: function(id) {
if (this.isExpanded(id)) {
for (var i = this.expandedContainers().length - 1; i >= 0;
i--) {
if (this.expandedContainers()[i] === id) {
this.expandedContainers.splice(i, 1);
}
}
} else {
this.expandedContainers.push(id);
}
}
};
});
</script>
This script tag creates a global model expandingContainersModel, which has one observable array
where expanded containers IDs are stored. Since all containers are initially collapsed, this array is
empty when page is loaded.
b. Enter this code at the beginning of the template:
@*Label*@
<!-- ko template: { name: 'LabelTemplate' } -->
<!-- /ko -->
This code adds expand/collapse icons next to the container label and binds container label to the
collapse/expand action. You can modify code if you want to position arrows differently or exclude label
click bindings.
d. Locate the script template with the ID ContainerTemplate and surround it with this div:
<div data-bind="visible:
expandingContainersModel.isExpanded($data.id())"></div>
This part of code hides or shows the container body based on your previous action (whether you
clicked to expand or to collapse the container).
e. Click Save.
To see the expand and collapse feature in the output, open the configurator and configure the product
that has containers. Notice that container's expand and collapse state is preserved even if you move
from one tab to another.
Related Information
This feature allows access to information in hidden container columns in responsive design.
Prerequisites
A container attribute is defined. Other than standard columns, this container attribute also contains a hidden
column. By default, this column isn’t served through server response (JSON file), therefore it isn’t available in
the knockout context.
Any container column can be hidden. It’s done when an administrator wants to store some information to be
used in calculations but at the same time doesn’t want to display it to the end user. Before responsive design,
administrators were able to access this information through Iron Python scripting, but in responsive design,
due to the optimization of HTTP requests, this information isn’t served in the server’s response. The result is
that administrators aren’t able to access these pieces of information to include it in any kind of data
manipulation or in calculations. However, this feature allows administrator to access hidden container columns
regardless.
Procedure
From now on, data is sent through JASON file via the HTTP response and is therefore available to the SAP
CPQ administrator.
Related Information
Quantity can be entered by a user for an attribute at the attribute level, or at the attribute value level. This is
determined by what the attribute is set as at in the Attribute administration section. Attribute quantity can be
If User Selection w/ Attribute Quantity Input is selected, then in the configuration the user is only able to select
the quantity of the attribute not the quantity of each individual attribute value. If multiple attribute values are
selected, then the quantity of each attribute value changes to equal the quantity of the attribute. With User
Selection w/ Attribute Quantity Input, the Can Enter Quantity function can’t be set.
If the attribute type is User Selection, then the user isn’t able to change attribute quantity in the configuration.
The attribute’s quantity is based on how it either inherits the main item’s quantity or the value entered in the
Attribute Quantity field depending on how you have the attribute set up on the attribute definition page.
Attribute type can be changed for existing attributes in the Attributes administration section. It’s also set when
creating a new attribute in the Product Setup Wizard (Step 2 [page 59]).
Note
Attribute quantity can only be entered after a product that is already selected. The default attribute
quantity can’t be edited globally.
Related Information
This feature allows attributes to span across an entire row in product configuration.
● header instructions above a group of attributes that need to span across the entire configurator.
● containers that have many columns and need to span across the entire configurator.
When editing a product, in Attributes there’s a checkbox Spans across entire row in configuration (which isn’t
selected by default). When the configuration layout is displayed when editing a product, if the checkbox is
selected, next to the attribute a tip (spans entire row) is displayed.
Related Information
To translate multiple attributes via one Microsoft Excel file, you can export individual attributes or an entire
attribute type, update attribute translations in the resulting Microsoft Excel file, and import the file back to SAP
CPQ.
Procedure
○ Export Attributes Translation - exports translations for all attribute types except Container.
○ Export Containers Translation - exports translations only for Container attributes.
A Microsoft Excel file is downloaded to your computer. Attribute IDs, default names, and translations in the
selected languages, if defined, are displayed in the file. Also, a separate sheet contains attribute values with
corresponding translations. If Container attributes are exported, the file contains separate sheets for
translating container columns, properties, and validation messages.
5. Update attribute translations in the dedicated columns.
6. In Step 3, upload the Microsoft Excel file. The button on the right is for uploading files with container
attribute translations, and the button on the left for files with all other attribute types.
a. Click .
b. Browse for your file.
Otherwise, if the import file contains invalid records, an error message pops up.
d. Click Import report.
Invalid records are marked in red and errors are described in the Error column.
When you or your underlying users select a language in SAP CPQ, if translations were imported for the
attributes, the system displays them in the Catalog.
The purpose of this feature is to enable easy way for admin to support use case where some attribute values
are marked as line items while some aren’t.
If an attribute is marked as line item, for each value there’s a flag defining whether this value is displayed as line
item when it’s selected and when its extended price (Price * Quantity) is zero.
Quantity can be either computed (inherited from attribute) or entered by user (if user can enter quantity for
this attribute).
Setup Adjustments
In Setup General Application Parameters Configurator , set the application parameter Allow attribute
value to be listed as line item even if its extended price is zero to TRUE.
In the Product Setup Wizard [page 56], tab 3, there’s a column List as line item when price is zero (third in the
row – next to Value Code). When the attribute isn’t marked as line item, this column isn’t displayed.
If the value of application parameter Allow attribute value to be listed as line item even if its extended price is
zero (default behavior) is TRUE, checkboxes are selected for each attribute value when setting attribute as line
item. If the parameter value is FALSE, checkboxes aren't selected. The administrator is able to override the
parameter value for each checkbox.
Related Information
Autocomplete attributes allow you to search for attribute values by typing letters contained in the attribute
value, no matter if they’re located at the beginning or in the middle of the attribute value.
As you start typing, SAP CPQ searches through a custom table that contains the particular attribute values.
That narrows a list of results against what you typed. In the following sections, there are examples of how to set
up an attribute of this type and how to use it in the configurator.
You’re free to select one or more columns from a custom table as searchable columns. Additionally, you can
define the display label of the column. Select a column and enter the label in the Display Label field. The label is
automatically be appended to the original column name in the Selected Searchable Columns list. This feature
enables administrators to create user-friendly display labels for users while keeping the original column name
in the Setup. The labels display in the configurator in autocomplete attributes, and on quotes in quote custom
fields and quote item custom fields that use attributes sourced from custom tables.
If you select the Show Only Distinct Values checkbox, the system doesn’t retrieve duplicate values from a
column and only different values are displayed to users. This method is applicable only when the same column
is selected as the display and the value code column. Also, you can select one or more columns whose values
are displayed in search box.
For more details on how to craft your autocomplete attribute, consider the examples 1 and 2. Example 1
assumes that you define only one searchable column and display column. In example 2, you define a new
autocomplete attribute with two searchable and display columns.
Note
If custom fields or item custom fields on the quote are using autocomplete attributes, you can set their
value via scripting by using the ValueCode property. The value of the custom field is obtained from the
Value Code column in the custom table or quote table in the definition of the autocomplete attribute. If the
value you want to set is found only once in the Value Code column, that row is selected as the source of
the value of the custom field. If that value is found multiple times or is not found in the column, the custom
field is not changed, and an error message displays. If an empty string is passed through Iron Python, the
value of the custom field is empty.
Prefiltering allows you to reduce the number of provided attribute values based on the condition you’ve defined
previously. Since autocomplete attribute is sourced from the custom table, there are situations when you have
a large number of attribute values stored in the custom table that you want to prefilter before they’re displayed
to the user.
You can use simple conditions that are evaluated before your search input. This way you narrow down the
number of attribute values before your search input is treated, which improves configurator performance. The
syntax for condition is the same as SQL syntax (for example, yourColumn = ‘34’ and yourAnotherColumn
< 3000).
You can make this precondition as complex as you can imagine and model using the standard SAP CPQ
formula builder. Look at example 3 and example 4 for more information.
Example 1 – Define Autocomplete Attribute with Single Searchable and Display Column [page 46]
This example demonstrates how to create an autocomplete attribute with only one searchable column
and display column.
Example 2 – Define Autocomplete Attribute with Two Searchable and Display Columns [page 47]
In this example, you create a new custom table and new autocomplete attribute to show that you can
select more columns to search and display values during autocomplete search on the attribute.
Related Information
This example demonstrates how to create an autocomplete attribute with only one searchable column and
display column.
Procedure
You get a screen where you select a custom table, then a custom table column where attribute values are
stored, display columns and column that is displayed as value code of selected attribute value in
configurator. That is all you need to do in order to create autocomplete attribute. Now when you configure
a product that has an autocomplete attribute, you’re allowed to type attribute value and select among
values that match your input.
Related Information
In this example, you create a new custom table and new autocomplete attribute to show that you can select
more columns to search and display values during autocomplete search on the attribute.
Context
You can check the previous example for steps for creating a custom table and new attribute. Assuming that
you’re familiar with the creation process, here is what you define.
Procedure
1. Define custom table named customer_custom_table that has next columns: FirstName, LastName,
Email, Address, City, Country, Phone. Insert 3 rows of sample data into your custom table.
2. Define a new autocomplete attribute.
3. Edit the attribute.
4. Similar to example 1, select columns in the left box and copy them to the right box titled Selected
Searchable Columns.
Now, once you in the configurator you’re able to enter one value (first name, last name or city), or any
combination of three, separated with space and comma. SAP CPQ searches through your custom table
and displays the results that match in the drop box. In some cases, SAP CPQ can display only First Name
and Last Name as a search result. This behavior takes place if you selected those two fields while defining
the autocomplete attribute.
Once you select some value, SAP CPQ displays the selected value in the configurator. If you selected the
field city whose selected value code we wanted to be displayed, SAP CPQ displays the name of the city.
Related Information
This procedure shows how to define a simple condition for prefiltering autocomplete attribute values.
Context
Assuming that we have the autocomplete attribute interior color defined and attached to the product, we
can define a simple condition that narrows down the list of available values for the attribute. Our attribute
interior color is sourced from the custom table that holds a list of next 5 available colors: beige, white,
black, gray, brown. For some reason, you want to display only colors that start with the “b” letter.
Procedure
Here, you used the SQL syntax that matches the string that begins with the “b” letter.
4. Click Save.
Related Information
This procedure shows how to define a complex condition for prefiltering autocomplete attribute values.
Context
Assume that you have a product Loan with two attributes: Loan and Loan Term.
Attribute Loan is the autocomplete attribute that is sourced from the custom table Loan custom table that
holds a list of 10 different loan offers (based on loan amount):
Attribute Loan term holds a list of different loan terms that user can choose from. Based on the loan term,
you can preselect the loan offers that you want to offer. Attribute values (Loan Term offers) are: 5 years, 10
years, 15 years, and 20 years.
Procedure
3. Click Save.
When you are in the configurator, based on what option you’ve selected for the loan term, the list of
available options on Loan attribute gets filtered.
Related Information
Attributes are the building blocks of a product’s configuration. They can be used as a list of values selected by
the user, a calculation, a free input by the user, a display of text to the user, and many other ways.
An attribute is defined by a name, values, and type. User can create new attributes in a few ways. They can be
created individually through the Product Setup Wizard or through the Attribute administrative section. Both
allow creating one attribute at a time. If there’s need to create many attributes at a time, user can use the
Import Attribute administrative section (discussed in the Attribute Import [page 106] topic). All attributes
created in the system are available to all products. They’re then added to the product where further definition is
done, such as pricing, part numbers, and so on. An attribute can only be added to a product if it has been first
added to the category that the product is in. Only then it’s possible to use it in the product.
Note
Although this is default behavior, within PSW [page 56], administrator can choose between the following
options:
If the attribute is created through the Product Setup Wizard, though, then it is added to the category and the
product in the single step of creating the attribute.
The Attribute administration section allows managing all attributes that exist in the system. To access this
section select the Attributes link under the Products admin menu. This displays the attribute administration
page. From this screen attributes can be added, copied, deleted, edited or translated. Clicking the Add New
button brings up a blank attribute definition page:
Note
If Value Code or Attribute Value is used in the rules of a product, any changes made to these values in
the attribute administration will be made in the rules also. A change is not pushed to every area of the
product definition, though. So it is recommended that user always use the Value Code of an attribute
value in rules and calculations. Then any changes should be done only on the Attribute (Display) Value.
● Rank - This value is used to prepopulate value rank when an attribute is added to some product. The order
of available attribute values within the configurator depends on this value.
● Delete - If the value can be deleted a check-box will be displayed.
● Referenced Product - Referenced product name, as read-only text, will be displayed. There will be a Remove
icon near the referenced product name. When it is pressed, link between attribute value and referenced
product will be deleted from database. Connection will not be broken for attribute values that have been so
far connected to products.
● Add Values Manually - When this button is pressed, new pop-up is opened with 5 new empty attribute
values (Attribute Value, Attribute Value Code and Rank). There will be a button Add Rows at the bottom of
the table. When user clicks on Add Rows, 5 new rows will be added.
● Add Products as Values - When pressed, a new pop-up table with the following columns will be opened:
Product Name, Part Number, Category, Description and Active (values for this column are True/False).
User will be able to select several products – next to each product there will be a check box. For each
selected product, new attribute value will be added using product name as 'display value' and product part
number as 'value code'.
External ID in Attributes Administration allows administrators to create one more attribute identifier
independent of SAP CPQ-specific identifiers. The identifier can be contingent on the identification system used
in the client’s internal software. In other words, the External ID field will be populated with the logic from the
client’s external system. Once a new attribute has been created in SAP CPQ a system administrator is able to
populate the Attribute External ID.
This information will help out the administrators easily find if Attribute External ID duplicates exist in a single
product configuration.
Once the new attribute has been created in Product Administration the administrator can to populate the
Attribute External ID field.
Attribute Import
When attributes are created through SAP CPQ import functionaly the system administrator has the possibility
to fill the Attribute External ID. Attribute import template is expanded through a new column, Attribute External
ID. This column must be placed after the Attribute name column.
● When attributes are imported through Product import functionality, Attribute External ID field is not
present in the product import template.
● When products are deployed from one SAP CPQ environment to the other, Attribute External ID field will be
sent as well.
● When an attribute is created via Simple product administration API, attribute field Attribute
External ID will be available on API call.
● To execute the activity described above, a new child node: <ExternalID> will be added to the
<Attribute> input XML node. The full XPATH is as follows: Products/Product/Attributes/
Attribute/ExternalID.
A special attribute added to a products configuration named ItemQuantity can be used to control the quantity
of the main item in the cart.
The system looks specifically for the attribute named “ItemQuantity”. This controls not only the main item, but
if any pricing schemes are attached to it, then prices in the cart are affected also. There are a few different ways
that you can use the ItemQuantity attribute:
● You can expose the attribute to the user so that they can pick their quantity, which is then reflected in the
cart. In this situation, you would likely not allow the users to edit the quantity of the main item in the cart.
Quantity for the product would be handled within the configuration.
● Calculate ItemQuantity as a hidden attribute, which then is reflected in the cart. ItemQuantity in this
situation would be based on selections made from the user.
● Calculate pricing base on ItemQuantity, then allow users to edit the quantity in the cart. This situation is
ideal for products that offer discounts when higher quantities are purchased. For example, a product can
cost $5 when buying 1, $9 when buying two, or $13 when buying three. If a user adds the product to the
cart with a quantity of 1, the price is $5. If when in the cart they change the quantity to 2, then the system
passes that new quantity back into the configuration through the ItemQuantity attribute. Because pricing is
based off this attribute, the price of the product changes accordingly.
Related Information
2.2 Products
The Products administrative section allows setting up new and editing the existing products.
Accessing this administrative section from the Products administrator menu displays a list of all existing
products in the system. Products can be seen in two views: by using Categories and by using Product Table. You
can toggle between the two views by clicking these buttons.
Note
In Setup Product Catalog Products or Products 2.0, products obtained via synchronization with
SAP ERP and SAP Variant Configuration and Pricing have the value Yes in the column Synced from Back
Office. The column Synced from Back Office is visible only when SAP CPQ is integrated with a back-office
application, such as SAP ERP.
If you select a product, or click Add New, the Add New Product page displays. This page allows you to access
administrative areas such as Product Definition, Product Attributes, Configuration Layout, Rules, and Scripts.
Products can be defined in the Product Setup Wizard with four different configurations: Simple, Configurable,
Collection of Configurable Products, System (List) of Configurable Products, and Parent/Child System (List) of
Configurable Products. Simple and Configurable apply to single products, while Collection of Configurable
Products, Parent/Child System (List) of Configurable Products and System (List) of Configurable Products allow
you to configure one or more configurable and simple products simultaneously. Upon configuration, one or
more peer products are simultaneously added to a quote. For more information on Collection of Configurable
Products and System (List) of Configurable Products, see Product Display Types [page 84].
Product types:
● Simple - A simple product is one that can have attributes assigned to it, but they can't be configured.
Because of nonexisting configuration of attributes, users can add the product to a quote directly from
Catalog. In addition to defining simple products using the Product Setup Wizard, simple products can be
imported from Microsoft Excel.
● Configurable - Configurable products have attributes associated with them and they need to be configured
before being added to a quote. This is generally the standard configuration type used in the system. Note
that the quote contains a System (List) of Configurable Products, and that its default behavior is as follows:
if you delete one item from the system the entire system is deleted as well.
● Collection of Configurable Products - Each included product can have its own attributes and each can be
independently changed or reconfigured.
● System (List) of Configurable Products - Each product can have its own attributes, but added products
can't be independently changed or reconfigured. The entire system needs to be changed or reconfigured.
● Parent/Child System (List) of Configurable Products - A child product’s existence in SAP CPQ is determined
by its function in relation to the parent product. Each parent can have a range of child products and each
child can assume the role of a parent and have a range of its own child products.
Note
While loading the product, all related products are loaded and rules for each of them are executed. After
that, catalog code, price, cost, image, and product name of the related product will be used as catalog
code, price, cost, image, and display value of the attribute value. All related products have to be loaded
because it takes too long to load the product in the Configurator.
If the formulas for catalog code, price and cost of the related product are simple (there’s no need to load
related product and execute rules in order to evaluate them) this option can be used to increase the speed
of product loading. In that case, formulas for catalog code, price, and cost of the related product are used
as formulas of the attribute value.
Product Changes
In the product table, columns Date Modified and Modified By include fields that show at what time and on what
day the currently active product revision was modified last time, as well as who executed the change. If none of
When you click Edit, you can see Created and Modified data. The data is displayed for the version that you’re
editing (you can edit different product versions, not just the currently active one).
SAP CPQ logs a rule change only when the rule was changed (not every time you click the Save button). This is
checked for all rule fields: Rule Name, Description, Condition, Action, and so on.
This tab is used for defining the basics of a product. It contains several logical segments for entering product
data.
Product Data
At the top of the screen, there’s a radio button that determines the product display type. See Product Display
Types [page 84] for more information on each of the display types.
You also need to enter Product Name. The Product System Id is populated automatically according to the
entered product name.
Dynamic part numbers can be created by entering an expression in the Part Number field. You can also use the
Formula builder to create an expression.
The product needs to be included in at least one Category. A product is added to the category by clicking the
Add/Remove button.
Image can be selected from the dropdown list. Uploading an image can be done simply by clicking the Upload
button. When the button is clicked, a thumbnail view of all the product images uploaded to the system displays.
Product Type can be selected from the dropdown list. If the correct product type isn’t available, clicking the Add
New button next the dropdown list creates a new Product Type.
Pricing
In the Pricing section, you can choose Pricing Mechanism for the created product. From the dropdown list, you
can select either Pricebook Lookup or Custom Pricing.
When checkbox Use recurring price and cost has been activated under in Setup General Application
Parameters General Parameters , a new field for Base Recurring Price is added. For more details, see the
Recurring and Non-Recurring Prices [page 448] section.
A Base Price can be entered for the product. If the price consists of more than just the base price plus the sum
of the attribute prices, then an expression can be entered through the Pricing Formula.
● Product price formula: Product price or main item price is calculated by computing the pricing formula if it
exists. Otherwise, if the formula is left blank, the product price is equal to the Product Price field plus a sum
of individual attribute prices, except for attributes that are marked as line items. Attributes that are marked
as line items display their own price and aren't included in the main item price. You can enter an expression
in the Cost field to determine the cost of the product.
● Product Cost Formula: Product cost or main item cost is calculated by computing this formula and adding
all attribute costs for all attributes that aren’t marked as line items to the formula. Attributes that are
marked as line items display their own cost and aren't included in the main item cost.
For more information on expressions and tags, see the chapter on Tags and Expressions [page 22].
Here, you can give users permission to view the product by selecting any user types, companies, markets,
brands, and permission groups. You can assign permissions by selecting anything from the left box and moving
to the right one. Flag Visible to everyone is selected by default when you’re creating a new product. Flag Active
is also selected by default when a new product is created. When Visible to everyone is selected, permission
group lists are grayed out.
When defining a product alias, the part for defining permissions is displayed in the same as it was for the
product – permissions for aliases are also set based on permission groups.
The Start Date and End Date determine when the product is available. You can click the calendar icon next to
these fields to choose a date for product availability.
This section consists of the following fields: External ID, UPS(Universal Product Code), MPN(Manufacturer Part
Number), Inventory, Lead Time, Family Code, Product Weight in GRAMS, Large Product Image, Long Product
Description, Product rules are executed only once, and Allow product configuration import.
Inventory is a descriptive field, which can be used for storing additional information about the product. The
data in this field doesn't influence the product in any way, but it can be used in formulas. Also, the system
doesn't treat this field when an order is placed from SAP CPQ.
Large image is displayed on user side when you visit the Details page, only when Large Image tag is used in the
Product Details templates (found under Setup UI Design Product Details Templates .
By clicking on the Allow product configuration import checkbox, you can enable mass-upload of configuration
by uploading file into product configuration. Also, the Script fields with button and becomeCheck Syntax
Upload configuration field visible.
You can upload, download, or delete configuration template. The uploaded template is displayed in the
Configurator and users are able to download it when configuring the product.
For controlling whether to display a configuration template you can use the application parameter Show
product configuration template. This parameter can be found in Setup General Application Parameters
Configuration Tab .
The script depends on the desired Excel format. Interfaces related to Excel are detailed explained in the
scripting online help, which can be found on http://help.webcomcpq.com/scripting/index.aspx.
This section includes: Dynamic Description, Can Enter Quantity, and checkbox Do not load referenced products
in product collection.
Expressions can be built in each field to determine what the value of that option is. Use the Formula Builder to
help build these expressions.
The Dynamic Description of the product is shown to the user in a quote. You can create it by combining text and
tags.
User can enter quantity determines whether users are allowed to enter a quantity for this product. Enter 1 to
unconditionally allow users to enter quantity, or enter an expression to only allow it under certain conditions.
Note
Product’s quantity can be changed through the use of a special attribute called ItemQuantity. If this
attribute exists, then the system uses its value to determine the quantity of the main item in the quote. For
more information, see the ItemQuantity Attribute [page 53] section.
This tab is used for setting up attributes for the configurable products.
You can add attributes from the category that the product is added to, or you can add any attribute available in
the system. Moreover, in this step you can easily create a new attribute. If you click Add New Attribute, the
Select attributes to be used by this product window displays. Here, you can select which attributes are displayed
with two available radio buttons. When Show Attributes used by Other product in this Category is selected, only
those attributes that have been added to the current category (see chapter on Categories [page 98]) are
displayed. Show All Available Attributes displays all attributes that are available in the system. Attributes can be
quickly searched by typing in search criteria at the top of the list. Clicking the Search button activates the
search.
You can access Product Attribute Details by clicking the Edit button next to one of the attributes added to the
product. Administrators who have chosen the Button display type as part of a User selection attribute can learn
how to attach an IronPython script on Button attributes, in the Attaching IronPython Script on Button
Attributes [page 105] chapter.
When the checkbox Use recurring price and cost has been activated under Setup General Application
Parameters General Parameters , new fields Recurring Price and Recurring Cost are added to the Attribute
Values table. Also, there’s a new check box that is labeled Show Recurring Price. For more details, see Recurring
and Non-Recurring Prices [page 448].
Clicking the symbol brings up the Attribute Where Used screen, which shows all places where the attributes or
attribute values are used.
Attribute Definition
List as Line Item Attributes marked as line items are listed as separate items
in the quote.
If the User Can Enter Quantity Checked then the user can unconditionally enter a quantity.
An expression can be entered which allows them to enter a
quantity only under certain conditions.
Inherit Quantity from Parent Determines if the quantity of this attribute changes when
the quantity of the main product changes.
Rank within the Cart Determines whether this attribute is a required selection or
not.
Span across entire row in configuration Enables attribute to be spanned across entire row in
product configuration. If a custom XSLT configurator
transformation is in use, and not the default one - see the
Custom Configurator XSLT [page 71] settings.)
Hint Any text entered here is displayed as a tooltip. You can also
enter a calculation expression.
Inherit Product Type from Line items inherit product type from the main item by
default. Select another product to override where this line
item inherits product type from. In sections Manage
Triggers and Manage Attribute Absolute Position, you can
adjust triggers and position attributes.
Show more columns Shows all other columns that weren’t shown here.
Reference Product Allows you to reference another product with this attribute.
You can set up a multiple-product configuration such as
Configuration System and Collection of Configured Products.
When Reference Product is selected, the Display Value for
that Attribute Value changes to Product Name (because that
is what is shown to the user). If a reference product is
selected, and if it uses price book, price fields are replaced
with the View Prices link. If you click on it, all prices for this
part number from pricing tables are brought back. When a
reference product is selected, and that reference product
doesn't use price books, price fields are read-only and
populated with the data from the reference product.
For more information on attributes, see the chapter on Creating Attributes [page 50].
If your product isn’t using multiple tabs and if all attributes are included in one page, then click on Save button
and go to next tab in the Product Editor (no tabs will be included in the configuration).
However, if you click Split attributes into separate tabs a pop-up window in which you can choose more tabs
displays.
Any tab that has been created within the system can be added to the product. To add a new tab to the product
click Create New Tab and pop-up with the Tab Name and Default Tab Rank (required) fields displays, prompting
you to also select whether the tab header is visible in the Configurator. Once you populate these fields and
select whether the tab header is visible, a screen pops up, and you can select position of tabs and attributes
(move them left, right, add new, remove, and so on).
If you want to add a new attribute, click Add and choose more attributes from pop-up.
You can control visibility of each product tab. There are two options that define visibility rules:
● Display tabs only if they are not empty - tabs are visible on user side only if they contain at least one
attribute.
● Set tab visibility for each tab separately - you can define tab visibility rule for each tab separately.
If the second option is selected, under each tab you can see these options for tab visibility, which you can
modify.
● Always displayed
This tab is used for creating rules that are applied to the appropriate product. You can add as many rules as
necessary.
You can create a new rule by clicking Add New. The following fields and options display:
Condition Place where you can enter a formula for the condition under
which the rule is triggered.
Action Place where you can enter a formula that is executed when
condition is satisfied.
Rule importance (Order of execution) If there’s more than one rule for the appropriate product,
this field determines in which order the rules are triggered.
This tab provides a way to preview the configuration. There are two types of previews: Configuration Preview
and Product Details Preview.
● Configuration Preview opens a new window, or a tab with the current product model loaded. This option
isn’t available for simple products.
● Product Details Preview opens a new window, or a tab showing the Product Details page with the current
product model. See Product Details Templates [page 473] for more information.
This tab enables you to define scripts in a product and specify events that trigger the execution of those
scripts. You can verify the execution of the script in the Log on the user side.
Context
To define your script, go to the Scripts tab in Setup Product Catalog Products .
Procedure
For example, in our case we want the script to be executed on the event of adding an item to the quote, so
we named it Item added script.
3. The Description field enables you to describe the script in greater detail.
4. To activate the script in the system, tick the Active checkbox.
5. If you tick the Global checkbox, the script is added to the list of global scripts that can be attached to any
product.
6. Define your script in the Script field. SAP CPQ enables you to enter only the IronPython script engine type.
For this example, we defined this script: Log.Write("Add item", "Item added")
7. Click Check Syntax at the bottom of the page to ensure that the script is valid. If valid, the system returns
OK; if invalid, an error message pops up and shows where you've made the error in the scripting code.
8. Click Attach to Event to specify the event that triggers the execution of the script.
You’re redirected to the page where you can select the event that triggers the execution of the script.
9. Select the events that trigger the script execution.
You’re redirected to a page where you can select the global script and specify your event.
Results
In our example, the event was adding an item to a quote with the script writing in the Log that the item has
been added. Once you’ve clicked Add to Quote in the Configurator, go to the Log to see if the script was
With a part number generated that represents a particular configuration of a product, a user can type in a part
number, and that configuration will be displayed.
Code Matching is used along with Intelligent Serialization (see the chapter on Sequence Substitution [page
104]) and the reverse part number lookup used in the Quick Search. This saves time for a user when
configuring a product because they don’t need to go through the full configuration process. If a user had a part
number and wanted an almost identical unit with a few changes, this would save time.
Code Matching is where this connection is defined between the part number and the product. This is done by
setting up Code Matching within a specific product. This allows the system to do a reverse part number search
when the user enters a part number in the Quick Search. Reverse part numbering is done with the Catalog
Code Generator field of the product.
This field can build the part number of the product through the use of attribute values/catalogue codes and
static text. For instance, the SMB2 Desktop Computer has this in its Catalog Code Generator field:
SMB2<*CATCODE(Processor) *><*CATCODE(Memory) *><*CATCODE(Hard Drive) *><*CATCODE(CD
or DVD Drive) *><*CATCODE(Monitor) *> This expression has the static text of “SMB2” to start out the
part number. This is then followed by the catalog code (CATCODE) of Processor, Memory, Hard Drive, CD or
DVD Drive, and Monitor. The CATCODE tag pulls the catalog code for the selected value of the attribute.
When the software does a reverse search of a part number, it checks if any of the values in the part number are
included in the attributes that make up the part number of the product. It does this in the order that the
attributes are entered for the part number. For instance, the part number SMB2-A3-102422H16-Com5T17 is a
result of the dynamic catalog code generation. To reverse search this part number, the software finds the
product to check (discussed later how) then checks if there’s a catalog code value for the attribute Processor
(<*CATCODE(Processor) *>) equal to -A3. It then moves to the next value and checks if the attribute
Memory contains a catalog code value (<*CATCODE(Memory) *>) equal to -1024. Once all the values of the
part number are found, the software opens that product and selects each value of the part number.
Note
The user needs to enter a part number that includes all the attributes included in the catalog code
generator. If they don’t, then the system returns that it can’t find a product.
In order for the system to check the attributes of a product, it needs to know which product to look at. This is
where Code Matching comes in. Code Matching tells the system which product to look at for a given part
number. This is generally the static text used in the product’s part number.
To access Code Matching, choose Products under the Products admin menu and find the product that the serial
number corresponds to. Choose the manual definition method and open Code Matching under the Current
Product menu.
Enter the unique codes used to reference this product. Click Change/Add More Values to add more fields. To
delete a reference, select the check box next to it and click the Change/Add More Values button. When finished,
click the Finish button. This saves the values and creates the references to the product.
This ensures that the user is only able to create an accurate and valid configuration of the product. The Rules
section allows creating complex rules through the use of SAP CPQ tags. It is not prerequisite to be an expert in
SAP CPQ tags. The Code Builder, which can be accessed during the creation of every rule, can help in creating
these rules in a user-friendly way.
Each rule is created with a Condition, which determines whether or not the action will run, and an Action, which
tells the system what to do when the condition is true. Each rule is, in essence, an IF statement. IF the condition
is true, THEN the anything in the action field will run. There are SAP CPQ tags used especially for rules (and
triggers, which are discussed in the Triggers [page 94] section) to create the condition and the action
statements. To access the Rules section use the manual method of product definition and select the Rules link
under the Current Product dropdown. This brings up the Rules Administration screen.
Existing rules can be deleted or editing by selecting the corresponding symbol next to the rule name. To add a
new rule, click Add New at the top of the page. A blank rule definition page is displayed.
Click Check next to the condition or action fields to bring up a Code Builder window (see the section on Formula
Builder [page 11]). Click the Save button at the bottom of the screen to save the rule and add it to the list of
existing rules. The Rule Name field is used as a reference and small description of the rule. It is recommended
to use associative names, such as Processor blocks Memory or Color selects Widget. This makes it easier to
find the rule later if it needs to be searched for and edited.
The Description field can be used for additional explanations or notes. This can make it easier for any other
administrators to understand what you are doing in the rule or how the rule fits in with other rules and the
configuration of the product.
The Condition field is used to restrict the rule's execution for certain situations. Enter any conditioning tag
expression into this field. If the evaluation of the string results in true (1), the rule is applied. If the result is false
(0), the rule is disabled. Click the Check button to bring up the Code Builder window for help in creating the
condition expression.
The Action field is the action that takes place when the rule is executed. Click the Check button to bring up the
Code Builder window for help in creating the condition expression. Rank determines the priority of rule’s
execution – lowest rank executes first, highest last. Since non-integer rank values are not accepted it is
recommended to skip numbers (such as 5, 10, 15… or 10, 20, 30…) to allow for future insertion of new rules.
Rule ranking will only make a difference when the rule is affecting. The Active check box manually turns the rule
on or off. This is useful for diagnostic or testing purposes.
Start Date and End Date limit the rule activity time works with effectivity dates. An example would be to allow
special merchandise during Christmas or any other time of the year the appropriate dates are filled in. Click the
calendar icon next to the fields to bring up a calendar pop-up window to assist in choosing a date. Leaving both
fields empty means the Rule is “on” regardless of the date.
To create an expression, select the attribute value from the left box and then select the action or function from
the right box. Click the Insert button to add the created tag to the expression in the main box. Depending on
which function or action is chosen, the Attribute or the Attribute Value will be included in the tag. Functions or
actions with the suffix ATT apply to an attribute, while those with the suffix ATV apply to an attribute value.
Note
Appendix A [page 695] contains a list and descriptions of all tags available for rule expressions. For
example, the following expression would be created for a rule which needed to state that when the value
Blue in the attribute Color is selected, then the value Red from the attribute Color and the value High from
the attribute Level need to be selected. The condition field would contain: <*ANYSEL(Color:Blue)*>.
This will return TRUE when Blue is selected from the attribute Color. Once the Condition field returns a
value of TRUE, the system looks at the Action field and runs that expression. The action field should
contain: <*SELATV(Level:high)*>; <*SELATV(Color:Red)*> or
<*SELATV(Level:high,Color:Red)*>. This orders the system to select the attribute value
(SELectATtributeValue) High and Red in the attribute Level and Color. Both statements in the example are
correct. One statement may work better in a certain situation depending on the rest of the expression.
Make sure the Active check box is checked in order for the system to run the Rule.
Order
While modeling a product you may use different administrative methods of performing actions on attributes to
achieve desired results. These may include triggers or rules. When using both, you may run into trouble if the
actions begin to affect the same attributes. Knowing the order that these actions are run in the system may
help you when modeling your product. The system runs these methodsin the following order:
1. Triggers
2. Rules
Any time the user makes a selection or a product is loaded, these processes are run in this order. This is
important because if you create a trigger that selects the Color Red then have a rule created that selected the
Color Blue, then Blue will be the final selection despite the rule ranking of either the Trigger or the Rule.
In Products, when products are edited under the tab Rules, a new table Simple Rules is displayed, which is a
different representation of the current Attribute Dependencies (the entry Attribute Dependencies is not
removed from the legacy editor).
Note
The table Simple rules is displayed if the application parameter Display table for simple product rules is set to
TRUE. This table contains rules from the current Attribute Dependencies table. There is only one rule per rule
set (currently in Attribute dependencies, the administrator can define unlimited rules per rule set). Attributes
and attribute values are displayed in different color from keywords (AND, Disallow, and so on).
Note
When administrator clicks Add new for a simple rule, new screen is displayed where administrator is able to
define rule:
● Rule name - This field is required. It corresponds to Dependence rule description for Attribute
Dependencies.
● Created By - This field is populated with information about who and when created the rule. It doesn’t exist
for Attribute dependencies.
● Modified By - This field is populated with information about who and when last modified the rule. It
currently doesn’t exist for Attribute dependencies.
● Description - This field is not required. It corresponds to Dependence rule long description for Attribute
Dependencies.
● Rule Importance (Order of Execution) - This field is required. Its default value is 10. It corresponds to
Dependence rule rank for Attribute Dependencies.
● Start Date - This field is not required. It corresponds to first date in Effective Dates for Attribute
Dependencies.
● End Date - This field is not required. It corresponds to second date in Effective Dates for Attribute
Dependencies.
● IF - Administrator is able to look up attributes that are defined for this product through this field. When
administrator is adding new rule, there will be a text type attribute name or value written in grey letters in
this field. As soon as admin starts typing attribute name or value, SAP CPQ will start looking for attribute
names and value codes that have text that is entered within attributes defined for this product. Text that
admin has entered will be displayed in bold. Maximum of 20 results will be displayed. Administrator can
delete selected attribute name/value code by clicking on X. This field is required. It corresponds to
conditioning attributes and their values in Attribute Dependencies.
● THEN - Dropdown contains 3 entries:
○ Disallow - corresponds to Disallow in Attribute Dependencies. This is selected by default.
○ Select- corresponds to Select One in Attribute Dependencies.
○ Reset & Select - corresponds to Select Only One in Attribute Dependencies.
If application parameter Show Allow Option for Simple product rules is set to TRUE, option Allow is also
displayed in the drop down (as the last option).
Page for adding/editing scripted rules will be changed so that condition and action are displayed in the similar
way as for simple rules. Instead of ‘Condition’ there will be an IF field, and instead of ‘Action’ field there will be a
THEN field. Everything else will rename as it is.
There will be 2 new application parameters added to Setup General Application Parameters General :
Display table for simple product rules (Default value: FALSE) and Show Allow Option for Simple product
rules(Default value: FALSE)
Related Information
Selection Charts
Selection Charts are used to logically separate groups of BOM conditions (such as Hardware Components,
Software Components, Maintenance Components). To create a new Selection Chart, select Add New button. To
edit an existing Selection Chart, select Edit next to chart’s name. Both actions will open a Selection Chart
administrator page.
If new selection chart is being added, it has to be saved by clicking on the Save button after the Name has been
defined. Without saving other tabs will not be accessible. On the Definition Tab only Name is required. Name
and description are limited to 50 characters in length. Begin date is defaulted to current data and end date is
defaulted to 10 years from current date. To make the selection chart active only during a certain date range (or
to deactivate a chart without deleting it) specific date ranges can be entered.
Products consist of many attributes. Not all attributes are relevant for a particular selection chart. On the
Attributes tab only attributes relevant to that selection chart can be selected. To select attributes, select ton or
more attributes in Available list and click » to move them to Selected list. To remove attributes, do the reverse
and click on «. Once all the changes have been made, click the Save button to save the changes.
Part Types
Each BOM condition, as a result, selects a part or a component. To select which categories resulting parts
come from, on the Part Types tab we can select one or more categories and make them available to the
selection chart. There has to be at least one part type category selected for the chart. First, a New Part Type
hast to be added to the available Part Types list. Available Part Types are shared with all selection charts for the
products. To add a new party type, click on the Add New Part Type button. This will pop up a window to select
any category.
Select a category and click on Add Selected. After adding one or more part types, select any part type in the
Available list and move it to the Selected list by clicking on ». To remove a part type from the selected list, select
it and click on « to move it back to the Available list. To completely remove a part type from the list of available
part types, select it and click on Remove Part Type button. After all the changes have been made, click on the
Save button to make sure all the changes are saved.
Conditions
BOM conditions are rules that define what Part Type/Component will be selected if the condition is evaluated
to be true. To add a new condition, click on the Add New button. This will open a pop up to create an empty
condition. Select Part Type, Part, Quantity and Description. Parsed Part can also be entered and if it has any
value it will take precedence over a selected part. For example, if instead of Network cable we wanted to select
a value of some attribute, we could enter <*Value(SomeAttribute)*> in Parsed Part section. Quantity is
also a parsed value. In above example we have 1, but could have also said
<*Value(SomeNumericAttribute)*>. Click on Add/Edit Condition to save the selection.
To actually select attribute values that define the condition, expand the list of attributes. Click on the button
with attribute name to select values. This will open a popup to create a formula for that attribute. Expression
field is automatically populated as Values in the dropdown are selected. Each time a new value is selected it is
automatically appended to the end of the expression and prefixed with value selected in Type (or, and, not, to).
After creating an expression, click on Save to compile the expression and add it to the condition.
Export
A selection chart can be exported in a comma separated value (csv) text format. The exported file can be
manually modified and later imported into the same selection chart (or another selection chart that has the
same attributes and part types defined). To export a chart, click on the Export button on the Export tab. After
the export is completed, a link is provided to download the file.
The first row has attribute names, part type, id and quantity. All other rows have condition expressions
separated by commas and part type name, part name (if it is a parse value, it should be prefixed with
[parsed] – e.g. instead of Network cable it would be [parsed]<*Value(SomeAttribute)*>) and quantity.
Import
To import conditions to a selection chart, on the Import tab select a file form a dropdown or upload a new file.
A file has to be in the format as for export. To start the import, click on the Start Import button.
Related Information
Bulk Import/Export feature gives administrators more flexibility in defining product export filters, while
improving error handling, process stability and saving administrators’ time.
Large product data files won’t be interrupted by an error and large files no longer need to be split into several
smaller files. This feature is not a replacement for the existing Import/Export functionality, both methods will
be available in SAP CPQ setup.
The Bulk Import/Export process starts by exporting products. Since the number of products can be very large,
this process had been designed as an asynchronous background process. This means that the administrator is
free to leave the page once the export process is initiated and continue with their administrative activities on
other pages, or leave SAP CPQ completely. Upon completion of the process, the administrator will be notified
via email, and provided with a link to the exported template.
This feature is accessed from Setup Import/Export Bulk Import/Export . The status screen displays a
list of previously started import and export processes showing progress and additional information about each
one.
The Export Products section provides administrators with the options to export a blank template, export all
products, or to define multiple filters before exporting products. The first two options are straightforward. The
third option Filter and Export opens the filtering screen.
The first tab Filter Export by is used to define filter criteria for the common product properties, such as Product
Name, Part Number, Category and more. If an export involves multiple part numbers, you should enter them
one per line. If you want to constraint a number of columns, or define a list of attributes that you want to export,
you can do this under Columns and Attributes to export tab.
Clicking Apply Filter and Export starts the background export process. You can leave the page (or applicatio)
and come back later to check the download status and download the exported document.
Import of product data also works as a background process. If any error occurs, they will be logged into the
same file uploaded for import. The column that holds the information about the row is named Status. You can
download the file at the end of the process, make corrections according to any reported errors and upload the
file again.
Related Information
Users who use custom configurator XSLT transformation should replace a part of custom transformation in
order to enable attribute span functionality.
<xsl:for-each select="/Configuration/Tabs/Tab[@selected='1']/Attributes/
Attribute[@DisplayAs != 93 and @DisplayAs != 94 and @DisplayAs != 96 and (@Rank
= $CurrentStep or @Rank = '1') and @IsPositionAbsolute = '0' and @AliasDisplay !
= '2' and not(@SimpleRefProduct='1') ]">
<xsl:sort select="@SubRank" data-type="number" order="ascending" />
<xsl:if test="(position()-1) mod $Columns = 0">
<xsl:variable name="parentPosition" select="position()"></xsl:variable>
<tr>
<td valign="top">
<xsl:if test="Allowed='True'">
<xsl:attribute name="class">inputborder</xsl:attribute>
</xsl:if>
<xsl:attribute name="width"><xsl:value-of select ="$ColumnWidth"/></
xsl:attribute>
<xsl:call-template name="ShowAttribute">
<xsl:with-param name="StdAttrCode" select="@StdAttrCode"></
xsl:with-param>
<xsl:with-param name="PA_ID" select="@PA_ID"></xsl:with-param>
<xsl:with-param name="SelectedTabId" select="$SelectedTabId"></
xsl:with-param>
<xsl:with-param name="CurrentStep" select="$CurrentStep"></
xsl:with-param>
</xsl:call-template>
</td>
<td valign="top">
<xsl:for-each select="/Configuration/Tabs/Tab[@selected='1']/Attributes/
Attribute[@DisplayAs != 93 and @DisplayAs != 94 and @DisplayAs != 96 and (@Rank
= $CurrentStep or @Rank = '1') and @IsPositionAbsolute = '0' and @AliasDisplay !
= '2' and not(@SimpleRefProduct='1') ]">
<xsl:sort select="@SubRank" data-type="number" order="ascending" />
<xsl:if test="@IsFirstInRow ='1'">
<xsl:text disable-output-escaping="yes"><![CDATA[<tr>]]> </xsl:text>
</xsl:if>
<td valign="top">
<xsl:attribute name="colspan"><xsl:value-of disable-output-
escaping="yes" select="@Colspan"/></xsl:attribute>
<xsl:if test="Allowed='True'">
<xsl:attribute name="class">inputborder</xsl:attribute>
</xsl:if>
<xsl:attribute name="width"><xsl:value-of select ="$ColumnWidth"/></
xsl:attribute>
<xsl:call-template name="ShowAttribute">
<xsl:with-param name="StdAttrCode" select="@StdAttrCode"></
xsl:with-param>
<xsl:with-param name="PA_ID" select="@PA_ID"></xsl:with-param>
<xsl:with-param name="SelectedTabId" select="$SelectedTabId"></
xsl:with-param>
<xsl:with-param name="CurrentStep" select="$CurrentStep"></
xsl:with-param>
</xsl:call-template>
</td>
Related Information
This procedure allows you to add various status updates to the products, such as obsolete, replaced, and not
supplied.
Context
Discontinued products appear in the catalog but users aren’t able to flag them and put them in the cart. We
introduced the ability to add various statuses to prevent confusion among users who would flag discontinued
products and attempt to put them in the cart. With this feature, companies no longer have to notify users that
the product is unavailable anymore. It also enables companies to offer replacements for obsolete products.
Note
This feature doesn’t apply for simple products that are part of configurable or parent-child products.
Procedure
1. Click Products in the Product Catalog submenu of the Setup page and find the product you plan to make
obsolete.
2. Click the Edit icon and scroll down to Permissions and Effectivity dates folder.
3. Select if your product is Discontinued or Replaced from the Product End of Life Status dropdown menu.
4. Select Replacement.
You have now made the product obsolete. Exit Setup and follow the remaining steps to see what your
obsolete product looks like on the user side.
10. Click New Quote and enter the name of your obsolete product in the Search field.
If your product has been discontinued, the following message appears: This product is no longer available
and has been discontinued.
If your product has been replaced, a link to Product Replacement appears. Click the link and click Add to
Quote to finish quoting.
Related Information
2.2.8 Drilldown
Let’s say you are a transport vehicle manufacturer that produces 20,000 different vehicles and also services
the vehicles it sold to customers. While many of these models and types of services offered are completely
different from one another a high number of them are very similar, with a few distinguishable details. Making a
unique selection of the entity you want can be complex and very time consuming. This is where Drilldown
comes in: it allows you literally to drill through the many options and arrive at your final selection quickly and
efficiently.
When you arrive to your desired result, whether it’s data you need for your product configuration or the product
itself, you can use it to configure your product and continue creating your quote.
It helps to think of the Drilldown feature as a product attribute with two important entities – Source and Result
columns.
That said, the first step in the Drilldown process is creating a Custom Table that will contain your selection data.
You can create your Custom Table manually or import an Excel file containing table data. You must fill out the
table with source columns representing possible choices – with each choice followed by its sort column – and
the Result columns representing the final outcome.
The second step is adding the custom control (Hierarhical Drilldown) attribute, and other attributes that will
support Drilldown, into the product. We will explain this later in the document after we show you how to create
a custom table. The final step is drilling through your options in order to configure your product and complete
your quote (this is explained in the Doing the Drilldown section of this Help document).
Note
You can download a sample Excel file populated with the required data. Click on next link to download
the sample: Vehicle Drilldown Template .
Click Browse to locate the Excel file and click Save. Now go back to the Custom Table Administration page,
find your table and click the Eye icon to make sure all fields are in.
Now that you have created a Custom Table you should create a product that will have attributes with a display
type custom control and attributes which will present results. In our mock-up scenario we will use three
attributes but you can create as many attributes as it is needed for your drilldown model.
We will be using three because we need one attribute for custom control (we called it Drilldown_Vehicle) and
two attributes where results will be displayed. In our mock-up example the Results No. 1 and No. 2 are Part
Number and Model Year, respectively.
Enter the name of your custom table in the Table field, (in our example it is Vehicle_drilldown). You will notice
that there are two tabs, Source column and Result tabs. Click Add New Column.
Now you are going to fill out relevant Source column fields. Consult the definition of the fields below:
● Label: Enter text that will be displayed in the Configurator for that selection.
Now that you have created your product with custom control, you can exit setup, configure the product and
complete your quote. During product configuration, make your selections from the Choose Drilldown dropdown
menu as you wish, and you will drill down to the result.
Related Information
Product Aliases are used to create different variations of the same product.
Context
Aliases can be useful when setting up several default configurations. This approach saves the user clicks or
allows marketing campaigns to configure products that are targeted to the end user. The original product
becomes the master and can be either active or inactive. There are no limits to the number of aliases created.
Different attribute values can be chosen as defaults when the product is configured. This is only possible if
rules haven’t already been created to prevent the default value selections.
Procedure
A new item appears in the Product menu on the left – Add Product Alias, where you can find a partially filled
out form with information from the base product.
2. Change the Alias name, Price, and other details if needed.
3. Select the permissions for the alias product if needed.
4. Select attributes in the Select attribute values dropdown list. Select one attribute value for each attribute
you would like the alias to default to.
The currently valid attribute values are listed in the Selected attribute values box.
5. Click Save to save alias.
A product alias inherits all the properties of the parent product except the properties that can be
configured in the alias itself, even if the property on the original product is changed after the alias is
created.
When a user logs on, they see the alias in the category defined. The master product is the base with no
attributes selected.
Note
Aliases don’t inherit the original product’s preselected attribute values. Use the default selections to
set preselected values.
Related Information
Attributes for a product can be defined either through the Product Setup Wizard or through the Manual
Product Definition.
You can define attribute in Product Setup Wizard through steps 2 through 4. Alternatively, you can define
attributes through the manual definition method in the Product Attributes section under the Current Product
admin menu.
Using this method, you must ensure that any attributes you intend to use for the product have already been
added to the category. See the chapter on the Categories [page 98] section for more information on adding
attributes to a category. In addition, any new attributes you would like to add to the product need to be created
in the Attributes administrative section. See the Attributes [page 26] section for more information. The
firsttime entering this page the left column shows an NU button and the right column shows an attribute
(unchecked). If these Product Attributes have been configured already, then numbered buttons are displayed
to the left of the NU button. These numbers represent steps, which is discussed later.
To access all the Attributes available, click the NU (Not Used) button. This lists all the Attributes that have been
added to that Category. Selecting an Attribute in the left column brings up its properties on the right column. If
these Product Attributes have already been configured then clicking the numbered step buttons brings up
more Product Attributes.
Note
If an Attribute Name isn’t completely visible, hold the cursor over the name until the complete name is
displayed in a tool tip.
At the top of the page, the name of the Product which is being configured is given. Clicking Reset at the bottom
of the page will restore all information and settings for the current Attribute selected back to when it was
previously saved.
In order to use an Attribute with a product, it must be selected. This is done by clicking the check box next to
the Attribute Name in the right column.
Note
At least one attribute value needs to be added to the product. If no values are added then the system will
produce an error.
● Select All – Convenient way to select the Attribute and all the values of the currently selected Attribute.
This is helpful if there are a large number of values. Attribute Values are discussed later.
● List As Line Item – If checked, the Attribute will show up in the Quote/Cart separate from the Product being
configured, or base product. If the attribute is set for multiple selections, such as a check box or multi-
select listbox, then each selected attribute will be displayed as a separate line item in the cart/quote.
Note
Multi-select attributes such as Checkbox cannot use the attribute’s line item description in the cart. This is
because the system cannot distinguish which item it should display the description for in the cart when
multiple items are selected. Because of this, you must use the Description Builder for each attribute value.
This will ensure that the correct description is displayed in the cart for that attribute.
OPTIONAL/REQUIRED Drop Down Box – Determines whether this Attribute is required to complete the order.
The default is OPTIONAL. If set to REQUIRED then when a user configures a product, a notice will be displayed
stating the order is Not Complete. Once all attributes set to REQUIRED have been selected, the notice will
change to Complete.
Display As: This drop down box gives all the choices available for how the attribute will be used in the
configuration. The choices are as follows:
Note
For all selection choices, if the Attribute is set to OPTIONAL then an extra choice will appear stating that no
selection value or selection has been made.
● User Selection:
○ Radio Button – Allows user to pick only one of the Attribute Values.
○ Check Box – Allows user to pick multiple Attribute Values.
○ Drop Drown – User can see all values by clicking in the drop-down box. Helpful if there are many values
but not much space to display each value.
○ List Box – User can select one value from a list of values.
○ List Box Multi Select – User can select multiple values from a list of values by holding down the Ctrl key.
○ Image Button – User can select a value by clicking on an image displayed for each value. If text needs
to be displayed it must be embedded into the image. Active and Inactive images need to be set for
each Attribute Value. Attribute Values are discussed later in this chapter.
○ Display Only Text – Displays only the Display Value text. Attribute can only have one attribute value.
○ Button – A button is displayed for the Attribute.
● User Input:
○ Free Form, Match Lower – User can enter a number and it can automatically can be matched with an
Attribute Value. For instance, Attribute Values for extension cord lengths could be 12, 20, 25, and 50. If
a user enters a 30 for the length of the extension cord then it will automatically be matched to the
Attribute Value of 25. This option though retains the users input for calculations if necessary.
○ Free Form, Match Upper – This works the same way as Match Lower except that it will match an
Attribute Value higher instead of lower. For the example given above, 50 would be the matched value
instead of 30.
○ Free Input, No Matching – Allows user to enter in values for an Attribute Value. This value will not be
matched to any Attribute Values. This is used most often for a user’s input.
○ Free Form, Set Match Lower – When a user enters a number it will be matched to the lower Attribute
Value. The value the user entered will not be retained but will be replaced with the matched Attribute
Value
○ Free Form, Set Match Upper – Works the same as Set Match Lower except that the entered value will be
matched with the higher Attribute Value.
○ Free Form, Exact Match – Allows user to enter number. User must enter a number that exactly matches
an Attribute Value or an error is given.
● Hidden Calculations:
Hidden Calculations use the expressions entered into the Hint/Calculation field of the attribute to
determine its value. Attributes set as hidden calculated can only have one attribute value. Use hidden
calculated attributes only when absolutely necessary. They don't offer control of calculation execution
Customer Range Error Text – allows the administrator to display a customer error message if an incorrect value
is entered by the user.
Step – Used in association with Steps. Set each Attribute to the Step it is associated with. If no steps are
defined and all Attributes will appear on the same page, then set all Attributes to the same step. Attributes with
the same step number will be displayed under that Step Number button displayed in the left column. If using
the Product Setup Wizard to organize your attributes, you will not need to modify this field.
Sub Rank – This number represents the sequence that the Attribute will be displayed to the user. Lower
numbers will be shown first, higher numbers last. If using the Product Setup Wizard to organize your attributes,
you will not need to modify this field.
Properties, Triggers, and Attribute Values allow for further tailoring of the Attribute. Clicking each button will
display related settings and options. Clicking the button again will remove those settings from the screen. If a
section of settings are open and another button is clicked, those settings will then be appended under the
already open settings.
Clicking will bring up the Attribute Where Used screen which will show all places where the attributes or
attribute values are used.
Hint or Calculation Expression – This is not displayed. If one of the Hidden Calculated choices was selected
from the Display As drop down then this is where the expression can be entered. Click the Check button for the
Formula Builder [page 11]. Do not enter product calculations into hint fields. Write rules that perform
calculations and assign result into an attribute.
Label – The default label displayed to the user when configuring the product is “Select attribute name”. If
another label is necessary, enter it here. Though this field is a text field, HTML code can be entered if
enhancements to the text such as bold or color is needed. Description – If List as line item (see above) is
selected, text entered here will be displayed next to the item when listed in the cart/quote. To add an
Attribute Quantity – This field allows you to set a default quantity of an attribute for a specific product. For
example, an attribute may be marked as line item, but it may be required (for some reason) to always add 100
of them. So if you put 100 in attribute quantity, it will add 100 in the shopping cart. If a user is allowed to enter
quantity during configuration, the box where he enters quantity can be pre-populated based on this value as
well.
User Can Enter Quantity – Determines whether the user is allowed to enter a quantity for this product. Enter a 1
to unconditionally allow the user the ability to enter quantity, or enter an expression to only allow it under
certain conditions. See Attribute Quantity [page 41] for more information.
Note
Product’s quantity can be changed through the use of a special attribute called ItemQuantity. If this
attribute exists then the system will use its value to determine the quantity of the main item in the cart. For
more information see ItemQuantity Attribute [page 53].
Propagate Quantity From Main Item – Determines if the quantity of this attribute changes when the quantity of
the main product changes. An expression can be entered which will determine when the quantity should or
shouldn’t change with the main product. Enter a 1 to unconditionally set this attribute to inherit the quantity
from the main product.
Effective Dates – If applicable, enter the dates that this Attribute will be available to a user. Click the Calendar
button to bring up a Calendar where the specific date can be chosen (see Effective Date).
X, Y – Allows custom placement of Attribute on the page by entering in the pixel location on the screen. Pixel
location starts within the tab.
Rows/Columns – This defines the rows and columns that a free input text field will contain. Rows will affect the
height while Columns will affect the width. Both values are based on the number of characters that can fit in the
area.
Click the Triggers button to open up the Triggers options for this Attribute. Triggers are discussed further in this
chapter in Triggers sections . Clicking the Attribute Values button will open the settings for the Values
associated with the Attribute. In order for the Attribute Value to be available to a user, the Value must be
selected. Select an Attribute Value by clicking the checkbox next to the Attribute Value name.
Preselected – This indicates that this Value will already be selected for the user when configuring the product.
Ref. Product – If it is selected then while loading the product, it will be loaded and rules will be executed. After
that catalog code, price, cost, image and product name of the ref. product will be used as catalog code, price,
cost, image and display value of the attribute value. Clicking the symbol at the attribute level will show all
places where that attribute is used.
Add On Price – Each Attribute Value selected can add more to the Base Price that was defined in the Product
Definition. Enter the amount to be added here. If necessary, prices can be negative to subtract from the Base
Price.
Price will only be added on if the Price Calculation field is not being used for the product on the Product
Definition page. If this field is going to be used, then you need to create an expression to add up all the
attributes’ prices within this field.
Value Catalog Code – Used in specifying the part number. Click the Check button for the Formula Builder [page
11]. Use attribute catalog code when configuring the Product Catalog Code Generator to use this entered
information (see Product Definition Tab [page 57] for more information). If attribute is a line item then this
value will be displayed in the Part Number column in the cart.
Sort Rank – Allows you to sort the values. Lower values are displayed first in the list. If not used, then the order
seen on this screen is what will be displayed to the user.
Active/Inactive Image – When Image Button is selected from the Display As box, these images must be
indicated. Active designates a value that is selected and Inactive designates a value that is not selected. Default
Quantity – Indicates the quantity of this Attribute Value that will be added to the Cart/Quote. Because the
default is 1, it is only necessary to enter a number if the quantity will be greater than 1.
Price Calculation – If the price of the Attribute Value is not always the same amount and may be dependent on
other Attribute Values then an expression can be built to determine the Price of the Attribute Value.Click the
Check button for the Formula Builder [page 11]. If a value is used in both the Add On Price and the Price
Calculation fields, then the Price Calculation will take priority.
Cost Builder – If the cost for the Attribute Value is not always the same and may be dependent on other
Attribute Values then an expression can be built to determine the Cost of the Attribute Value.Click the Check
button for the Formula Builder [page 11].
Desc Builder – This field is main useful only for multi-select attributes, such as a check box. Because the
system cannot determine which value to apply the attribute’s line item description to, by default the attribute
value’s display value is used in the line item description. You can alternatively determine what description is
going to be used in the cart for the current value with this field.
When finished configuring an Attribute, click Next to save the settings. This brings up a confirmation page to
verify the save. A link on that page is directed to the Product Definition page.
Note
To bypass the confirmation page and stay in Product Attributes definition, simply click another Attribute in
the left column. This will save the current Attribute while staying in the same section.
This functionality enables admin to control what are the attributes that will trigger the execution of rules.
Product rules are processed only when values of certain attributes are changed, not for each click and that
improves system responsiveness.
In SAP CPQ Setup when product is edited on tab Product Attributes/Options, there is column added called
Triggers Execution of Rules. When user enters any attribute, there is field called Triggers Execution of Rules. If
this flag is checked, when user changes value of this attribute in product configuration, product rules will be
executed. If flag is not checked, changing value will not trigger execution of product rules which may improve
A Parent/Child system looks the following way when added to the quote (a Parent/Child System with a
configurable child item and two line items where one of them is inheriting a product type form a Simple
product):
Parent/Child System:
● 1.1 Attribute line item that inherits product type from Simple product (rank 20)
● 1.2 Attribute line item (rank 30)
● 1.3 Configurable child (container line) item (rank 10)
Line/Child ordering does not fall in line with the ranks. This is because SAP CPQ will first sort the Line Items,
then the Child Items (child items always follow line items).
Now let’s see what happens when application parameter Inherit Only Product Type is set to TRUE. In this case,
attribute line items will be treated as products. In other words, the Parent/Child System treats such attributes
as child items:
Parent/Child System:
When Inherit Only Product Type is set to TRUE attribute line items will only pick up the product type from the
selected product. Such attributes will be treated as line items of the Parent/Child System.
Related Information
A Copy button gives you an option to copy existing products in the system. It’s displayed for all products,
including aliases.
If you click on the button, a popup window displays and you can enter the name of the copied product. By
default, the name of the copied product is Copy of <original product name>.
The product display type depends on the the configuration level of a product. It is selected in the Product
Definition tab of the Product Editor.
● Simple Product
● Configurable Product
● Collection of Configurable Products
● System (List) of Configurable Products
● Parent/Child System (List) of Configurable Products
Each display type provides a different behavior for the product. For example the Simple Product display type
requires no configuration in order to be added to a quote. The Configurable Product display type, on the other
hand, requires configuration before it can be added to a quote, and it can enforce any inclusion, exclusion, or
bundling rules.
The display types Collection of Configurable Products, System (List) of Configurable Products, and Parent/Child
System (List) of Configurable Products behave just like a Configurable Product, but are used when a product
nesting or hierarchical product structure is set up.
A Simple Product doesn't require any attributes/options to be selected in order to be added to a quote.
Since simple products don't require, the, Configuration Layout and Rules tabs are inactive when the Simple
Product display type is selected
A simple product can have attributes added to it for additional properties, such as color, material, size, and so
on. These attributes can then be used for product comparison or product detail pages (see Product Details
Templates [page 473] for more information).
Simple products and their attributes are most often imported through the Product Import. See Product Import
[page 120] for more information.
From the Catalog, simple products can be checked and added to a quote. By default, they aren’t displayed with
a Configure button, but an inactive Configure button can be shown by changing the Show customize button for
simple products setting in Setup General Application Parameters Product Catalog tab.
When added to a quote, a simple product is displayed as a single main item. Only the Copy and Delete actions
(Item Actions Workflow) are available in the quote.
A Configurable Product requires attributes to be selected in order to be added to a quote. These attributes can
have inclusion, exclusion, or bundling rules enforced between them.
The Configuration Layout and Rules tabs are both active when the Configurable Product display type is
selected.
Attributes can be added and updated through the Product Attributes/Options Tab [page 59] in the Product
Editor [page 56].
Configurable products and their attributes are most often imported through the Product Import [page 120].
The import doesn’t provide a way to set up attribute pricing, display types, or product references.
From the Catalog, configurable products can be configured through the Configure button.
Note
If all the required attributes in the configuration are preselected, then the Add button is active in the
Catalog, which allows the user to add the product to a quote without entering the configuration. This
behavior is also available if there are no required attributes in the configuration.
When added to a quote, a configurable product is displayed as a single main item. If the option List as Line Item
is selected for any attribute, they’re displayed as child items to the configuration in the quote. The Copy, Delete,
Edit, and Refresh actions (Item Actions Workflow [page 388]) are available for configurable products in the
quote.
Attributes added through the Product Attributes/Options Tab [page 59] in the Product Editor [page 56] must
reference other products (child products). Attributes that reference products must also be set as List as Line
Item.
Since this product display type is used in product nesting or hierarchical product structure, which involves
referencing other products, it can't be imported through the Product Import.
From the Catalog, a collection of configurable products can be configured through the Configure button. The
configuration behaves in the same way as it does for a Configurable Product.
Note
If all required attributes in the configuration are preselected, then the Add button becomes active in the
Catalog, which allows the user to add the product to a quote without configuring it. This behavior is also
available if there are no required attributes in the configuration.
When added to a quote, the collection of configurable products adds the products referencing the selected
attributes to the quote. These products are displayed as main items in the quote, not as child items (which is
This product display type differs from the System (List) of Configurable Products or Parent/Child System (List)
of Configurable Products display types in that the products added to the quote aren't a part of any system. They
become independent products in the quote. The parent product's configuration is also lost and can't be edited.
System (List) of Configurable Products behaves as a Configurable Product in that it requires attributes to be
selected before being added to a quote. Inclusion, exclusion, or bundling rules can be enforced between those
attributes. This display type is used when setting up product nesting or hierarchical product structure.
Attributes added through the Product Attributes/Options Tab [page 59] in the Product Editor [page 56] must
reference other products (child products). Attributes that reference products must also be set as List as Line
Item.
Since this product display type is used in a product nesting or hierarchical product structure, which involves
referencing other products, it can't be imported through Product Import.
From the Catalog, the system (list) of configurable products can be configured through the Configure button.
The configuration behaves in the same way as it does for a Configurable Product.
Note
If all required attributes in the configuration are preselected, then the Add button becomes active in the
Catalog, which allows the user to add the product to a quote without entering the configuration. This
behavior is also available if there are no required attributes in the configuration.
When added to a quote, the system (list) of configurable products adds the products referencing the selected
attributes to the quote. These products are displayed in the quote as main items, not child items (which is true
for configurable products. Only the products referenced by attributes (child products) are taken into account.
The parent product, which includes the fields under the Product Definition Tab [page 57], is ignored when
added to the quote.
This product display type differs from the Collection of Configurable Products display type in that the products
added to the quote are still part of the system. The parent product's configuration isn't lost and can be edited
by clicking the Edit action next to any products that are a part of that system.
The System (List) of Configurable Products display type differs from the Parent/Child System (List) of
Configurable Products display type in that the main item is ignored, and only the products referencing
attributes are taken into account.
Parent/Child System(List) of Configurable Products behaves like a Configurable Product in that it requires
attributes to be selected in order to be added to a quote. Inclusion, exclusion, or bundling rules can be enforced
Attributes added through the Product Attributes/Options Tab [page 59] in the Product Editor [page 56] must
reference other products (child products). Attributes that reference products must also be set as List as Line
Item.
Since this product display type is used in a product nesting or hierarchical product structure, which involves
referencing other products, it can't be imported through Product Import.
From the Catalog, parent/child system (list) of configurable products can be configured through the Configure
button. The configuration behaves in the same way as it does for configurable products.
Note
If all the required attributes in the configuration are preselected, then the Add button is active in the
Catalog, which allows the user to add the product to a quote without entering the configuration. This
behavior is also available if there are no required attributes in the configuration.
When added to a quote, parent/child system (list) of configurable products add the products referencing the
selected attributes to the quote. These products are displayed in the quote as main items, not child items
(which is true for configurable products). Not only are the products referenced by attributes (child products)
taken into account, but the parent product is also added to a quote, which includes the fields under the Product
Definition Tab [page 57]. Basically, this display type is a combination of a Configurable Product and a System
(List) of Configurable Products. Not only are the referenced products displayed in the quote, but also the main
item and any attribute line items that aren't referencing products.
This product display type differs from the Collection of Configurable Products display type in that the products
added to the quote are still a part of the system. The parent product's configuration isn't lost and can be edited
by clicking the Edit action next to any of the products that are part of that system.
The Parent/Child System (List) of Configurable Products display type differs from the System (List) of
Configurable Products display type in that the main item and the products referencing attributes are added to
the quote.
Product validation messages are similar to product rules, but instead of executing an action during the
configuration change, they display as a message if the condition is satisfied. They’re executed after the
configuration change (that is, when a user selects attribute value in the Configurator).
Validation messages have the following structure: validation name + condition stating when the message
displays + the message that is displayed in the Configurator.
Note
Inactive, or expired (current date is outside of the specified start and end dates) validation messages are
ignored.
If Make product incomplete is checked, and the condition evaluates to 1 (true), and message is displayed, the
product is still incomplete even though all required product attributes are selected.
The CTX tag Product.Validation(validation name) is meant to only be used in attribute labels, to show
a message in addition to the responder. If used in product rules it returns unexpected results depending on the
rule order and configuration, since all rules haven't been executed and configuration hasn't been stabilized.
The purpose of this feature is to enable you to create product versions, modify them and then activate them.
Meanwhile, the original product remains intact and is used in SAP CPQ. You can decide when to activate a new
product version or to roll back to the previous one.
Procedure
A table with all product versions for the selected product is displayed.
○ If you click on the Edit action, the standard SAP CPQ product setup page opens. Here you can modify
this version as you want and save changes.
○ If you click on the Delete action, the system checks if there’s any quote that contains this product
version and if so, it doesn't delete the version. Otherwise, that product version is deleted.
○ You can Add, Activate, Edit, Preview, Configure, or Check Product Details for the product version by
clicking on the appropriate link or button on the product versioning page.
3. Click Create New Version.
The popup window is closed, and the new product version appears in the list of versions for the product.
6. Activate the new version to make it default.
In the Workflow edit page ( Setup Workflow/Approval Workflow ) there are two options for quote
actions:
● Prompt Users For Update to New Product Versions - If the selected quote action (for example, Edit) is
executed, a message states that there’s a new product version available for some items and requires
confirmation from you whether to update those items or not.
If you confirm, all appropriate items are upgraded and the quote action is executed. Otherwise, the action
is executed without upgrading items to the new version.
● Automatically Update Items to New Product Version - If the selected quote action is executed, all items are
automatically upgraded to their new product versions if a new version is available.
This feature enables you to preconfigure the product based on the XML configuration that you’ve already
defined. For this purpose, tag <*SetConfigurationBasedOnXML(xml)*> has been introduced.
The tag accepts XML as an input string parameter, which is parsed and used to preconfigure the product. While
parsing the input XML, SAP CPQ tries to match attributes from XML to attributes in the product. If some
attribute from XML couldn’t be matched to any product attribute, it’s skipped. SAP CPQ continues with
matching other attributes and setting their values without interruption and doesn't display any error.
The only thing that can break the process is an invalid XML input (XML wasn't well formed). SAP CPQ doesn't
display an error but it can't process any attributes.
Besides standard usage, this tag can be used through Iron Python scripting as well.
Since the <*SetConfigurationBasedOnXML(xml)*> tag doesn't support setting multiple attribute values,
you can use this script to select multiple values in a checkbox attribute:
Product.Attributes.GetByName('AttributeName').SelectDisplayValues('NameOfCheckBox1'
, 'NameOfCheckBox2', 'NameOfCheckBox3').
Example
This simple example shows how the input XML is supposed to look like if you want to set configuration for the
product that doesn’t contain any containers.
For this example, we use our sample product named e-car CallidusCloud, which has a few attributes. We added
an attribute Set configuration, which is of type Button. Also we’ve developed an IronPython script that provides
an input XML and parses the <*SetConfigurationBasedOnXML()*> tag. This script is attached to the Set
configuration button and once the button is clicked, the product becomes preconfigured based on the provided
XML.
At first, our product is loaded into the Configurator. No attribute is selected yet.
Here is the underlying XML file that has been provided as input to the SetConfigurationBasedOnXML tag:
<Attributes>
<Attribute><Name>Exterior Color</Name><Value>gray</Value></Attribute>
<Attribute><Name>Number of airbags</Name><Value>8</Value></Attribute>
<Attribute><Name>Equipment</Name><Value>Classic</Value></Attribute>
<Attribute><Name>Fuel</Name><Value>Petrol</Value></Attribute>
<Attribute Quantity="5"><Name>warranty</Name><Value>YES</Value></Attribute>
</Attributes>
The entire process is driven by the IronPython script that was attached to the Set configuration button. Here is
the script:
Example
This example shows how the input XML looks like if the product contains container attributes.
<Attributes>
<Attribute Quantity="2">
<Name>AttrWithQuantity</Name>
<Value>1</Value>
</Attribute>
<Attribute>
<Name>Memory</Name>
<Value>256</Value>
</Attribute>
<Attribute>
<Name>Monitor</Name>
<Value>F19</Value>
</Attribute>
<Attribute>
<Name>Processor_name_of_att</Name>
<Value>P2</Value>
</Attribute>
<Attribute>
<Name>Warranty</Name>
<Value>4 yrs</Value>
</Attribute>
<Attribute>
<Name>Hard disk</Name>
<Value>60</Value>
</Attribute>
<Attribute>
<Name>Nested-FirstAttribute</Name>
<Rows>
<Row>
<Product>
<Name>Nested-First</Name>
<CatalogCode>PN-SMB10</CatalogCode>
<Attributes>
<Attribute>
<Name>Memory</Name>
<Value>3GB DDR2</Value>
</Attribute>
<Attribute>
<Name>Processor_name_of_att</Name>
<Value></Value>
</Attribute>
<Attribute>
<Name>Monitor</Name>
<Value>T17</Value>
</Attribute>
<Attribute>
<Name>Hard disk</Name>
<Value>60</Value>
</Attribute>
The purpose of this feature is to make it easier for you to export or import a large number of simple products.
Mass Export
In Setup Products , there’s a new radio button group where you can select whether products are
exported to Excel or as a CSV file.
Default selection is Excel. When you change the selection, your choice is remembered so that the next time you
export products (not necessarily in same session), the same format is used. If Excel is selected, the current
limit is used (according to the application parameter) for maximum number of rows per exported file, which is
set to 2000 by default.
If CSV is selected, limit is 100 000 per exported file. When products are exported to several files, the same
header is used for all files. All attributes are displayed in the header.
If the checkbox Export products without attributes is selected, the Excel file doesn't contain any attributes. This
checkbox isn't selected by default.
If option Export to CSV is selected, a new set of radio buttons is displayed and it decides the delimiter character
for cells in CSV file (tab or comma).
Import
When importing files, the limit is 20 000 products if the import file contains only these columns:
● ExternalId
● UPC
● MPN
● Inventory
● LeadTime
● FamilyCode
● PRODUCT_ACTIVE
● PRODUCT_NAME
● CPQ ID
● CPQ ID
Triggers allow you to perform an action, or actions, when an event occurs on an attribute. They’re useful for
situations when you want to reset an attribute when another attribute is selected or has changed selections.
For example, there’s an attribute Unit of Measure that determines what length is going to be entered in another
attribute, Length. Unit of Measure includes the values Inches and Centimeters. If a user selects Inches, types in
12 in the Length attribute, but then decides to change Unit of Measure to Centimeters, then we need to reset
Length so that the user knows to enter a centimeter measurement instead of an inches measurement.
Triggers are defined for each individual attribute. You can define them in the Product Attributes page of the
desired product. Once you click the Trigger button in the attribute’s setting box of the desired attribute, the
Trigger panel opens up. Here, you can define actions that occur under each event:
● Change Trigger – activates when the user changes the previously selected value within the attribute.
Example
<*ResetAtt(Length)*> - Placed in the Unit of Measure attribute, this resets the attribute Length when the
selection has been changed for the attribute Unit of Measure.
● Select Trigger – activates when the user selects any value from the attribute without the previous selection.
Example
<*ResetAtt(Length)*> - Placed in the Unit of Measure attribute, this resets the attribute Length when the
selection has been changed for the attribute Unit of Measure.
● Reset Trigger – activates when the user deselects a previously selected value within the attribute.
Example
From our previously mentioned example, the Reset Trigger of Length is run after Change Trigger or Select
Trigger of Unit of Measure.
Note
The Change Trigger isn’t activated by attribute's first selection (Select Trigger is activated), and isn't
activated by the attribute's deselection (Reset Trigger is activated). The Change Trigger activates when
there’s only a full change, which occurs when a new Value selection resets the previously selected value.
It's also possible to have multiple triggers in the same attribute, and multiple actions in each trigger (separated
by a semicolon). Conditional expressions can also be used within each trigger to determine whether or not an
action tag can be run. Triggers can be entered manually, or by using the Formula Builder [page 11]. To invoke
the Formula Builder for a trigger, click on the V button positioned near the lower left corner of the appropriate
Note
Clicking Next or clicking another Attribute Name in the left column on the Product Attributes/Options page
saves a trigger and any other information changed for that attribute.
Triggers run before Attribute Dependencies and Rules in the system’s processing order. See the Rules
Administration [page 65] page for more information.
The Unit of Measurement attribute refers to the attribute in the product configuration that displays values of
certain measurement types, such as Pressure, Temperature, Length, and so on.
When these attributes are created, their values are expressed in default units. You can select measurement
units for any measurement type. Based on your selection of the measurement unit, SAP CPQ converts
attribute values to the selected unit. The purpose of this functionality is to display values of Unit of
Measurement attributes in the units that you select.
The default unit of measurement is set up per user. The Unit of Measurement is available in Setup Product
Catalog .
● You can add as many measurement types and measurement units as needed.
● Once a measurement type and its units are added, the default unit can’t be changed anymore.
● If the default unit has to be changed, you need to delete the existing measurement type and to create it
again.
● If a measurement type that needs to be deleted is used in attributes, you need to delete those attributes
first, or change the attribute type, in order to remove the measurement type.
Unit Mapping Table contains the units of measurement that have been added to the system. They can be
downloaded.
Once you've added at least one default unit, you can download a Unit Mapping Table from Setup Product
Catalog Unit of Measurement by clicking Export Conversions. You can add the table once you export the
converted values.
If there are no attributes belonging to a certain measurement type, the exported Unit Mapping Table is empty.
For example, if you download a table containing no attributes whose measurement type is Pressure, the
downloaded table is empty.
If you already completed the conversion of a certain value, the Unit Mapping Table contains converted values as
well.
When two attributes use the same measurement, for example Pressure, the display value can be shown with a
space (25bar) or without a space (25 Bar). The format of the display value is defined by the system (or by
administrators) which creates Unit of Measurement attributes. When a Unit of Measurement attribute is loaded
in product configuration, the attribute display values are read from the Unit Mapping Table. The attribute values
format is as follows: 0.25 Bar and 0.25 bar are the same values, but one of the values exists in the unit
mapping table. The format of the first value entered in the system is applied to all other attributes with the
same values.
Example
New attribute: Attribute A with values 0.25 Bar, 0.35 Bar, 0.45 Bar.
New attribute: Attribute B with the following values, 0.25 bar, 0.35 bar, 0.45 bar, is displayed the
same way in configuration. However, in table mappings, the values 0.25 Bar, 0.35 Bar, and 0.45 Bar are
displayed.
Note
0.25Bar and 0.25bar are the same values, but one value is present in the Unit Mapping Table. The format
of the first value entered in the system is applied to all other attributes with this value.
If a new value is compared to a value entered when you've completed a conversion for the last time, the new
values are added to the column Pressure, but values aren't converted into other units.
You need to download a Unit Mapping Table, conduct a conversion, and put the table back into the system.
This topic contains the procedure for importing units of measurement into SAP CPQ.
Procedure
The import is completed automatically once you upload the file. Creating measurement types and units
has to be completed prior to creating the attribute of the Unit of Measurement type.
Measurement attributes need to be created in the system to support Unit of Measurement in product
configuration.
You can create a new attribute type ( Setup Product Catalog Attributes ). As soon as Measurement is
chosen as an attribute type, a Unit of Measurement field is displayed. Here, you can select one of the
measurement types you've previously added to the system. This field is required.
At this point, you can add attribute values and attribute value codes, in the same way you do for other attribute
types; and add the attribute to the product.
Units of measurement can also be accessed from User Menu User Page .
As soon as a new measurement type is added to the system, that measurement type becomes a standard field
on the User Page and User Setup.
The Unit of Measurement field labels can be translated to the user’s language by adding its key to the
dictionary. The content of these fields, however, can’t be translated. You can add a default value to the Unit of
Measurement fields in User Setup. A default value can't be added through import, Users functionality, or user
API.
This topic contains scopes and limits of the Unit of Measurement functionality.
● When a user edits a saved configuration, Favorites, or a configuration from an existing quote, and if
measurement attributes have selected values, the system shows the selected value of measurement
attributes in unit selected when the Edit action was executed.
● When a new product is created via API, the Unit of Measurement attribute type is supported. API is
expanded to support the Measurement type along with the attribute type.
● Creating an attribute type Unit of Measurement through Export/Import functionality is supported.
Importing attributes with Unit of Measurement type is required when you want to make an attribute
determined by a unit of measurement. When you conduct your Attribute Import, the Excel file needs to
include a column called Measurement where you can enter your Display Values and your Unit of
Measurement.These values must be entered in the exported file in order to be converted from your default
value (meters, for example) to another value (kilometers, for example).
● Attribute Unit of Measurement translation - values of measurement attribute can’t be translated into other
languages. For example, translating 25,000 Pаscale in English to 25,000 Паскаль in Russian isn’t
supported.
● Attribute Unit of Measurement in quote - tags in the quote return the value of the default unit. The
converted values in the quote aren’t supported by the design; only tags in the Configurator return
converted values.
2.3 Categories
Categories are used to logically segment products. Once created, products or subcategories can be added to
them.
Categories, when displayed to the user, can include an image, a description, and can be visible only to users
with the correct rights. Selecting the Categories link in Setup Products brings up the Categories
Administration screen. New installations show only an Add button. After categories have been created, they can
be modified, deleted, or made inactive.
● Permission groups which are able to see this category - When the flag Visible to all is selected, permission
groups lists are grayed out. When the flag isn't selected, you can select permissions for any user types,
companies, markets, brands, and permission groups.
● Visibility of products in this category - When you select this checkbox, the permissions defined for this
category are copied to the products, which belong to this category (not to its subcategories.
● Visibility of sub-categories - When you select this checkbox, the defined permissions for this category are
copied to the subcategories and products, which belong to this category.
If you enter a category where the default catalog view has already been selected for one of its parents (direct
parent, grand-parent, and so on) you can't change anything for this category. You can enter the parent category
by clicking on the provided link in the Default Catalog View box.
After you finish setting up Categories, when users enter particular category, SAP CPQ checks whether the
default catalog view is selected for particular category. If this category has default view defined (for itself or for
its parent, grandparent, and so on), this default catalog view is applied. If no default view is applied for a
category, SAP CPQ uses the current catalog view. When users log into SAP CPQ, the current catalog view is set
to default catalog view defined on user type level.
Choosing an existing Category brings up the Category Properties page. Selecting Add brings up a blank
Category Properties page.
Category Image
You can allocate up to three images per category. These images appear only on the Categories page in Catalog
on the user side.
The Category Image acts as the category’s main image and is always displayed in the Catalog. You can use
Additional Image 1 and Additional Image 2 options if you want to define additional images.
Note
Additional images aren’t displayed by default. You can modify XSLT transformation, so that those images are
displayed in Catalog. To enable the display of those images in Catalog, go to Setup UI Design Custom
Category UI .
When you click Add New, you can select the Category for which you want to define the images. Then you can
select the XSLT file for transforming these images. You can define your own transformation file, select the
default file, or change the default file if needed.
For this feature to work properly, the appropriate transformation has to be applied for all categories in the
Catalog. You can do this in Setup UI Design Catalog Layout . There, you can select the appropriate
XSLT file.
The Mobile Only Image option is optimized for iOS mobile operating systems. When you upload a photo here,
the photo is displayed in Catalog, but only on mobile computing platforms, and only as part of the SAP CPQ
application.
User Side
In order for the additional images to be visible in Catalog, select the Custom View option by clicking the Custom
button with a wrench icon.
● Attributes: Sets the attributes that are available to products in this category. In order for a product to use
an attribute, it must be added to the category. You can avoid adding attributes to a category by using the
Product Setup Wizard, which doesn't require you to add attributes to the category before using them in a
product.
● Tabs: Defines which tabs are available for products in this category. Ranks for each tab determine the order
of appearance on the Product page within this category.
● Security: Determines which user groups can see this category on the Categories page.
Managing Categories
Managing Categories allows you to create subcategories within the directory. You can create subcategories in
Setup Product Catalog Categories . You can click Select to choose the category's parent category in the
category editing screen.
To access this section, go to Setup Product Catalog Product Attribute Visibility Restrictions . Here, you
can see the list of all available attributes.
Visibility restrictions are user type-based, so you first need to select a desired User Type in the dropdown
menu. You can make any attribute invisible in the Catalog and the Configurator by ticking a checkbox next to it
for users who belong to the selected User Type.
Furthermore, if you wish to use the same attribute visibility restrictions for more than one user group, you can
copy the settings with the Copy Settings From option.
Once imported, simple products can easily be converted to configurable products. This makes creating
multiple simple products easier, and it also makes the creation of configurable products easier, too. Simple
Product Import allows not only importing new simple products, but user can also export any existing simple
products into an Excel spreadsheet. This allows quickly updating pricing, descriptions, or any other field that
the spreadsheet contains. Once reuploaded, the modifications are made to the simple products in the system.
The Simple Product Import administrative section can be accessed under the Products menu in Setup. From
this page user can download the template for importing new simple products, export existing simple product to
this template, or upload and import new simple products.
The template provided as a download is used for uploading new simple products. It comes with some pre-
entered values to direct you in creating the products. It’s important to delete these entries, otherwise when the
user uploads the spreadsheet, these products are created .
When creating entries in the spreadsheet, value in the System ID column shouldn't be added. This value is
strictly for the system’s use. When products are exported, this column is filled with that product’s system ID.
To create a new simple product entry in the spreadsheet, a user needs to enter a new row for each product.
There’s no need to enter values for every column. The required columns are Index, Product Name, Price,
Product Type, and Categories. If a Product Type or Category included hasn’t been created in the system yet,
then they’re created during the import.
The Price, Cost Builder, and Cat Code fields can contain SAP CPQ tags that generate the value automatically.
For instance, users can use the AUX tag to pull these values from a custom table. Configuring products in this
way allows updating pricing and part numbers (Cat Code) easily by simply updating the custom table.
Enter the category the product belongs to in the Categories column. By default, any new categories are created
at the top-level category. Users can create and include the product in subcategories if needed. To do this, the
subcategory name needs to be preceded with the parent category followed by the > symbol. For instance, if
users want to add a product to a new subcategory Printers that is in a subcategory of Hardware and
Accessories, they need to represent that in the following order: Hardware Accessories Printers .
Attributes for the product need to be entered in the same row as the product, then their values need to be
included underneath the name. Additional attributes can be added in subsequent columns in the same way.
Attributes can have as many values as needed. Once users have entries for all the products they wish to create,
they can save the file then go into the Simple Product Import administrative section. Afterwards, they can click
the Browse button in the Import Products section of the page. Afterwards, they can select the modified
template and click Import.
Note
It's important not to modify the template file. The System ID, Index, Product Name, Price, Cost Builder, Cat
Code, Product Type, Description, Categories, and Attributes columns need to exist for the upload to be
successful. Users can view restrictions and required columns on the Important Info sheet tab of the Simple
Product Import Template.
During an import, the system checks the file to ensure that it doesn't have any invalid entries. If the import
process takes more than a few seconds, system also displays import progress real time (it shows the number
of loaded simple products). Each record is defined as each product entry in the spreadsheet. Errors are shown
if the required fields aren’t entered for a product. The system processes the entire spreadsheet and returns the
status.
If there is at least one valid product to import, users can either import it with a preview or without. If Import
With Preview is chosen, then user has the option to select or reject products before they’re saved into the
system. This view also shows any invalid products that were found during processing of the spreadsheet.
Choosing Import Without Preview imports all the attributes without a review screen first. In addition, if there are
some invalid records in the spreadsheet, users can choose to only see those records by selecting Import With
Preview of Invalid Records Only.
Note
The Status column does show only a partial error message. To get a full error report, users need to click on
the error message itself.
Whichever selection was made, new products are saved to the system by clicking Save.
Clicking Create Template by Exporting Products from Selected Categories or Create Template by Exporting All
Products button in the Export Products section on page exports all simple products. Exporting Products from
Selected Categories allows exporting those simple products in selected categories, while Exporting All Products
exports all the simple products in the system. The system gathers all the simple products and enters them into
a spreadsheet in the same format of the template. A link is then provided where users can download the file.
With this file, users can modify the existing products or add new ones to the end of the list.
Note
Even though the preview screen displays all the products in the spreadsheet, not all are saved into the
system. Only the products without a value in the column are SystemID saved as new products.
A simple product is one that has attributes assigned to it, but they can’t be configured. Users can add the
product to their quote directly from the Categories page, or as a part of the multiple-product configuration like
Collection of Configured Products and Configurable System.
Though a simple product can have attributes, these attributes ideally only have one attribute value added to
them. The attributes can’t be configured, which means that only one attribute value can be selected. If you
wish these attributes to be displayed to the user in the quote, you need to set them as Line Items. Setting
attributes as Line Items displays the attributes under the simple product where, if set up for it, the quantity can
be changed and discounts added. In addition, attributes added to simple products can be displayed in a
generated quote or searched for on the Load Quote page without being Line Items.
When using simple products to be added to the quote from the Catalog, or the Categories screen, you need to
ensure that any attribute values you wish to be selected for that product are preselected. This ensures that you
can search by the values (using Key Attributes) and see them as line items in the quote (as long as they’re set
as line items).
Attributes in Simple Products can have multiple values, if needed. These multiple values can be used in multiple
product configurations. Users can select a desired value for an attribute, which is then selected for that simple
product.
Simple products can play many roles in product modeling in SAP CPQ. For instance they can be used in
multiple product configurations, such as a Collection of Configurable Products or a Configurable System, in
BOM management, or simply as products that are added to a quote without being configured.
Note
For Free Trial Installation, there’s no menu item with name Simple Product Import under Product item in
Setup menu.
Product Types can be used in tracking quotation and order information. You can also separate subtotals in the
quote for each product type, which gives users the ability to use different discounts for different product types.
Each product created in the system can be assigned one Product Type. Multiple product types within a product
can be achieved by setting attributes within a product to a different product. This is discussed more in depth
later.
Selecting the Product Types link under the Products menu gives you access to the Product Types administrative
section. Here, Product Types can be Deleted or Edited. You can add a new Product Type by clicking the Add New
button.
Products can have only one product type. However, it's possible for a product to have multiple product types.
To achieve this, you need to configure attributes within the product to a different product type. This is done
through the Ref Product field in the product attributes definition screen.
The Ref Product field is used for connecting an attribute to another product. In this way, it’s possible to create a
parent child relationship between products. There are many benefits in doing this, including the ability to
configure the child product within the parent product. This is discussed more in depth in the Product Display
Types [page 84] topic.
One benefit of creating this parent child relationship between products is the sharing of product types. When
you reference another product in an attribute through the Ref Product field, the attribute takes on the same
product type as the product it’s referencing. This is useful when the referenced product has a product type
other than the parent product.
To take full advantage of a referenced product’s different product type, it's best to mark the attribute that
references the product as a line item. This way the attribute shows up separately from the main item in the
quote and includes a different product type. The quote then has separate product type subtotals, which can be
discounted (assuming you have the permission to do so).
Here is a simple example of how an attribute can be set up to have a separate product type from the main
product. We’ll use the SMB2 Desktop Computer product, which has a product type of Hardware in this example.
This product contains an attribute called Software that we set up with a product type of Software.
First we need to make sure that we have a separate product with the product type of Software. This product
can be a simple product without any attributes. Next we’ll go to the SMB2 Desktop Computer and go to the
attribute’s administration. In the Reference Product field we need to click the Select button. This displays a pop-
up window where you can search for the product that you’re going to reference. Here we will choose the
Software product. It’s named the same name as the product type to help us quickly identify it. Once it’s
selected the product is entered in the Referenced Product field.
Note
In this example, we’re using the Product Setup Wizard to define the referenced product. This can also be
done through the manual product definition, but instead of a Select button you see a dropdown box.
Part numbers can become lengthy and sometimes need to be limited in length by the underlining business
systems (ERP). Because of this, there’s a need to serialize an entire part number. or a part of it. Intelligent
Serialization implies that a part number can be serialized while preserving the part number logic; hence the
same configuration always yields the same serial number.
A simple example of this would be four attributes with three values each: Color (Blue, Red, Green), Material
(Wood, Aluminum, Steel), Voltage (120, 480, 600), and Size (Small, Medium, Large). If it's necessary to
uniquely capture these selections in the part number, then characters to represent these values. In this
scenario, a part number can be: Prefix-BW1M for a Medium-sized Blue widget, made out of Wood that works
with 120 Volts. However, if restricted to only two characters in the part number to represent these 4 attributes,
an intelligent Sequence Substitution would be defined, where any combination of these four attributes would be
replaced with a sequence. The sequence would be defined to range from 1 to 81 (34) and an attribute
mentioned above.
To define a Sequence Substitution, you first need to define a numeric sequence; for this example we’re using 1–
81. You can find the Sequence Substitution page in Setup Product Catalog SEQ Substitution .
Here Sequence Substitution can be edited, deleted, or copied by selecting the appropriate button next to the
substitution's name. New sequence substitutions can be created by clicking Add New. When you're creating a
new sequence substitution, you need to fill in several fields:
Once a sequence substitution is defined, it can be used in a formula for building a part number using a special
tag called <*CXSUB(sequence substitution name) *>. Using sequence substitution in a product can be
performed by entering <*CXSUB(SEQsub)*> in Product Catalogue Code Generator. In this example, SEQsub is
the created sequence substitution. To the user, the product number looks like any other product number or a
serial code.
The purpose of this feature is to enable administrators to attach an IronPython script on button attributes. This
gives you the option to define a script that is executed when users click the attribute button. This can include
adding rows in the container, selecting attributes, as well as any other operation associated with attributes.
Administrators can attach existing global IronPython script on product attributes tab under the product
administration page, when the chosen attribute type is a Button.
If the autocomplete search doesn't find the script you’re looking for, the following message pops up:
Autocomplete search didn’t find any script with this name.
When the autocomplete search locates the script, it’s displayed at the top of the list. Arrow icons become
available for you to navigate and set the execution of the scripts. A Delete icon is also available if you want to
remove the added script.
A magnifying icon is located next to the autocomplete search box. When you click on it, a list of all global scripts
pops up.
● Name
● Execution Time
● Code
● Description
● Active
● Modified by
You can search the script by typing the text in each of these columns. You need to select the script by clicking
the Select button. Once you click the Select button, the script is added to the top of the multiple-select list.
In the Attribute Import page, you can export/import attributes in several ways.
● Download a sample template, fill out attribute details, and then import the file.
● Export all attributes in SAP CPQ.
● Export all attributes, change details, and add new attributes, then import the file.
Sample Template
The sample template lets you easily upload multiple new attributes in SAP CPQ. To download the import
template, click Sample Template in the Attribute Import page. The Excel file contains three sheets:
● Attributes - enter attribute details in this sheet. Each line in the Attributes sheet corresponds to one
attribute value. If an attribute has multiple values, the attribute name, attribute external Id, and data type
are the same for each value of one attribute. The layout of the sheet matches the layout of the file that you
get when downloading all attributes in the system:
○ System Id - Needs to remain empty for new attributes.
○ Index - The first cell needs to always have the value 1 and the number should increment by one in the
subsequent cells.
○ Attribute Name - The name of the attribute.
○ Attribute External ID - The external attribute ID. Not a required field.
○ Display Value - Attribute value with the measurement unit, if applicable (for example 150 kg).
○ Value - Attribute value code.
○ Data Type - Data validation is set up on this column, so you can only select one of the attribute types
stated in the Data Type Defn sheet.
Note
All attribute types except Autocomplete - sourced from a custom table, Autocomplete - sourced from a
quote table, and Container can be imported in the system through the Attribute Import feature.
● Measurement - Name of the measurement unit of the attribute value as defined in Product Catalog > Unit of
Measurement.
● IMPORTANT INFO - Instructions on filling out the columns. The maximum size of the Excel template is 768
KB.
To update attributes that are already in the system, download all of them in an Excel file, update data and then
upload the file.
Note
Other than updating the existing and adding new attribute values, don't make any other changes in the
template. The template must contain all the columns described in Sample Template for the upload to be
successful. No special characters are supported.
Once you’ve defined your unit of measurement, you must create an attribute determined by that unit. In our
case, we have created unit Length and an attribute TestUnit; you must enter Measurement as your Attribute
Type. We've flagged Length M (meter) value as our Default unit of measurement.
You must enter your Display Values (100 m and 500 m, respectively, in our case) and your unit of measurement
in the Measurement column. These values must be entered in the file being exported in order to be able to
convert these values from your default value (meters, in our example), to another value (kilometers and miles,
in our example).
Now, the file containing these conversions needs to be imported. You need to add the attribute to the product
you wish to configure.
Once you’ve done that, you’re ready to configure your product in Catalog. Length measurement values in the
Configurator have been converted to kilometers from meters.
Note
SAP CPQ supports the deployment [page 563] of products containing Attribute Measurement Types. If the
chosen Unit of Measurement hasn’t been defined by the destination environment, the system creates that
unit. If the unit exists, the values of the deployed Attribute Measurement Type are added to the Conversion
Excel file.
SAP CPQ administrators can upload translations for many products using XLSX or XLS files. You can export
translations of all products or products that match entered criteria. Product fields and languages that are
selected on Product Translations Import page are displayed in the exported file.
In Setup Product Catalog Products Product Translation Import , you can choose a language that
needs to be translated from product fields (reference language) and a target language.
You can choose between SAP CPQ ID and Part number as a product identifier when you want to import product
translations. SAP CPQ ID is selected by default. When SAP CPQ ID is selected, you can import or export fields
associated to the product object as well as the attribute and the attribute value object. When the part number
is selected, only the fields associated with the product object can be translated. The attribute object and the
attribute value object are disabled.
You can select fields that need to be translated. Product name and Description are selected by default. Values
don't reset to default values when you navigate to other pages. If you deselect all options and try to export
product translations, the message Please specify product fields that need to be translated is displayed. If Part
Number provided in the Excel file doesn't exist in the system, SAP CPQ informs you that the product doesn’t
exist.
● Exporting product translations is identical to the process of exporting products – with ability to export
products from categories and to export all products.
● SAP CPQ exports all selected product translation fields – fields from the product object, the attribute
object, and the attribute value object.
● You can export translations for any product type (simple, configurable, collection, system, or parent/child
system).
SAP CPQ checks if the object (product, attribute, and attribute value) exists in the system. If product
system_Id doesn’t exist in the system, that row is skipped, and translations aren't inserted. The same
behavior is applied on attributes and attribute values. If they don’t exist in the product, they aren't inserted.
● Product
● Attribute
● Attribute value
● Reference language column – this column will be populated with chosen Translate from language. US
English is default.
● Language 1, Language 2 … - Each selected language for translation will be a separate column in xlsx file.
● If you rename column name, appropriate error message should be shown during the import.
● Columns and properties values should not be case sensitive.
Updating Product Translation: When you import a file, SAP CPQ should be able to understand whether product
translations already exist in the system for provided system_id. If yes, they will be updated.
Create Favorites Permissions enables you to limit users who are permitted to share Favorites.
Let’s say you’re a large industrial manufacturer, comprising a tools unit and an equipment unit, with one unit
having no involvement in the operations of another. In this case, you want only the tools unit, and not the
● Define user types who will be able to define favorites on company level
○ Select user types from the list view in the first panel. Those users can grant permission to other users
within their company to view the shared favorites.
○ Tick the Everyone checkbox to give everyone the permission within their company to share Favorites.
● Define user types who will be able to define favorites on system level
○ Select user types from the list view in the second panel. Those users can grant permission to all users
within SAP CPQ to view the shared favorites.
○ Tick the Everyone checkbox to give everyone the permission within SAP CPQ to share Favorites.
Tip
● Hold down the Ctrl key to select more than one user type while making your selections.
● Click Save when you're done making your selections.
SAP CPQ allows the use of data from nonstandard tables during the configuration process. Adding, editing, and
deleting tables along with their entries is done through Custom Tables.
● Define New – Create a new table by defining table and columns names
● Import New – Create a new table by importing an Excel file
● Edit Table – Add new columns to an existing table
Note
When you’re editing existing custom tables, all column and types are read-only and they can't be
changed.
When defining a Table Name, bear in mind that it can't begin with sys_. Table Name is a required field.
As soon as the custom table name is defined, the next step is to define columns. Column Name is a required
field. You can also define the type of each column. The following types are supported:
● bit
● int
● date
● datetime
● nvarchar(size) [default(250)]
● decimal(decimal places) [default(2)]
Note
Length/Decimal places column type is valid only for NVARCHAR, in which case it represents the length of
the string sequence, and the Decimal, in which case it represents decimal places.
By selecting the Personally Identifiable Information checkbox an administrator flags information as PII.
PII data can be flagged as sensitive via the Sensitive data checkbox. Sensitive data has an additional layer of
protection.
When you create a table via API, you can provide a type for each column within the attribute <DbType></
DbType>.
When a new table is created, primary auto increment key CpqTableEntryId is added to the table, which is later
used for manipulating entries. When Add New Column is clicked, the system adds a new blank column. Clicking
Undo Column removes the last created column.
A new table can be defined by importing it. When a new table is created, the primary auto increment key
CpqTableEntryId is added to the table. If a table name isn’t provided, the table name is populated with the Excel
file name. Table Name must be unique, needs to contain only alphanumerics, and can’t start with a numeric.
Columns in the db table will be named after columns from the excel file, therefore the column names must be
unique, and can contain only alphanumerics and can’t start with a numeric.
All Entries is the default selection. You can choose export format. Supported file formats are:
● Excel
● ZIP
Excel file is the default selection. If you choose the ZIP file, then XLS file is compressed to a ZIP file.
● Import
● Used for appending/updating data in existing table.
● If you just want to insert new rows, the Excel file mustn't contain a CpqTableEntryId column. However, if you
want to update and insert new rows, CpqTableEntryId is necessary for existing entries, while for new rows
this cell needs to be left blank.
This page is for adding or editing entries. When Save And New is clicked, the current data is saved, and this
page is displayed again, so a new entry can be added to the same table. When editing the existing entry,
CpqTableEntryId is displayed.
Audit Trail
Audit Trail provides you with the ability to see when custom table was created/modified and who performed the
action. Audit Trail is written every time you:
The timestamp and the performer of actions performed on custom tables are logged for each individual row in
the columns CpqTableEntryDateModified and CpqTableEntryModifiedBy.
From the administrator side, the columns are visible in Setup Product Catalog Custom Tables View
Entries , and from the user side, they’re visible in User Menu Manage Tables View Entries . The
columns are automatically populated with the date and time the table was modified, and the username and the
full name of the person that modified it. The action itself isn't logged. The columns are populated after the
following actions are performed:
● Add table
● Add row
● Edit row
● Copy row
● Import entries
● Import custom table
● Add column to the table
● Any actions affecting custom tables in Deploy/Send Changes
Moreover, the new columns are also populated when the following actions are performed via SOAP API:
● CREATETABLE
● DELETETABLE
● EXPORTROWS
● EXPORTTABLE
● INSERTROWS
● UPDATEROWS
● UPSERTROWS
● DELETEROWS
However, the following actions in custom tables are logged in Audit Trail Admin Actions :
● Add new table (via SOAP API, Excel, IP script or manually; also logged in the new columns)
● Add column to the table (also logged in the new columns)
● Changing the PII and Sensitive Data flags
● Delete row
● Delete table
Hidden custom tables are custom tables that are conditionally visible in SAP CPQ Setup, depending on
whether you’ve marked the tables as Hidden.
When you create a new custom table (by clicking Define New), you need to decide whether to mark the tables
as Hidden or not. The tables can be Hidden with values True and False. The default value is always False.
Note
Input parameters for creating a new custom field via API call have been expanded to support this property.
The IPython CreateTable method has also been expanded to support this property.
This parameter is located on the Custom Table page in Setup. When the value of this parameter is set to True,
SAP CPQ shows hidden tables. The parameter's default value is False. The value of this parameter is saved only
during your session. In other words, your selection is valid only you log out or unselect this parameter.
If this parameter is set to True, custom tables are displayed in the Configurator. They look the same as other
custom tables. You can edit them, delete them or change their content.
Guided Selling Product Search enables users to conduct an attribute-based search of products in Catalog. This
is done by narrowing a Catalog product list based on previously selected attributes and characteristics.
Before you go on to create any Guided Selling Product, you need to create a new Product Configuration
Template that uses the GudedSellingSearch.xsl XSL transformation for the Responder. This is a special XSLT
that you can use only on the Guided Selling Product configuration templates. Also, you must tick the Guided
Selling Template checkbox. Such templates appear only when editing Guided Selling Products and on the
Configuration Layout tab. Templates other than Guided Selling Templates are available only for regular Catalog
products, but not for Guided Selling Models.
To define a Guided Product Search model, go to Setup Product Catalog Guided Selling and click Add
New. This opens up a Product Definition similar to the Product Setup but with fewer details and more options
for Guided Selling.
Every time a guided selling product (Product Definition tab) is opened via Setup Product Catalog Guided
Selling (in both Quote 1.0 and Quote 2.0 engines), the LoadCpqPermissionsFromDb action is logged in the
Developer Console. The action is logged when the system loads the users’ visibility permissions for the guided
selling.
When you select attributes and values, users can search by other Catalog products. Add attributes to the
model.
● Use this attribute as search criteria - When selected, Guided Selling returns products that contain an
attribute value that is selected by the user for this attribute and removes any product that doesn’t have the
attribute value from the search criteria. For example: if attribute Memory is selected to be used as search
criteria, and user selects 1 GB of memory when using the guided selling, SAP CPQ returns all the products
that have the 1 GB value available in the Memory attribute.
● Don’t use this attribute as search criteria - This attribute doesn't drive the product selection logic at all.
Typically, you can use it to modify available options on other attributes that do contribute to search by
using rules.
● Use this attribute as optional in search criteria - Guided selling returns products that have the attribute
value selected by users for this attribute, while also returning products that don’t have this value selected,
if they satisfy other search criteria (based on other attributes). However, the optional attribute can’t be the
only criteria for filtering products. SAP CPQ doesn't return any results if only the optional attribute is
selected by the user. For example: We have two attributes in our guided selling product: Memory and Hard
Drive. Memory is optional, Hard Drive is required. End user picks 1 GB for the Memory but SAP CPQ returns
0 results (optional attribute can’t be the only criteria for search). User then selects 500 GB as the value for
the Hard Drive attribute. The system returns all the products that have 500 GB value available for Hard
Drive, and also any products that have 1 GB value available for Memory. However, it also returns products
that don’t have 1 GB Memory available – as the Memory is optional attribute in the search and doesn’t
enforce filtering.
● Use only to determine which categories to consider in search criteria - When an attribute is designated to be
a search criteria for Categories, you get a chance to enter which Category from the Catalog corresponds to
which value on this attribute. On user side, based on selected values in this attribute, SAP CPQ searches
the Catalog for products only on the categories that correspond to selected values for this attribute. If no
values are selected, or if you don’t have an attribute like this, SAP CPQ searches the entire Catalog. You
don’t have to have this type of attribute in guided selling. An example: You've added three attribute values
to the attribute Category Filter and flagged it as use only to determine which categories to consider in
search criteria. The attribute values that you've added are: Hardware, Software, and Services. You then
associate these attribute values with the following categories, respectively: Hardware, Software packages,
and Our Service offerings. On the user side, when user chooses the value Software for this attribute, SAP
CPQ only performs guided selling search in the Software packages category. User can select more than one
(if the UI type of the attribute is set in such way). If user didn't select any value, SAP CPQ searches the
entire Catalog.
Choose the order by which you’re making the selection of attribute values in Configurator and make sure
appropriate Layout Templates are available for selection.
Go to Catalog on the user side, and open the category your product belongs to. A Guided Selling dropdown
menu pops up on the right-hand side where you can select your model. When users click View Products, a
Catalog containing the products opens up.
Note
There’s an application parameter that controls how product details are calculated during Guided Selling
Search. It defines several levels of calculations – faster methods have more limitations and can’t parse
complex price formulas, while full parsing computes the price in a much slower way. This can be changed in
a Catalog Loading Attribute Based Search application parameter ( General Application Parameters
Product Catalog ).
Quantity in SAP CPQ can be defined on item level, attribute level, and attribute value level.
ItemQuantity Attribute
To allow defining quantity of product items in the Configurator, you need to add the ItemQuantity attribute to a
product and list it as line item. The attribute is predefined in the tenant when you register. The Quantity field
displays in the Catalog when configuring that product.
In quotes that contain simple products, editable Quantity field displays automatically. You don't need to add the
ItemQuantity attribute to simple products if you don't want to reference it somewhere in the application (for
example, container or for attribute values).
The following scenarios describe how the ItemQuantity attribute is typically handled:
● In the tier pricing model, pricing is based on ItemQuantity, and users are enabled to edit the quantity in
quotes by selecting User Can Enter Quantity. Example: a product costs $15 when buying one, $12 when
buying two, or $8 when buying three. If a user adds the product to a quote with a quantity of 1, the price is
$15. After changing the quantity to 2, the system passes it to the Configurator through the ItemQuantity
attribute. As pricing is based on this attribute, the price of the product changes accordingly to $12.
● You can expose the attribute to users so that they pick the quantity when configuring an item. Each change
of quantity is reflected locally in the quote, not in the Configurator.
● Calculate ItemQuantity via formulas as a hidden attribute. The formula is based on other selections a user
makes in SAP CPQ. The quantity is reflected on the quote.
In case of parent/child configurations, the system treats the ItemQuantity attribute and properly propagates
the quantity set up in the Configurator to quotes. However, the quantity doesn't propagate from quotes to the
Configurator (the quantity remains as it was initially defined).
For two attribute types (User Selection w/ Quantity Inputs for each Attribute Value and User Selection w/
Attribute Quantity Input) added as line items to products, the quantity box displays automatically in the
Configurator.
There are four quantity-related options that administrators can manage for all attributes listed as line items
(applies to all attribute types):
● User Can Enter Quantity - a checkbox in Products Product Attributes/Options Attribute Definition .
Selecting this option enables users to enter quantity to line items independently from the main item.
Whatever quantity is entered in the quote, it’s propagated back in the Configurator. The quantity users
enter in quotes overrides the default quantity, if defined.
● Inherit Quantity from Parent - a checkbox in Products Product Attributes/Options Attribute
Definition . When this option is enabled, the quantity of the line item is multiplied with the quantity of the
main item every time the quantity of the main item changes. The quantity is multiplied locally in the quote
● Execute rules on attribute value’s quantity change – the system triggers rules after changing the quantity of
attribute values in the Configurator.
● Calculate Auto-Reconfigure only items with modified ItemQuantity attribute – defines whether SAP CPQ
automatically reconfigures only those items whose item quantity attribute value is changed.
● Propagate Quantity to Nested Products – propagates quantity from the main item to all its underlying
items.
● Quantity Sign – enables administrators to select if the quantity is ONLY NON-NEGATIVE, ONLY POSITIVE,
or POSITIVE AND NEGATIVE.
Managing attribute and attribute value quantity can differ depending on the type of the attribute listed as line
item. What follows are specific scenarios explained through an example:
Item Quantity
1.Laptop computer 1
1.1. Keyboard 1
1.3. Pen 1
When you enable users to enter quantity for attribute line items, the attribute quantity in the Configurator
displays the quantity of the last edited attribute in the quote.
If you change the quantity of the line items in this order (Wireless mouse (Qty 2) > Pen (Qty 4) > Keyboard (Qty
2)), the quantity of the item in the quote is 2.
If the attribute inherits quantity from the parent item and has default values set for attribute values, the default
quantity of the value that was edited first displays in the Configurator.
Example
If you change the quantity of the line items in this order (Wireless mouse (Qty 4) > Pen (Qty 3) > Keyboard (Qty
2)), the quantity of the item in the quote is 4. The default value of the first selected item applies as quantity to
all other attribute values in the quote and can be overridden by changing the value of the parent item. If the
quantity of the parent item changes, the quantity of the line items changes accordingly. The same behavior
applies if users define the quantity of the attribute value and if there are default values defined in Setup. The
quantity of the value that was edited first applies to all quantities in the Configurator. If users change the
quantity of items in the quote, the quantity of the last edited item propagates back to the Configurator and it
applies to all quantities. After updating the quote, the new value applies to all items.
Container
For container attribute line items, there are two additional fields you need to manage when adding columns to a
container attribute:
Note
To handle quantity, a column in a container attribute needs to reference the ItemQuantity attribute.
If quantity inheritance from parent items is enabled, and you add a configurable product with multilevel line
items to a quote, the quantity of the underlying line items is multiplied by the quantity of the most immediate
main item.
1 Computer 1
1.1 Monitor 1
1.2 Case 1
1.2.2 Motherboard 2
1.2.2.1 RAM 2
1.2.2.2 GPU 1
If users change the quantity of Computer to 3, the quantity of the underlying line items changes accordingly:
1 Computer 3
1.1 Monitor 3
1.2 Case 3
1.2.2 Motherboard 6
1.2.2.1 RAM 12
1.2.2.2 GPU 6
Messages can be displayed to users either in the Configurator (for example, in attribute labels) or in the
Responder. They’re also used for enforcing product business rules because, if displayed, they can render
product incomplete.
Messages are similar to product rules - they both have a condition that is evaluated against the current product
configuration. If message condition evaluates to 1 (true), this message is displayed in the Responder, and the
product configuration is rendered incomplete.
Message conditions are evaluated after product rules have been executed (after user selects an attribute,
product rules are executed followed by message condition evaluation).
Note
To retrieve message text (and use it in attribute labels, for example), the tag
<*CTX(Product.Validation(message name))*> needs to be used. This tag shouldn't be used in
product rules because it returns incorrect values due to execution dependency between rules and message
evaluation.
Message can be displayed in the Responder and in the attribute label (via the tag) at the same time.
In order to translate content of product message, syntax {{Dictionary_Key}} can be used. It retrieves the
value from selected dictionary with the key Dictionary_Key.
The Product Import administrative section gives you the option to create products in an Excel spreadsheet,
then upload them into SAP CPQ.
In addition to creating new products, you can also export any existing products into an Excel spreadsheet. Both
simple and configurable products (or aliases) can be imported and exported. You have the option to quickly
update pricing, descriptions, or any other fields that the spreadsheet contains. Once reuploaded, the
modifications are made to the products in the system.
The Product Import administrative section can be accessed under the Products administrative menu ( Setup
Products Product Import ). From this page, you can download the template for importing new products,
export the existing products to this template, or upload and import new products.
You can also access this functionality from the Products page ( Setup Products Products ) where all
products are listed. Here, you can export listed products, export all products that match entered criteria, or just
go to the Product Import page.
The provided downloadable template is used for uploading new products. It comes with some pre-entered
values to give direction while creating products. It’s important to delete these entries, otherwise, when
uploading the spreadsheet, these products are created.
To create a new product entry in the spreadsheet, you need to enter a new row for each product. There’s no
need to enter values for every column. The required columns are Product Name, Price, Product Type, and
Categories. If a Product Type or Category included hasn’t been created in the system yet, then they’re created
during the import.
If updating existing products, you need to include only the columns that you wish to update and a column that
is used as a product identifier. Product identifier can be: Part Number, Product Name, External Id, UPC, MPN,
CPQ ID, or Product Family Code.
It’s also possible to select None as a product identifier, in which case products are always created.
Note
Excel template containing Sample Products has two sheets - Example sheet with example products and \
that shows all available columns with descriptions.
Here is the table that shows all available columns with description and restrictions for each one of them:
End Date End date for prod No No Date (in Excel). 13/24/2010
uct effectivity - un
til this date, users
are able to select
this product.
The Part Number, Description, Price, Cost, Quote Description, Recurring Price, and Recurring Cost fields can
contain SAP CPQ tags that generate the value automatically.
Enter the category where the product is located in the Categories column. By default, any new categories are
created at the top-level category. You can create and include the product in subcategories, if needed. To do this,
precede the subcategory name with the parent category followed by a >. For instance, if you want to add a
product to a new subcategory Printers that is in the Hardware and Accessories subcategory, you can represent
that in the following order: Hardware Accesories Printers .
Enter attributes for products by creating columns using the a:: prefix (for example, a::Printer - this
represents the Printer attribute). Then, attribute values can be entered in the same column for each product
row. If a product doesn't contain an attribute value, then the corresponding attribute isn't added to this
product.
Once having entries for all the products that need to be created, you can save the file and then go into the
Product Import administrative section. Click the Browse button in the Step 4 section of the page. Choose the
modified template and click Import.
If there is at least one valid product to import, you can either import it with a preview or without it. If Import
With Preview is selected, all loaded products are shown. Choosing Import Without Preview imports all the
products without a preview screen first. In addition, if there were invalid records in the spreadsheet, then you
can choose to see only those records by selecting Import With Preview of Invalid Records Only.
Note
The Status column shows only a partial error message. To get a full error report, you need to click on the
error message itself.
Whichever selection was made, new products are saved to the system by clicking Save. The exception is the
Import Without Preview selection, which saves all valid products immediately. Any new Product Types,
Categories, and Attributes are created in the system automatically as well. In addition to uploading new
products into the system, the Product Import administrative section allows exporting all existing products in
the system to a spreadsheet similar to template that can be downloaded. Exporting all products can be useful
because it allows you to see all the products in a list where he can modify pricing, descriptions, catalog codes,
or any other field in a single file.
Exporting products is possible by clicking the Create Template by Exporting Products from Selected Categories
or Create Template by Exporting All Products buttons in the Export Products section on the page. Exporting
Products from Selected Categories allows you to export those products in selected categories, while Exporting
All Products exports all products in the system. The system gathers all the products and enters them into a
spreadsheet in the same format of the template. A link is then provided where it is possible to download the file.
With this file, you can modify the existing products or add new ones to the end of the list. When finished, upload
the file the same way as described above. The same screens appear where you can preview or import without a
preview.
Restrictions
● Attributes aren’t processed for existing configurable products (if you are updating configurable products).
● Maximum number of products that can be imported is 2500 at a time.
You can create multiple copies of the existing product using an XLS file. Previously, you could copy products
only one by one. Now, you can create multiple copies of the existing product through XLS product import
(simple and configurable products can be copied using XLS files).
You need to specify which product is copied by specifying product system_id in column Copy.
Now, product is copied with all fields, attributes, rules, and settings.
Attribute value details in copied product aren't affected (Value part numbers, referent products, attribute
type…). If attribute is specified in XLS file, list of values only affects visibility of values, meaning only specified
attributes change visibility of attribute values according to entered list, keep all attribute/Value details as in
copied product.
If you delete all columns in xls file (except copy, name, description, and required fields for example), values for
certain product will be replaced with values of product whose id is in copy field.
If you delete all columns in the XLS file (except Copy, Name, Description and required fields, for example),
values for certain product will be replaced with values of product whose id is in copy field.
The Products 2.0 administrative section is accessed in Setup Product Catalog Products 2.0 .
Products can be filtered by specific and advanced criteria. To quickly filter products, enter one of the following
search queries in the search box:
● Name
● Part number
Additionally, when using the Advanced Search, products can be filtered by:
● Name
● Part number
● Product type
● Category
● Display type
● Permissions
● Modified date
● Active status
● System Id (by default, the System Id column isn't visible in the grid, so you need to add it by clicking )
Values in all columns can be sorted in ascending or descending order by clicking the column headings.
Clicking opens a popup window, in which you can select columns to be displayed on the Products 2.0
page. Alternatively, clicking the check mark in the upper-right corner of the Display Settings popup window
selects all columns.
The additional columns are displayed in the grid only the first time they’re added.
Editing a product is done by clicking the Edit button next to the corresponding product name. In addition,
copying or deleting a product as well as adding a product alias, or creating a product version is done by clicking
the icon with three dots and selecting the appropriate action.
There can be only one active product version. The active product version can't be deleted. In order to delete the
active version, you first need to deactivate it by disabling the Active toggle switch.
When adding or editing a product, all information is organized into the following five tabs: Definition, Attributes,
Rules and Messages, Scripts, and Layout.
Note
In Setup Product Catalog Products 2.0 , products obtained via synchronization with SAP ERP and
Variant Configuration and Pricing have the value Yes in the column Synced from Back Office. The column
Synced from Back Office is visible only when SAP CPQ is integrated with a back-office application, such as
ERP.
The Unit of Measure field enables you to quantify and track products. You can only enter a three-character ISO
code in the field, for example, EA(each), PCE(piece), PK(pack).
Setting product visibility permissions is done by moving permission groups from Available Permission Groups
to Selected Permission Groups. To do so, you can:
● Type a search query into the Available Permissions Groups search box.
Permission groups matching the entered search query display as you type.
● Expand the permission group (for example, User Types) and select a specific group from the list that
displays (for example, Sales). Alternatively, to expand all available permission groups, click Expand All.
● Add all available permission groups by clicking Add all.
● Add all groups belonging to the main permission group.
To do so, hover over the name of the main permission group and click either Add all or the rightward-
pointing arrow.
The selected permission groups are listed in Selected Permission Groups.
Tip
Clicking Save & Go Back saves your changes and takes you back to the Products 2.0 administration page.
Attributes can be filtered by specific and advanced criteria. To quickly filter attributes, enter an attribute name
in the search box.
Additionally, when using the Advanced Search, attributes can be filtered by:
● Name
● Whether or not they’re a line item
● Display type
● Number of values
● Tab in the Configurator where the attribute is placed
You can select the columns that are displayed under the Attributes tab as well as the columns in the Attribute
Values section when editing an attribute by clicking the Display Settings button.
In addition, to mark an attribute as required, select the checkbox in the Is Required column in the grid.
Formula rules, attribute triggers, simple rules, and product messages are displayed under the Rules and
Messages tab.
Formula rules can be filtered by specific and advanced criteria. To quickly filter formula rules, enter one of the
following search queries in the search box:
● Name
● Condition
● Action
● Description
Additionally, when using the Advanced Search, formula rules can be filtered by:
● Name
● Condition
● Action
● Rank
● Description
● Active status
● Modified date
● The name of the user that modified them
To quickly filter attribute triggers, enter one of the following search queries in the search box:
● Attribute name
● Description
Additionally, when using the Advanced Search, attribute triggers can be filtered by:
● Attribute name
Additionally, when using the Advanced Search, simple rules can be filtered by:
● Name
● Condition
● Action
● Rank
● Description
● Modified date
● The name of the user that modified them
To quickly filter product messages, enter one of the following search queries in the search box:
● Name
● Condition
● Message
● Description
Additionally, when using the Advanced Search, product messages can be filtered by:
● Name
● Condition
● Condition
● Rank
● Description
● Active status
● Active status
● Whether the Show in Responder toggle switch is enabled or disabled
● Whether the Make Product Incomplete toggle switch is enabled or disabled
To define the order of execution for formula rules, simple rules and product messages click Ranking, drag and
drop the rule to set its rank, and click Save.
The Scripts tab enables you to define scripts in product and specify events that trigger the execution of those
scripts.
Scripts can be filtered by specific and advanced criteria. To quickly filter scripts, enter one of the following
search queries in the search box:
● Name
● Code
● Description
● Name
● Code
● Description
● Type (global or local)
● Modified date
● Active status
You can change the position of attributes in the Configurator and the Responder in this tab.
To change the position of attributes, drag and drop them as you see fit.
In Configuration layout, attributes can also be dragged and dropped to another tab.
Additionally, you can create global tabs inline with a single click and define tab visibility directly in the
Configuration layout.
Sequences can be defined as numeric or alpha sequences. They’re referenced using tags, which are discussed
later in the topic. Sequences can be administrated by clicking on Sequences link under the Products admin
menu. Here you can easily copy, delete, or edit existing sequences.
User can add a new Sequence by clicking the Add New button. It brings up a blank Sequence Definition page.
Editing a Sequence brings up the same screen.
● Seqname - Name given to the Sequence. This name is used when referring to the sequence in an
expression for part numbers or other definition area.
● Description – Describe a sequence using additional details such as intended use, and so on.
● Globalseq – Specifies whether or not the sequence is shared globally among all products (Y) or
independently for different products (N).
● Startno – The first element in the Sequence. The value is set to 0 for if a string list is used.
● Endno – The last element in a sequence. This value can also be set to 0 if a string list is used.
● Stepval – Specifies what the Sequence is incremented by. Any value can be used.
● Order – Specifies whether the Sequence is set up as an Ascending Sequence or a Descending Sequence.
● Alpha – Specifies if the Sequence elements are interpreted as Alpha (Y) or Numeric (N).
● Stringlist – If the sequence consists of an arbitrary sequence such as an array of strings, enter the values
here. Each value needs to be separated by commas (for example: Alpha, Bravo, Charlie, Delta,
Echo, and so on).
● Presentation – Controls how the Sequence is displayed.
● ○ STR* - Displays the value by itself with no leading 0s
○ STR2 – STR8 – Specifies that the value is preceded by 0s and the number of 0s that precede. The
choices count the number of digits in the number, not the number of 0s preceding (for example, for
STR* the number would be 8, for STR3 it would be 008 Seqtype – Specifies the type of Sequence.
NUMERIC only allows a Sequence of numbers while STRINGLIST allows any characters.
○ CHAR – Used when creating a Sequence of the Alphabet.
A to Z Sequence
One method of creating an A to Z Sequence would be to type A, B, C, …, Z into the Stringlist field. An easier
way is to use the CHAR function in the Presentation dropdown box to generate an A to Z Sequence. To create an
A to Z Sequence, enter 1 for Startno, 26 for Endno and 1 for Stepval. Make sure the Order is Ascending, Alpha is
set to Y, and Presentation is set to CHAR. CHAR converts the Sequence value into an Alphabetic character. If
Lowercase is desired, use 33 for the StartNo and 58 for the Endno.
Sequences are used with part numbers to uniquely identify a configuration. There are two options for a
Sequence being attached to a product number: the Sequence can be assigned in the Configurator when the
There are two ways (in the standard functionality) to make this happen. There are a few settings under
Application Parameters (under General administrative menu) that relate to sequences and how they behave.
One setting is called Delay Sequence Generation. If it’s set to TRUE, a sequence can be assigned when the
product is being configured. Once a product has been flagged as complete, a button labeled Get Cat Code
shows up in the Responder. Clicking this button generates the sequence value in the Configurator. If Delay
Sequence Generation is set to FALSE, the Sequence Value is generated when the product gets added to the
quote. Another setting on the Application Parameters page is Do Not Recycle Sequences. It specifies whether
the system goes through the sequence again once the Endno has been reached. Setting it to TRUE notifies the
system not to go through the sequence again.
Another setting that is related to sequences on the Application Parameters page is Unique Product Codes.
Setting it to TRUE tells the system to make every product code unique and helps to ensure that duplicate
Product Codes aren't used in the system.
In order to include a sequence in the part number or other definition area, you can use one of these tags:
PSEQ (syntax: <*PSEQ(sequence name)*>) is a product sequence, which allows several products to use the
same sequence independently of each other. In other words, under this scenario, two products can use the
same sequence in their part numbers.
For example, product ABC part numbers can be: ABC0001, ABC0002, ABC0003… Product XYZ part numbers
can be: XYZ0001, XYZ0002, XYZ0003, and so on. Both products have the same sequences (0001, 0002,
0003…).
GSEQ (syntax: <*GSEQ(sequence name)*>) is a global sequence, which allows several products to share the
same sequence. In other words, under this scenario, two products increment the same sequence and therefore
a sequence number is only used once.
For example, product ABC part numbers can be: ABC0001, ABC0002, ABC0004… Product XYZ part numbers
can be: XYZ0003, XYZ0005, XYZ0006…
Here Product ABC uses the sequence numbers 0001 and 0002. Product XYZ uses the sequence number
0003. Since 0003 had already been used, the next sequence number available for Product ABC was 0004.
Note
In order for GSEQ to work correctly, all products that are incrementing the Sequence need to have GSEQ
used in their expressions.
SSEQ (syntax: <*SSEQ(sequence name1, sequence name 2, …, sequence name n)*>) allows
sequences to be nested. For example, two sequences go from 1 to 3, and they are named sequence One and
Two. The expression <*SSEQ (one, two)*> would result in 11, 12, 13, 21, 22, 23, 31, 32, 33.
Similarly, if a portion of a part number is defined as <*SSEQ(Ten, ABC)*> then the results would be 1A, 1B,
1C, 2A, 2B, …10C.
There are no limits as to how many sequences can be used in defining a part number. For example, a part
number can be defined as <*Value(Number of Poles)*><PSEQ(some seqname)*><*Value(another
attribute)*><PSEQ(another seqname)*><*GSEQ(third sequence)*><*SSEQ(seq four, seq
five)*>. Sequences can also be included in the part number only if certain conditions are met. This is
accomplished by using an IF statement: [If](condition) {expression if true}{expression if
false – note this is optional} [ENDIF]. The condition uses the following syntax ([operator]
(variable1, variable 2)).
For example, if there’s an attribute called Number of Poles and it needs to use numbers from 2000 to 2999
from a sequence named 2000-2999 when the number of poles is 2, but use numbers from 3000 to 4999, from
a sequence named 3000-4999, when the number of poles is greater than 3, the expression entered into the
Product Catalog Code generator would be as follows:
The following topics guide the administrator through the Users section of the Setup.
A guest user in SAP CPQ is a user with limited access rights. For example, guest users may need to log in only
to browse products in the catalog with or without making the final purchase.
Administrator Side
To enable the guest user feature and allow browsing through products, administrators must first make
adjustments in the Setup.
● Create a user account that will be used for guest users and set the privileges for the categories and
products that should be visible to guest users. Make sure that the user is active, otherwise logging is
disabled.
● Create a company and a permission group for the guest user.
● Set up the workflow actions and permissions. Since a guest user has limited access to SAP CPQ features,
only some actions should be enabled (CheckOut, Add Item, Reprice, Save Quote and Copy).
All settings for guest users can be managed in Users Guest User and Default User Settings Guest User
Settings . The Guest User Settings tab contains the basic settings for guest users.
1. In Single Sign-On key and Single Sign-On vector, enter values to encrypt and decrypt a username.
You need to provide unique values.
Guest users can log into SAP CPQ in the following ways:
● login page - administrators should provide the username/password/domain. After logging, users land to
the catalog.
● direct link - the format of the link should be app_name/mt/domain_name (for example,
v60.webcomcpq.com/mt/Your_Domain). The login screen is skipped and users land to the catalog.
Users logged as guest users can browse the catalog and create quotes (if Guest user cannot add to quote is
disabled).
Before creating a new user account that will be used for guest users, there are some preparations to be done.
First, in administration under Users it’s necessary to click the Companies option to create a new company
(such as “GuestUserCompany”). After that, user has to click the User Groups option – leave the Start Page
option empty and don’t change Visual Styles (except for Shopping Cart/Quote if necessary, since all other
changes won’t be visible). After the user group has been created, it’s necessary to set up the privileges for
categories (and products) that are wanted to be visible for guest users (for more information see Product
Administration [page 25]).
Guest users should have at least Checkout and Add Item actions available, which is why Workflow Actions must
also be set. Next step is to open the Work-flow/Approval menu and click on the Workflow Permissions option.
User will choose the by User Types Premission type of listing and select the guest user’s group he’s created by
clicking . This brings up the Workflow Permissions Edit screen.
In addition to the Checkout and Add Items actions, user can also add Calculate and Save Quote actions. All
other actions aren’t available for guest users and selecting them here won’t make any difference.
Now, Guest User account can be created. Click on the Users option under the Users menu and choose Add
New. Make sure that the newly created company and user group had been selected for Companies and User
Group, respectively.
After a guest user account has been successfully created, user can go to the Guest User and Default User
Settings option and select a Guest user.
Note
Inactive users won’t be able to log in, so try not to get into situations where your SAP CPQ is set up to use
inactive user as a guest account.
User Registration allows users to create an account in case an administrator hasn’t previously created one for
them.
Administrator Side
To allow users to register from the login page, administrators must first set the parameter Allow User
Registration to TRUE. The parameter is in Users Guest User and Default User Settings Default User
Settings for Self-Registered Users . If the parameter is set to FALSE, users cannot register in the User
Registration page and they are prompted to contact their administrator.
1. In Custom Message, enter a message that appears on the User Registration page.
You can use HTML tags.
2. In Default User Type, select a user type that is assigned to all self-registered users (see User Types [page
160]).
3. In Default Password Expiration Period in Days for Self-Registered Users, define the number of days before a
password expires.
To prevent users from self-registering to SAP CPQ, enter -1 in this field.
4. In Default Ordering Parent and Default Managing Parent, select the users that will be assigned as the
ordering and managing parents [page 354], respectively, to self-registered users.
The field offers autocomplete suggestions as you type in characters.
5. In the Optional Fields list, select the fields that the user can optionally fill out during registration on the User
Registration page. The unselected fields are mandatory. Additionally, all fields that users must fill out are
listed in the dedicated list. All user custom fields [page 158] display in the registration page and they are
listed in this page as well.
6. Click Save.
The settings for the User Registration page are now set up.
When you create users, they receive an email notification, which you can customize, containing their account
information, such as username, password, first name, and so on.
The information displayed represents user field values that are accessed in Dictionaries [page 595]. For each
value, there’s a corresponding tag that pulls the value from the dictionary when a new user is created. By using
value-tag pairs, you can customize the email notification that the newly created users and self-registered users
receive.
To customize the email notification that the newly registered users receive:
The following table displays supported user field tags and the corresponding values the tags pull when new
users are created.
Values Tags
Username {{Username}}
Password {{Password}}
Email {{Email}}
Address1 {{Address1}}
Address2 {{Address2}}
URL {{URL}}
Domain {{Domain}}
City {{City}}
Province {{Province}}
Country {{Country}}
State {{State}}
Phone {{Phone}}
Fax {{Fax}}
Title {{Title}}
Territory {{Territory}}
ID code {{IDCode}}
Brand {{Brand}}
Customizing the email notification for self-registered users is done in the same way as for the newly created
users, the only difference being the key used - UserRegistration.NotificationUser.Body. The following table
displays supported user field tags and the corresponding values the tags pull when users self-register an
account.
Values Tags
Username {{Username}}
Password {{Password}}
Email {{Email}}
Address {{Address}}
Address1 {{Address1}}
Address2 {{Address2}}
URL {{URL}}
Domain {{Domain}}
City {{City}}
Province {{Province}}
Country {{Country}}
State {{State}}
Phone {{Phone}}
ID code {{IDCode}}
In addition, values and tags that are supported for self-registered users, Password being the exception, can also
be applied to the email notification administrators receive when users self-register. In this case, the
UserRegistration.NotificationAdmin.Body key is used.
Related Information
3.3 Users
The Users administration page enables you to manage the existing users in the system and add new ones.
To view a list of all users in the system or add new users, go to Setup Users Users . A list of all existing
users displays, and their total number is visible in the top-right corner of the page.
Users can be filtered by specific and advanced criteria. To quickly filter users, enter one of the following search
queries in the search box:
● username
● first name
● last name
● user type
● email address
Additionally, when using the Advanced Search, users can be filtered by:
● username
● first name
● last name
● user type
● email
● company
● address
● ZIP code
● managing parent
● ordering parent
● approval parent
● territory
Values in all columns can be sorted in ascending/descending order by clicking the column headings. Clicking
opens a pop-up where you can select the columns displayed on the Users page. Alternatively, clicking
the check mark in the upper-right corner of the Display Settings pop-up selects all columns.
Note
The additional columns display in the grid only the first time they’re added.
Editing user’s information is done by clicking the Edit button next to the corresponding username. In addition,
copying or deleting a user is done by clicking and selecting the appropriate action.
To create new user, go to Setup Users Add New User . All the information needed to create a user is
organized into the following four tabs: General, Address, Date and Number Settings, Additional Settings, and
Custom Fields. The Custom Fields tab contains all user custom fields [page 158].
General Tab
On the General tab, you define general information for the new user.
Note
You can't create, import or change passwords of other regular users and SSO users during user
creation either via user import/export, user management in the Setup, or API.
Address
On the Address tab, you define the contact information for the new user. The following table explains each field
displayed under the Address tab.
Field Description
Tip
Clicking Save & Go Back saves your changes and takes you back to the Users administration page.
On the Date and Number Settings tab, you define how the user views dates and numbers in SAP CPQ. The
following table explains each field displayed under the Date and Number Settings tab.
Field Description
Allow User to Change Time Zone When the toggle switch is enabled, the user is allowed to
change the time zone.
Tip
Clicking Save & Go Back saves your changes and takes you back to the Users administration page.
Additional Settings
On the Additional Settings tab, you define additional information for the new user. Depending on the type, the
settings are grouped into Market and Hierarchy sections.
Note
The following table explains each field displayed under the Additional Settings tab.
Field Description
Show Quotes Within (up to the current date) Specifies which quotes are visible to the user.
Default Market The default market retrieved for all new quotes.
Default Pricebook The default pricebook retrieved for all new quotes.
Default Dictionary A dictionary with default SAP CPQ UI text (button labels,
tooltips, warning messages, and so on).
Approval Parent Receives quotes submitted for approval. Whether or not the
user’s approval parent receives a quote depends on how the
rules are set up on the Approval Rules page.
Managing parent Can edit or delete child users. The managing parent can
also reassign quotes between child users.
Ordering Parent Receives all orders placed by child users for confirmation.
Tip
Clicking Save & Go Back saves your changes and takes you back to the Users administration page.
By default, regular users (who aren’t using the Federated Single Sign-On to log into SAP CPQ) receive two
emails. One of these emails contains a username and a domain, while the other one contains an URL, which the
email recipient needs to use in order to create a password. You can prevent SAP CPQ from sending emails after
registration is complete if the Do not email login details to users created by admin parameter is set to TRUE.
SSO users don’t receive any emails after they are created, regardless of the selected value of Do not email login
details to users created by admin as they are managed by another system, the client’s internal IdP. They can
only use Federated Single Sign-On method to log in. .
Note
Companies who have SSO users to whom they wish to send email notifications [page 342] attached to
actions (for example, notifications for quote approval or quote rejection) need to update the SAP CPQ URL
which will be sent as a part of the emails. For example, if the URL was http://
tenantID.webcomcpq.com/Login.aspx, it should now consist of the user's IdP like this: https://
tenantID.webcomcpq.com/fed/domainName/Login.aspx?quote=CFCECFCACFCFC7CA.
Related Information
This functionality allows importing and exporting multiple users into or from SAP CPQ.
The following properties of the Bulk User Import/Export make it a more efficient solution than the standard
User Import:
● Optimized importing (you initiate export/import and leave the action running in the back while managing
other SAP CPQ features).
● Email notifications when the process is finished.
● User-oriented interface.
You can manage User Bulk Import/Export in the User section in Setup Import/Export Bulk Import/
Export . The page is divided into three sections:
There are different workflows you can follow in SAP CPQ to manage Bulk User Import. When you access
Setup Import/Export Bulk Import/Export Users , you can:
This workflow allows you to export a predefined template, fill it out with user details and reimport it into SAP
CPQ.
Context
Importing users through templates is recommended when you only wish to import new users without altering
the existing ones.
Exported files don’t contain columns Password, Must Change Password and Password Locked, and you can’t
import a file which contains those columns.
Procedure
Find the instructions for filling out the templates in Template Guidelines [page 146].
4. Drag and drop the Microsoft Excel template in the Import Users section or browse for it.
The import is automatically recorded in the list of jobs. The status of the import shows Queued until
Finished (Download). A progress bar visually shows the progress.
5. (Optional) Select the Email me when done checkbox.
A notification is emailed to you when the import is finished. Once the Status column indicates Finished
(Download), the import is completed. To check the success of the import, click Finished (Download) and
open the file on your computer.
6. Check the Status column in the Users sheet.
If a row is highlighted in red, update it according to the status message and reimport the template.
Otherwise, if no rows are highlighted, the users are imported successfully. If you cancel an import before
the processing is completed, the file is still available for download.
This topic contains the instructions for filling out the templates for user bulk import.
● Users - the import sheet with columns that match fields in SAP CPQ.
● IMPORTANT INFO - restrictions and requirements for each field.
● Timezones - timezone IDs and descriptions.
The Users sheet is a container for information related to users that are to be imported. Each user is placed in a
separate row. The system uses IDs to match the records in the template to existing users in SAP CPQ. When
importing new users, the column ID should not be populated. However, when updating the existing users, you
should not change the ID in the exported file. If you delete or modify the ID of an existing user during editing,
the user may be duplicated in SAP CPQ.
The order of columns and column names must stay unchanged, otherwise the import will not be
successful.
The Password, Must Change Password and Password Locked columns don’t exist in exported templates and the
import of those columns isn’t allowed. The exported templates contain the IsSSOUser column, the value of
which should be set to TRUE if a user is going to log in using the Federated Single Sign-On. The default value of
IsSSOUser cells is FALSE, and SAP CPQ sets them to FALSE if they are imported without any values.
A populated template that has already been imported into SAP CPQ contains the Status column indicating if a
user is successfully imported. In case of an error, a message explains what caused it. Additionally, users that
have not been imported are highlighted in red in the template. Unlike in the standard import where you supply
the ID for the managing, ordering and approval parents, in Bulk Import you supply their usernames. Also, in
Bulk User Import you can define the default market, default dictionary, date format, number format and the
expiration date for the underlying users.
Related Information
SAP CPQ allows you to export a Microsoft Excel file with all users in the system, update their data and reimport
it into SAP CPQ.
Context
Although you may add new users to the list, this workflow is recommended when updating the details of users
that are already in the system.
Procedure
The job is recorded in the list and its status changes accordingly (Queued > In Progress > Finished
(Download)).
2. Click Finished (Download) in the Status column.
3. Open the Microsoft Excel template on your computer.
Column order and column names must stay unchanged, or else the import won’t be successful. Also, make
sure not to change the user IDs as it may lead to duplication in the system.
5. Drag and drop the Microsoft Excel template in the Import Users section or browse for it on your computer.
6. (Optional) Select the Email me when done checkbox to receive an email when the import is finished.
Related Information
The filtering option in the Bulk Import/Export allows you to export only the users that match your search
criteria.
Context
Procedure
A pop-up message informs you that the export has started and a job entry displays in the list.
6. Click Finished (Download) in the Status column to download the export file.
The system has filtered the users per your search criteria.
3.5 Companies
Once companies are set up, you can assign individual users to a particular company. To view a list of all
companies in the system or add new companies, go to Setup Users Companies . A list of all existing
companies displays, and their total number is visible in the top-right corner of the page.
Companies can be filtered by specific and advanced criteria. To quickly filter companies, enter one of the
following search queries in the search box:
● name
● company code
● address(1)
● city
● state
● country
Additionally, when using the Advanced Search, companies can be filtered by:
● name
● company code
● address
● city
● state
● country
Values in all columns can be sorted in ascending/descending order by clicking the column headings. Values in
all columns can be sorted in ascending/descending order by clicking the column headings.
Clicking opens a pop-up where you can select the columns that are displayed on the Companies page.
Alternatively, clicking the check mark in the upper-right corner of the Display Settings pop-up selects all
columns.
Note
The additional columns display in the grid only the first time they’re added.
Editing company information is done by clicking the Edit button next to the corresponding company name. In
addition, copying or deleting a company is done by clicking and selecting the appropriate action.
All the information needed to create a company is organized into the following two tabs: General and
Permissions.
General
On the General tab, you define general information for the new company.
Note
Permissions
On the Permissions tab, you define permission groups that can administer the company. To move permission
groups from Available Permission Groups to Selected Permission Groups, you can:
Additionally, each of the selected permission groups can be removed from the list. Alternatively, to remove all
selected permission groups, click Clear All. Once permission groups are selected, click Save.
Alternatively, if you want to save your changes and go back to the Companies page, click Save and Go back.
Alternatively, if you want to save your changes and go back to the Companies page, click Save and Go back.
Related Information
In organizations that support multiple companies within a single SAP CPQ environment, administrators can
easily export/import multiple companies at once
In the Companies Export/Import page you can export/import companies following one of these workflows:
Import Template
The sample template lets you easily upload multiple new companies in SAP CPQ. To download the import
template, click Download Template in the Companies Export/Import page. The Excel file contains two sheets:
● Companies - enter details of the companies that you wish to import in this sheet.
● Important info - displays which fields are required and what are the restrictions for some fields. Required
fields are Company Name, Country, Company code and System Id. Do not edit this sheet.
This procedure describes how to export all companies in the system, change their details, add new companies,
and import the updates in SAP CPQ.
Context
The best practice for importing new companies in the system is to do it through the import template. To update
existing company details, you need to export them from the system, change the data and then import them
again.
Procedure
1. Click Export.
Note
Company Name, Country, State, Company code, and System Id are required fields. Don’t populate the
MEMBER_ID column as these values are automatically generated by the system. Additionally, you
shouldn’t change the member id of the existing companies.
3. In Import, click .
4. Select the file for import.
5. Click Apply Template.
Invalid records are marked in red and errors are described in the Error Message column.
Related Information
If you have been granted access to another user’s account, you can log into SAP CPQ on their behalf to
troubleshoot and resolve the issues they encountered.
Note
The visibility of the Login as Proxy User page in default SAP CPQ tenants is now assigned via the Access
Rights feature. It can’t be accessed in other tenants regardless of the assigned access rights.
You can log in as a proxy user forboth regular and SSO users [page 140].
If you’re an administrator and a user granted you access to their account, take the following steps to log in on
their behalf.
If you’re a support representative and a user granted you access to their account, take the following steps to
log in on their behalf.
Note
3. From the Tenant dropdown list, select the tenant the user is logged into.
You can either type the tenant name in the search field or browse the list of tenants.
A table displays, containing the username, name, and user type of the user who granted you access to their
account.
Note
If the user granted you access and you’ve followed the previously mentioned steps but still have
problems logging in, contact the SAP CPQ Engineering team.
Related Information
The Permission Groups section in Setup Users allows administrators to add new and modify existing
permission groups.
Users should be included in a permission group to share access rights over SAP CPQ objects (Pricebooks,
Tables on Quotes, etc.). As a result, administrators can assign access rights to multiple users in one click.
Permission groups can be filtered by specific and advanced criteria. To quickly filter permission groups, enter
one of the following search queries in the search box:
Additionally, when using the Advanced Search, permission groups can be filtered by:
To add users to a group, administrators can perform simple and/or advanced search or browse for specific
users. To do a simple search, you select User Types, Companies, Markets, and Brands. The logic AND is applied
between each of the groups. However, if multiple values are selected within a group, the logic OR is applied.
Example
To enable the same permission rights to all Sales Administrators who work in SAP Sales Cloud, you should
combine simple and advanced search. Selecting Sales and Sales Management user types and SAP Sales Cloud
company filters a group of Users that match both criteria. After an advanced formula such as
CTX(Visitor.IsAdmin ) is applied, the group is additionally filtered to Administrators. Due to AND logic between
the simple and advanced search, the Permission Group contains Sales Administrators from SAP Sales Cloud.
Advanced Mode
The Advanced Mode allows you to filter Users per custom fields and also per fields that aren’t included in the
simple search. To perform a search, you create a formula using SAP CPQ tags. Note that formulas should
primarily be used to inspect the field values for the logged User. Retrieving values from the Quote and
Configurator-related fields won’t return valid results.
Once a Permission Group formula is created, the system re-evaluates it on the following occasions to include/
exclude Users:
If you create a formula inspecting a Quote field, the system doesn't re-evaluate it every time a change is made
on the respective Quote but only when the Quote is loaded. The re-evaluation of formulas isn’t triggered by the
changes on Quotes and consequently, the formula filters the same Users as before the change was made.
Reloading the Quote re-evaluates the formula and corresponding Users are included in the Permission Group.
To create a Permission Group, you can either apply simple and advanced filter criteria or browse for exact
Users you wish to include in the group.
Procedure
Note
If you know the names of Users you wish to include, you should skip the simple and advanced search
and enter their name in the Users search field. Multiple selections is allowed and the list of Users is
displayed below the search field.
For more details on defining permission groups, click See how to combine fields into permission group,
placed above Available Permission Groups.
Related Information
The SAP CPQ catalog can be searched via the quick search or the advanced search.
Quick Search
Catalog Quick Search works with an autocomplete option. Users conduct the search by entering a key word(s)
for the name/description of the product they are looking for. Quick Search will look for the product’s name/
description in the user selected language. If it doesn’t find the translation, Quick Search will then look for the
product name/description in the user default dictionary. The Quick Search result will always contain an entire
text body of the product name/description that users enter. In other words, if you search for a product with the
word “window” in it, and you enter the word “indow,” your Quick Search result will comprise all products
containing the word “indow” in them.
We have defined several parameters to improve search performance in Catalog Quick Search with an
autocomplete option. For now, if a number of products in the system exceeds 100,000 for search by Part
Number and Product Name, and 10,000 for search by Description, Word or Phrase, the words entered in the
Search box must equal the starting sequence of the text searched. Hidden parameters may be modified by
SAP CPQ administrators in the capacity that will not affect search performance.
These parameters are not used when using options Show more results and Advanced Search.
Advanced Search
Advanced search works a bit differently. When the user enters the search box field, Advanced Search will divide
the text into word segments (the search will follow the same search logic of the user selected language; if it
doesn’t find the translation, Advanced Search will then look for the product name/description in the user
default dictionary). The role of the functionality’s application parameter, “When users enter several words in
search box, SAP CPQ will find products based on each entered word (instead of searching based on entire
phrase)” is to define if the result of the product name or description must contain all individual words in the text
entered, (though not necessarily in the same order) within their textual values; or if it can contain at least one
word from the text entered.
Note
The explanation provided in this document refers only to using the search by entering the product name/
description field.
User custom fields allow you to add additional fields for users.
To view a list of all user custom fields in the system and/or add new custom fields, go to Setup Users
User Custom Fields . A list of all existing user custom fields displays, and their total number is visible in the
top-right corner of the page.
User custom fields can be filtered by specific and advanced criteria. To quickly filter user custom fields, enter
one of the following search queries in the search box:
● name
● label
Additionally, when using the Advanced Search, user custom fields can be filtered by:
● name
● label
● rank
● type
Values in all columns can be sorted in ascending/descending order by clicking the column headings.
Clicking opens a pop-up where you can select the columns displayed on the User Custom Fields page.
Alternatively, clicking the check mark in the upper-right corner of the Display Settings pop-up selects all
columns.
Note
The additional columns display in the grid only the first time they’re added.
Editing a user custom field is done by clicking the Edit button next to the corresponding field name. In addition,
copying or deleting a user custom field is done by clicking and selecting the appropriate action.
To create a new user custom field, go to Setup Users User Custom Fields Add New User Custom
Field . All the information needed to create a user custom field is organized into the following two tabs:
General and Permissions.
Note
General
On the General tab, you define general information for the new user custom field.
Permissions
On the Permissions tab, you define user custom field permissions. The tab displays:
● Same permission for all Permission Groups - the switch is enabled by default, allowing all users in the
system the same type of access to the user custom field.
● Field permission dropdown list - here you select the type of access for the users.
○ Editable - the user custom field can be edited.
○ Read-Only - the user custom field can’t be edited.
○ Required - the user custom field must be defined.
○ Hidden - the user custom field isn’t displayed to everyone.
To grant the same access to users, leave the toggle switch enabled and select the type of access from the
dropdown list.
When the toggle switch is disabled, you define permission groups for each of the four field permissions by
moving permission groups from Available Permission Groups to Selected Permission Groups. If a user custom
field is hidden for all permission groups, it can’t be seen or changed on User Page > Modify Personal Details, but
the local administrator can still manage that field for the users.
For example, products, reports and workflow actions can have permissions set according to user types. To view
a list of all user types in the system and/or add new user types, go to Setup Users User Types . A list of
all existing user types displays, and their total number is visible in the top right corner of the page. User types
can be filtered by specific and advanced criteria. User types can be quickly filtered by group name. Additionally,
when using the Advanced Search, user types can be filtered by:
● group name
● group description
● XSLT file
● start category
● whether or not a user is able to create a quote from an incomplete configuration.
Values in all columns can be sorted in ascending/descending order by clicking the column headings. Clicking
opens a pop-up where you can select the columns that will be displayed on the User Types page.
Alternatively, clicking the check mark in the upper-right corner of the Display Settings pop-up selects all
columns.
Note
The additional columns will display in the grid only the first time they are added.
Editing a user type is done by clicking the Edit button next to the corresponding group name. In addition,
copying or deleting a user type is done by clicking and selecting the appropriate action.
You can add a new user type in Setup Users User Types Add New User Type .
Context
Group name is the only required field. However, it’s recommended to fill out other fields too.
Procedure
○ Select Product – a list of configurable and parent/child product items. The system saves the system ID
of the selected product so it can be used in scripting (User.UserType.LandingProductSystemId).
○ Select Page – a predefined list of pages:
○ Home Page (default) – default page on which users land, for example Catalog
○ Quote List – a list of existing quotes.
○ New Quote – an empty quote.
○ New Quote – Customer Tab – the Customer Info tab of an empty quote.
○ Catalog – With empty quote – the Catalog page (the system creates an empty quote in the
background).
○ Catalog – catalog with product items.
○ Approvals – list of quotes in the Waiting for Approval tab.
4. Click Start category to define the category users belonging to the user type land to in SAP CPQ.
5. In the Categories pop-up, select a product category on which users land.
Categories with a downward-facing arrow next to it contain subcategories. Clicking the arrow expands the
category.
Note
For more details on setting up landing page for a user type refer to Setting Up a Landing Page [page
163].
Alternatively, to save your changes and go back to the User Types page, click Save & Go Back.
Note
Selections made in Start page and Start category apply to users logging directly into SAP CPQ and
users landing from external CRM systems (Salesforce, MS Dynamics and NetSuite CRM systems).
Related Information
XSL and XSLT files, which are also referred to as transformations, are used to customize the layout and the
information displayed on the following pages: Shopping cart/Quotes, My Quotes, Checkout, Waiting for
Approval, Place Order, Other Quotes, and Preview.
A different XSL/XSLT file can be assigned to each visual style available in the Legacy UI Design section by
selecting a file from the dropdown list. Alternatively, files specially tailored for company’s needs can be
uploaded by clicking Upload new file. You can download or delete the XSL or XSLT files you selected or
NameName Description
Visual styles (Shopping cart/Quotes) Defines the XSL file that is used to render a quote page.
Visual Style (My Quotes) Refers to the tab displayed on the Existing Quotes page.
Visual Style (Checkout) Defines the XSL file for the screen that displays when a user
is going through the final checkout procedures.
Visual Style (Waiting For Approval) Refers to the tab displayed on the Existing Quotes page.
Visual Style (Place Order) Defines the XSL file for the screen that displays just before
checkout and shows a summary of the order.
Visual Style (Other Quotes) Refers to the tab displayed on the Existing Quotes page.
Visual Style (Preview) Defines the XSL file for the page used to display a quote
preview (Preview action).
Related Information
To define where users land after they exit Setup, log into SAP CPQ and land from CRM, these settings need to
be managed.
To determine the landing page for a user, the system first evaluates the start page. If the start page isn’t
defined, users land into Catalog, regardless of the value of other parameters. If the start page is Catalog - With
empty quote and New Quote, the system also evaluates the value of When creating a new quote, require
customer to be selected first, Default (Pre-populate) with User Info, and Default(Pre-populate) with User's
Company Info. If the selected start page isn’t in the quote context, the parameters aren’t treated and users land
to the selected start page.
If When creating a new quote, require customer to be selected first is enabled and the parameters for
prepopulating user and company info are on, users land into the Catalog and an empty quote is created in
the background.
Related Information
After users click New Project/Quotation, the system evaluates three parameters for redirecting users to a
specific page.
If When creating a new quote, require customer to be selected first is on and the two options for prepopulating
data on the Customer Role Defaults page are selected, users land into Catalog with an empty quote in the
background since the Customer Info tab has been prepopulated. If When creating a new quote, require
customer to be selected first is disabled and Create Empty Quote First is TRUE, users land on the Quotation tab
of an empty quote.
Note
Whenever When creating a new quote, require customer to be selected first is enabled, regardless of other
settings, a new quote is created in the system. The only scenario in which a new quote isn't created is if
both When creating a new quote, require customer to be selected first and Create Empty Quote First are
disabled.
Related Information
This section contains description of all features that are related to creating and managing quotes in SAP CPQ.
Document Generation allows users to transfer quote details to documents that can be printed, downloaded,
and emailed.
This feature allows administrators to create document templates with tags that retrieve specific quote details.
Users, on their side, can generate documents based on those templates. The format and style of the resulting
For data to be displayed in generated documents, you need to enter dedicated tags in the template. Each tag
can retrieve any specific quote details, configuration, customer, or user-related information that is meant to be
displayed in the output document. The list of all tags and a detailed explanation with examples is in the
Document Generation Tags [page 168] section. Alternatively, you can use the standard CTX tags instead of
quote template tags to retrieve data.
Tip
If you need to create templates with basic quote details and you don't have experience with document
generation tags, use the Template Creation Tool.
In addition to tags, you can also insert any object that Microsoft Word supports into a Microsoft Word template,
such as an image or another document file (which can be another document template). Administrators can
configure document templates in Setup Quotes Document Generation Templates . This feature owes its
flexibility to the fact that administrators can define the visibility and format permissions, as well as select
additional fields and documents to be included in the generated document. Additionally, administrators can
enable users to administer templates on the user side.
Generated documents in SAP CPQ are populated via tags (you insert a dedicated tag into a template and when
users generate documents, specific data is retrieved from the system and displayed in the document).
C tags retrieve data for each item in a quote. The system processes C tags only if they are within C2 tags.
Tag Description
<<C_TAG()>> The basic C tag. Add any modeling tag (CTX tag, table tag,
etc.) in the parenthesis.
<<C_ID>> Retrieves the ordinal number of the item in the quote. For
child items with cart IDs 5.1 and 5.2, for example, the tag
retrieves 6 and 7 as items' ID.
<<C_ROLLED_UP_DESIRED>> Sum of net prices for all line items. Applicable only when
added to main items.
<<C_ROLLED_UP_BASE>> Sum of base list prices for all line items. Applicable only
when added to main items.
<<C_ROLLED_UP_LIST>> Sum of extended list prices for all line items. Applicable only
when added to main items.
4.1.1.2 Q Tags
Q tags retrieve quote data (currency, user and owner data, etc.).
The following tables display Q tags that you can add anywhere in the document template to retrieve data from
quotes. Q tags mainly retrieve general quote information (currency, user and owner data, etc.).
General Tags
Tag Description
<<Q_QUOTE(TOTAL)>> Retrieves NRC quote total amount. Use the CTX tags to
retrieve the MRC total amount
<<Q_TAG(<*CTX(Quote.Total.MrcAmount.Display)*>)>>.
<<Q_QUOTE(TOTALNET)>> Retrieves NRC quote total net price. Use the CTX tag to
retrieve the MRC total net price:
<<Q_TAG(<*CTX(Quote.Total.NetPrice.Display)*>)>>.
<<Q_QUOTE(DATE_CREATED)>> Retrieves the date when the quote was created, displayed in
the user's date format. For other formatting, use the CTX
tags:
<<Q_TAG(<*CTX(Quote.DateCreated.Format(dd.MM.yy) )*
>)>> and
<<Q_TAG(<*CTX(Quote.DateCreated.Format(dd,MMMM
yyyy))*>)>>.
<<Q_QUOTE(DATE_MODIFIED)>> Retrieves the date when the quote was last modified,
displayed in the user's date format. For other formatting,
use the CTX tags:
<<Q_TAG(<*CTX(Quote.DateModified.Format(dd.MM.yy)
)*>)>> and
<<Q_TAG(<*CTX(Quote.DateModified.Format(dd,MMMM
yyyy))*>)>>.
Tags
<*CTX(Quote.Cus
tomer(BillTo).Custom
Field(FieldName))*>
Tags Description
Tags Description
Company Tags
Tag Description
Other Tags
In these tags, we'll use an example custom field Company Policy.
Note
Every tag that inserts files supports these formats: DOCX, PDF, and images (BMP, EMF, GIF, ICO, JPG,
JPEG, PCX, PNG, TIF, TIFF, WMF).
This page lists various tags that don't belong to any of the categories.
Note
● HTML [HTML(…)] HTML tag takes the content and interprets is as HTML and inserts it in the document.
For example, [HTML(<<C_DESC>>)] . If <<C_DESC>> returns <a href=“http://
www.webcominc.com”>Webcom, Inc.</a>, the link is inserted in the document. If there's any text before or
after the HTML tag, the HTML content will be inserted in a new paragraph right before it. For example: text
before - [HTML(<<C_DESC>>)] - text after. Will result in: html returned content text before - - text after. To
include static text and have it on same line, just simply put it inside HTML tag. [HTML(text before -
<<C_DESC>> - text after)]
Tag Description
<<ST_USERFILE_IMG()>> Retrieves both documents and images. The name of the file
with the extension must be stated in the parenthesis.
<<ST_GROUP_LABEL()>> Returns the label of the cart items group with the id you
provided. (for example, << ST_GROUP_LABEL (A)>>).
<<ST_PTYPE_NETPRICE()>> Calculates the Netprice for the product type provided by tag
(for example, <<ST_PTYPE_NETPRICE(Accessories)>>)
Tags Description
Example
Assuming that SAP CPQ administrator has already defined a custom table named
additional_options_custom_table with two columns: additional_description and options, you can create a
template section to display data from the custom table as follows:
<<C2>>
<<MAIN>>
<<CUSTOM_TABLE(additional_options_custom_table)>>
<<CUSTOM_TABLE_HEADER>>
Additional description —- Options
<<CUSTOM_TABLE_HEADER_END>>
<<CUSTOM_TABLE_ROW>>
<<CUSTOM_TABLE_COLUMN(additional_description)>> ----
<<CUSTOM_TABLE_COLUMN(options)>>
<<CUSTOM_TABLE_ROW_END>>
<<CUSTOM_TABLE_END>>
<<MAIN_END>>
<<C_END>>
To display parent/child product structure in generated documents, you should add MAIN tags for children
products inside parent MAIN tags.
The first main item in the tag structure can be any root item from the quote, which satisfies the condition. All
main tags inside that tag act as children items. Furthermore, there can be a child main tag inside a child main
tag, and so on. Main tags should be marked with a number according to their level (the root main item (parent
product) is marked with 1 and children main items are marked with 2, 3, etc, respectively).
<<QUOTE_PRODUCTS>>
<<NESTED_PRODUCTS>>
<<MAIN_1>>
<<CONTENT>>
<<CONTENT_END>>
<<MAIN_2>>
<<CONTENT>>
<<CONTENT_END>>
<<MAIN_END_2>>
<<MAIN_3>>
<<CONTENT>>
<<CONTENT_END>>
<<MAIN_END_3>>
<<MAIN_END_1>>
<<NESTED_PRODUCTS_END>>
<<QUOTE_PRODUCTS_END>>
If you add conditions for retrieving nested products, the <<CONDITION_END>> tag isn't required.
Examples
Example 1
<<QUOTE_PRODUCTS>>
<<NESTED_PRODUCTS>>
<<MAIN_1:CONDITION(Hardware)>>
<<CONTENT>>
…Some Parent Item Information…
<<CONTENT_END>>
<<MAIN_2:CONDITION(Software)>>
<< CONTENT>>
…Child Item 1 Information…
<<CONTENT_END>>
<<MAIN_END_2>>
<<LI:CONDITION(Memory)>>
<<CONTENT>>
…Parent Line Item Information…
<< CONTENT_END>>
<< LI _END>>
<<MAIN_END_1>>
<<NESTED_PRODUCTS_END>>
<<QUOTE_PRODUCTS_END>>
In this example, children main tags are nested inside parent main tags. The parent main tag range is marked
with MAIN_1 and MAIN_END_1, and a child main tag is marked with MAIN_2 and MAIN_END_2 inside a parent
tag. The system prints information for the parent item, which is of type Hardware. After that, child item
information will be printed (for all children items of type Software), and then again parent item information will
be printed, followed by a parent line item information of type Memory. This way, information from the child item
is printed multiple times in the parent item. Also, child tag can have another child MAIN tag inside, to describe
real SAP CPQ product nesting.
Example 2
There can be multiple CONTENT tags defined, so HEADER, and FOOTER tags are redundant. The example
below shows a MAIN root tag structure:
<<MAIN_1>>
<<CONTENT>>
…Some Parent Item Information…
<<CONTENT_END>>
<<MAIN_2>>
<< CONTENT>>
…Child Item 1 Information…
<<CONTENT_END>>
<<MAIN_END_2>>
<<CONTENT>>
…More Parent Item Information…
<<CONTENT_END>>
<<LI>>
<<CONTENT>>
…Parent Line Item Information…
<< CONTENT_END>>
<< LI _END>>
In the example illustrated above, there are two different CONTENT tags, which pull information from the root
item, and between them there's information from the child main item. Following that, information from a root
line item are printed. Also, HEADER and FOOTER tags are redundant in this case, since CONTENT could
replace both of them.
Example 3
If we have an EP String root item information that we want to print, and we want to print some EP Compressor
and EP Steam Turbine child information inside the parent, printed on different places (multiple times inside a
parent) this is how it should be possible to do that (LINE item tags are left out in an example because it's easier
to focus on main item nesting):
<<QUOTE_PRODUCTS>>
<<NESTED_PRODUCTS>>
<<MAIN_1:CONDITION([EQ](<*CTX( Quote.CurrentItem.ProductTypeName )*>,EP
String))>>
<<CONTENT>>
…Some String Information…
<<CONTENT_END>>
<<MAIN_2:CONDITION([EQ](<*CTX( Quote.CurrentItem.ProductTypeName )*>,EP
Compressor))>>
<<CONTENT>>
…Some Compressor Information (repeat for as many compressors)…
<<CONTENT_END>>
<<MAIN_END_2>>
<<MAIN_2:CONDITION([EQ](<*CTX( Quote.CurrentItem.ProductTypeName )*>,EP Steam
Turbine))>>
<<CONTENT>>
…Some Steam Turbine Information (repeat for as many steam turbines)…
<<CONTENT_END>>
<<MAIN_END_2>>
<<CONTENT>>
…More String Information…
<<CONTENT_END>>
<<MAIN_2:CONDITION([EQ](<*CTX( Quote.CurrentItem.ProductTypeName )*>,EP
Compressor))>>
<<CONTENT>>
…More Compressor Information (repeat for as many compressors)…
<<CONTENT_END>>
<<MAIN_END_2>>
<<MAIN_2:CONDITION([EQ](<*CTX( Quote.CurrentItem.ProductTypeName )*>,EP Steam
Turbine))>>
<<CONTENT>>
…More Steam Turbine Information (repeat for as many steam turbines)…
<<CONTENT_END>>
<<MAIN_END_2>>
<<CONTENT>>
…More String Information…
<<CONTENT_END>>
<<MAIN_END_1>>
<<NESTED_PRODUCTS_END>>
<<QUOTE_PRODUCTS_END>>
Use container tags to display data from a container in SAP CPQ in a generated document.
<<MAIN>>
<<CONTAINER(ContainerName)>>
<<CONTAINER_HEADER>>
<<CONTAINER_HEADER_END>>
<<CONTAINER_ITEM>>
<<CONTAINER_ITEM_END>>
<<CONTAINER_FOOTER>>
<<CONTAINER_FOOTER_END>>
<<CONTAINER_END>
<<MAIN_END>>
Inside CONTAINER sections, use CONTAINER_TAG with a CTX tag to retrieve data (for example,
<<CONTAINER_TAG(<*CTX(Container(Project Tasks).Row(2).Column(Total).GetFormatted))*>)>> returns
the value of the Total column for the second row in the container, keeping the original format).
4.1.1.8 C2 Loop
You can use the C2 tags when you wish the system to iterate through all items in a quote.
You can add C2 tags only to main and line items. You can't add a C2 loop inside a C2 loop, but you can add a
condition inside a C2 loop.
Below is the outline of the structure of a C2 tag. You can copy/paste the structure in your template and enter
any additional tags.
<<C2>>
<<HEADER>>
<<HEADER_END>>
<<MAIN>>
<<C_STOP>>
<<MAIN_END>>
<<LI>>
<<C_STOP>>
<<LI_END>>
<<FOOTER>>
<<FOOTER_END>>
<<C_END>>
Note
Opening and closing tags (for example, <<LI>> and <<LI_END>>) must each be displayed in a separate
row.
A C2 tag can optionally have four sections (header, main items, line items, and footer) and each of them is
described in more details below.
Header
A header is displayed only once at the beginning of a C2 tag. You can add only Q tags inside the header because
other tags aren't parsed. If there's a table in your template, the table header should be displayed in the header
tags.
If you have a table that displays on more than one page, check the Repeat as header row at the top of each
page in Word to display the header on each page.
Main Items
The main tag retrieves all main items in a quote (there should be one set of MAIN tags for each main item). For
the system to properly process the items, you need to add the <<C_STOP>> tag before the closing main tag. If
there’s parent/child item structure, the system treats child items as main items. If tabular representation is
needed, you should add table rows that contain item data.
Line Items
The line item tag retrieves all line items in a quote (there should be one set of LINE ITEM tags for each line
item). For the system to properly process the items, you need to add the <<C_STOP>> tag before the closing
line item tag. If you need to represent line items in a table, you should add table rows within the line item tags.
Footer
A footer is displayed only once at the end of a C2 tag. You should add only Q tags inside the footer because
other tags aren't parsed. If there's a table in the template, the table footer should be displayed in the footer
tags.
Note
There has to be at least one blank space (or a new line) after <<C_END>> for the system to process it
properly.
Other C2 Tags
Tag Description
<<C2_PTYPE_ALL_SortByRank()>> This tag enables you to sort products by product type rank
order. If you have two product types (Drive ranked 10 and
Hardware ranked 5), the
<<C2_PTYPE_ALL_SortByRank(...)>> tag sorts all your
product types by Hardware and then by Drive as a result of
the ranking set on each of the product type.
<<C2_PTYPE_ALL_SortByRankButStartWith(First,Second, This tag enables you to sort product type rank order, but
Third...)>> you can state which rank order to start with product types.
If you have four product types, such as Drive ranked 5,
Hardware ranked 2, Services ranked 3, and Computers
ranked 1, tag
<<C2_PTYPE_ALL_SortByRankButStartWith(Drive,Hardwa
re, Services)>> sorts all your products by Drive, Hardware,
and Services first. In this case the sorting starts with
Computers, followed by the remaining product types in
order by rank. The new sort type enables you lots of
flexibilities when ordering your product types.
<<C2_PTYPE_ALL_SortByName()>> This tag enables you to sort product types by the product
name. If you have two product types, Drive and Hardware,
ranked 10 and 5 respectively,
<<C2_PTYPE_ALL_SortByName()>> tag sorts all your
products by Drive and then by Hardware due to their
alphabetical order.
<<C2_PTYPE_ALL_SortByNameButStartWith(Drive, This tag enables you to sort the product type in the
Services, Hardware, Computer)>> alphabetical order, but you can state which rank order to
start with. If you have four product types, such as Drive
ranked 5, Hardware ranked 2, Services ranked 3, and
Computers ranked 1, this tag sorts all your products by
Drive, Services, and Hardware first; then, it starts sorting
the types in the alphabetical order, and would start with
Computers followed by the remaining product types in the
alphabetical order by name. This tag gives you lots of
flexibilities when ordering your product types.
<<C2_OPTIONAL(...)>> It lists items based on the value in the parenthesis that can
be Y,N and ALL. Y lists only optional items. N lists only
nonoptional items. ALL lists both nonoptional and optional
items (<<C2_OPTIONAL(ALL)>> is equivalent to <<C2>>).
<<C2_CONSOLIDATE(...)>>
This tag consolidates items based on a common denominator. For example, if we have 2 items with the same
part number, using consolidate (<<C2_CONSOLIDATE(C_PNUM)>>) lists it only once.
<<HEADER>>
<<HEADER_END>>
<<ITEM>>
Item number: <<UNIQUE(C_PNUM)>>
Item QTY: <<SUM(C_QTY)>>
Item IDs: <<APPEND(C_ID)>>
<<C_STOP>>
In the above example, items are consolidated based on the part number. <<UNIQUE(C_PNUM)>> lists the
unique part number. Important thing to note is that the inner tag (C_PNUM) in this example shouldn’t be
surrounded with << >>. <<SUM(C_QTY)>> takes the quantity of each item that has this part number, add it up
and display it. <<APPEND(C_ID)>> lists all IDs that have this part number. List is separated by a comma (Item
IDs: 1,3,4). By default consolidate runs through all items. To only process main items we could say
<<C2_CONSOLIDATE(C_PNUM,MAIN)>> or to only process line items <<C2_CONSOLIDATE(C_PNUM,LI)>>.
<<C2>> tag can be used in Excel template as well. In Excel, you define a cell range where you want to render
information. You don’t need to define the range for tags that retrieve simple data, for example C and Q tags.
This example shows scenarios in which you want to display line items that are optional. Notice that 10 rows and
10 columns are allocated for this information to be rendered and for each main and line item that are being
allocated one more row. Also notice that main item aren't displayed, based on the condition we have set, but
<<MAIN>> tag must exist in the template to follow a valid template tags sequence.
4.1.1.9 Conditions
Standalone conditions and tag-dependent conditions let you restrict what data tags retrieve.
Standalone conditions can be added anywhere in the template and they aren’t dependent on any tags.
Standalone conditions are used to control if section of a document are displayed or not. Conditions are
processed after all the other tags have been processed. Using conditions may slow down a performance if large
number of conditions are used to determine in the end if one section is displayed or not. On the left side is a tag
whose value is compared and on the right side is list of values to compare with. Values are separated by “|”
Conditions always use “OR” logic. To check if value is equal use ”=” and if not equal use ”!”. Typical example of
condition is:
[CONDITION,<<Q_QP(myproperty)>>=golf|soccer|basketball]
Any static text or tables or tags
[CONDITION_END]
As seen in the example, condition tags can't be used in a single line - they must be separated into multiple lines.
[CONDITION,…] tags don’t support table tags (<*Table(SQL query)*>). Also, [CONDITION,…] tags must
not be nested.
Conditions aren’t required in templates. They allow you to retrieve data only when the condition is fulfilled.
Tag Conditions
Tag conditions can be applied to every tag to perform an action based on the value the tag returned. Condition
tags can be used in both Microsoft Excel and Microsoft Word templates. If there are multiple tags, separate
them with |.
For example, if you add this tag to your template, <<Q_BILLTO(COMPANY),ABC=d|XYZ=d|D>>, the system
searches for the company of the Bill To user. If the company is ABC or XYZ, the system deletes the name of the
company and leaves an empty line in the document. However, if the tag retrieves any other company name, the
entire line where the tag is on is deleted.
● D - deletes a line.
● d - deletes the value that the tag returns.
● P - inserts a page break after the value that the tag retrieves.
● p - inserts a page break before the value that the tag retrieves.
● B - makes the entire line bold.
● b - makes the value that the tag returns bold.
● U - converts the value to uppercase.
● DC - deletes the content of the cell, if the value displays in a table cell.
● DR - deletes the content of the row, if the value is displayed in a table.
● DCOL - deletes the content of the column in which the value is displayed. Deletion may fail if there are
merged cells in the column.
● DELETE_TABLE - deletes the content of the entire table, if the value is displayed in a table.
When SAP CPQ is integrated with SAP Subscription Billing, you can use these tags in the document generation
template to retrieve elements specific to the integration.
See Quote Item Fields on Subscription Products for a list of CTX tags which you can use to retrieve the values
of standard subscription item fields in the quote.
<<C2>>
<<MAIN>>
<<C_PNAME>>
<<CHARGES>>
<<One_Time>>
<<Rate_Plan_Element>>
<<Price>>
<<Discount>>
<<Total>>
<<One_Time_End>>
Recurring
<<Recurring>>
<<Rate_Plan_Element>>
<<Price>>
<<Discount>>
<<Total>>
<<Recurring_End>>
<<Block_Pricing>>
<<Rate_Plan_Element>>
<<Included_Quantity>>
<<Block_Size>>
<<Price>>
<<Discount>>
<<Total>>
<<Block_Pricing_End>>
<<Tiered_Pricing>>
<<Rate_Plan_Element>>
<<Minimum_Blocks>>
<<Block_Size>>
Pricing Tiers
<<Pricing_Tiers>>
<<Up_To>>
<<Price_Per_Block>>
<<Discount_Per_Block>>
<<Total_Per_Block>>
Volume
<<Volume_Pricing>>
<<Rate_Plan_Element>>
<<Minimum_Blocks>>
<<Block_Size>>
Tiers
<<Tiers>>
<<Up_To>>
<<Price_Per_Block>>
<<Discount_Per_Block>>
<<Total_Per_Block>>
<<Fixed_Price>>
<<Fixed_Discount>>
<<Fixed_Total>>
<<Tiers_End>>
<<Volume_Pricing_End>>
<<Percentage>>
<<Rate_Plan_Element>>
<<Price_Per_Unit>>
<<Discount>>
<<Total>>
<<Ratio>>
<<Percentage_End>>
<<CHARGES_END>>
<<MAIN_END>>
<<C_END>>
The SECTIONS loop makes SAP CPQ iterate through all Solution Design sections and retrieve information such
as their names, hierarchy Ids, ranks (the ordinal numbers of the sections’ rows), values from all their custom
fields, and section totals.
Below is the structure of a SECTIONS loop. You can copy/paste the structure in your template and enter any
additional tags.
<<SECTIONS>>
<<SECTIONS_HEADER>>
<<SECTIONS_HEADER_END>>
<<SECTIONS_LOOP>>
<<SECTIONS_LOOP_END>>
<<SECTIONS_FOOTER>>
<<SECTIONS_FOOTER_END>>
<<SECTIONS_END>>
● Regular «SECTIONS(Regular)»
● Distribution «SECTIONS(Distribution)»
● Distributed «SECTIONS(Distributed)»
● All «SECTIONS(ALL)» or «SECTIONS(Regular, Distribution, Distributed)»
Header
The header is displayed only once below the opening SECTIONS tag. It can contain a table with the section
name, rank, hierarchy, and any custom fields, the values of which you wish to add. It’s also possible to add Q
Tags [page 170] in the header, if needed.
Loop
Section items you’ve filtered in the opening SECTIONS tag are processed in this part. C Tags [page 169] can be
used inside the loop, along with CTX Tags [page 622] for retrieving hierarchy Id, rank, and the section name, as
well as custom fields.
Footer
In Microsoft Excel templates, the SECTIONS loop has the following structure:
<<SECTIONS>>
<<SECTIONS_HEADER>>
<<SECTIONS_LOOP>>
<<SECTIONS_FOOTER>>
For filtering section items in the opening SECTIONS tag, you can use the condition SECTION_TYPE (not case
sensitive), with the allowed values ALL, REGULAR, DISTRIBUTION, DISTRIBUTED (not case sensitive).
Example of the syntax for the use of the SECTIONS loop in a Microsoft Excel template: <<SECTIONS(13X5 |
SECTION_TYPE: Distributed, Regular)>>. In this example, the tag retrieves 13 rows and 5 columns of
sections of the type Distributed and Regular.
Here you can download Microsoft Word and Microsoft Excel templates that contain several frequently used
tags for document generation and CTX tags for retrieving specific data.
The templates contain some simple examples and can be used as a reference for the proper usage of
document generation tags. [page 168]
Download the Excel Templates Examples zip file that contains these templates:
● Container Tags Example - a simple template for retrieving data from a container column using CTX tags.
● C2 Loop with PTYPE and Condition - this template contains three examples for using the C2 loop with
product type tags and condition tags.
● Quote Tables Excel - a simple template for retrieving data from a quote table.
● C2 Loop Listing Items - an example Microsoft Excel template with two sheets. The first sheet contains Q
tags for retrieving basic quote information and a C2 loop for listing items. The second sheet contains Q
tags and CTX tags for retrieving customer details.
Download the Word Templates Examples zip file that contains these templates:
● C2 Loop Simple - a simple template that lists items, their descriptions and product types. This template
also contains CTX tags that retrieve the list price of items and the total list price.
● C2 Loop with PTYPE Tag - a template with the C2 loop and the PTYPE tag. The PTYPE tag retrieves items
that have the Software product type in the first block and the Hardware product type in the second block.
● C2 Loop with Container Tags - the tags in this template retrieve data from columns in a container.
● Quote Tables Word - a simple Microsoft Excel template for retrieving data from a quote table.
● C2 Loop with Conditions - the C2 loop lists all items that have a product type different from Service.
Additionally, a condition is added so that items that have a list price equal to 0 are not displayed in the
generated document.
The Document Generation Templates page displays a list of all document templates in the system, letting you
manage, create, and delete templates and translate their names.
Context
Here, you can manage the format and language settings that apply to all existing and new templates:
● Select Language - select the language in which template names and descriptions are displayed. If a
template name or description has no specified value in the selected system dictionary, the values are
retrieved from the default dictionary instead. To translate a template name or description, click,
select the target language, and enter the new value.
To see the translated template names and descriptions from the user side, after a translation is entered
here, the user can choose the language for which the translations were added in the Default Dictionary on
the User Page. Following that, template names and descriptions display in the selected language for that
user (given that translations are available).
● Default Output Format - select the format in which all documents are generated by default. If format
permissions [page 194] are enabled for a user type, the pertaining user has the possibility to choose in
which format a document is generated. You can only choose between DOC, DOCX, and PDF files here
because Microsoft Excel templates are always generated as XLSX files.
● Users can choose customer’s language when creating documents - if selected, users can select the
language in which the document is generated in the Customer’s language dropdown menu when selecting
a template for a specific quote. The selected language is applied to the generated document, the email
sent to the customer, and the proposal page which customers access by clicking the proposal link in the
email. After selecting a language, it’s also necessary to include the appropriate tags [page 168] in the
document for the translations to display.
On this page, you can create simple, multisection, and section templates. All templates that exist on the tenant
are organized in the Output Templates and Section Templates lists. In addition to the template name and type,
the lists display other relevant details (visibility permissions, dates when the templates were last modified and
the names of administrators who last modified them, and so on).
In the Output Templates list, administrators can organize in which order templates appear when they’re
presented to the user. When users are selecting the template for their documents, only output templates (both
simple and multisection) are available on the user side.
Depending on the type of template that you’re creating, you have access to different tabs when editing a
template. For simple templates, Sections is disabled, and for multisection templates, Additional Content is
disabled. Additionally, when creating section templates, you can’t manage the Sections and Format
Permissions tabs. Additional Documents is available when editing multi-section or simple templates.
The Filename column is always blank for multisection templates. The Master Section column indicates which
section controls the header and the footer of the document. Moreover, the Contained Sections column lists all
the sections in a multisection template.
Procedure
In Output Templates, you create simple and multisection templates, and in Section Templates, you create
sections that are included in multisection templates.
2. Enter the template name.
3. Click Save.
A new page displays with multiple tabs. The Template Definition tab opens by default.
Note
If you upload a Microsoft Word template, you can generate a DOC, DOCX, or PDF document. However,
if you upload a Microsoft Excel file (either an XLSX or XLS file) in the new document generation engine,
you can only generate an XLSX file.
The Template Creation Tool [page 202] button gives you access to a tool that creates a document template so
you don’t have to manually add tags.
Depending on the template type that you’re creating, one of the following types is selected by default:
Note
If you add sections to a template and then make it a Simple Template, the sections become unavailable.
However, they aren’t deleted (even if you click Save) - you can make them available again by choosing Multi-
sections template in Template Definition. Similarly, the file revisions table is disabled when Multi-sections
template is selected, but file revisions aren’t deleted when you click Save.
In Override Document Processing Engine [page 198] for this template, select one of these options:
● Use Global setting from application parameters page - default value, follows the selection on the Application
Parameter page.
● Use Old Engine - overrides the global setting to the old engine.
● Use New Engine- overrides the global setting to the new engine.
After you’ve defined the general template details for a simple or a section template, you need to select the
DOCX template based on which the document will be generated. Click Add New Document and browse for the
document.
Note
Uploading documents for multisection templates isn’t available in the Template Definition tab. Instead, you
need to separately upload a document for each pertaining section that is listed in the Sections [page 192]
tab of that multisection template.
When simple or section templates are selected, files and file revisions are listed in the table below. The
template name and the revision number are displayed in a row. Furthermore, clicking the icons in the table lets
you preview, download, and delete the document.
Note
When in the preview mode, enter the quote composite number to preview the generated document for the
selected quote.
Although a template can have multiple revisions, only one revision can be active at a time. When multiple
documents are uploaded, click [activate] next to the document you wish to activate. If there’s only one
document, that file is active by default.
Before you add tags to a Microsoft Word template, first adjust the header and footer in Microsoft Word. All the
styling of the template should be done in Microsoft Word so you can later only add tags without any styles. The
styles that are applied to the tags in the template are also applied to the retrieved values in the generated
document (for example, if you make a tag bold, the value that it retrieves is also bold in the generated
document). This is applicable for all standard Microsoft Word formatting (bold, italic, underline, font sizes, text
effects, text color, text background, text highlighting, text alignment, paragraph settings with spacing before
and after, table formatting with all previous mentioned variations in cells, and so on). Text effects aren’t applied
correctly to the tag output if the document is generated in the DOC file format.
Note
Texts effects are available only for the DOCX file format, which is available in Microsoft Word 2007 and later
versions.
Avoid copying and pasting tags and the text in templates in order to achieve the best performance of the
Document Generation tool. Otherwise, if you must copy something in your template, make sure to first remove
all styling and formatting. Visit the Document Generation Tips and Tricks [page 206] page to read about the
most frequent styling issues and possible workarounds.
4.1.2.2 Sections
Here you can select the section templates that are included in the document. Other than selecting section
templates, on this tab you can set up the following settings:
● User can sort sections - enables users to sort sections before generating the document. Once users sort
the sections, the order remains unchanged the next time users generate documents from the same quote,
regardless of the default order of sections set up in the Setup.
● User can upload their own sections - lets users upload their own DOCX section templates when
customizing the template on user side. When the checkbox is selected, a formula box appears. The formula
entered here is used to narrow down the conditions under which Add Section appears during the document
generation process. The default value of the field is 1, meaning that all users can upload sections manually.
Consider this example: for enterprise-grade deals, users shouldn't be able to manually add sections. Deal
type is defined in a custom field. By entering the condition [NEQ](<* QuoteProperty(Deal Type)
*>, Enterprise), users are only allowed to add sections if the deal type isn’t enterprise.
● Sections will inherit formatting (header,footer etc.) from first section in the template - enables format
inheritance from the first (master) section to all subsequent sections. If the checkbox isn’t selected, each
section maintains its own formatting. This checkbox is selected by default for new documents.
Note
If the application parameter Heading style used in generated documents is set to Keep source formatting
and the checkbox Sections will inherit formatting (header,footer etc.) from first section in the template is
selected, the sections of the output document inherit the header and footer from the first section of the
template, but the heading style is kept for each individual section.
Prerequisites:
The list displays the name of the section template and the name of the respective DOCX file. To delete and edit
The Sort column shows the order of section templates as they’ll be generated in a document. The order
defined here is default and users can override it if the User can sort sections checkbox is selected. To change
the order of sections, enter the numbers in the Sort column in ascending order, starting from the section that
should be generated first, and click Re-Sort.
The Visibility Permissions tab lets you define who can see the template.
You can allow users to access specific templates when quotes are in a certain status. When setting the visibility
of a section template, you allow/disallow access to that section only, not to the entire multisection template in
which the section is included. Visibility is controlled via permission groups. To limit the visibility, unselect the
Visible to all permission groups checkbox that is selected by default, and move the permission groups that
should have access to the template to the Selected Permission Groups column. The logic between multiple
permission groups is OR. In Step 2, click , and create a condition under which the template is visible to the
In this tab, you select the permission groups that can select the output format of the generated template.
By default, all permission groups are able to generate templates only in the format selected in Default Output
Format in the Document Generation Templates page. Users that belong to the permission groups selected in
Format Permissions also have other template formats available for selection. The logic between multiple
permission groups is OR. In Step 2, click , and create a condition under which format selection is available
to the selected permission groups. By default, 1 displays in the condition box, meaning that format selection is
available under all conditions.
The Related Fields tab specifies the quote custom fields that are related to the entire template or to the section,
in case of a section template.
Users are prompted to fill out related fields when customizing a document that is being generated. Depending
on the template type you’re editing, the fields are related to a section (in case of a section template) or to the
entire output document (in which case, they’re displayed in the Template Details panel in the Customize tab on
the user side). In the screenshot below, you can see an example of each case: Quote Expiration Date and Terms
are related to the Introduction section and Additional Comments and Customer Comments are related to the
document in general.
This tab is for selecting the files that are attached to the generated document (for example, descriptions of
quote items, data sheets, terms and conditions, and so on). Before you can add files to the template, you need
to upload them in the Manage Content Documents [page 201] section.
Note
The additional content is included in the generated document only if the following tags are in the template:
<<INCLUDE_DOCUMENTS>>
<<INCLUDE_DOCUMENTS_END>>
Files are included in the same order in which they’re displayed to the user. If the checkbox Don’t include
same file more than once is selected on the user side, SAP CPQ doesn’t include duplicate files. Otherwise,
duplicate files are included if found.
● Image settings - specify the way image files are inserted into generated documents. You can choose
between Default settings (format: PNG, resolution: 300, quality: 100) and Custom settings. Selecting
Custom settings allows you to choose between two formats:
● ○ PNG (choosing PNG allows you to further specify Image resolution)
○ JPG (choosing JPG allows you to further specify Image resolution and Image quality)
Configuring image settings allows you to control the size of the output document. Namely, PNG is a
high-quality image format and choosing it results in large output documents. On the other hand,
choosing JPG results in documents of a smaller size and lower quality.
● Also Include Quote Items in Formula Evaluation - select the checkbox to attach files to each quote item in
the generated document, not to the quote globally.
● File Name - add the name of the file that you wish to attach to the generated document. File names must
contain the file extension (for example, ABCCaseStudy.docx). The system supports DOC, DOCX, PDF, PNG
and JPG files. Alternatively, click to create a formula that dynamically retrieves file names from a
custom table.
● File Description - enter a description of the file manually, or define a formula that retrieves the description
dynamically.
● Add More Files - click it to add another File Name and File Description fields so that you can add more than
one file to the template.
● File Selection - select Check Boxes to let users select multiple files to attach to the generated document.
Alternatively, select Radio Buttons and users are allowed to select only one file.
● Separate files with page break - select this checkbox for the system to separate additional files with a page
break.
Files found for the first quote item are displayed first (in the same order as defined in Setup), followed by
the files found for the second item, and so on.
In this tab, you can define and select mandatory additional files that are enclosed in the same email as the
generated document.
This feature is available only for the new document generation engine. Similar to Additional Content, before you
can add files to the template, you need to upload them in the Manage Content Documents [page 201] section.
The differences between additional documents and additional content are the following:
● Additional documents are mandatory additions to the generated document, while additional content files
are optional.
● If PDF files are included as additional content in multi-section documents, they are converted into images
and added into Microsoft Word documents in the output. However, if they are added in the Additional
Documents tab, they remain in the PDF format as separate files.
● Convert Microsoft Word Files into PDF – additional documents in DOC or DOCX format are converted into
PDF files in the output.
● Also Include Quote Items in Formula Evaluation – expand the context of formula evaluation so that files can
be included for each quote item, and not just the quote globally. If the checkbox is not selected, the defined
formula is evaluated only once.
● File Name - add the name of the file that you wish to include in the same mail as the generated document.
File names must contain the file extension (for example, ABCCaseStudy.docx). The system supports DOC,
DOCX, PDF, PNG and JPG files. Alternatively, click to create a formula that dynamically retrieves file
names from a custom table.
● Add More Files - add another File Name field so that you can add more than one file to the template.
The resulting email created at the end of the document generation process contains the generated document
and any additional documents included via Additional Documents. On the user side, users can see the
additional documents in the Documents tab of the quote. There, they can also download previously generated
documents together with any additional documents as a ZIP file.
Users in the permission groups that you select in this tab are able to manage templates on the user side of SAP
CPQ.
For example, if a regional SAP CPQ administrator responsible for several markets wishes to authorize certain
users in a specific market to create document templates, this feature can make that possible. Alternatively, if
you select Visible to all permission groups, all users can manage the template locally.
When users are given the authority for managing a document generation template, the template becomes
available in the Manage Global Document Templates section of the User Menu. Just like the administrators,
users can select the language in which the template names and descriptions are displayed. The selection of
languages on the administrator and user side is codependent (the language selected in one page is
automatically selected in the other).
Templates which users can manage are organized into Output Templates and Section Templates sections. When
users open a simple template, they can manage the details in Template Definition, Related Fields, and
Additional Files tabs.
SAP CPQ has two engines for generating documents: the old and the new document generation engine.
The old document generation engine is active by default for Quote 1.0. Therefore, to enable the new engine,
follow these steps:
However, if needed, you can override the engine selection for a specific template (for example, if you wish to
use the new engine in general, but you have a single template whose format isn’t supported in the new engine)
by following these steps:
The Quote 1.0 engine uses both the old and new document generation engines. On the other hand, Quote 2.0
only uses the new document generation engine.
The old document generation engine generates PDF, DOC, DOCX, XLS, and XLSX files. On the other hand, the
new engine generates PDF, DOCX, and XLSX files (in both Quote 1.0 and Quote 2.0). Furthermore, when
uploading Microsoft Excel templates to the new engine, you can import both XLS and XLSX templates, and the
new engine generates them as XLSX files.
Note
If a Microsoft Word template is used, the output format can be a Microsoft Word document, PDF file, or
both. On the other hand, the output of a Microsoft Excel template is always a Microsoft Excel document.
While the new document generation engine is faster than the old engine, it may not support all the templates.
Therefore, when switching from the old to the new engine, it’s advisable to test the templates in a sandbox
environment to verify that there are no issues. Otherwise, it may be necessary to fix the layouts or to reupload
the templates.
Note
Unless specified otherwise, the procedures explained in the related topics describe the new document
generation engine and Quote 1.0.
This page covers the workflow adjustments that need to be made to enable document generation and the
parameters that need to be set.
Workflow Adjustments
To enable your users to generate documents in SAP CPQ, on top of creating a template with the appropriate
tags, you need to make the following workflow adjustments:
● make sure that the Generate Documents action does not have any conditions [page 381] that prevent it
from displaying to users.
● add the Generate Documents action in the workflow matrix [page 330].
Listed below are all the application parameters that influence how documents are generated in SAP CPQ.
The list of uploaded documents displays the file name, format, and destination directory. Also, you can see in
the list who created the file, who last modified it and when it was last modified. The Permissions column
displays the companies to whose local administrators the file is visible.
In the list, you can click , and to delete, edit, and preview the file, respectively. After clicking the
edit icon, a pop-up displays where you can select and unselect the companies that will see the file. After
clicking the preview icon, enter the number of the quote that the system will use as a source of data and click
Note
Note
When a ZIP file is uploaded as a content document, an email notification is sent, stating whether the upload
is finished, the names of the compressed files unpacked during the upload, and whether the upload is
In this section, you can delete multiple documents from the section with a single action.
● Delete documents listed above - selecting this option before clicking Delete deletes all the documents
currently visible on the page.
● Delete all documents that match entered criteria - selecting this option before clicking Delete deletes all the
documents that are filtered after you enter a search term in the search boxes above.
● Delete all documents - selecting this option before clicking Delete deletes all content documents.
The Template Creation Tool lets you create templates with basic document tags so you don’t need to add them
manually.
Prerequisites
Context
The tool is convenient for administrators who need simple templates and who don’t have experience working
with document generation tags. The Template Creation Tool isn’t available for multisection templates.
Procedure
A pop-up displays with two sections: Sample Templates and Template Tag Builder. In Sample Template, you
can download and preview systematic templates. If needed, these templates can additionally be formatted,
you can add and remove tags.
A table displays all documents uploaded in Manage Content Documents that you can include in the
generated document.
c. Select a file.
d. Expand the Create Tags for Conditional Data/File inclusion/insertion section.
Here, you can optionally create conditions under what the data you selected in the first section is
displayed in the generated document.
The tags selected here display in a C2 tag that loops through all items in the quote.
1. Select Show data as a table
These fields display:
A document with all the tags you selected in the previous steps is downloaded.
You can now either delete the descriptions in the generated template and proceed with the upload [page
189], or copy and paste only the tags into another document.
Check the Document Generation Tips and Tricks [page 206] page to avoid any possible issue with
generating your document.
The purpose of this feature is to visually guide new or less experience or less frequent users through the
process of selecting products, creating a shopping cart, generating a quote document.
Depending on application parameter Show lead/prompting arrows in catalog (catalog, configurator, shopping
cart, document generation), SAP CPQ displays arrows that make it easy for user to understand that they need
to click on category or Customize product button. Button Add to Quote should be hidden, greyed our (or
disabled) until user selects at least one product to be added to quote. For categories, arrow is added to the end
of category name. For product Customize button, arrow is added in it. For the configurator, the same arrow is
added to Add to quote/Prepare proposal button. Approvals action will also have an arrow in order to prompt
uses to click on it (when it shows up) if approvals are needed. This is because Generate Quote action won’t be
there any longer and approvals is the next thing they need to do. Application parameter Show lead/prompting
arrows (catalog, configurator, shopping cart, document generation) is added to first tab of application
parameters. Default value is FALSE.
After users select a template for generating a document and customize it, they can download the document
and send it as email attachments from the application. The recipients’ details and the email subject and body
are predefined, but users can change the details and select who receives the email. The email body contains a
predefined text that neither users nor administrators can change (for this, please contact the SAP CPQ
Support team).
The generated document is sent as an email attachment if Email Attachment is selected. Selecting Include
Proposal Link includes a link in the email.
Note
If the option Send Mail using your default mail client… is selected, it’s necessary to manually attach the
generated document (the generated document won't be automatically attached to your email). Also, the
Plain text body type must be selected.
This page lists the workarounds and methods of avoiding issues with document generation in SAP CPQ.
● Don’t change the color of the tags to white to make a document cleaner. The system pulls values of tags
and it doesn’t display the tags in the generated document, so you shouldn’t change the color of tags to
white to hide them in the template.
● Don’t switch fonts in one tag.
● Always use the same font for tags within one document.
● Make sure to show paragraph marks and other hidden symbols in Microsoft Word by clicking in the
toolbar. This shows all characters that may have been entered accidentally or while copying content and
that will potentially cause errors in generating documents in SAP CPQ. Make sure to delete such
characters.
● Everything inside a C loop must be in the same font.
● If all sections after the second section in a multisection template inherit the formatting from the second
section, and the Sections will inherit formatting (header,footer etc.) from the first section in the template
option is off, select the Different Odd and Even checkbox in the word-processing program.
● Make sure to add a new line after each C2 tag (press ENTER on your keyboard).
● If there are tables inside a C loop in the header, footer and the main part of the document, they all must
have the same format (for example, they must have the same columns).
● Use template versions when adding new tags in an existing template. When you create a template and
properly generate a document, the next time you want to add new tags, create a new version of the
document and make it active. This way, you make sure to always have a template version with tags that
properly retrieve data. Also, if something isn’t properly retrieved in the new document, you limit the
debugging only to the recently added tags.
● Don’t add table tags in conditions.
● Don’t add conditions into conditions.
● Protected DOC and DOCX files can’t be uploaded into SAP CPQ.
● The application of conditional logic depends on the type of tags used for document generation: C2 or
QUOTE_ITEMS. If the C2 approach is used, the system will first parse content and later, based on the
parsed conditional logic, display, and parse the document content. On the other hand, QUOTE_ITEMS
parses the condition and process only the content data that satisfies the condition. Row spacing should be
reduced to minimum to ensure correct tag parsing. Below are the syntax examples for both approaches,
which enable the user to print the content of the main and line items under specific conditions.
C2 Example
<<C2>>
<<HEADER>>
This is a header.
<<HEADER_END>>
<<MAIN>>
Repeat once for each main item.
<<C_STOP>>
<<MAIN_END>>
<<LI>>
[CONDITION,<<C_TAG(CTX,EQ,IN,GT,LT... TAGS GO HERE)>>=1]
*CONTENT GOES HERE*
[CONDITION_END]
<<LI_END>>
<<FOOTER>>
This is a footer.
<<FOOTER_END>>
<<C_END>>
QUOTE_ITEMS Example
<<QUOTE_ITEMS>>
<<HEADER>>
<<HEADER_END>>
<<MAIN: CONDITION(CTX,EQ,IN,GT,LT... TAGS GO HERE)>>
<<MAIN_HEADER>>
<<MAIN_HEADER_END>>
<<MAIN_CONTENT>>
<<MAIN_CONTENT_END>>
Quote 2.0 is the improved quote engine available since June 2018. The new quote engine was developed as a
part of the initiative to make SAP CPQ the state-of-the-art software that allows users to create large quotes
more quickly than in Quote 1.0.
After the responsive design was made public in 2015 and the new Document Generation engine made available
in 2017, clients needed a new Quote engine that would additionally boost their performance.
Note
Quote 1.0 is still the default quote engine in SAP CPQ. New clients may use Quote 2.0 from the beginning (this
requires initial setup before the modeling starts) and existing clients need to migrate from Quote 1.0 to Quote
2.0.
Compatibility
Before initiating the migration from Quote 1.0 to Quote 2.0, check the following list to understand the
compatibility of the new quote engine with the rest of the system:
● Quote 1.0 and Quote 2.0 can’t be used in parallel in the same tenant.
Tip
Download the SAP CPQ 2005 Migration Guide to find out how to migrate from Quote 1.0 to Quote 2.0. The
guide contains a comparative overview of Quote 1.0 vs Quote 2.0 features and a migration procedure.
Tip
Download the SAP CPQ 2005 Migration Guide to find out how to migrate from Quote 1.0 to Quote 2.0. The
guide contains a comparative overview of Quote 1.0 vs Quote 2.0 features and a migration procedure.
SAP CPQ doesn’t switch automatically to Quote 2.0, nor should administrators initiate the transition on their
own. Quote 2.0 isn’t backward compatible with old quotes and there are functionalities in Quote 1.0 that are yet
to be developed for the new engine.
Note
New SAP CPQ tenants are automatically set to Quote 1.0. To move to Quote 2.0 before you begin modeling,
contact the SAP CPQ Support team.
Migration Procedure
Make sure you have read the Quote 1.0 vs Quote 2.0 - Feature Comparative Overview section in the SAP CPQ
2005 Migration Guide. At this point, you should be familiar with the differences between the two engines and
understand how that may reflect on your model in SAP CPQ.
1. Contact the Support team to get the copy of your production tenant.
This is a temporary tenant that you use only to adjust the quotes and the model in Quote 2.0. Once
everything is adjusted, you move everything from the temporary tenant back to production.
2. Ask the Support team to turn on Quote 2.0 in the temporary tenant.
3. Contact the SAP CPQ Professional Services to discuss the options for using old quotes in Quote 2.0.
The team analyzes your request and suggest the best approach, depending on how you plan to use old
quotes in Quote 2.0.
The team takes into consideration your model in SAP CPQ and then propose a solution.
4. Model the new tenant according to what you agreed with the Professional Services.
Make sure to keep a detailed record of the changes you made in the temporary tenant so you can replicate
them later in the original (production) tenant.
If administrators can’t handle the setup on their own, they should contact the SAP CPQ Professional
Services team.
5. Test if everything is working as expected in the temporary tenant before performing the production
upgrade.
6. Contact the SAP CPQ Support team to turn on the Quote 2.0 in the original (production) tenant.
7. Replicate all the adjustments that you have made in the temporary tenant in the production tenant.
Use the record of the changes you made in the temporary tenant.
The production environment is offline while the migration is in progress so make sure to plan the time for
these steps accordingly (preferably during the weekend).
8. Proceed with the steps for migrating old quotes that you’ve previously agreed on with the Professional
Services team.
Quote Filtering allows users to filter out quote items by specific values in quote item custom fields and in some
standard SAP CPQ fields (Part Number, Product Type and Product Name). Filtering is available only in Quote
2.0.
After you allow filtering for a quote item custom field and users select or enter a value in that field on the quote,
the system can filter out only the items that have a specific value in the quote item custom field. To enable this,
users need to enter the field value as a filter criterion in Filter Items.
Setup
To enable filtering per quote item custom fields, you need to make the following adjustments in the Setup:
● Create a quote item custom field [page 307] and select Use column value to filter quote items. Filtering is
supported for all field types.
● Select the quote item custom field in Quote Layout [page 310].
● Make the quote item custom field visible to users in Quote Layout Permissions [page 310].
User Side
The Filter Items button opens the Filters pop-up with the filtering criteria. All quote item custom fields that are
enabled for filtering are displayed in the pop-up. Depending on the type of the quote item custom field, users
can enter, pick a value, or set a range of minimum and maximum values. The logic between multiple filters is
AND.
Users should follow the search logic described below when entering search criteria in standard SAP CPQ fields:
● Part Number - enter the exact value or use % to expand the search (for example, AB23% filters all quote
items whose part number starts with AB23).
● Product Type - start typing and the system will offer matching types.
● Product Name - enter the exact product name or expand the search with % (for example, Manuf% filters all
quotes whose product type starts with Manuf).
A filter remains applied on a quote as long as it’s opened in the same browser. The first time the user opens it in
a different browser, the filter is refreshed. The filter is visible on the quote only to the user who applied it.
If a filter is applied, the filtering criteria is visible above the list of items and the total number of filtered items is
displayed on the right.
If users manage sections in the Solution Design tab, they’ll have the following two checkboxes available:
● Show Only Unallocated Products - filters only the items that aren’t allocated to any sections.
● Show only products assigned to my sections - filters the items that are allocated to the section to which the
user has rights.
● Even if you enable filtering for a quote item custom field, if the field isn’t visible for a user, they can’t apply
the field’s values as filters on the quote.
● When a quote with applied filter is copied and a new revision is created, the filter isn’t applied.
● Filters are available on quotes in the view mode, when the user has no rights to perform any actions on the
quote.
To manage calculations for Quote 2.0, access the Quote Fields and Calculations page in Setup > Quotes. The
page shows in Setup only when Quote 2.0 is on. Otherwise, if using Quote 1.0, calculations should be
administered under Pricing/Calculations > Cart Fields Administration.
Note
Note that in the context of calculations, terms quote fields and columns may be used interchangeably when
referring to fields on quotes that are calculated via formulas (for example, NRC List Price, Extended Cost,
NRC Cost, etc.). Additionally, terms formula and calculations may be used interchangeably as well.
The Fields and Calculations tab allows you to manage existing quote default and custom fields in the system
and to add new fields.
After clicking Add New Field, a window pops up for defining basic settings (field name, label, type (Number,
Date, Currency, and Text) and dependency from the knockout context). The field displays automatically in the
list of fields and you can additionally manage it on the Quote Item Custom Fields page. To handle the field's
activity, use the Active toggle.
After you select a field from the list, a list of calculations attached to it will display on the right. Calculations
execute from top to bottom. To change the order or calculations, click on next to a calculation and move it up
or down. To remove a calculation, click .
Note
Due to dependency between certain default calculations, the system must execute them in a specific order
described in Item Update Calculations Order [page 221]. Ordering calculations differently may cause an
error.
To attach another calculation, click Add calculation below the list of existing calculations. A pop-up shows all
the remaining calculations that can be attached to a field by clicking . Additionally, the system lets you define
calculations that are triggered when a new item is added. The list of calculations shows on the right if you click
Note
When Quote 2.0 engine is enabled, a parameter Calculate discounts only for changed items is visible on the
Discounts page. Selecting the parameter optimizes calculations by checking discount rules only on
affected (changed) items.
In Quote 2.0, administrators have a full control over the order of calculations and they can easily insert an item
custom field between two standard fields and insert a calculation so that the custom field affects the standard
fields, without having to completely rewrite the entire quote calculation for quote lines.
The concept of editable groups is removed from the system with Quote 2.0. In the new engine, calculations are
managed on field level for all users on the tenant. Calculations are to be set up for each field separately, one
field at a time. The system allows you to make all quote fields editable (main items, line items, product types,
and totals).
Note
When on a quote, users just need to double-click the underlined amount in a column and all amounts in the
column become editable. After changing a value, users can trigger the calculations by clicking Reprice,
clicking anywhere outside the active field or by pressing Enter.
On the Quote Fields and Calculations page, the list on the left shows all fields calculated via formulas that
display on quotes. Once you click a field, the list on the right will display all calculations that are triggered in the
system after the value in the field has changed. Changing a value causes a chain reaction in which calculations
are performed one after another. When changing the default order of calculations, make sure to organize them
so that the system has the value of all constituent elements before triggering the calculation.
Tip
To organize calculations properly, administrators should understand which values does a calculation use
and according to their specific customization, organize calculations in a logical manner.
Additionally, you can create custom calculations via scripting. To access the window for creating scripts, click
Add calculation Add New Calculation . In the pop-up, define the following:
More details on scripting are available in Scripting for Quote 2.0 [page 254].
To see the editing rights for a field, click Show editing permissions for this field. The pop-up displays the
permission groups that have the rights to edit the field and quote statuses in which editing is enabled.
Most quote fields are calculated via one predefined formula. However, the value of some of them is calculated
via multiple formulas.
Example
The first calculation is attached to the NRC Discount Amount and it's triggered once users change the value in
this field. The second calculation will be triggered after NRC Net Price is changed and the third after NRC
Extended Amount is changed.
You can find below formulas that are used for calculating all quote fields (main items, line items, product type,
and total items). The first column contains the name of the field as it is displayed on quotes. Calculation
contains calculation names as defined in the Quote Fields and Calculations section. In addition, a description of
each field is provided as well as the formula for calculating the field.
NRC List Price Item NRC List Price Calculates item NRC list Item.ListPrice = Item.Exten
price from item NRC ex dedListPrice / Item.Quantity
tended list price.
MRC List Price Item MRC List Price Calculates MRC List Price Item.MrcListPrice =
from MRC Extended List Item.MrcExtendedListPrice /
Price. Item.Quantity
NRC Discount Percent Item NRC Discount Percent Calculates item NRC dis Item.DiscountPercent = 100
(from Discount Amount) count percent from item dis * Item.DiscountAmount /
count amount. Item.ListPrice
NRC Discount Percent Item NRC Discount Percent Calculates item NRC dis Item.DiscountPercent = 100 -
(from item net price) count percent from net price. 100 * Item.NetPrice /
Item.ListPrice
NRC Discount Percent Item NRC Discount Percent Calculates item NRC dis Item.DiscountPercent = 100 -
(from Extended Amount) count percent from item ex 100 * Item.ExtendedA
tended amount. mount / Item.ListPrice *
Item.Quantity
MRC Discount Percent Item MRC Discount Percent Calculates item MRC dis Item.MrcDiscountPercent =
(from MRC Discount count percent from item 100 * Item.MrcDiscountA
Amount) MRC discount amount. mount / Item.MrcListPrice
MRC Discount Percent Item MRC Discount Percent Calculates item MRC dis Item.MrcDiscountPercent =
(from MRC Net Price) count percent from item 100 - 100 * Item.MrcNet
MRC net price. Price / Item.MrcListPrice
MRC Discount Percent Item MRC Discount Percent Calculates item MRC dis Item.MrcDiscountPercent =
(from MRC Extended count percent from item 100 - 100 * Item.MrcExten
Amount) MRC extended amount. dedAmount / Item.MrcList
Price * Item.Quantity
NRC Extended Amount Item NRC Extended Amount Calculates item NRC ex Item.ExtendedAmount =
tended amount from item net Item.NetPrice * Item.Quan
price and quantity. tity
MRC Extended Amount Item MRC Extended Amount Calculates item MRC ex Item.MrcExtendedAmount =
tended amount from item Item.MrcNetPrice *
MRC net price and quantity. Item.Quantity
NRC Cost Item Cost Calculates item NRC cost Item.Cost = Item.Extended
from item extended cost and Cost / Item.Quantity
quantity.
MRC Cost Item MRC Cost Calculates item MRC cost Item.MrcCost = Item.MrcEx
from item MRC extended tendedCost / Item.Quantity
cost and quantity.
NRC Extended Cost Item NRC Extended Cost Calculates item NRC ex item.ExtendedCost =
tended cost from item NRC item.Cost * item.Quantity
cost and quantity.
MRC Extended Cost Item MRC Extended Cost Calculates item MRC ex Item.MrcExtendedCost =
tended cost from item MRC Item.MrcCost * Item.Quan
cost and quantity. tity
NRC Extended List Price Item NRC Extended List Price Calculates item NRC ex Item.ExtendedListPrice =
tended list price from item Item.ListPrice * Item.Quan
NRC list price and quantity. tity
MRC Extended List Price Item MRC Extended List Calculates item MRC ex Item.MrcExtendedListPrice =
Price tended list price from item Item.MrcListPrice *
MRC list price and quantity. Item.Quantity
NRC Discount Amount Item NRC Discount Amount Calculates item NRC dis Item.DiscountAmount =
(from NRC discount percent) count amount from NRC dis Item.ListPrice * Item.Quan
count percent. NRC discount tity * Item.DiscountPercent /
amount also includes item 100
quantity.
NRC Discount Amount Item NRC Discount Amount Calculates item NRC dis Item.DiscountAmount =
(from NRC net price) count amount from item net Item.ListPrice - Item.Net
price. Price
NRC Discount Amount Item NRC Discount Amount Calculates item NRC dis Item.DiscountAmount =
(from NRC extended count amount from NRC ex Item.ListPrice - Item.Exten
amount) tended amount and quantity. dedAmount / Item.Quantity
MRC Discount Amount Item MRC Discount Amount Calculates item MRC dis Item.MrcDiscountAmount =
(from MRC discount percent) count amount from item Item.MrcListPrice *
MRC discount percent. Item.MrcDiscountPercent /
100
MRC Discount Amount Item MRC Discount Amount Calculates item MRC dis Item.MrcDiscountAmount =
(from MRC net price) count percent from item Item.MrcListPrice -
MRC net price. Item.MrcNetPrice
MRC Discount Amount Item MRC Discount Amount Calculates item MRC dis Item.MrcDiscountAmount =
(from MRC extended count amount from MRC ex Item.MrcListPrice -
amount) tended amount. Item.MrcExtendedAmount /
Item.Quantity
NRC Net Price Item NRC Net Price Calculates item NRC net item.NetPrice = item.List
price from item discount per Price * (1 - item.DiscountPer
cent. cent / 100)
MRC Net Price Item MRC Net Price Calculates item MRC net Item.MrcNetPrice =
price from MRC discount Item.MrcListPrice -
amount. Item.MrcDiscountAmount
NRC Manufactures Gross Item NRC Gross Margin Per Calculates item NRC gross Item.GrossMarginPercent =
Margin cent margin percent from item 100 * (Item.ExtendedA
NRC extended amount and mount - Item.Extended
item NRC extended cost. Cost) / Item.ExtendedA
mount
MRC Manufactures Gross Total MRC Gross Margin Per Calculates total MRC gross Totals.MrcGrossMarginPer
Margin cent margin percent from totals cent = 100 * (Totals.MrcNet
MRC net price and totals Price - Totals.MrcCost) / To
MRC cost. tals.MrcNetPrice
Product Type NRC Discount Product Type NRC Discount Calculates product type NRC ProductType.DiscountPer
Percent Percent discount percent from prod cent = 100 * Product
uct type NRC discount Type.DiscountAmount / Pro
amount. ductType.ListPrice
Product Type MRC Discount Product Type MRC Discount Calculates product type MRC ProductType.MrcDiscount
Percent Percent discount percent from prod Percent = Product
uct type MRC discount Type.MrcDiscountAmount /
amount. ProductType.MrcListPrice
NRC Extended Amount Product Type NRC Net Price Calculates NRC net price as a NetPrice = Sum(Item.Exten
sum of all item extended dedAmount)
amounts.
MRC Extended Amount Product Type MRC Net Price Calculates MRC extended ProductType.MrcNetPrice =
amount as a sum of all item Sum(Item.MRCExtendedA
MRC extended amounts. mount)
NRC Extended Cost Product Type NRC Cost Calculates NRC extended Cost = Sum(Item.Extended
cost as a sum of all item NRC Cost)
extended costs.
MRC Extended Cost Product Type MRC Cost Calculates MRC extended ProductType.MrcCost =
cost as a sum of all item MRC Sum(Item.MRCExtended
extended costs. Cost)
NRC Extended List Price Product Type List Price Calculates NRX extended list ListPrice = Sum(Item.Exten
price as a sum of all item ex dedListPrice)
tended list prices.
MRC Extended List Price Product Type MRC List Price Calculates product type MRC ProductType.MrcListPrice =
list price as a sum of all item Sum(Item.MRCExtended
MRC extended list prices. ListPrice)
NRC Discount Amount Product Type Discount Calculates NRC discount ProductType.DiscountA
Amount amount from product type mount = ProductType.List
NRC net price. Price - ProductType.NetPrice
MRC Discount Amount Product Type MRC Discount Calculates MRC discount ProductType.MrcDiscountA
Amount amount from MRC net price. mount = Product
Type.MrcListPrice - Product
Type.MrcNetPrice
NRC Manufactures Gross Product Type Gross Margin Calculates NRC manufac ProductType.GrossMargin
Margin Percent tures gross margin from Percent = 100 * (Product
product type net price. Type.NetPrice - Product
Type.Cost) / Product
Type.NetPrice
MRC Manufactures Gross Product Type MRC Gross Calculates MRC manufac ProductType.MrcGrossMar
Margin Margin Percent tures gross margin from ginPercent = 100 * (Product
product MRC net price. Type.MrcNetPrice - Product
Type.MrcCost) / Product
Type.MrcNetPrice
Total Fields
Quote Field Calculation Description Formula
Item Total NRC Extended List Total NRC List Price Calculates total NRC ex Totals.ListPrice =
Price tended list price as a sum of Sum(Item.ExtendedList
all item extended list prices. Price)
Item Total NRC Extended Total NRC Net Price Calculates total NRC ex Totals.NetPrice =
Amount tended amount as a sum of Sum(Item.ExtendedAmount)
all item extended amounts.
Item Total MRC Extended List Total MRC List Price Calculates item total MRC ex Totals.MrcListPrice =
Price tended list price as a sum of Sum(Item.MRCExtended
all item MRC extended list ListPrice)
prices.
Item Total MRC Extended Total MRC Net Price Calculates item total MRC ex Totals.MrcNetPrice =
Amount tended amount as a sum of Sum(Item.MRCExtendedA
all item MRC extended mount)
amounts.
Item Total MRC Amount Total MRC Amount Calculates total MRC amount Totals.MrcAmount = To
as a sum of all item MRC ex tals.MrcNetPrice
tended amounts.
Item Total NRC Extended Total Cost Calculates item total NRC ex Totals.Cost = Sum(Item.Ex
Cost tended cost as a sum of all tendedCost)
item extended costs.
Item Total NRC Extended Total Product Discount Calculates item total NRC ex Totals.ProductDiscountA
Amount Amount tended amount from total mount = Totals.ListPrice - To
net price. tals.NetPrice
Item Total NRC Discount Total Average Product Dis Calculates item total NRC Totals.AverageProductDis
Percent count Percent discount percent from total countPercent = 100 * To
product discount amount. tals.ProductDiscountA
mount / Totals.ListPrice
Item Total MRC Extended Total MRC Cost Calculates total MRC ex Totals.MrcCost =
Cost tended cost as a sum of all Sum(Item.MRCExtended
item MRC extended costs. Cost)
Item Total MRC Extended Total MRC Product Discount Calculates item total MRC ex Totals.MrcProductDiscoun
Amount Amount tended amount from total tAmount = Totals.MrcList
MRC net price. Price - Totals.MrcNetPrice
Item Total MRC Discount Total Average MRC Product Calculates item total MRC Totals.AverageMrcProduct
Percent Discount Percent discount percent from MRC DiscountPercent = 100 * To
product discount amount. tals.MrcProductDiscountA
mount / Totals.MrcListPrice
MRC Manufactures Gross Total MRC Gross Margin Per Calculates total MRC manu Totals.MrcGrossMarginPer
Margin cent factures gross margin from cent = 100 * (Totals.MrcNet
MRC net price. Price - Totals.MrcCost) / To
tals.MrcNetPrice
On the Editing tab, you can select the quote fields that that are editable, the permission groups that are able to
edit them and the status of the quotes in which the fields are editable. By default, all fields on quotes are read-
only until their editability is defined.
When you access the Editing tab, only permission groups are displayed in the Select Permission Group column.
After selecting a permission group, quote statuses display in the Select Quote Status column. Similarly, once a
status is selected, fields show up in the Select Fields column. The selected fields are automatically moved to
the Selected Items section. To deselect an item, either click on it or click in the column title.
Multiple selection of permission groups and quote statuses isn’t enabled so you have to define field editability
for each permission group/status separately. Clicking Default Settings in a respective column applies the
selection to all permission groups or statuses.
If you want the same fields that are editable for a permission group/quote status pair to be editable for another
permission group/status pair, click Apply field selections from. A pop-up displays enabling you to search the
permission group and the quote status.
Note
The logic between multiple permission groups is OR (if a user belongs to multiple permission groups, and if
editing a field is enabled for only one of the groups, the user has the right to edit that field).
Default editing settings allow administrators to select fields that are editable for all permission group/status
pairs by default until administrators select other fields. The purpose of the default settings is to cover the
scenarios in which the administrator hasn’t defined what fields are editable for a permission group or a status,
or both.
The procedure provides step-by-step instructions on how to define default settings for all permission groups
and all quote statuses.
After defining default settings that all permission group/status pairs inherit, selecting a pair and clicking Save
breaks the link between the default settings and the respective pair. All future changes made to the default
settings won’t apply to the respective pair.
Tip
Default settings apply to permission group/status pairs only before any other change is made. For example,
if default fields are selected for a pair and you deselect one of the fields and select two others fields, you
can’t apply the default settings again. You can only select fields manually.
To decide what quote fields are editable for a user, the system first looks for the fields that are selected in Quote
Fields and Calculation > Editing for that permission group and the status of the current quote. If no fields are
selected, the system looks for fields that are selected for that permission group and all quote statuses.
Similarly, if no fields are selected for the permission group, the system looks which fields are selected for that
quote status. Consequently, if no fields are selected neither for the permission group nor the status, the default
fields are editable to the user.
The system follows this workflow after default settings have been applied and before any other change on the
selected fields has been made for a permission group/status.
When a new item is added to a quote or an existing item is updated with new configuration, these calculations
are triggered in the following order:
Item NRC Extended List Price Calculates item NRC extended list price Item.ExtendedListPrice = Item.ListPrice
from item NRC list price and quantity. * Item.Quantity
Item NRC Discount Amount (from NRC Calculates item NRC discount amount Item.DiscountAmount = Item.ListPrice
discount percent) from NRC discount percent. NRC dis * Item.Quantity * Item.DiscountPer
count amount also includes item quan cent / 100
tity.
Item NRC Net Price Calculates item NRC net price from item.NetPrice = item.ListPrice * (1 -
item discount percent. item.DiscountPercent / 100)
Item NRC Extended Amount Calculates item NRC extended amount Item.ExtendedAmount = Item.NetPrice
from item net price and quantity. * Item.Quantity
Item NRC Extended Cost Calculates item NRC extended cost item.ExtendedCost = item.Cost *
from item NRC cost and quantity. item.Quantity
Item NRC Gross Margin Percent Calculates item NRC gross margin per Item.GrossMarginPercent = 100 *
cent from item NRC extended amount (Item.ExtendedAmount - Item.Exten
and item NRC extended cost. dedCost) / Item.ExtendedAmount
Product Type List Price Calculates NRX extended list price as a ListPrice = Sum(Item.ExtendedList
sum of all item extended list prices. Price)
Product Type NRC Net Price Calculates NRC net price as a sum of all NetPrice = Sum(Item.ExtendedA
item extended amounts. mount)
Product Type Discount Amount Calculates NRC discount amount from ProductType.DiscountAmount = Pro
product type NRC net price. ductType.ListPrice - ProductType.Net
Price
Product Type NRC Discount Percent Calculates product type NRC discount ProductType.DiscountPercent = 100 *
percent from product type NRC dis ProductType.DiscountAmount / Pro
count amount. ductType.ListPrice
Product Type NRC Cost Calculates NRC extended cost as a sum Cost = Sum(Item.ExtendedCost)
of all item NRC extended costs.
Product Type Gross Margin Percent Calculates NRC manufactures gross ProductType.GrossMarginPercent =
margin from product type net price. 100 * (ProductType.NetPrice - Product
Type.Cost) / ProductType.NetPrice
Total NRC List Price Calculates total NRC extended list price Totals.ListPrice = Sum(Item.Extended
as a sum of all item extended list prices. ListPrice)
Total NRC Net Price Calculates total NRC extended amount Totals.NetPrice = Sum(Item.Extende
as a sum of all item extended amounts. dAmount)
Total Product Discount Amount Calculates item total NRC extended Totals.ProductDiscountAmount = To
amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total NRC discount per Totals.AverageProductDiscountPercent
cent from total product discount = 100 * Totals.ProductDiscountA
amount. mount / Totals.ListPrice
Total MRC Gross Margin Percent Calculates total MRC manufactures Totals.MrcGrossMarginPercent = 100 *
gross margin from MRC net price. (Totals.MrcNetPrice - Totals.MrcCost) /
Totals.MrcNetPrice
Item MRC Extended List Price Calculates item MRC extended list price Item.MrcExtendedListPrice =
from item MRC list price and quantity. Item.MrcListPrice * Item.Quantity
Item MRC Discount Amount (from MRC Calculates item MRC discount amount Item.MrcDiscountAmount =
discount percent) from item MRC discount percent. Item.MrcListPrice * Item.MrcDiscount
Percent / 100
Item MRC Discount Amount (from MRC Calculates item MRC discount amount Item.MrcDiscountAmount =
discount percent) from item MRC discount percent. Item.MrcListPrice * Item.MrcDiscount
Percent / 100
Item MRC Extended Amount Calculates item MRC extended amount Item.MrcExtendedAmount =
from item MRC net price and quantity. Item.MrcNetPrice * Item.Quantity
Item MRC Extended Cost Calculates item MRC extended cost Item.MrcExtendedCost = Item.MrcCost
from item MRC cost and quantity. * Item.Quantity
Item MRC Gross Margin Percent Calculates item MRC gross margin per Item.MrcGrossMarginPercent = 100 *
cent from item MRC extended amount (Item.MrcExtendedAmount -
and item MRC extended cost. Item.MrcExtendedCost) / MrcExtende
dAmount
Product Type MRC List Price Calculates product type MRC list price ProductType.MrcListPrice =
as a sum of all item MRC extended list Sum(Item.MRCExtendedListPrice)
prices.
Product Type MRC Net Price Calculates MRC extended amount as a ProductType.MrcNetPrice =
sum of all item MRC extended amounts. Sum(Item.MRCExtendedAmount)
Product Type MRC Discount Amount Calculates MRC discount amount from ProductType.MrcDiscountAmount =
MRC net price. ProductType.MrcListPrice - Product
Type.MrcNetPrice
Product Type MRC Discount Percent Calculates product type MRC discount ProductType.MrcDiscountPercent =
percent from product type MRC dis ProductType.MrcDiscountAmount /
count amount. ProductType.MrcListPrice
Product Type MRC Gross Margin Percent Calculates MRC manufactures gross ProductType.MrcGrossMarginPercent =
margin from product MRC net price. 100 * (ProductType.MrcNetPrice - Pro
ductType.MrcCost) / Product
Type.MrcNetPrice
Total MRC List Price Calculates item total MRC extended list Totals.MrcListPrice =
price as a sum of all item MRC ex Sum(Item.MRCExtendedListPrice)
tended list prices.
Total MRC Net Price Calculates item total MRC extended Totals.MrcNetPrice =
amount as a sum of all item MRC ex Sum(Item.MRCExtendedAmount)
tended amounts.
Total MRC Amount Calculates total MRC amount as a sum Totals.MrcAmount = Totals.MrcNet
of all item MRC extended amounts. Price
Total MRC Cost Calculates total MRC extended cost as Totals.MrcCost = Sum(Item.MRCExten
a sum of all item MRC extended costs. dedCost)
Total MRC Product Discount Amount Calculates item total MRC extended Totals.MrcProductDiscountAmount =
amount from total MRC net price. Totals.MrcListPrice - Totals.MrcNet
Price
Total Average MRC Product Discount Calculates item total MRC discount per Totals.AverageMrcProductDiscountPer
Percent cent from MRC product discount cent = 100 * Totals.MrcProductDis
amount. countAmount / Totals.MrcListPrice
Total MRC Gross Margin Percent Calculates total MRC manufactures Totals.MrcGrossMarginPercent = 100 *
gross margin from MRC net price. (Totals.MrcNetPrice - Totals.MrcCost) /
Totals.MrcNetPrice
Click on a field to see the default order of calculations that trigger once the value of the respective field is
changed. For each field, you will see the name of the calculation as defined in Quote Fields and Calculations, the
description of the calculation and the mathematical formula used for calculating the value.
Item NRC Discount Percent (from NRC Calculates item NRC discount percent Item.NrcDiscountPercent = 100 - 100 *
Extended Amount) from item NRC extended amount, NRC Item.NrcExtendedAmount /
list price and quantity. Item.NrcListPrice * Item.Quantity
Item NRC Net Price Calculates item NRC net price from item.NetPrice = item.ListPrice * (1 -
item list price and item discount per item.DiscountPercent / 100)
cent.
Item NRC Extended Amount Calculates item NRC extended amount Item.ExtendedAmount = Item.NetPrice
from item net price and quantity. * Item.Quantity
Product type Net Price Calculates product type net price as a ProductType.NetPrice = Sum(Item.Ex
sum of all item extended amounts. tendedAmount)
Product Type Discount Amount Calculates NRC discount amount from ProductType.DiscountAmount = Pro
product type NRC net price. ductType.ListPrice - ProductType.Net
Price
Product Type NRC Discount Percent Calculates product type NRC discount ProductType.DiscountPercent = 100 *
percent from product type NRC dis ProductType.DiscountAmount / Pro
count amount. ductType.ListPrice
Total NRC Net Price Calculates total NRC extended amount Totals.NetPrice = Sum(Item.Extende
as a sum of all item extended amounts. dAmount)
Total Product Discount Amount Calculates item total NRC extended Totals.ProductDiscountAmount = To
amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total NRC discount per Totals.AverageProductDiscountPercent
cent from total product discount = 100 * Totals.ProductDiscountA
amount. mount / Totals.ListPrice
Item Gross Margin Percent Calculates item gross margin percent Item.GrossMarginPercent = 100 *
from item extended amount and item (Item.ExtendedAmount - Item.Exten
extended cost. dedCost) / Item.ExtendedAmount
Product Type Gross Margin Percent Calculates NRC manufactures gross ProductType.GrossMarginPercent =
margin from product type net price. 100 * (ProductType.NetPrice - Product
Type.Cost) / ProductType.NetPrice
Total Average Gross Margin Percent Calculates item total MRC manufac Totals.MrcGrossMarginPercent = 100 *
tures gross margin from total MRC net (Totals.MrcNetPrice - Totals.MrcCost) /
price and total mrc cost. Totals.MrcNetPrice
Item NRC Discount Amount (from NRC Calculates item NRC discount amount Item.DiscountAmount = Item.ListPrice
discount percent) from NRC discount percent. NRC dis * Item.Quantity * Item.DiscountPer
count amount also includes item quan cent / 100
tity.
Item NRC Net Price Calculates item NRC net price from item.NetPrice = item.ListPrice * (1 -
item discount percent. item.DiscountPercent / 100)
Item NRC Extended Amount Calculates item NRC extended amount Item.ExtendedAmount = Item.NetPrice
from item net price and quantity. * Item.Quantity
Product Type NRC Net Price Calculates NRC net price as a sum of all NetPrice = Sum(Item.ExtendedA
item extended amounts. mount)
Product Type Discount Amount Calculates NRC discount amount from ProductType.DiscountAmount = Pro
product type NRC net price. ductType.ListPrice - ProductType.Net
Price
Product Type NRC Discount Percent Calculates product type NRC discount ProductType.DiscountPercent = 100 *
percent from product type NRC dis ProductType.DiscountAmount / Pro
count amount. ductType.ListPrice
Total NRC Net Price Calculates total NRC extended amount Totals.NetPrice = Sum(Item.Extende
as a sum of all item extended amounts. dAmount)
Total Product Discount Amount Calculates item total NRC extended Totals.ProductDiscountAmount = To
amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total NRC discount per Totals.AverageProductDiscountPercent
cent from total product discount = 100 * Totals.ProductDiscountA
amount. mount / Totals.ListPrice
Item NRC Gross Margin Percent Calculates item NRC gross margin per Item.GrossMarginPercent = 100 *
cent from item NRC extended amount (Item.ExtendedAmount - Item.Exten
and item NRC extended cost. dedCost) / Item.ExtendedAmount
Product Type Gross Margin Percent Calculates NRC manufactures gross ProductType.GrossMarginPercent =
margin from product type net price. 100 * (ProductType.NetPrice - Product
Type.Cost) / ProductType.NetPrice
Total MRC Gross Margin Percent Calculates item total MRC manufac Totals.MrcGrossMarginPercent = 100 *
tures gross margin from MRC net price. (Totals.MrcNetPrice - Totals.MrcCost) /
Totals.MrcNetPrice
Item NRC Discount Amount (from NRC Calculates item NRC discount amount Item.DiscountAmount = Item.ListPrice
discount percent) from NRC discount percent. NRC dis * Item.Quantity * Item.DiscountPer
count amount also includes item quan cent / 100
tity.
Item NRC Discount Percent (from Calculates item NRC discount percent Item.DiscountPercent = 100 * Item.Dis
Discount Amount) from item discount amount. countAmount / Item.ListPrice
Item NRC Net Price Calculates item NRC net price from item.NetPrice = item.ListPrice * (1 -
item list price and item discount per item.DiscountPercent / 100)
cent.
Item NRC Extended Amount Calculates item NRC extended amount Item.ExtendedAmount = Item.NetPrice
from item net price and quantity. * Item.Quantity
Product Type NRC Net Price Calculates NRC net price as a sum of all NetPrice = Sum(Item.ExtendedA
item extended amounts. mount)
Product type discount amount Calculates NRC discount amount from ProductType.DiscountAmount = Pro
product type NRC net price. ductType.ListPrice - ProductType.Net
Price
Product Type NRC Discount Percent Calculates product type NRC discount ProductType.DiscountPercent = 100 *
percent from product type NRC dis ProductType.DiscountAmount / Pro
count amount. ductType.ListPrice
Total NRC Net Price Calculates total NRC extended amount Totals.NetPrice = Sum(Item.Extende
as a sum of all item extended amounts. dAmount)
Total Product Discount Amount Calculates item total NRC extended Totals.ProductDiscountAmount = To
amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total NRC discount per Totals.AverageProductDiscountPercent
cent from total product discount = 100 * Totals.ProductDiscountA
amount. mount / Totals.ListPrice
Item NRC Gross Margin Percent Calculates item NRC gross margin per Item.GrossMarginPercent = 100 *
cent from item NRC extended amount (Item.ExtendedAmount - Item.Exten
and item NRC extended cost. dedCost) / Item.ExtendedAmount
Product Type Gross Margin Percent Calculates NRC manufactures gross ProductType.GrossMarginPercent =
margin from product type net price. 100 * (ProductType.NetPrice - Product
Type.Cost) / ProductType.NetPrice
Total Gross Margin Percent Calculates item total manufactures Totals.GrossMarginPercent = 100 * (To
gross margin from net price. tals.NetPrice - Totals.Cost) / Totals.Net
Price
Item NRC Gross Margin Percent (from Calculates item NRC gross margin per Item.GrossMarginPercent = 100 *
Discount Percent) cent from item NRC extended amount (Item.ExtendedAmount - Item.Exten
and item NRC extended cost. dedCost) / Item.ExtendedAmount
Item NRC Discount Amount (from Calculates item NRC discount amount item.DiscountAmount = item.ListPrice
Discount Percent) from item discount percent. * item.Quantity * item.DiscountPer
cent / 100
Item NRC Net Price Calculates item NRC net price from item.NetPrice = item.ListPrice * (1 -
item discount percent. item.DiscountPercent / 100)
Item NRC Extended Amount Calculates item NRC extended amount Item.ExtendedAmount = Item.NetPrice
from item net price and quantity. * Item.Quantity
Product Type NRC Net Price Calculates NRC net price as a sum of all NetPrice = Sum(Item.ExtendedA
item extended amounts. mount)
Product Type Discount Amount Calculates NRC discount amount from ProductType.DiscountAmount = Pro
product type NRC net price. ductType.ListPrice - ProductType.Net
Price
Product Type NRC Discount Percent Calculates product type NRC discount ProductType.DiscountPercent = 100 *
percent from product type NRC dis ProductType.DiscountAmount / Pro
count amount. ductType.ListPrice
Total NRC Net Price Calculates total NRC extended amount Totals.NetPrice = Sum(Item.Extende
as a sum of all item extended amounts. dAmount)
Total Product Discount Amount Calculates item total NRC extended Totals.ProductDiscountAmount = To
amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total NRC discount per Totals.AverageProductDiscountPercent
cent from total product discount = 100 * Totals.ProductDiscountA
amount. mount / Totals.ListPrice
Product Type Gross Margin Percent Calculates NRC manufactures gross ProductType.GrossMarginPercent =
margin from product type net price. 100 * (ProductType.NetPrice - Product
Type.Cost) / ProductType.NetPrice
Total NRC Gross Margin Percent Calculates total NRC manufactures Totals.NrcGrossMarginPercent = 100 *
gross margin from NRC net price. (Totals.NrcNetPrice - Totals.NrcCost) /
Totals.NrcNetPrice
Item MRC Discount Percent (from MRC Calculates item MRC discount percent Item.MrcDiscountPercent = 100 *
Discount Amount) from item MRC discount amount. Item.MrcDiscountAmount /
Item.MrcListPrice
Item MRC Net Price Calculates item MRC net price from Item.MrcNetPrice = Item.MrcListPrice -
MRC discount amount. Item.MrcDiscountAmount
Item MRC Extended Amount Calculates item MRC extended amount Item.MrcExtendedAmount =
from item MRC net price and quantity. Item.MrcNetPrice * Item.Quantity
Product Type MRC Net Price Calculates MRC extended amount as a ProductType.MrcNetPrice =
sum of all item MRC extended amounts. Sum(Item.MRCExtendedAmount)
Product Type MRC Discount Amount Calculates MRC discount amount from ProductType.MrcDiscountAmount =
MRC net price. ProductType.MrcListPrice - Product
Type.MrcNetPrice
Product Type MRC Discount Percent Calculates product type MRC discount ProductType.MrcDiscountPercent =
percent from product type MRC dis ProductType.MrcDiscountAmount /
count amount. ProductType.MrcListPrice
Total MRC Net Price Calculates item total MRC extended Totals.MrcNetPrice =
amount as a sum of all item MRC ex Sum(Item.MRCExtendedAmount)
tended amounts.
Total MRC Amount Calculates total MRC amount as a sum Totals.MrcAmount = Totals.MrcNet
of all item MRC extended amounts. Price
Total MRC Product Discount Amount Calculates item total MRC extended Totals.MrcProductDiscountAmount =
amount from total MRC net price. Totals.MrcListPrice - Totals.MrcNet
Price
Total Average MRC Product Discount Calculates item total MRC discount per Totals.AverageMrcProductDiscountPer
Percent cent from MRC product discount cent = 100 * Totals.MrcProductDis
amount. countAmount / Totals.MrcListPrice
Item MRC Gross Margin Percent Calculates item MRC gross margin per Item.MrcGrossMarginPercent = 100 *
cent from item MRC extended amount (Item.MrcExtendedAmount -
and item MRC extended cost. Item.MrcExtendedCost) / MrcExtende
dAmount
Product Type MRC Gross Margin Percent Calculates MRC manufactures gross ProductType.MrcGrossMarginPercent =
margin from product MRC net price. 100 * (ProductType.MrcNetPrice - Pro
ductType.MrcCost) / Product
Type.MrcNetPrice
Total MRC Gross Margin Percent Calculates total MRC manufactures Totals.MrcGrossMarginPercent = 100 *
gross margin from MRC net price. (Totals.MrcNetPrice - Totals.MrcCost) /
Totals.MrcNetPrice
Item MRC Discount Amount (from MRC Calculates item MRC discount amount Item.DiscountAmount = Item.ListPrice
discount percent) from MRC discount percent. MRC dis * Item.Quantity * Item.DiscountPer
count amount also includes item quan cent / 100
tity.
Item MRC Net Price Calculates item MRC net price from Item.MrcNetPrice = Item.MrcListPrice -
MRC discount amount. Item.MrcDiscountAmount
Item MRC Extended Amount Calculates item MRC extended amount Item.MrcExtendedAmount =
from item MRC net price and quantity. Item.MrcNetPrice * Item.Quantity
Product Type MRC Net Price Calculates MRC extended amount as a ProductType.MrcNetPrice =
sum of all item MRC extended amounts. Sum(Item.MRCExtendedAmount)
Product Type MRC Discount Amount Calculates MRC discount amount from ProductType.MrcDiscountAmount =
MRC net price. ProductType.MrcListPrice - Product
Type.MrcNetPrice
Product Type MRC Discount Percent Calculates product type MRC discount ProductType.MrcDiscountPercent =
percent from product type MRC dis ProductType.MrcDiscountAmount /
count amount. ProductType.MrcListPrice
Total MRC Net Price Calculates item total MRC extended Totals.MrcNetPrice =
amount as a sum of all item MRC ex Sum(Item.MRCExtendedAmount)
tended amounts.
Total MRC Amount Calculates total MRC amount as a sum Totals.MrcAmount = Totals.MrcNet
of all item MRC extended amounts. Price
Total MRC Product Discount Amount Calculates item total MRC extended Totals.MrcProductDiscountAmount =
amount from total MRC net price. Totals.MrcListPrice - Totals.MrcNet
Price
Total Average MRC Product Discount Calculates item total MRC discount per Totals.AverageMrcProductDiscountPer
Percent cent from MRC product discount cent = 100 * Totals.MrcProductDis
amount. countAmount / Totals.MrcListPrice
Item MRC Gross Margin Percent Calculates item MRC gross margin per Item.MrcGrossMarginPercent = 100 *
cent from item MRC extended amount (Item.MrcExtendedAmount -
and item MRC extended cost. Item.MrcExtendedCost) / MrcExtende
dAmount
Product Type MRC Gross Margin Percent Calculates MRC manufactures gross ProductType.MrcGrossMarginPercent =
margin from product MRC net price. 100 * (ProductType.MrcNetPrice - Pro
ductType.MrcCost) / Product
Type.MrcNetPrice
Total MRC Gross Margin Percent Calculates total MRC manufactures Totals.MrcGrossMarginPercent = 100 *
gross margin from MRC net price. (Totals.MrcNetPrice - Totals.MrcCost) /
Totals.MrcNetPrice
Item MRC Discount Amount (from MRC Calculates item MRC discount amount Item.MrcDiscountAmount =
extended amount) from MRC extended amount. Item.MrcListPrice - Item.MrcExtende
dAmount / Item.Quantity
Item MRC Discount Percent (from MRC Calculates item MRC discount percent Item.MrcDiscountPercent = 100 *
Discount Amount) from item MRC discount amount. Item.MrcDiscountAmount /
Item.MrcListPrice
Item MRC Net Price Calculates item MRC net price from Item.MrcNetPrice = Item.MrcListPrice -
MRC discount amount. Item.MrcDiscountAmount
Item MRC Extended Amount Calculates item MRC extended amount Item.MrcExtendedAmount =
from item MRC net price and quantity. Item.MrcNetPrice * Item.Quantity
Product Type MRC Net Price Calculates MRC extended amount as a ProductType.MrcNetPrice =
sum of all item MRC extended amounts. Sum(Item.MRCExtendedAmount)
Product Type MRC Discount Amount Calculates MRC discount amount from ProductType.MrcDiscountAmount =
MRC net price. ProductType.MrcListPrice - Product
Type.MrcNetPrice
Product Type MRC Discount Percent Calculates product type MRC discount ProductType.MrcDiscountPercent =
percent from product type MRC dis ProductType.MrcDiscountAmount /
count amount. ProductType.MrcListPrice
Total MRC Net Price Calculates item total MRC extended Totals.MrcNetPrice =
amount as a sum of all item MRC ex Sum(Item.MRCExtendedAmount)
tended amounts.
Total MRC Amount Calculates total MRC amount as a sum Totals.MrcAmount = Totals.MrcNet
of all item MRC extended amounts. Price
Total MRC Product Discount Amount Calculates item total MRC extended Totals.MrcProductDiscountAmount =
amount from total MRC net price. Totals.MrcListPrice - Totals.MrcNet
Price
Total Average MRC Product Discount Calculates item total MRC discount per Totals.AverageMrcProductDiscountPer
Percent cent from MRC product discount cent = 100 * Totals.MrcProductDis
amount. countAmount / Totals.MrcListPrice
Item MRC Gross Margin Percent Calculates item MRC gross margin per Item.MrcGrossMarginPercent = 100 *
cent from item MRC extended amount (Item.MrcExtendedAmount -
and item MRC extended cost. Item.MrcExtendedCost) / MrcExtende
dAmount
Product Type MRC Gross Margin Percent Calculates MRC manufactures gross ProductType.MrcGrossMarginPercent =
margin from product MRC net price. 100 * (ProductType.MrcNetPrice - Pro
ductType.MrcCost) / Product
Type.MrcNetPrice
Total MRC Gross Margin Percent Calculates total MRC manufactures Totals.MrcGrossMarginPercent = 100 *
gross margin from MRC net price. (Totals.MrcNetPrice - Totals.MrcCost) /
Totals.MrcNetPrice
Item MRC Gross Margin Percent (from Calculates item MRC gross margin per Item.GrossMarginPercent = 100 *
MRC Discount Percent) cent from item MRC extended amount (Item.ExtendedAmount - Item.Exten
and item MRC extended cost. dedCost) / Item.ExtendedAmount
Item MRC Discount Amount (from MRC Calculates item MRC discount amount item.DiscountAmount = item.ListPrice
Discount Percent) from item MRC discount percent. * item.Quantity * item.DiscountPer
cent / 100
Item MRC Net Price Calculates item MRC net price from Item.MrcNetPrice = Item.MrcListPrice -
MRC discount amount. Item.MrcDiscountAmount
Item MRC Extended Amount Calculates item MRC extended amount Item.MrcExtendedAmount =
from item MRC net price and quantity. Item.MrcNetPrice * Item.Quantity
Product Type MRC Net Price Calculates MRC extended amount as a ProductType.MrcNetPrice =
sum of all item MRC extended amounts. Sum(Item.MRCExtendedAmount)
Product Type MRC Discount Amount Calculates MRC discount amount from ProductType.MrcDiscountAmount =
MRC net price. ProductType.MrcListPrice - Product
Type.MrcNetPrice
Product Type MRC Discount Percent Calculates product type MRC discount ProductType.MrcDiscountPercent =
percent from product type MRC dis ProductType.MrcDiscountAmount /
count amount. ProductType.MrcListPrice
Total MRC Amount Calculates total MRC amount as a sum Totals.MrcAmount = Totals.MrcNet
of all item MRC extended amounts. Price
Total MRC Product Discount Amount Calculates item total MRC extended Totals.MrcProductDiscountAmount =
amount from total MRC net price. Totals.MrcListPrice - Totals.MrcNet
Price
Total Average MRC Product Discount Calculates item total MRC discount per Totals.AverageMrcProductDiscountPer
Percent cent from MRC product discount cent = 100 * Totals.MrcProductDis
amount. countAmount / Totals.MrcListPrice
Product Type MRC Gross Margin Percent Calculates MRC manufactures gross ProductType.MrcGrossMarginPercent =
margin from product MRC net price. 100 * (ProductType.MrcNetPrice - Pro
ductType.MrcCost) / Product
Type.MrcNetPrice
Total MRC Gross Margin Percent Calculates total MRC manufactures Totals.MrcGrossMarginPercent = 100 *
gross margin from MRC net price. (Totals.MrcNetPrice - Totals.MrcCost) /
Totals.MrcNetPrice
Item MRC Discount Amount (from MRC Calculates item MRC discount percent Item.MrcDiscountAmount =
net price) from item MRC net price. Item.MrcListPrice - Item.MrcNetPrice
Item MRC Discount Percent (from MRC Calculates item MRC discount percent Item.MrcDiscountPercent = 100 *
Discount Amount) from item MRC discount amount. Item.MrcDiscountAmount /
Item.MrcListPrice
Item MRC Extended Amount Calculates item MRC extended amount Item.MrcExtendedAmount =
from item MRC net price and quantity. Item.MrcNetPrice * Item.Quantity
Product Type MRC Net Price Calculates MRC extended amount as a ProductType.MrcNetPrice =
sum of all item MRC extended amounts. Sum(Item.MRCExtendedAmount)
Product Type MRC Discount Amount Calculates MRC discount amount from ProductType.MrcDiscountAmount =
MRC net price. ProductType.MrcListPrice - Product
Type.MrcNetPrice
Product Type MRC Discount Percent Calculates product type MRC discount ProductType.MrcDiscountPercent =
percent from product type MRC dis ProductType.MrcDiscountAmount /
count amount. ProductType.MrcListPrice
Total MRC Net Price Calculates item total MRC extended Totals.MrcNetPrice =
amount as a sum of all item MRC ex Sum(Item.MRCExtendedAmount)
tended amounts.
Total MRC Amount Calculates total MRC amount as a sum Totals.MrcAmount = Totals.MrcNet
of all item MRC extended amounts. Price
Total MRC Product Discount Amount Calculates item total MRC extended Totals.MrcProductDiscountAmount =
amount from total MRC net price. Totals.MrcListPrice - Totals.MrcNet
Price
Total Average MRC Product Discount Calculates item total MRC discount per Totals.AverageMrcProductDiscountPer
Percent cent from MRC product discount cent = 100 * Totals.MrcProductDis
amount. countAmount / Totals.MrcListPrice
Item MRC Gross Margin Percent Calculates item MRC gross margin per Item.MrcGrossMarginPercent = 100 *
cent from item MRC extended amount (Item.MrcExtendedAmount -
and item MRC extended cost. Item.MrcExtendedCost) / MrcExtende
dAmount
Product Type MRC Gross Margin Percent Calculates MRC manufactures gross ProductType.MrcGrossMarginPercent =
margin from product MRC net price. 100 * (ProductType.MrcNetPrice - Pro
ductType.MrcCost) / Product
Type.MrcNetPrice
Total MRC Gross Margin Percent Calculates total MRC manufactures Totals.MrcGrossMarginPercent = 100 *
gross margin from MRC net price. (Totals.MrcNetPrice - Totals.MrcCost) /
Totals.MrcNetPrice
Item NRC Discount Amount (from NRC Calculates item NRC discount amount Item.DiscountAmount = Item.ListPrice
net price) from item net price. - Item.NetPrice
Item NRC Discount Percent (from Calculates item NRC discount percent Item.DiscountPercent = 100 * Item.Dis
Discount Amount) from item discount amount. countAmount / Item.ListPrice
Item NRC Extended Amount Calculates item NRC extended amount Item.ExtendedAmount = Item.NetPrice
from item net price and quantity. * Item.Quantity
Product Type NRC Net Price Calculates NRC net price as a sum of all NetPrice = Sum(Item.ExtendedA
item extended amounts. mount)
Product Type Discount Amount Calculates NRC discount amount from ProductType.DiscountAmount = Pro
product type NRC net price. ductType.ListPrice - ProductType.Net
Price
Product Type NRC Discount Percent Calculates product type NRC discount ProductType.DiscountPercent = 100 *
percent from product type NRC dis ProductType.DiscountAmount / Pro
count amount. ductType.ListPrice
Total NRC Net Price Calculates total NRC extended amount Totals.NetPrice = Sum(Item.Extende
as a sum of all item extended amounts. dAmount)
Total Product Discount Amount Calculates item total NRC extended Totals.ProductDiscountAmount = To
amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total NRC discount per Totals.AverageProductDiscountPercent
cent from total product discount = 100 * Totals.ProductDiscountA
amount. mount / Totals.ListPrice
Item Gross Margin Percent Calculates item gross margin percent Item.GrossMarginPercent = 100 *
from item extended amount and item (Item.ExtendedAmount - Item.Exten
extended cost. dedCost) / Item.ExtendedAmount
Product Type Gross Margin Percent Calculates NRC manufactures gross ProductType.GrossMarginPercent =
margin from product type net price. 100 * (ProductType.NetPrice - Product
Type.Cost) / ProductType.NetPrice
Total Average Gross Margin Percent Calculates total average gross margin Totals.GrossMarginPercent = 100 * (To
percent from total net price and total tals.NetPrice - Totals.Cost) / Totals.Net
cost. Price
Item NRC Extended List Price Calculates item NRC extended list price Item.ExtendedListPrice = Item.ListPrice
from item NRC list price and quantity. * Item.Quantity
Item NRC Extended Amount Calculates item NRC extended amount Item.ExtendedAmount = Item.NetPrice
from item net price and quantity. * Item.Quantity
Item NRC Extended Cost Calculates item NRC extended cost Item.ExtendedCost = item.Cost *
from item NRC cost and quantity. item.Quantity
Item NRC Discount Amount (from NRC Calculates item NRC discount amount Item.DiscountAmount = Item.ListPrice
discount percent) from NRC discount percent. NRC dis * Item.Quantity * Item.DiscountPer
count amount also includes item quan cent / 100
tity.
Product Type NRC Net Price Calculates NRC net price as a sum of all NetPrice = Sum(Item.ExtendedA
item extended amounts. mount)
Product Type List Price Calculates NRC extended list price as a ListPrice = Sum(Item.ExtendedList
sum of all item extended list prices. Price)
Product Type Discount Amount Calculates NRC discount amount from ProductType.DiscountAmount = Pro
product type NRC net price. ductType.ListPrice - ProductType.Net
Price
Product Type NRC Discount Percent Calculates product type NRC discount ProductType.DiscountPercent = 100 *
percent from product type NRC dis ProductType.DiscountAmount / Pro
count amount. ductType.ListPrice
Product Type NRC Cost Calculates NRC extended cost as a sum Cost = Sum(Item.ExtendedCost)
of all item NRC extended costs.
Product Type Product Model Price Calculates product model price by mul ProductType.ProductModelPrice =
tiplying quantity by product model Sum(Item.Quantity * Item.ProductMo
price. delPrice)
Total NRC List Price Calculates total NRC extended list price Totals.ListPrice = Sum(Item.Extended
as a sum of all item extended list prices. ListPrice)
Total NRC Net Price Calculates total NRC extended amount Totals.NetPrice = Sum(Item.Extende
as a sum of all item extended amounts. dAmount)
Item MRC Extended List Price Calculates item MRC extended list price Item.MrcExtendedListPrice =
from item MRC list price and quantity. Item.MrcListPrice * Item.Quantity
Item MRC Discount Percent (from MRC Calculates item MRC discount percent Item.MrcDiscountPercent = 100 - 100 *
Extended Amount) from item MRC extended amount. Item.MrcExtendedAmount /
Item.MrcListPrice * Item.Quantity
Item MRC Extended Cost Calculates item MRC extended cost Item.MrcExtendedCost = Item.MrcCost
from item MRC cost and quantity. * Item.Quantity
Product Type MRC Net Price Calculates MRC extended amount as a ProductType.MrcNetPrice =
sum of all item MRC extended amounts. Sum(Item.MRCExtendedAmount)
Product Type MRC List Price Calculates product type MRC list price ProductType.MrcListPrice =
as a sum of all item MRC extended list Sum(Item.MRCExtendedListPrice)
prices.
Product Type MRC Discount Amount Calculates MRC discount amount from ProductType.MrcDiscountAmount =
MRC net price. ProductType.MrcListPrice - Product
Type.MrcNetPrice
Product Type MRC Discount Percent Calculates product type MRC discount ProductType.MrcDiscountPercent =
percent from product type MRC dis ProductType.MrcDiscountAmount /
count amount. ProductType.MrcListPrice
Total MRC List Price Calculates item total MRC extended list Totals.MrcListPrice =
price as a sum of all item MRC ex Sum(Item.MRCExtendedListPrice)
tended list prices.
Total MRC Net Price Calculates item total MRC extended Totals.MrcNetPrice =
amount as a sum of all item MRC ex Sum(Item.MRCExtendedAmount)
tended amounts.
Total MRC Amount Calculates total MRC amount as a sum Totals.MrcAmount = Totals.MrcNet
of all item MRC extended amounts. Price
Total Product Discount Amount Calculates item total NRC extended Totals.ProductDiscountAmount = To
amount from total net price. tals.ListPrice - Totals.NetPrice
Total Average Product Discount Percent Calculates item total NRC discount per Totals.AverageProductDiscountPercent
cent from total product discount = 100 * Totals.ProductDiscountA
amount. mount / Totals.ListPrice
Total MRC Product Discount Amount Calculates item total MRC extended Totals.MrcProductDiscountAmount =
amount from total MRC net price. Totals.MrcListPrice - Totals.MrcNet
Price
Total Average MRC Product Discount Calculates item total MRC discount per Totals.AverageMrcProductDiscountPer
Percent cent from MRC product discount cent = 100 * Totals.MrcProductDis
amount. countAmount / Totals.MrcListPrice
Total MRC Cost Calculates total MRC extended cost as Totals.MrcCost = Sum(Item.MRCExten
a sum of all item MRC extended costs. dedCost)
Item MRC Gross Margin Percent Calculates item MRC gross margin per Item.MrcGrossMarginPercent = 100 *
cent from item MRC extended amount (Item.MrcExtendedAmount -
and item MRC extended cost. Item.MrcExtendedCost) / MrcExtende
dAmount
Item NRC Gross Margin Percent Calculates item NRC gross margin per Item.GrossMarginPercent = 100 *
cent from item NRC extended amount (Item.ExtendedAmount - Item.Exten
and item NRC extended cost. dedCost) / Item.ExtendedAmount
Total Product Model Price Calculates total NRC product model Totals.ProductModelPrice =
price from item product model price Sum(Item.Quantity * Item.ProductMo
and quantity. delPrice)
Product Type Gross Margin Percent Calculates NRC manufactures gross ProductType.GrossMarginPercent =
margin from product type net price. 100 * (ProductType.NetPrice - Product
Type.Cost) / ProductType.NetPrice
Total Average Gross Margin Percent Calculates total average gross margin Totals.GrossMarginPercent = 100 * (To
percent from total net price and total tals.NetPrice - Totals.Cost) / Totals.Net
cost. Price
Product Type MRC Gross Margin Percent Calculates MRC manufactures gross ProductType.MrcGrossMarginPercent =
margin from product MRC net price. 100 * (ProductType.MrcNetPrice - Pro
ductType.MrcCost) / Product
Type.MrcNetPrice
Total Average MRC Gross Margin Calculates total MRC manufactures Totals.MrcGrossMarginPercent = 100 *
Percent gross margin from MRC net price. (Totals.MrcNetPrice - Totals.MrcCost) /
Totals.MrcNetPrice
When handling calculations in Quote 2.0, users can use standard, rolled up and reverse calculations. Unlike
Quote 1.0, Quote 2.0 allows you to handle reverse rolled up calculations.
Rolled up Calculations
The following settings must be performed in the Setup so that the rolled up columns display on quotes for a
user type:
● to have the permission to manage rolled up columns enabled in Quotes Quote Layout Permissions .
Rolled up columns should be moved from available to selected in the Visible Columns section.
● to move the rolled up columns from available to selected in UI Design Quote Layout.
● to have all the columns in one list, either in the list of available or the list of selected columns.
To calculate a rolled up amount of a quote field, add the respective rolled up calculation to the end of the list of
calculations that are executed when the value of that field is changed. The rolled up calculations should also be
added in the list of calculations in Item Add/Update Calculations that are triggered when an item is added to a
quote.
The default rolled up calculations are in the system and they are named accordingly (e.g. Rolled Up Extended
Amount, etc.).
Reverse rolled up calculations are available only in Quote 2.0. This calculation type lets you change the rolled up
amount so that the system would calculate the respective amount for each item.
For example, if you change the rolled up extended amount of a main item, the system will calculate the rolled up
amount of each item and consequently the extended amount of each item.
When a rolled up amount is changed, the discount percent will first change accordingly. From there on, other
calculations will be executed to calculate the amount of each item. In the calculation setup, only the discount
percent calculations are set up by default. Administrators should add subsequent calculations based on their
model of SAP CPQ.
Note
You can set up the calculation order for rolled up fields only for main items. Therefore, line item rolled up
fields should not be editable on quotes.
Reverse Calculations
Reverse calculations in Quote 2.0 let you change the amount in Product Types and Total fields so that the value
in the respective item fields changes accordingly (the discount percent is first changed and then other fields
set up for the calculation).
When integration with SAP Subscription Billing is enabled, the SubscriptionItem section displays in Fields and
Calculations. This section contains only standard quote fields available on quotes when the two applications
are integrated. Subscription products don’t support quote item custom fields.
Quotes with subscription products contain standard quote fields and the standard fields available only for
subscription products. Calculations for the SAP Subscription Billing integration should be managed and set up
in the same way as other calculations in Quote Fields and Calculations [page 213].
These are the standard quote fields and calculations introduced specifically for subscription products:
Contract End Date Subscription Billing - Calcu Calculates end dates from Contract End Date = Start
late End Dates from Start the start date and the con Date + Contract Length
Date and Months tract duration. This calcula (months)
tion is by default present on
the fields Start Date, Item
Effective Date, Contract
Length, and Minimum Term.
One-Time Charge Discount Subscription Billing - Calcu Calculates item NRC net ItemNRCNetPrice =
late Item NRC Net Price from price from one-time charge. SUM(OneTimeChargeList
One-Time Charge Price - OneTimeChargeList
Price* OneTimeChargeDis
countPercent/100)
Recurring Charge Discount Subscription Billing - Calcu Calculates item MRC net ItemMRCNetPrice =
late Item MRC Net Price from price from recurring charge. SUM(RecurringChargeList
Recurring Charge Price - RecurringChargeList
Price*RecurringChargeDis
countPercent/100)
NRC Discount Percent and Subscription Billing - Calcu Calculates one-time charge affectedChargesTotalList-
any fields affecting the dis late One-Time Charge from from item NRC discount per
Price = SUM(OneTimeChar
count percent via calcula Item NRC Discount Percent cent.
geWithDiscountListPrice) -
tions
sum of one-time charge list
prices that could be dis
counted. If affectedCharges-
TotalListPrice is equal to
zero, an error message dis
plays, stating that all one-
time charges have fixed pri
ces and couldn’t be dis
counted.
averageChargeDiscount =
item.ListPrice * item.Dis
countPercent / affected-
ChargesTotalListPrice - Apply
averageChargeDiscount to all
one-time charges that can be
discounted.
MRC Discount Percent Subscription Billing - Calcu Calculates recurring charge affectedChargesTotalMr-
late Recurring Charge from from item MRC discount per
cListPrice = SUM(Recurring
Item MRC Discount Percent cent.
ChargeWithDiscountList
Price) - sum of recurring
charge list prices that could
be discounted. If affected-
ChargesTotalMrcListPrice is
equal to zero, an error mes
sage displays, stating that all
recurring charges have fixed
prices and couldn’t be dis
counted.
averageChargeDiscount =
item.MrcListPrice *
item.MrcDiscountPercent /
affectedChargesTotalMr-
cListPrice - Apply average
ChargeDiscount to all recur
ring charges that can be dis
counted.
In Quote Fields and Calculations, calculations for those SubscriptionItem fields that contain them should be set
in the following order:
Start Date Subscription Billing - Calculate end date from start date and
months
Item Effective Date Subscription Billing - Calculate end date from start date and
months
Contract Length Subscription Billing - Calculate end date from start date and
months
Minimum Term Subscription Billing - Calculate end date from start date and
months
One-Time Charge Discount Subscription Billing - Calculate item NRC net price from one-
time charge
Total Amount
Recurring Charge Discount Subscription Billing - Calculate item MRC net price from re
curring charge
Related Information
The Solution Design feature enables users to organize items into sections and subsections in a separate tab on
quotes.
The Solution Design tab is just another view of the items that are already in the quote (if there are same items
in the new tab and the Quotation tab, they aren’t treated as duplicates but as the same and all changes made
on an item in either one of the tabs are applied to the same item in the another tab).
Also, the calculations are upgraded to cover sections as well - currently, section calculations are available only
for quote item custom fields.
Example
John is a sales lead in a furniture manufacturing company. The company applied to a call for tender for
furnishing a new business complex in Stockholm. The tender proposal contains more than 1000 items (chairs,
desks, coat hangers, and so on) that are distributed into 3 buildings, each with 11 floors and dozens of offices.
The tender documentation contains a tender proposal form in Excel with sections for each building and
subsections for floors and offices, respectively.
John uploads the Excel form in the Solution Design tab in SAP CPQ and the system creates sections in the
hierarchy indicated in the file. Afterwards, John indicates which sections and subsections can contain products
and inserts items either directly within the sections or from the quote.
Once the solution has been completed, John downloads it in an Excel file and submit it for the tender call
respecting the required form.
To enable users to create sections, you must first create a dedicated tab on quotes. Go to Setup General
Application Parameters Shopping Cart and Quotes and set the parameter Enable Solution Design to TRUE.
You can create sections either in Excel or using the in-built tool Section Builder. For both workflows, you need to
have the Quote 2.0 engine enabled on your tenant and have the Solution Design tab created.
The ability to import sections through Excel allows users to handle multiple sections easily, with minimal
manual effort. This feature can be useful for handling tender documentation, when there’s a predefined set of
sections in an Excel file that you aren’t allowed to change. In that case, you can upload the Excel with sections,
populate them with products, handle the calculation and consequently download the Excel with values for each
section.
Procedure
The file name contains the quote number. All cells are formatted as Text and the local formatting of Excel
files isn’t automatically applied.
2. Populate the file with this data:
○ Hierarchy - the ordered number of sections and subsections
○ Section Name - names of sections and subsections
○ Can contain products (Yes/No) - populate with either 1, Yes or True each section to which you wish to
add products.
If there are quote item custom fields for which users have the editing rights, they also have a dedicated
column in the Excel and you can populate them with values.
○ Can be distributed (Yes/No) - populate with either 1, Yes or True each section that you wish to
distribute.
○ Solution Team - populate with the name of the Involved Parties team to which the section should be
assigned. If the team doesn't already exist in the system, it’s created automatically [page 258]. You can
add multiple teams if they’re separated by a comma. Also, each team must have a unique name.
Sections and subsections are created following the hierarchy in the template.
The Section Builder is an SAP CPQ tool for manually creating sections.
Procedure
To edit the existing sections and add new ones, click above the sections grid. To download sections in an
Excel file, click . The downloaded file contains the sections’ hierarchy, sections’ names and the quote item
custom columns.
The button allows users to update a single quote item custom field throughout multiple sections at once. The
update can be applied to all field types, but only one field can be updated at a time. After a field value is
updated, all calculations defined for that field are triggered as when changing the value manually.
Note
The button for bulk update is enabled when there is at least one editable column in sections and after a
user has selected the sections in which the field is updated.
Sections can be filtered by name (only the exact match returns results) and by the value of quote item custom
fields that administrators have marked for filtering (Use column value to filter quote items is selected on the
field in Setup). Also, users have the following options for filtering sections:
● Show only my sections - displays only the sections assigned to the team the user belongs to.
● Show Sections
○ Regular - displays the sections that aren’t distributed to other sections, and which weren’t created
through distribution.
○ Distributed - displays the subsections that were created when a section was distributed to other
sections.
○ Distribution - displays the sections that can be distributed.
When all three options are either selected or deselected, all results are displayed.
● Hide product items - doesn’t display products in the filtered sections.
● Only sections with items - displays only sections that contain product items.
The logic between filter options is AND. After a filter is applied, only the sections that match the entered criteria
and their pertaining products are displayed. The applied filter is saved locally in the browser for a user and
quote. If that user opens the quote in another browser or reassigns the quote, the filter won’t be applied. Also,
different users on the same quote can apply different filters. The applied filters display in pills above sections in
the Solution Design tab and users can easily remove them, which refreshes the display of sections. Excel
download is available while filters are applied and, in that case, only the filtered sections are downloaded.
Standard quote fields aren’t displayed in the Solution Design tab, but administrators can add quote item
custom fields and manage calculations for them. The prerequisite is to make the field visible on quotes in
Quote Layout Permissions and Quote Layout [page 310] pages.
Note
Reverse calculations aren’t enabled for sections. Consequently, a quote item custom field in a section can
either be made editable or you can select an aggregate type for it.
The following procedure describes how to add a section calculation to the list of calculations that are triggered
every time an item is added and updated in the quote.
On the user side, calculations are triggered every time users click outside the field they’ve edited. It isn’t
necessary to press the Enter button to run the calculations.
The following example shows you how to create a custom calculation that calculates a discounted value of a
quote item custom field in a section.
x = context.AffectedSection
x[“Discount_Value”] = x[“Sum”] * x[“Discount_Percent”] / 100;
3. Save the changes and open the Solution Design tab in a quote.
The Sum column is populated with values for each item and a summed up value displays in the section
field. If you change the percent in the Discount_Percent field, and refresh the section, the Discount_Value
field is populated with the new discounted values.
Related Information
You can either add products to sections from the Solution Design tab or allocate items from the Quotation tab.
Next to each item on quotes, there’s the icon for allocating items. After clicking on the icon, you can find the
section to which you want to allocate the item. Once an item is allocated, the icon is grayed out, but you can
always click on it again and change the section.
Products in sections have the icon displayed next to them. Clicking the icon opens a dropdown list with
actions that users can perform on a product:
● make a copy of the product in the same section and also on the quote
● delete the product from the section and from the quote
● edit the product so that the changes are applied in both the section and on the quote - if you’re editing line
items, they are automatically removed from the section. You need to go back to the quote and allocate
them to the section again.
● refresh the product so that all settings from the quote are applied on that product in the section -
recommended when handling calculations in the Quotation tab.
● move the product to a different section
● remove the product from the section
When the distribution is initiated, a new distributed section is created in each section to which the source is
being distributed. The value of the distributed section is split between the target sections as indicated in the
distribution method [page 249].
To be able to distribute a section to other sections, you first need to enable the distribution for it either in the
Section Builder or the excel file when creating/editing a section [page 242]. Consequently, the button
displays in the Solution Design tab, next to the section that can be distributed.
change (for example, change the price of an item), you should click and the values are redistributed
according to the distribution method. The Redistribute action is above the section grid, next to other section
actions.
Example
The following calculation method is selected for distributing a section when users want to keep the same ratio
in the sections that are distributed as between target sections.
itemsToBeDistributed = context.Quote.GetSectionItems(context.Source)
sumOfItems = 0
for item in itemsToBeDistributed:
sumOfItems += item["Wholesale_Price"]
targetSum = 0
for target in context.Targets:
targetSum += context.Quote.GetParentSection(target)["Wholesale_Price"]
for target in context.Targets:
target.DistributionPercent = context.Quote.GetParentSection(target)
["Wholesale_Price"] / targetSum *100
for target in context.Targets:
for section in context.Quote.GetSectionAndHisAncestors(target.SectionPath):
section["Wholesale_Price"] += sumOfItems * target.DistributionPercent /
100
context.Source["Wholesale_Price"]-=target["Wholesale_Price"]
Prerequisites
To have a distribution method created in Setup Quotes Quote Fields and Calculations .
Context
Only a section that has a calculation of the aggregate type Sum can be distributed. Sections with other
aggregates types can’t be distributed. The Retract action removes the distributed sections from the target
sections.
New subsections are added to target sections, one level below the target sections.
The value of the source section is evenly split between the target sections.
You can change the percentage manually and remove the target section by clicking .
The sections grid in Solution Design contains a row for displaying the total value of each quote item custom
field whose type is currency and number. The row is added automatically to the grid, after you create at least
one section.
You can select one of the predefined calculations or create a custom calculation for calculating the section
totals.
If you need a calculation more complex than the standard calculations Sum and Average, you can write a script
for calculating the section totals in Custom Total Calculation under Section Fields.
Note
There can only be one script that calculates custom total calculations for all fields (you can’t create a
separate script for each field).
Custom calculations are triggered after standard section total calculations, so if you write a new calculation
formula for a field for which you’ve already selected a standard calculation (SUM or AVERAGE), the custom
calculation will override it.
In the History tab in Custom Total Calculation, you can view all the versions of scripts created up to that
moment. If needed, you can also compare the scripts.
Tip
The methods available for managing section totals via scripting are described in the Scripting Help .
Scripting for Quote 2.0 is different from the scripting for Quote 1.0.
This page lists some of the key features in Quote 2.0 scripting.
Note
Methods and properties for Quote 2.0 are listed in the Scripting documentation
The global scripting scope is created for Quote 2.0 with these variables:
● User
● WebServiceHelper
● Session
● FederationUtility
● ScriptExecutor
● LogTrace
● SqlHelper
This scope is independent from Quote 1.0. Global scope is accessible without a prefix. For example,
User.FirstName / Trace.Write('test').
Event scopes should have a context prefix and contain variables that are specific for appropriate scopes. For
example, context.Quote.DateModified
Quote variable is removed from configurator events (you can’t call quote context from the configurator). To
read quote data from the configurator, you should use CTX tags. Additionally, you can’t write data in the quote
from the configurator. You can retrieve the quote comment via context.Quote.Comment, but you can’t insert
the comment using context.Quote.Comment = ‘Test Comment’.
Note
Quote.AffectedItems fetches all items that the user changed on quote. For example, if the user changes
the discount for three out of 10 items on the quote, Quote.AffectedItems fetches those three items.
Unsupported Variables
The following variables aren’t currently supported for the Quote 2.0 scripting:
Scope Variables
Badgeville Badgeville
BadgevilleApi
BadgevillePlayerApi
CRM MSCrmServiceContext
MSCrmService
MSCRMOpportunityId
MSCRMUserId
SalesforceProxy
SFEnvironment
NsEnvironment
Some variables that were in the global scope in Quote 1.0 are moved to event-specific scopes in Quote 2.0:
● Quote
● TagParserProduct
● Product
You should avoid fetching any Quote 2.0 data directly from the database since the quote object may have
different states while processing the user action. For example, fetching the number of items in the quote while
adding a single item to the quote:
clr.AddReference('System.Core')
import System
clr.ImportExtensions(System.Linq)
result = SqlHelper.GetFirst ('select count(*) as Count from sys_QuoteItem where
QuoteId = {}'.format(context.Quote.Id))
Trace.Write(result.Count) # 0 since quote has not been saved yet
Trace.Write(context.Quote.GetAllItems().Count()) # 1 since there is one item in
memory that will be saved at the end of the processing pipeline.
Scripting Examples
In Quote Fields and Calculations you can create basic scripts that are triggered either after a value in a quote
field is changed, after an item is added to a quote or when an item is updated.
● The following custom calculation sets the default discount to 10% when items are added/updated:
● This script updates the quantity of the maintenance item so it matches the total number of items in the
quote. This calculation should be triggered before extended list price is calculated.
maintenance = context.Quote.GetItemByItemNumber(1)
for item in context.AffectedItems:
maintenance.Quantity += 1
#add maintenance item to affected items so that the rest of the
calculations run for this item as well
context.AffectedItems.AddItem(maintenance)
If you want to default the item discount based on the DiscountLevel attribute value in Quote 1.0, you should
write:
sender.DiscountPercent = GetDiscountForLevel(Product.AttrVal('DiscountLevel'))
Grouping users into teams enables parallel work on one quote and allows quote owners to assign quote
sections to different teams.
Quote owners create administrator teams that manage sections and assign users to solution teams. Each
solution team has access only to the sections assigned to it. Consequently, multiple teams can work on the
same quote and on different sections at the same time, without altering each other's work.
● Quote Owner - the default involved party with maximum rights. Only quote owners can create
administrator teams and they can also create solution teams.
● Administrator Team - unlike the solution team users, administrator team users can create, edit, and delete
sections. Administrator teams create solution teams, add users to teams, and assign teams to sections.
There can only be one administrator team per quote.
● Solution Team - a group of users that can be assigned to a section. Only members of a team assigned to a
section have access rights to it. Users in the team assigned to a parent section don’t have access to its
subsections. The users in this team can’t add any new teams, nor can they edit the existing ones. They can
only view the grid with the existing teams.
Quote teams can be managed in the Involved Parties tab. You can create and manage tabs as any other tab in
SAP CPQ [page 313], however, you should use the /quotation/InvolvedParties implementation file. By default,
this tab is visible to all permission groups in all quote statuses.
Here are some facts and limitations that you should keep in mind when assigning sections:
Users can create teams either through the Excel template for creating sections (Solution Design tab), or in the
Involved Parties tab.
Teams that are created through the Excel template for creating sections [page 243] are without members, and
the assigned user shoud add other members to the team following the procedure below.
By default, the tab contains a grid with the quote owner's name and the role. The following procedure describes
the steps for creating an administrator team, but they apply to creating a solution team as well.
1. Click Add.
The Add Involved Party modal displays.
Party Role is automatically populated with Administrator Team.
2. Define the name of the team.
3. Find users for the team in the Team Users search field.
Enter the name or the email of the user and the system offers matching results.
Inactive and blocked users aren’t available to be added to a team. Also, users can add only the users
pertaining to the same company to a team.
4. Click Add.
The team details display in the Involved Parties grid.
You can edit them by clicking on the team name. Also, you can delete a team and view the team members
by clicking and , respectively.
After teams are created, you can assign quote sections to them [page 257].
Note
If a user is a member of a team on a quote, that quote displays in the My Quotes tab.
SAP CPQ supports tabular structure for displaying dynamic data on Quotes. Quote Tables can be a useful
resource for displaying Customer purchase history, capturing payment details, etc.
Example
You can create a Quote Table for your users to keep a record of the payment schedule in a milestone-based
quote payment. The screenshot below shows a possible table design in such a scenario.
If users change an allocated amount, the unallocated amount is automatically recalculated. The unallocated
amount equals to $200 in the example as the amount of the first milestone is decreased by $200. The action is
triggered by the On Cell Changed script defined in Setup:
total= 0.0
cf_TotalUnassigned=Quote.GetCustomField(“Quote Total Unassigned”)
tbl=Quote.QuoteTables[“Payment_Schedule”]
for row in tbl.Rows:
total+=row[“Amount”]
cf_TotalUnassigned.Content = “$ ” + str(Quote.Total.TotalAmountInMarket - total)
The script subtracts the total amount in all rows from the total quote amount to display the unallocated
amount.
Tables on quotes are quote-related and can’t be created for each product item. The data in the table can either
be retrieved automatically from other systems and SAP CPQ or users can input/select entries for each cell.
Note that quote tables are available only in the responsive version of SAP CPQ UI.
Note
Once created in the Setup, a quote table is visible on all quotes in the tab selected during creation. All quote
tabs, except Documents, can host one or more tables, but a quote table can be located only within one tab.
Table content isn’t shared between tables.
Different column types require different input in the search fields so correct results are displayed:
● Attribute and Boolean columns - the search terms render in a dropdown list or with checkboxes so users
can select one.
● Date columns - users can either find a date in the on-demand calendar or input it manually.
● Other column types - the search term needs to be keyed in. The character limit for cells in string type
columns is 2000 characters per cell.
Note
The numeric, decimal, and money columns accept < and > characters to be used for “lower than” and
“greater than” operations. In textual search fields, if a user enters one or two letters, the rows containing
the item that starts with these letters are filtered. If more than 2 letters are entered, the system shows the
items that contain the two letters, not necessarily begin with them.
After entering or selecting from a dropdown menu a search term for one column, only the rows consistent
with the search remain in the table. Those rows are filtered further on when a new search term is applied in
another column.
The content of quote tables can be included in documents generated in SAP CPQ. To retrieve the content, use
the following tags:
● «QUOTE_TABLE(TableNameHere)»
● «QUOTE_TABLE_HEADER» (Enter column definitions or what you want to display on header for the table).
● «QUOTE_TABLE_HEADER_END»
● «QUOTE_TABLE_ROW»
● «QUOTE_TABLE_COLUMN(NameOfColumnHere)» …
● «QUOTE_TABLE_COLUMN(AnotherColumnHere)»
● «QUOTE_TABLE_ROW_END»
● «QUOTE_TABLE_FOOTER» (Enter column totals or what you want to display on footer for the table).
● «QUOTE_TABLE_FOOTER_END»
● «QUOTE_TABLE_END»
Table data is organized in columns. Multiple columns with the same denominators can be visually represented
to users as a group.
Quote table columns can either pull data via Iron Python scripts (the system supports a maximum of 3000
rows) or users import data manually.
Validation Rules
Validation rules show users that data input is required and that a limit on the data users enter is required.
The table shows which validation rules are available for which column types:
Number Minimum
Decimal
Maximum
Money
String Required
Contains
Date Required
Attribute
To manage validation rules for a column, access Validations when editing the column. After selecting a
validation rule and entering the value, you should define the validation message that will display to users if they
break the rule. The validation message is required, otherwise you can’t save the columns.
If one or multiple validation rules are broken, the validation of the entire table fails and an informational
message displays above the table. However, users will still be able to save the quote table and the quote and
manage other sections independently.
A rule's activity is handled through the Active checkbox. If a rule becomes temporarily unneeded, but may
become required in the future, unselect the checkbox.
A flag on quote tables, with values True or False, denotes the validation status. As the flag is exposed for
scripting, scripts can be created for users to perform actions based on the validation status.
Quote table columns are exposed for scripting so that you can create scripts for complex calculation of the
tabular data. Additionally, you can manage validation rules and column labels via scripts:
● Validation Rules - the new method ExecuteValidations triggers the validation rules. To check if a
validation rule is broken, use the HasValidationsFailed method. Also, you can activate/deactivate a
rule via scripting (for example, add a pre/post action to actions and cell events in the Actions tab).
Changing the activity via scripting doesn’t influence the behavior of the Active checkbox in Setup (the
activity must be changed manually).
● Column Labels - column labels are exposed for scripting so you can rename them to meet specific
business needs of your users. You can create a global script that renames the labels after users execute the
event to which the script is attached in Events.
Example
A script affecting the Payment Schedule quote table is attached to the action of changing the date of the first
payment in the designated quote custom field. After users change the date, the script is triggered and the First
Installment label is replaced with October 15.
Note that in the example quote, the parameters Quote.QuoteTables and GetColumnByName retrieve quote
and column names, respectively, not labels.
Quote.QuoteTables[“Payment_Schedule”].GetColumnByName(“First_Installment”).Label =
“October 15”
Example
When tracking the installment schedule plan for a product over a year, create a column for each month and
group the months in four quarters.
Note
● All columns, including those that are standalone (outside of groups), must be moved to Column
Groups. Otherwise, you can’t save the group.
● The ordering of columns and groups is set in Column Groups.
● Once you add a column to a group, you can only move it to a different group or outside of groups, but
you can’t move it back to the list of available columns.
Quote table groups are currently not exposed for scripting. To calculate the sum and average values of a group,
you can use the sum and average of columns as shown in the example snippet:
table = Quote.QuoteTables['Price_Overview']
rows = table.Rows
sum=0
for row in rows:
sum = sum + row.GetColumnValue('January')
#sum for column January
Trace.Write(sum)
#average for the column January (to calculate average on multiple columns,
multiply rows.Count by the number of columns first)
Trace.Write(sum/rows.Count)
Standard and custom quote table actions allow users to manage rows and cells in Quote Tables.
Add row, Delete row, and Copy row are standard actions available on Quote Tables. On the Administration side,
you can activate/deactivate actions, choose permission groups that can see them and define actions that are
executed before and after the standard actions. In addition to managing the table and row actions, you can also
activate/deactivate the On Cell Changed event on the same page.
Only those actions that have the Active checkbox selected are visible to users when interacting with Quote
Tables. To further control the visibility, click Permissions and select the groups to which the actions are visible.
The Pre Script and Post Script buttons provide access to a Script Editor where you can define actions that are
executed before and after the standard action, respectively. The blue flags on Permissions, Pre Script, and Post
Script buttons denote that permission groups are selected and/or scripts are defined.
Below are the available contexts for the scripts that can be attached to Quote Table events:
Copying rows
Available argument: EventArgs.
Table represents the quote table on which the action has been triggered.
NewRow represents a new quote table row copied from the source row.
Table represents the quote table on which the action has been triggered.
Row represents a newly created quote table row that will be added to the quote table.
In order to cancel adding a row to the quote, you need to set the Cancel property to True.
Table represents the quote table on which the action has been triggered.
Row represents a newly created quote table row that has been added to the quote table.
Table represents the quote table on which the action has been triggered.
Row represents a newly created quote table row that will be deleted from the quote table.
In order to cancel deleting a row, you need to set the Cancel property to True.
Table represents the quote table on which the action has been triggered.
Row represents the table row that has been deleted from the quote table.
On Cell Changed
In the Cell Events section, you activate the On Cell Changed event and attach a script that will be executed after
users make a change in a quote table cell. To use this event, you need the following context information:
As the system automatically saves every change made in a quote table cell, the list of changed cells and old
values will have only one element. An example code snippet below demonstrates how to access the changed
cell and log its current and previous values:
i = 0
while i < len(EventArgs.Cells):
cell = EventArgs.Cells[i]
Trace.Write('Column: {0}, value: {1}, display value: {2}, old value:
{3}'.format(cell.ColumnName,
cell.Value, cell.DisplayValue, EventArgs.OldValues[i]))
The list of changed cells and the list of old values are sorted so that related entries have a matching index
(position) on both lists.
Administrators create custom actions so their users could manage specific tasks on quote tables. In the
example scenario detailed in Quote Tables, the custom action Populate Milestones creates as many rows as
there are milestones defined in Total Milestones.
To create an action that isn’t standard on Quote Tables, click Add Custom Action. In the Script Editor, define the
action's name and the script that will be executed upon clicking the action button. The custom action buttons
appear above Quote Tables and their labels in the default language can be translated in the Actions section in
the Translations tab.
Scripts acting as Custom actions on Quote Tables have the following variables available in their context:
Note
Scripts attached to standard table and row actions and cell events don’t run when you interact with rows
via scripts. They only run when a user interacts with a Quote Table through the user interface.
Quote Table events can also be accessed via Iron Python Scripts. New rows can be added, data can be read
from them, permissions can be set, etc. The interfaces to do this are described in SAP CPQ Scripting
Documentation .
Users can import data into quote tables by importing Excel files on both quote engines.
The following procedures contain step-by-step instructions on how to upload Excel files into quote tables.
General Prerequisites
This functionality can be accessed by navigating to the quote tab in which the quote table is placed. There,
users can:
Instead of manually adding rows into quote tables, users can download empty Excel templates, fill them out
and upload them into the quote table.
4. Click .
5. Upload the file with new data.
A message informs you whether the upload was successful or not.
When managing extensive quote tables, it’s easier to download the existing data in an Excel file, update it and
upload the template back into the quote table. The prerequisite is to have data in the quote table.
4. Click .
5. Upload the file with the updated data.
A message informs you whether the upload was successful or not.
Template Guidelines
The Excel template contains a sheet with all columns and rows that exist in the quote table for which a user has
editing rights.
Note
Quote table rows are distinguished by ID numbers, so if existing entries need to be updated, you shouldn’t
change the ID numbers in the template.
If users populate the Excel file incorrectly by entering an inadequate value format and try to upload it into a
quote table, an error message appears. Additionally, users are prompted to download the file again and enter
the correct data to ensure a successful upload. The incorrect data in the Excel file is marked in red and the new
Error column is also displayed in the file. You don’t need to change the color of the cells and delete the Error
column before reimporting the file.
Note
There’s a new event When Excel is uploaded into a Quote Table available in the Global Scripts. A global script
can be triggered after an Excel file is successfully uploaded to a quote table.
The Translations tab allows you to translate the Quote label, column and action labels and validation messages.
Each label has a dedicated row with a value in the default language and a value in the target language, if
defined. To add a translation, first choose the target language in the Language drop-down list. You are now able
to add the translated value in the Translation column.
The Quote Tab Permissions allows managing visibility of the quote tabs based on the workflow statuses and
permission groups.
Unless you select a status and/or a permission group, all defined quote tabs are visible in all status and to all
permission groups. Quote tab permissions are managed under Setup Quotes Quote Tab Permissions .
When you access the page, a list with the following data for all existing permissions is displayed:
● Tab - the name of the tab for which the permission is created.
● Permission - the name of the selected status and the permission group.
The Show drop-down list allows you to filter the list per specific tabs or display all tab permissions in the list.
5. In the Additional visibility restriction section, click to create a condition formula [page 11] for a more
specific restriction.
6. Click Save to finalize the creation.
Tip
Quote.CurrentItem CTX tag can’t be used for defining additional visibility restrictions.
Note that the condition formula additionally restricts the tab visibility related to permission groups and
statuses, it doesn’t overrule it. The system re-evaluates the condition formula every time the quote is modified.
The Custom Fields administration allows creating custom fields in the shopping cart for users to include
additional information, such as terms of payment or other specific information to your company.
The fields can also be useful in helping to define what a generated document includes. Field selections can also
affect the configuration of the products. Each custom field is assigned to a tab defined as a quote tab and gets
permissions set to define how the field will be used based on the user and the status of the quote.
Custom Fields administration can be found under the Quotes admin menu. Here user can copy, delete, and edit
existing custom fields. Clicking Add New allows adding a new custom field.
Creating a new custom field comes in two steps. First step is to define the field, including the label, the type of
field it is, what tab it is displayed in and the order, and the label. Once defined, user can then assign permission
to the field. The permissions determine how the field is displayed to the user, such as hidden, required,
editable, and read- only.
● Name - Custom fields can be created with any name, or label. This label can then be different for other
users based on user group.
● Type - This determines how this custom field is used :
○ Free Input - Field appears as a text box in which users input a value. No restrictions on what the user
can enter.
○ Attribute - This type allows you to connect your custom field to an attribute. This way, in the quote, you
get the text box where you can select custom field value from the list of attribute values. If you set an
attribute of type „Auto-complete“ to be connected to your custom field, then in the quote, instead of
drop box, you get the autocomplete text box where you can type a value that you want to assign to your
custom field. As you start typing, autocomplete offers a list of values that either starts with the typed
combination of letters, or contains it.
You can also set the value of autocomplete custom fields via scripting by using the Value Code
property, as explained in Autocomplete Attributes [page 44].
○ Date - Field appears as a text box in which the user enters a date. The date the user enters must match
the date format the user has set on the User’s Page. Next to this field, the user is able to click an icon to
display a calendar where the date can be chosen.
You can’t change the Date field to any other type, nor can you switch other types to Date. You can
switch fields to and from Free Form, Attribute and Long Text.
○ Long Text - Field appears as a large text box in which the user can enter multiple lines of text. No
restrictions on what the user can enter.
● Tab - Select the quote tab that this field will be displayed under. The only tabs available are those tabs that
have been defined as a quote tab in the Quote Tabs administrative section. It’s important to keep in mind
that the tabs that are used for the cart, customer info, and attachments are available selections. This
means that user can place custom field not only in custom tabs, but also within the cart, customer info, or
attachments.
● Calculation Type - If “Once, when quote is created” or “Every time quote is modified” Calculation type is
selected, a new Formula field is shown. The evaluated formula value is assigned to the content of the
custom field. This way a custom field value can be defaulted to some value. Some of the tags aren’t
supported for “Once, when quote is created” calculation type option
(<*CTX(Quote.QuoteNumber)*>,<*GI(CART_OWNER_ID)*>,…).
When application parameter “Enable quote custom field calculation ranking” is true, the new field is added
in custom fields administration “Calculation rank”. This field is visible only when “Calculation type” is not
“None”. For example, admin can add three dependent custom fields: Custom field “A” ,Custom field
“B” ,Custom field “C” . Custom fileds B i C have calculation type 'Every time quote is modified'. Custom
field B has formula <*EVAL(<*CTX(Quote.CustomField(A))*> * 2)*>, custom field C:
<*EVAL(<*CTX(Quote.CustomField(B))*> * 2)*>. Calculation rank is set to 1 for B and to 2 for C. When the
user enter “5” in the custom field “A” and click on “Calculate”, the value for custom field “B” should be 10
and for custom field “C” should be 20.
● Order within Tab - Determines where this field will be displayed in relation to the other fields on that tab.
The lower ranked fields will be displayed on the top, while the higher ranked will be displayed after.
● Transfer to Items - Determines whether or not this field’s value will affect the product’s configuration. This
is done when this field is connected to an attribute. That same attribute needs to be added to the product
where the product definition is using the attribute. Once the field is selected in the cart and saved, the
value is passed to the product’s configuration and the same attribute value is selected in the product. Any
rules, calculations, etc used around this attribute will be affected.
For example, say we have a custom field connected to an attribute called Number of Users, which contains
the values 1 through 10. In addition, we’ve also added this same attribute to the product’s configuration to
Note
When using the Transfer-to-item functionality it will cause Quote Reconfigure – not only when the
custom field value is changed, but also when the Calculate action is triggered (on item discount
change, list price change or any other field value change).
clicking this icon displays a list of all the user groups in the system where user can define what the
label will be for each group. This is most beneficial when quotes are being shared among user types. Users
that open quotes from another user group will see their label with the other user’s value.
For instance, if we have a custom field called quote name, we may want the managers to see the label
‘Project Name’ but the sales rep to see ‘Quote Name’. When a sales rep user creates a quote they’ll enter a
value for Quote Name. Then when the manager opens the same quote, they’ll see the same value the sales
rep enter but under the label Project Name.
● Contains Personally Identifiable Information - All information that could potentially be used to identify an
individual should be flagged as PII [page 744]
● Sensitive Data - PII data can be flagged as sensitive [page 745] for an additional layer of protection.
Permissions
The Permissions tab defines how the custom field will be displayed to the user based on the user group and
status of the quote. There are four options that you can define for the field:
● Hidden - This is used for the statuses or user groups that you would not like the field displayed for. The field
is not displayed at all to the user. If the field is required the user will not be prompted to enter a value for
the field.
● Read-Only - This is generally used for statuses after the quote has been completed, such as Order Placed
or Received Order. The field is not editable. Whatever value had been entered for the field will be displayed
as uneditable text. Even when a custom field is read-only for a user type, a script will change the value
when triggered.
● Editable - This is generally used for the initial statuses in which the quote is being created, such as Open.
The field is displayed in whatever format it was defined in.
● Required - This is used when user would like the user to define this field before they are allowed to Place
Order on the quote. Field marked as required are editable and are displayed with a red asterisk. If they try
One of these options can be defined for each cell in the matrix of user groups and statuses. To set an option to
a cell click the cell to display a pop-up where the option can be selected. There are six different types of cells in
the matrix that can be defined:
● All Permissions - Sets the same option for all the cells in the matrix. Click the upper left corner of the matrix
to define.
● All Statuses for One User Group - You can set all the statuses for one user group by clicking the user group’s
name on the left side of the matrix.
● All User Groups for One Order Status - You can set all the user groups for one order status by clicking the
status on the top of the matrix.
● Individual Cell Intersection - You can set a cell intersection between a status and a user group. For instance
the Sales Rep group should have the custom field Read-Only when in the Order Placed status.
● Default (For New User Groups) - Set how the custom field will be displayed to the users added to new user
groups that haven’t been set in this matrix yet.
● Default (For New Order Status) - Set how the custom field will be displayed in a new statuses that haven’t
been set in this matrix yet.
The default cells make administration easier so that when you create a new user group or status you do not
need to go through and define all the custom field permissions again.
Note
Selecting an option for a cell that includes all statuses or all user groups might take a little bit of time to set
depending on the number of statuses and user groups created in the system. Large number of groups or
statuses means there are a lot of cells to set, so there might be a slight delay in setting them all.
When finished defining the custom field and its permissions, click Save at the bottom of the page. You are not
redirected to another page in case you would like to continue to define the field. For instance if you’ve just
defined how the field will be used and now you’d like to define the permissions.
Key Attributes allow setting up an attribute as search criteria on the user side.
Users can search for quotes based on the value of their Key Attributes. For example, if Memory is a Key
Attribute, user can make memory a search field. Now when the user searches for quotes on the user side, if you
want to find quotes with memory value of 1024MB-DDR, all the quotes with this value for memory will be listed.
To get to the Key Attributes Administration page select the Quotes admin menu, and then Key Attributes. Here
new key attributes can be added, changed the label of existing key attribute, and modified the expression used
to compute the value of the key attribute.
To create a new key attribute, click Select. This brings up a pop-up window where you can search for the
attribute you would like the key attribute to reference. Click the green arrow icon to select the attribute.
The Label field determines what the default label will be for this key attribute. User can change the label when
the key attribute is added as a search field.
When finished, click Save at the bottom of the screen. This saves the current key attributes, including any
changes made the label or expression of any key attribute.
In order to do this we will use arguments of the tag LoadCartItems consisting of prefix KeyAttribute- and key
attribute name. Example is :
● KeyAttribute-Memory
● KeyAttribute-Processor
● KeyAttribute-Printer
In syntax checker, only non-empty key attributes will be displayed. This tag will be used to populate appropriate
column with value of item’s key attribute. Example how final tag will look like -
<*CTX( Container(Test_Container).LoadCartItems(KeyAttribute-Memory).ToColumns(Memory) )*>
● Create attribute container that will be populated with contents of the quote. This container will be
displayed in configurable product.Container should contain quote item fields.
● Add key attributes to be displayed in container( String, Numeric, Date)
● Create a quote and add several items. Some items should have these key attributes empty.
The Search Fields administration allows controlling which fields will be available for users to filter their load
quote page by.
They can be defined on a per user group basis and can ordered. The search fields available include quote
information, customer information, key attributes, or user information.
When users want to save default number of quotes that will be displayed, SAP CPQ will save maximum 50
quotes per page.
The Search Fields administrative section can be accessed under the Quotes admin menu. Here user can add,
remove, and modify the search fields.
To add a new search field, click the Add New button. This displays the search field definition page.
Available Fields displays the fields that can be searched by. These include any Key Attributes, Custom Fields,
and default fields, which include cart information, customer information and user information. The Label field
determines what the search field label will say on the user side. Because the search field name can be
sometimes not very descriptive or not custom for user's company, the Label field allows displaying any label
that is needed.
The Operator field determines how the system will search the value entered by the user. There are 6 options
available as an operator:
● =number - requires the value entered by the user and the selected field is a number
● =date - requires the value entered by the user and the selected field is a date
● =string - requires the value entered by the user and the selected field is a string, or text
● like - allows user to enter any value, this value is then searched by for in the selected field. An exact match
is not needed with this query. For example, if a user enters the value “com”, the system will match that with
“computer”, “communication”, “combination”, etc.
● number interval - user is given two fields to enter a number. The system then returns the values that fall
between the entered numbers.
● date interval - user is given two fields to enter dates. The system then returns the values that fall between
the entered dates.
Tip
Searches done with the =number, =date, and =string operators must be exact matches in order for the
system to return the result.
The All User Types field refers to user types for which no search fields have been defined. What this means is
that, if a search field has been defined for a certain user type, that user type will not have access to search
fields defined for All User Types. For example, if a Project Name search field has been defined for a Sales user
type, the Sales user type will only have access to the Project Name search field, and to no other. This also
means that All User Types will not have access to the search field defined for a Sales user type.
To add a new search field, user must select the field from the Available Fields and click to send the field to
the Selected Fields. Then it is possible to order the selected fields by selecting the field and clicking the up and
down arrows.
Note
User can only add one search field at a time. To add another search field, save the current addition, then go
back into the search field administrative section and click Add New.
When editing a search field, if desired, user can only remove and edit the label of the field that you edited. User
can, though, modify the ordering of all the fields while editing.
Note
To make the Advanced Search feature available on the Existing Quotes page, you must tick the Show Fields
in a Quote Search/Filter check box on the User Types [page 160] Help page.
By default, users can only see quotes that they have created. These are accessed by clicking My Quotes in the
dropdown located in the upper-left part of the Load Quote page. In order to allow a user to see any other
quotes, a quote visibility rule must be created. Quotes a user has been given permission to will be displayed
when the Other Quotes option is selected in the same dropdown where My Quotes can be accessed. Quote
visibility rules are managed in the Quote Visibility administrative section. This section can be accessed by
choosing the link under the Quotes admin menu.
The Cart Visibility administration screen shows the parameters from which a rule can be built: Group, User, and
Company. The order in which each is displayed reflects its priority from left to right, with Groups having priority
over Users, and Users having priority over Companies. User can join parameters to filter permissions even
more, this is explained later. Click Add New to create a new quote visibility rule. This displays the quote visibility
definition page as shown in the screenshot.
When a user goes to the other quotes tab, the system runs the visibility rule for every quote in the system. If the
condition is met (true) for a quote then the specified user(s) will be able to see that quote. The actions the user
is able to perform on these quotes is determined by the workflow set in the Other Quotes area of the Workflow
Actions administrative section.
Only shopping cart tags can be used in the condition field for visibility rules. Clicking displays the code
builder window where user can access tags and create complex conditional statements. Any quote information
can be pulled to use in the calculation, including user information, customer information, custom fields,
discounts, cart amounts, and many others. Entering 1 in the condition field allows the selected user(s) to see all
quotes generated in the system.
User can create inherited visibility rules to further filter quotes. For example, we create a rule in which the Sales
group can see all quotes where the quote creator’s user group is Sales. We then want John Smith, who is part of
the Sales group, to only see quotes within his zip code. To do this we first need to create the visibility rule for
the Sales group as shown in the screenshot.
Now, we want John Smith to only be able to see quotes from user’s within his own zip code. To do that we
create another visibility group for John Smith as shown in the screenshot.
All companies have unique needs but there are some commonalities which will be used for quote visibility rule
examples. Companies can have many different ways of distributing products and services and hierarchal
structures to manage them. For example, a Sales Management group needs to see all quotes that its groups or
salespeople generate, which may include individual users, Value-Added Resellers, Wholesale Distributors,
Outside Sales Reps, etc. Several quote sharing rules must be created in order to specify who can and cannot
see the quotes that have been generated.
There are four groups that need cart visibility rules applied to them:
● Sales Management: The internal management staff which needs access to all quotes.
● Sales: The internal sales rep staff which work in territories or specific companies.
● Channel Rep: Wholesalers, VARs, Distributors.
● Direct Sales: Center sales personnel, customer service, etc.
The Sales group will be divided into 2 territories, East and West. The Channel Rep group has 4 major stocking
wholesalers, 2 in each territory. In addition, they have 5 Value-added resellers assigned to each.
Rule 1
Sale Management needs access to ALL quotes. Administrator should select Sales Management as user type
and in Condition, enter 1.
Rule 2
The Sales group should see only quotes within their territory. Jerry Spinger is assigned to East and Opah
Windfree is assigned to West. In order to make sure each rep can only see quotes that belong in their respective
territory a rule is created using the <*SAMETERRITORY*> tag. Administrator should select Sales Management
as user type and in Condition, enter <*SameTerritory*>.
Now every Sales user will be able to see all quotes located within their respective territory. Based on this rule
Jerry Spinger will not be able to see Opah Windfree’s quotes, because in there user profile they are in different
territories. For more information on assigning users to a territory, see the chapter on Users in the Users
section.
The way this rule works is very simple as well. When a user from the group Sales accesses the Other Quotes
tab, every quote is evaluated against the tag <*SAMETERRITORY*>. This tag evaluates to 1 (true) if a user who
created a quote (quote owner) has the same territory as the logged in user. All quotes will then be visible to the
logged in user through the Other Quotes tab.
Rule 3
Channel Reps should see only those quotes they have generated (My Quotes) and all quotes created by their
own distributor companies. The Channel Rep group supplies Westcoast Distribution Inc. and Eastcoast
Distribution Inc. They need to view all quotes generated by those two distributor companies. In this case the
condition is a bit more complex and requires the following expression: [OR]([EQ]
(<*CO_INFO(COMPANY_NAME)*>,Eastcoast Distribution Inc),[EQ]
(<*CO_INFO(COMPANY_NAME)*>,Westcoast Distribution Inc)). Administrator should select Channel Rep as
user type and in Condition, enter [OR]([EQ](<*CO_INFO(COMPANY_NAME)*>,Eastcoast Distribution Inc),[EQ]
(<*CO_INFO(COMPANY_NAME)*>,Westcoast Distribution Inc)). The way the above rule works is also very
simple. When a user from the Channel Rep group accesses the Other Quotes tab, every quote is evaluated to
see whether or not the user who created that quote belongs to a company Eastcoast Distributors or Westcoast
Distributors. Those quotes that belong to those companies are then visible.
Rule 4
By default the employee from each company (Westcoast and Eastcoast) can only see their own quotes (My
Quotes). In order to allow each user to see quotes from their own company we need the following rule: User
4.9 Reports
The Reporting Module allows authorized users to create reports, such as how many configurations have been
completed in a certain time frame, who completed them, how many quotes were generated or how many
projects were created, their status, activities by departments, individual users, customers, etc. SAP CPQ
administrators can set these reports up by using the administrative interface for the reporting module.
Reports link under the Quotes admin menu. The picture below shows a list of existing reports and some action
buttons which are used to Reporting Module administration is invoked by clicking on the Add, Change (edit),
Copy or Delete reports.
Clicking the Add New button brings up a new screen where user can choose to create a Standard Report (which
can have filters) or a Common TreeView Report.
Creating either a standard or a tree report requires the administrator to select from a list of standard views or
stored procedures.
Note
Currently SAP CPQ does not provide any stored procedure as report source.
Reporting Module administration is invoked by clicking on theThe following picture, (Standard Report → View),
shows a typical list of standard views. Views are similar to tables that combine data from 2 or more SAP CPQ
database tables. After selecting the desired view, user will see a report definition screen as shown in the image
below:
Column order specifies which data (columns) should be included in the report and the order in which the
columns will appear from left to right.
Sort Type controls data sorting within the column, either ascending or descending.
Example 1
The first report has the following columns: Quote Creator, Customer Name, Total Quote Amount. Sort Order,
Sort Type, Group By and Total are also defined. The report will display quotes grouped by Quote Creator and
Customer Name, and a sum of the Total Quote Amount.
Please note that all records that have the same Quote Creator and Customer Name are combined into one row.
The number displayed in the Total Quote Amount column is a sum of amounts of all quotes created by the user
whose name is displayed in the Quote Owner column and sold to the customer displayed in the Customer
Name column. In order to successfully define such a report, the administrator needs to specify what operator
to apply to all the fields (columns) that are not being grouped. These operators are located in the Total column
and the choices are Count, Sum, Max, Min, Ave, etc.
Example 2
Since database field names are not always user-friendly the Alias column is used to allow the administrator to
specify a more user-friendly name for each column. In some of the examples above, the column Name uses the
alias Quote Creator which is the name presented to the user.
It is also possible for the administrator to specify if a user should be able to use any search criteria. This is
accomplished by specifying the Condition operator as shown in the following image:
User Entry implies that the user will enter the desired search value.
User ID implies that only the data pertaining to a particular user will be provided in the report.
Search criteria can also be set to return only the record created on that particular day (Current Date).
The user can also select from the list of values (select one or more of those values). If the administrator selects
User Select (Single) or User Select (Multiple), the user will be presented by a drop down or a multi select list box
of search criteria.
In the case of User Select the administrator must select a source for the search data, which will be presented to
the user.
Here are two examples of user-selected searches. The first one has a condition operator of ”>” and User entry.
The LIKE operator is used on a value typed in by the user. Here is the output:
First select the User Group(s) that will have access to the report. The number of records per page has default of
10, which can be changed. A Report Description can be added. The report can then be previewed by selecting
the Preview button. All parameters can be reset by selecting the Reset button or the report can be saved by
selecting the Save button.
Other than attribute values, in the product rules administration page you may set and read global variables
(globals, GI). Global variables are stored at cart level and are common for each main item/product
configuration in the cart. Global variables may be used to model the interactions between items and to define
action availability within the configuration. For details see the chapter on Global Variables [page 19].
Cart Level Aggregates are special Global Variables. When you define an aggregate you provide its name and
formula. This formula is evaluated for each main item in the cart. The evaluated formula is then converted to a
numeric value. If it can not be converted to a numeric value, the aggregate value for that particular item is set
to be zero. SAP CPQ will implicitly multiply each formula with the quantity of the item. The final value of an
aggregate is assigned to a Global Variable with the same name as the aggregate. This means that when you
define an aggregate you actually define a Global Variable.
Tip
Since Quote Properties are also global, you must be careful to define unique aggregate names.
Cart Level Aggregates are a favorable method for calculating the sum of the numeric values in the cart. They
are calculated when an item is added to the cart, and during the Reconfigure action. Cart tags and some CTX
Tags [page 622] should be used in its formulas.
Example 1
● Aggregate Name: “Item Count”
Note
As stated earlier, SAP CPQ will implicitly multiply each formula with the quantity of the item. This is why the
formula reads “1” – because if your item count is 3, the end result will be 3. In other words, this will create a
global variable “Item Count” and its value will be equal to a count of the main line items – number of added
configurations – in the cart.
Example 2
This will create a global variable “Total Hard Drives” and its value will be equal to a product of quantities of
“Hard Drive” attributes in each item in the cart. If an item or a configuration does not have a “Hard Drive”
attribute, the aggregate value for that particular item will be set to zero, thus such items will not affect the final
aggregate sum value.
This aggregate/global variable can also be used in an action condition, for example:
This condition will allow an action if global “Total Hard Drives” is greater than 10. For more details on conditional
workflow actions see the chapter on Workflow Actions [page 330].
SAP CPQ can use artificial intelligence to display product and pricing recommendations on quotes.
To enable recommendations, your SAP CPQ tenant must be integrated with Thunderbridge AI for SAP CPQ
that pulls data from the application and third-party CRM systems, analyzes it and returns AI recommendations.
The feature is not part of the standard SAP CPQ package and can be activated with fees involved.
Example
SAP CPQ predicts the products customers might need based on their purchase history or the purchase history
of similar customers. Also, if customers usually purchase a pair of products (e.g. a tablet and a pen), when
adding one of them to the quote, the system will recommend the other product, its quantity and a discount.
When SAP CPQ is integrated with a CRM application, the system can also suggest the discount for the product
item that is most likely to get the deal closed.
Context
To enable AI recommendations on quotes, the SAP CPQ professional services team should set up the
integration settings and column mappings for your tenant as follows:
Procedure
Product and pricing recommendations are based on customer's previous sales data stored in SAP CPQ and on
the data of CRM opportunities associated with SAP CPQ quotes.
The system recommends only products that are currently not included in the quote.
When recommendations are available for a quote, the Recommendations button is active and colored and
shows the number of recommendations for the current quote. Clicking it opens a list of recommendations with
these options:
● Configure- configure a product and add it to the quote. In addition, the system recommends a quantity and
a discount for the product. If there is no integration with a CRM system, the discount and the quantity are
not included.
● Add Product - add a simple product with a recommended quantity and discount. If there is no CRM
integration, the discount and the quantity are not included in the recommendation.
Note
The quantity and the discount are tied to the recommended product and cannot be added selectively
to the quote. When adding a product, the system automatically adds it in the recommended quantity
and with the recommended discount.
● Change Discount - apply a discount to a product that is already in the quote. The option shows only when
SAP CPQ is integrated with a CRM system.
Note
Note
Recommendations are refreshed whenever a product item is added or removed and when item’s quantity
and discount on the quote are changed.
The system does not reset the applied discount after changing the customer. The system revises
recommendations on each change in the quote.
The Bulk Deletion administrative section allows users to safely and easily delete other user’s, their quotes, or
their customers.
This is a good way to clean up the system database by deleting old users, along with their quotes and
customers. To access Bulk Deletion, choose the link from under the Quotes admin menu.
From the Bulk Deletion start page, user can choose whether you would like to delete a user and their quotes or
delete local and global customers in the system.
Delete customer(s)
A customer cannot be deleted if there are quotes associated with them. Make sure that all quotes associated
with the customer are deleted. The Delete customer(s) section allows deleting a user’s customers or global
customers. To delete a user’s local customers, select their name from the drop down list. To delete global
Before user deletes other user’s account, it is important that user delete that user’s customers first. Users
cannot be deleted if they are the administrator of a company, an approval parent, managing parent, ordering
parent, or have customers associated with their account. The Delete user(s) and/or their cart(s) section allows
deleting a user’s account or a user’s quotes, or both. Check the users in which you would like to delete. The left
checkbox will delete the user’s account from the system, while the right checkbox will the delete only that user’s
quotes.
Deleting the user’s account will automatically delete that user’s quotes as well. If you wish to keep the user’s
quotes and still delete the user, then reassign the quotes to another user then delete the user’s account.
Deleting a user’s quotes, though, will keep the user’s account intact.
You can restrict the visibility of column headings to specific user types or you can make them visible for all user
types. You can also select the order in which the columns will be displayed on a quote. Available column
headings may include quote information, customer information, key attributes, custom fields and/or user
information. Any field available to users on the Existing quotes page can be sorted.
The Column Headings administrative section can be accessed via Setup Quotes . Here administrators
can add, remove, and modify the column headings.
To add a new Existing Quotes Column, click Add New. A blank definition page will be displayed. Selecting Edit
would bring up the same page. Fields starting with the blue asterisk symbol, (*), are required in order to save
the new column. When you add/edit a column heading, two additional check-boxes are enabled if the column
represents a quote custom field:
● Label : Editable - If this is checked users are able to change the value of this field from the Existing quotes
page.
● Label : Changing field value triggers quote recalculation - When users edit a field from the Existing quotes
page, the quote will be recalculated. This feature can be used when the field is used in other calculations in
the quote or when its value is transferred to quote items.
This feature will enable users to edit custom fields from the Existing quotes page. Users can change quote level
custom fields directly on the existing quotes page. For example, this can be very useful when changing the
expected close date for several quotes without opening them one by one. Additionally, you can define which
fields are editable and whether or not changing that field causes the entire quote to be recalculated.
Custom field types that are supported for edit are: Text Field, Attribute and Date.
When a user enters values in one of the editable quote fields and clicks Save, SAP CPQ will identify quotes
where the user has entered a value and save the quotes one by one. Unless you have marked the column to
trigger quote re-calculation, the values will be saved directly to the database without loading the SAP CPQ cart
(in the background). If the cart is loaded, the value will be saved and all calculations will be triggered, transfer to
item feature executed and so on (similar to how calculations are triggered when the user updates the field from
the cart).
● Available Fields contains the fields that can be displayed. These include any key attributes, custom fields,
and default fields, which include cart information, customer information, and user information.
● Label field determines which text will be displayed in the column heading on the user side.
● User Type determines which user types will be able to see this specific column heading:
○ All User Type option allows all users to see the column heading.
○ Selecting any specific user type will enable only that user type to see the column heading.
Consequently, as soon as you click Save, the user type in question will only be able to view column
headings assigned to them, while the column headings assigned to All User Type will become
inaccessible to them. (For example, if all user types have access to column headings A, B, C and D,
while users from the Sales user type have access only to B, they will not be able to view A, C and D,
even though they are assigned to All User Type).
● Search Fields Order lists all the column headings currently being displayed to users. The fields are listed in
the order that they will be displayed to the users. The fields listed at the top will be displayed on the left
side of the quote list.
Note
User can only add one column heading at a time. To add another column heading, save the current
addition, then go back into the column heading administrative section by clicking Add New.
When editing a column heading, if desired, users can only remove and edit the label of the heading that is being
edited. Users can modify the ordering of all the headings while editing a particular column heading though.
This option can be used when there is need to customize default settings when sending an email after
generating documents.
● Don't preselect TO on Send Mail - Set to TRUE in order not to preselect To on Send Mail.
● Don't preselect CC or BCC on Send Mail - Set to TRUE in order not to preselect CC or BCC on Send Mail.
● Emails are sent by - Mail can be sent via SAP CPQ Mailer or Default Mail Client. SAP CPQ Administrator is
able to determine if users should have one or both options.
● Users can attach generated document to the Email. This option is - SAP CPQ Admin is able to define
whether option to attach document is hidden, visible, or pre-selected for the user.
● Predefine Email Subject - Admin can predefine email subject. Also tags and expressions can be used.
● Predefine Email Body - Admin can predefine email body. Also tags and expressions can be used.
● Update Opportunity activity in Salesforce after sending Email to Customer - Set to TRUE in order to update
opportunity activity every time email is sent.
● Attach document to CRM opportunity when sending Email to customer - Set to TRUE to automatically
attach generated document to opportunity.
● Hide option to send document to opportunity from user - Set to TRUE to hide button 'Send to CRM'
● Show Generated Document On View Proposal - Admin is able to set if generated document can be
downloaded from View Proposal.
● Show Quote On View Proposal - Admin is able to set if generated document is shown on View Proposal.
● Users can send quotation link in the Email to customer for electronic acceptance process. This option is -
SAP CPQ Admin is able to define whether option to send quotation link is hidden, visible, or pre-selected
for the user.
To make action Send Document to CRM visible on the Download Document and Send Email page, set
application parameter Hide option to send document to opportunity from user (located in the Email
Customers/Quote Acceptance Settings, in the Quotes submenu) to False.
You can translate a Predefined Email Subject or a Predefined Email Body using Dictionaries and CTX tags (our
example illustrates how to translate the Predefined Email Body). To translate a Predefined Email Subject, you
must first choose the Dictionary Key [page 595] of the value you want to appear in the email body. Once you
have done that, you should complete the following:
1. Go to Quotes Email Customers/Quote Acceptance Settings where you will click the syntax checker
button, select CTX from Available Tags and click Construct CTX tag.
2. Select Dictionary from the Select CTX tag object dropdown menu; select Current from the Select Dictionary
object
3. To insert the value of your previously chosen Dictionary Key, select Value from the Select Current object
dropdown menu.
4. Click the AB button (Show Editable Argument) from the Select Value argument to be able to insert your key
between brackets in the Your CTX tag: field
5. Click Insert.
6. Check to see that the Condition entry field has been populated with the appropriate CTX tag; note that you
will have to manually enter the Dictionary Key in the field.
7. Click Check Syntax and if the system OK's it, click Update.
4.15 Favorites
Favorites will be presented to users in a widget that will be placed in different pages in SAP CPQ (quote, catalog,
configuration and special page for Favorites).
For each favorite, users will be able to see favorite’s name, favorite’s description, part number, product that is
used as favorite’s base and category where this product belongs to. Users will be able to search favorites based
on all these fields. User will be able to sort all columns in this table. Search There are three check boxes on
which user will specify whether they want to search My Favorites, Company Favorites and All Favorites. By
default, all three check boxes will be selected.
Users will be able to add favorites to current quote or to create new quote (if one is not loaded yet in session)
by choosing one or more favorites from table and clicking on ‘Add to quote’. If result is success for favorite, it is
added to the quote. If at least one favorite is incomplete, user will not be immediately taken to quote. Instead,
same screen will be displayed to user from where he can continue to quote or complete favorite (clicking on
‘complete’ link will take user to product configuration with favorite loaded).
User will be able to delete only favorites they have created. System will prompt user whether he/she is sure
favorite should be deleted.
● Add to Favorites - Users will be able to add both simple and configurable products to favorites from the
catalog (for simple product there will be only ‘Add to Favorites’ icon).
● View Favorite Configurations for this product - In catalog, users will be able to see icon for configurable
products (as well as systems and collections).Mouse over for icon will be ‘View Favorite Configurations for
this product’. When user clicks on ‘Favorite Configurations’ link, favorites for that product will be displayed.
Users will be able to add favorites to current quote from the widget. New quote item action ‘Create Favorite’ will
be added. When users click on it, pop-up will be displayed where users will be able to enter favorite’s name and
description. Item action will be available for all main items (both configurable and simple products).
The purpose of this feature is to enable images for quote actions so that users can easily spot them.
User Side
In quote, depending on value of application parameter,actions will be displayed with images. Actions will be
sorted by sort order (actions with empty sort order field will be displayed at the end). If actions have empty sort
order (applicable for all existing clients), quote actions will be displayed in the same order as before. Some
actions will always be displayed and some will be collapsed.
There will also be a flag (application parameter) – ‘Display images for quote actions’. When this flag is selected,
users will see quote actions in the quote. Default value for flag will be FALSE.
The purpose of this feature is to allow MRC total amount as column in the list of existing quotes.
In Setup Quotes Column Headings and in Setup Quotes Search Fields administrator should
add new field ‘Total MRC Amount’ to the list of Available Fields.
This field will return total MRC amount on user’s side in the same way as field ‘Total Amount’ returns total NRC
price.
The purpose of the Quick Config functionality is to provide a shortcut for searching and configuring the
configurable product at the same time.
This is achieved by entering a part number and attribute values that you would like to configure for the
particular product. If your search query matches the search pattern for that product (previously defined
through SAP CPQ setup by administrator), then SAP CPQ finds your product, preselects attributes that you
stated in your search query and finally adds product to the quote.
In classic design, the Quick Config field is located at the right side of the main menu. In responsive design it is
located in the quote.
If you are using classic design quick config, you should choose “Part Number Search” from the dropdown, type
your search term and click on search button.
If you are using responsive design you should enter the quote, type your search term and click on the “gear”
button at the right side.
Note
To make the next example applicable, make sure that parameter Setup General Application
Parameters tab General Parameters Optimize Part Number Search For Simple Products has its value
set to false. This parameter must be set to true only if you want to search simple products. If this parameter
is turned on, then Cat Matching table search is ommited, and search is only performed against products
table
Example
This example explains how to set up a Quick Config for the product. It also demonstrates this functionality in
action.
Steps for administrator to create a product that will be searchable by Quick Config.
1. 1. Go to SAP CPQ Setup Products and add a new configurable product named: Mercedes Benz w204
C class
2. 2. Define three attributes for this product as follows:
1. attribute Color with four possible values: gray, black, white, red
2. attribute Fuel with two possible values: petrol, diesel
3. attribute Equipment with four possible values: classic, elegance, avantgarde, amg
3. Create a part number as follows: mercedes-c-w204-<*VALUE(Color)*>-<*VALUE(Fuel)*>-
<*VALUE(Equipment)*>.
Note that, this way, you defined a dynamic part number that depends on selected values for three
attributes.
4. Under Current product click on Code Matching item.
Here define a code matching searching string that will be checked during quick config searching
5. Enter matching string as follows: mercedes-c-w204-
Now, when you are done with quick config set up you can see how it works.
In classic design type search term as follows: mercedes-c-w204-gray-diesel-classic. SAP CPQ will check if
there is a product in your list of products that has this particular part number. Since there is no product with
this part number, quick config search begins. In the essence, quick config will check your list of Code Matching
strings to check if any code matching string matches your search term. If it is found (in our
example ”mercedes-c-w204-” code matching string will be found), quick config will then check if the rest of the
search term contains values of product attributes. If it contains, and values are valid (in our example they are),
quick config will redirect you to the Configurator with the product configured according to your search term.
Apparently, you will get the product Mercedes Benz w204 with preselected attributes color, fuel and
equipment. Their preselected values will be gray, diesel and classic, respectively.
Note that there is an assumption that each product that you want quick config to take into consideration,
should have unique part numbers and code matching strings. Also, quick config must find only one product
and configure it if your search term contains the appropriate, valid attrbiute values in the right order as you
defined it in part number field. If the order of attributes is not good, or attribute values provided through the
search term does not fit, then quick config will not be able to find the product and the appropriate message will
be displayed.
If you want to add more than one products to the quote this way, you should use bulk validation feature. Here is
an example how to add and configure two different products by using Bulk validation and add them to the
quote.
Let's assume that there is another product named “BMW Serie 3” in our product list and that Code matching
string bmw-e90-3- is defined for that product. Two attributes, color and fuel are defined and part number of
this product is bmw-e90-3-<*VALUE(Color)*>-<*VALUE(Fuel)*>
Quick product search on ‘Add Products’ section is used for finding all types of product (simple or configurable)
or favorites by typing any part of its part number, product name or description.
When user enters search criteria, SAP CPQ will look for products that have entered search criteria anywhere in
the part number/name/description, or on the beginning of the word(depends on how application parameter is
set).
When search doesn’t produce any results (both within favorites or products), SAP CPQ will show the messages
for part number search: Auto-complete search didn’t find any products or favorites with this part number. The
same message will be displayed if the appropriate name/description is not found.
When users click on See more results link in the message, SAP CPQ will try to find products by using standard
product search (as if user clicked on the product part number search) in the top right corner of the screen. If
SAP CPQ finds any results, user will be taken to the catalog where results are displayed (in the same way as if
Quick product search from the quote will be controlled with new application parameters, Product Search On
The Quote Can Find Configurable Products and Product Search On The Quote Can Find Product Favorites. They
are set on TRUE by default. If parameter Product Search On The Quote Can Find Configurable Products is set to
TRUE, SAP CPQ will look for configurable products when user starts typing either part number of name/
description (SAP CPQ will look for matching part numbers/names/descriptions in the same way as it looks for
simple products – there will be no reverse configuration done, parsing of descriptions and so on) If parameter
Product Search On The Quote Can Find Product Favorites is set to TRUE, SAP CPQ will look for favorites when
user starts typing either part number of name/description (SAP CPQ will look for matching part numbers/
names/descriptions in the same way as it looks for simple products – there will be no reverse configuration
done, parsing of descriptions etc.) When user clicks on the product, he will be taken to the product
configuration. If user came from the quote (and not from the catalog), breadcrumbs will be different – Current
Quote link will be displayed instead of categories. It is important to note that there will be no products loading,
processing of product rules, description parsing etc. when search results are displayed. This will happen only
when user clicks on the product.
User has entered SAP CPQ and goes to catalog start page. Instead of browsing through categories, user can
start typing product, category or favorite name and find appropriate item. This will reduce the time it takes for
user to find the item that she is looking for – typically users know what they want to quote. This behavior will be
controlled with application parameters: Enable auto-complete product search in catalog by part number and
show part number in results and Enable auto-complete product search in catalog by product description and
show description in results. If those params are set to TRUE, user can choose will search be done via product
part number or product name/description.
User has different search options for categories: Entire catalog (Search is done for entire catalog) and Category
Name specified (Search is done within this category and all its sub-categories and their sub-categories and so
on).
When user clicks on ‘See more results’, they will be taken to the catalog where SAP CPQ will search for the
products in the same way as if user entered part number or name/description in the top right search box (in
top menu) and clicked on Search.
When search doesn’t produce any results (both within product or favorites), SAP CPQ will show following
messages for part number search: Auto-complete search didn’t find any products, categories or favorites with
this part number.
● Configurable product - In this case, user is taken to the product configuration page
● Simple product - View details pop-up is displayed for this simple product
● User has the option to Add to quote. If this is clicked, product is added to the quote and user is taken to the
quote screen (if quote doesn’t exist at this moment, new quote gets created)
● Favorite - By using the same logic as for products, user is either taken to product configuration screen or
product details page is displayed with favorite name and description displayed instead of product name
and description
● Category - User is taken to this category
Custom fields on quote items are enabled so those are able to hold values of different types.
Users are able to edit values of item custom fields in the quote. When administrators add new (or edits
existing) custom field, they are able to administer item custom field:
● Name- This field is required. You cannot save two or more custom fields with the same name
● Label- When you are defining new fields, after you finish typing a name, the label is populated with what
was typed in the Name field.This field is required.
● Type- Once you define the type of the field, it cannot be changed. Five types are available:
○ Number - (selected by default). Custom fields of this type can have decimals. They can also have
negative values.
○ Date - Custom fields with Date type will be saved in the same way quote custom fields that are dates
are saved (in default format mm/dd/yy).
○ Currency - Custom fields of this type are calculated and saved in the same way as other prices in SAP
CPQ (list price, cost, extended amount etc.). Values will be saved in default currency (dollar) and
current market and currency factors will be applied when displaying this value.
○ Text - all characters are supported.(When admin is editing existing field, this field is displayed as read-
only)
● Attribute - This type allows you to connect your quote item custom field to an attribute. This way, in the
quote, you get the text box where you can select the quote item custom field value from the list of attribute
values. If you set an attribute of the type „Auto-complete“ to be connected to your custom field, then in the
quote, instead of drop box, you get the autocomplete text box where you can type a value that you want to
assign to your quote item custom field. As you start typing, autocomplete offers a list of values that either
starts with the typed combination of letters, or contains it. You can also set the value of autocomplete item
custom fields via scripting by using the Value Code property, as explained in Autocomplete Attributes
[page 44].
● Order of calculation - This field can accept only numbers. Default number is 10. If admin deletes everything
and clicks on the field, value 10 is saved for the field.
● Calculation Formula - This field will accept standard SAP CPQ tags.
● Display summary in the quote - Default value is FALSE.
● Always include in KO context - When the checkbox is selected, the field is included in the knockout context
and sent to the user's browser. Consequently, you can use the hidden quote item custom field for
processing in responsive templates. (Example: A quote item custom field controls whether a product’s cost
used for calculating the line item’s list price is editable. The field is hidden from quotes as users do not
need to see its value. However, if Always include in KO context is selected, administrators can use the field’s
value when defining the responsive templates to control whether the list item’s price is editable or not.)
● Contains Personally Identifiable Information - All information that could potentially be used to identify an
individual should be flagged as PII.
Note
If a quote item custom field is not visible on the quote layout, and the Always include in KO context is
selected, the field value will be visible in the hiddenValues observable array. To retrieve the field value, use
getHiddenValue(“QICF_Name”). If a field does not exist, the function returns FALSE. The function does not
have to contain the complete name of a quote item custom field. You can enter only a part of the name and
the system will find the first field whose name starts with the defined string and it will return its value.
Example
Log into SAP CPQ as an administrator and go to Setup. You need to create a new attribute of type Auto-
complete, and then select it as an underlying for your custom field. If you need instructions on how to create an
Auto-complete attribute, take a look at Autocomplete Attributes [page 44].
Once you have created the attribute, you want to create new Quote Item Custom Field by going to Setup
Quotes Quote Item Custom Fields and clicking on Add New button.
Fill out Name field, select Attribute from the Type dropdown list and select the particular attribute (that you
have previously created). Click Save.
In order to be able to see your newly created Quote Item Custom Field, you need to do three things:
More information on how to add the custom field to the appropriate permission group is available on this link -
Quote layout permissions [page 310]
More information on how to move the custom field to the list of visible fields is available on this link - Visible
fields [page 310].
Also, you will have to insert a translation for your custom field into SAP CPQ dictionary. You can find more
information on how to achieve this by following next link - Cart item custom field localization [page 475]
Now, your Quote Item Custom Field is set up. To see how it works, go to catalog and create a new quote. Your
custom field is displayed in the quote as a column and you are able to select a value for it.
Once you define the type of the field, it cannot be modified. (When admin is editing existing field, this field is
displayed as read-only)
Order of calculation - This field can accept only numbers. Default number is 10. If admin deletes everything and
clicks on the field, value 10 is saved for the field.
Calculation Formula - This field will accept standard SAP CPQ tags.
If certain field is found among quote editable fields (found in Editable Field group), it will be displayed as every
other editable field. When developing this template in xslt, we should make an effort to make it as easier as
possible for the admin to show item custom fields in the quote. When user clicks to edit currency item field, it
will be displayed as every other price field on the quote. When user edits number field, it will be displayed in the
same way other numbers (e.g. Quantity) are displayed on the quote. After user changes value for particular
field, SAP CPQ will display icon indication that currently displayed value is different from default value (default
value is calculated every time other quote item custom fields are calculated). This icon will be displayed only if
default value is not empty (if it is empty and user entered something in the field, no icon will be displayed).
Note
Quote item custom fields are created and evaluated once quote items have been created, so they should
not be used in any item calculation, including item discount, multiplier, etc. Additionally, they should not be
used in any item information, including information regarding the product or attribute, such as description,
part number, price, cost, among others. That said, it is possible to use quote item custom fields in item
calculations or item information – but this can be carried out only with a Reconfigure action which can
negatively affect system performance. For this reason, it is not recommended.
SAP CPQ will execute calculation only if any of the data used by the quote has been changed. For example,
if the entered value of a particular custom field was 100, and has remained 100 following any changes, the
calculation will not be executed.
● CurrentItem:
○ <*CTX(Quote.CurrentItem.CustomField(“CustomFieldName”) )*>
● Total:
○ <*CTX(Quote.Total.ItemCustomField(“CustomFieldName”).Summary )*>
○ <*CTX(Quote.Total.ItemCustomField(“CustomFieldName”).Maximum )*>
○ <*CTX(Quote.Total.ItemCustomField(“CustomFieldName”).Minimum )*>
○ <*CTX(Quote.Total.ItemCustomField(“CustomFieldName”).Count )*>
● Rolled-Up Items:
○ <*CTX(Quote.CurrentItem.RolledUpItemCustomField(“CustomFieldName”).Summary )*
>
○ <*CTX(Quote.CurrentItem.RolledUpItemCustomField(“CustomFieldName”).Minimum )*
>
○ <*CTX(Quote.CurrentItem.RolledUpItemCustomField(“CustomFieldName”).Maximum )*
>
This functionality enables system administrators, and selected users, to personalize their shopping cart/quote.
This functionality is available in Responsive Design only.
To use Quote Layout, open Setup UI Design Quote Layout . Once you complete this entry, a page
comprising Quote Columns and Quote Sections will open up.
The Available Columns list box contains all available quote columns. From this list, admins can choose which
columns they will be displayed in the quote. Admins can use left and right arrows to move selected columns
from an Available Columns list box to the Selected Columns list box.
The Available Selections list box contains all available sections. From this list, admins can choose which
sections they will be displayed in the quote. Admins can use left and right arrows to move selected columns
from an Available Selections list box to the Selected Sections list box.
The administrator will be able to set permissions for layout based on permission groups. She/he will be able to
set which columns/sections will be allowed to chosen permission group.
Quote Layout Permissions enables administrators to set permissions for the quote layout based on permission
groups. To determine which columns and sections will be allowed to which permission groups, go to Quote
Layout Permissions ( Setup Quotes . Once you click Add New you will be redirected to the Quote Layout
Permissions page where you can select which column/sections will be open to which permission group.
On this page you will be able to define one permission group that will be allowed to see Quote sections/
columns. You will be able to find this permission group from a list of User Types, Companies, Brands and
Manually Created Groups.
The permission group Visible to Everyone will be added by default. This permission group contains all
permission groups and cannot be deleted.
User Side
Users will be able to set their own Quote Layout and change behavior set for their permission group. This is
done on the User Quote Layout entry on the User Page menu. Once you click this link, a page will open up where
you will see:
● Quote columns
● Quote sections
The Available Columns and Available Sections: only columns and sections selected for the user’s permission
group will be displayed in the Available Columns and Available Selections lists. Selected columns will be
populated based on the selection in the Quote Layout Permission. Users can override this by hiding columns
When Display summary in the quote is checked on the Quote Item Custom Field in Quotes in Setup: related data
should appear in Product Types and Totals in the quote if the field is selected in Quote Layout in Setup and on
the User Side.
Note
Note that the value entered in the Type field must be Number or Currency. The system will not recognize
the Text value type.
Before viewing your Quote Item Custom Field in the quote, don’t forget to add your it to the appropriate Quote
Layout Permission Group and Quote Layout.
Related Information
Quote Troubleshooting
A quote revision is a copy of the quote from which the revision was created.
You can create as many revisions as needed and they do not have to be directly sourced from the master quote.
All revisions with a common master quote have the same quote composite number.
When you create a quote revision, all the data from the source revision will be copied to the new revision. All the
subsequent changes will not be propagated from the source quote to the revision and vice versa.
Quote revisions allow sales representatives to create multiple quote versions before the final agreement on the
offer is reached. Additionally, they can track how the offer changed over time by accessing the revisions’
history.
Example
A sales representative John is creating a quote for a family looking to refurnish their kitchen. The family wishes
to buy a table and a cupboard, so John creates a quote for the pieces that fit into their budget. Additionally,
John creates a quote revision and adds a set of chairs that match the design of the table and the cupboard. The
family likes the new offer but they think the price is a bit out of their range. John creates a new revision,
changes the discount and sets the revision as active. From there on, the revision will go through the approval
process and if the revision gets approved and the family accepts the offer, the deal will be closed. If new
changes to the offer are needed, John will create new revisions accordingly.
Setup Prerequisites
Handling quote revisions is completely on the user side of SAP CPQ, and other than the workflow settings, no
other adjustments need to be made by administrators.
First, you need to allow the user type to access the revisions-related actions. In Workflow/Approval
Workflow Permissions , allow the user type to access these actions:
● Edit
● View
● Delete
● New Active Revision
● New Revision
● History
● Set Active
Also, in Workflow/Approval Workflow , add the actions to the quote status. Secondly, in General
Application Parameters , find the parameter Available actions for Inactive Revisions and select one of these
values:
● Based on status of ACTIVE revision - users can delete and edit only the active revision. Also, when this
parameter is on, you can create an active revision only from an active revision.
Application Parameters
● Reset Quote Expiration Date on New Revision - if set to TRUE, the system resets the expiration date of every
new revision. The parameter is supported by both Quote 1.0 and Quote 2.0.
● Copy Opportunity Id On New Revision - if set to TRUE, opportunity Id is copied to every new revision of the
quote. Supported only by Quote 1.0.
Context
There are several default quote tabs which enable you to access and edit billing and shipping information,
upload files to a quote and so on. You can also add new tabs if needed.
Quote tabs can only be created after general tabs [page 594] are created. To create a quote tab:
Procedure
The Tab Name dropdown list shows all existing general tabs, including the ones you created.
4. In the Type dropdown list select one of these options:
○ Implementation File: when selected, it renders an existing SAP CPQ page in the quote tab. Some of the
pages are loaded in classic design only, even if you are using the responsive design. On selection, the
available implementation pages display in the Implementation file dropdown list. If you wish to add only
custom fields [page 272] to the custom quote tab, leave the Implementation File field empty. The blank
custom quote tab will still be visible and it can be added to quote. You can add custom fields at any
time.
○ /quotation/ShippingInfo.aspx
The page where all the custom tabs are listed is displayed.
When a quote tab is created, it will be visible on the quote. You can manage the visibility of the quote tabs
on the Quote Tab Permissions [page 271] page.
Renewal process allows companies to resell the exact same product or a service after some period of time to
the client to whom it sold earlier. Various sales scenarios could be considered as renewal: Auto renewal,
Product upgrade, Contract extension, etc.
Products or services sold to some client are usually recorded in external system, (e.g. CRM) in the form of
“Assets”. Assets provide details on the existing products/services that Customer is using, like Product name,
Price, Install date, Usage end date, etc. All information contained in the “Assets” is usually sufficient to
understand when and what should be renewed for particular Customer.
SAP CPQ offers its own renewal process, so all assets can be stored locally. On this page, you will find more
information on how to set up a Renewal Process in SAP CPQ, and how to utilize it.
The first step in creating and enabling Renewal Process is to create an Asset table. This table is going to be
used to store details on each asset created in your SAP CPQ environment. Note that you can define only one
Asset table.
To create Asset table, log into SAP CPQ as an administrator and go to Setup Renewal Administration
Define Asset Table
There is a list of available fields, list of selected fields and a list of fields that you want to be visible on UI. Note
that in column Selected Fields, some fields are pre-selected and you cannot deselect them. You can add more
When you sell a product or service to some customer, you have the option to create an Asset. Later, when you
want to resell the asset to the client, you can go to your list of assets, pick the desired asset and add it to the
quote (renew the asset). Depending on how you setup your Renewal Process, once the quote is completed,
either existing asset is going to be updated, or new asset is going to be created.
You define the phase when the asset is to be created through Workflow. There is an action named Create Asset
that can be set in workflow as a post action for some quote status (e.g. Quote Won status), that will trigger
automatically.
An asset can be in one of the following four statuses:
● Purchased – Meaning that the asset is added to the asset table after the quote is completed
● Pending – Meaning that the asset is added to the new quote which is not yet completed
● Renewed – Meaning that the asset is renewed (Update Asset option is not checked), and new asset is
created from it
Asset table contains information about products previously purchased by the customer. By selecting which
asset is to be renewed, and then clicking on the “Renew” button, the selected assets are added to the quote.
Assets may have different statuses, but only assets that are in the status “Purchased” can be renewed.
In the next section, you will read some details on how to setup your Renewal Process.
This is the action which creates Assets for you. To find and set up the action, go to Setup Workflow/
Approval Actions , and find action Create Asset from the list of actions. Click on edit icon.
The purpose of this action is to record products from the quote into the Asset Table. On edit page of the action
you can set conditions under which the action will be performed.
You may decide that only particular user group(s) should be able to perform Asset renewal. You can set up this
by setting action condition and/or workflow permissions. Action could be attached to the quote status, and
once the quote reaches the desired status (e.g. Closed/Won), the Main Line Items along with the product
configuration will be automatically recorded in the Asset Table.
Two options are available to control product behavior in the renewal process (Update Asset and Always Allow
Renewal). They can be found in the Additional Product Data section under Setup Products Product
Definition .
Update Assets
If this option is selected, then when Create Asset action is triggered, the existing asset is updated. It changes
status from Purchased to Pending. In the contrary, if this option is not selected, then the existing asset changes
its status to Renewed, and the new version of the asset with status Purchased is created (recorded in Asset
table).
If this option is selected, it will be possible to renew assets in the obsolete status. Those are assets that have
underlying product with an inactive product version.
Renewal management fully supports complex product configurations, including configurable products and
parent-child product configurations. When the user adds a configurable product from the asset table into the
quote, the entire configuration that was initially sold to the customer will be automatically added into the quote.
Example
In this example, we will show you the life cycle of the asset and how the renewal process works. We have a
configurable product named „Hosted email“. We want to sell this product and also to have an asset once it is
sold.
Earlier, we have configured our workflow in the way that our action „Create Asset“ triggers as a post action on
the quote status „Quote Won“.
We created new quote by configuring and adding our product „Email hosting“ and we put 10 as a number of
desired emails.
The quote is in status Open. We worked on the quote, entered billing and shipping information, generated
quote, and finally completed quote (meaning that quote is now moved to status „Quote Won“).
By completing the quote, action „Create Asset“ is triggered, since, previously it has been set as a post action.
Since action is triggered, our asset is recorded and we are able to find it in our Asset table (list of assets).
Assuming that we want to resell „Hosted email“ product to the same client, configured exactly the same, we
can select the asset in our Asset table and click on Renew button above asset table.
This way, we created a brand new quote with „Hosted email“ product configured exactly as it used to be. At this
moment our asset is in status „Pending“.
Now, we go to the quote, and update quantity field from 10 to 15, and complete the quote. Since the quote is
completed, action „Create Asset“ is triggered one more time.
Since the option „Update Asset“ is selected for our product, our asset is updated with new values (quantity is
now 15), and it moved to „Purchased“ status again.
If the option „Update Asset“ was not selected, then our previous asset would have gotten status „Renewed“,
and a brand new asset would had been created with status „Purchased“.
Now, if we go to product setup and make a product version 1 inactive, and option „Always Allow Renewal“ is not
selected, our asset will be in status „obsolete“.
But, if you select option „Always Allow Renewal“, then asset will be in „Purchased“ status and therefore
renewable.
This feature gives users a Reports and Dashboards Overview Page that includes a list of existing reports in the
system. As an SAP CPQ administrator, you can search reports and executed different actions on them.
Here is a list of all actions available on each report: edit, clone, view, and delete.
A Delete button is located at the top right corner. Administrators can select several report actions and delete
reports in bulk. This enables administrators to avoid having to delete one by one. To create a new report click
New Report and to create a new dashboard, click New Dashboard. The list on the left contains all existing labels
created by admins users. Labels help admin users organize reports into categories. Administrators can add
more than one label to a report, which makes it easier to find a report when searching for it.
Labels help administrators organize reports or dashboards into any category. Labels do all the work that
folders do, but with an added bonus: more than one label can be applied to a report or dashboard.
By selecting a particular label, you can filter out items contained only in that label in which case the active label
will be marked red. You can reset the label selection by clicking the root node Labels view all items.
When viewing reports, you can tick the checkbox next to the reports, click Labels, and click the label you want
to associate with the report(s). You can also check the boxes next to several labels and click Apply.
To manage labels, you must locate one of the existing labels on the left-hand side and click it. When you right-
click it, it will open a context menu with the following actions: add, rename and delete.
Labels can be added as a sub folder of a root label, or as a sub folder of existing labels. You can also rename the
label as well as delete it.
The sub-label can be created below a label that already exists by selecting which label you would like to place it
under. Then click Add Label in the context menu. The hierarchy can also be changed by moving nodes using
drag and drop.
Create New
When you click New, you can choose to create the following: report, dashboard, and predefined report.
You can also create a new report using the Report Wizard. To do so, you must choose New Report to go to
Report Wizard.
The first step of the Report Wizard contains the following fields:
The Report data source field contains a list of views/tables or stored procedures that were configured to be a
possible source of data for this report. All tables/view and queries that are created in the Report module
administration will be listed when creating a new report. You will also be able to create a data source, which can
be done in the administration section of the Report module. Report Type supports three types of reports: Table,
Chart and Gauge. Depending on the selected report type, you will have different screens for entering the
remaining information needed to complete the report creation process.
A report module enables report creators to add custom filter conditions, to group and organize them and to
provide report parameters (called dynamics and dynamic inputs). This will allow end users to provide
additional data for retrieving records from the data source and displaying them on the report.
You can add a filter condition for any of the available fields from the selected data source by choosing a value
from the Select drop-down list.
The default option for any of the new conditions is a predefined value. A predefined value is used to filter
records from the data source and it cannot be changed when executing the report.
If report creators want to provide an additional level of flexibility they can create a condition that will be
resolved when the report is being executed. Such conditions are composed from a set of predefined system
parameters, such as @ContextValueKey, $UserId, $UserName etc.
Greater flexibility can be achieved with dynamic input conditions. These conditions represent ad-hoc
parameters which must be provided by a report consumer at the time of execution.
Grouping Conditions
With grouping, a report creator can organize existing conditions in a hierarchical way and connect them with
either AND or OR logical operator. This new group section can contain any number of simple conditions or child
groups. You can change the position of the simple element or group using a drag and drop functionality.
While we don't recommended it, it is possible to nest an unlimited number of subgroups within any group of
conditions. A logical operator for a group can be changed from AND to OR and vice versa by clicking a toggle
button in the group header which shows the current logical operator. You can collapse and expand a group and
unigroup's conditions at any point, as well as delete a group.
The Tabular Report Type contains one step that must be completed in order to add the information needed for
the generation of this report type. You must choose what fields will be included in the report and decide if you
want to create a row or column groups. You can make the selection by dragging and dropping the fields from
the area “Available fields” to areas, such as “Row Groups”, “Column Groups” or “Values.”
Fields for a chart report are selected in the same way as fields for a tabular report type.
The Report Viewer Page contains the report and, alternatively, report parameters defined using dynamic input
fields created in the Report Criteria page. Based on the report filter definition, some fields can be made
mandatory or can use existing lookup views as the data source for selection.
Microsoft Report Viewer Control is used for report rendering on the page. It contains standard controls for
paging, searching and exporting (pdf, excel, word).
A Report Viewer Page may contain several tabs for faster updating of the report definition or report filter
definition on the left-hand side: Report, Criteria Definition, and Report Definition.
Based on the report type a report view page can contain additional control with parameters related to the
current report. Chart types reports can be changed inline. This inline change is temporary and allows end-users
without administrative permissions to change parts of report layouts, as well as export such reports.
When you click Administration Data Source , the list of all data sources (table/query/view) is displayed.
You can create a new data source and when you click Add, the following fields are displayed: display name,
type, and name.
All fields are required. When Table or View is chosen, a list of all tables and views will be displayed, with an
administrator able to choose a desired table/view.
If Query is chosen, a field in which a SQL query should be written will be displayed.
Lookup Fields
Creating a lookup field can help improve the efficiency of the data entry process. The fields that are candidates
for lookup are usually the ones which are foreign keys. Let’s say that in a table called “Activity” we have a
The first step is to enter a new data source and choose a User table.
The “Is Lookup” field must be checked and other two fields (Value and Display Field) must be populated in
order to create a lookup source. The Value field, in this case, is a user id; for a display field you can choose any
column from the Users table, for example, username, email, first name, last name, etc.
The second step is to open another data source and locate an “uid” column from this source. When you open a
detail view of that column you will see a new field called “Lookup.” This drop down will now contain a “Users”
data source previously defined as lookup.
Instead of numeric control, the new lookup control will be displayed on a report filter page when once you
choose this column. This control is more advanced and contains one label and two buttons.
When you click the first button a window with advanced grid control will pop up. It will include search, paging
and a sorting functionality. At this point, you can make your selection by double-clicking a row in the grid, or by
selecting a row and then clicking OK.
The Grid Control will contain only those columns that we chose in the Display Name field. Once you select an
item from the grid, a label will contain the Display Name.
The Report Module supports adding RDL report templates which can define a standard layout for various
reports, such as defining the standard header and footer section on all reports. This RDL template file is a
standard RDL report, created using a Microsoft Report Viewer, Visual Studio or some other tool. An RDL
template can be any valid report definition file containing a placeholder element. This can be rectangle element
named “Report”. This rectangle element will define the actual size and position, so you can specify how much
space is allowed for a table, chart or gauge.
The Lookup Control used for report template selection also contains a preview functionality which enables you
to see the preview of the RDL Template. We recommended that the RDL template creator puts a visible border
on a rectangle placeholder so that a report creator can see its position and the dimension before generating a
report with a selected template. The placeholder border will be removed once the report is generated, so it is
used only for preview purposes.
New templates can easily be uploaded on the same control, by clicking the Add button.
Dashboards give you a bigger overview by displaying summaries of different reports as widgets on a single
page. With a dashboard, you can monitor more reports at once. A list of existing dashboards can be found on
the “Reports and Dashboards Overview Page” where you can easily find or create a new dashboard.
You can insert am existing report or frame in each widget on the dashboard page. You can choose to insert a
chart type report or a tabular report in iframe. To do so, you must specify the format type that will be used for
this report (pdf or image).
Internationalization and localization are supported in Report Module. The Application Client of Report Module
can specify culture and language which should be used. Appropriate Date, Time and Numeric Formats are
applied based on the culture used.
Adding New Languages is also supported in the administration part of Report Module. Import and export of
existing data enables you to edit translation in Excel and then easily upload it back onto the server.
User Side
When you click the Graphic Reports page, you will be redirected to the page where all reports visible to users
will be displayed in the iFrame. Users will be able to run/view reports on the User Page. All reports that are
visible to a user's permission group, will be displayed on this page. Default reports will be visible to users as
well. If the user is an SAP CPQ administrator, he or she will be able to view/run all default reports. But if the user
is not an SAP CPQ administrator, the user will be able to run only the context reports with associated him or
her.
Listed here are the standard quote fields that are present in the quote by default.
Market The market selected for the currently open quote, with a de
fined currency, market factor, and pricebooks.
Pricebook The pricebook selected for the currently open quote, which
contains defined product prices.
Date Created The date when the currently open quote was created.
Date Modified The last time the currently open quote was modified.
Effective Date The date that determines which prices are displayed for
items in the quote, depending on the period for which the se
lected pricebook entries are valid.
Cart Comment The field that allows users to leave comments on the quote.
The fields described in this table are standard quote item, product type, and total fields in the quote.
NRC Discount Percent The percentage discount that is given Item.DiscountPercent = 100 * Item.Dis
to the list price of the product. countAmount / Item.ListPrice
MRC Discount Percent The percentage discount that is given Item.MrcDiscountPercent = 100 *
to the MRC list price of the product on Item.MrcDiscountAmount /
recurring basis. Item.MrcListPrice
NRC Extended List Price The list price of a product multiplied Item.ExtendedListPrice = Item.ListPrice
with its quantity. * Item.Quantity
MRC Extended List Price The MRC list price of a product multi Item.MrcExtendedListPrice =
plied with its quantity. Item.MrcListPrice * Item.Quantity
NRC Discount Amount The amount that is discounted from the Item.DiscountAmount = Item.ListPrice
list price of the product. * Item.Quantity * Item.DiscountPer
cent / 100
MRC Discount Amount The amount that is discounted from the Item.MrcDiscountAmount =
list price of the product on recurring ba Item.MrcListPrice * Item.MrcDiscount
sis. Percent / 100
NRC Net Price The value that customers pay to the item.NetPrice = item.ListPrice * (1 -
seller after discounts are subtracted item.DiscountPercent / 100)
from the list price.
MRC Net Price The value that customers pay to the Item.MrcNetPrice = Item.MrcListPrice -
seller after all discounts are subtracted Item.MrcDiscountAmount
from the list price on recurring basis.
NRC Manufactures Gross Margin The net revenue that the seller retains Item.GrossMarginPercent = 100 *
after deducing the costs of producing a (Item.ExtendedAmount - Item.Exten
product from the product's net price. dedCost) / Item.ExtendedAmount
MRC Manufactures Gross Margin The net revenue that the seller retains Item.MrcGrossMarginPercent = 100 *
after deducing the costs of producing a (Item.MrcExtendedAmount -
product from the product's net price on Item.MrcExtendedCost) / MrcExtende
recurring basis. dAmount
NRC Rolled Up Gross Margin Percent The sum of percentage gross margin of Item.RolledUpGrossMarginPercent =
all child items. 100 * (Item.RolledUpExtendedAmount
- Item.RolledUpExtendedCost) /
Item.RolledUpExtendedAmount
MRC Rolled Up Gross Margin Percent The sum of percentage gross margin of Item.RolledUpMrcGrossMarginPercent
all child items on recurring basis. = 100 * (Item.RolledUpMrcExtendedA
mount - Item.RolledUpMrcExtended
Cost) / Item.RolledUpMrcExtendedA
mount
NRC Rolled Up Discount Percent The sum of discount percent of all child Item.RolledUpDiscountPercent = 100 *
items. Item.RolledUpDiscountAmount /
Item.RolledUpListPrice
NRC Rolled Up List Price The sum of list price of all child items. NA
NRC Rolled Up Extended List Price The sum of extended list price of all Item.RolledUpExtendedListPrice =
child items. Item.RolledUpListPrice * Item.Quantity
NRC Rolled Up Extended Amount The sum of extended amount of all Item.RolledUpExtendedAmount =
child items. Item.RolledUpNetPrice * Item.Quantity
NRC Rolled Up Extended Cost The sum of extended cost of all child item.RolledUpExtendedCost =
items. item.RolledUpCost * item.Quantity
NRC Rolled Up Discount Amount The sum of discount amount of all child Item.RolledUpDiscountAmount =
items. Item.RolledUpListPrice * Item.Quantity
* Item.RolledUpDiscountPercent / 100
NRC Rolled Up Net Price The sum of net price of all child items. item.RolledUpNetPrice = item.RolledU
pListPrice * (1 - item.RolledUpDiscount
Percent / 100)
MRC Rolled Up Discount Percent The sum of discount percent of all child Item.RolledUpMrcDiscountPercent =
items on recurring basis. 100 * Item.RolledUpMrcDiscountA
mount / Item.RolledUpMrcListPrice
MRC Rolled Up List Price The sum of list price of all child items on NA
recurring basis.
MRC Rolled Up Extended List Price The sum of extended list price of all Item.RolledUpMrcExtendedListPrice =
child items on recurring basis. Item.RolledUpMrcListPrice *
Item.Quantity
MRC Rolled Up Extended Amount The sum of extended amount of all Item.RolledUpMrcExtendedAmount =
child items on recurring basis. Item.RolledUpMrcNetPrice *
Item.Quantity
MRC Rolled Up Cost The sum of cost of all child items on re NA
curring basis.
MRC Rolled Up Extended Cost The sum of extended cost of all child Item.RolledUpMrcExtendedCost =
items on recurring basis. Item.RolledUpMrcCost * Item.Quantity
MRC Rolled Up Discount Amount The sum of discount amount of all child Item.RolledUpMrcDiscountAmount =
items on recurring basis. Item.RolledUpMrcListPrice * Item.Roll
edUpMrcDiscountPercent / 100
MRC Rolled Up Net Price The sum of net price of all child items Item.RolledUpMrcNetPrice = Item.Roll
on recurring basis. edUpMrcListPrice - Item.RolledUpMrc
DiscountAmount
Product Type NRC Discount Percent The percentage discount that is given ProductType.DiscountPercent = 100 *
to the product type and applied to the ProductType.DiscountAmount / Pro
list price of each product of the same ductType.ListPrice
type.
Product Type MRC Discount Percent The percentage discount that is given ProductType.MrcDiscountPercent =
to the product type on recurring basis ProductType.MrcDiscountAmount /
and applied to the list price of each ProductType.MrcListPrice
product of the same type.
Product Type NRC Discount Amount The amount that is discounted from the ProductType.DiscountAmount = Pro
list price of the product type and each ductType.ListPrice - ProductType.Net
product separately. Price
Product Type MRC Discount Amount The amount that is discounted from the ProductType.MrcDiscountAmount =
list price of the product type and each ProductType.MrcListPrice - Product
product separately on recurring basis. Type.MrcNetPrice
Product Type NRC Extended Amount The total extended amount of all prod NA
ucts in that product type.
Product Type MRC Extended Amount The total MRC extended amount of all NA
products in that product type.
Product Type NRC Extended List Price The total extended list price of all prod NA
ucts in that product type.
Product Type MRC Extended List Price The total MRC extended list price of all NA
products in that product type.
Product Type NRC Manufactures Gross The total NRC Manufactures Gross ProductType.GrossMarginPercent =
Margin Margin of all products in that product 100 * (ProductType.NetPrice - Product
type. Type.Cost) / ProductType.NetPrice
Product Type MRC Manufactures Gross The total MRC Manufactures Gross ProductType.MrcGrossMarginPercent =
Margin Margin of all products in that product 100 * (ProductType.MrcNetPrice - Pro
type. ductType.MrcCost) / Product
Type.MrcNetPrice
Item Total NRC Extended Amount The total extended amount of all items Totals.Amount = Totals.NetPrice
in the quote.
Item Total MRC Extended Amount The total MRC extended amount of all Totals.MrcAmount = Totals.MrcNet
items in the quote. Price
Item Total NRC Discount Percent The total discount percent of all items 100 * Total Product Discount Amount /
in the quote. Total List Price
Item Total MRC Discount Percent The total MRC discount percent of all 100 * Total MRC Product Discount
items in the quote. Amount / Total MRC List Price
Item Total NRC Discount Amount The total discount amount of all items Totals.ProductDiscountAmount = To
in the quote. tals.ListPrice - Totals.NetPrice
Item Total MRC Discount Amount The MRC total discount amount of all Totals.MrcProductDiscountAmount =
items in the quote. Totals.MrcListPrice - Totals.MrcNet
Price
Item Total NRC Extended Cost The total extended cost of all items in NA
the quote.
Item Total MRC Extended Cost The total MRC extended cost of all NA
items in the quote.
Item Total NRC Extended List Price The total extended list price of all items NA
in the quote.
Item Total MRC Extended List Price The total MRC extended list price of all NA
items in the quote.
Item Total NRC Manufactures Gross The total manufactures gross margin of Totals.NrcGrossMarginPercent = 100 *
Margin all items in the quote. (Totals.NrcNetPrice - Totals.NrcCost) /
Totals.NrcNetPrice
Item Total MRC Manufactures Gross The total MRC manufactures gross Totals.MrcGrossMarginPercent = 100 *
Margin margin of all items in the quote. (Totals.MrcNetPrice - Totals.MrcCost) /
Totals.MrcNetPrice
After defining statuses, the administrator needs to define the actions that will change the quote/order status.
For example, a desired behavior may be to change quote status from Open to Order Placed if a user clicks on
the Place Order button. There are three states in the workflow actions. Each relates to a tab on the load quote
page.
● My Quotes - (available for all users) My Quotes tab displays all quotes that the currently logged in user
created. This will likely be the most robust workflow as it is how each user interacts with their quotes.
● Waiting for approval - (This contains no quotes for most users except for users who are Approval Parents
for other users). These are the quotes of other users that the currently logged-in user is their approval
parent. This could be setup so that the Approval Parent has the option to:
○ Approve Quote
○ Reject Quote
○ or Forward Quote
Forward Quote may be used to forward the quote to another Approval Parent. This would be applicable in a
case where the value of the quote is higher than their allowed approval amount, for example.
● Other Quotes - (this also contains no quotes for most users except for the users given visibility rights) -
These are quotes of other users that the logged-in user is authorized to see through rules set in the Quote
Visibility section under the Quotes admin menu.
Note
Although some users might be marked as "inactive" in administration, their quotes are still visible, and they
might appear to some users on the "other quotes" tab.
The relationships between statuses and actions are specified through the Workflow Actions section of the
administration. This section is invoked by clicking on the Workflow Actions link under Workflow/Approval admin
menu.
The default view of the Workflow Actions section is the Table View. This displays the workflow in a grid pattern.
The table view is very efficient for defining workflow actions because it offers fewer mouse clicks and a table
that shows all defined actions on one screen. The left side of the table contains Pre-Action (Start) Statuses and
the top of the table contains Post-Action (End) Statuses. The list of actions in each intersecting square specifies
which actions will change the status listed all the way on the left side to the status listed all the way on the top.
For example, if a user clicks on Place Order while the quote is Open, the quote status will be changed to Order
Placed.
Alternatively you can view the workflow in a List View. This lists each start and end status along with the tab,
action name, conditions, pre actions, post actions and notifications. The List View is particularly useful for
viewing which actions have conditions, notifications, pre actions, and/or post actions defined. It also allows you
to quickly copy, delete, edit, and search for a workflow event. In this chapter we will discuss workflow
administration using the Table View.
Note
You can also click Expand All to view all defined actions, or click the [+] sign in each row or column to show all
defined actions in the row or column respectively.
Status relations can be defined, not only for User's own Quotes (My Quotes), but for Quotes assigned to the
user for approval (Waiting for approval), and for Other Quotes (for the users allowed to see quotes logged by
other users). To switch between My Quotes, Waiting for Approval and Other Quotes areas, select the
corresponding tab at the top left corner of the table. Consequently, status relationships can be defined for any
one or all three from this screen. The active status area has the same background color as the top border of the
table.
Example
The following shows the Workflow Actions table for SMB computer store with the Open (start) row expanded:
On the user side, adding an item to quote creates a quote and sets the status to open (or whatever status is set
as the default). A first set of actions are visible from the quotation tab.
The process of specifying an action is performed by clicking the or button in the intersection between the
Start Status and the End Status.
Next to the actions are buttons that will allow further tailoring. The following are available for each action:
● Automatic Configuration - Automatic configuration determines if the items in the quote use their initial
product rules and pricing (the product rules and prices used when the quote was generated) or if the items
in the quote need to be reconfigured (updated using the current product). Selecting the Automatic
Reconfigure checkbox adds a suffix of R to that action, like Copy-R, or Edit-R which means that the item
would be revised or reconfigured using the current rules and pricing every time the action is used.
Unchecking the Automatic Reconfigure checkbox ensures that the items in the quote keep the original
rules and pricing used at the time the item was added to the quote.
● Perform On - Will either be Cart or Cart Item. Cart Item actions are generally action buttons visible in the
Quotation tab, while Cart actions are generally actions performed on the quote from the load quote page.
● Condition - Allows a check to be performed to determine whether or not the action will be available.
● Notification - Gives the ability to send out email notifications when the action is performed.
● PreAction/PostAction - Custom actions can be done before or after the action is completed. Commonly
this is used for CRM actions such as Create/Update Account or Contact.
Note
Users will be unable to use the actions defined unless they have been given permission to see the actions.
This is defined in Workflow Permissions [page 381].
Next to option for switching views, there are two more options: to copy workflow (since there are three
workflow tabs sometimes it can be usefull to copy the workflow from one to another) and clear workflow.
Quote actions
Upgrade to New Product Version – when a product has a newer version than the one that is already in a quote,
and something is changed in the quote while this check box is selected, users will be prompted to update
products to newer versions, or products will be upgraded automatically.
Note
To ensure these improvements work properly, the Upgrade to New Product Version action needs to be
enabled for the same quote status in both Workflow and Item Actions Workflow in Setup.
If you’re using Quote 1.0, you can check if a quote has incomplete items by using these CTX tags:
Action Conditional Reconfigure is similar to the action Reconfigure. It will apply newest product model to the
items in the quote. It differs from the Reconfigure action by the fact it does not reconfigure quote items always,
but only if the product version has been changed in the meanwhile, thus saving the time needed for the
operation. This means that Conditional Reconfigure action is faster if product version has not been changed.
Product version can be set in the Product Setup Wizard for each product. If Product Version is empty quote
items will always be reconfigured. If it's not empty it is compared to the one saved in the quote item to
determine if Conditional Reconfigure should reconfigure that item or not.
New flag is added to the workflow (next to Automatic Reconfigure) called Conditional Reconfigure. This is
available in the workflow for all actions where Automatic Reconfigure is available. When this flag is set and
action is executed in the workflow, same logic will be applied as in action Conditional Reconfigure: iterating
through all quote items , compare product versions and reconfigure item and save current product version if
product versions are different.
This is scheduled action that is executed once a day at midnight (server time) and it will automatically push all
quotes that are due to expire to Quote Expired status (or any other desired status), fire post actions or trigger
notifications for each quote. Since this feature is not enabled by default, there are certain steps that need to be
performed in order to enable it.
By default, quotes will expire 30 days after they have been created. This time period is controlled with the
custom field Quote Expiration Date ( Setup Quote Custom Fields ).
Quote Expiration Date is a standard custom field" which means that its Name and Type cannot be changed nor
it can be deleted. Everything else is configurable.
In the Quote Expiration Date window, you can see the Formula column is set to
<*CTX(Date.AddDays(30))*>, and Calculation Type to Once, when quote is created and there is no
selection for Tab (so it won't be visible to users).
Note
The purpose of this functionality is to enable users to send SAP CPQ Quote XML explicitly (by invoking the
appropriate action on the quote), or implicitly (by setting this action to be a pre or post action for some other
quote action).
Workflow Setup - The action Send Quote XML should be set up in the workflow. This means that appropriate
user groups need to have privileges to execute this action, and that this action should be put in workflow. Send
Quote XML can also be defined as a pre or post action to some other action (for example to Place Order).
Send XML to Http Address - If administrator wants the action to send XML to a Http Address , under Setup
General Application Parameters , on the Shopping Cart and Quote tab there is a parameter: When action
'Send Quote Xml' is executed, send xml to Http Address:. For more information on this
parameter and the following parameters, see Application Parameters [page 545]. This parameter is required
for Http sending, and it should be filled with appropriate Http Address.
Send XML to FTP Address - If the administrator wants the action to send XML to an FTP Address, the following
parameters should be adjusted under Setup General Application Parameters :
● When action 'Send Quote Xml' is executed, send xml to FTP Address: This parameter is
required for FTP sending and it should be filled with the appropriate FTP Address.
● Action 'Send Quote Xml' sends quote xml under the name:This parameter should be filled
with the template for XML document name that will be sent to FTP server. Example: Quote
<*CTX(Quote.CartCompositeNumber)*> will create XML document that will contain the quotation
number in its name (for example – Quote00010024.xml).
● Ftp Path: This parameter should be filled with the local folder path of the FTP server, where the file will be
saved.
● Ftp Username: This parameter should be filled with the FTP server username.
● Ftp Password: This parameter should be filled with the FTP server password.
The purpose of this functionality is to enable users to send SAP CPQ BOM XML explicitly (by invoking the
appropriate action on the quote), or implicitly (by setting this action to be a pre or post action for some other
quote action).
Workflow Setup - The action Send BOM XML should be set up in the workflow. This means that appropriate
user groups need to have privileges to execute this action, and that this action should be put in workflow. Send
BOM XML can also be defined as a pre or post action to some other action (for example to Place Order).
Send XML to Http Address - If administrator wants the action to send XML to a Http Address , under Setup
General Application Parameters , on the Shopping Cart and Quote tab there is a parameter: When action
'Send BOM Xml' is executed, send xml to Http Address:. This parameter is required for Http
sending, and it should be filled with appropriate Http Address.
Send XML to FTP Address - If the administrator wants the action to send XML to an FTP Address, the following
parameters should be adjusted under Setup General Application Parameters :
● When action 'Send Quote Xml' is executed, send xml to FTP Address: This parameter is
required for FTP sending and it should be filled with the appropriate FTP Address.
● Action 'Send Quote Xml' sends quote xml under the name:This parameter should be filled
with the template for XML document name that will be sent to FTP server. Example: Quote
<*CTX(Quote.CartCompositeNumber)*> will create XML document that will contain the quotation
number in its name (for example – Quote00010024.xml).
● BOM Ftp Path: This parameter should be filled with the local folder path of the FTP server, where the file
will be saved.
● BOM Ftp Username: This parameter should be filled with the FTP server username.
● BOM Ftp Password: This parameter should be filled with the FTP server password.
Action execution - Users can execute the action explicitly by invoking it from the quote, or implicitly by invoking
some other action, that will activate "Send BOM XML" as its pre or post action.
Action Detach Quote From Opportunity will enable users to break the link in SAP CPQ between CRM
opportunity and SAP CPQ quote. After a user has detached the quote from one opportunity, he will be able to
attach it to another opportunity, or to create a new opportunity from the quote.
If the CRM system is Salesforce, the SAP CPQ quote will be removed from the list of opportunity related quotes
in Salesforce.
Action Reapply Taxes allows users to refresh country and state tax. This action does not have a big impact on
the performance unless the formulas for Country Sales Tax (Country Sales Tax [page 445]) or State Sales Tax
(State Sales Tax [page 454]) are complex.
Send Email
Action Send Email is tied in with Generate Quote action. When Generate Quote action is completed, user is
presented with a button to create Email and download the document. When a user creates an email and clicks
Send Email, Send Email action will be executed.
Currently Send Email allows for an Activity to be added to Salesforce.com opportunity. To set it up:
● In Setup:
1. In Setup Quotes Email Customers / Quote Acceptance Settings section, set Update
Opportunity activity in Salesforce after sending Email to Customer to TRUE.
2. Make sure that Send Email action in added to the workflow
3. Make sure user groups have permissions set for Send Email action under Workflow Workflow
Permissions .
● On user side:
1. User has to come from Salesforce.com.
2. Generate a quote.
3. Click on Create Email.
4. Send the email.
5. Activity will be added to the opportunity Activity History.
Action Approval Reminder can be used to remind approvers that has not approved or rejected the quote.
Once quote is submitted for the approval, and approver does not take any actions, quote owner has no way to
request or remind approver to take action.
When action is executed, the system will verify who are all the approvers for that quote, and will send email
notification (same one as used for approval notification) to ALL approvers who have not take any actions
(approve or reject) for that quote.
Action Approval Reminder will not do anything by itself, it's just a transition in the action workflow where a user
can attach arbitrary notifications. These notifications should be addressed to the email lists with
"WaitingApprovers".
Email list with special tag "WaitingApprovers" will address all approvers of a quote that have not been approved
or rejected.
User can put any notification body to these approval reminders. They could be the same as initial submit for
approval notification, or you can make a new one specific for reminder purposes.
Administrators have the ability to define conditions for executing pre or post actions.
When admin edits an action from the Workflow/Approval Actions list, he or she is able to see the
following fields:
● Name
● Global Condition
This is visible for all actions; defines global condition for executing action.
● Pre Action Condition
This is displayed only if action can be set up as pre action in the workflow.
● Post Action Condition
This is displayed only if action can be set up as post action in the workflow.
When action is executed as pre or post action, SAP CPQ evaluates appropriate condition defined for this action.
Note
If you’re not sure which action can be set as pre or post action, the best way to check this is to see what
actions can be found in the list for pre or post action in the workflow.
Outbound emails are all emails sent from SAP CPQ to clients.
Note
If you've been registered in SAP CPQ before the deployment of the 2005 release occurred, you need to
contact the SAP CPQ Support team who will assist you in implementing the listed email-related behaviors.
You can define Sender and From email address that display in outbound SAP CPQ emails by editing application
parameters Sender Email Name, Sender Email Address, and From Email Address.
● In the From Email Address application parameter enter the email that will be displayed in the From field of
the received email.
● The Sender address is taken from the Sender Email Address application parameter.
● Sender name is defined in the Sender Email Name application parameter.
Note: If there's no Sender Email Address, it remains empty and there's no Sender Email Name either.
● In the From Email Address application parameter enter the email which will be displayed in the From field of
the received email.
● The name displayed in the From field of the received email is the full name of the user who triggered the
action.
● The reply-to address should be the email of the user who triggered the action.
● The Sender address is taken from the Sender Email Address application parameter.
● Sender name is defined in the Sender Email Name application parameter.
Note
Note: If there's no Sender Email Address, it remains empty and there's no Sender Email Name either.
● In the From Email Address application parameter enter the email which will be displayed in the From field of
the received email.
Note
If you haven’t added an email to the From Email Address parameter, the email won’t be sent.
● The Sender address is taken from the Sender Email Address application parameter.
● Sender name is defined in the Sender Email Name application parameter.
Note
Note: If there's no Sender Email Address, it remains empty and there's no Sender Email Name either.
● In the From Email Address application parameter enter the email which will be displayed in the From field of
the received email.
If you haven’t added an email to the From Email Address parameter, the email won’t be sent.
● The Sender address is taken from the Sender Email Address application parameter.
● Sender name is defined in the Sender Email Name application parameter.
Note
Note: If there's no Sender Email Address, it remains empty and there's no Sender Email Name either.
● In the From Email Address application parameter enter the email which will be displayed in the From field of
the received email.
Note
If you haven’t added an email to the From Email Address parameter, the email won’t be sent.
● The Sender address is taken from the Sender Email Address application parameter.
● Sender name is defined in the Sender Email Name application parameter.
Note
Note: If there's no Sender Email Address, it remains empty and there's no Sender Email Name either.
● In the Place Order “From” Email Address application parameter, enter the email which will be displayed in
the From field of the received email.
Note
If no email is added to the parameter, the From field will be populated with the email address of the
currently logged-in user.
● The Sender address is taken from the Sender Email Address application parameter.
Note
If the Sender Email Address isn’t defined in the parameter, the email address of the currently logged-in
user will be used.
● In the From Email Address application parameter enter the email which will be displayed in the From field of
the received email.
Note
If an email isn’t added to the application parameter, the From field will be populated with the email
address of the currently logged-in user.
● The name displayed in the From field of the received email is the name used in the Name field in the
document generation email form.
● The Sender address is taken from the Sender Email Address application parameter.
● Sender name is defined in the Sender Email Name application parameter.
Note
If there's no Sender Email Address, it remains empty and there's no Sender Email Name either.
The selected value on the Hide "From" Email Address and "Name" from the Generated Document Email
Form [page 545] application parameter determines whether the From and Name fields are visible in the
document generation form.
5.3 Notifications
If email lists can be compared to the Recipient of an email, Notification would be the rest of the email.
Notifications define the subject of the email and the body. Notifications can contain any number of messages,
and each message can have different content and email lists. Notifications can then be attached to any
workflow action. This makes it quick and easy to notify the necessary people of users’ actions. Once email lists
have been created, notifications can then be made to include them. To manage notifications, follow the steps
below:
1. click the Notifications link under the Workflow/Approval drop down menu. All existing notifications are
listed.
2. To create a new notification, click Add New.
3. Enter an appropriate Notification Name and click Save. The option to add messages is then displayed.
4. All that is required when creating a notification is the name. This name is then used when assigning the
notification to a workflow action. Click Save to save the name. Once the name has been saved, the
message administration for that notification becomes available. Click Add New Message to add a new
message to the current notification.
Note
Clicking Go Back will only cancel the notification add or edit. This will not undo any message adds or
alterations.
Creating a message is much like creating an email. The Subject, To addressee, and Text must all be entered to
create the message. The To addressee in this case, though, is an email list, or email lists. Users included in the
selected email list(s) will receive the message.
The email can be sent as HTML or plain text. Sending emails in HTML allows you to create a better looking and
more interesting emails. It should be noted that any images you would like to use in the email should be
included in the attachments (non-parseable). Two pictures below show an example of HTML notification
formatting in SAP CPQ and rendering in mail client.
Dynamic text can be entered in the subject, message text, and condition sections through tags using the syntax
builder. The syntax builder for the sections can be accessed through the symbol next to each section.
A condition can also be entered in the Condition section that has to be met to in order to send the notification.
Enter 1 in the Condition section to always send the notification.
The full list of the available tags can be accessed by clicking the Syntax builder for the "Message Text".
These tags with parameters have a list of available parameters, and a parameter must be chosen to use the
tag.
When a quote requires approval, an email notification is sent to the approver that looks like this:
Attachments can also be included with the email message. Any file can be used as an attachment. Existing
attachments can be managed by selecting the file from the list and clicking Delete or Download. New files can
be uploaded into the system by clicking the Upload button.
To add an attachment to the message, transfer the file from the Available Attachments box to either the Non-
Parsable Attachments box or the Parsable Attachments box. Which box an attachment is transferred to
determines how that file is handled when the email message is sent.
Files added to the Parsable box will be compiled by SAP CPQ when the email is sent. This means that any Word
Quote tag used in the file to include Quote, Customer, or User information will be replaced by the information of
the quote that initiated the notification. Any files added to the Non-Parsable box will not be compiled by SAP
CPQ.
For more information on word quote tags and creating documents that contain them, see Create Document
Generation Template [page 189].
When finished entering the information for the message, click the Save button to add the message to the
notification
Note
You can track the status of email notifications in the log. Every sent email notification is logged in a record
with the title Email Notification. The log contains the following data: Notification name, Notification Content
ID, Timestamp, Cart ID, Owner ID, Notification subject, Notifier name, Notifier email and a record indicating
that the notification is successfully sent.
Email notifications that are not sent are also logged in a record with the title Email Notification. In this case,
the log states that the notification condition is not fulfilled and contains the following data: Notification
name, Notification Content ID, Timestamp, Cart ID, Owner ID and Notification subject.
You can enable email notification logging via General Application Parameters Shopping Cart and
Quotes Use Additional Logging For Email Notification .
Once a notification and message have been created, it can be associated with a workflow action.
This is done in the Workflow Actions administration section. For any workflow event/intersection, click the
button to open the Status Administration page.
On this page, click the Edit button under the Notifications column of the appropriate action (make sure it’s
selected).
Note
For more information on the Workflow, see the chapter Action page in Workflow Actions [page 330].
In the resulting pop-up window, all notifications are listed. Click the checkbox of each notification that will be
associated with that action. Click Update to save the selection(s) and Close to cancel the selection. Click Save
on the status administration page. When a user initiates this action, the notification is triggered and any
messages added will be sent. The information from the quote that the user performed this action on will be
used for any attachments using word quote tags. Email messages will include all information included on the
message definition page (as discussed earlier).
You can choose the email address to be displayed in the From field of emails received from SAP CPQ. This can
be done by entering the desired email as the value of the following application parameters.
● user management notifications (user creation, password reset, password update, and so on)
● notifications attached to actions, sent in emails when actions are triggered
Note
The From Email Address and Shop SMTP Mail Server fields in Application Parameters must be filled in order
for notification emails to work. For more information, see Application Parameters [page 545].
SAP CPQ default "Place Order" Email is sent when user clicks on Place Order. In order to control the From
Address of this Email, we can use application parameter Place order “From” email address found in
SAP CPQ Setup General Application Parameters Shopping Cart and Quotes . If this app parameter is
not defined, user's Email is used as the From address.
Selecting Place Order on a complete quote that does not require approval. The Order Confirmation screen
displays.
Additional email addresses can be entered in the additional e-mails textbox. Clicking Confirm/Send Order
confirms that the Order has been placed and notifications are sent to the Bill To or Ship To email address if
checked and any other additional e-mail addresses entered. Although this is a hardcoded notification, it can be
changed by changing the visual style for Place Order page. For more information on Visual Styles, see Users
[page 140].
Approval Notifications
Your SAP CPQ installation comes with 3 predefined notifications for Approval Process:
Adjustments for these 3 notifications can be made easily with edit action.
The tag (<* PDAAPPROVAL *>) is used for notifications. Approval Email will contain both links, standard
QUOTELINK, and new PDAAPPROVAL. This PDA link will automatically log in user and redirect him to separate
The one-click approval HTML email template helps you set up the approval request email Approvers receive
when Quotes are submitted for approval.
The email contains the Quote number, the description of the violated rules and customer information. By using
the HTML email template and following the steps outlined in One-click Approval HTML Email Template [page
347], Approvers are able to accept or reject Quotes directly from the email, without logging into SAP CPQ.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body {
padding: 0px;
overflow-x: hidden !important;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 1.42857143;
color: #636466;
background-color: #fff;
margin: 0;
text-align: center;
}
a {
text-decoration: none;
}
a,a:hover {
color: #00ABE3;
}
h2 {
color: #636466;
font-weight: 500;
}
.cald_header_bar {
background-color: #fff;
color: #636466;
height: 64px;
margin: 0;
text-align: center;
vertical-align: middle;
width: 100%;
}
.cald_logo {
margin: 10px;
height: 40px;
background: url('https://c3.webcomcpq.com/mt/DEFAULT/images/logo_left.gif') no-
repeat center center;
background-size: contain;
}
.rainbow {
height: 5px;
width: 100%;
<body>
<div class="cald_header_bar">
<table class="cald_logo" width="181px" border="0" cellspacing="0"
cellpadding="20" background="https://c3.webcomcpq.com/mt/DEFAULT/images/
logo_left.gif" background-repeat = "no-repeat" style="height: 58px;background-
repeat: no-repeat;background-position: center; margin:0 auto; margin-bottom:
5px;">
<tr><td></td></tr>
</table>
<table class="rainbow" width="100%" border="0" cellspacing="0" cellpadding="20"
background="linear-gradient( 90deg, #fab423 0%, #94c84a 25%, #00a7e0 50%,
#00ABE3 60%, #364CA0 80%, #904D9E 90%, #a96dae 100%)" style="height: 5px;
width: 100%;
background-image: linear-gradient( 90deg, #fab423 0%, #94c84a 25%, #00a7e0 50%,
#00ABE3 60%, #364CA0 80%, #904D9E 90%, #a96dae 100%);
background-repeat: no-repeat;
background-size: contain;
min-height: 5px;
max-height: 5px;
height: 5px;
Creating an email list is the first step in creating notifications (Notifications [page 342]). Notifications allow
custom emails to be sent to any user with the option of an attachment included. Email lists determine which
users receive the email notifications. Email list administration can be accessed by clicking the link under the
Workflow/Approval drop down menu.
Here all existing email lists are listed. User can create a new email list by clicking Add New. Specific users are
added to email lists. All users an email list receive the notification sent with that email list. Email lists are well
integrated with SAP CPQ and provide a high level of customization. All users and user groups added to the SAP
CPQ database can be included in an email list. Custom emails not in the SAP CPQ database can also be
entered. Dynamic tags can also be used to determine who gets a notification. Tags provide a way to send
emails to users performing certain roles rather than specific predetermined users. Tags can be very useful for
sending notifications for approval rule violations, supervision, and general updates. The tags are self
explanatory and the user(s) fitting the selected tag gets the notification.
The Emails section allows entering a custom name and email. The name is optional, but a valid email address is
required.
Note that moving an email address from the selected section to the unselected section in the Emails lists
section deletes the email address.
The Tags area provides users with a dynamic method of sending emails. Selecting the appropriate tag
determines which user will receive the email:
Once all the users that should receive an email notification are entered or selected, clicking Save will save the
email list. Now notification of that email list can be created.
When you use Responsible Approvers tag in email lists, there is an application parameter that will control if the
approver is going to receive a notification per each violated rule or only one notification for all violated rules.
The parameter name is Remove duplicate approvers and can be found under Setup General Application
Parameters , tab Shopping Cart and Quotes. If this parameter is set to yes, only one email will be sent to the
approver per notification.
Note
If dynamic tags are used to define recipients (for example, “Approve parent”) it is important to know that
this user (for example, Approve parent) will get a notification only if they are marked as "active" in the
administration.
Approval process is a SAP CPQ functionality that enables administrator to force users to obey a set of rules
when operating with theirs quotes. For instance, administrator can model the approval process so that he
doesn't allow users to put the discount on the quote amount in excess of 10%. This menu section uses to set
up approval process, as well as quote workflow. Approvals and workflow are two things that are quite
connected and that depend on each other.
To fully understand the approval process described in this manual, one should first get familiar with following
terms:
● Approver
● Submitter
● Approval Rule (condition)
1. Set up individual users' Managing/ Ordering/ Approving parents on user administration page (not
required).
2. Set up any additional things that you might need in approval process (For example, set discounting rules if
you wish to treat discounts in approval rules) (not required).
3. Set up one or more Approval Rules.
4. Set up Workflow to treat Approval Rules.
You can find more details on the approval process terms below:
● Approver
Note
To ensure that the approval rules are triggered for the right user type or company, you may avoid
defining specific approval rules and set up all rules for All User Types/All Companies. However, have in
mind that this may slow down the system and lead to performance issues.
Approvers are being selected from the list of users labeled "Approvers:" on the page, as seen on the picture
below: All users from the system can be selected as approvers. One or more users can be flagged as
approvers for the rule currently being edited.
Regardless of users in the system, the approvers list always offers three items that are not actual SAP
CPQusers – the Managing parent, the Ordering parent and the Approving parent. These can be thought as
some kind of context sensitive shortcuts: every SAP CPQ user can be assigned these three parents
through standard user administration. Therefore, when selecting "Managing parent" as an approver when
editing an approval rule, approver will be different according to the user this rule applies to at the particular
moment. For example, if "Mike" and "Joe" are selected users to whom this rule applies to, and as approvers
are selected "Managing/Ordering/Approving parent", the quote won't necessarily go to the same approver
regardless of who submitted it for approval. In other words, if "Mike" and "Joe "have different Managing
parent, than the quote will end up with different approving user, in regard of who submitted it. As with the
Managing parent this also applies for Ordering parent and Approving parent.
So, every user selected from the list will be the approver for the particular rule, and will receive the quote to
review it and decide how they will respond.
Approve logic is set up by choosing desired value from the approval requirements drop-down list.
Approve logic can be best explained through example: If there is a rule that defines more than one approver
quote will end up being reviewed by more than one approver. Although every approver can Reject a quote,
all the approvers must agree to Approve it in order for that quote to be returned to the owner as Approved.
You have an option to define a Custom Approver Selection Logic. This Logic is also referred as a Dynamic
Approver in SAP CPQ. Custom Approver Selection Logic will determine an approver at the time a particular
approval rule is violated. Approver is determined depending on the expression that you defined through SAP
CPQ Workflow/Approval setup.
This expression can take into account a various elements regarding users, customers, quote calculations and
so on. For example, you can write a formula that will determine an approver based on the country the customer
is located in, or based on the total amount of the quote.
When you save a newly created Custom Approver Selection Logic, it is automatically added to the list of
selected Approvers.
Example
In this example we will create an dynamic approver named Regional Approver.
In this example, if you work on your quote, and you choose a customer that has territory set to "USA", your
approver will be a user with the email [email protected]. You will find the name of this user in the list
of Approval Rules below your quote.
You are able to edit a Custom Approver Selection Logic. Whatever changes you make will be valid for all
approval rules that use this dynamic approver. You can also use any Custom Approver Selection Logic defined
by other users.
You are able to delete a Custom Approver Selection Logic, but only if it isn’t part of some other rules. If you try
to delete Custom Approver Selection Logic that is in use, you will be informed with the error message and the
list of rules where this Custom Approver Selection Logic is used.
When you are working on the quote and a rule is triggered, you will be informed that the quote must be
approved by the approver that was selected based on the expression you entered while defining a Custom
Approver Selection Logic.
If for some reason SAP CPQ was not able to locate the user that you were referencing in your expression, then
the error Approver couldn't be identified. Please contact your SAP CPQ Administrator will be displayed in the
quote. SAP CPQ will not be able to locate the user if you typed a wrong identification field value (invalid email,
invalid name or invalid username).
Delegation of approvals
Delegation of approval is designed for cases when a quote is sent to the SAP CPQ user for approval, but that
user is absent or is not able to approve of reject the quote. If delegation of approval is enabled then any
member of the team can review, approve or reject that quote as a delegated approver.
Delegation of approval can be enabled or disabled by selecting approval permissions for any or all of the
following three relations:
● Managing Parent
The Managing Parent, with the appropriate rights, can edit or delete their child users. They can also
reassign quotes between their child users.
● Ordering Parent
The Ordering Parent receives all orders placed by their child users for confirmation.
● Approve Parent
The Approve Parent receives quotes from the user that have been submitted for approval. Whether or not a
user’s Approve Parent receives a quote, though, depends on how the rules are set up in Approval Rule
administration. Each approval rule determines which user(s) will receive the quote for approval. The user’s
ApprovalParent is one of these options.
Assigning approval permissions to any of these three relations means that you define a delegated approver.
Delegated approver is allowed to approve quotes that are assigned to its' approval team.
The Delegation of approvals table is used to define a delegated approver and control permissions for it. This
table contains three different SAP CPQ user approval relations.
You can delegate approve/reject permissions for any of the relation that it is approving or rejecting quotes. In
this example, approve parent has a permission to approve and reject quotes for its' approval team.
To summarize - when a user A request approval from its' approval parent B, then the user C which is set as
approval parent for user B and it is defined as a delegated approver can approve quotes that are in "Waiting For
Approval" queue of the user B.
User Kyle creates a quote which violates a previously defined approval rule. User Kate is defined as approval
parent for Kyle. Kyle requests approval from Kate and now Kate has a Kyle’s quote in approval queue.
If Kate is on vacation or for some reason is not able to log into SAP CPQ and approve the quote, then Mike can
complete the approval. Mike is selected as approval parent for Kate and approval parent relation is selected to
allow delegation of approval.
Once Kyle has sent the quote for approval, he is able to see the list of alternative approvers by selecting
approval history from the dropdown in the list of quotes.
Now, under the tab Waiting for approval, Mike sees a list of quotes that are directly sent to him for approval and
list of quotes that his team can approve. Note that Mike is approval parent for Kate and Jsmith as well, so he will
see quotes that are assigned for approval to Kate and Jsmith (column Responsible Approver).
Parallel Approval, or Branching, allows you to split the approval process into several components independent
of one another. If you don’t use the Branching feature one approver can reject all components of your quote
which will induce SAP CPQ to send the entire quote for approval all over again. This may take more time than
you can afford to lose, and cause unnecessary delays.
The standard approval process has three or four rules and the moment you decide to reject one rule only the
whole quote is rejected regardless of the fact that two unrelated rules have been approved. This means you
must repeat the process all over again and send the quote to your manager who then has to send it over again
to someone else. This can end up taking too much time. With the Parallel Approval process you can
simultaneously approve several rules which are independent of one another. Once you are done with one
branch you don’t care about the status of other branches. You have ensured independence of various different
rules, which are part of the same quote.
To show you what we mean, let’s say you are a regional dairy manufacturer that wants to expand by closing a
deal with a major food retailer outside your core market. This deal would not only give you access to a large
market, but might also lead to a possible expansion to neighboring markets. Before you are able to decide if
you can go ahead, you need to get the green light from your production department that first has to ensure you
have enough capacity for this kind of strategy. Then, you need to get the approval from the finance department
that must decide if the risk is justified. And, you need to get the thumbs up from the logistics department that
has to make sure your distribution network is able to partner up with the distributors in the new market. This is
where Parallel Approval comes in – it allows your company to segment your approval process so that
To start, type in the name of the Branching component in the Branch Name text-entry box in Step 2 of Approval
Rules. Check the following figure to see what this field looks like in SAP CPQ.
The first thing that you should know about Branching is that it is a multi-layered feature. For the purpose of
Help, we would like you to think of the Approval process as divided into three segments, blue, orange and green.
The following figure deconstructs the process so you have a better idea of how it works. In the figure, you can
see that a number of rules have been defined, with a defined rule per each user. All rules share the same branch
name meaning that these rules are connected in one chain-like sequence. You must define a rule for each user
– not everyone is required to approve the same item but they must all be part of the same chain sequence. And
they are all unified by the same branch name. We have created a mock-up scenario meant to act as a road map
that takes you along the Branching process from start to finish. Read the text below the diagram to understand
the step-by-step Branching process.
Keep in mind that different approvers can approve rules within their branches without interfering in the
process of approval taking place within other branches. This is why we refer to Branching as the Parallel
Approval Process. In the mock-up example below, we are demonstrating only one approval scenario.
Mock-up Example
1. For the purpose of this demo process, imagine you have defined the rule as a general user. That said,
before you send the approval request to the first approver in the hierarchy, you must first violate the Green
Approval rule, followed by the Blue and Orange Approval Rules. Once you have completed this, you can
submit the three approval rules to Approver No. 1.
2. The approval rule process starts to branch at this point. The three approval rules will go to three different
designated approval parties: Approver No. 1, Approver No. 2, Approver No. 3 and Approver No. 5.
3. The Green Approval rule is the first in line that will get approved, that is Approver No. 1 must approve the
Green rule. Then Approver No. 5 must approve the rule and submit it for approval to Approver No. 6, the
last one in the trajectory of approvers.
4. Once Approver No. 6 approves the rule, the Green Rule approval process is considered complete.
5. Now that the Green Rule has been completed, the Blue Rule is next in line to be approved. To illustrate the
benefit of Branching we will create a scenario in which Approver No. 2 changes the container configuration.
Let’s say Approver No. 2 changes the value of discounted price and updates the quote. SAP CPQ will
update the script with a new configuration. In other words, the value entered, means that the rule has been
approved. Then someone opens up the cart and changes the value of that container, meaning that
although this value has been approved now this is a new value and it would have to be approved again.
Because the Green rule follows the configuration of the container, its existing value, but because the value
has changed the rule is being evaluated again, the condition has been violated again, the approval
calculation has been violated again, so the system again asks the user to again enable the rule. Without the
ability to use Branching, the Green Rule would have to be sent back to Approver No. 1 all over again. But
Parallel Approval allows the Green Rule to move along the hierarchy as initially planned, that is to be
submitted to Approver No. 4.
The action Retract Approval Prrocess should be set up in Workflow to allow users to retract expired approval
rules. This action should be set up in Workflow to be available with the Change Status action (for example, it
should lead from Rejected to Awaiting for approval).
In this Use Case, there is a quote that violates two approval rules. Owner requests for approval. Approver
rejects it because one of the violated rules must be neutralized by the owner. Owner fixes quote and request for
approval again. Now, approver must retract the expired approval rule, and then actions approve and reject
become available for the approver. The example is as follows.
● CPQ user 1
● CPQ user 2
● Rule 1
○ User: CPQ user 1
○ Approval condition:
[IF]([EQ]
(<*Eval(<*CTX( Quote.Total.AverageProductDiscountPercent.DefaultDecimal )
*> > 30 )*>,True)){1}{0}[ENDIF]
○ Approval calculation: 1
○ Branch name: branch1
○ Approver: CPQ user 2
● Rule 2
○ User: CPQ user 1
○ Approval condition: 1
○ Approval calculation: 1
○ Branch name: branch2
○ Approver: CPQ user 2
CPQ user 1 creates a quote. Rule 2 is violated (since condition is set to 1).
CPQ user 1 inputs discount percent of 35. Rule 1 is violated too. (See the following figure).
CPQ user 2 opens quote and approves it. Now the quote is in approved status.
Note that the Blue Rule remembers the value of some custom field if the value of some custom field has been
changed in the approval calculation; the Orange Rule follows the value of another custom field, and the last
Green Rule follows the value in the container in the configuration. If something in this process has been
changed the rule is being re-evaluated again; even though this rule has been approved the system asks you to
go into the approval process and to approve that branch. This multilayered system of approval was introduced
to prevent any tempering by different users of your quote. If some custom field value has been selected, that is,
the value box is not vacant and a value has been entered in the custom field, and if the user isn’t among specific
users, the rules are limited. This means the rules are not triggered for a number of specific users and follow the
approval process only with certain users in mind. The calculation formula which is evaluated each time the user
logs in checks the value of that custom field. When, as a user, you approve the rule in a certain cart status the
value of that custom field is being saved. Each time the system checks that the saved value is equal to the
existing value of the custom field. This is all carried out according to the formula entered in the Approval
Calculation.
Approval Rule by itself doesn't do any work – Workflow must be set up in order to have working Approval
Process. Approval rule is just here to serve as a flag in workflow that will allow some actions to happen that will
move the quote throughout the approval process.
Owner edits his quote, and violates one of the approval rules (For example, exceeds discount). After clicking on
Approvals button, he is taken to the page where he can leave a comment, see who are approvers, and what
rules he violated. We can see that this rule defines two responsible approvers.
After submitting the quote for approval, his approver will have it on Waiting for approval tab on load quote page.
There, approver can edit the quote, view what triggered approval rule, and after clicking on Approvals button,
he can perform an action on that quote:
Approver can here either approve or reject the quote. Now, what about the second approver? Even though one
approver has accepted the quote, on the user side in My Quotes tab, quote is still pending approval.
Clearly, the quote is still pending approval, so other approver needs to approve it also. (Remember the
"AND" /"OR" types of approve logic – this rule is definitively an "AND" logic type, since the first approver did
approve and the quote still waits the other approver to either approve/reject. Now the second approver decides
what to do with the quote.
First of all, discounting rules have to be defined, that will limit quote owner when setting discount, so that 50
will trigger an exceeded discount flag. This section is described in Discounts/Multipliers [page 434] section of
this manual, so refer there for more details about this simple step. Once the discounting rule is defined, we can
add an approval rule that will treat discounting.
We choose "Workflow/approval", then "Approval rules" menu items to the left. Next we add new approval rule,
and we call it "Discount Exceeded" (enter something user friendly here – both users and approvers should be
able to know what this rule applies to by its descriptive name). Next we select one user to be the user that this
rule applies to. (We can also select a particular user group, company, or combination of these). Then, in the
condition box, we enter: „<*GI(EXCEEDEDISCOUNT)*>” . This formula will check the "EXCEEDEDISCOUNT"
global information variable flag, which will be set if discounting rules are violated. This condition ensures that
discounting rules are being treated in this approval rule.
From the Approvers list, we select two users that will be responsible for this rule.
After saving, we are done with creating approval rules. Now we need to take care of workflow, in order to
complete approvals setup. First of all, let's define what actions are used during approval process:
● Approvals
● Submit for approval
In the administration, we select Workflow/Approval then Workflow actions in the menu to the left, so that we
are now on the page that is used to set up workflow on "My Quotes" user tab.
There, we set up the following actions: From status open to status open, check the action "Approvals" :
and add a condition to it: <*APPROVALREQUIRED*>. This will ensure that we have "Approvals" action only
when we need to submit the quote for approval.
Submit for approval action: we need to do just the same as for "Approvals" action, except from the fact that
"Submit for Approval" should change quote status, so we will place it to flow from "Open" to "Waiting for
Approval" rather than from "Open" to "Open". Also, we need to add condition formula
<*APPROVALREQUIRED*>. This will prevent users to submit for approval quotes that are not violating any
approval rules. User can also attach notifications to this action, so that for example Approvers can get email
when someone submitted a quote for approval to them.
This will open the similar workflow page, only that this one defines workflow for approvers, who use "waiting for
approval" tab rather than "my quotes".
In this tab, we need to have 3 approval actions: "Approve quote", "Reject quote", "Approvals" and "Submit for
approval".
"Approvals" action doesn't change status, so we will put it to flow from "Pending Approval" status to "Pending
Approval" status:
We need to add a condition: Approver can only submit for further approval if he is violating some rules.
Therefore, we add a condition to this action:
So we entered <*APPROVALREQUIRED*> tag, which evaluates to "TRUE" when user is violating approval rules.
The "Submit for Approval" action is useful when setting up multilevel approvals:For example, one approver can
have right to handle discounting up to 10, but for anything more, he cannot approve himself: he must also
submit for approval to the next approver, who can approve up to 20, and needs to further submit for more
discounting, and so on.
Also condition for this action has to be set up, so that we prevent approving quotes by approvers that should
not be able to approve (because they violate some approval rules themselves), so click on condition button and
enter [NOT](<*APPROVALREQUIRED*>) into condition field:
This rule can also be added an condition, if we need it. By default, Any approver can reject a quote if he wants
to. But we can also limit approvers to be able to reject a quote only if they don't violate any rules themselves.
For example, if an Approver needs to submit a quote for further approval, we already forbid him to approve it,
and we can forbid him to reject it, too. In that case, we need a condition on "Reject quote" action, so we click on
condition button and set up the following formula in condition field: "[NOT](<*APPROVALREQUIRED*>)" (as
shown on the picture below):
After this has been set up, current workflow has to be saved and approval process has been successfully set up.
Getting Started
Approval Rules is an SAP CPQ feature in the Workflow submenu that enables you to enforce rules for users
operating with quotes. Let’s say you want to limit the number of users (or identify specific users) who are
permitted to apply a discount of 10% or more on a product. Or, you want the quote to comprise computers with
a hard drive capacity of up to 100 GB only. You can enforce these rules by assigning an approver, or a hierarchy
of approvers, designated with consenting or rejecting the discount.
Glossary of Terms
To understand the Approval Rules process, we recommend you familiarize yourself with the following terms:
Approver, Submitter and Approval Rule.
● Submitter is an SAP CPQ user who submits a quote for approval. The submitter can be the quote owner or
a user currently operating a particular quote. In a multilevel process users’ approvers can also be
submitters if approvers themselves violate approving rules.
● Approver is an SAP CPQ user managing the approval status for a particular quote. The approver does this
by first reviewing a quote submitted by the submitter, and then deciding if the quote is valid or not. The
designated approver can submit the quote for further approval if he or she lacks authority (violates rule) to
complete the approval process. In this case, an approver becomes a submitter. You must assign at least
one approver to an Approval Rule but you can also assign as many as required. In other words, you can
assign several approvers to validate the decision of other approvers. Make sure that you select only active
users as approvers. If you assign an inactive user as the approver, the quote will get stuck in the Waiting for
Approval status. If this happens, check approval history and make sure that you don’t have an inactive user
assigned as approver to the rule.
● Approval Rule is triggered when the condition for that rule is rendered "true". If it is not rendered true, the
approval process will not be triggered. Approval rules are listed in a table that allows you to edit, delete or
add a new approval rule. Each time anyone enters the quote, SAP CPQ automatically re-assesses the quote
and checks if any approval rule has been violated. If any of the rules are violated, SAP CPQ will alert you
that the rule has been violated and ask you to send the quote for approval.
Approval Rules comprises two main sections: Creating a new approval rule and Delegation of Approval.
● Click Add New and enter the name of the rule in the Approval Name text-entry box.
● Describe the Approval Rule in the Description box or click the icon to enter an expression in the formula
builder. The description informs you about the restrictions defined by the rule that users can violate. Let’s
say you are authorized to apply a discount of 30% but you applied a discount of 40%. Going forward, you
must decide if you will stick with this decision or if you will send the quote up for further approval along the
approval hierarchy. In other words, you can modify the quote so that you no longer violate that rule or ask
for additional approval. First, make sure that the rule has been defined in the workflow, and perform the
steps below.
1. ○ Select a user/user type/company (or all three) for whom the approval rule will apply.
○ Select the company users belong to from the Company drop-down menu.
2. ○ Enter a condition in the Condition text-entry box that will trigger the approval process (the condition
must be rendered "true"). The condition is the core of the approval process and defines an expression
on which the Approval Rule will be based. The condition text-entry box accepts all standard SAP CPQ
formulas which give administrators greater flexibility when creating approval rules. Let’s say you want
to limit the currency amount of your quote to 5,000. If the expression is evaluated to 1 (true) the rule is
violated which triggers the approval process: [GT](<*CTX
Quote.Total.TotalNetPrice.DefaultDecimal )*>, 5000).
○ The Parallel Approval section of Approval Rules is explained in a separate document. See Parallel
Approval [page 362] for more details.
3. In Approval Requirements select:
○ AND logic (approved if all approvers from the list approve) if you want all approvers on the list to be
required to approve the quote and only one to reject it. Note that choosing this option is restrictive and
that you may be stuck waiting for that one approver to approve your rule.
○ OR logic (approved if any approver from the list approves) if you want only one approver form the list to
approve the quote. The "OR" logic is less restrictive and gives you more options. It is a great solution
when employees are away on vacation and you may lose time being stuck waiting for one approver to
approve your quote.
○ Now click Select Users to select Approver(s) from a list of all Users currently defined in Setup.
○ Click Save and Exit Setup.
Based on Hierarchy list allows you to select the submitter’s managing, ordering and/or approving parent as an
additional approver or approvers. Click the arrow pointing left. To cancel your selection, click your selection in
the Selected Approvers box and click the arrow pointing right.
Custom Approver Selection Logic allows you to select a user based on the user’s characteristics related to the
quote, opportunity, customer or territory, rather than the person’s name. The purpose of this feature is to
enable you to select the approver on the fly when you are pressed for time and need to make a quick decision.
Follow the steps below to select a user based on the Custom Approver Selection Logic:
Note
Remember that the expression must be formulated so that its result always takes the form of the user’s
name, username or email.
Take a look at the following image to see what an expression in Custom Approver Selection Logic looks like.
Then take a look at the proceeding image too see SAP CPQ use of custom tables in forming that expression.
Note
You have now defined Approval Rules. The submitter takes over the process at this stage. Follow the steps
outlined below if you are a submitter creating a new quote subjected to the defined Approval Rules.
● Click New Project/Quotation and select the product you want by ticking the Add to Quote check box.
● Click Add to Quote at the top right corner of the page. Then trigger the rule and click Request Approval once
the Quotation page opens up.
● Click Submit for Approval.
Delegation of Approval
The Delegation of approvals table allows you to select alternate approvers if existing approvers are away or
unable to approve the rules. The purpose of this feature is to prevent situations in which the quote gets stuck in
When you delegate approval to someone else, this change will be visible in two tables for approving quotes:
Quotes that I need to approve and Quotes that my team needs to approve in the New Project or Existing Project
Quotation.
● Quotes that I need to approve refers to a list of quotes sent to you for your approval.
● Quotes that my team needs to approve comprises you as well as all alternative approvers. This group refers
to a list of quotes displayed if the administrator selects that only one of the following roles can approve or
reject quotes: Approving Parent, Managing Parent and Ordering Parent. The list also includes the current
user if that user is set as one of selected roles for at least one active user in the system. The list contains all
quotes found in the user team’s approval queue. Let’s say user A and user B have user C set as their
approving parent. In this case, the administrator has set up that the approving parent can approve or reject
quotes instead of the approval owner. This means user C can see all quotes found in the approval queue for
user A and user B. The same rule applies to the managing and ordering parent. Now, let's say user A has
user B as approval parent (or managing or ordering) and this role can approve/reject quotes (according to
what the administrator defined in Setup). In this case, user B will always have action Approvals (this will be
the only action) available over quotes that user A needs to approve under Quotes that my team needs to
approve. Take a look at the following figure for more details.
But when you click Approval History you will be able to see the approval history of your quote, including the
names of users who performed each action in the Performed By column. The column includes name of
approvers and alternative approvers which you can check by clicking the View alternative approvers. Refer to
the figure below. If the administrator hasn’t set up either of these roles, or if there are no rules that haven’t
been approved or rejected, this button will not be displayed.
Sometimes the approver is not allowed to approve a quote because the discount level is above what he/she can
approve. However, this does not happen often and when it does, the approver gets confused. This is because it
is simply not explained to the user what happened.
User Side
When approver is approving a quote and the approval rules are taking away the submit action we need to make
it very clear, both visually and textually, what happened.
Instead of just not showing the approve action, the following message displays: This approval request is above
your authorized approval level. You can either reject a quote, or submit it upstream for approval.
5.6 Statuses
The Statuses link under Workflow/Approval drop-down provides information about an order or quotation status
to users.
Additional Status Definitions can be added. For quotation tracking, Open Quoted, Closed Quote, Converted to
Order, could be added. For orders In Engineering, On Hold or at Assembly Floor, could also be used.
The above figure shows the Status Definition Screen. From here, new order status terms can be added or
existing ones edited. Select Add New to add a new status or click the button next to the status name to edit
a status.
To delete a status, select the button corresponding to the status and click OK to confirm you want to delete
the item.
To make a status the default status, edit the status by clicking the button next to it and changing the
selection in the Default drop down to Yes.
If another status is already set as the default, user will receive a confirmation informing him that a status is
currently set as the default. Clicking OK will make the current status the default or Cancel will keep the current
default status intact.
Note that there cannot be two default statuses and that there has to be a status set as the default status at any
point in time. Therefore, editing a default status and changing the selection in the Default drop down from Yes
to No bring up a message saying that the only way to change the default status is setting another status as the
default.
The Workflow Permissions section is used to control which user groups can perform which actions.
This administrative section is important because users will be unable to use any of the actions defined in the
Workflow Actions [page 330] administrative section unless they have been given permission to use the
action(s) here.
Defining these permissions can be done in two ways, through Actions Permissions or User Group Permissions.
The default is the Actions Permissions. Under Actions Permissions, each individual action is displayed and the
user groups that are allowed to perform each action are displayed in the User Groups column.
Click the or symbol by each item to add/modify the user groups that are allowed to perform that action.
On the next screen, select the user groups that are allowed to perform each action, and uncheck the user
groups that are not allowed to perform the particular action and click Save.
The other way to set Workflow Permissions is through User Group Permissions. User Group Permissions can be
accessed by clicking the by User Group button by List Permissions: at the top of the Workflow Permissions
screen.
Under User Group Permissions, each individual user group is displayed and the actions that the user groups
are allowed to perform are displayed under the User Groups column.
Click the or symbol to add/modify the actions that the particular user group (on the left) is allowed to
perform. On the next screen select all the actions that the particular user group will be allowed to perform and
click Save.
Take a look at a section of the Workflow Permissions (by Actions Permissions) for SMB computer store.
Consider John Smith in Sales and Jane Smith in Sales Management, without any restraining conditions set,
both John and Jane would have access to the Edit, History actions, John would have access to the New
Revision action and Jane would have access to the Reassign action (based on the Actions Permissions for their
respective user groups).
Jane also sees all the actions her user group (Sales Management) is allowed to see, but she does not see the
New Revision action her group is not set up to see.
So even though Workflow Actions may be customized based on the status of the quote, workflow actions can
still be further customized using Workflow Permissions and conditions.
User can define slider definition and attach the definition to approval rules. Sliders allow users to see the
probability of the current quote to be approved. One slider definition can be attached to more than one rule, but
one rule can have only one slider definition. Slider definitions are listed in a standard table, with actions copy,
delete and edit.
Clicking Add New opens a page for adding/editing a slider definition. The first step is to choose which field is
related with this slider. For this slider field user must add an editable field and set corresponding maths (see
Cart Fields Administration [page 393]). The second step is to enter slider boundaries and finally, the third step
is to select the rules to which this slider will be applied.
On the user side, for every rule that has a slider definition, a user has the information about likelihood of
approval based on the color and/or image. The color and image is the same as for margin health and can be
defined in Margin Health Design and Visibility [page 444].
When a user moves a slider, SAP CPQ will calculate the value of the slider based on the min and max value and
on the slider's current position. (ex: min=20, max=30, current position = 30, slider value = 20 + (30 - 20)***30
= 23). After calculating the slider value, SAP CPQ will find the field, which is defined in the second step and
meets the criteria from the third step, then applies the value of the slider to that field, then finds the editable
group which contains this field and executes maths for this editable group. So, for this functionality to work
properly the user needs to adjust cart editable fields (see Cart Fields Administration [page 393]) Ex: If the
administrator on the second step chooses Product Type Discount Percent , also administrator must
specified Editable group field where Product Type - Discount Percent will be editable with the corresponding
math.
The Required Fields by Workflow Action section determines which fields are required before a certain workflow
action can be performed.
Unlike Workflow Permissions and conditions that hide any action the user isn’t allowed to perform, Required
Fields by Workflow Actions [page 330] ensures that certain fields are entered before the action is successfully
performed. The option to perform the action is visible to the user, but a message is displayed telling the user
certain fields must be entered before the action can be performed.
In administration, user can find this section by clicking on “Workflow/Approvals”, and then on Required Fields
by Workflow Action. The Workflow/Custom fields matrix shows up, which enables user to set up desired
behavior. Note that this page has 3 tabs, to set up workflow for My Quotes, quotes that are edited from Waiting
for Approval tab, and quotes from other users (Other quotes).
Clicking the Place Order button without entering information into the Bill To fields brings up the following
message: Bill To role data is not defined.
Clicking OK redirects the page to the Customer Info Tab where the Bill To field is located.
In general, there are three default fields, the Bill To, Ship To, and End User that can be set as required fields
before a user can perform a specified workflow action. A customer is fully defined only when all of the fields
that are required for that customer are filled.
The other fields that can be set to as required fields are custom fields (see the section on Custom Fields [page
272] for how to add custom fields). All custom fields added are automatically populated on the left (Fields
rows) of the Required Fields by Workflow Action table.
On the user side, when the user selects the action via a button or a drop down box, SAP CPQ checks if the
required fields have been filled out and if not, SAP CPQ displays a message box and then redirects the user to
the tab containing the required field.
After clicking OK button, user will be redirected to the appropriate quote tab so that he can enter the required
field.
The Approval Auto-Reminder feature enables you to schedule automatic reminder emails that are sent to
approvers if they do not take action on quote approval requests for a predefined number of days. As a result,
the number of quotes awaiting approval is reduced and the approval process is streamlined.
Example
Sales representatives are often on the road and have no time to log in to SAP CPQ to check which quotes are
not yet approved. To prevent quotes from getting stuck in the Waiting for Approval status for too long, you can
set an approval auto-reminder that notifies designated approvers to act on quote approval requests.
Once the approval auto-reminder is set, the system searches through all quotes in the Waiting for Approval
status that fulfil the previously defined conditions and triggers the execution of the reminder after the specified
time period. Designated approvers receive an email reminding them that certain quotes are awaiting approval.
To go to a specific quote from the email, approvers need to click on the quote in question. When logged in to
SAP CPQ, approvers are taken straight to the quote. However, if approvers are not logged in to SAP CPQ, or if
the session expires, approvers are redirected to the login page.
When Quotes are submitted for approval, they can be approved/rejected by one or multiple Approvers, as
previously defined in the chapter on Approval Rules. If a User violates certain rules, Approvers receive an
Example
Once a product is configured and added to Quote, a User can modify the discount. If the resulting discount
exceeds the defined discount limit, the Quote is submitted for approval and an approval request email is sent to
the Approver(s).
You can use a SAP CPQ-provided One-click Approval HTML Email Template [page 347] to create your own One-
click Approval template.
Note
Alternatively, you can set up the fields you want to display in the approval request email by following the
steps outlined below.
The following procedure illustrates how to create an example template for One-click Approvals.
Prerequisites:
● Define Approval Rules. For details, see Approval Rules [page 354].
● Create Email Lists. For details, see Email Lists [page 352].
● Set up the Workflow. For details, see
Approval Process Administration [page 366].
6. Click to create the subject line (Approval Request for <* SYSTEMQUOTATIONNUMBER *>).
7. Add your previously created email list to the notification.
8. Paste the SAP CPQ-provided One-click Approval HTML Email Template [page 347] into the Message Text
box. Alternatively, if you do not want to use the ready-made HTML template, you can create one. To add
CTX tags and formulas you want to apply to your email template, click next to the message box. The
most frequently used tags are outlined in the Email Template Tags section below.
9. Select HTML as email type to ensure your email is rendered properly. Alternatively, if you have decided not
to use HTML for formatting, choose Plain text.
10. If applicable, enter a condition and add attachments.
11. Click Save.
When clicking Accept or Reject, the Approver is automatically redirected to SAP CPQ where the corresponding
message Quote is accepted. or Quote is rejected is displayed, respectively.
If there are multiple Approvers, the approval process depends on the AND/OR logic defined in the Approval
Requirements field in the Approval Rules section. In a scenario where the AND logic is applied, the Quote is
approved if all Approvers approve it. However, if one of them rejects it, the Quote is rejected. If the OR logic is
applied, the Quote is approved if any Approver from the list approves it. The Quote is rejected if a single
Approver rejects it.
The following is a list of tags that pull values from SAP CPQ fields.
You can add as many fields to your One-click Approval template as you need.
● <* CO_INFO(NAME) *>: pulls the name of the User who has submitted a Quote for approval.
● <* SYSTEMQUOTATIONNUMBER *>: pulls the Quote number.
● [IF]([EQ](<*CTX( Quote.Approvals.ApprovalRule(Name).IsViolated )*>,True))
{<*CTX( Quote.Approvals.ApprovalRule(Name).Description )*>}{}[ENDIF]: checks whether a rule is violated
and pulls its description.
● <*CTX( Quote.Customer(BillTo).Company )*>: pulls the Bill-to Customer’s company name.
● <*CTX( Quote.Customer(BillTo).Country )*>: pulls the Bill-to Customer’s country name.
● <*CTX( Quote.Customer(BillTo).Email )*>: pulls the Bill-to Customer’s email address.
● <*CTX( Quote.Total.TotalAmount.MarketDisplay )*>: pulls the total amount of the Quote.
Note
A tag must be created for each rule that might be violated in the Quote process.
In addition to controlling the visibility of Quote Actions based on the Quote Status, administrators can now hide
certain Quote Actions by using conditions (For example, text in a part number) without any need to customize
the Quote user interface. Item Actions define which actions can be performed on individual items in the Quote
depending on the status of the Quote. The functionality is managed in Setup Workflow/Approval Item
Actions Workflow .
Clicking or opens a page for managing visibility. For each status, you can manage the visibility of the
following actions by selecting/unselecting the respective checkbox:
The icon shows next to each action. Clicking it opens the formula builder for creating conditions for
additional visibility restrictions. When a condition is created, a flag icon shows next to the formula builder icon.
The conditions should be built on the following rules:
Example
To hide the Edit action for all Quote Items that have a part number SMB2, the following example formula could
be used:
To hide the Edit action for the User Type Contract Management, you could use the following example formula:
Condition formulas additionally restrict the visibility of Item Actions enabled for each Quote Status. The
condition cannot override Item Actions that are not allowed for the given status. On the user side, the item
actions are available for each product in the Quote under the icon.
The Out-of-Office feature for SAP CPQ approvals enables Approvers on leave to delegate their Approval
requests to substitute Approvers.
With this function, the requests are not held up during the original Approvers’ absence. The backup Approvers
can approve, reject or submit Quotes for further approval on behalf of the original Approver.
Example
To turn on the out-of-office mode and start assigning backup approvers, take the following steps:
Note
When searching for backup approvers, SAP CPQ filters active users who belong to the same company as
the original approver.
When a Quote is submitted, both the original and backup Approvers receive the Quote in their queue. Any of
the backup Approvers can approve/reject the Quote or submit it for further approval. If there are multiple
backup Approvers, a single backup Approver is enough to approve/reject the Quote.
When searching for available Approvers, SAP CPQ only looks into the first-level backup Approvers.
When the original Approver’s backup Approver is out of office (A→B), the Quote remains in the queue until
either A or B turns off the Out of office toggle switch.
In addition, if the original Approver has multiple backup Approvers (A→B, C, D, E, etc.), and they are at the same
level, SAP CPQ searches for the first available backup Approver. If all first-level backup Approvers are
unavailable, SAP CPQ stops searching for the next-level backup Approvers.
If the original Approver has Quotes awaiting approval, a warning message containing a link to the Waiting for
Approval tab displays when the Approver turns on the Out of office toggle switch. The Approver does not have
to clear the queue in order to set the out-of-office mode. However, the queued up Quotes are not assigned to
the selected backup Approvers. The backup Approvers receive Quotes that are submitted after the out-of-
office mode is turned on.
The backup Approver is determined when a User submits the Quote. If the Quote is already approved and then
resubmitted for a new approval, SAP CPQ reevaluates backup Approvers. For example, if the original Approver
disables the out-of-office mode or changes the list of backup Approvers, previous backup Approvers might not
be added.
This section of online Help deals with pricing mechanisms and ways in which calculations are performed in SAP
CPQ.
The Cart Fields administrative section allows you to define which fields in the cart will be editable for each user
group and order status.
It is also possible to define which calculations will be executed on action calculate for each Editable Field Group.
An Editable Field Group is a set of cart fields, which are associated with the same calculations. Actions
performed in Cart Fields Administration are logged in Audit Trail Admin Actions .
The Cart Fields administrative section can be accessed by clicking Cart Fields under Pricing/Calculations. This
brings up the Status - User Group Grid as shown in the image below:
On mouse-over, user can see which fields are editable for each User Group - Status combination. For example,
Editable Fields for the User Group Sales and order status Quote won are shown in the image below:
To define Editable Fields and Calculations for a single User Group - Status combination, click the button.
To set Editable Fields and Calculations for all order statuses of a specific user group, click the User Group name
at the top of the grid as shown below.
SAP CPQ also allows user to set Editable Fields and Calculations for all user groups and statuses by clicking the
Set all link.
Note
The Default column allows setting Default Editable Fields and Calculations, which will be applied to each
newly added user group or order status.
Clicking the button, User Group name, Status name, or Set all link will bring up a screen where user may
define Editable Fields and Calculations. (See Adding/Removing Editable Fields [page 396]).
Clicking the button, User Group name, Status name, or Set all link in the Status - User Group Grid (See Status -
User Group Grid [page 394])will bring up a screen where user may define Editable Fields and Calculations.
● Fields – The Fields list box allows for the selection of available fields, which are not editable.
● Row Types – Editable fields from the Fields list box can be filtered by selecting the appropriate row type
from the Row Types drop down menu.
● Calculations – The Calculations list box lists all available calculations. When you click on a calculation, you
will see a detailed explanation of what that calculation exactly does.
● Copy From – The Copy From option allows you to copy existing settings from other User Group - Status
combinations.
Note
If you select List Price to be an editable field, you will also need to adjust the Allow Edit List Price on the Cart
application parameter. See Application Parameters [page 545] for more details.
If this parameter is set to Cannot Change List Price, List Price will not be editable even if specified in Cart Fields
Administration.
For List Price to be editable, Allow Edit List Price on the Cart should be set to one of the following values:
● Can Change List Price if it's 0 – the user can change the price only if the product’s price is zero.
Calculations listed in this section will be executed when add item or update actions are invoked. The three
calculations listed in this section (See the figure above) are the base calculations used for calculating all fields
in the cart.
The Editable Field Groups and Related Calculations section of the definition screen shows the Editable Groups
and related calculations.
The Add new field set link adds a new Editable Group. An Editable Group can be marked as default by selecting
the Default checkbox. This means that these fields will be editable when you enter the cart for the first time.
Only one of the groups can be editable at a time, but more than one field can be a part of an Editable Group.
For settings shown in previous two figures, the cart will appear as shown in the following figure. The first time
you enter the cart, the Total Net Price is editable, but by clicking on Sub -Total this field becomes editable.
First, select ProductType - Multiplier and ProductType – DiscountPercent from the Fields list. Click on
(marked with a green circle in the figure above). This will add these fields to Editable Field Group 2, and remove
them from the list of available fields.
Note
From the Calculations list box in the Available Fields and Calculations section, select the calculations you wish
to add to these fields (use the Ctrl key to select multiple calculations). Click on (marked with a red circle
in the figure above). Sort the calculations by clicking on (marked with a blue circle in the figure above).
The order of the calculations is important. If you are having problems with the cart check to see if the order
of the calculations is correct. Usually the last three calculations for a group should be the ones listed in the
Item Add/Update Calculations section, in that order.
If you wish this Editable Field Group to be default, select the Default check box (marked with a yellow circle in
the figure above).
Finally, when you have finished defining the Editable Fields, click on Save at the bottom of the screen.
The Quote Comment field is a total field such as Total Amount, Total List Price, etc. Once the field has been
made Editable, users can use it to input comments related to the quote.
To see what a non-editable Quote Comment Field and an editable Quote Comment Field look like on the user
side, take a look at the following figures respectively.
This feature gives user ability to use rolled-up fields (rolled-up recurring list price, rolled-up recurring extended
list price, rolled-up recurring net price, rolled-up recurring extended amount, rolled-up recurring cost, rolled-up
recurring extended amount, rolled-up recurring gross margin, rolled-up recurring discount amount, rolled-up
recurring discount percent, rolled-up recurring net difference from base item, rolled-up recurring end customer
unit price and rolled-up recurring end customer extended price). Rolled up fields for main item are calculated
as summary of all items’ field amount belonging to same configuration (for example, rolled up list price is a
summary of all items' list prices).
Recurring rolled-up fields can be displayed in generated document and sent to CRM. These fields are
calculated only if application flag is set that recurring prices are used in the system.
For each of these fields, new CTX tag are developed on the CurrentItem tag. Tag name is same as for non-
recurring fields, with prefix MRC added (example -
<*CTX( Quote.CurrentItem.MRCRolledUpDiscountAmount.DefaultDecimal )*>)
When user edit rolled-up recurring net price recurring discount is recalculated for all (main and line) items.
Example:
Product total price is 1200 and product cost is 720. Recurring discount percent is 10%.
When user edit rolled-up recurring net extended amount recurring discount is recalculated for all (main and
line) items.
Example:
Product total price is 1200 and product cost is 720. Recurring discount percent is 10%.
When user edit rolled-up recurring gross margin recurring discount is recalculated for all (main and line) items.
Example:
Product total price is 1200 and product cost is 720.
When user edit rolled-up recurring discount percent recurring discount is recalculated for all (main and line)
items.
Example:
Product total price is 1200 and product cost is 720.
Recurring rolled-up extended amount is 1080. Rolled-up recurring discount percent is 10.
When user edit rolled-up recurring discount amount recurring discount is recalculated for all (main and line)
items.
Recurring rolled-up discount amount is 120. Recurring discount is 10. Rolled-up recurring extended amount is
1080.
Recurring discount is calculated to 8.33. Rolled-up recurring extended amount is calculated to 1100.
When user edit rolled-up recurring net price relative recurring discount is recalculated for all (main and line)
items according to their max and min discount percents.
Example:
Product total price is 1200 and product cost is 720. Recurring discount is 10%.
Max discount percent for main and line items is 40% and min discount percent for main and line items is 5%.
When user edit rolled-up recurring extended amount relative recurring discount is recalculated for all (main
and line) items according to their max and min discount percents.
Example:
Product total price is 1200 and product cost is 720.
Max discount percent for main and line items is 40% and min discount percent for main and line items is 5%.
When user edit rolled-up recurring gross margin relative recurring discount is recalculated for all (main and
line) items according to their max and min discount percents.
Example:
Product total price is 1200 and product cost is 720.
Max discount percent is 40% and min discount percent is 5% for main item.
Max discount percent is 20% and min discount percent is 5% for line item.
Recurring discount for main item is calculated to 26%. Recurring discount for line item is calculated to 14%.
When user edit rolled-up recurring discount percent relative recurring discount is recalculated for all (main and
line) items according to their max and min discount percents.
Example:
Product total price is 1200 and product cost is 720.
Max discount percent is 40% and min discount percent is 5% for main item.
Max discount percent is 20% and min discount percent is 5% for line item.
Recurring discount for main item is calculated to 21.8%. Recurring discount for line item is calculated to 12.2%.
When user edit rolled-up recurring discount amount relative recurring discount is recalculated for all (main and
line) items according to their max and min discount percents.
Example:
Product total price is 1200 and product cost is 720.
Max discount percent is 40% and min discount percent is 5% for main item.
Max discount percent is 20% and min discount percent is 5% for line item.
Recurring discount for main item is calculated to 15.5%. Recurring discount for line item is calculated to 9.5%.
This feature gives user ability to use rolled-up cost and margin on the item level.
Rolled-up cost is displayed on the main item level and represents sum of main item and line items costs. The
same applies for rolled-up margin.
When user edit rolled-up net price discount is recalculated for all (main and line) items
Example:
Product total price is 1200 and product cost is 720. Rolled-up margin is 40%. User edit rolled-up net price and
enters 1000. Discount is calculated for all line items to 16.67%. Rolled-up GM is calculated to 28%.
When user edit rolled-up gross margin discount is recalculated for all (main and line) items.
Example:
Product total price is 1200 and product cost is 720. Rolled-up margin is 40%. User edit rolled-up gross margin
and enters 25%. Discount is calculated for all line items to 20%. Rolled-up price is calculated to 960.
6.2 Pricebooks
A Pricebook contains prices for products in SAP SAP CPQ. In case of multiple prices for one product
(discounts, special offerings, loyalty discounts, etc.), each price should be defined in a separate Pricebook.
Multiple Pricebooks are grouped under a Market.
Example
A company Europe Trucks sells truck tires through sales channels. The channels are organized into Bronze,
Silver and Gold. Each group has multiple underlying sales channels. Since Gold vendors have a long-lasting
So that the system could retrieve a Pricebook specific for a Customer (Customer 7 - Scandinavian Trucks)
administrators create a visibility formula [EQ](<*CTX( Quote.Customer(BillTo).Company )*>, Scandinavian
Trucks) and the specific Pricebook is retrieved when Users select Scandinavian Trucks as the Bill To Customer.
When the Vendor 3 logs into SAP CPQ, the system retrieves the prices from the Vendor 3 Pricebook. If no
prices are define in this Pricebook, the system pulls the prices from the parent Pricebook Gold.
Create a Pricebook
To create a Pricebook, you first need to group it under a Market, define who sees it and then add entries
(products and prices).
Visibility Conditions
Creating simple and advanced visibility conditions enables Administrators to support Users' complex pricing
scenarios. By setting corresponding visibility conditions, Administrators can relate a specific Pricebook to a
Customer so that it automatically displays once Users select the Customer. Also, SAP CPQ supports complex
pricing for Users who manage indirect sales through channels. A combined scenario in which each sales
channel creates as many Customer-specific Pricebooks as needed is also supported by the optimized
Pricebooks feature.
To create a visibility formula, select the Advanced visibility checkbox and a dedicated box for the formula
displays. You can define the visibility formula in the formula builder by using the Quote-level and User-level
The Visibility conditions section shows if advanced visibility is disabled. To create a simple filter, select a field
type, an operator and enter a value. Simple visibility relies on the User and Customer fields and the logic OR is
applied between the visibility conditions. If you need more complex conditions and the logic AND between
them, you should create an advanced formula. The system supports multiple filters.
Default Pricebook
When retrieving prices for products in a new Quote, the system first looks for the User's default Pricebook. The
feature is managed on the User Page.
A default Pricebook is Market-specific, so before selecting the default Pricebook on the User Page, Users
should first select the default Market. On their side, Administrators can select the default Market and
Pricebook for each underlying User in Setup.
Note
The fields for selecting the default Pricebook on the User Page and the Pricebook in Quote do not display in
the following scenarios:
● The logged User does not have the rights to see any Pricebooks.
● The visibility conditions set up for Pricebooks prevent the fields from showing on certain Quotes.
● The tenant does not have any Pricebooks defined because custom tables are used for pricing.
Pricebook Hierarchy
SAP CPQ enables Clients to manage complex pricing scenarios in which a Product's price depends on multiple
conditions. Pricebooks in SAP CPQ are organized in parent/children hierarchy in levels within a Market. You can
create as many parent and children Pricebooks as you need to achieve specific business goals.
When managing a Quote, Users first need to select its Market and the default Pricebook will display, if defined.
Additionally, the system loops through the Pricebooks from the bottom to the top to display other Pricebooks
visible in the same Market so Users could override the default selection. If only one Pricebook is available, the
system selects it by default. The system filters Users by the visibility rules defined by the Administrator.
● Pricebooks visibility hierarchy is kept when loading old Pricebooks in new SAP CPQ versions, meaning that
a Pricebook with the highest visibility level will have the highest level when loaded in the new version.
● When loading Quotes created in versions prior to 2017.4, the ID of the assigned Pricebooks is null. The
system selects the default Pricebook according to the logic used in previous versions (the Pricebook with
the highest level in the selected Market is selected as default). The default Pricebook is used for pricing any
new items added to the Quote. Previously added items retain their original prices. To save the defaulted
value, Users need to save the Quote.
Note
If Users decide to change the Pricebook, the system recalculates the prices of all Quote items based on the
newly selected Pricebook.
Application parameter, which can be found in Setup General Application Parameters General
Parameters , named ‘Show effective dates for price book entries’, is responsible for ability to record different
prices for same combinations of part number + price code in price books but for different validation period.
When this parameter is set to TRUE user can define validation period for particular price book entries. In Setup
when accessing particular price books, two additional columns will be visible (‘Valid From’ and ‘Valid Until’) -
Figure 1, when this parameter is set to FALSE these two columns won’t be visible - Figure 2, and system will
behave as before (validation period for price book entries won’t be defined). Same will be if admin tries to add
or edit some price book entry - Figure 3 and Figure 4.
Figure 1
Figure 3
Figure 4
Figure 5
Figure 6
Exporting price books will behave as before, when application parameter is set to FALSE columns Valid From
and Valid Until won’t be exported - Figure 9, and when parameter is set to TRUE they will be shown - Figure 10.
Figure 9
Template for import will be the next - Figure 11. If application parameter is set to TRUE two new columns will be
taken into consideration, otherwise they won’t. Columns Valid From and Valid Until must be in date format
(‘mm/dd/yy’) or empty, or otherwise it won’t be imported in price book. Error will be shown.
Figure 11
For price book entries that were created before this application parameter was included in system, or columns
are left empty during the import, these entries will have unlimited validation period, and columns for Valid From
and Valid Until will be empty when application parameter is set to TRUE. This means if column Valid From is
empty and column Valid Until has some value (e.g. 12/12/12), price book entry won’t have valid from
restriction, and it will be valid until 12th of December 2012. If column Valid From has some value (e.g.
02/02/12) and doesn’t have value for Valid Until, price book entry will be valid from 2nd of February 2012, and
won’t have valid until restriction. If both columns are left empty price book entry won’t have any restrictions
and it will be valid always.
Note
Two validation periods must not overlap for the same part number (or part number and price code),
otherwise correct system behavior can’t be guaranteed.
This feature brings us ability to improve pricing mechanism so that it can handle part numbers that are
dynamically created in run time. This means that prices for products or attributes that have dynamical part
numbers, and use price books can be calculated through run time.
1. Prevent users from quoting part numbers that haven’t got a price in pricebooks
2. Prevent users from adding product selections containing attributes that don’t have a price in pricebooks
Depend on if these parameters are turned on or off, system will behave as described below:
● If the products part number is incomplete, or part number can’t be found in price book, and parameter 1 is
turned on, although configuration is complete and user won’t be able to add that configuration to cart
(Figure 1), explanation will be given in responder, and price for product will be 0.
Figure 1
● If the products part number is incomplete, or part number can’t be found in price book, and parameter 1 is
turned off, configuration is complete and user can add that configuration to cart (Figure 2), but price for
product won’t be found in price book and price for that product in cart will be 0.
Figure 2
Figure 3
● If the attribute part number is incomplete, or part number can’t be found in price book, and parameter 2 is
turned off, configuration is complete and user can add that configuration to cart (Figure 4), but price for
attribute won’t be found in price book and price for that attribute will be 0 in cart, Total price will be
calculated.
Figure 4
● If both parameters 1 and 2 are turned off and product part number and attribute part number can’t be
found, although configuration is complete user won’t be able to add that configuration to cart, explanation
will be given in responder (Figure 5).
On Admin side there will be two application parameters in Setup General Application Parameters
Configurator :
1. Prevent users from quoting part numbers that haven’t got a price in pricebooks
2. Prevent users from adding product selections containing attributes that don’t have a price in pricebooks
If you go to Product/Attribute Options tab in product edit, and edit some attribute, you will see that for the
attribute values that are using price books there is a new field ‘Price Code’ (Figure 6). Depend on that (price
code and part number) prices from price book will be calculated, first from child price book, and if price code +
part number can’t be found there, SAP CPQ will look in parent price book for same codes.
If you click on ‘View prices’ on some attribute value that uses dynamic price code following message will
appear (Figure 7).
Figure 7
If you are on Product Definition tab, and your product is using price book lookup and has dynamic part number,
if you click on ‘View Prices’ following message will appear (Figure 8).
6.2.3 Promotions
SAP CPQ feature “Promotions” allows SAP CPQ administrators and sales representatives to configure and
offer special pricing for the particular product or group of them. Administrators have the possibility to define
different promotions that could be customized based on user type, company or condition(s).
SAP CPQ promotions feature in Responsive Design offers more flexibility when it comes to defining, organizing,
configuring, etc. Based on which design you’ve selected for your SAP CPQ environment, make sure you are
reading the right part of this help page which describes “Promotions” in Classic and Responsive design
respectively.
To add a new promotion, click on Add New button. This brings definition page for promotions which have two
tabs: Definition and Pricing Details. See the following figure.
As soon as you fill out the form, click on save and go to Pricing Details tab.
Under this tab, you should select product that you want to offer discount on, and conditional product(s) that
will provide condition rules for the promotion to be triggered.
You can select a discounted product by typing its Part Number, or by browsing through the list of products in
your system.
Type:
● Calculation Type “All Items Same Price” should be applied for scenarios where discounting actions are
applied equally to all items (example – ‘If you buy more than 20 items of the product, you get 5% discount
on all those items’).
Loop:
This option should be selected for discounting actions where users will get a discount on certain number of
items for every number of products they purchase (example – ‘For every 10 items that you buy, you get 2 for
free’)
Quantity Breaks: In this part, you define ranges (Quantity Breaks) in quantity to which the particular pricing will
be applied. Take a look at two examples
Example 1: If you select option "All Items Same Price" under “Calculaton type” and set up Quantity Breaks as
follows:
Discount Percent 10 1 5
Discount Percent 20 6 10
Discount Percent 30 11 15
Then, when you add 4 items into the quote, they will be discounted by 10% each. Also, if you buy 13 itmes, they
will be discounted by 30% each.
Example 2:
If you select option "Each Brake Own Price" then if you buy 4 items, they will be discounted by 10% each, but if
you buy 13 items then first 5 items will be discounted by 10%, next 5 items will be discounted by 20%, and the
remaining 3 items will be discounted by 30%.
If you go to Configurator and add one product (BMW 3D is selected as condition product in our example), then
you get informed in the quote that your order qualify for special promotion. (See the following figure).
This portion of page delivers information on "Promotions" functionality while using "Responsive Design". If you
are using "Classic Design", please refer to the previous section.
Under "Definition" tab you can choose a promotion type. There are two types, actually ways, to define
promotion details:
● Pricing Details – this option means that you are going to define promotion details under the tab “Promotion
Details” and will not use ”Scripting” for that purpose
● Scripts – this option means that you are going to write an IronPython script to define promotion details
Many fields on this form are self-descriptive. You can define a period of time in which the particular promotion
will be active. Also, you can choose an option “Subsequent rank override” that will cause all promotions with
rank lower than rank of the current promotion to be suspended.
Pricing Details
Under this tab, you can select product that you want to offer the discount on, and conditional product(s) that
will provide condition rules for promotion that is to be triggered. For example, if you want to create promotion in
the way that, if a user buys one product (conditional) then she can buy another product or number of products
at a lower price. You are allowed to define zero or more conditional products.
You can select a discounted product by typing its Part Number, or by browsing through the list of products in
your system.
Also, beside discounted product, the promotion can be set to be valid for the entire product type or product
category. You can set this in the appropriate setup form (See the following figure). Setup of product type
promotion and product category promotion is similar to the described setup for product promotion setup.
Type:
● Calculation Type “All Items Same Price” should be applied for scenarios where discounting actions are
applied equally to all items (example – ‘If you buy more than 20 items of the product, you get 5% discount
on all those items’).
● Calculation Type “Each Break Own Price” should be applied for scenarios where depending on the quantity
break, items will have a different price (example - ‘If you buy more than 20 items, you get 5 free’. First 20
items will be calculated with the full price, and additional 5 with price 0.
Loop: This option should be selected for discounting actions where users will get a discount on certain number
of items for every number of products they purchase (example – ‘For every 10 items that you buy, you get 2 for
free’)
Quantity Breaks – In this part, you define ranges (Quantity Breaks) in quantity to which the particular pricing
will be applied. Take a look at two examples.
Example 1: If you select option "All Items Same Price" under “Calculaton type” and set up Quantity Breaks as
follows:
Discount Percent 10 1 5
Discount Percent 20 6 10
Discount Percent 30 11 15
Then, when you add 4 items into the quote, they will be discounted by 10% each. Also, if you buy 13 items, they
will be discounted by 30% each. Note that Promo Discount Percent displayed in the Quote is same for each
item.
Example 2:
If you select option "Each Brake Own Price" then if you buy 4 items, they will be discounted by 10% each, but if
you buy 13 items then first 5 items will be discounted by 10%, next 5 items will be discounted by 20%, and the
remaining 3 items will be discounted by 30%. Note that Promo Discount Percent displayed in the Quote is
calculated as overall discount, based on the promotion rules.
From time to time there might be a situation when you want to add one or more products as conditional when
setup promotion. SAP CPQ makes it possible and allows you to choose whether you are going to create
condition using "AND" or "OR" logic between conditional products, product types or categories. SAP CPQ
groups conditions based on the login operator you had chosen during promotion set up.
For promotions that have complex discounting rules, administrators now have the option to write IronPython
script. Scripts written during promotion setup will be executed on the "Add item to cart" event.
Scripting promotions can be applied in two ways depending on If selected product for triggering promotion is:
In the first case, Item of type "IQuoteItem" can be used in script. This is a current item whose properties can be
changed.
In the second case, promotion discount and amount need to be calculated through script in order to be applied
on defined item.
Currencies are used to convert the default currency to a foreign currency. SAP CPQ calculates foreign
currencies by multiplying the conversion rate given in table Currencies by default currency price. This amount
is then multiplied by Market Definition to get the final converted price. Market Definitions give the ability to vary
the amount of conversion for different areas. For instance, in the US, the Dollar is worth a standard amount, but
it may be worth a different amount if used somewhere else. To compensate for this, market definitions can
multiply the US Dollar, or any other currency, by a value greater or less than 1 to give the US Dollar a higher or
lower value.
One of the currencies has to be set as the default currency. The US Dollar (USD) is the default currency used
throughout the system and is the base currency. For the purpose of the manual, we’ll keep the US Dollar as the
The Currency column displays the common abbreviation of the currency, the conversion rate displays how
many units of that currency is equivalent to 1 unit of the default currency (the default currency has a
conversion rate of 1), the description displays the longer description of the currency, the sign displays the sign
entered for that currency, and the default column displays whether the status is the default status or not (only
one of the currency has a YES in the default column).
The fields in yellow are required. User will enter a short name of the currency in the currency column (because
this name would be used to refer to this currency throughout SAP CPQ), than will enter the conversion rate of
the currency relative to the base currency, brief description of the currency, a sign for the currency, and choose
whether the currency would be the default or not. If some other currency is currently set as the default
currency, a confirmation screen would pop up informing that another currency is currently set as the default
currency. Click OK to make the current currency the default or click Cancel to cancel changing the default
status to the current status.
Note
The other currencies are available to modify the currency factor. Because USD is the base and default
currency, its factor cannot be changed and is always constant at 1. Figure A shows the screen displaying the
current currency factors. The , and buttons are used to copy, delete or edit a currency respectively.
Currency symbol can be changed, but it is important to know that changing it you will affect all markets and
therefore all quotes that uses that currency. It is not possible to change currency symbol to one already used.
Note that a currency cannot be deleted while the currency is being used by a Market (See Markets [page 432]
for more information) or while the currency is the default currency. Attempting to delete a currency that is the
current default currency would result in an error message. Attempting to delete a currency that is being used
by a market would also result in an error message.
The left column displays the currency description, while the middle column displays the currency abbreviation.
The abbreviation is used on the Market Definition page to modify the value of the currency. To edit a currency
factory, delete the current factor, enter the new one, then click Save.
Once currency factors have been entered, Market Definitions need to be defined. Market Definition factors are
multiplied by the calculated currency to get the final price.
Market Definitions can be defined by clicking the Market link under the Pricing/Calculations menu.
Here Market Definitions can be Copied, Deleted, or Edited by clicking the respective symbol to the left of the
Market Code. To create a new Market Definition click Add New at the top. This brings up a blank definition
screen.
Every field is required and needs to be filled in order to save the definition. The Market Code is returned with the
tag <*MCODE*> which can then be used with an AUX or XWS tag to access additional information from
another source. Market Name is used to identify the Market Definition. When a user selects the Market in the
cart or on their user page, the Market Name is used for the selection. Currency Sign is the currency that, once
calculated, will be multiplied by the Market Factor to get the final price calculation.
Example:
The Currency factor for the European Monetary Union (EUR) is set to 0.95 and a Market Factor using EUR is set
to 1.2. If the total cart amount comes to $2000, then this amount will be multiplied by the EUR conversion rate
(0.95) then by the Market Factor (1.2) to get €1656. This is the final price calculation.
Once a Market has been defined, it is not visible until a user has been given permission to see the Market. This
is handled in Market Visibility [page 433].
Note
When SAP CPQ is integrated with SAP Subscription Billing, you can select a timezone for a market. The
contract duration and the start and end dates of the subscription product are observed as midnight in the
timezone specified for the market assigned to that product.
Once a Market has been defined, it is not visible until a user has been given permission to see the Market. This
is handled in Market Visibility under Pricing/Calculations. Here visibility rules can be created to determine
which user(s) see which Markets.
The Market Visibility Administration page is shown in the following figure. Here visibility rules can be Deleted or
Edited by clicking the respective symbol to the left.
To add a new rule, click Add New at the top of the administration screen. Creating a new visibility rule brings up
the screen shown below.
Three criteria fields are displayed at the top of the screen: User, User Type, and Company. Defined Users
(Employee), User Types (Type), and Companies are listed in each field. Selection of the criteria fields
The Market Name field displays the Market Definitions that have been created. To select multiple markets
(under the Market Name list-box), click and drag to select multiples, hold down the Ctrl key and make multiple
selections, or click one hold down the Shift key and click another to make multiple selections. The Condition
field can contain any valid expression that can be evaluated as “1” (True) or “0” (False). If the result is “0”
(False) the rule will not apply. If the expression evaluates to “1” (True) then the rule will be applied.
Note
SAP CPQ evaluates market visibility rules on user login, meaning that none of the quote-dependent tags
will work in the market visibility condition.
6.6 Discounts/Multipliers
Multiplier and discount administration allow discounting when a quote is created.
In addition to developing pricing rules for configured products, discount and multiplier rules can be created
also. These rules can be very specific, down to a particular user and a product, or very generic such as for a
particular user group, product category or a product type. Any combination of selections from 5 criteria groups
can be used to specify a discount or multiplier.
Multipliers and Discounts can be used individually or simultaneously. Minimum Value, Default Value, and
Maximum Value can be assigned for each. The Default Value is used when a user first generates a Quote.
Depending on the Shopping Cart style used (see Visual Styles in User Types [page 160]), the Default Discount,
or Multiplier Value, applied to the Cart Total can be modified. Users are allowed to enter values that are within
the Maximum and Minimum Value range. If a user enters a value outside of this range, then the Approval
Process (see the chapter on Approval Process) is initiated.
Note
Default Value is only applied to the Cart the first time that a user generates it. If the Discount or Multiplier is
modified then that value is contained as the Discount or Multiplier value. Reopened quotes will have the
modified Discount or Multiplier value.
The Discounts and Multipliers administration can be accessed through the Discounts/Multipliers link under
Pricing/Calculations.
Discounting rules can be deleted or edited by clicking or respectively. Rules can also be searched by
entering criteria in the text boxes at the top and clicking the Search button on the left. To add a new rule, click
Add New at the top of the screen. This brings up the screen shown below, which is also displayed if a rule is
edited.
Discounting rules can be specified from 5 criteria groups that are shown at the top of the page:
● User Group
● User
● Category
● Product
● Product Type
The priorities of these groups are determined by what is set in Discounting under the Discounting Priorities
menu (see Discount Priorities [page 437]). Fields displayed to the left have higher priority. For instance, in the
examples shown below, User Type has the highest priority. It should also be noted that the labels for each
criteria can be changed in Priority Administration. So label names may be different from what is discussed
here.
Multiple selections within each group are not allowed though. Multiple selections across different groups are
allowed. When selections are made across different groups, the discount or multiplier is applicable only when
all selections are true. Rules can to be created for each individual item in a criteria list if desired.
When check box ‘Use recurring price and cost’ has been activated under SAP CPQ Setup General
Application Parameters General , fields for ‘Discounts for Recurring Price’ and ‘Multiplier for Recurring
Price’ will be added. For more details see Recurring and Non-Recurring Prices [page 448] section.
Multipliers are values such as 0.5, 0.75, etc. that when applied to the list price will represent a percentage of the
price, such as 50 or 75.
Discounts, on the other hand, are values such as 50, 25, etc. that when applied to the list price will represent
that percentage taken off of the price.
The Condition field is used to enter expressions to determine when the rule will run. Any expression entered
must resolve to 1. Entering into the Condition field will make the rule active at all times.
The example above shows a rule that users Bane Purtic from the user group CUSTOMER, can sell Personal
Printer from the category Hardware using multipliers from 0.5 to 1 and/or discounts from 0 to 50, as long as
those products are of product type Product. Also, according to the condition statement, this rule will only run
when the user’s Zip Code is 53202.
More than one rule can be written for the same product using the same user. When this is the case, the
most restrictive rule will be used. This only works, though, when a rule is defined for the product, not for
product type.
Conditions can also be entered into the Multiplier or Discount fields to determine the value. In this way, multiple
rules do not need to be created for separate values.
This example shows that the user will have a Minimal Multiplier value of 0.25 and Default value of 0.5. The
Maximum value, though, is contingent on the user’s zip code. If their zip code is 53202, then the Maximum
value is 1. Otherwise, the Maximum value will be 0.75.
Conditional statements within the Multiplier or Discount fields can be used separately or in conjunction with
the Condition field.
Note
The User can override values? check box is used to determine whether or not a user can modify the Multiplier
or Discount with a value that is out of the Minimal and Maximum value range. When a user attempts to enter a
value that is out of that range, a warning is displayed alerting the user that the value is out of range.
If this box is unchecked, the user will be unable to enter the value. If checked, though, the user will be able to
enter the value, but the quote is automatically submitted for approval to the user’s approve parent. The
Approval Process is then initiated. See the chapter on Approval Process for more information on the Approval
Process.
Note
The Approval Process must be set up in order for the User can override values check box to work correctly.
Setting the discount priorities allows administrators to set the order in which discounting rules are evaluated
and executed on the quote.
Example
For example, you want to allow all sales representatives to discount a product to a maximum of 10%. However,
a sales representative in Paris can discount the product to a maximum of 20%, because you just opened the
store there and you want to give a better initial offer to buyers. In this scenario, you would create a discount rule
for the specific product with a minimum discount of 0 and the maximum discount 10. Then, you would create
another rule for the specific user in Paris, and the product and the rule would allow 0 as the minimum discount
and 20 as the maximum discount. The first rule would have the rank 1 and the second rule for the specific user
would have the rank 0. This way, when any user changes the discount of the before mentioned product on the
quote, the system checks user details, and if it’s not the user from Paris, the system then checks whether the
new discount is in the limits of the rule defined for that specific product. However, if the user from Paris
changes the discount, then the system only applies the rule which is defined for that user.
The discounting rules are set up in the Discount/Multipliers page for Quote 1.0 and the Discounts page for
Quote 2.0. Both pages are in the Pricing/Calculations section.
The discount rules can be set for a specific user, user type, a specific product, product type, and product
category. If needed, per company needs, you can define a custom label for each field.
Rank
The rank of rules can be set from 0 to 5, 0 being the highest rank and 5 the lowest. If you create a rule for a user
with the rank 0, and a rule for a user type with the rank 5, the system will first evaluate the rule set up for the
user, since it has the lowest rank.
The rules are applied when users change both item discounts and product type discounts, but the system
evaluates them differently. When you apply a discount to an item, all rules are evaluated and applied according
to their rank. However, if you apply the discount to a product type, the rules based on the product category and
a specific product will not be evaluated. The reason behind this is that products in one category can have
different product types. In the same way, if you change the discount on a product type, the system won’t
evaluate the discount set for a specific product because that product type probably contains other products as
well.
If Cart amount limit is exceeded then a workflow rule will reroute the Cart accordingly (see Approval Process
Administration [page 366]). This chapter will discuss creating rules which limit the Carts total amount limit
using simple and complex conditions.
Selecting the Total Amount Limit under Pricing/Calculations will bring up the Total Amount Limit screen.
Selecting Add New brings up the Total Amount Limit screen shown in the next picture. In this example, user Will
Peterson is limited to $1,000.
The Condition field can contain any valid expression that can be evaluated as “1” (True) or “0” (False). If the
result is “0” (False) the rule will not apply. If the expression evaluates to “1” (True) then the limit will be applied.
The same simple rule can be created, but applied to an entire group. At the next picture the Entire Inside Sales
group can only quote $5,000. If Will Peterson from the previous example was a part of the Inside Sales Group,
he would be able to quote up to maximum of $5,000 because of the Priority Rules used in this example.
Note
Using the 2 examples above we can also create complex rules that would evaluate to 0 or 1 in the condition
field. Instead of using a 1 for John Smith, let’s set his limit based on the location of the customer. At the next
In the next example, the Channel Rep Group can only quote up to $5,000 if the Territory of the Customer
equals West. Uses the expression: [EQ](<*CUSTOMERTERRITORY*>, WEST)
When finished, click the Save button. This adds the new rule to list on the Total Amount Limit page. To Edit or
Delete a rule, click the respective symbol next to the group column. Total Amount Limit can be used in the
Approval Process Administration to delegate which user will receive any Submit for Approval requests from
selected users. For more information see Approval Process Administration [page 366].
The tag <*USERAMOUNT*> is used to retrieve the Total Amount Limit for a user
The Margin Health feature allows sales representatives to get a visual indication of whether their profit margin
is within the limits of what the administrator marked as a healthy profit margin.
A dedicated column in the quote shows the corresponding icon and the color depending on the margin health
indicators that the administrator set up.
Note
The profit margin in SAP CPQ is calculated by subtracting the cost from the extended list price (discounted
list price) and calculating the percentage of that amount in comparison with the list price.
Margin health indicators can be set up globally for all users and all items, or for a specific user, user type, item,
and product type.
Prerequisites:
● in UI Design Quote Layout , move the Margin Health column from available to selected columns to
make it visible on quotes.
● in Quotes Quote Layout Permissions , set the visibility of the Margin Health column for a permission
group by moving the column from available to selected columns. Have in mind that you also need to set the
visibility of the column on the Margin Health Design and Visibility page.
Note
The Margin Health column is visible on the quote even when the product isn’t in the categories
selected here if the For items where list price is zero, display margin picture as and the For items
where cost is zero, display margin picture as are set to anything but None. Selecting None for these
two fields removes the column from the quote.
5. In Step 3, enter the margin health indicators, in percent, for the price and the recurring price.
Note
Set Margin Health for Recurring Price is available only if the parameter Use Recurring Price And Cost is
set to TRUE in General Application Parameters General Parameters .
6. In Step 4, define a specific condition under which what was defined above is applicable.
The Margin Health column is now displayed on quotes.
Related Information
The default colors and icons are applied if you don’t select other colors and upload other icons. If you’ve
already uploaded a new icon, you can use the default one again by clicking Restore Default. Have in mind when
uploading your own images that they should fit the size of the Margin Health column on the quote. There are no
restrictions on the supported format of uploaded images, except for Internet Explorer, in which only images in
the .gif format are supported.
Furthermore, you can set up whether an icon displays in the Margin Health column, and which one, when the
list price and the cost are zero in the For items where list price is zero, display margin picture as and the For
items where cost is zero, display margin picture as dropdowns, respectively.
Additionally, select the user types for which the Margin Health column displays on quotes.
Note
Although you have set the visibility for margin health for a user type as a prerequisite in Quotes Quote
Layout Permissions , you still need to select it in the list in the Margin Health Design and Visibility page.
Users can change the margin health only within the limits of what the administrator defined as margin health
indicators.
To enable this action, add it to the right status in Workflow/Approval Workflow and set the permissions
for it in Workflow Permissions.
Related Information
The administrator can define margin health rules for a User Group, User, Category, Product Type or Product. To
define margin health rules, click the Margin Health Indicators link under the Pricing/Calculation menu.
In the first step, user can define the user group or user the indicators will be applied to. In the second step, it is
possible to define if these margin health indicators will be applied to all items and product type sub-totals or for
totals. Choosing Items and Product Type sub-total, as shown in the image below, allows defining the Category,
Product Type or Product for which this indicator will be applied.
In step 3, user can enter formulas for margin health boundaries and finally in the fourth step define the
condition under which these margin health indicators will be used.
When check box Use recurring price and cost has been activated under SAP CPQ Setup General
Application Parameters General , new fields for ‘Margin For Recurring Price’ are added. For more details see
Recurring and Non-Recurring Prices [page 448] section.
Once user has defined Margin Health Indicators as described in Margin Health Indicators [page 442], he can
define margin health design and visibility by clicking the Margin Health Design and Visibility link under the
Pricing/Calculation menu.
Here user can choose which color and picture will be used for low, middle and high margin.
Note
There are no restrictions in the system on the supported format of uploaded images, except for IE in which
only images in the .gif format are rendered properly.
In addition, it is possible to define which user group will see margin health on the cart. The image below shows
the cart with margin health.
On this page, the user can adjust margin health with sliders. Margin health can be adjusted per item, product
type or total.
Overview
This feature enables admin to define VAT (per country) percentage that will be applied when calculating quote
amount. Admin has the option to define tax calculation based on the country found in the Ship To role, to define
formula that will calculate VAT percentage or to make the tax field editable in the quote.
To modify or add a tax percentage for a country, click the Country Sales Tax link under the Pricing/Calculations
menu.
Tax percentages can be Deleted or Edited by clicking the corresponding buttons next to the Country Name. To
add a new country tax click Add New at the top of the screen.
To create a new tax, on this screen, select the country and then enter the percentage that will be associated
with that country. Click Save to save the country sales tax.
Once created, country taxes are added to the quote/cart total. The country percentage used on the quote is
determined by the country entered in the Ship to Address. Once a country is chosen for the Ship to address on
the Customer Info tab of the quote, the related percentage is added to the total amount.
Note
The result of the formula calculation will override the percentage calculated based on Ship To country
(table in the previous screen).If formula is left empty, tax will be calculated based on table values
By clicking on button 'Country Tax Formula' you can define formula for country tax. On the user side when
calculating tax, value that is obtained based on this formula will override table values.
Note
If user wants to obtain value from the Country Tax table and use it in formula, it is possible to use this tag-
<*CTX( Global.Tax.Country(<*CTX( Quote.Customer(ShipTo).CountryAbbrev )*>) )*>.
If you want to make country tax field editable for your users, you need to set up cart fields 'Total - VAT Amount'
and/or 'Total - VAT Percent' to be editable in the quote. It can be done through Adding/Removing Editable
Fields [page 396] in Cart Fields Administration.
When item is being edited in the quote and cost has been previously changed in the quote, based on the value
of parameter ‘When item’s cost is edited in the quote, upon changing item’s configuration, cost will be
recalculated’, SAP CPQ will recalculate cost based on configuration (if value is TRUE) or leave cost amount that
was entered by user in the quote (if value is FALSE).
Please note that this will only be applicable when item cost can be edited in the quote.
When item’s cost is edited in the quote, upon changing item’s configuration, cost will be recalculated parameter
is placed in Setup General Application Parameters Shopping Cart and Quotes .
Some XSLT transformation for cart doesn't have COST as field instead they have EXTENDEDCOST.
Here are all the steps to edit cost in the cart in that situations:
1. Set the application parameter “Allow Edit Cost on the Cart” to TRUE in Setup General Application
Parameters Shopping Cart and Quotes .
2. Add “Child Item - Cost” and “Main Item - Cost” to an Editable Field Group in Setup Pricing/
Calculations Cart Fields Administration .
3. Change all occurrences of “ExtendedCost” to “Cost” in all user type XSLT files where the costs should be
editable. This can be done by:
a. Downloading the Shopping Cart Visual Style in Setup => Users => User
Types =>
b. Editing the applicable user type =>
c. Downloading the "Visual styles (Shopping cart / Quotes)" XSLT file =>
d. Replacing all occurrences of "ExtendedCost" with "Cost" =>
e. Saving the updated file with a ".xslt" extension =>
Quote prices depend on market factor and currency rate, which can be updated through Setup. By default,
when users edit existing quotes and market factor and/or currency rate have been changed in the system, new
values will be applied to the quote.
In order for quotes to preserve original market factor and currency rate, you can set a flag found in Setup
General Application Parameters Shopping Cart and Quotes Preserve market factors and currency rates in
saved quotes .
Switching this parameter to “On” means that when users edit existing quotes, original market factor and
currency rate will be applied to the quote.
If system is using original market factor and currency rates (parameter set to 'On'), users can still apply new
market factor and currency rates by executing action “Refresh Market and Currency”.
“Refresh Market and Currency” action can be added to cart either as a standalone action - for users to execute
it explicitly, or as a pre or post-action to some other quote action - for system to execute it implicitly without
informing users . This can be set up in Workflow/Approval Workflow menu in administration.
This new feature gives the ability to support MRC and NRC in the same product and on the same line item in
the cart. There will be two sets of prices, multipliers, discounts, margin indicators, margin sliders for each item
and product type. This allows businesses that have monthly billings to be able to accurately display this pricing
in their configuration and in the cart.
A single item can be defined with two prices, a one time fee (non-recurring cost or NRC) and a recurring fee
(monthly recurring cost or MRC). For example this can be very useful when selling software product with initial
installation/setup monthly fee or if some company is selling subscriptions with initial installation cost and
monthly subscription fee.
The cart fields have also been updated to reflect this update, if administrator has chosen to turn it on. In
product configuration, recurring price are added to responder for every attribute where check box ‘Show
Recurring Price’ is selected. This price is displayed under current price. At the bottom of responder (under Total
Price), there is new label ‘Total Recurring Price’ with product recurring price displayed.
Only layout for ‘QuoteDefault.xslt’ will be changed to support recurring prices and cost. Parameter ‘Use
recurring price and cost’ will be used to determine whether recurring price and cost fields will be displayed.
In order to use this feature, user has to set up few parameters first.
1. In Setup General Application Parameters General , there will be a check box ‘Use recurring price
and cost’ (not selected by default). For more details, see Application Parameters [page 545] section.
When this is activated MRC/NRC fields in Discounts/Multipliers and Margin Health will be active.
2. In Setup Pricing/Calculations Discounts/Multipliers , fields for ‘Discounts for Recurring Price’ and
‘Multiplier for Recurring Price’ will be added. For more details see Discounts/Multipliers [page 434].
3. In Setup Pricing/Calculations Margin Health Indicators , in step 3, new fields for ‘Margin For
Recurring Price’ are added. For more details see Margin Health Indicators [page 442].
4. On Tab 1 of the Product Administration, there is a field for ‘Base Recurring Price’ in ‘Pricing’ section.
5. On Tab 2 of the Product Administration, there are fields for attribute value ‘Recurring Price’ and ‘Recurring
Cost’ in table for attribute values. Also, there is a check box that is labeled ‘Show Recurring Price’. For more
details see Product Editor [page 56].
In Setup Pricing/Calculations Rounding Setup , you can create and apply rounding rules to columns on
quotes. Rounding rules determine how many digits are used in price calculations, how many decimal places are
displayed to users and, in Quote 2.0, which currencies are affected by these calculations.
Note
There is always the Default rounding rule which is used in all calculations whenever specific values are not
provided. This rounding rule can be edited.
Since the Rounding Setup on Quote 1.0 differs from the one in Quote 2.0, they are covered separately in the
following text.
There are two available parameters in Setup Pricing/Calculations Rounding Setup that can be applied
to the rounding logic you wish to be used in your environment.
● Types of Decimal Rounding - determines the rounding method which will be applied to a certain rounding
rule. Its values are:
○ Rounding Away from Zero - when a number is halfway between two other numbers, it is rounded
towards the nearest number that is away from zero.
○ Rounding to Even - when a number is halfway between two other numbers, it is rounded towards the
nearest even number.
3.5 4 4
2.8 3 3
2.5 3 2
2.1 2 2
-2.1 -2 -2
-2.5 -3 -2
-2.8 -3 -3
-3.5 -4 -4
● Fix Quote Amount After Currency Conversion - This parameter checks if there is a difference between the
total net price and the summed (and rounded) extended amount. For example, if the total net price is 100
and the price of each item is 33.33 (99.99 in total for three items), there will be a difference of 0.01 between
the total net price and the extended amount. If there is a difference, that amount is added to:
○ the item with a maximum extended amount if the Fix Items value is selected.
○ the total amount if the Fix Totals value is selected.
In Quote 2.0, you currently can't define if the system should round values away from zero or to even because
the parameter Types of Decimal Rounding is not available in Quote 2.0
Note
Identical currencies cannot be selected twice for the same quote column.
When you are setting up a different number of decimal places for displaying or calculating Item or Total
columns on quotes, it is not enough to simply change the rounding setup for that column. Since different quote
columns’ mathematics are executed (on adding/updating items on the quote, changing that column value and
so on) you must know to what decimal place numerical values (quote columns that other columns depend on)
in the mathematical logic are rounded off.
Troubleshooting
Some issues may occur when the rounding is applied to quote columns.
● The Total NRC discount amount exists in SAP CPQ, although neither of the items has a discount value set.
This may appear as a result of a calculation error, which can be caused by an invalid setting in the Rounding
section. One example of this would be items, which have an extended amount with a decimal residue (for
example, 100.5). If the value of the rounding setting is not greater than zero, the value right of the decimal
separator may be truncated, leading to the rounding issue.
The Shipping section provides a means to add shipping and other associated costs to quotes or orders based
on the shipping method selected.
UPS shipping can be integrated into the SAP CPQ configurator. See UPS Shipping Integration for details.
Shipping Definition can be found under the Pricing/Calculations menu by selecting Shipping.
From this screen different shipping methods can be added, deleted, edited or copied. Shipping Methods can be
searched by entering the Method Name, Price Builder Data, Description, or whether the method is editable or
not into the boxes on the Shipping Methods Definition page, and then clicking Search. More Methods can be
seen by clicking the page numbers or the > symbol at the bottom of the page.
To add a new Shipping Method, click Add New. A blank Shipping Method Definition page will be displayed as
shown in the following figure. Existing Methods can be Copied, Deleted, or Edited by clicking the respective
symbol to the left of the Method Name. Selecting Edit would bring up the same page seen in the following
figure. Fields shaded in Yellow are required in order to save the Shipping Method.
Fill in the Name and any Description that would be helpful to the user. This description is what appears in the
shopping cart.
Selecting the Editable check box makes the shipping method an Editable Filed (see Cart Fields Administration
[page 393]).
When complete choose Save. This brings up the first figure again, with the new shipping method included.
On the user side, the Shipping method can be selected through the Freight dropdown.
This feature enables admin to define state tax percentage that will be applied when calculating quote amount.
Admin has the option to define tax calculation based on the state found in the Ship To role, to define formula
that will calculate state tax percentage or to make the tax field editable in the quote.
Tax percentages can be entered for states in Canada and the US. To modify or add a tax percentage for a state,
click the State Tax link under the Pricing/Calculations menu.
Tax percentages can be Deleted or Edited by clicking the delete or edit buttons next to the State Name. To add
a new state tax click Add New at the top of the screen.
To create a new tax, on this screen, select the state and then enter the percentage that will be associated with
that state. All the states in the United States and Canada are available in the State Name dropdown box. Click
Save to save the state sales tax.
Once created, state taxes are added to the quote/cart total. The state percentage used on the quote is
determined by the state entered in the Ship to Address. Once a state is chosen for the Ship to address on the
Customer Info tab of the quote, the related percentage is added to the total amount.
State tax allows for a general tax to be associated with each state. If more specific tax is required within each
state, the use of an external web service (XWS) may be necessary. With this function, complete and updated
sales tax information within each state is available.
Note
The result of the formula calculation will override the percentage calculated based on Ship To state (table in
the previous screen). If formula is left empty, tax will be calculated based on table values
By clicking on button 'State Tax Formula' user can define formula for state tax. On the user side when
calculating tax, value that is obtained based on this formula will override table values.
Note
If user wants to obtain value from the State Tax table and use it in your formula, he can use the tag-
<*CTX( Global.Tax.State(<*CTX( Quote.Customer(ShipTo).StateAbbrev )*>) )*>
If you want to make state tax field editable for your users, you need to set up cart fields 'Total - Tax Amount'
and/or 'Total - Tax Percent' to be editable in the quote. It can be done through Adding/Removing Editable Fields
[page 396] in Cart Fields Administration.
Simple products can have price code defined. If price is derived from SAP CPQ standard pricebooks, it will be
calculated based on part number and price code.
Example
Same product is sold through different channels. For each channel there is a difference price. Administrator
creates several products with same part number and specifies price code for each channel. Prices are
maintained in pricebooks (part number + price code drive the price).
This section details ways in which Customers can be managed in SAP CPQ.
The Customer Field Permissions administrative section gives you the option to define how the fields in
customer roles are displayed to the user.
Permissions can be defined based on an order’s status and the user group the current user is in. The following
permissions can be defined for each customer role field:
● Hidden - Used for the statuses or user groups that you wouldn’t like the field displayed for. The field isn't
displayed to the users.
● Read-Only - Used for statuses after the quote has been completed, such as Order Placed or Received
Order. The field isn't editable. Whatever value had been entered for the field, it’s displayed as uneditable
text.
● Editable - Used for the initial statuses in which the quote is being created, such as Open. The field is
displayed in whatever format it was defined in.
● Required - Used when administrators want to define this field when they create new customers. Fields
marked as required are editable and displayed with a red asterisk. If users have a customer role set as
Required in the Required Fields by Workflow Action administrative section, then users are required to define
any required fields when that action is performed.
To access the Customer Field Permissions administrative section, click the link under the Customers/Customer
Roles administrative menu. From this screen, you can define permissions for each customer role: Bill To, Ship
To, and End User. You can switch between each through the tabs at the top of the screen.
Customer role fields are displayed for each customer role. The same fields are used for all customer roles. Click
a permission name next to a field to define permissions for that field. This defines that permission for every
user group in every order status.
To set an option to a cell, click the cell to display a pop-up where the option can be selected. You can easily copy
permissions from another customer role’s field, by choosing that field from the dropdown box in the upper
right corner of the screen. There are six different types of cells in the matrix that can be defined:
● All Permissions - Sets the same option for all the cells in the matrix. Click the upper left corner of the matrix
to define.
● All Statuses for One User Group - You can set all the statuses for one user group by clicking the user group’s
name on the left side of the matrix.
● All User Groups for One Order Status - You can set all the user groups for one order status by clicking the
status on the top of the matrix.
● Individual Cell Intersection - You can set a cell intersection between a status and a user group. For instance,
the Sales Rep group should have the customer role field Read-Only when in the Order Placed status.
● Default (For New User Groups) - Set how the customer role field is displayed to the users added to new user
groups that haven’t been set in this matrix yet.
● Default (For New Order Status) - Set how the customer role field is displayed in new statuses that haven’t
been set in this matrix yet.
The default cells make administration easier so that when user creates a new user group or a status, user
doesn't need to go through and define all the customer role field permissions again. The Default for New User
Groups and Default for New Order Status cells is automatically filled with what is set for that field on the
previous screen. Changing the permission in this cell changes the permission on the previous screen.
Selecting an option for a cell that includes all statuses, or all user groups can take some time to set
depending on the number of statuses and user groups created in the system. Large number of groups or
statuses means that there are many cells to set, so there can be a slight delay in setting them all.
When finished defining the advanced customer role field permissions, click Save at the bottom of the page. You
aren't redirected to another page in case you would like to further to define the field.
The Customer Actions administrative section allows you to define which actions are available for each
customer role on the Customer Info Tab. Permissions for actions can be given based on user group and order
status.
Customer Action in administrative section is available by clicking the link under the Customers/Customer Role
administrative menu. This displays a matrix of user groups and order statuses for each customer role. You can
switch the customer role that is being defined by clicking the tabs at the top of the screen. You can easily copy
action settings from another customer roles by choosing that customer role from the dropdown in the upper
right-hand corner of the screen.
To set actions to a cell, click the cell to display a pop-up where one or more actions can be selected. There are
six different types of cells in the matrix that can be defined:
● All User Groups and Statuses - Sets the same option for all the cells in the matrix. Click the upper left
corner of the matrix to define.
● All Statuses for One User Group - You can set all the statuses for one user group by clicking the user group’s
name on the left side of the matrix.
● All User Groups for One Order Status - You can set all the user groups for one order status by clicking the
status on the top of the matrix.
● Individual Cell Intersection - You can set a cell intersection between a status and a user group. For instance,
the Sales Rep group can only Lookup customers from CRM when in the Order Placed status.
● Default (For New User Groups) - Set which customer actions are available to the users added to new user
groups that haven’t been set in this matrix yet.
● Default (For New Order Status) - Set which customer actions are available in new statuses that haven’t
been set in this matrix yet.
The default cells make administration easier so that, when you create a new user group or status, you don't
need to go through and define all the customer actions again.
Note
Selecting an option for a cell that includes all statuses or all user groups can take some time to set,
depending on the number of statuses and user groups created in the system. Large number of groups or
statuses indicates that there are numerous cells to set, so there can be a slight delay in setting them all.
When finished defining the customer actions for the current customer role, click Save at the bottom of the
page.
Local Customers are added by individual users and are visible only to that user. Rules can be written to allow
other users to view these customers, though.
Rules that allow local customer sharing are defined in the Local Customer Visibility administrative section. This
section can be accessed by clicking the link under the Customers/Customer Roles administrator menu. It
contains a list of all existing visibility rules, which can be edited or deleted.
The Local Customer Visibility administration screen shows the parameters from which a rule can be built: User
Type and User. The order in which each is displayed reflects its priority from left to right, with User Type having
priority over Users.
To create a new rule, click Add New. This action displays the screen for defining local customer visibility.
Local customer visibility rules have two areas of definition: the first area specifies which users the rule applies
to and the second specifies the condition under which the local customer becomes visible. It’s only possible to
create one rule per combination of User Type and User. For instance, user can only create one rule for the user
John Smith. However, users can create a rule for the user type Sales, even if John Smith has been added to that
user type. In this case, though, the visibility rule created for the Sales group would have priority over the rule
create for John Smith.
My company's customers - if you tick this checkbox, the users selected previously are able to see your
company’s customers.
When users perform a customer lookup either by typing customer info in a customer role field or through the
lookup action, the system runs the local customer visibility rules applied to the user who is currently logged in.
The condition field of these rules determines which local customers are available.
Conditions can be based on user info or customer info. If based on user info, then all the local customers of the
user that matches in the condition are available. If based on customer info, then only the customers that match
in the condition are available. For example, the rule can state to allow the user type Sales to see all of the local
customers within their user type. You could also create a rule to allow the user type Sales to see all local
customers that are in a certain state. If the condition based on the user or customer info is met, then the
customers are available to the current user.
Assuming the edit action is available to a user, any modifications they do to customers that are available to
them through local customer visibility aren't permanent. Changes only affect the customer’s info in the current
quote.
Only quote can be used in the condition field for visibility rules. In Formula Builder, you can access tags and
create complex conditional statements. Any quote information can be pulled and be used in the calculation,
including user information, customer information, custom fields, discounts, quote amounts, and many others.
Entering 1 in the Condition field allows the selected users to see all user’s local customers.
Rules that allow users to see that global customers are defined in the Global Customer Visibility administrative
section. This section can be accessed by clicking the link under the Customers/Customer Roles administrator
menu. The page contains a list of all existing visibility rules, and they can be edited or deleted.
The Global Customer Visibility administration screen shows the parameters from which a rule can be built:
Group, User, and Company. The order in which each is displayed reflects its priority from left to right, with
Groups having priority over Users, and Users priority over Companies.
To create a new rule, click Add New. Clicking this button displays the definition screen for global customer
visibility.
Global customer visibility rules have two areas of definition: the first area specifies which users the rule applies
to and the second specifies the condition under which the global customers become visible. It’s only possible
to create one rule per combination of User Group, User, and Company. For instance, users can only create one
rule for the user John Smith. They can, however, create a rule for the Sales user group, even if John Smith has
been added to that group. In this case, though, the visibility rule created for the Sales group would have priority
over the rule created for John Smith.
When users perform a lookup for a customer either by typing customer info in a Customer Role field or through
the lookup action, the system runs the global customer visibility rules applied to the user who is currently
logged in. The condition field of these rules determines which global customers are available.
Unlike Local Customer Visibility rules, Global Customer Visibility rules can be based only on customer info. This
is because the customers are global and don’t belong to any particular user, which is the case with local
customers. Only the customers that match in the condition are available to the selected users. For example,
users can specify that the Sales user group can view any global customers in the same territory that they’re
assigned to. This is possible because global customers and users can be assigned to territories. If the condition
based on the customer info is met, then customers are available to the current user.
Once the customer is loaded it and the edit action is available, the current user can temporarily edit customer
info. This doesn't change the customer info on global scale only for that quote in witch has been edited.
Only quote tags can be used in the condition field for visibility rules. In the Formula Builder, users can access
tags and create complex conditional statements. Any quote information can be pulled and be used in the
calculation, including user information, customer information, custom fields, discounts, quote amounts, and
many others. Entering 1 in the Condition field allows the selected users to see all user’s local customers.
Visibility rules can be created to make global customers available to users. For more information on global
customer visibility, see the chapter on Global Customer Visibility [page 462]. Global customers are managed
Adding a new global customer is possible by clicking the Add New button. Standard fields are available when
defining the customer. Fields such as Address, City, ZIP, and Country are required because these fields are
most often used in visibility rules. If the Company entered has CRM account associated with it, then the CRM
Account Id and/or CRM Contact Id can be entered.
You can also fill out the Bill to Role custom fields and End User Role custom fields that appear in the Customer
Info tab in the quote. To define them and decide which fields are displayed on the Global Customers section in
the Setup and on the Customer Info tab in the quote go to the Customer Custom Fields [page 463] help page.
Global customers cannot be edited in the Customer Info tab via the Bill To Role and End User Role, only via the
Ship To Role.
To find the CRM ID for either field, click CRM Lookup. The resulting pop-up window displays the results of the
CRM Lookup. The popup window displays the results of the CRM Lookup. When CRM item is chosen from the
window, the Id field is automatically populated with the CRM Id. Leave the search field blank to display all the
CRM items, accounts or contacts.
Note
The administrative user must be defined in the CRM Administrator Account in order for the CRM Lookup to
work correctly.
Ensure the Active field is checked to allow the customer to be available to those users with visibility rights. This
field can be helpful if a user wishes to deactivate a customer without deleting the data altogether.
All SAP CPQ Customer address fields (Bill To, Ship To, End User) contain standard fields, which hold customer
information. First Name, Last Name, Address, and Company are some of these standard customer fields.
If necessary, you can add one or more custom fields to Customer Roles. You can do that in Setup
Customers/Customer Roles Customer Custom Fields . This page shows custom fields defined for all
customer roles.
On the Customer Custom Fields list page, you can edit and delete existing fields, and add new ones by clicking
Add New.
To add a new custom field, you need to enter Name, Label, and select a customer Role Type to which this field is
added. It's also possible to define the field's rank, but it's not required. Also, you can specify if a customer
custom field contains sensitive data by selecting the Sensitive Data checkbox. Note that the field Name is used
for uniquely identifying customer's custom fields - therefore, users can't add two custom fields with the same
name and role type. By selecting multiple Role Types on this form and clicking Save, you can add multiple
custom fields with exactly the same data - one custom field is added for each customer role.
Customer custom fields are always of the free input type - they can't be changed to dropdown, checkbox, or
something else.
Note that you can't change the Role Type on already created fields. Otherwise, the form is no different from the
Add New custom field form.
As mentioned before, custom fields have a Name field, which is required, and is used along with Role Type to
uniquely identify customer's custom fields. When users copy customer data from one role to another, custom
fields are copied from one role to another along with standard fields. Custom field names are used for
identifying which field is to be copied from the source customer role to which field on destination customer
role. Fields that are contained in source customer role and are missing from destination customer role aren't
copied.
As it’s already known, only Bill To customers are used as customer repository, which is being used when
searching for customers. While for standard customer fields this has little impact, it affects custom customer
fields. When searching for a customer to add them to the Ship To customer role, finding the customer and
adding it to Ship To role, the destination role only contains custom field contents that are defined in Ship To
role, and are also defined in Bill To role, with same custom field name. Users can't create or fill an End User
customer, and load it as Ship To customer and expect that it gets custom fields populated. It only works for Bill
To customer as source.
In V8 SAP CPQ version, users can't enter custom fields on global customers.
Customers can be managed from User Page as usual. However, customer field permissions apply as if the user
is editing a Bill To customer role in the Default quote status. This applies for standard customer fields, their
permissions and for custom customer fields.
Standard Customer Field and Custom Customer Field permissions are being defined on Customer Field
Permissions [page 459] page.
There’s a list of standard field names in the SAP CPQ that appear by default. It is important that you refer to
this list when naming custom fields because no custom field should get a name from this list. In other words,
The Customer Role Default administrative section allows you to define whether or not customer role fields are
filled with user’s information or a user’s company information.
Prepopulating customer role fields with data can be helpful in many instances. For example, channel
representatives often create users themselves in the Bill To customer role and the customer’s name in the Ship
To or End User customer role. Defining customer role default rules ensures that their information is
prepopulated in a customer role each time they create a new quote. These rules are defined based on the user
type and the customer role. This allows controlling which users can and can't have customer roles
prepopulated.
To access the Customer Role Defaults administrative section, click the link under the Customers/Customer
Roles administrator menu. The page contains a list of existing customer role default rules that can be copied,
edited, or deleted.
Click Add New to create a new customer role default rule. This displays the rule definition screen, which
contains the following fields:
● User Type Name - Defines the user type this rule applies to. Each time a user in this user type creates a
quote, the selected customer role becomes prepopulated with data.
● Customer Role - Select the customer role that becomes prepopulated with data for the selected user type.
● Default (Pre-populate) with User Info - Determines that the user’s data prepopulates the selected customer
role fields.
● Default (Pre-populate) with User’s Company Info - Determines that the user’s company info prepopulates
the selected customer role fields.
Note
User's Company Info requires that the company associated with the user has the Create Customer Record
option selected. This creates a global customer and allows the information to be used for customer roles.
See Companies [page 149] for more details.
There are several ways in which customers can be exported and imported into the system in several ways,
which are detailed in this topic.
Context
To export/import global customers in the Customers Export/Import page, follow one of these workflows:
● Download a sample template, fill out customer details, and import the file.
● Export all customers in SAP CPQ.
● Export all customers, change details, and add new customers, then import the file.
To download the import template, click Sample Template in the Customer Import page. The Excel file contains
customer standard fields, which you can fill out with new customers' details.
The same fields are mandatory when creating global customers in Customers/Customer Roles Global
Customers and when importing customers through Excel: Address (1), City, Country, and Zip.
The best practice for importing new customers in the system is to do it through the sample template. To
update existing customer details, you need to export them from the system, change the data and then import
them. The maximum number of customers that can be imported through one Excel template is 10000. An
empty row in the template breaks the import and only the data processed before the empty row is imported.
Note
The limit for the number of rows in the Excel file used for importing customers is 10000 rows. The limit for
the number of rows for exporting customers is 60000 rows.
The following procedure describes how to export all customers in the system, change their details, add new
customer, and import the updates in SAP CPQ.
Procedure
The spinning wheel next to the tab title indicates that the system is building the list of attributes.
When the process is completed, the button name changes to All Customers.
2. Click the button to download the file.
3. Populate the file with new data.
The System Id column needs to remain empty for new customers. The first cell in the Index column needs
to always have the value 1 and the number needs to increment by one in the subsequent cells.
4. Select an identifier in Step 3.
The file name can contain only letters, digits, dashes, and underscores.
7. After the system processes data, the number of valid and invalid records in the file and the following
buttons are displayed:
○ Import Without Preview - starts the import and a message displays once the import is successfully
completed.
○ Import With Preview - a grid with all the customers in the file displays. You can see the status of each
record and select/unselect it for import. Click Save to import the valid customers.
○ Import With Preview of Invalid Records Only - invalid records, if any, display in this grid. The Status
column shows the cause of the error. Selecting invalid records for import is disabled.
8. Click Save to import the valid customers.
You can follow these steps when importing customers through the Manage Customers page since the
customer import/export journeys on the user side and the administrator side of SAP CPQ are the same.
However, on the user side of SAP CPQ, you can export/import only local customers (the Owner column
displays the names of users who created the customers).
Postal code lookup gives you the option to search for the address details of locations across the UK.
In order to use the Postal Code Lookup feature, you need to set up parameters in Setup. You also need the
license from Postcode Anywhere (https://www.postcodeanywhere.co.uk.).
In the Shopping Cart and Quotes tab in Setup General Application Parameters , you need to populate
these parameters in order to use the feature:
In Choose Postcode look-up provider, you should select Postcode Anywhere. Alternatively, leave None if you
don't want to use this feature. You need to have Postcode Anywhere license and to enter account code and
This section contains useful information for managing user interface in SAP CPQ.
Customized HTML Templates and Fixes for Breaking Changes [page 543]
8.1 Branding
SAP CPQ supports multiple brands graphical interfaces. Each user can belong to a brand that has its own
colors, logos, and visual styles.
Users can see the same products and pricing, while having different graphics depending on which company
brand they belong to. Additionally, you can define which users belong to which brand.
For example distinct user interfaces can be displayed to anonymous website visitors, internal users, and
partners. For example, if Company ABC is reselling Company XYZ products, when ABC sales person logs into
XYZ SAP CPQ, it's going to have the ABC branding, but when the XYX user logs into the same SAP CPQ it's
going to have the XYZ branding.
From this screen, different branding definitions can be added, deleted, or edited. Branding Definitions can be
searched by entering the Name, CSS File, Logo Image, or whether the definition is default or not, into the boxes
on the Branding Definition page, and then clicking Search.
Existing Brands can be edited or deleted by clicking the appropriate symbols to the left of the Brand Name.
Selecting Edit brings up the screen for editing the Branding Definition. Fields marked with asterisks (*) are
required in order to save a new Branding Definition. You can see information on the default brand and rename it.
You can also add new brands with a different CSS style sheet and different logos.
It's important to know that if a UI element isn't specified (image or CSS file) for nondefault brand, the value
from default brand is used.
In Setup Users Users , each individual user has a new dropdown field associated with them called
Brand. The default Brand is automatically selected, but if there’s more than one, you can select it from there.
In Setup Users Permission Groups , when adding or editing a permission group, the list of Brands is
added on left side of the screen.
In Setup Quotes Document Generation Templates , when adding or editing a template, list of Brands to
System Permission Groups is added (on tabs Visibility Permissions and Format Permissions).
Additionally, in Setup Quotes Ability to Manage Documents a list of Brands is added on the left. In
Setup Products Custom Tables Delegation of Authority brands are added to the list of System
Permission Groups.
The Custom Category UI administrative section allows customizing the appearance of categories by assigning
them appropriate XSLT files.
Custom Category UI administration can be accessed by selecting the Custom Category UI link under the UI
Design dropdown. From here you can add, delete, or edit category designs.
Adding new design is available by clicking the Add New button. Category and XSLT file are the only required
fields. You can also restrict the design to a specific User Type by selecting the user type from the dropdown.
To access these parameters, go to Setup UI Design Catalog Layout . Application Parameters are
separated into following sections: Tabular View UI, Category Tree UI, List View UI, and Other.
Tabular View UI
● Show Products In – Determines how many columns the products are displayed in on the Products page.
● Show Categories In – Determines how many columns the categories are displayed in on the Categories
page.
● Display Products Above Subcategories – If set to True the products within the selected category are
displayed above the subcategories.
● Load Sub Products In Category – If set to True products from subcategories are displayed too.
● Include Part Number – If set to True part numbers are displayed in the tabular view mode.
Category Tree UI
List View UI
● Include Product Image – If checked, the product image is displayed in the list view mode.
● Include Product Description – If checked, product description is displayed in the list view mode.
Visual Style (Catalog) - determines the default Responder styles that every user sees. User can override these
selections by choosing a new style in the User Groups administrative section.
In case breaking changes occur in the user interface, this temporary feature offers you the option to roll back all
uncustomized templates on a page SAP CPQ to the version released before the currently active version.
The roll-back makes the customization on those pages appear the same way as it used to before the breaking
changes occurred.
Once activated, the roll-back can last until the next version is deployed to the production environment.
However, when the next version is released the frozen pages, along with all their uncustomized templates, are
automatically be reset and they appear as they normally would in the newest release.
Note
To access the feature, go to Setup UI Design Resposnive Templates . Here, you can find all page names
listed next to checkboxes used for rolling the pages back to the previous version. To freeze the uncustomized
templates on a broken page, select the checkbox next to it.
The checkbox Use Fiori styles for turning the new CSS for harmonization with SAP on/off (active by default) is
also located on this page.
Product Configuration Templates provide you much flexibility in customizing the layout of the configuration
screen.
There are templates available to modifying the look of the Configurator, Responder, tabs, steps, and the page.
Product Configuration Templates administration can be accessed by selecting the Product Configuration
Templates link under the UI Design dropdown. From here user can add, delete, edit, or copy Templates.
To add a new template, click Add New. Template Name is the only required field. This is because any XSLT files
that aren’t defined here are defaulted to what is set in the Application Parameters administrative section. Any
files set here override the default.
Also, Guided Selling product responder is different than the normal products responder, and default
GuidedSellingSearch.xsl responder needs to be selected for Guided Selling templates.
There are five sections of the configuration page that user can set templates for (default files are in
parentheses):
● Tabs - defines the look of the tab area on the page (DefaultTabs.xsl)
● Configurator - defines the look of the configuration section of the page (DefaultConfigurator.xsl)
● Steps - defines the area to the left of the configuration section (DefaultSteps.xsl)
● Responder - defines the responder area where the configuration summary is given (DefaultResponder.xsl)
● Page - defines the layout of the screen. Here you’re able to control where each section is positioned on the
page. (DefaultPage.xsl)
User can upload a new file with the Upload button or download existing files by selecting the file from the
dropdown and clicking the Download button. Additionally, you can delete files by selecting a file from the
dropdown and clicking the Delete button.
Once all information is filled in and completed, clicking the Save button saves the template and add it to the list
of Templates.
Product Details Templates allows designing the Product Details page in a flexible, yet easy way by dragging and
dropping various elements to the Design panel. Users can see the templates designed in the Catalog when they
click on products View Details link. Templates can contain information about products, product attributes,
Facebook widgets and so on.
Product Details Templates administration can be accessed by selecting the Product Details Templates link
under the UI Design section of the Setup. From there you can add, delete, edit, or copy templates.
You can add new templates by clicking Add New. A new product details template can be defined in two steps. In
the first step, you need to name the new template. In the second step, you can define the template by dragging
variable elements onto the panel. On the right-hand side of the screen there are four groups of elements:
Product weight is added as a new product property. You can set label, rank, and styles as for all other product
properties. The label of this property depends on the value of the application parameter, Unit of Measurement
under Application Parameters General Parameters . The value of the product property is one of following:
Product Weight in GRAMS, Product Weight in KGS, Product Weight in LBS.
On the first tab Details, you can define properties specific to elements (for example - element div has only one
detail, rank, which defines the order within the parent element). On the second tab Styles, you can define the
style for that element.
Name Description
Tab container Use it when you want to separate data in more tabs.
Tab Use it to display data into a tab panel. Use it together with
tab container.
Caution
After you've finished designing the template, you need to associate at least one product or a category with
this template in order to display it in the Catalog. See Products to Product Details Templates Mappings
[page 474] for more information.
The Products to Product Details Templates Mappings feature allows you to specify where Product Details
template is used.
Templates Mappings administration can be accessed in Setup UI Design Product Details Templates
Mapping . From here user can add, delete, or edit a mapping.
Clicking Add New opens a page where you can connect a single product or products within a category to a
template.
Click Select to choose a Product or a Category the template is mapped to. If product or category isn't selected,
the template is shown for any product or category.
Once you set up the mapping, you can see the details by clicking View Details in the Catalog. It’s possible to
specify whether the details appear in a modal div, or in a new page, by changing the application parameter
Allow view details for simple products in catalogue, which has three available values: No, In modal popup, On
new page (See Application Parameters [page 545]).
When you click on View Details, the system tries to find the template for that product. If there’s no template for
that product, the system tries to find a template for the category to which the product belongs. If there’s no
template for that category, the system continues searching recursively for a template in the parent category.
Finally, if there's no template that matches the criteria, the system chooses a default template (which doesn't
define category and product (Any)) or if there’s no default template mapping, the standard view is used.
Define New Template allows you to choose the template you want to change.
First, you must choose the page of the template, which can include Approval History, Cart, CreditCard,
Configurator, and so on. Then you must define the template name. You can't use invalid characters in the
names of responsive templates. The list of invalid characters includes, but it's not limited to: ASCII/Unicode
characters 1 through 31, quotation marks (“), less than (<), greater than (>), pipe (|), backspace (\b), null (\0)
and tab (\t). If you use an invalid character in the template name, a message informs you of the error.
Note
Even though slash (/) is an invalid character, the templates that contain it in their names, and were created
before the 1911 release, remain unchanged. You can properly manage and use them without removing the
character from their name.
Let’s say you want to change the template on your Cart page. Once you select Cart on your Page dropdown
menu, the Template dropdown menu opens up with a number of different segments that you can customize.
For demo purposes, we’re going to select Sections/Costs.
When you make your selection, the Default Template on the right-hand side shows you what the template looks
like in its original form. When you click Copy default template, the template is copied in the New Template tab.
This enables you to modify the code, whether it's only a line in the code or major changes. You can't save the
new template before entering the new name of the template in the Name box in the Define new template box on
the left-hand side. You can also add a description in the box below, though it isn't mandatory. If you tick the
Default box, the new template shows up as default. This means that any client who logs in and looks at the
section Costs can see the new template, and not the old one.
Note
If you wish to reuse a customized template on several different pages, simply add the
@Html.PartialCustomTemplate(“Reused_Template_Name”) function to another template in which
you want it to be displayed.
Select the page we defined earlier, and the Sections/Costs template. The system then automatically selects all
templates related to this section in the Select Custom Template box. In our case that was the Test_Template
(if we had defined more templates the system would have listed all of them).
When you click Add, the previously defined sections are added to the system, making it possible for all users in
the Sales user type to see the new template.
Template Versions
When you open the Template Versions tab you can see a chronological list of all system and custom template
versions. If a new template version is added to SAP CPQ, it will be displayed above all previous system and
custom template versions.
If a custom template version is active, and a new system template version is added to SAP CPQ, this new
version will be displayed at the top of the Template Versions list. However, it will not be applied unless you
deselect the Default checkbox next to the currently applied custom template version in the Template tab.
The System version you see is the original version, created before any changes have been made. The second
version is the Test_Template we created.
To compare the templates, and see where they differ, tick the checkboxes in the Version column, and click
Compare. You can have more than two template versions, and you may be interested in comparing two, or more
versions.
User Side
Look at the following image to see what the code for the original template looks like in Setup. Notice that the
text on the template in the quote is entirely written in black.
The Styles and Images section allows controlling the look of the application. Though not drastically important,
changing the design of SAP CPQ allows companies to personalize the application’s look according to their
preferences.
To access the Styles and Images section of SAP CPQ, click the link under the UI Design menu. There are three
options that can be modified: Top right image for Logo, Top left image for Logo, Image for Header, and CSS file
style. The image logo options affect the images displayed at the top of the screen.
To upload a new logo, click the Upload button. This displays the File Upload screen where a new image can be
browsed for and uploaded. Once the page is refreshed, the new images are displayed.
The Image for Header option affects the background image that is used as a header.
Images must be in a .gif format to be used by SAP CPQ. In addition, the images need to be same height. Images
currently being displayed can be downloaded by clicking the Download button. To set the default images back,
click Reset to Default.
Note
Extensions are case-sensitive. Make sure the extension .gif is in lower case. Otherwise, an error can be
displayed stating that the extension is wrong.
SAP CPQ uses Cascading Style Sheets (CSS) to determine how a webpage is displayed to users. The display of
many HTML elements found in SAP CPQ is determined by the CSS file. This file can be downloaded if you click
the Download button. It can then be modified and reuploaded. Clicking Reset to Default replaces any modified
CSS file with the default file.
All UI (User Interface) elements are styled with HTML classes. This section explains how you can identify
different elements in your pages, identify the HTML class that is used for these elements, and then apply a
different class. The easiest way to see what elements class name is by installing small plugin for your browsers.
There are two plugins, one for Internet Explorer and one for Firefox. Details are in the following table:
Installation Click the Download button and in Click the Install button from Firefox.
Download dialog click Open or Run. Firebug toolbar can be activated with
After installing the Developer Toolbar, icon in bottom-right corner of browser.
restart Internet Explorer and click the
Developer Toolbar icon in the command
bar to display or hide the Developer
Toolbar.
Pointer Icon UI elements can be selected with the UI elements can be selected with
pointer icon. Inspect.
How it Works Click on the UI element and read the Click on the UI element and read the
class name. Enter that class name in class name. Enter that class name in
CSS file and define its attributes (color, CSS file and define its attributes (color,
background, font…). background, font…).
Note
You can match an element without class that is the descendant of another element that has the CSS class
(that is, Match h1 element that is contained by element with class header: .header h1 { color:
blue } )
This view is representing a icons besides labels that is a common and standard view of Menu. On administrator
side, there is a new table which plenty of possibilities that can be manage through adding/editing icons.
When a radio button Icons is chosen a table below is editable and can be administered. When adding new icon
there are possibilities like position, images, URLs, HTMLs, tags and conditions. Depending on what is managed,
When a radio button Labels is chosen a table below is not editable and cannot be administered.
Once a new icon is added on the administrator side it can be viewed on the user side with all other standard
SAP CPQ icons if condition is allowing to show it. Everything else beside a visual style of menu is the same,
icons are behaving exactly as they are on default menu. Users have same permissions to browse along menu,
and to do that as an administrator or a user.
Here you can find all relevant information about customizations in Responsive Design including different code
examples.
Bear in mind that although these customizations bring lot of power they also raise implementation complexity.
In order to keep things simple avoid customizations when possible or use custom CSS in branding for custom
looks.
8.11.1 Prerequisites
Required knowledge
In order to do responsive customization you should have at least basic knowledge of HTML, CSS, JavaScript
and Knockout. For knockout learning we recommend the official knockout tutorial (http://
learn.knockoutjs.com/).
Tools
We recommend you to install Google Chrome extension for the Knockoutjs context debugger from the
following link: https://chrome.google.com/webstore/detail/knockoutjs-context-debugg/
oddcpmchholgcjgjdnfjmildmlielhof?hl=en.
First of all, you have to know the structure of your observable array. For examples we will use quote custom
fields. Install Google Chrome extension Knockoutjs context debugger. On appropriate page (in this example
Cart Page) open Developer Tools in Chrome (right click and then click on Inspect element or Ctrl + Shift +
I or F12 ).
In Developer Tools go to first tab Elements and on right side click on Knockout context. Below you will see all
available data. Among other things there are custom fields.
When you expand custom fields observable array, and expand one member of array you will see all available
fields such as content, editable, id, isRequired, etc for specified array member. Also there are “values” field
representing array of values and it can be expanded, too.
Function filterByProperty returns a filtered observable array with members that have value of property
matched with passed appropriate values.
First argument is the name of property and other arguments are appropriate values and there is no limit of
number of passed values.
Context:
This function will return all members of array that have value of property “propertyName” equal to value1,
or value2, …, or valueN.
We want to create new section for custom fields where want to show all custom fields that are editable. Custom
filed has property with name “editable” that can be true or false. We don’t want to show all custom fields, but
only those that are editable (that has value of property “editable” equal to true).
With this:
We want to create new section for custom fields where we want to show only custom fields that are type of
“Date” or “Select” or “LongText”. Custom field has property type that has numeric value (0 for Label, 1 for Text,
2 for Select, 3 for Date, 4 for LongText). We want to show only custom fields that have value of property “type”
2 or 3 or 4.
With this:
Function sortByProperty returns an observable array that contains all members of the original array sorted
by property which name is passed.
Also, it leaves the original array unchanged. The only argument is the name of property which is criteria for
sorting array.
Syntax:
array.sortByProperty ('propertyName')
This function will return all members of array sorted by property which name is passed to the function.
We want to create custom section for custom fields where we want to sort them by their label.
With this:
Function count returns the number of array elements that matches predicate function condition.
Syntax:
array.count(predicateFunction)
Similar to the previous function, countWithProperty returns the number of array elements that have value
of property matched with passed appropriate values. First argument is the name of property and other
arguments are appropriate values and there is no limit of number of passed values.
Syntax:
This function will return number of members of array that have value of property “propertyName” equal to
value1, or value2, …, or valueN.
We want to display section custom fields only if there is more than 3 required fields.
With this:
We should check value of property isRequired for each item of array. So, as argument of function we
passed item and then we access to value of its property with item.isRequired, in order to check if that
value is true. We are also able to use logical operators (AND, OR, NOT, and so on) to make complex
conditions.
We want to show section for custom fields only if there is exactly one non required field with type of “Date”
(value of properties “type” and “isRequired” should be 3 and false, respectively).
We should check value of properties “isRequired” and “type” for each item of array. So, as argument of
function we passed item and then we access to value of properties “isRequired” and “type” with
item.isRequired and item.isRequired. We use logical operator && for linking conditions.
Note
Everything above about predicate functions is valid for all predicate functions in other customization
functions, such as any, all, indexOf, lastIndexOf, first, last, and so on.
We want to display section custom fields only if there is more than 3 required fields.
With this:
We should check value of property isRequired. So, first argument is the name of property and second
parameter is appropriate value of property “isRequired” and that is true.
We want to show section for custom fields only if there are more than two custom fields with type of “Date” or
“Select” or “LongText”. (appropriate values of property “type” are 2, 3 and 4).
With this:
We should check value of property type. So, first argument is the name of property and other parameters are
appropriate values of property “type” and that are 2, 3 and 4.
Function all returns the boolean value whether all elements of the passed observable array matches
predicate function condition.
Syntax:
array.all(predicateFunction)
Similar to the previous function, allWithProperty returns the boolean value whether all elements of the
passed observable array have value of property matched with passed appropriate values. First argument is the
name of property and other arguments are appropriate values and there is no limit of number of passed values.
This function will return true if all members of array have value of property “propertyName” equal to value1,
or value2, …, or valueN.
Syntax:
Example1:
We want to display section for custom fields only if all custom fields have id greater than zero and don’t trigger
save.
With this:
Example2:
We want to display section for custom fields only if there are only custom fields with id 5, 17, 35 and 212.
With this:
We should check value of property id. So, first argument is the name of property and other parameters are
appropriate values of property “id” and that are 5, 17, 35 and 212.
8.11.2.5 any/anyWithProperty
Function any returns the boolean value whether at least one element of the passed observable array matches
predicate function condition.
Syntax:
array.any(predicateFunction)
Similar to the previous function, anyWithProperty returns the boolean value whether at least one element of
the passed observable array has value of property matched with passed appropriate values. First argument is
This function will return true if any member of array has value of property “propertyName” equal to value1, or
value2, …, or valueN.
Example:
We want to display section for custom fields only if there is at least one required custom field.
With this:
8.11.2.6 indexOf
Function indexOf returns index of the first element of passed array that matches predicate function condition.
If predicate function is not passed, native 'indexOf' function will be called. Native 'indexOf' is function
from knockout. It receives member of array as parameter and returns index of that member in array starting
from 0. Our modified function receives predicate function and returns index of array member that matches
predicate function condition.
array.indexOf(predicateFunction)
Example:
We want to display section for custom fields only if none of the first five custom fields is read-only.
We should check index of first appearing of read-only custom field. It should be greater than 4 (because
indexes start from 0).
With this:
8.11.2.7 lastIndexOf/lastIndexOfWithProperty
Function lastIndexOf returns index of the last element of passed array that matches predicate function
condition.
Syntax:
array.lastIndexOf(predicateFunction)
Syntax:
This function will return index of the last element of passed array that has value of property “propertyName”
equal to value1, or value2, …, or valueN.
Example1:
We want to display section for custom fields only if none of last three custom fields has different name and
label. (all of last three custom fields have same name and label) We should check if index of last appearing of
custom field, with different label and name, is less than array length minus three (because indexes start from
0).
3. With this:
We want to display section for custom fields only if none of the last three custom fields is required.
We should check if index of last appearing of custom field, with value of isRequired equal to true, is less than
array length minus three (because indexes start from 0).
With this:
8.11.2.8 first/firstWithProperty
Function returns the first element of passed array that matches predicate function condition.
The arguments are predicate function, which is mandatory, and default value, which is optional parameter. If
there is no array member that matches predicate function condition, default value will be returned. If default
value is not defined null will be returned.
Syntax:
array.first(predicateFunction, [defaultValue])
Similar to the previous function, firstWithProperty returns the first element of passed array that has value
of property matched with passed appropriate values. First argument is the name of property and other
arguments are appropriate values and there is no limit of number of passed values.
This function will return first element of passed array that has value of property “propertyName” equal to
value1, or value2, …, or valueN.
Example1:
We want to show label of the first required custom field (without default value).
Example2:
We want to show label of the first required custom field, if there is no required fields show No required fields.
(with default value)
Example3:
The arguments are predicate function, which is mandatory, and default value, which is optional parameter. If
there is no array member that matches predicate function condition, default value will be returned. if default
value is not defined null will be returned.
Syntax:
Similar to the previous function, lastWithProperty returns the last element of passed array that has value of
property matched with passed appropriate values. First argument is the name of property and other
arguments are appropriate values and there is no limit of number of passed values.
Syntax:
This function will return last element of passed array that has value of property “propertyName” equal to
value1, or value2, …, or valueN.
Example1:
We want to show label of the last required custom field (without default value).
Example2:
We want to show label of the last required custom field, if there is no required fields show No required fields.
(with default value)
Functions sortByProperty and filterByProperty return new observable array and they can be combined
with other functions.
Example1:
We can sort the array by value of label and then get the name of the first required member of sorted array.
Example2:
We can filter the array by value of editable and then check if all editable fields are required.
Example3:
We can filter the array by value of editable and then check if any editable field is required.
In this topic you can see different types of common customizations in Responsive design as well as usefull
HTML snippets:
Procedure
.cald_logo {
background: url(https://devstable.webcomcpq.com/mt/DEFAULT/additionalfiles/
logo1.jpg) no-repeat center center;
background-size: contain;
}
This section contains customizations which can be applied to the Configurator page.
Change the Way Attributes are Displayed in One Tab [page 501]
Here, you can learn how attribute image checkboxes are customized.
Procedure
With this:
.image-checkbox {
width: 100%;
}
.image-checkbox input.custom[type="checkbox"]:checked + span.img-thumbnail {
border: 2px solid #00a8e3;
box-shadow: 0 0 8px #dce1e5;
}
This page contains a piece of code which should be added to your custom CSS file to make the Responder
display in a modal window.
.hide-responder {
display: none;
}
.info-label.total {
display: table-cell;
}
.full-width {
width: 100%;
}
Procedure
2. Add condition for tab ID (or name) and then display the attributes inside that tab the way you want
(example is showing attributes in a table).
This section contains customizations which can be applied to the Cart page.
Regular custom actions on cart can have embedded JavaScript code that will execute on click.
Context
We want to add some JavaScript code for our custom action on a quote. We need to know our action's ID. For
this example, let's say that ID is 2524.
Procedure
1. Create IronPython script that returns some message (for example This is a test message.) and name it test.
2. Create a new ActionsTemplate on the Cart page.
3. Override default template with this (Observe that id in this example is our custom action's ID):
<script type="text/javascript">
window.ShowResult = function ()
{
var result = $.get("https://sandbox.webcomcpq.com/customapi?
username=admin&password=password123&scriptname=test");
alert(result);
};
</script>
<script type="text/html" id="actionsTemplate">
<div data-bind="foreach: $data">
<!-- ko if : $root.displayImagesForCartActions -->
4. Go to Cart page.
In this example we've used SAP CPQ custom API for script execution. Of course, you can call any other
supported external API source.
We will customize cell template in order to allow negative numbers for discount, extended amount, and so on.
Procedure
Display Custom Field in Product Type Section in Item Total Row [page 511]
This procedure shows you how to make a custom field diisplay in the Item Total row of the Product Type
section.
Procedure
4. In this example we want to show custom field with id = 57. Name those custom templates wherever you
want to use them on Cart page, just by adding this part of HTML:
This procedure shows you how to make custom fields display in a separate section.
Procedure
1. Create new template inside the section where you want your new section to appear. For example, Sections/
CustomFields on the Cart page.
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko if : $data.itemDescription.productTypeName() === 'Accessories' -->
@if (Model.Cells[i].ColumnName != "someNameColumn")
{
With this:
<div id="custom-fields-section">
@*Custom fields*@
<div data-bind="visible: customFields().length > 0">
<div class="col-md-12">
<h3
class="alternate">@Translation.Get("xsltQuoteCartCustomFields")</h3>
</div>
<div class="clearfix">
<div data-bind="foreach: customFields" class="custom-fields">
<!-- ko if: $data.id !== 53 && $data.id !== 57 -->
<!-- ko template: template -->
<!--/ko -->
<!--/ko -->
</div>
</div>
<br />
<h3 class="tertiary">My section for custom templates</h3>
<div data-bind="foreach: customFields" class="custom-fields">
<!-- ko if: $data.id === 53 || $data.id === 57 -->
<!-- ko template: template -->
<!--/ko -->
<!-- /ko -->
</div>
</div>
</div>
Results
In this example we create new section with name My section for custom template. We put custom fields with
IDs 53 and 57 in new section and remove those custom fields from regular section.
This procedure shows you how to make the custom field value display in the Shopping Info form.
Procedure
With this:
Results
In this example we write value of custom field with ID equal to 50 into field with name someFieldOnForm.
This procedure shows you how to make a custom field display in the Product Type section.
Procedure
With this:
In this example we write value of custom field with ID equal to 55 into column in section Product Types with
name DiscountPercent, but only for product type Hardware.
This procedure shows you how to make a custom field diisplay in the Item Total row of the Product Type section.
Procedure
With this:
Results
In this example we write value of custom field with ID equal to 55 into column in section Product Types with
name DiscountPercent, but only in Item Total row.
This procedure shows you how to customize a quote item custom field to appear as a checkbox.
Procedure
○ If you want default value (when you enter the quote for first time) of checkbox to be checked set
Calculation formula to be true.
2. In Pricing/Calculations Cart Fields Administration for appropriate status and user type set this
custom field to be editable.
3. In QuotesQuotes Quote Layout Permissions set visibility permission for this custom field.
4. In UI DesignUI Design Quote Layout set this custom field to be visible in Cart.
For Page select Cart, for template set Sections/ItemsTable, set Name and check Default.
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
With this:
if (Model.Cells[i].ColumnName == "someNameCheckboxCF")
{
<!-- ko template : { name : 'checkBoxTemplate', data: values[@i] } -->
<!-- /ko -->
}
else
{
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
}
This procedure shows you how to customize a quote item custom field to appear as a dropdown.
Procedure
1. Create custom field (for example someNameDropDownCF), and set its type to Text.
2. In Pricing/Calculations Cart Fields Administration for appropriate status and user type set this
custom field to be editable.
3. In Quotes Quote Layout Permissions set visibility permission for this custom field.
5. In UI Design Responsive Templates create new responsive template. For Page select Cart, for
template set Sections/ItemsTable, set Name and check Default.
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
With this:
if (Model.Cells[i].ColumnName == "someNameDropDownCF")
{
Results
In this example there are three statuses - Status 1, Status 2 and Status 3 in observable array that will be
displayed as options in dropdown, but you can create tour own custom observable array.
This procedure shows you how to add an image to the item custom column.
Procedure
1. Go to Setup General File Management and upload an image in folder Additional Files.
2. Create custom field (for example CFWithPicture), set its type to Text and for calculation formula set picture
path.
This example is for devstable environment, default domain and picture with name image1.jp is
uploaded in folder additionalfiles
3. In Quotes Quote Layout Permissions set visibility permission for this custom field.
5. In UI Design Responsive Templates create a new responsive template. For Page select Cart, for
Template set Sections/ItemsTable, set Name and check Default.
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
With this:
@if(Model.Cells[i].ColumnName ==
"CFWithPicture")
{
<img data-bind="attr : { src : values[@i].value}"></img>
} else
{
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
}
Results
In this example we change the way of rendering quote item custom field if field name is CFWithPicture. For
that custom field we want to render image with path defined in its calculation formula.
This procedure shows you how to make an item column value display in the first columnn.
Context
We are assuming that like in previous example [page 515] there is the same Item Custom field named
CFWithPicture that contains URL. We will add this custom field in first column.
Procedure
1. In place where we want to display this picture (form quote item custom field) add this part of code in the
Sections/ItemsTable template on the Cart page:
2. We use knockout projections function filter to get column value where column name is CFWithPicture.
We could expand our example with hidding this column form items table. We need to remove it from
header. Change this part of code:
<thead>
<tr style="height: 20px;">
<th rowspan="2" data-bind="visible: canManageItems" class="manage-
items">
<input type="checkbox" class="custom" data-bind="checked:
selectAll"/>
<span class="lbl"></span>
</th>
<th rowspan="2">@Translation.Get("docItem")</th>
@*Complex columns have 2 additional columns in next row sot their
rowSpan is 1 and colSpan is 2*@
@foreach (CartItemColumnVm column in Model.Columns)
{
if (column.IsComplex)
{
<th colspan="2" rowspan="1">@column.HeaderLabel</th>
}
else
{
<th colspan="1" rowspan="2">@column.HeaderLabel</th>
}
}
</tr>
<tr>
@foreach (CartItemColumnVm column in Model.Columns)
{
if (column.IsComplex)
{
<th>@Translation.Get("xsltNRC")</th>
<th>@Translation.Get("xsltMRC")</th>
}
}
</tr>
With this:
<thead>
<tr style="height: 20px;">
<th rowspan="2" data-bind="visible: canManageItems" class="manage-
items">
<input type="checkbox" class="custom" data-bind="checked:
selectAll"/>
<span class="lbl"></span>
</th>
<th rowspan="2">@Translation.Get("docItem")</th>
@*Complex columns have 2 additional columns in next row sot their
rowSpan is 1 and colSpan is 2*@
@foreach (CartItemColumnVm column in Model.Columns)
{
if (column.Name != "CFWithPicture")
{
if (column.IsComplex)
{
<th colspan="2" rowspan="1">@column.HeaderLabel</th>
}
else
{
<th colspan="1" rowspan="2">@column.HeaderLabel</th>
}
}
}
</tr>
<tr>
@foreach (CartItemColumnVm column in Model.Columns)
{
if (column.IsComplex && column.Name != "CFWithPicture")
{
<th>@Translation.Get("xsltNRC")</th>
<th>@Translation.Get("xsltMRC")</th>
}
}
</tr>
</thead>
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
With this:
if(Model.Cells[i].ColumnName !=
"CFWithPicture")
{
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
}
This procedure shows you how to hide values from some columns in the quote.
Procedure
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko template : { name : values[@i].template, data: values[@i] } -->
<!-- /ko -->
</td>
With this:
<td data-title="@Model.Cells[i].CellLabel">
<!-- ko if : $data.itemDescription.productTypeName() === 'Accessories' -->
@if (Model.Cells[i].ColumnName != "someNameColumn")
Results
In this example we want to hide values from column with name someNameColumn, but only for products which
type is Accessories.
This section contains customizations which can be applied to the Catalog page.
This procedure shows you how to remove images of categories from the Catalog.
Procedure
<style>
.categories-tabular .image-holder {
display: none;
}
</style>
You can also add this to your CSS file for categories.
Procedure
<style>
.product-box .image-holder {
display: none;
}
</style>
You can also add this to your CSS file for products.
In this section you can see different types of more advanced customizations in Responsive Design that add
custom behavior to pages:
Window contain global cpq variable. Sole purpose of this variable is to help deliver Responsive Design
customizations that contain custom behavior (custom JavaScript).
cpq.models:
Models property will expose all knockout models present on current page. This will make easier to reach model
instance and inspect it. To try it out type cpq.models. in your browser console and see what will auto-
complete offer you.
Server property is there to help you communicate with server from your JavaScript. It contains only one
member, function executeScript which invokes your global IPython script. Please see Consuming Python
Global Scripts as REST web services.
JavaScript:
JavaScript:
Events object contain pub and sub functions which allow you to subscribe to SAP CPQ public javascript events.
It also allow you to publish and subscribe to your custom events. This can be useful if you are building multiple
widgets for the same page that need to communicate.
Code Syntax
JavaScript
Code Syntax
JavaScript
Code Syntax
JavaScript
Each knockout model in SAP CPQ will raise events when models is crated and updated. When model is created
"modelCreated" is raised. When model receives data from server "modelName:updated" is raised. This event is
also raised when initial data is received. In this events data sent will alway have property "model" which
contains reference to model that raised the event.
Code Syntax
JavaScript
cpq.ready:
ready is function that accepts only one parameter which is callback function which is called when document is
ready. Unlike jQuery ready event this one will wait for some script initialization to finish so you can use ko global
variable.
Code Syntax
JavaScript
cpq.ready(function(){
var model = {
name: ko.observable('MyModle'),
items: ko.observableArray()
};
ko.applyBindings(model, document.getElementById("exampleWidget"));
});
For full example using ready function please see WorkflowContext ClientData Rendering [page 525].
Data you put in WorkflowContext.ClientData can be accessed on client on Cart and CartList knockout
model using WorkflowClientData observable on model.
This observable stores last WorkflowContext.ClientData received from server and can be used for
rendering. See example below.
Once custom action that will build ClientData is created, you need to add the following IronPython script to the
action:
Python:
After you are done don't forget to setup new custom actoin in workflow and workflow permissions.
Now if you go to Cart you will see new action Get ClientData.
When you click Get ClientData IPython script sends data to client which is then rendered using out custom
template.
<script type="text/javascript">
cpq.ready(function()
{
var model = {
isVisible: ko.observable(true),
data: ko.observableArray(),
clearAll: function ()
{
model.data([]);
},
remove: function(item)
{
model.data.push(data.model.workflowClientData()[i]);
}
}
});
ko.applyBindings(model,
document.getElementById("exampleWidget"));
});
</script>
<div id="exampleWidget" class="center-block" data-bind="visible: isVisible"
style="display: none; width: 500px">
<div>
<strong>This is custom widget</strong>
<a href=#" data-bind="click: clearAll, visible: data().length >
0" style="float: right">Clear all</a>
<!-- ko foreach : data -->
<div class="alert" data-bind="css: { 'alert-info' : type ===
'info', 'alert-danger' : type === 'error', 'alert-warning': type ===
'warning' }">
<span data-bind="text: message"></span>
<a href="#" data-bind="click: $root.remove" style="float:
right">remove</a>
</div>
<!-- /ko -->
<div data-bind="visible: data().length === 0">currently
empty...</div>
</div>
</div>
2. Go to Cart page. You should see empty widget just above the quote:
In previous example we've implemented widget that is positioned above cart page. This is because cart page
already have applied knockout bindings and we can't apply two or more bindings on same model. Luckily,
knockout have workaround for that, which give us possibility to implement our widget anywhere inside cart
page.
<script type="text/javascript">
cpq.ready(function()
{
var model = {
isVisible: ko.observable(true),
data: ko.observableArray(),
clearAll: function ()
{
model.data([]);
},
remove: function(item)
{
model.data.remove(item);
}
};
cpq.events.sub('cart:updated', function(data) {
// if we received client data, add it to our model
if (data.model.workflowClientData())
{
for(var i = 0; i <
data.model.workflowClientData().length; i++)
{
model.data.push(data.model.workflowClientData()[i]);
2. Go to the Cart page. You should see widget as part of the cart page, similar to previous example.
Note that only difference between this and previous example is in block of code just above applyBindings
part. Then, we surounded our widget div with stopBinding function that we've added in script block to tell
knockout that on this part of HTML is applied inner binding.
The example of global script (name of script, Ex. GetData) for getting key attributes:
def GetColumns(mainItems):
columns = ["Product Name"]
if len(list(Quote.MainItems)) > 0 :
MyPage.html:
<!DOCTYPE html>
<html>
<head>
<script src="libs/jquery.js"></script>
<script src="libs/knockout.js"></script>
<script src="app.js"></script>
<script src="libs/bootstrap.min.js"></script>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="libs/bootstrap.min.css">
</head>
<body>
<div>
<table class="table table-bordered table-hover ">
<thead>
<tr data-bind='foreach: columns'>
<th>
<span data-bind="text: $data"></span>
</th>
</tr>
</thead>
<tbody data-bind="foreach: rows">
<tr>
<td data-bind="text: $data.productName "></td>
<!-- ko foreach: $data.keyAttributes -->
<td data-bind="text: $data.ParsedValue || 'Null'"></td>
<!-- /ko -->
</tr>
</tbody>
</table>
</div>
</body>
</html>
app.js:
$(function() {
$.get(location.origin + "/customapi/executescript?scriptname=GetData",
function(data) {
var ViewModel = function(data) {
var self = this;
self.columns = ko.observableArray(data.columns);
self.rows = ko.observableArray(data.values);
};
ko.applyBindings(new ViewModel(data)); // This makes Knockout get to
work
We need to define a tab with IFrame as a Type, and in IFrame URL you should provide URL like : https://
webcomcpq.com/mt/default/additionalfiles/MyFolder/MyPage.html
Where MyFolder is a folder where we will upload our files (html, js, css), and MyPage.html our custom page
for displaying data.
Also we need to include knockout.js and jquery.js and reference them in MyPage.html. We can include
bootstrap to make UI looks more native.
All files needs to be uploaded to MyFolder, previously defined. For better organization we can create sub-
folder lib and place all common libraries (such as 'knockout.js', 'jquery.js', 'bootstrap.css..') there.
This procedure shows you how to make the list of hidden attributes display in the Responder.
Procedure
1. Create new IronPython script for listing all product attribute values and name it GetHiddenAttributes.
Those attributes are hidden.
IronPython:
list = []
atrributes = Product.Attributes
for attr in atrributes:
if not attr.ShowInResponder:
for value in attr.Values:
list.append(value.Display)
ApiResponse = ApiResponseFactory.JsonResponse(list);
<script type="text/javascript">
showResult = function (callback)
{
return cpq.server.executeScript("GetHiddenAttributes", {}, callback);
};
cpq.ready(function(){
var model = {
dataArray: ko.observableArray()
};
cpq.events.sub('API:configurator:updated', function(data) {
init = function(serverData) {
for(var i = 0; i < serverData.length; i++)
{
model.dataArray.push(serverData[i]);
}
};
showResult(init);
});
ko.applyBindings(model, document.getElementById("exampleList"));
});
</script>
<div id="exampleList" class="row" data-bind="visible: dataArray">
<strong>Below is some client data</strong>
<ul>
<!-- ko foreach : dataArray -->
<li data-bind="text: $data"></li>
<!-- /ko -->
</ul>
</div>
4. Configure your product and you should see list of hidden attribute values rendered just above the
Responder every time Configurator updates.
This procedure shows how you can download XML file that has been generated by global script.
The example of global script (name of script, For example, GenerateXML) for generating XML file:
import clr
clr.AddReference('System.Xml')
from System.Xml import XmlDocument
from System.Text import Encoding
from System import DateTime, Random
xmlDoc = XmlDocument();
rootNode = xmlDoc.CreateElement('users');
xmlDoc.AppendChild(rootNode);
userNode = xmlDoc.CreateElement('user');
attribute = xmlDoc.CreateAttribute("age");
attribute.Value = '42';
userNode.Attributes.Append(attribute);
userNode.InnerText = 'John Doe';
rootNode.AppendChild(userNode);
ErrorMsg = None; #get error msg
Note that we have set ErrorMsg to None, you should use some logic to see if error has happened and assign
message to ErrorMsg
You should create custom template and add button that will trigger script and use cpq global variable to
download XML file.
The @ sign in templates denotes use of Razor syntax. Razor is a markup syntax for adding server-based code
to web pages. It is a server side markup syntax much like ASP and PHP and supports C# and Visual Basic
programming languages.
Example
XML:
<h1>Hello Razor</h1>
<p>The time is @DateTime.Now</p>
Razor view helper functions are used in responsive template and all templates that we want to see title of
CSHTML file when we are debugging ( F12 in browsers).
Available functions:
Translation is a helper function that renders message text on page based on key from appliaction dictionary.
The syntax is: @Translation.Get(key). This function will render message text from dictionary based on
provided key.
Context
We want to add multilanguage support to our template. To do that we need replace our static text with calls to
Translation.Get.
Procedure
@Translation.Get("MyKeyFromDictionary")
3. When template renders you should see value from appliaction dictionary for supplied key.
Function PartialWithNameAsComment renders the specified partial view as an HTML-encoded string and
adds name of file as a comment in html.
Context
Syntax:
@Html.PartialWithNameAsComment(partialViewName)
@Html.PartialWithNameAsComment(partialViewName, model)
@Html.PartialWithNameAsComment(partialViewName, viewData)
@Html.PartialWithNameAsComment(partialViewName, model, viewData)
These functions will render partial view and add name of that source file as a HTML comment.
We want to add custom cshtml template on our main page, but we would also like to see message that from
certain part in our main page begins custom template part. That message will be visible as HTML comment
when debugging our page in browser.
Procedure
XML:
@Html.PartialWithNameAsComment("CustomTemplateCF")
Procedure
3. After shared template is created, we can use it within some other template. For example, if we have
template for Catalog page and we want to use some shared template within it, we simply call it with
@html.PartialCustomTemplate("Template_Name") where we want to add that part.
After naming shared template we will see it as part of Catalog page template when we exit setup. As it is shown
below, the point where is shared template placed matches the point where we call it within the code (on the top
of the page).
8.11.5.4 Url.MTContent
Syntax:
@Url.MTContent(path)
Example
Render image beach.jpg that you previously added to Additional Files folder.
C#:
Custom CSS or JS files can be uploaded via the File Manager into additional files folder and be used and
referenced in custom templates.
Context
We want to upload JavaScript file on file system and reference that JS file in our custom action template on
Cart page.
Procedure
1. Create and upload your JavaScript file via File Manager into additional files folder.
In our example, JS file is a simple function that shows message in alert box.
XML:
Observe that src attribute in script html tag represents path to the uploaded script in additional files folder.
Also, ShowResult() is our JS function from uploaded file.
3. Go to Cart page.
Here is an example of how to use new version of template and upgrade the existing one. When custom
template is used and new version of template appeared with new release, user won't see these modifications
unless he compares them and then upgrades custom template with differences. For this purpose we use
Template versions tab on Responsive UI Template page. Here, we have all versions of some template. Versions
with User System are release's versions and versions with some other user are custom.
After two versions are selected and Compare button is clicked we can see the differences between these two
versions, so than we can use these rows to upgrade our version of template.
This section provides best practices for common breaking changes that may occur in SAP CPQ. Currently, this
topic contains customized templates listed per version and the ways in which some of the breaking changes on
SAP CPQ pages may be fixed.
Customized HTML Templates and Tips for Fixing Breaking Changes 2005
The list of all templates that were customized during the development of SAP CPQ, as well as tips for fixing
breaking changes can be found in the UI Design section of SAP CPQ 2005 What's New.
This file contains a list of all templates that were customized during the development of SAP CPQ, as well as
the tips for fixing breaking changes that may have occurred as a result of the customization.
This file contains a list of all templates that were customized during the development of SAP CPQ 1908. No
breaking changes occurred in this release.
Customized HTML Templates and Tips for Fixing Breaking Changes 1905
This file contains a list of all templates that were customized during the development of SAP CPQ 1905, as well
as the tips for fixing breaking changes that may have occurred as a result of the customization.
Application Parameters are separated into following tabs: General Parameters, Users, Product Catalog,
Configurator, Shopping Cart and Quotes, and Bulletin Board.
Note
Changes made to application parameters are logged in the User Actions tab of the Audit Trail. The following
information is logged in the Action column: Application parameter changed.
The following list explains the parameters in the General Parameters tab.
Users
● Check For 5-digit Zip Code Number For Customers (USA format): determines whether Users need to enter
a 5-digit zip code number in the Bill To Details table on the Customer Info page in order to save the page.
When set to NO, SAP CPQ allows Users to enter another digit format and save the page.
● Validity Period for Password Creation Token: The number administrators provide here determines for how
many hours the URL for password creation sent to a newly created user’s email address is valid.
● Use End User Role: determines whether the end user role is used or not.
● Fill BILL TO and SHIP TO data with default values: determines whether the Bill To and Ship To fields are filled
in with default values.
● If the User Changes the Password It Will be Valid Another: specifies the number of days left until the
password expiration date.
● Max Number of Days Before Password Expiration Warning is Shown: specifies the number of days before
Users receive a warning that their password needs to be changed. Password expiration is set for each User
in the User/Groups drop-down menu. See the chapter on Users for more information.
● User Can Change Global Customers’ Data: determines whether Users can modify global customer data.
When set to NO, only administrators can change the data.
● When determining permission groups based on market, use Quote selected market if available: defines
whether SAP CPQ uses the Quote-selected market. If the Quote-selected market is not available, SAP CPQ
Product Catalog
The following list explains the parameters in the Product Catalog tab.
Example
A sample product “Warranty” with product code “Warr-1-yrs-extended” has its description defined this way:
Discount factor: <* TABLE ( SELECT Discount FROM contracts WHERE contract_name =
'Contract 12073' ) *> <br/>
* Visitor name: <* VisitorName *> <br/>
* Product code: <* ProductCode *>
In the example, both product description and price are parsed, but product code is not retrieved and therefore
is not displayed.
To demonstrate this option, the product “Warranty” is modified by adding the attribute “Payment”. This
attribute has two values — “semiannually” and “annually”, with their prices $30 and $50, respectively. The
pricing formula is modified as well. It now reads the attribute price and sets it as a product price. The pricing
formula is:
<*PRICE(Payment)*>
In addition, a rule which selects the attribute value is defined, so the pricing formula picks the selected
attribute value and assigns it as a product price. The rule condition is:
1
<*SELECTVALUES(Payment:2)*>
Since this option does not parse rules, the product price is 0 (zero).
Configurator
● Attribute Values per Page: defines the number of attribute values that are displayed in Product Attributes. If
the number of available attributes exceeds this number, SAP CPQ creates a new page under the Attribute
Values screen.
● Configurator Columns: enables administrators to enter the number of columns the Configurator needs to
contain.
● Do Not Recycle Sequence: determines whether a sequence starts over once the last number is generated.
When set to TRUE, an error displays when the product code is generated.
● Image Attributes Show Labels: defines whether SAP CPQ displays an image attribute label in the
Configurator.
● Max Column Count for Image Attributes: enables administrators to enter the maximum number of columns
that are taken up by image attributes. The value is 3 by default. If administrators leave the field blank or
enter 0 and 1, the default value of 3 columns is applied.
● Missing Attribute Image: refers to the attributes set up to be displayed as images. The missing attribute
image is displayed if the image for that attribute is unavailable. This image file must exist in SAP CPQ’s
images folder.
● Responder (right) Area Width: enables administrators to determine the area width of the responder.
● Request Transfer to Item in Configurator: determines whether items are transferred in the Configurator.
● Show quantity in responder: determines whether the quantity of each product is shown in the responder.
● Show product configuration template: defines whether SAP CPQ displays the product configuration
template in the Configurator.
● Show Attribute Prices within Configurator: determines whether attribute prices are displayed to Users
during configuration. Prices are displayed in brackets next to each attribute value. When set to Simple,
each attribute value has a price displayed next to it. When set to Relative, prices of the sibling attribute
values are shown relative to the price of the selected value.
● Configurator Lock Period: contains the number of minutes during which the item actions Delete, Edit, Copy,
Refresh and Upgrade to New Product Version are locked for user B while the user A is already working on
the quote. This parameter is relevant only for the parallel work on quotes in the Quote 2.0 engine.
● Visual Style (Responder): determines the default responder styles that Users see. Administrators can
override these selections by choosing a new style in the User Groups administrative section.
● Show dissallowed attributes in configurator: defines whether SAP CPQ displays disallowed attributes in the
Configurator.
The following list explains the parameters in the Shopping Cart and Quotes tab.
● When updating quote item, reapply default discount/multiplier: defines whether SAP CPQ reapplies the
default discount/multiplier each time a Quote is updated. When set to FALSE, Users can change the
multiplier in the Quote and save the change. Note that you need to set the appropriate Visual Style for the
multiplier to appear in the Quote.
● Allow Edit List Price on the Cart: determines the conditions under which the List Price is editable in the
Quote. When Users make adjustments in the Cart Fields Administration, they can set this parameter to one
of the four available values.
● Allow Edit Cost on the Cart: enables Users to edit the Cost field in the Quote, provided the field is made
editable in the Cart administration.
Bulletin Board
The following list explains the parameters in the Bulletin Board tab.
The difference between application parameters, Line Item Info Propagate Qty From Main Item and Propagate
Quantity to Nested Products: the difference is in the number of levels that quantity is propagated. The first
parameter, Line Item Info Propagate Qty From Main Item, will propagate quantity only to its children on the first
level, while Propagate Quantity to Nested Products will propagate quantity from main item to all of its
descendants, that is too all levels below. Take a look at the following figure below to see what application
parameters we are referring to.
The Deploy / Send Changes functionality enables you to send changes made in one SAP CPQ environment
(such as sandbox or test) to another (such as production).
For example, imagine that you made several changes to a product in your sandbox environment (for instance,
you added formula rules, attribute triggers and global scripts). After running tests and concluding that the
changes will not break your existing customizations in the production, you can use the Deploy / Send Changes
feature to send and deploy the product to the production environment.
To access this feature, go to Setup General Deploy Send Changes . The page that displays contains
the following tabs:
Deployment packages enable you to combine one or more SAP CPQ objects (such as products, users,
templates, and so on) into a package, which you can then deploy to the target environment.
SAP CPQ objects that can be combined into a package are referred to as package components or change
types. Additionally, you can make changes to the deployment package as many times as needed, which makes
the deployment process more flexible. You can create a deployment package in SAP CPQ or upload an existing
deployment package. Details are provided in the following sections. Deploying an object that already exists in
the target environment overwrites the existing object.
The following is a list of package components that can be added to the deployment package and deployed.
Click the appropriate link to learn how to add a particular component.
Once you add a package component, save your changes. The newly created package is displayed in the grid on
the Deployment Packages tab. You can perform the following actions on the package:
● clone
● edit
● download
● send
● delete
The grid displays the following columns: Package Name, Package Description, Source Environment, Destination
Environment, Comment, Status Date and Status. You can sort the columns in an ascending or descending order
by clicking the arrows next to the column name. Additionally, values in columns can be searched by entering a
query in the dedicated box and clicking on Search or by pressing Enter.
Apart from creating a deployment package from start to finish, you can also upload an existing package from
your computer. Uploaded packages can be managed the same way as any packages made in SAP CPQ.
Note
Deploy a Package
Note
To add approval rules to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Approval Rule in
Package Component and click Add.
A new page displays.
When deploying approval rules, the following data is sent to the destination environment:
● approval rules
● custom approvers selection logic
● selected approvers
● delegation of approvals
● user types
● companies
Note
New users will not be created in the destination environment for the selected approvers.
Related Information
To add cart level aggregates to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Cart Level
Aggregates in Package Component and click Add.
When deploying cart level aggregates, the following data is sent to the destination environment:
● name
● expression
Related Information
To add categories to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Categories in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Categories, select the categories you want to add to the package.
1. All Categories: all categories are added to the package and sent to the destination environment.
2. Selected Categories: only the categories you select are added to the package and sent to the
destination environment.
When deploying categories, the following data is sent to the destination environment:
● categories
● images
● permissions
● parent categories
Note
Subcategories need to be manually copied to the destination environment. In addition, if manually created
permission groups consist of users that exist in the destination environment, new users will not be created
in the destination environment.
Related Information
To add CRM integration to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select CRM Integration in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Selected CRM Integration data, select the integration data you want to add to the package.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
When deploying CRM integration, the following data is sent to the destination environment:
● CRM objects
● custom field mappings (custom fields flagged as personally identifiable information and sensitive
information retain these flags after the deployment)
● customer role mappings (customer standard fields are always flagged as personally identifiable
information)
● opportunity status
● CRM item mappings
● CRM quote
Note
Pricebook market mappings, user mappings, CRM administrator account, CRM quote parameters and
general parameters need to be manually copied to the destination environment. In addition, all custom
fields mappings and customer roles mappings in the destination environment will be replaced by the new
mappings from the source environment.
To add currencies to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Currencies in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
5. Click Save.
The package containing currencies as a package component displays in the grid on the Deployment
Packages tab.
6. Deploy the package as explained in Deployment Packages [page 564].
When deploying currencies, no data other than currencies is sent to the destination environment.
Related Information
To add custom actions to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Categories in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Action selection, select the custom actions you want to add to the package.
1. All Custom Actions: all available custom actions are added to the package and sent to the destination
environment.
2. Selected Custom Actions: only the categories you select are added to the package and sent to the
destination environment.
To move available custom actions to Selected Custom Actions, use the right arrow.
Alternatively, to remove custom actions from Selected Custom Actions, use the left arrow.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
The package containing custom actions as a package component displays in the grid on the Deployment
Packages tab.
7. Deploy the package as explained in Deployment Packages [page 564].
When deploying custom actions, the following data is sent to the destination environment:
● name
● system ID
● placement
● primary flag
● image
Related Information
To add custom calculations to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Categories in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Selected Custom Calculations, select the custom calculations you want to add to the package.
1. All Custom Calculations: all available custom calculations are added to the package and sent to the
destination environment.
2. Selected Custom Calculations: only the custom calculations you select are added to the package and
sent to the destination environment.
To move available custom calculations to Selected Custom Actions, use the right arrow.
Alternatively, to remove custom calculations from Selected Custom Actions, use the left arrow.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
The package containing custom calculations as a package component displays in the grid on the
Deployment Packages tab.
7. Deploy the package as explained in Deployment Packages [page 564].
When deploying custom calculations, no data other than custom calculations is sent to the destination
environment.
Related Information
To add custom calculations to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Categories in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Select Custom Fields that will be sent, select the custom fields you want to add to the package.
1. All Custom Fields: all available custom fields are added to the package and sent to the destination
environment.
2. Selected Custom Fields: only the custom fields you select are added to the package and sent to the
destination environment.
To move available custom fields to Selected Custom Fields, use the right arrow.
Alternatively, to remove custom fields from Selected Custom Actions, use the left arrow.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
The package containing custom fields as a package component displays in the grid on the Deployment
Packages tab.
7. Deploy the package as explained in Deployment Packages [page 564].
When deploying custom fields, the following data is sent to the destination environment:
● custom fields (custom fields flagged as personally identifiable information and/or sensitive information
retain these flags after the deployment)
● user types
● attributes (attributes flagged as personally identifiable information and/or sensitive information retain
these flags after the deployment process)
● tabs
Note
Related Information
To add custom tables to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Categories in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Table selection, select the custom tables you want to add to the package.
1. All Custom tables: all available custom tables are added to the package and sent to the destination
environment.
2. Selected Custom tables: only the custom tables you select are added to the package and sent to the
destination environment.
To move available custom fields to Selected Custom tables, use the right arrow.
Alternatively, to remove custom fields from Selected Custom tables, use the left arrow.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
The package containing custom tables as a package component displays in the grid on the Deployment
Packages tab.
7. Deploy the package as explained in Deployment Packages [page 564].
Note
Custom tables flagged as personally identifiable information and/or sensitive information retain these flags
after the deployment process.
When deploying custom tables, no data other than custom tables is sent to the destination environment.
Note
The maximum size limit of custom tables that are sent to the destination environment is 20MB.
Access Rights
● Create deployment packages containing custom tables if the visibility of those tables is enabled for you
with the Access Rights feature.
● Send packages containing those custom tables to target environments.
● Deploy packages containing custom tables only if you have editing access rights for them.
● Create or update the existing custom tables from the package if you have editing access rights for custom
tables. To do this, the visibility of custom tables needs to be granted to you with the Access Rights feature.
If the package contains custom tables you can’t see, it can’t be deployed.
Related Information
To add global scripts to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Approval Rule in
Package Component and click Add.
A new page displays.
2. On the Scripts tab, define a name for the package component in the Name field.
You can view the events that are attached to global scripts on the Events tab.
3. (Optional) In Description, enter a description for the package component.
4. In Script Selection, select the scripts you want to add to the package.
1. All Scripts: all available scripts are added to the package and sent to the destination environment.
2. Selected Scripts: only the scripts you select are added to the package and sent to the destination
environment.
To move scripts to Selected Scripts, use the right arrow. Alternatively, to remove approval rules from
Selected Scripts, use the left arrow.
5. For each script in Selected Scripts, select which version of the script is sent to the destination environment.
1. Click on the script.
Available versions of the script display in the Scripts Sending Checklist, and the active version is
preselected.
2. Select the checkboxes next to the versions you want to send.
Hover over the script version to view its content.
The most recent script version you select in the source environment will be active in the destination
environment.
6. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
7. Click Save.
The package containing approval rules as a package component displays in the grid on the Deployment
Packages tab.
8. Deploy the package as explained in Deployment Packages [page 564].
On the destination environment, in Setup Develop Global Scripts , locate the script you deployed and
When deploying approval rules, the following data is sent to the destination environment: page: select
● scripts
● events
● script history
Related Information
To add guided selling products to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Approval Rule in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package.
The name of the package component is automatically added as a prefix to each guided selling product
name in the package, making it easier to discern which products belong to which package component.
You can view the events that are attached to global scripts on the Events tab.
3. (Optional) In Description, enter a description for the package.
4. In Guided Selling Product, click Add Product.
A pop-up appears, displaying all guided selling products in the system.
1. Select the checkboxes next to the guided selling products you want to add
2. Click Add Selected.
The selected guided selling products are displayed in Guided Selling Product.
5. Click Checklist next to each selected guided selling product to view the Product Sending Checklist for the
product in question.
6. (Optional) In Product Sending Checklist, deselect the items you want to exclude from the package.
Rules, messages, images and styles, scripts and shipping methods can be safely excluded from the
package.
7. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
8. Click Save.
When deploying guided selling products, the following data is sent to the destination environment:
● product name
● product description
● product part number
● permissions and effectivity dates
● additional formulas
● configuration layout (tabs, order of attributes)
● responder layout
● product details layout
● rules (you can choose not to send them)
● messages (you can choose not to send them)
● images and styles (you can choose not to send them)
● scripts (you can choose not to send them)
● attributes (attributes flagged as personally identifiable information and/or sensitive information retain
these flags after the deployment process)
● attributes values
● categories
● product types
● user types
● shipping methods (you can choose not to send them)
● replacement products
Note
Container attributes are sent to the destination environment for all newly created containers. However, if
you make changes to the existing container attributes, you will have to manually update them in the
destination environment.
Related Information
To add item actions workflow to the deployment package and deploy them, follow the steps below.
When deploying item actions workflow, the following data is sent to the destination environment:
● item actions
● item actions workflow
Note
New users will not be created in the destination environment for the selected approvers.
Related Information
To add markets to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Markets in Package
Component and click Add.
A new page displays.
When deploying markets, the following data is sent to the destination environment:
● markets
● market visibility
● user types
● companies
● currencies
Note
If market visibility is defined for users that exist in the destination environment, new users will not be
created.
Related Information
To add notifications to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Approval Rule in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Notifications that will be sent, select the notifications you want to add to the package.
1. All Notifications: all available notifications are added to the package and sent to the destination
environment.
2. Selected Notifications: only the notifications you select are added to the package and sent to the
destination environment.
When deploying notifications, the following data is sent to the destination environment:
● notifications
● parsable attachments
● non-parsable attachments
● email lists
● user types
Note
Related Information
To add permissions to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Approval Rule in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Permission groups that will be sent, select the groups you want to add to the package.
1. All Approval Rules: all groups displayed in System Permission Groups are added to the package and
sent to the destination environment.
2. Permission Groups
When deploying approval rules, the following data is sent to the destination environment:
Note
If manually created permission groups contain users specified in the destination environment, new users
will not be created in the destination environment. Additionally, permission groups that are set for some
company may not exist in the destination environment. In this case, permission groups that do not exist in
the destination environment will not be created.
Related Information
To add products to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Product in Package
Component and click Add.
A new page displays.
2. In Name, define a name for the package.
The name of the package component is automatically added as a prefix to each product name in the
package, making it easier to discern which products belong to which package component.
● product name
● product description
● product part number
● permissions and effectivity dates
● additional formulas
● configuration layout (tabs, order of attributes)
● responder layout
● product details layout
● rules (you can choose not to send them)
● messages (you can choose not to send them)
● images and styles (you can choose not to send them)
● scripts (you can choose not to send them)
● attributes (attributes flagged as personally identifiable information and/or sensitive information retain
these flags after the deployment process)
● attributes values
● categories
Note
Container attributes are sent to the destination environment for all newly created containers. However, if
you make changes to the existing container attributes, you will have to manually update them in the
destination environment.
Related Information
To add quote item custom fields to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Quote Item Custom
Fields in Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Selected quote item custom fields, select the quote item custom fields you want to add to the package.
1. All quote item custom fields: all available quote item custom fields are added to the package and sent
to the destination environment.
2. Selected quote item custom fields: only the quote item custom fields you select are added to the
package and sent to the destination environment.
To move available quote item custom fields to Selected quote item custom fields, use the right arrow.
Alternatively, to remove quote item custom fields from Selected quote item custom fields, use the left
arrow.
5. In Quote layout permissions selection, select the quote layout permissions you want to add to the package
1. All quote layout permissions: all available quote layout permissions are added to the package and sent
to the destination environment.
2. Selected quote layout permissions: only the quote layout permissions you select are added to the
package and sent to the destination environment.
To move available quote layout permissions to Selected quote layout permissions, use the right arrow.
Alternatively, to remove quote layout permissions from Selected quote layout permissions, use the left
arrow.
3. Don’t deploy quote layout permissions: quote item custom fields are deployed without quote layout
permissions.
Note
Quote item custom fields flagged as personally identifiable information and/or sensitive information retain
these flags after the deployment process.
When deploying approval rules, the following data is sent to the destination environment: page: select
Note
Additionally, if a deployed quote item custom field contains CTX tags, it is necessary to check the fields
included in the package, in case the formula contains fields that are not included by default.
Related Information
To add quote tables to the deployment package and deploy them, follow the steps below.
Note
Quote tables flagged as personally identifiable information and/or sensitive information retain these flags
after the deployment process.
When deploying quote tables, the following data is sent to the destination environment:
● quote tables
● attributes
● permissions - all permission groups are always sent to the destination environment. Additionally, by
selecting/deselecting the Permissions checkbox in the Sending Checklist, you control whether the
permissions related to the quote table that is being deployed will be included in the package.
Note
When you deploy a quote table that is in a quote tab that only exists on the source environment, that quote
tab is automatically created on the target environment and can be found under General Tabs in
Setup. However, since custom quote tabs are not sent to the target environment, you must manually
activate it by adding it as a new tab in Custom Quote Tabs .
To add responsive templates to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Responsive
Templates in Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Template Selection, select the responsive templates you want to add to the package.
1. All Responsive Templates: all available responsive templates are added to the package and sent to the
destination environment.
2. Selected Responsive Templates: only the responsive templates you select are added to the package
and sent to the destination environment.
To move available responsive templates to Selected Templates, use the right arrow.
Alternatively, to remove responsive templates from Selected Templates, use the left arrow.
5. Click on a template in Selected Templates.
Checkboxes display in the Responsive Templates Checklist, allowing you to select the version of the
template you wish to deploy. The active version will be selected by default.
6. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
7. Click Save.
The package containing responsive templates as a package component displays in the grid on the
Deployment Packages tab.
8. Deploy the package as explained in Deployment Packages [page 564].
When deploying responsive templates, the following data is sent to the destination environment:
● responsive templates
● responsive templates history
To add territories to the deployment package and deploy them, follow the steps below.
When deploying territories, no data other than territories is sent to the destination environment.
Related Information
To add user types to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Approval Rule in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In User Types that will be sent, select the user types you want to add to the package.
1. All User Types: all available user types are added to the package and sent to the destination
environment.
2. Selected User Types: only the user types you select are added to the package and sent to the
destination environment.
To move approval rules from All user types to Selected user types, use the right arrow. Alternatively, to
remove approval rules from Selected user types, use the left arrow.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
When deploying user types, the following data is sent to the destination environment:
● start category
● XSL and XSLT files
Note
New users will not be created in the destination environment for the selected approvers.
Related Information
To add workflow to the deployment package and deploy them, follow the steps below.
1. Create a deployment package as explained in Deployment Packages [page 564]: select Workflow in
Package Component and click Add.
A new page displays.
2. In Name, define a name for the package component.
3. (Optional) In Description, enter a description for the package component.
4. In Select workflow per tab, select the workflow you want to add to the package.
1. My Quotes: workflow actions defined for the My Quotes tab are added to the package and sent to the
destination environment.
2. Waiting for approval: workflow actions defined for the Waiting for approval tab are added to the package
and sent to the destination environment.
3. Other Quotes: workflow actions defined for the Other Quotes tab are added to the package and sent to
the destination environment.
5. Click Add to Package.
The package component displays in the Deployment Package Component section on the Deployment
Packages tab.
6. Click Save.
The package containing workflow as a package component displays in the grid on the Deployment
Packages tab.
7. Deploy the package as explained in Deployment Packages [page 564].
When deploying a workflow, administrators can exclude the following objects from the Workflow Sending
Checklist:
● custom actions
● notifications
● email lists
If custom actions are excluded from the checklist, notifications and email lists that are attached to the
excluded custom actions are not deployed. However, notifications and email lists attached to the standard
actions in the workflow are deployed in a regular way (unless notifications and email lists are excluded from
deployment).
Additionally, if custom actions are excluded from the checklist, the system decides whether to send the custom
actions attached as pre/post actions to the target environment depending on whether the actions already
exists in the source/target environments:
● if the same custom action is attached as a pre/post action in both the source and destination environment,
the action is sent to the destination environment (the existing action in the destination environment is
updated).
● if the same custom action exists on both environments, but it’s attached as a pre/post action only in the
source environment and not in the target environment, after deploying the workflow, the custom action will
be attached as a pre/post action in the target environment.
● if a custom action exists only in the source environment and it’s attached as a pre/post action, after the
deployment, the post action in the target environment will not have the custom action attached.
● Update all workflows - current settings are overwritten by the settings from the source environment.
● Only create new workflows - settings from the source environment are added to the current settings.
When deploying workflow, the following data is sent to the destination environment:
● statuses
● actions
● IronPython custom actions
● workflow permissions
● pre-actionspost-actions
● workflow conditions
● workflow flags
● notifications
● email lists
● required fields by workflow action
The two most common issues you can encounter during deployment are as follows:
To fix the issues, you need to change the system ID of the conflicted shipping method or user type in the source
environment.
On the Deployment Setup tab, you connect your current environment, also known as source environment, to
the environments to which you want to deploy changes.
Users can send changes made in the current environment to a target environment. To connect your current
environment to a target environment, follow the steps below.
Note
Deployment templates enable you to create templates that contain as many products as you need. Templates
can be applied to any package and reused in future deployments. As a result, the deployment process is more
streamlined.
As an example, this procedure shows you the steps to create a deployment template named January
Deployment that contains the following products: Project Management, Software Evaluation and Software
Implementation.
You can inspect the content of the template by clicking next to the template name. Additionally, you
can download or delete the template.
Applying the newly created template to a package will populate the package with the products listed in the
template.
If you edit the products which are a part of a previously created template and wish to send these product
changes to the destination environment, you can reapply the existing template to which these products belong,
instead of manually creating a completely new deployment package. Reapplying the template causes the
template to automatically obtain the latest product updates from SAP CPQ and populate the package with
those product updates.
The procedure for reapplying a deployment template is the same as the procedure for applying a deployment
template for the first time as described above. Since reapplying the template causes it to automatically obtain
product updates from SAP CPQ, you do not need to edit the template in any way.
The previous example shows how to create a deployment template named January Deployment that contain
the following products: Project Management, Software Evaluation and Software Implementation. For the current
example, imagine that in February you decide to attach a global script to the Project Management product.
Instead of manually creating a completely new package to send the product change to the destination
environment, you can reapply the template you created for January deployment. Doing that will cause the
template to automatically obtain the global script you added to the Project Management product and populate
the package.
To view the package deployed in January as well as the one deployed in February, go to the Deployment
Packages tab. In addition, a package can also be downloaded. To download a package, click next to the
package name.
Note
When you download both packages, you can upload them to Git and compare their XML files to see what
changed.
To define countries, states and territories in SAP CPQ, access the Countries, States and Territories sections in
Setup, respectively. The created entities will be available in the system when managing some other features
(for example, when defining users).
For countries, it is required to define a three-letter abbreviation and if needed, a two-letter abbreviation. For
states, you need to define only one abbreviation, with either two or three letters. Use the abbreviations defined
by the ISO standard.
States
State abbreviations are not unique in the system, but they need to be unique within a country. You can create
multiple states with the same state abbreviation as long as the states pertain to different countries.
States are treated separately throughout SAP CPQ. When managing users, customers and companies in
Setup, the system displays only the states that pertain to the selected country. However, the system allows
adding any state to any country when managing the following:
● user import
● bulk user import/export
● customer import/export
● user administration API
● companies import/export
● company administration API
● customer administration API
Territories
When defining territories, you need to enter their name and system ID. The System id is generated
automatically from the territory name, but you can override it by clicking . Territories are treated separately
from countries and states in the system. When managing users, for example, you can select any of the
territories, even if their actual geographical position is not within the selected country and state.
9.4 Tabs
Tabs are components that help organize information on some of the SAP CPQ pages. You can customize tabs
to display the information best suited to your business needs.
General tabs are invisible until you use them in product configuration or in quote tab creation. To create a
general tab:
After you create a tab, you can use it for product configuration (Configuration Layout Tab [page 61]) and
custom quote tab creation (Create Quote Tab [page 313]).
9.5 Dictionaries
A dictionary in SAP CPQ contains a set of keys and their values that are applicable on tenant level. Keys are
only used in the code to reference key values that are visible in the application and refer mainly to UI content
(button labels, tooltips, etc.).
● System - there is a system dictionary in SAP CPQ for each supported language. System dictionaries cannot
be changed and no keys can be added. You can only compare and export system dictionaries. Names of
system dictionaries appear in both English and the language of the dictionary (for example: Español /
Spanish). These dictionaries are uploaded by default on all new tenants. If your business model does not
require creating custom key/value pairs, you do not need to manage dictionaries at all. The system
dictionaries are managed and updated by the SAP CPQ team and administrators have no authorization to
change them.
Custom - dictionaries that administrators create. Custom dictionaries are best to be used for overriding
key values in default dictionaries. Administrators are advised not to change the existing keys or add new
ones as this will require additional configuration in SAP CPQ so that the system could recognize them.
More details on dictionaries and how-to procedures are described in the following sections:
You can compare two dictionaries to see the difference in values for the keys contained in both dictionaries.
After opening a dictionary, select in the top of the page the dictionary with which you wish to compare it. The
Related Information
You can either export the current dictionary or both the current dictionary and the dictionary that is being
compared, if any. You can also filter and export the dictionary entries that have been updated after a specified
date.
You can access import and export functions by clicking the icon next to dictionaries in Setup General
Dictionaries .
The Filter records modified since field is located above the list of dictionary entries. You can specify a date by
either typing it in the field or by clicking the calendar icon and picking a date in the calendar pop-up. If you are
entering the date manually, bear in mind that it needs to be in the user format. Clicking Export visible items and
Export all items exports the items currently visible on the page and all items in the dictionary, respectively.
The system exports dictionary values in the XML format and the same format should be used when importing
values.
● Add New and Update Existing Values - keys in the source dictionary will be updated with the values of
matching keys in the import file and new keys will be added.
● Add non-existing keys - only the keys that exist in the import file and do not exist in the source dictionary
will be imported.
● Add newer values - for matching keys, if the value in the import file is more recent, it will replace the value in
the source dictionary. Also, new keys are added through this option.
To access all dictionaries on a tenant and manage custom dictionaries, go to General Dictionaries . The
page lists all dictionaries and lets you delete and edit dictionary details and pertaining keys.
○ Visibility Condition - enter 1 to make a dictionary visible to all users. Otherwise, you can click to
restrict the visibility to certain users.
○ Condition for Defaulting to this Dictionary - the system retrieves values from this dictionary if no default
dictionary is selected for a user on User Page and in user configuration. To set a dictionary to default,
Related Information
Related Information
Which Dictionaries will SAP CPQ Retrieve for my Users? [page 598]
When users log into SAP CPQ, the system first checks which dictionary is set as default in Setup Users a
user Additional Settings tab. The values from that dictionary will be used for naming buttons, tooltips, etc.
Users can always override the administrator's selection in User Page User details Default Dictionary by
selecting a different dictionary. However, if users select Default Pricebook in the homonymous dropdown list in
User Page, the system disregards the selection you made in Setup and reaches for the default dictionary. When
multiple dictionaries have a defaulting condition evaluating to TRUE, the system will use rank to sort them out
(the dictionary with the lowest rank is retrieved first).
You can always limit which dictionaries display to users by applying the right visibility conditions.
Related Information
The Manage Generated Documents section gives administrators an insight into all the documents that their
underlying users have generated in SAP CPQ. The list of documents shows when the document was generated,
which user generated it, the name of the file and its size. Additionally, the Sent To Customer and the Viewed By
Customer columns show whether a document is sent to the customer and if the customer has viewed it,
respectively.
Note
Non-administrative users with privileges for viewing and deleting generated documents, have the Manage
Generated Documents page available in user pages.
The only action that you can perform on generated documents is deletion:
● To delete an individual document, click the delete icon next to the file.
● To delete multiple documents at once, select the corresponding checkboxes in the Delete column and click
Delete Selected. Alternatively, click Select All to select all documents in the current page.
Clicking Delete All deletes all the generated documents in the application. You can switch to a different
page right away because the deletion process is handled in the background. This way administrators can
uninterruptedly manage other sections in Setup while the generated documents are being deleted. This
action does not delete the additional files.
To delete both the generated documents and the additional files, click Clean Up. This action is available
only to administrative users.
File Management stores images and files that can be retrieved throughout Setup (when creating products,
categories, and so on).
To manage files (upload, download, copy, preview, and so on), access the Home tab. In the View tab, choose
how files display and whether the navigation pane with a list of folders shows up on the left.
Note
The format of images that can be uploaded in File Management is set through the Allowed Image Extensions
application parameter.
To determine your domain (tenant) name when constructing URLs for files uploaded to SAP CPQ, you can use
the <*DOMAIN*> tag. For example, to place the ChairProd image into a display-only text attribute in the
configurator, you need to use the following HTML code: <img src=”../mt/<*Domain*>/images/
productimages/Product1.png”/>. By using the <*DOMAIN*> tag, you don’t have to go back to every field
that contains a formula referring to images from the file system and manually replace the hard-coded domain
of the old environment with the name of the new environment. The system retrieves the domain name
automatically.
Before you initiate the upload, click the destination folder to which you wish to upload the file in the left-hand
navigation pane.
Procedure
1. Click Upload.
You can repeat this step to select multiple files. All files are listed in the Upload Files window.
4. Click Upload.
The progress bar visually shows the time remaining for upload.
There is a possibility to customize collaboration link that each user sees among header links on SAP CPQ client
side. Image below shows the place where collaboration link appears in SAP CPQ:
Each User Class can have its own collaboration link. Refer to userclasses help page for more info on how to set
up user classes. Collaboration Links are being set up from Setup General Collaboration Links page. On
Link for default user class can't be deleted - it's always present in the system, and it applies to all users not
belonging to other user classes. Although it can't be deleted, it can be set to be invisible.
The image above shows a list of defined links. First link, labeled as (default) user class is the default link.
“User Class” is the only required field. It defines to which user class this link applies to. “Link Label” field
defines how link will be presented to users. “Link Hint” field holds tool tip that will be shown to customers when
they hover it with mouse pointer. “Link URL” field defines where links will point to. For example, to use SAP CPQ
customer portal, use link like this one:
../CustomerPortal.aspx?
first=<*CTX( Visitor.Username )*>&email=<*CTX( Visitor.Email )*>&phone=<*CTX( Visitor.Phone )*>&fax=<*
CTX( Visitor.Fax )*>&address.street=<*CTX( Visitor.Address1 )*>&address.city=<*CTX( Visitor.City )*>&last=<*
CTX( Visitor.LastName )*>&stateName=<*CTX( Visitor.State )*>&countryName=<*CTX( Visitor.Country)*>&a
ddress.zip=<*CTX( Visitor.ZipCode )*>
Notice that SAP CPQ customer portal receives various parameters, such as first name, email, phone number,
street address, etc.
If your company has departments in different countries, in different time zones, or simply your users are
scattered around the world, SAP CPQ can be set up SAP CPQ to display information in their own time zone.
SAP CPQ administrators can set time zone globally - at the tenant level or at the user level. Once set globally,
the time zone is applied for each user. If some user needs different time zone it can be set by SAP CPQ
administrator, or by the user if they are allowed.
To set default time zone at the tenant level, go to Setup General Application Parameters , then under
“General Parameters” tab find the parameter “Default Time Zone” and make the desired selection. This will
apply the defined default time zone to all users.
As an SAP CPQ administrator you are allowed to set time zone for each user separately. You can decide
whether the user can change time zone on its own or not.
In user import/export template there is a sheet labeled ”timezones”. This sheet contains information about all
SAP CPQ system timezones that you can enter in the sample template column Timezone under the users
sheet.
Users that are not allowed to change their time zone by the administrator will have the user time zone field
disabled in the User Page.
Example
User1 has created the quote in PST time zone on 06JUL2016 at 23:57:16.
User2 is in CET time zone. User2 will see that User1’s quote was created on 07JUL2016 at 08:57:16.
The same rule applies for Date Modified field. Otherwise, you can disable timezone conversion for fields which
contain date-only information (to ensure that the same date is displayed to all users regardless of their
timezones) via General Application Parameters General Parameters Disable timezone conversion for
date field . Timezone conversion is always disabled for those fields in Quote 2.0.
Time zones are supported by the CTX tag. CTX Tag can be instructed to return the time zone value of a Quote
custom field that is of type Date.
Iron Python Scripting now exposes the timezone property in the IUser interface. It can be used in scripts to
ensure that the result of the script execution will be presented to the user in the selected time zone.
The next line of Iron Python code will return the users time zone and set the content of the custom field named
Quote message:
In SAP CPQ scripts are managed in Setup under Develop Global Scripts .
Note
A more detailed documentation for scripting is available on the dedicated Scripting page.
Details regarding all the scripts in the system are displayed in the following columns:
When multiple scripts are attached to an event, it is possible to change their execution order by clicking the
event > Execution order.
A script contains a series of commands that can be executed without being compiled. SAP CPQ provides a
user-friendly interface for administrators to create and manage scripts.
Note
Using IronPython in SAP CPQ is limited as the system does not support standard IronPython modules. You
cannot add external .NET and complex IronPython modules to SAP CPQ scripts. However, in basic user
scenarios, you can paste the content of a simple module (without dependencies on other modules) into the
SAP CPQ script module and the system will process it properly.
When an administrator is creating a new script and clicks on Attach to Event, SAP CPQ saves the new script.
The administrator is not allowed to move to the Events tab unless the script name is properly defined. When
creating a script, users can click Check Syntax to validate the script.
The screenshot below shows the interface when the script syntax is correct:
Note
The flag ITrace.IsOn, which is available in scripting, indicates whether tracing is turned on or off. With the
help of this flag, users can organize the logic that is related to tracing and thus optimize script execution
time.
The table below shows which elements of quotes are automatically saved after some events are triggered. The
data in the table is useful when creating scripts so you know when to include the Save action.
Events Custom Fields Line Items Product Types Totals Quote Tables
After changing
value of custom
fields
Quote creation
On user Login
On customer
change
Document Sent To
Customer
On Quote Tab
Changed
When Excel is
uploaded into a
Quote Table
When certain parts of a quote are changed, calculations need to be performed and changes saved. As this does
not require all events from the pipeline to be triggered, some of them can be skipped. This is determined by the
Quote.Save() parameter. This parameter is by default set to True, which causes the entire pipeline to be
executed whenever changes on quote are saved. If the Quote.Save() parameter is set to False, the following
events will not be triggered:
● Quote creation
● Before custom field calculation
● After custom field calculation
● Every time quote is changed
The following .NET namespaces and classes are forbidden in IronPython scripts:
● System.IO
● System.Data
● System.Configuration
● Webcom.Configurator.Util.ConnectionStringProvider
● System.Environment
● System.GC
These namespaces and classes were available before the 1902 release, so administrators may had used them
in client scripts. In such cases, errors will display after the 1902 release when administrators save those scripts.
If there are scripts that contain System import * and Webcom.Configurator.Util import * and any of the words
from the forbidden classes, the system disables saving scripts (for example, saving is disabled if there is
System import * and Data in the same script).
SAP CPQ offers flexible way to meet custom demands for various functionalities that are not part of the
standard software version. This is achieved by implementing custom actions – parts of code that contain
processing logic for appropriate functionalities.
Custom actions can be used in the quote workflow as any other standard quote action, they can be set up as
pre or post action. Also email notifications can be attached to them.
Typically , these actions are used for integration with other external systems – like ERP system. For example,
one custom action could contain code that would send relevant quote information to the product manufacturer
and/or distributor software, after the order is placed on that quote in SAP CPQ.
Administration for custom actions can be found under SAP CPQ Setup Develop Custom actions . When
user clicks on sub-menu Custom actions, table with all custom actions developed by the admin is displayed.
Admin is able to translate action names by clicking on the ‘Translate’ icon, edit action by clicking on the ‘Edit’
action button, delete action by clicking on ‘Delete’ action button and create new action by clicking on the ‘Add
New’ button.
No standard SAP CPQ actions is displayed on this page. Custom actions defined by the admin are not
displayed in SAP CPQ Setup Workflow/Approvals Actions .
Admin is able to use these actions in SAP CPQ Setup Workflow/Approvals Workflow and to define
permissions for the action in SAP CPQ Setup Workflow/Approvals Workflow Permissions .
When defining Workflow transition for some custom action, in order to change quote status that action as
last row should include WorkflowContext.ChangeQuoteStatus = True.
When admin adds new/edits custom action, page is displayed where admin is able to:
Action is always set up so that it can be set as pre or post action. Placement is set to the quote (Cart)
automatically, and admin is able to change that.
Administration for custom quote calculations can be found under SAP CPQ Setup Develop Custom
Quote Calculations .
Note
When user clicks on sub-menu Custom Quote Calculations, table with all custom quote calculations is
displayed. Admin is able to edit calculation by clicking on the ‘Edit’ action button, delete calculation by clicking
on the ‘Delete’ action button or create new calculation by clicking on the ‘Add New’ button.
Script Workbench is available for administrators to help them debug and develop their scripts. It can be
accessed through Scripts developing and editing page within SAP CPQ Setup, or from user view under the top
menu.
Iron Python Scripts have always been a powerful tool for SAP CPQ customization, so they’re well adopted by
SAP CPQ administrators and used frequently to complete a various kinds of tasks. Writing Iron Python (IP)
script can be exhaustive due to its syntax and indentation rules. Therefore, SAP CPQ introduces Script
Workbench along with some additional features that make writing scripts easier.
Note that if an administrator is in the middle of editing or developing a script, once the link Workbench is
clicked, the script is loaded into the workbench. There’s no fear that the script will be lost.
On the setup side, there are two more links beside link for starting the workbench. Clicking on the first link
“Open in new window” will open the API explorer in a new window. API explorer is a helpful reference on
Scripting API for SAP CPQ administrators. Clicking on the link “Open”, API explorer is open next to the
workbench window. “API explorer” represents a helpful Scripting reference with the descriptions on each
method that can help you while trying to recall how to retrieve some information.
“Test” mode should be used when writing tests for your model and when executing them. Note that in this
mode, many API objects aren’t available since you’re able to only test your model, not the particular quote.
Therefore, if you open workbench in order to help you during writing the script, make sure that you select
“Standard” mode. This way you will be able to use all objects that are exposed through Scripting API. If you are
in “Test” mode, some objects (for example Quote) are not available and you will get an error when executing
the script.
While debugging, useful information is displayed under script edit area. All local variables are automatically
traced. Any syntax error you might have in your script is going to be displayed as well. This helps you a lot to
find the root cause of script problems, and shortens time to develop the script.
API Snippets
Beside the previously mentioned API explorer, you are introduced with API snippets. In the screenshot below
we wrote IP command to retrieve a custom field’s content with the help of “API snippets”. “API snippets” is a
practical way to quickly create chunks of API code by selecting through a series of drop down boxes and
inserting it to the editor. Note that “API snippets” is available in both, “Test” and “Standard” mode.
“Alias snippets” provides you with the most used functions on different SAP CPQ entities (products, attributes,
customer, etc.). Similar to “API snippets”, you are able to select the appropriate function from the list and then
narrow your selection by selecting through the rest of drop down boxes. As soon as you construct the desired
method, you can insert it into the script editor using either “Insert at cursor” or “Add as new line” button.
“Python snippets” provides you with the list of simple Iron Python language specific constructions that are
frequently used while writing a script. For example, if you want to write an “if else if” statement, you can pick it
from the list and insert into the editor.
From time to time, it might be very convenient to have a test that you can execute and therefore test your
model. Now you can write a test in the workbench and execute it. Once the execution is complete, you are
informed on the execution result. If test fails you are informed on the reason through the information displayed
in the workbench. When you write tests, you must be in “Test” mode.
A new Scripting object has been introduced that comprises a list of useful methods for writing tests. The
objects name is IAssert. A detailed documentation on this object can be found at this location in SAP CPQ
scripting help: IAssert Interface .
Note
Whenever a quote is edited via the Script Workbench, all changes are logged in Audit Trail User
Actions .
This section contains the list of all CTX tags, as well as ways in which various types of tags can be used in SAP
CPQ.
Conditional statements are an integral part of SAP CPQ modeling and configuration. These statements can be
used in any part of SAP CPQ.
This includes product modeling areas (rules, hidden calculations, labels, pricing expression, attribute
descriptions), workflow areas (approval rules, discounting rules, visibility rules, actions conditions) and any
other area of SAP CPQ that has an input area.
A basic statement must have a beginning [IF] tag that ends with an [ENDIF] tag. The condition area must
contain an expression that will resolve to true or false. If true then any expression in the first set of curly
brackets will be used or performed, depending on what is included. If the condition statement is false then any
Note
Standard mathematical and programming operators such as >, <, =, = cannot be used in conditional
statements. SAP CPQ uses its own operators to perform these actions.
11.1.1 Operators
[IN] Returns whether a value equals a value [IN](value, value 1,value 2,value 3,…)
in a list of values.
CTX tags are used for retrieving certain values from various parts of SAP CPQ.
<*CTX(parameter)*>
The parameter is a specification of what value should be returned. It is a dot separated list of objects, sub
objects and property names. Each object may have sub objects and properties. Properties are terminals – this
means that CTX tag param may end with it.
● Quote
○ Total
○ CurrentItem
○ KeyAttribute
○ ProductType
○ Customer
○ Revision
○ Owner
○ UserType
○ Company
○ Territory
○ ManagingParent
○ OrderingParent
○ ApprovalParent
○ SelectedMarket
○ SelectedShipping
● SFDC
○ Opportunity
○ Account
● SOD
○ Account
○ Opportunity
● Visitor
○ UserType
○ Company
○ Territory
○ ManagingParent
○ OrderingParent
○ ApproveParent
● Date
● Container
Each of these objects has corresponding properties. Quote sub objects have cart cells as sub objects, for
example Quote.Total.CartComment. Cart cell objects that are decimals, like prices, have fixed four sub
tags:
For example, display is on three decimals, cart is in Euro currency, default is US Dollar:
<*CTX(Quote.Total.TotalAmount.DefaultDisplay)*> 2,345.678
<*CTX(Quote.Total.TotalAmount.DefaultDecimal)*> 2345.68
<*CTX(Quote.Total.TotalAmount.MarketDisplay)*> 1,503.639
<*CTX(Quote.Total.TotalAmount.MarketDecimal)*> 1503.64
● Quote.ProductType()
● Quote.CustomField()
● Quote.Customer()
Have a parameter in the brackets. With this parameter you may specify which instance of the object should be
returned.
Example
Quote.CustomField(Terms) will return the value of the “Terms” quote custom field (sc param).
● BillTo
● ShipTo
● EndUser
Quote.DocumentFormat will return the file format (PDF, DOCX) of generated document.
Date/Time fields have optional Format child tag. It expects format string in argument that affects the way value
is shown.
Date.Format(yyyy.MM.dd) 2009.01.19
Quote.DateCreated.Format(MM-dd-yy) 01-19-09
Example
The MyContainer tag should be used in an attribute container to access its own members, or in the product
that will be used as a container row to access parent container.
Your other option is to use it to define basic product info in the product by accessing the container in which the
product is located.
The parent container can be accessed from the child product, but only the basic info. By basic info we mean the
following: description, part number, etc. The product attribute or container of a child product cannot evaluate
the MyContainer tag in order to pull values from the parent container info.
Example
Note
Use this tag only when you have a product in the container, otherwise you might end up with unexpected
behavior.
Sample 1
Free form attribute in configuration to have a value of some SOD Opportunity field. Make a rule with following
action <*ASSIGNFF(SomeAttribute:<*CTX(SOD.Opportunity.Description)*>)*>
Sample 2
Action depends on an SOD Account field In the workflow condition for the action put following formula
<*CTX(SOD.Account.Description)*>
Quote.InProject
Quote.CurrentItem.AttributeRank
Quote.CurrentItem.AttributeSubRank
Quote.CurrentItem.IsMainItem
Quote.CurrentItem.IsChildItem
Quote.CurrentItem.SystemID
Quote.CurrentItem.IsAlternative
Quote.CurrentItem.IsVariant
Quote.CurrentItem.RolledUpEndCustomerUnitPrice
Quote.CurrentItem.RolledUpEndCustomerUnitPrice.DefaultDisplay
Quote.CurrentItem.RolledUpEndCustomerUnitPrice.DefaultDecimal
Quote.CurrentItem.RolledUpEndCustomerUnitPrice.MarketDecimal
Quote.CurrentItem.RolledUpEndCustomerUnitPrice.MarketDisplay
Quote.CurrentItem.RolledUpEndCustomerExtendedPrice
Quote.CurrentItem.RolledUpEndCustomerExtendedPrice.DefaultDisplay
Quote.CurrentItem.RolledUpEndCustomerExtendedPrice.DefaultDecimal
Quote.CurrentItem.RolledUpEndCustomerExtendedPrice.MarketDecimal
Quote.CurrentItem.RolledUpEndCustomerExtendedPrice.MarketDisplay
Quote.CurrentItem.RolledUpListPrice.DefaultDisplay
Quote.CurrentItem.RolledUpListPrice.DefaultDecimal
Quote.CurrentItem.RolledUpListPrice.MarketDecimal
Quote.CurrentItem.RolledUpListPrice.MarketDisplay
Quote.CurrentItem.RolledUpExtendedListPrice
Quote.CurrentItem.RolledUpExtendedListPrice.DefaultDisplay
Quote.CurrentItem.RolledUpExtendedListPrice.DefaultDecimal
Quote.CurrentItem.RolledUpExtendedListPrice.MarketDecimal
Quote.CurrentItem.RolledUpExtendedListPrice.MarketDisplay
Quote.CurrentItem.RolledUpNetPrice
Quote.CurrentItem.RolledUpNetPrice.DefaultDisplay
Quote.CurrentItem.RolledUpNetPrice.DefaultDecimal
Quote.CurrentItem.RolledUpNetPrice.MarketDecimal
Quote.CurrentItem.RolledUpNetPrice.MarketDisplay
Quote.CurrentItem.RolledUpExtendedAmount
Quote.CurrentItem.RolledUpExtendedAmount.DefaultDisplay
Quote.CurrentItem.RolledUpExtendedAmount.DefaultDecimal
Quote.CurrentItem.RolledUpExtendedAmount.MarketDecimal
Quote.CurrentItem.RolledUpExtendedAmount.MarketDisplay
Quote.CurrentItem.RolledUpCost
Quote.CurrentItem.RolledUpCost.DefaultDisplay
Quote.CurrentItem.RolledUpCost.DefaultDecimal
Quote.CurrentItem.RolledUpCost.MarketDecimal
Quote.CurrentItem.RolledUpCost.MarketDisplay
Quote.CurrentItem.RolledUpExtendedCost
Quote.CurrentItem.RolledUpExtendedCost.DefaultDisplay
Quote.CurrentItem.RolledUpExtendedCost.DefaultDecimal
Quote.CurrentItem.RolledUpExtendedCost.MarketDecimal
Quote.CurrentItem.RolledUpExtendedCost.MarketDisplay
Quote.CurrentItem.RolledUpGrossMargin
Quote.CurrentItem.RolledUpGrossMargin.DefaultDisplay
Quote.CurrentItem.RolledUpGrossMargin.DefaultDecimal
Quote.CurrentItem.RolledUpGrossMargin.MarketDisplay
Quote.CurrentItem.RolledUpDiscountAmount
Quote.CurrentItem.RolledUpDiscountAmount.DefaultDisplay
Quote.CurrentItem.RolledUpDiscountAmount.DefaultDecimal
Quote.CurrentItem.RolledUpDiscountAmount.MarketDecimal
Quote.CurrentItem.RolledUpDiscountAmount.MarketDisplay
Quote.CurrentItem.RolledUpDiscountPercent
Quote.CurrentItem.RolledUpDiscountPercent.DefaultDisplay
Quote.CurrentItem.RolledUpDiscountPercent.DefaultDecimal
Quote.CurrentItem.RolledUpDiscountPercent.MarketDecimal
Quote.CurrentItem.RolledUpDiscountPercent.MarketDisplay
Quote.CurrentItem.NetAmountDifferenceFromBaseItem
Quote.CurrentItem.NetAmountDifferenceFromBaseItem.DefaultDisplay
Quote.CurrentItem.NetAmountDifferenceFromBaseItem.DefaultDecimal
Quote.CurrentItem.NetAmountDifferenceFromBaseItem.MarketDecimal
Quote.CurrentItem.NetAmountDifferenceFromBaseItem.MarketDisplay
Quote.CurrentItem.RolledUpNetDifferenceFromBaseItem
Quote.CurrentItem.RolledUpNetDifferenceFromBaseItem.DefaultDisplay
Quote.CurrentItem.RolledUpNetDifferenceFromBaseItem.DefaultDecimal
Quote.CurrentItem.RolledUpNetDifferenceFromBaseItem.MarketDecimal
Quote.CurrentItem.RolledUpNetDifferenceFromBaseItem.MarketDisplay
Quote.CurrentItem.RolledUpCartItem
Quote.CurrentItem.Rank
Quote.CurrentItem.ParentItem
Quote.CurrentItem.CartItem
Quote.CurrentItem.Quantity
Quote.CurrentItem.Quantity.DefaultDisplay
Quote.CurrentItem.Quantity.DefaultDecimal
Quote.CurrentItem.Quantity.MarketDecimal
Quote.CurrentItem.Quantity.MarketDisplay
Quote.CurrentItem.PartNumber
Quote.CurrentItem.Cost.DefaultDisplay
Quote.CurrentItem.Cost.MarketDecimal
Quote.CurrentItem.Cost.MarketDisplay
Quote.CurrentItem.ExtendedCost.DefaultDisplay
Quote.CurrentItem.ExtendedCost.DefaultDecimal
Quote.CurrentItem.ExtendedCost.MarketDecimal
Quote.CurrentItem.ExtendedCost.MarketDisplay
Quote.CurrentItem.ProductModelPrice.DefaultDisplay
Quote.CurrentItem.ProductModelPrice.DefaultDecimal
Quote.CurrentItem.ProductModelPrice.MarketDecimal
Quote.CurrentItem.ProductModelPrice.MarketDisplay
Quote.CurrentItem.ProductCost.DefaultDisplay
Quote.CurrentItem.ProductCost.DefaultDecimal
Quote.CurrentItem.ProductCost.MarketDecimal
Quote.CurrentItem.ProductCost.MarketDisplay
Quote.CurrentItem.PromoDiscountAmount.DefaultDisplay
Quote.CurrentItem.PromoDiscountAmount.DefaultDecimal
Quote.CurrentItem.PromoDiscountAmount.MarketDecimal
Quote.CurrentItem.PromoDiscountAmount.MarketDisplay
Quote.CurrentItem.PromoDiscountPercent.DefaultDisplay
Quote.CurrentItem.PromoDiscountPercent.DefaultDecimal
Quote.CurrentItem.PromoDiscountPercent.MarketDecimal
Quote.CurrentItem.PromoDiscountPercent.MarketDisplay
Quote.CurrentItem.ListPrice.DefaultDisplay
Quote.CurrentItem.ListPrice.DefaultDecimal
Quote.CurrentItem.ListPrice.MarketDecimal
Quote.CurrentItem.ListPrice.MarketDisplay
Quote.CurrentItem.BaseListPrice.DefaultDisplay
Quote.CurrentItem.BaseListPrice.DefaultDecimal
Quote.CurrentItem.BaseListPrice.MarketDecimal
Quote.CurrentItem.BaseListPrice.MarketDisplay
Quote.CurrentItem.ExtendedListPrice.DefaultDisplay
Quote.CurrentItem.ExtendedListPrice.DefaultDecimal
Quote.CurrentItem.ExtendedListPrice.MarketDisplay
Quote.CurrentItem.DiscountPercent.DefaultDisplay
Quote.CurrentItem.DiscountPercent.DefaultDecimal
Quote.CurrentItem.DiscountPercent.MarketDecimal
Quote.CurrentItem.DiscountPercent.MarketDisplay
Quote.CurrentItem.UnitDiscountAmount.DefaultDisplay
Quote.CurrentItem.UnitDiscountAmount.DefaultDecimal
Quote.CurrentItem.UnitDiscountAmount.MarketDecimal
Quote.CurrentItem.UnitDiscountAmount.MarketDisplay
Quote.CurrentItem.DiscountAmount.DefaultDisplay
Quote.CurrentItem.DiscountAmount.DefaultDecimal
Quote.CurrentItem.DiscountAmount.MarketDecimal
Quote.CurrentItem.DiscountAmount.MarketDisplay
Quote.CurrentItem.Multiplier.DefaultDisplay
Quote.CurrentItem.Multiplier.DefaultDecimal
Quote.CurrentItem.Multiplier.MarketDecimal
Quote.CurrentItem.Multiplier.MarketDisplay
Quote.CurrentItem.UnitMultiplierAmount.DefaultDisplay
Quote.CurrentItem.UnitMultiplierAmount.DefaultDecimal
Quote.CurrentItem.UnitMultiplierAmount.MarketDecimal
Quote.CurrentItem.UnitMultiplierAmount.MarketDisplay
Quote.CurrentItem.MultiplierAmount.DefaultDisplay
Quote.CurrentItem.MultiplierAmount.DefaultDecimal
Quote.CurrentItem.MultiplierAmount.MarketDecimal
Quote.CurrentItem.MultiplierAmount.MarketDisplay
Quote.CurrentItem.NetPrice.DefaultDisplay
Quote.CurrentItem.NetPrice.DefaultDecimal
Quote.CurrentItem.NetPrice.MarketDecimal
Quote.CurrentItem.NetPrice.MarketDisplay
Quote.CurrentItem.ExtendedAmount.DefaultDisplay
Quote.CurrentItem.ExtendedAmount.DefaultDecimal
Quote.CurrentItem.ExtendedAmount.MarketDecimal
Quote.CurrentItem.ManufacturesGrossMargin.DefaultDisplay
Quote.CurrentItem.ManufacturesGrossMargin.DefaultDecimal
Quote.CurrentItem.ManufacturesGrossMargin.MarketDecimal
Quote.CurrentItem.ManufacturesGrossMargin.MarketDisplay
Quote.CurrentItem.ChannelMarkupPercent.DefaultDisplay
Quote.CurrentItem.ChannelMarkupPercent.DefaultDecimal
Quote.CurrentItem.ChannelMarkupPercent.MarketDecimal
Quote.CurrentItem.ChannelMarkupPercent.MarketDisplay
Quote.CurrentItem.ChannelMarkupAmount.DefaultDisplay
Quote.CurrentItem.ChannelMarkupAmount.DefaultDecimal
Quote.CurrentItem.ChannelMarkupAmount.MarketDecimal
Quote.CurrentItem.ChannelMarkupAmount.MarketDisplay
Quote.CurrentItem.EndUserNet.DefaultDisplay
Quote.CurrentItem.EndUserNet.DefaultDecimal
Quote.CurrentItem.EndUserNet.MarketDecimal
Quote.CurrentItem.EndUserNet.MarketDisplay
Quote.CurrentItem.EndUserExtendedAmount.DefaultDisplay
Quote.CurrentItem.EndUserExtendedAmount.DefaultDecimal
Quote.CurrentItem.EndUserExtendedAmount.MarketDecimal
Quote.CurrentItem.EndUserExtendedAmount.MarketDisplay
Quote.CurrentItem.ChannelMarginPercent.DefaultDisplay
Quote.CurrentItem.ChannelMarginPercent.DefaultDecimal
Quote.CurrentItem.ChannelMarginPercent.MarketDecimal
Quote.CurrentItem.ChannelMarginPercent.MarketDisplay
Quote.CurrentItem.IsOptional
Quote.CurrentItem.MarginHealthColor
Quote.CurrentItem.MarginHealthImage
Quote.CurrentItem.MRCMarginHealthColor
Quote.CurrentItem.MRCMarginHealthImage
Quote.CurrentItem.MasterParentItem
Quote.CurrentItem.ProductTypeName
Quote.CurrentItem.ProductTypeId
Quote.CurrentItem.ChannelCommisionPercent.DefaultDecimal
Quote.CurrentItem.ChannelCommisionPercent.MarketDecimal
Quote.CurrentItem.ChannelCommisionPercent.MarketDisplay
Quote.CurrentItem.ChannelCommisionAmount.DefaultDisplay
Quote.CurrentItem.ChannelCommisionAmount.DefaultDecimal
Quote.CurrentItem.ChannelCommisionAmount.MarketDecimal
Quote.CurrentItem.ChannelCommisionAmount.MarketDisplay
Quote.CurrentItem.UserCommisionPercent.DefaultDisplay
Quote.CurrentItem.UserCommisionPercent.DefaultDecimal
Quote.CurrentItem.UserCommisionPercent.MarketDecimal
Quote.CurrentItem.UserCommisionPercent.MarketDisplay
Quote.CurrentItem.UserCommisionAmount.DefaultDisplay
Quote.CurrentItem.UserCommisionAmount.DefaultDecimal
Quote.CurrentItem.UserCommisionAmount.MarketDecimal
Quote.CurrentItem.UserCommisionAmount.MarketDisplay
Quote.CurrentItem.ProductId
Quote.CurrentItem.ProductName
Quote.CurrentItem.Description
Quote.CurrentItem.DescriptionLong
Quote.CurrentItem.UserDescription
Quote.CurrentItem.CsvPavId
Quote.CurrentItem.CategoryId
Quote.CurrentItem.DateAdded
Quote.CurrentItem.DateAdded.Format()
Quote.CurrentItem.DateAdded.AddDays()
Quote.CurrentItem.DateAdded.AddDays().Format()
Quote.CurrentItem.DateAdded.AddDays().InUSDateFormat
Quote.CurrentItem.DateAdded.AddMonths()
Quote.CurrentItem.DateAdded.AddMonths().Format()
Quote.CurrentItem.DateAdded.AddMonths().InUSDateFormat
Quote.CurrentItem.DateAdded.AddYears()
Quote.CurrentItem.DateAdded.AddYears().Format()
Quote.CurrentItem.ItemDeliveryMethod
Quote.CurrentItem.ItemDeliveryStatus
Quote.CurrentItem.EffDate
Quote.CurrentItem.EffDate.Format()
Quote.CurrentItem.EffDate.AddDays()
Quote.CurrentItem.EffDate.AddDays().Format()
Quote.CurrentItem.EffDate.AddDays().InUSDateFormat
Quote.CurrentItem.EffDate.AddMonths()
Quote.CurrentItem.EffDate.AddMonths().Format()
Quote.CurrentItem.EffDate.AddMonths().InUSDateFormat
Quote.CurrentItem.EffDate.AddYears()
Quote.CurrentItem.EffDate.AddYears().Format()
Quote.CurrentItem.EffDate.AddYears().InUSDateFormat
Quote.CurrentItem.SubProductId
Quote.CurrentItem.GroupId
Quote.CurrentItem.HasIncompleteConfiguration
Quote.CurrentItem.BaseQuantity.DefaultDisplay
Quote.CurrentItem.BaseQuantity.DefaultDecimal
Quote.CurrentItem.BaseQuantity.MarketDecimal
Quote.CurrentItem.BaseQuantity.MarketDisplay
Quote.CurrentItem.Weight.DefaultDisplay
Quote.CurrentItem.Weight.DefaultDecimal
Quote.CurrentItem.Weight.MarketDecimal
Quote.CurrentItem.Weight.MarketDisplay
Quote.CurrentItem.DefaultDiscountPercent.DefaultDisplay
Quote.CurrentItem.DefaultDiscountPercent.DefaultDecimal
Quote.CurrentItem.DefaultDiscountPercent.MarketDecimal
Quote.CurrentItem.DefaultDiscountPercent.MarketDisplay
Quote.CurrentItem.MinDiscountPercent.DefaultDisplay
Quote.CurrentItem.MinDiscountPercent.DefaultDecimal
Quote.CurrentItem.MinDiscountPercent.MarketDecimal
Quote.CurrentItem.MinDiscountPercent.MarketDisplay
Quote.CurrentItem.MaxDiscountPercent.DefaultDecimal
Quote.CurrentItem.MaxDiscountPercent.MarketDecimal
Quote.CurrentItem.MaxDiscountPercent.MarketDisplay
Quote.CurrentItem.DefaultMultiplier.DefaultDisplay
Quote.CurrentItem.DefaultMultiplier.DefaultDecimal
Quote.CurrentItem.DefaultMultiplier.MarketDecimal
Quote.CurrentItem.DefaultMultiplier.MarketDisplay
Quote.CurrentItem.MinMultiplier.DefaultDisplay
Quote.CurrentItem.MinMultiplier.DefaultDecimal
Quote.CurrentItem.MinMultiplier.MarketDecimal
Quote.CurrentItem.MinMultiplier.MarketDisplay
Quote.CurrentItem.MaxMultiplier.DefaultDisplay
Quote.CurrentItem.MaxMultiplier.DefaultDecimal
Quote.CurrentItem.MaxMultiplier.MarketDecimal
Quote.CurrentItem.MaxMultiplier.MarketDisplay
Quote.CurrentItem.DefaultMRCDiscountPercent.DefaultDisplay
Quote.CurrentItem.DefaultMRCDiscountPercent.DefaultDecimal
Quote.CurrentItem.DefaultMRCDiscountPercent.MarketDecimal
Quote.CurrentItem.DefaultMRCDiscountPercent.MarketDisplay
Quote.CurrentItem.MinMRCDiscountPercent.DefaultDisplay
Quote.CurrentItem.MinMRCDiscountPercent.DefaultDecimal
Quote.CurrentItem.MinMRCDiscountPercent.MarketDecimal
Quote.CurrentItem.MinMRCDiscountPercent.MarketDisplay
Quote.CurrentItem.MaxMRCDiscountPercent.DefaultDisplay
Quote.CurrentItem.MaxMRCDiscountPercent.DefaultDecimal
Quote.CurrentItem.MaxMRCDiscountPercent.MarketDecimal
Quote.CurrentItem.MaxMRCDiscountPercent.MarketDisplay
Quote.CurrentItem.DefaultMRCMultiplier.DefaultDisplay
Quote.CurrentItem.DefaultMRCMultiplier.DefaultDecimal
Quote.CurrentItem.DefaultMRCMultiplier.MarketDecimal
Quote.CurrentItem.DefaultMRCMultiplier.MarketDisplay
Quote.CurrentItem.MinMRCMultiplier.DefaultDisplay
Quote.CurrentItem.MinMRCMultiplier.MarketDecimal
Quote.CurrentItem.MinMRCMultiplier.MarketDisplay
Quote.CurrentItem.MaxMRCMultiplier.DefaultDisplay
Quote.CurrentItem.MaxMRCMultiplier.DefaultDecimal
Quote.CurrentItem.MaxMRCMultiplier.MarketDecimal
Quote.CurrentItem.MaxMRCMultiplier.MarketDisplay
Quote.CurrentItem.UpfrontPercent.DefaultDisplay
Quote.CurrentItem.UpfrontPercent.DefaultDecimal
Quote.CurrentItem.UpfrontPercent.MarketDecimal
Quote.CurrentItem.UpfrontPercent.MarketDisplay
Quote.CurrentItem.UpfrontAmount.DefaultDisplay
Quote.CurrentItem.UpfrontAmount.DefaultDecimal
Quote.CurrentItem.UpfrontAmount.MarketDecimal
Quote.CurrentItem.UpfrontAmount.MarketDisplay
Quote.CurrentItem.MonthlyFeeAmount.DefaultDisplay
Quote.CurrentItem.MonthlyFeeAmount.DefaultDecimal
Quote.CurrentItem.MonthlyFeeAmount.MarketDecimal
Quote.CurrentItem.MonthlyFeeAmount.MarketDisplay
Quote.CurrentItem.CustomColumn1.DefaultDisplay
Quote.CurrentItem.CustomColumn1.DefaultDecimal
Quote.CurrentItem.CustomColumn1.MarketDecimal
Quote.CurrentItem.CustomColumn1.MarketDisplay
Quote.CurrentItem.CustomColumn2.DefaultDisplay
Quote.CurrentItem.CustomColumn2.DefaultDecimal
Quote.CurrentItem.CustomColumn2.MarketDecimal
Quote.CurrentItem.CustomColumn2.MarketDisplay
Quote.CurrentItem.CustomColumn3.DefaultDisplay
Quote.CurrentItem.CustomColumn3.DefaultDecimal
Quote.CurrentItem.CustomColumn3.MarketDecimal
Quote.CurrentItem.CustomColumn3.MarketDisplay
Quote.CurrentItem.CustomColumn4.DefaultDisplay
Quote.CurrentItem.CustomColumn4.DefaultDecimal
Quote.CurrentItem.CustomColumn4.MarketDisplay
Quote.CurrentItem.CustomColumn5.DefaultDisplay
Quote.CurrentItem.CustomColumn5.DefaultDecimal
Quote.CurrentItem.CustomColumn5.MarketDecimal
Quote.CurrentItem.CustomColumn5.MarketDisplay
Quote.CurrentItem.CustomColumn6.DefaultDisplay
Quote.CurrentItem.CustomColumn6.DefaultDecimal
Quote.CurrentItem.CustomColumn6.MarketDecimal
Quote.CurrentItem.CustomColumn6.MarketDisplay
Quote.CurrentItem.ProductVersion
Quote.CurrentItem.ExternalId
Quote.CurrentItem.UPC
Quote.CurrentItem.MPN
Quote.CurrentItem.Inventory
Quote.CurrentItem.LeadTime
Quote.CurrentItem.FamilyCode
Quote.CurrentItem.PRODUCT_WEIGHT
Quote.CurrentItem.CanOverrideMinMaxValues
Quote.CurrentItem.ItemType
Quote.CurrentItem.BaseItem
Quote.CurrentItem.MRCListPrice.DefaultDisplay
Quote.CurrentItem.MRCListPrice.DefaultDecimal
Quote.CurrentItem.MRCListPrice.MarketDecimal
Quote.CurrentItem.MRCListPrice.MarketDisplay
Quote.CurrentItem.MRCExtendedListPrice.DefaultDisplay
Quote.CurrentItem.MRCExtendedListPrice.DefaultDecimal
Quote.CurrentItem.MRCExtendedListPrice.MarketDecimal
Quote.CurrentItem.MRCExtendedListPrice.MarketDisplay
Quote.CurrentItem.MRCDiscountPercent.DefaultDisplay
Quote.CurrentItem.MRCDiscountPercent.DefaultDecimal
Quote.CurrentItem.MRCDiscountPercent.MarketDecimal
Quote.CurrentItem.MRCDiscountPercent.MarketDisplay
Quote.CurrentItem.MRCDiscountAmount.DefaultDecimal
Quote.CurrentItem.MRCDiscountAmount.MarketDecimal
Quote.CurrentItem.MRCDiscountAmount.MarketDisplay
Quote.CurrentItem.MRCUnitDiscountAmount.DefaultDisplay
Quote.CurrentItem.MRCUnitDiscountAmount.DefaultDecimal
Quote.CurrentItem.MRCUnitDiscountAmount.MarketDecimal
Quote.CurrentItem.MRCUnitDiscountAmount.MarketDisplay
Quote.CurrentItem.MRCNetPrice.DefaultDisplay
Quote.CurrentItem.MRCNetPrice.DefaultDecimal
Quote.CurrentItem.MRCNetPrice.MarketDecimal
Quote.CurrentItem.MRCNetPrice.MarketDisplay
Quote.CurrentItem.MRCExtendedAmount.DefaultDisplay
Quote.CurrentItem.MRCExtendedAmount.DefaultDecimal
Quote.CurrentItem.MRCExtendedAmount.MarketDecimal
Quote.CurrentItem.MRCExtendedAmount.MarketDisplay
Quote.CurrentItem.MRCGrossMarginPercent.DefaultDisplay
Quote.CurrentItem.MRCGrossMarginPercent.DefaultDecimal
Quote.CurrentItem.MRCGrossMarginPercent.MarketDecimal
Quote.CurrentItem.MRCGrossMarginPercent.MarketDisplay
Quote.CurrentItem.MRCCost.DefaultDisplay
Quote.CurrentItem.MRCCost.DefaultDecimal
Quote.CurrentItem.MRCCost.MarketDecimal
Quote.CurrentItem.MRCCost.MarketDisplay
Quote.CurrentItem.MRCExtendedCost.DefaultDisplay
Quote.CurrentItem.MRCExtendedCost.DefaultDecimal
Quote.CurrentItem.MRCExtendedCost.MarketDecimal
Quote.CurrentItem.MRCExtendedCost.MarketDisplay
Quote.CurrentItem.MRCMultiplier.DefaultDisplay
Quote.CurrentItem.MRCMultiplier.DefaultDecimal
Quote.CurrentItem.MRCMultiplier.MarketDecimal
Quote.CurrentItem.MRCMultiplier.MarketDisplay
Quote.CurrentItem.MRCMultiplierAmount.DefaultDisplay
Quote.CurrentItem.MRCMultiplierAmount.MarketDecimal
Quote.CurrentItem.MRCMultiplierAmount.MarketDisplay
Quote.CurrentItem.MRCUnitMultiplierAmount.DefaultDisplay
Quote.CurrentItem.MRCUnitMultiplierAmount.DefaultDecimal
Quote.CurrentItem.MRCUnitMultiplierAmount.MarketDecimal
Quote.CurrentItem.MRCUnitMultiplierAmount.MarketDisplay
Quote.CurrentItem.MRCChannelMarkupPercent.DefaultDisplay
Quote.CurrentItem.MRCChannelMarkupPercent.DefaultDecimal
Quote.CurrentItem.MRCChannelMarkupPercent.MarketDecimal
Quote.CurrentItem.MRCChannelMarkupPercent.MarketDisplay
Quote.CurrentItem.MRCChannelMarkupAmount.DefaultDisplay
Quote.CurrentItem.MRCChannelMarkupAmount.DefaultDecimal
Quote.CurrentItem.MRCChannelMarkupAmount.MarketDecimal
Quote.CurrentItem.MRCChannelMarkupAmount.MarketDisplay
Quote.CurrentItem.MRCChannelMarginPercent.DefaultDisplay
Quote.CurrentItem.MRCChannelMarginPercent.DefaultDecimal
Quote.CurrentItem.MRCChannelMarginPercent.MarketDecimal
Quote.CurrentItem.MRCChannelMarginPercent.MarketDisplay
Quote.CurrentItem.MRCChannelMarginAmount.DefaultDisplay
Quote.CurrentItem.MRCChannelMarginAmount.DefaultDecimal
Quote.CurrentItem.MRCChannelMarginAmount.MarketDecimal
Quote.CurrentItem.MRCChannelMarginAmount.MarketDisplay
Quote.CurrentItem.MRCEndUserNet.DefaultDisplay
Quote.CurrentItem.MRCEndUserNet.DefaultDecimal
Quote.CurrentItem.MRCEndUserNet.MarketDecimal
Quote.CurrentItem.MRCEndUserNet.MarketDisplay
Quote.CurrentItem.MRCEndUserExtendedAmount.DefaultDisplay
Quote.CurrentItem.MRCEndUserExtendedAmount.DefaultDecimal
Quote.CurrentItem.MRCEndUserExtendedAmount.MarketDecimal
Quote.CurrentItem.MRCEndUserExtendedAmount.MarketDisplay
Quote.CurrentItem.CartItemGuid
Quote.CurrentItem.BaseItemGuid
Quote.CurrentItem.KeyAttribute().Label
Quote.CurrentItem.KeyAttribute().Value
Quote.CurrentItem.Attribute().Value
Quote.CurrentItem.Attribute(NameOfAttribute).ValueCode
Quote.CurrentItem.MainItem.AttributeRank
Quote.CurrentItem.MainItem.AttributeSubRank
Quote.CurrentItem.MainItem.IsMainItem
Quote.CurrentItem.MainItem.IsChildItem
Quote.CurrentItem.MainItem.SystemID
Quote.CurrentItem.MainItem.IsAlternative
Quote.CurrentItem.MainItem.IsVariant
Quote.CurrentItem.MainItem.RolledUpEndCustomerUnitPrice
Quote.CurrentItem.MainItem.RolledUpEndCustomerUnitPrice.DefaultDisplay
Quote.CurrentItem.MainItem.RolledUpEndCustomerUnitPrice.DefaultDecimal
Quote.CurrentItem.MainItem.RolledUpEndCustomerUnitPrice.MarketDecimal
Quote.CurrentItem.MainItem.RolledUpEndCustomerUnitPrice.MarketDisplay
Quote.CurrentItem.MainItem.RolledUpEndCustomerExtendedPrice
Quote.CurrentItem.MainItem.RolledUpEndCustomerExtendedPrice.DefaultDisplay
Quote.CurrentItem.MainItem.RolledUpEndCustomerExtendedPrice.DefaultDecimal
Quote.CurrentItem.MainItem.RolledUpEndCustomerExtendedPrice.MarketDecimal
Quote.CurrentItem.MainItem.RolledUpEndCustomerExtendedPrice.MarketDisplay
Quote.CurrentItem.MainItem.RolledUpListPrice
Quote.CurrentItem.MainItem.RolledUpListPrice.DefaultDisplay
Quote.CurrentItem.MainItem.RolledUpListPrice.DefaultDecimal
Quote.CurrentItem.MainItem.RolledUpListPrice.MarketDecimal
Quote.CurrentItem.MainItem.RolledUpListPrice.MarketDisplay
Quote.CurrentItem.MainItem.RolledUpExtendedListPrice
Quote.CurrentItem.MainItem.RolledUpExtendedListPrice.DefaultDisplay
Quote.CurrentItem.MainItem.RolledUpExtendedListPrice.DefaultDecimal
Quote.CurrentItem.MainItem.RolledUpExtendedListPrice.MarketDecimal
Quote.CurrentItem.MainItem.RolledUpExtendedListPrice.MarketDisplay
Quote.CurrentItem.MainItem.RolledUpNetPrice
Quote.CurrentItem.MainItem.RolledUpNetPrice.DefaultDecimal
Quote.CurrentItem.MainItem.RolledUpNetPrice.MarketDecimal
Quote.CurrentItem.MainItem.RolledUpNetPrice.MarketDisplay
Quote.CurrentItem.MainItem.RolledUpExtendedAmount
Quote.CurrentItem.MainItem.RolledUpExtendedAmount.DefaultDisplay
Quote.CurrentItem.MainItem.RolledUpExtendedAmount.DefaultDecimal
Quote.CurrentItem.MainItem.RolledUpExtendedAmount.MarketDecimal
Quote.CurrentItem.MainItem.RolledUpExtendedAmount.MarketDisplay
Quote.CurrentItem.MainItem.RolledUpCost
Quote.CurrentItem.MainItem.RolledUpCost.DefaultDisplay
Quote.CurrentItem.MainItem.RolledUpCost.DefaultDecimal
Quote.CurrentItem.MainItem.RolledUpCost.MarketDecimal
Quote.CurrentItem.MainItem.RolledUpCost.MarketDisplay
Quote.CurrentItem.MainItem.RolledUpExtendedCost
Quote.CurrentItem.MainItem.RolledUpExtendedCost.DefaultDisplay
Quote.CurrentItem.MainItem.RolledUpExtendedCost.DefaultDecimal
Quote.CurrentItem.MainItem.RolledUpExtendedCost.MarketDecimal
Quote.CurrentItem.MainItem.RolledUpExtendedCost.MarketDisplay
Quote.CurrentItem.MainItem.RolledUpGrossMargin
Quote.CurrentItem.MainItem.RolledUpGrossMargin.DefaultDisplay
Quote.CurrentItem.MainItem.RolledUpGrossMargin.DefaultDecimal
Quote.CurrentItem.MainItem.RolledUpGrossMargin.MarketDecimal
Quote.CurrentItem.MainItem.RolledUpGrossMargin.MarketDisplay
Quote.CurrentItem.MainItem.RolledUpDiscountAmount
Quote.CurrentItem.MainItem.RolledUpDiscountAmount.DefaultDisplay
Quote.CurrentItem.MainItem.RolledUpDiscountAmount.DefaultDecimal
Quote.CurrentItem.MainItem.RolledUpDiscountAmount.MarketDecimal
Quote.CurrentItem.MainItem.RolledUpDiscountAmount.MarketDisplay
Quote.CurrentItem.MainItem.RolledUpDiscountPercent
Quote.CurrentItem.MainItem.RolledUpDiscountPercent.DefaultDisplay
Quote.CurrentItem.MainItem.RolledUpDiscountPercent.DefaultDecimal
Quote.CurrentItem.MainItem.RolledUpDiscountPercent.MarketDecimal
Quote.CurrentItem.MainItem.NetAmountDifferenceFromBaseItem
Quote.CurrentItem.MainItem.NetAmountDifferenceFromBaseItem.DefaultDisplay
Quote.CurrentItem.MainItem.NetAmountDifferenceFromBaseItem.DefaultDecimal
Quote.CurrentItem.MainItem.NetAmountDifferenceFromBaseItem.MarketDecimal
Quote.CurrentItem.MainItem.NetAmountDifferenceFromBaseItem.MarketDisplay
Quote.CurrentItem.MainItem.RolledUpNetDifferenceFromBaseItem
Quote.CurrentItem.MainItem.RolledUpNetDifferenceFromBaseItem.DefaultDisplay
Quote.CurrentItem.MainItem.RolledUpNetDifferenceFromBaseItem.DefaultDecimal
Quote.CurrentItem.MainItem.RolledUpNetDifferenceFromBaseItem.MarketDecimal
Quote.CurrentItem.MainItem.RolledUpNetDifferenceFromBaseItem.MarketDisplay
Quote.CurrentItem.MainItem.RolledUpCartItem
Quote.CurrentItem.MainItem.Rank
Quote.CurrentItem.MainItem.ParentItem
Quote.CurrentItem.MainItem.CartItem
Quote.CurrentItem.MainItem.Quantity
Quote.CurrentItem.MainItem.Quantity.DefaultDisplay
Quote.CurrentItem.MainItem.Quantity.DefaultDecimal
Quote.CurrentItem.MainItem.Quantity.MarketDecimal
Quote.CurrentItem.MainItem.Quantity.MarketDisplay
Quote.CurrentItem.MainItem.PartNumber
Quote.CurrentItem.MainItem.Cost.DefaultDisplay
Quote.CurrentItem.MainItem.Cost.DefaultDecimal
Quote.CurrentItem.MainItem.Cost.MarketDecimal
Quote.CurrentItem.MainItem.Cost.MarketDisplay
Quote.CurrentItem.MainItem.ExtendedCost.DefaultDisplay
Quote.CurrentItem.MainItem.ExtendedCost.DefaultDecimal
Quote.CurrentItem.MainItem.ExtendedCost.MarketDecimal
Quote.CurrentItem.MainItem.ExtendedCost.MarketDisplay
Quote.CurrentItem.MainItem.ProductModelPrice.DefaultDisplay
Quote.CurrentItem.MainItem.ProductModelPrice.DefaultDecimal
Quote.CurrentItem.MainItem.ProductModelPrice.MarketDecimal
Quote.CurrentItem.MainItem.ProductModelPrice.MarketDisplay
Quote.CurrentItem.MainItem.ProductCost.DefaultDecimal
Quote.CurrentItem.MainItem.ProductCost.MarketDecimal
Quote.CurrentItem.MainItem.ProductCost.MarketDisplay
Quote.CurrentItem.MainItem.PromoDiscountAmount.DefaultDisplay
Quote.CurrentItem.MainItem.PromoDiscountAmount.DefaultDecimal
Quote.CurrentItem.MainItem.PromoDiscountAmount.MarketDecimal
Quote.CurrentItem.MainItem.PromoDiscountAmount.MarketDisplay
Quote.CurrentItem.MainItem.PromoDiscountPercent.DefaultDisplay
Quote.CurrentItem.MainItem.PromoDiscountPercent.DefaultDecimal
Quote.CurrentItem.MainItem.PromoDiscountPercent.MarketDecimal
Quote.CurrentItem.MainItem.PromoDiscountPercent.MarketDisplay
Quote.CurrentItem.MainItem.ListPrice.DefaultDisplay
Quote.CurrentItem.MainItem.ListPrice.DefaultDecimal
Quote.CurrentItem.MainItem.ListPrice.MarketDecimal
Quote.CurrentItem.MainItem.ListPrice.MarketDisplay
Quote.CurrentItem.MainItem.BaseListPrice.DefaultDisplay
Quote.CurrentItem.MainItem.BaseListPrice.DefaultDecimal
Quote.CurrentItem.MainItem.BaseListPrice.MarketDecimal
Quote.CurrentItem.MainItem.BaseListPrice.MarketDisplay
Quote.CurrentItem.MainItem.ExtendedListPrice.DefaultDisplay
Quote.CurrentItem.MainItem.ExtendedListPrice.DefaultDecimal
Quote.CurrentItem.MainItem.ExtendedListPrice.MarketDecimal
Quote.CurrentItem.MainItem.ExtendedListPrice.MarketDisplay
Quote.CurrentItem.MainItem.DiscountPercent.DefaultDisplay
Quote.CurrentItem.MainItem.DiscountPercent.DefaultDecimal
Quote.CurrentItem.MainItem.DiscountPercent.MarketDecimal
Quote.CurrentItem.MainItem.DiscountPercent.MarketDisplay
Quote.CurrentItem.MainItem.UnitDiscountAmount.DefaultDisplay
Quote.CurrentItem.MainItem.UnitDiscountAmount.DefaultDecimal
Quote.CurrentItem.MainItem.UnitDiscountAmount.MarketDecimal
Quote.CurrentItem.MainItem.UnitDiscountAmount.MarketDisplay
Quote.CurrentItem.MainItem.DiscountAmount.DefaultDisplay
Quote.CurrentItem.MainItem.DiscountAmount.MarketDecimal
Quote.CurrentItem.MainItem.DiscountAmount.MarketDisplay
Quote.CurrentItem.MainItem.Multiplier.DefaultDisplay
Quote.CurrentItem.MainItem.Multiplier.DefaultDecimal
Quote.CurrentItem.MainItem.Multiplier.MarketDecimal
Quote.CurrentItem.MainItem.Multiplier.MarketDisplay
Quote.CurrentItem.MainItem.UnitMultiplierAmount.DefaultDisplay
Quote.CurrentItem.MainItem.UnitMultiplierAmount.DefaultDecimal
Quote.CurrentItem.MainItem.UnitMultiplierAmount.MarketDecimal
Quote.CurrentItem.MainItem.UnitMultiplierAmount.MarketDisplay
Quote.CurrentItem.MainItem.MultiplierAmount.DefaultDisplay
Quote.CurrentItem.MainItem.MultiplierAmount.DefaultDecimal
Quote.CurrentItem.MainItem.MultiplierAmount.MarketDecimal
Quote.CurrentItem.MainItem.MultiplierAmount.MarketDisplay
Quote.CurrentItem.MainItem.NetPrice.DefaultDisplay
Quote.CurrentItem.MainItem.NetPrice.DefaultDecimal
Quote.CurrentItem.MainItem.NetPrice.MarketDecimal
Quote.CurrentItem.MainItem.NetPrice.MarketDisplay
Quote.CurrentItem.MainItem.ExtendedAmount.DefaultDisplay
Quote.CurrentItem.MainItem.ExtendedAmount.DefaultDecimal
Quote.CurrentItem.MainItem.ExtendedAmount.MarketDecimal
Quote.CurrentItem.MainItem.ExtendedAmount.MarketDisplay
Quote.CurrentItem.MainItem.ManufacturesGrossMargin.DefaultDisplay
Quote.CurrentItem.MainItem.ManufacturesGrossMargin.DefaultDecimal
Quote.CurrentItem.MainItem.ManufacturesGrossMargin.MarketDecimal
Quote.CurrentItem.MainItem.ManufacturesGrossMargin.MarketDisplay
Quote.CurrentItem.MainItem.ChannelMarkupPercent.DefaultDisplay
Quote.CurrentItem.MainItem.ChannelMarkupPercent.DefaultDecimal
Quote.CurrentItem.MainItem.ChannelMarkupPercent.MarketDecimal
Quote.CurrentItem.MainItem.ChannelMarkupPercent.MarketDisplay
Quote.CurrentItem.MainItem.ChannelMarkupAmount.DefaultDisplay
Quote.CurrentItem.MainItem.ChannelMarkupAmount.DefaultDecimal
Quote.CurrentItem.MainItem.ChannelMarkupAmount.MarketDisplay
Quote.CurrentItem.MainItem.EndUserNet.DefaultDisplay
Quote.CurrentItem.MainItem.EndUserNet.DefaultDecimal
Quote.CurrentItem.MainItem.EndUserNet.MarketDecimal
Quote.CurrentItem.MainItem.EndUserNet.MarketDisplay
Quote.CurrentItem.MainItem.EndUserExtendedAmount.DefaultDisplay
Quote.CurrentItem.MainItem.EndUserExtendedAmount.DefaultDecimal
Quote.CurrentItem.MainItem.EndUserExtendedAmount.MarketDecimal
Quote.CurrentItem.MainItem.EndUserExtendedAmount.MarketDisplay
Quote.CurrentItem.MainItem.ChannelMarginPercent.DefaultDisplay
Quote.CurrentItem.MainItem.ChannelMarginPercent.DefaultDecimal
Quote.CurrentItem.MainItem.ChannelMarginPercent.MarketDecimal
Quote.CurrentItem.MainItem.ChannelMarginPercent.MarketDisplay
Quote.CurrentItem.MainItem.IsOptional
Quote.CurrentItem.MainItem.MarginHealthColor
Quote.CurrentItem.MainItem.MarginHealthImage
Quote.CurrentItem.MainItem.MRCMarginHealthColor
Quote.CurrentItem.MainItem.MRCMarginHealthImage
Quote.CurrentItem.MainItem.ProductTypeName
Quote.CurrentItem.MainItem.ProductTypeId
Quote.CurrentItem.MainItem.ChannelCommisionPercent.DefaultDisplay
Quote.CurrentItem.MainItem.ChannelCommisionPercent.DefaultDecimal
Quote.CurrentItem.MainItem.ChannelCommisionPercent.MarketDecimal
Quote.CurrentItem.MainItem.ChannelCommisionPercent.MarketDisplay
Quote.CurrentItem.MainItem.ChannelCommisionAmount.DefaultDisplay
Quote.CurrentItem.MainItem.ChannelCommisionAmount.DefaultDecimal
Quote.CurrentItem.MainItem.ChannelCommisionAmount.MarketDecimal
Quote.CurrentItem.MainItem.ChannelCommisionAmount.MarketDisplay
Quote.CurrentItem.MainItem.UserCommisionPercent.DefaultDisplay
Quote.CurrentItem.MainItem.UserCommisionPercent.DefaultDecimal
Quote.CurrentItem.MainItem.UserCommisionPercent.MarketDecimal
Quote.CurrentItem.MainItem.UserCommisionPercent.MarketDisplay
Quote.CurrentItem.MainItem.UserCommisionAmount.DefaultDecimal
Quote.CurrentItem.MainItem.UserCommisionAmount.MarketDecimal
Quote.CurrentItem.MainItem.UserCommisionAmount.MarketDisplay
Quote.CurrentItem.MainItem.ProductId
Quote.CurrentItem.MainItem.ProductName
Quote.CurrentItem.MainItem.Description
Quote.CurrentItem.MainItem.DescriptionLong
Quote.CurrentItem.MainItem.UserDescription
Quote.CurrentItem.MainItem.CsvPavId
Quote.CurrentItem.MainItem.CategoryId
Quote.CurrentItem.MainItem.DateAdded
Quote.CurrentItem.MainItem.DateAdded.Format()
Quote.CurrentItem.MainItem.DateAdded.AddDays()
Quote.CurrentItem.MainItem.DateAdded.AddDays().Format()
Quote.CurrentItem.MainItem.DateAdded.AddDays().InUSDateFormat
Quote.CurrentItem.MainItem.DateAdded.AddMonths()
Quote.CurrentItem.MainItem.DateAdded.AddMonths().Format()
Quote.CurrentItem.MainItem.DateAdded.AddMonths().InUSDateFormat
Quote.CurrentItem.MainItem.DateAdded.AddYears()
Quote.CurrentItem.MainItem.DateAdded.AddYears().Format()
Quote.CurrentItem.MainItem.DateAdded.AddYears().InUSDateFormat
Quote.CurrentItem.MainItem.ItemDeliveryMethod
Quote.CurrentItem.MainItem.ItemDeliveryStatus
Quote.CurrentItem.MainItem.EffDate
Quote.CurrentItem.MainItem.EffDate.Format()
Quote.CurrentItem.MainItem.EffDate.AddDays()
Quote.CurrentItem.MainItem.EffDate.AddDays().Format()
Quote.CurrentItem.MainItem.EffDate.AddDays().InUSDateFormat
Quote.CurrentItem.MainItem.EffDate.AddMonths()
Quote.CurrentItem.MainItem.EffDate.AddMonths().Format()
Quote.CurrentItem.MainItem.EffDate.AddMonths().InUSDateFormat
Quote.CurrentItem.MainItem.EffDate.AddYears()
Quote.CurrentItem.MainItem.EffDate.AddYears().InUSDateFormat
Quote.CurrentItem.MainItem.SubProductId
Quote.CurrentItem.MainItem.GroupId
Quote.CurrentItem.MainItem.BaseQuantity.DefaultDisplay
Quote.CurrentItem.MainItem.BaseQuantity.DefaultDecimal
Quote.CurrentItem.MainItem.BaseQuantity.MarketDecimal
Quote.CurrentItem.MainItem.BaseQuantity.MarketDisplay
Quote.CurrentItem.MainItem.Weight.DefaultDisplay
Quote.CurrentItem.MainItem.Weight.DefaultDecimal
Quote.CurrentItem.MainItem.Weight.MarketDecimal
Quote.CurrentItem.MainItem.Weight.MarketDisplay
Quote.CurrentItem.MainItem.DefaultDiscountPercent.DefaultDisplay
Quote.CurrentItem.MainItem.DefaultDiscountPercent.DefaultDecimal
Quote.CurrentItem.MainItem.DefaultDiscountPercent.MarketDecimal
Quote.CurrentItem.MainItem.DefaultDiscountPercent.MarketDisplay
Quote.CurrentItem.MainItem.MinDiscountPercent.DefaultDisplay
Quote.CurrentItem.MainItem.MinDiscountPercent.DefaultDecimal
Quote.CurrentItem.MainItem.MinDiscountPercent.MarketDecimal
Quote.CurrentItem.MainItem.MinDiscountPercent.MarketDisplay
Quote.CurrentItem.MainItem.MaxDiscountPercent.DefaultDisplay
Quote.CurrentItem.MainItem.MaxDiscountPercent.DefaultDecimal
Quote.CurrentItem.MainItem.MaxDiscountPercent.MarketDecimal
Quote.CurrentItem.MainItem.MaxDiscountPercent.MarketDisplay
Quote.CurrentItem.MainItem.DefaultMultiplier.DefaultDisplay
Quote.CurrentItem.MainItem.DefaultMultiplier.DefaultDecimal
Quote.CurrentItem.MainItem.DefaultMultiplier.MarketDecimal
Quote.CurrentItem.MainItem.DefaultMultiplier.MarketDisplay
Quote.CurrentItem.MainItem.MinMultiplier.DefaultDisplay
Quote.CurrentItem.MainItem.MinMultiplier.DefaultDecimal
Quote.CurrentItem.MainItem.MinMultiplier.MarketDecimal
Quote.CurrentItem.MainItem.MinMultiplier.MarketDisplay
Quote.CurrentItem.MainItem.MaxMultiplier.DefaultDisplay
Quote.CurrentItem.MainItem.MaxMultiplier.MarketDecimal
Quote.CurrentItem.MainItem.MaxMultiplier.MarketDisplay
Quote.CurrentItem.MainItem.DefaultMRCDiscountPercent.DefaultDisplay
Quote.CurrentItem.MainItem.DefaultMRCDiscountPercent.DefaultDecimal
Quote.CurrentItem.MainItem.DefaultMRCDiscountPercent.MarketDecimal
Quote.CurrentItem.MainItem.DefaultMRCDiscountPercent.MarketDisplay
Quote.CurrentItem.MainItem.MinMRCDiscountPercent.DefaultDisplay
Quote.CurrentItem.MainItem.MinMRCDiscountPercent.DefaultDecimal
Quote.CurrentItem.MainItem.MinMRCDiscountPercent.MarketDecimal
Quote.CurrentItem.MainItem.MinMRCDiscountPercent.MarketDisplay
Quote.CurrentItem.MainItem.MaxMRCDiscountPercent.DefaultDisplay
Quote.CurrentItem.MainItem.MaxMRCDiscountPercent.DefaultDecimal
Quote.CurrentItem.MainItem.MaxMRCDiscountPercent.MarketDecimal
Quote.CurrentItem.MainItem.MaxMRCDiscountPercent.MarketDisplay
Quote.CurrentItem.MainItem.DefaultMRCMultiplier.DefaultDisplay
Quote.CurrentItem.MainItem.DefaultMRCMultiplier.DefaultDecimal
Quote.CurrentItem.MainItem.DefaultMRCMultiplier.MarketDecimal
Quote.CurrentItem.MainItem.DefaultMRCMultiplier.MarketDisplay
Quote.CurrentItem.MainItem.MinMRCMultiplier.DefaultDisplay
Quote.CurrentItem.MainItem.MinMRCMultiplier.DefaultDecimal
Quote.CurrentItem.MainItem.MinMRCMultiplier.MarketDecimal
Quote.CurrentItem.MainItem.MinMRCMultiplier.MarketDisplay
Quote.CurrentItem.MainItem.MaxMRCMultiplier.DefaultDisplay
Quote.CurrentItem.MainItem.MaxMRCMultiplier.DefaultDecimal
Quote.CurrentItem.MainItem.MaxMRCMultiplier.MarketDecimal
Quote.CurrentItem.MainItem.MaxMRCMultiplier.MarketDisplay
Quote.CurrentItem.MainItem.UpfrontPercent.DefaultDisplay
Quote.CurrentItem.MainItem.UpfrontPercent.DefaultDecimal
Quote.CurrentItem.MainItem.UpfrontPercent.MarketDecimal
Quote.CurrentItem.MainItem.UpfrontPercent.MarketDisplay
Quote.CurrentItem.MainItem.UpfrontAmount.DefaultDisplay
Quote.CurrentItem.MainItem.UpfrontAmount.DefaultDecimal
Quote.CurrentItem.MainItem.UpfrontAmount.MarketDisplay
Quote.CurrentItem.MainItem.MonthlyFeeAmount.DefaultDisplay
Quote.CurrentItem.MainItem.MonthlyFeeAmount.DefaultDecimal
Quote.CurrentItem.MainItem.MonthlyFeeAmount.MarketDecimal
Quote.CurrentItem.MainItem.MonthlyFeeAmount.MarketDisplay
Quote.CurrentItem.MainItem.CustomColumn1.DefaultDisplay
Quote.CurrentItem.MainItem.CustomColumn1.DefaultDecimal
Quote.CurrentItem.MainItem.CustomColumn1.MarketDecimal
Quote.CurrentItem.MainItem.CustomColumn1.MarketDisplay
Quote.CurrentItem.MainItem.CustomColumn2.DefaultDisplay
Quote.CurrentItem.MainItem.CustomColumn2.DefaultDecimal
Quote.CurrentItem.MainItem.CustomColumn2.MarketDecimal
Quote.CurrentItem.MainItem.CustomColumn2.MarketDisplay
Quote.CurrentItem.MainItem.CustomColumn3.DefaultDisplay
Quote.CurrentItem.MainItem.CustomColumn3.DefaultDecimal
Quote.CurrentItem.MainItem.CustomColumn3.MarketDecimal
Quote.CurrentItem.MainItem.CustomColumn3.MarketDisplay
Quote.CurrentItem.MainItem.CustomColumn4.DefaultDisplay
Quote.CurrentItem.MainItem.CustomColumn4.DefaultDecimal
Quote.CurrentItem.MainItem.CustomColumn4.MarketDecimal
Quote.CurrentItem.MainItem.CustomColumn4.MarketDisplay
Quote.CurrentItem.MainItem.CustomColumn5.DefaultDisplay
Quote.CurrentItem.MainItem.CustomColumn5.DefaultDecimal
Quote.CurrentItem.MainItem.CustomColumn5.MarketDecimal
Quote.CurrentItem.MainItem.CustomColumn5.MarketDisplay
Quote.CurrentItem.MainItem.CustomColumn6.DefaultDisplay
Quote.CurrentItem.MainItem.CustomColumn6.DefaultDecimal
Quote.CurrentItem.MainItem.CustomColumn6.MarketDecimal
Quote.CurrentItem.MainItem.CustomColumn6.MarketDisplay
Quote.CurrentItem.MainItem.ProductVersion
Quote.CurrentItem.MainItem.ExternalId
Quote.CurrentItem.MainItem.UPC
Quote.CurrentItem.MainItem.Inventory
Quote.CurrentItem.MainItem.LeadTime
Quote.CurrentItem.MainItem.FamilyCode
Quote.CurrentItem.MainItem.PRODUCT_WEIGHT
Quote.CurrentItem.MainItem.CanOverrideMinMaxValues
Quote.CurrentItem.MainItem.ItemType
Quote.CurrentItem.MainItem.BaseItem
Quote.CurrentItem.MainItem.MRCListPrice.DefaultDisplay
Quote.CurrentItem.MainItem.MRCListPrice.DefaultDecimal
Quote.CurrentItem.MainItem.MRCListPrice.MarketDecimal
Quote.CurrentItem.MainItem.MRCListPrice.MarketDisplay
Quote.CurrentItem.MainItem.MRCExtendedListPrice.DefaultDisplay
Quote.CurrentItem.MainItem.MRCExtendedListPrice.DefaultDecimal
Quote.CurrentItem.MainItem.MRCExtendedListPrice.MarketDecimal
Quote.CurrentItem.MainItem.MRCExtendedListPrice.MarketDisplay
Quote.CurrentItem.MainItem.MRCDiscountPercent.DefaultDisplay
Quote.CurrentItem.MainItem.MRCDiscountPercent.DefaultDecimal
Quote.CurrentItem.MainItem.MRCDiscountPercent.MarketDecimal
Quote.CurrentItem.MainItem.MRCDiscountPercent.MarketDisplay
Quote.CurrentItem.MainItem.MRCDiscountAmount.DefaultDisplay
Quote.CurrentItem.MainItem.MRCDiscountAmount.DefaultDecimal
Quote.CurrentItem.MainItem.MRCDiscountAmount.MarketDecimal
Quote.CurrentItem.MainItem.MRCDiscountAmount.MarketDisplay
Quote.CurrentItem.MainItem.MRCUnitDiscountAmount.DefaultDisplay
Quote.CurrentItem.MainItem.MRCUnitDiscountAmount.DefaultDecimal
Quote.CurrentItem.MainItem.MRCUnitDiscountAmount.MarketDecimal
Quote.CurrentItem.MainItem.MRCUnitDiscountAmount.MarketDisplay
Quote.CurrentItem.MainItem.MRCNetPrice.DefaultDisplay
Quote.CurrentItem.MainItem.MRCNetPrice.DefaultDecimal
Quote.CurrentItem.MainItem.MRCNetPrice.MarketDecimal
Quote.CurrentItem.MainItem.MRCNetPrice.MarketDisplay
Quote.CurrentItem.MainItem.MRCExtendedAmount.DefaultDisplay
Quote.CurrentItem.MainItem.MRCExtendedAmount.MarketDecimal
Quote.CurrentItem.MainItem.MRCExtendedAmount.MarketDisplay
Quote.CurrentItem.MainItem.MRCGrossMarginPercent.DefaultDisplay
Quote.CurrentItem.MainItem.MRCGrossMarginPercent.DefaultDecimal
Quote.CurrentItem.MainItem.MRCGrossMarginPercent.MarketDecimal
Quote.CurrentItem.MainItem.MRCGrossMarginPercent.MarketDisplay
Quote.CurrentItem.MainItem.MRCCost.DefaultDisplay
Quote.CurrentItem.MainItem.MRCCost.DefaultDecimal
Quote.CurrentItem.MainItem.MRCCost.MarketDecimal
Quote.CurrentItem.MainItem.MRCCost.MarketDisplay
Quote.CurrentItem.MainItem.MRCExtendedCost.DefaultDisplay
Quote.CurrentItem.MainItem.MRCExtendedCost.DefaultDecimal
Quote.CurrentItem.MainItem.MRCExtendedCost.MarketDecimal
Quote.CurrentItem.MainItem.MRCExtendedCost.MarketDisplay
Quote.CurrentItem.MainItem.MRCMultiplier.DefaultDisplay
Quote.CurrentItem.MainItem.MRCMultiplier.DefaultDecimal
Quote.CurrentItem.MainItem.MRCMultiplier.MarketDecimal
Quote.CurrentItem.MainItem.MRCMultiplier.MarketDisplay
Quote.CurrentItem.MainItem.MRCMultiplierAmount.DefaultDisplay
Quote.CurrentItem.MainItem.MRCMultiplierAmount.DefaultDecimal
Quote.CurrentItem.MainItem.MRCMultiplierAmount.MarketDecimal
Quote.CurrentItem.MainItem.MRCMultiplierAmount.MarketDisplay
Quote.CurrentItem.MainItem.MRCUnitMultiplierAmount.DefaultDisplay
Quote.CurrentItem.MainItem.MRCUnitMultiplierAmount.DefaultDecimal
Quote.CurrentItem.MainItem.MRCUnitMultiplierAmount.MarketDecimal
Quote.CurrentItem.MainItem.MRCUnitMultiplierAmount.MarketDisplay
Quote.CurrentItem.MainItem.MRCChannelMarkupPercent.DefaultDisplay
Quote.CurrentItem.MainItem.MRCChannelMarkupPercent.DefaultDecimal
Quote.CurrentItem.MainItem.MRCChannelMarkupPercent.MarketDecimal
Quote.CurrentItem.MainItem.MRCChannelMarkupPercent.MarketDisplay
Quote.CurrentItem.MainItem.MRCChannelMarkupAmount.DefaultDisplay
Quote.CurrentItem.MainItem.MRCChannelMarkupAmount.DefaultDecimal
Quote.CurrentItem.MainItem.MRCChannelMarkupAmount.MarketDisplay
Quote.CurrentItem.MainItem.MRCChannelMarginPercent.DefaultDisplay
Quote.CurrentItem.MainItem.MRCChannelMarginPercent.DefaultDecimal
Quote.CurrentItem.MainItem.MRCChannelMarginPercent.MarketDecimal
Quote.CurrentItem.MainItem.MRCChannelMarginPercent.MarketDisplay
Quote.CurrentItem.MainItem.MRCChannelMarginAmount.DefaultDisplay
Quote.CurrentItem.MainItem.MRCChannelMarginAmount.DefaultDecimal
Quote.CurrentItem.MainItem.MRCChannelMarginAmount.MarketDecimal
Quote.CurrentItem.MainItem.MRCChannelMarginAmount.MarketDisplay
Quote.CurrentItem.MainItem.MRCEndUserNet.DefaultDisplay
Quote.CurrentItem.MainItem.MRCEndUserNet.DefaultDecimal
Quote.CurrentItem.MainItem.MRCEndUserNet.MarketDecimal
Quote.CurrentItem.MainItem.MRCEndUserNet.MarketDisplay
Quote.CurrentItem.MainItem.MRCEndUserExtendedAmount.DefaultDisplay
Quote.CurrentItem.MainItem.MRCEndUserExtendedAmount.DefaultDecimal
Quote.CurrentItem.MainItem.MRCEndUserExtendedAmount.MarketDecimal
Quote.CurrentItem.MainItem.MRCEndUserExtendedAmount.MarketDisplay
Quote.CurrentItem.MainItem.CartItemGuid
Quote.CurrentItem.MainItem.BaseItemGuid
Quote.CurrentItem.MainItem.KeyAttribute().Rank
Quote.CurrentItem.MainItem.KeyAttribute().Label
Quote.CurrentItem.MainItem.KeyAttribute().Value
Quote.CurrentItem.MainItem.Attribute().Value
Quote.CurrentItem.CustomField
Quote.CurrentSection.HierarchyId
Quote.CurrentSection.Rank
Quote.CurrentSection.Name
Quote.CurrentSection.CustomField(CustomFieldName
Quote.Section.Total.CustomField(CustomFieldName
Quote.HasIncompleteItems
Quote.Total.CartComment
Quote.Total.TotalOptionalItems.DefaultDecimal
Quote.Total.TotalProductModelPrice.DefaultDecimal
Quote.Total.TotalProductModelPrice.MarketDecimal
Quote.Total.TotalProductModelPrice.MarketDisplay
Quote.Total.TotalPromoDiscountAmount.DefaultDisplay
Quote.Total.TotalPromoDiscountAmount.DefaultDecimal
Quote.Total.TotalPromoDiscountAmount.MarketDecimal
Quote.Total.TotalPromoDiscountAmount.MarketDisplay
Quote.Total.AveragePromoDiscountPercent.DefaultDisplay
Quote.Total.AveragePromoDiscountPercent.DefaultDecimal
Quote.Total.AveragePromoDiscountPercent.MarketDecimal
Quote.Total.AveragePromoDiscountPercent.MarketDisplay
Quote.Total.TotalListPrice.DefaultDisplay
Quote.Total.TotalListPrice.DefaultDecimal
Quote.Total.TotalListPrice.MarketDecimal
Quote.Total.TotalListPrice.MarketDisplay
Quote.Total.TotalNetPrice.DefaultDisplay
Quote.Total.TotalNetPrice.DefaultDecimal
Quote.Total.TotalNetPrice.MarketDecimal
Quote.Total.TotalNetPrice.MarketDisplay
Quote.Total.AverageProductDiscountPercent.DefaultDisplay
Quote.Total.AverageProductDiscountPercent.DefaultDecimal
Quote.Total.AverageProductDiscountPercent.MarketDecimal
Quote.Total.AverageProductDiscountPercent.MarketDisplay
Quote.Total.TotalProductDiscountAmount.DefaultDisplay
Quote.Total.TotalProductDiscountAmount.DefaultDecimal
Quote.Total.TotalProductDiscountAmount.MarketDecimal
Quote.Total.TotalProductDiscountAmount.MarketDisplay
Quote.Total.AverageProductMultiplier.DefaultDisplay
Quote.Total.AverageProductMultiplier.DefaultDecimal
Quote.Total.AverageProductMultiplier.MarketDecimal
Quote.Total.AverageProductMultiplier.MarketDisplay
Quote.Total.TotalProductMultiplierAmount.DefaultDisplay
Quote.Total.TotalProductMultiplierAmount.MarketDecimal
Quote.Total.TotalProductMultiplierAmount.MarketDisplay
Quote.Total.AdditionalMultiplier.DefaultDisplay
Quote.Total.AdditionalMultiplier.DefaultDecimal
Quote.Total.AdditionalMultiplier.MarketDecimal
Quote.Total.AdditionalMultiplier.MarketDisplay
Quote.Total.AdditionalMultiplierAmount.DefaultDisplay
Quote.Total.AdditionalMultiplierAmount.DefaultDecimal
Quote.Total.AdditionalMultiplierAmount.MarketDecimal
Quote.Total.AdditionalMultiplierAmount.MarketDisplay
Quote.Total.OverallDiscountPercent.DefaultDisplay
Quote.Total.OverallDiscountPercent.DefaultDecimal
Quote.Total.OverallDiscountPercent.MarketDecimal
Quote.Total.OverallDiscountPercent.MarketDisplay
Quote.Total.OverallDiscountAmount.DefaultDisplay
Quote.Total.OverallDiscountAmount.DefaultDecimal
Quote.Total.OverallDiscountAmount.MarketDecimal
Quote.Total.OverallDiscountAmount.MarketDisplay
Quote.Total.SubTotalAmount.DefaultDisplay
Quote.Total.SubTotalAmount.DefaultDecimal
Quote.Total.SubTotalAmount.MarketDecimal
Quote.Total.SubTotalAmount.MarketDisplay
Quote.Total.ChannelMarkupPercent.DefaultDisplay
Quote.Total.ChannelMarkupPercent.DefaultDecimal
Quote.Total.ChannelMarkupPercent.MarketDecimal
Quote.Total.ChannelMarkupPercent.MarketDisplay
Quote.Total.ChannelMarkupAmount.DefaultDisplay
Quote.Total.ChannelMarkupAmount.DefaultDecimal
Quote.Total.ChannelMarkupAmount.MarketDecimal
Quote.Total.ChannelMarkupAmount.MarketDisplay
Quote.Total.EndUserSubTotalAmount.DefaultDisplay
Quote.Total.EndUserSubTotalAmount.DefaultDecimal
Quote.Total.EndUserSubTotalAmount.MarketDisplay
Quote.Total.Cost.DefaultDisplay
Quote.Total.Cost.DefaultDecimal
Quote.Total.Cost.MarketDecimal
Quote.Total.Cost.MarketDisplay
Quote.Total.GrossMarginPercent.DefaultDisplay
Quote.Total.GrossMarginPercent.DefaultDecimal
Quote.Total.GrossMarginPercent.MarketDecimal
Quote.Total.GrossMarginPercent.MarketDisplay
Quote.Total.GrossMarginAmount.DefaultDisplay
Quote.Total.GrossMarginAmount.DefaultDecimal
Quote.Total.GrossMarginAmount.MarketDecimal
Quote.Total.GrossMarginAmount.MarketDisplay
Quote.Total.MarginHealthColor
Quote.Total.MarginHealthImage
Quote.Total.MRCMarginHealthColor
Quote.Total.MRCMarginHealthImage
Quote.Total.ChannelCost.DefaultDisplay
Quote.Total.ChannelCost.DefaultDecimal
Quote.Total.ChannelCost.MarketDecimal
Quote.Total.ChannelCost.MarketDisplay
Quote.Total.ChannelGrossMarginPercent.DefaultDisplay
Quote.Total.ChannelGrossMarginPercent.DefaultDecimal
Quote.Total.ChannelGrossMarginPercent.MarketDecimal
Quote.Total.ChannelGrossMarginPercent.MarketDisplay
Quote.Total.ChannelGrossMarginAmount.DefaultDisplay
Quote.Total.ChannelGrossMarginAmount.DefaultDecimal
Quote.Total.ChannelGrossMarginAmount.MarketDecimal
Quote.Total.ChannelGrossMarginAmount.MarketDisplay
Quote.Total.ChannelCommisionPercent.DefaultDisplay
Quote.Total.ChannelCommisionPercent.DefaultDecimal
Quote.Total.ChannelCommisionPercent.MarketDecimal
Quote.Total.ChannelCommisionAmount.DefaultDisplay
Quote.Total.ChannelCommisionAmount.DefaultDecimal
Quote.Total.ChannelCommisionAmount.MarketDecimal
Quote.Total.ChannelCommisionAmount.MarketDisplay
Quote.Total.UserCommisionPercent.DefaultDisplay
Quote.Total.UserCommisionPercent.DefaultDecimal
Quote.Total.UserCommisionPercent.MarketDecimal
Quote.Total.UserCommisionPercent.MarketDisplay
Quote.Total.UserCommisionAmount.DefaultDisplay
Quote.Total.UserCommisionAmount.DefaultDecimal
Quote.Total.UserCommisionAmount.MarketDecimal
Quote.Total.UserCommisionAmount.MarketDisplay
Quote.Total.ShippingStaticPrice.DefaultDisplay
Quote.Total.ShippingStaticPrice.DefaultDecimal
Quote.Total.ShippingStaticPrice.MarketDecimal
Quote.Total.ShippingStaticPrice.MarketDisplay
Quote.Total.ShippingCost.DefaultDisplay
Quote.Total.ShippingCost.DefaultDecimal
Quote.Total.ShippingCost.MarketDecimal
Quote.Total.ShippingCost.MarketDisplay
Quote.Total.TaxPercent.DefaultDisplay
Quote.Total.TaxPercent.DefaultDecimal
Quote.Total.TaxPercent.MarketDecimal
Quote.Total.TaxPercent.MarketDisplay
Quote.Total.TaxAmount.DefaultDisplay
Quote.Total.TaxAmount.DefaultDecimal
Quote.Total.TaxAmount.MarketDecimal
Quote.Total.TaxAmount.MarketDisplay
Quote.Total.VatPercent.DefaultDisplay
Quote.Total.VatPercent.DefaultDecimal
Quote.Total.VatPercent.MarketDecimal
Quote.Total.VatPercent.MarketDisplay
Quote.Total.VatAmount.DefaultDecimal
Quote.Total.VatAmount.MarketDecimal
Quote.Total.VatAmount.MarketDisplay
Quote.Total.TotalAmount.DefaultDisplay
Quote.Total.TotalAmount.DefaultDecimal
Quote.Total.TotalAmount.MarketDecimal
Quote.Total.TotalAmount.MarketDisplay
Quote.Total.TotalWeight.DefaultDisplay
Quote.Total.TotalWeight.DefaultDecimal
Quote.Total.TotalWeight.MarketDecimal
Quote.Total.TotalWeight.MarketDisplay
Quote.Total.TotalUpfrontAmount.DefaultDisplay
Quote.Total.TotalUpfrontAmount.DefaultDecimal
Quote.Total.TotalUpfrontAmount.MarketDecimal
Quote.Total.TotalUpfrontAmount.MarketDisplay
Quote.Total.TotalMonthlyFeeAmount.DefaultDisplay
Quote.Total.TotalMonthlyFeeAmount.DefaultDecimal
Quote.Total.TotalMonthlyFeeAmount.MarketDecimal
Quote.Total.TotalMonthlyFeeAmount.MarketDisplay
Quote.Total.NumberOfPayments
Quote.Total.TotalCustomColumn1.DefaultDisplay
Quote.Total.TotalCustomColumn1.DefaultDecimal
Quote.Total.TotalCustomColumn1.MarketDecimal
Quote.Total.TotalCustomColumn1.MarketDisplay
Quote.Total.TotalCustomColumn2.DefaultDisplay
Quote.Total.TotalCustomColumn2.DefaultDecimal
Quote.Total.TotalCustomColumn2.MarketDecimal
Quote.Total.TotalCustomColumn2.MarketDisplay
Quote.Total.TotalCustomColumn3.DefaultDisplay
Quote.Total.TotalCustomColumn3.DefaultDecimal
Quote.Total.TotalCustomColumn3.MarketDecimal
Quote.Total.TotalCustomColumn3.MarketDisplay
Quote.Total.TotalCustomColumn4.DefaultDecimal
Quote.Total.TotalCustomColumn4.MarketDecimal
Quote.Total.TotalCustomColumn4.MarketDisplay
Quote.Total.TotalCustomColumn5.DefaultDisplay
Quote.Total.TotalCustomColumn5.DefaultDecimal
Quote.Total.TotalCustomColumn5.MarketDecimal
Quote.Total.TotalCustomColumn5.MarketDisplay
Quote.Total.TotalCustomColumn6.DefaultDisplay
Quote.Total.TotalCustomColumn6.DefaultDecimal
Quote.Total.TotalCustomColumn6.MarketDecimal
Quote.Total.TotalCustomColumn6.MarketDisplay
Quote.Total.TotalVariantItems.DefaultDisplay
Quote.Total.TotalVariantItems.DefaultDecimal
Quote.Total.TotalVariantItems.MarketDecimal
Quote.Total.TotalVariantItems.MarketDisplay
Quote.Total.MonthlyFee.DefaultDisplay
Quote.Total.MonthlyFee.DefaultDecimal
Quote.Total.MonthlyFee.MarketDecimal
Quote.Total.MonthlyFee.MarketDisplay
Quote.Total.TotalMRCListPrice.DefaultDisplay
Quote.Total.TotalMRCListPrice.DefaultDecimal
Quote.Total.TotalMRCListPrice.MarketDecimal
Quote.Total.TotalMRCListPrice.MarketDisplay
Quote.Total.TotalMRCNetPrice.DefaultDisplay
Quote.Total.TotalMRCNetPrice.DefaultDecimal
Quote.Total.TotalMRCNetPrice.MarketDecimal
Quote.Total.TotalMRCNetPrice.MarketDisplay
Quote.Total.AverageMRCProductDiscountPercent.DefaultDisplay
Quote.Total.AverageMRCProductDiscountPercent.DefaultDecimal
Quote.Total.AverageMRCProductDiscountPercent.MarketDecimal
Quote.Total.AverageMRCProductDiscountPercent.MarketDisplay
Quote.Total.TotalMRCProductDiscountAmount.DefaultDisplay
Quote.Total.TotalMRCProductDiscountAmount.MarketDecimal
Quote.Total.TotalMRCProductDiscountAmount.MarketDisplay
Quote.Total.AverageMRCProductMultiplier.DefaultDisplay
Quote.Total.AverageMRCProductMultiplier.DefaultDecimal
Quote.Total.AverageMRCProductMultiplier.MarketDecimal
Quote.Total.AverageMRCProductMultiplier.MarketDisplay
Quote.Total.TotalMRCProductMultiplierAmount.DefaultDisplay
Quote.Total.TotalMRCProductMultiplierAmount.DefaultDecimal
Quote.Total.TotalMRCProductMultiplierAmount.MarketDecimal
Quote.Total.TotalMRCProductMultiplierAmount.MarketDisplay
Quote.Total.MRCSubTotalAmount.DefaultDisplay
Quote.Total.MRCSubTotalAmount.DefaultDecimal
Quote.Total.MRCSubTotalAmount.MarketDecimal
Quote.Total.MRCSubTotalAmount.MarketDisplay
Quote.Total.TotalMRCChannelMarkupPercent.DefaultDisplay
Quote.Total.TotalMRCChannelMarkupPercent.DefaultDecimal
Quote.Total.TotalMRCChannelMarkupPercent.MarketDecimal
Quote.Total.TotalMRCChannelMarkupPercent.MarketDisplay
Quote.Total.TotalMRCChannelMarkupAmount.DefaultDisplay
Quote.Total.TotalMRCChannelMarkupAmount.DefaultDecimal
Quote.Total.TotalMRCChannelMarkupAmount.MarketDecimal
Quote.Total.TotalMRCChannelMarkupAmount.MarketDisplay
Quote.Total.TotalMRCCost.DefaultDisplay
Quote.Total.TotalMRCCost.DefaultDecimal
Quote.Total.TotalMRCCost.MarketDecimal
Quote.Total.TotalMRCCost.MarketDisplay
Quote.Total.TotalMRCGrossMarginPercent.DefaultDisplay
Quote.Total.TotalMRCGrossMarginPercent.DefaultDecimal
Quote.Total.TotalMRCGrossMarginPercent.MarketDecimal
Quote.Total.TotalMRCGrossMarginPercent.MarketDisplay
Quote.Total.TotalMRCGrossMarginAmount.DefaultDisplay
Quote.Total.TotalMRCGrossMarginAmount.DefaultDecimal
Quote.Total.TotalMRCGrossMarginAmount.MarketDisplay
Quote.Total.TotalMRCChannelCost.DefaultDisplay
Quote.Total.TotalMRCChannelCost.DefaultDecimal
Quote.Total.TotalMRCChannelCost.MarketDecimal
Quote.Total.TotalMRCChannelCost.MarketDisplay
Quote.Total.TotalMRCChannelGrossMarginPercent.DefaultDisplay
Quote.Total.TotalMRCChannelGrossMarginPercent.DefaultDecimal
Quote.Total.TotalMRCChannelGrossMarginPercent.MarketDecimal
Quote.Total.TotalMRCChannelGrossMarginPercent.MarketDisplay
Quote.Total.TotalMRCChannelGrossMarginAmount.DefaultDisplay
Quote.Total.TotalMRCChannelGrossMarginAmount.DefaultDecimal
Quote.Total.TotalMRCChannelGrossMarginAmount.MarketDecimal
Quote.Total.TotalMRCChannelGrossMarginAmount.MarketDisplay
Quote.Total.OverallMRCDiscountPercent.DefaultDisplay
Quote.Total.OverallMRCDiscountPercent.DefaultDecimal
Quote.Total.OverallMRCDiscountPercent.MarketDecimal
Quote.Total.OverallMRCDiscountPercent.MarketDisplay
Quote.Total.OverallMRCDiscountAmount.DefaultDisplay
Quote.Total.OverallMRCDiscountAmount.DefaultDecimal
Quote.Total.OverallMRCDiscountAmount.MarketDecimal
Quote.Total.OverallMRCDiscountAmount.MarketDisplay
Quote.Total.MRCEndUserSubTotalAmount.DefaultDisplay
Quote.Total.MRCEndUserSubTotalAmount.DefaultDecimal
Quote.Total.MRCEndUserSubTotalAmount.MarketDecimal
Quote.Total.MRCEndUserSubTotalAmount.MarketDisplay
Quote.Total.MRCTaxAmount.DefaultDisplay
Quote.Total.MRCTaxAmount.DefaultDecimal
Quote.Total.MRCTaxAmount.MarketDecimal
Quote.Total.MRCTaxAmount.MarketDisplay
Quote.Total.MRCVatAmount.DefaultDisplay
Quote.Total.MRCVatAmount.DefaultDecimal
Quote.Total.MRCVatAmount.MarketDecimal
Quote.Total.MRCTotalAmount.DefaultDisplay
Quote.Total.MRCTotalAmount.DefaultDecimal
Quote.Total.MRCTotalAmount.MarketDecimal
Quote.Total.MRCTotalAmount.MarketDisplay
Quote.ProductType().ProductTypeName
Quote.ProductType().ProductTypeRank
Quote.ProductType().ProductTypeId
Quote.ProductType().ProductModelSubTotal.DefaultDisplay
Quote.ProductType().ProductModelSubTotal.DefaultDecimal
Quote.ProductType().ProductModelSubTotal.MarketDecimal
Quote.ProductType().ProductModelSubTotal.MarketDisplay
Quote.ProductType().PromoDiscountAmount.DefaultDisplay
Quote.ProductType().PromoDiscountAmount.DefaultDecimal
Quote.ProductType().PromoDiscountAmount.MarketDecimal
Quote.ProductType().PromoDiscountAmount.MarketDisplay
Quote.ProductType().PromoDiscountPercent.DefaultDisplay
Quote.ProductType().PromoDiscountPercent.DefaultDecimal
Quote.ProductType().PromoDiscountPercent.MarketDecimal
Quote.ProductType().PromoDiscountPercent.MarketDisplay
Quote.ProductType().ListSubTotal.DefaultDisplay
Quote.ProductType().ListSubTotal.DefaultDecimal
Quote.ProductType().ListSubTotal.MarketDecimal
Quote.ProductType().ListSubTotal.MarketDisplay
Quote.ProductType().Multiplier.DefaultDisplay
Quote.ProductType().Multiplier.DefaultDecimal
Quote.ProductType().Multiplier.MarketDecimal
Quote.ProductType().Multiplier.MarketDisplay
Quote.ProductType().MultiplierAmount.DefaultDisplay
Quote.ProductType().MultiplierAmount.DefaultDecimal
Quote.ProductType().MultiplierAmount.MarketDecimal
Quote.ProductType().MultiplierAmount.MarketDisplay
Quote.ProductType().DiscountPercent.DefaultDisplay
Quote.ProductType().DiscountPercent.MarketDecimal
Quote.ProductType().DiscountPercent.MarketDisplay
Quote.ProductType().DiscountAmount.DefaultDisplay
Quote.ProductType().DiscountAmount.DefaultDecimal
Quote.ProductType().DiscountAmount.MarketDecimal
Quote.ProductType().DiscountAmount.MarketDisplay
Quote.ProductType().SubTotal.DefaultDisplay
Quote.ProductType().SubTotal.DefaultDecimal
Quote.ProductType().SubTotal.MarketDecimal
Quote.ProductType().SubTotal.MarketDisplay
Quote.ProductType().ChannelMarkupPercent.DefaultDisplay
Quote.ProductType().ChannelMarkupPercent.DefaultDecimal
Quote.ProductType().ChannelMarkupPercent.MarketDecimal
Quote.ProductType().ChannelMarkupPercent.MarketDisplay
Quote.ProductType().ChannelMarkupAmount.DefaultDisplay
Quote.ProductType().ChannelMarkupAmount.DefaultDecimal
Quote.ProductType().ChannelMarkupAmount.MarketDecimal
Quote.ProductType().ChannelMarkupAmount.MarketDisplay
Quote.ProductType().EndUserSubTotal.DefaultDisplay
Quote.ProductType().EndUserSubTotal.DefaultDecimal
Quote.ProductType().EndUserSubTotal.MarketDecimal
Quote.ProductType().EndUserSubTotal.MarketDisplay
Quote.ProductType().ChannelCommisionPercent.DefaultDisplay
Quote.ProductType().ChannelCommisionPercent.DefaultDecimal
Quote.ProductType().ChannelCommisionPercent.MarketDecimal
Quote.ProductType().ChannelCommisionPercent.MarketDisplay
Quote.ProductType().ChannelCommisionAmount.DefaultDisplay
Quote.ProductType().ChannelCommisionAmount.DefaultDecimal
Quote.ProductType().ChannelCommisionAmount.MarketDecimal
Quote.ProductType().ChannelCommisionAmount.MarketDisplay
Quote.ProductType().UserCommisionPercent.DefaultDisplay
Quote.ProductType().UserCommisionPercent.DefaultDecimal
Quote.ProductType().UserCommisionPercent.MarketDisplay
Quote.ProductType().UserCommisionAmount.DefaultDisplay
Quote.ProductType().UserCommisionAmount.DefaultDecimal
Quote.ProductType().UserCommisionAmount.MarketDecimal
Quote.ProductType().UserCommisionAmount.MarketDisplay
Quote.ProductType().Cost.DefaultDisplay
Quote.ProductType().Cost.DefaultDecimal
Quote.ProductType().Cost.MarketDecimal
Quote.ProductType().Cost.MarketDisplay
Quote.ProductType().GrossMarginPercent.DefaultDisplay
Quote.ProductType().GrossMarginPercent.DefaultDecimal
Quote.ProductType().GrossMarginPercent.MarketDecimal
Quote.ProductType().GrossMarginPercent.MarketDisplay
Quote.ProductType().GrossMarginAmount.DefaultDisplay
Quote.ProductType().GrossMarginAmount.DefaultDecimal
Quote.ProductType().GrossMarginAmount.MarketDecimal
Quote.ProductType().GrossMarginAmount.MarketDisplay
Quote.ProductType().ChannelCost.DefaultDisplay
Quote.ProductType().ChannelCost.DefaultDecimal
Quote.ProductType().ChannelCost.MarketDecimal
Quote.ProductType().ChannelCost.MarketDisplay
Quote.ProductType().ChannelGrossMarginPercent.DefaultDisplay
Quote.ProductType().ChannelGrossMarginPercent.DefaultDecimal
Quote.ProductType().ChannelGrossMarginPercent.MarketDecimal
Quote.ProductType().ChannelGrossMarginPercent.MarketDisplay
Quote.ProductType().ChannelGrossMarginAmount.DefaultDisplay
Quote.ProductType().ChannelGrossMarginAmount.DefaultDecimal
Quote.ProductType().ChannelGrossMarginAmount.MarketDecimal
Quote.ProductType().ChannelGrossMarginAmount.MarketDisplay
Quote.ProductType().MarginHealthColor
Quote.ProductType().MarginHealthImage
Quote.ProductType().MRCMarginHealthColor
Quote.ProductType().DefaultDiscountPercent.DefaultDisplay
Quote.ProductType().DefaultDiscountPercent.DefaultDecimal
Quote.ProductType().DefaultDiscountPercent.MarketDecimal
Quote.ProductType().DefaultDiscountPercent.MarketDisplay
Quote.ProductType().MinDiscountPercent.DefaultDisplay
Quote.ProductType().MinDiscountPercent.DefaultDecimal
Quote.ProductType().MinDiscountPercent.MarketDecimal
Quote.ProductType().MinDiscountPercent.MarketDisplay
Quote.ProductType().MaxDiscountPercent.DefaultDisplay
Quote.ProductType().MaxDiscountPercent.DefaultDecimal
Quote.ProductType().MaxDiscountPercent.MarketDecimal
Quote.ProductType().MaxDiscountPercent.MarketDisplay
Quote.ProductType().DefaultMultiplier.DefaultDisplay
Quote.ProductType().DefaultMultiplier.DefaultDecimal
Quote.ProductType().DefaultMultiplier.MarketDecimal
Quote.ProductType().DefaultMultiplier.MarketDisplay
Quote.ProductType().MinMultiplier.DefaultDisplay
Quote.ProductType().MinMultiplier.DefaultDecimal
Quote.ProductType().MinMultiplier.MarketDecimal
Quote.ProductType().MinMultiplier.MarketDisplay
Quote.ProductType().MaxMultiplier.DefaultDisplay
Quote.ProductType().MaxMultiplier.DefaultDecimal
Quote.ProductType().MaxMultiplier.MarketDecimal
Quote.ProductType().MaxMultiplier.MarketDisplay
Quote.ProductType().DefaultMRCDiscountPercent.DefaultDisplay
Quote.ProductType().DefaultMRCDiscountPercent.DefaultDecimal
Quote.ProductType().DefaultMRCDiscountPercent.MarketDecimal
Quote.ProductType().DefaultMRCDiscountPercent.MarketDisplay
Quote.ProductType().MinMRCDiscountPercent.DefaultDisplay
Quote.ProductType().MinMRCDiscountPercent.DefaultDecimal
Quote.ProductType().MinMRCDiscountPercent.MarketDecimal
Quote.ProductType().MinMRCDiscountPercent.MarketDisplay
Quote.ProductType().MaxMRCDiscountPercent.DefaultDecimal
Quote.ProductType().MaxMRCDiscountPercent.MarketDecimal
Quote.ProductType().MaxMRCDiscountPercent.MarketDisplay
Quote.ProductType().DefaultMRCMultiplier.DefaultDisplay
Quote.ProductType().DefaultMRCMultiplier.DefaultDecimal
Quote.ProductType().DefaultMRCMultiplier.MarketDecimal
Quote.ProductType().DefaultMRCMultiplier.MarketDisplay
Quote.ProductType().MinMRCMultiplier.DefaultDisplay
Quote.ProductType().MinMRCMultiplier.DefaultDecimal
Quote.ProductType().MinMRCMultiplier.MarketDecimal
Quote.ProductType().MinMRCMultiplier.MarketDisplay
Quote.ProductType().MaxMRCMultiplier.DefaultDisplay
Quote.ProductType().MaxMRCMultiplier.DefaultDecimal
Quote.ProductType().MaxMRCMultiplier.MarketDecimal
Quote.ProductType().MaxMRCMultiplier.MarketDisplay
Quote.ProductType().CanOverrideMinMaxValues
Quote.ProductType().CustomColumn1.DefaultDisplay
Quote.ProductType().CustomColumn1.DefaultDecimal
Quote.ProductType().CustomColumn1.MarketDecimal
Quote.ProductType().CustomColumn1.MarketDisplay
Quote.ProductType().CustomColumn2.DefaultDisplay
Quote.ProductType().CustomColumn2.DefaultDecimal
Quote.ProductType().CustomColumn2.MarketDecimal
Quote.ProductType().CustomColumn2.MarketDisplay
Quote.ProductType().CustomColumn3.DefaultDisplay
Quote.ProductType().CustomColumn3.DefaultDecimal
Quote.ProductType().CustomColumn3.MarketDecimal
Quote.ProductType().CustomColumn3.MarketDisplay
Quote.ProductType().CustomColumn4.DefaultDisplay
Quote.ProductType().CustomColumn4.DefaultDecimal
Quote.ProductType().CustomColumn4.MarketDecimal
Quote.ProductType().CustomColumn4.MarketDisplay
Quote.ProductType().CustomColumn5.DefaultDecimal
Quote.ProductType().CustomColumn5.MarketDecimal
Quote.ProductType().CustomColumn5.MarketDisplay
Quote.ProductType().CustomColumn6.DefaultDisplay
Quote.ProductType().CustomColumn6.DefaultDecimal
Quote.ProductType().CustomColumn6.MarketDecimal
Quote.ProductType().CustomColumn6.MarketDisplay
Quote.ProductType().MRCListSubTotal.DefaultDisplay
Quote.ProductType().MRCListSubTotal.DefaultDecimal
Quote.ProductType().MRCListSubTotal.MarketDecimal
Quote.ProductType().MRCListSubTotal.MarketDisplay
Quote.ProductType().MRCCost.DefaultDisplay
Quote.ProductType().MRCCost.DefaultDecimal
Quote.ProductType().MRCCost.MarketDecimal
Quote.ProductType().MRCCost.MarketDisplay
Quote.ProductType().MRCDiscountPercent.DefaultDisplay
Quote.ProductType().MRCDiscountPercent.DefaultDecimal
Quote.ProductType().MRCDiscountPercent.MarketDecimal
Quote.ProductType().MRCDiscountPercent.MarketDisplay
Quote.ProductType().MRCDiscountAmount.DefaultDisplay
Quote.ProductType().MRCDiscountAmount.DefaultDecimal
Quote.ProductType().MRCDiscountAmount.MarketDecimal
Quote.ProductType().MRCDiscountAmount.MarketDisplay
Quote.ProductType().MRCMultiplier.DefaultDisplay
Quote.ProductType().MRCMultiplier.DefaultDecimal
Quote.ProductType().MRCMultiplier.MarketDecimal
Quote.ProductType().MRCMultiplier.MarketDisplay
Quote.ProductType().MRCMultiplierAmount.DefaultDisplay
Quote.ProductType().MRCMultiplierAmount.DefaultDecimal
Quote.ProductType().MRCMultiplierAmount.MarketDecimal
Quote.ProductType().MRCMultiplierAmount.MarketDisplay
Quote.ProductType().MRCSubTotal.DefaultDisplay
Quote.ProductType().MRCSubTotal.MarketDecimal
Quote.ProductType().MRCSubTotal.MarketDisplay
Quote.ProductType().MRCGrossMarginPercent.DefaultDisplay
Quote.ProductType().MRCGrossMarginPercent.DefaultDecimal
Quote.ProductType().MRCGrossMarginPercent.MarketDecimal
Quote.ProductType().MRCGrossMarginPercent.MarketDisplay
Quote.ProductType().MRCGrossMarginAmount.DefaultDisplay
Quote.ProductType().MRCGrossMarginAmount.DefaultDecimal
Quote.ProductType().MRCGrossMarginAmount.MarketDecimal
Quote.ProductType().MRCGrossMarginAmount.MarketDisplay
Quote.ProductType().MRCChannelMarkupPercent.DefaultDisplay
Quote.ProductType().MRCChannelMarkupPercent.DefaultDecimal
Quote.ProductType().MRCChannelMarkupPercent.MarketDecimal
Quote.ProductType().MRCChannelMarkupPercent.MarketDisplay
Quote.ProductType().MRCChannelMarkupAmount.DefaultDisplay
Quote.ProductType().MRCChannelMarkupAmount.DefaultDecimal
Quote.ProductType().MRCChannelMarkupAmount.MarketDecimal
Quote.ProductType().MRCChannelMarkupAmount.MarketDisplay
Quote.ProductType().MRCChannelGrossMarginPercent.DefaultDisplay
Quote.ProductType().MRCChannelGrossMarginPercent.DefaultDecimal
Quote.ProductType().MRCChannelGrossMarginPercent.MarketDecimal
Quote.ProductType().MRCChannelGrossMarginPercent.MarketDisplay
Quote.ProductType().MRCEndUserSubTotal.DefaultDisplay
Quote.ProductType().MRCEndUserSubTotal.DefaultDecimal
Quote.ProductType().MRCEndUserSubTotal.MarketDecimal
Quote.ProductType().MRCEndUserSubTotal.MarketDisplay
Quote.AdditionalDiscount().Description
Quote.AdditionalDiscount().DiscountAmount.DefaultDisplay
Quote.AdditionalDiscount().DiscountAmount.DefaultDecimal
Quote.AdditionalDiscount().DiscountAmount.MarketDecimal
Quote.AdditionalDiscount().DiscountAmount.MarketDisplay
Quote.CustomField()
Quote.CustomField().AddDays()
Quote.CustomField().AddDays().Format()
Quote.CustomField().AddDays().InUSDateFormat
Quote.CustomField().AddMonths()
Quote.CustomField().AddMonths().Format()
Quote.CustomField().AddMonths().InUSDateFormat
Quote.CustomField().AddYears()
Quote.CustomField().AddYears().Format()
Quote.CustomField().AddYears().InUSDateFormat
Quote.CustomField().InUSDateFormat
Quote.CustomField().AttrValue
Quote.CustomField().AttrValueCode
Quote.Customer().CustomerId
Quote.Customer().ShopCartId
Quote.Customer().UserId
Quote.Customer().CustomerCode
Quote.Customer().CRMAccountId
Quote.Customer().CRMContactId
Quote.Customer().DirtyFlag
Quote.Customer().RevisionNumber
Quote.Customer().FirstName
Quote.Customer().LastName
Quote.Customer().Company
Quote.Customer().Address1
Quote.Customer().Address2
Quote.Customer().City
Quote.Customer().StateAbbrev
Quote.Customer().ZipCode
Quote.Customer().CountryAbbrev
Quote.Customer().TerritoryId
Quote.Customer().TerritoryName
Quote.Customer().BusinessPhone
Quote.Customer().Email
Quote.Customer().Province
Quote.Customer().Title
Quote.Customer().OwnerName
Quote.Customer().PrimaryIndustry
Quote.Customer().CustomerPassword
Quote.Customer().CustomerType
Quote.Customer().Active
Quote.Customer().RoleType
Quote.Customer().Rank
Quote.Customer().Editable
Quote.Customer().Visible
Quote.Customer().Required
Quote.Customer().IsPersonal
Quote.Customer().CustomField()
Quote.Revision.CartId
Quote.Revision.Description
Quote.Revision.MasterId
Quote.Revision.Name
Quote.Revision.RevisionNumber
Quote.Opportunity.Id
Quote.Opportunity.Name
Quote.Status.Id
Quote.Status.Name
Quote.Status.NameDefaultLanguage
Quote.SelectedMarket.MarketName
Quote.SelectedMarket.MarketId
Quote.SelectedMarket.MarketFactor.DefaultDisplay
Quote.SelectedMarket.MarketFactor.DefaultDecimal
Quote.SelectedMarket.MarketFactor.MarketDecimal
Quote.SelectedMarket.MarketFactor.MarketDisplay
Quote.SelectedMarket.ForwardCurrencyRate.DefaultDisplay
Quote.SelectedMarket.ForwardCurrencyRate.MarketDecimal
Quote.SelectedMarket.ForwardCurrencyRate.MarketDisplay
Quote.SelectedMarket.MarketCode
Quote.SelectedMarket.CurrencyCode
Quote.SelectedMarket.CurrencyQuote.DefaultDisplay
Quote.SelectedMarket.CurrencyQuote.DefaultDecimal
Quote.SelectedMarket.CurrencyQuote.MarketDecimal
Quote.SelectedMarket.CurrencyQuote.MarketDisplay
Quote.SelectedMarket.CurrencyDescription
Quote.SelectedMarket.CurrencySign
Quote.SelectedMarket.CurrencyDefault
Quote.SelectedMarket.Selected
Quote.SelectedShipping.ShippingName
Quote.SelectedShipping.ShippingId
Quote.SelectedShipping.StaticCostFormula
Quote.SelectedShipping.ShippingErrorMessage
Quote.SelectedShipping.Selected
Quote.SelectedShipping.Editable
Quote.CRMObject().Id
Quote.CRMObject().Name
Quote.Link.Crypted
Quote.Link.CustomerAcceptance
Quote.CountOfMainItems
Quote.CountOfAllItems
Quote.DocumentFormat
Quote.DocumentTemplateName
Quote.DateOrdered
Quote.DateOrdered.Format()
Quote.DateOrdered.AddDays()
Quote.DateOrdered.AddDays().Format()
Quote.DateOrdered.AddDays().InUSDateFormat
Quote.DateOrdered.AddMonths()
Quote.DateOrdered.AddMonths().InUSDateFormat
Quote.DateOrdered.AddYears()
Quote.DateOrdered.AddYears().Format()
Quote.DateOrdered.AddYears().InUSDateFormat
Quote.DateClosed
Quote.DateClosed.Format()
Quote.DateClosed.AddDays()
Quote.DateClosed.AddDays().Format()
Quote.DateClosed.AddDays().InUSDateFormat
Quote.DateClosed.AddMonths()
Quote.DateClosed.AddMonths().Format()
Quote.DateClosed.AddMonths().InUSDateFormat
Quote.DateClosed.AddYears()
Quote.DateClosed.AddYears().Format()
Quote.DateClosed.AddYears().InUSDateFormat
Quote.DateCreated
Quote.DateCreated.Format()
Quote.DateCreated.AddDays()
Quote.DateCreated.AddDays().Format()
Quote.DateCreated.AddDays().InUSDateFormat
Quote.DateCreated.AddMonths()
Quote.DateCreated.AddMonths().Format()
Quote.DateCreated.AddMonths().InUSDateFormat
Quote.DateCreated.AddYears()
Quote.DateCreated.AddYears().Format()
Quote.DateCreated.AddYears().InUSDateFormat
Quote.DateModified
Quote.DateModified.Format()
Quote.DateModified.AddDays()
Quote.DateModified.AddDays().Format()
Quote.DateModified.AddDays().InUSDateFormat
Quote.DateModified.AddMonths()
Quote.DateModified.AddMonths().InUSDateFormat
Quote.DateModified.AddYears()
Quote.DateModified.AddYears().Format()
Quote.DateModified.AddYears().InUSDateFormat
Quote.DirtyFlag
Quote.SubCartId
Quote.SubOwnerId
Quote.ActiveRevision
Quote.MarketId
Quote.MarketFactor.DefaultDisplay
Quote.MarketFactor.DefaultDecimal
Quote.MarketFactor.MarketDecimal
Quote.MarketFactor.MarketDisplay
Quote.ForwardCurrencyRate.DefaultDisplay
Quote.ForwardCurrencyRate.DefaultDecimal
Quote.ForwardCurrencyRate.MarketDecimal
Quote.ForwardCurrencyRate.MarketDisplay
Quote.GlobalsCsv
Quote.PaymentApproved
Quote.PaymentMethod
Quote.TrackingKey
Quote.LastCartXml
Quote.CRMAccountRoleId
Quote.CartId
Quote.OwnerId
Quote.TaxExempt
Quote.DiscountExceeded
Quote.CartCompositeNumber
Quote.QuoteNumber
Quote.Owner.Id
Quote.Owner.Username
Quote.Owner.Name
Quote.Owner.LastName
Quote.Owner.Email
Quote.Owner.Address1
Quote.Owner.Address2
Quote.Owner.ZipCode
Quote.Owner.City
Quote.Owner.State
Quote.Owner.Country
Quote.Owner.Phone
Quote.Owner.Fax
Quote.Owner.UserIdCode
Quote.Owner.UserCode
Quote.Owner.IsAdmin
Quote.Owner.Brand
Quote.Owner.EffectiveDate
Quote.Owner.CustomField()
Quote.Owner.UserType.Id
Quote.Owner.UserType.Name
Quote.Owner.Company.Id
Quote.Owner.Company.Name
Quote.Owner.Company.Address1
Quote.Owner.Company.Address2
Quote.Owner.Company.City
Quote.Owner.Company.State
Quote.Owner.Company.Province
Quote.Owner.Company.Zip
Quote.Owner.Company.Country
Quote.Owner.Company.Phone
Quote.Owner.Company.Fax
Quote.Owner.Company.Email
Quote.Owner.Company.CompanyCode
Quote.Owner.Company.ImageLogoLink
Quote.Owner.Territory.Id
Quote.Owner.Territory.Name
Quote.Owner.ManagingParent.Id
Quote.Owner.ManagingParent.Username
Quote.Owner.ManagingParent.Name
Quote.Owner.ManagingParent.FirstName
Quote.Owner.ManagingParent.LastName
Quote.Owner.ManagingParent.Email
Quote.Owner.ManagingParent.Address1
Quote.Owner.ManagingParent.Address2
Quote.Owner.ManagingParent.ZipCode
Quote.Owner.ManagingParent.City
Quote.Owner.ManagingParent.State
Quote.Owner.ManagingParent.Country
Quote.Owner.ManagingParent.Phone
Quote.Owner.ManagingParent.Fax
Quote.Owner.ManagingParent.UserIdCode
Quote.Owner.ManagingParent.UserCode
Quote.Owner.ManagingParent.IsAdmin
Quote.Owner.ManagingParent.Brand
Quote.Owner.ManagingParent.EffectiveDate
Quote.Owner.ManagingParent.CustomField()
Quote.Owner.ManagingParent.UserType.Id
Quote.Owner.ManagingParent.UserType.Name
Quote.Owner.ManagingParent.Company.Id
Quote.Owner.ManagingParent.Company.Name
Quote.Owner.ManagingParent.Company.Address1
Quote.Owner.ManagingParent.Company.Address2
Quote.Owner.ManagingParent.Company.City
Quote.Owner.ManagingParent.Company.State
Quote.Owner.ManagingParent.Company.Province
Quote.Owner.ManagingParent.Company.Zip
Quote.Owner.ManagingParent.Company.Phone
Quote.Owner.ManagingParent.Company.Fax
Quote.Owner.ManagingParent.Company.Email
Quote.Owner.ManagingParent.Company.CompanyCode
Quote.Owner.ManagingParent.Company.ImageLogoLink
Quote.Owner.ManagingParent.Company.CrmAccountId
Quote.Owner.ManagingParent.Territory.Id
Quote.Owner.ManagingParent.Territory.Name
Quote.Owner.OrderingParent.Id
Quote.Owner.OrderingParent.Username
Quote.Owner.OrderingParent.Name
Quote.Owner.OrderingParent.FirstName
Quote.Owner.OrderingParent.LastName
Quote.Owner.OrderingParent.Email
Quote.Owner.OrderingParent.Address1
Quote.Owner.OrderingParent.Address2
Quote.Owner.OrderingParent.ZipCode
Quote.Owner.OrderingParent.City
Quote.Owner.OrderingParent.State
Quote.Owner.OrderingParent.Country
Quote.Owner.OrderingParent.Phone
Quote.Owner.OrderingParent.Fax
Quote.Owner.OrderingParent.UserIdCode
Quote.Owner.OrderingParent.UserCode
Quote.Owner.OrderingParent.IsAdmin
Quote.Owner.OrderingParent.Brand
Quote.Owner.OrderingParent.EffectiveDate
Quote.Owner.OrderingParent.CustomField()
Quote.Owner.OrderingParent.UserType.Id
Quote.Owner.OrderingParent.UserType.Name
Quote.Owner.OrderingParent.Company.Id
Quote.Owner.OrderingParent.Company.Name
Quote.Owner.OrderingParent.Company.Address2
Quote.Owner.OrderingParent.Company.City
Quote.Owner.OrderingParent.Company.State
Quote.Owner.OrderingParent.Company.Province
Quote.Owner.OrderingParent.Company.Zip
Quote.Owner.OrderingParent.Company.Country
Quote.Owner.OrderingParent.Company.Phone
Quote.Owner.OrderingParent.Company.Fax
Quote.Owner.OrderingParent.Company.Email
Quote.Owner.OrderingParent.Company.CompanyCode
Quote.Owner.OrderingParent.Company.ImageLogoLink
Quote.Owner.OrderingParent.Company.CrmAccountId
Quote.Owner.OrderingParent.Territory.Id
Quote.Owner.OrderingParent.Territory.Name
Quote.Owner.ApproveParent.Id
Quote.Owner.ApproveParent.Username
Quote.Owner.ApproveParent.Name
Quote.Owner.ApproveParent.FirstName
Quote.Owner.ApproveParent.LastName
Quote.Owner.ApproveParent.Email
Quote.Owner.ApproveParent.Address1
Quote.Owner.ApproveParent.Address2
Quote.Owner.ApproveParent.ZipCode
Quote.Owner.ApproveParent.City
Quote.Owner.ApproveParent.State
Quote.Owner.ApproveParent.Country
Quote.Owner.ApproveParent.Phone
Quote.Owner.ApproveParent.Fax
Quote.Owner.ApproveParent.UserIdCode
Quote.Owner.ApproveParent.UserCode
Quote.Owner.ApproveParent.IsAdmin
Quote.Owner.ApproveParent.Brand
Quote.Owner.ApproveParent.CustomField()
Quote.Owner.ApproveParent.UserType.Id
Quote.Owner.ApproveParent.UserType.Name
Quote.Owner.ApproveParent.Company.Id
Quote.Owner.ApproveParent.Company.Name
Quote.Owner.ApproveParent.Company.Address1
Quote.Owner.ApproveParent.Company.Address2
Quote.Owner.ApproveParent.Company.City
Quote.Owner.ApproveParent.Company.State
Quote.Owner.ApproveParent.Company.Province
Quote.Owner.ApproveParent.Company.Zip
Quote.Owner.ApproveParent.Company.Country
Quote.Owner.ApproveParent.Company.Phone
Quote.Owner.ApproveParent.Company.Fax
Quote.Owner.ApproveParent.Company.Email
Quote.Owner.ApproveParent.Company.CompanyCode
Quote.Owner.ApproveParent.Company.ImageLogoLink
Quote.Owner.ApproveParent.Company.CrmAccountId
Quote.Owner.ApproveParent.Territory.Id
Quote.Owner.ApproveParent.Territory.Name
Visitor.Id
Visitor.Username
Visitor.Name
Visitor.FirstName
Visitor.LastName
Visitor.Email
Visitor.Address1
Visitor.Address2
Visitor.ZipCode
Visitor.City
Visitor.State
Visitor.Country
Visitor.Fax
Visitor.UserIdCode
Visitor.UserCode
Visitor.IsAdmin
Visitor.Brand
Visitor.EffectiveDate
Visitor.CustomField()
Visitor.UserType.Id
Visitor.UserType.Name
Visitor.Company.Id
Visitor.Company.Name
Visitor.Company.Address1
Visitor.Company.Address2
Visitor.Company.City
Visitor.Company.State
Visitor.Company.Province
Visitor.Company.Zip
Visitor.Company.Country
Visitor.Company.Phone
Visitor.Company.Fax
Visitor.Company.Email
Visitor.Company.CompanyCode
Visitor.Company.ImageLogoLink
Visitor.Company.CrmAccountId
Visitor.Territory.Id
Visitor.Territory.Name
Visitor.ManagingParent.Id
Visitor.ManagingParent.Username
Visitor.ManagingParent.Name
Visitor.ManagingParent.FirstName
Visitor.ManagingParent.LastName
Visitor.ManagingParent.Email
Visitor.ManagingParent.Address2
Visitor.ManagingParent.ZipCode
Visitor.ManagingParent.City
Visitor.ManagingParent.State
Visitor.ManagingParent.Country
Visitor.ManagingParent.Phone
Visitor.ManagingParent.Fax
Visitor.ManagingParent.UserIdCode
Visitor.ManagingParent.UserCode
Visitor.ManagingParent.IsAdmin
Visitor.ManagingParent.Brand
Visitor.ManagingParent.EffectiveDate
Visitor.ManagingParent.CustomField()
Visitor.ManagingParent.UserType.Id
Visitor.ManagingParent.UserType.Name
Visitor.ManagingParent.Company.Id
Visitor.ManagingParent.Company.Name
Visitor.ManagingParent.Company.Address1
Visitor.ManagingParent.Company.Address2
Visitor.ManagingParent.Company.City
Visitor.ManagingParent.Company.State
Visitor.ManagingParent.Company.Province
Visitor.ManagingParent.Company.Zip
Visitor.ManagingParent.Company.Country
Visitor.ManagingParent.Company.Phone
Visitor.ManagingParent.Company.Fax
Visitor.ManagingParent.Company.Email
Visitor.ManagingParent.Company.CompanyCode
Visitor.ManagingParent.Company.ImageLogoLink
Visitor.ManagingParent.Company.CrmAccountId
Visitor.ManagingParent.Territory.Id
Visitor.ManagingParent.Territory.Name
Visitor.OrderingParent.Username
Visitor.OrderingParent.Name
Visitor.OrderingParent.FirstName
Visitor.OrderingParent.LastName
Visitor.OrderingParent.Email
Visitor.OrderingParent.Address1
Visitor.OrderingParent.Address2
Visitor.OrderingParent.ZipCode
Visitor.OrderingParent.City
Visitor.OrderingParent.State
Visitor.OrderingParent.Country
Visitor.OrderingParent.Phone
Visitor.OrderingParent.Fax
Visitor.OrderingParent.UserIdCode
Visitor.OrderingParent.UserCode
Visitor.OrderingParent.IsAdmin
Visitor.OrderingParent.Brand
Visitor.OrderingParent.EffectiveDate
Visitor.OrderingParent.CustomField()
Visitor.OrderingParent.UserType.Id
Visitor.OrderingParent.UserType.Name
Visitor.OrderingParent.Company.Id
Visitor.OrderingParent.Company.Name
Visitor.OrderingParent.Company.Address1
Visitor.OrderingParent.Company.Address2
Visitor.OrderingParent.Company.City
Visitor.OrderingParent.Company.State
Visitor.OrderingParent.Company.Province
Visitor.OrderingParent.Company.Zip
Visitor.OrderingParent.Company.Country
Visitor.OrderingParent.Company.Phone
Visitor.OrderingParent.Company.Fax
Visitor.OrderingParent.Company.CompanyCode
Visitor.OrderingParent.Company.ImageLogoLink
Visitor.OrderingParent.Company.CrmAccountId
Visitor.OrderingParent.Territory.Id
Visitor.OrderingParent.Territory.Name
Visitor.ApproveParent.Id
Visitor.ApproveParent.Username
Visitor.ApproveParent.Name
Visitor.ApproveParent.FirstName
Visitor.ApproveParent.LastName
Visitor.ApproveParent.Email
Visitor.ApproveParent.Address1
Visitor.ApproveParent.Address2
Visitor.ApproveParent.ZipCode
Visitor.ApproveParent.City
Visitor.ApproveParent.State
Visitor.ApproveParent.Country
Visitor.ApproveParent.Phone
Visitor.ApproveParent.Fax
Visitor.ApproveParent.UserIdCode
Visitor.ApproveParent.UserCode
Visitor.ApproveParent.IsAdmin
Visitor.ApproveParent.Brand
Visitor.ApproveParent.EffectiveDate
Visitor.ApproveParent.CustomField()
Visitor.ApproveParent.UserType.Id
Visitor.ApproveParent.UserType.Name
Visitor.ApproveParent.Company.Id
Visitor.ApproveParent.Company.Name
Visitor.ApproveParent.Company.Address1
Visitor.ApproveParent.Company.Address2
Visitor.ApproveParent.Company.City
Visitor.ApproveParent.Company.Province
Visitor.ApproveParent.Company.Zip
Visitor.ApproveParent.Company.Country
Visitor.ApproveParent.Company.Phone
Visitor.ApproveParent.Company.Fax
Visitor.ApproveParent.Company.Email
Visitor.ApproveParent.Company.CompanyCode
Visitor.ApproveParent.Company.ImageLogoLink
Visitor.ApproveParent.Company.CrmAccountId
Visitor.ApproveParent.Territory.Id
Visitor.ApproveParent.Territory.Name
Project.Id
Project.Name
Project.Total().Decimal
Project.Owner.Id
Project.Owner.Username
Project.Owner.Name
Project.Owner.FirstName
Project.Owner.LastName
Project.Owner.Email
Project.Owner.Address1
Project.Owner.Address2
Project.Owner.ZipCode
Project.Owner.City
Project.Owner.State
Project.Owner.Country
Project.Owner.Phone
Project.Owner.Fax
Project.Owner.UserIdCode
Project.Owner.UserCode
Project.Owner.IsAdmin
Project.Owner.Brand
Project.Owner.CustomField()
Project.Owner.UserType.Id
Project.Owner.UserType.Name
Project.Owner.Company.Id
Project.Owner.Company.Name
Project.Owner.Company.Address1
Project.Owner.Company.Address2
Project.Owner.Company.City
Project.Owner.Company.State
Project.Owner.Company.Province
Project.Owner.Company.Zip
Project.Owner.Company.Country
Project.Owner.Company.Phone
Project.Owner.Company.Fax
Project.Owner.Company.Email
Project.Owner.Company.CompanyCode
Project.Owner.Company.ImageLogoLink
Project.Owner.Company.CrmAccountId
Project.Owner.Territory.Id
Project.Owner.Territory.Name
Project.Owner.ManagingParent.Id
Project.Owner.ManagingParent.Username
Project.Owner.ManagingParent.Name
Project.Owner.ManagingParent.FirstName
Project.Owner.ManagingParent.LastName
Project.Owner.ManagingParent.Email
Project.Owner.ManagingParent.Address1
Project.Owner.ManagingParent.Address2
Project.Owner.ManagingParent.ZipCode
Project.Owner.ManagingParent.City
Project.Owner.ManagingParent.State
Project.Owner.ManagingParent.Country
Project.Owner.ManagingParent.Fax
Project.Owner.ManagingParent.UserIdCode
Project.Owner.ManagingParent.UserCode
Project.Owner.ManagingParent.IsAdmin
Project.Owner.ManagingParent.Brand
Project.Owner.ManagingParent.EffectiveDate
Project.Owner.ManagingParent.CustomField()
Project.Owner.ManagingParent.UserType.Id
Project.Owner.ManagingParent.UserType.Name
Project.Owner.ManagingParent.Company.Id
Project.Owner.ManagingParent.Company.Name
Project.Owner.ManagingParent.Company.Address1
Project.Owner.ManagingParent.Company.Address2
Project.Owner.ManagingParent.Company.City
Project.Owner.ManagingParent.Company.State
Project.Owner.ManagingParent.Company.Province
Project.Owner.ManagingParent.Company.Zip
Project.Owner.ManagingParent.Company.Country
Project.Owner.ManagingParent.Company.Phone
Project.Owner.ManagingParent.Company.Fax
Project.Owner.ManagingParent.Company.Email
Project.Owner.ManagingParent.Company.CompanyCode
Project.Owner.ManagingParent.Company.ImageLogoLink
Project.Owner.ManagingParent.Company.CrmAccountId
Project.Owner.ManagingParent.Territory.Id
Project.Owner.ManagingParent.Territory.Name
Project.Owner.OrderingParent.Id
Project.Owner.OrderingParent.Username
Project.Owner.OrderingParent.Name
Project.Owner.OrderingParent.FirstName
Project.Owner.OrderingParent.LastName
Project.Owner.OrderingParent.Email
Project.Owner.OrderingParent.Address2
Project.Owner.OrderingParent.ZipCode
Project.Owner.OrderingParent.City
Project.Owner.OrderingParent.State
Project.Owner.OrderingParent.Country
Project.Owner.OrderingParent.Phone
Project.Owner.OrderingParent.Fax
Project.Owner.OrderingParent.UserIdCode
Project.Owner.OrderingParent.UserCode
Project.Owner.OrderingParent.IsAdmin
Project.Owner.OrderingParent.Brand
Project.Owner.OrderingParent.EffectiveDate
Project.Owner.OrderingParent.CustomField()
Project.Owner.OrderingParent.UserType.Id
Project.Owner.OrderingParent.UserType.Name
Project.Owner.OrderingParent.Company.Id
Project.Owner.OrderingParent.Company.Name
Project.Owner.OrderingParent.Company.Address1
Project.Owner.OrderingParent.Company.Address2
Project.Owner.OrderingParent.Company.City
Project.Owner.OrderingParent.Company.State
Project.Owner.OrderingParent.Company.Province
Project.Owner.OrderingParent.Company.Zip
Project.Owner.OrderingParent.Company.Country
Project.Owner.OrderingParent.Company.Phone
Project.Owner.OrderingParent.Company.Fax
Project.Owner.OrderingParent.Company.Email
Project.Owner.OrderingParent.Company.CompanyCode
Project.Owner.OrderingParent.Company.ImageLogoLink
Project.Owner.OrderingParent.Company.CrmAccountId
Project.Owner.OrderingParent.Territory.Id
Project.Owner.OrderingParent.Territory.Name
Project.Owner.ApproveParent.Username
Project.Owner.ApproveParent.Name
Project.Owner.ApproveParent.FirstName
Project.Owner.ApproveParent.LastName
Project.Owner.ApproveParent.Email
Project.Owner.ApproveParent.Address1
Project.Owner.ApproveParent.Address2
Project.Owner.ApproveParent.ZipCode
Project.Owner.ApproveParent.City
Project.Owner.ApproveParent.State
Project.Owner.ApproveParent.Country
Project.Owner.ApproveParent.Phone
Project.Owner.ApproveParent.Fax
Project.Owner.ApproveParent.UserIdCode
Project.Owner.ApproveParent.UserCode
Project.Owner.ApproveParent.IsAdmin
Project.Owner.ApproveParent.Brand
Project.Owner.ApproveParent.EffectiveDate
Project.Owner.ApproveParent.CustomField()
Project.Owner.ApproveParent.UserType.Id
Project.Owner.ApproveParent.UserType.Name
Project.Owner.ApproveParent.Company.Id
Project.Owner.ApproveParent.Company.Name
Project.Owner.ApproveParent.Company.Address1
Project.Owner.ApproveParent.Company.Address2
Project.Owner.ApproveParent.Company.City
Project.Owner.ApproveParent.Company.State
Project.Owner.ApproveParent.Company.Province
Project.Owner.ApproveParent.Company.Zip
Project.Owner.ApproveParent.Company.Country
Project.Owner.ApproveParent.Company.Phone
Project.Owner.ApproveParent.Company.Fax
Project.Owner.ApproveParent.Company.CompanyCode
Project.Owner.ApproveParent.Company.ImageLogoLink
Project.Owner.ApproveParent.Company.CrmAccountId
Project.Owner.ApproveParent.Territory.Id
Project.Owner.ApproveParent.Territory.Name
Date
Date.Format()
Date.AddDays()
Date.AddDays().Format()
Date.AddDays().InUSDateFormat
Date.AddMonths()
Date.AddMonths().Format()
Date.AddMonths().InUSDateFormat
Date.AddYears()
Date.AddYears().Format()
Date.AddYears().InUSDateFormat
Date.InUserDateFormat()
Global.Tax.State()
Global.Tax.Country()
Container().Column().GetPermission
Container().Column().SetPermission()
Container().Rows.GetCount
Container().Rows.GetMin
Container().Rows.GetMax
Container().Rows.SetMin()
Container().Rows.SetMax()
Container().Rows.Add()
Container().Rows.SetCount()
Container().Rows.Clear
Container().Product().GetCount
Container().Product().GetMin
Container().Product().GetMax
Container().Product().SetMax()
Container().Product().Add()
Container().Product().SetCount()
Container().Property().Get
Container().Property().GetFormatted
Container().Property().Set()
Container().Total()
Container().Avg()
Container().Sum()
Container().IsUnique()
Container().IsValid
Container().HasColumn()
Container().IsAnyCellEmpty()
Container().AreAllCellsEmpty()
Container().GetEmptyCellCount()
Container().UniqueValues().Separator()
Container().Row().Column().Get - the numeric values that this tag retrieves are not
formatted.
Container().Row().Column().Get.DateInUserFormat
Container().Row().Column().Get.Format()
Container().Row().Column().Get.AddDays()
Container().Row().Column().Get.AddDays().Format()
Container().Row().Column().Get.AddDays().InUSDateFormat
Container().Row().Column().Get.AddMonths()
Container().Row().Column().Get.AddMonths().Format()
Container().Row().Column().Get.AddMonths().InUSDateFormat
Container().Row().Column().Get.AddYears()
Container().Row().Column().Get.AddYears().Format()
Container().Row().Column().Get.AddYears().InUSDateFormat
Container().Row().Column().GetDisplayValue
Container().Row().Column().GetFormatted - the numeric values that this tag retrieves have the same
format as in the container.
Container().Row().Column().Set()
Container().Row().Calculate
Container().Row().ProductId
Container().Row().ProductName
Container().Row().ProductTypeName
Container().Row().ProductTotalPriceWoLi
Container().Row().ProductTotalPrice
Container().Row().Index
Container().Row().CrmId
Container().Load()
Container().LoadKeys().Load()
Container().LoadCartItems().WherePartNumbers().ToColumns()
Container().LoadCartItems().WherePartNumbers().WhereProductTypes().ToColumns()
Container().LoadCartItems().WhereProductTypes().ToColumns()
Container().LoadCartItems().WhereProductTypes().WherePartNumbers().ToColumns()
Container().LoadCartItems().ToColumns()
Container().LoadFromSFDC().ToColumns()
Container().SelectedRow.Column().Get
Container().SelectedRow.Column().Get.DateInUserFormat
Container().SelectedRow.Column().Get.Format()
Container().SelectedRow.Column().Get.AddDays()
Container().SelectedRow.Column().Get.AddDays().Format()
Container().SelectedRow.Column().Get.AddDays().InUSDateFormat
Container().SelectedRow.Column().Get.AddMonths()
Container().SelectedRow.Column().Get.AddMonths().Format()
Container().SelectedRow.Column().Get.AddMonths().InUSDateFormat
Container().SelectedRow.Column().Get.AddYears()
Container().SelectedRow.Column().Get.AddYears().Format()
Container().SelectedRow.Column().Get.AddYears().InUSDateFormat
Container().SelectedRow.Column().GetDisplayValue
Container().SelectedRow.Column().GetFormatted
Container().SelectedRow.Column().Set()
Container().SelectedRow.Remove
Container().SelectedRow.ProductId
Container().SelectedRow.ProductName
Container().SelectedRow.ProductTypeName
Container().SelectedRow.ProductTotalPriceWoLi
Container().SelectedRow.ProductTotalPrice
Container().SelectedRow.Index
Container().SelectedRow.CrmId
Container().SelectedRowsIndexes
Container().SelectedRowsIndexes.Count
MyContainer.Column().GetPermission
MyContainer.Column().SetPermission()
MyContainer.CurrentRow.Column().Get
MyContainer.CurrentRow.Column().Get.DateInUserFormat
MyContainer.CurrentRow.Column().Get.Format()
MyContainer.CurrentRow.Column().Get.AddDays()
MyContainer.CurrentRow.Column().Get.AddDays().Format()
MyContainer.CurrentRow.Column().Get.AddDays().InUSDateFormat
MyContainer.CurrentRow.Column().Get.AddMonths()
MyContainer.CurrentRow.Column().Get.AddMonths().Format()
MyContainer.CurrentRow.Column().Get.AddMonths().InUSDateFormat
MyContainer.CurrentRow.Column().Get.AddYears()
MyContainer.CurrentRow.Column().Get.AddYears().Format()
MyContainer.CurrentRow.Column().Get.AddYears().InUSDateFormat
MyContainer.CurrentRow.Column().GetDisplayValue
MyContainer.CurrentRow.Column().GetFormatted
MyContainer.CurrentRow.ProductId
MyContainer.CurrentRow.ProductName
MyContainer.CurrentRow.ProductTypeName
MyContainer.CurrentRow.ProductTotalPrice
MyContainer.CurrentRow.ProductTotalPriceWoLi
MyContainer.CurrentRow.Index
MyContainer.Rows.GetCount
MyContainer.Rows.GetMax
MyContainer.Product().GetCount
MyContainer.Product().GetMin
MyContainer.Product().GetMax
MyContainer.Property().Get
MyContainer.Property().GetFormatted
MyContainer.Total()
MyContainer.Avg()
MyContainer.Sum()
MyContainer.IsUnique()
MyContainer.IsValid
MyContainer.HasColumn()
MyContainer.IsAnyCellEmpty()
MyContainer.AreAllCellsEmpty()
MyContainer.GetEmptyCellCount()
MyContainer.UniqueValues().Separator()
Product.Validation()
Product.Name.Translated
Product.Description.Translated
Product.LongDescription.Translated
Product.QuoteDescription.Translated
Product.Attribute().Value.Translated
Product.Attribute().Label.Translated
Product.Attribute().Description.Translated
Product.Attribute().ValueDescription().Translated
Product.PartNumber
Product.SystemId
Pricebook.Name
Pricebook.DistributionChannel
Pricebook.Code
Dictionary.Current.SystemId
Dictionary.Current.Name
Number().Format()
Number().Raw
Number().ToWords
Number().ToFormat().Decimal()
Math.Sum()
Market.Factor
Market.Code
Market.CurrencyRate
Market.CurrencyCode
Market.CurrencyReportingRate
Market.CurrencySign
Glossary
Default Decimal – the number will be displayed in the default value that includes as many decimal places as at
the time of the calculation.
Default Display – the number will be displayed in as many decimal points as selected by the user.
Market Decimal – the number will be displayed in the value of the quote’s currency.
Market Display – the number will include decimal points of the quote’s market.
MRC (Monthly Recurring Cost) - regular cost incurred repeatedly on a monthly basis.
Rolled-up Extended Amount – refers to a total price of all items in the quote.
This topic contains format specifiers accepted by the Date Time Format string.
In order for Salesforce to receive data in SF Date Time type fields, the valid format must be as follows: yyyy-
MM-ddTHH:mm:ss.ff
The Quote object is loaded in the edit action. It exists on the quote, quote property, customers, and all other
cart tab pages. The Quote object is also present in the Configurator, with the exception that it doesn’t exist if
the user clicked new quote and is configuring the first item. The Quote object exists in the Catalog, but only if
add item was executed.
The Quote.CurrentItem object refers to the cart item being iterated in the loops. If used outside of the loop
it will use the first cart item. It can be used in discount rules and CRM mappings. It can be used only if the
Quote object is loaded.
The SFDC object exists if the Salesforce integration is enabled and the user came through the Salesforce
backdoor from an opportunity.
The SOD object exists if the SOD integration is enabled and current quote is attached to an opportunity.
New CTX tags have been developed to help support companies with multiple languages.
If the value is not found in current dictionary, value from default dictionary will be returned.
When a user enters SAP CPQ from SalesForce opportunity, by using CTX(SFDC.Account.FieldName), the
value of the opportunity account FieldName will be obtained. Every FieldName the user has privileges to read
can be obtained by using this tag.
The purpose of these tags is that users will be able to download generated documents (proposals, SOWs, and
so on) from the external system without having to log into SAP CPQ.
In order for Salesforce to receive data in SF Date Time type fields, the valid format must be as follows: yyyy-
MM-ddTHH:mm:ss.ff
SOD tag refers to the CRM objects current quote is attached to.
Once the CRM object is loaded to associate with quote and/or execute mappings it is stored in the session level
cache. After Update Opportunity finishes this cache is cleared.
<*CatCode(attribute Gives the value catalog code String/Number Depends on <* CatCode(CD or
name)*> of the current attribute what the catalog code DVD Drive #1) *>:
selection contains returns the catalog code
value of the attribute CD or
DVD Drive #1.
<*ProductCode*> Gives the part number of the String/Number Depends on <* ProductCode *>:
current configuration what the part number returns the current part
contains number from whichever
product the tag is used in.
<*ProductLink*> Gives the link or URL from String <* ProductLink *> -
the product link field returns the text from the
Product Link field.
<*ProductImage*> Gives the product image file String <* ProductImage *> -
name used for a product returns the file name used
for the product image for the
product the tag is used in.
<*Price(*)*> Gives the sum of all prices Number <* Price(*) *> -
for all currently selected returns the prices of all
attributes but doesn’t selected attributes without
include base price. This
<*TotalPrice*> Gives the price of the current Number <* TotalPrice *> -
configuration. This includes returns the total price of the
items designated as product configuration.
separate line items.
Calculations using Product
Price building sequence may
produce a different value.
<*BasePrice*> Gives the base price of the Number <* BasePrice *> -
product. This is the amount returns the base price of the
entered in the product price product the tag is used in.
field.
<*CXSUB(intelligent Used with serial numbers A Sequence Value See chapter on Sequences
sequence and substituting a number to [page 131] for more
substitution replace long string of information.
name)*> attribute values for a product
number.
Conditions [CONDITION,...]
Standalone conditions are used to control if section of a document will be displayed or not. Conditions are
processed after all the other tags have been processed. Using conditions may slow down a performance if large
number of conditions are used to determine in the end if one section is displayed or not. On the left side is a tag
whose value will be compared and on the right side is list of values to compare with. Values are separated by |
Conditions always use OR logic. To check if value is equal use = and if not equal use !. Typical example of
condition is: [CONDITION,«Q_QP(my property)»=golf|soccer|basketball] Any static text or
tables or tags [CONDITION_END]
EVAL function treats an expression as a VBScript call, evaluates it and returns the result.
When writing EVAL in Word, the program uses two sets of different quotation marks, open-ended (“) and
closed-ended (”). VBScript expects the same set (” ”) and will not evaluate the expression when two different
sets are entered. To prevent this from happening, type the expression in Notepad and copy paste it to Word.
HTML [HTML(...)]
HTML tag takes the content and interprets is as HTML and inserts it in the document. For example,
[HTML(<<C_DESC>>)]. If <<C_DESC>> returns <a href=“http://www.webcominc.com”>Webcom,
Inc.</a>, the link will be inserted in the document. One caveat when using HTML tag is that if there is any text
before or after it, HTML content will be inserted in a new paragraph right before it. For example: text before -
[HTML(<<C_DESC>>)] - text after will result in: HTML returned content text before - - text after.
To include static text and have it on same line, simply put it inside HTML tag. [HTML(text before -
<<C_DESC>> - text after)]
SAP CPQ offers a few tags that are used to display data from custom table uploaded by the SAP CPQ
administrator.
Assuming that SAP CPQ administrator has already defined custom table named
additional_options_custom_table with two columns: additional_description and options, you can create
template section to display data from custom table as follows:
<<C2>>
<<MAIN>>
<<CUSTOM_TABLE(additional_options_custom_table)>>
<<CUSTOM_TABLE_HEADER>>
Additional description ---- Options
<<CUSTOM_TABLE_HEADER_END>>
<<CUSTOM_TABLE_ROW>>
<<CUSTOM_TABLE_COLUMN(additiona_description)>> ----
<<CUSTOM_TABLE_COLUMN(options)>>
<<CUSTOM_TABLE_ROW_END>>
<<CUSTOM_TABLE_END>>
<<MAIN_END>>
<<C_END>>
These tags are generally used in visibility and approval rules. They can only be used outside of product
configuration and they will not work in product rules, descriptions, and so on.
The first three tables provide information about a cart owner (CO), current user (CU), bill to information (BT),
or customer information (CO_ST). Tag syntax for these tables is similar. The cart owner and current user
information use the same column names. The bill to information is pulled from the Bill To and End User role in
the Billing/Shipping tab of a quote. Customer information is pulled from the Ship To role.
<*ISRESPAPPROV*> True/False
<* CO_INFO(column name) *> <* BT_INFO(column name) *> <* CO_STINFO(column name)
Column Name Column Name *> Column Name
MULTIPLIER TERRITORY_ID
FAX CUSTOMER_CODE
COUNTRY
TITLE
TERRITORY_ID
When using <*SETLISTSEPARATORTAG(…)*>, it should be always used in pair. First to set different separator,
and second time to reset to default “|”.
Example
<*allowatt(standard Parameters: attribute names. More Allows all values from all specified
attribute name)*> than one attribute can be entered. attributes.
Each separated from the other a
comma.
<*AllowAttributes(standard Parameters: attribute names. More Allows all values from all specified
attribute name)*> than one attribute can be entered. attributes.
Each separated from the other a
comma.
<*allowatv(standard Parameters: attributes with their Allows all values from the entered list
attribute name:standard values, separated by colon. More than
attribute value)*> one attribute/value pair can be
entered. Every pair is separated from
other pairs by a comma.
<*AllowValues(standard Parameters: attributes with their Allows all values from the entered list
attribute name:standard values, separated by colon. More than
attribute value)*> one attribute/value pair can be
entered. Every pair is separated from
other pairs by a comma.
<*assignff(attribute Parameters: the name of the free-form Every free input value is assigned to
name:value)*> attribute, and the value to be assigned appropriate free form attribute. If free
to the attribute, separated by colon. input value contains function, the
More than one free form attribute/free function is executed before
input value pairs can be entered. Every assignment. For example:
pair is separated from other pairs by a <*assignff(attribute_name:
comma. <*catcode(other_attribute
)*>)*> gives as the result the
CatCode string from the
other_attribute, assigned to free form
field in the attribute_name
attribute.
<*assignff(attrib_name:Web
com)*> assigns the string Webcom to
the “attrib_name” attribute. Non-free-
form attributes can’t accept the
assigned values.
<*AssignValue(attribute Parameters: the name of the free form Every free input value is assigned to
name:value)*> attribute, and the value to be assigned appropriate free form attribute. If free
to the attribute, separated by a colon. input value contains a function, the
More than one free form attribute/free function is executed before the
input value pairs can be entered. Every assignment. For
pair is separated from other pairs by a example:<*AssignValue(attrib
comma. ute_name:<*catcode(other_a
ttribute)*>)*> gives as the result
the CatCode string from the
other_attribute, assigned to
FreeForm field in the
attribute_name attribute.
<*AssignValue(attrib_name:
Webcom)*> assigns the string
Webcom to the attrib_name
attribute. Non-free-form attributes
can’t accept the assigned values.
If you wish to assign date to an attribute of type Date via this tag, you should use
<*ASSIGNVALUE(TestDate:<*CTX( Date.AddMonths(1).InUSDateFormat )*>)*> since the date
needs to be converted from the user format to the US format when the AssignValue tag is used. If the
user's date format is set to anything other than the US format, and the <CTX( Date.AddMonths(1) )>
is used, the date value will be assigned incorrectly.
<*assignpc(attribute Parameters: attributes with their prices The same as previous, except that it
name:value)*> to be assigned, separated by a colon. assigns “standard attribute value” to
More than one attribute/price pair can the Price field of the “standard
be entered. Every pair is separated attribute name”.
from other pairs by a comma.
<*AssignPrice(attribute Parameters: attributes with their prices The same as previous, except that it
name:value)*> to be assigned, separated by a colon. assigns “standard attribute value” to
More than one attribute/price pair can the Price field of the “standard
be entered. Every pair is separated attribute name”.
from other pairs by a comma.
<*disallowatv(standard Parameters: attributes with their Disallows every specified value in every
attribute name:standard values, separated by a colon. More attribute in the list.
attribute value)*> than one attribute/value pair can be
entered. Every pair is separated from
other pairs by a comma.
<*DisallowValues(standard Parameters: attributes with their Disallows every specified value in every
attribute name:standard values, separated by colon. More than attribute in the list.
attribute value)*> one attribute/value pair can be
entered. Every pair is separated from
other pairs by a comma.
<*disallowatt(standard Parameters: attribute names. More If condition is TRUE, all listed attributes
attribute name)*> than one Attribute can be entered. are disallowed. If condition, during
Each separated from other by a some of the following steps become
comma. FALSE, the attributes are NOT re-
allowed. Here, it's recommended to
create complementary rules: for every
rule made as condition - >
disallowatt(attribute_list) create
another as [not]condition - >
allowatt(attribute_list). Additionally,
make sure that every complementary
Rule has its rank higher than the rank
of the primary rule.
<*DisallowAttributes(stand Parameters: attribute names. More If condition is TRUE, all listed attributes
ard attribute name)*> than one attribute can be entered. are disallowed. If condition, during
Each separated from other by a some of the following steps become
comma. FALSE, the attributes are NOT re-
allowed. Recommended here is to
create complementary Rules: for every
Rule made as condition - >
DisallowAttributes(attribute_list)
create another as [not]condition - >
AllowAttributes(attribute_list).
Additionally, make sure that every
complementary rule has its rank higher
than the rank of the primary rule.
<*DisallowAllValuesExcept( Parameters: attributes with their Sets all attribute values to not allowed,
Attribute_Name : Value1, values, separated by colon. More than except for the listed values. This may
Attribute_Name : one attribute/value pair can be be used when there is a large number
Value2, ..)*> entered. Every pair is separated from of attribute values, but only a couple of
other pairs by a comma. them needs to be allowed.
<*resetatt(standard Parameters: attribute names. More Resets every value of every listed
attribute name)*> than one Attribute can be entered. attribute.
Each is separated from other by a
comma.
<*resetatv(standard Parameters: attributes with their Resets every listed attribute value.
attribute name:standard values, separated by colon. More than
attribute value)*> one attribute/value pair can be
entered. Every pair is separated from
other pairs by a comma.
<* SELATV (attribute1: Selects attribute values. By default the Attribute values included in tag will be
value1 I value2 I value3, system resets the attribute when a selected.
attribute2: value 1)*> selection is made with SELATV. With
the use of <*DONOTRESETATT*>
and <*DORESETATT*> (see
description below) more than one
attribute value will be selected without
the other values being unselected.
<* SelectValues Selects attribute values. By default the Attribute values included in tag will be
(attribute1: value1 I system resets the attribute when a selected.
value2 I value3, selection is made with SelectValue.
attribute2: value 1)*> With the use of
<*DONOTRESETATT*> and
<*DORESETATT*> (see description
below) more than one attribute value
will be selected without the other
values being unselected.
<* SelectValue Selects attribute values. By default the Attribute values included in tag will be
(attribute1: system resets the attribute when a selected.
value1,attribute1:value2 , selection is made with SelectValue.
attribute1:value3)*> With the use of
<*DONOTRESETATT*> and
<*DORESETATT*> (see description
below) more than one attribute value
will be selected without the other
values being unselected.
<*ResetValue(standard Parameters: attributes with their Resets every listed attribute value.
attribute name:standard values, separated by colon. More than
attribute value)*> one attribute/value pair can be
entered. Every pair is separated from
other pairs by a comma.
<*DONOTRESETATT*> Tells the system not to reset the Switches the system to not reset
attribute values when another attributes when SELATV tag is used.
selection is made. By default the
system resets the attribute when a
selection is made with SELATV. Use in
conjunction with <*DORESETATT*>
(see description below)
<*DORESETATT*> Tells system to reset attribute values Switches the system to reset attributes
when another selection is made. when the SELATV tag is used.
Generally this is used after the
<*DONOTRESETATT*> tag in the
same expression. For example:
<*DONOTRESETATT*><*SELATV(
attr1:value1)*><*DORESETAT
T*>
<* ResetAttribute(standard Parameters: attribute names. More Resets every value of every listed
attribute name) *> than one attribute can be entered. attribute.
Each is separated from other by a
comma.
<*DONOTREVERSERULES*> Tells the system not to reverse a rule Switches the system to not reverse
when the rule becomes not true. By rules when the condition is no longer
default the system will reverse a rule true.
when the condition is no longer true.
Use <*DONOTREVERSERULES*> to
turn this function off.
<*REVERSERULES*> Tells the system to reverse the rule Switches the system to reverse rules
when the rule becomes not true. when the condition is no longer true.
Generally this is used after the
<*DONOTREVERSERULES*> tag in
the same expression. For
example:<*DONOTREVERSERULES*
><*DISALLOWATT(attr1)*><*
REVERSERULES*>
<*anysel(standard Parameters: attributes with their If any value from the entered list is
attribute name:standard values, separated by a colon. More selected the result is TRUE, otherwise
attribute value)*> than one attribute/value pair can be it’s FALSE.
entered. Every pair is separated from
other pairs by a comma.
<*IfAnyValue(standard Parameters: attributes with their If any value from the entered list is
attribute name:standard values, separated by a colon. More selected the result is TRUE, otherwise
attribute value)*> than one attribute/value pair can be it’s FALSE.
entered. Every pair is separated from
other pairs by a comma. This tag
should be used for product rules only.
<*anyselatt(standard Parameters: attribute names. More If any value from the specified
attribute name)*> than one attribute can be selected. attributes is selected the result is
Separate them by commas. TRUE, otherwise it’s FALSE.
<*IfAnyAttribute(standard Parameters: attribute names. More If any value from the specified
attribute name)*> than one attribute can be selected. attributes is selected the result is
Separate them by commas. TRUE, otherwise it’s FALSE.
<*allsel(standard Parameters: attributes with their If all of the specified values are
attribute name:standard values, separated by a colon. More selected the result is TRUE, otherwise
attribute value)*> than one attribute/value pair can be it’s FALSE.
entered. Every pair is separated from
other pairs by a comma.
<*IfAllValues(standard Parameters: attributes with their If all of the specified values are
attribute name:standard values, separated by a colon. More selected the result is TRUE, otherwise
attribute value)*> than one attribute/value pair can be it’s FALSE.
entered. Every pair is separated from
other pairs by a comma.
<*allselatt(standard Parameters: attribute names. More If every specified attribute has its
attribute name)*> than one Attribute can be entered. selection the result is TRUE, otherwise
Each separated from the other a it’s FALSE.
comma.
<*IfAllAttributes(standard Parameters: attribute names. More If every specified attribute has its
attribute name)*> than one attribute can be entered. selection the result is TRUE, otherwise
Each separated from the other a it’s FALSE.
comma.
Tag Description
<*GI(keyV)*> Gets Global Info from global cashe under key, evaluates to
null if there is no info under key.
<*getAttNumVal(attribute name)*> Read attributes numeric value directly from the database
(from the cart items table).
The purpose of this feature is to develop new product tag that will return product price excluding line items.
● Unit Price of the main item without line items. The tag is <*MainItemUnitPrice*> and it returns the
same value as <*TotalPriceWoLI *>.
● Extended Price of the main item without line items. Tag is <*MainItemPrice*> and it returns
{<*TotalPriceWoLI *> * <* ItemQuantity *>}.
Description Tag
In Debugger opened for product configuration, tag can be found under Variables.
XWS tag may have one or more parameters. First parameter is function name. Other parameters are optional
and represent parameters passed to the specified function. Other than that, it supports several standard
functions it’s a gateway from Configurator to external resources like web services from another systems.
● Candy - <*XWS(Candy)*> Always returns the same constant. Parameters - none. Returns - 100.
● GetProductPrice - <*XWS(GetProductPrice, ProductName)*> applies current product configuration
to the specified product and returns its price. Parameters - ProductName – a name of the product that’s
price is queried. Returns - Price of the specified product after current configuration has been applied to it.
● GetProductCatCode - <*XWS(GetProductCatCode, ProductName)*> applies current product
configuration to the specified product and returns its catalogue code. Parameters - ProductName – a
name of the product that’s catalog code is queried. Returns - Catalog code of the specified product after
current configuration has been applied to it.
● GetProductDescription <*XWS(GetProductDescription, ProductName)*> applies current product
configuration to the specified product and returns its description. Parameters - ProductName – a name of
the product that’s description is queried. Returns - Description of the specified product after current
configuration has been applied to it.
● Iterate - <*XWS(Iterate, Data, Formula)*> applies formula expression from the hint of the Formula
attribute to each part of the comma-separated values (CSV) in the value of the Data attribute and returns
sum of all evaluations. Parameters - Data – name of the attribute that in its value contains the data that
needs to be iterated - Formula – name of the attribute that in its hint contains the formula that needs to be
evaluated on each CSV value from Data attribute. Formula may contain all standard tags and new special
tag {{CurrentValue}} that will be replaced by the current iteration value. Returns - Sum of all evaluated
formulas
Example
<*XWS(Iterate, Data, Formula)*> Value of attribute Data is 1,2,3,4,5 Hint of attribute Formula is
{{CurrentValue}} Will return 15 Sum = 0 Iteration 1 - Sum = Sum + 1 = 0 + 1 = 1 Iteration 2 - Sum = Sum + 2 = 1
+ 2 = 3 Iteration 3 - Sum = Sum + 3 = 3 + 3 = 6 Iteration 4 - Sum = Sum + 4 = 6 + 4 = 10 Iteration 5 - Sum =
Sum + 5 = 10 + 5 = 15
Example
<*XWS(Iterate, Data, Formula)*> Value of attribute Data is 1,2,3,4,5 Hint of attribute Formula is
<*eval({{CurrentValue}}+1)*> Will return 20 Sum = 0 Iteration 1 - Sum = Sum + <*eval(1+1)*> = 0 + 2 = 2
Iteration 2 - Sum = Sum + <*eval(2+1)*> = 2 + 3 = 5 Iteration 3 - Sum = Sum + <*eval(3+1)*> = 5 + 4 = 9
Iteration 4 - Sum = Sum + <*eval(4+1)*> = 9 + 5 = 14 Iteration 5 - Sum = Sum + <*eval(5+1)*> = 14 + 6 = 20
In this section, you can learn more about the logging of actions performed by administrators and users. You
can also learn about change sets, which are used for tracking changes performed by administrators.
SAP CPQ tracks all actions that administrators and users perform throughout the application and logs them in
the dedicated section of the Setup. The audit trail logs changes that are performed either directly in the
application or via API.
Any logged information can be found in the following tabs in Setup Audit Trail Audit Trail :
The audit trail permanently retains records. However, if you want logged information to be automatically and
permanently deleted, you can specify data deletion intervals in Setup Security Data Deletion Audit Trail
Deletion . See Audit Trail Deletion [page 742] for more information.
You can search the audit trail records by performing a global search, an advanced search or by using the quick
filter. Additionally, you can select which audit trail columns are visible by clicking , selecting or
unselecting individual columns and clicking Save.
Global Search
To perform a global search across all tabs, follow the steps.
Advanced Search
The advanced search filters only the currently open audit trail tab, but it allows you to search every column in
the grid. To perform an advanced search, follow these steps.
Alternatively, you can use the quick filter to instantly search the currently open audit trail tab. The quick filter
works the same way as the advanced search, except that it only filters by the parameters listed in the search
bar. The parameters are specific for every audit trail tab.
● If value A is entered in the global search, and value B is entered in the advanced search, the records in the
currently open tab are filtered by the value B. However, all the other audit trail tabs are filtered by value A.
● If the quick filter is applied on any audit trail tab, it overrides all other search filters, both global and
advanced.
Related Information
The system tracks changes performed by administrators in various sections of the Setup and displays them in
the Admin Actions tab.
Additionally, actions performed by users with special administrator permissions in the User Menu are also
logged in the Admin Actions tab (this doesn’t include the User Page, which is available to all users and covered
by User Actions in terms of logging). See Logged Data [page 723] for more information about what is logged in
the audit trail.
● Change Set ID – the ID of the change set [page 723] that was active when the change was performed. All
changes are grouped under the currently active change set.
● Change ID – the ID of the specific change inside the change set.
● Entity – the type of SAP CPQ object that is being changed (for example, Application Parameter).
● Entity ID – the unique identifier of the specific SAP CPQ object that is being changed (for example, the
name of a specific application parameter).
● Action – any change carried out by the administrator or the user (such as Add, Change, or Delete). Post
actions attached to an action are also logged here.
● Field – the field whose value has been changed.
● Previous Value – the value that was in place before the change.
● New Value – the value that is in place after the change.
● User – the name and the username of the administrator or user who performed the change.
● Date – the date and the time when the change was performed.
Related Information
Here, administrators can track changes performed by SAP CPQ users on the user side of the application, in
high detail and real time.
See Logged Data [page 723] for more information about what is logged in the audit trail.
● Quote – the number of the quote on which the change was performed.
● Quote Revision – the name and number of a specific quote revision.
● Quote Status – the status of the quote when the action was performed.
● Quote Item – the ordinal number of a specific item in the quote on which the change was made.
● Product – a product that was changed by a user (for example, by configuring it).
Related Information
12.1.3 Products
This functionality allows administrators to track changes performed on products. Specifically, the changes
logged here are product definition changes performed in the Setup.
See Logged Data [page 723] for more information about what is logged in the audit trail.
● Change Set ID – the ID of the change set [page 723] that was active when the change was performed. All
changes are grouped under the currently active change set.
● Change ID – the ID of the specific change inside the change set.
● Product – a product that is being changed, usually goods or services (for example, a laptop or a software
license).
● Product System ID – the system ID of the product.
● Attribute – the specific attribute on the product that is being changed (for example, a CPU as an attribute
of a laptop product).
● Attribute System ID – the system ID of the attribute.
● Attribute Value – the value of the attribute (for example, any of the CPU models offered to users as values
for the attribute CPU).
● Rule/Message/Script –the rule or message triggered upon product configuration.
● Action – any change carried out by the administrator (such as Add, Change or Delete).
● Field – the field whose value has been changed.
● Previous Value – the value that was in place before the change.
● New Value – the value that is in place after the change.
● User – the name and the username of the administrator who performed the change.
● Date – the date and the time when the change was performed.
12.1.4 Attributes
This functionality allows administrators to track all changes performed on attributes. Specifically, the changes
logged here are attribute definition changes performed in the Setup.
See Logged Data [page 723] for more information about what is logged in the audit trail.
● Change Set ID – the ID of the change set [page 723] that was active when the change was performed. All
changes are grouped under the currently active change set.
● Change ID – the ID of the specific change inside the change set.
● Entity – the type of SAP CPQ object that is being changed (such as Attribute or Attribute Container
Content).
● Entity ID – the identity of the specific SAP CPQ object that is being changed (such as the specific system ID
of an attribute).
● Action – any change carried out by the administrator (such as Add, Change, or Delete).
● Field – the field whose value has been changed.
● Previous Value – the value that was in place before the change.
● New Value – the value that is in place after the change.
● User – the name and the username of the administrator who performed the change.
● Date – the date and the time when the change was performed.
Related Information
12.1.5 Pricebooks
This functionality allows administrators to track all changes performed on pricebooks in the Setup.
See Logged Data [page 723] for more information about what is logged in the audit trail.
● Change Set ID – the ID of the change set [page 723] that was active when the change was performed. All
changes are grouped under the currently active change set.
Note
Logging can be disabled for changes on pricebooks by setting the application parameter Audit Trail for
Pricebooks to Audit Disabled. This can improve system performance when working with pricebooks.
Related Information
This functionality allows administrators to track all changes performed on custom tables in the Setup.
See Logged Data [page 723] for more information about what is logged in the audit trail.
● Change Set ID – the ID of the change set [page 723] that was active when the change was performed. All
changes are grouped under the currently active change set.
● Change ID – the ID of the specific change inside the change set.
● Entity – the type of SAP CPQ object that is being changed (such as Custom Table or Custom Table Entry).
● Entity ID – the identity of the specific SAP CPQ object that is being changed (such as the name of a custom
table or the ID of a custom table entry).
● Action – any change carried out by the administrator (such as Add, Change, or Delete).
● Field – the field whose value has been changed.
● Previous Value – the value that was in place before the change.
● New Value – the value that is in place after the change.
● User – the name and the username of the administrator who performed the change.
● Date – the date and the time when the change was performed.
This topic explains where different types of data are logged, and which sections are not covered by the audit
trail.
The Products, Attributes, Pricebooks, and Custom Tables tabs log details about every action performed on
products, attributes, pricebooks and custom tables, respectively.
The Admin Actions tab logs all actions performed in the Setup with the following exceptions:
● Actions performed on products, attributes, pricebooks, and custom tables are logged in their respective
logs.
● Actions performed in the following sections of the Setup aren’t logged:
○ General Report Module
○ Bulletin Board
The User Actions tab logs all actions performed by users on the user side of the application, with the following
exceptions:
Related Information
Change Set is a feature that increases traceability of changes (in Setup or via scripting) and ensures that
appropriate recording of changes occurs in the relevant change management procedures.
A change set encompasses a group of changes that are performed in a single set. Each change in SAP CPQ is
logged in the Audit Trail [page 717] as a part of a change set.
Change sets can only be created in development and testing SAP CPQ environments. If you want a change
set to be displayed in Setup in sandbox and production environments, you need to deploy it from the lower
environment once the changes have been tested and applied there.
Change sets can be active and inactive. Of all the active change sets, only one can be in use at a time. You can
select the change set you wish to use in the Change Set dropdown in Setup. Once you select a change set, all
changes that you apply to SAP CPQ from that moment on are logged in Audit Trail under that change set. The
inactive change sets don’t appear in the dropdown, but you can find them in Setup Audit Trail Change
Set (where all change sets created by administrators are listed) and activate them again. Changes can’t be
logged under an inactive change set.
Note
Using change sets to improve tracking of changes is optional. If there are no change sets in your
environment other than DEFAULT (CPQ-1), the Change Set dropdown isn’t displayed in Setup.
The default change set is selected every time you log into SAP CPQ regardless of whether a different change
set was previously selected or not. If you make some changes under a custom change set, exit the Setup and
then enter it again without logging out, the custom change set you have previously used is the selected one.
If a change is performed via API, and you wish to assign it to a change set, enter the change set ID in the header
for each API call. You can only use IDs of active change sets. The key entered in the header should be
ChangeSetId, and its value should be the value of that change set ID (for example, CPQ-10). This is the list of
affected APIs:
● AUXTableAdministrator
● CompanyAdministration
● ImportMaterialsFromERP
● SimpleProductAdministration
● UpsertPricebook
● UpsertPricebookWithDistributionChain
● UserAdministration
● CustomerAdministration
Related Information
You can access the Change Set dropdown in the Setup. The names and IDs of active change sets in your
environment are displayed here.
Note
Currently, change sets can’t be deleted, but they can be deactivated with the Active toggle switch.
Related Information
It is possible to deploy active change sets from development and testing to sandbox and production
environments.
In this initial phase of improved SAP CPQ transport mechanism, there are two ways to deploy change sets to
target environments. You can either do it manually or via a deployment package.
Once you click the Deploy button in Setup Audit Trail Change Set , a popup window displays. You are
prompted to select a target environment and a change set or change sets that should be deployed to it.
When a change set is deployed from one of development or testing environments, it will appear in the target
environment’s list of active change sets. No changes previously performed in the source environment will be
applied to that environment automatically or logged in the target environment’s Audit Trail.
Example
An administrator selects the CPQ Test change set in the source environment, performs some changes
manually and sends that change set's definition to the target environment by clicking the Deploy button in the
Change Set page. Then an administrator selects that change set on the target environment and applies the
same changes manually there.
Deployment Package
To deploy a change set via a deployment package, navigate to the Deployment Packages tab in Setup
General Deploy/Send Changes Deployment Setup in the source environment and click Create Package.
There, you can select the change set and deploy the package to the target environment.
The Change Set dropdown list is blank by default and selecting a change set from the list is mandatory.
However, the field isn’t visible if there are no active change sets in the environment.
If the change set with that ID already exists in the target environment, it is preselected in Setup and all changes
that were deployed in the package are applied in the target environment and logged as a part of that change
set. If the change set does not exist in the target environment, it is created, preselected and all changes
associated with it are applied in the target environment and logged in that environment's Audit Trail.
Note
If an administrator performs one change in the source environment as a part of the Change Set A and
another change as a part of the Change Set B, there are no restrictions which prevent both changes to be
sent as a part of the Change Set B if they are deployed in the same package when Change Set B was
selected in Setup.
When delegating authority for a setup feature to SAP CPQ users, you allow them to manage features that are
available only to administrators. This way users become local administrators for specific setup functionalities.
In companies where a local administrator manages a part of setup, the process is optimized, and the
turnaround is faster. Also, limiting data access to local administrators enhances its security.
Example
In a XYZ company with offices around the globe, there are a number of administrators distributed per
countries/regions and regions. An office in Sweden has monthly special offers for specific customer groups, so
they require different price books regularly. The administrator can’t handle all the requests for importing new
price books in time, so he delegates authority for managing price books to a user located in the Swedish office.
The process is now more optimized as the local administrator can upload new price books into the application
almost in real time.
In the Delegation of Authority section in Setup, users can be delegated authority to manage:
● Custom Tables
● Simple Products
● Pricebooks
● Users
● Bulk Quote Reassignment
● Documents
Users can access the pages for managing specific setup features in the menu available when clicking their
username in the top bar.
If needed, each user can also be able to share templates with the members of their own company. To delegate
authority for managing documents, go to Setup Delegation of Authority Ability to Manage Documents .
Note
The logic between permission groups is OR, so the system delegates authority for managing documents to
all users that belong to at least one of the selected permission groups.
If you wish to enable users pertaining to the selected permission groups to upload content files that are used in
templates uploaded by application administrators, select the Users from selected permission groups will be
able to upload content files used in templates uploaded by application administrator checkbox.
Users who are delegated authority for managing document templates have the Manage Document Templates
page available in the user pages. When creating a new template, define it in the Template Definition tab
according to the instructions for creating templates described in Document Generation Template. Users can
select Share with users from my company and brand to expand access to the template to other users in their
company.
In the Additional Fields tab, you define which content files are going to be added to the template.
Note
The system includes the additional files into the generated template only if these two tags are properly
added in the template: INCLUDE_DOCUMENTS and INCLUDE_DOCUMENTS_END.
● Include file(s) for each quote item - select it to add files for each quote item.
● Included File(s) - enter the name of the file (with file extension) that is going to be added to the generated
document, or define the formula that dynamically pulls the file name from elsewhere in the application.
The files need to be placed in Manage Content Documents.
● File Description - define a description that is shown to users, or a formula that generates a description
dynamically.
● File Selection - select Checkboxes to allow multiple selections of files that will be included in the generated
file. Alternatively, select Radio Buttons to restrict the selection to only one file.
● Separate files with page break - selected by default so that the system would make a page break after every
added file.
You can either select Everyone and enable all permission groups to reassign quotes in bulk, or select specific
groups by moving them to the right column. In the Bulk Quote Reassign Rights subsection, you can also restrict
Note
The logic between permission groups is OR, so the system delegates authority for reassigning quotes to all
users that belong to at least one permission group.
On the user side, users in the selected permission group can select a user whose quotes will be reassigned and
the user to whom the quotes will be reassigned.
On the Bulk Quote Reassign page available in user pages, SAP CPQ users select a user whose quotes they wish
to reassign, a user to whom the quotes will be reassigned and quotes that will be reassigned.
The Custom Tables subsection displays all custom tables in the system for which you can delegate authority.
You can find a specific table faster using the search box above each column.
Click the Edit button next to a table to edit the permission groups who can manage it. Use the left and right
arrows to move available permission groups to selected and vice versa.
Note
The logic between permission groups is OR, so the system delegates authority for a custom table to all
users that belong to at least one permission group.
On the user side, delegated users can manage custom tables on the Manage Tables page. Users are allowed to
edit tables for which they’re granted authority, to add, edit, and delete rows in tables. Additionally, tables can
be exported as Excel and ZIP files for a cleaner overview.
Under Pricebooks, you choose permission groups that can manage each price book and define under which
conditions the authority is delegated.
When in editing mode, first move the system permission groups to the right column and then define the
condition by creating a formula in the Formula Builder.
Note
The formula box can't be empty. To make the price book always visible/invisible to the selected permission
group, enter 1 or 0 in the formula box.
To manage price books as a user, access Manage Pricebooks under User Menu. In addition to editing and
exporting price books, users can add, edit, and export price book entries as well.
You can delegate authority for simple products in the Simple Products subsection.
The page shows all conditions created for delegating authority for simple products management.
To add a new condition, you need to click Add New. The page that opens up is divided into three sections
enabling you to select the following:
On the Manage Simple Products page reached via User Menu, delegated users can add and import simple
products to the categories for which they’re granted rights. Also, users can edit products and export them.
This functionality enables users who aren’t SAP CPQ administrators to manage other users and companies.
Delegation of authority for user management is managed through two tabs: Management of users and
Management of companies.
Management of Users
The tab contains all conditions under which the authority for user management is delegated to users.
Note
If User who creates company can manage its users is selected, users who have created companies can
automatically manage all new users that join those companies.
Click Add New to define a new condition. A new page displays, containing the following fields:
Field Description
Permission Group Type the name of the permission group to which you’re
delegating authority, or click the Search icon to find a
permission group.
Can Edit Users Select All Company Users and allow the selected permission
group to edit all users belonging to the same companies as
the selected group. Alternatively, if you select Only if
Managing Parent of Users, you’re allowing each user to
manage those users to whom they’re set up as managing
parents.
Can Manage Users of These User Types Move user types to the right column to enable the selected
permission groups to manage them.
Can Manage Users From These Companies Select Users' own company to enable each user to manage
other users pertaining to the same company. Alternatively,
select specific companies.
Can Allow Other Users Permissions to Administer Users Enable the permission group to delegate authority for
managing users.
Can Allow Other Users Permissions to Administer Enable the permission group to delegate authority for
Companies managing companies to other users.
Management of Companies
The tab displays all conditions under which the authority for managing companies is delegated to users.
Click Add New to define a new condition and fill out these fields:
Field Description
Permission Group Type the name of the permission group to which you’re
delegating authority, or click the search icon to find a
permission group.
Can Create New Companies Enable the permission group to create new companies.
Can Edit These Companies Select User's own company and allow each user in the
permission group to edit their own company. Alternatively,
select specific companies. In addition, you can choose the
Where user belongs to the Permission Group which is an
administrator option. It allows users from the selected
permission group to edit companies for which they’re
granted administrator rights through other permission
groups (an administrator permission group is assigned to a
company in Companies Permissions ).
On the user side of SAP CPQ, the Manage Users page displays all users that the logged user has the rights to
manage. Adding and editing of users is also enabled.
SAP CPQ provides features that are intended to help achieve compliance with General Data Protection
Regulation (GDPR).
SAP CPQ doesn't include any technical measures that support the processing of special categories of personal
data, which includes but isn’t limited to:
Look at SAP CPQ features rolled out under GDPR standards and click the links for more details:
Note
Since data can be permanently deleted, we recommend that only data protection officers, in cooperation
with administrators, use this feature to define a data retention policy.
● Quotes
● Users
● Customers
● User actions
● Administrator actions
This feature is accessed in Setup Security Data Deletion . The above-mentioned data is organized into
the following tabs: General Deletion [page 738] and Audit Trail Deletion [page 742]
Apart from deleting data on the previously mentioned tabs, you can also prevent data from being deleted [page
734].
The feature is available in both Responsive and Classic Design. However, when deleting or blocking data using
Classic Design, UI text such as messages and blocked status of users, quotes and customers isn’t visible.
Note
If your attempt to delete data with the Data Deletion feature is unsuccessful, contact the SAP CPQ Support
Team and request deletion of the necessary SAP CPQ entities.
Note
● The customer details can’t be edited. You can only view the details.
● The customer can’t be deleted manually or via the API.
● The customer can’t be added to quote.
On the Customer Info tab, the blocked customer doesn’t appear in autocomplete suggestions. Moreover,
when adding customers via Lookup, a customer’s blocked status is displayed in the Actions column.
In case a customer was first attached to a quote and got blocked afterwards, if a user performs certain actions
on the quote that process the customer information (for example, generate documents or place order), a
message displays, notifying the user that the customer is blocked and that another customer should be added
to the quote.
The blocked user’s status is considered for SAP CPQ licenses. The user can be either active or inactive, and this
status is displayed in the Active column on the Users page. If the blocked user is active, the user counts as a
license user. On the other hand, if the blocked user is inactive, the user doesn’t count as a license user.
● The user’s status (active or inactive) remains the same as it was before the user was blocked.
● The user will get deleted if the deletion criteria is met based on the inactivity period or last login time.
It's possible to define time periods after which user, quote, and customer data is deleted.
To delete customers:
The system calculates the deletion period once the customer is no longer attached to any quote.
Each deleted customer is recorded in Setup Audit Trail Admin Actions . Additionally, customer ID of the
deleted customer is displayed in the Action column in the following format: GDPR - delete customer - customer
ID.
When deleting quotes, you can either delete all quotes that meet the deletion criteria, regardless of their status,
or only quotes in particular status.
The system calculates the deletion period from the date the quote was last modified. For example, if you set the
default deletion period to one year, all quotes with a modified date older than one year will be deleted
immediately.
Note
This is a single-choice selection field. To define multiple statuses, click Add Status below the Deletion
Period time selector for each status you want to define.
5. Click Save.
A confirmation message displays.
The system calculates the deletion period from the last modified date.
You can set default deletion period and status-based deletion to work in parallel. In this case, the status-based
deletion will overrule the default deletion period. The status-based deletion is useful when you want to set
different deletion periods for particular statuses, in which case the default deletion period applies to quotes in
nonselected statuses.
Example
You want to keep quotes in Won status for a longer time than quotes in all other statuses. Moreover, you also
want to remove quotes in Lost status from the system. The first thing you can do is set the Default Deletion
Period to 1 year. Next, after enabling the Delete Quotes by Status toggle switch, you can set the deletion period
for quotes in Won status to 3 years, whereas the deletion period for quotes in Lost status can be set to 5
months. As a result, quotes in Won status will be kept in the system for 3 years, that is, they will be deleted 3
years after their last modified date. Quotes in Lost status will be deleted 5 months after their last modified date,
whereas quotes in all other statuses will be deleted 1 year after their last modified date.
Each deleted quote is recorded in Setup Audit Trail Admin Actions . Additionally, quote number of the
deleted quote is displayed in the Action column in the following format: GDPR - delete quote - user ID - cart ID.
When deleting users, you can either delete inactive users or users who don’t log into the system during the
specified deletion period.
The system calculates the deletion period from the date the administrator marked the user as inactive, starting
from the 2018.4 release date. If the user was inactive before the 2018.4 release, that period isn’t taken into
account when calculating the deletion period.
Example
Example: You want to delete inactive users from the system, so you enable the Delete Inactive Users toggle
switch and set the deletion period to 3 months. In this case, the system will take into account only those users
who became inactive after the 2018.4 release date (November 17, 2018). This means that if a user becomes
inactive on November 20, 2018, the system will delete the user on February 20, 2019. On the other hand, if the
user became inactive on October 10, 2018, the system won’t take the deletion period set for this user into
consideration. As a result, the user won’t get deleted.
To delete users who don’t log into the system during the specified period:
The system calculates the deletion period from the last login date, starting from the 2018.4 release date. If the
user didn’t log into the system before the 2018.4 release, that period isn’t taken into account when calculating
the deletion period.
Example
You want to delete non-logged in users from the system, so you enable the Delete Non-logged in Users toggle
switch and set the deletion period to 3 months. In this case, the system will take into account only those users
who logged in after the 2018.4 release date (November 17, 2018). This means that if a user’s last login was on
November 20, 2018, the system will delete the user on February 20, 2019. On the other hand, if the user’s last
login was on October 10, 2018, the system won’t take the deletion period set for this user into consideration. As
a result, the user won’t get deleted.
Since users are linked to other SAP CPQ entities, deleting a user isn’t possible in the following cases:
Users that can’t be deleted due to the above-mentioned reasons will be marked for deletion, and the system
will keep trying to delete users on a daily basis. Users will get deleted once the condition that prevented them
from being deleted the first time is no longer valid.
On the other hand, during the scheduled daily job when the system is trying to delete a user who couldn’t be
deleted due to the above-mentioned reasons, if the user no longer meets the deletion criteria (the user logged
in or became active), the system will stop trying to delete the user.
Each deleted user is recorded in Setup Audit Trail Admin Actions . Additionally, the user ID of the
deleted user is displayed in the Action column in the following format: GDPR - delete user - user ID.
It's possible to define time periods after which audit trail data is deleted.
On the Audit Trail Deletion tab, you define a time period for:
● Automatic deletion of administrator actions, user actions, and changes on products, attributes, pricebooks
and custom tables from their respective audit trail logs.
● Automatic deletion of personal data log records.
Set Up Automatic Deletion of Data from the Audit Trail [page 743]
You can set up automatic deletion of data from a specific Audit Trail log of your choice.
You can set up automatic deletion of data from a specific Audit Trail log of your choice.
Procedure
All log entries older than the specified period are deleted daily.
Context
All Personal Data Log entries are by default automatically deleted after six months, or less, if they’re no longer
required by the company that holds that information. The default retention period of personally identifiable
information can be changed if needed.
Procedure
2. In Audit Trail Deletion Personal Data Log , enable the Delete Data Protection Log toggle switch.
New fields display for defining the period after which the data will be deleted.
3. Select Month or Years and enter the number in the first field.
Personally identifiable information (PII) is any information that could potentially be used to identify an
individual.
● Full name
● Home address
● Email address
● Social security number
● Passport number
● Driver's license number
● Credit card number
● Date of birth
● Telephone number
● Login details
You can mark certain information as PII if needed. This action makes the processes of managing and filtering
PII much easier.
The following objects aren’t flagged as PII by default, but you have the option to flag them as such if necessary:
You can flag data as PII by selecting the Contains Personally Identifiable Information checkbox for the above-
mentioned objects. Once data is flagged as PII, it’s also possible to flag it as sensitive [page 745].
If the following objects are flagged as PII, they retain that flag after being sent and deployed via the Deploy /
Send Changes [page 563] feature:
● Attributes (deployed as elements of other deployment package components: products, guided selling,
custom fields, or CRM integrations)
● Quote tables
● Custom tables
● Customer standard and custom fields
● Quote custom fields
Changes made to all data categorized as PII (personally identifiable information) in SAP CPQ are logged in a
dedicated Personal Data Log. This enables data protection officers to filter and monitor these changes more
easily.
To access the Personal Data Log, go to Setup Security Personal Data Log .
Note
PII data can also be imported via API and the Import/Export feature. In that case, the user who performs
the import is logged as the performer and there is no indication in the log that the import was done via API
or Import/Export.
Some types of PII are more rigorously protected than others (for example, social security number and driver’s
license number) since the unauthorized acquisition of this information could be harmful to the concerned
individual. Such information is termed Sensitive information in SAP CPQ and its old and new values are not
logged in the system.
In order to flag data as sensitive, you need to make sure it is flagged as PII first since only PII data can be
sensitive. Some data is PII by default, but there is also data that needs to be flagged as PII manually. Refer to
this topic [page 744] to see which data is PII by default and which is not. To flag PII data as sensitive, activate
the Sensitive toggle switch while adding/editing SAP CPQ objects.
Note
If the following objects are flagged as sensitive information, they will retain that flag after being sent and
deployed via Deploy / Send Changes [page 563]:
● Attributes (deployed as elements of other deployment package components: products, guided selling,
custom fields or CRM integrations)
● Quote Tables
● Custom tables
● Quote custom fields
● Quote item custom fields
Personally identifiable information about SAP CPQ users and customers can be exported. If users/customers
prove that their identity is genuine, they can request extraction of personally identifiable information.
Prerequisites
Context
In SAP CPQ, User and Customer objects are by default flagged as PII. However, PII can also be located in other
objects, in which case they need to be flagged manually. To do this, select the Personally Identifiable
Information checkbox on each object individually. Unflagged data can’t be exported.
Any data that was in the system before this functionality was created can’t be exported until it’s manually
flagged as PII.
Procedure
If there are multiple users with identical names, the data in the cards will help you distinguish between
them.
5. Click Filter Data.
To filter all objects, click Search Data right away, without manually filtering the objects.
Pills with object labels are displayed and all requested objects with user/customer PII are listed. If there’s
no PII in the requested objects, only their names and empty columns are displayed.
9. Select checkboxes for all data you wish to export.
10. Click either Export as .xlsx or Export as PDF.
Next Steps
Extracting customer PII is done in a similar way. The only difference is that customers don’t have usernames,
so when you select the Search Customers button, you need to enter a customer’s full name or an email address
in the search field.
Each performed search for users’ or customers’ PII is tracked in Audit Trail Admin Actions .
After you click Search Data, pills with object labels you selected in the Search Filter are displayed, followed by
the requested objects with user/customer PII. Pills are used for data filtering.
By clicking X next to a pill with an object label, the corresponding object is hidden. The objects themselves
consist of PII sorted in columns listed in the following text. You can choose which columns you wish to export
by selecting/unselecting the adjacent checkboxes.
● Quotes
○ Quote Number
○ Quote Owner
○ Customer
○ Status
○ Date Created
○ Date Modified
● Quote Custom Fields
○ Custom Field Content
○ Custom Field Name
○ Quote Number
○ Quote Owner
○ Tab Name
● Quote Item Custom Fields
○ Custom Field Content
○ Custom Field Name
○ Custom Field Label
○ Quote Number
○ Product Name
○ Date Modified
● Quote Tables
○ Column Value
○ Table Label
○ Table Name
○ Column Name
○ Quote Number
○ Tab Name
○ Date Modified
● User Custom Fields
○ Custom Field Content
○ Custom Field Name
○ Custom Field Label
○ On User
● Customer Custom Fields
○ Custom Field Content
○ Custom Field Name
○ Custom Field Label
○ On Customer
● Custom Tables
○ Column Value
Note
As of the 1905 release, the Modified By column for Custom Tables displays the name of the user who last
modified the custom table row in which user/customer data is found. However, in the previous releases the
Modified By column displayed the name of the user who last modified the entire custom table for the
custom tables created before 1905, as the system did not record changes on row-level.
This topic lists items logged in the Audit Trail regarding viewing and exporting personally identifiable
information.
These features can be used together for establishing efficient and secure SOAP communication between two
different servers.
You can upload WSDL [page 752] files for interpreting secured SOAP messages sent from third-party web
services to SAP CPQ. These SOAP messages are secured with SSL certificates which are created with the
Certificate Management [page 751] feature. The same web service URL should be defined during the creation
of a certificate for secure communication with the server on which the service is installed, and WSDL which
describes the service.
On the Certificate Management page, you can create and manage certificates for securing SOAP
communication.
In the future releases, this feature will be used for managing all digital security certificates in SAP CPQ, except
the ones used for email protection, which is done in the DKIM Keys page.
The certificates are used for securing messages sent to the URL you have specified during certificate creation.
The SOAP messages are encrypted, and only those who have the appropriate keys can verify the received
SOAP message requests and access the information contained within the messages. In short, if the received
SOAP message is verified, messages can be exchanged between two endpoints securely.
Note
SOAP communication can be secured in two directions – from SAP CPQ towards the client, and from the
client towards SAP CPQ.
To create a new certificate, go to Setup Security Certificate Management and click New Certificate.
● Let SAP CPQ generate a certificate – Enter the certificate name, select the encryption type and key size.
This is the best option if you do not already have a certificate that can be used.
● Add a certificate manually - Paste the private key in the Private key (required) field and the certificate in the
Certificate (required) field. Enter the certificate password in the Password (required) field. For this option,
you first need to generate the certificate externally to be able to use it in SAP CPQ.
● Upload a certificate from a file – upload a PFX file containing a certificate by clicking Upload a PFX file. Enter
the password for the file in the Password (required) field.
Note
Regardless of the selected certificate creation method, the Purpose (required) dropdown and the SOAP URL
(required) field are required and common in all three cases.
● Outbound SOAP Header Signing - secure SOAP communication from SAP CPQ towards clients
● Inbound SOAP Header Signing - secure SOAP communication from clients towards SAP CPQ
In the Service URL (required) field you need to provide the path to the secure gateway on which the service
(WSDL) is installed.
Once you have created a certificate and made it Active via the toggle switch, it will be used to secure all SOAP
communication exchanged between SAP CPQ and a client. Only one Outbound SOAP Header Signing
certificate can be made active per a service URL.
Once a client uploads/generates a certificate in SAP CPQ and makes it active, the certificate will be used on
SAP CPQ side to verify all inbound SOAP messages from that client. Likewise, if the client is verifying a SAP
CPQ response of an inbound SOAP message, they need to use the matching certificate.
This feature gives administrators the ability to upload and store WSDL files in SAP CPQ.
WSDL files are used for describing a SOAP-based web service and creating a link between two distinct servers.
In order to be used properly, WSDL files added to SAP CPQ need to be connected to a URL of the endpoint on
which the web service is installed.
To initialize the web service, you need to use the following method from scripting:
ws = WebServiceHelper.LoadImportedWsdlService(“Wsdl”,”UrlToService”)
ws.pathToWSDLServiceMethod()
Once you do this, the SAP CPQ scripting environment will create a proxy class which can perform
communication targeting the service URL.
Context
If you’re adding WSDLs of web services with which you’ve previously established secure SOAP communication
in Certificate Management, the service URL you provide when adding a WSDL file needs to be the same as the
service URL you provide during the creation of a certificate.
Procedure
Results
Once a WSDL file is added to SAP CPQ, it will provide the means of communication between SAP CPQ and the
server with which SOAP communication is performed.
Access Rights gives you an option to hide some of the Setup sections and entities or make them read-only to
individual administrators or permission groups.
It is customary for different administrators to manage different tasks in SAP CPQ, which means that they do
not require access to the sections outside their domain.
Note
For now, the only options under Setup Sections that can be flagged as read-only are Users Users and
Product Catalog Custom Tables .
To gain access to this feature, you need to explicitly request it from the SAP CPQ Support Team. Once the
feature is implemented, only the administrator who requested it will have the option to assign access rights for
Setup sections and entities to other administrators.
This tab offers administrators the option to select individual administrators or custom permission groups and
allow them to access certain Setup sections and Setup entities. These sections and entities are selected in the
Setup Sections and Setup Section Entities trees respectively.
All administrators will have access to all Setup sections until the Enable Access Rights toggle switch is enabled.
If administrators belong to two (or more) permission groups and one of them has read-only access rights for
either Users or Custom Tables in the Entries in Selected Sections column while the other permission group has
edit right for the same sections, the read-only access rights prevail by default. Even though the administrators
belong to both permission groups, they will only be able to view these entries.
This behavior can be altered with the toggle switch Editing rights will prevail when two or more permission
groups administrators belong to have both read-only and edit access rights to a particular Setup option. If the
toggle switch is active and administrators belong to at least one permission group that has edit access rights
for either Custom Tables or Users, the edit access rights will always prevail.
You can assign access rights to other administrators and permission groups on a Setup section level.
Prerequisites
Context
If you are a member of several permission groups, once access rights are enabled, you will automatically have
access to the union of sections and entities that your permission groups [page 154] have access to. If you have
access to overlapping sections with conflicting access rights, read-only rights will null full access rights.
Note
Any administrators to whom no sections were assigned will only have access to Setup Home, System
Performance and Business Performance sections.
Procedure
Once you select a setup section, all options under it will automatically be selected.
4. (Optional) Select the Show only selected checkbox to make only the setup sections you selected appear.
5. Activate the Enable Access Rights toggle switch.
You can assign access rights to other administrators and permission groups on a Setup section and section
entity level.
Context
If you are a member of several permission groups, once access rights are enabled, you will automatically have
access to the union of sections and entities that your permission groups [page 154] have access to. If you have
access to overlapping sections with conflicting access rights, read-only rights will null full access rights.
Procedure
The Setup Section Entities tree expands if you select the Pricing Catalog Custom Tables or
Import/Export Bulk Import/Export options.
4. Select the entities to which you wish to assign administrators’ rights.
Custom Tables entity by default has a Select All checkbox selected. Deselecting the checkbox makes a
search bar appear, which can be used for browsing custom tables.
5. Activate the Enable Access Rights toggle switch.
This tab contains the Select Access Rights Administrators field in which you can state which administrators will
be able to use the Access Rights functionality. These administrators will be able to assign access rights to other
administrators and permission groups.
Procedure
Access rights assigned to you have impact on your ability to deploy and send custom tables.
● Create deployment packages containing custom tables if the visibility of those tables is enabled for you
with the Access Rights feature.
● Send packages containing those custom tables to target environments.
● Deploy packages containing custom tables only if you have editing rights for them.
● Create or update the existing custom tables from the package if you have editing access rights for custom
tables. To do this, the visibility of custom tables needs to be granted to you with the Access Rights feature.
If the package contains custom tables you can’t see, it can’t be deployed.
The DomainKey Identified Mail (DKIM) authentication standard adds an encrypted digital signature to
outbound email messages sent on company’s behalf.
As a result, email recipients who have implemented DKIM on their side can be certain that messages really
come from SAP CPQ and have not been modified along the way.
To set up the functionality and generate a key, take the following steps:
Note
The private key is not visible, whereas the public key of the defined DKIM key can be copied from the Public Key
column or downloaded as a .cer file. Additionally, the DKIM key can be edited by clicking the Edit button. The
selector, domain and encryption algorithm can all be edited, whereas the private/public key pair cannot be
modified. You can leave the existing key pair as is or generate a new pair, as explained in step 7.
The following conditions determine whether or not an email message has a DKIM signature:
● If the sender’s email is defined in Setup Application Parameters General Parameters Sender Email
Address and the DKIM signature has been set up for the sender’s email domain, the email is signed with
the DKIM signature set for the sender’s email domain.
● If neither the sender nor the From (user) email domain match any available DKIM settings, the email is not
signed.
The newly created DKIM key is inactive by default, so you have to activate it by enabling the toggle switch in the
Active column. However, before activating the DKIM key, you need to add the public key to the DNS record.
To confirm that DKIM authentication is active, you can use both Gmail and Yahoo accounts.
1. Send a message from your domain (e.g. [email protected]) to your Gmail email address.
2. Open the message in your Gmail inbox
3. Click the downward arrow next to the recipient’s name (in this case, your name) to view details.
A pop-up displays.
If there is signed-by: your domain, DKIM authentication is active.
Although they are accessed on the user side of the application, the Log and the Developer Console can only be
accessed by administrators.
15.1 Log
The Log allows SAP CPQ administrators to monitor Iron Python scripts and track all the data manually logged
from them.
Administrators can see all the errors that occur in the scripts, making it easier to fix them. Additionally, the
administrator is able to see if some formula that is part of approval rule fails during parse by the rule engine.
Example
This script will run each time a new quote is created. It uses a log interface to log which user has created the
quote. It simulates the division by zero operation that triggers an exception. The script will break each time it’s
executed and the error will be logged. The administrator is able to see this log on the Log page along with all the
contextual data related to the creation of the quote, such as Date, Session ID, and so on.
Note
You can track the status of email notifications in the log after enabling email notification logging in
General Application Parameters Shopping Cart and Quotes Use Additional Logging For Email
Notification . You can find more information on email notification logging on the Notifications [page 342]
page.
The Developer Console is a practical tool that allows tracing of scripts and business rules executed in the
production system. It allows you to analyze your actions in SAP CPQ easily, profile application problems and
locate potential bottlenecks.
The Developer Console is accessible from the side menu, under the Setup menu item. The tool opens in a new
tab so you can work in SAP CPQ and track actions and traces in parallel. The console captures up to 10,000
traces per request (a request is a click in the application). When you first access it, the Developer Console is
empty until you start working in the application.
Example
If you need to track and analyze all actions that have been performed on a quote in SAP CPQ, click Developer
Console and the tool opens in a separate tab. Select the Full Mode checkbox. In the first tab, open the quote
whose actions you wish to analyze. If you go back to the Developer Console, you can see that all the actions you
performed on the quote from the moment you first opened the console are listed. Also, all future actions that
you’ll perform on the quote will also be recorded in the console.
Depending on the data you wish to track in the Developer Console, you can select/unselect these checkboxes:
Note
There’s a set of keyboard shortcuts you can use to easily navigate between actions and trace lines. Press
Shift + ? to open the list of shortcuts.
15.2.1 Actions
The Developer Console refreshes as you perform actions in SAP CPQ, and new data is added to the list of
actions and traces.
The tool lists only actions that you performed during the current session. A good practice is to clear the
Developer Console by clicking Clear, and then perform actions in the application. This way you’ll have a clearer
overview of the data related only to a particular action.
The list of tracked actions is displayed in the header of the Developer Console. To collapse/expand the section,
click Hide actions and Show actions, respectively. All listed actions have time stamps, duration in seconds and
available actions (view, download, and performance). If an error occurs, the action's information is displayed
within the table with red background that indicates that the action is somehow erroneous. To see details of an
action, click on the action's row, and all the details will be displayed within Trace.
Performance Details
The Performance details dialog box provides a more detailed overview of the performance of a particular action.
Example
For the GetInitData action, the Performance details dialog box displays details for logs labeled Quote Parser.
15.2.2 Trace
This section displays a detailed trace for every action recorded in the Developer Console. The data is displayed
chronologically, in the order that the actions had taken place.
● Message - detailed description of the trace. If you select Negative Filter and enter a search term, the system
displays only the lines that don’t contain that term in the description. This field also allows filtering support
for special search characters: question marks and asterisks. The question mark replaces one character
and the asterisk replaces any character and any number of characters.
● Logger - the class from which the method was initiated.
● Level - Trace H are high-level traces and Trace L are low-level traces.
● Labels - a label describing the trace (such as Scripting, QuoteParser, or DatabaseQuery).
● duration (ms) - the time needed for the method to execute.
● from parent (ms) - the time needed for the parent method to trigger the current method.
If you want to focus on one trace line, enter a search term in a column to find the trace and select the line. If you
remove the search term, the line remains selected and all other trace lines are displayed again. If you want to
rearrange actions to view the slowest actions first, click Slowest first in the duration (ms) column. This
rearranges the trace lines so that the slowest actions are displayed on top. You can click the action you’re
interested in and unselect the Slowest first checkbox, and the selected trace line remains selected, allowing you
to see the context in which the action was executed. Logs that show up when scripts attached to events are
triggered are labeled ScriptEvent. All other scripts have the Script label.
Note
Formula errors are logged in the Trace section with the log level Error and the label Formula Error.
Note
The flag ITrace.IsOn, which is available in scripting, indicates whether tracing is turned on or off. With
the help of this flag, users can organize the logic that is related to tracing and, that way, optimize script
execution time.
When you’re analyzing your trace lines, you can use the breadcrumbs to check how you arrived to the line and
view actions that occurred. In the trace list, click . Other traces are removed from the list, so that only the
pinned trace and its children traces are displayed, and the breadcrumbs display above the list. By pinning, you
can isolate a group of traces within one action and focus on analyzing them. Using this feature affects groups
on the left-hand side. Clicking the same icon removes the breadcrumbs and all data is displayed in Trace. If you
select a particular group, only the content of that group is displayed. Doing so is useful when you have
extensive data.
15.2.3 Groups
The Groups section lists the main traces (high-level traces - Trace H) so you can expand them and have a
hierarchical overview of the underlying traces.
You can filter groups by entering a keyword. The filter can also be negative (for example, you can choose to view
all the traced lines that don’t contain a particular word, such as clone, for example). The feature also enables
filtering support for characters, asterisks, and question marks. The question mark replaces one character and
the asterisk replaces any character and any number of characters.
a = 0;
Trace.Write("a is initialized.")
a = 100;
Trace.Write("a is changed.")
This script initializes the variable a, traces the variable, and later updates the value of the variable to 100 and
traces it once again. When the script gets executed (for example, after the quote has been changed), the
Developer Console logs two trace messages and displays them.
Note
When you set your script to be a post action for Generate Documents, make sure to use Log.Write to log
your data and any messages. Avoid using Trace.Write since it doesn’t get recorded in the Developer
Console. This only applies to the Generate Documents action.
Tracking attribute changes during rule execution loops can help you understand why the system is maybe
slower than usual. For example, if your product rules overlap, SAP CPQ takes longer to execute the rules. For
example, the product Network cable has two rules attached to it: if Category 6 is selected, the cable length
is set to 100 meters and if the length of the cable is over 100 meters, then the Category 6 must be selected. If
users first set the cable length to 110 meters, then both rules are executed. The first rule sets the cable
category to Category 6 and the second rule sets the cable length as a result of the Category 6 setting (100
meters). In scenarios like this, rules are always going to be performed in two loops, because the two rules
correlate. The Developer Console records execution of rules, and displays a message that describes why the
system is running slower.
Hyperlinks
Some links are classified by an icon and/or a mouseover text. These links provide additional information.
About the icons:
● Links with the icon : You are entering a Web site that is not hosted by SAP. By using such links, you agree (unless expressly stated otherwise in your
agreements with SAP) to this:
● The content of the linked-to site is not SAP documentation. You may not infer any product claims against SAP based on this information.
● SAP does not agree or disagree with the content on the linked-to site, nor does SAP warrant the availability and correctness. SAP shall not be liable for any
damages caused by the use of such content unless damages have been caused by SAP's gross negligence or willful misconduct.
● Links with the icon : You are leaving the documentation for that particular SAP product or service and are entering a SAP-hosted Web site. By using such
links, you agree that (unless expressly stated otherwise in your agreements with SAP) you may not infer any product claims against SAP based on this
information.
Example Code
Any software coding and/or code snippets are examples. They are not for productive use. The example code is only intended to better explain and visualize the syntax
and phrasing rules. SAP does not warrant the correctness and completeness of the example code. SAP shall not be liable for errors or damages caused by the use of
example code unless damages have been caused by SAP's gross negligence or willful misconduct.
Gender-Related Language
We try not to use gender-specific word forms and formulations. As appropriate for context and readability, SAP may use masculine word forms to refer to all genders.
SAP and other SAP products and services mentioned herein as well as
their respective logos are trademarks or registered trademarks of SAP
SE (or an SAP affiliate company) in Germany and other countries. All
other product and service names mentioned are the trademarks of their
respective companies.