Главная > OA Framework > OAF-компоненты. Attachments


OAF-компоненты. Attachments

1. Динамическое создание компонента attachmentTable

import oracle.apps.fnd.framework.webui.beans.layout.OAAttachmentTableBean;
import oracle.apps.fnd.framework.webui.OAWebBeanConstants;
import java.util.Hashtable;
import java.util.Dictionary;
...
OAAttachmentTableBean attTable = (OAAttachmentTableBean)pageContext.getWebBeanFactory().createWebBean(pageContext, OAWebBeanConstants.ATTACHMENT_TABLE_BEAN, null, null);

attTable.setID("xxTestAttachmentId");
attTable.setViewUsageName("ApplicantAssignmentVO");
attTable.setSearchRegionDisplayed(false);
attTable.setDocumentCatalogEnabled(true);

attTable.setText("Сводка дополнений");

Hashtable<String, Object> entity = new Hashtable<String, Object>();
entity.put("entityId", "PER_ASSIGNMENTS_F"); // entity
entity.put("showAll", Boolean.FALSE);
entity.put("insertAllowed", Boolean.TRUE);
entity.put("deleteAllowed", Boolean.TRUE);
entity.put("updateAllowed", Boolean.TRUE);

String[] pkAttrNames = new String[1];
pkAttrNames[0] = "AssignmentId";
entity.put("pkColumns", pkAttrNames);

Dictionary[] entityMaps = new Dictionary[1];
entityMaps[0] = entity;
attTable.setEntityMappings(entityMaps);

webBean.addIndexedChild(attTable);

https://community.oracle.com/thread/2249676
https://community.oracle.com/thread/2404025

2. Не появляются всплывающие popup-ы (Inline Attachments)

В некоторых невыясненных ситуациях, при добавлении компонента attachmentTable на стандартную форму динамически или через персонализацию, не работают popup-ы для просмотра/добавления/редактирования/удаления вложений (Inline Attachments). Было обнаружено, как минимум, 2 условия, которые влияют на эту ситуацию (полный список условий выяснить не удалось):

  • Страница открывается 1-й раз
  • У компонента attachmentTable отключен регион поиска (searchRegionRendered="false")

Для устранения этого неудобства удалось найти workaround. Нужно добавить в контроллер (processRequest) следующий код:

// Тут важен процесс создания компонента, оказывающий положительное влияние на popup-ы, если они не хотят всплывать.
// На форме компонент показывать не нужно.
OAMessageChoiceBean akAttachmentCategory = (OAMessageChoiceBean)createWebBean(pageContext, "MESSAGE_POPLIST", null, "XxTmp");
akAttachmentCategory.setPickListViewObjectDefinitionName("oracle.apps.fnd.server.FndCategoryNameVO");
akAttachmentCategory.setValue(pageContext, "1");

3. Изменения в модели данных
Если форма работает с вложениями (attachmentLink, attachmentTable), то в модели данных происходят следующие динамические изменения:

  • Добавляется дочерний Application Module с именем oracle_apps_fnd_server_OAAttachmentsAM
  • В этом AM, для каждого компонента, работающего с вложениями, создается набор ViewObject-ов. Наиболее интересные — VO, связанные с таблицами fnd_documents и fnd_attached_documents. Именуются они по шаблону Attach_<num>_FndDocumentsDomExtensionVO и Attach_<num>_FndAttachedDocumentsDomExtensionVO. Например, Attach_0_FndAttachedDocumentsDomExtensionVO.

Перед проходом по строкам VO, нужно обязательно проверить, что заданы bind-переменные. Это наиболее вероятная ситуация, но попадались случаи, когда для объекта нет привязанных вложений, и bind-переменные в Attach…VO были не установлены. Попытка сделать проход по строкам VO, в такой ситуации, приведет к тому, что SQL-запрос вернет данные из таблиц без фильтра (например, все записи из fnd_attached_documents). Cтраница зависнет, а потом упадет по timeout-у.
Пример кода.

OAApplicationModule am = pageContext.getApplicationModule(webBean);
// Опорные имена, по которым ищем AM и VO с вложениями
String attachmentsAMName = "oracle_apps_fnd_server_OAAttachmentsAM";
String attachDocsVOFlag = "FndAttachedDocumentsDomExtensionVO";
String docsVOFlag = "FndDocumentsDomExtensionVO";
// Application Module, в котором содержатся ViewObject-ы, имеющие отношения к вложениям (attachemnts)
OAApplicationModule amA = (OAApplicationModule)am.findApplicationModule(attachmentsAMName);
if (amA != null) {
    writeDiag(pageContext, "AM = " + amA.getDefFullName());
    String[] voNames = amA.getViewObjectNames();
    writeDiag(pageContext, "viewobjectNames Length = " + voNames.length);
    for (int j = 0; j < voNames.length; j++) {
        // Обрабатываем ViewObject-ы (их может быть несколько - свой для каждого претендентства), в которых находятся данные по fnd_attached_documents if (voNames[j].lastIndexOf(attachDocsVOFlag) > 0)
        if (voNames[j].lastIndexOf(attachDocsVOFlag) > 0) {
            String voDName = voNames[j].substring(0, voNames[j].indexOf("_", 8) + 1) + docsVOFlag; // "Attach__"
            writeDiag(pageContext, "     AttachedDocuments ViewObject Name = " + voNames[j]);
            writeDiag(pageContext, "     Documents ViewObject Name = " + voDName);
            
            OAViewObject voA = (OAViewObject)amA.findViewObject(voNames[j]);
            // ОБЯЗАТЕЛЬНО!!! Проверяем, чтобы были заданы bind-переменные.
            if (voA.getWhereClauseParams().length > 1) {
                Object[] params = voA.getWhereClauseParams();
                for(int p = 0; p < params.length; p++)
                    writeDiag(pageContext, "params[" + p + "] = " + params[p].toString());
                for (Row rowA = voA.first(); rowA != null; rowA = voA.next()) {
                    writeDiag(pageContext, "DocumentId = " + rowA.getAttribute("DocumentId"));
                    writeDiag(pageContext, "LastUpdateDate = " + rowA.getAttribute("LastUpdateDate"));
                    writeDiag(pageContext, "newRowState = " + ((ViewRowImpl)rowA).getNewRowState());
                }
            }
        }
    }
}

Похожие записи:

  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.