Subsections of Development

Architecture

When designing a Windows Forms application, you have several architectural patterns to choose from. The common ones are:

Model-View-Controller (MVC):

  • Description: MVC separates the application into three components:
    • Model: Represents the data and business logic.
    • View: Handles the presentation and user interface.
    • Controller: Manages user input and communicates between the Model and View.
  • Pros:
    • Clear separation of concerns.
    • Reusable components.
    • Supports unit testing.
  • Cons:
    • Can become complex for small applications.
    • Requires careful design to avoid tight coupling.
  • Use Case: Suitable for medium to large applications with complex interactions.

Clean Architecture:

  • Description: Clean Architecture emphasizes separation of concerns and independence from external frameworks.
  • Entities: Represent core business logic.
  • Use Cases (Interactors): Application-specific business rules.
  • Interfaces (Gateways): Define external interfaces (e.g., database, UI).
    • Frameworks & Drivers: External frameworks and tools (e.g., Windows Forms, databases).
    • Pros:
      • Highly modular and testable.
      • Adaptable to changes in external frameworks.
      • Focuses on business logic.
    • Cons:
      • Initial setup complexity.
      • May be overkill for small projects.
    • Use Case: Suitable for large, long-lived applications with evolving requirements.
May 3, 2024

Subsections of Architecture

Migrations

In .NET 8, when a migration attempts to create a table that already exists in the database, the behavior depends on the state of the migration history and the existing database schema:

Initial Migration

When you apply the initial migration, Entity Framework Core (EF Core) creates the specified tables based on your model. If the table already exists in the database, EF Core will not re-create it. It only creates tables that are not present.

Subsequent Migrations

For subsequent migrations (e.g., adding columns, modifying schema), EF Core generates migration scripts based on the difference between the current model and the previous migration’s snapshot. If a table is already in the database and corresponds to the model, EF Core will not attempt to create it again. However, if the table structure differs from the model (e.g., missing columns), EF Core will generate migration scripts to update the schema.

Migration History

EF Core maintains a special table called __EFMigrationsHistory (or __migrations_History in some databases). This table tracks which migrations have been applied to the database. If a migration has already been applied (recorded in this table), EF Core will skip creating the corresponding tables.

Rollback (Down) Method

The Down method in a migration handles rolling back changes. If you need to undo a migration, the Down method drops the corresponding tables. For example, if you remove a column in a migration, the Down method will drop that column.

Manual Truncation or Deletion

Be cautious when manually truncating or deleting tables (including the __EFMigrationsHistory table). If the migration history is lost, EF Core may treat subsequent migrations as initial migrations, leading to re-creation of existing tables. In summary, EF Core is designed to be aware of the existing database schema and avoid unnecessary table creation. Ensure that the migration history is intact, and avoid manual truncation of the migration history table to prevent unexpected behavior during migrations

Mar 26, 2024

Diversity workbench

Collection Hierarchy (upcoming version)

Extracting hierarchies can be a time-consuming process in certain cases. To optimize the performance of queries involving collection hierarchies, we use a combination of Collection and CollectionClosure tables. This method is based on the Closure Table Pattern, which is widely used for representing hierarchical data in relational databases.

The Collection and CollectionClosure table

The Collection Table:

  • Represents the main entities in the hierarchy.
  • Stores basic information about each node (e.g., CollectionID, CollectionParentID, CollectionName, etc.).
  • Contains a CollectionParentID column to define direct parent-child relationships.

The CollectionClosure Table:

  • Represents all ancestor-descendant relationships in the hierarchy.
  • Stores the depth of each relationship (e.g., direct parent-child = depth 1, grandparent-grandchild = depth 2).
  • Allows efficient querying of hierarchical data.

Updating process for the Collection and CollectionClosure tables

Maintaining the integrity and consistency of the hierarchy during updates is critical. To achieve this, we use three triggers (INSERT, UPDATE, and DELETE) on the Collection table. These triggers automatically update the CollectionClosure table to reflect changes in the hierarchy.

The triggers are defined on the Collection table and handle the following operations:

  • INSERT Trigger: Handles the insertion of new collections, ensuring that both root and child relationships are added to the CollectionClosure table.
  • UPDATE Trigger: Handles updates to the ParentID of a collection, updating the hierarchy to reflect the new parent-child relationships.
  • DELETE Trigger: Handles the deletion of collections, removing all relationships involving the deleted collection and its descendants.

INSERT Trigger

The INSERT trigger ensures that when a new collection is added to the Collection table:

  • A self-referencing row is added to the CollectionClosure table (CollectionID | CollectionID | 0).
  • If the new collection has a parent, all ancestor-descendant relationships are added to the CollectionClosure table.
CREATE TRIGGER trg_InsertCollectionUpdateCollectionClosure
ON Collection
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;
    -- Insert self-referencing row
    INSERT INTO CollectionClosure (AncestorID, DescendantID, Depth)
    SELECT 
        i.CollectionID, -- AncestorID
        i.CollectionID, -- DescendantID
        0               -- Depth
    FROM INSERTED i;
    -- Insert parent-child relationships
    INSERT INTO CollectionClosure (AncestorID, DescendantID, Depth)
    SELECT 
        p.AncestorID,   -- AncestorID
        i.CollectionID, -- DescendantID
        p.Depth + 1     -- Depth
    FROM CollectionClosure p
    INNER JOIN INSERTED i ON p.DescendantID = i.CollectionParentID;
END;

UPDATE Trigger

The UPDATE trigger ensures that when the ParentID of a collection is updated:

  • All old relationships involving the collection and its descendants are removed from the CollectionClosure table.
  • New relationships are added to reflect the updated parent-child hierarchy.
CREATE TRIGGER trg_UpdateCollectionUpdateCollectionClosure
ON Collection
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    -- Delete old relationships
    DELETE FROM CollectionClosure
    WHERE DescendantID IN (
        SELECT DescendantID
        FROM CollectionClosure
        WHERE AncestorID IN (SELECT CollectionID FROM DELETED)
    )
    AND AncestorID IN (
        SELECT AncestorID
        FROM CollectionClosure
        WHERE DescendantID IN (SELECT CollectionID FROM DELETED)
        AND AncestorID != DescendantID
    );
    -- Insert new relationships
    INSERT INTO CollectionClosure (AncestorID, DescendantID, Depth)
    SELECT 
        supertree.AncestorID, -- New ancestor
        subtree.DescendantID, -- Descendant
        supertree.Depth + subtree.Depth + 1 -- New depth
    FROM CollectionClosure AS supertree
    CROSS JOIN CollectionClosure AS subtree
    INNER JOIN INSERTED i ON subtree.AncestorID = i.CollectionID
    WHERE supertree.DescendantID = i.ParentID;
END;

DELETE Trigger

The DELETE trigger ensures that when a collection is deleted:

  • All relationships involving the deleted collection and its descendants are removed from the CollectionClosure table.
CREATE TRIGGER trg_DeleteCollection
ON Collection
AFTER DELETE
AS
BEGIN
    SET NOCOUNT ON;
    -- Delete relationships for the deleted collection and its descendants
    DELETE FROM CollectionClosure
    WHERE DescendantID IN (
        SELECT DescendantID
        FROM CollectionClosure
        WHERE AncestorID IN (SELECT CollectionID FROM DELETED)
    );
END;

Considerations

  • The triggers ensure that the CollectionClosure table is always updated consistently without requiring explicit calls from the application.

  • Ensure that the ParentID column does not allow circular references, as this can cause infinite loops in the hierarchy. The Client DC checks for loops before inserting a Collection.

Access rights to Collection

By default, all users have read access to all collections, e.g., in the selection lists. The CollectionManager can also edit collections via the menu item “Management - Collections,” etc.

CollectionManager

Collections for which they have editing rights can be assigned to them via Management - Collection - CollectionManager. If a collection has child collections, the rights are inherited, i.e., if a user has rights for the parent collection, they automatically also have rights for the child collections.

Only Administrators can assign editing rights.

Also see CollectionManager

The CollectionManager Table is updated via two triggers (trg_InsertCollectionManager and trg_DeleteCollectionManager), which are designed to automatically manage entries in the CollectionManager table whenever rows are inserted into or deleted from the Collection table. This ensures that the CollectionManager table remains consistent with the Collection table.

ALTER TRIGGER [dbo].[trg_InsertCollectionManager]
ON [dbo].[Collection]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;
    -- Insert into CollectionManager for the user who inserted the row
    INSERT INTO CollectionManager (LoginName, AdministratingCollectionID)
    SELECT 
        SUSER_SNAME(), -- Gets the username of the user performing the insert
        i.CollectionID
    FROM 
        INSERTED i;
END;
ALTER TRIGGER [dbo].[trg_DeleteCollectionManager]
ON [dbo].[Collection]
AFTER DELETE
AS
BEGIN
    SET NOCOUNT ON;
    -- Delete from CollectionManager where the CollectionID matches the deleted CollectionID
    DELETE FROM CollectionManager
    WHERE AdministratingCollectionID IN (
        SELECT d.CollectionID
        FROM DELETED d
    );
END;

CollectionUser

The second table, CollectionUser, is used like a ’lock list,’ meaning it contains entries for users and collections to which a user has explicit read access. In this case, the user has access only to these collections. If there are no entries for a user in this table, they have read access to all collections.

Also see CollectionUser**

Implemented in:

DC

CollectionHierarchy

Jun 5, 2025

Diversity workbench

Keywords

Keywords in Hugo

Die Schlüsselwörter werden zum Test in der Datei keywords_ori_dwb erfasst und dann angepasst in die Datei keywords_dwb kopiert. Hugo übersetzt die dort angegebenen Adressen. Ein Service auf dem Apacheserver übersetzt dies dann in eine Datei keywords.txt mit Paaren aus Schlüsselwort und dem zugehörigen Link. Dies wird dann als Service zur Verfügung gestellt und kann von den Applikationen benutzt werden.

Keywords in den Applikationen

  • die Formulare benötigen einen Helpprovider
  • die Keywords werden als Property vermittelt durch den Helpprovider direkt beim Formular oder in den controls eingetragen
  • vorhandene Keywords müssen angepasst werden e.g. Collectioncollection_dc. Dazu im Designer-File nach helpProvider.SetHelpKeyword suchen und dort die Keywords anpassen.

Event handler

Bei der ersten Verwendung von F1 in einem Formular werden durch den KeyDown-Handler des Formulars das Formular und die enthaltenen Controls sofern ein Keyword eingetragen wurde mit einem Eventhandler versorgt die dann für den Aufruf des Manuals sorgen.

Da die Funktion erst beim KeyDown im Formular gestartet wird und asynchron ist bremst sie den Start der Applikationen nicht.

aktuelle Probleme:

  • Beim allerersten Aufruf des Manuals wird auch die Hauptseite für das Formular geöffnet sofern dort ein Keyword hinterlegt ist

Beispiel für Umsetzung anhand DiversityCollection_GUC_8 im Formular FormArtCode:

Code im Formular

in the constructor or in the properties of the form

this.KeyPreview = true;

im Code

link the KeyDown event of the form to the Form_KeyDown event

#region Manual

/// <summary>
/// Adding event deletates to form and controls
/// </summary>
/// <returns></returns>
private async System.Threading.Tasks.Task InitManual()
{
    try
    {

        DiversityWorkbench.DwbManual.Hugo manual = new Hugo(this.helpProvider, this);
        if (manual != null)
        {
            await manual.addKeyDownF1ToForm();
        }
    }
    catch (Exception ex) { DiversityWorkbench.ExceptionHandling.WriteToErrorLogFile(ex); }
}

/// <summary>
/// ensure that init is only done once
/// </summary>
private bool _InitManualDone = false;


/// <summary>
/// KeyDown of the form adding event deletates to form and controls within the form
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void Form_KeyDown(object sender, KeyEventArgs e)
{
    try
    {
        if (!_InitManualDone)
        {
            await this.InitManual();
            _InitManualDone = true;
        }
    }
    catch (Exception ex) { MessageBox.Show(ex.Message); }
}

#endregion
In der Workbench aufgerufene Forms

Forms die von den Modulen in der Workbench aufgerufen werden enthalten in obigem Teil zusätzlich eine Funktion zum setzen des Keywords:

public void setKeyword(string Keyword)
{
    this.helpProvider.SetHelpKeyword(this, Keyword);
}

falls diese Formulare weiter abhängige Formulare aufrufen dann kann dies wie unten am Beispiel des Spreadsheets gelöst werden:

public void setKeyword(string Keyword)
{
    this.helpProvider.SetHelpKeyword(this, Keyword);
    this.setKeyword(KeywordTarget.Spreadsheet, Keyword);
}

public void setKeyword(string Keyword, KeywordTarget keywordTarget)
{
    this.setKeyword(keywordTarget, Keyword);

    switch (keywordTarget)
    {
        case KeywordTarget.Map:
            System.Collections.Generic.List<System.Windows.Forms.Control> Controls = new List<System.Windows.Forms.Control>();
            Controls.Add(this.buttonSetMapIcons);
            Controls.Add(this.buttonShowMap);
            Controls.Add(this.toolStripMap);
            ...
            foreach (System.Windows.Forms.Control C in Controls)
            {
                this.helpProvider.SetHelpKeyword(C, Keyword);
            }
            break;
        case KeywordTarget.MapLegend:
            ...
            break;
        case KeywordTarget.MapColors:
        case KeywordTarget.MapSymbols:
            ...
            break;
    }
}

public enum KeywordTarget
{
    Map,
    MapLegend,
    MapColors,
    MapSymbols,
    Spreadsheet
}

private System.Collections.Generic.Dictionary<KeywordTarget, string> _KeywordTargets = new Dictionary<KeywordTarget, string>();
private void setKeyword(KeywordTarget Target, string Keyword)
{
    if (this._KeywordTargets == null)
        this._KeywordTargets = new Dictionary<KeywordTarget, string>();
    if (this._KeywordTargets.ContainsKey(Target))
        this._KeywordTargets[Target] = Keyword;
    else
        this._KeywordTargets.Add(Target, Keyword);
}

private string getKeyword(KeywordTarget Target)
{
    if (this._KeywordTargets == null)
        this._KeywordTargets = new Dictionary<KeywordTarget, string>();
    if (this._KeywordTargets.ContainsKey(Target))
        return this._KeywordTargets[Target];
    else
        return "";
}

Zentraler code in e.g. Klasse Manual

#region Adding functions

/// <summary>
/// If the control contains a keyword related to the helpprovider of the form
/// </summary>
/// <param name="control"></param>
/// <param name="helpProvider"></param>
/// <returns></returns>
private bool IsControlLinkedToHelpKeyword(Control control, HelpProvider helpProvider) 
{ 
    string helpKeyword = helpProvider.GetHelpKeyword(control); 
    return !string.IsNullOrEmpty(helpKeyword); 
}

/// <summary>
/// If the form contains a keyword related to the helpprovider
/// </summary>
/// <param name="form"></param>
/// <param name="helpProvider"></param>
/// <returns></returns>
private bool IsFormLinkedToHelpKeyword(Form form, HelpProvider helpProvider)
{
    string helpKeyword = helpProvider.GetHelpKeyword(form);
    return !string.IsNullOrEmpty(helpKeyword);
}

/// <summary>
/// Constructor
/// </summary>
/// <param name="helpProvider">The helpprovider of the form</param>
/// <param name="form">The form where the event handlers should be added</param>
public Manual(HelpProvider helpProvider, Form form)
{
    _helpProvider = helpProvider;
    _form = form;
}

/// <summary>
/// HelpProvider of the form
/// </summary>
private HelpProvider _helpProvider;

/// <summary>
/// the form containing the HelpProvider
/// </summary>
private System.Windows.Forms.Form _form;

/// <summary>
/// adding the event delegates to form and controls
/// </summary>
/// <returns></returns>
public async Task addKeyDownF1ToForm()
{
    try
    {
        if (_form != null && _helpProvider != null)
        {
            if (IsFormLinkedToHelpKeyword((Form)_form, _helpProvider))
            {
                _form.KeyUp += new KeyEventHandler(form_KeyDown);
            }
            foreach (System.Windows.Forms.Control C in _form.Controls)
            {
                await addKeyDownF1ToControls(C);
            }
        }
    }
    catch (Exception ex) { MessageBox.Show(ex.Message); }
}

/// <summary>
/// Adding Event delegates to the controls
/// </summary>
/// <param name="Cont">the control to which the delegate should be added it a keyword is present</param>
/// <returns></returns>
private async Task addKeyDownF1ToControls(System.Windows.Forms.Control Cont)
{
    try
    {
        foreach (System.Windows.Forms.Control C in Cont.Controls)
        {
            if (IsControlLinkedToHelpKeyword(C, _helpProvider))
            {
                C.KeyDown += new KeyEventHandler(control_KeyDown);
            }
            await addKeyDownF1ToControls(C);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

/// <summary>
/// Opening the manual if F1 is pressed within the form
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void form_KeyDown(object sender, KeyEventArgs e)
{
    try
    {
        if (!e.Handled && e.KeyCode == Keys.F1) 
        {
            string Keyword = _helpProvider.GetHelpKeyword(_form);
            OpenManual(Keyword);
        }
    }
    catch (Exception ex) { MessageBox.Show(ex.Message); }
}


/// <summary>
/// Opening the manual if F1 is pressed within the control
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void control_KeyDown(object sender, KeyEventArgs e)
{
    try
    {
        if (e.KeyCode == Keys.F1)
        {
            string Keyword = _helpProvider.GetHelpKeyword((System.Windows.Forms.Control)sender);
            OpenManual(Keyword);
            e.Handled = true;
        }
    }
    catch (Exception ex) { MessageBox.Show(ex.Message); }
}

#endregion

zentrale Funktionen

  • holen keyword Verzeichnis via HtmlAgilityPack
  • öffnen Webseite anhand von Keyword

vorerst mit HtmlAgilityPack gelöst. Service hierzu kommt noch

#region HtmlAgilityPack

/// <summary>
/// Prefix for websites
/// </summary>
private static readonly string HugoManualUrlPrefix = "https://www.diversityworkbench.de";

/// <summary>
/// The URL of the site containing the keywords
/// </summary>
private static readonly string _UrlForKeywords = "https://www.diversityworkbench.de/manual/dwb_latest/diversityworkbench/keywords_dwb/index.html";

private static Dictionary<string, string> _KeywordsFromHugo;

/// <summary>
/// The dictionary of the keyword/Links scraped from the website in the Hugo manual
/// </summary>
private static Dictionary<string, string> KeywordsFromHugo
{
    get
    {
        if (_KeywordsFromHugo == null)
        {
            HtmlWeb HtmlWeb = new HtmlWeb();
            HtmlAgilityPack.HtmlDocument htmlDocument = HtmlWeb.Load(_UrlForKeywords);
            var Links = htmlDocument.DocumentNode.SelectNodes("//html//body//div//main//div//article//ul//a");
            if (Links != null)
            {
                _KeywordsFromHugo = new Dictionary<string, string>();
                foreach (var Link in Links)
                {
                    string Key = Link.InnerText;
                    string URL = HugoManualUrlPrefix + Link.GetAttributeValue("href", string.Empty);
                    if (Key != null && Key.Length > 0 && 
                        URL != null && URL.Length > 0 && 
                        !_KeywordsFromHugo.ContainsKey(Key))
                    {
                        _KeywordsFromHugo.Add(Key, URL);
                    }
                }
            }
        }
        return _KeywordsFromHugo;
    }
}

/// <summary>
/// Open a manual site
/// </summary>
/// <param name="keyword">The keyword linked to the site in the manual</param>
public void OpenHugoManual(string keyword)
{
    if (KeywordsFromHugo == null) { return; }
    if (KeywordsFromHugo.ContainsKey(keyword))
    {
        string Link = DiversityCollection_GUC.Hugo.Manual.KeywordsFromHugo[keyword];
        try
        {
            if (Link.Length > 0)
            {
                Process.Start(new ProcessStartInfo
                {
                    FileName = Link,
                    UseShellExecute = true
                });
            }
        }
        catch (Exception ex) { MessageBox.Show("Error opening URL: " + ex.Message); }
    }
}



#endregion
graph TD;
    Start[Open form]
    Handler["Creation of handlers"]
    Manual[Open the manual]
    F1[Click F1 in form or control]
    Scrape[Using the<br>***HtmlAgilityPack***<br>to scrape the dictionary<br>for the keywords<br>from the<br>Hugo keyword site<br>at first call]
    Key[Use keyword to get link]
    Start --> | using F1 in the form for the first time | Handler 
    Handler --> Scrape
    F1 --> Scrape
    Scrape --> Key
    Key --> Manual

Alternative nicht verwendete Optionen

Im frontmatter der Seiten können für einzelne Kapitel Schlüsselwörter hinterlegt werden:

---
title: ...
linktitle: ...
keywords: 
    - Nachweis_GUC
    - Fundort_GUC
---

Was wir benötigen ist ein Schlüsselwort in der Applikation und dazu ein Link zum Manual. Aus den CHM Dateien lassen sich die bereits jetzt vorhandenen Schlüssel extrahieren (Außer den von Wolfgang umgebauten Modulen DSP und DG).

Eine Alternative zum manuellen Aufbau wäre ein Scan aller vorhandenen Seiten und die Extraktion der verwendeten Links.

Options

Examlpe for GUC

damit werden automatisch die korrekten Links im html erzeugt und könnten dann extrahiert werden

Aktuellen Liste: keywords_dwb

Contact_DA modules/diversitycollection/Contact_DA Agent_DA modules/diversitycollection/Agent_DA Archive_DA modules/diversitycollection/Archive_DA Backup_DA modules/diversitycollection/Backup_DA Contact_DA modules/diversitycollection/Contact_DA DataWithholding_DA modules/diversitycollection/DataWithholding_DA AgentDisplayTypes_DA modules/diversitycollection/AgentDisplayTypes_DA Descriptors_DA modules/diversitycollection/Descriptors_DA ExternalData_DA modules/diversitycollection/ExternalData_DA Feedback_DA modules/diversitycollection/Feedback_DA Hierarchy_DA modules/diversitycollection/Hierarchy_DA History_DA modules/diversitycollection/History_DA Images_DA modules/diversitycollection/Images_DA …

hier müssen die Links noch angepasst werden. Insofern noch nicht wirklich brauchbar

May 20, 2025

Project - DwbServices

External Web Services - Integrating Third-Party Data Sources (upcoming version)

The DWBServices project is designed to interact with a variety of taxonomic and geographic web services. It provides a unified interface for querying, retrieving, and processing data from external APIs. The framework abstracts the complexities of individual web services, enabling easy integration and consistent interaction across the DWB modules.

The architecture of the project is designed to support a modular and extensible system for interacting with taxonomic and geographic web services. It leverages dependency injection for service management, configuration-based customization, and abstract base classes to define common behaviors for services. At the moment the system is divided into two main domains: Taxonomic Services and Geo Services, each with their own abstractions (TaxonomicWebservice, GeoService) and entities (TaxonomicEntity, GeoEntity). The class DwbServiceProviderAccessor acts as a central access point for retrieving specific service implementations based on the service type. The architecture ensures scalability, maintainability, and separation of concerns, making it easy to integrate new services.

Adding a new webservice to a DWB Client

To incorporate a new web service into the DiversityCollection or similar projects, follow these steps:

  1. Add new folder under TaxonomicServices or GeoServices.

  2. Create Entity Classes: Define entity classes inheriting from TaxonomicEntity or GeoEntity to represent the service’s data structure.

  3. Implement Search and Result Models: Create search criteria and result classes inheriting from TaxonomicSearchCriteria/GeoSearchCriteria and TaxonomicSearchResult/GeoSearchResult.

  4. Implement the Service: Create a new service class inheriting from TaxonomicWebservice or GeoService. Implement required methods like DwbApiQueryUrlString, GetDwbApiSearchModel, and GetDwbApiDetailModel.

  5. Add the Service to Enums and Dictionaries: Add the new service to DwbServiceEnums.DwbService. If the service is a taxonomic service, also add it to the TaxonomicServiceInfoDictionary with its relevant configuration details (e.g., name, URL, dataset key).

  6. Register the Service in Program.cs: Add the service to the ConfigureServices method:

     services.AddHttpClient<NewWebservice>();
  1. For the DC Client: Update FormRemoteQuery.InitWebserviceControl(): Add the new service to the initialization logic of the web service control in the FormRemoteQuery class.

  2. For the DC Client: Update FormSpreadsheet.FixedSourceSetConnection: Ensure the new service is included in the logic for fixed source set connections in the FormSpreadsheet class.

  3. Handle Authentication (if required): If the service requires authentication via a bearer token, override the CallWebServiceAsync methods from DwbWebservice and implement token-based authentication within these methods. For an example, refer to the MycobankWebservice implementation.

  4. Update Configuration: Add the new service’s base address and other settings to the configuration file.

  5. Test the Integration: Validate the service’s functionality by testing its API calls and data mappings.

Jun 12, 2025

Roadmap

Umbau auf .Net 8

AspNetCore + Webassembly

Der mobile Client wird als Testprojekt mit AspNetCore für REST und Webassembly für den Client aufgesetzt

Aspire / Webassembly / Blazor

Ein Video dazu. Werd DTN für IPM fertig machen und dann ein entsprechendes Projekt fuer die weitere Diskussion als Beispiel aufsetzen. Ist allerdings erst in preview … das sollte man evtl. abwarten

Avalonia

Zurückgestellt Mit dem Avalonia framework könnte man einfache Clients wie e.g. die Spreadsheets für die Module bereitstellen. Das waere vorallem für Desktop Apps. Ansonsten würde Blazor wohl die einfachere Herangehensweise sein weil es über den Browser alles abdeckt. Sollte auf jeden Fall in separatem Verzeichnis entwickelt werden weil es Einstellungen vornimmt die mit anderen Frameworks nicht kompatibel sind. Ist allerdings noch auf .Net 7. Wird wohl noch ein bisschen dauern bis das fuer .Net 8 nachgezogen ist.

  • Alternativen:
    • MAUI - das unterstützt aber kein Linux und ist was ich gesehen hab auch nicht so performant
    • UNO - hab ich noch nicht genauer angesehen. Wohl ähnlich zu Avalonia aber nicht so verbreitet etc.

Cocona

Für CLI Clients

Beispiele für Diagramme

Note

for demo only - dates are not valid

timeline
    title Diversity Workbench - timeline
    2023-11-15 : Einstieg in Version 8
    2023-12-15 : IPM 
                : WinForm Client 2023-11-15
                : WASM-Client 2023-12-15
    2023-12-20 : WASM-Client 
               : Preview 2024-01-20
               : Workshop 2014-03-22
    2024-02-15 : WASM-Client for DC
gantt
        dateFormat  YYYY-MM-DD
        title IPM
        section IPM Winforms Client
        Completed task            :done,    des1, 2024-01-06,2024-01-08
        Active task               :active,  des2, 2024-01-09, 3d
        Future task               :         des3, after des2, 5d
        Future task2              :         des4, after des3, 5d
        section IPM WASM Client
        Completed task in the critical line :crit, done, 2024-01-06,24h
        Implement parser and jison          :crit, done, after des1, 2d
        Create tests for parser             :crit, active, 3d
        Future task in critical line        :crit, 5d
        Create tests for renderer           :2d
        Add to Mermaid                      :1d
gitGraph
    commit
    commit
    branch develop
    checkout develop
    commit
    commit
    checkout main
    merge develop
    commit
    commit
May 3, 2024

Subsections of Roadmap

Diversity Workbench

Version 8

Permissions

No direct access to tables. Access via views that restrict to user available data and implement permissions that had been set for tables. These views relate to the previous tables and implement the restrictions with a WHERE clause and without any joins.

There may be 2 views: [Table]_Read for content including data with read only access and [Table]_Edit for content the user can edit.

Icons

To ensure that users can distinguish versions 4.x from versions 8.x of the software, the new versions get icons different from the old versions. The colors of the characters reflect the colors of the symbols used in the menu.

Aug 6, 2024

IPM

The DiversityWorkbench provides several applications addressing every IPM related task:

  • Taxonomy of IPM related taxa
  • Identification key for pests
  • Collecting sensor data
  • Editing, collecting, exporting data in a desktop application.
  • A web application for trap inspection (ongoing project)

IPM taxonomic names

Taxonomic backbone providing 3 lists of taxa related to IPM:

  • Pests
  • Bycatch
  • Beneficials

The data include the taxonomic hierarchy, synonoyms, common names, life stages, links to information and thumbnails of the taxa for inclusion in e.g. tabular lists used for monitoring. Data are provided via a JSON API. For details see IPM

IPMobile

(ongoing project)

Mobile application for collecting taxon observations in traps etc. You can import existing data to ensure continuity and build upon historical information. Data are stored in a local SQLite database and synchronized via an API with the main database to enable offline inspection of the traps, specimen etc.

Zwischengespeicherte Daten für offline Betrieb

  • Taxonliste incl. Vorschaubildern
  • Bilder von Fallen
  • Grundriss

Zugriffsarten

es können alte Daten eingelesen und neue Daten geschrieben werden. Ändern und Löschen nach dem Speichern ist nicht vorgesehen.

  • Lesen
    • Taxonliste
    • Grundrisse
    • Bar- und QR-Codes
  • Schreiben
    • Beobachtungen von Schädlingen (Art, Anzahl, Ort)
    • Eingeben von Anmerkungen
  • Ändern
  • Löschen

Einstellungen

Auswahl der Taxa die für die Erfassung berücksichtigt werden sollen

Bereiche

  • Fallen
  • Specimen
  • Sensoren

Funktionen

  • Verortung in Plänen
  • Bilder von Fallen etc.
  • Zuordnung von Detailbildern zu Übersichtsaufnahme und deren Verortung innerhalb der Übersichtsaufnahme
  • Scannen von Codes auf Objekten und automatisches Laden der zugehörigen Daten
  • Eintrag von Notizen

Szenarien

  • Der User will einen Schädling eintragen können den er gerade auf einem Specimen gefunden hat.
  • Der User will eintragen, dass er keinen Schädling gefunden hat auf einem Specimen, Falle, Raum, Sammlung, …
  • Der User hat eine Falle aufgestellt und möchte die Falle anhand des QR-Codes auf der Falle identifizieren und die Position der Falle im Plan vermerken sowie evtl. eine Beschreibung des Standorts eingeben.
  • Der User möchte alle Fallen anhand eines Plans der Aktuellen Etage abgehen und dabei prüfen ob in den Fallen Fänge sind.
  • Der User möchte den aktuellen Zustand der Falle anhand von Bildern mit vorherigen Zuständen vergleichen
  • Der User hat einen Schaden entdeckt und möchte das Objekt anhand des Codes identifizieren sowie den Schaden mit einem Bild dokumentieren und einen kurzen Text schreiben was genau kaputt ist.
  • Über Bestimmungsapp via DD
    • Der User will dem gefunden Schädling einen Namen zuweisen

Tabellen in SQLite

  • lesend

    • Collection
    • CollectionSpecimen
    • CollectionSpecimenPart
    • IdentificationUnit
    • Task
    • CollectionTask_old (oder Marker in Tabelle CollectionTask)
    • CollectionTaskImage_old (oder Marker in Tabelle CollectionTaskImage)
  • schreibend

    • CollectionTask
    • CollectionTaskImage

IPM sensors

Sensors collecting room temperature and moisture values communicate via Bluetooth LE with IPMhubs. IPMhubs communicate with IPMserver via LoRa IPMserver collects sensor data provided by the IPMhubs and stores these data in a Prometheus timeseries database. These data are then provided for import in the main database via LAN.

IPMcollection

  • Spatial: The software provides the option to include floor plans and accurately pinpoint the locations of sensors and traps including the hight within a room. To avoid interference with administrative aspects of a collection, the software includes the option for a second hierarchy according to the positions.
  • Recording: Next to sensor data all events, observations etc. can be recorded for later evaluation aiming at the prediction of the effect of IPM related actions.
  • Customization: You can define templates or create custom task definitions based on your specific IPM requirements. This includes e.g. the typification of traps and treatments. The list of taxa based on the backbone can be adapted based on those taxa that should be included in the recoding.
  • Reports: Generation of reports including charts, floorplans, treatments etc.
  • Actions: Documenation of IPM related treatments of collection specimen, application of beneficial organisms etc.

May 27, 2025

HUGO

Logo of HUGO. See https://gohugo.io/

Installation of HUGO

Update des Themes

um das Theme auf die letzte Version zu bringen kann man den Befehl git submodule update --remote --merge themes/relearn verwenden

Übersetzung des Bestands an html

  • Übersetzung der *.html Seiten mit pandoc in *.md
  • Aufbau einer Ordnerstruktur die dem Index der chm Datei entspricht
  • Das Basisdokument der Ordner wird in die Ordner verschoben und in _index.md umbenannt
    • Dort im Frontmatter steht der Titel der im Menü angezeigt wird, e.g.:
      --- 
      title: Installation 
      ---  

Überarbeitung der md Dateien

  • Korrektur der Bildverweise
    • Ordner mit den Bildern in den Ordner static kopieren
    • von e.g. ![](img/...) in ![](img/...)
    • ACHTUNG - Case sensitiv. Namen müssen stimmen
    • Icons gegebenenfalls freistellen für Darkmode
  • Entfernung aller störenden Formatierungsangaben
  • Entfernung der Kopfzeile (Überschrift wird von HUGO automatisch erzeugt)
  • Korrektur der internen Verweise
    • ändern von [![](img/VideoDE.svg?class=inlineimg)](http://media.snsb.info/Tutorials/dwb/Editing/OeffentlicheKontaktdaten.webm) zu [![Video starten](img/VideoDE.svg?class=inlineimg)](http://media.snsb.info/Tutorials/dwb/Editing/OeffentlicheKontaktdaten.webm)
      • ansonsten wird das Bild gezeigt statt das Video zu starten
    • ändern von
      [Contact](Contact.htm)
      zu e.g.
      [Contact](editingdata/contact)
    • Wenn als Basisadresse in hugo.toml etwas angegeben wurde, e.g. baseURL = "http://www.diversityworkbench.de" dann muss diese auch für Verweise innerhalb der Files verwendet werden.
      • e.g. Bildverweise ![](img/IcoFeedback.gif?class=inlineimg)
      • Dateiverweise [Anmelden](database)
      • HUGO relearn erzeugt für Überschriften Anker die man ansteuern kann, e.g. kann man ### Table **AgentResource** über die Adresse database/database/#table-agentresource erreichen. Ein Index Eintrag dafür wäre e.g. [AgentResource](database/database/#table-agentresource). ACHTUNG - Case sensitiv: ### Table **AgentResource** wird in #table-agentresource übersetzt
    • Kommentare starten mit # ohne folgendes Leerzeichen

Frontmatter

You can change the frontmatter to a default using the documentation tool

  • Steht am Anfang der Datei und ist bei yaml durch --- oben und unten abgegrenzt, e.g.
    ---
    title: Login administration
    linktitle: Logins
    weight: 5
    menuPre: img/Documentation.svg
    alwaysopen: false
    ---
  • Seiten die noch in Entwicklung sind kann man mit draft: true im Frontmatter markieren. Diese werden dann nicht in die Ausgabe übernommen
  • Der Titel wird mit title: Login administration angegeben. Dieser erscheint dann auch in der Seite als Überschrift
  • Der Text im Menü kann abweichend definiert werden mit linktitle: Logins. Ansonsten erscheit der Titel im Menü
  • Die Reihenfolge im Menü kann mit weight: 5 angegeben werden. Ansonsten wird alphabetisch sortiert
  • Ein Logo kann man mit `menuPre: img/LinkedServer.svg
  • Wenn das Untermenue erst beim Anwählen geöffnet werden soll: alwaysopen: false

Template files

Starting with a Dash: If the first line of your Markdown file starts with a dash (-), Hugo might misinterpret it as a YAML delimiter, leading to an error

Bilder

You can adapt the images to a default using the documentation tool

  • Icons die e.g. in den Text integriert werden sollen, müssen folgedermassen eingebaut werden:
    • ![](img/Database.svg?class=inlineimg)
  • Die Bilder am Anfang der Seite werde wie folgt eingebaut:
    • ![](img/LinkedServer.svg?class=headerimg)

mit px wird das Bild mitgezoomt, bei vw bleibt es gleich gross

  • noch nicht zu svg konvertierte Bilder die im Fliesstest erscheinen sollen werden wie folgt eingebunden:
    • ![](img/Delete.svg?class=inlineimg)
  • sonstige Bilder mit
    • ![](img/Delete.svg)

mit der Angabe ...lightbox=false wird verhindert, dass ein Bild beim Anklicken mit der Maus geöffnet wird. Dies sollte bei Bildern die nicht nach svg konvertiert wurden und nicht im Fliesstext erscheinen nicht verwendet werden, damit der User bei kleinen Bildern diese in Originalauflösung betrachten kann. Unten 2 Beispiele

![](img/Delete.svg?class=inlineimg)

![](img/Delete.svg?class=inlineimg)

Für Bilder die aus der Quelle fontawesome kommen kann man hier suchen: fontawesome. Es funktionieren nicht alle die dort bereitstehen. Daher bitte testen!

Für Links innerhalb des Manuals kann man shortcodes verwenden. Dafür entweder auf den Namen der Datei oder auf Links von Überschriften (ab ##) verwenden. Diese müssen innerhalb des Manuals eindeutig sein. Für Header als erstes Zeichen # dann Überschrift und alles lower case und Leerzeichen werden durch - ersetzt. Beispiel:

## Main form of diversityexsiccatae

wird zu sofern es sich in der gleichen Datei befindet: 2 x { und % relref "#main-form-of-diversityexsiccatae" % und 2 x }

Für Links ausserhalb der Datei werden Verweise unter Einschluss des Dateinamens verwendet:

Verweis auf ein Kapitel innerhalb einer Datei 2 x { und % relref "diversityexsiccatae#main-form-of-diversityexsiccatae" % und 2 x }

bzw. nur auf die Datei 2 x { und % relref "diversityexsiccatae" % und 2 x }

Leerzeichen zwischen 2 x { und % und % und 2 x } entfernen

Von ausserhalb kann e.g. eine Überschrift mit https://www.diversityworkbench.demodules/diversityexsiccatae/index.html#main-form-of-diversityexsiccatae aufgerufen werden. Diese können direkt aus dem Manual kopiert werden.

  • hierfür das Logo in den Ordner static kopieren
  • im Ordner layouts einen Ordner partials anlegen
  • dort eine Datei logo.html anlegen
    • in dieser auf das Logo verweisen e.g.:
      <h4><b>DiversityAgents</b></h4>
      <img src="/DA_4D.svg">
  • in static - layouts - partials die Datei menu-footer.html anlegen und anpassen

favicon

Im Ordner static den Ordner images anlegen Datei favicon.ico in der Ordner static/images kopieren

Einschliessen von Dateien

Das Verzeichnis templates enthält Dateien die in andere Dateien über eine shortcode eingeschlossen werden können, e.g.:  2 x { und % include file="templates/template_workbench.md" % und 2 x } Diese Dateien dürfen kein frontmatter enthalten. Shortcodes müssen überprüft werden, da diese in der Regel nicht ausgewertet werden.

ER-Diagramm

dieses kann als Mermaid eingebaut werden, e.g.

 
graph LR;
    A[Agent] --> B[AgentContact<br/>Kontaktdaten der Agents]
    A --> C[AgentReference]
    A --> D[AgentIdentifier]
    A --> E[AgentResource]
    A --> F[AgentExternalID]
    G[AgentExternalDatabase] --> F[AgentExternalID]

soll das Diagramm zoombar sein wird die Version 5.23 des Themes benoetigt. Ausserdem kann der Parameter nur für die Shortcode Version angegeben werden, nicht für die Codefences:

2 x { und % mermaid align="center" zoom="true" % und 2 x }
... 
(remove space between 2 x { und  and < resp > and  und 2 x } in header and footer for correct code)
...
2 x { und % /mermaid % und 2 x }

Anpassung des Themes

  • es werden 2 eigene Themes bereitgestellt

    • im Verzeichnes
      • themes
        • relearn
          • static
            • css:
            • theme-dwb-dark.css
            • theme-dwb.css

    diese an DWB Anforderungen anpassen

    • in \themes\relearn\static\css\theme.css
      #body img.inline {
          display: inline !important;
          margin: 0 !important;
          vertical-align: middle;
          /* vertical-align: bottom; */
      }
    • in \themes\relearn\static\css\theme-dwb.css
      /*--MENU-HEADER-BG-color: rgba( 28, 144, 243, 1 );*/ /* Background color of menu header */
      --MENU-HEADER-BG-color: rgba( 220, 220, 220, 1 ); /* Background color of menu header */
      --MENU-HEADER-BORDER-color: rgba( 51, 161, 255, 1 ); /*Color of menu header border */
      

      –MENU-SEARCH-color: rgba( 255, 255, 255, 1 ); /* Color of search field text / /–MENU-SEARCH-BG-color: rgba( 22, 122, 208, 1 );/ / Search field background color (by default borders + icons) / –MENU-SEARCH-BG-color: rgba( 90, 90, 90, 1 ); / Search field background color (by default borders + icons) / /–MENU-SEARCH-BORDER-color: rgba( 51, 161, 255, 1 );/ / Override search field border color / –MENU-SEARCH-BORDER-color: rgba( 0, 0, 0, 1 ); / Override search field border color */

Konfiguration - in hugo.toml:

```native
baseURL = "http://www.diversityworkbench.de"
languageCode = "en-us"
title = "DiversityAgents"
theme = "relearn"

[outputs] home = ["HTML", "RSS", "SEARCH", "SEARCHPAGE"] section = ["HTML", "RSS", "PRINT"] page = ["HTML", "RSS", "PRINT"]

[params] themeVariant = [ "auto", "dwb", "dwb-dark" ]

</code></pre>
<h2 id="start-des-testservers">Start des Testservers:</h2>
<ul>
<li>mit einem Terminal in das Verzeichnis des Projekts wechseln</li>
<li>dort <code>hugo server </code> eingeben.</li>
<li>bei Problem mit Sonderzeichen: den Inhalt der Datei config.toml in hugo.toml kopieren und config.toml löschen (beide sollten wenn vorhanden UTF8 sein - werden manchmal als UTF16 angelegt - dieses dann nach UTF8 ändern)
<ul>
<li>Error: &ldquo;&hellip;\diversityworkbench\hugo.toml:1:1&rdquo;: unmarshal failed: toml: invalid character at start of key: ÿ</li>
</ul>
</li>
<li>Im Browser an die angegebene Adresse navigieren, e.g. <code>localhost:1313</code></li>
<li>Wenn als Basisadresse in hugo.toml etwas angegeben wurde, e.g. <code>baseURL = &quot;http://www.diversityworkbench.de&quot;</code> dann muss die passende Adresse eingeben werden also e.g. <code>localhost:1313</code></li>
</ul>
Aug 2, 2024

Subsections of HUGO

HUGO

In the HUGO / HTML tab you generate markdown files according to HUGO and the relearn theme.

The conversion and adaptions are explained in a short tutorial: Video starten

For enumeration tables the content can be exported as explained in a short tutorial: Video starten

Nov 27, 2024

HUGO links

Note

The clients of the DWB will link to the online manual via keywords that link either to pages e.g. cachedatabase_restrictions_dc or chapters e.g. cachedatabase_restrictions_dc#specimen within pages. The links on chapters correspond to headers within the pages. That means you should not change chapter headers after they are linked from the clients. Otherwise the links from the clients will fail.

In the tab you can fix links in markdown files according to HUGO shortcodes.

The fixes for broken links are explained in a short tutorial: Video starten

The adaptions for links for HUGO as related references are explained in a short tutorial: Video starten

To map the files in the original links to new files in the documentation follow the steps shown in a short tutorial: Video starten

May 15, 2025

github

ssh-key

To use this option you may have to install OpenSSH for Windows

To change the authentication mechanism to SSH keys in Visual Studio Code and GitHub, you need to follow these steps:

  • Open the command line and change in your homedirectory if not already done cd %USERPROFILE%
  • Generate an SSH key pair on your local machine using the command ssh-keygen -a3 -t ed25519 -C "your_email@example.com" -f .ssh/id_github.
    • In case you omit the -f option nameing the file where the key should be stored, you will be asked th enter the name of the file where the key should be stored e.g. id_github. Make shure not to overwrite existing keys.
  • Next enter a passphrase (twice)
    • When you generate an SSH key pair, you have the option to add a passphrase to the private key. A passphrase is an extra layer of security that helps protect your private key from unauthorized access. If someone gains access to your private key, they can use it to authenticate as you and perform actions on your behalf. By adding a passphrase, you make it more difficult for someone to use your private key without your permission.
    • When you use an SSH key with a passphrase, you will be prompted to enter the passphrase every time you use the key. This can be inconvenient, but it ensures that only you can use the key to authenticate with remote servers. You can also use an SSH agent to store your passphrase so that you don’t have to enter it every time you use your key .
    • The location of your keys will be shown (e.g. id_github for the private key and id_github.pub for the public key) next to a fingerprint and a randomart image like
      +--[ED25519 256]--+
      |     ..   .+=.o  |
      |      .+ . o+*   |
      |    . +.. ooo.o  |
      |     +.B.+= =.o  |
      |      =+S=o* = o |
      |     . oo*= o o  |
      |      .  .       |
      |        . . o E  |
      |           o .   |
      +----[SHA256]-----+
  • Add the public key to your GitHub account by navigating to your account settings, selecting “SSH and GPG keys”, and clicking “New SSH key”.
  • Copy the contents of the public key file (usually ~/.ssh/id_rsa.pub) and paste it into the “Key” field on the GitHub website.
  • In Visual Studio Code, open the Command Palette (press Ctrl+Shift+P on Windows) and search for Remote-SSH: Open SSH Configuration File.
    • You may need to install the extension Remote-SSH first
  • Select the configuration file you want to edit and add the following lines:
    Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa
  • Save the file and close it.
  • Open the Command Palette again and search for Remote-SSH: Connect to Host.
    • you may have to set user and e-mail:
git config --global user.name "YOUR_USERNAME"
git config --global user.email "YOUR_EMAIL_ADDRESS"
  • Select the configuration file you just edited and wait for the connection to be established.
  • You should now be able to use Git with SSH authentication in Visual Studio Code.
Nov 29, 2024

DiversityWorkbench

Icons

Overview for all icons used in the software with an explanation

Modules

  • DiversityWorkbench. Zum Beispiel beim Zugriff auf ein anderes Modul mittels der Remote Query

Software

DA DC DD DE DG DP DR DSP DST DTN

When referred from another module

DA DC DD DE DG DP DR DSP DST DTN

Common

Download, Installation, Login

  • Download
  • Login
  • Download. Überarbeitet und durch eigenes Logo ersetzt

Editing

  • Table
  • Table Editor
  • Template
  • Edit Template

Customization

Archive

  • Archivierung
  • Anlegen eines Archivs
  • Wiederherstellung eines Archivs
  • Schema für ein Archiv beziehungsweise Schema der Tabellen

Database

  • Datenbank

  • eine Datenbank hinzufügen

  • Database Configuration

  • funktionen und Prozeduren in einer Datenbank

  • fehlende Verbindung zur Datenbank

  • Zu einer Datenbank neu verbinden

  • datenbankrolle

  • Einstellungen in einer Datenbank

  • tabellen in einer Datenbank

  • Update linked data

  • ###

  • Database List

  • Sichten in einer Datenbank

  • Datenquellen wie Webservices oder Datenbanken anderer Module innerhalb der Workbench

  • Backup

  • Modell einer Datenbank

  • ER / Information Model

  • SQL

  • SQLite

Cache database

  • Cashdatenbank
  • Filter für den Transfer in die Cash Datenbank

Postgres

  • Postgres

  • Eine Postgres-Datenbank kopieren

  • Database settings in Postgres (e.g. Name)

  • Fehlende Verbindung zu einer Postgresdatenbank

  • Eine Postgres-datenbank ersetzen

  • Postgres Target

  • MountPoint

  • Transfer data using bcp

Arrows

Blau

  • Down
  • Down
  • Up
  • Up
  • Vorwärts
  • Zurück
  • fast Forward
  • An den Anfang
  • Forward Stopp
  • Stop
  • Höhe
  • Breite
  • Next

Schwarz

  • Next
  • back
  • down
  • up
  • breite
  • breite

Manual, Documentation

  • Manual
  • Application Description
  • Documentation
  • Bug. Zum Beispiel im Manual wenn ein Fehler im Programm behoben wurde
  • FAQ
  • Video
  • Video
  • Video DE
  • Video EN
  • HUGO
  • Tutorial

Data handling

  • Kopieren
  • löschen
  • hinzufügen
  • option abgewählt
  • Option ausgewählt
  • editieren
  • kein editieren möglich oder abgeschaltet

Query

  • Filtern, Suche starten
  • zusätzliche Datensätze suchen
  • Suchkriterien zurücksetzen
  • Suchkriterien laden
  • Liste von Suchen
  • Suchkriterien speichern
  • Datensatz suchen
  • komplexe Suche

Export

Import

  • Import
  • Import Wizard
  • Import Wizard Test
  • An vorhandene Daten anhängen
  • Werte übersetzen
  • Anhängen
  • Schneiden
  • Visible
  • Hidden
  • Decision

Replication

  • ServerAdd
  • Upload
  • Clean Database

Hierarchy

  • Die Standarddarstellung der Hierarchie mit den übergeordneten Knoten sowie den Kind Knoten des aktuellen Datensatzes
  • Darstellung der gesamten Hierarchie angefangen am obersten Datensatz
  • Aufbau der Hierarchie von unten nach oben
  • Einschränkung der Hierarchie auf die Kinder des aktuellen Datensatzes
  • Copy Hierarchy
  • Einschränkung der Hierarchie auf die übergeordneten Datensätze des aktuellen Datensatzes
  • aufbau der Hierarchie von oben nach unten
  • Hierarchie aktualisieren
  • No Hierarchie
  • Hierarchy and Synonyms

Feedback - changed to E-mail support

  • Send a feedback as an E-mail to the support address
  • deprecated - now issues in git
  • deprecated - now issues in git

Maps

  • Karte / Land
  • Distribution
  • Distribution incl. Organisms
  • TK
  • UTM
  • Gauss Krueger

Images

  • Image
  • Image List
  • Zoom Adapt
  • Zoom to 1:1
  • Zoom Detail
  • Rotate Left
  • Rotate Right
  • Flip Horizontal
  • Flip Vertical

Update

  • Update
  • Update Client
  • UpdateDatabase

Timeout

  • Timeout
  • Timeout Database
  • Timeout Web
  • Group
  • an agent, user etc.
  • create a copy of an agent
  • set the display type of an agent
  • ###

  • Login

  • Logins

  • Login Locked

  • Not Logged in

  • Windows Login

  • Roles

  • Encrypted

Webservice etc.

  • Catalog of Life
  • IndexFungorum
  • Gfbio
  • Webservice
  • Github

System etc.

  • Administration
  • Architektur
  • CC
  • ###

  • ###

  • Error

  • Errorlog

  • No Errorlog

  • Windows

  • Linux

  • TCP

  • Shared Memory

  • Install

  • Installation

  • System Tools

  • System Tools

  • Server

  • Server IO

Module specific

DA

Contact

  • Contact
  • Address

DC

  • Scan Collection
  • Scanner

Agent

  • an anonymous collector in DC

Analysis

  • Analysis
  • Hierarchy
  • Edit DNA

Collection

  • der Code einer Sammlung
  • Eine Sammlung hinzufügen
  • Administrative Hierarchie in einer Sammlung
  • Räumliche Hierarchie in einer Sammlung
  • der Sammlungsmanager
  • der Benutzer einer Sammlung
  • Grundriss

Types

  • Generischer Typ einer Sammlung
Administrativ
  • Institution
    • Department
Räumlich
  • der Ort einer Sammlung
    • Room
    • Rack
    • Cupboard
    • Container
      • Box
      • Drawer
      • Subdevided container
      • Subdevided container
        • Area
    • Freezer
    • Fridge
    • Steellocker
    • Radioactiv
IPM
  • Sensor
  • Trap
  • Hardware

Event

  • Event
  • Event Merge
  • Event Method
  • Event Image
  • Event Assign
  • Remove Event from Series

Series

  • Series
  • Find Series
  • Series Hierarchy
  • Series Image

Localisation

  • ###

  • ###

  • Verbreitung

  • Tiefe

  • Habitat

  • Höhe

  • Plot

  • Plot Hierarchy

Specimen

  • ###
  • Bilder
  • ###
  • ###

Parts

  • ###
  • ###
  • beschreibung
  • SpecimenPart Identifier

Material

  • Medium
    • Drawing or photograph
      • Drawing
      • Image
    • Sound
  • Observation
    • Human Observation
    • Machine Observation
  • Specimen
    • Fossil Specimen
    • Living Specimen
      • Culture
    • Other Specimen
      • Objekttraeger
      • Egg
      • Nest
      • Earth science
      • DNA
        • DNAlyophilized
      • gewebe
    • Preserved Specimen
      • knochen
        • skull
        • single bone
        • Otolith
        • Tooth
      • shell
      • dried Specimen
        • Herbarium sheet
        • Pinned Specimen
      • Vial
      • Fell

Printing

  • ein Etikett
  • viele Etiketten

Units

  • ###
  • bilder
  • ###
  • ###
  • ###
  • ###

Taxonomic groups

Taxa

  • Viren
  • Bacterium
  • Algen
  • Moose
  • Plants
    • Galle
  • pilze
    • Flechten
  • Schleimpilze
  • Tiere
    • Quallen
    • Evertebrata
      • Mollusca
        • Gastropoda
      • arthropoden
        • spinnen
        • Insekten
          • Heteroptera
          • Kaefer
          • Wespe
          • Lepidoptera
          • Fliege
      • Stachelhäuter
    • Vertebrata
      • fische
      • Amphibien
      • reptiles
      • säugetiere
      • säugetiere - Alternative
      • vögel

Terms

  • Boden
  • Bodenhorizont
  • Rock
  • mineral
  • artefact

Transaction

  • transaktionen
  • Transaction Balance
  • Anforderung einer Bestätigung für eine Ausleihe
  • Embargo
  • Tausch
  • Weiterleitung
  • Geschenk
  • gruppe
  • Inventur
  • ausleihe
  • Dauerleihe
  • meine Anfrage
  • Erlaubnis
  • Kauf
  • entfernung
  • Anfrage
  • rücksendung
  • Teilrücksendung
  • Sendung
  • Specimen in Transaction
  • Payment
  • Transaction Management
  • Requestor

Tasks

  • Aufgabe

  • Aufgabe in Sammlung

  • batterie

  • Ladezustand einer Batterie in Prozent

  • Ladezustand einer Batterie in Volt

  • Nützlinge

  • reinigung

  • Poison

  • Reparatur

  • sensor

  • Prometheus

  • Falle

  • Ausstellung

  • IPM

Best practice

  • Plant Parasite
  • Ship
  • Forest Plot
  • Bohrkern
  • Identification Key

Bayern Flora

  • BayernFlora
  • BayernFlora
  • GUC

Bavarikon

  • Bavarikon

DD

Description

  • Description
  • AddDscr
  • AddAllDscr
  • AddDscrs
  • AddCondDesc

Scope

  • Scope
  • Add Scope

Delta

  • Delta
  • Delta Settings

sonstige

  • Type
  • Mandatory
  • Add All
  • alles löschen

DG

DP

  • ###
  • ###

DR

DSP

DST

  • ###
  • ###
  • Representation
  • ###
  • ###

DTN

Checklist

  • ###
  • ###

ToDo

A

  • Hinzufügen mehrere Objekte
  • Audio

B

  • Broken Link
  • suche im Web
  • Ein Vorschlag für das Logo von Diversity References

C

  • Ein Chart als Suchergebnis zum Beispiel für Ergebnisse von Scientific Terms

  • Clipboard

  • einstellung einer Farbe

  • eine Spalte in einer Tabelle

  • Festlegung der Spaltenbreite

  • Festlegung der Spaltenbreite auf Inhalt

  • Festlegung der Spaltenbreite auf Inhalt fixiert

  • ein Konflikt in den Daten beispielsweise bei Synchronisation zwischen 2 Datenbanken

  • Copy Synonym

  • Circle

D

  • ein Dokument
  • doi

E

  • ein Logo für die EU insbesondere in Bezug auf Gesetzgebungen
  • Eine externe Datenquelle

F

  • Aus FontAwesome bezogene Logos

    • code-branch
    • cogs
    • compact-disc
    • laptop-code
  • Ein Verzeichnis, beispielsweise ein Ordner

  • GisEditor

  • ###

  • Grid. Eine spezielle Ausgabe in Diversity Collection

  • History. Ansicht von Daten in den Log Tabellen

  • ###

I

  • Eine ID. In der Regel extern

  • Ein Index in der Datenbank

  • IndExs

  • Am Anfang einfügen

  • In Lines

  • JsonApi

K

  • Kalender
  • Schlüssel
  • Beschreibung
  • Keyword
  • Koordinatenkreuz. Zeigt die Position innerhalb einer Karte beispielsweise Google Maps an

L

  • die Sprache, beispielsweise als Einstellung für die Oberfläche eines Programms
  • Legend
  • ein Link
  • Linked Server. Eine vom Administrator innerhalb von SQL Server eingerichtete Verbindung zu einem Server von dem Daten gelesen werden können
  • Eine Liste
  • ###
  • ###
  • ###
  • ###
  • ###
  • ausblenden einer Liste
  • Eintrag von Daten ins Log
  • Wiederherstellen von Daten aus dem Logverzeichnis
  • Sicherungen von Daten ins Log
  • Detailansicht

M

  • Darstellung von Daten in einer Karte
  • eine Spalte auswählen oder markieren
  • Hochladen von Daten zum SNSB Media Service
  • MediaWiki
  • Das Menü einer Applikation
  • ###
  • ###
  • ###
  • ###
  • Ein Artefakt. Als Taxonomische Gruppe für beispielsweise ein Modell innerhalb von diversity Collection
  • Verbindungen zu anderen diversity Workbench Datenbanken auf dem aktuellen Server
  • ###

N

  • ein Name, zum Beispiel eine Bestimmung oder der Name einer Person

  • Anzeige von akzeptierten Namen

  • eine abhängige Bestimmung hinzufügen. Dies wird insbesondere in diversityCollection für die Charakterisierung von Gesteinen verwendet

  • ein Synonym zu einem Namen

  • Kein Als typus festgelegter Name

  • Einen Namen heraufstufen

  • Einen Namen herabstufen

  • Einen Namen an das Ende setzen

  • Einen Namen bestätigen

  • NamedPipes

  • Netzwerk

  • Einen neuen Datensatz anlegen

  • mehrere neue Datensätze anlegen

  • kein Zugang zu den ausgewählten Daten

  • eine Notiz oder Anmerkung

  • Eine Anmerkung hinzufügen

O

  • eine Beobachtung
  • OK
  • ein Verzeichnis öffnen
  • Optionen. Insbesondere Einstellungen für die Suche
  • Überschreiben

P

  • ###

  • ###

  • Parameter

  • Verwandtschaftsbeziehungen

  • Entfernung einer Beziehung zum übergeordneten Datensatz
  • einfügen einer Beziehung zu einem übergeordneten Datensatz
  • Beschreibung eines teils eines SammlungsObjekts In diversityCollection
  • ###
  • ###
  • ###
  • ###
  • ###
  • ###
  • ###
  • Plant parasite
  • Vorkommen von Organismen innerhalb eines Quadranten von TK25
  • Eine Untersuchungsfläche beziehungsweise das Symbol für das Modul Diversity Sampling Plots
  • ein Drucker beziehungsweise Ausgabe von Daten in gedrucktem Format
  • die Prozessierung von Sammlungsobjekten beispielsweise Trocknung in diversity Collection
  • Projektdaten mit auf ReadOnly beschränktem Zugriff

  • Öffentlich zugängliche Daten

  • Problem

  • ein QR Code

  • Voreingestellte suchen. Wird für Version 8 obsolet

  • Beenden eines Programms

R

  • entfernen von Daten

  • Auswahl einer Option

  • eine Literaturstelle

  • Eine Beziehung innerhalb der Datenbank

  • Eine Beziehung Zu Daten außerhalb der Datenbank

  • Eine Beziehung innerhalb der Datenbank Von anderen Daten auf den aktuellen Datensatz

  • Replace

  • Replication

  • ###

  • Restore from log
  • ###
  • ###
  • Row Height

S

  • ###
  • ###
  • Ein Sender zum Beispiel ein LoraWan Sender in einem Netzwerk für IPM
  • Einstellungen innerhalb der Applikation
  • Sortierung der Ergebnisse einer Suche
  • Sortierung der Ergebnisse einer Suche
  • ###
  • ###
  • ###
  • ###
  • ###

T

  • ###
  • Transfer von Daten. Beispielsweise in ein neues Projekt oder eine Transaktion
  • ###
  • ###
  • Undo
  • Undo all
  • Volume
  • Warnung, zum Beispiel bei Transaktionen wenn ein Teil der erfassten Objekte giftige Substanzen enthält
  • Wartung
  • Maintenance
  • Workflow
Jun 12, 2025