exeQuery

该博客展示了Java代码,包含数据库连接、SQL查询执行、异常处理等操作。定义了exeQuery类,有Query、arrayQuery、arrayTable等方法用于执行SQL语句,还有split、AddBr等方法处理字符串,最后在main方法中进行测试。

package zpxx;
import java.sql.*;
import java.util.*;
import java.io.*;
import zpxx.*;

public class exeQuery{
 public boolean Query(String strSQL) throws SQLException{
  Connection conn = null;
  DBConnectionManager connMgr = DBConnectionManager.getInstance();
  conn = connMgr.getConnection("zpxx");
  Statement stmt = null;
  try{
   stmt = conn.createStatement();
   strGBK toGBK = new strGBK();
   stmt.executeUpdate(toGBK.isoTOgbk(strSQL));
   //stmt.executeUpdate(strSQL);
   stmt.close();
   connMgr.freeConnection("zpxx",conn);
   connMgr.release();
  }
  catch(Exception e){
   stmt.close();
   connMgr.freeConnection("zpxx",conn);
   connMgr.release();
   return false;
  }
  return true;
 }
 public boolean arrayQuery(String[] strSQL) throws SQLException{
  Connection conn = null;
  DBConnectionManager connMgr = DBConnectionManager.getInstance();
  conn = connMgr.getConnection("zpxx");
  Statement stmt = null;
  try{
   stmt = conn.createStatement();
   strGBK toGBK = new strGBK();
   conn.setAutoCommit(false);
   for(int iStart = 0;iStart < strSQL.length;iStart++)
    stmt.executeUpdate(toGBK.isoTOgbk(strSQL[iStart]));
   conn.commit();
   stmt.close();
   connMgr.freeConnection("zpxx",conn);
   connMgr.release();
  }
  catch(Exception e){
   conn.rollback();
   stmt.close();
   connMgr.freeConnection("zpxx",conn);
   connMgr.release();   
   return false;
  }
  return true;
 }
 public String[][] arrayTable(String strSQL) throws SQLException{
  String[][] rString;
  int iCount = 0;
  Connection conn = null;
  DBConnectionManager connMgr = DBConnectionManager.getInstance();
  conn = connMgr.getConnection("zpxx");
  Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
  ResultSet rs = stmt.executeQuery(strSQL);
  ResultSetMetaData rColNum = rs.getMetaData();
  if(rs.last())
   iCount = rs.getRow();
  //System.out.println("i= " + iCount + "    r=" + rColNum.getColumnCount());
  rString = new String[iCount][rColNum.getColumnCount()];
  rs.beforeFirst();
  int iRow = 0;
  int iCol = 0;
  while(rs.next()){
   for(iCol = 0;iCol < rColNum.getColumnCount();iCol++)
    rString[iRow][iCol] = rs.getString(iCol + 1);
   iRow++;
  }
  rs.close();
  stmt.close();
  connMgr.freeConnection("zpxx",conn);
  connMgr.release();
  return rString;
 }
 
    public static String[] split(String s, String separator)
    {
        if(s == null)
            throw new NullPointerException("source String cannot be null");
        if(separator == null)
            throw new NullPointerException("separator cannot be null");
        if(separator.length() == 0)
            throw new IllegalArgumentException("separator cannot be empty");

        ArrayList buffer = new ArrayList();
       
        int start = 0;
        int end = s.indexOf(separator);
        while(end != -1)
        {
            buffer.add(s.substring(start, end));
            start = end + separator.length();
            end = s.indexOf(separator, start);
        }
        buffer.add(s.substring(start, s.length()));

        return (String[]) buffer.toArray(new String[0]);
    }
   
  /*
    public String rce(String parentStr,String ch,String rep)
 {
 int i = parentStr.indexOf(ch);
 StringBuffer sb = new StringBuffer();
 if (i == -1){
  return parentStr;
 }
  sb.append(parentStr.substring(0,i) + rep);
 if (i+ch.length() < parentStr.length()) {
 sb.append(rce(parentStr.substring(i+ch.length(),parentStr.length()),ch,rep));
 }
 return sb.toString();
 }
*/
 public String AddBr(String Content)
 {
   if (Content == null) return "";
     //String makeContent=new String();
     //StringTokenizer strToken=new StringTokenizer(Content,"/n");
     //while(strToken.hasMoreTokens())
     //{
        // makeContent=makeContent+"<br>"+strToken.nextToken();
     //}

  char[] cc=Content.toCharArray();
  String bb="";
  for(int i=0;i<cc.length;i++)
  {
   System.out.println(Character.digit(cc[i],16));
   if(Character.isSpaceChar(cc[i]))
   {
    bb+="&nbsp;";
   }
   else if(cc[i]=='/r' && i<cc.length-1 && cc[i+1]=='/n')
   {
    bb+="<br>";
   }
   else
   {
    bb+=cc[i];
   }
  }
   return bb;
   }
   
 

    public static void main(String args[]){
     exeQuery eQry1 = new exeQuery();
 // String[] result = eQry1.split("a.gif", ".");
 // for(int i=0;i<result.length;i++){
 // System.out.println(result[i]);
     String sql="select * from project1";
  String[][] rs1=eQry1.arrayTable(sql);  
  for(int i=0;i<rs1.length;i++){
   System.out.println(rs1[i][1]);
  }
  
 }


}

<think>我们正在讨论通达OA中使用触发器为字段赋值的问题。根据用户提供的引用[1],我们看到一个在通达OA触发器中使用SQL更新语句的示例。这个示例中,触发器执行了一条SQL更新语句,将flow_run_prcs表中的USER_ID字段更新为user表中对应的USER_NAME。用户的需求是了解如何在通达OA中使用触发器为字段赋值,因此我们需要解释触发器的使用并提供一个示例。在通达OA中,触发器通常用于在工作流处理过程中自动执行某些操作,例如在流程到达某个步骤时更新字段值。触发器可以编写SQL语句或调用存储过程来实现对数据库的操作。根据引用[1]中的示例,我们可以总结出以下步骤:1.在触发器中编写SQL语句,使用update语句更新表中的字段。2.注意在SQL语句中可以使用流程相关的变量,如$RUN_ID(流程运行ID)等。3.使用exequery函数执行SQL语句。但是,引用[1]中也提到,同样的语句在查询分析器中执行正常,但在触发器中执行可能会遇到问题。因此,我们需要注意触发器执行的上下文环境,比如数据库连接、变量作用域等。另外,参考引用[2](泛微OA的示例),我们看到它使用了doFieldSQL函数来执行SQL语句并给字段赋值。虽然这是泛微OA的示例,但我们可以借鉴其思路,即在OA系统中执行SQL赋值语句通常有特定的函数或方式。在通达OA中,我们通常使用exequery函数来执行SQL语句。该函数有两个参数:数据库连接和SQL语句。因此,我们可以这样构建一个触发器中的字段赋值示例:假设我们有一个需求:当流程到达某个步骤时,将当前处理人的姓名更新到某个字段(例如,表formtable_main_1中的字段field1)。步骤:1.在流程设计器中,为相应步骤设置触发器。2.在触发器中编写SQL语句,使用update语句更新目标表的目标字段。3.使用流程变量(如$RUN_ID)来定位当前流程实例。示例触发器代码(PHP,因为通达OA触发器通常用PHP编写):```php//假设当前流程运行ID为$RUN_ID,我们可以直接使用这个变量//首先,我们可能需要获取当前步骤的处理人(假设为当前处理人,实际可能需要根据具体逻辑获取)//注意:在通达OA中,当前处理人信息可能在flow_run_prcs表中,而且一个步骤可能有多个处理人,这里我们取第一个处理人为例//编写SQL语句,更新目标表(假设为formtable_main_1)的字段field1$sql="UPDATEformtable_main_1SETfield1=(SELECTUSER_NAMEFROMuserWHEREUSER_ID=(SELECTUSER_IDFROMflow_run_prcsWHERErun_id=$RUN_IDANDprcs_id=$PRCS_IDORDERBYPRCS_IDDESCLIMIT1))WHERErequestId=$REQUEST_ID";//注意:这里$PRCS_ID和$REQUEST_ID也是流程变量,通常触发器上下文中可用//执行SQL$cursor=exequery(TD::conn(),$sql);```注意:-上述示例中的变量$RUN_ID,$PRCS_ID,$REQUEST_ID需要在触发器上下文中存在。通达OA在触发器执行时会提供这些流程相关的变量。-实际表名和字段名需要根据具体表单设计而定。-如果更新语句比较复杂,建议先在数据库查询分析器中测试,确保SQL正确。用户可能遇到的问题:1.触发器中的SQL语句执行权限问题:确保OA数据库用户有执行更新操作的权限。2.变量作用域问题:确保使用的变量(如$RUN_ID)在触发器执行时是存在的。3.多处理人问题:上面的示例只取了一个处理人,如果有多人处理,需要根据业务需求调整。另外,根据引用[1]中的示例,他们更新的是flow_run_prcs表中的字段,而我们这里更新的是业务表单(formtable_main_1)中的字段。所以,需要根据实际要更新的表来写SQL。如果用户需要更具体的示例,我们可以根据一个场景来设计。例如,假设有一个请假流程,当流程到达部门经理审批步骤时,将部门经理的姓名更新到表单的“部门经理意见”字段(假设字段名为dept_manager_opinion,存储意见的表中有一个字段dept_manager_name用于存储姓名)。触发器代码示例:```php//在部门经理审批步骤的触发器(例如:步骤办理前或办理后触发)//假设部门经理审批步骤的prcs_id为2if($PRCS_ID==2){//获取当前处理人的姓名$sql="SELECTUSER_NAMEFROMuserWHEREUSER_ID=(SELECTUSER_IDFROMflow_run_prcsWHERErun_id=$RUN_IDANDprcs_id=$PRCS_IDANDOP_FLAG=0ORDERBYPRCS_IDDESCLIMIT1)";//注意:这里我们假设取当前步骤最新的一条处理记录(OP_FLAG=0表示未处理?实际根据业务情况调整,通达OA中可能用不同的标志)//执行查询$cursor=exequery(TD::conn(),$sql);if($row=mysql_fetch_array($cursor)){$user_name=$row['USER_NAME'];//更新业务表,假设业务表是formtable_main_10,并且有字段dept_manager_name,通过requestId关联$update_sql="UPDATEformtable_main_10SETdept_manager_name='".$user_name."'WHERErequestId=$REQUEST_ID";$cursor_update=exequery(TD::conn(),$update_sql);}}```注意:上面的示例中使用了mysql_fetch_array,但通达OA使用的数据库可能是MySQL,也可能是SQLServer,因此需要根据实际情况调整数据库操作函数。通达OA通常封装了数据库操作,但触发器中的PHP代码可以直接使用数据库扩展函数(如mysql_*或mysqli_*),具体取决于OA版本和配置。另外,在SQL字符串拼接时,要注意防止SQL注入。在OA内部流程中,由于变量是系统生成的(如$RUN_ID,$REQUEST_ID等整数),所以相对安全,但如果使用用户输入的数据,则需要进行过滤。最后,我们提供几个相关问题供用户参考。</think>### 通达OA触发器字段赋值使用方法 在通达OA中,触发器主要用于在工作流执行过程中自动执行特定操作。为字段赋值的核心是通过SQL语句更新数据库表,主要涉及以下关键点: #### 核心实现步骤 1. **获取流程标识** 在触发器中使用系统预定义变量获取流程实例标识: - `$RUN_ID`:当前流程运行ID - `$REQUEST_ID`:流程请求ID - `$PRCS_ID`:当前步骤ID 2. **构建更新语句** 使用标准SQL的`UPDATE`语句修改目标表字段值,语法示例: ```sql UPDATE 目标表 SET 字段名=新值 WHERE 流程标识条件 ``` 3. **执行SQL语句** 通过`exequery()`函数执行SQL命令: ```php $cursor = exequery(TD::conn(), $sql); ``` #### 完整示例 假设需在流程步骤触发时将当前处理人姓名更新到`formtable_main_25`表的`approver`字段: ```php // 获取当前步骤处理人姓名 $query = "SELECT USER_NAME FROM user WHERE USER_ID = ( SELECT USER_ID FROM flow_run_prcs WHERE run_id = $RUN_ID AND prcs_id = $PRCS_ID LIMIT 1 )"; $cursor = exequery(TD::conn(), $query); if($row = mysql_fetch_array($cursor)) { $user_name = $row['USER_NAME']; // 更新业务表字段 $update_sql = "UPDATE formtable_main_25 SET approver = '$user_name' WHERE requestId = $REQUEST_ID"; $update_cursor = exequery(TD::conn(), $update_sql); } ``` #### 注意事项 1. **表名规范** 业务表单表名遵循 `formtable_main_<表单ID>` 格式,可通过设计器查看 2. **字段引用** 在SQL中引用表单字段时: - 直接使用字段名(如`approver`) - 若需引用其他字段值,使用 `$main.字段名$` 语法(参考引用[2]) 3. **调试建议** 先在数据库查询分析器中测试SQL语句,确认无误后再写入触发器 4. **执行时机** 根据需求选择触发器执行位置: - 步骤办理前:字段预填充 - 步骤办理后:记录最终结果 > 关键参考:通达OA触发器通过`exequery()`执行SQL更新语句实现字段赋值,需正确使用流程变量`$RUN_ID`, `$REQUEST_ID`等标识当前流程实例[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值