bc-code-intelligence-mcp
Version:
BC Code Intelligence MCP Server - Complete Specialist Bundle with AI-driven expert consultation, seamless handoffs, and context-preserving workflows
200 lines (168 loc) • 5.75 kB
Markdown
# API Fieldset Registration Sample
## Overview
This sample demonstrates how to implement fieldset registration patterns for dynamic API field management and metadata-driven field selection.
## Basic Fieldset Registration
```al
codeunit 50100 "API Fieldset Registration"
{
procedure RegisterCustomerFieldset()
var
FieldsetRegistry: Codeunit "Fieldset Registry";
CustomerFieldset: Record "API Fieldset";
begin
// Register basic customer fieldset
CustomerFieldset.Init();
CustomerFieldset."Table ID" := Database::Customer;
CustomerFieldset."Fieldset Name" := 'BASIC';
CustomerFieldset."Field No." := Customer.FieldNo("No.");
CustomerFieldset.Insert();
CustomerFieldset."Field No." := Customer.FieldNo(Name);
CustomerFieldset.Insert();
CustomerFieldset."Field No." := Customer.FieldNo("Phone No.");
CustomerFieldset.Insert();
// Register extended customer fieldset
CustomerFieldset."Fieldset Name" := 'EXTENDED';
CustomerFieldset."Field No." := Customer.FieldNo("Credit Limit (LCY)");
CustomerFieldset.Insert();
CustomerFieldset."Field No." := Customer.FieldNo("Balance (LCY)");
CustomerFieldset.Insert();
end;
}
```
## Dynamic Field Selection
```al
codeunit 50101 "Dynamic Field Selection"
{
procedure GetCustomerFields(FieldsetName: Text): List of [Integer]
var
APIFieldset: Record "API Fieldset";
FieldList: List of [Integer];
begin
APIFieldset.SetRange("Table ID", Database::Customer);
APIFieldset.SetRange("Fieldset Name", FieldsetName);
if APIFieldset.FindSet() then
repeat
FieldList.Add(APIFieldset."Field No.");
until APIFieldset.Next() = 0;
exit(FieldList);
end;
procedure ApplyFieldset(var CustomerRec: Record Customer; FieldsetName: Text)
var
FieldList: List of [Integer];
FieldNo: Integer;
begin
FieldList := GetCustomerFields(FieldsetName);
CustomerRec.SetLoadFields();
foreach FieldNo in FieldList do
CustomerRec.AddLoadFields(FieldNo);
end;
}
```
## Conditional Registration
```al
codeunit 50102 "Conditional Fieldset Reg"
{
procedure RegisterConditionalFieldset(TableID: Integer; Condition: Text)
var
ConditionalFieldset: Record "Conditional API Fieldset";
begin
ConditionalFieldset.Init();
ConditionalFieldset."Table ID" := TableID;
ConditionalFieldset.Condition := Condition;
ConditionalFieldset."Field Selection" := GetFieldsForCondition(TableID, Condition);
ConditionalFieldset.Insert();
end;
local procedure GetFieldsForCondition(TableID: Integer; Condition: Text): Text
var
FieldSelection: Text;
begin
case Condition of
'MINIMAL':
FieldSelection := 'No.,Name';
'STANDARD':
FieldSelection := 'No.,Name,Phone No.,E-Mail';
'COMPLETE':
FieldSelection := '*';
end;
exit(FieldSelection);
end;
}
```
## API Integration
```al
page 50100 "Customer API with Fieldsets"
{
APIPublisher = 'contoso';
APIGroup = 'sample';
APIVersion = 'v1.0';
EntityName = 'customer';
EntitySetName = 'customers';
SourceTable = Customer;
trigger OnOpenPage()
var
FieldsetManager: Codeunit "Dynamic Field Selection";
RequestedFieldset: Text;
begin
// Get fieldset from query parameter
RequestedFieldset := GetFieldsetFromRequest();
if RequestedFieldset <> '' then
FieldsetManager.ApplyFieldset(Rec, RequestedFieldset);
end;
local procedure GetFieldsetFromRequest(): Text
var
RequestHeaders: HttpHeaders;
FieldsetHeader: Text;
begin
// Extract fieldset preference from request
if RequestHeaders.Contains('X-Fieldset') then begin
RequestHeaders.GetValues('X-Fieldset', FieldsetHeader);
exit(FieldsetHeader);
end;
exit('STANDARD');
end;
}
```
## Metadata-Driven Configuration
```al
table 50100 "API Fieldset"
{
fields
{
field(1; "Table ID"; Integer) { }
field(2; "Fieldset Name"; Code[20]) { }
field(3; "Field No."; Integer) { }
field(4; "Field Name"; Text[100]) { }
field(5; Required; Boolean) { }
field(6; "Display Order"; Integer) { }
}
keys
{
key(PK; "Table ID", "Fieldset Name", "Field No.") { Clustered = true; }
}
}
```
## Performance Considerations
```al
codeunit 50103 "Fieldset Performance Mgmt"
{
var
FieldsetCache: Dictionary of [Text, List of [Integer]];
procedure GetCachedFieldset(TableID: Integer; FieldsetName: Text): List of [Integer]
var
CacheKey: Text;
FieldList: List of [Integer];
begin
CacheKey := StrSubstNo('%1_%2', TableID, FieldsetName);
if FieldsetCache.ContainsKey(CacheKey) then
exit(FieldsetCache.Get(CacheKey));
FieldList := LoadFieldsetFromDatabase(TableID, FieldsetName);
FieldsetCache.Set(CacheKey, FieldList);
exit(FieldList);
end;
procedure ClearCache()
begin
Clear(FieldsetCache);
end;
}
```
This sample demonstrates comprehensive fieldset registration patterns including basic registration, dynamic selection, conditional logic, API integration, and performance optimization through caching.