如何在“购买收据”弹出窗口中上传批次/序列号分配?

时间:2018-04-16 21:53:04

标签: acumatica

我想将批次/序列号的电子表格上传到“购买收据”屏幕上的“分配”弹出窗口中。我的公司在一个订单中接收1000多个序列号并且通过这个弹出窗口一次一个地输入它们并不罕见。 (我的序列号不是连续的,所以我不能使用Generate工具。)

enter image description here

我在这里找到了相关的帖子,但我无法让源工作。

How to include a dialog for file upload

... begin snippet ...
byte[] filedata = info.BinData;
using (NVExcelReader reader = new NVExcelReader())
{
    Dictionary<UInt32, string[]> data = reader.loadWorksheet(filedata);
    foreach (string[] textArray in data.Values)
    {
        // do stuff
    }
}
...

代码引用了一个名为NVExcelReader()的类。这个班级来自哪里?这是Acumatica股票的一部分吗?我一直无法在源代码中找到这个类。我正在使用Acumatica 2017 R2。这个类是否有可能在较新版本中重命名或移动?

有人能指出我正确的方向或解释我如何在Acumatica中重新创建NVExcelReader()的功能吗?

2 个答案:

答案 0 :(得分:1)

NVExcelReader不是Acumatica类,这里的主要思想是使用任何现有的类来读取excel文件。

那么您真正需要做的是:

在aspx文件中声明PXUploadDialog元素

 <px:PXUploadDialog ID="ImportPanel" runat="server" Key="NewRevisionPanel" Height="120px" Style="position: static" Width="560px"
                Caption="Import XML File (*.xml)" AutoSaveFile="false" RenderCheckIn="false" SessionKey="ImportStatementProtoFile" />

添加按钮委托

public PXSelect<PO.POReceipt> NewRevisionPanel;

public PXAction<PO.POReceipt> ImportAllocations;
[PXUIField(DisplayName = "Import Allocations", 
    MapEnableRights = PXCacheRights.Update,
    MapViewRights = PXCacheRights.Update, 
    Enabled = true)]
[PXButton()]
public virtual void importAllocations()
{

}

使用PXInfo类获取选定的文件数据

const string PanelSessionKey = "ImportStatementProtoFile";
PX.SM.FileInfo info = PX.Common.PXContext
    .SessionTyped<PXSessionStatePXData>()
    .FileInfo[PanelSessionKey] as PX.SM.FileInfo;
System.Web.HttpContext.Current.Session.Remove(PanelSessionKey);

if (info != null)
{
    // here is your file data in bytes
    byte[] filedata = info.BinData;

使用任何现有库以字节为单位读取Excel文件。请注意,此步骤与Acumatica不相关。例如,您可以找到有用的信息herehere

然后将文件中的值设置为Acumatica实体(例如POReceiptLineSplit)

Base.splits.Insert(new PO.POReceiptLineSplit()
{
    InventoryID = Base.transactions.Current.InventoryID,
    LocationID = Base.transactions.Current.LocationID,
    LotSerialNbr = valueFromExcelFile1,
    Qty = valueFromExcelFile2
});

答案 1 :(得分:0)

NVExcelReader不是Acumatica框架的一部分。我这样说是因为resharper都没能在Acumatica dll中找到NVExcelReader,也没有在Acumatica目录中搜索字符串能够找到包含NVExcelReader字符串值的任何文件。除了在stackoverflow上引用你的线程之外,Google搜索NVExcelReader类也没有给出任何好的结果。为了在Acumatica中重新创建NVExcelReader,您可以考虑使用可以从excel文件中读取的某些第三方库。从COM接口开始有很多选项,excel的OLE DB和解析xml文件的Aspose库。