附件中未显示附件

时间:2018-10-29 20:48:31

标签: acumatica

我需要在保存采购订单以上传到ftp的同时生成文件,并将该文件作为附件另存为文件部分中的文本文件

我正在RowPersisted事件中生成文件

protected void POOrder_RowPersisted(PXCache cache, PXRowPersistedEventArgs e, PXRowPersisted InvokeBaseHandler)
{
    if (InvokeBaseHandler != null)
        InvokeBaseHandler(cache, e);
    var row = (POOrder)e.Row;
    if (e.TranStatus == PXTranStatus.Open)
    {
        if (row.Hold != true && row.Status == POOrderStatus.Open)
        {
            string output = GenerateFeed();  // Generates Feed and upload to Ftp.
            AttachFile(row, output);
        }
    }
}


private void  AttachFile(POOrder row , string output)
{
    string filename = $"{row.OrderNbr.ToString()}.txt";
    byte[] data = output.ToByteArray();
    PX.SM.UploadFileMaintenance filegraph = PXGraph.CreateInstance<PX.SM.UploadFileMaintenance>();
    PX.SM.FileInfo fileinfo = new PX.SM.FileInfo(filename, null, data);
    if (filegraph.SaveFile(fileinfo, PX.SM.FileExistsAction.CreateVersion))
    {
        PXNoteAttribute.SetFileNotes(Base.Document.Cache, row, new Guid[] { fileinfo.UID.Value });
        string note = PXNoteAttribute.GetNote(Base.Document.Cache, row);
        PXNoteAttribute.SetNote(Base.Document.Cache, row, note);
    }
}   

附件的文件在文档的文件菜单中不可用。

检查后,我发现未在NoteDoc中创建链接。

有人对此问题有解决方案吗?

2 个答案:

答案 0 :(得分:0)

我认为问题在于,在POOrder行被持久保存之后,现在修改它为时已晚,因为它不会再次被持久保存。您可能会正确附加文件,但在附加文件后不保存POOrder记录。

您可以在RowPersisted中修改POOrder,但不能再次持久保存它,而不会导致无限循环。

您需要修改并保留POOrder来附加文件,因此我建议钩住RowPersisting而不是RowPersisted:

function isValid()
{
    var pass = "seahorse";
    var password = document.getElementById("password");

    if (password.value.match(pass))
    {
        window.location.href = "HappyChristmas.html";
    }
    else
    {
        alert('Nope, try again');
    }
}

这将解决保存问题,因为在Persisted实际保留对POOrder的更改之前调用Persisting。要附加文件,您只需调用SetFileNotes:

<div class="jumbotron">
  <form name="PasswordField" action="">
    <div class="form-group">
      <label for="exampleInputPassword1"><h4>If you're an octopus I am...</h4></label>
            <input type="password" class="form-control" id="password" placeholder="Password">
    </div>
    <button type="submit" onclick="isValid()" class="btn btn-default">Submit</button>
  </form>
</div>

enter image description here

答案 1 :(得分:0)

我已经重写了Persist并生成了feed,并将文件附加到了文档上。

我在这里遇到了一个问题,就是这种方法被调用了很多次,并且生成了feed,并且每次执行并将新版本添加到文件系统中

我正在通过作为POOrder DAC扩展名创建的无界字段来控制文件生成

public delegate Int32 PersistDelegate(Type cacheType, PXDBOperation operation);
    [PXOverride]
    public Int32 Persist(Type cacheType, PXDBOperation operation, PersistDelegate baseMethod)
    {
        var row = Base.Document.Current;
        POOrderExt ext = Base.Document.Cache.GetExtension<POOrderExt>(row);
        if (row.Hold != true && row.Status == POOrderStatus.Open && Base.Document.Cache.GetStatus(Base.Document.Current) != PXEntryStatus.Inserted)
        {
            if (ext.UsrIsProcessed == null && (operation == PXDBOperation.Delete || operation == PXDBOperation.Update))
            {
                ext.UsrIsProcessed = true;
                string output = GenerateFeed();
                AttachFile(row, output);
            }
        }

        return baseMethod(cacheType, operation);
    }

DAC扩展

    public class POOrderExt : PXCacheExtension<POOrder>
    {
        #region UsrIsProcessed
        [PXBool]
        public virtual bool? UsrIsProcessed { get; set; }
        public abstract class usrIsProcessed : IBqlField { }
        #endregion
    }