将 Blob 从 Navision 发送到 Javascript 加载项

Send a Blob From Navision to a Javascript Add In

我在 NAV 中有一个 Blob 对象,它代表一个 Excel 文档。我希望此文档显示在我的 JavaScript Control AddIn(Web 和 Windows-Client 中的 运行)中。但我不确定如何处理这个问题。稍后在 AddIn 中,我需要将 Blob 作为二进制字符串。

到目前为止,我尝试了两件事。

先试试

我用这个方法建立了一个接口

[ApplicationVisible]
void SetExcelDocument(ExcelDocument ExcelDocument);

ExcelDocument - 对象看起来像这样

[Serializable]
public class ExcelDocument
{
    //Constructor
    public ExcelDocument()
    {
        CurrentExcelDocument = null;
    }

    //store Blob
    public Stream CurrentExcelDocument { get; set; }

}

所以在 NAV 中,我将 Blob 转换为 .Net MemoryStream 变量,如下所示

MemStream DotNet System.IO.System.IO.MemoryStream.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

和这样的代码

TechnicalSpreadsheet.CALCFIELDS(Document);             //Get Blob (Document is table column name)
TechnicalSpreadsheet.Document.CREATEINSTREAM(Lstr_BlobInstream);

MemStream := MemStream.MemoryStream();
COPYSTREAM(MemStream,Lstr_BlobInstream);
ExcelDocument := ExcelDocument.ExcelDocument;          //Initialize Object
ExcelDocument.CurrentExcelDocument := MemStream;       //set MemoryStream

CurrPage.spreadsheet.SetExcelDocument(ExcelDocument);  //Call function in AddIn

当加载项准备就绪时执行代码。 Nav 变量 ExcelDocument 定义为 this

ExcelDocument DotNet <Reference to Object here>, Version=8.0.0.0, Culture=neutral, PublicKeyToken=d02dbb9bbac93844' 

所以这里的问题是,当 属性 "RunOnClient" 设置为 yes 时,我只能在 NAV 中设置 ExcelDocument 的实例。但这不适用于 WebClient (Source)。但是,即使将 属性 设置为 yes,也不会将数据发送到 AddIn。

第二次尝试

第二次尝试时,我更改了数据类型。所以我使用 byte[] 而不是流。所以我把界面改成了这个

[ApplicationVisible]
void SetExcelDocument(byte[] ExcelDocument);

并且刚刚将 NAV 中的 AddIn 函数调用更改为此

CurrPage.spreadsheet.SetExcelDocument(MemStream.ToArray);  //Call function in AddIn

并删除了 ExcelDocument 变量。

这有效,但数据看起来不像二进制数据。在 web 控制台中显示时,我会期待一些不可读的东西,但我得到的是可读的字母和数字。而且我不确定如何将其转换为二进制字符串。

Vjeko 有一些不错的 input,但这对我也不起作用。

我有这段代码可以将二进制节点添加到 XML 文件。通过这个我能够将文件作为二进制数据发送到 Web 服务。尝试使用它也许会有所帮助。它使用 ActiveX,因为它是为 Nav 5 编写的。您可以将其替换为 .net。

  pNodeName@1210000 : Text[50];VAR pXMLDoc@1210001 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{88D96A05-F192-11D4-A65F-0040963251E5}:'Microsoft XML, v6.0'.DOMDocument60";pPath@1210002 : Text[1024]);
  Att@1210009 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF86-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMElement";
  parent@1210008 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF86-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMElement";
  AdoStream@1210003 : Automation "{B691E011-1797-432E-907A-4D8C69339129} 6.1:{00000566-0000-0010-8000-00AA006D2EA4}:'Microsoft ActiveX Data Objects 6.1 Library'.Stream";

  Att := pXMLDoc.createElement(pNodeName);
  CREATE(AdoStream, TRUE);
  AdoStream.Type := 1; //Binary
  AdoStream.Open();
  AdoStream.LoadFromFile(pPath);
  Att.dataType('bin.hex');
  Att.nodeTypedValue := AdoStream.Read;
  AdoStream.Close();
  parent := pXMLDoc.documentElement;
  parent.appendChild(Att);

我找到了将 blob 发送到 JavaScript Control AddIn 的解决方案。这是我所做的。

在控件AddIn的界面中我定义了方法

[ApplicationVisible]
void SetExcelDocument(ExcelDocument exceldoc);

其中 ExcelDocument - 对象看起来像这样

[Serializable]
public class ExcelDocument
{
    public string ExcelJson;  //Excel Content stored in JSON format

    public byte[] Excel
    {
        get
        {
            return null;      //Not needed in the AddIn
        }
        set
        {
            IConverter converter = new Converter();
            ExcelJson = converter.ArrayBufferOfExcelDocToJson(value);
        }
    }
}

魔术现在正在新 Converter - class 中发生。不久我将字节数组转换为流,然后在 EPPlus 的帮助下读取流(分别为 Excel 文档),最后将带有 Newtonsoft.JSON 的文档内容转换为 Json 字符串(变量 ExcelJson).

在 NAV 中它看起来像这样。

//Get Blob (Document is table column name)
TechnicalSpreadsheet.Document.CREATEINSTREAM(Lstr_BlobInstream);  
//init Memory Stream 
MemStream := MemStream.MemoryStream();              
COPYSTREAM(MemStream,Lstr_BlobInstream);
//Init DotNet Variable 
ExcelDocument := ExcelDocument.ExcelDocument;
//Set byte[]
ExcelDocument.Excel := MemStream.GetBuffer;
//Call function in AddIn
CurrPage.spreadsheet.SetExcelDocument(ExcelDocument);

这对我有用。