外部调用 AX 的表方法 类方法
外部使用存储过程,或是SQL语句最多只能进行查询和删除的动作,不能增加和修改。
因为AX,每一行都有一个Recid字段,是系统生成的,为了标识系统唯一行数据。
通过BC连接来访问AX,调用AX的类,调用Job,使用AX的表,进行增,删,改,查。使用表的方法,Display等。
引用Microsoft.Dynamics.BusinessConnectorNet,使用域票据,来访问AX。
这新的一年共享一个,我瞎写的AXHelper,愿与君共勉。
/* ************************************************* Copyright(c) Kurodo ** CLR : 3.5** FileName : AXHelper.cs** Author : Kurodo** CreatTime : 2011/11/29 15:28:43* ************************************************ */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Windows.Forms; using Microsoft.Dynamics.BusinessConnectorNet; namespace AXLibrary { public class AXHelper { /// <summary> /// Create Method /// </summary> /// <param name="tableName"> 表名 </param> /// <param name="dict"> 字段值字典 </param> public static Boolean Create(String tableName, IDictionary<String, Object> dict) { Boolean ret = false; Axapta ax = new Axapta(); NetworkCredential nc = new NetworkCredential( " kurodo ", " abc@123 ", "kurodo .cn "); try { ax.LogonAs( "kurodo ", "kurodo ", nc, null, null, null, null); IEnumerator<KeyValuePair<String, Object>> dem = dict.GetEnumerator(); using (AxaptaRecord axRecord = ax.CreateAxaptaRecord(tableName)) { ax.TTSBegin(); axRecord.Clear(); axRecord.InitValue(); while (dem.MoveNext()) { String key = dem.Current.Key; Object value = dem.Current.Value; axRecord.set_Field(key,value); } if (axRecord.ValidateWrite()) { axRecord.Insert(); ax.TTSCommit(); ret = true; } else { ax.CallStaticClassMethod( " CAMErrorInfo ", " throwInfo "); ax.TTSAbort(); } } ax.Logoff(); } catch (Exception ex) { ax.Logoff(); MessageBox.Show(ex.Message); // throw new Exception(ex.Message); } return ret; } /// <summary> /// Update Method /// </summary> /// <param name="tableName"> 表名 </param> /// <param name="pkey"> 键名称 </param> /// <param name="where"> 条件值 </param> /// <param name="dict"> 字段值字典 </param> public static Boolean Update(String tableName,String pkey,String where,IDictionary<String, Object> dict) { return Update(tableName, pkey, where, null, null, dict); } /// <summary> /// Update Method /// </summary> /// <param name="tableName"> 表名 </param> /// <param name="pkey"> 键名称 </param> /// <param name="where"> 条件值 </param> /// <param name="dict"> 字段值字典 </param> public static Boolean Update(String tableName, String pkey1, String where1, String pkey2, String where2, IDictionary<String, Object> dict) { return Update(tableName, pkey1, where1, pkey2, where2, null, null, dict); } /// <summary> /// Update Method /// </summary> /// <param name="tableName"> 表名 </param> /// <param name="pkey"> 键名称 </param> /// <param name="where"> 条件值 </param> /// <param name="dict"> 字段值字典 </param> public static Boolean Update(String tableName, String pkey1, String where1,String pkey2,String where2,String pkey3,String where3,IDictionary<String, Object> dict) { Boolean ret = false; Axapta ax = new Axapta(); NetworkCredential nc = new NetworkCredential( "kurodo ", " abc@123 ", "kurodo .cn "); try { ax.LogonAs( "kurodo ", "kurodo ", nc, null, null, null, null); IEnumerator<KeyValuePair<String, Object>> dem = dict.GetEnumerator(); using (AxaptaRecord axRecord = ax.CreateAxaptaRecord(tableName)) { String sql = String.Empty; ax.TTSBegin(); if (pkey3 != null) { sql = String.Format( " select forupdate * from %1 where %1.{0} == '{1}' && %1.{2} == {3} && %1.{4} == {5} ", pkey1, where1,pkey2,where2,pkey3,where3); } else if (pkey2 != null) { sql = String.Format( " select forupdate * from %1 where %1.{0} == '{1}' && %1.{2} == {3} ", pkey1, where1, pkey2, where2); } else { sql = String.Format( " select forupdate * from %1 where %1.{0} == '{1}' ", pkey1, where1); } axRecord.ExecuteStmt(sql); if (axRecord.Found) { while (dem.MoveNext()) { string key = dem.Current.Key; Object value = dem.Current.Value; axRecord.set_Field(key, value); } // if (axRecord.ValidateWrite()) // { axRecord.Update(); ax.TTSCommit(); ret = true; // } } else ax.TTSAbort(); } ax.Logoff(); } catch (Exception ex) { ax.Logoff(); throw new Exception(ex.Message); } return ret; } /// <summary> /// Select Method /// </summary> /// <param name="tableName"> 表名称 </param> /// <param name="pkey"> 键名称 </param> /// <param name="where"> 条件值 </param> /// <param name="fieldList"> 字段列表 </param> /// <returns></returns> public static IList<Object> Select(String tableName, String pkey, String where, IList<String> fieldList) { return Select(tableName, pkey, where, null, null, fieldList); } /// <summary> /// Select Method /// </summary> /// <param name="tableName"> 表名称 </param> /// <param name="pkey1"> 键名称1 </param> /// <param name="where1"> 条件值1 </param> /// <param name="pkey2"> 键名称2 </param> /// <param name="where2"> 条件值2 </param> /// <param name="fieldList"> 字段列表 </param> /// <returns></returns> public static IList<Object> Select(String tableName, String pkey1, String where1,String pkey2,String where2, IList<String> fieldList) { IList<Object> ret; Axapta ax = new Axapta(); NetworkCredential nc = new NetworkCredential( "kurodo ", " abc@123 ", "kurodo .cn "); try { ax.LogonAs( "kurodo ", "kurodo ", nc, null, null, null, null); ret = new List<Object>(); using (AxaptaRecord axRecord = ax.CreateAxaptaRecord(tableName)) { String sql = String.Empty; if (pkey2 != null) { sql = String.Format( " select * from %1 where %1.{0} == '{1}' && %1.{2} == {3} ", pkey1, where1, pkey2, where2); } else { sql = String.Format( " select * from %1 where %1.{0} == '{1}' ", pkey1, where1); } axRecord.ExecuteStmt(sql); if (axRecord.Found) { foreach (String field in fieldList) { ret.Add(axRecord.get_Field(field)); } } } ax.Logoff(); } catch (Exception ex) { ax.Logoff(); throw new Exception(ex.Message); } return ret; } /// <summary> /// Call Table Method /// </summary> /// <param name="tableName"> 表名称 </param> /// <param name="callName"> 方法名称 </param> /// <returns></returns> public static Object Call(String tableName, String callName) { return Call(tableName, callName, null); } /// <summary> /// Call Table Method /// </summary> /// <param name="tableName"> 表名称 </param> /// <param name="callName"> 方法名称 </param> /// <param name="parmList"> 参数列表 </param> /// <returns></returns> public static Object Call(String tableName,String callName, params Object[] parmList) { Object ret = null; Axapta ax = new Axapta(); NetworkCredential nc = new NetworkCredential( "kurodo ", " abc@123 ", "kurodo .cn "); try { ax.LogonAs( "kurodo ", "kurodo ", nc, null, null, null, null); using (AxaptaRecord axRecord = ax.CreateAxaptaRecord(tableName)) { ret = axRecord.Call(callName, parmList); } ax.Logoff(); } catch (Exception ex) { ax.Logoff(); throw new Exception(ex.Message); } return ret; } /// <summary> /// Call Display Method /// </summary> /// <param name="tableName"> 表名称 </param> /// <param name="methodName"> 方法名称 </param> /// <param name="findParam"> 参数列表 </param> /// <returns></returns> public static Object CallDisplay(String tableName, String methodName, params Object[] findParam) { Object ret = null; Axapta ax = new Axapta(); NetworkCredential nc = new NetworkCredential( "kurodo ", " abc@123 ", "kurodo .cn "); try { ax.LogonAs( "kurodo ", "kurodo ", nc, null, null, null, null); using (AxaptaRecord axRecord = ax.CallStaticRecordMethod(tableName, " find ", findParam) as AxaptaRecord) { ret = axRecord.Call(methodName); } ax.Logoff(); } catch (Exception ex) { ax.Logoff(); throw new Exception(ex.Message); } return ret; } /// <summary> /// Call StaticClass Method /// </summary> /// <param name="className"> 类名称 </param> /// <param name="methodName"> 方法名称 </param> /// <returns></returns> public static Object CallStaticClass(String className, String methodName) { return CallStaticClass(className, methodName, null); } /// <summary> /// Call StaticClass Method /// </summary> /// <param name="className"> 类名称 </param> /// <param name="methodName"> 方法名称 </param> /// <param name="paramList"> 参数列表 </param> /// <returns></returns> public static Object CallStaticClass(String className, String methodName, params Object[] paramList) { Object ret = null; Axapta ax = new Axapta(); NetworkCredential nc = new NetworkCredential( "kurodo ", " abc@123 ", "kurodo .cn "); try { ax.LogonAs( "kurodo ", " kurodo ", nc, null, null, null, null); ret = ax.CallStaticClassMethod(className, methodName, paramList); ax.Logoff(); } catch (Exception ex) { ax.Logoff(); throw new Exception(ex.Message); } return ret; } /// <summary> /// Call Job /// </summary> /// <param name="jobName"> Job名称 </param> public static void CallJob(String jobName) { CallJob(jobName, null, null); } /// <summary> /// Call Job /// </summary> /// <param name="jobName"> Job名称 </param> /// <param name="className"> 类名称 </param> public static void CallJob(String jobName, String className) { CallJob(jobName, className, null); } /// <summary> /// Call Job /// </summary> /// <param name="jobName"> Job名称 </param> /// <param name="className"> 类名称 </param> /// <param name="paramList"> 参数列表 </param> public static void CallJob(String jobName,String className, params Object[] paramList) { Axapta ax = new Axapta(); AxaptaObject ao = null; if (className != null) { ao = ax.CreateAxaptaObject(className,paramList); } NetworkCredential nc = new NetworkCredential( "kurodo ", " abc@123 ", "kurodo .cn "); try { ax.LogonAs( "kurodo ", "kurodo ", nc, null, null, null, null); ax.CallJob(jobName,ao); ax.Logoff(); } catch (Exception ex) { ax.Logoff(); throw new Exception(ex.Message); } } } }
转载于:https://www.cnblogs.com/Kurodo/archive/2012/01/02/2309808.html