Aller au contenu
  • Annonces

    • Olivier Devriese

      Nouveauté du forum, les blogs !   30/04/2016

      Envie de créer votre blog FileMaker ? Ca ne peut pas être plus simple qu'avec cette nouvelle section du site FM Source qui est désormais plus qu'un simple forum mais un vrai centre de ressource. Vous pouvez aussi facilement l'alimenter en le liant avec le flux RSS d'un autre blog que vous possédez déjà.
  • billets
    101
  • commentaires
    3
  • vues
    2 323

Billets dans ce blog

Soliant Consulting

Engage prospects with personalized email without dedicating more time and resources to the task.

Whitepaper - Marketing Cloud Automation

Marketing teams are often tasked with achieving more with less. In recent years we've seen a huge push for personalized content to drive customer engagement across multiple marketing channels. This is quite a bit to accomplish, and teams often face this challenge with limited resources and technology.

The email marketing channel has been a particularly difficult channel for marketers to tackle. They have an opportunity to tailor messages for each customer segment, but this level of customer segmentation and content customization isn’t simple for many marketing teams. There are too many manual steps involved.

That’s why automation is so critical. You can leverage Salesforce Marketing Cloud to automate list segmentation, personalization, and personalized email delivery. We discuss how through a detailed step-by-step process in our white paper below.

Please complete the form to receive the whitepaper:


Trouble with this form? Click here.

The post Automate Personalized Marketing Emails in Salesforce appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

Marketing teams are often tasked with achieving more with less. I have seen small marketing operations teams try to both make a BIG revenue impact across multiple marketing channels, digital or otherwise, while simultaneously engage customers at relevant touchpoints. This is quite a bit to accomplish, and teams often face this challenge with limited resources and technology.

One area, in particular, has grown significantly in the past decade – the email marketing channel. As a direct link to customers, marketing teams have an opportunity to tailor messages for each customer segment. Staying current and top of mind with customers along the spectrum of relevant events in their lives — such as birthdays and anniversaries — is of paramount importance to retention, future acquisition, and growth.

Unfortunately, this level of customer segmentation and content customization isn’t simple for most small marketing teams. There are too many manual steps involved.

Enter Marketing Cloud Automation

That’s why automation is so critical for marketing. Small teams can leverage the power of the Salesforce Marketing Cloud to automate email delivery at relevant touchpoints without having to construct audiences and send email daily. In my white paper on Marketing Cloud Automations, I’ll be sharing how to leverage CRM data in the Marketing Cloud to achieve your goals.

In the next few weeks, I will share a made-up but relevant stylized example to explain how we could achieve this. For the sake of simplicity, I’m going to use birthdays as the life event in question, something everyone can understand and readily identify with.

Automation Requirements

Our requirements will be as follows:

  1. Send email daily at a scheduled time to customers whose birthday is today
  2. Source the customer list from the Sales Cloud automatically & daily prior to sending the email. No marketing team intervention should be needed to assemble the audience.
  3. Send an email to the customer from the owner of the contact in the Sales Cloud. For example, as a customer, I’d receive the email from the specific point of contact I’ve been working with.
  4. Personalize the email content with the customer (name, etc.) and the owner of the contact in Sales Cloud (name, email, professional details, etc.)
  5. Ideally, contact owner details to be appended to the audience just-in-time prior to sending email without marketing team intervention
  6. Filter audience based on additional attributes just-in-time prior to sending email
  7. See email tracking data on the relevant contact in Sales Cloud

Next Steps

I’ll divide the solution of marketing cloud automation into three parts:

  1. Assembling the Audience
  2. Packaging Email Content
  3. Automating Imports, Sends and Tracking Success

Each week for the next four weeks, I’ll be posting a new part of the white paper. Make sure to come visit the Soliant blog next week to get the next chapter on assembling your audience!

Download the Full White Paper

Can’t wait until I release the next part of the white paper next week? You can download the full white paper on marketing cloud automation here:

The post More Connections, Less Effort: An Introduction to Marketing Cloud Automation appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

Over a week later, and I’m still on the high of speaking at FileMaker DevCon – no time travel necessary, as it’s vivid in my memory! It felt like just yesterday that I was testing my demo file on repeat, making sure that each example was ready to show on the big screen. And then came the time to stand up in front of a crowd and share things I’m passionate about: FileMaker, empathy, and interface.

My session focused on ways to get the right answers from your users, where I showed User Interface (UI) tips and tricks. The FileMaker platform is one of the best tools out there for improving and extending your business and the way you manage your data and workflow.

So why does the UI matter? Why does the experience of the user matter? Because we’ve all grumbled at bad design. Because we’ve all yelled at our screen when a website “doesn’t make sense.” Because bad UI makes for sad users. As a developer, you have the ability to make users happier people, better workers, and more productive employees.

My slides focused on some key questions to ask your users, so that you can empathize and understand what they’re dealing with. Half of the battle is understanding what they need, while the other half is figuring out what currently frustrates them (and then figuring out how to solve that). After talking to users and planning out what needs to be created or changed, the next step is to start planning out your FileMaker solution – the workflow being key.

You’ll want to make sure that whatever you build doesn’t hinder productivity, but in fact, seamlessly lets a user move and work faster. So what are some of the FileMaker tools that you can take advantage of?

FileMaker Tools for Better UI

  • Theme & Styles / Object States
    • Consistency is key
    • Allows you to reuse a style for faster development
  • Conditional Formatting
    • Warn the user or draw attention to something
    • Provide feedback on what a user has done
  • Conditional Visibility
    • Show the fields and objects that matters
    • Hide functionality that isn’t useful to the user
  • Buttons and Button Bars
    • Consistent interface
    • Allows you to use text and icons to communicate what a user can do
    • These can include popovers
  • Custom Dialogs
    • Warn the user (more harshly than conditional formatting)
    • Provide feedback
  • Card Windows (My favorite!) / Popovers
    • Focus the user on the right stuff
    • Provide a clean and organized interface
    • Consider these a potential [smarter] replacement for dropdown and pop-up menus
    • Awesome for selecting related values and allowing searching

This list is just the tip of possibilities and features the FileMaker platform delivers to better navigate and control your users. Now this all comes with the caution that too much control is a bad thing. FileMaker Pro provides us with a slew of features that can benefit your users. If you have someone in the organization who is interested in learning about FileMaker Pro, you might find yourself with a power user, and that person can be a huge asset to helping you and the business succeed.

Ask Yourself the Right Questions for Better UI

Remember, FileMaker provides us with a set of tools; our job is to learn how they work and then get as creative with it as we can.

To get you started, here are a few questions to ask:

  1. Who is your user? (a farmer who is looking to advance his business with technology? An office worker who wishes they were still using pen and paper? A CEO who wants to streamline their business?)
  2. What does their job entail?
  3. What challenges do they face in their role?
  4. What are their pain points?
  5. What would make their job easier?
  6. What does the business need from that user?
  7. How can you add value to both your user and the business?
  8. Are you going to teach them how to use FileMaker Pro or how to use the app you build?

With the FileMaker platform, you have a flexible and fluid tool to help solve business problems and improve the user's experience. By focusing your attention on the workflow and the needs of your users, you can leverage FileMaker Pro, FileMaker Go, and FileMaker WebDirect to get the right data from your users.

A quick (and overzealous) aside: I was proud of my invisible popover for my demo file. It was a way to show off what we were going to do by creating a sort of overlay on the layout. Just one more way to manipulate FileMaker Pro and to use a tool in a slightly different way.

better ui

Watch the Video

Want to learn more? You can watch my full 2017 DevCon session on better UI in FileMaker on YouTube.

If you have any questions, please feel free to do so in a comment or by contacting our team directly here.

The post Get the Right Answers from Your Users: A Guide to Better UI in FileMaker appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

PivotTable.js DemoPivot table reporting is very difficult to do in FileMaker. The process requires a complex combination of portals or repeating fields, ExecuteSQL, and sometimes calc fields. It’s a tough report to build, and many of our clients request export features to manipulate their data within Excel and build a pivot table externally. That’s quite a few steps just to see your data.

Fortunately, we’ve uncovered a method to creating a pivot table directly in FileMaker through a PivotTable.js integration, simplifying and speeding up the process. Explore our demo of its key functionality to learn how to implement the integration in your own FileMaker implementation.

Don’t forget to read Jeremy Brown’s step-by-step guide on how to use this demo to your full advantage.

Complete the form to receive the demo:


Trouble with this form? Click here.

The post PivotTable.js in FileMaker Demo appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

In my DevCon 2017 session on Web Viewer Integrations, I very briefly showed an extension of the concept presented in the form of a pivot table. I had roughly 20 seconds to show it, and so I provided a quick overview of some of its features. In the waning seconds of the hour, I promised some follow up, and here it is.

Pivot table reporting is somewhat of the holy grail in FileMaker development. A quick search in the FileMaker Community discussion board revealed over 20 posts about this very topic. Unfortunately, this kind of reporting is difficult to do in native FileMaker. It requires some combination of portals or repeating fields, ExecuteSQL, and maybe some calc fields. It’s a tough report to build, which is why many of my clients ask for exports. Then they use the data within Excel to build a pivot table externally.

That’s too many steps just to see your data. We want you to stay in FileMaker, so we need to provide for them a great way to use a pivot table.

Today I’m sharing how to create a pivot table through a PivotTable.js integration and how to leverage its best features.

Example of a pivot table

Figure 1. Pivot table created using a PivotTable.js integration

Features

Let’s start by showing the capabilities of this integration. The above pivot table takes data from a sales table and summarizes it from many different perspectives. More than 17,500 records show a date, unit price, quantity sold, and total price of products. Once you load the data into the integration via a script, you can view the data viewed from many different angles and view it very quickly. There’s no reloading of the data from FileMaker. The library does all the work on its own.

Note: This is the beauty of many JavaScript integrations. Once loaded, the data calculations and rendering moves quickly. In a hosted version of this file, it takes FileMaker less than 2 seconds to load the pivot table into the web viewer. From there, changing the perspective, adding or removing attributes, and seeing the updated perspective is almost instantaneous. The slowest part of this process is gathering the data.

Library features include the following:

  1. 13 different renders of the data, including the basic summary table you see above, heat maps, C3 charts, and even an export view that allows the user to (if they must) export the data to Excel using comma-separated values. See Figure 2 below.
  2. 22 ways to summarize the data: Sum, maximum, minimum, average, Sum as Fraction Rows, etc. See Figure 3 below.
  3. The ability to drag and drop an attribute to either the x or y axis. Multiple attributes can be used, as you see in the first picture.
  4. Filtering functionality for each attribute. For example, I can click on “Type” and remove one or more products from the summarization. See Figure 4 below.
  5. Sorting capabilities. You can sort both columns and rows in default order or by total descending or ascending.
Menu of pivot table types

Figure 2. Pivot table types


Screenshot of the menu with 22 ways to summarize the data

Figure 3. 22 ways to summarize the data


Filtering functionality for each attribute

Figure 4. Filtering functionality for each attribute

The Setup

Overall the setup is not complex in any way. I’ve worked out what is needed and have tweaked the function to make it fit a normal need in FileMaker. Here are your requirements:

1. A summary table from which to gather the data
Summary table

Figure 5. Summary table

2. The HTML and CSS code
HTML and CSS code

Figure 6. HTML and CSS code

3. The data gathered in a certain format and a script that gathers the data in this format
Data gathered in a certain format

Figure 7. Data gathered in a certain format

4. The other required libraries
Required CSS and JS libraries

Figure 8. Required CSS and JS libraries

As with my Web Viewer Integrations library, you can easily import these fields into your own custom app.

Gathering Data

You must gather and set the data for the table to properly summarize it. Follow these steps for a successful setup:

  1. Gather all data as individual arrays, with each array separated by a comma.
  2. Make the first row the header, i.e. the name of the attributes displayed in the chart and moved around.
  3. Of course, the order of the data gathered matters. Gather your data in the same order as the header. In the example above, the “Sales” header is first, and the sales data comes first in each array.
Sales data comes first in each array

Figure 9. Sales data comes first in each array

  1. Using FileMaker 16’s new JSONSetElement() function, you can set a field to gather the data.
JSONSetElement() function

Figure 10. JSONSetElement() function

  1. Then use the ListOf summary field type to gather all the data during a script. Notice this script first sets the header row and then adds to that variable the LIstOf data.

Of course, you can gather the data gathered in a multitude of ways. It all depends on the circumstances you have for the given custom app.

Final Tweaks

As with other Web Viewer Integrations, you can edit the style of the pivot table, but everything else is ready for you to use. All you have to do is provide the data, and you have a complete, multi-function pivot table.

I’ve made some other tweaks to this to make it easier to use and more useful for you.

  1. I added another field to the pivot table to ensure you could easily add any field. In this demo, you’ll see Customers. You would need to collect the data again to use this. In this case, the data is collected with a new script called “Gather Data_Loop” and it does that, setting each array needed using JSONSetElement(). The script gathers data from the sales table and from the related table of Customers.
  2. I set up some defaults to the chart. My chart, in the function, is set to render the table showing the sum of Type in the column and Year and Month in the rows, as shown in Figure 11.


Chart parameters set in the function

Figure 11. Chart parameters set in the function

How to Set This Up in Your Custom App

It is very simple to push this to your custom app. Just follow these four steps:

  1. Import these fields into your custom app into a new table. You’ll be bringing over my data, so you may want to erase that data once you have the fields imported.
  2. Copy the HTML_Calc calculation field from this demo to a new field in this table.
  3. Write a script to gather the data. See mine as a template. Set the data into the field.
  4. Accept or change the defaults that are in this library.

That’s it. You now have a fully-functioning, multi-use pivot table!

PivotTable.js in FileMaker Demo

I’ve done enough research to know that just about anything that you want to do in FileMaker that isn’t already possible can be accomplished by using a web viewer and a JavaScript integration. Check this one out and see if it works for you.

Good luck! Please feel free to ask questions in the comment fields.

The post How to Build A Pivot Table in FileMaker appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

Workgroup Conundrum WhitepaperIdentifying the optimal path for your workgroup processes: off-the-shelf solutions or custom-built solutions

Every company has to start somewhere. Along with this business adage comes
the mentality that not only does a company have to get scrappy in its early
days, so do its tools and technology. Most start with the basics – such as a spreadsheet tool like Excel – to manage their internal data and processes. And in the early days, it’s enough.

However, as a company grows, so do its workflows and teams. Businesses
quickly outgrow their trusted tools, and teams become silos. As teams are split up by responsibilities and goals, they often find themselves facing different challenges from other business units. As a result, technology working well for one group, miserably fails for another.

We address this problem, which we refer to as the workgroup
conundrum, and potential solutions in the A Journey Through the Workgroup Conundrum white paper.

Please complete the form to receive the whitepaper:

The post A Journey Through the Workgroup Conundrum Whitepaper appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

Last week Soliant Consulting joined 11,000 attendees at the 2017 AWS Summit in Chicago. This is the third year someone from my team has attended the event. Much like moving to the cloud, AWS Summit Chicago has grown significantly. Last year, less than 8,000 people registered for the conference. I noticed some visible growing pains as several sessions filled up very quickly and organizers struggle to manage the influx of attendees on the first day.

An Overview of AWS Summit Chicago

The AWS Summit included many informational sessions about all types of services focused on both developers and system administrators. Every session has an associated skill level, allowing attendees to quickly determine if it's a good fit for them. For example, the 200 level topics are aimed at someone with no real experience with the technology subject. In addition to these sessions, AWS Summit included "The Hub," where sponsors and vendors showcased their products and services in everything from infrastructure and monitoring to backups and security.

Click to view slideshow.

AWS Keynote Insights

The AWS Summit Chicago keynote included two examples of how using the right tools in AWS minimizes costs and maximizes performance.

Redshift Spectrum

The first example showed loading one exabyte (1,000,000 terabytes) of structured data into s3 and then running a complex query on that data. The presenters started running the data through Apache Hive with 1,000 nodes, let it run for a while, and then determined the process would take five years. They then ran the same data through Redshift Spectrum, and the process took 155 seconds. That’s more than 6,451 TB/S! Keep in mind, though, Hive can run on unstructured data but Spectrum can't.

Lamba

Morning Star's CTO, Mitch Shue, provided the next example on his company's migration to AWS. Their first stage of the process was a like for like migration. Their team moved from Elastic Compute Cloud (EC2) instances and started processing data using S3 and Lambda, a change that shortened its nightly import time to only two hours. As a result, Morning Star decreased costs by 97%.

Lambda works by running small jobs on AWS. Think of it as moving the line where AWS is in charge of the infrastructure. For EC2, AWS is in charge through the hyper visor.  With Lambda AWS also manages the OS; you only need to worry about your code and only pay for the seconds and memory your code requires to run. Lambda is the optimal choice for jobs that don't run all of the time or for parallel work, such as nightly imports.

Want to hear more? Watch the full AWS Summit Chicago keynote here.

AWS Elastic File System (EFS)

One of my favorite talks was the deep dive on AWS EFS given by Darryl Osborne. He discussed EFS, S3, Elastic Block Store (EBS), and their differences. For example, EBS can only be accessed by one EC2 instance, much like a hard drive in a physical computer. It can, however, have very high IOPS and decent throughput, depending on the type of storage you pick.

With S3, you use APIs to access data. You will probably need to rewrite your programs to access your data, but you'll benefit from inexpensive storage and very high throughput. EFS has slower throughput than S3; its throughput is related to the amount of data you have stored in EFS. EFS, much like S3, is elastic storage, so you only pay for what you need. EBS requires you to provision the disk for a particular size. During the demo, Darryl showed how a T2.micro can perform better with EBS than an m4.2xlarge over a short period of time due to T2's burst performance capabilities.

Looking forward to AWS Summit Chicago 2018

I strongly recommend both developers and system administrators attend next year's event, as the conference includes many topics for both groups. I enjoyed attending on behalf of Soliant Consulting for the 2017 event and look forward to attending for our team's fourth year in 2018. If you have any questions about the event, please ask in a comment below. I'm happy to provide answers and additional insights about the conference.

The post AWS Summit Chicago 2017 appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting
Day 3 started fresh, clear, and crisp, outside anyway. Inside my head, I was a bit tired and muddled. The week thus far refueled the inspiration gas tanks, but the actual gas tank that ran me was a little low.

Staying up late, talking, and walking half a mile to the conference area depleted my energy. A bit bedraggled, I headed out the hotel room door and began the day.

Day 3 Sessions

My Soliant colleagues, Anders Monsen, Dawn Heady, Mislav Kos, and Mark Baum spoke during the first half of the day, and they killed it. Mark was his usual boisterous self and actually broke out in song while writing a script. Anders delivered precise techniques for working with Perform Script on Server (PSOS) and reporting, Dawn presented some great real-world scenarios during her session on security, and Mislav helped to demystify SSL by explaining how to get and install a custom certificate. Their sessions were extremely useful for both beginner and advanced users. I bounced back and forth between these sessions to support my colleagues and to see what I could learn.

Click to view slideshow.

Snack time came after the morning sessions and breakfast. I weaved my way through the large food area to say hi to friends I've seen for many years and those I’ve just met this year. Colin is one of the latter–someone who came to his first DevCon this year. I helped him out as I could. And I met Sarah and Clarke, two other first-timers. I enjoyed meeting them and hearing that this DevCon has been amazing for them as well.

The day continued with classes, breaks, and food. I spoke once more in a session called, “Refactoring Your Skill Set: Changing How You Do the Same Thing.” In this session, I pointed out that there are many ways to solve a use case in FileMaker, and we shouldn’t stick to one because it's our favorite or the one with which we have the most experience. Instead, we looked at common use cases and the different ways those could be solved.

Closing Session

The conference ended with the closing session during which FileMaker Inc. recognizes outstanding contributions in the community. Two awards are given to people in the FileMaker community, and nine other awards are given to FileMaker Busniess Alliance (FBA) members. Soliant Consulting won an award for excellence in education.

After the closing session, my Soliant colleagues and I gathered to celebrate our win and the great week. Ten speakers spoke in twelve sessions throughout the three days, and since we rarely see each other, we enjoyed catching up.

The DevCon experience was inspiring, challenging, tiring, and exciting. There is so much currently going on in the platform. People all over the world are doing amazing things with FileMaker Pro and the other apps, and I am glad to be a part of it. I’m inspired to continue my own learning on such things as FileMaker Data API and move forward and help others learn the platform the right way the first time.

The post FileMaker DevCon 2017: Day 3 appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting
The excitement of Day one bled over into Day two, as if we all were dreaming about the great things happening in the FileMaker platform. As I joined the rest of the 1,600 attendees, I could feel the excitement of the day ahead. It did not disappoint.

I woke early to get ready for the day. I wanted to attend some sessions and prepare for my first session, “Web Viewer Integrations.” The hawks outside my hotel deck greeted me with their cries, giving a perfect zen-like atmosphere to the morning.

I ventured down to the conference area and joined the community for some breakfast. Many people, arrived at breakfast close to the end of the hour. It seems we all stayed up a little late the previous night! The food was good, plentiful, and healthy. After downing some oatmeal and bacon, I ventured into the classrooms.

Day 2 Sessions

Day two's lineup of sessions promised to be full of great content. There were both beginner and advanced sessions showcasing innovation and great insights for attendees. One even included a demo of a great product by one of the conference’s exhibitors. I enjoy the beginner sessions, and how many of them overlapped in topics. I used to be a teacher, and the more a student is exposed to the same idea, the more the idea will be internalized.

I started my day by attending Anders Monsen’s session on JSON parsing and then the beginner session, “Relationships Thoroughly Explained.” Both were excellent in scope and great for attendees.

I also attended Wim Decorte’s session, "External Authentication Options: EA, SSO, AD, OD, OAuth, LDAP" as well as a session titled, “Increasing Code Quality While Staying Lean” with John Sindelar of SeedCode.

I popped into Mike Duncan’s session, "FileMaker and AWS: What You Need to Know" and Martha Zink’s session, "Get the Right Answers from Users - UI Tips and Tricks" to support my colleagues. Both seemed very popular; the content resonated well with attendees.

Click to view slideshow.

This is my first year presenting at DevCon, so I spent part of the morning focused on preparing for my session. I had to clear my mind and make sure I was ready to go. I tested my computer many times, backed up my demo files, and recharged my clicker. I wanted to be ready. People say I "overthink" it, but I know how I need to get ready. As a teacher, I always had to take a moment before the kids burst through the door. Leading a session at DevCon is no different. (Although, I guess, the attendees are a bit better behaved.)

I enjoyed the new “FileMaker in Action” sessions, during which users of FileMaker are invited to speak on their successful use of the platform in their daily business. Martin Williams and another person from Volvo spoke of how their use of FileMaker has transformed the way they can respond to machine breakdowns out in the field. When a machine reports an issue, FileMaker picks it up and immediately tells the dispatcher the nearest dealer to that machine. All of that would be hard to do in a basic spreadsheet.

Women of FileMaker Luncheon

Day two also included the annual Women of FileMaker luncheon. I, obviously, did not attend, but I heard from my female colleagues that it was fun and empowering for the women who did. My coworkers got to network and meet wonderful women while discussing how to propel more women forward in the FileMaker community. Gillian Gentry, one of my team’s Managing Directors, stood up to discuss the Women of FileMaker scholarship program, which helps send more women to DevCon every year. Ladies, if you couldn’t make it this year, I highly suggest getting involved with the group and attending next year!

Click to view slideshow.

A Relaxing End to the Day

And, of course, the day finished with a pool party. Food and drink stations were scattered around the huge pool complex, and all of us FileMaker people, in our name tags and swimsuits, stood around and talked, ate, and drank. Some of us even swam.

Day two of DevCon was full of learning, people, food, and community. The sessions were strong and informative, and the people were excited and engaged. I can't wait to see what day three brings!

The post FileMaker DevCon 2017: Day 2 appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting
Contrary to my last post, the sky wasn’t clear for most of Day 1 of DevCon. It was cloudy, cool, and rainy, the kind of rain that might dampen enthusiasm for an upcoming event. But that didn’t happen here.

There was no stopping the excitement that over 1,600 developers (a conference record) brought to the conference. Let’s examine what was exciting about today.

Training Day

FileMaker hosts a training day for the first day. There’s the typical beginner, intermediate, and advanced sessions (the advanced session was led by Soliant Consulting’s CEO, Bob Bowers). However this year, FileMaker added two courses that allowed many more to get involved: A project-management course led by Sara Severson and a training session called, “Connecting FileMaker To the Web,” led by Todd Geist. The wide scope of these sessions gave many more people a reason to attend.

Sara Severson’s session called, “Demystifying Agile Development: Practical Tools for the Risk-Averse” gave the very-important project managers in the FileMaker community a place to learn and grow their skills. One of her assistants, Annie Tobiasiewicz, had this to say:


Sara did a fantastic job teaching and promoting agile methodologies to be used for projects. The training session was a nice size that allowed for discussion between attendees in small groups. Not only was Sara able to cover all her planned material, but she was also able to answer questions that came up throughout the day. Attendees gained a larger understanding of agile in hopes that they can try it in their projects when they return home.


Bob Bowers' advanced training session was extremely useful to all who attended. Beth Bennett reported that Bob’s session covered such advanced techniques as JSON, using card windows in creating pickers, virtual lists, Perform Script on Server, and ExecuteSQL. The attendees participated in many activities that gave them a taste of all that can be done. Tweets flew out of that session filled with the very awesome tips and tricks that were presented. Tweets from actual birds also bounced around the room as birds, taking up residence in that space, conversed together about the topics in the session and occasionally flew up to the screen to get a closer look.

Click to view slideshow.

Keynote Session

After a long day of training, sitting, and participating, you’d think we’d be done and ready for food. But no. The main event was yet to come. At least an hour before the doors to the grand ballroom opened, people were waiting in the hallway, ready to get in and get the best seat for the opening session. People were ready – they were excited to hear about the current platform and what’s yet to come.

And boy, is the future bright and awesome.

The content of the keynote was great. Six numbers represented the current state of the company:

  • 16: the Current version of FileMaker
  • 1,600: DevCon Attendees
  • 3,000,000: Downloads of FileMaker Go
  • 78 quarters of profitability
  • 1,300,000 subscriptions of the platform
  • 40% of FileMaker expenses spent on Research & Development

Andy LeCates, the Director of Product Evangelism, gave another chapter in some amazing customer stories from around the globe, including Soliant Consulting's story about the Luke Commission with Ross Johnson and Josie Graham. He also spoke of the commitment of FMI to the platform for businesses of all sizes. Andy discussed the concept of bimodal IT, as well. If you're interested in learning more about that topic, check out insights on bimodal IT from our CTO, Steve Lane.

And then of course, the FileMaker Product Team got up to talk about the future of the platform. I can't share those details quite yet, but there are some exciting features ahead!

The keynote was great and filled with amazing ideas. But what struck me the most was the passion for the platform that each FileMaker team member -- from the president to the director to the project managers -- had in their own way. Each person brings to the platform their heart and soul to make sure it is the best it can be for the citizen and professional developers. It's exciting to see where they want the platform to go, keeping it strong for advanced developers and making it easier for new developers to come to the table.

Evening Reception

The night continued in the welcome reception area. Food and drink were stationed all throughout the large exhibitor hall, within an arm’s reach. And it was a time to say hi to old friends, meet new friends, eat, and simply enjoy time with fellow developers around the world.

As I was heading back to my room to practice and remember what I want to say in my session on Tuesday, I walked by many people still milling around the bar, in the lobby, and basically, anywhere there was space. Everyone was talking about FileMaker, continuing to catch up, and getting to know others.

The excitement that started on day one is sure to carry over into the rest of the week, allowing the sessions to be fun, engaging, and full of great content. I can’t wait to attend some sessions and to present my own (and get mine done with!)

The post FileMaker DevCon 2017: Day 1 appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

The traditional IT model is broken.

Since its inception in the 90s, the IT department has grown in its focus and responsibilities. Unfortunately, instead of segmenting the department into focused workgroups, most organizations have fallen into seemingly organized chaos.

Projects take precedent, pushing the regular responsibilities of operations and maintenance to the wayside. Or, engineers drag their feet to create new things and innovate within legacy systems because they have too much maintenance work on their plate. It creates a stagnant environment for companies, a dangerous situation to be in in 2017.

But this problem can be solved. It really just comes down to resources. And there’s a way to segment everything as a solution.

Gartner coined this solution as Bimodal IT.

What is Bimodal IT?

Bimodal IT splits the IT department into two teams, or, as the definition implies, two modes. One focuses on all technology and applications that absolutely need attention. These core systems, legacy applications, and solutions that keep the wheels on absolutely need maintenance. They require a dedicated team, so they should have one.

The second team focuses solely on innovation. What can they build to make the business more efficient and successful? How quickly can they build it? This group is made up of “dreamer” engineers who envision new technology to push their companies forward.

Development Cycles

Each group, of course, will operate completely differently. The first operates much more slowly with longer, passive development cycles. Updates to core technology are no joke. They must be vetted, tested, approved, and then slowly rolled out to each user in the company. It takes time, patience, and a ton of buy-in.

The second team, however, is the hare to the tortoise. Their innovation requires speed and agility. This team prescribes to rapid application development – things are built, updated, and enhanced more quickly, with short, tight, development cycles. A decision is made, and things are built in a short window afterward.

Business Involvement

Of course, as these different teams have different goals, they also have different involvement levels in the company. IT often only interacts with other teams if a problem arises with a system or if an update will affect users. Think about your last email from IT. It was because a system was “undergoing maintenance,” or to close a ticket on an issue you reported, right? These IT team members fly under the radar. Business leaders rarely interact with them, and their work, while critical to the business, hums under the surface, garnering little acclaim or attention. The first mode just doesn’t require a ton of oversight from other departments.

This second IT mode operates completely differently. They have ideas that will change the business, and that means they need buy-in from everyone else as well. They are often tasked with presenting their ideas to other departments, effectively explaining how things will work and the impact the proposed new technology will have. They’re responsible for delivering on their promises and sticking to strict development deadlines. Everyone is watching them, especially those whom the new applications or solutions will affect.

As a result, this second mode also needs more oversight. Your business will need a strong, skilled leader, who can balance pushing his or her team to be more innovative while overseeing them and understanding their work and goals.

Team Members’ Responsibilities

Think about your IT department. Many of those team members fall under the radar, don’t they? Their work is crucial – they literally keep the business running, but most of their coworkers and colleagues don’t realize that.

Sometimes the flashier ones make a splash, though. These are the IT team members pushing for new systems, new development, and a fresh look at their technology. If you’re following our line of thought here, this is an intuitive way to split up your team to achieve bimodal IT.

More traditional developers who have been with the business longer often fall into the first team. They know the systems and are the experts. They know the ins and outs of the systems that cannot fail and often know the tricks to get things humming again that others don’t.

Developers hungry to try something new and “go fast and break things” often fall into the second mode. They want to push boundaries and invent something new. They also often have been formally educated with the most recent development techniques and have the skills to pull off rapid application development.

Risks of a Bimodal IT Organization

Of course, any major structural change also comes with its risks, and there’s been plenty of discussion on all the reasons why a bimodal IT organization just can’t work. Here are a few arguments against it:

Bimodal IT Builds Walls

Instead of all your best and brightest technology specialists and developers working together, you officially pit them against one another, possibly creating more problems than solutions. Splitting instead of pooling your resources can halt innovation and create tension between teams vying for budget, time, and attention.

Modern Technology Connects

More technology bridges old with the new to drive efficiency within businesses. After all, any tech leader will agree that merging two systems and/or applications will make things easier on other departments. Unfortunately, this creates confusion within a bimodal IT organization. Which team determines which customizations should be made to the new add-on technology? Who deploys it once it’s finished? Which team maintains the technology? As integration becomes more popular, lines become blurred within a bimodal IT strategy.

Legacy Systems Never Evolve

If you hand off legacy systems to a team focused strictly on maintenance and never on innovation, you’re going to have a difficult time moving forward. And when core technology can’t move forward, neither can the business. No new applications can drive sustainable growth if legacy systems still hold entire teams back.

Developers Get Disgruntled

If you could pick between working maintenance on an old system and completing IT tickets or collaborating for an interesting and innovative solution, which would you choose?

Right, it’s an obvious choice for most in the IT world. If you give your developers and engineers the choice, you’ll most likely end up with lopsided teams. If you make decisions without their input, you risk disgruntled team members and employee churn. Pigeon-holing your IT team members won’t be easy.

And if you’ve filled out the second, more agile team of your bimodal IT organization, it will be difficult to recruit. That creates a very big problem in the long run.

The Reality of Bimodal IT

For many large businesses, a bimodal IT strategy makes sense. They can hire an entire new team of software and application engineers for internal development work and ask them to build visionary solutions for the company. They can afford to hit a few bumps when hiring resources and trying out new things. They can have a project or two crash and burn and absorb the costs of failure.

Medium and small-sized businesses, on the other hand, quite simply can’t. Resources are tight as it is and the idea of hiring an entire team for a few innovative applications feels foolish, because, well, for smaller businesses, it absolutely is.

That’s why our team acts as businesses’ second IT team, as their innovative arm of the business. Our team of certified and innovative developers, solution architects, and UX consultants, help you dream up the perfect applications, build it, and then launch it. We help your “first mode” team learn it and then teach them how to maintain it, adding it to your depository of owned technology.

Then, when you’re ready, we move onto the next project you have in mind.

If your business isn’t in the right place to build a bimodal IT organization, don’t. We can serve as that team for you and deliver rapid application development to keep your business innovative without the onerous overhead.

Contact our team today to get started.

The post Bimodal IT: A Buzzword, a Solution, or a Smokescreen? appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

All is ready for FileMaker developers here at DevCon 2017 in Phoenix, AZ. The sun is hot, the sky is clear, and the cacti are sharp. Inside the sprawling campus of the conference center, developers from all over the world are arriving after traveling the 30 miles or so from the airport in a Lyft, Uber, or taxi. Even on Saturday, quite a crowd of FileMaker developers had gathered. I could tell who they were: computer on the table top and beer in hand.

There is a lot of excitement about this year’s FileMaker Developer conference. That excitement is not misplaced. This year’s conference is looking to be a great one in many ways.

First, we are working with an exciting release: FileMaker 16, which is a game changing release, full of features that help better secure our data, connect to web services, and build better workflows for our customers.

Second, the sessions that are scheduled are astounding, not only in the content but the diversity. Let me describe the highlights:
Tomorrow is the training day. If you’re here at DevCon, but haven’t signed up yet, I encourage you to do so. Sara Severson and Bob Bowers are leading two Training Day sessions about Project Management and Training for Advanced Developers. Todd Geist has a training session, "Connecting FileMaker to the Web." That’s an intriguing course as I greatly enjoy extending FileMaker’s functionality with web viewer and JavaScript integrations. There are two other Training Day sessions: "FileMaker Training for Beginners" and "FileMaker Training for Intermediate Developers" led by James Medema and Chris Ippolite, respectively.

Tuesday and Wednesday are full days of sessions, each one worthy of attendance. Soliant Consulting team members are presenting twelve sessions. I’m excited and nervous for my sessions titled, "Web Viewer Integrations" and "Refactoring our Skill Set: Changing how we do the same thing." Outside of speaking, I’m looking forward to Mike Mitchell’s session “Abstraction and Indirection in FileMaker” and Ibrahim Bittar’s session called, “FileMaker is Not an Island.” New this year is a group of sessions titled, “FileMaker In Action.” In these sessions, users of FileMaker will present how the platform is making their work lives easier.

And third, the community. FileMaker developers are a great group of men and women from all over the world that are passionate about the platform. We love talking FileMaker. We love talking about the ‘best’ way to write a script, and we love making our users more efficient with their work inside the custom apps we build. At dinner, in the hall, at the bar, or at the pool party, there are folks ready to talk and argue, show off, and ask questions.

I look forward to the long week here in the oven (outside) and refrigerator (inside). See yah there!

The post FileMaker DevCon 2017: Day 0 appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting
I am sitting in my car immediately after taking the FileMaker certification test. I’m a bit woozy from the experience–two hours of sitting in front of a 1024 x 768 monitor in a dingy room with a bright florescent light hovering above me. The narrow workspace I'm jammed into seemed to close in on me about the 90-minute mark.

The test took a lot of out me. I cycled through all the swear words I know at least three times, and I had to think. I couldn’t just recall a fact I had memorized. Instead, the 65-question test required me to see in my mind’s eye the answer or to use my gut to decide the answer.

Many answers were clear. Others required a good amount of thought. But in the end, sitting here in a hot car, I see that I’ve passed the test, and that I’ve scored better than ever. That’s a good feeling.

FileMaker certification is an important (optional) rite of passage in a developer’s growth in the platform, one of the milestones after opening the app and figuring out how to write a script. It usually comes after you’ve had a lot of experience with the platform, and is a step you’ll have to repeat many times–either when a new version of FileMaker is released or because your score was not quite over that passing threshold.

I’d like to share my experiences of taking the test, as far as I can talk about it, so that you – a person choosing to take part in that rite for the first time – can be prepared. I’ll share what is publicly available about the test and some prep and test-taking actions that I feel helped me to pass the test.

What is the Test and Why Should I Take it?


The FileMaker Certification test is a 65-question, 110-minute test, and passing is pretty-good proof that a developer understands the platform. Though some of the multiple-choice questions ask about basic factual knowledge, many of them require some deep thought and knowledge. In fact, many of the questions ask for two or more answers. It’s not, by any means, a simple exam.

The certification on your resume certainly gives you some credibility when applying for a job in the FileMaker world. However, more than anything, having the certification demonstrates your commitment to the platform and your desire to keep learning it. Employers, it seems, are interested in people who want to improve their skills and who are willing to stick with it. But ultimately, it comes down to a choice by the developer: take it or not. Of course, I recommend that you do.


Jeremy Brown's FileMaker 16 Certified Developer certificate

FileMaker 16 Certified Developer certificate (click image to enlarge)

Preparation

You need to prepare for the test. Yes, anyone can take the test, but only those with some deep knowledge of the platform will have a chance of passing.

Play, Play, Play

You can prepare by reading everything there is about FileMaker, but that will only get you so far. Your experience is a great preparation tool, so get into FileMaker and develop apps and learn how to do as many things as possible in FileMaker, even if you don’t have to do it for your regular project work. Many of us can go an entire development career without having to use FileMaker WebDirect, but if you want to get certified, you still must understand that part of the platform. So get to know everything, even if it’s just the basics. Even FileMaker Server.

If you don’t have a copy of FileMaker server, you can get a development license by signing up to the FileMaker Community. For $99 a year, you have FileMaker Server to install and tinker with incessantly.

Focus Your Study

With the announcement of FileMaker 16 comes a study guide. This guide narrows down the ‘reading-everything-out-there’ task, giving you four things that will help in your quest:

  • Major areas of study: These are such topics as “Building Layouts” and “Security,” and they come with a percentage weight on the test. If one of the 12 modules is 20%, be sure to study that module completely.
  • Test objectives: It is helpful to know what you’ll be tested on, isn’t it? These objectives tell you that. As a former teacher, objectives are useful. They define the scope of what my students should know. Make sure that you can demonstrate each objective.
  • Links to help guides and other resources: There are thousands of pages of material about FileMaker and countless blog posts, but these links provide you the best primary sources for your study.
  • Question and answers: These questions will not be found on the test and are not even in the same format as test-questions, but they do hint at what to focus your energies on within the help guides.

As you study, I recommend finding the answer in the help files before reading the answer provided in the guide. And don’t just find the exact answer to the question; read around the answer. The entire context is vital to your knowledge and understanding for the test.

Deliberate Practice

Take the time to set up test files focusing on one or more specific concepts or techniques you read about to fill the holes in your professional experience. It is highly unlikely, for example, you’ve been able to set up a database as an ODBC source. Reading about it is good, but setting it up will allows you see the entire picture.

I’ve got a folder on my computer called “CertTestPractice” that is filled with files to help me see how something works. I’ve got a few files that can connect with each other but only under certain access privileges. I’ve got a database in which I can test how auto-entry calc fields work.

These ideas will give you a fuller experience in preparing for the test. Just reading the HELP guide is not sufficient, nor is your practice up to this moment. Combine it all into meaningful study, and you’ll be better prepared.

In-Test Practices

I’ve now passed 5 tests, but I’ve taken a few more than that. So it stands to reason I’m not at 100% passing rate. That’s fine, I guess. But, of course, I’d rather pass the test the first time. Upon finishing the test for FileMaker 16, I realized I had adopted a few new testing strategies:

  1. Answer the question before you review the answer choices. This is a time-honored testing best-practice. Try to form the answer in your head or on paper before you review your choices. Doing so will do two things: you won’t be distracted by cleverly-placed distractors, and you’ll feel confident you got it correct if you see your answer among the choices.
  2. Flag questions and move on. There are 65 questions and 110 minutes, leaving less than two minutes per question. As you advance through the test, flag a question that you cannot answer within a few seconds, (20 or so) and come back to it. This practice will advance you through the test faster, giving you the chance to answer more questions. Your mind, as well, will be less-burdened by the stress of not fully understanding a particular question. You can’t answer the second question on the test? Who cares (for now)?
  3. Begin Round x. You’ve answered some questions but have flagged many of them. Now, it is time to go back and review the flagged questions. The test allows you to review flagged or incomplete questions. Resolve to spend a bit more time on them, and do your best to select an answer(s). Keep any questions flagged if you still feel stuck, and move on. Answer those that you are (more) confident about. Keep starting a round until you’re down to the end of flagged questions or out of time.
  4. Take a bit of a mental break. You can’t really leave the testing room, so you can just close your eyes, breathe, and think of something pleasant. Or nothing at all. Think about the big chocolate malt you’ll get after passing this test.
  5. Write it out. You will receive a plastic writing sheet and a marker after disposing of all personal items, and possibly getting scanned by a metal detector, as I did this year. Use those writing implements to jot out notes, write out calculations, or write the result of a script.
  6. Take your time. You have 110 minutes. There’s no need to rush the test. On the last three tests, I took all but 5 minutes of the allotted time. Those who consider themselves poor test takers often focus too much on the time left. The time deserves the least of your attention.

Post-Test Practices

At the end of the test you’ll receive your score and your status: Pass or Fail. Either is fine, and neither is an ending point. Take the results from your test, which are percentages of each section, whether you pass or not. If the latter, simply resolve to study those sections on which you did not perform well. Come back in two weeks or later, and give it a try again.

The FileMaker certification test is a badge of honor for those invested in the platform. You can proudly display it on LinkedIn, your FileMaker Community profile, and even highlight it in other less business-oriented social media platforms. It is a tough test, but you’ll finish the experience with the confidence that you are headed towards mastery in FileMaker.

The post Preparing for the FileMaker Certification Test appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting
If you can’t stand the heat, get out of the kitchen.

— Harry S. Truman

In a little under two weeks, over 1,000 FileMaker developers and users will ignore Mr. Truman’s advice and head directly into the kitchen that is FileMaker DevCon in Phoenix, AZ, where they will experience the heat literally and figuratively. Together, we will bake in the sun and in FileMaker and soak up as much as we can of each. It will be an exciting time.

If this is your first time in the figurative heat of FileMaker DevCon, let me recommend a few preparations to take to finish the week with a nice tan, but no sun burn or heatstroke.

Soak it All Up

The FileMaker team works hard to every year to put on an outstanding conference. This year’s conference, focusing on the game-changing features of FileMaker 16, promises to be another outstanding one. This is my sixth conference, and I cannot wait for many of the sessions.

Soak in the Sessions

I recommend you attend every session possible. Find the technical sessions at your level and take notes furiously as you listen in. Find sessions above your level, and do your best to keep up. You probably won’t comprehend all that you hear, but by revisiting your notes and the recording of the session, you will understand it later and grow as a developer.

New this year are sessions that speak of the success people have had using the FileMaker platform. These will be inspiring as you hear people talk of how they used paper or spreadsheets with some consternation before turning to FileMaker to make their lives easier. Attend those. I know I will.

If you’ve not yet signed up for a training session, be sure to do so. These are led by some of the pillars of the community that have such a profound understanding of the platform, it oozes from every word they say. There are levels of training, so you can find what is good for you. An entire day in a learning-workshop environment is vital for anyone who wishes to advance their skills in a deep way.

If you stop into a session run by a Soliant team member, make sure to come up to the presenter afterward and say hello! There will be 10 of us presenting this year, and we love to meet people in the FileMaker community.

Soak in the People

The conference week also provides ample opportunity to meet FileMaker developers from all over the world. I cannot tell you how awesome it is to be in a room of hundreds of people just as passionate about the platform as you are. My first DevCon in 2012 was the start of friendships and contacts (it’s all about the networking) that I still have today.

You can get to know others in the sessions, at breakfast and lunch, in the hallways, at the many bars around the campus, and in the pool area. It's natural to sit by yourself when you don’t know people around you. Do not do that. Instead, sit by random people, strike up a conversation. If you’re not sure what to say, ask them their thoughts on the mouse scroll wheel in FileMaker. You’ll get a great discussion going no matter where you’re at.

Finally, introduce yourselves to the people of FileMaker, Inc. They are good men and women that are incredibly passionate about the platform. They want to hear from you about your successes and struggles.

Soak in the week, everything about the week, whether in the general session or the hallways or session rooms or the lunch room or at a bar or on the lazy river. Soak in everything FileMaker and the crazy-passionate FileMaker developers around you.

Soak in the Community

This whole week is about FileMaker, so there are many opportunities to learn more about the community. Study the FileMaker DevCon page, and join as many events as possible.

  • Join the FileMaker Community. It’s full of helpful and patient people, ready to help you through your specific FileMaker issues. I’m sure that during DevCon, threads will pop up talking about the conference!
  • Review the speakers page and see if you spot names and faces that you may have seen before somewhere (including yours truly). Introduce yourselves to those people.
  • Every year, a large conference room is filled with different exhibitors of FileMaker products. Visit those and see what cool tools people have built for the FileMaker community.
  • Plan the sessions you will visit by reviewing the schedule and/or downloading the DevCon2Go app for your iOS device. Although each session will be recorded, it is awesome to be in the crowd learning and exploring at the same time. Preview the session's materials and be ready to ask questions during the hour.

Limit Your Exposure

But sometimes you gotta get away -- you have to refresh and relax and just breathe. Get out of the sun.

The week promises to be exciting, mind-numbing, and energy-depleting. You’ll lose a lot of mental electrolytes in the time, so you need to replenish those. Find a place to relax, and just take time for yourself. The meals provided are nutritious and plentiful, the hotel beds are soft and comfortable, the air conditioning is cool and refreshing, and the outside is clear and crisp and cool (but only around 4:00 am). Take advantage of all these.

If you’re more on the introverted side of the scale, be sure to get some alone time. Find a chair in the lobby, away from others if possible, and rest. Sit out by the pool (following this post’s advice literally), and let your mind wander. If you must rest by skipping a session hour, do so. That is better for you.

Wear Protective Layers

Side note: I realize I’m stretching this metaphor pretty thin. Bear with me.

In a literal sense, you will need to bring a jacket. Conferences in hot climates the world over compensate by blasting the air conditioners. So wear a jacket on the inside, and shed that thing when you get 10 feet from any exterior door.

Figuratively, keep an eye out for your mental self, and stay focused the best you can on what’s going on around you. One year, I spent almost the entire conference working late nights and early mornings on the system I built for my then-current employer, and that was distracting. I didn’t get out of DevCon all that I should have. As you prepare for DevCon, try to put your affairs in order, and protect your attention for what’s important for the week.

Welcome to the Kitchen

FileMaker DevCon is something I look forward to every year, and this year’s conference is especially exciting. Sessions on the new features of FileMaker 16 and extending functionality and the FileMaker-In-Action talks raise the level of anticipation. And for you, the first-timer, this year will be eye-opening, wonderful, tiring, exciting, and mentally draining all at once. You’ll feel a bit weathered at the end, but there is so much to be gained during this week, you’ll feel no regrets.

Feel free to hit me up: jbrown@solianconsulting.com or @jlbmagic on twitter. I’d be glad to say hi and introduce you to all the swell folks I know in this wonderful, passionate (and sometimes crazy) community.

The post FileMaker DevCon 2017: A First-Timer’s Guide appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

What happened to Force.com?

One of the reasons Salesforce is a such a successful tool is its market and customer-driven attitude. Its capabilities move with the industry, and the Salesforce team strives to make sure their users can keep up. Unfortunately, sometimes things move so quickly that users are left wondering what happened and how to move onto the next step.

My team and I have been getting some questions about Force.com – where it went, what its replacement is, and how much it costs. I’d like to share the same explanation I gave to them with you.

Force.com allowed Salesforce users to build custom apps that could integrate into the platform using point and click development, eliminating users’ need for a full programming background. In its heyday, it was a wonderful tool to enhance the Salesforce platform further. However, as users’ application needs evolved with the rest of the technology world, they found themselves needing something more robust. Salesforce capitalized on this opportunity by building up its capabilities through a Force.com to deliver the App Cloud. As a result, users can drive their application development to the next level.

Should You Upgrade?

However, if you’re a Force.com customer who has been hanging on to your licenses for a few years, you’re probably wondering if or when you should upgrade to the App Cloud and if the benefit would be worth the investment.

And trust us, we’re proponents of strategic license purchases – if you only need read-only access to accounts and contacts,  you don’t need a $1,800 per year Sales Cloud license. Buy only what you need for each team member.

But we also urge you to make the best decision for your organization. If you think you’re going to need to enhance your Salesforce apps with more customization than your grandfathered Force.com license can handle, consider exploring the App Cloud.

Here’s the pricing breakdown for the two App Cloud options:

1. Employee Apps Starter

The least expensive way to go is with the Employee Apps Start license, which costs $25 per month per user. It provides access to 10 objects per user, so this is perfect for users building small, straightforward apps.

2. Employee Apps Plus

Your second option costs a bit more, at $100 per month per user, but it gives developers the ability to build truly customized apps. The license provides for access to 110 objects per user, which empowers users to create unique

Basic Functionality and Support Included

Both App Cloud licenses provide the following:

  • Full access to accounts, contacts, calendar, activities, custom objects, content, Documents, employee cases (not customer cases) and chatter
  • Workflows and approvals
  • Customizable reports and dashboards
  • Role-based sharing
  • Salesforce1 App access
  • API calls
  • Create and read access for ideas
  • Read only access for knowledge

Your company has the option of one license or the other for your Salesforce org as well as an Enterprise or Unlimited edition. This allows you to truly customize your investment for your business and pay for only what you truly need.

Salesforce has the best information on the minute nuances between the two options and their Enterprise and Unlimited counterparts, but here’s what we think is the most important differences between the Employees Apps Starter and Employees Apps Basic:

Org Edition Employee Apps Starter Employee Apps Plus
Custom Applications Unlimited Unlimited
Custom Tabs Unlimited Unlimited
Custom Objects  10  10
Data Storage 20MB 20MB (Enterprise) 120MB (Unlimited)
File Storage 2GB 2GB
API Calls (per day) 200 1000 (Enterprise) 5000 (Unlimited)

Your Next Steps with App Cloud

As I pointed out, I don’t recommend getting rid of your Force.com license if it’s serving its purpose and meets your organization's needs.

However, if you’d like to enhance your apps further, upgrading to App Cloud is a sound investment. I encourage you to sit down with your users and developers and discuss what you actually need for each before choosing between the Employee Apps Starter and Employee Apps Plus.

If you have any questions, please feel free to comment below. If you’re looking for more guidance on your best path forward, you can reach out to us here.

The post App Cloud Licensing – Know Your Options to the Force.com License Replacement appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

Rapid application development (RAD) may be one of the hottest buzzwords of software development right now, but it's not exactly a new concept.

When software architecture and development really kicked off in the 1980s, the leading process followed the model of its older brother, classic architecture, and engineering. Developers spent a bulk of their time on up-front planning scrupulously outlining every detail of each problem. They discussed each goal, opportunity, and outcome before assembling a team, coordinating resources, and starting to build.

It works for construction. But not for software. Code is malleable and ever-changing, a stark contrast to the steel beams and concrete that goes into a building. In software, things move quickly.

After a few years, software engineers and developers caught on. They knew they needed something different and started to create processes more suited to their needs.

Building on his predecessors, James Martin fine-tuned the idea of Rapid Application Development (RAD) in the late 1980s. Software has never been the same.

What is Rapid Application Development?

Rapid application development is a software development approach focusing on rapid prototyping, skipping the traditional arduous and complex planning process. It starts with a very short requirements approach to identify bare bones functionality needs. Then it's off to the races.

Developers jump right into building a first prototype based on a rough agreement. They focus on creating a framework and then piecing together modular components by recycling past work with minor customizations. Or, they use third party components from trusted resources who adhere to industry best practices. The development team then presents this initial version to the client for feedback following a few internal tests. Then they promptly begin the next version of the prototype.

Benefits of RAD

1. Innovates the Traditional First Step

The planning process no longer requires months, or worse, years. Instead of painstakingly going over requirements and details with clients, RAD cuts this time-consuming step down by jumping into development sooner.

2. Improves Speed and Flexibility

RAD takes the pain out of shifts in strategy and functionality. You can turn on a dime during your development process without going through several strategy reviews with clients, wasting their time and your developers' time.

3. Kicks Off Show and Tell Sooner

The development process emphasizes short development windows to get an iteration of the product into the customer's hands for review faster. This validates your work and vision more quickly, giving your development team a cyclical confidence boost.

4. Increases Knowledge Gained

RAD also provides clients with more opportunities to provide feedback and keep a project from going too far down the wrong path. Therefore, it also provides them with fewer opportunities to be disappointed and more to increase satisfaction with the end product. Of course, if you're moving in the right direction, your clients will feel more comfortable with the creative control they've given your team and how functionality is unfolding.

5. Enhances Product Usability

The iterative development process makes for a stronger, more successful product with heightened usability for clients and their teams. The many checks and balances involved with each prototype allow clients to point out what they like and don't like, as well as the superfluous and missing functionality, early in the process. This constant improvement boosts software usability early in the game, increasing its potential for success.

6. Builds Meaningful Relationships with Clients

Rapid application development can't take place without increased communication with clients. Constant back-and-forth with clients is part of RAD's foundation. And there's a great side effect - a significant, lasting relationship with each client. These frequent check-ins provide more opportunities to show you care about their businesses.

7. Minimizes Bugs

Testing should take place for each software prototype iteration before it reaches the customer. Meaning - you should catch bugs earlier. This usually details the kinds of major bugs that knock projects completely off-kilter when you think you're ready to deploy.

Rapid application development doesn't just make the project go faster, it reduces the risk of project failure. The loop of constant work, testing, and feedback makes it almost impossible to launch a product that the client doesn't love.

However, the development process isn't without its challenges.

Rapid Application Development Challenges

1. Often Misses the Point

Without the typical rigorous requirements collection phase, you sometimes fail to get all crucial information related to the purpose and goals of the software application. This can lead your development down the wrong path for the first prototype, wasting time, resources, and money. Removing the discovery phase may seem to put you on the fast track at first, but in the long run, can cause a chain reaction of setbacks, putting you further from your deployment goal.

2. Produces Development Jams

In rapid application development, the speed of your team heavily depends on how fast the customer can provide feedback. Sometimes this gets stuck if many departments or business decision-makers are involved, halting an entire project. If this happens with every iteration and prototype, RAD essentially loses its meaning. This is another of shortchanging the initial discovery phase. If you start with a list of customer expectations, you can develop with fewer and less frequent check-ins along the way.

3. Heavily Depends on the Client

A developer can promptly respond to the client, but if more than one business decision maker is involved - an entire internal team or department, for example - the prototype must make the rounds. Meetings and discussions take place. It could be weeks before the development team gets needed comments on their work. This, paired with early miscommunication on specific goals for the solution, can result in more feedback than expected for the development team and wreak havoc on deadlines.

4. Pressures Project Managers

As we make obvious in the point above, clients often need a little prodding to keep communication streamlined. In addition, they need a translator between them and the developer, a role the project manager often falls into. As a result of the increased back and forth in rapid application development, PMs often end up facilitating more two-way communication, explaining feedback to developers and sharing changes in a new prototype with clients. They must stay on top of the constant updates and keep all involved parties informed.

5. Requires a Specific Type of Project

In order for rapid application development to work effectively, you must split up components of a product. You can't build everything at once. If you do, your prototype essentially serves as the finished product. Some projects just can't be split into modules and worked on separately. And keep in mind that "modular" in theory makes sense. But even if you think the software you're building is modular, there can be overlapping parts you hadn't foreseen, gumming up the works. Integration at the end of the project may present new challenges and deployment setbacks.

6. Creates Scalability Problems

The bigger the system under development, the more at risk you put it for scalability issues. The prototypes may work for the current business need, but the future ones could be an entirely different ball game. If you plan on upgrading the software application often and using it for a growing team and/or business, go with a more formal and planned-out strategy. Start with a structured consulting process that includes business analysis and a heavier planning stage.

7. Keeps Deadlines at Arms Length

Because most development teams promise to continue to build prototypes until the client is satisfied, the project end date and budget are often open-ended. This adds quite a bit of stress onto both the development team, who needs to forecast their projects and hours, and the client, who needs to keep the project within budget.

How to Make Rapid Application Development Work:

Rapid application development works better for some projects than others. It’s a great fit for developing user experience-rich consumer-facing mobile applications, where the experience is the product.

However, it often creates immovable obstacles for business applications, as it fails to deliver the predictability organizations need.

If you decide to build with RAD, you need a few things in place:

  1. Capabilities for incremental delivery: If you can't work on development in pieces, you can't use RAD.
  2. Clear expectations set with clients: If they've never worked with rapid application developers before, they may expect more collaboration up front and get upset if they don't get it. Ensure they understand what they're getting into before committing to a project. You'll need prompt and comprehensive feedback to improve upon each iteration. Make sure clients understand they must respond quickly with constructive and clear criticism.
  3. Talented and experienced project managers: Your PM team must speak both languages and keep the client happy while keeping the development team busy. That means constant and clear two-way communication.
  4. Tight security processes: As iterations flow back and forth between your development team and client, many opportunities arise for malicious attacks and careless data loss alike. Successful rapid application development absolutely requires airtight protection of each prototype version and consequent sensitive client data.
  5. An evolving project map: Do you need a detailed and solid plan before you jump into development? No, that would defeat the purpose of RAD. However, you need to to see where you've been to plan out your next steps accordingly. You may only create your map at the current pace of development, but it helps you measure your progress. And don't worry - this map will never be linear.
  6. Highly-skilled developers: Each needs a wide-range of skills to make each phase and iteration move quickly. The more each can do, the faster development moves. If you pigeon-hole your development, it will slow things down as you have to wait until a certain team member's schedule opens up.
  7. Solid internal knowledge and resources database: The more you can automate, the better rapid application development you can deliver. Start to build a collection of trusted templates, layouts, plugins, design themes, and best practices to build prototypes faster, minimize mistakes, and cut out time-intensive steps.

Delivering the Best of Both Worlds

At Soliant Consulting, our team handles application development differently than described above. We’ve developed an alternative method, a hybrid of rapid development and traditional discovery-heavy development.

As our company name insinuates, we prioritize solving business problems and improving internal efficiency for our clients over fast delivery and deployment. We never completely cut the entire business analysis and discovery process for our clients. It's too crucial to a powerful application at the end of the day. However, we also like to get to work as soon as possible and deliver solutions quickly for our clients.

As a result, we strive to find the middle ground. We don't make clients wait months before starting our first iteration on the modules we can deliver first, but we never start a project without a thorough understanding of its goals first.

Contact our team today to learn more about how our team expedites the consulting phase without cutting corners to deliver finished products sooner.

The post Common Benefits and Challenges of Rapid Application Development appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

Keeping up with new Salesforce functionality can take a lot of time and effort! At Soliant, we regularly keep an ear out for impactful new features that can transform the Salesforce experience for our clients. To save them and you time, we’ve compiled a list of seven noteworthy features in the Summer 2017 release.

1. Lightning for Gmail Inbox

I rarely indulge in hyperbole, but Salesforce just “blew my mind” with this new feature. Lightning for Gmail finally seamlessly connects Salesforce to your Gmail inbox without requiring an AppExchange application.

Now you can use the Lightning Inbox sidebar to see all records related to each e-mail, identify potential new Salesforce contacts, create new related records, and prioritize your responses in the Salesforce One mobile inbox application. This is going to make life much easier for sales and marketing representatives in your organization.

Click to view slideshow.

You must go through several steps to set Lightning for Gmail up, and it’s only available on Chrome. To get started, navigate to “Setup,” search for “Lightning for Gmail,” and follow the outlined steps.

2. Lightning “Insert Availability”

If scheduling numerous meetings makes up most of your day, you’re going to be thrilled with the new “Insert Availability” option in Salesforce. This feature connects your email directly to your Salesforce calendar.

To start using its functionality, select ‘Insert Availability’ When you start an e-mail. This allows you to choose dates and times from open slots in your calendar to offer as available for a meeting with your correspondent.

blog-summer17-lightning-gmail-insert-ava

Click "Insert Availability" to connect your Gmail directly to your Salesforce calendar - click image to enlarge.

Here’s the best part - if one of those options gets taken before your correspondent responds, s/he won’t see that option in the e-mail – no back and forth required! You can leverage this feature from both a laptop or a mobile device, perfect for team members on the go!

Note: this feature is available at an extra cost as part of the new “Salesforce IQ” features.

3. Maintain Related Records When Converting a Lead

Click to view slideshow.

This handy new addition improves upon the already efficient “three for the price of one” record creation feature Salesforce offers through its lead conversion functionality. Now you can view the entire history of an Account, Contact, and Opportunity without navigating to separate records. This will save your team time and cut down on the frustration associated with skipping around from window to window when piecing together information about specific contacts.

You don’t need to do anything to enable this feature; it’s already activated in your Salesforce implementation. Enjoy!

4. Duplicates Check

Prior to Summer 2017, Salesforce had already released a very useful native feature to help prevent creating duplicate leads (in the Leads area) and duplicate contacts (in the Contacts area). However, the Summer 2017 release introduces a default “cross-object match” to build upon its functionality. The feature runs a check in your contacts when you create new leads, and vice versa!

This powerful addition will be a tremendous help to those organizations who work with high-volume or fast-moving customer data. Their team members will save a great deal of time from not having to run multiple checks for the same customer or prospect.

To enable it, navigate to Setup – Duplicate Rules:

Click to view slideshow.

5. Activity Timeline (Lightning Only)

In Summer 2017, Salesforce makes it easier than ever to view all the actions you take with a Lead, Contact, or other object and look ahead to what’s coming next. With the new “Activity Timeline” feature, you can view details of activities like calls, e-mails, meetings in the order they occurred, with all important details right at your fingertips. You can then view your next steps in context. The “Filter Timeline” option lets you hone in even further to analyze certain timeframes or types of activities.

Screenshot of activity timeline

View Lead activity such as calls, e-mail, and meetings - click image to enlarge.

6. Keyboard Shortcuts for Lightning

For those of us “old school” technology superusers who grew up mastering keyboard shortcuts to make things happen “lightning” fast, Salesforce has just introduced new record-level keyboard shortcuts to its Lightning Experience.

Windows Keyboard Shortcuts

Global Shortcut Navigation Shortcut
Show this menu Ctrl + / Go to publisher G+P
Save Ctrl+S
Edit E
Search /
Open or close Notes N
Close or deselect Esc
Post to feed Ctrl+Enter

Mac Keyboard Shortcuts

Global Shortcut Navigation Shortcut
Show this menu Cmd + / Go to publisher G+P
Save Cmd+S
Edit E
Search /
Open or close Notes N
Close or deselect Esc
Post to feed Cmd+Enter

Now you can search for, edit, save, and close a record all from your keyboard. For team members looking to squeeze more time in their day, this is a major perk. Review all potential shortcuts here.

7. Promote Picklists to Global (for Admins)

While we’re always on the lookout for features our clients will find useful, we can’t help but be excited when Salesforce turns its attention to Admins. Simple new features can make Salesforce setup easier and allow us to spend more time with our clients and less time in front of the screen!

With this recent release, Salesforce introduces a simple and obvious new feature – “Promote Picklists to Global.” As you build up your Salesforce org, you probably often find yourself creating a picklist that you’ll need in other spots in your org. Rather than kill your momentum to navigate over to the “Global Picklists” area, you can now simply continue creating your picklist and then click “Promote to Global Value Set” to make it re-usable. It’s that simple!

Screenshot of making a picklist set to global

Click "Promote to Global Value Set" to make a picklist available to other areas of your org - click image to enlarge.

Put Your Salesforce Changes in Motion

Of course, these seven features are only scratching the surface of Salesforce’s new capabilities. For the full list of features in the Summer 2017, check out Salesforce’s official release notes.

If you have questions about how to put these, or any other new Salesforce features, to use in your organization, our team would love to help. Contact us today for more information.

The post 7 Key Features from the Salesforce Summer ’17 Release appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

FileMaker 16 introduces a new security setting that could affect solutions using JavaScript. This extended privilege is called "fmpurlscript" and allows URLs to perform FileMaker Scripts. The "fmpurl" is used to reference FileMaker applications, much like "http" is for referencing web applications. You can use an "fmpurl" with JavaScript to get information from a web script to your FileMaker application.

We have covered FileMaker and JavaScript before. Here are just a few previous blog posts and sample files:

DevCon 2017 Session

Jeremy Brown has an upcoming session at DevCon this year as well, where he will go into more depth on this topic. See more here.

Web Viewer Integrations Presentation Description

The web viewer object is an extremely versatile object that allows a developer to integrate deeper functionality into a custom app using the languages of the web, HTML/CSS and JavaScript.

In this session, you'll explore a standard way to integrate common web libraries, including setting up an integration in FileMaker, manipulating it, and gathering data using some of the new functions of FileMaker 16. Discover best practices that are used to make this as easy as possible to set up deeper functionality.

 

New FileMaker 16 Functions

FileMaker 16 also comes with helpful functionality for getting data back and forth from a JavaScript-based solution. These include functions for JSON (JavaScript Object Notation), which you can now handle natively in FileMaker. For more on these, please see the following blog posts from my team members:

Also, Makah Encarnacao has a DevCon 2017 session on JSON that may be of interest as well.  See more about that here.

Leveraging JSON in Your Custom Apps

JSON is a data language that’s becoming increasingly popular in the tech world and you can integrate JSON with FileMaker for your data interchanging needs.

In this session, you'll learn the various ways in which to leverage JSON in your custom apps. Take real world examples and investigate integration capabilities by contrasting FileMaker 15 (without plugins and 3rd party tools) and FileMaker 16 (using 16’s new JSON functions), including approaches for dealing with improperly formatted JSON. Recommended Background.

Updated JavaScript Samples for FileMaker 16

This new release has been a great opportunity to update a few examples I have written that use JavaScript. These are also freely available.

These particular examples demonstrate techniques that do not output a visible result in a Web Viewer. Rather, they utilize JavaScript functionality to extend FileMaker and return data to FileMaker in a useful way.

Each of these has been updated for FileMaker 16.

FM-js_Barcode

https://github.com/SoliantMike/FM-js_Barcode

A question posed in the FileMaker Community asked if there was a way to save an image generated from JavaScript and save it in a container field. This solution uses code from the Github repository of Johan Lindell, linked below.

Since storing as an image in a container field allows for clean printing in all platforms that FileMaker supports, this is a preferred way to generate and store barcodes. You don’t need to install anything on client machines, like 3rd party plugins or maintained fonts.

  • Github Project used here.

Some barcode types may have requirements on the values they can represent. For example, your EAN type must be a 13 digit number. Check the documentation for the barcode type you use before implementing this in your solution.

FileMaker 16 also added better support for Windows versions where long URLs are not supported and may fail. Note that this uses the user clipboard to transfer data from the web viewer to a field.

FM-jsSON

https://github.com/SoliantMike/FM-jsJSON

This file uses JavaScript to parse JSON. Since JSON was built specifically to be used by JavaScript, it makes sense to utilize the JavaScript engine via the Web Viewer in Filemaker Pro and FileMaker Go.

You can easily adapt this to your solutions as needed. There are minimal fields involved, and a couple scripts that drive the solution.

To run the demo:

  1. Modify the object you want to reference in the field provided. Note that arrays start at zero (0).
  2. Click the "Get Object" button.
  3. View the results.

The JavaScript used is in the Resources table, and you can modify it for your use from there.

FM-js_ExcelSheets

https://github.com/SoliantMike/FM-js_ExcelSheets

This file uses JavaScript to create an XLSX file. You can easily adapt it to your solutions as needed. There are minimal fields involved, and a couple scripts that drive the solution.

To run the demo:

  1. Check the boxes to select the sheets to include in your Worksheet.
  2. Click the "Save as Excel" button.
  3. View the results. If "Automatically Open" was checked, a copy is exported to the desktop and launched.

The JavaScript used is in the Resources table; you can modify it for your use from there.

Use the JavaScript Library from Github here.

Please view the licensing information for each piece.

FM-js_ValidateXML

https://github.com/SoliantMike/FM-js_ValidateXML

A question posed in the FileMaker Community asked if there was a way to validate XML. Interestingly, there are solutions for this in JavaScript that we can use to pass a result back to a FileMaker script.

By adjusting some JavaScript related to finding unclosed tags in XML, you can have it use a FMP URL to call a script in the parent FileMaker file and pass the result back as a script parameter.

See a sample JavaScript from Stack Overflow here.


The source URL referenced on the Stack Overflow page no longer works; use the XML Validator instead.

The post JavaScript Changes in FileMaker 16 appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

Clicks, Not Code

‘Clicks not code’ is a big part of Salesforce. As an #AwesomeAdmin there is a lot I can do to automate tasks for my users:

  • Create workflows to automatically fill in fields and send emails out based off of certain criteria
  • Develop processes to create new records or post to Chatter
  • Build flows with more complex criteria
  • And more!

But there is a lot I can’t do. That’s where code comes in. It takes Salesforce to the next level.

Delivering the Next Step with the Apex Programming Language

The code involved with Visualforce pages and Lightning components added to standard pages allow organizations to do more. For example, they can filter a related list or show a calculation from related items. To enhance the user experience to its full potential and deliver full automation, though, they turn to the Apex programming language.

Apex unlocks what the ‘clicks not code’ tools can’t. The programming language can reach across objects that aren’t directly related, perform batch processing, and calculate rollups on records that aren’t master-detail. It can perform logic on an object based on records of another object process records that are deleted (or undeleted) and integrate with outside systems.

Should You Invest in Leveraging the Apex Programming Language?

Code can automate your difficult multi-step processes, saving your users time and frustration. It can combine screens, pulling information from multiple objects into the same page, saving users from clicking back and forth. The code can execute when a button is clicked and be used in declarative tools like Process Builder. Therefore when a field changes, the process then tells the code to execute, or it can run on any record that is created (or edited or deleted) when using a tool like data loader or an integration that creates or updates records. You can even create small chunks of reusable code for the declarative tools to use them on any object. For example, you can lock a record from editing on any object when criteria changes.

Quite simply, if you want to truly customize your Salesforce platform, you’ve got to give the Apex programming language a shot. It won’t take long to prove it’s worth your invested time to learn it or hire a trusted resource.

Use Case 1: Event Management

I’ll share a simple example of automation, but know that the sky is the limit. This is just scratching the surface of the Apex programming language. At Soliant, I work with a lot of nonprofit organizations. Many of my clients host events and manage sales of tickets for these events. These tickets are often sold in chunks - 25 tickets come with the Gold Sponsorship package, 35 tickets come with the Platinum Sponsorship package, etc.

Often, when purchasing tickets, the buyer doesn’t supply the information of who will actually be attending. They wait until closer to the event to provide the names of their guests. Unfortunately, this means the nonprofit organization’s team must create 25 tickets every time the Gold Sponsorship package is purchased. This is obviously inefficient and not a great use of their time. By using the Apex programming language to generate those tickets automatically with a sponsorship purchase, I can help my clients improve their internal workflows and focus less on manual processes in Salesforce. The code creates the tickets under the purchaser account and allows the user to fill in the names of the attendees at their own pace. This simple bit of code allows these nonprofit organizations to simply and efficiently see how many tickets they sell and who attends their events.

Use Case 2: Automatic Payment Calculations and Record Updates

My next example leverages Apex in the Salesforce Sales Cloud for automation calculations related to opportunity amounts and payments. (An opportunity amount refers to the estimated sale amount.)

Without the automation of Apex, many of my clients have found themselves manually dividing the opportunity amount up for payments on a variety of payment schedules (weekly, bi-weekly, monthly, etc.). They then must applying the payment to the oldest outstanding payment, again all manually.

However, through Apex, I can write code to calculate this for them over a specific time frame. It even can take custom variables into consideration, such as a down payment. The code can equally calculate out each payment to be made, and make the last payment the remainder of any leftover amount. When it is time to take a payment, the user simply clicks a button and enters the payment amount. The code finds the oldest payment due and applies the amount. If that line item is paid in full, the code marks it as such. The system can even record if it receives a partial payment or the full amount of a payment plus a credit toward the next payment.

Use Case 3: External System Integration

You can take the Apex programming language one step further and integrate your Salesforce solution with an outside payment processing system. If the external system returns the payment as approved, the code executes, and the payment line item is marked as paid. If payment is declined, then the line items remains as unpaid.

Of course the users could be doing all of these calculations and record lookup manually. But with Apex customization, they only have to click a button and enter the payment amount, leaving them more time to focus on what is important, their clients.

It also saves the accounting team time. They don’t have to check that each payment is created correctly and is credited to the correct line item.

Make an Impact with Apex Across All Industries and Business Types

Apex code can automate processes across your Salesforce instance. It can create easy to use interfaces that make your users want to enter more data. It can integrate with external applications to make your Salesforce data more meaningful. Whether you use Sales Cloud, Service Cloud, or some other combination of clouds and functions, the Apex programming language can bring your Salesforce automation and business process to the next level.

 

The post An Introduction to the Apex Programming Language: Capabilities & Use Cases appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

A great skill a Salesforce administrator can have in his or her back pocket is basic knowledge of the Apex programming language. This awareness empowers administrators to better understand the behavior of an application. As a result, administrators can explain underlying logic to users as well as diagnose issues without having to go to a Salesforce developer for help.

To help Salesforce administrators explore learning Apex, I recommend writing a Hello World program. In this post, I will walk you through it. In the process, you will learn a few simple but useful programming concepts: variables, primitives, conditionals and methods.

Using the Developer Console

Before we can start coding our Hello World program, we need to learn how to run it. There are several ways to execute Apex in the Salesforce platform. The simplest one is using the Developer Console to execute code in an anonymous block. Let’s start by opening the console.

  1. Make sure your profile has the "Author Apex" permission enabled.
  2. Click on the gear icon, then select Developer Console. If you are in classic mode, click on your name on the top right, then select Developer Console.
  3. Once the Developer Console loads, click debug on the menu and select Open Execute Anonymous Window. You can also use the shortcut CTRL+E.
Enter Apex Code

Figure 1 - Execute Anonymous Window

  1. Type the following line of code:
       System.debug('Hello world!');
  1. Check the Open Log option.
  2. Click Execute.
  3. Once the Execution Log loads, check the Debug Only checkbox.
  4. You should see your Hello world message. Congratulations, you just wrote your first Apex program!
Execution Log

Figure 2 - Execution Log

Variables

For our next step, let’s try something a little more interesting. We will use a variable and assign "Hello World!" to it. Then, we will output the value of that variable to the debug log.

  1. Open the Execute Anonymous Window from the debug menu or using the shortcut, CTRL+E.
  2. Modify your code to look like this:
       String message = 'Hello world!';
       System.debug(message);
  1. Click Execute.
  2. Once the Execution Log loads, check the Debug Only checkbox.

Notice the output is the same as the previous time we ran the code. Line 1 has two purposes —  one is declaring the variable, which tells Apex we want to create a new variable of type String. The second purpose is to set its value to "Hello world!".

An interesting property of variables is that they are mutable. That means we can modify their content after they are created. Let’s try it. Update the code again and add one more line.

String message = 'Hello world!';
message = 'Hi there!';
System.debug(message);

Run the code again following the same steps as before. This time you will see "Hi there!", but "Hello World!" will not be displayed. Let’s take a look at what just happened. In line 1, we created a variable called message and assigned a value of "Hello World!" to it. Then, in line two, we assigned a new value to it, "Hi there". The new value took the place of the old one, overwriting it.

You can also perform operations on variables. In this case, since we are dealing with Strings, we can do things like concatenation (stitching two or more strings together) or changing the casing to all caps.

String greeting = 'Hello';
String who = 'world';
who = who.toUpperCase();
String message = greeting + ' ' + who + '!';
System.debug(message);

When you run this code, you will see it generates a similar output as the first example. That is because we are concatenating a variable called greeting which contains the word "Hello", a space, the who variable containing "WORLD", and the exclamation point symbol. Those four things together form the phrase "Hello WORLD!".
Are you wondering why the word "world" is all in capitals? That is because of line 3 where we call the toUpperCase() function which gives us back the same string but with all its letters capitalized.

Primitive types

So far, we have only used variables of type String in our examples. String variables allow you to store a collection or characters, numbers or symbols but there are other types that we can use for different purposes. For example, Integer can be used for storing whole numbers, or Double for numbers with decimals. Apex provides 12 primitive types but you can also create custom types by writing your own classes.

List of Apex Primitives

Blob Binary Data
Boolean The values true or false
Date A calendar date
Datetime A calendar date and time
Decimal A number that includes a decimal point
Double A double precision floating point number
ID A 15 or 18-digit Salesforce ID
Integer A whole number -- between -2,147,483,648 and 2,147,483,647
Long A large whole number -- between -263 and 263-1
Object A generic type that can store a value of any other type
String Any set of characters -- surrounded by single quotes
Time A time

Conditional statements

In order to have your code make decisions and behave differently based on the value of a variable (or user input), you need to use a conditional statement. The most common type of conditional is the if-else statement, which is very similar to the IF() function in Salesforce formulas. Just like its formula counterpart, it has three parts: the logical test, the true block, and (optionally) the false block. If the logical test evaluates to true, the true block is executed, otherwise the false/else block is. A code block is one or more lines of code wrapped with curly brackets.

Boolean formal = true;
String who = 'world';
String greeting;
if (formal == true) {
  greeting = 'Hello';
} else {
  greeting = 'Hi';
}
String message = greeting + ' ' + who;
System.debug(message);

When you run this code, you will see that it outputs "Hello world". In this case, the logical test was checking if the variable formal was equal to true. Since that is the case, it executed the first code block (line 5) which sets the variable greeting equals to "Hello". If it had not been true, it would have executed the false/else block (line 7) which would have set the greeting variable to "Hi". You can try running it again, but setting the variable formal equals to false on line 1.

Writing Methods

As a Salesforce administrator, you are probably already familiar with the concept of methods which are very similar to functions in validation rules and formula fields. We have also already used two methods in our examples. One was System.debug(), and the other one was String.toUpperCase(). You already know how to invoke them. Now let’s take a closer look.

Methods represent a block of code that can be invoked (or called) from somewhere else. They are useful in many ways but have two main purposes: First, you can use methods to avoid repetition by writing your code once and calling it multiple times as needed. Second, methods make code cleaner and easier to read by allowing sections to be abstracted out.

Let’s modify our Hello Word program to move the greeting selection logic inside a method, which we will call getGreeting().

Boolean formal = true;
String who = 'world';
String greeting = getGreeting(formal);
String message = greeting + ' ' + who;
System.debug(message);

private String getGreeting(Boolean formal) {
    if (formal == true) {
      return 'Hello';
    } else {
      return 'Hi';
    }
}

Now, if you want to quickly glance at the code, you should be able to tell at a high level what it does just by looking at the first 5 lines. If you are interested in the specifics of how the greeting is selected, you can look at lines 8 through 12 inside the method. This will make it easier for someone else to read your code or even for yourself, if in the future you want to refresh your memory on what the logic does.

This latest variation of the code will output "Hello world" just like previous versions but the order in which the lines get executed is a little different. First lines 1 and 2 will run. Once we get to line 3, in order to get the value to store in greeting, lines 6, 7, and 8 will get executed and getGreeting() will return "Hello". Then execution continues on line 4, where "Hello world" will be stored in message. Lastly, line 5 will be executed which will output the value of message. At that point, the code is finished executing and terminates.

Further Reading

Congratulations, you have reached the end of this tutorial. You should now be able to read and understand the gist of the code in your org, even if you don’t know exactly what each line does. You should also be able to make simple changes to existing code with the supervision of a more experienced developer.

If you enjoyed writing your first program and would like to learn more, you can take a look at these great resources:

The post Hello, World! The Basics of Apex Programming appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

Today I'm sharing a quick tutorial on how to add Lightning Components to Visualforce pages and then take an event from your Lightning Component and have your Visualforce page handle it. This assumes you already have basic knowledge of Visualforce pages and the ability to create a basic Lightning Component. Before you start, make sure you've defined stylings for your Lightning Design System.

In order to construct this, we need a few elements:

  1. An app container (Visualforce page)
  2. A Lightning Component with a related controller and helper class
  3. An Apex Controller
  4. A Lightning Event

This example uses Casper Harmer's code for a Lookup Component. Some functionality was removed, and the event was added:

SVG Component

<aura:component >
 <aura:attribute name="class" type="String" description="CSS classname for the SVG element" />
 <aura:attribute name="xlinkHref" type="String" description="SLDS icon path. Ex: /assets/icons/utility-sprite/svg/symbols.svg#download" />
 <aura:attribute name="ariaHidden" type="String" default="true" description="aria-hidden true or false. defaults to true" />
</aura:component>

Lookup Component

<aura:component controller="SampleController" access="global" >
	<ltng:require styles="{!$Resource.SLDS213 + '/assets/styles/salesforce-lightning-design-system.css'}" />

	<!-- Component Init Handler -->
	<aura:handler name="init" value="{!this}" action="{!c.init}"/>

	<!-- Attributes -->
	<aura:attribute name="parentRecordId" type="Id" description="Record Id of the Host record (ie if this was a lookup on opp, the opp recid)" access="global"/>
	<aura:attribute name="lookupAPIName" type="String" description="Name of the lookup field ie Primary_Contact__c" access="global"/>
	<aura:attribute name="sObjectAPIName" type="String" required="true" description="The API name of the SObject to search" access="global"/>
	<aura:attribute name="label" type="String" required="true" description="The label to assign to the lookup, eg: Account" access="global"/>
	<aura:attribute name="pluralLabel" type="String" required="true" description="The plural label to assign to the lookup, eg: Accounts" access="global"/>
	<aura:attribute name="recordId" type="Id" description="The current record Id to display" access="global"/>
	<aura:attribute name="listIconSVGPath" type="String" default="/resource/SLDS213/assets/icons/custom-sprite/svg/symbols.svg#custom11" description="The static resource path to the svg icon to use." access="global"/>
	<aura:attribute name="listIconClass" type="String" default="slds-icon-custom-11" description="The SLDS class to use for the icon." access="global"/>
	<aura:attribute name="searchString" type="String" description="The search string to find." access="global"/>
	<aura:attribute name="required" type="Boolean" description="Set to true if this lookup is required" access="global"/>
	<aura:attribute name="filter" type="String" required="false" description="SOSL filter string ie AccountId = '0014B000003Sz5s'" access="global"/>

	<aura:attribute name="callback" type="String" description="Call this to communcate results to parent" access="global" />

	<!-- PRIVATE ATTRS -->
	<aura:attribute name="matches" type="SampleController.Result[]" description="The resulting matches returned by the Apex controller." />

	<aura:registerEvent name="updateLookup" type="c:LookupEvent" />

	<div class="slds">
		<div aura:id="lookup-div" class="slds-lookup" data-select="single" data-scope="single" data-typeahead="true">
		<!-- This is the Input form markup -->
		<div class="slds-form-element">
			<label class="slds-form-element__label" for="lookup">{!v.label}</label>
			<div class="slds-form-element__control slds-input-has-icon slds-input-has-icon--right">
		    	<c:PR_SVG class="slds-input__icon" xlinkHref="/resource/SLDS213/assets/icons/utility-sprite/svg/symbols.svg#search" />
			    <!-- This markup is for when an item is currently selected -->
			    <div aura:id="lookup-pill" class="slds-pill-container slds-hide">
		            <span class="slds-pill slds-pill--bare">
		                <span class="slds-pill__label">
		                    <c:PR_SVG class="{!'slds-icon ' + v.listIconClass + ' slds-icon--small'}" xlinkHref="{!v.listIconSVGPath}" />{!v.searchString}
		                </span>
		                <button class="slds-button slds-button--icon-bare" onclick="{!c.clear}">
		                    <c:PR_SVG class="slds-button__icon" xlinkHref="/resource/SLDS213/assets/icons/utility-sprite/svg/symbols.svg#close" />
		                    <span class="slds-assistive-text">Remove</span>
		                </button>
		            </span>
		        </div>
		        <!-- This markup is for when searching for a string -->
		        <ui:inputText aura:id="lookup" value="{!v.searchString}" class="slds-input" updateOn="keyup" keyup="{!c.search}" blur="{!c.handleBlur}"/>
		    </div>
		</div>
			<!-- This is the lookup list markup. Initially it's hidden -->
			<div aura:id="lookuplist" class="" role="listbox">
			    <div class="slds-lookup__item">
			        <button class="slds-button">
			            <c:PR_SVG class="slds-icon slds-icon-text-default slds-icon--small" xlinkHref="/resource/SLDS213/assets/icons/utility-sprite/svg/symbols.svg#search" />
			            &quot;{!v.searchString}&quot; in {!v.pluralLabel}
			        </button>
			    </div>
			    <ul aura:id="lookuplist-items" class="slds-lookup__list">
			        <aura:iteration items="{!v.matches}" var="match">
			            <li class="slds-lookup__item">
			                <a id="{!globalId + '_id_' + match.SObjectId}" role="option" onclick="{!c.select }">
			                    <c:PR_SVG class="{!'slds-icon ' + v.listIconClass + ' slds-icon--small'}" xlinkHref="{!v.listIconSVGPath}" />{!match.SObjectLabel}
			                </a>
			            </li>
			        </aura:iteration>
			    </ul>
			</div>
		</div>
	</div>
</aura:component>

Lookup JS Controller

/**
 * (c) Tony Scott. This code is provided as is and without warranty of any kind.
 * Adapted for use in a VF page, removed need for two components, removed events - Caspar Harmer
 *
 * This work by Tony Scott is licensed under a Creative Commons Attribution 3.0 Unported License.
 * http://creativecommons.org/licenses/by/3.0/deed.en_US
 */
({
    /**
     * Search an SObject for a match
     */
    search : function(cmp, event, helper) {
        helper.doSearch(cmp);
    },

    /**
     * Select an SObject from a list
     */
    select: function(cmp, event, helper) {

        helper.handleSelection(cmp, event);
    },

    /**
     * Clear the currently selected SObject
     */
    clear: function(cmp, event, helper) {

        helper.clearSelection(cmp);
    },

    /**
     * If the input is requred, check if there is a value on blur
     * and mark the input as error if no value
     */
     handleBlur: function (cmp, event, helper) {

         helper.handleBlur(cmp);
     },

    init : function(cmp, event, helper){
      try{
        //first load the current value of the lookup field
        helper.init(cmp);
        helper.loadFirstValue(cmp);

        }catch(ex){
          console.log(ex);
        }
      }
})

Lookup JS Helper

/**
 * (c) Tony Scott. This code is provided as is and without warranty of any kind.
 * Adapted for use in a VF page, removed need for two components, removed events - Caspar Harmer
 *
 * This work by Tony Scott is licensed under a Creative Commons Attribution 3.0 Unported License.
 * http://creativecommons.org/licenses/by/3.0/deed.en_US
 */
({
    //lookup already initialized
    initStatus : {},
    init : function (cmp){
      var required = cmp.get('v.required');
      if (required){
        var cmpTarget = cmp.find('lookup-form-element');
        $A.util.addClass(cmpTarget, 'slds-is-required');
      }
    },

    /**
     * Perform the SObject search via an Apex Controller
     */
    doSearch : function(cmp) {
        // Get the search string, input element and the selection container
        var searchString = cmp.get('v.searchString');
        var inputElement = cmp.find('lookup');
        var lookupList = cmp.find('lookuplist');

        // Clear any errors and destroy the old lookup items container
        inputElement.set('v.errors', null);

        // We need at least 2 characters for an effective search
        console.log('searchString = ' + searchString);
        if (typeof searchString === 'undefined' || searchString.length &lt; 2)
        {
            // Hide the lookuplist
            //$A.util.addClass(lookupList, 'slds-hide');
            return;
        }

        // Show the lookuplist
        console.log('lookupList = ' + lookupList);
        $A.util.removeClass(lookupList, 'slds-hide');

        // Get the API Name
        var sObjectAPIName = cmp.get('v.sObjectAPIName');
        // Get the filter value, if any
        var filter = cmp.get('v.filter');

        // Create an Apex action
        var action = cmp.get('c.lookup');

        // Mark the action as abortable, this is to prevent multiple events from the keyup executing
        action.setAbortable();

        // Set the parameters
        action.setParams({ "searchString" : searchString, "sObjectAPIName" : sObjectAPIName, "filter" : filter});

        // Define the callback
        action.setCallback(this, function(response) {
            var state = response.getState();
            console.log("State: " + state);

            // Callback succeeded
            if (cmp.isValid() &amp;&amp; state === "SUCCESS")
            {
                // Get the search matches
                var matches = response.getReturnValue();
                console.log("matches: " + matches);

                // If we have no matches, return nothing
                if (matches.length == 0)
                {
                    //cmp.set('v.matches', null);
                    return;
                }

                // Store the results
                cmp.set('v.matches', matches);
            }
            else if (state === "ERROR") // Handle any error by reporting it
            {
                var errors = response.getError();

                if (errors)
                {
                    if (errors[0] &amp;&amp; errors[0].message)
                    {
                        this.displayToast('Error', errors[0].message);
                    }
                }
                else
                {
                    this.displayToast('Error', 'Unknown error.');
                }
            }
        });

        // Enqueue the action
        $A.enqueueAction(action);
    },

    /**
     * Handle the Selection of an Item
     */
    handleSelection : function(cmp, event) {
        // Resolve the Object Id from the events Element Id (this will be the &lt;a&gt; tag)
        var objectId = this.resolveId(event.currentTarget.id);
		// Set the Id bound to the View
		cmp.set('v.recordId', objectId);

        // The Object label is the inner text)
        var objectLabel = event.currentTarget.innerText;

		// Update the Searchstring with the Label
		cmp.set("v.searchString", objectLabel);

        // Log the Object Id and Label to the console
        console.log('objectId=' + objectId);
        console.log('objectLabel=' + objectLabel);

        //This is important.  Notice how i get the event.
        var updateEvent = $A.get("e.c:LookupEvent");
		updateEvent.setParams({"lookupVal": objectId, "lookupLabel": objectLabel});
		updateEvent.fire();
    },

    /**
     * Clear the Selection
     */
    clearSelection : function(cmp) {
        // Clear the Searchstring
        cmp.set("v.searchString", '');
				cmp.set('v.recordId', null);

        var func = cmp.get('v.callback');
        console.log(func);
        if (func){
          func({id:'',name:''});
        }

        // Hide the Lookup pill
        var lookupPill = cmp.find("lookup-pill");
        //$A.util.addClass(lookupPill, 'slds-hide');

        // Show the Input Element
        var inputElement = cmp.find('lookup');
        $A.util.removeClass(inputElement, 'slds-hide');

        // Lookup Div has no selection
        var inputElement = cmp.find('lookup-div');
        $A.util.removeClass(inputElement, 'slds-has-selection');

        // If required, add error css
        var required = cmp.get('v.required');
        if (required){
          var cmpTarget = cmp.find('lookup-form-element');
          $A.util.removeClass(cmpTarget, 'slds-has-error');
        }
    },

    handleBlur: function(cmp) {
       var required = cmp.get('v.required');
       if (required){
         var cmpTarget = cmp.find('lookup-form-element');
         $A.util.addClass(cmpTarget, 'slds-has-error');
       }
   },

    /**
     * Resolve the Object Id from the Element Id by splitting the id at the _
     */
    resolveId : function(elmId)
    {
        var i = elmId.lastIndexOf('_');
        return elmId.substr(i+1);
    },

    /**
     * Display a message
     */
    displayToast : function (title, message)
    {
        var toast = $A.get("e.force:showToast");

        // For lightning1 show the toast
        if (toast)
        {
            //fire the toast event in Salesforce1
            toast.setParams({
                "title": title,
                "message": message
            });

            toast.fire();
        }
        else // otherwise throw an alert
        {
            alert(title + ': ' + message);
        }
    },

    loadFirstValue : function(cmp){

        var action = cmp.get('c.getCurrentValue');
        var self = this;
        action.setParams({
            'type' : cmp.get('v.sObjectAPIName'),
            'value' : cmp.get('v.recordId'),
        });

        action.setCallback(this, function(a) {
            if(a.error &amp;&amp; a.error.length){
                return $A.error('Unexpected error: '+a.error[0].message);
            }
            var result = a.getReturnValue();
            cmp.set("v.searchString", result);

            if (null!=result){
              // Show the Lookup pill
              var lookupPill = cmp.find("lookup-pill");
              $A.util.removeClass(lookupPill, 'slds-hide');

              // Lookup Div has selection
              var inputElement = cmp.find('lookup-div');
              $A.util.addClass(inputElement, 'slds-has-selection');
            }
        });
        $A.enqueueAction(action);
    }
})

Apex Controller

public with sharing class SampleController
{
	@AuraEnabled
	public static String getCurrentValue(String type, String value){
		if(String.isBlank(type))
		{
			System.debug('type is null');
			return null;
		}

		ID lookupId = null;
		try
		{
			lookupId = (ID)value;
		}catch(Exception e){
			System.debug('Exception = ' + e.getMessage());
			return null;
		}

		if(String.isBlank(lookupId))
		{
			System.debug('lookup is null');
			return null;
		}

		SObjectType objType = Schema.getGlobalDescribe().get(type);
		if(objType == null){
			System.debug('objType is null');
			return null;
		}

		String nameField = getSobjectNameField(objType);
		String query = 'Select Id, ' + nameField + ' From ' + type + ' Where Id = \'' + lookupId + '\'';
		System.debug('### Query: '+query);
		List&lt;SObject&gt; oList = Database.query(query);
		if(oList.size()==0)
		{
			System.debug('objlist empty');
			return null;
		}
		return (String) oList[0].get(nameField);
	}

	/*
	   * Returns the "Name" field for a given SObject (e.g. Case has CaseNumber, Account has Name)
	*/
	private static String getSobjectNameField(SobjectType sobjType)
	{
		//describes lookup obj and gets its name field
		String nameField = 'Name';
		Schema.DescribeSObjectResult dfrLkp = sobjType.getDescribe();
		for(schema.SObjectField sotype : dfrLkp.fields.getMap().values()){
		  Schema.DescribeFieldResult fieldDescObj = sotype.getDescribe();
		  if(fieldDescObj.isNameField() ){
		    nameField = fieldDescObj.getName();
		      break;
		  }
		}
		return nameField;
	}
	/**
	 * Aura enabled method to search a specified SObject for a specific string
	 */
	@AuraEnabled
	public static Result[] lookup(String searchString, String sObjectAPIName)
	{
		// Sanitze the input
		String sanitizedSearchString = String.escapeSingleQuotes(searchString);
		String sanitizedSObjectAPIName = String.escapeSingleQuotes(sObjectAPIName);

		List&lt;Result&gt; results = new List&lt;Result&gt;();

		// Build our SOSL query
		String searchQuery = 'FIND \'' + sanitizedSearchString + '*\' IN ALL FIELDS RETURNING ' + sanitizedSObjectAPIName + '(id,name) Limit 50';

		// Execute the Query
		List&lt;List&lt;SObject&gt;&gt; searchList = search.query(searchQuery);
		System.debug('searchList = ' + searchList);
		System.debug('searchQuery = ' + searchQuery);

		// Create a list of matches to return
		for (SObject so : searchList[0])
		{
		    results.add(new Result((String)so.get('Name'), so.Id));
		}

		System.debug('results = ' + results);
		return results;
	}

	/**
	 * Inner class to wrap up an SObject Label and its Id
	 */
	public class Result
	{
		@AuraEnabled public String SObjectLabel {get; set;}
		@AuraEnabled public Id SObjectId {get; set;}

		public Result(String sObjectLabel, Id sObjectId)
		{
		    this.SObjectLabel = sObjectLabel;
		    this.SObjectId = sObjectId;
		}
	}
}

Most of this code is from Caspar's post, but there are a few differences. The first major difference is in the helper's "handleSelection" method, where it instead activates the event for the selection and associates values to the event's properties:

var updateEvent = $A.get("e.c:LookupEvent");
updateEvent.setParams({"lookupVal": objectId, "lookupLabel": objectLabel});
updateEvent.fire();

This is important because instead of passing the callback to the Visualforce page instead we will have it waiting for an event to fire. The Lookup component also contained a reference to an event:

<aura:registerEvent name="updateLookup" type="c:LookupEvent" />

The event code is very simple. Note: the type needs to be APPLICATION instead of COMPONENT:

<aura:event type="APPLICATION" description="Event template">
	<aura:attribute name="lookupVal" type="String" description="Response from calls" access="global" />
	<aura:attribute name="lookupLabel" type="String" description="Response from calls" access="global" />
</aura:event>

At this point, you will have an active component that will run an event when a selection is made. The missing link so far is the Visualforce page:


<apex:page applyBodyTag="false" standardController="Contact" docType="html-5.0" showHeader="true" sidebar="false" standardStylesheets="false">
	<html xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
		<head>
		  <apex:includeScript value="/lightning/lightning.out.js" />
		  <apex:stylesheet value="{!URLFOR($Resource.SLDS213, 'assets/styles/salesforce-lightning-design-system-vf.css')}"/>
		</head>
		<body >
		  <div class="slds">
		    <div class="slds-form-element slds-m-top--xx-small">
		      <div class="slds-m-right--x-small" id="account_lookup"></div>
		    </div>
		  </div>
		</body>
		<script>
			var visualForceFunction = function(event)
			{
				var myEventData1 = event.getParam("lookupVal");
				var label = event.getParam("lookupLabel");
				console.log('response data = ' + myEventData1 + ' : ' + label);
			};

			// and...
			$Lightning.use("c:expensesAppVF", function()
			{
				$Lightning.createComponent
				(
					"c:Lookup",
					{
						
						recordId: "{!contact.AccountId}",
						label: "Account",
						pluralLabel: "Accounts",
						sObjectAPIName: "Account"
					},
					"account_lookup",
					function()
					{
					    $A.eventService.addHandler({ "event": "c:LookupEvent", "handler" : visualForceFunction});
					}
				);
			});
		</script>
	</html>
</apex:page>

Instead of receiving a callback, this version adds a handler to wait for the event to fire when an Account is selected. This lookup could work for any object that you want as long as you change the API name of the objects.  You can replace the console.log in the event handler and instead have it do some real functionality, such as actually saving the values returned from the Lightning Component on the Salesforce record.

The post Handle Lightning Events from a Visualforce Page appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

FileMaker 16 - Context-Independent Card WindowsWhile you’re in the middle of doing your work, you might want to add something to do your to do list, but you don’t want to lose your spot in your FileMaker solution. With Card Windows, you can open a new window (within the current window) with a new layout that may or may not be related to the main window/layout.

So even though you’re working on an invoice or looking at customer data, a Card Window can allow you to view your to do list, add a new task, close the to do list, and you’re right back where you were. Learn more about this feature by downloading the demo file.

Complete the form to receive the demo file.


Trouble with this form? Click here.

The post FileMaker 16: Context-Independent Card Windows Demo appeared first on Soliant Consulting.


Afficher la totalité du billet

Soliant Consulting

Card Windows for NavigationOne of the most exciting features included with the FileMaker 16 release is Card Windows. We're used to seeing a lightbox on a web page; now you can do the same in FileMaker.

In her video, Martha Zink shows how to use a Card Window for navigation. Download the demo to see how it's done.

Complete the form to receive the demo file.


Trouble with this form? Click here.

The post FileMaker 16: Using Card Windows for Navigation Demo appeared first on Soliant Consulting.


Afficher la totalité du billet

×