DK Plus exposes dynamic tables through /api/v1/general/table. Because table schemas differ, records are represented as read-only dictionaries while fixed metadata responses use DevOp-owned DTOs: TableChangeSummary and TableDeletedRecord.
List available fields before querying an unfamiliar table:
devop-dk table fields ARCUST
Read a bounded set of records from /api/v1/general/table/{name}/records:
devop-dk table records ARCUST \
--fields Number \
--fields Name \
--take 25
Fields may also be comma-separated:
devop-dk table records ARCUST --fields Number,Name --take 25 --json
The Cocona command parameter is string[] fields. Use the standard long option --fields (or short option -f) either repeatedly or with comma-separated field names:
devop-dk table records ARCUST -f ItemCode,Description --take 25
devop-dk table records ARCUST --fields ItemCode --fields Description --take 25
Apply incremental and key/value filters:
devop-dk table records ARCUST \
--fields Number,Name \
--modified-since 2026-10-01T00:00:00Z \
--key Number \
--value C-100 \
--take 100
Read one record with one or more query clauses:
devop-dk table record ARCUST \
--fields Number,Name \
--query Number=C-100
Inspect changes and deleted-record metadata:
devop-dk table changes ARCUST --modified-since 2026-10-01T00:00:00Z
devop-dk table deleted ARCUST --from 2026-10-01T00:00:00Z --take 100
All table list operations (table records, table changes, table deleted) are bounded by --take, which defaults to 100; they have no --all. Add --json to any command for automation-friendly output.
If DK Plus rejects a record request with HTTP 400, the CLI checks the table schema and reports unknown requested fields instead of printing a stack trace. Use devop-dk table fields <name> directly when exploring an unfamiliar table.
The CLI (table create, table update, table delete) and the PowerShell module (New-TableRecord, Update-TableRecord, Remove-TableRecord) write records through the generic table endpoints. Table values are dkERP text, so every value is a string; nothing is converted, which also keeps the commands independent of the current culture.
# Field values from repeatable --value Field=Value options (split on the first '='; empty values are sent as "")
devop-dk table create ARCUST --value Number=C-100 --value Name="Acme = Ltd"
# ... or from a flat JSON object of strings (--value and --file are mutually exclusive)
devop-dk table create ARCUST --file ./record.json --json
devop-dk table update ARCUST C-100 --value Name="Acme Ltd"
# Delete is the only table write that needs --yes
devop-dk table delete ARCUST --key Number --value C-100 --yes
New-TableRecord ARCUST -Value @{ Number = 'C-100'; Name = 'Acme = Ltd' }
Update-TableRecord ARCUST C-100 -Path ./changes.json
Remove-TableRecord ARCUST -Key Number -Value C-100
create and update are ordinary writes and run directly, with no --yes (the cmdlets are Medium impact). delete requires --yes (exit code 2 and no request without it); Remove-TableRecord is High impact, and its confirmation target names the table, field, and value. DK Plus documents the delete action as performed at your own risk. Table mutations are never retried.
Input rules, checked before any request (exit code 2 in the CLI, DkPlus.InvalidArgument in PowerShell):
--value or --file, never both and never neither (-Value or -Path in PowerShell are separate parameter sets).--file or -Path document is one flat JSON object. A number, boolean, null, array, or nested object value is rejected, and the message names the field. A PowerShell hashtable value that is not a string is rejected the same way.delete needs a non-blank --key and --value.The <key> of update is the record key as DK Plus interprets it (for example the customer number for ARCUST), and whether DK Plus keeps or resets the fields you do not send is unverified live. Try an update on a test company first.
IReadOnlyList<IReadOnlyDictionary<string, string>> records =
await client.Table.GetRecordsAsync(
"ARCUST",
["Number", "Name"],
modifiedSince: DateTimeOffset.UtcNow.AddDays(-1),
maximum: 100,
cancellationToken: cancellationToken);
IReadOnlyList<string> fields =
await client.Table.GetFieldsAsync("ARCUST", cancellationToken);
TableChangeSummary? changes =
await client.Table.GetChangeSummaryAsync(
"ARCUST",
DateTimeOffset.UtcNow.AddDays(-1),
cancellationToken);
The library's CreateRecordAsync, UpdateRecordAsync, and DeleteRecordAsync take the same string dictionaries and keys. Project delete (Project.DeleteAsync, devop-dk project delete, Remove-Project) uses the delete route on the dkERP project table pjjob, because DK Plus has no project DELETE endpoint.