Azure Table Storage

  • 4 minutes to read

Azure Table Storage is een service waarmee u niet-relationele, gestructureerde gegevens in de cloud kunt opslaan en op die manier buiten de Business Central database kunt bewaren.
Azure Table Storage is schemaloos, wat betekent dat u uw gegevens eenvoudig kunt aanpassen naarmate de behoeften van uw toepassing veranderen.

  • De account is de opslagaccount die werd aangemaakt binnen Azure. De URL om de Azure Table Storage te benaderen is https://account.table.core.windows.net.
  • Een tabel is een verzameling entiteiten. Met tabellen wordt geen schema voor entiteiten afgedwongen, wat betekent dat één tabel entiteiten kan bevatten die verschillende sets eigenschappen hebben. Het aantal tabellen is onbeperkt.
  • Een entiteit is een set eigenschappen die vergelijkbaar is met een databaserij (record). Een entiteit in Azure Table Storage kan maximaal 1 MB groot zijn.
  • Een eigenschap is een key-value-pair. Elke entiteit kan maximaal 252 vrij gedefinieerde eigenschappen bevatten. Elke entiteit heeft daarnaast ook drie systeemeigenschappen: een partitiesleutel, een rijsleutel en een tijdsstempel. Entiteiten met dezelfde partitiesleutel kunnen sneller worden opgevraagd en/of bijgewerkt. De rijsleutel van een entiteit is de unieke id binnen een partitie.

Codeunit CFL Azure Table Storage Mgmt

Deze codeunit is een implementatie van de Azure Table Storage REST API.

Meer info vind je ook terug op de officiële documentatie.

Property CFLAccountName

procedure CFLAccountName(): Text
procedure CFLAccountName(AccountName: Text)

Eigenschap om de naam van de Azure Storage Account in de codeunit in te stellen en/of op te vragen. Iedere instantie van de codeunit kan dus theoretisch gebruikt worden voor een andere Azure Storage Account.

Property CFLAccountKey

procedure CFLAccountKey(): Text
procedure CFLAccountKey(AccountKey: Text)

Eigenschap om de primaire/secundaire sleutel van de Azure Storage Account in de codeunit in te stellen en/of op te vragen.

De codeunit wordt dus typisch geïnstantieerd door de AccountName en AccountKey in te stellen.

procedure CFLQuery

procedure CFLQuery(Resource: Text): JsonObject

Functie om entiteiten binnen een tabel op te vragen met een vrij te definiëren syntax. Het resultaat wordt in JSON-formaat terug gegeven.

Meer info omtrent de syntax om gegevens te selecteren en/of te filteren, vind je ook op de officiële documentatie.

Bv. 'Customers()?$filter=PartitionKey eq 'Company1'&$select=Name,City'

procedure CFLRead

procedure CFLRead(TableName: Text; PartitionKey: Text; RowKey: Text): JsonObject

Functie om één specifieke tabel-entiteit (record) op te vragen. Iedere entiteit wordt binnen een tabel uniek geïdentificeerd door een PartitionKey en RowKey - beschouw dit als de primary key velden. Het resultaat wordt in JSON-formaat terug gegeven.

procedure CFLInsert

procedure CFLInsert(TableName: Text; PartitionKey: Text; RowKey: Text; Dictionary: Dictionary of [Text, Text])

Functie om een tabel-entiteit (record) toe te voegen (of te overschrijven) binnen een tabel. Iedere entiteit wordt binnen een tabel uniek geïdentificeerd door een PartitionKey en RowKey - beschouw dit als de primary key velden. De andere eigenschappen worden als key-value-pair meegegeven in een dictionary.

De eigenschappen binnen Azure Table Storage ondersteunen een beperkt aantal datatypes. Om het correcte datatype mee te geven bij creatie van de tabel-entiteit, kan je gebruik maken van onderstaande functies om eigenschappen aan de dictionary toe te voegen.

procedure CFLAddString(var dictionary: Dictionary of [Text, Text]; "Key": Text; Value: Text)  
procedure CFLAddBoolean(var dictionary: Dictionary of [Text, Text]; "Key": Text; Value: Boolean)  
procedure CFLAddInteger(var dictionary: Dictionary of [Text, Text]; "Key": Text; Value: Integer)  
procedure CFLAddDecimal(var dictionary: Dictionary of [Text, Text]; "Key": Text; Value: Decimal)  
procedure CFLAddDateTime(var dictionary: Dictionary of [Text, Text]; "Key": Text; Value: DateTime)  
procedure CFLAddGuid(var dictionary: Dictionary of [Text, Text]; "Key": Text; Value: Guid)  
procedure CFLAddBase64(var dictionary: Dictionary of [Text, Text]; "Key": Text; Value: Text)  

procedure CFLModify

procedure CFLModify(TableName: Text; PartitionKey: Text; RowKey: Text; Dictionary: Dictionary of [Text, Text])

Functie om een nieuwe eigenschappen aan een tabel-entiteit toe te voegen of bestaande eigenschappen van een tabel-entiteit te overschrijven. Iedere entiteit wordt binnen een tabel uniek geïdentificeerd door een PartitionKey en RowKey - beschouw dit als de primary key velden van het record dat moet worden aangepast. Enkel de nieuwe/aan te passen eigenschappen worden analoog als key-value-pair meegegeven in een dictionary.

procedure CFLDelete

procedure CFLDelete(TableName: Text; PartitionKey: Text; RowKey: Text)

Functie om een een tabel-entiteit te verwijderen binnen een tabel. Iedere entiteit wordt binnen een tabel uniek geïdentificeerd door een PartitionKey en RowKey - beschouw dit als de primary key velden van het record dat moet worden verwijderd.

procedure CFLQueryTables

procedure CFLQueryTables(): JsonObject

Deze functie gaat een lijst van alle tabellen onder de Azure Storage Account als JSON-formaat terug geven.

procedure CFLCreateTable

procedure CFLCreateTable(TableName: Text)

Deze functie gaat een nieuwe tabel aanmaken (indien deze nog niet bestaat).

procedure CFLDeleteTable

procedure CFLDeleteTable(TableName: Text)

Deze functie gaat een tabel met alle entiteiten verwijderen (indien deze bestaat)!

Voorbeeld

In onderstaande voorbeeld worden een aantal eigenschappen van de klant bewaard. Als PartitionKey wordt hier bv. geopteerd om de bedrijfsnaam te gebruiken en als RowKey het unieke klantnummer.

procedure AddCustomer(Cust: Record Customer)
var
    Tables: Codeunit "CFL Azure Table Storage Mgmt";
    dict, dict2 : Dictionary of [Text, Text];
    TableName, PartitionKey, RowKey : Text;
    Convert: codeunit "Base64 Convert";
begin
    Tables.CFLAccountName('myaccount');
    Tables.CFLAccountKey('myprimarykey==');

    TableName := Cust.TableName;
    Tables.CFLCreateTable(TableName);

    PartitionKey := CompanyName;
    RowKey := Cust."No.";
    Cust.CalcFields("No. of Invoices", "No. of Credit Memos");
    Tables.CFLAddString(dict, 'Name', Cust.Name);
    Tables.CFLAddString(dict, 'Address', Cust.Address);
    Tables.CFLAddString(dict, 'City', Cust.City);
    Tables.CFLAddInteger(dict, 'Invoices', Cust."No. of Invoices");
    Tables.CFLAddDateTime(dict, 'LastModified', Cust."Last Modified Date Time");
    Tables.CFLAddBoolean(dict, 'VatLiable', Cust."VAT Liable");
    Tables.CFLAddDecimal(dict, 'CreditLimit', Cust."Credit Limit (LCY)");
    Tables.CFLAddGuid(dict, 'SystemId', Cust.SystemId);
    Tables.CFLAddBase64(dict, 'Comments', Convert.ToBase64('dit is een wel heel lange tekst...'));
    Tables.CFLInsert(TableName, PartitionKey, RowKey, dict);

    Tables.CFLAddInteger(dict2, 'CreditMemos', Cust."No. of Credit Memos");
    Tables.CFLModify(TableName, PartitionKey, RowKey, dict2);

    Message(Format(Tables.CFLRead(TableName, PartitionKey, RowKey)));
end;