2016-08-30 26 views
0

我需要使用Web API将现有活动的附件更新到Acumatica Partner's Portal中的现有案例。使用附件更新现有活动

我已经为此编写了代码,但它始终更新为第一个活动,而不是用于传递noteid的活动。

我这样做是通过检索创建的活动的noteid,然后发送相同的noteid以及caseid来更新附件。

下面是用附件更新现有活动的代码,请建议。

var origActivities = context1.Export 
 
\t (
 
\t \t new SP203010WS.Command[] 
 
\t \t { 
 
\t \t \t \t new SP203010WS.Value 
 
\t \t \t \t { 
 
\t \t \t \t \t Value = currentAcumaticaCaseNo, 
 
\t \t \t \t \t LinkedCommand = content.Case.CaseID 
 
\t \t \t \t }, 
 

 
\t \t \t \t content.Activities.Type, 
 
\t \t \t \t content.Activities.Summary, 
 
\t \t \t \t new SP203010WS.Field 
 
\t \t \t \t { 
 
\t \t \t \t \t FieldName = "NoteID", 
 
\t \t \t \t \t ObjectName = content.Activities.Summary.ObjectName 
 
\t \t \t \t }, 
 
\t \t \t \t content.Activities.CreatedAt, 
 
\t \t }, 
 
\t \t null, 0, false, false 
 
\t); 
 

 
Guid?[] origActivityNoteID = null; 
 
DateTime?[] origActivityCreatedDate = null; 
 
if (origActivities != null && origActivities.Count() > 0) 
 
{ 
 
\t origActivityNoteID = new Guid?[origActivities.Count()]; 
 
\t origActivityCreatedDate = new DateTime?[origActivities.Count()]; 
 

 
\t int i = 0; 
 
\t foreach (string[] activity in origActivities) 
 
\t { 
 
\t \t origActivityNoteID[i] = new Guid(activity[2].ToString()); 
 
\t \t origActivityCreatedDate[i] = Convert.ToDateTime(activity[3]); 
 
\t \t i++; 
 
\t } 
 
} 
 

 
*****Adding new activity***** 
 

 
var newActivities = context.Export 
 
\t (
 
\t \t new SP203010WS.Command[] 
 
\t \t { 
 
\t \t \t \t new SP203010WS.Value 
 
\t \t \t \t { 
 
\t \t \t \t \t Value = currentAcumaticaCaseNo, 
 
\t \t \t \t \t LinkedCommand = content.Case.CaseID 
 
\t \t \t \t }, 
 

 
\t \t \t \t content.Activities.Type, 
 
\t \t \t \t content.Activities.Summary, 
 
\t \t \t \t new SP203010WS.Field 
 
\t \t \t \t { 
 
\t \t \t \t \t FieldName = "NoteID", 
 
\t \t \t \t \t ObjectName = content.Activities.Summary.ObjectName 
 
\t \t \t \t }, 
 
\t \t \t \t content.Activities.CreatedAt, 
 
\t \t }, 
 
\t \t null, 0, false, false 
 
\t); 
 

 
Guid? newActivityNoteID = null; 
 

 
for (var i = 1; i <= newActivities.GetUpperBound(0); i++) 
 
{ 
 
\t if(origActivityNoteID != null && origActivityCreatedDate != null) 
 
\t { 
 
\t \t if((Array.IndexOf<Guid?>(origActivityNoteID, new Guid(newActivities[i][2])) <= 0) && 
 
\t \t \t \t (Array.IndexOf<DateTime?>(origActivityCreatedDate, Convert.ToDateTime(newActivities[i][3])) <= 0)) 
 
\t \t { 
 
\t \t \t newActivityNoteID = new Guid(newActivities[i][2]); 
 
\t \t \t break; 
 
\t \t } 
 
\t } 
 
} 
 

 
*****getting a list of all attachments***** 
 

 
foreach (FileInfo fi in fileInfo) 
 
{ 
 
\t SP203010WS.Content[] content1 = context.Submit 
 
\t (
 
\t \t new SP203010WS.Command[] 
 
\t \t \t { 
 
\t \t \t \t new SP203010WS.Value 
 
\t \t \t \t { 
 
\t \t \t \t \t //Value = actiPartner.AcumaticaCaseID, 
 
\t \t \t \t \t Value = currentAcumaticaCaseNo, 
 
\t \t \t \t \t LinkedCommand = CR306000.Case.CaseID 
 
\t \t \t \t }, 
 
\t \t \t \t new SP203010WS.Value 
 
\t \t \t \t { 
 
\t \t \t \t \t Value = newActivityNoteID.ToString(), 
 
\t \t \t \t \t LinkedCommand = new SP203010WS.Field { FieldName="NoteID", ObjectName="Activities" } 
 
\t \t \t \t }, 
 
\t \t \t \t new SP203010WS.Value 
 
\t \t \t \t { 
 
\t \t \t \t \t FieldName = fi.Name, 
 
\t \t \t \t \t Value = Convert.ToBase64String(fi.BinData), 
 
\t \t \t \t \t LinkedCommand = CR306000.Activities.ServiceCommands.Attachment 
 
\t \t \t \t }, 
 
\t \t \t \t CR306000.Actions.Save 
 
\t \t \t } 
 
\t); 
 
}

回答

1

看起来像在屏幕基于API搜索提供的GUID的支持。您将必须通过其他字段值来定位必要的附件,例如:类型,摘要和CreatedAt:

Screen context = new Screen(); 
context.CookieContainer = new System.Net.CookieContainer(); 
context.Url = "http://localhost/ActivityAttachments/Soap/CR306000.asmx"; 
context.Login("admin", "123"); 

var content = context.GetSchema(); 

var newActivities = context.Export 
(
    new Command[] 
    { 
      new Value 
      { 
       Value = "000110", 
       LinkedCommand = content.CaseSummary.CaseID 
      }, 

      content.Activities.Type, 
      content.Activities.Summary, 
      content.Activities.CreatedAt, 
    }, 
    null, 0, false, false 
); 

byte[] filedata; 
using (FileStream file = File.Open("EP507011.txt", FileMode.Open)) 
{ 
    filedata = new byte[file.Length]; 
    file.Read(filedata, 0, filedata.Length); 
} 

Content[] content1 = context.Submit 
(
    new Command[] 
    { 
     new Value 
     { 
      Value = "000110", 
      LinkedCommand = content.CaseSummary.CaseID 
     }, 
     new Key 
     { 
      ObjectName = content.Activities.Type.ObjectName, 
      FieldName = content.Activities.Type.FieldName, 
      Value = string.Format("='{0}'", newActivities[newActivities.Length - 2][0]) 
     }, 
     new Key 
     { 
      ObjectName = content.Activities.Summary.ObjectName, 
      FieldName = content.Activities.Summary.FieldName, 
      Value = string.Format("='{0}'", newActivities[newActivities.Length - 2][1]) 
     }, 
     new Key 
     { 
      ObjectName = content.Activities.CreatedAt.ObjectName, 
      FieldName = content.Activities.CreatedAt.FieldName, 
      Value = newActivities[newActivities.Length - 2][2] 
     }, 
     new Value 
     { 
      FieldName = "EP507011.txt", 
      Value = Convert.ToBase64String(filedata), 
      LinkedCommand = content.Activities.ServiceCommands.Attachment 
     }, 
     content.Actions.Save 
    } 
); 
+0

仍然无法正常工作并更新第一个活动。 – Krunal

+0

你能解释一下你为什么混合来自SP2​​03010WS和CR306000命名空间的类吗?不知道这应该如何工作... – RuslanDev

+0

对不起,混乱。 CR306000不过是一个对象名称。它已经在工作,但进行错误的活动。以下是供您参考的代码 SP203010WS.Screen context = new SP203010WS.Screen(); context.CookieContainer = new System.Net.CookieContainer(); context.AllowAutoRedirect = true; context.EnableDecompression = true; context.Timeout = 1000000; context.Url =“https://sso.acumatica.com/Soap/SP203010.asmx”; SP203010WS.LoginResult result = context.Login(username,password); SP203010WS.Content CR306000 = context.GetSchema(); – Krunal