壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3748|回复: 21

[OAF] OAF 保存删除问题?

  [复制链接]
发表于 2010/8/27 16:23:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
123.JPG

如图:

上面REGION VO1 基于EO
下面REGION VO2 没有基于EO
"CLEAR LINE ITEM DETAISL" 清楚页面的ITEM 值
"ADD Line item to shipping request" button  USER 要求点击后逻辑如下
1) SAVE 记录到TABLE A
2) 查询当前输入记录A 并且显示在REGION VO2.
3) 调用CREATE-ROW() 意思是可以在上面REGION 继续输入 继续增加记录,
如此反复1.2.3

现在的问题是,
问题1) 比方我增加了2条记录我想执行删除动作, 然后点图片右下角的DETLETE, 由于最后执行了CREATE-ROW() ,导致当我点DELETE 的时候SAVE 了一条空的记录 到 TABLE A -------------> 能控制不让插入改记录吗?
问题2) 一旦删除了记录之后就不可以再次在REGION VO1 上添加记录了 --------->当点DETILET 时候能否保留CREATE-ROW() ,以至于可以再次增加记录..

谢谢了..
123.JPG
发表于 2010/8/27 17:01:37 | 显示全部楼层
可以这么做
1、创建一个新的VO3,让它基于EO
2、点击delete按钮的时候,得到要删除的行的key
3、把key输入到VO3中,找到相应记录后,直接调用delete()方法
这样做通过VO3,把你前台的数据与后台的操作分离了。
 楼主| 发表于 2010/8/30 12:56:40 | 显示全部楼层
本帖最后由 tchen 于 2010/8/30 13:04 编辑

谢谢 sumury 指点..
1) 把key输入到VO3中,找到相应记录后,直接调用delete()方法----------->意思是在AM 中建立基于VO3的DELETE 方法(和HELP 文档中DELETE 方法一样),然后在PROCESSFORMQUEST 调用.

2)另外在我的LINE中还有一个" UPDATE" BUTTON, 点UPDATE 之后打 UPDATE 页面,更新完成之后回到页面的时候遇到和DELETE 几乎同样的问题. SAVE 一条到数据库同时清空上半部分REGION初始化了页面.


发表于 2010/8/30 13:22:41 | 显示全部楼层
代码贴出来看
 楼主| 发表于 2010/8/30 13:36:14 | 显示全部楼层
这个是我当前DETAIL 页面的代码
public void processRequest(OAPageContext pageContext, OAWebBean webBean)
  {
    super.processRequest(pageContext, webBean);
    OAApplicationModule am = pageContext.getApplicationModule(webBean);
    if (!pageContext.isFormSubmission())
    {
   //   OAApplicationModule am = pageContext.getApplicationModule(webBean);
      am.invokeMethod("createheaderline",null);
    }

   OATableBean table = (OATableBean)webBean.findIndexedChildRecursive("SummaryQueryResult");
  // OATableBean table = (OATableBean)webBean;
   table.prepareForRendering(pageContext);
   DataObjectList columnFormats = table.getColumnFormats();
   DictionaryData columnFormat = null;
   int childIndex = pageContext.findChildIndex(table, "DeleteFlag");
   columnFormat =(DictionaryData)columnFormats.getItem(childIndex);
   columnFormat.put(COLUMN_DATA_FORMAT_KEY, ICON_BUTTON_FORMAT);


////pass item value from master page to detail page//start
    String strParamA = (String)pageContext.getTransactionTransientValue(PARAM_A);
    if (strParamA != null && !"".equals(strParamA.trim()))
    {
      pageContext.removeTransactionTransientValue(PARAM_A);
      try
      {
        ((OAMessageTextInputBean)webBean.findChildRecursive(PARAM_A)).setValue(pageContext, strParamA);
      }
      catch (OAException oe)
      {
      }
    }
////pass item value from master page to detail page//end

   
  if (TransactionUnitHelper.isTransactionUnitInProgress(pageContext, "lineCreateTxn", false))
   {
   am.invokeMethod("rollbackEmployee");
   TransactionUnitHelper.endTransactionUnit(pageContext, "lineCreateTxn");
   }
   else if (TransactionUnitHelper.isTransactionUnitInProgress(pageContext, "lineUpdateTxn", false))
   {  
   am.invokeMethod("rollbackEmployee");
   TransactionUnitHelper.endTransactionUnit(pageContext, "lineUpdateTxn");
   }


  }

  /**
   * Procedure to handle form submissions for form elements in
   * a region.
   * @param pageContext the current OA page context
   * @param webBean the web bean corresponding to the region
   */
  public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)
  {
    super.processFormRequest(pageContext, webBean);
    OAApplicationModule am = pageContext.getApplicationModule(webBean);
  if (pageContext.getParameter("Addline") != null)
  {
  //Get sequence id start
    OAViewObject vo1= (OAViewObject)am.findViewObject("CreateSummaryLineVO1");
    OADBTransaction transaction = (OADBTransaction)am.getOADBTransaction();
    Number ShipLinId = transaction.getSequenceValue("SEAMSA_MSA_SHIP_LINES_S");
    vo1.getCurrentRow().setAttribute("ShipLineId",ShipLinId);
  //Get sequence id end  

  //commit data to db
    am.invokeMethod("addline");
   
    String id = pageContext.getParameter("ShipHeaderId");
      if(id != null && !"".equals(id))
      {
        pageContext.putTransactionTransientValue("ShipHeaderId", id);
      }
     else
      {
      id = (String)pageContext.getTransactionTransientValue("ShipHeaderId");
      }
      Serializable[] parameters = { id };
      am.invokeMethod("initQueryDetails", parameters);
      
  OAViewObject avo= (OAViewObject)am.findViewObject("CreateSummaryLineVO1");
   String s = (String)avo.getCurrentRow().getAttribute("CreditAccountNumber");

   am.invokeMethod("createheaderline",null);
   
   avo.getCurrentRow().setAttribute("CreditAccountNumber",s);
  
  }
  
   
if ("delete".equals(pageContext.getParameter("event")))
  {
   String lineNumber = pageContext.getParameter("lineNum");
   Serializable[] parameters = {lineNumber};;
   am.invokeMethod("DeleteLineId",parameters);
   
  }

   if ("update".equals(pageContext.getParameter("event")))
   {
      pageContext.setForwardURL("OA.jsp?page=/seagate/oracle/apps/seaoe/msa/webui/MsaUpdateLinePG",
                                                         null,
                                                         OAWebBeanConstants.KEEP_MENU_CONTEXT,
                                                         null,
                                                         null,
                                                         true, // Retain AM
                                                         OAWebBeanConstants.ADD_BREAD_CRUMB_NO,
                                                         OAWebBeanConstants.IGNORE_MESSAGES);

   }

  
}
 楼主| 发表于 2010/8/30 13:38:16 | 显示全部楼层
这个是LINE UPDATE 页面代码:
public void processRequest(OAPageContext pageContext, OAWebBean webBean)
  {
    super.processRequest(pageContext, webBean);
     TransactionUnitHelper.startTransactionUnit(pageContext, "lineUpdateTxn");
     String updateNum = pageContext.getParameter("updateNum");
     Serializable[] params = { updateNum };
     OAApplicationModule am = pageContext.getApplicationModule(webBean);
     am.invokeMethod("updateQueryDetails", params);
  }

  /**
   * Procedure to handle form submissions for form elements in
   * a region.
   * @param pageContext the current OA page context
   * @param webBean the web bean corresponding to the region
   */
  public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)
  {
    super.processFormRequest(pageContext, webBean);
    OAApplicationModule am = pageContext.getApplicationModule(webBean);
   if (pageContext.getParameter("Apply") != null)
   {
     am.invokeMethod("applylineUpdate", null);
     pageContext.forwardImmediately("OA.jsp?page=/seagate/oracle/apps/seaoe/msa/webui/MsaShipCreateLinePG",
                                      null,
                                      OAWebBeanConstants.KEEP_MENU_CONTEXT,
                                      null,
                                      null,
                                      true, // retain AM
                                      OAWebBeanConstants.ADD_BREAD_CRUMB_NO);
     
   }
   
   
}
发表于 2010/8/30 13:53:11 | 显示全部楼层
重载EO中的doDML方法
public void doDML(int operation, TransactionEvent e)
{
  if (<“某个必输字段”> != null)//除了Sequence以外的字段
  {
    super.doDML(operation, e);
  }
}
 楼主| 发表于 2010/8/30 14:41:13 | 显示全部楼层
关于DELETE 的问题, 我直接在JAVA 中写PL/SQL 删除代码,刚刚试了下好像没问题.
谢谢您提供的代码,
能否解释下 怎么调用. 是可以解决LINE UPDATE 问题吗?

发表于 2010/8/30 15:05:08 | 显示全部楼层
本帖最后由 sumury 于 2010/8/30 15:06 编辑

“JAVA 中写PL/SQL 删除代码,”那么就是没有用到EO?

还是用到的是PLSQLEO?

以上提供的代码不需要,显示调用,OAF框架会自动调用的,前提是EO是普通EO。

因为update和delete都是DML操作,所以,都可以解决。

无需修改代码,不需要调用PLSQL程序。
 楼主| 发表于 2010/8/30 15:15:13 | 显示全部楼层
谢谢!!
我的DETIAL 页面下半部分REGION VO2 是没有基于EO 的,
但是我的UPDATE 页面是基于EO 的.
你的意思是直接放下面的代码在DETAIL 页面的EO 中.
public void doDML(int operation, TransactionEvent e)
{
  if (<“某个必输字段”> != null)//除了Sequence以外的字段
  {
    super.doDML(operation, e);
  }
}

如果这样能解决的话,  我会把VO2 改为基于EO.

发表于 2010/8/30 15:21:09 | 显示全部楼层
不是VO3,是基于EO的嘛。

程序不要改动的。
 楼主| 发表于 2010/8/30 15:30:52 | 显示全部楼层
本帖最后由 tchen 于 2010/8/30 15:38 编辑

不好意思, 我太菜了..
VO3 是基于EO 的, 我已经建了一个VO3, 因为对下面的有些模糊, 所以没用. 等会试试. ..
把key输入到VO3中,找到相应记录后,直接调用delete()方法----------->意思是在 AM 中建立基于VO3的DELETE 方法(和HELP 文档中DELETE 方法一样),然后在PROCESSFORMQUEST 调用??
发表于 2010/8/30 15:39:20 | 显示全部楼层
VO2不基于EO,但表示页面上的数据,
VO3基于EO,不表示页面上的数据,用于删除DB中的数据。
processFormRequest()
{
  得到VO2中需要删除的行。
  for (循环这些行)
  {
    得到每一行中的key。
    把这个key值,放到VO3中查询。
    删除VO3中查到的行。(VO3.getCurrentRow().delete())
    删除VO2中当前行。(VO2.getCurrentRow().delete())
  }
}
发表于 2010/8/30 15:40:51 | 显示全部楼层
或者,不用VO3,如果VO2是基于EO的
那么
processFormRequest()
{
  得到VO2中需要删除的行。
  for (循环这些行)
  {
    删除VO2中当前行。(VO2.getCurrentRow().delete())
  }
}
 楼主| 发表于 2010/8/30 16:50:45 | 显示全部楼层
谢谢您的耐心指导.
那 LINE UPDATE 呢,现有一个基于EO 的VO  for Line Update. 操作会不会有点不一样?
-----------------
另外在我的LINE中还有一个" UPDATE" BUTTON, 点UPDATE 之后打 UPDATE 页面,更新完成之后回到页面的时候遇到和DELETE 几乎同样的问题. SAVE 一条到数据库同时清空上半部分REGION初始化了页面.
发表于 2010/8/30 17:03:26 | 显示全部楼层
本帖最后由 sumury 于 2010/8/30 17:05 编辑

EO是公用的,无需再做任何处理了。

和delete页面处理一样,处理仿照着做,不就可以了吗。
发表于 2010/8/31 09:11:07 | 显示全部楼层
还想到一种做法:

你的create页面和update页面的上面,都有一个可以输入的区域

所以必须要创建新行,

但是对于没有输入任何数据的时候,这个新行又不需要插入数据库。

综上,可以将这个区域绑定一个不基于EO的VO_A,并再创建一个基于EO的VO_B用于后台将数据插入DB中

页面初始化的时候在VO_A中创建一个新行,当发现页面上填写了数据的时候,

在VO_B中再创建一个新行,将VO_A中的数据复制到VO_B中,

若是页面上没有填写新数据,则不做复制动作,即可。
 楼主| 发表于 2010/8/31 13:13:06 | 显示全部楼层
本帖最后由 tchen 于 2010/8/31 13:29 编辑

非常感谢! 先试试你的方法..基本上我明白您的意思, 要通过另外一个VO_B 来实现并且这个VO_B 的数据不要显示在页面上. 把VO_A 数据(假如这是一个UPDATE页面)拷贝到VO_B, 然后做后台INSERT. 是这样吗? 您的后台INSERT, 是直接 JAVA 中写PL/SQL INSERT 句子吗,还是?
发表于 2010/8/31 13:57:33 | 显示全部楼层
1、如果VO是关联EO的,那么在vo中调用createRow方法后,commit的时候,
框架会自动调用到EO的insert方法。(在EO中不需要你编写任何代码)

2、如果你的VO不关联EO,那么,需要在AM或CO中,(通常是在AM中)调用用Rosetta封装好的PLSQL的API。但是这种方法不正规。

3、正规的做法是VO关联EO,而这个EO继承的是OAPlsqlEntityImpl ,然后重载insert方法,在里面去调用用Rosetta封装好的PLSQL的API。

其中1和3都是正规的做法,2的方法不正规,但是也不是绝对不能用。(通常是不用的,但有例外)
 楼主| 发表于 2010/8/31 15:50:37 | 显示全部楼层
谢谢,刚开会回来,
刚刚我说错了, 对于UPDATE页面来讲的话, 应该是VO_A (VO_A 不是基于EO, UPDATE 页面基于这个VO)拷贝到VO_B (基于EO)然后做UPDATE, 而不是做INSERT 如果是做UPDATE的话, 不应该是在VO_B 中CREATE_ROW()对吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 07:36 , Processed in 0.023346 second(s), 15 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表