Development
This part contains information on software development
This part contains information on software development
When designing a Windows Forms application, you have several architectural patterns to choose from. The common ones are:
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:
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.
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.
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.
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.
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
The extraction of the hierarchies in some cases are very time consuming. To speed up the queries including hierarchies these are cached in cache tables. Therefor procedures are available to set the hierarchies in the cache tables to the current state after any changes in the original data.
The example below shows the hierarchy in the table collection in DC. The procedure procRefreshCollectionHierarchyCache checks the function CollectionHierarchyRefillBlocked. In case it returns true, nothing is changed as another process is active. In case of false, the function CollectionHierarchyRefillBlocked is set to true and the data in the cache table are refilled with the current state of the data. As a last step, the function CollectionHierarchyRefillBlocked is set to false.
graph TD; Start(Try to set<br>the hierarchy to<br>the current state) Cache[<i class="fa-fw fas fa-table"></i> Cache table] proc[proc Refresh<br>cache table] procCheck(Check state) procSetTrue(Set to true) procRefill[Refill<br>cache table<br>with current data] procSetFalse(Set to false) func{<i class="fa-fw fas fa-eye"></i> function<br>Refill<br>Blocked} Start --> func func -->|false| proc func -->|true| Start proc --> |check if false, set to true| procCheck procCheck --> func procCheck --> |true| Start procCheck --> |false| procSetTrue procSetTrue --> func procSetTrue --> procRefill procRefill --> Cache procRefill --> procSetFalse procSetFalse --> func
The procedure is executed only by users with the necessary permissions. The cache needs an update after any changes to the original data e.g. via an import. So e.g. the ImportWizard should either include the execution of the procedures as a last step after the import or the user should get an according message to update the cache.
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.
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:
Beispiel für Umsetzung anhand DiversityCollection_GUC_8 im Formular FormArtCode:
this.KeyPreview = true;
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 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
#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
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
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.
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
Der mobile Client wird als Testprojekt mit AspNetCore für REST und Webassembly für den Client aufgesetzt
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
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.
Für CLI Clients
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
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.
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.
The DiversityWorkbench provides several applications addressing every IPM related task:
(!!! Heisst des wiklich so?, ist das nicht DTN? Der Kurz-Name ist doch schon TaxRef_SNSB_NHC-Pests? Es ist nicht klug Synonyme zu erzeugen.) -> das sind alles Platzhalter fuer Projekte in C#. TaxRef_SNSB_NHC-Pests ist nix was man als Projektbezeichner verwenden würde. Das ist ein internes Kürzel.
Taxonomic backbone providing 3 lists of taxa related to IPM:
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
(Gibt es das schon?) -> nein - Platzhalter
Identification key for taxa provided by IPMtaxa
(ongoing project) -> klar - aber das sollte bis September fertig sein. Ongoing ist bei uns alles
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.
es können alte Daten eingelesen und neue Daten geschrieben werden. Ändern und Löschen nach dem Speichern ist nicht vorgesehen.
Auswahl der Taxa die für die Erfassung berücksichtigt werden sollen
lesend
schreibend
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.
git submodule add https://github.com/McShelby/hugo-theme-relearn.git themes/relearn
um das Theme auf die letzte Version zu bringen kann man den Befehl
git submodule update --remote --merge themes/relearn
verwenden
---
title: Installation
---
 in 
[](http://media.snsb.info/Tutorials/dwb/Editing/OeffentlicheKontaktdaten.webm)
zu
[](http://media.snsb.info/Tutorials/dwb/Editing/OeffentlicheKontaktdaten.webm)
[Contact](Contact.htm)
[Contact](editingdata/contact)
baseURL = "http://www.diversityworkbench.de"
dann muss diese auch für Verweise innerhalb der Files verwendet werden.

[Anmelden](database)
### 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
übersetztYou can change the frontmatter to a default using the documentation tool
---
oben und unten abgegrenzt, e.g.
---
title: Login administration
linktitle: Logins
weight: 5
menuPre: img/Documentation.svg
alwaysopen: false
---
draft: true
im Frontmatter markieren. Diese werden dann nicht in die Ausgabe übernommentitle: Login administration
angegeben. Dieser erscheint dann auch in der Seite als Überschriftlinktitle: Logins
. Ansonsten erscheit der Titel im Menüweight: 5
angegeben werden. Ansonsten wird alphabetisch sortiertalwaysopen: false
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
You can adapt the images to a default using the documentation tool


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


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


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.
<h4><b>DiversityAgents</b></h4>
<img src="/DA_4D.svg">
Im Ordner static den Ordner images anlegen Datei favicon.ico in der Ordner static/images kopieren
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.
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 }
es werden 2 eigene Themes bereitgestellt
diese an DWB Anforderungen anpassen
#body img.inline {
display: inline !important;
margin: 0 !important;
vertical-align: middle;
/* vertical-align: bottom; */
}
/*--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 */
```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: “…\diversityworkbench\hugo.toml:1:1”: 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 = "http://www.diversityworkbench.de"</code> dann muss die passende Adresse eingeben werden also e.g. <code>localhost:1313</code></li>
</ul>
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:
For enumeration tables the content can be exported as explained in a short tutorial:
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:
The adaptions for links for HUGO as related references are explained in a short tutorial:
To map the files in the original links to new files in the documentation follow the steps shown in a short tutorial:
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:
cd %USERPROFILE%
ssh-keygen -a3 -t ed25519 -C "your_email@example.com" -f .ssh/id_github
.
id_github
. Make shure not to overwrite existing keys.+--[ED25519 256]--+
| .. .+=.o |
| .+ . o+* |
| . +.. ooo.o |
| +.B.+= =.o |
| =+S=o* = o |
| . oo*= o o |
| . . |
| . . o E |
| o . |
+----[SHA256]-----+
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
git config --global user.name "YOUR_USERNAME"
git config --global user.email "YOUR_EMAIL_ADDRESS"
Overview for all icons used in the software with an explanation
DA | DC | DD | DE | DG | DP | DR | DSP | DST | DTN |
---|---|---|---|---|---|---|---|---|---|
DA | DC | DD | DE | DG | DP | DR | DSP | DST | DTN |
---|---|---|---|---|---|---|---|---|---|
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
###
###
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
Postgres
Eine Postgres-Datenbank kopieren
###
Fehlende Verbindung zu einer Postgresdatenbank
Eine Postgres-datenbank ersetzen
Postgres Target
MountPoint
###
Export
Export Wizard
Import, Export
CSV export
JSTOR
###
Login
Logins
Login Locked
Not Logged in
Windows Login
Roles
Encrypted
###
###
Error
Errorlog
No Errorlog
Windows
Linux
TCP
Shared Memory
Install
Installation
System Tools
System Tools
Server
Server IO
###
###
Verbreitung
Tiefe
Habitat
Höhe
Plot
Plot Hierarchy
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
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
Aus FontAwesome bezogene Logos
Ein Verzeichnis, beispielsweise ein Ordner
GisEditor
###
Grid. Eine spezielle Ausgabe in Diversity Collection
History. Ansicht von Daten in den Log Tabellen
###
Eine ID. In der Regel extern
Ein Index in der Datenbank
IndExs
Am Anfang einfügen
In Lines
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
###
###
Parameter
Verwandtschaftsbeziehungen
Projektdaten mit auf ReadOnly beschränktem Zugriff
Öffentlich zugängliche Daten
Problem
ein QR Code
Voreingestellte suchen. Wird für Version 8 obsolet
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
###