Seite 2 von 3

Verfasst: 8. März 2006 14:11
von Timo Lässer
Michael Schumacher hat geschrieben:wegen der Umlaute musst du die Exceltabelle als Text(MSDOS) abspeichern, [...]

Alternativ befindet sich im Download Center eine Codeunit, welche ASCII nach ANSI und umgekehrt konvertieren kann.

[url=http://mbs-support.info/dload.php?action=file&file_id=48]TextManagement
Diese Codeunit (ID: 99996) enthält verschiedene Text-Konvertierungs-Funktionen[/url]

In Navision 4.0 ist zwar eine einfache ASCII<->ANSI-Konvertierung vorhanden, jedoch umfasst diese nicht alle gemeinsamen Zeichen der Zeichentabellen und braucht (aus eigenen Erfahrungen) 8-mal so lange.
(Mein erster Entwurf verwendete die gleiche Technik, bis ich meine Codeunit ein wenig "getunt" habe.)

Verfasst: 8. März 2006 14:21
von Michael Schumacher
Es geht einfacher und schneller, gleich in Excel so zu speichern, als zig mal die Codeunit für die Wandlung aufzurufen.
Das Tool ist aber trotzdem unverzichtbar, denn nicht jedes Programm kann so komfortabel wie excel speichern ;-)

Verfasst: 8. März 2006 14:50
von mgerhartz
Ich werde noch wahnsinnig :shock:

Habe die Exceltabelle wie beschrieben als DOS TXT gespeichert. Im Editor geöffnet sieht das ganze dann so aus:

1010000 50,00 50,00
1010100 0,00 150,00 150,00
1010101 25,00 25,00
1010102 25,00 25,00

Im Dataport habe ich als Seperator <TAB> eingestellt. Die Felder in der zu befüllenden Tabelle lauten 1. Gliederungsnummer (Code, Länge 20) und 2. Betrag (Decimal). Als DataportFlields habe ich diese ausgewählt und die Felder Startpos und Width leer gelassen. Ich bekomme immer noch die Fehlermeldung

"Typenkonvertierung des Ausdrucks Boolean in einen Code Wert ist nicht möglich"

Ich raff das nicht. WIe der Inhalt der Textdatei aussieht steht ja oben. Ich habe doch überhaupt kein Booleanfeld :cry:

Verfasst: 8. März 2006 14:52
von Michael Schumacher
schalte doch mal den debugger ein, ob der anzeigt, wo der Fehler auftritt.

Verfasst: 8. März 2006 14:56
von Marc Teuber
mgerhartz hat geschrieben:1010000 50,00 50,00
1010100 0,00 150,00 150,00
1010101 25,00 25,00
1010102 25,00 25,00

Im Dataport habe ich als Seperator <TAB> eingestellt. Die Felder in der zu befüllenden Tabelle lauten 1. Gliederungsnummer (Code, Länge 20) und 2. Betrag (Decimal).


Also ich seh da mehr als zwei Spalten. Mindestens drei, bei der zweiten Zeile sogar vier Spalten.

Gruß, Marc

Verfasst: 8. März 2006 15:02
von Michael Schumacher
das macht nichts, überflüssige Spalten werden ignoriert

Verfasst: 8. März 2006 15:03
von Marc Teuber
Michael Schumacher hat geschrieben:das macht nichts, überflüssige Spalten werden ignoriert

Stimmt ja, da hast du recht!

Verfasst: 8. März 2006 15:11
von mgerhartz
Könnte es sein, dass sich Navision an den Kommas in den Beträgen stört?

Verfasst: 8. März 2006 15:14
von JanV
Könnte es sein, dass du deinen alten Dataport irgendwie neu abgespeichert hast und nun noch in irgendeinem Trigger eine Anweisung hast dass ein Feld auf TRUE gesetzt werden soll?

Verfasst: 8. März 2006 15:22
von mgerhartz
Ich OBERHIRNI hatte tatsächlich noch einen dummen Code im Trigger stehen. Manchmal .....und so weiter. Hoffe ich habe eure Nerven nicht allzu sehr strapaziert.

Nochmals 1000 Dank für Eure Unterstützung :wink:

Verfasst: 13. März 2006 16:31
von mgerhartz
Hallo Leute, ich muss mich leider doch noch mal zu dem Thema bei euch melden. Ich habe jetzt mit dem Dataport die Daten der Excel Tabelle in eine neu angelegt Navision Tabelle importiert. Ich habe mir schon einiges angesehen, verstehe aber immer noch nicht, wie ich die Daten jetzt in die Tabelle Sales Line bzw. Sales Header bekomme.

Der Sales Header erzeugt doch für jede neue Rechnung eine laufende Nummer. Muss ich jetzt nur noch die Daten der neue Navision Tabelle in die Tabelle Sales Line schreiben? Wie funktioniert denn die erstellung einer neuen lfd. Nr. im Sales Header? Fragen über Fragen :?:

Verfasst: 13. März 2006 16:43
von Marc Teuber
Hi Markus,

du erzeugst den Verkaufskopf und anschließend die Verkaufszeile wie folgt:

Code:
SalesHeader.INIT;
SalesHeader."Document Type" := SalesHeader."Document Type"::Order;
SalesHeader.VALIDATE("No.", '');
SalesHeader.VALIDATE("Posting Date", WORKDATE);
SalesHeader.VALIDATE("Sell-to Customer No.", "xxx");
SalesHeader.INSERT(TRUE);

SalesLine.INIT;
SalesLine."Document Type" := SalesLine."Document Type"::Order;
SalesLine."Document No." := SalesHeader"No.";
SalesLine."Line No." := 10000;
SalesLine.Type := SalesLine.Type::Item;
SalesLine.VALIDATE("No.", "xxx");
SalesLine.VALIDATE(Quantity, 1);
SalesLine.VALIDATE("Unit Price", "xxx");
SalesLine.INSERT;


Wenn du einen Report benutzt, der über deine neue Tabelle geht und die Aufträge erzeugen soll, musst du den o. g. Code in den Trigger "OnAfterGetRecord" stellen.

Die "xxx" sind durch deine Angaben/Variablen zuersetzen.

Gruß, Marc

Verfasst: 13. März 2006 17:01
von mgerhartz
Wow, das ging aber wieder schnell. Danke! Nun noch eine Frage. Meine Gliederungsnummer ist eigentlich 8stellig. Die Zahlen aus der Excelliste haben aber leider die 1.Stelle gekillt. Bsp. (Die Gliederungsnummer sollte lauten 01234567 und Excel hat daraus 1234567 gemacht) Die Gliederungsnummer ist ein Codefeld.

Also
BuHaPauschale2003.Gliederungsnummer := 1 + BuHaPauschale2003.Gliederungsnummer;

funktioniert leider nicht.

Verfasst: 13. März 2006 17:04
von Marc Teuber
Da es sich um ein Code-Feld handelt und somit alphanumerische Zeichen enthalten kann, müssen die Zeichen mit dem Hochkomma eingeschlossen werden.

BuHaPauschale2003.Gliederungsnummer := '1' + BuHaPauschale2003.Gliederungsnummer;

Verfasst: 13. März 2006 17:24
von mgerhartz
Danke! Funktioniert jetzt, aber wenn ich den Report laufen lasse, kommt ein Hinweis, dass die SalesLine bereits existiert und ich eine neue Auftragsnummer vergeben muss
:-(

Verfasst: 13. März 2006 17:35
von JanV
Lagere den Teil der die Verkaufszeilen erstellt in eine Funktion aus. In dieser Funktion deklarierst du die Record Variable Verkaufszeile als lokale Variable, dadurch wird jedesmal eine neue "Instanz" angezogen.

Verfasst: 13. März 2006 17:50
von mgerhartz
Hab ich probiert, funktioniert leider nicht. Die Fehlermeldung verweist auf den Trigger (No. - OnValidate) und dort steht u. a.:

GetSalesHeader;
IF SalesHeader."Document Type" = SalesHeader."Document Type"::Quote THEN BEGIN
IF (SalesHeader."Sell-to Customer No." = '') AND
(SalesHeader."Sell-to Customer Template Code" = '')
THEN
ERROR(Text031, SalesHeader.FIELDCAPTION("Sell-to Customer No."),

Verfasst: 13. März 2006 17:58
von Marc Teuber
Also bei mir funktioniert das. Hier noch mal den original-Code aus Navision (etwas anders als oben):
Code:
SalesHeader.INIT;
SalesHeader."Document Type" := SalesHeader."Document Type"::Order;
SalesHeader.VALIDATE("No.", '');
SalesHeader.VALIDATE("Posting Date", WORKDATE);
SalesHeader.VALIDATE("Sell-to Customer No.", '10021001');
SalesHeader.INSERT(TRUE);

SalesLine.INIT;
SalesLine."Document Type" := SalesLine."Document Type"::Order;
SalesLine."Document No." := SalesHeader."No.";
SalesLine."Line No." := 10000;
SalesLine.Type := SalesLine.Type::Item;
SalesLine.VALIDATE("No.", '20031001');
SalesLine.VALIDATE(Quantity, 1);
//SalesLine.VALIDATE("Unit Price", "xxx");
SalesLine.INSERT;

Verfasst: 13. März 2006 18:04
von mgerhartz
Ich sehe gerade den Unterschied. Da ich eine ganze Reihe von Daten für unterschiedliche Rechnungsempfänger habe, habe ich das Feld "Sell-to Customer No." so befüllt:


SalesHeader.VALIDATE("Sell-to Customer No.", '1' + BuHaPauschale2003.Gliederungsnummer);

Scheint aber nicht zu funktionieren.

Verfasst: 13. März 2006 18:11
von mgerhartz
So, muss mich jetzt auf den Weg zum Zug machen. Schon mal Danke für all eure Hilfe. Setze mich im Zug wieder dran und melde mich dann morgen wieder. So long......

Verfasst: 13. März 2006 18:13
von Marc Teuber
Sicher dass es den Debitor '1'+BuHaPauschale2003.Gliederungsnummer gibt? Trage doch testweise eine Debitornummer direkt rein. Also so:

Code:
SalesHeader.VALIDATE("Sell-to Customer No.", '12345');


Natürlich die 12345 durch eine reale Nummer ersetzen. Wenn der Fehler dann nicht mehr auftritt, weißt du das die Angabe '1'+BuHaPauschale2003.Gliederungsnummer eine Debitor-Nummer zurückgibt, die es nicht gibt.

Verfasst: 13. März 2006 18:16
von JanV
Du könntest die Anweisung mit dem Get auch durch ein IF bla.get abfangen und dann in deiner Tabelle entsprechend markieren wenn keine Entsprechung gefunden wurde.

Verfasst: 13. März 2006 23:19
von Marc Teuber
JanV hat geschrieben:Du könntest die Anweisung mit dem Get auch durch ein IF bla.get abfangen und dann in deiner Tabelle entsprechend markieren wenn keine Entsprechung gefunden wurde.

Das würde ich ehrlich gesagt nicht machen. Der GET-Befehl wird wohl aus gutem Grund dort ohne einem IF-Befehl aufgerufen.
Gruß, Marc

Verfasst: 14. März 2006 10:13
von JanV
Ähem, ok ich habs verrafft, das ist ja eine Funktion im OnValidateTrigger dann würd ich auch die Finger davon lassen :oops:

Verfasst: 14. März 2006 17:38
von mgerhartz
Hallo zusammen, sorry, dass ich mich heute gar nicht gemeldet hatte. Hab heute morgen einen Weisheitszahn gezogen bekommen, AUA! Morgen bin ich wieder frohen Mutes auf der Arbeit und werde mich wieder melden. So long....