Seite 2 von 2

Re: Aus Excel importieren (DEV)

Verfasst: 27. Februar 2018 18:07
von fiddi
Hallo,

HINWEIS: Bitte möglichst Vollzitate vermeiden

Hast du es schon mal versucht den Text einer Date oder Datetime- Variable mit EVALUATE zuzuweisen?

Gruß Fiddi

Re: Aus Excel importieren (DEV)

Verfasst: 27. Februar 2018 18:08
von navCH
Habe gerade versucht das erste Record zu inserten und bekam folgende Meldung:

Fehler.PNG


Debugger bleibt vor Sheet:=Book.Worksheets.Item('ROM Artikel Import Vorlage V1');
stehen

Was mache ich falsch?

Mfg

Re: Aus Excel importieren (DEV)

Verfasst: 27. Februar 2018 18:59
von navCH
navCH hat geschrieben:Habe gerade versucht das erste Record zu inserten und bekam folgende Meldung:

Fehler.PNG


Debugger bleibt vor Sheet:=Book.Worksheets.Item('ROM Artikel Import Vorlage V1');
stehen

Was mache ich falsch?

Mfg



hat sich erledigt, hatte eine falsche Zuweisung.
Aber er insertet nicht in die Tabelle :cry:

Re: Aus Excel importieren (DEV)

Verfasst: 27. Februar 2018 19:27
von navCH
Code:
KatalogArtikelROM.CHANGECOMPANY('Mandant1');
h:='2';
CREATE(App,FALSE, TRUE);
App.Visible(TRUE);
Book:=App.Workbooks.Open('C:\Users\adm\Desktop\ROM\ROMArtikelImportVorlageV2.xlsx');

Sheet:=Book.Worksheets.Item('Artikel Import Vorlage V1');

KatalogArtikelROM.SETCURRENTKEY(Hersteller,HerstellerArtikel,EinkaufPreiseinheit,EinkaufMengeneinheit,GueltigAbDatum);
IF KatalogArtikelROM.FINDLAST THEN BEGIN
KatalogArtikelROM.Hersteller:=Sheet.Range('A'+h).Value;
KatalogArtikelROM.HerstellerArtikel:=Sheet.Range('B'+h).Value;

EVALUATE(listenpreis,Sheet.Range('C'+h).Value);
KatalogArtikelROM.Listenpreis:=listenpreis;

//leere Felder noch auf 0 setzen
KatalogArtikelROM.Rabattgruppe:=Sheet.Range('D'+h).Value;

KatalogArtikelROM.Warengruppe:=Sheet.Range('E'+h).Value;
KatalogArtikelROM.Sachkonto:=Sheet.Range('F'+h).Value;
KatalogArtikelROM.ALieferant:=Sheet.Range('G'+h).Value;

//leere Felder noch auf 0 setzen
KatalogArtikelROM.ALieferantKurzbezeichnung:=Sheet.Range('H'+h).Value;
KatalogArtikelROM.ARabattArt1:=Sheet.Range('I'+h).Value;
//leere Felder noch auf 0 setzen
EVALUATE(arabattWert1,Sheet.Range('J'+h).Value);
KatalogArtikelROM.ARabattWert1:=arabattWert1;
//leere Felder noch auf 0 setzen
KatalogArtikelROM.ARabattArt2:=Sheet.Range('K'+h).Value;

EVALUATE(arabattWert2,Sheet.Range('L'+h).Value);
KatalogArtikelROM.ARabattWert2:=arabattWert2;

KatalogArtikelROM.ARabattArt3:=Sheet.Range('M'+h).Value;

EVALUATE(arabattWert3,Sheet.Range('N'+h).Value);
KatalogArtikelROM.ARabattWert3:=arabattWert3;

KatalogArtikelROM.ARabattArt4:=Sheet.Range('O'+h).Value;

EVALUATE(arabattWert4,Sheet.Range('P'+h).Value);
KatalogArtikelROM.ARabattWert4:=arabattWert4;

EVALUATE(aendPreis,Sheet.Range('Q'+h).Value);
KatalogArtikelROM.AEndPreis:=aendPreis;

KatalogArtikelROM.BLieferant:=Sheet.Range('R'+h).Value;

KatalogArtikelROM.BLieferantKurzbezeichnung:=Sheet.Range('S'+h).Value;

KatalogArtikelROM.BRabattArt1:=Sheet.Range('T'+h).Value;

EVALUATE(bRabattWert1, Sheet.Range('U'+h).Value);
KatalogArtikelROM.BRabattWert1:=bRabattWert1;

KatalogArtikelROM.BRabattArt2:=Sheet.Range('V'+h).Value;

EVALUATE(bRabattWert2,Sheet.Range('W'+h).Value);
KatalogArtikelROM.BRabattWert2:=bRabattWert2;

KatalogArtikelROM.BRabattArt3:=Sheet.Range('X'+h).Value;

EVALUATE(bRabattWert3,Sheet.Range('Y'+h).Value);
KatalogArtikelROM.BRabattWert3:=bRabattWert3;

KatalogArtikelROM.BRabattArt4:=Sheet.Range('Z'+h).Value;

EVALUATE(bRabattWert4, Sheet.Range('AA'+h).Value);
KatalogArtikelROM.BRabattWert4:=bRabattWert4;

EVALUATE(bEndPreis,Sheet.Range('AB'+h).Value );
KatalogArtikelROM.BEndPreis:=bEndPreis;

KatalogArtikelROM.CLieferant:=Sheet.Range('AC'+h).Value;

KatalogArtikelROM.CLieferantKurzbezeichnung:=Sheet.Range('AD'+h).Value;

KatalogArtikelROM.CRabattArt1:=Sheet.Range('AE'+h).Value;

EVALUATE(cRabbatWert1, Sheet.Range('AF'+h).Value);
KatalogArtikelROM.CRabattWert1:=cRabbatWert1;

KatalogArtikelROM.CRabattArt2:=Sheet.Range('AG'+h).Value;

EVALUATE(cRabbatWert2,Sheet.Range('AH'+h).Value);
KatalogArtikelROM.CRabattWert2:=cRabbatWert2;

KatalogArtikelROM.CRabattArt3:=Sheet.Range('AI'+h).Value;

EVALUATE(cRabbatWert3,Sheet.Range('AJ'+h).Value);
KatalogArtikelROM.CRabattWert3:=cRabbatWert3;

KatalogArtikelROM.CRabattArt4:=Sheet.Range('AK'+h).Value;

EVALUATE(cRabbatWert4, Sheet.Range('AL'+h).Value);
KatalogArtikelROM.CRabattWert4:=cRabbatWert4;

EVALUATE(cEndPreis,Sheet.Range('AM'+h).Value);
KatalogArtikelROM.CEndPreis:=cEndPreis;

EVALUATE(lagerPreisEinheit,Sheet.Range('AN'+h).Value);
KatalogArtikelROM.LagerPreiseinheit:=lagerPreisEinheit;

KatalogArtikelROM.LagerMengeneinheit:=Sheet.Range('AO'+h).Value;

EVALUATE(einkaufsPreiseinheit, Sheet.Range('AP'+h).Value);
KatalogArtikelROM.EinkaufPreiseinheit:=einkaufsPreiseinheit;

KatalogArtikelROM.EinkaufMengeneinheit:=Sheet.Range('AQ'+h).Value;

EVALUATE(faktor,Sheet.Range('AR'+h).Value);
KatalogArtikelROM.Faktor:=faktor;

KatalogArtikelROM.Bezeichnung:=Sheet.Range('AS'+h).Value;

KatalogArtikelROM.NetLink:=Sheet.Range('AT'+h).Value;

KatalogArtikelROM.Artikelgruppe:=Sheet.Range('AU'+h).Value;

KatalogArtikelROM.TeileKlasse:=Sheet.Range('AV'+h).Value;

KatalogArtikelROM.TeileArt:=Sheet.Range('AW'+h).Value;

KatalogArtikelROM.TeileGruppe:=Sheet.Range('AX'+h).Value;

EVALUATE(mindestMenge,Sheet.Range('AY'+h).Value);
KatalogArtikelROM.Mindestmenge:=mindestMenge;

KatalogArtikelROM.EAN:=Sheet.Range('AZ'+h).Value;

EVALUATE(gueltigABDatum, Sheet.Range('BA'+h).Value);
KatalogArtikelROM.GueltigAbDatum:=gueltigABDatum;

KatalogArtikelROM.Status:=Sheet.Range('BB'+h).Value;

EVALUATE(kupferBasis,Sheet.Range('BC'+h).Value);
KatalogArtikelROM.KupferBasis:=kupferBasis;

EVALUATE(kupferZahl,Sheet.Range('BD'+h).Value );
KatalogArtikelROM.KupferZahl:=kupferZahl;

EVALUATE(aluBasis, Sheet.Range('BE'+h).Value);
KatalogArtikelROM.AluBasis:=aluBasis;

EVALUATE(aluZahl, Sheet.Range('BF'+h).Value);
KatalogArtikelROM.AluZahl:=aluZahl;

EVALUATE(bleiBasis,Sheet.Range('BG'+h).Value );
KatalogArtikelROM.BleiBasis:=bleiBasis;

EVALUATE(bleiZahl,Sheet.Range('BH'+h).Value);
KatalogArtikelROM.BleiZahl:=bleiZahl;



//h:=INCSTR(h);
KatalogArtikelROM.INSERT;
END;


Ich versuche das in die Tabelle zu schreiben.
Aber in der Tabelle steht nichts drin.
Vielleicht kann mir jemand helfen woran es kiegt?

Beste Grüße,
Christian

Re: Aus Excel importieren (DEV)

Verfasst: 28. Februar 2018 10:14
von navCH
Guten Morgen!

Kann ich auch Recordvariablen verwenden, ohne ein Dataitem angelegt zu haben?
Ich habe praktisch meinen Code nur in ein OnPreReport() reingeschrieben.
Muss ich TRUE im Insert(TRUE) verwenden, wenn ich im OnPreReport() ausführe?
Schreibt irgendwie nicht in die Tabelle.

Gruß,
Christian

Re: Aus Excel importieren (DEV)

Verfasst: 28. Februar 2018 12:38
von navCH
Hallo.

Wie bekomme ich denn die ganzen Felder über ExcelBuffer in die Tabelle?
Oder jemand ne Idee, wenn ich das Insert auf die Tabelle mache, wie es richtig funktioniert?

Gruß
Christian

Re: Aus Excel importieren (DEV)

Verfasst: 28. Februar 2018 13:35
von ERP-Berater
navCH hat geschrieben:Guten Morgen!

Christian


Hallo,

ich hab mal deine Postings überflogen.

Da du unter Zeitdruck zu stehen scheinst, gehst du vielleicht nicht so strukturiert vor, wie du solltest?

Ich habe den subjektiven Eindruck, dass dir Programmier-Basics in C/AL fehlen.

Ich bin leider kein Profi-Entwickler, aber evtl. helfen dir diese 2 Wege:

1. http://www.navision24.de/tutorials/echt ... eugen.html

2. bei deinem Systemhaus (oder vergleichbar) anrufen und fragen, ob man dir für kleines Geld aus Programming 1 oder 2 denjenigen Teil per TeamViewer zeigt, der mit Excel-Import/Export über diese Buffertabellen geht. Dauer evtl. 2-3 Std. für -ich rate mal rein ins Blaue- 300 €.

Re: Aus Excel importieren (DEV)

Verfasst: 28. Februar 2018 20:49
von enh
Ich würde dazu raten die Excel Buffer Tabelle mit ihren Funktionen zu nutzen. Als Beispiel kannst du im Standard z. B. in Report 81 "Import Budget from Excel" nachschauen wie das funktionieren kann.

Re: Aus Excel importieren (DEV)

Verfasst: 1. März 2018 13:17
von sweikelt
navCH hat geschrieben:Kann ich auch Recordvariablen verwenden, ohne ein Dataitem angelegt zu haben?

-> wenn du gar kein DataItem hast, dann brauchste auch kein Report! ....nimm einfach eine Codeunit und schreib deine Funktionen und rufe die dann im OnRun-Trigger auf....dann einfach Codeunit starten
-> wenn du es unbedingt mit einem Report machen willst, nimm wenigsten ein DataItem -> von mir aus Integer mit Filter auf Number = 1
navCH hat geschrieben:Muss ich TRUE im Insert(TRUE) verwenden, wenn ich im OnPreReport() ausführe?

--> nö, außer du willst, dass der Insert-Trigger ausgeführt wird -> wenn eh nix in deinem Trigger steht, dann kannst du auch Triggereinsatz ausführen

Re: Aus Excel importieren (DEV)

Verfasst: 1. März 2018 13:39
von navCH
sweikelt hat geschrieben:
navCH hat geschrieben:Kann ich auch Recordvariablen verwenden, ohne ein Dataitem angelegt zu haben?

-> wenn du gar kein DataItem hast, dann brauchste auch kein Report! ....nimm einfach eine Codeunit und schreib deine Funktionen und rufe die dann im OnRun-Trigger auf....dann einfach Codeunit starten
-> wenn du es unbedingt mit einem Report machen willst, nimm wenigsten ein DataItem -> von mir aus Integer mit Filter auf Number = 1


Ich habe mich für einen Report mit Integer DataItem entschieden :-D

Gruß
Christian

Re: Aus Excel importieren (DEV)

Verfasst: 1. März 2018 14:35
von fiddi
sweikelt hat geschrieben:-> wenn du gar kein DataItem hast, dann brauchste auch kein Report! ....nimm einfach eine Codeunit und schreib deine Funktionen und rufe die dann im OnRun-Trigger auf....dann einfach Codeunit starten
-> wenn du es unbedingt mit einem Report machen willst, nimm wenigsten ein DataItem -> von mir aus Integer mit Filter auf Number = 1


1. Den Report nimmt man i.d.R. weil man welche lizensiert hat die noch nicht belegt sind, bei Codeunits sieht das häufig etwas magerer aus.
2. Man muss beim Report kein Dataitem haben, wenn da nicht sinnvolles passiert. Man kann den Code auch in den OnPreReport schreiben.

Gruß Fiddi

Re: Aus Excel importieren (DEV)

Verfasst: 1. März 2018 17:05
von navCH
fiddi hat geschrieben:
sweikelt hat geschrieben:-> wenn du gar kein DataItem hast, dann brauchste auch kein Report! ....nimm einfach eine Codeunit und schreib deine Funktionen und rufe die dann im OnRun-Trigger auf....dann einfach Codeunit starten
-> wenn du es unbedingt mit einem Report machen willst, nimm wenigsten ein DataItem -> von mir aus Integer mit Filter auf Number = 1


1. Den Report nimmt man i.d.R. weil man welche lizensiert hat die noch nicht belegt sind, bei Codeunits sieht das häufig etwas magerer aus.
2. Man muss beim Report kein Dataitem haben, wenn da nicht sinnvolles passiert. Man kann den Code auch in den OnPreReport schreiben.

Gruß Fiddi


Alles klar und danke für die info!

Gruß
Christian

Re: Aus Excel importieren (DEV)

Verfasst: 1. März 2018 17:28
von fiddi
Hallo Christian.

Nochmal der Hinweis: Bitte vermeide Vollzitate


Bitte benutze den Antwortbutton unter dem Beitrag.

Gruß Fiddi

Re: Aus Excel importieren (DEV)

Verfasst: 2. März 2018 10:35
von navCH
@fiddi: Ok, Keine Vollzitate!

Re: Aus Excel importieren (DEV)

Verfasst: 23. Juli 2018 14:06
von pakos47
Ted hat geschrieben:Warum nutzt du nicht einfach einen XML Port?
xmlport.png

(Integer ist Temporär)


Dazu mal eine Anmerkung, wenn ich das versuche kommt eine Fehlermeldung.
Die Fehlermeldung lautet:
"Ungültige Daten auf Stammebene. Zeile 1, Position 1."

Kann damit jemand was anfangen?

Re: Aus Excel importieren (DEV)

Verfasst: 14. August 2018 11:18
von slgeorg
Hi navCH,

ich habe dafür eine Codeunit angelegt und im OnRun Trigger folgenden Code hinterlegt:

Code:
ServerFileName := FileManagement.UploadFile('','');
IF ServerFileName = '' THEN
  EXIT;

SheetName := ExcelBuffer.SelectSheetsName(ServerFileName);
IF SheetName = '' THEN
  EXIT;

ExcelBuffer.LOCKTABLE;
ExcelBuffer.OpenBook(ServerFileName,'Excelblatt Name');
ExcelBuffer.ReadSheet;

TotalRowCount := ExcelBuffer.COUNT;

InsertData;


Die Funktion InsertData sieht dann folgendermaßen aus:

Code:
LOCAL InsertData()
FOR i := 1 TO TotalRowCount DO BEGIN
  IF i = 1 THEN
    i += 3;
  IF i = 1563 THEN
    EXIT;
  EVALUATE(JobStructure,GetValueAtCell(i,1));
  EVALUATE(JobNo,GetValueAtCell(i,2));
  EVALUATE(JobTaskNo,GetValueAtCell(i,3));
  EVALUATE(LineNo,GetValueAtCell(i,4));
  JobPlanningLine.SETRANGE("Job Structure Type",1);
  JobPlanningLine.SETRANGE("Job No.",JobNo);
  JobPlanningLine.SETRANGE("Job Task No.",JobTaskNo);
  JobPlanningLine.SETRANGE("Line No.",LineNo);
  IF JobPlanningLine.FINDFIRST THEN BEGIN
    EVALUATE(EntryNoPerf,GetValueAtCell(i,5));
    JobPlanningLine."Ledger Entry No." := EntryNoPerf;
    JobPlanningLine.MODIFY;
  END;
END;


Die Variable i ist jeweils die Zeilennummer und der 2. Parameter ist die Spalte.
Der Evaluate konvertiert mir den Text aus dem Excel in den jeweiligen Datentyp.

Wenn du dein Date wie beschrieben in folgendem Format bekommst, als z.B. 09092016 dann kannst du dies so verwenden:
Die DateLoc wäre in deinem Fall die Excel Spalte mit dem Datum.
Code:
//get document date
EVALUATE(DocumentDateYear,COPYSTR(DateLoc,1,4));
EVALUATE(DocmentDateMonth,COPYSTR(DateLoc,5,2));
EVALUATE(DocumentDateDay,COPYSTR(DateLoc,7,2));

DocumentDate := DMY2DATE(DocumentDateDay,DocmentDateMonth,DocumentDateYear);



GetValueAtCell sieht dann so aus:
Code:
LOCAL GetValueAtCell(RowNo : Integer;ColNo : Integer) : Text
IF ExcelBufferLoc.GET(RowNo,ColNo) THEN
  EXIT(ExcelBufferLoc."Cell Value as Text");


Variablen sind wie folgt definiert:
Code:
Name   DataType   Subtype   Length
ServerFileName   Text      
FileManagement   Codeunit   File Management   
ExcelBuffer   Record   Excel Buffer   
SheetName   Text      
TotalRowCount   Integer      
i   Integer      


Solltest du Fragen haben, kannst du dich gerne melden.

Grüße
slgeorg