使用microsoft dynamics 2009导入xml

时间:2016-02-10 14:34:05

标签: xml microsoft-dynamics dynamics-nav

我尝试导入一个xml文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<BedrijfsInformatie xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Bedrijfsnaam>TotaalTechniek Europort bv</Bedrijfsnaam>
  <Naam>E.W. Messemaker</Naam>
  <Adres>Deltageul 71</Adres>
  <Postcode>3251 NG</Postcode>
  <Plaats>Stellendam</Plaats>
  <Emailadres>edwin@tt-europort.eu</Emailadres>
  <Telefoon>0187-499536</Telefoon>
  <Rechtsvorm>Besloten Vennootschap</Rechtsvorm>
  <Kvk>62.12.963.5</Kvk>
  <BTW>Nl.8546.72.011.B01</BTW>
  <Werkadres />
  <Levering />
  <IBAN />
  <Swift />
  <Betalingswijze>rekening</Betalingswijze>
  <Verzamelfactuur>nee</Verzamelfactuur>
  <Digitalefactuur>ja</Digitalefactuur>
  <EmailDigitalefactuur>info@tt-europort.eu</EmailDigitalefactuur>
  <Contactpersonen>
    <Contactpersoon>
      <Voornaam>Edwin</Voornaam>
      <Achternaam>Messemaker</Achternaam>
      <Emailadres>edwin@tt-europort.eu</Emailadres>
      <Telefoon>0187-499536</Telefoon>
      <Functie>DGA</Functie>
      <Monteur />
      <CanOrder>Ja</CanOrder>
      <CanSeeStock>Ja</CanSeeStock>
      <CanSeeOrder>Ja</CanSeeOrder>
      <CanAddAddress>Ja</CanAddAddress>
      <CanSeePrice>Ja</CanSeePrice>
      <CanSeeCredit>Ja</CanSeeCredit>
      <CanSeePickup>Ja</CanSeePickup>
    </Contactpersoon>
    <Contactpersoon>
      <Voornaam>Gijs</Voornaam>
      <Achternaam>Alphen, van</Achternaam>
      <Emailadres>gijs@tt-europort.eu</Emailadres>
      <Telefoon>0651971605</Telefoon>
      <Functie>DGA</Functie>
      <Monteur />
      <CanOrder>Ja</CanOrder>
      <CanSeeStock>Ja</CanSeeStock>
      <CanSeeOrder>Ja</CanSeeOrder>
      <CanAddAddress>Ja</CanAddAddress>
      <CanSeePrice>Ja</CanSeePrice>
      <CanSeeCredit>Ja</CanSeeCredit>
      <CanSeePickup>Nee</CanSeePickup>
    </Contactpersoon>
  </Contactpersonen>
</BedrijfsInformatie>

但如果我进行导入,我会收到错误:

Attribuut wordt niet verwacht。所以第二行:

<BedrijfsInformatie xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

NAv不接受。但如果我这样做:

<BedrijfsInformatie>

它有效。但我不能这样做。因为文件必须阅读他的所有内容。

谢谢

是的,使用XML端口,这是xml端口的代码:

Documentation()

OnInitXMLport()

OnPreXMLport()

OnPostXMLport()

BedrijfsInformatie - Import::OnAfterInitRecord()

BedrijfsInformatie - Import::OnBeforeInsertRecord()

BedrijfsInformatie - Import::OnAfterInsertRecord()

BedrijfsInformatie - Export::OnPreXMLItem()

BedrijfsInformatie - Export::OnAfterGetRecord()

Bedrijfsnaam - Import::OnAfterAssignField()

Bedrijfsnaam - Export::OnBeforePassField()

Naam - Import::OnAfterAssignVariable()

Naam - Export::OnBeforePassVariable()

Adres - Import::OnAfterAssignVariable()

Adres - Export::OnBeforePassVariable()

Postcode - Import::OnAfterAssignVariable()

Postcode - Export::OnBeforePassVariable()

Plaats - Import::OnAfterAssignVariable()

Plaats - Export::OnBeforePassVariable()

Emailadres - Import::OnAfterAssignVariable()

Emailadres - Export::OnBeforePassVariable()

Telefoon - Import::OnAfterAssignVariable()

Telefoon - Export::OnBeforePassVariable()

Rechtsvorm - Import::OnAfterAssignVariable()

Rechtsvorm - Export::OnBeforePassVariable()

Kvk - Import::OnAfterAssignVariable()

Kvk - Export::OnBeforePassVariable()

BTW - Import::OnAfterAssignVariable()

BTW - Export::OnBeforePassVariable()

Werkadres - Import::OnAfterAssignVariable()


  IF Werkadres = 'verplicht' THEN
    "<Customer>"."Reference Mandatory" := TRUE
  ELSE
    "<Customer>"."Reference Mandatory" := FALSE;

Werkadres - Export::OnBeforePassVariable()

Levering - Import::OnAfterAssignVariable()

  IF Werkadres = 'verplicht' THEN
    "<Customer>"."Job Receipt No. Mandatory" := TRUE
  ELSE
    "<Customer>"."Job Receipt No. Mandatory" := FALSE;

Levering - Export::OnBeforePassVariable()

IBAN - Import::OnAfterAssignVariable()

IBAN - Export::OnBeforePassVariable()

Swift - Import::OnAfterAssignVariable()

Swift - Export::OnBeforePassVariable()

Betalingswijze - Import::OnAfterAssignVariable()

    //Determines which payment method is choosen(rekening, Kontant,automatische incasso in the xml file)
CASE Betalingswijze OF
        'kontant':
           TemplateHeader.Code :='KNT-KLANT';
        'rekening':
           TemplateHeader.Code :='REK-KLANT';
        'automatische incasso':
            TemplateHeader.Code  :='BIN-INC-KL';
        ELSE
        TemplateHeader.Code  :='KONTANT';
  END;

Betalingswijze - Export::OnBeforePassVariable()

Verzamelfactuur - Import::OnAfterAssignField()

Verzamelfactuur - Export::OnBeforePassField()

Digitalefactuur - Import::OnAfterAssignField()

Digitalefactuur - Export::OnBeforePassField()

EmailDigitalefactuur - Import::OnAfterAssignVariable()

EmailDigitalefactuur - Export::OnBeforePassVariable()

Contactpersonen - Import::OnAfterAssignVariable()

Contactpersonen - Export::OnBeforePassVariable()

Contactpersoon - Export::OnPreXMLItem()

Contactpersoon - Export::OnAfterGetRecord()

Contactpersoon - Import::OnAfterInitRecord()

Contactpersoon - Import::OnBeforeInsertRecord()
   "<Contact>".Type := 1;//1 is for Person. 0 is for company

Contactpersoon - Import::OnAfterInsertRecord()


  LoopCount := LoopCount + 1;
    IF FirstContact = '' THEN
      FirstContact := "<Contact>"."No.";

Voornaam - Export::OnBeforePassField()

Voornaam - Import::OnAfterAssignField()

Achternaam - Export::OnBeforePassField()

Achternaam - Import::OnAfterAssignField()

Emailadres - Export::OnBeforePassField()

Emailadres - Import::OnAfterAssignField()

Telefoon - Export::OnBeforePassField()

Telefoon - Import::OnAfterAssignField()

Functie - Export::OnBeforePassField()

Functie - Import::OnAfterAssignField()

Monteur - Export::OnBeforePassField()

Monteur - Import::OnAfterAssignField()

CanOrder - Export::OnBeforePassVariable()

CanOrder - Import::OnAfterAssignVariable()

  IF CanOrder = 'Ja' THEN
    "<Contact>".Right1 := TRUE
  ELSE
    "<Contact>".Right1:= FALSE;

CanSeeStock - Export::OnBeforePassVariable()

CanSeeStock - Import::OnAfterAssignVariable()
  IF CanOrder = 'Ja' THEN
    "<Contact>".Right2 := TRUE
  ELSE
    "<Contact>".Right2:= FALSE;

CanSeeOrder - Export::OnBeforePassVariable()

CanSeeOrder - Import::OnAfterAssignVariable()

  IF CanOrder = 'Ja' THEN
    "<Contact>".Right3 := TRUE
  ELSE
    "<Contact>".Right3:= FALSE;

CanAddAddress - Export::OnBeforePassVariable()

CanAddAddress - Import::OnAfterAssignVariable()

  IF CanOrder = 'Ja' THEN
    "<Contact>".Right4 := TRUE
  ELSE
    "<Contact>".Right4:= FALSE;

CanSeePrice - Export::OnBeforePassVariable()

CanSeePrice - Import::OnAfterAssignVariable()

  IF CanSeePrice = 'Ja' THEN
    "<Contact>".Right5 := TRUE
  ELSE
    "<Contact>".Right5:= FALSE;

CanSeeCredit - Export::OnBeforePassVariable()

CanSeeCredit - Import::OnAfterAssignVariable()
  IF CanOrder = 'Ja' THEN
    "<Contact>".Right6 := TRUE
  ELSE
    "<Contact>".Right6:= FALSE;

CanSeePickup - Export::OnBeforePassVariable()

CanSeePickup - Import::OnAfterAssignVariable()

  IF CanOrder = 'Ja' THEN
    "<Contact>".Right7 := TRUE
  ELSE
    "<Contact>".Right7:= FALSE;

UpdateRecord()

这是导入代码:

Documentation()

Report - OnInitReport()

Report - OnPreReport()

Report - OnPostReport()
IF Filename <> '' THEN ImportFile
ELSE MESSAGE(NoFileText);

Report - OnCreateHyperlink(VAR URL : Text[1024])

Report - OnHyperlink(URL : Text[1024])

UploadFile(VAR FileName : Text[1024])
IF NOT ISSERVICETIER THEN
  NewFileName := CommonDialogMgt.OpenFile(Caption,FileName,4,Filefilter,0)

ELSE
  IF NOT(UPLOAD(Caption,'',Filefilter,FileName,NewFileName)) THEN
    NewFileName := '';

IF NewFileName <> '' THEN
  FileName := NewFileName;

ImportFile()
IF ISSERVICETIER THEN BEGIN
  IF UPLOADINTOSTREAM(
                      'Select the simple.xml file',
                      '\\svdh04\data\NAV docs\webaanmelding\',
                      'XML File *.xml| *.xml',
                       Filename,
                       Stream) THEN
    MESSAGE(ImportCompleteText)
  ELSE
    EXIT;
END
ELSE BEGIN
  dFile.OPEN(Filename);
  dFile.CREATEINSTREAM(Stream);
  IF NOT XMLPORT.IMPORT(50010,Stream) THEN MESSAGE(ErrorText)
  ELSE MESSAGE(ImportCompleteText);
END;

IF NOT ISSERVICETIER THEN dFile.CLOSE;

我现在就这样:

//New code:
dFile.TEXTMODE(FALSE);
dFile.OPEN(SavePath);
dFile.CREATEINSTREAM(Stream);
InputText.READ(Stream);
dFile.CLOSE;

TextToFind := 'xmlns=""';
TextPos := InputText.TEXTPOS(TextToFind);
WHILE TextPos <> 0 DO BEGIN
  InputText.GETSUBTEXT(SubText, 1, TextPos - 1);
  OutputText.ADDTEXT(SubText);
  InputText.GETSUBTEXT(InputText, TextPos + STRLEN(TextToFind));
  TextPos := InputText.TEXTPOS(TextToFind);
END;
OutputText.ADDTEXT(InputText);

dFile.TEXTMODE(FALSE);
dFile.CREATE(SavePath);
dFile.CREATEOUTSTREAM(NVOutStream);
OutputText.WRITE(NVOutStream);
dFile.CLOSE;


//End new code

IF ISSERVICETIER THEN BEGIN
  IF UPLOADINTOSTREAM(
                      'Select the simple.xml file',
                      '\\svdh04\data\NAV docs\webaanmelding\',
                      'XML File *.xml| *.xml',
                       Filename,
                       Stream) THEN
    MESSAGE(ImportCompleteText)
  ELSE
    EXIT;
END
ELSE BEGIN
  dFile.OPEN(Filename);
  dFile.CREATEINSTREAM(Stream);
  IF NOT XMLPORT.IMPORT(50010,Stream) THEN MESSAGE(ErrorText)
  ELSE MESSAGE(ImportCompleteText);
END;

IF NOT ISSERVICETIER THEN dFile.CLOSE;

但后来我收到了这个错误:

enter image description here

好吧,我现在改变了:

//New code:
dFile.TEXTMODE(FALSE);
dFile.OPEN(Filename);

dFile.CREATEINSTREAM(Stream);
InputText.READ(Stream);
dFile.CLOSE;

TextToFind := 'xmlns=""';
TextPos := InputText.TEXTPOS(TextToFind);
MESSAGE(FORMAT(TextPos));
WHILE TextPos <> 0 DO BEGIN
  InputText.GETSUBTEXT(SubText, 1, TextPos - 1);
  OutputText.ADDTEXT(SubText);
  InputText.GETSUBTEXT(InputText, TextPos + STRLEN(TextToFind));
  TextPos := InputText.TEXTPOS(TextToFind);
END;
OutputText.ADDTEXT(InputText);

dFile.TEXTMODE(FALSE);
dFile.CREATE(Filename);
dFile.CREATEOUTSTREAM(NVOutStream);
OutputText.WRITE(NVOutStream);
dFile.CLOSE;


//End new code

IF ISSERVICETIER THEN BEGIN
  IF UPLOADINTOSTREAM(
                      'Select the simple.xml file',
                      '\\svdh04\data\NAV docs\webaanmelding\',
                      'XML File *.xml| *.xml',
                       Filename,
                       Stream) THEN
    MESSAGE(ImportCompleteText)
  ELSE
    EXIT;
END
ELSE BEGIN
  dFile.OPEN(Filename);
  dFile.CREATEINSTREAM(Stream);
  IF NOT XMLPORT.IMPORT(50010,Stream) THEN MESSAGE(ErrorText)
  ELSE MESSAGE(ImportCompleteText);
END;

IF NOT ISSERVICETIER THEN dFile.CLOSE;

但问题在于:

TextPos := InputText.TEXTPOS(TextToFind);

TextPos为0。

谢谢

1 个答案:

答案 0 :(得分:0)

是的,因为NAV 2009不支持XMLports中的命名空间。

解决方案在这里: You have to remove the namespace(s) first with an xml transformation

干杯!