[gelöst] Daten manipulieren mit Dataport

25. November 2009 18:53

Hallo liebe Forummitglieder,

nachdem ich schon lange in meinem Kämmerlein vor mir hinprobiere, in den Foreneinträgen gesucht habe und es immer noch nicht funktioniert, hoffe ich dass ihr mir helfen könnt.
Bin noch relativ neu in Programmierung von Navision und am Verzweifeln.

Ich muss aus ner Exportdatei, die als txt vorliegt die Daten in eine Tabelle importieren. Die Daten werden verwendet um Rechnungswerte eines Fremdsystems zu verbuchen.

Folgenden Code habe ich schon geschrieben, der das Feld "Sollkonto" füllen soll. Es existiert eine zweite Tabelle, die abgefragt wird, ob das Konto schon mal importiert wurde. Falls ja, hat der Mitarbeiter das Konto des Fremdsystems einem Konto in Navision zugewiesen und er wird dann beim verbuchen der Rechnung gezogen.

Der folgende Code soll folgendes bewirken:
a) Wenn das Sollkonto 8850 ist, soll ein festes Habenkonto (5501) in die Tabelle eingetragen werden.
b) falls es ein anderes Sollkonto ist, dann wird auf die zweite Tabelle geschaut, ob das schon eingetragen wurde. Wenn nicht, dann erfolgt ein Eintrag.

Code:
IF Sollkonto <> '0' THEN BEGIN
  IF Sollkonto = '8850' THEN BEGIN
    IF NOT HSGhotlineZuordnungen.GET(HSGhotlineZuordnungen.Art::Konto, HSGhotlineZuordnungen.Code) THEN BEGIN
    SETRANGE("HSG hotline Posten".Sollkonto, HSGhotlineZuordnungen.Code);
    Sollkonto := HSGhotlineZuordnungen."Code NAV";
    Habenkonto := '5501';
    INSERT;
  END
  ELSE
    IF NOT HSGhotlineZuordnungen.GET(HSGhotlineZuordnungen.Art::Konto,Sollkonto) THEN BEGIN
      HSGhotlineZuordnungen.Art := HSGhotlineZuordnungen.Art::Konto;
      HSGhotlineZuordnungen.Code := Sollkonto;
      HSGhotlineZuordnungen.INSERT;
      NeuesSachKonto := TRUE;
    END;
  END;
END;


Wenn ich nun den Dataport ausführe, erhalte ich die Fehlermeldung "Posten lfd. Nr. 2 existiert bereits". :-(
Meine Tabelle, wo reingeschrieben werden soll, ist aber leer, auch in den anderen Mandanten ist kein Datensatz. Ohne den oberen Teil des Codes kann ich aber die Daten einlesen...

Wäre toll wenn einer einen Tip hat, langsam wird es unlustig


Gruß
whymen
Zuletzt geändert von whymen am 1. Dezember 2009 11:47, insgesamt 1-mal geändert.

Re: Daten manipulieren mit Dataport

25. November 2009 19:54

Hallo whymen,

zunächst mal willkommen im Forum.

Nun zu deiner Frage: Leider fehlen in deinem Code ein paar Informationen, aus welcher Tabelle die Felder und INSERTs ohne Tabellennamen kommen. Und an welcher Stelle der Fehler auftritt (Debugger) Ich Vermute aber mal, dass entweder dein Dataport die Positionsnr. zwei mal einliest oder du versuchst den Datensatz zwei mal einzufügen mit dem INSERT?.

Gruß, Fiddi

Re: Daten manipulieren mit Dataport

26. November 2009 09:34

Der obere Teil des zweiten IF..THEN´s erscheint mir nicht logisch.

Wenn Sollkonto = 8850, dann
wenn kein GET(HSGhotlineZuordnungen.Art::Konto, HSGhotlineZuordnungen.Code)
Das SETRANGE macht für mich keinen Sinn!
Sollkonto := HSGhotlineZuordnungen."Code NAV";


BTW: Da das SETRANGE auf die Tabelle "HSG hotline Posten" ist, liegt mir die Vermutung nahe, das du in die Postentabelle etwas schreibst ohne Zeilennummer / Lfd.Nr. Wäre das möglich?
Hast du du den Prim.Key berücksichtigt (evtl. mehrere Felder)?

Re: Daten manipulieren mit Dataport

26. November 2009 11:43

Danke schön für die prompten Antworten.

@fiddi: Die Tabellen sind selbst angelegte, um die eingelesenen Daten zu speichern.
Habe das INSERT mal rausgenommen und mit MODIFY ersetzt. jetzt läuft der Dataport zwar, aber ich habe wie Mikka schon richtig vermutete einen Datensatz nur mit laufender Nummer und sonst nichts. Woran liegt das denn?

Das SETRANGE habe ich rausgenommen und der Dataport läuft, super schon mal ein Teilerfolg :)

Re: Daten manipulieren mit Dataport

26. November 2009 12:06

Leider ist es für mich fast nicht möglich zu folgen (mangels Daten / Informationen).
Wie sind den die Primärschlüssel aufgebaut, in den Tabellen wo einegfügt werden soll?

Machst du irgendwo ein INIT oder CLEAR, bevor das INSERT ausgeführt wird?

Re: Daten manipulieren mit Dataport

26. November 2009 13:07

Keys:
HSGhotlinezuordnungen: Art, Code
HSGhotlinePosten:
1. Lfd. Nr.
2. Belegnummer,Brutto
3. Belegnummer,Type
4. Type,Lfd. Nr.

Ein INIT wird im OnBeforeImportRecord gesetzt.


Mein andereres Problem ist vielmehr, dass wenn ein bestimmtes Kennzeichen erfüllt ist, der Wert der eigentlich im Feld "Brutto" steht ins Feld "MwSt. Betrag" geschrieben werden soll und aus dem Feld "Brutto" gelöscht wird.
Dazu habe ich mir Code geschrieben:

Code:
IF Type = 1 THEN BEGIN
  IF NOT HSGhotlineZuordnungen.GET(HSGhotlineZuordnungen.Art::Mwst,"HSG hotline Posten"."MwSt.-Code") THEN BEGIN
    HSGhotlineZuordnungen.Art := HSGhotlineZuordnungen.Art::Mwst;
    HSGhotlineZuordnungen.Code := "HSG hotline Posten"."MwSt.-Code";
    HSGhotlineZuordnungen.INSERT;
    NeuerMwStCode := TRUE;
    "HSG hotline Posten".Brutto := HSGHotlinePosten."MwSt.-Betrag";     // #03
    HSGHotlinePosten.INSERT;                                            // #02
  END;
END;


Type ist ein Wert, anhand dem ich entscheiden kann, ob es ein Rechnungs- oder MwSt.-Betrag ist. Hier wird auch in die Zuordnungstabelle der MwSt.-Code des Gastsystems geschrieben, wo die Mitarbeiter dann das entsprechende Konto in Navision auswählen können.

Hoffe das das jetzt nicht zu chaotisch wird.

Gruß
whymen