• Bithyzis Dimitrios
  • NEWBIE
  • 50 Points
  • Member since 2018

  • Chatter
    Feed
  • 1
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 6
    Questions
  • 8
    Replies

Hello,

I am moving from Active Campaign to SFDC and am trying to build my first flow.  Here's what I am trying to solve for:

When a contact meets the following criteria: 
"21 Day Challenge" checkbox = True AND "21 Day Challenge Start Date" = Today, then begin a once daily flow of emails for 21 days.

When they reach the 21st day, then remove them from the flow.  Emails will be stored as classic email templates and be sent to external email address of SFDC contacts.  

Is flow the best way to approach this?  

Thanks!

Good afternoon, continuing my journey with flows and I am trying to solve the following (Apologies for the long post).
 
Order // Order Products // Price Bools and Inventory Monitoring.
 
The scenario is as follows:
The firm has many Products which in turn have many Product Items (serialised)
The firm has many Price Books
The firm sells Products to Accounts and wants to incorporate Inventory Monitor and also streamline - automate the process for the user.
 
How to provide automation to the users - Steps below
 
1. Created Contracts and related them to Accounts and to Price Books so that when creating an order no price book selection needed.
2. For a first level Inventory monitoring created a trigger on Product Item to roll up - COUNT - the quantity of Product Items to the related Product on a custom field - Available_Quantity__C - so that users when choosing desired products they can see how many are available.
 
The Issue I am facing now is the following, how to automatically adjust the Quantity Field on Product Items once an order is - Activated. I know that this will not solve the issue for when multiple ORDERS enter the system at the same time. For now I will leave it aside - Baby steps.
 
So I thought of my good old trusted friend the visual flow, but I ran on some issues
 
Flow designs
User-added image
First Attempt
1. Fast LookUp Order Item (varTorderId passed from Process Builder)
2. Decision Element - Check if  SObjCvarProductItem is NOT empty
3. If NOT empty Loop through the SObjCvarProductItem and pass the details to SObjVarOrderItems
4. Assign the details of the SObjVarOrderItems to the SObjVarIndividualOrderItems plus some more details
5. Assign the SObjVarIndividualOrderItems TO a new SObjCvarCapturedOrderItems
 
The issue with this solution is that I cannot do an SOQL look up with flow based on a collection variable
 
Second attempt
1. Fast LookUp Order Item (varTorderId passed from Process Builder)
2. Decision Element - Check if  SObjCvarProductItem is NOT empty
3. If NOT empty Loop through the SObjCvarProductItem and pass the details to SObjVarOrderItems
4. Assign the details of the SObjVarOrderItems to the SObjVarIndividualOrderItems plus some more details
5. Decision Element - Check if SObjCvarProductItem is Empty 
   If NO - Back to loop
   If YES - Fast LookUp
where: {!SObjCvarOrderItem} is null {!$GlobalConstant.True}
 
Complete failure
 
Third attempt
 
1. Fast LookUp Order Item (varTorderId passed from Process Builder)
2. Assign element that will count the captured records
    {!varNcountSObjCvarOrderItems} equals counts {!SObjCvarOrderItem}
2. Decision Element - Check if  SObjCvarProductItem is NOT empty
3. If NOT empty Loop through the SObjCvarProductItem and pass the details to SObjVarOrderItems
4. Assign the details of the SObjVarOrderItems to the SObjVarIndividualOrderItems plus some more details.
I also included in this element the following: 
{!varNcountSObjCvarOrderItems} subtract 1
 
5. Decision Element - Check if varNcountSObjCvarOrderItems is Emptu
{!varNcountSObjCvarOrderItems} is null {!$GlobalConstant.True} 
   If NO - Back to loop
   If YES - Fast LookUp
where: {!SObjCvarOrderItem} is null {!$GlobalConstant.True}
 
Success the loop stops correctly BUT the issue now is that because my Assignment element is within the flow it only retains the last values passed from the flow.
 
I know that best practises dictate that record create / record lookup elements should not be nested within a flow
 
Any assistance on the design so that I can fast Lookup all necessary records will be much appreciated


With regards
Dimitrios
Continuing from a previous post to which I have found my flow design error, I decided to take the flow one step further.

Once I locate the two PriceBookEntries for my Product, standard and custom via the loop element I wish to split those findings into two (for the current example) sets of "records" and only keep the "records" relative to the custom PriceBookEntry.

So I introduced a Descision Element after the loop and opted for the following criteria (photo 1 attached)

{!SObjvariableIndividualPriceBookEntries.UseStandardPrice} = {!$GlobalConstant.False} ---- for checkbox not checked


From the debug log, I receive the following: 

1. Fast lookup identifies the records
2. Loop, loops through the variables: 01u0E00000D6a8TQAR,01u0E00000D6ayhQAB and holds the 01u0E00000D6a8TQAR (standard PriceBook)
3. Decision element: Executes outcome Yes
4. Assignment element: Assigns a null value

If I change the criteria on the assignment from False to True
From the debug log, I receive the following: Error Occurred: Too many SOQL queries: 101
From observing the debug log, I can see that the

1. Fast lookup identifies the records
2. Loop, loops through the variables: 01u0E00000D6a8TQAR,01u0E00000D6ayhQAB and holds the 01u0E00000D6a8TQAR (standard)
3. The decision element: Skipped this outcome because its conditions weren't met
4. Fast lookup identifies the records
5. Loop, loops through the variables: 01u0E00000D6a8TQAR,01u0E00000D6ayhQAB and holds the 01u0E00000D6ayhQAB (custom, the one I am looking for)
6. The decision element: Skipped this outcome because its conditions weren't met
7. Fast lookup identifies the records
8. Loop element finds no records to loop through
9. Fast lookup identifies the records
10. Loop, loops through the variables: 01u0E00000D6a8TQAR,01u0E00000D6ayhQAB and holds the 01u0E00000D6a8TQAR and I am landed on step 2 again.

Any guidance will be greatly appreciated
User-added image

With regards
Dimitrios
Good morning

Since I have no coding background, visual flow is a must for me (At least for now) and for some time now I try to understand the tool, its functions and limitations and what better approach than to solve requirements (fictional for now, since I am no yet an admin - exam is in two weeks).

My "requirement" started as:
1. Web-to-Case -------> New Case lands in SF
2. Case record has a custom picklist field that is populated with a value that the Record Submitter choses from.
3. User needs an automation that according to the value of the custom picklist field will allow him/her to email (I am aware that there is a limitation in flow to up to 5 emails) certain contacts in SF that have the same value stored in a custom text field in the contact record.

First Flow approach.
User-added image
  • Custom Button - provides caseId (for flow testing an assignment element is used)
  • User Screen1 - Drop Down list to prompt user to choose a value based on the picklist field values present on the case object (i am trying to automate this step).
  • User Screen2 - Dynamic record choice Multi Select Checkboxes with Choise Label and Choise stored value and NO additional options populated (if populated only one value would be stored).
 
  • Assignment to store the contact emails in a variable -
{!varTContactEmails} equals {!Contacts}, where {!Contacts} are the Screen multi Select fields.
  • Assignment to remove brackets - {!varTContactEmail} equal
{!fvarTRemoveBrackets}, where {!fvarTRemoveBrackets} equals to
TRIM(SUBSTITUTE(SUBSTITUTE({!varTContactEmail},"[", ""),"]", "")) + ";"
  • Assignment add left value to Collection - {!CollectionVariableContactsEmail} add {!fvarTGrabLeftValue}, where {!fvarTGrabLeftValue} equals to
(LEFT({!varTContactEmail},FIND(";",{!varTContactEmail})-1))
  • Assignment to remove last parsed value - {!varTContactEmail} equals {!fvarTRemainingContactEmails}, where {!fvarTRemainingContactEmails} equals to
(RIGHT({!varTContactEmail},LEN({!varTContactEmail})-FIND(";",{!varTContactEmail})))
  • Decision - Remaining values to be parsed
--- Yes: return to step 6
--- No: proceed to email action
  • Email action -
Body: Hello flow is ok
Subject: Flow worked Email addresses (collection):{!CollectionVariableContactsEmail}

Unfortunately the flow results in Error - The "Email_Action_1" element in your flow has validation errors.

Up and to step 5 the emails are correctly passed to the {!varTContactEmail} since I can print them on the screen.

Second Flow Approach (path 2)
Being Stuborn I have redesigned the flow so that to not utilize any screens (maybe I was at fault with any of the assignment ellements OR my formulas), so I completely abolish them and instead I rely on a fast lookup.
User-added image
Unfortunately the flow results in Error - The "XXXX_Test_Email" element in your flow has validation errors.

Third Flow Approach (path 1b)
Reverted back to assignments after viewing the following video: https://screencast-o-matic.com/watch/coi6btfTBg

Again though
Unfortunately the flow results in Error - The "3rd_Attempt" element in your flow has validation errors

On all three attempts I make sure to pull ONLY three emails so that to be within the flow limits (5 mass emails).

Any ideas on what causes the fault will be much appreciated and if anyone is located in Greece or plans to visit Athens Greece ----> Beers are on me.

With regards Dimitrios
Continuing from a previous discussion in the success.salesforce.com.
Due to reasons relating to a learning experiment I had to "hide" the original Parent Account Field from the Account Page layouts and substitute it with a new Lookup Field called Parent Account.

Tried to use the Lightning action View Account Hierarchy and the follwoing message popped up despite utilizing the Admin profile.

User-added image
It is my belief that the error is due to the action being "tied" to the original Parent Account field.

Please be so kind and point me out to the visual force page or Apex code that "governs" this action so that I can take it on as an exercise. 

I found the following post: https://success.salesforce.com/answers?id=90630000000hUjoAAE

Where Javier Accenture points out to modifying the controler but from looking at the developer console I could not locate it and the URL that populates after pressing the Account Hierarchy Button is not helpful at all.


With regards
​​​​​​​Dimitrios
 
Good morning from Greece to all the developer wizzards

Recently I followed the module - 
Develop an Account Geolocation App with Aura Components 

and managed to complete it without an issue albight having ZERO coding experience. My relationship to SF is from the admin perspective but I find coding realy facinating since the solutions one can create are "limitless" so I tried to make adjustments to the component and make it work for the contacts as well, BUT having no experience I runned into issues.

First I created the ContactLocator.cmp (tried to make all the necessary changes to fit my requirement)
<aura:component implements="force:appHostable,flexipage:availableForAllPageTypes">
    <lightning:layout horizontalAlign="space" multipleRows="true">
        <lightning:layoutItem size="12"
                              mediumDeviceSize="12"
                              padding="around-small">
            <c:ContactSearch/>
        </lightning:layoutItem>
        <lightning:layoutItem size="12"
                              mediumDeviceSize="6"
                              padding="around-small">
            <c:ContactList/>
        </lightning:layoutItem>
        <lightning:layoutItem size="12"
                              mediumDeviceSize="6"
                              padding="around-small">
            <div class="slds-box slds-theme_default">
                ContactMap goes here
            </div>
        </lightning:layoutItem>
    </lightning:layout>
</aura:component>

then I created the ContactLocator tab

then I created the ContatctSearchController.apxc
public with sharing class ContatctSearchController {
    @AuraEnabled
    public static List<Contact> searchContacts( String searchTerm ) {
        List<Contact> Contacts = new List<Contact>();
        if ( String.isNotBlank( searchTerm ) ) {
            List<List<SObject>> searchResults = [
                FIND :searchTerm
                RETURNING Contact(
                    Id, Name, Phone,
                    MailingStreet, MailingCity,
                    MailingState, MailingPostalCode
                    ORDER BY Name
                    LIMIT 20
                )
            ];
            contacts = searchResults[0];
        }
        return contacts;
    }
}

then I created the ContactsLoaded.evt
<aura:event type="APPLICATION">
    <aura:attribute name="contacts" type="Contact[]"/>
</aura:event>

then I created the ContactSearch.cmp
<aura:component controller="ContatctSearchController">
    <aura:registerEvent name="contactsLoaded" type="c:ContactsLoaded"/>
    <aura:handler name="init" value="{!this}" action="{!c.onInit}"/>
    <aura:attribute name="searchTerm" type="String" default="Enter Contact Detail"/>
    <lightning:card title="Contact Search" iconName="standard:search">
        <div class="slds-form slds-p-around_x-small">
            <lightning:input
                label="Search"
                variant="label-hidden"
                value="{!v.searchTerm}"
                placeholder="Search by name, phone, website, or address"
                onchange="{!c.onSearchTermChange}"/>
        </div>
    </lightning:card>
</aura:component>

then I created the ContactSearchController.js
({
    onInit: function( component, event, helper ) {
        // proactively search on component initialization
        var searchTerm = component.get( "v.searchTerm" );
        helper.handleSearch( component, searchTerm );
    },
    onSearchTermChange: function( component, event, helper ) {
        // search anytime the term changes
        var searchTerm = component.get( "v.searchTerm" );
        // to improve performance, particularly for fast typers,
        // we wait a small delay to check when user is done typing
        var delayMillis = 500;
        // get timeout id of pending search action
        var timeoutId = component.get( "v.searchTimeoutId" );
        // cancel pending search action and reset timer
        clearTimeout( timeoutId );
        // delay doing search until user stops typing
        // this improves client-side and server-side performance
        timeoutId = setTimeout( $A.getCallback( function() {
            helper.handleSearch( component, searchTerm );
        }), delayMillis );
        component.set( "v.searchTimeoutId", timeoutId );
    }
})

then I created the ContactSearchHelper.js
({
    // code in the helper is reusable by both
    // the controller.js and helper.js files
    handleSearch: function( component, searchTerm ) {
        var action = component.get( "c.searchContacts" );
        action.setParams({
            searchTerm: searchTerm
        });
        action.setCallback( this, function( response ) {
            var event = $A.get( "e.c:ContactsLoaded" );
            event.setParams({
                "contacts": response.getReturnValue()
            });
            event.fire();
        });
        $A.enqueueAction( action );
    }
})

then I created the ContactList.cmp​​​​​​​
<aura:component>
    <aura:handler event="c:ContactsLoaded" action="{!c.onContactsLoaded}"/>
    <lightning:navigation aura:id="navigation"/>
    <aura:attribute name="rows" type="Map[]"/>
    <aura:attribute name="cols" type="Map[]"/>
    <lightning:card title="Contact List" iconName="standard:contact">
        <lightning:datatable
            data="{!v.rows}"
            columns="{!v.cols}"
            keyField="Id"
            hideCheckboxColumn="true"
            showRowNumberColumn="true"
            onrowaction="{!c.onRowAction}"/>
    </lightning:card>
    </aura:component>

then I created the ContactLstController.js​​​​​​​
({
    onAccountsLoaded: function( component, event, helper ) {
        var cols = [
            {
                'label': 'Name',
                'fieldName': 'Name',
                'type': 'text'
            },
            {
                'label': 'Phone',
                'fieldName': 'Phone',
                'type': 'phone'
            },
            {
                'label': 'Website',
                'fieldName': 'Website',
                'type': 'url'
            },
            {
                'label': 'Action',
                'type': 'button',
                'typeAttributes': {
                    'label': 'View details',
                    'name': 'view_details'
                }
            }
        ];
        component.set( 'v.cols', cols );
        component.set( 'v.rows', event.getParam( 'contacts' ) );
    },
    onRowAction: function( component, event, helper ) {
        var action = event.getParam( 'action' );
        var row = event.getParam( 'row' );
        if ( action.name == 'view_details' ) {
            var navigation = component.find( 'navigation' );
            navigation.navigate({
                'type': 'standard__recordPage',
                'attributes': {
                    'objectApiName': 'Contact',
                    'recordId': row.Id,
                    'actionName': 'view'
                }
            });
        }
    }
})
After this step, I stoped to check if everything was working and beingHoping that I have done everything correct I checked the component in the sales application BUT i received the following error
User-added image

Your help with this issue will be greatly appreciated.

If it is possible, please be so kind to also suggest me any matterial that will fastrack my understanding of coding and lightning components.

With regards
​​​​​​​Dimitrios
Hello developers

Need to admit that I have no developer knowledge and I thought that this "project" was a good idea...

Despite the project showing as complete in trailhead I have encountered the following error.

The trailhead section - use events to center the app is working when it is running on the browser but when I include the click event handler to the markers
L.marker(latLng, {account: account}).addTo(map).on('click', function(event) {
    helper.navigateToDetailsView(event.target.options.account.Id);
});


Thus changing the AccountMapControler from

({
    jsLoaded: function(component, event, helper) {
        var map = L.map('map', {zoomControl: false, tap: false}).setView([37.784173, -122.401557], 14);
        L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',
            {
                attribution: 'Tiles © Esri'
            }).addTo(map);
        component.set("v.map", map);
    },
    accountsLoaded: function(component, event, helper) {
        // Add markers
        var map = component.get('v.map');
        var accounts = event.getParam('accounts');
        for (var i=0; i<accounts.length; i++) {
            var account = accounts[i];
            var latLng = [account.Location__Latitude__s, account.Location__Longitude__s];
            L.marker(latLng, {account: account}).addTo(map);
        }  
    },
    accountSelected: function(component, event, helper) {
        // Center the map on the account selected in the list
        var map = component.get('v.map');
        var account = event.getParam("account");
        map.panTo([account.Location__Latitude__s, account.Location__Longitude__s]);
    }
})


To the following

({
    jsLoaded: function(component, event, helper) {
        var map = L.map('map', {zoomControl: false, tap: false}).setView([37.784173, -122.401557], 14);
        L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',
            {
                attribution: 'Tiles © Esri'
            }).addTo(map);
        component.set("v.map", map);
    },
    accountsLoaded: function(component, event, helper) {
        // Add markers
        var map = component.get('v.map');
        var accounts = event.getParam('accounts');
        for (var i=0; i<accounts.length; i++) {
            var account = accounts[i];
            var latLng = [account.Location__Latitude__s, account.Location__Longitude__s];
            L.marker(latLng, {account: account}).addTo(map).on('click', function(event) {
    helper.navigateToDetailsView(event.target.options.account.Id);
});
        }  
    },
    accountSelected: function(component, event, helper) {
        // Center the map on the account selected in the list
        var map = component.get('v.map');
        var account = event.getParam("account");
        map.panTo([account.Location__Latitude__s, account.Location__Longitude__s]);
    }
})
When clicking on a marker from within the web browser tab from where I am running the application, I receive the following error

Uncaught TypeError: Cannot read property 'setParams' of undefined throws at https://cunning-otter-goe27l-dev-ed.lightning.force.com/c/components/c/AccountMap.js:40:15

While if I open the tab in the salesforce 1 and salesforce I receive the below error

Error in $A.getCallback() [helper.reportErrorSafely is not a function]
Object.loadContent()@https://cunning-otter-goe27l-dev-ed.lightning.force.com/components/laf/pageHost.js:18:417
Object.eval()@https://cunning-otter-goe27l-dev-ed.lightning.force.com/components/laf/pageHost.js:14:374


Any help will be much appreciated

With regards
Dimitrios
Continuing from a previous post to which I have found my flow design error, I decided to take the flow one step further.

Once I locate the two PriceBookEntries for my Product, standard and custom via the loop element I wish to split those findings into two (for the current example) sets of "records" and only keep the "records" relative to the custom PriceBookEntry.

So I introduced a Descision Element after the loop and opted for the following criteria (photo 1 attached)

{!SObjvariableIndividualPriceBookEntries.UseStandardPrice} = {!$GlobalConstant.False} ---- for checkbox not checked


From the debug log, I receive the following: 

1. Fast lookup identifies the records
2. Loop, loops through the variables: 01u0E00000D6a8TQAR,01u0E00000D6ayhQAB and holds the 01u0E00000D6a8TQAR (standard PriceBook)
3. Decision element: Executes outcome Yes
4. Assignment element: Assigns a null value

If I change the criteria on the assignment from False to True
From the debug log, I receive the following: Error Occurred: Too many SOQL queries: 101
From observing the debug log, I can see that the

1. Fast lookup identifies the records
2. Loop, loops through the variables: 01u0E00000D6a8TQAR,01u0E00000D6ayhQAB and holds the 01u0E00000D6a8TQAR (standard)
3. The decision element: Skipped this outcome because its conditions weren't met
4. Fast lookup identifies the records
5. Loop, loops through the variables: 01u0E00000D6a8TQAR,01u0E00000D6ayhQAB and holds the 01u0E00000D6ayhQAB (custom, the one I am looking for)
6. The decision element: Skipped this outcome because its conditions weren't met
7. Fast lookup identifies the records
8. Loop element finds no records to loop through
9. Fast lookup identifies the records
10. Loop, loops through the variables: 01u0E00000D6a8TQAR,01u0E00000D6ayhQAB and holds the 01u0E00000D6a8TQAR and I am landed on step 2 again.

Any guidance will be greatly appreciated
User-added image

With regards
Dimitrios
Good morning

Since I have no coding background, visual flow is a must for me (At least for now) and for some time now I try to understand the tool, its functions and limitations and what better approach than to solve requirements (fictional for now, since I am no yet an admin - exam is in two weeks).

My "requirement" started as:
1. Web-to-Case -------> New Case lands in SF
2. Case record has a custom picklist field that is populated with a value that the Record Submitter choses from.
3. User needs an automation that according to the value of the custom picklist field will allow him/her to email (I am aware that there is a limitation in flow to up to 5 emails) certain contacts in SF that have the same value stored in a custom text field in the contact record.

First Flow approach.
User-added image
  • Custom Button - provides caseId (for flow testing an assignment element is used)
  • User Screen1 - Drop Down list to prompt user to choose a value based on the picklist field values present on the case object (i am trying to automate this step).
  • User Screen2 - Dynamic record choice Multi Select Checkboxes with Choise Label and Choise stored value and NO additional options populated (if populated only one value would be stored).
 
  • Assignment to store the contact emails in a variable -
{!varTContactEmails} equals {!Contacts}, where {!Contacts} are the Screen multi Select fields.
  • Assignment to remove brackets - {!varTContactEmail} equal
{!fvarTRemoveBrackets}, where {!fvarTRemoveBrackets} equals to
TRIM(SUBSTITUTE(SUBSTITUTE({!varTContactEmail},"[", ""),"]", "")) + ";"
  • Assignment add left value to Collection - {!CollectionVariableContactsEmail} add {!fvarTGrabLeftValue}, where {!fvarTGrabLeftValue} equals to
(LEFT({!varTContactEmail},FIND(";",{!varTContactEmail})-1))
  • Assignment to remove last parsed value - {!varTContactEmail} equals {!fvarTRemainingContactEmails}, where {!fvarTRemainingContactEmails} equals to
(RIGHT({!varTContactEmail},LEN({!varTContactEmail})-FIND(";",{!varTContactEmail})))
  • Decision - Remaining values to be parsed
--- Yes: return to step 6
--- No: proceed to email action
  • Email action -
Body: Hello flow is ok
Subject: Flow worked Email addresses (collection):{!CollectionVariableContactsEmail}

Unfortunately the flow results in Error - The "Email_Action_1" element in your flow has validation errors.

Up and to step 5 the emails are correctly passed to the {!varTContactEmail} since I can print them on the screen.

Second Flow Approach (path 2)
Being Stuborn I have redesigned the flow so that to not utilize any screens (maybe I was at fault with any of the assignment ellements OR my formulas), so I completely abolish them and instead I rely on a fast lookup.
User-added image
Unfortunately the flow results in Error - The "XXXX_Test_Email" element in your flow has validation errors.

Third Flow Approach (path 1b)
Reverted back to assignments after viewing the following video: https://screencast-o-matic.com/watch/coi6btfTBg

Again though
Unfortunately the flow results in Error - The "3rd_Attempt" element in your flow has validation errors

On all three attempts I make sure to pull ONLY three emails so that to be within the flow limits (5 mass emails).

Any ideas on what causes the fault will be much appreciated and if anyone is located in Greece or plans to visit Athens Greece ----> Beers are on me.

With regards Dimitrios

Hello,

I am moving from Active Campaign to SFDC and am trying to build my first flow.  Here's what I am trying to solve for:

When a contact meets the following criteria: 
"21 Day Challenge" checkbox = True AND "21 Day Challenge Start Date" = Today, then begin a once daily flow of emails for 21 days.

When they reach the 21st day, then remove them from the flow.  Emails will be stored as classic email templates and be sent to external email address of SFDC contacts.  

Is flow the best way to approach this?  

Thanks!

Continuing from a previous discussion in the success.salesforce.com.
Due to reasons relating to a learning experiment I had to "hide" the original Parent Account Field from the Account Page layouts and substitute it with a new Lookup Field called Parent Account.

Tried to use the Lightning action View Account Hierarchy and the follwoing message popped up despite utilizing the Admin profile.

User-added image
It is my belief that the error is due to the action being "tied" to the original Parent Account field.

Please be so kind and point me out to the visual force page or Apex code that "governs" this action so that I can take it on as an exercise. 

I found the following post: https://success.salesforce.com/answers?id=90630000000hUjoAAE

Where Javier Accenture points out to modifying the controler but from looking at the developer console I could not locate it and the URL that populates after pressing the Account Hierarchy Button is not helpful at all.


With regards
​​​​​​​Dimitrios
 
Good morning from Greece to all the developer wizzards

Recently I followed the module - 
Develop an Account Geolocation App with Aura Components 

and managed to complete it without an issue albight having ZERO coding experience. My relationship to SF is from the admin perspective but I find coding realy facinating since the solutions one can create are "limitless" so I tried to make adjustments to the component and make it work for the contacts as well, BUT having no experience I runned into issues.

First I created the ContactLocator.cmp (tried to make all the necessary changes to fit my requirement)
<aura:component implements="force:appHostable,flexipage:availableForAllPageTypes">
    <lightning:layout horizontalAlign="space" multipleRows="true">
        <lightning:layoutItem size="12"
                              mediumDeviceSize="12"
                              padding="around-small">
            <c:ContactSearch/>
        </lightning:layoutItem>
        <lightning:layoutItem size="12"
                              mediumDeviceSize="6"
                              padding="around-small">
            <c:ContactList/>
        </lightning:layoutItem>
        <lightning:layoutItem size="12"
                              mediumDeviceSize="6"
                              padding="around-small">
            <div class="slds-box slds-theme_default">
                ContactMap goes here
            </div>
        </lightning:layoutItem>
    </lightning:layout>
</aura:component>

then I created the ContactLocator tab

then I created the ContatctSearchController.apxc
public with sharing class ContatctSearchController {
    @AuraEnabled
    public static List<Contact> searchContacts( String searchTerm ) {
        List<Contact> Contacts = new List<Contact>();
        if ( String.isNotBlank( searchTerm ) ) {
            List<List<SObject>> searchResults = [
                FIND :searchTerm
                RETURNING Contact(
                    Id, Name, Phone,
                    MailingStreet, MailingCity,
                    MailingState, MailingPostalCode
                    ORDER BY Name
                    LIMIT 20
                )
            ];
            contacts = searchResults[0];
        }
        return contacts;
    }
}

then I created the ContactsLoaded.evt
<aura:event type="APPLICATION">
    <aura:attribute name="contacts" type="Contact[]"/>
</aura:event>

then I created the ContactSearch.cmp
<aura:component controller="ContatctSearchController">
    <aura:registerEvent name="contactsLoaded" type="c:ContactsLoaded"/>
    <aura:handler name="init" value="{!this}" action="{!c.onInit}"/>
    <aura:attribute name="searchTerm" type="String" default="Enter Contact Detail"/>
    <lightning:card title="Contact Search" iconName="standard:search">
        <div class="slds-form slds-p-around_x-small">
            <lightning:input
                label="Search"
                variant="label-hidden"
                value="{!v.searchTerm}"
                placeholder="Search by name, phone, website, or address"
                onchange="{!c.onSearchTermChange}"/>
        </div>
    </lightning:card>
</aura:component>

then I created the ContactSearchController.js
({
    onInit: function( component, event, helper ) {
        // proactively search on component initialization
        var searchTerm = component.get( "v.searchTerm" );
        helper.handleSearch( component, searchTerm );
    },
    onSearchTermChange: function( component, event, helper ) {
        // search anytime the term changes
        var searchTerm = component.get( "v.searchTerm" );
        // to improve performance, particularly for fast typers,
        // we wait a small delay to check when user is done typing
        var delayMillis = 500;
        // get timeout id of pending search action
        var timeoutId = component.get( "v.searchTimeoutId" );
        // cancel pending search action and reset timer
        clearTimeout( timeoutId );
        // delay doing search until user stops typing
        // this improves client-side and server-side performance
        timeoutId = setTimeout( $A.getCallback( function() {
            helper.handleSearch( component, searchTerm );
        }), delayMillis );
        component.set( "v.searchTimeoutId", timeoutId );
    }
})

then I created the ContactSearchHelper.js
({
    // code in the helper is reusable by both
    // the controller.js and helper.js files
    handleSearch: function( component, searchTerm ) {
        var action = component.get( "c.searchContacts" );
        action.setParams({
            searchTerm: searchTerm
        });
        action.setCallback( this, function( response ) {
            var event = $A.get( "e.c:ContactsLoaded" );
            event.setParams({
                "contacts": response.getReturnValue()
            });
            event.fire();
        });
        $A.enqueueAction( action );
    }
})

then I created the ContactList.cmp​​​​​​​
<aura:component>
    <aura:handler event="c:ContactsLoaded" action="{!c.onContactsLoaded}"/>
    <lightning:navigation aura:id="navigation"/>
    <aura:attribute name="rows" type="Map[]"/>
    <aura:attribute name="cols" type="Map[]"/>
    <lightning:card title="Contact List" iconName="standard:contact">
        <lightning:datatable
            data="{!v.rows}"
            columns="{!v.cols}"
            keyField="Id"
            hideCheckboxColumn="true"
            showRowNumberColumn="true"
            onrowaction="{!c.onRowAction}"/>
    </lightning:card>
    </aura:component>

then I created the ContactLstController.js​​​​​​​
({
    onAccountsLoaded: function( component, event, helper ) {
        var cols = [
            {
                'label': 'Name',
                'fieldName': 'Name',
                'type': 'text'
            },
            {
                'label': 'Phone',
                'fieldName': 'Phone',
                'type': 'phone'
            },
            {
                'label': 'Website',
                'fieldName': 'Website',
                'type': 'url'
            },
            {
                'label': 'Action',
                'type': 'button',
                'typeAttributes': {
                    'label': 'View details',
                    'name': 'view_details'
                }
            }
        ];
        component.set( 'v.cols', cols );
        component.set( 'v.rows', event.getParam( 'contacts' ) );
    },
    onRowAction: function( component, event, helper ) {
        var action = event.getParam( 'action' );
        var row = event.getParam( 'row' );
        if ( action.name == 'view_details' ) {
            var navigation = component.find( 'navigation' );
            navigation.navigate({
                'type': 'standard__recordPage',
                'attributes': {
                    'objectApiName': 'Contact',
                    'recordId': row.Id,
                    'actionName': 'view'
                }
            });
        }
    }
})
After this step, I stoped to check if everything was working and beingHoping that I have done everything correct I checked the component in the sales application BUT i received the following error
User-added image

Your help with this issue will be greatly appreciated.

If it is possible, please be so kind to also suggest me any matterial that will fastrack my understanding of coding and lightning components.

With regards
​​​​​​​Dimitrios
Hello developers

Need to admit that I have no developer knowledge and I thought that this "project" was a good idea...

Despite the project showing as complete in trailhead I have encountered the following error.

The trailhead section - use events to center the app is working when it is running on the browser but when I include the click event handler to the markers
L.marker(latLng, {account: account}).addTo(map).on('click', function(event) {
    helper.navigateToDetailsView(event.target.options.account.Id);
});


Thus changing the AccountMapControler from

({
    jsLoaded: function(component, event, helper) {
        var map = L.map('map', {zoomControl: false, tap: false}).setView([37.784173, -122.401557], 14);
        L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',
            {
                attribution: 'Tiles © Esri'
            }).addTo(map);
        component.set("v.map", map);
    },
    accountsLoaded: function(component, event, helper) {
        // Add markers
        var map = component.get('v.map');
        var accounts = event.getParam('accounts');
        for (var i=0; i<accounts.length; i++) {
            var account = accounts[i];
            var latLng = [account.Location__Latitude__s, account.Location__Longitude__s];
            L.marker(latLng, {account: account}).addTo(map);
        }  
    },
    accountSelected: function(component, event, helper) {
        // Center the map on the account selected in the list
        var map = component.get('v.map');
        var account = event.getParam("account");
        map.panTo([account.Location__Latitude__s, account.Location__Longitude__s]);
    }
})


To the following

({
    jsLoaded: function(component, event, helper) {
        var map = L.map('map', {zoomControl: false, tap: false}).setView([37.784173, -122.401557], 14);
        L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',
            {
                attribution: 'Tiles © Esri'
            }).addTo(map);
        component.set("v.map", map);
    },
    accountsLoaded: function(component, event, helper) {
        // Add markers
        var map = component.get('v.map');
        var accounts = event.getParam('accounts');
        for (var i=0; i<accounts.length; i++) {
            var account = accounts[i];
            var latLng = [account.Location__Latitude__s, account.Location__Longitude__s];
            L.marker(latLng, {account: account}).addTo(map).on('click', function(event) {
    helper.navigateToDetailsView(event.target.options.account.Id);
});
        }  
    },
    accountSelected: function(component, event, helper) {
        // Center the map on the account selected in the list
        var map = component.get('v.map');
        var account = event.getParam("account");
        map.panTo([account.Location__Latitude__s, account.Location__Longitude__s]);
    }
})
When clicking on a marker from within the web browser tab from where I am running the application, I receive the following error

Uncaught TypeError: Cannot read property 'setParams' of undefined throws at https://cunning-otter-goe27l-dev-ed.lightning.force.com/c/components/c/AccountMap.js:40:15

While if I open the tab in the salesforce 1 and salesforce I receive the below error

Error in $A.getCallback() [helper.reportErrorSafely is not a function]
Object.loadContent()@https://cunning-otter-goe27l-dev-ed.lightning.force.com/components/laf/pageHost.js:18:417
Object.eval()@https://cunning-otter-goe27l-dev-ed.lightning.force.com/components/laf/pageHost.js:14:374


Any help will be much appreciated

With regards
Dimitrios
Hi I have configured Live Agent but it is not showing in Console App. I have made all settings correctly.

My console app
User-added image