Magicpi4.
5withSugarConnectorSeminarBookID:UTLSUGMI4Edition:1.
0,July2016CourseID:UCLSUGMI45MagicUniversityOfficialCoursewareSelf-PacedTutorialMagicxpi4.
5withSugarConnectorSeminar2Theinformationinthismanual/documentissubjecttochangewithoutpriornoticeanddoesnotrepresentacommitmentonthepartofMagicSoftwareEnterprisesLtd.
MagicSoftwareEnterprisesLtd.
makesnorepresentationsorwarrantieswithrespecttothecontentshereofandspecificallydisclaimsanyimpliedwarrantiesofmerchantabilityorfitnessforanyparticularpurpose.
Thesoftwaredescribedinthisdocumentisfurnishedunderalicenseagreement.
Thesoftwaremaybeusedorcopiedonlyinaccordancewiththetermsandconditionsofthelicenseagreement.
Itisagainstthelawtocopythesoftwareonanymediumexceptasspecificallyallowedinthelicenseagreement.
Nopartofthismanualand/ordatabasesmaybereproducedortransmittedinanyformorbyanymeans,electronicormechanical,includingphotocopying,recordingorinformationrecordingandretrievalsystems,foranypurposeotherthanthepurchaser'spersonaluse,withoutthepriorexpresswrittenpermissionofMagicSoftwareEnterprisesLtd.
Allreferencesmadetothird-partytrademarksareforinformationalpurposesonlyregardingcompatibilitywiththeproductsofMagicSoftwareEnterprisesLtd.
Unlessotherwisenoted,allnamesofcompanies,products,streetaddresses,andpersonscontainedhereinarepartofacompletelyfictitiousscenarioorscenariosandaredesignedsolelytodocumenttheuseofMagicxpi.
MagicisatrademarkofMagicSoftwareEnterprisesLtd.
BtrieveandPervasive.
SQLareregisteredtrademarksofPervasiveSoftwareInc.
IBM,Topview,Systemi5/Systemi,pSeries,xSeries,RISCSystem/6000,DB2,WebSphere,Domino,andLotusNotesaretrademarksorregisteredtrademarksofIBMCorporation.
Microsoft,FrontPage,Windows,WindowsNT,ActiveX,Exchange2007,DynamicsCRM,SharePoint,Excel,andWordaretrademarksorregisteredtrademarksofMicrosoftCorporation.
Oracle,JDEdwardsEnterpriseOne,JDEdwardsWorld,andOC4JareregisteredtrademarksoftheOracleCorporationand/oritsaffiliates.
GoogleCalendarandGoogleDocsaretrademarksofGoogleInc.
Salesforceisaregisteredtrademarkofsalesforce.
comInc.
SAPBusinessOneandSAPR/3areregisteredtrademarksofSAPAGinGermanyandinseveralothercountries.
SugarCRMisatrademarkofSugarCRMintheUnitedStates,theEuropeanUnionandothercountries.
LinuxisaregisteredtrademarkofLinusTorvalds.
UNIXisaregisteredtrademarkofUNIXSystemLaboratories.
GLOBEtrotterandFLEXlmareregisteredtrademarksofMacrovisionCorporation.
SolarisandSunONEaretrademarksofSunMicrosystemsInc.
HP-UXisaregisteredtrademarkoftheHewlett-PackardCompany.
RedHatisaregisteredtrademarkofRedHatInc.
WebLogicisaregisteredtrademarkofBEASystems.
InterstageisaregisteredtrademarkoftheFujitsuSoftwareCorporation.
JBossisatrademarkofJBossInc.
GigaSpaces,GigaSpaceseXtremeApplicationPlatform(XAP),GigaSpaceseXtremeApplicationPlatformEnterpriseDataGrid(XAPEDG),GigaSpacesEnterpriseApplicationGrid,GigaSpacesPlatform,andGigaSpaces,aretrademarksorregisteredtrademarksofGigaSpacesTechnologies.
ClipartimagescopyrightbyPresentationTaskForce,aregisteredtrademarkofNewVisionTechnologiesInc.
ThisproductusestheFreeImageopensourceimagelibrary.
Seehttp://freeimage.
sourceforge.
netfordetailsThisproductusesiconscreatedbyAxialisIconWorkShop(http://www.
axialis.
com/free/icons)ThisproductincludessoftwaredevelopedbytheApacheSoftwareFoundation(http://www.
apache.
org/).
ThisproductincludessoftwaredevelopedbyComputingServicesatCarnegieMellonUniversity(http://www.
cmu.
edu/computing/).
Copyright1989,1991,1992,2001CarnegieMellonUniversity.
Allrightsreserved.
ThisproductincludessoftwaredevelopedbytheOpenSSLProjectforuseintheOpenSSLToolkit(http://www.
openssl.
org/).
ThisproductincludessoftwarethatisCopyright1998,1999,2000oftheThaiOpenSourceSoftwareCenterLtd.
andClarkCooper.
ThisproductincludessoftwarethatisCopyright2001-2002ofNetworksAssociatesTechnologyIncAllrightsreserved.
ThisproductincludessoftwarethatisCopyright2001-2002ofCambridgeBroadbandLtd.
Allrightsreserved.
ThisproductincludessoftwarethatisCopyright1999-2001ofTheOpenLDAPFoundation,RedwoodCity,California,USA.
AllRightsReserved.
Allotherproductnamesaretrademarksorregisteredtrademarksoftheirrespectiveholders.
Magicxpi4.
5withSugarConnectorSeminarJuly2016Copyright2013-2016byMagicSoftwareEnterprisesLtd.
Allrightsreserved.
3TableofContentsIntroduction5AbouttheSeminar5HowtoUseThisGuide.
6SugarConnector.
7MagicxpiArchitecturewiththeSugarConnector.
8ConnectingtoSugarCRM8Installation8CreatingaProject.
9Summary12QueryingSugarCRMviaMagicxpi.
13PreviewoftheFlow.
14TriggeringtheFlow15QueryOperation.
18WHEREClauses26Exercise.
28Summary28AddinganObject29AddinganObjecttoSugarCRM30Exercise.
37Summary38SugarCRMObjectID39CreatingObjectsbyID.
40Summary44CreatingaSugarCRMQuoteScenario.
454UsingtheXMLInterfacetoCreateaQuote.
46RunningtheFlow52Summary53CapturingEvents55SugarConnectorService56SugarTrigger.
56DateTimeFields61Exercise.
62Summary62Solutions63Lesson2–QueryingSugarCRMviaMagicxpi.
63Lesson3–AddinganObject695IntroductionWelcometoMagicSoftwareUniversity'sMagicxpi4.
5withSugarConnectorSeminar.
We,atMagicSoftwareUniversity,hopethatyouwillfindthistutorialinformativeandthatitwillassistyouingettingstartedwiththisexcitingproduct.
AbouttheSeminarTheseminarisintendedforpeoplewithaknowledgeofSugarCRMwhowanttoknowhowtosuccessfullyuseMagicSoftwareEnterprises'Magicxpiproduct,andhowtointegrateMagicxpiwithSugarCRM.
DuringtheseminaryouwilllearnabouttheMagicxpiSugarconnectorandhowMagicxpiintegrateswithSugarCRM.
Topicsthatwillbecoveredinclude:Queries,includingadvancedqueriesReferencingobjectsbyIDsCreatingaSugarCRMQuotescenarioRelationshipsbetweenobjectsusingtheLinkmethodCapturingevents6CoursePrerequisitesBeforeyoustartwiththecoursethereisbasicknowledgethatyouneedtohave:DevelopmentknowledgeFamiliarwithMagicxpi4.
5,Magicxpi4.
1oriBOLT/Magicxpi3.
xSugarCRMKnowledgeofSugarCRMYourcomputermustalsomeetsomebasicrequirements:HardwareWindowsXPProandlater.
ThecoursewastestedonWindows7Pentiumprocessor1.
8GHzandupwards4GbRAMorgreaterAtleast1GboffreespaceScreenresolutionofatleast1024x768pixelsMagicxpiYouwillneedtoinstallMagicxpiV4.
5LicenseFordeploymentpurposes,youneedtheSUGCRMlicensefromyourMagicSoftwareEnterprisesrepresentative.
Thisisnotrequiredfordevelopmentpurposes.
SugarCRMThisseminarhasbeendesignedusingtheSugarCRMinstallationwiththePopulateDatabasewithDemoDataoptionsettoYes.
ThedemonstrationdataisbasedonVersion7.
5.
0.
1ofSugarCRM(whichusestheirv10API).
Ifyouuseadifferentversionyouwillneedtoprovideyourownsampledatafiles.
EmailServerYouneedaccesstoanemailserversothatyoucansendemails.
YoucanuseyourGmailorYahooaccountsaswell.
ChecktheinternetforinstructionsonhowtoconfigurethosemailserversforPOP3,IMAPandSMTP.
HowtoUseThisGuideTheself-pacedguideprovidesdetailedstep-by-stepinstructions.
Ifyouarelearningusingthisself-pacetutorial,feelfreetocontactyourMagicSoftwareEnterprisesrepresentativeortheSupportdepartmentforfurtherassistance.
7SugarConnectorTheMagicxpiSugarconnectorenablesaworkflowbetweenMagicxpiandSugarCRM.
UsingtheSugarconnector,youcanadd,modify,anddeleteobjectsinSugarCRM.
YoucanalsotriggeraMagicxpiflowwhenactionssuchasadd,update,ordeleteareperformedinSugarCRM.
AswasmentionedinthePrerequisitessection,fordeploymentpurposes,toworkwiththeSugarconnector,youneedaspecialMagicxpilicense:SUGCRM.
Thislessoncoversvarioustopicsincluding:AnintroductiontotheSugarconnectorInstallingthenewestversionoftheSugarconnectorCreatingaSugarCRMresourceConnectingMagicxpitoSugarCRMLesson18MagicxpiArchitecturewiththeSugarConnectorTheMagicxpiSugarconnectorworkswithSugarCRM'sRESTAPI.
TheXMLinterfaceenablesflexibilitywhenworkingwithSugarCRM,sinceyoudonotneedtofrequentlyupdatetheSugarconnector.
TheSugarconnectorcancreate,query,update,anddeletedataobjectsinSugarCRMusingtheRESTAPI.
TheMagicxpiSugarconnectorsupportsboththeXMLinterfaceandMethodinterface.
TheSugarconnectorhasthefollowingmethods:CreateProductBundlesDocumentAddRevisionGetServerInfoGetUserIDLinkNoteAddAttachmentConnectingtoSugarCRMTheSugarconnectorneedstobeconnectedtoaspecificuserinSugarCRM.
Therefore,beforeworkingwiththeMagicxpiSugarconnector,youneed:AvalidSugarCRMusernameAvalidSugarCRMpasswordInstallationMagicxpi4.
5supportsSugarCRMversion6.
4x,whichworkswiththev4_1RESTandSugarCRMversion7.
x,whichworkswiththev10API.
ThiscourseusesSugarCRMEnterprise,Version7.
5.
0.
1.
TheSugarCommunityEditionworkswith6.
4x,whichwillnotbedemonstratedinthiscourse.
However,mostofthefunctionalityissimilar.
Asmentionedintheprerequisites,youshouldalreadyhaveMagicxpi4.
5installedonyourcomputer.
You'renowreadytostartdeveloping.
9CreatingaProjectAswithanydevelopmentproject,thefirststepistocreateanewMagicxpiproject.
TocreateanewMagicxpiproject:1.
OpenMagicxpi.
2.
ClickontheFilemenu,andselectNew.
TheNewProjectdialogboxwillopen.
3.
CreateanewprojectcalledSugarCRM_seminar.
Forthepurposeofthiscourse,datahasbeenpreparedforyou.
4.
Copythecourse_datafolderintotheSugarCRM_seminar\SugarCRM_seminarfolder.
Thisfolderandsubfolderwerecreatedwhenyoucreatedthenewproject.
AfinalversionoftheprojectisprovidedintheFinal_SugarCRM_Projectfolder,whichyoucancopytotheprojectsfolderandrefertoifneeded.
10DefiningaResourceBeforeusingtheSugarconnectorinastep,youneedtodefinetheSugarresource.
1.
FromtheProjectmenu,selectSettings.
2.
WhileparkedontheResourcesoption,clickAddtoaddaresource.
3.
FromtheResourceTypefield,selectSugar.
4.
Nametheresource:Sugarseminar.
TherearethreemandatorysettingstobedefinedintheSugarresource.
Thesearethesettingsthatappearinbold.
5.
FromtheAPIversionsetting,selectV10+API.
Ifyouareusingthefreeversion,you'llusetheLegacyAPIoption.
6.
IntheRESTendpointsetting,entertheURLfortheV10API,whichis:http://{siteurl}/rest/v10/.
Intheimageabove,youcanseethatthesiteurlthatwasusedwas:sugarcrmsrv/sugar.
Therefore,thefullURLenteredwas:http://sugarcrmsrv/sugar7/rest/v10/.
11ForSugarCRMv4.
1,includingtheSugarCommunityEdition,thesyntaxis:http://{siteurl}/service/v4_1/rest.
php.
7.
EnteryourUserNameandPasswordfortheSugarCRMserver.
YoucanleavetheCachinglevelasis.
Thebasicassumptionbehindtheneedforcachingisthatthesamedatawillbeneededmorethanonce.
Therefore,ifdatacanbere-fetchedwithoutperformingdiskI/Ooperations,overallperformancewillbeenhanced.
Thisoptionalsettinghastwooptions:Context:Loginandmodulemetadataiscachedthroughoutthecontext.
ThelogincontextiscreatedbythefirstSugarCRMstepintheflowandusedbyallotherSugarCRMstepsinthecontextconfiguredwiththesameresource.
Engine(default):LoginandmodulemetadataiscachedforallcontextsrunningunderaMagicxpiengine.
Loginoccursonlyonceforallcontexts,untiltheloginisnolongervalid.
ThisoptionenhancesperformanceandlowerstheuseofSugarCRMAPIcalls.
8.
ClicktheValidatebuttontocheckyourconnection.
Ifallofthesettingswereenteredcorrectly,youshouldseethefollowingmessage:YouhavenowsuccessfullycreatedaconnectionfromMagicxpitoSugarCRM.
12SummaryInthislesson:YouwereintroducedtotheMagicxpiSugarconnector.
YouinstalledthenewestversionoftheSugarconnector.
Youcreatedaprojectfortheseminar.
YoucreatedaSugarCRMresourceandconnectedMagicxpitoSugarCRM.
13QueryingSugarCRMviaMagicxpiASugarQueryoperationisusedtoretrievedatafromanobjectaccordingtospecificsearchcriteria.
YoucanalsodefineadvancedWHEREclausesusingtheDataMapper.
Thislessoncoversvarioustopicsincluding:QueryoperationWHEREclausesFiltersLesson214PreviewoftheFlowThebusinessprocesslogicoftheMagicxpiflowthatyouwillcreateisasfollows:RequestisreceivedDoesaccountexistinSugarAddnewSugaraccountIfNoIfYesWasaccountcreatedAddcontactIfYesIfNoIfNoIfYesArerequesteditemsvalidAddaSugaropportunityIfYesIfNo15TriggeringtheFlowYou'lluseatriggertoactivatetheflow.
1.
RenamethedefaultflowandnameitScanforNewRequests.
2.
FromtheSolutionExplorer,double-clickontheContextVariablesfolder.
3.
FromtheContextVariablestab,clickAddandaddthefollowingvariable:C.
RequestXML,aBLOBvariable4.
ClicktheSavebutton.
5.
FromtheSolutionExplorer,double-clickontheFlowVariablesfolder(underthenewScanforNewRequestsflow).
166.
FromtheFlowVariablestab,clickAddandaddtheflowvariableslistedbelow.
Whenyouareaskedtousethesevariables,anexplanationaboutthemwillbeprovided.
F.
Account,aBLOBvariableF.
RequestFileName,anAlphavariableofsize255F.
ContactXML,aBLOBvariableF.
AccountExists,aLogicalvariablewithadefaultvalueof'FALSE'LOG.
TheF.
AccountExistsvariablewillbeusedifaqueryreturnedauserrecordfromSugarCRM.
F.
AccountId,anAlphavariableofsize1007.
ClicktheSavebutton.
IDsinSugarCRMarelong.
Forexample:c570b261-42da-3240-fe8e-557e48e862dfTherefore,theIDvariablesusedinthiscoursearesetto100.
YouwillreceivetherequestusingtheDirectoryScannercomponent.
TherearetwowaysofusingtheDirectoryScannercomponent:TriggerorStep.
InthisexampleyouwillusetheTriggermode.
1.
FromtheToolbox(intheTriggerssection),dragaDirectoryScannercomponenttotheTriggerarea.
2.
Inthetrigger'sPropertiespane,settheTriggerNamepropertyto:WaitforFile.
3.
Right-clickonthecomponentandselectConfiguration.
TheComponentConfiguration:DirectoryScannerdialogboxopens.
4.
ClickNewtodefinethetrigger.
5.
Definethefollowing:a.
LeavetheSourceasLAN.
b.
SettheDirectoryto:EnvVal('currentprojectdir')&'course_data\in\'.
Thecurrentprojectdirenvironmentvariablecontainsthepathtothedirectorywherethecurrentprojectresides.
c.
IntheFilterproperty,leavethedefaultof*.
*d.
LeavetheActionasMove.
e.
SetthedestinationDirectorytoEnvVal('currentprojectdir')&'course_data\out\'.
6.
ClicktheAdvancedbutton.
a.
SettheReturnfiletopropertytoC.
RequestXML.
ThisisthevariablethattheDirectoryScannerwillreturnthecontentofthefileto.
b.
SettheReturndestinationfilenametopropertytoF.
RequestFileName.
ThisisthenameofthevariablethattheDirectoryScannerwillreturnthenameofthefileto.
177.
ClickOK.
8.
FromtheProjectmenu,selectSettings.
9.
GototheProjectEnvironmentsectionandclicktheInternalEnvironmentVariablesoption.
10.
Checkthatthecurrentprojectdirenvironmentvariableispointingtothecorrectlocation.
WeusedthisenvironmentvariableintheDirectoryScannercomponent,soweneedtocheckthisenvironmentvariablesothatthetriggerwillknowwheretotakethefilesfrom.
Youhavefinisheddefiningthetrigger.
18QueryOperationYouwillusetheXMLinterfacetocheckwhetherthecustomerexistsinSugarCRM.
YouwillusetheSugarconnectortocheckwhetherthecustomerexistsasanaccountinSugarCRM.
AnaccountinSugarCRMrepresentsasinglecompany.
1.
DragaSugarconnectorasthefirststepintheScanforNewRequestsflow.
2.
SettheStepNamepropertytoCheckforAccount.
3.
LeavetheInterfaceasXML.
4.
IntheSettingsectionofthePropertiespane,checkthattheResourceNamepropertyissettotheSugarseminarresource.
Sincethisis,currently,theonlySugarCRMresource,itwasprobablyselectedautomaticallybyMagicxpi.
5.
Right-clickonthestepandselectConfigurationorjustdoubleclickonthestep.
TheSugarConfigurationdialogboxenablesyoutoperformoperationsonaSugarCRMobject.
6.
FromtheModulefield,clicktheselectionbutton.
19MagicxpineedstofetchtheobjectsexposedbytheSugarCRMAPIbeforeaccessingthem.
MagicxpiconnectsdirectlytotheSugarCRMserver,retrievestheavailablemodules,anddisplaystheminalist.
TheModulesListcontainsallofthemodulesfromtheSugarCRMserver.
7.
ToretrievethelatestModuleListfromtheSugarCRMserver,clicktheReloadbutton.
Thefollowingmessagewillappear.
8.
ClickOK.
Thefollowingimagewillappear,showingthatMagicxpiisretrievingdatafromtheSugarCRMserver.
209.
FromtheModulesList,selectAccounts.
TheSugarconnectorsupportsCRUDoperations:Create,Query,UpdateandDelete.
Nowsinceyou'resimplyjustbrowsingtoseeifanaccountexistsinSugarCRM,you'llperformaQuery.
10.
FromtheOperationfield,selectQuery.
11.
TheResultsPerChunkfieldisthemaximumnumberofresultsthatyouwanttofetchineachcalltoSugarCRM.
Leaveitsetto2000.
12.
TheReturnFieldsoptionenablesyoutodefinewhichfieldswillbereturnedintheresultXML.
13.
CleartheReturnFieldscheckboxandselectidandname.
Ingeneral,thisisrecommended,becauseitreducesyourresultset,thesizeofthefieldsthatarereturned.
14.
TheStoreresultinfieldwillholdtheXMLretrievedfromSugarCRM.
Youcanselecteitherafileoravariable.
SelectVariable,andthenselecttheF.
Accountvariablethatyoudefinedearlier.
15.
It'sagoodideatoclicktheRefreshXSDbuttontomakesurethatyou'reusingthelatestmodulemetadata.
ChangesthataremadeintheSugarCRMenvironment–customizationsandsoforth–areallpulledintotheintegrationenvironmentsothatwhenyoudothedatamapping,it'sallthereandavailabletoyou.
16.
ClickOK.
21TheMagicxpiSugarconnectorsavestheXMLSchema,theXSD,inthefollowingdirectory:[projectdir]\[projectname]\[projectname]\SugarCRM\XSD\[resourcename]Inourcase,thisis:projects\SugarCRM_seminar\SugarCRM_seminar\SugarCRM\XSD\Sugarseminar\Accounts.
xsdAsyouarecurrentlyusingtheSugarconnectorwiththeXMLinterface,youwillusetheDataMappertoconfigureit.
AfterdefiningthepropertiesfortheSugarconnector,anewIFCModelentrywascreatedintheDestinationsection:IFC_SugarCRM.
YouneedtousetherequestXMLthatwasretrievedbytheDirectoryScannertocheckwhethertheaccountexistsinSugarCRM.
Therefore,youneedtohaveXMLasthesource.
221.
FromtheToolbox,draganXMLentrytotheSourcepaneoftheDataMapper.
2.
GotothePropertiespane.
a.
SettheNamepropertytoRequestXML.
b.
IntheXSDFileproperty,selectthefollowingschema:course_data\schemas\request.
xsdc.
SettheSourceTypetoVariableandselecttheC.
RequestXMLvariable.
3.
Clickthesaveicon.
Thenextstageistomap.
23YouneedtosendthecustomernametoSugarCRMtoqueryitsexistence.
Therefore,inthedestination,youshouldusethenamenodeintheSugarCRMAccountsmodulethatyoupreviouslyconfigured.
Toexpandallofthenodes,parkonthetopnodeoftheSourceorDestinationside,right-clickandselectExpandall.
4.
IntheDataMapper'sSourcepane,expandtheRequest>CustomerDetailnode.
5.
IntheDestinationpane,expandtheAccounts>row>Fieldsnode.
6.
WhilestandingontheFieldsnode,presstheletterntogettothenamenode.
7.
ConnecttheAccountNamenodetothenamenode.
8.
ClickthesaveiconandreturntotheFlowarea.
AnotherwaytosearchistopressCtrl+Shift+FfromoneofthepanesorgototheEditmenu,selectFindandthenFindText.
IntheFindTextdialogbox,youcannarrowyoursearch.
Oncethecursorisononeoftheitemsthatmeetsyoursearchcriteria,youcanpressF3togotothenextitem.
CheckIfAccountExists1.
DragaDataMappercomponentasachildoftheCheckforAccountstep.
2.
SettheStepNamepropertytothefollowing:CheckIfAccountExists.
3.
Right-clickonthestepandselectConfigurationordouble-clickonthestep.
4.
DraganXMLentryontotheSourcepaneoftheDataMapper.
5.
IntheXSDFileproperty,selectthefollowingschema:SugarCRM\XSD\Sugarseminar\Accounts.
xsd6.
SettheSourceTypetoVariableandselecttheF.
Accountvariable.
7.
DragaVariableentryontotheDestinationpane.
8.
InthePropertiespane,gototheVariablespropertyandclicktheselectionbutton.
9.
SelectboththeF.
AcountExistsandF.
AccountIdvariables.
2410.
OntheDataMapper'sSourcepane,openthefollowingnode:Accounts>row>Fields.
11.
OntheDestinationpane,opentheInstancenode.
12.
ConnecttheidnodetotheF.
AccountExistsnode.
13.
WhilethecursorisontheF.
AccountExistsnodegototheCalculatedvaluepropertyandenterthefollowingexpression:NOT(Src.
S1/Accounts/row/Fields/id=''ORISNULL(Src.
S1/Accounts/row/Fields/id))Intheexpressionabove,thepathSrc.
S1/Accounts/row/Fields/idisenteredbyclickingtheSourceNodesiconatthetopoftheExpressionEditor.
ThisexpressionreturnsTrueifthereisavalue.
Thismeansthatiftheidfieldisnotemptyornull,thentheaccountexists.
14.
AlsoconnectidtoF.
AccountId.
ThiswillupdatetheF.
AccountIdvariablewiththevalueoftheSugarCRMidfields.
Thisconnectionwillbeusedinalaterstepwhenanopportunityiscreated.
15.
SaveandreturntotheFlowarea.
TestingYourProjectYouwillwanttotestyourflowtomakesureitworks.
1.
Right-clickontheCheckforAccountstepandselectBreakpoint.
Areddotwillappearnexttothestep.
Abreakpointmeansthatprocessingwillhaltatthatpoint.
2.
CopytheNonexistingaccount.
xmlfilefromtheoutfoldertotheinfolder.
ThisXMLfileincludesanon-existingaccountnamedMagicHotels.
253.
Fromthetoolbar,clicktheStartDebuggingicon(orfromtheDebugxpimenu,selectStartDebugging).
YoucanalsopressF5tostarttheDebugger.
Magicxpicheckstheprojectforanysyntaxerrors.
Iftherearesyntaxerrors,youwillnotbeabletocontinue.
Therearevarioustypesofsyntaxerrors,suchasamandatorypropertythatwasnotdefinedorwasincorrectlydefined.
Whenthebreakpointisreached(whichcansometimestakeafewseconds),theToolboxwillbecometheContextTree.
4.
FromtheContextTree,right-clicktheCheckforAccountoptionandselectStep.
Thiswillrunthesecondstep.
YounowwanttolookattheF.
Accountvariable,whichisthevariablethatyouselectedintheStoreresultinfield.
5.
FromtheContextTree,right-clickontheCheckIfAccountExistsoptionandselectContextView(orselectitfromtheDebugxpimenu).
6.
FindtheF.
AccountvariableandnoticethatitsaysEmptyBLOBtypeVariable.
Thisisbecausetheaccountdoesnotexist.
7.
ClickCloseandthenOK.
8.
GototheDebugxpimenuandselectStopDebuggingtogobacktodevelopmentmode.
26WHEREClausesInthev10API,youcanalsouseamoreadvancedquery.
IfyouopentheCheckforAccountstep'sDataMapper,you'llseetheRequest_ArgumentscompoundanditsFILTERandORDER_BYelements.
Thesearewhatyouusefortheadvancedqueries.
UnliketheLegacyAPI,thequeryisnotadirectSQLstatementthatgoesas-istothedatabase.
FILTERForexample,toqueryfordatawherethelast_name='Smith'andthefirst_name='John',youwouldusethisFILTERclause:filter[0][first_name][$starts]=John&filter[0][last_name]=SmithThe[first_name]elementisafieldnamebut[$starts]isareservedkeyword,whichispartofSugarCRMfiltersyntax.
Inthelegacyversion,theWHEREclauseissentdirectlytothedatabase.
IntheAccounts>SQL>WHEREnode,youusethefollowingsyntax:.
Forexample,ifyouwanttoquerythedatawithlast_name='Smith'andfirst_name='John',youwouldusethefollowingsyntax:Contacts.
last_name='Smith'ANDContacts.
first_name='John'27MagicxpipassesthefiltersasistoSugarCRM,soyoucanuseanyoftheirsupportedfilteroperations,whichareasfollows.
FilterDescription$equalsPerformsanexactmatchonthatfield.
$not_equalsMatchesonnon-matchingvalues.
$startsMatchesonanythingthatstartswiththevalue.
$inFindsanythingwherefieldmatchesoneofthevaluesasspecifiedasanarray.
$not_inFindsanythingwherefielddoesnotmatchesanyofthevaluesasspecifiedasanarray.
$is_nullChecksifthefieldisnull.
Thisoperationdoesnotneedavaluespecified.
$not_nullChecksifthefieldisnotnull.
Thisoperationdoesnotneedavaluespecified.
$ltMatcheswhenthefieldislessthanthevalue.
$lteMatcheswhenthefieldislessthanorequaltothevalue.
$gtMatcheswhenthefieldisgreaterthanthevalue.
$gteMatcheswhenthefieldisgreaterthanorequaltothevalue.
Thistablewasreplicatedfrom:http://developer.
sugarcrm.
com/2014/02/28/sugarcrm-cookbook1/.
ORDER_BYAsmentionedabove,youcanalsoqueryusingtheORDER_BYelementintheRequestArgumentsnode.
Forexample,enter'name:desc'intheCalculatedvaluepropertyoftheORDER_BYelement.
Alloftherecordswillbesortedindescendingorderoftheirnamefieldfortheselectedmoduleanddisplayedinthereturnvariable.
28ExerciseDuringthislesson,youcreatedaflownamedScanforNewRequests.
ThepurposeofthisflowistoscantheinfoldertoseeifanewXMLrequestisthere.
IfMagicxpifoundarequestinthefolder,thenyouwereaskedtocheckwhetherthecustomerexistsinSugarCRM.
Ifthecustomerexists,then:CheckwhethertheitemsrequestedintheXMLfilearevalidSugarCRMproducts.
Hints:ReferbacktothePreviewoftheFlowsectiononpage14.
UsetheProductTemplatesmodule.
Onceyouhavetriedthisonyourown,pleasemakesuretolookatthesolutionforthisexerciseonpage63.
Thefollowinglessonsbuildontheexercise.
SummaryInthislesson:YoulearnedabouttheQueryoperation.
YoualsolearnedaboutWHEREclausesandfilters.
YouusedtheSugarconnectortoquerytheAccountsmoduletochecktheexistenceofanaccount.
29AddinganObjectInthepreviouslessonsyoulearnedhowtofetchinformationfromSugarCRM.
Queryingadatabaseisnottheonlyoperationneededinaproject.
Itisoftennecessarytoaddanobjecttothedatabase.
Inthislesson,you'llseehowMagicxpienablesyoutoaddanentrytotheSugarCRMdatabase.
You'llalsolearnaboutusingentriesinSugarCRMselectionlists.
Lesson330AddinganObjecttoSugarCRMThestepsneededtoaddanobjectareverysimilartothestepsrequiredtoqueryanobject.
Now,you'lladdacustomerifthecustomerdoesnotexist.
Inotherwords,iftheCheckIfAccountExistsstepreturnsfalse,you'lladdthecustomertoSugarCRM.
1.
OpentheScanfornewrequestsflow.
2.
AddaSugarconnectorasachildoftheCheckIfAccountExistsstepandnameitAddAccount.
3.
Doubleclickonthestep.
4.
FromtheModuleproperty,selecttheAccountsmodule.
5.
SettheOperationfieldtoCreate.
6.
FromtheNewObjectIDproperty,selectF.
AccountId.
Whenanobjectisadded,SugarCRMreturnstheobjectIDofthenewlycreatedobjectintothisvariable.
SugarCRMreturnstheIDofthelastobjectcreated.
Ifyourstepisaddingorupdatingmultiplerecordsorobjects,makesuretotaketheIDsfromtheresultXML.
7.
IntheStoreResultInfield,selecttheF.
Accountvariable.
8.
ClickOK.
YouneedtousetherequestXMLthatwasretrievedbytheDirectoryScanner.
Thiscontainsthecustomerinformation.
Therefore,youneedtohaveanXMLasthesource.
1.
AddanXMLsourceandnameitRequestXML.
2.
IntheXSDFileproperty,selectthefollowingschema:course_data\schemas\request.
xsd3.
FromtheVariableproperty,selecttheC.
RequestXMLvariable.
31Youarenowreadytomap.
1.
OntheSourcepane,openthefollowingnode:Request>CustomerDetail.
2.
OntheDestinationpane,openAccounts>row>Fields.
3.
Connectthefollowingnodes:SourcenodeDestinationnodeAccountNamenameStreetbilling_address_streetCitybilling_address_cityCountrybilling_address_countryYouonlywantthissteptobeexecutedifthecustomerdoesnotexist;inotherwords,theCheckIfAccountExistsstep'sresultwasunsuccessful.
1.
ParkontheAddAccountstep.
2.
Right-clickandsetthefollowingcondition:NOT(F.
AccountExists).
3.
CopytheNonexistingaccount.
xmlfilefromtheoutfoldertotheinfolder.
Thisfileincludesanon-existingaccount.
4.
RemoveanybreakpointsandaddabreakpointtotheAddAccountstep.
5.
RuntheDebuggerontheproject.
TheresultfortheCreateoperationisstoredintheStoreresultinvariable,whichintheAddAccountstepistheF.
Accountvariable.
6.
WhentheDebuggerreachestheAddAccountstep,opentheContextView.
7.
ZoomfromtheF.
Accountvariableandyoucanseethecontentofthevariable.
ForeveryCreateoperation,thereturnedXMLcontainsasuccessorfailureindication.
In32theimagebelow,youcanseethatthestepwassuccessful.
Ifthereisanerror,youwillseetheerrorinthereturnedXML.
8.
Inaddition,openSugarCRMandiftheprocessworkedcorrectly,youshouldseethenewaccountinSugarCRM.
33Nowyou'llwant,aspartoftheflow,tocheckiftheaccountwascreatedsuccessfully.
1.
DropaDataMappercomponentundertheAddAccountstepandnameitCheckIfAccountCreated.
2.
AddanXMLsource.
3.
FromtheXSDFileproperty,selectthefollowing:Sugarseminar\Accounts.
xsd.
4.
FromtheVariableproperty,selecttheF.
Accountvariable.
5.
AddaVariabledestination.
6.
FromtheVariablesproperty,selecttheF.
AccountExistsvariable.
7.
OntheDataMapper'sSourceside,thistimeyou'llopentheReturnfolder(Accounts>row>Return).
8.
ConnecttheSuccessnodetoF.
AccountExists.
Althoughtheaccounthasbeenadded,thecontacthasnotyetbeenadded:1.
DropaSugarconnectorasachildstepoftheCheckIfAccountCreatedstep.
NamethestepAddContact.
2.
InSugarConfigurationdialogbox,fromtheModuleproperty,selecttheContactsmodule.
3.
SettheOperationfieldtoCreate.
4.
StoretheresultintheF.
ContactXMLvariable.
5.
ClickOK.
6.
AddanewXMLsourceandnameitFetchContactFromRequest.
7.
FromtheXSDFileproperty,selectthefollowing:course_data\schemas\request.
xsd.
8.
FromtheVariableproperty,selecttheC.
RequestXMLvariable.
Youarenowreadytomap.
9.
OntheDataMapper'sSourcepane,openthefollowingnode:Request>CustomerDetail.
10.
OntheDestinationpane,openContacts>row>Fields.
11.
ConnecttheCustomer_Namenodetothefirst_namenodeandthelast_namenode.
Inordertohavethefirstnameandlastnameappeartogetherasthecustomername,you'lluseexpressions.
12.
Placethecursoronthefirst_namenodeandintheCalculatedValueproperty,enterthefollowingexpression:StrToken(RepStr(Trim(Src.
S1/Request/CustomerDetail/Customer_Name)1,'_')Intheexpressionabove,rememberthatyouenterthepathSrc.
S1/Request/CustomerDetail/Customer_NamebyclickingtheSourceNodesiconatthetopoftheExpressionEditor.
Theexpressionfirstreplacestheseparatingspacewithanunderscoreandthenfetchesthefirsttoken.
Thisisbecauseaspacecannotbeatoken34delimiter.
Nowyou'lldothesameforthelastname.
13.
Placethecursoronthelast_namenodeintheCalculatedValueproperty,entertheStrToken(RepStr(Trim(Src.
S1/Request/CustomerDetail/Customer_Name2,'_')14.
ConnectE-mail_Addresstoemail1.
Makesurethatyouselectemail1andnotjustemail.
15.
IntheDestinationpane,placethecursorontheaccount_idnodeandfromtheCalculatedValueproperty,selectF.
AccountId,theIDreturnedbytheAddAccountstep.
WhenaddinganewobjecttoSugarCRMfromyourInternetbrowser,adropdownlistprovidesapredefinedlistofavailablevalues.
Forexample,intheContactsmodule,adropdownlistenablesyoutoselectwhetherthecontactisMr.
,Ms.
,Mrs.
,Dr.
,orProf.
ThesevaluesareprovidedinternallybySugarCRM.
1.
IntheDestinationpane,placethecursoronthesalutationnode.
2.
IntheAdditionalXMLPropertiessectionofthePropertiespane,gototheEnumerationpropertyandyouwillseetheavailableoptionsasdefinedbySugarCRM.
Youcanalsoseetheseread-onlyoptionsinthebottomleftoftheDataMapperscreen.
3.
Manuallyenter'Mr.
'asthevalueintheCalculatedValueproperty.
Youhavenowfinishedaddingthecontact.
35Youcanaddavalidationsteplikeyoudidabovewhenyouaddedanaccount.
However,thestepswon'tbepresentedhere.
Iftheflowsucceeds,youwanttocarryoutthesamestepsthatyoudidwhentheaccountexisted.
1.
Right-clickontheAddContactstep,selectGoToandclickontheInitializevariablestep.
2.
AddthefollowingconditiontotheInitializevariablestep:F.
AccountExists.
36Nowyou'llchecktheflow.
3.
MovetheNonexistingaccountandcontact.
xmlfilefromtheoutdirectoryintotheindirectory.
4.
RuntheDebuggerandthenlookinSugarCRMtomakesurethatanewaccountandcontactwereaddedasshownintheimagebelow.
AswiththeQueryoperation,theMagicxpiSugarconnectorsavestheXMLSchema,theXSD,inthefollowingdirectory:[projectdir]\[projectname]\[projectname]\SugarCRM\XSD\[resourcename]37ExerciseChecktoseeiftheitemsintherequestarevalid,meaningthattheyexistandtherequestedpricesisacceptable.
Iftheitemsarevalid,addtherequestasaSugarCRMopportunity.
Theopportunityshouldmeetthefollowingcriteria:Closethisopportunityintwomonths'time.
IntheNextStepfield,enterSendemailtocustomer.
FortheStageNamefield,enteravaluefromtheselectionlist.
Onceyouhavetriedthisonyourown,pleasemakesuretolookatthesolutionforthisexerciseonpage69.
38SummaryInthislesson,you:LearnedhowtoaddanobjecttotheSugarCRMdatabase.
Addedanaccountandacontactforthataccount.
Addedanewopportunity.
39SugarCRMObjectIDInthepreviouslessons,youlearnedabouttheMagicxpiSugarconnector,andyouwereabletofetchobjectsfromSugarCRMobjectsusingcriteriasentfromMagicxpi.
YouwerethenabletouseMagicxpitoperformotherflowactivities.
AnySugarCRMobjectcanbequeriedinthemannerthatwasdiscussedinthepreviouslesson.
InSugarCRM,everyobjecthasauniqueidentifier,anobjectID.
SomeobjectsinSugarCRMrequireaquerybasedonanIDfromaparentobject.
MagicxpienablesyoutoqueryobjectsbytheobjectID.
Thislessoncoversvarioustopicsincluding:CreatinganobjectbyIDSugarCRMObjectIDMagicxpi'sgetObjectIDbyFieldinternalfunctionLesson440CreatingObjectsbyIDWhenyoucreateordeleteaSugarCRMobject,whichisdependentonaparentobject,youneedtoretrievetheparentobject'sID.
Tosimplifythisprocess,youcanusetheinternalgetObjectIDbyFieldfunctioninthenode'sCalculatedValueproperty.
ThefunctioncanonlybeusedwithinaSugarconnectorstep,andisnotseeninthefunctionlist.
Syntax'getObjectIDbyField(ModuleName,FieldName,FieldValue,ErrorIfEmpty)'ParametersModuleNameisthenameoftheSugarCRMmoduleexactlyasitappearsintheAPI.
FieldNameisthenameofthemodulefieldthatisusedintheoperation.
FieldValueisthevaluetocreate.
ErrorIfEmpty,whensettotrue,determinesthat:IfthemethoddoesnotfindanID,theoperationwillnotbeperformed.
IfthegetObjectIDbyFieldfunctionreturnsanemptyvalue,then:TheCreateoperationwillnotcreateanobject,andanerrorwillbereturnedintheresultXML.
TheUpdateoperationwillnotupdateanobject,andanerrorwillbereturnedintheresultXML.
ReturnTheIDofthelinkedobject.
Example'getObjectIDbyField(Accounts,account_id,NelsonInc,true)'returnstheIDoftheaccountwhosenameisNelsonInc.
NoteItisimportanttomakesurethatthewholeexpressionisenclosedbysinglestraightquotationmarks('').
Itisastring,andthewholestringispassedtotheSugarconnectorforparsing.
Thisiswhythewholestringisencompassedbysingleapostrophes.
Currently,thisfunctionisnotsupportedfortheQueryoperation.
Whenyouusethisfunction,youcanonlysearchforasinglevalue.
YoucannotfindtheIDbasedonmorethanonenode,forexampletheNameandtheCity.
Ifthesearchdiscoversmorethanoneentry,onlythefirstIDthatwasfoundisreturned.
41FetchingtheIDoftheSugarCRMAccountInthesectionabove,theexamplelookedforaSugarCRMaccountnamedNelsonInc.
ThisisthenameofanaccountinademoprovidedbySugarCRM.
IfyoudonothavethisaccountinSugarCRM,useonefromyourSugarCRMdatabase.
Nowyouwilladdacontactthatbelongstothataccount.
Forthepurposeofthisexample,youwilladdanewflow.
1.
CreateaflowcalledScanforContacts.
2.
Addoneflowvariable:F.
Contact,aBLOBvariable.
ThisvariablewillholdtheresultfromtheCreateoperation.
3.
DragaSugarconnectorasthefirststepintheScanforContactsflow.
4.
SetthestepnametoCheckforContact.
5.
InSettingssectionofthePropertiespane,makesurethattheResourceNamepropertyissettotheSugarseminarresource.
AsthisistheonlySugarCRMresource,itwasprobablyselectedautomaticallybyMagicxpi.
6.
OpentheSugarConfigurationdialogbox.
Checkingthecontact'sexistenceYouwillusetheSugarconnectortocheckwhetheracontactexistsinanaccountinSugarCRM.
MakesurethattheSugarCRMaccountthatyouareusinghasatleastonecontact.
IntheSugarCRMdemosystem,theNelsonIncaccounthasthreecontacts.
1.
IntheModulefield,clicktheselectionbuttonandselecttheContactsmodulefromtheselectionlist.
2.
IntheOperationfield,makesurethatCreateisselected.
3.
IntheStoreResultInfield,selecttheF.
Contactvariablethatyoudefinedearlier.
4.
ClickOK.
Thisisverysimilartothepreviouslesson.
Aswiththepreviouslesson,youarecurrentlyusingtheSugarconnectorwiththeXMLinterface.
Therefore,youusetheDataMappertoconfigureit.
TheContactsmodulerequirestheaccount_identryoftheaccountthatthecontactbelongsto.
Forthis,youneedtheID.
425.
IntheDestinationpane,parkontheaccount_idnode.
6.
FromtheCalculatedValueproperty,zoomtotheExpressionEditor.
7.
IntheExpressionEditor,enter'getObjectIDbyField(Accounts,name,NelsonInc,true)'.
Donotforgettheapostrophes.
IfyoudonothavetheNelsonIncaccount,thenaddtheaccountnameoranyofyourownaccounts.
TheNelsonIncaccountisprovidedasanexample.
Inthisexample,thegetObjectIDbyFieldsearchesfortheIDoftheNelsonIncaccount.
8.
Inthefirst_namenode'sCalculatedValueproperty,enter:'David'.
9.
Inthelast_namenode'sCalculatedValueproperty,enter:'Martin'.
10.
Setabreakpointonthestep.
11.
CheckthefunctionalitybyusingtheDebuggerontheflow.
Youdothisbyright-clickingontheflowintheSolutionExplorerandselectingDebug.
12.
WhentheDebuggerstops,intheContextTree,right-clickontheCheckforAccountentryandselectStep.
13.
WhentheDebuggerstopsagain,ifeverythingwasconfiguredcorrectly,youwillfindthecontactIDintheContextViewfortheF.
Contactvariable.
4314.
YouwillalsoseeanewcontactinSugarCRMnamedDavidMartinthatispartoftheNelsonIncaccount.
44SummaryInthislesson:YoulearnedthateachSugarCRMobjecthasauniqueIDthatuniquelyidentifiesit.
YoulearnedthatbyusingthegetObjectIDbyFieldSugarconnectorfunction,youcanretrievetheIDofaspecificobjectbyqueryingthevalueofafield.
45CreatingaSugarCRMQuoteScenarioTherearefivestepsforcreatingaSugarCRMquote:1.
UsetheSugarCRMXMLinterfacetocreateaquote.
2.
UsetheCreateProductBundlesmethodtocreateaSugarCRMgroup.
3.
Createtheproductsthatyouwanttohaveinyourquote,makingsurethatyoudefinevaluessuchasquantity,price,andrelevantdiscounts.
4.
UsetheLinkmethodtolinktheproductbundleandtheproducts.
5.
UsetheLinkmethodtolinkthequoteandtheproductbundle.
Lesson546UsingtheXMLInterfacetoCreateaQuoteThequotescenarioisnotsupportedintheLegacyAPIimplementationoftheconnector.
1.
CreateaflowandnameitSugarQuote.
2.
PlacethecursorontheflowintheSolutionExplorerandsettheAutoStartpropertytoYes.
BysettingthispropertytoYes,you'retellingMagicxpitostartthisflowwhenyourunordebugtheproject.
CreatingtheVariablesYou'lldefinenowthevariablesthatyou'llneedinthisflow.
Asyoucontinueonwiththeseminar,you'llseewhateachoneisusedfor.
3.
Createthefollowingcontextvariables:C.
QuoteID,Alpha100C.
ProductBundleID,Alpha100C.
Products,BlobC.
ProductID,Alpha100C.
LinkBundlewithProduct,Alpha100C.
LinkQuotewithProduct,Alpha1004.
Createthefollowingflowvariables:F.
QuoteXML,BlobF.
QuoteName,Alpha30InSugarCRM7,theproductsarelistedintheQuotedLineItemsmoduleandtheProductCatalogisaccessedviatheAdminmenu.
47DefiningaFlowDataService1.
AddaFlowDataServicetotheflow.
2.
Createanewentrywiththefollowingvalues:Action=UpdateType=FlowName=F.
quoteNameDataType=AlphaEncoding=AnsiUpdateExpression='Quote_1'Thiswillserveasthenameofthequote.
CreatingaQuote1.
AddaSugarstepundertheFlowDatastep.
2.
SettheNamepropertyto:CreateaQuote.
3.
LeavetheInterfaceasXML.
4.
IntheSugarConfigurationdialogbox,settheModuletoQuotes.
5.
SettheOperationtoCreate.
6.
FromtheNewObjectIDfield,selectC.
QuoteID.
7.
FromtheStoreResultInfield,selecttheF.
QuoteXMLvariable.
488.
IntheDataMapper,rightclickonthefollowingnodesandsettheirCalculatedvalueproperties:name=F.
QuoteNamedate_quote_expected_closed='06/11/2016'DATEThiswillbeenteredintheValidUntilcolumninSugarCRM.
Thisisaquickwayofcreatingadateobjectforspecificdata.
quote_stage='Draft'ThiswillbeenteredintheQuotecolumninSugarCRM.
CreatingaProductBundle1.
DragaSugarconnectorundertheCreateaQuotestepandnameitCreateProductBundle.
2.
SettheInterfacepropertytoMethod.
3.
Doubleclickonthestep.
TheDirectAccessMethod:Sugardialogboxopens.
4.
AddanewCreateProductBundlesmethod.
TheMagicxpiCreateProductBundlesmethodletsyoubundleproductsintoagroup.
ThiscreatesaGroupinSugarCRM'sQuoteLineItems.
Asyoucanseeintheimagebelow,theGroupNameandGroupStageparametersinMagicxpipopulatestheGroupNameandGroupStagefieldsinSugarCRM.
5.
IntheGroupNameparameter,enterthetext:'PriorityCustomer'.
6.
IntheGroupStageparameter,selectDraft.
7.
IntheResultProductBundleIDparameter,selecttheC.
ProductBundleIDvariable.
You'll49usethistoLinkthemoduletothequote.
8.
IntheErrorCodeparameter,selectC.
UserCode.
LinktheQuoteswiththeProductBundleNowgobacktotheSugarQuoteflowwhereyou'lllinktheQuoteIDwiththeProductBundle.
You'llusetheLinkmethod,whichcreateslinksbetweenquotes,productbundles,andproducts.
Note:Youcanlinkmultipleproductstooneproductbundleandthisproductbundlewillbelinkedtothequoteobject.
1.
DraganotherSugarconnectortotheendoftheflowandnameitLinkQuotewithProduct.
2.
CreateaLinkmethod.
3.
IntheModuleNameparameter,enter'Quotes'.
4.
IntheModuleIDparameter,selectC.
QuoteID.
5.
IntheLinkNameparameter,enter'Product_Bundles'.
6.
IntheLinkModuleIDparameter,selectC.
ProductBundleID.
7.
IntheLinkResultparameter,selectC.
LinkQuotewithProduct.
8.
IntheErrorCodeparameter,selectC.
UserCode.
CreatingProductsYouwillnowcreatemultipleproducts.
1.
DragaSugarconnectortotheendoftheflowandnameitCreateProducts.
2.
SettheInterfacetoXML.
3.
SettheModuletoProducts.
4.
SettheOperationtoCreate.
5.
FromtheNewObjectIDfield,selecttheC.
ProductIDvariable.
6.
FromtheStoreResultInfield,selecttheC.
Productsvariable.
507.
ClickOK.
Nowyou'llusetheproducts.
csvfilethatisinthecourse_datafolder.
Twoproductshavebeendefinedhereandyou'llsetupMagicxpisothatitcreatestheseproductsinSugarCRM.
Youcanseethatthefileincludestwoproductswiththreecolumns.
ThesecondcolumnistheProductID.
InSugarCRM,youcanfindtheProductIDintheURL.
Forexample,youcanseeaProductIDattheendofthefollowingURL:8.
OntheSourceside,addanewFlatFileentry.
9.
FromtheSourceTypeproperty,selectFile.
10.
IntheFilePathproperty,enterthefollowingexpression:EnvVal('currentprojectdir')&'course_data\Products.
csv'11.
FromtheCollectionproperty,clickthebutton.
12.
IntheFlatFilePropertiesdialogbox,definethefollowingthreeentries:NameDataTypeFormatLengthNameAlpha3030IDAlpha100100PriceNumeric12.
41713.
ClickOK.
14.
OntheSourceside,opentheRecordnode.
15.
OntheDestinationside,opentheProducts>row>Fieldsnode.
16.
Mapthefollowingnodes:NametonameIDtoproduct_template_idTheproductIDwillbegeneratedautomaticallybySugarCRMoncetheproductiscreated.
Pricetolist_price51LinktheProductBundleandtheProductsYouwillnowlinkalloftheproductstotheProductBundle.
1.
Createanewflow.
2.
Nametheflow:LinkProducttoProductBundle.
3.
DragaSugarconnectorontotheflowandnameitLinkBundlewithProducts.
4.
CreateanewLinkmethod.
5.
IntheModuleNameparameter,enter'ProductBundles'.
6.
IntheModuleIDparameter,selecttheC.
ProductBundleIDvariable.
7.
IntheLinkNameparameter,enter'Products'.
8.
IntheLinkModuleIDparameter,selecttheC.
ProductIDvariable.
9.
IntheLinkResultparameter,selecttheC.
LinkBundlewithProductvariable.
10.
IntheErrorCodeparameter,selecttheC.
UserCodevariable.
Nowyou'lldefineaDataMapperthatwillcalltheLinkProducttoProductBundleflowthatyoujustcreated.
1.
IntheLinkQuotewithProductflow,dragaDataMappercomponentbelowtheCreateProductsstep.
2.
CreateanXMLsource.
3.
IntheXSDFileproperty,selectthefollowing:SugarCRM\XSD\Sugarseminar\Products.
xsd.
4.
IntheVariableproperty,selectC.
Productsvariable.
5.
CreateaCallFlowdestination.
6.
FromtheFlowNameproperty,selecttheLinkProducttoProductBundleflow.
7.
MaptheProducts>row>Return>IdtoC.
ProductId.
8.
OntheDestinationside,placeyourcursorontheLinkProducttoProductBundleflowandsettheConditionpropertywiththefollowing:Src.
S1/Products/row/Return/Success.
9.
AddaNOPstepandnameitEnd.
52That'sit.
You'vefinishedcreatingthisflow.
RunningtheFlow1.
RuntheDebuggerbyclickingtheStartDebuggingicon.
2.
LogintoSugarCRM.
3.
GotoQuotes:4.
Openthequotethatwasjustcreated.
5.
Youshouldseetwoitemscreated:AngelicaGadgetandSantoGadget.
Thisistheproductbundle.
6.
GotoQuotedLineItems:7.
Clickonthefirstnewproductandmodifyit.
8.
YoucanthenseethechangesintheQuote(clickagainonQuotes).
Notethatinthisscenario,youdidnotcarryoutvalidationstepssincethisisjustanexampleofhowtoimplementthestepsofthequotescenario.
53SummaryInthislesson,youlearnedaboutaspecificscenarioinMagicxpi–howtocreateaSugarCRMQuote.
Youlearnedthatthisisafivestepprocess:1.
UsingtheSugarCRMXMLinterfacetocreateaquote.
2.
UsingtheCreateProductBundlesmethodtocreateaSugarCRMgroup.
3.
Creatingtheproductsthatyouwanttohaveinyourquote.
4.
UsingtheLinkmethodtolinktheproductbundleandtheproducts.
5.
UsingtheLinkmethodtolinkthequoteandtheproductbundle.
5455CapturingEventsInanintegrationproject,youneedtobeabletohandleactionsthatareinvokedbytheso-calledotherside,theentitythatyouwanttointegratewith.
CapturingeventsinSugarCRMenablesthetriggeringofworkflows,basedonactionscarriedoutinSugarCRM.
Forexample,ifyouneedtoaddthecustomerdetailstoalocaldatabasewhenanAccountiscreatedinSugarCRM,theworkflowwillbeinitiatedbyanactioncarriedoutinSugarCRM.
TheMagicxpiSugarconnectortriggerpollsSugarCRMfornecessarymodificationsandinvokestheflow.
Thislessoncoversvarioustopicsincluding:SugarserviceSugartriggerDateTimefieldsLesson656SugarConnectorServiceBeforedefiningaSugarconnectortrigger,youneedtodefineaSugarserviceasfollows:1.
FromtheProjectmenu,selectSettings.
2.
ParkonServicesandclickAdd.
3.
FromtheServiceTypefield,selectSugar.
4.
Nametheservice:CaptureAccount.
5.
FromtheSugarResourcefield,selecttheresourcethatyoudefinedearlier:Sugarseminar.
SugarTriggerYouaregoingtodefineaMagicxpitriggerthatwillinvokeaflowwheneveranewaccountisaddedinSugarCRM.
TheMagicxpiflowwillsendawelcomeemailtoasalesperson.
Sendinganemailtotheadministratorisprovidedasanexampleofaprocess.
OncetheflowisinvokedyoucanaddanyMagicxpicomponent.
Forexample,youmightwanttoaddtheaccountasacustomerinalocaldatabaseoryoumightwanttocreateafileofallcustomersadded.
57Youaregoingtouseanewflowforthepurposeofthislesson:1.
Createanewflowandnameit:NewAccountAdded.
2.
Beforecontinuing,youneedtoaddthefollowingflowvariables:F.
AccountResult–BLOBF.
RowLabel–Alpha30F.
Emailbody–BLOB3.
Definethefollowingglobalvariable.
Thiswillbeexplainedlateron:G.
TriggerStartDate–Alpha304.
InitializetheG.
TriggerStartDateglobalvariablewiththestartdateofthecoursebyclickingtheexpressionbuttonandusingtheDateTimeFormatfunctioninthefollowingformat:DateTimeFormat(Date()-1,'10:45:30'TIME,'+03:00',1).
Thiswillbeexplainedlateroninthislesson.
Nowyouwilldefineatriggerfortheflow:1.
DragaSugarconnectortotheTriggerareaandnameitScanforAccounts.
TheSugarservicethatyoucreatedisautomaticallyselected.
2.
DoubleclickonthetriggerandintheSugarTriggerConfigurationdialogbox,clickNew.
3.
IntheRowLabelcolumn,youcanenteryourowntexttoidentifythisrow,forexampleAccountAdded.
TheRowLabelisusefulifyouhavemultiplelines.
Thispropertyisnotmandatory.
Theuseofthelabelwillbeexplainedlater.
4.
SelecttheSugarCRMmodulethatyouwanttopoll.
Inthisexample,youwillselectAccounts.
5.
Determineifyouwantanindicationofwhethertheobjectwasupdatedordeleted.
Inthisexample,selectCreated.
Notethatthereisnoindicationastowhetherthisisanewaccountoranupdatedaccount.
6.
IntheStartDateproperty,selecttheG.
TriggerStartDatevariablethatyoupreviouslycreated.
Thetriggerwillretrieveaccountsthatwereaddedorupdatedfromthedatethatyoudefinedinthevariable.
IntheStartDateproperty,ifthevariableisemptyorifyoudonotuseavariable,Magicxpistartspollingfromthenexttimeyouruntheproject.
MagicxpisavesanindicationofthelasttimethatSugarCRMwaspolledforeachresource,objectandoperationcombination.
ThelasttimestampissavedintheTrigger.
xmlfileunder%currentprojectdir%SugarCRM.
TherequiredformatforthispropertyandSugarCRMistheXMLDateTimeformat.
Thiswillbediscussedinthenextsection.
58Enterasmanyrowsasneeded.
ThisisthesameasaddingdifferentSugartriggers.
Then,byusingtheRowLabelcolumnwithintheflow,youcanidentifywhichtriggerwasactuallyinvoked.
TheSugarconnectortriggerisapollingtrigger.
ThismeansthatMagicxpiwillchecktheSugarCRMserveratpredefinedintervals.
Bydefault,theintervalissettofiveminutes.
7.
SetthePollingintervaloptionto00:01(1minute);otherwise,SugarCRMwillusethedefaultandwaitfiveminutes.
8.
IntheStoreXMLResultInoption,selecttheF.
AccountResultvariable,whichreturnstheobjectdetails.
9.
IntheStoreRowLabelInoptions,selecttheF.
RowLabelvariable,whichholdsthevalueofthetriggerthatwasinvoked.
Datacanberetrievedonlyforobjectstowhichthelogged-inuserhasaccess.
5910.
ClickOK.
Thetriggerhasnowbeendefined.
You'llnowcreateaDataMappersteptoextractspecificinformationfromtheresultvariable,F.
AccountResult.
Inthiscase,you'lluseatemplatetodisplaythisfieldinacertainstructure.
1.
DragaDataMappercomponentasthefirststepintheflow.
2.
CreateanXMLsource.
3.
IntheXSDFileproperty,selectSugarCRM\XSD\Sugarseminar\Accounts.
xsd.
4.
IntheVariableproperty,selecttheF.
AccountResultvariable.
5.
CreateaTemplatedestination.
6.
FromtheTemplateFileproperty,selectcourse_data\Templates\AccountAdded.
tpl.
ThisisanHTMLtemplatethatyouwillusetosendapersonalizedemailtotheadministrator.
7.
IntheDestinationTypeproperty,selectVariable.
8.
IntheVariableproperty,selecttheF.
Emailbodyvariable.
Thiswillbeusedastheemail'sHTMLbody.
9.
MaptheAccounts>row>Fields>namenodetotheCustomerNamenode.
You'llnowsendtheemailtotheadministrator.
1.
AddauserenvironmentvariablenamedAdmin_emailandsettheemailforyouradministrator(Project>Settings>ProjectEnvironment>UserEnvironmentVariables).
2.
DefineanEmailresourcewiththesettingsrelevantforyouremailserver.
Ifyoudonothavetheparametersofanemailorarenotabletodefineorconnecttoone,youcanskiptheemailstep,savetheemailbodytothefilesystem,andchecktheHTMLpagethatwascreated.
3.
ClicktheValidatebuttontochecktheaccuracyoftheinformationyouentered.
4.
DraganEmailcomponentasthefirststepandnameitSendemailtoadministrator.
5.
Doubleclickonthestep.
6.
AddaQuickSendmethod.
7.
FromtheToparameter,selecttheAdmin_emailenvironmentvariable.
8.
IntheSubjectparameter,enterthefollowing:Anewaccountwasadded.
9.
IntheBodyTypeparameter,selectHTML.
10.
IntheBodyparameter,selecttheF.
Emailbodyvariable.
60You'llnowruntheDebuggerandseeifyoureceiveanemail.
However,sincewedon'twanttorunalloftheflows,we'llmaketheotherflowsinactiveinordertoruntheDebugger.
1.
Right-clickoneachoftheflows,exceptthelastone,andselectInactive.
IntheNavigationpane,theinactivestepswillappearinred.
2.
RuntheDebuggerfromthetoolbarwithabreakpointontheDataMapperstep.
3.
Sincethetrigger'spollingintervalwassetto1minute,youmighthavetowait1minuteuntiltheprocessstartsworking.
4.
Checktoseeifyoureceiveanemail.
5.
WhenyoufinishworkingwiththeDebugger,removetheInactivestatusfromtheflows.
61DateTimeFieldsSugarCRMstoresDateTimefieldvaluesasGreenwichMeanTime(GMT).
WhenoneofthesevaluesisreturnedinSugarCRM,itisautomaticallyadjustedforthetimezonespecifiedinyourorganization'spreferences.
TheMagicxpiDateandTimeformatsdonotconformtotheSugarCRMconvention.
YouneedtohandlethisconversioninyourMagicxpiproject.
SyntaxDateTimeFormat(date,time,timezone,format)Parametersdateisanydatevariable(orahard-codeddate,suchas'05/06/2008'DATE,oranexpressionthatevaluatestoadate).
timeisanytimevariable(orahard-codedtime,suchas'16:10:14'TIME,oranexpressionthatevaluatestoatime).
timezoneisthetimezonethatyouwanttouserelativetoGMT.
formatisoneofthefollowing:1–XMLDateTimeformat,whichisYYYY-MM-DDThh:mm:ssTZD.
MakesureyouaddthefirstTaspartofthestring.
2–JDEJuliandayformat,whichisCYYDDD,whereCisthecentury(0=1900and1=2000),YYistheyearandDDDthedayoftheyear.
ReturnDateTimestringinrequiredformat.
ExampleIfyouhave:DateTimeFormat('29/04/2008'DATE,'10:45:30'TIME,'+03:00',1),itreturns2008-04-29T10:45:30+3:00.
NoteTheDATEthatyouseeinthestringabove,'29/04/2008'DATE,isaMagicxpiliteral.
Ifyouusethisliteral,thestringisinterpretedasadate.
Youcanuseitinarithmeticoperationsbecauseit'sinternallyrepresentedasaNumericvalue.
So,forexample,'01/01/97'DATE+14isavalidexpressionthatyieldsthedate15/01/97.
62ExerciseForyourownexercise(asolutionisnotprovidedwiththisseminar):Ifthecustomerexistsbutthecontactisanewone,addthecontacttotheaccountandaddthiscontacttotheopportunity.
Checkthatthecontactwasaddedtotheaccountsuccessfully.
Checkthatthecontactwasaddedtotheopportunitysuccessfully.
SummaryInthislesson,youlearnedhowto:CaptureSugarCRMevents.
TriggeraflowwhenaneventoccursinSugarCRM.
DefineSugarCRMdatesinMagicxpi.
63SolutionsLesson2–QueryingSugarCRMviaMagicxpiInthisexercise,youareaskedtocheckwhethertheproductsarevalidSugarCRMproducts.
Youareaskedtodothisiftheaccountexists.
Toperformthisyouwillneedaseparateflowthatwillcheckeachproduct.
1.
CreateaflownamedCheckItems.
2.
Addthefollowingcontextvariable:C.
All_Items_Exist,aLogicalvariablewiththedefaultvaluesetto'FALSE'LOG.
3.
Addthefollowingflowvariables:F.
ItemCode,anAlphavariablewithasizeof100.
F.
Products,aBLOBvariable.
ThiswillholdthereturneddatafromtheSugarCRMquery.
F.
ProductAvailable,aLogicalvariablewithaconditionsetto'FALSE'LOG.
TheProductTemplatesmoduleistheSugarCRMProductCatalog.
64NowyouwillquerytheProductTemplatesmodule.
1.
DropaSugarconnectorasthefirststepoftheCheckItemsflow.
NameitQueryProductTemplate.
2.
Double-clickonthesteptoopentheSugarConfigurationdialogbox.
3.
IntheModuleproperty,selecttheProductTemplatesmodule.
4.
SettheOperationtoQuery.
5.
SettheStoreresultinpropertytoF.
Products.
Thenextstageistomap.
1.
IntheDataMapper'sDestinationpane,expandProductTemplates>row>Fields.
2.
ParkontheidnodeandintheCalculatedvalueproperty,selecttheF.
ItemCodevariable.
65Nowyou'lladdaDataMappertocheckthattheproductsexistandthatthepriceisarelevantprice.
1.
DropaDataMappercomponentundertheQueryProductTemplatestep.
2.
NameitCheckExists.
3.
CreateanewXMLsource.
4.
IntheXSDFileproperty,selectthefollowingschema:SugarCRM\XSD\Sugarseminar\ProductTemplates.
xsd.
5.
FromtheVariableproperty,selecttheF.
Productsvariable.
6.
CreateaVariabledestinationandselecttheF.
ProductAvailablevariable.
Thenextstageistomap.
1.
IntheSourcepane,expandProductTemplates>row>Fields.
2.
IntheDestinationpane,expandtheInstancenode.
3.
ConnectthestatusnodewiththeF.
ProductAvailablevariable.
4.
SettheCalculatedvalueoftheF.
ProductAvailablevariableto:Lower(Src.
S1/ProductTemplates/row/Fields/status)='available'WeusetheLowerfunctionherebecauseifwedon'tknowhowthedataissavedinthedatabaseorapplication,wewanttomakesurethatwhencomparingastringthatwe'reforcingeverythingtobeinthesamecase.
AtthisstagetheF.
ProductAvailablevariableshouldhaveavaluebasedonthelogicthatyoudefinedinyourmapping.
Inthenextstepyou'llupdatetheC.
All_Items_Existcontextvariablebasedonthevalueofthetwoflowvariables.
1.
DropaFlowDatastepasachildstepoftheCheckExistsstepandnameitUpdatevariable.
2.
ClickontheFlowDatastep.
3.
ClickAdd.
4.
SettheActionpropertytoUpdate.
5.
SettheTypetoContext.
6.
FromtheNamecolumn,selecttheC.
All_Items_Existvariable.
7.
SettheUpdateExpressionto'FALSE'LOG.
8.
ClickOK.
669.
Setthefollowingconditionforthisstep:NOT(F.
ProductAvailable).
Thisexpressionmeansthatiftheproductisnotavailableoriftherequestedpriceislowerthanthecatalogprice,theordercannotbefilledandwemustsettheC.
All_Items_ExistvariabletoFalse.
IfanyofthepreviousrunsoftheCheckitemsflowfoundaproductthatdoesn'texist,nofurthercheckshouldbeperformed.
YoucanpreventtheCheckItemsflowfromrunningbyconditioningthefirststepasfollows:10.
Right-clickontheQueryProductTemplatestepandsetthefollowingcondition:C.
All_Items_Exist.
Nowyouneedtocallthisflowforeachitem;butfirstyouneedtoinitializethecontextvariable.
1.
OpentheScanforNewRequestsflow.
2.
DropaFlowDataserviceasachildstepoftheCheckifAccountExistsstep.
NameitInitializevariable.
3.
Doubleclickonthestep.
4.
ClickAdd.
5.
SettheActionpropertytoUpdate.
6.
SettheTypetoContext.
7.
FromtheNamecolumn,selecttheC.
All_Items_Existvariable.
8.
SettheUpdateExpressionto'TRUE'LOG.
Nowyouarereadytocallthenewflow.
1.
DropaDataMappercomponentasachildstepoftheInitializevariablestep.
672.
NameitCheckItems.
3.
Doubleclickonthecomponent.
YouneedtousetherequestXMLthatwasretrievedbytheDirectoryScannertoretrievetherequestitems.
Therefore,youneedtohaveanXMLasthesource.
1.
AddanXMLentrytotheSourcepaneoftheDataMapper.
2.
SetthenametoRequestXML.
3.
IntheXSDFileproperty,selectthefollowingschema:course_data\schemas\request.
xsd4.
FromtheVariableproperty,selecttheC.
RequestXMLvariable.
Younowneedtocallthenewflow.
1.
AddaCallFlowentrytotheDestinationpaneoftheDataMapper.
2.
FromtheFlowNameproperty,selecttheCheckItemsflow.
3.
SettheNamepropertytoCheckItemFlow.
Thenextstageistomap.
4.
ConnecttheProduct_IDnodetoF.
ItemCodenode.
Youarereadytotest.
68Inthecourse_data/outfolder,you'llfindXMLrequests,including:Existingaccountandvalidproducts.
xml–Thisincludesavalidaccountandtwoitemsthatexist.
Existingaccountandnonexistingproduct.
xml–Thisincludesavalidaccount,butoneoftheitemsdoesnotexist.
Nonexistingaccount.
xmlNonexistingaccountandcontact.
xmlNonexistingaccountandcontactforopportunity.
xml–Thisincludesanothernon-existingaccountandcontacttobeusedwhencreatingtheopportunity.
Thevalidaccountsandproducts,includingtheirIDs,aretakenfromthesampledatathatweinstalled.
Tomakesurethattheexercisesrunproperly,opentheXMLsandchangetheIDssothattheymatchtheIDsthatwerecreatedfortheseitemswhenyouinstalledthesampledata.
You'llruntheprojectthreetimesusingthefirstthreeXMLfiles.
Youwon'tusethelasttwoXMLsfileinthisexercise.
1.
AddabreakpointtotheCheckItemsstep.
2.
PlaceoneoftheXMLfilesintheinfolderbeforerunningtheproject.
3.
Whentheprocessisfinished,fortheExistingaccountandvalidproducts.
xmlfile,checkthattheF.
AccountExistsvariableissettoTrue.
4.
Fortheothertwofiles,checkthatit'ssettoFalse.
Ifyougettheseresults,theprojectisworkingasexpected.
69Lesson3–AddinganObjectIntheexercise,youwereaskedtoaddanopportunityifalltheitemsarevalid.
1.
IntheScanforNewRequestsflow,createtwoflowvariables:oF.
Opportunity,BLOBoF.
OpportunityID,Alpha1002.
AddaSugarconnectorasachildstepoftheCheckItemsstep.
3.
Namethestepthefollowing:WriteNewOpportunity.
4.
IntheSugarConfigurationdialogbox,fromtheModuleproperty,selectOpportunities.
5.
SettheOperationcolumntoCreate.
6.
FromtheNewObjectIDproperty,selecttheF.
OpportunityIDvariable.
7.
FromtheStoreResultInproperty,selecttheF.
Opportunityvariable.
8.
ClickOK.
Youneedtoconnecttheopportunitytoaspecificaccount.
TheAccountIdispartoftheXMLreturnedbytheAccountQueryoperation.
Thereforeyoucanusethisasthesource.
1.
CreateanXMLsourceandnameitAccountInfo.
2.
FromtheXSDFileproperty,selectthefollowing:SugarCRM\XSD\Sugarseminar\Accounts.
xsd.
3.
FromtheVariableproperty,selectF.
Account.
Youarenowreadytomap.
IntheDataMapperscreen:1.
IntheSourcepane,openthefollowingnode:Accounts>row>Fields.
2.
IntheDestinationpane,openthefollowingnode:Opportunities>row>Fields.
3.
Connecttheidnodetotheaccount_idnode.
4.
Connectthenamenodetotheaccount_namenode.
5.
IntheDestinationpane:a.
Parkonthesales_stagenodeandenteracalculatedvalueforoneoftheentriesforthedrop-downlist,suchas'ValueProposition'.
YoucanviewtheentriesintheEnumerationproperty.
b.
Inthenamenode,enter:'Seminaropportunity'.
c.
Inthenext_stepnode,enterthefollowingcalculatedvalue:'Sendemail'.
Theopportunitycanonlybeaddediftherequestisvalid.
1.
ParkontheWriteNewOpportunitystep.
2.
Setthefollowingcondition:C.
All_Items_Exist.
70ASugarCRMopportunityhastohaveanassociatedRevenueLineItem.
Nowyou'lladdaRevenueLineItemthat'sassociatedwiththeopportunity.
1.
Createtwoflowvariables:oF.
RevenueList,BLOBoF.
RevenueListID,Alpha1002.
AddaSugarconnectorasachildstepoftheWriteNewOpportunitystep.
3.
Namethestepthefollowing:CreateRevenueLineItems.
4.
IntheSugarConfigurationdialogbox,fromtheModuleproperty,selectRevenueLineItems.
5.
SettheOperationcolumntoCreate.
6.
FromtheNewObjectIDproperty,selecttheF.
RevenueListIDvariable.
7.
FromtheStoreResultInproperty,selecttheF.
RevenueListvariable.
8.
ClickOK.
9.
Inthedate_closednode,enterthefollowingcalculatedvalue:AddDate(Date(),0,2,0).
Thismeansthatitwillbeclosedintwomonths.
10.
Intheopportunity_idnode'sCalculatedValueproperty,zoomtotheExpressionEditorandselecttheF.
OpportunityIDvariable.
11.
Inthenamenode'sCalculatedValueproperty,enter:'Magicproducts'.
12.
Setthelikely_casenode'sCalculatedValuepropertyto100.
YoucannowtesttheflowusingtheNonexistingaccountandcontactforopportunity.
xmlfile.
1.
Fortestingpurposes,addaNOPstepundertheCreateRevenueLineItemsstep.
2.
PutabreakpointontheNOPstepandremoveanyotherbreakpointsthatareset.
3.
RuntheDebugger.
Iftheprocessworked,youshouldbeabletofindanopportunityinSugarCRMcalledSeminaropportunityandarevenuelineitemcalledMagicproducts.
数脉科技怎么样?昨天看到数脉科技发布了7月优惠,如果你想购买香港服务器,可以看看他家的产品,性价比还是非常高的。数脉科技对香港自营机房的香港服务器进行超低价促销,可选择10M、30M的优质bgp网络。目前商家有优质BGP、CN2、阿里云线路,国内用户用来做站非常不错,目前E3/16GB阿里云CN2线路的套餐有一个立减400元的优惠,有需要的朋友可以看看。点击进入:数脉科技商家官方网站香港特价阿里云...
印象云,成立于2019年3月的商家,公司注册于中国香港,国人运行。目前主要从事美国CERA机房高防VPS以及香港三网CN2直连VPS和美国洛杉矶GIA三网线路服务器销售。印象云香港三网CN2机房,主要是CN2直连大陆,超低延迟!对于美国CERA机房应该不陌生,主要是做高防服务器产品的,并且此机房对中国大陆支持比较友好,印象云美国高防VPS服务器去程是163直连、三网回程CN2优化,单IP默认给20...
无忧云怎么样?无忧云服务器好不好?无忧云值不值得购买?无忧云是一家成立于2017年的老牌商家旗下的服务器销售品牌,现由深圳市云上无忧网络科技有限公司运营,是正规持证IDC/ISP/IRCS商家,主要销售国内、中国香港、国外服务器产品,线路有腾讯云国外线路、自营香港CN2线路等,都是中国大陆直连线路,非常适合免备案建站业务需求和各种负载较高的项目,同时国内服务器也有多个BGP以及高防节点...
iconworkshop为你推荐
鼓风机morphvox桥面163交换机route三星iphone支持ipad支持ipadipad连不上wifiiPad mini WiFi开关成灰色无法连接,怎么办ipadwifiIpad怎么用移动无线上网iphone连不上wifi苹果8p连接不了WiFiwin7telnetWin7系统中的telnet命令如何应用?
hawkhost 国外php主机 godaddy续费优惠码 空间打开慢 哈喽图床 512au 好玩的桌面 debian源 国外免费空间 服务器是干什么的 免费美国空间 鲁诺 电信主机 ca187 宏讯 阿里云官方网站 河南移动梦网 贵阳电信测速 申请免费空间 lamp怎么读 更多