I have Trace data, but how do I access the values I am seeing while doing the action that is generating them?

I am trying to access the client data in order to do something based on the results. How can I call the data up while I am in epicor performing the action?

For example, I am in a configurator session and as far as I know, I cannot create a customization for each page in the configurator. So… I think I can do something with UD methods in order to access the client trace data, but my question is how…

When I click on buttons I see that data is being created, I need that data in order to perform actions on the next page, but that data is not available to me via native Epicor functionality. How else can I access it?

I may not be explaining myself clearly due to my lack of knowledge about Epicor’s architecture, but if you have any questions please let me know.

Thanks in advance for any help.

here here… I’m utterly confused friend. Can you try again? If I understand you correctly you want to customize the configurator… but the configurator by its nature is completely custom to begin with, so why not change the configurator to do what you want instead of layering more customization on top of it.

Because the value I seek is not available in the configurator designer. I can call Context Properties (“PcContextProperties” as it is labeled in the trace log) using epicors built-in function "Context.[PropertyName] " and it will return that value from the data set. However, I want to access properties from the “PcConfigurationParams” as it is called in the trace log and Epicor does not provide me a way to call that out in the configurator.

I am not sure that is any clearer… Did I explain it any better? Thanks for sticking with me.

Maybe it would be better if you explain in more general terms what you are trying to do. Maybe there’s a better way to do it.

1 Like

I need to know what the parent configurator was for my subconfigurator. I cannot find a way so I thought I would try and do a trace to see if there was data that identified the parent configurator and after looking at the trace log I believe there is. Now I just need to access that data during the configurator session. Do you think there is a better way to find out what configurator called my subconfigurator?

According to the manual you should use Global Variables to pass information between parent / child

I’m not that well versed in configurator, but from reading the other thread, I think you misunderstood what @Mark_Wonsil was trying to say. The Global Variable is a container to house some information. You can change the value of it while in the parent configurator value when you have the parent one open. Then when you open the child one, it would read that global variable. It sounds like that should work.

So why not create a global variable called “Label” or whatever. Then set the value of that on each of the parent configs and then use that value in your child.

One second Jose, I will try and illustrate why global variables will not work for this business case.

Jose, we have Part A. Part A has 3 subassemblies B,C, and D. Inside B, C, and D we have the same subconfigurator, “Config-Finish”. When we configure A, the first page (page 1) will be Config-Finish for Part B. The second page (page 2) will be Config Finish for Part C and the next page (Page 3) is Config Finish for Part D.

When we get to the last page, we realize we made a mistake on the first page, the finish configurator for Part B. How would I know I am in the correct page when going backwards? The same applies when going forward. How would you use global variables to solve this case?

When we ask ourselves this same question we found that global variables would not work. Maybe we are thinking about it wrong. If so, please let us know.

We moved on to the trace log dataset. In that dataset there are values that specify the parent. That is how this thread came to be.

Jose, there any way to tap into the same data that the trace log originates from? Can we do this while we are in the configurator session or am I dreaming?

I am trying to figure out how to get this dataset in the middle of the configuration. I think I can do it using a Configurator User Defined method and using the business object, I just don’t know what parameters to pass it.

Here is the trace log. I need the dataset.

<tracePacket>
  <businessObject>Erp.Proxy.BO.ConfigurationRuntimeImpl</businessObject>
  <methodName>GetNewPcConfigParams</methodName>
  <appServerUri></appServerUri>
  <returnType>System.Void</returnType>
  <localTime>1/18/2019 13:04:54:2647657 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="15" roundTrip="10" channel="0" bpm="0" other="5" />
  <retries>0</retries>
  <parameters>
    <parameter name="RuntimeDS" type="Erp.BO.ConfigurationRuntimeDataSet">
      <ConfigurationRuntimeDataSet xmlns="http://www.epicor.com/Ice/300/BO/ConfigurationRuntime/ConfigurationRuntime">
        <PcValueGrp>
          <Company></Company>
          <GroupSeq>0</GroupSeq>
          <RelatedToTableName>QuoteDtl</RelatedToTableName>
          <RelatedToSysRowID>308e5514-3a7d-4605-97ab-8351838177d5</RelatedToSysRowID>
          <CreateUserID></CreateUserID>
          <LastUpdatedBy></LastUpdatedBy>
          <ConfigStatus>Added</ConfigStatus>
          <SIValues>false</SIValues>
          <HeadNum>0</HeadNum>
          <SysRevID>0</SysRevID>
          <SysRowID>00000000-0000-0000-0000-000000000000</SysRowID>
          <DisplaySummary>false</DisplaySummary>
          <IncomingSmartString>false</IncomingSmartString>
          <TestID>00000000-0000-0000-0000-000000000000</TestID>
          <TestMode>PRODUCTION</TestMode>
          <BitFlag>0</BitFlag>
          <RowMod>A</RowMod>
        </PcValueGrp>
        <PcConfigurationParams>
          <ForeignTableName></ForeignTableName>
          <ForeignSysRowID>00000000-0000-0000-0000-000000000000</ForeignSysRowID>
          <TgtStructTag>/0</TgtStructTag>
          <StructID>0</StructID>
          <InSmartString></InSmartString>
          <IsTestPlan>false</IsTestPlan>
          <SpecID></SpecID>
          <SpecRevNum></SpecRevNum>
          <InspType></InspType>
          <RunningStateOverride></RunningStateOverride>
          <EqmPassed></EqmPassed>
          <EqmFailDesc></EqmFailDesc>
          <EqmOverride>false</EqmOverride>
          <RelatedToTable>QuoteDtl</RelatedToTable>
          <RelatedToSysRowID>308e5514-3a7d-4605-97ab-8351838177d5</RelatedToSysRowID>
          <SourceTable>PartRev</SourceTable>
          <TestID>00000000-0000-0000-0000-000000000000</TestID>
          <TestMode>PRODUCTION</TestMode>
          <AppServerID></AppServerID>
          <PcStatusSysRowID>9d9034e0-4948-44ce-8f4b-c3e69da82434</PcStatusSysRowID>
          <ConfigVersion>6</ConfigVersion>
          <UniqueID>0/0</UniqueID>
          <ConfigID>C-Chair</ConfigID>
          <Company>GRC</Company>
          <InputPricingSet>false</InputPricingSet>
          <OrderPrice>0</OrderPrice>
          <QuotePrice>0</QuotePrice>
          <DemandPrice>0</DemandPrice>
          <PurchasePrice>0</PurchasePrice>
          <WebOrderBasketPrice>0</WebOrderBasketPrice>
          <PartNum>360BS</PartNum>
          <RevisionNum>A</RevisionNum>
          <AltMethod></AltMethod>
          <InitialStructTag></InitialStructTag>
          <InitialRuleTag></InitialRuleTag>
          <TrackerMode>false</TrackerMode>
          <ConfigType>PC</ConfigType>
          <EMFConfiguratorURL></EMFConfiguratorURL>
          <SysRowID>00000000-0000-0000-0000-000000000000</SysRowID>
          <RowMod></RowMod>
        </PcConfigurationParams>
      </ConfigurationRuntimeDataSet>
    </parameter>
    <parameter name="configID" type="System.String"><![CDATA[C-Finish]]></parameter>
    <parameter name="uniqueID" type="System.String"><![CDATA[1/0/1]]></parameter>
    <parameter name="CallContext" type="Ice.Bpm.Context.ContextDataSet">
      <ContextDataSet xmlns="http://www.epicor.com/Ice/300/Bpm/Context">
        <BpmData>
          <SysRowID>00000000-0000-0000-0000-000000000000</SysRowID>
        </BpmData>
      </ContextDataSet>
    </parameter>
  </parameters>
  <paramDataSetChanges>
    <paramDataSet name="RuntimeDS" useDataSetNbr="0">
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="Company"><![CDATA[GRC]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="GroupSeq"><![CDATA[0]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="RelatedToTableName"><![CDATA[QuoteDtl]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="RelatedToSysRowID"><![CDATA[308e5514-3a7d-4605-97ab-8351838177d5]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="CreateUserID"><![CDATA[]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="LastUpdatedBy"><![CDATA[]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="ConfigStatus"><![CDATA[Added]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="SIValues"><![CDATA[False]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="HeadNum"><![CDATA[0]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="SysRevID"><![CDATA[0]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="SysRowID"><![CDATA[00000000-0000-0000-0000-000000000000]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="DisplaySummary"><![CDATA[False]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="IncomingSmartString"><![CDATA[False]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="TestID"><![CDATA[00000000-0000-0000-0000-000000000000]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="TestMode"><![CDATA[PRODUCTION]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="BitFlag"><![CDATA[0]]></changedValue>
      <changedValue tableName="PcValueGrp" rowState="Added" rowNum="0" colName="RowMod"><![CDATA[A]]></changedValue>
    </paramDataSet>
  </paramDataSetChanges>
  <serverTrace>
    <Op Utc="2019-01-18T18:04:54.2552516Z" 
  </serverTrace>
</tracePacket>

I started with this,

var ds = new Erp.Tablesets.PcValueTableset();
var test = Ice.Assemblies.ServiceRenderer.GetService<Erp.Contracts.ConfigurationRuntimeSvcContract>(Db);

But how can I get the current PcValueTableset(); ? Is the only way to do and call all of the business objects and methods that the trace log shows? I don’t know how to dynamically pass the parameters that it wants and where I would source those from.

@josecgomez I never said thanks for your contribution to this post and your screenshots of global variables. I appreciate it greatly! Thank you for your suggestions.

@Banderson thanks for your guidance as well, it is always good to re-think the process and ask ourselves if this is the best way. I still don’t know if it is.

1 Like