Datenbankmodel in Navision abbilden

27. Oktober 2008 18:12

Hallo !

Die Überschrift dieses Post nimmt die Frage eigentlich schon vorweg. Ist so etwas möglich? Ich gehe davon aus, dass mir 4 Tabellen zur Verfügung stehen und ich hier in jeder Tabelle einen Primärschlüssel definiert habe. Kann ich irgendwie Fremdschlüssel in Navision definieren? Besteht die Möglichkeit, diese 4 tabellen nun untereinander zu verknüpfen, also quasi wie eine richtige Datenbank mittels Fremd- und Primärschlüsseln?

Re: Datenbankmodel in Navision abbilden

27. Oktober 2008 18:36

Die NAV- CSIDE-Datenbank ist schon eine richtige Datenbank, die teilweise sogar mehr kann als der MS-SQL-SERVER :!: , an anderer Stelle aber auch weniger :-( .

Sicher kann man in Navision ein eigenes Datenmodell abbilden, auch kann man Fremdschlüssel definieren (Property 'TableRelation' an den Feldern in der Tabelle) :wink: .
Solltest du aber von einem SQL-Server her Erfahrungen haben, solltest du folgendes beachten (mit Bitte um Ergänzung):
    - Die Tabellen, welche du benutzen möchtest, müssen in der benutzen Navision- Lizenz freigeschaltet sein für Design und Einfügen.
    - Bei einem SQL-Server kann man Regeln aufstellen, was er beim Löschen von Datensätzen in der Mastertabelle mit den Datensätzen aus den verlinkten Tabellen machen soll. In NAV musst du das selbst programmieren.

Gruß, Fiddi

Re: Datenbankmodel in Navision abbilden

27. Oktober 2008 19:51

Ok danke, könnt ihr mir erklären, warum man eigentlich nirgends etwas zum C/AL Programmieren findet, weder im Netz noch in Büchern. Existieren nirgends brauchbare Codebeispiele? Ich versuche derzeit eine einfache manuelle Eingabe in eine selbst angelegteTabelle umzusetzen, aber dieses funktioniert einfach nicht. Auch erhalte ich kein OK Button, wenn ich ein Dialogfenster aufbauen will. Hier mal das Codebeispiel:

Code:
BEGIN
MESSAGE('Es erfolgt nun die Eingabe!');
tabelle.INIT;
win.OPEN('Nummer: #1######\ Name: #2######\ Nachname: #3#######\');
win.INPUT(1, platz1);
win.INPUT(2, platz2);
win.INPUT(3, platz3);
tabelle.nummer := platz1;
tabelle.name := platz2;
tabelle.nachname := platz3;
tabelle.INSERT
win.CLOSE;
END;


Es verfolgt keine vernünftige Eingabe. Ich habe auch nicht die Möglichkeit, vielleicht mittels Dialogfenster 2-3 Datensätze einzugeben. Es wird nur ein Abbruch-Button angezeigt, aber kein OK-Button. Warum weiß ich nicht. Gibt es wirklich nirgends brauchbare Programmierbeispiele. Referenzen etc. außer den Designers Applications Guide !?

MFG

Re: Datenbankmodel in Navision abbilden

27. Oktober 2008 20:08

Kossy hat geschrieben:Ok danke, könnt ihr mir erklären, warum man eigentlich nirgends etwas zum C/AL Programmieren findet, weder im Netz noch in Büchern. Existieren nirgends brauchbare Codebeispiele?

Na hör mal, indirekt zu behaupten, HIER gäbe es keine Codebeispiele, das ist doch ... :shock:

Ich versuche derzeit eine einfache manuelle Eingabe in eine selbst angelegteTabelle umzusetzen, aber dieses funktioniert einfach nicht.

Wo hast du den o.g. Code überhaupt eingefügt?
Hilf es vielleicht, wenn du nach deinem Code ein CurrForm.UPDATE(FALSE); hinterlegst?
Hab gerade kein NAV zur Hand, um den Rest des Codes zu beurteilen.

Auch erhalte ich kein OK Button, wenn ich ein Dialogfenster aufbauen will.

Ja, weil Dialogfenster nunmal keinen OK-Button kriegen. Punkt. Daran gibt es nichts zu rütteln.

Ich habe auch nicht die Möglichkeit, vielleicht mittels Dialogfenster 2-3 Datensätze einzugeben.

Wieso auch über eine Dialogbox? Für so etwas gibt es doch editierbare Listforms bzw. die Buchungsblätter.

Gibt es wirklich nirgends brauchbare Programmierbeispiele. Referenzen etc. außer den Designers Applications Guide !?

Manchmal sind im C/SIDE Reference Guide (also in der Onlinehilfe) ein paar Beispiele hinterlegt, z.B. bei Form.RUNMODAL

Re: Datenbankmodel in Navision abbilden

27. Oktober 2008 20:19

Hallo Natalie !

Die Aussage, dass ich nirgends Codebeispiele finde, war nicht auf dieses Forum bezogen. Eher bezog sie sich allgemein auf das Netz und Literatur. Ich meine zu jeder Programmiersprache, bspw. Java, C, pascal, findet man über google oder ich diversen Büchern viele Impulse, die zu einem besseren Verständnis beitragen. Bei C/AL vermisse ich das irgendwie ein wenig.

Den C/Side Referenzguide kenne ich bereits, aber auch hier sind "nur" einzelne Codehappen zu finden, weniger komplexe Beispiele. Dieses ist leider wenig von Vorteil.

Meinen Code habe ich in dem onRun Trigger einer selbst geschriebenen Codeunit platziert und diese Codeunit mit der entsprechenden Tabelle verknüpft.

Ok das mit der Dialogbox wusste ich nicht. Ich würde Deinen Vorschlag gerne annehmen, nur leider habe ich das Gefühl, dass dieser zu komplex ist. Ich habe die Aufgabe eine kleine Schulung vorzubereiten, in der die Grundzüge der C/AL Programmierung erläutert werden. Ich möchte hierzu 4 Tabellen anlegen und diese einmal mittels eines Formulars, nur mit reinem C/AL Code und einmal mit Hilfe einer manuellen Eingabe (bspw. Dialogbox) mit Datensätzen füllen. Ich schätze Deinen Vorschlag, aber ich glaube, dass er schon etwas zu weit in die Materie geht und viel voraussetzt. Stell Dir einfach vor Du sitzt das erste mal vor Navision und sollst dann solche kleineren Aufgaben erledigen. Gibt es eine Alternative zur Dialogbox?

Grüße
Kossy

Re: Datenbankmodel in Navision abbilden

27. Oktober 2008 20:40

Kossy hat geschrieben:Ich meine zu jeder Programmiersprache, bspw. Java, C, pascal, findet man über google oder ich diversen Büchern viele Impulse, die zu einem besseren Verständnis beitragen. Bei C/AL vermisse ich das irgendwie ein wenig.

Nicht nur du :roll:
Microsoft will halt Schulungen verkaufen ...

Stell Dir einfach vor Du sitzt das erste mal vor Navision und sollst dann solche kleineren Aufgaben erledigen.

Autsch, das finde ich gemein. Wer vergibt denn solche Aufgaben? Könnte er/sie denn selbst lösen?

Gibt es eine Alternative zur Dialogbox?

Um was genau zu erreichen?

Vielleicht sparst du das Beispiel mit der Dialogbox aus und arbeitest mit Variablen, denen vorher ein sprechender Wert zugewiesen wird.

Code:
FOR i := 1 to 4 DO BEGIN
  Tabelle.INIT;
  Tabelle."Entry No." := i;
  Tabelle.Description := 'Beschreibung für Eintrag Lfd. Nr ' + FORMAT(i);
  Tabelle."Eine Dezimalzahl" := 0.5 * i;
  Tabelle.INSERT;
END;


Und gaaaaaaaaanz dringend zu empfehlen :-):
[mibuso]Microsoft Dynamics NAV 5.0 Quick Reference
Ausdrucken und immer griffbereit halten

Re: Datenbankmodel in Navision abbilden

27. Oktober 2008 23:36

Ich möchte mit dem Dialogfeld für jede neue Tabellenzeile bzw. jeden neuen Datensatz eine idividuelle Eingabemöglichkeit für den Benutzer zulassen.

Danke für Dein Codebeispiel, ich habe es mal etwas an meine Bedürfnisse angepasst:

Code:
MESSAGE('Die Codeunit startet jetzt');

    FOR i := 1 TO 4 DO BEGIN
       
          BEGIN
            versuch.INIT;
            window.OPEN('New Location for the warehouse. \Name : #1#############\');
            window.INPUT(1, Name);
            versuch.Code := i;
            versuch.Name := Name;
            versuch.INSERT;
            window.CLOSE;
          END; 

   END;

MESSAGE('Die Codeunit schließt jetzt');


Mit dem folgenden Code versuche ich die eingegebenen Daten wieder auszulesen:

Code:
MESSAGE('Diese Codenuit gibt die eingetragenen Werte aus!');


IF versuch.FIND('-') THEN

  REPEAT

    BEGIN
    MESSAGE(versuch.Name);

    END;

  UNTIL versuch.NEXT = 0;


Das klappt auch ohne Probleme, wie kann ich allerdings auch noch das Feld "Code" auslesen. Also bspw. mit der Codezeile MESSAGE(versuch.Code); ? Hier bekomme ich die folgende Fehlermeldung:

Eine Typkonvertierung kann nicht durchgeführt werden, da eine der seiten einen ungültigen Typ hat. Text := Integer.

Code ist ein Integerwert. Wie kann ich den mittels einer Messagebox auslesen?

MFG

Re: Datenbankmodel in Navision abbilden

28. Oktober 2008 01:19

Kossy hat geschrieben:Das klappt auch ohne Probleme, wie kann ich allerdings auch noch das Feld "Code" auslesen. Also bspw. mit der Codezeile MESSAGE(versuch.Code); ? Hier bekomme ich die folgende Fehlermeldung:
Eine Typkonvertierung kann nicht durchgeführt werden, da eine der seiten einen ungültigen Typ hat. Text := Integer.
Code ist ein Integerwert. Wie kann ich den mittels einer Messagebox auslesen?

Mit FORMAT können Integer und Decimalwerte als Text formatiert werden.
Wenn der Feldname Code ist , sollte allerdings auch der Feldtyp Code sein. Das ist überall in NAV so, weil grundsätzlich alphanumerische Codes zugelassen sind, solange dies nicht explizit ausgeschlossen wird. Das wird dann aber die Feldproperties eingestellt.

Re: Datenbankmodel in Navision abbilden

28. Oktober 2008 11:10

@OP: ich glaube du gehst die ganze Sache falsch an. Probier mal Forms für deine Tabellen zu erstellen anstatt diese "zu Fuss" per Dialogboxen nachprogrammieren zu wollen.

Re: Datenbankmodel in Navision abbilden

28. Oktober 2008 22:37

Vielen Dank für die Antworten. das hilft mir schon sehr weiter !!

Nochmal zurück zu der Ausgangsfrage. Wenn ich also in meinem Object Designer irgendeine entsprechende Tabelle auswähle, dann auf Design klicke und dann als nächstes auf Ansicht -> Properties, bekomme ich einige Optionen angezeigt, u.a. Table Relation. Hier klicke ich in das Feld Undefined und lande anschließend in einem neuen Fenster, indem ich folgendes auswählen kann:

Condition, Table, Field, Table Filter

Um eine Fremdschlüssel zu defnieren nehme ich mal an, dass ich in dem Feld Table meine auszuwählende Tabelle eintragen und unter Field dann die Felder aussuche, die als Fremdschlüssel in frage kommen.

Leider bekomme ich nicht das gewünschte Ergebnis. Leider kann man auch nirgends vernünftig nachlesen, wie ich eine Fremdschlüssel- und Primärschlüsselbeziehung unter mehreren Tabellen aufbauen kann. Ich komme nicht wirklich weiter.

Vielleicht kann mir jemand von euch das anhand eines einfachen Beispieles erklären, so dass ich wenigstens mal etwas selbst ausprobieren kann.

Grüße
Kossy

Re: Datenbankmodel in Navision abbilden

28. Oktober 2008 23:55

Eine TableRelation kann nur zu einem Feld des Primärschlüssels einer anderen Tabelle hergestellt werden. Wenn der Primärschlüssel dieser Tabelle nur ein Feld hat, kann die Feldangabe ohnehin entfallen. Wie Condition benutzt wird , kann z. B. in Tabelle 37 Verkaufszeile entnommen werden, wo die "Nr." je nach Feldwert in dem Feld "Art" eine TableRelation zu verschiedenen Tabellen hat. Mit Table Filter kann ein Filter auf die Datensätze der anderen Tabelle(n) gelegt werden.

Re: Datenbankmodel in Navision abbilden

30. Oktober 2008 16:54

Ich habe nochmal eine Frage zu dem Thema "Table Relation". Ich habe folgende Tabellen in meiner selbst erstellten Datenbank: Bestellung und Artikel. In der Tabelle Bestellung soll mittels eines Feldes "Itemnumber" auf die Tabelle Artikel zugegriffen werden. Unglücklicherweise funktioniert es bei mir nicht, ich bekomme kein Ergebnis.

Zur näheren Anschauung: Ich habe innerhalb der Tabelle Bestellung das Feld Artikelnummer vom Typ Code eingerichtet. Klicke ich in dieses Feld und dann auf den rechts angezeigten Pfeil, so sollte eigentlich die Tabelle Artikel in meinem Fenster erscheinen. Aber nach einem Klick passiert nichts !! In den Properties der Tabelle Bestellung habe ich unter "Table Relation" in dem Feld Table die Tabelle Artikel ausgewählt.

Frage: Wo liegt mein Fehler? Habe ich irgendetwas vegessen?

MFG

Re: Datenbankmodel in Navision abbilden

30. Oktober 2008 17:20

Schätzungsweise die Form, mit der die Tabelle Artikel geöffnet wird, wenn man sie aus einem LookUp öffnet. Die muss in den Properties der Tabelle Artikel im Feld "LookupFormID" eingetragen sein.

Re: Datenbankmodel in Navision abbilden

30. Oktober 2008 17:40

In den Properties der Tabelle Bestellung habe ich unter "Table Relation" in dem Feld Table die Tabelle Artikel ausgewählt.

Für TableRelation: du meintest doch Tabelle Bestellung, Feld ItemNumber, oder? Sonst kann es nicht funktionieren.

Andere Möglichkeit:
In der Tabelle (oder auch Form) Bestellung, Feld ItemNumber ist im Trigger OnLookup-Trigger etwas drin.
Hier darf nicht mal eine lokale Variable definiert sein (auch ohne sie zu nutzen), keine Zeile Quelltext.

Re: Datenbankmodel in Navision abbilden

30. Oktober 2008 18:07

Hallo

Du fragst in einem Beitrag, wo man Informationen zur Entwicklung von Navision-Programmen findet. Hier mal ein paar Beispiele:
  1. Im Client-Verzeichniss (also dort wo die fin.exe liegt) solltest du eine database.fdb finden. Diese Datenbank enthält den Mandanten 'CRONUS AG'. Hier kannst du, denke ich, alle Programmier Möglichkeiten von NAV finden. Dort findest du auch eine Lösung für dein Bestellproblem (Diese Datenbank ist übrigens nicht nur eine Demo, wie z.B. die 'Nordwind' -Datenbank beim MS-SQL-Server, sondern die Basis für nahezu alle Entwicklungen, welche mit NAV erhältlich sind.)
  2. Auf deiner NAV-CD solltest du ein Verzeichnis '/Doc' finden. Dort findet sich neben anderen Unterlagen auch die Datei 'w1w1adg.pdf'.
    Wie der Name schon sagt :wink: , enthält diese Datei das Application Designers Guide. Hier findest du sicherlich viele Informationen zum Aufbau von NAV-Anwendungen.
  3. Bei http://www.mergetool.com findest du ein zwar älteres aber immer noch brauchbares Programmierhandbuch für C/AL

Gruß, Fiddi

Re: Datenbankmodel in Navision abbilden

30. Oktober 2008 18:17

In diesem Thread auf Mibuso findest du unten einen Link zu einer spanischen Seite mit zahlreichen spanischen PDFs zu NAV. Die Trainingsunterlagen zur Entwicklung (Dev I und Dev II) sind aber auf Englisch.

Re: Datenbankmodel in Navision abbilden

31. Oktober 2008 14:39

Ok vielen Dank für die Antworten.

Ich habe noch eine letzte Frage: Ich möchte in meiner Tabelle Bestellung einen Gesamtpreis berechnen. Dieser setzt sich zusammen aus dem Wert "Preis" in der Tabelle Artikel und dem Feld "Anzahl der Artikel" in der Tabelle "Bestellung". Der Gesamtwert soll berechnet und in das Feld "Gesamtwert" in der Tabelle Bestellung eingetragen werden, wenn ich den Pfeil neben dem Feld "Gesamtwert" klicke.

Ich habe in den Trigger OnLookup des Feldes "Gesamtwert" den folgenden Code hineingeschrieben:

Code:
BEGIN
Orders.INIT;
Orders.Subtotal := Items.Price * Orders.NumbersOfItems; // Hier erfolgt die Berechnung Items steht für Tab. Artikel, Orders für Bestellung
Orders.INSERT;
END;


Leider tut sich nichts, wenn ich auf den Pfeil klicke, obwohl alle anderen benötigten Werte in den anderen Tabellen vorhanden sind. Auch die notwendigen globalen variablen habe ich definiert. Was mache ich falsch?

MFG

Re: Datenbankmodel in Navision abbilden

31. Oktober 2008 15:25

Der OnLookup-Trigger ist der "empfindlichste" Trigger. Ein ; oder Leerzeichen reicht hier schon, dass nichts mehr passiert.

Hier muss entweder irgendwo
Code:
IF FORM.RUNMODAL(0,TabelleXY) = Action::LookupOK THEN
         ...

oder eine Funktion stehen, die diesen Code ausführt. Dadurch wird die Form geöffnet, die als Lookupform für TabelleXY definiert wurde.

Infos dazu findest du u.a. oben beim DEV II im "spanischen" Link. Bitte arbeite alle diese Dokus durch, bevor du irgendetwas in einem NAV-Echtsystem modifizierst. Es ist gefährlicher Leichtsinn, ohne entsprechende Sachkenntnis in einem ERP-System zu programmieren. Lediglich das Lesen und Aufbereiten von Daten ist unkritisch und sollte am Anfang erst mal genügen.

Re: Datenbankmodel in Navision abbilden

31. Oktober 2008 15:47

Es ist gefährlicher Leichtsinn, ohne entsprechende Sachkenntnis in einem ERP-System zu programmieren.

Aber so ist es viel spannender und man lernt ganz schnell alle Kollegen kennen :wink:

BEGIN
Orders.INIT;
Orders.Subtotal := Items.Price * Orders.NumbersOfItems; // Hier erfolgt die Berechnung Items steht für Tab. Artikel, Orders für Bestellung
Orders.INSERT;
END;


Erst mal ist daran falsch, dass du ein Orders.Init machst (was einen leeren Datensatz erzeugt), und dann Items.Price mit Orders.NumbersOfItems multiplizierst. Da Orders leer ist, kann da nur Null heraus kommen. Die Berechnung von Menge*Preis in einer Zeile sollten im OnValidate der Felder Preis und Menge stehen (falls du ein Feld Preis hast; scheint nämlich nicht so zu sein?).

Dazu sieht es so aus, als hättest du eine Datenstruktur, mit der du niemals eine Bestellung vernünftig darstellen kannst, da diese aus einer Kopf- und einer Zeilentabelle besteht (mehr oder weniger bestehen muss). Schau dir am besten in der Cronus-DB an, wie es dort ist.

Re: Datenbankmodel in Navision abbilden

31. Oktober 2008 16:30

Eine Suche bei Amazon ergibt folgende Treffer zu NAV: http://www.amazon.de/s/ref=nb_ss_w?__mk ... namics+NAV

Da ist auch Literatur nicht nur zum "handwerklichen" Codieren, sondern auch für den Datenbank-Entwurf.

Re: Datenbankmodel in Navision abbilden

4. November 2008 22:02

Hallo !

Ich habe nochmal eine Frage zu MS Navision. Ich möchte per Dialog individuelle Eingaben des benutzer einlesen und in einer Tabelle speichern, Wie wir ja bereits erörtert haben, ist das ein ungünstiger Weg, d.h. es gibt bessere methoden. Aufgrund meiner Kenntnisse in Navision und meine Aufgabenzielsetzung ist dieder Weg aber ausreichend.

Ich habe folgenden Code entwickelt:

Code:
window.OPEN('Zipcode: #1################');
window.INPUT(1, tempzipcode);

IF tempzipcode > 5 THEN

    tempzipcode := 01234;

TabelleXY.Zipcode := tempzipcode;


Die variable "tempzipcode" ist vom Typ Text und auf 5 Zeichen beschränkt. Ich möchte mit dem IF Statement sicherstellen, dass wenn der Benutzer mehr als 5 Zeichen eingibt, die Variable standardmäßig den Wert 01234 zugewiesen bekommt.

Ich bekomme nur in dem IF Statement den Hinweise das hier ein Integer und ein Textwert vorliegen und somit ein Fehler. Meine Frage ist nun, wie ich die Bedingung des IF Statement so umbauen kann, dass die Textvariable auf eine Zeichenlänge von mehr als 5 Zeichen geprüft wird.

MFG

Re: Datenbankmodel in Navision abbilden

4. November 2008 23:08

Kossy hat geschrieben:Meine Frage ist nun, wie ich die Bedingung des IF Statement so umbauen kann, dass die Textvariable auf eine Zeichenlänge von mehr als 5 Zeichen geprüft wird.


Code:
window.OPEN('Zipcode: #1################');
window.INPUT(1, tempzipcode);

IF STRLEN(tempzipcode) > 5 THEN
  tempzipcode := '01234';

TabelleXY.Zipcode := tempzipcode;


Strings werden immer in einfachen Anführungsstrichen angegeben.

Re: Datenbankmodel in Navision abbilden

4. November 2008 23:23

Danke Natalie, ich hatte es in der Zwischenzeit schon selbst entdeckt und die IF Anweisung noch wiefolgt ergänzt:

Code:
IF (STRLEN(tempzipcode) > 5) OR (STRLEN(tempzipcode) = 0) THEN

....


Dann passt es auch, falls die Benutzer nur die Entertaste drückt. Aber nochmal was anderes: Wie kann ich eigentlich ein aktuelles Tagesdatum für einen Tabelleneintrag definieren?

Mit dem folgenden Code klappt das nicht:

Code:
TabelleXY.Date := TODAY;


oder

Code:
TabelleXY.Date := WORKDATE;



TabelleXY ist irgendeine beliebige Tabelle und Date ist in dieser Tabelle ein Feld vom Typ Date. Wie kann ich ein aktuelles Datum in dieses Feld eintragen. Benötige ich hierfür unbedingt die Funktion CALCDATE() ?

MFG

Re: Datenbankmodel in Navision abbilden

5. November 2008 17:01

Weiß niemand Rat? Bisher habe ich das Problem noch nicht lösen können...

Re: Datenbankmodel in Navision abbilden

5. November 2008 17:12

Daran ist nix falsch .. gib mal mit Code außenrum und die Felddefinition. Allerdings ist es nicht schön, ein Feld (oder überhaupt irgendein Objekt) wie einen Datentyp zu benennen (funktionieren müsste es aber trotzdem).