数据读取器问题与选择器内的图像

问题描述 投票:1回答:2

我从下面的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
2个回答
4
投票

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

更多细节可以在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;
            }
        }
    }
}

-1
投票

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

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()); 
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.