|
![]() |
#1 |
Участник
|
axStart: InfoPath with default AIF file inbound
Источник: http://axstart.spaces.live.com/Blog/...C0A0!322.entry
============== Introduction Last week we used an AX Web service in combination with InfoPath. The solution we build had still some limitations. This week we will create an InfoPath Document that post documents to the AIF inbound file adapter. There is no difference on user experience when he posts to a web service or the AIF File inbound adapter. We can reuse all Axapta code from the previous session, but I make some additional enhancement on them. Till now, the created ProjJournalTrans records where nicely, but if we look more closely on it; it’s not as beautiful as expected. A lot of fields where not set:
public boolean prepareForSave(AxdStack _axdStack, str _dataSourceName) { //TODO: Remember to make code for validating fields that are added to the initMandatoryFieldsMap method // that are not mandatory in the table ProjJournalTable projJournalTable; JournalID journalID; axProjJournalTrans axProjJournalTrans; ProjJournalTrans projJournalTrans; ; switch (classidget(_axdStack.top())) { case classnum(AxProjJournalTrans) : axProjJournalTrans = _axdStack.top(); journalID = strfmt("Week %1",wkofyr(axProjJournalTrans.parmProjTransDate())); if(!ProjJournalTable::exist(journalID)) { projJournalTable.initFromProjJournalName(ProjJournalName::Find("Hour")); projJournalTable.JournalId = journalID; projJournalTable.insert(); } axProjJournalTrans.projJournalTrans().initFromProjTable(ProjTable::find(projJournalTrans.ProjId)); axProjJournalTrans.projJournalTrans().setTransDate(); axProjJournalTrans.setFieldAsTouched(fieldnum(projJournalTrans,dimension)); axProjJournalTrans.setFieldAsTouched(fieldnum(projJournalTrans,CostPrice)); axProjJournalTrans.setFieldAsTouched(fieldnum(projJournalTrans,salesPrice)); axProjJournalTrans.setFieldAsTouched(fieldnum(projJournalTrans,PeriodDate)); axProjJournalTrans.setFieldAsTouched(fieldnum(projJournalTrans,TaxGroupId)); axProjJournalTrans.setFieldAsTouched(fieldnum(projJournalTrans,TaxItemGroupId)); axProjJournalTrans.setFieldAsTouched(fieldnum(projJournalTrans,CategoryId)); axProjJournalTrans.setFieldAsTouched(fieldnum(projJournalTrans,TransDate)); axProjJournalTrans.parmJournalId(journalID); //TODO Put validating code for ProjJournalTrans here return true; default : error(strfmt("@SYS88979",classId2Name(classidget(_axdStack.top())))); return false; } return false; } NOTE: Changes on table fields without using the ParmFIeldName method need an addition setFieldAsTouched call, otherwise the changes are lost. Create the new file inbound service We will reuse the existing file Inbound adaptor of the Contoso VPC (c:\AIF\Inbound). The InfoPath document will post the xml messages in this map and AX AIF Batch will process them. It is also posible to process the messages with below x++ job. static void AifReceiveSend(Args _args) { ; // receive documents in inbound processing queue and process new AifGatewayReceiveService().run(); new AifInboundProcessingService().run(); // create documents in outbound processing queue and process // new AifOutboundProcessingService().run(); // new AifGatewaySendService().run(); } NOTE: Change class AifInboundProcessingService method run for debugging purpose. You have to replace the runas(……) code with AifInboundProcessingService::processRequest(message); After debugging your AIF inbound process can gets corrupted. In that case you have to clean up manually the table AifResourceLock & AifGatewayQueue Before we can connect InfoPath to the file inbound adapter, we have to get all XSD information.
Create an InfoPath document Open InfoPath 2007 on the VPC. Select design a Form Template. Select XML or Schema and press OK. InfoPath will open a wizard that helps you to find and connect the right way to the XSD of ProjHours. The main XSD is the message.XSD. Select this one from C:\Program Files\Microsoft Dynamics AX\Application\Share\Include
From this point we have an InfoPath form with data source that can do the job.
Our InfoPath design will looks like: We have the general design for our InfoPath dialog available, but we don’t have match intelligence. It would be better if we dynamical generate:
Go to the FormEvents_Loading method and add these lines of code: public void FormEvents_Loading(object sender, LoadingEventArgs e) { string guidID = System.Guid.NewGuid().ToString(); XPathNavigator root = this.MainDataSource.CreateNavigator(); root.SelectSingleNode("/ns1:Envelope/ns1:Header/ns1:MessageId", this.NamespaceManager).SetValue(guidID); root.SelectSingleNode("/ns1:Envelope/ns1:Header/ns1:SourceEndpointUser", this.NamespaceManager).SetValue(System.Environment.ExpandEnvironmentVariables("%userdomain%\%username%")); root.SelectSingleNode("/ns1:Envelope/ns1:Header/ns1:SourceEndpoint", this.NamespaceManager).SetValue("ProjHours"); root.SelectSingleNode("/ns1:Envelope/ns1:Header/ns1:DestinationEndpoint", this.NamespaceManager).SetValue("DMO"); root.SelectSingleNode("/ns1:Envelope/ns1:Header/ns1:Action", this.NamespaceManager).SetValue("createListProjHours"); } Next Build (compile) your solution in Visual Studio. Close Visual Studio and do your first test in InfoPath by pressing the Preview button. And ……….. we get an error! This error tells us that we are not allowed to check for the user and domain name. Think about secure x++ code you have to ask permission for it. So let’s ask for permission. Close the preview and go back to visual studio and add next line in the FormEvent_loading method new EnvironmentPermission(PermissionState.Unrestricted).Assert(); Also add the library for this Class at top of your c# project using System.Security.Permissions; Now the code is ready for secure coding but our InfoPath Form is not trusted jet. To get our InfoPath trusted, do the next steps:
public void FormEvents_Submit(object sender, SubmitEventArgs e) { try { string filepath = "\\Dynamicsvm\Inbound\"; string file = System.Guid.NewGuid().ToString() + ".xml"; XmlDocument soapXML = new XmlDocument(); soapXML.Load(this.MainDataSource.CreateNavigator().ReadSubtree()); XPathNavigator soapXMLnav = soapXML.CreateNavigator(); new FileIOPermission(FileIOPermissionAccess.Write, filepath + file).Assert(); soapXML.Save(filepath + file); e.CancelableArgs.Cancel = false; } catch (Exception) { MessageBox.Show("aif message is not stored"); } } Preview your InfoPath form again and test the web service with next data EmplID RAV ProjID 40010 CategoryID Install Qty 8 LinePropertyID Charge Testing, debugging & fixing If you submit your data and you get an error. The information of this error is a little bit incomplete. Detailed information about the error is available in AX. Look at the Form at Menu/Basic/Periodic/AIF/Exceptions. Good luck What’s Next Next week we will create lookups and make offline working possible. ![]() ![]() Источник: http://axstart.spaces.live.com/Blog/...C0A0!322.entry
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
Теги |
aif, axbc, webservice |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|