[gelöst] SetupNewLine verwenden zum Import in ein Buchblatt

9. August 2010 16:57

Hallo liebe Navisiongemeinde.

Ich brauche wieder einmal euren Rat.

Es geht um folgendes: Ich möchte, bzw soll, eine txt Datei importieren und diese im Buchblatt "Fibu Buch.-Blattzeile" sichtbar machen.
Dies schaffe ich auch. Zumindestens wie ich meine zum größten Teil. Vorerst mache ich dies in 2 Schritten.
1. Via Dataport importiere ich die Daten in eine leere Tabelle.
2. Via Codeunit übertrage ich die benötigten Datensätze in die Tabelle der Fibu Buch.-Blattzeile

Soweit funktioniert auch alles. Alles bis auf die automatisch fortlaufende Belegnummer.

Ich habe versucht mit dem folgenden Code den Code aus der Tabelle des Buchblattes Trigger "SetupNewLine" zu kopieren.
Die führte zu der Fehlermedlung, dass man doch bitte COMMIT verwenden solle.

Code:
GenJnlTemplate.GET(buchblatt."Journal Template Name");
GenJnlBatch.GET(buchblatt."Journal Template Name",buchblatt."Journal Batch Name");
IF GenJnlBatch."No. Series" <> '' THEN BEGIN
CLEAR(NoSeriesMgt);
buchblatt."Document No." := NoSeriesMgt.TryGetNextNo(GenJnlBatch."No. Series",buchblatt."Posting Date");
END;


Darauf hin habe ich hier im Forum geschaut und habe folgendes gefunden.

Ich würde zum Füllen eines Buchblattes versuchen, die Eingabe per Hand im Code zu simulieren. Also die Funktion SetupNewLine aufrufen statt sie teilweise zu kopieren (dafür ist sie da), und dann die nötigen Felder in der Reihenfolge der Eingabe validieren. So hat das auch immer funktioniert.


Doch habe ich keine Ahnung wie ich das machen soll.

Versucht habe ich das mit

Code:
GenJnlLine.SetUpNewLine(GenJnlLine."Document No.");


was jedoch zu der Fehlermeldung "Variabel muss von Tabelle 81 (GenJnlLine) sein und nicht von 0."

Könnte mir jemand einen Tipp geben oder sagen, ich welcher Codeunit man sich solch ein Vorgehen anschauen kann?

Vielen Dank im Vorraus.
Zuletzt geändert von Heiko_D am 10. August 2010 13:28, insgesamt 1-mal geändert.

Re: SetupNewLine verwenden zum Import in ein Buchblatt

9. August 2010 17:53

Das ist ein kleines Problem, passiert ab und zu mal.

Der Aufruf der Funktion lautet ja wie folgt:
Code:
GenJnlLine.SetUpNewLine(LastGenJnlLine,Balance,BottomLine)

und Du übergibst
Code:
GenJnlLine.SetUpNewLine(GenJnlLine."Document No.");

Das heißt Du überginst nur einen Feldwert aus der Tabelle GenJnlLine nämlich die Document No.. Er braucht aber in der ersten Variable den kompletten Datensatz. Damit kann die Funktion nicht umgehen weil sie die Tabelle dahinter nicht erkennt. Denn aus dem ersten Übergabewert holt er sich in der Funktion werte für die weitere Bearbeitung.

Aber jetzt mal was anderes. Was willst Du denn eigentlich genau imortieren? Vielleicht benötigst Du diese Funktion ja garnicht. Vielleicht wäre es sinnvoller den Import doch nach zu programmieren. Denn die Funktion SetupNewLine nimmt von der voran gegangenen Zeile viele Werte um einen neue Zeile zu erstellen. Dies ist sinnvoll, wenn man Rechnungen mit den Rechnungszeilen über ein FiBu Buchblatt buchen will. Wenn es um einzelne von einander unabhängige Positionen geht, dann würde ich diese Funktion nie nutzen.

Der Code den Du jetzt siehst kommt aus einer Importfunktion, mit der ich OP Daten aus anderen Vorsystemen nach NAV hole.
Dies ist ein Report, der aus einer Importtabelle die Daten in die FiBu Buchblätter schreibt. und dann dem Buchhalter die Möglich gibt die Buchblätter nachzu bearbeiten und zu buchen. Der ist sogar WP kompatibel :-)


Code:
Report OnPreDataItem


ZeilenNr:=10000;


CASE ImportType OF
 ImportType::SachSaldo : BEGIN
                         IMPSachSaldo.SETFILTER("Amount Type", '%1',1);
                         TemplateName:='Allgemein';
                         BatchName:='Imp SALDO';
                         END;
 ImportType::Bewegung  : BEGIN
                         IMPSachSaldo.SETFILTER("Amount Type",'>=%1',2);
                         TemplateName:='Allgemein';
                         BatchName:='Imp BEW';
                         IF FilterPostingDate = 0D THEN
                         ERROR(Text0002);
                         SETRANGE("Posting Date",FilterPostingDate);
                         END;
END;

IMPSachkonto.FINDFIRST;
JournalBatch.SETRANGE("Journal Template Name",TemplateName);
JournalBatch.SETRANGE(Name,BatchName);

IF NOT JournalBatch.FINDFIRST THEN
  BEGIN
    JournalBatch."Journal Template Name":=TemplateName;
    JournalBatch.Name:=BatchName;
    JournalBatch."Acc. Rule Dim. Value Code":='HGB';
    JournalBatch.INSERT(TRUE);
  END;

GenJournalLine.SETRANGE("Journal Template Name",TemplateName);
GenJournalLine.SETRANGE("Journal Batch Name",BatchName);
IF GenJournalLine.FINDFIRST THEN
ERROR(Text0001, BatchName);

Report OnAfterGetRecord


CASE "Amount Type" OF
  1 : IF IMPSachSaldo.Amount = 0 THEN CurrReport.SKIP;
  2 : IF IMPSachSaldo."Debit Amount" = 0 THEN CurrReport.SKIP;
  3 : IF IMPSachSaldo."Credit Amount" = 0 THEN CurrReport.SKIP;
END;


GenJournalLine.VALIDATE("Journal Template Name",TemplateName);
GenJournalLine.VALIDATE("Journal Batch Name",BatchName);
GenJournalLine."Line No.":=ZeilenNr;
ZeilenNr+=10000;
GenJournalLine.VALIDATE("Account Type",GenJournalLine."Account Type"::"G/L Account");
IF (IMPSachkonto.GET(IMPSachSaldo.AccountNo)) AND (NoMapping<>0) THEN
  BEGIN
    IMPSachkonto.TESTFIELD(IMPSachkonto.GLAccountNo);
    GLAccount.GET(IMPSachkonto.GLAccountNo);
    IF GLAccount."Direct Posting" = FALSE THEN
    BEGIN
      GLAccount."Direct Posting":=TRUE;
      GLAccount.MODIFY;
    END;
    GenJournalLine.VALIDATE("Account No.",IMPSachkonto.GLAccountNo);
  END ELSE
  BEGIN
    GLAccount.GET(IMPSachSaldo.AccountNo);
    IF GLAccount."Direct Posting" = FALSE THEN
    BEGIN
      GLAccount."Direct Posting":=TRUE;
      GLAccount.MODIFY;
    END;
    GenJournalLine.VALIDATE("Account No.",IMPSachSaldo.AccountNo);
  END;
GenJournalLine.VALIDATE("Posting Date",PostingDate);
GenJournalLine.VALIDATE("Document Date", TODAY);
GenJournalLine.VALIDATE("Document No.",IMPSachSaldo.DocumentNo);
GenJournalLine.Description:=IMPSachSaldo."Posting Description";

GenJournalLine.VALIDATE("Gen. Posting Type",GenJournalLine."Gen. Posting Type"::" ");
GenJournalLine.VALIDATE("Gen. Bus. Posting Group",'');
GenJournalLine.VALIDATE("Gen. Prod. Posting Group",'');
GenJournalLine.VALIDATE("VAT Bus. Posting Group",'');
GenJournalLine.VALIDATE("VAT Prod. Posting Group",'');

CASE "Amount Type" OF
  1 : BEGIN
        GenJournalLine.VALIDATE(Amount,IMPSachSaldo.Amount);
      END;
  2 : BEGIN
        GenJournalLine.VALIDATE("Debit Amount",IMPSachSaldo."Debit Amount");
        GenJournalLine.VALIDATE("Bal. Account Type",GenJournalLine."Bal. Account Type"::"G/L Account");
        GenJournalLine.VALIDATE("Bal. Account No.",BalAccountNo);
      END;
  3 : BEGIN
        GenJournalLine.VALIDATE("Credit Amount", IMPSachSaldo."Credit Amount");
        GenJournalLine.VALIDATE("Bal. Account Type",GenJournalLine."Bal. Account Type"::"G/L Account");
        GenJournalLine.VALIDATE("Bal. Account No.",BalAccountNo);
      END;
END;

GenJournalLine.INSERT(TRUE);

Re: SetupNewLine verwenden zum Import in ein Buchblatt

10. August 2010 09:35

Ersteinmal vielen Dank für deine Antwort. Werde sie solgleich versuchen umzusetzen.

Meine Aufgabe ist es, ausgeglichene Posten aus Simba nach Navision zu holen.
Dies versuche ich in 3 Schritten zu lösen. (sicher geht das auch mit einem einzigen Dataport, ich versuche es erst einmal so hinzubekommen und dann wenn alles geht, versuche ich aus 3 Schritten 2 oder gar einen zu machen.)

Schritt 1. Excel Makro zum Umformen des Simba exportes im txt Format.
- Hinzufügen der Line No.
- Umformen des Datums, damit es von Navision gelesen werden kann. (z.b. 291108 wird zu 29.11.08)
- Speichern im CSV Format

Schritt 2. Via Dataport werden alle dies Datensätze in eine neu angelegte Tabelle importiert.

Schritt 3. Via Codeunit sollen die benötigten Felder in das Buchblatt übertragen werden.
Dies funktioniert bisweilen ganz gut, bis halt auf die Belegnummer...

Code:
IF import.FIND('-') THEN BEGIN
REPEAT
GenJnlLine.INIT;
GenJnlLine."Journal Template Name":='ALLGEMEIN';
GenJnlLine."Journal Batch Name":='STANDARD';

GenJnlLine."Line No.":=import.Kesy;
GenJnlLine.Amount:=import.Betrag;
GenJnlLine."Bal. Account No.":=import.Gegenkonto;
GenJnlLine."External Document No.":=import."Beleg-Nr";
GenJnlLine."Posting Date":= import.Buchungsdatum;
GenJnlLine."Due Date":=import.Fälligkeitsdatum;
GenJnlLine."Document Date":=import.Buchungsdatum;
GenJnlLine."Account Type":=GenJnlLine."Account Type"::Customer;
GenJnlLine."Account No.":=import."Konto-Nr";

IF customer.GET(GenJnlLine."Account No.") THEN
GenJnlLine.Description:= customer.Name
ELSE GenJnlLine.Description:='Kontonummer nicht vorhanden';

GenJnlLine."Shortcut Dimension 1 Code":=import."Kostenstellen-Nr";
GenJnlLine."Shortcut Dimension 2 Code":=import."Kostenträger-Nr";
GenJnlLine."VAT Registration No.":=import."USt-IDNr";

//GenJnlLine.SetUpNewLine(GenJnlLine."Document No.");

GenJnlLine.INSERT;
UNTIL import.NEXT=0;
END;

Re: SetupNewLine verwenden zum Import in ein Buchblatt

10. August 2010 10:35

Das Problem mit der Document Number kannst Du relativ schnell abändern.

Ich würde einen FiBu Buchblatt Vorlage anlegen und dort eine Nummernserie definieren. Diese Buchblattvorlage rufst Du dann ab und lässt dir auf eine Hilfvariable eine neue Nummer aus der Nummernserie zuteilen. Diese Nummer schreibst Du dann ganz hart in das Feld Document No.. Damit hast Du das Problem erledigt.

Die Anforderung, die Du erfüllen sollst ist für mich auch nichts unbekanntes. Wir haben hier auch einen Import von Rechnungsdaten, die eingelesen werden müssen und dann in NAV verbucht und gedruckt werden. Dazu bin ich allerdings einen anderen Weg gegangen. Ich bin davon ausgegangen, dass Excel immer ein unsicheres Medium ist und die Daten nicht wirklich sicher archiviert werden können außer durch hast ein Archivierungssystem. Darum haben ich eine Funktion entwicklet, die diese Missstände beseitigt.

Ich habe eine Importfunktion, die mir die zu importierende Datei in Navision in eine Protokollkopftabelle schreibt. In dieser Tabelle wird die lfd Importnummer, Datum des Importes, Dateiname, wer importiert hat und die Datei reingeschrieben. Dazu gibt es dann noch die Protokollfelder FiBu Buchblatt erstellt am, erstellt durch, Buchblattname und Document No.. Die Documet No. ist einen laufende Nummer aus einer Nummernserie, die aus einer Einrichtung kommt genau wie die lfd Importnummer.

Die einzelnen Zeilen der Importtabelle werden in die ImportLinetabelle geschrieben. Der Erstellungsreport geht dann auf die Kopftabelle, schaut welcher Import noch nicht als Buchblatt erstellt worden ist. Legt dann als erstes die neue Document No. Fest und geht dann auf die ImportLine Tabelle und holst sich dort alle zeilen und erstellt das Buchblatt. Danach prüft der Report Saldo des Buchblattes mit dem Saldo der Importdatei ab und kennzeichnet jede importierte Buchblattzeile als Importzeile. Im Buchblatt ist eine Lösch- und Änderungssperre für diese Art der Buchblattzeilen. Somit kann der Buchhalter nur das buchen, was in der Importtabelle steht. Somit stellst Du sicher, dass die daten vom Import bis zur Buchung nicht geändert werden können und Du hast jederzeit die Möglichkeit die gebuchten Informationen mit der Importierten Datei abzugleichen.

Klingt aufwendig ist aber nach GoB korrekt und wird bei einer Prüfung durch einen WP immer positiv bewertet. Du hast dann alles getan um die Nachvollziehbarkeit vom Ursprung bis zur Buchung durchzuführen.

Re: SetupNewLine verwenden zum Import in ein Buchblatt

10. August 2010 12:13

Ich würde einen FiBu Buchblatt Vorlage anlegen und dort eine Nummernserie definieren.

- OK

Diese Buchblattvorlage rufst Du dann ab und lässt dir auf eine Hilfvariable eine neue Nummer aus der Nummernserie zuteilen.

- Dies verstehe ich nicht.
Meinst du damit, ich soll einer Variabel das Feld der "Last No. Used" aus der Tabelle "No. Series Line" zuordnen und dieses dann mit + 1 hochzählen lassen? Wenn ja, wie kann ich der Variabel sagen welche Nummernserie ich meine? Ich habe die neu angelegt Serie "test" genannt.

Code:
NoSeriesLine.SETFILTER("Series Code",'Test');
variabel:=NoSeriesLine."Last No. Used";
GenJnlLine."Document No.:= variabel + 1;


Ist der Ansatz richtig?

Re: SetupNewLine verwenden zum Import in ein Buchblatt

10. August 2010 13:10

Also dann wollen wir mal kurz.

Anlegen einer Buchblattes dürfte ja nicht das Problem sein. Ich definiere mal kurz ein für dieses Beispiel.
Das Buchblatt heißt "IMPORT" Dort ist Buchungsnummern Serie "IMPORTNO" definiert.

Code:
"Gen. Journal Batch".setrange("Journal Template Name",'ALLGEMEIN');
"Gen. Journal Batch".setrange(Name,'IMPORT');
If "Gen. Journal Batch".FINDFIRST then
begin
  TmpDocNo:= NoSeriesMgmt.GetNextNo("Gen. Journal Batch"."No. Series",TODAY,TRUE);
end;


Damit holst Du im OnPreDataItem des Reports dir die Nummern, die Du dann für den ganzen Report benutzt.
Willst Du pro Zeile einen neue Nummern habe dann sieht dies so aus:

Code:
Report - OnPreDataItem

"Gen. Journal Batch".setrange("Journal Template Name",'ALLGEMEIN');
"Gen. Journal Batch".setrange(Name,'IMPORT');
If not "Gen. Journal Batch".FINDFIRST then
error('Keinen FiBu Buchblatt definiert');

Report - OnAfterGetRecord

GenJnlLine."Document No.":= NoSeriesMgmt.GetNextNo("Gen. Journal Batch"."No. Series",TODAY,TRUE);



Das sollte funktionieren. Wer sich aber daran macht in FiBu Buchblätter Daten zu schreiben, sollte ganz genau wissen aus welcher Tabelle holt man welche Daten. Dies ist nicht so einfach. Einige Felder sollten validiert werden wie zum Beispiel die Dimensionen, Kontonummer usw. Mann sollte sich in der FiBu schon ein wenig zu Hause fühlen. Dies ist nur mal als genereller Hinweis zu verstehen.

Re: SetupNewLine verwenden zum Import in ein Buchblatt

10. August 2010 13:27

Vielen Dank nochmals für deine Hilfe. :-D