【问题标题】:Send a Blob From Navision to a Javascript Add In将 Blob 从 Navision 发送到 Javascript 插件
【发布时间】:2017-06-28 11:46:35
【问题描述】:

我在 NAV 中有一个 Blob 对象,它代表一个 Excel 文档。我希望此文档显示在我的 JavaScript 控件插件中(在 Web 和 Windows 客户端中运行)。但我不确定如何处理这个问题。稍后在 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

当 AddIn 准备好时执行代码。 Nav 变量ExcelDocument 被定义为这个

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,但这对我也不起作用。

【问题讨论】:

  • 您要在加载项中使用此工作表做什么?我的意思是你要把它喂给什么?
  • 而且你基本上二进制(字节)字符串只是字母和数字,因为它是从 0 到 256 的字符。
  • 我只想在 AddIn 中显示。也许做一些改变,但我没有和我的同事谈论这个,因为它还不是必需的。这是一个 .Net 插件,一切正常,但 .Net 插件在 WebClient 中不起作用,所以我决定做一个 JavaScript 插件。

标签: navision dynamics-nav


【解决方案1】:

我有这段代码可以将二进制节点添加到 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);

【讨论】:

    【解决方案2】:

    我找到了将 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 类中发生。不久,我将字节数组转换为流,然后在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);
    

    这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 2020-07-20
      • 2019-02-19
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 2018-08-30
      相关资源
      最近更新 更多