---
id: object/tableextension/8054
type: object
title: Table extension 8054 "Sales Line"
summary: Table extension 8054 "Sales Line" in Subscription Billing (Microsoft.SubscriptionBilling), extends "Sales Line". 6 fields, 17 public procedures, 3 events. Introduced in BC29, still in BC30.
tier: official
language: en
tags:
  - tableextension
  - subscription billing
versions:
  introduced: "29"
  last_changed: null
  deprecated: null
review:
  state: derived
  by: null
  at: null
  flags: []
generated:
  at: "2026-10-11T00:31:51.816Z"
  pipeline: 0.2.0
  prompts: {}
  input_hash: 3a9ac824ce6aee8332535d59e0ca2fa086e427a8f564c7b005685900ea3f25cb
evidence:
  - kind: code
    url: https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Apps/W1/Subscription%20Billing/app/Sales%20Service%20Commitments/Table%20Extensions/SalesLine.TableExt.al
    title: src/Apps/W1/Subscription Billing/app/Sales Service Commitments/Table Extensions/SalesLine.TableExt.al (releases/29.x)
    date: null
    commit: ea08af5ef2d6a9b5c5af4a029288abbe2c883220
    t: null
    quote: null
links:
  learn: []
  objects:
    - object/table/37
  features: []
  topics: []
  localizations: []
  videos: []
  posts: []
  guidelines: []
  changes:
    - change/bcapps/10210
    - change/bcapps/10156
    - change/bcapps/9217
object_type: tableextension
object_id: 8054
name: Sales Line
namespace: Microsoft.SubscriptionBilling
app: Subscription Billing
extends: Sales Line
first_version: "29"
last_version: "30"
present_in:
  - "29"
  - "30"
changed_in: []
source_major: "29"
obsolete: null
countries: []
ms_search_form_ids: []
counts:
  fields: 6
  procedures: 23
  events: 3
  subscribers: 0
relations:
  out: 2
  referenced_by: 0
  pages: 0
  extended_by: 0
  event_subscribers: 0
  calls: 0
  called_by: 0
  implements: 0
---

# Table extension 8054 "Sales Line"

> Table extension 8054 "Sales Line" in Subscription Billing (Microsoft.SubscriptionBilling), extends "Sales Line". 6 fields, 17 public procedures, 3 events. Introduced in BC29, still in BC30.

Subscription Billing · Microsoft.SubscriptionBilling · BC29-30 · [source at ea08af5e](https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Apps/W1/Subscription%20Billing/app/Sales%20Service%20Commitments/Table%20Extensions/SalesLine.TableExt.al) · facts from BC29

Extends [Sales Line](../table/37.md).

## Fields

Explanation: the field's ToolTip in the code; without one, the ToolTip of a page control bound to the field (marked via the page); without that, its Caption (marked caption) when that differs from the name.

| No. | Name | Type | Explanation | Notes |
|---|---|---|---|---|
| 8053 | Recurring Billing from | Date | — | DataClassification CustomerContent |
| 8054 | Recurring Billing to | Date | — | DataClassification CustomerContent |
| 8055 | Subscription Lines | Integer | Specifies the number of Subscription Lines for the sales line. <small>via [Page extension 8009 "Blanket Sales Order Subform"](../pageextension/8009.md)</small> | FlowField: count("Sales Subscription Line" where("Document Type" = field("Document Type"), "Document No." = field("Document No."), "Document Line No." = field("Line No."))); not editable |
| 8057 | Subscription Option | Enum "Item Service Commitment Type" | — | FlowField: lookup(Item."Subscription Option" where("No." = field("No."))); enum [Enum 8056 "Item Service Commitment Type"](../enum/8056.md); not editable |
| 8058 | Discount | Boolean | — | not editable; DataClassification CustomerContent |
| 8059 | Exclude from Doc. Total | Boolean | Exclude from Document Total <small>caption</small> | DataClassification CustomerContent |

## Events published

- `OnBeforeSetExcludeFromDocTotal(var SalesLine: Record "Sales Line"; var IsHandled: Boolean)` (integration)
- `OnAfterUpdateSalesSubscriptionLineCalculationBaseAmount(var SalesLine: Record "Sales Line"; xSalesLine: Record "Sales Line")` (integration)
- `OnBeforeErrorIfServiceObjectTypeCannotBeSelectedManually(var SalesLine: Record "Sales Line"; FieldNo: Integer; var IsHandled: Boolean)` (integration)

## Procedures

- `InitCachedVar()`
- `IsSalesDocumentTypeWithServiceCommitments(): Boolean`
- `InitFromSalesHeader(SourceSalesHeader: Record "Sales Header")`
- `DeleteSalesServiceCommitment()`: Deletes the Sales Subscription Lines that belong to this Sales Line. Call this whenever a Sales Line is removed without running its triggers (Delete(false), DeleteAll(false)), because the OnDelete() trigger of this table extension does not fire in that case and the Sales Subscription Lines would be ...
- `GetCombinedDimensionSetID(DimSetID1: Integer; DimSetID2: Integer)` (internal)
- `IsServiceCommitmentItem(): Boolean` (internal)
- `SetExcludeFromDocTotal()` (internal)
- `IsLineWithServiceObject(): Boolean` (internal)
- `IsTypeServiceObject(): Boolean` (internal)
- `InsertDescriptionSalesLine(SourceSalesHeader: Record "Sales Header"; NewDescription: Text; AttachedToLineNo: Integer)`
- `CreateAttachedSalesLine(SourceSalesHeader: Record "Sales Header"; NewDescription: Text; AttachedToLineNo: Integer)` (internal)
- `RetrieveFirstContractNo(ServicePartner: Enum "Service Partner"; Process: Enum Process): Code[20]` (internal)
- `IsLineAttachedToBillingLine(): Boolean`: Checks whether this sales line is linked to a Subscription Billing Line. The result is cached per line, so repeated calls on the same line do not re-query the database.
- `CreateContractDeferrals(): Boolean` (internal)
- `IsContractRenewalQuote(): Boolean` (internal)
- `IsContractRenewal(): Boolean` (internal)
- `GetSalesDocumentSign(): Integer` (internal)

Plus 3 local procedures.

## Triggers

OnDelete

## Relations

- extends [Table 37 "Sales Line"](../table/37.md)
- Subscription Lines: CalcFormula [Table 8068 "Sales Subscription Line"](../table/8068.md)

## Recent changes

- 2026-10-02 [#10210 [Bug][Subscription Billing] "Delete Invoiced Sales Orders" leaves orphaned Sales Subscription Lines behind](../../changes/bcapps/10210.md) (main, BC30, fix)
- 2026-09-28 [#10156 [Bug][SubscriptionBilling] Assign Subscription Lines dialog does not identify the sales line it was opened for](../../changes/bcapps/10156.md) (main, BC30, fix)
- 2026-09-25 [#9217 [Extensibility][SubscriptionBilling]: Make IsLineAttachedToBillingLine accessible from external apps in Sales Line and Purchase Line](../../changes/bcapps/9217.md) (main, BC30, feature)

## Across versions

- Present in: BC29-30
- Changed (declaration) in: none

Source: AL metadata extracted from the code (names, ids, signatures, properties); no code bodies (D10).

## Ask your agent

Procedure bodies are not stored here (D10). For a procedure body or the calls of one procedure, ask bc-code-atlas (external, by Stefan Maron, MIT; default corpus w1-28), which the bc-observatory plugin connects: `bcatlas_resolve_node(object_type: "tableextension", object_name: "Sales Line")`, then `bcatlas_get_procedure_body` or `bcatlas_get_neighbors` on the returned id.
