Probleme mit Konfigurationspaketen

3. Mai 2017 09:56

Hallo,

ich importiere eigentlich oft und viel Artikeldaten über die Konfigurationspakte. Nun möchte ich aber eine sehr große Liste an Referenzartikelnummern importieren und habe ein sehr frustrierendes Problem damit.

1. Wird nur ein Bruchteil der Daten importiert. Ein Fehler wird nicht geworfen. (Am Servicetier habe ich die Uploaddatenmenge schon auf 100 MB erhöht. Die Exceldatei ist ca. 10 MB)
2. Wenn ich mir dann denke: "Guuuut... mache ich es Stückchenweise und lösche einfach immer wieder den schon importierten Bruchteil aus der Excelliste und importiere so lange erneut, bis ich durch bin", dann WIRD GAR NICHTS IMPORTIERT!

Ich muss also, um überhaupt voranzukommen: Den Bruchteil importieren, dann eine neue Tabellendefinition exportieren. Dann den nächsten Schub in diese Datei kopieren. Das ist wirkliche extrem frustrierend! Was kann das denn für Ursachen habe? Ich bin schon mal kurz mit dem Debugger durch. Scheinbar ist für den Import die Tabelle leer. (Getestet bei Schritt 2, wo ich nur die obersten Excelzeilen entfernt habe, welche beim Schritt 1 schon importiert wurden.)

Re: Probleme mit Konfigurationspaketen

3. Mai 2017 10:02

Jetzt geht gar nichts mehr zu importieren. :-|

Re: Probleme mit Konfigurationspaketen

3. Mai 2017 10:33

Hallo,

meine persönliche Meinung: Rapidstart ist nichts für Massenimporte, schon gar nicht für Artikeldaten.

Aber zu deinem Problem: Du solltest das ganze mit einer CSV- Datei und einem Report machen.

So einen Report strikt man sich einmal, der am Anfang mit der CU 419 eine Datei auswählt und in eine Temporäre Serverdatei auf den Server lädt und in etwa mit folgendem Pseudo-Code verarbeitet.
Code:
OnPreReport
TempServerdatei := Filemgt.UploadFile(...);
File.open(TempServerdatei);
File.createInstream(instr);

while not instr.eos do begin
   instr.readtext(TextLine);
  if  Split(TextLine, FieldArr,Splitchar) <> 0 then begin

    rec.FieldA := fieldarr[1];
    rec.FieldB := fieldarr[2];
    // oder was auch immer du mit den Feldern machen möchtest;
  end;
end;

Split(var pTextLine:Text;var pFieldArr[100] Text;pSplittchar Text[1]) NoOfFields :integer
var
   i:integer;
begin
  clear(pFieldArr);
  for i:= 1 to strlen(pTextLine) do
    if pTextLine[i] = pSplittchr[1] then
      NoOfFields+=1
    else
       pFieldArr[NoOfields+1] += copystr(pTextLine,i,1);
   if NoOfFields <>0 then
     NoOfFields +1;
end;


So ein Report legt man in seine Toolsammlung, und ein wenig aufgehübscht hat man wieder den guten alten Dataport, der nach außen auch wieder genauso funktioniert, wie man es vom CC gewöhnt war (Dateiname auf der Requestpage auswählen).
Das mach u.U. weniger Arbeit als ein Rapid richtig zusammenzustellen, und man hat Einfluss auf das was man da einließt, und wie es verarbeitet wird.

Gruß Fiddi

Re: Probleme mit Konfigurationspaketen

3. Mai 2017 11:48

Danke für dein Beispiel.

Da es jetzt schnell gehen muss, habe ich meine Datei in 50000 Häppchen aufgeteilt. Es scheint so zu funktionieren. Zufrieden bin ich natürlich nicht über die Tatsache, dass ich mir einen Import bauen muss, obwohl es schon einen gibt. Andererseits habe ich mir schon selbst mal überlegt einen eigenen Import zu bauen, der ohne Definitionen auskommt. Ich hatte da die Idee, einfach eine Exceldatei zu laden und dann in einer Page zu bestimmen, in welche Tabelle die Daten sollen und welche Spalte zu welchem Feld gehört. + Fehlerprüfung nach der Zuordnung. Also erst Daten importieren und dann konfigurieren, statt anders herum. Dafür über die Excelbuffer. Na mal schauen.

Re: Probleme mit Konfigurationspaketen

9. August 2017 13:33

Ich habe jetzt ein eigenes Importtool für Katalogartikeldaten gebaut. Danke @fiddi für die Anregung.

Mir ist noch aufgefallen, dass der Import schneller ist, wenn man den FileStream über .Net Variablen macht.
Beispiel:

ImportFromCSV(VAR RecRef : RecordRef;ServerFileName : Text)
RecRef = recordref von Zieltabelle.

Variablen:
Name DataType Subtype
StreamReader DotNet System.IO.StreamReader.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Encoding DotNet System.Text.Encoding.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
FileStream DotNet System.IO.FileStream.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
FileMode DotNet System.IO.FileMode.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
ColumnCaptionString Text
ColumnCount Integer
FieldNoString Text


Code:
Code:
GetFileEncoding(ServerFileName,Encoding); //Funktion von Vjeko. Encoding wird »by reference« durchgeschliffen. http://vjeko.com/detect-file-encoding-in-cal-using-net-interop/
FileStream := FileStream.FileStream(ServerFileName,FileMode.Open);
StreamReader := StreamReader.StreamReader(FileStream,Encoding,TRUE);

//Lese Spaltenköpfe (1. Zeile) und ermittle Anzahl Spalten und Feldnummern
IF StreamReader.EndOfStream THEN
  ERROR('Datei enthält keine relevanten Daten!');
ColumnCaptionString := StreamReader.ReadLine;
ColumnCaptionString := CONVERTSTR(ColumnCaptionString,';',',');
ColumnCount := STRLEN(DELCHR(ColumnCaptionString, '=', DELCHR(ColumnCaptionString , '=', ','))) +1;  //Anz. Spalten
FieldNoString := GetFldNoString(RecRef,ColumnCaptionString); //Collect FieldNos from ColumnCaptionString

//Lese weitere Zeilen
WHILE NOT StreamReader.EndOfStream DO BEGIN
  ProcessCSVLine(RecRef,FieldNoString,ColumnCount,StreamReader.ReadLine);
  //...
END;

StreamReader.Close;
FileStream.Close;
RecRef.CLOSE;

Re: Probleme mit Konfigurationspaketen

9. August 2017 14:20

Hallo,

ich hatte meinen Report mal hier angehängt.

Übrigens gibt es schon in NAV2015 den CSV-Buffer (Tabelle 1234 :mrgreen: ) der Funktionen zum einlesen der Daten bereitstellt, und nach dem Einlesen auch die Daten bereitstellt.

Gruß Fiddi