【问题标题】:Data Reader issue with images inside selector选择器内图像的数据读取器问题
【发布时间】:2018-09-01 03:25:34
【问题描述】:

我从下面的 Ruslan 帖子中获取了参考,并实现了相同的操作并按预期工作,但有时,我面临一个问题,例如“在处理字段 ItemRequiresTerms 期间发生错误:已经有一个打开的 DataReader 与此命令关联,必须是先关门。”

How to show images inside selector lookup?

一个库存项目可能有多个图像,我们只需要图标图像。 下面是代码。

public void InventoryItemRowSelecting(PXCache sender, PXRowSelectingEventArgs e)
    {
        var row = e.Row as InventoryItem;
        if (row != null)
        {
            if (!string.IsNullOrEmpty(row.ImageUrl))
            {
                foreach (NoteDoc noteDoc in PXSelectReadonly<NoteDoc, Where<NoteDoc.noteID, Equal<Required<NoteDoc.noteID>>>>.Select(Base, row.NoteID)) // here i got error
                {
                    foreach (UploadFile uploadFile in PXSelectReadonly<UploadFile, Where<UploadFile.fileID, Equal<Required<UploadFile.fileID>>>>.Select(Base, noteDoc.FileID))
                    {
                        if (uploadFile.Name.Contains("icon"))
                        {
                            row.ImageUrl =
                            ControlHelper.GetAttachedFileUrl(null, uploadFile.FileID.ToString());
                            break;
                        }
                    }
                }
            }
        }
    }

【问题讨论】:

    标签: c# acumatica


    【解决方案1】:

    您需要使用单独的连接范围在 RowSelecting 事件处理程序中执行额外的 BQL 语句。

    更多详情请见here

    您可以通过使用正确的 Join 来避免嵌套 for 循环,

    public void InventoryItemRowSelecting(PXCache sender, PXRowSelectingEventArgs e)
    {
        var row = e.Row as InventoryItem;
        if (row != null)
        {
            if (!string.IsNullOrEmpty(row.ImageUrl))
            {
                using (new PXConnectionScope())
                {
                    UploadFile uploadFile = PXSelectReadonly2<UploadFile, InnerJoin<NoteDoc, On<NoteDoc.fileID, Equal<UploadFile.fileID>>>,
                                                    Where<NoteDoc.noteID, Equal<Required<NoteDoc.noteID>>,
                                                    And<UploadFile.name, Like<Required<UploadFile.name>>>>>.
                                                    Select(Base, row.NoteID, "%icon%");
                    row.ImageUrl = (uploadFile != null) ? ControlHelper.GetAttachedFileUrl(null, uploadFile.FileID.ToString()) 
                                                            : null;
                }
            }
        }
    }
    

    【讨论】:

    • 非常感谢,DChhapgar。
    【解决方案2】:

    这里已经是一个公认的答案,但我想向您展示您在示例代码中使用的深度缩进结构的替代方案。

    public void InventoryItemRowSelecting(PXCache sender, PXRowSelectingEventArgs e)
    {
        var row = e.Row as InventoryItem;
        if (row == null)
            return;  // Don't proceed when row doesn't exist
    
        if (string.IsNullOrEmpty(row.ImageUrl))
            return; // Don't proceed when ImageUrl doesn't exist
    
        foreach (NoteDoc noteDoc in PXSelectReadonly<NoteDoc, Where<NoteDoc.noteID, Equal<Required<NoteDoc.noteID>>>>.Select(Base, row.NoteID)) // here i got error
        {
            foreach (UploadFile uploadFile in PXSelectReadonly<UploadFile, Where<UploadFile.fileID, Equal<Required<UploadFile.fileID>>>>.Select(Base, noteDoc.FileID))
            {
                if (!uploadFile.Name.Contains("icon"))
                    continue;  // Skip non-icon files
    
                row.ImageUrl = ControlHelper.GetAttachedFileUrl(null, uploadFile.FileID.ToString());
            }
        }
    }
    

    请注意您如何使用更多代码页,而不是将所有内容都推到右侧。这是您的原始示例,因此它没有已接受的答案中的修复,我只是想向您展示一种可能的替代模式以供将来考虑。

    当您将其应用于公认的解决方案时,这也是一个巨大的变化:

    public void InventoryItemRowSelecting(PXCache sender, PXRowSelectingEventArgs e)
    {
        var row = e.Row as InventoryItem;
        if (row == null)
            return;  // Don't proceed when row doesn't exist
    
        if (string.IsNullOrEmpty(row.ImageUrl))
            return; // Don't proceed when ImageUrl doesn't exist
    
        using (new PXConnectionScope())
        {
            UploadFile uploadFile = PXSelectReadonly2<UploadFile, InnerJoin<NoteDoc, On<NoteDoc.fileID, Equal<UploadFile.fileID>>>,
                                        Where<NoteDoc.noteID, Equal<Required<NoteDoc.noteID>>,
                                        And<UploadFile.name, Like<Required<UploadFile.name>>>>>.
                                        Select(Base, row.NoteID, "%icon%");
            if (uploadFile == null)
                continue; // Skip non-icon files         
    
            row.ImageUrl = ControlHelper.GetAttachedFileUrl(null, uploadFile.FileID.ToString()); 
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 2020-07-10
      • 2016-09-21
      相关资源
      最近更新 更多