Uploads and downloads files using InStream/OutStream, attaches documents to records via Table 1173, imports and exports CSV/XML with XMLport, and stores blobs in Azure Storage. Use when adding file attachments to sales orders, importing data from CSV, exporting reports to files, or connecting to Azure Blob Storage.
69
83%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
UploadIntoStream opens file dialog, InStream contains dataIsSuccessful()Note: ALWAYS CalcFields(BlobField) before CreateInStream. Web Client allows only ONE DownloadFromStream per request.
// Upload
if UploadIntoStream('Select file', '', 'All Files (*.*)|*.*', FileName, InStr) then
// Process InStr
// Download - MUST CalcFields first for Blob
CalcFields("File Content");
if "File Content".HasValue() then begin
"File Content".CreateInStream(InStr);
DownloadFromStream(InStr, '', '', '', FileName);
end;Standard (Table 1173):
// Replace <SourceTable> and field names with your record
DocumentAttachment.Init();
DocumentAttachment.Validate("Table ID", Database::<SourceTable>);
DocumentAttachment.Validate("No.", <Record>."<KeyField>");
DocumentAttachment.Validate("Document Type", <Record>."<TypeField>"); // If applicable
DocumentAttachment.InsertFromStream(InStr, FileName);Custom Blob field:
Rec."File Content".CreateOutStream(OutStr);
CopyStream(OutStr, InStr);
Rec.Modify();xmlport <ID> "<PREFIX> Import Data"
{
Direction = Import;
Format = VariableText;
FieldDelimiter = '"';
FieldSeparator = ';';
TextEncoding = UTF8;
schema
{
textelement(Root)
{
tableelement(TempImport; "<PREFIX> Import Buffer")
{
UseTemporary = true;
AutoSave = false;
fieldelement(ItemNo; TempImport."Item No.") { }
fieldelement(Description; TempImport.Description) { }
trigger OnAfterInsertRecord()
begin
ProcessLine(TempImport);
end;
}
}
}
}Key properties: Direction (Import/Export/Both), Format (Xml/VariableText/FixedText), TextEncoding (UTF8/UTF16)
var
ABSBlobClient: Codeunit "ABS Blob Client";
StorageServiceAuthorization: Codeunit "Storage Service Authorization";
Authorization: Interface "Storage Service Authorization";
begin
Authorization := StorageServiceAuthorization.CreateSAS(GetSASToken());
ABSBlobClient.Initialize(AccountName, ContainerName, Authorization);
// Upload
TempBlob.CreateInStream(InStr);
ABSOperationResponse := ABSBlobClient.PutBlobBlockBlobStream(BlobName, InStr);
// Download
ABSOperationResponse := ABSBlobClient.GetBlobAsStream(BlobName, InStr);
end;Requires: Azure Storage Account + SAS Token in Isolated Storage.
// Store (returns GUID key)
BlobKey := PersistentBlob.Create();
PersistentBlob.CreateOutStream(OutStr);
OutStr.WriteText(Data);
// Retrieve
PersistentBlob.CreateInStream(BlobKey, InStr);
InStr.ReadText(Data);
PersistentBlob.Delete(BlobKey); // Clean up⚠️ NOT for permanent storage - causes locking issues.
// JSON
JsonObj.Add('key', 'value');
JsonObj.WriteTo(JsonText);
JsonObj.ReadFrom(JsonText);
if JsonObj.Get('key', JsonTok) then MyText := JsonTok.AsValue().AsText();
// XML
XmlDoc := XmlDocument.Create();
XmlDoc.Add(XmlElement.Create('Root'));
XmlDocument.ReadFrom(XmlText, XmlDoc);
XmlDoc.SelectSingleNode('//Child', XmlNode);52f8705
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.