Dreamforce ’16 – What I did not tweet

One of the first things I did after coming back from my maternity leave, was to attend Dreamforce ’16. And this post is about this amazing event. However I would like to write something different from others. First of all, don’t expect a technical entry where I praise all Salesforce news. They were really good this year, but DF is more than a technical event. It’s networking, it’s enjoy the place, the sun. It’s comeback with ideas to explore at home and keep feelings of these sort time.

So, what are you going to read here? My experience but with small sentences. Although my smartphone was ready to write tweets, I did not have time for it. It was write or listen, so I decide to pay attention and make pics.

So, What I did not tweet?

Day 1 – 4th of October

06:00 – Start my #DF16 trip. @Bilbao airport. Long queue for checking. Will I miss my flight? It’s a bit delayed … so far so good.

09:30 – At Schiphol airport. Close to lose my connection to San Francisco!! So lets do some exercise, run along Amsterdam airport!! I get it. Sit down and #relax for the next 11 hours.

11:45 – #Border has no end 😦  But I’m on time for #FinancialForce DevTalks. Starting to feel tired.

13:00 – Where is my luggage? This suitcase is similar to mine but it is not mine!! Sorry Mrs García, not sure where your belongings are 😦 😦 😦 #luggagelost #noclotheswithme

14:00 – Arrive to the hotel with a new San Francisco T-shirt bought at the airport and looking forward to having a shower. Sorry Mrs García, your room is not available yet. You would have to wait. What?? 😦 😦 😦 😦 😦 😦 #anythingelse?

img_4929

 

 

14:30 – Dreamforce registration. Here is my credential!!

 

 

 

 

 

17:00 (2:00 in Spain) – FinancialForce Dev Talks’16 starts!! Nice to share the stage with Andy Fawcett and Jesse Atlman

img_1256

19:00 – Time for #MVP dinner … I cannot do it. Tired and need to buy some clothes for tomorrow. But I think that I missed my #amazingbbq 🙂

Day 2 – 5th of October

img_4808

 

7:00 – Nice views from my room #lovesunnydays

 

11:00 – @Salesforce Circle of Success session. Success: arrive on time – lost in the hotel. No session success … 1 attendee in a table with 5 MVPs. Poor him lot of questions about what he needed. Should it be in the other way around? @Salesforce, #2far2lazy2go.

 

 

12:30 – Searching my #MVP seat @Salesforce Keynote. I’m so exciting!! This year I’m not on the last row of the room (literally last one).

13:00 – @Salesforce Keynote starts !! Don’t miss it.

13:15 – @Will.I.am and WHERESTHELOVE #ovation

img_4807

14:00 – Einstein makes your app smarter. On my #todo list for home.

14:30 – @Red moment. It’s not charity, it’s justice. Where you have born shouldn’t determine how long is your life.

14:45 – Never been so close to Mark Benioff #FanMoment 😀

 

 

 

17:00 – Moscone West has changed a lot!! New location for #Trailhead area and Theaters #newworld #admin #developers

img_4853

20:30 – Salesforce Gala starts with U2 “Uno, dos, tres, catorce!!”

img_4819

Day 3 – 6th of October

07:30 – Starting the day with energy @Mel’sDinner and my @FinancialForce colleagues

img_4832

08:30 to 17:00 – @SalesforceDevelopers day. #Heroku #Gamification #RESTAPI #SOAPAPI #NewPlatformEventObject #BigObjects and #Developer KeyNote with Jesse and David Frudd

img_4848

 

20:00 – A tired day ends with #clamchowder

 

 

 

 

Day 4 – 7th of October

9:00 – Time to come back @home but before taking, pic of Moscone area and Salesforce arch. Looking forward to coming back again. #DF17 the 6th of November.

Platform Developer Certification – Transition Exam

As a developer, I wanted to learn as much as possible and a good way to do it is getting any of the certifications that Salesforce offers to us.

I was able to get 401 and 501 credentials, so I decided to share some tips about them writing an entry some months ago.

However a year ago, Salesforce decided to modify certifications and 401 and 501 were not available anymore.

So what could I do? Do I lose my credentials? No at all. I still can say that I got these certifications. However Salesforce also advices to us to move to the new one.

In order to do it we have different paths as you can see on below image:

Captura de pantalla 2016-07-12 a las 15.09.09

I decided to go for the combo Transition Exam, but lot of questions came to my mind. So let me share all answers I got. Maybe they can also help you.

Q – How is the Exam?

A – This is a test exam. We have 30 minutes to answer 16 multi-choice questions, and we need to get 63% (11 questions) right to pass the exam. Per my experience, don’t waste the time. Read carefully and if you are not completely sure, mark to review it later and move to the next one.

Q – When do I get the results?

A – After submitting the exam. As usual, we would get the Pass or Fail response. Unfortunately we don’t get the score. You can only see if you passed it or not.

Q – Is this a proctored exam?

A – Yes !! So take care and prepare your place for the exam in advance.

Q – What can I do if I fail the exam?

A – Good questions!! That also worried to me. This is a free exam and you can try to pass it as many times as you need. The only thing that you need to take into account is that you cannot try it more than 3 times per release. This mean. Salesforce deliver 3 releases a year, so you have 9 opportunities to do it per year.

Q – What should I study to pass it? 

A – There is no guide to know what you need. To be honest, you should get Platform Developer I and II guides and check what it is required for them and study the same. I reviewed all the material that I used to pass 501 exam. And in addition, I checked:

Obviously, Trailheads are also very useful to remember certain contents for example Life cycle one.

Q – Should I look for any other material?

A – Something I didn’t find on above documents and I was asked for was about:

  • Compounds fields
  • Certifications, kind of certifications depending on device …
  • Streaming API

Actually the exam was a challenged and that also helped me to learn even more.

Q – What kind of questions could I find?

A – This test exam provided different options and you need to select one or many responses.

An example could be (This is not a question of my exam. This is an example I have created based on what I found during the exam)

Having this piece of code:

@RestResource(urlMapping='/user_defined_type_example/*')
global with sharing class MyOwnTypeRestResource 
{
   @HttpPost
   global static MyUserDefinedClass echoMyType(MyUserDefinedClass ic)
   {
      return ic;
   }

   global class MyUserDefinedClass
   {
      global String string1;
      global String string2 { get; set; }
      private String privateString;
      global transient String transientString;
      global String staticString;
   }
}

And these JSON calls:

1. 
{
   "ic" : {
             "string1" : "value for string1",
             "string2" : "value for string2",
             "privateString" : "value for privateString"
          }
}

2.
{
   "ic" : {
             "string1" : "value for string1",
             "string2" : "value for string2"
          }
}

3.
{
   "ic" : {
             "string1" : "value for string1",
             "string2" : "value for string2",
             "transientString" : "value for transientString",
             "staticString" : "value for staticString"
           }
}

Which is the correct call?
a) 1
b) 2
c) 3
d) 1 and 3
e) 1 and 2
f) 1, 2 and 3

Q – Once I pass the exam. Do I have to do anything else? Assignment or any other test?

A – No !! Since that moment you get your new credentials and you only need to do the maintenance exam as usual 3 times a year.

Q – I have Force.com Developer (401) certification. Does the maintenance exam cover also that one?

A – I’m afraid that Platform Developers maintenance don’t cover 401 certifications, so you would have to do 2 exams per release. But nothing to worry too much.

Do you have any other question? You can open a case here.

Once you get it you can also check your certification in the verification page. Something that I will miss from this page is my Advance Developer logo.

Captura de pantalla 2016-07-12 a las 15.03.17

By the way, the correct answer on above question is option e).

Mi primera Visualforce III – Controladores

En este post vamos a continuar desde dónde lo dejamos. En la última entrada en Español hablábamos de cómo crear una página visualforce utilizando únicamente un Controlador Standard. Si todavía no has tenido la oportunidad de leerla sería interesante que lo hicieras antes de continuar. Aquí tienes el link.

Controlador Personalizado

Hasta ahora sólo hemos usado el controlador Standard asociado al objeto que usábamos en la página, Account. Y con él hemos conseguido hacer muchas cosas. Entonces, ¿por qué necesito crear uno? Con este tipo de controladores vamos a extender la funcionalidad, de forma que nuestra página puede llegar a ser más potente si cabe.

Tenemos dos tipos de controladores personalizados:

  • Asociados a una lista de registros de un objeto
  • Asociados a un único registro de un objeto

Dejaremos la lista de registros para un blog futuro y hoy vamos a centrarnos en qué hacer con un único registro.

Único Registro

Estos controladores se usarán cuando quiero realizar una acción asociada a un registro en concreto.

Para empezar sólo tengo que crear una clase Apex

Setup | Develop | Apex Classes

Y hacer click en el botón New.

A continuación sólo tienes que escribir estas líneas de código y guardar:

public with sharing class AccountController
{
    public AccountController(ApexPages.StandardController controller){}
}

Antes de continuar ¿qué podemos destacar del código anterior?

  1. Una clase puede ser:
    1. private: la clase es sólo conocida de forma local, es decir por el código de esa clase.
    2. public: la clase es visible en toda la aplicación.
    3. global: la clase es visible por cualquier código Apex en cualquier sitio, es decir, si empaquetamos la clase, ésta será visible y accesible para cualquier usuario que haya instalado el paquete. Mi recomendación por ahora es que tu clase sea pública de forma que así también puedes proteger la propiedad intelectual de tu clase si decides comercializarla en un futuro.
  2. With Sharing nos permite indicar permisos de acceso. Échale un vistazo a este blog en inglés de Andy Fawcett dónde explica el significado de estás palabras
  3. Palabra Controller en el nombre de la clase. Es una opción personal para saber que esa clase es un Controlador, pero si tu prefieres darle otro nombre, ¡adelante! sólo una recomendación. Mantén una misma convención en cuanto a nombres se refiere a lo largo de todo tu desarrollo, así que si creas otro controlador, dale un nombre similar
  4. Un constructor con un único argumento del tipo ApexPages.StandardController que proporciona una serie de métodos para poder recoger información del registro asociado a ese controlador

Una vez que tenemos el controller creado, vamos a asociarlo a una página. Por ejemplo, vamos a extender la funcionalidad de la página accountedit que creamos en el post anterior. Para ello sólo tenemos que añadir el atributo extensions a la definición de la página.

<apex:page standardController="Account" extensions="AccountController">
</apex:page> 

Y ahora, ¿tenemos que hacer algún otro cambio? No en principio podemos mantener el mismo código en la página aunque lo asociemos a un controlador custom.


<!-- accountedit -->
<apex:page standardController="Account" extensions="AccountController">
  <apex:form >
    <apex:pageBlock title="Vista Cuenta">
      <apex:pageBlockButtons >
        <apex:commandButton action="{!save}" value="Save"/>
      </apex:pageBlockButtons>
      <apex:pageBlockSection title="Campos Cuenta">
        <apex:inputField value="{!account.name}"/>
        <apex:inputField value="{!account.site}"/>
        <apex:inputField value="{!account.type}"/>
        <apex:inputField value="{!account.accountNumber}"/>
      </apex:pageBlockSection>
    </apex:pageBlock>
  </apex:form>
</apex:page>

Como ya aprendimos en el post anterior, si sobre escribimos el botón Edit del objeto Cuenta para mostrar nuestra página, el resultado será el siguiente:

Captura de pantalla 2016-01-18 a las 16.31.57

Entonces, ¿cual es la diferencia?

Por ahora ninguna.

Pero vamos a seguir añadiendo funcionalidad. En la página view del anterior post, mostrábamos además una lista relacionada con las Oportunidades asociadas a la cuenta seleccionada. Vamos a hacer lo mismo en nuestra página pero esta vez vamos a usar el tag  apex:BlockTable.  Este tag tiene como atributo value que usaremos para llamar al método que nos devuelve la lista de registros sobre la que vamos a iterar en la tabla. Y el atributo var que será la variable que usaremos en cada iteración.

<apex:pageBlockTable title="Opportunities" value="{!opportunityList}" var="opp">
</apex:pageBlockTable>

¿Y qué es opportunityList? Ahí es cuando entra en acción nuestro nuevo controlador dónde tendremos un método que via una consulta a base de datos (en Salesforce se llaman SOQL) obtendremos la lista de Oportunidades asociadas a la cuenta Account1.

Una vez que tenga esta información, usaremos los métodos get / set que al final serán los que el atributo value llamará.


public with sharing class AccountController
{
    private Id m_accountId;
    private List<Opportunity> m_opportunities;
    private ApexPages.StandardController m_controller;

    public AccountController(ApexPages.StandardController controller)
    {
        m_controller = controller;
        m_accountId = m_controller.getRecord().Id;
        m_opportunities = calculateOpportunities(m_accountId);
    }
   
    public List<Opportunity> getOpportunityList()
    {
        return m_opportunities;
    }

    public void setOpportunityList(List<Opportunity> value)
    {
        m_opportunities = value;
    }

    private List<Opportunity> calculateOpportunities(Id accId)
    {
        //Remember Separation of Concerns
        //Move to a Selector class
        List<Opportunity> oppList = [Select Id, Name From Opportunity Where AccountId = :accId];

        return oppList;
    }
}

Cómo hemos mencionado antes del código, tenemos una variable privada m_opportunities que será utilizada por el get / set. Y si te fijas, estos métodos tienen el nombre que hemos usado en nuestra página visualforce.

Además, tenemos un método calculateOpportunities donde vamos a hacer la consulta a base de datos, la SOQL. Recuerda que aunque en este ejemplo estoy haciendo una SOQL en un controlador, debemos mantener el SOC. Para más información echa un vistazo aquí.

Y este método será llamado en el constructor del controlador y lo usaremos para modificar la variable privada m_opportunities de forma que una vez que se llame al controlador, la lista de Oportunidades se rellenará automáticamente.

Otra cosa a destacar, es el filtro de nuestra consulta. Buscamos las Oportunidades cuyo campo Account tenga el mismo valor que la cuenta que tengo en mi página. Si recuerdas, ya hemos comentado que StandardController ofrece muchos métodos, entre ellos getRecord() que nos devolverá el registro que estamos visualizando en el momento de llamar a nuestro controlador.

El último paso antes de visualizar el resultado, es añadir alguna columna a nuestra tabla. Por ahora sólo añadiremos el Nombre de la oportunidad.


<apex:pageBlock title="Related Lists">
  <apex:pageBlockTable title="Opportunities" value="{!opportunityList}" var="opp" >
    <apex:column headerValue="Name">
      <apex:outputText value="{!opp.Name}"/>
    </apex:column>
  </apex:pageBlockTable>
</apex:pageBlock>

Sabiendo todo esto, ¿cual es el resultado?

Captura de pantalla 2016-01-21 a las 19.51.57.png

¿Pero y si queremos añadir un campo que no está en el objeto Oportunidad y mostrarlo en la tabla? Por ejemplo, me gustaría visualizar un checkbox que me indicara si la Oportunidad tiene estado Closed Won.

Al ser un campo calculado, la lista que devolveremos no será directamente del tipo Oportunidad. Lo que vamos a hacer es crearnos una clase interna con dos variables, por un lado el registro de la oportunidad, y por otro este nuevo campo que vamos a calcular. Una vez que lo tengamos, la lista que usaremos en la página será del tipo de la clase interna.

Por otro lado, en el método que calcula las Oportunidades asociadas a la Cuenta, haremos los cálculos pertinentes para rellenar el nuevo campo que crearemos.

Así quedaría el controlador:


public with sharing class AccountController
{
    private Id m_accountId;
    private List<OpportunityInfo> m_opportunities;
    private ApexPages.StandardController m_controller;

    public AccountController(ApexPages.StandardController controller)
    {
        m_controller = controller;
        m_accountId = controller.getRecord().Id;
        m_opportunities = calculateOpportunities(m_accountId);
    }

    public List<OpportunityInfo> getOpportunityList()
    {
        return m_opportunities;
    }

    public void setOpportunityList(List<OpportunityInfo> value)
    {
        m_opportunities = value;
    }

    private List<OpportunityInfo> calculateOpportunities(Id accId)
    {
        Boolean isClosed;
        OpportunityInfo oppInfo;
        List<OpportunityInfo> oppInfoList = new List<OpportunityInfo>();

        //Remember Separation of Concerns
        //Move to a Selector class
        for(Opportunity opp : [Select Id, Name,
                                 StageName, Amount,
                                 CloseDate
                               From Opportunity
                               Where AccountId = :accId])
        {
            isClosed = opp.StageName == 'Closed Won' ? true : false;
            oppInfo = new OpportunityInfo(opp, isClosed);
            oppInfoList.add(oppInfo);
        }
        return oppInfoList;
     }

     //Inner class
     private class OpportunityInfo
     {
        public Opportunity OpportunityRecord {get; private set;}
        public Boolean ToClose {get; set;}

        private OpportunityInfo(Opportunity oppValue, Boolean toCloseValue)
        {
            OpportunityRecord = oppValue;
            ToClose = toCloseValue;
        }
      }
}

Y en la página visualforce, la tabla tendrá que hacer uso de la clase interna


<apex:pageBlock title="Related Lists">
   <apex:pageBlockTable title="Opportunities" value="{!opportunityList}" var="opp" >
      <apex:column headerValue="Name">
         <apex:outputField value="{!opp.OpportunityRecord.Name}"/>
      </apex:column>
      <apex:column headerValue="is Closed?">
         <apex:inputCheckbox value="{!opp.ToClose}" disabled="{!opp.ToClose}"/>
      </apex:column>
      <apex:column headerValue="Stage">
         <apex:outputField value="{!opp.OpportunityRecord.StageName}"/>
      </apex:column>
      <apex:column headerValue="Amount">
         <apex:outputField value="{!opp.OpportunityRecord.Amount}"/>
      </apex:column>
      <apex:column headerValue="CloseDate">
         <apex:outputField value="{!opp.OpportunityRecord.CloseDate}"/>
      </apex:column>
   </apex:pageBlockTable>
</apex:pageBlock>

Siendo el resultado:

Captura de pantalla 2016-01-21 a las 20.11.08.png

En este ejemplo todos los campos de la tabla son de sólo lectura. El único que es input es el campo personalizado que hemos creado a partir de la clase interna. Pero si te fijas, en todos los registros el checkbox es de tipo lectura menos en el último en que el campo es de escritura porque el Stage no es Closed Won. Sin embargo el tag que hemos usado en todos los casos es apex:inputCheckbox. ¿Por qué no usamos output? Porque este tag sólo da la opción de escritura. Sin embargo ofrece un atributo para deshabilitarlo y es el que hemos usado, disabled.

Por último, nos podríamos preguntar por el botón Save. Si mantenemos en nuestra página visualforce la misma línea para el botón save que en el post anterior, la funcionalidad será la misma. Usará el controlador Standard para hacer la modificación en base de datos.

Sin embargo podemos modificar esa funcionalidad para extenderla. Para ello tendremos que crear un método en nuestro controlador dónde añadiremos la funcionalidad que necesitemos y devolveremos la página hacia donde quiero navegar después de la modificación. En nuestro caso la versión sólo lectura de nuestra cuenta.

public PageReference saveUpdates()
{
    //TODO: Acciones para salvar
    return new PageReference('/' + m_accountId);
} 

Y hacer una llamada a ese método en nuestra página.

<apex:pageBlockButtons >
    <apex:commandButton action="{!saveUpdates}" value="Save"/>
</apex:pageBlockButtons> 

Como resumen, en esta entrada hemos aprendido:

  • Cómo crear un controlador asociado a un único registro
  • Cómo asociarlo a una visualforce
  • Cómo mostrar campos en nuestra página visualforce
  • Cómo crear un tabla con valores que vienen de base de datos
  • Cómo añadir a la tabla un campo que no existe en base de datos
  • Cómo modificar el botón Standard Save

Nos vemos en el próximo post.

 

Mi primera Visualforce II

En la última entrada en Español estuvimos aprendiendo como empezar con Apex y Visualforce. Mostramos una nueva página con algunos campos del objeto Cuenta (Account). Hoy veremos cómo pasar de campos de lectura a escritura.

Lo primero de todo, intentaremos cambiar los campos que teníamos en la pantalla anterior a modo escritura. Para ello lo único que tenemos que hacer es utilizar un tag diferente: apex:outputField

En este caso, la página se llamará accountedit ya que la vamos a utilizar para modificar la información que ofrece.

<!-- accountedit -->
<apex:page standardController="Account">
  <apex:form >
    <apex:pageBlock title="Vista Cuenta">
      <apex:pageBlockSection title="Campos Cuenta">
        <apex:inputField value="{!account.name}"/>
        <apex:inputField value="{!account.site}"/>
        <apex:inputField value="{!account.type}"/>
        <apex:inputField value="{!account.accountNumber}"/>
      </apex:pageBlockSection>
    </apex:pageBlock>
  </apex:form>
</apex:page>

Si escribimos una Url similar a esta:

https://<instancia>salesforce.com/apex/accountedit

vemos como ahora tenemos unos cuadros de texto donde añadir la información.

Captura de pantalla 2015-11-27 a las 18.43.01

De igual forma que en la anterior entrada, si queremos ver la información de una cuenta en concreto para modificarla, debemos simplemente añadir el Id único de la misma, en la url.

Captura de pantalla 2015-11-27 a las 18.49.54.png

Si haces una búsqueda en Google y pones algo del tipo “añadir campo de escritura en mi visualforce” aparecerá otro tag que también podrías usar: apex:outputText

¿Cual es la diferencia entre ambos tag si el resultado es el mismo? La principal es que outputField va a respetar el tipo de campo que quieras mostrar, mientras que outputText añade eso, un texto. Veamos un ejemplo que es bastante claro.

<apex:page standardController="Account">
  <apex:form >
    <apex:pageBlock title="Vista Cuenta">
      <apex:pageBlockSection title="Campos Cuenta">
        <apex:outputText value="{!account.type}"/>
        <apex:outputField value="{!account.type}"/>
      </apex:pageBlockSection>
    </apex:pageBlock>
  </apex:form>
</apex:page>

En el código de arriba vemos como queremos mostrar un campo de tipo picklist en nuestra página visualforce. Uno con outputField y el segundo es outputText. ¿Cual es el resultado?

Captura de pantalla 2015-11-27 a las 18.59.02.png

En campos de tipo lectura no podemos encontrarla ya que muestra simplemente el valor que hay almacenado en base de datos. Sin embargo en el caso de escritura, la diferencia es mayor

Captura de pantalla 2015-11-27 a las 18.59.50

Mientras que la en la primera opción muestra sólo un texto, el valor asociado a ese campo en el registro, en la segunda se puede desplegar el campo y visualizar todas las opciones que ofrece.

<apex:page standardController="Account">
  <apex:form >
    <apex:pageBlock title="Vista Cuenta">
      <apex:pageBlockSection title="Campos Cuenta">
        <apex:inputText value="{!account.type}"/>
        <apex:inputField value="{!account.type}"/>
      </apex:pageBlockSection>
    </apex:pageBlock>
  </apex:form>
</apex:page>

Esto no significa que no debamos usar outputText ó inputText, simplemente que en determinados casos, es preferible ouputField / inputField, ya que proporcionamos una mejor experiencia al usuario final.

¿Intentamos añadir más información a nuestras primeras páginas Visualforce? Algo que también nos puede interesar es mostrar información de los objetos relacionados. De igual forma que la página standard de Cuenta muestra las Oportunidades que están relacionadas con esa Account, ahora queremos mostrar esas Oportunidades en nuestra página Visualforce. Para ello utilizaremos el tag: apex:relatedList

En este caso, el tag deberemos ponerlo fuera del tag apex:form y simplemente añadir el nombre API del objeto. A partir de ese momento, Salesforce se encarga de todo el trabajo por nosotros.

 <apex:page standardController="Account">
   <apex:form >
     <apex:pageBlock title="Vista Cuenta">
       <apex:pageBlockSection title="Campos Cuenta" columns="2">
         <apex:outputField value="{!account.name}"/>
         <apex:outputField value="{!account.site}"/>
         <apex:outputField value="{!account.type}"/>
         <apex:outputField value="{!account.accountNumber}"/>
       </apex:pageBlockSection>
     </apex:pageBlock>
   </apex:form>
   <apex:relatedList list="Opportunities" />
</apex:page>

Captura de pantalla 2015-11-27 a las 19.07.09.png

En el caso de que queramos tener la opción de modificar alguno de los valores des esta lista relacionada, necesitaremos añadir código Apex y un Controlador. Pero esto es algo que veremos en la próxima entrada. Hoy continuaremos sólo con acciones que podamos llevar a cabo con el Controlador Standard de los objetos.

Uno de los últimos pasos que vamos a dar hoy será guardar en base de datos las modificaciones que hacemos en uno de los campos. Para ello, añadiremos un botón a nuestra página mediante el tag: apex:commandbutton Revisa este tag porque es muy interesante, ya que con sus atributos puedes indicar si mostrar el botón solo en la parte de arriba de la pantalla ó en ambos lados (por defecto los muestra en los dos).

<!-- accountedit -->
<apex:page standardController="Account">
  <apex:form >
    <apex:pageBlock title="Vista Cuenta">
      <apex:pageBlockButtons >
        <apex:commandButton action="{!save}" value="Save"/>
      </apex:pageBlockButtons>
      <apex:pageBlockSection title="Campos Cuenta">
        <apex:inputField value="{!account.name}"/>
        <apex:inputField value="{!account.site}"/>
        <apex:inputField value="{!account.type}"/>
        <apex:inputField value="{!account.accountNumber}"/>
      </apex:pageBlockSection>
    </apex:pageBlock>
  </apex:form>
</apex:page>

El atributo value nos permite indicar qué nombre le queremos poner al botón y el atributo action llamará al proceso que queremos ejecutar. Como seguimos trabajando con el Controlador Standard del objeto, simplemente debemos añadir “save” y Salesforce se encarga de realizar la acción de guardado por nosotros.

Captura de pantalla 2015-11-27 a las 19.13.21

Y después de modificar el valor de Account Number por 124 y darle al botón Save, accountview page muestra:

Captura de pantalla 2015-11-27 a las 19.16.51

¿Qué otras acciones nos permite Salesforce? En este link encontramos información sobre ellas, pero básicamente son:

  • Save
  • QuickSave
  • Edit
  • Delete
  • Cancel
  • List

 

Por ultimo, una ayuda para tener que evitar modificar el id de la cuenta cada vez que queremos mostrar un registro distinto. Si hemos creado estas páginas es porque queremos ofrecer esta vista al usuario final en vez de la standard. En ese caso, Salesforce nos permite sobre escribir estas vistas en el objeto.

Si vamos a:

Setup | Customize | Accounts | Buttons, Links and Actions

Modificaremos las vistas View y Edit

Captura de pantalla 2015-11-27 a las 19.20.23

En el caso de que queramos hacer lo mismo con un objeto creado por nostros, custom, en vez de Standard, solo tenemos que ir a

Setup | Create | Objects | <selecciona tu objecto> 

Y desde ahí baja a la sección Buttons,Links and Actions. La sobre escritura de la página se haría de forma similar a un objeto Standard.

En este post hemos aprendido:

  • Como crear una página editable
  • Diferencia entre inputField vs inputText y outputField vs outputText
  • Como añadir lista de un objeto relacionado a Cuenta
  • Como guarder modificaciones en la página de editado
  • Como evitar modificar la url con el id cada vez que quiero mostrar un registro

Y todo esto sin añadir una línea de código en Apex, solo Visualforce, ya que hemos usado el controlador Standard que los objetos nos ofrecen.

Certifícate como Desarrollador de Salesforce – 401

¿Desde cuándo llevas trabajando en la plataforma de Salesforce? ¿Estás certificado? ¿No sabes lo que es? Pues esta entrada es para ti.

¿Para qué sirven las certificaciones de Salesforce?

Es una forma de demostrar a Salesforce, y sobre todo a ti mismo, que está preparado para trabajar con la plataforma y lo que es más importante, que entiendes cómo funciona.

Yo lo suelo comparar con la Certificaciones de Cambridge de Inglés. Si tu vas a una entrevista de trabajo y te preguntan si sabes inglés, a no ser que continúen la entrevista en ese idioma, realmente no saben cual es tu nivel. Sin embargo, si dices que tienes el First, el Advance, ó cualquier otra certificación, es más fácil de demostrarlo. Aquí pasa lo mismo. Con una certificación estás demostrando que sabes de lo que te están hablado.

Pero hay una diferencia significativa. Con los exámenes de inglés, tu puedes haber hecho el examen hace 5 años, y tu nivel actual no es exactamente el de aquel momento. Sin embargo, con Salesforce no pasa eso, ya que te piden hacer un examen de mantenimiento cada vez que sacan una nueva versión, de forma que se aseguran que estás al día de la nueva funcionalidad.

Tipos de certificaciones – Desarrolladores

Hay una gran variedad de certificaciones, para administrador, de arquitecto, consultoría … puedes encontrar información sobre todas aquí: Salesforce CertificationsPero en realidad las que nos interesan a nosotros son las de desarrolladores, así que visita este enlace para saber más de ellas: certificaciones de desarrolladores.

A día de hoy sólo tenemos 2 certificaciones, pero Salesforce ha comenzado un programa piloto para añadir 3 más. Teniendo en cuenta que hablamos de 5 certificaciones en total, y eso sería mucha información para una única entrada, en esta sólo hablaré de la primera de ellas.

Force.com Developer – 401

¿Qué cubre el examen? – Documentación

Con este examen aprendemos a usar la parte declarativa de Salesforce, #clicksnotcode, de forma que no esperes encontrar una pregunta relacionada con código. Básicamente te preguntarán some el modelo de datos, campos que puedes crear, tipos de relaciones, reglas de validación, cómo funciona workflow, tipos de fórmulas que puedes desarrollar, reports, dashboards, y preguntas sobre seguridad.

Captura de pantalla 2015-07-22 a las 17.19.15

Por ejemplo, en la sección de User Interface, te pueden preguntar

Q1. ¿Cómo hacer que un campo sea requerido?

R1. Fácil, por medio del page layout, tienes las opción habilitar la característica requerido, ó sólo lectura, de un campo.

En la imagen de arriba también puedes ver unos porcentajes. Significa la cantidad de preguntas que te pueden hacer sobre ese área, así que revísalos e intenta investigar aquella en la que no te sientas cómodo todavía. En mi caso fue Reporting y Analytics.

Y ¿dónde podemos encontrar la documentación para aprender? Es muy recomendable echar un vistazo a la librería de Salesforce. Sobretodo Force.com Fundamentas te ayudará a empezar desde cero. Otra recomendación es el Workbook de Force.com dónde encontrarás casos prácticos. Además, puedo decir por experiencia que en el examen encontrarás preguntas elaboradas con los mismos casos de uso que leerás en los libros anteriors. Otra opción es buscar en internet dónde hay infinidad de blogs con información, y preguntas / respuestas de ejemplo que te ayudarán a asentar conocimientos. Incluso apps para ipad ó iphone. Y por supuesto, revisa Trailheads.

Una recomendación personal es echar un vistazo al menú de la izquierda una vez seleccionado Setup. En cada entrada puedes encontrar un enlace de ayuda. En realidad no te van a preguntar sobre todas las entradas, pero si te certificas, significa que conoces la plataforma, y ese menú es parte de la plataforma.

¿Y en qué idioma puedes hacer el examen? Pues a día de hoy lo puedes preparar en Español. Como verás el Fundamentals está en varios idiomas entre ellos nuestra lengua.

Ya he estudiado, ¿ahora qué?

El siguiente paso es reservar el examen. Para ello necesitas entrar en la página de Webassessor para Salesforcedonde encontrarás un wizard que te guiará a la hora de hacer tu reserva. Y eso es lo que vas a hacer, una reserva de día y hora para hacer el examen. Si tras haber hecho la reserva ves que realmente ese día no puedes hacer el examen, no te preocupes, ya que puedes modificar la fecha / hora hasta 72h antes del examen sin penalización.

Nota: Si quieres hacer el examen en español, tendrás que especificarlo en este paso. Hay diferentes entradas según el idioma.

El importe del examen es 200$ y en el caso de que suspendas, volver a intentarlo 100$. Una vez que hayas pagado, recibirás un email con la factura y una serie de instrucciones para el día del examen.

Ha llegado el día del examen

Lo primero de todo, ponte una alarma para configurar todo 24h antes de tu examen. Si no haces el examen en una sala proporcionada por Salesforce, y seleccionas hacerlo de forma online, tendrás que instalar un software que podrá ver lo que haces durante el examen. La información sobre este software centinela te llegará en el email de la factura, pero básicamente, después de instalarlo tendrás que llevar a cabo una serie de configuraciones que incluyen ver que la web cam y el audio funcionan. Este programa centinela espera tener una visual tuya haciendo el examen que cubra tu cara y tus manos, así que busca un buen sitio para hacerlo. En mi caso tuve que apilar algunos libros hasta conseguir la visual. Ah!! Y si puedes, intenta prepararlo todo para hacer el examen en un ordenador con Windows ya que hay algunas versiones de Mac que este programa centinela no incluye.

A la hora de tu examen vuelve a entrar en la página de Webassessor, y verás el botón del examen activo. Si no lo está es porque no es la hora del examen. Una vez que lo ejecutes, volverá a configurar la cámara y el sonido, para asegurarse que todo está listo, y verás tu examen.

Tienes 90 minutos para hacerlo. Tiempo suficiente como para repasar tus preguntas también.

Son 60 preguntas tipo test, dónde la respuestas puede ser del tipo Verdadero / Falso, ó tener varias opciones, A,B,C,D y la respuesta correcta ser 1 ó varias. Pero si ese es el caso, no te preocupes, después de la pregunta siempre te pondrán si espera 2 ó más respuestas.

A lo largo del examen Salesforce te da la opción de navegar entre las preguntas, así que si respondes una y te das cuenta que 5 preguntas atrás, te habías equivocado, puedes navegar hasta ella. También, al finalizar el examen, puedes navegar a una página donde aparecerán todas las preguntas y las respuestas de forma que puedes rápidamente clicar en una de ellas y cambiar la respuesta. Y por supuesto, comenzar desde el principio e ir revisando el examen por completo.

Una vez que finalices, debes darle al botón de Submit que te llevará a una página dónde puedes darle a Salesforce tu feedback, y finalmente, después de hacer click en Submit de nuevo, tendrás el resultado del examen. Para aprobar necesitas acertar el 68% de las preguntas, pero el resultado sólo te dirá si el examen está “Pass” ó “Failed”. Desgraciadamente, no te indican la nota, por lo que si suspendes con un 67%, nunca lo sabrás.

Nota: Una pregunta errónea NO resta puntuación.

Se ha parado el examen ¿Qué hago?

Respira!!! No te preocupes. El examen se puede parar por distintas razones. Tu web cam deja de funcionar, ó el programa centinela ve algo extraño a tu alrededor, cómo que tengas libros. Si eso pasa, no es el fin del mundo. El examen se parará guardando el tiempo y las respuestas que ya has contestado. A continuación debes llamar a Salesforce. En el email que recibes después de haber reservado el examen, encontrarás un teléfono dónde te indicarán qué ha pasado y cómo lo puedes solucionar. A continuación ellos re-iniciarán el examen y podrás continuar en el punto en que lo dejaste.

He aprobado!!!

Felicidades!! Pero esto no es un punto y final. Cómo sabes Salesforce libera 3 versiones al año, Winter, Spring y Summer. Por cada una, después de tener una certificación, debes hacer un examen de mantenimiento para asegurarte que estás al tanto de los cambios que la plataforma ofrece. Si no lo haces puedes perder tu certificación.

En este caso el examen es mucho más sencillo:

  • Cuando el examen de mantenimiento esté listo, Salesforce te mandará un email con la documentación de la versión y unos videos dónde encontrarás un resumen (muy útil!!!)
  • Tienes unos 6 meses para hacerlo. Por ejemplo, la fecha límite para hacer el examen de mantenimiento de la Winter ’15 fue a principios de Julio.
  • No necesitas reservarlo con antelación. Cuando lo quieras hacer, logueate en webassessor y dale al botón que lanza el examen.
  • No es protectored. Es decir, lo puedes hacer online, pero no necesitas usar el programa centinela ya que a Salesforce no le importa que revises algún material si es necesario.
  • Son entre 5 y 10 preguntas tipo test que deberás contestar en 30 minutos. Pero si ya le has echado un vistazo a los vídeos, no necesitarás más de 10 minutos.
  • Tienes 3 intentos. ¿Qué significa? Si suspendes, puedes intentarlo 3 veces más de forma gratuita. A la 4 tendrás que pagar 100$.
  • Si siempre apruebo a la primera, ¿es gratis? En realidad tienes que pagar 100$ al año. Es decir, Si te sacas el 401 para la Winter 15, entonces el mantenimiento de la Spring 15 y la Summer 15 es gratuito, y deberás pagar antes de presentarte a la Winter 16.

Captura de pantalla 2015-07-25 a las 10.45.28

¿Tienes alguna duda?

Siempre puedes abrir un caso de soporte a Salesforce y hacer tu pregunta, pero hazlo con tiempo ya que suelen tardar alrededor de 1 semana en contestar.

Otra vía mucho más rápida es preguntar directamente en el twitter de Salesforce University.

¡¡¡Mucha suerte en tu examen!!

Salesforce World Tour 2015 – London

Did you have the chance to attend Salesforce World Tour in London? Last 21st of May, Salesforce arrived to UK and I had the opportunity to go and see al the magic that Salesforce creates around its events.

Although it was not my first time, I was looking forward to attending. If I compare it to last year, I would summarize in a single word; Bigger. The event was organized on the same place, Excel London, same area, and looked like as usual, but once I took a look around the room, I could realize that it was organize in order to make every body feel that they had a space just for their needs.

Last year was my first time, so maybe my nervous didn’t allow me to get everything that the event was offering to us. However, this time we could see Success Experience zone, Breakout sessions, Admin Theater, Companies’ stands,  and of course place for Developers:

  • Library: Do you love the feeling of having papers on your hands? That is your place.
  • Certification zone: In order to know more about all certifications that Salesforce offers to us.
  • Demos: During the whole day, demos about Lightning, Force.com and Heroku run without stop.
  • QuickStarts about Lightning
  • CoderDodjo: A space for youngest. Children could start developing their first app.

Captura de pantalla 2015-05-23 a las 19.01.05Salesforce London quick guide blog entry

Also we could find a QuickStart zone and I had the opportunity to help. Every body could join us and try to follow the instructions that our quick start guides offered. With them, we could learn about:

  • Lightning App Builder
  • Lightning Connect
  • Lightning Process Builder
  • Lightning Component

And if you had some experience on those areas, we also had a mini-hack in order to demonstrate all your skills. But most of the people where not technical at all, so I tried to know what they did in their daily job and offered the option that could inspire them after coming back home.

20150521_083240

As usual, the Developer Theater with all sessions for developers. As you can imagine, most of them were related to Lightning staff, but always is good to hear all use cases that awesome mind imagine to take advantage of them. Like how we can add values to a picklist field via Process Builder by Andy Fawcett (@andyinghecloud). Do you want to know more about this topic? Follow his blog. New entry about this coming soon.

This theater was another reason why I had the feeling that the event was bigger than other years. Dev zone was full of people looking forward to learning more, and if I’m sincere, that made me feel a bit nervios during my presentation: “Access External Data in Real-time with Lightning Connect”. Would you like to take a look at the slides? Find there here. Also I will publish a new entry soon with some explanations about this topic.

Finally I would like to highlight that is great to go to such kind of events, because, at the end, they allow you to meet people in person that you follow in twitter. Or, like in my case, meet again some old friends.

image

Looking forward to going Salesforce World Tour – London ’16

Dreamforce ’14

Last October we had the most important event on Salesforce Community, Dreamforce.

It was my first time, and the expectation was so high that my nervous didn’t allow me to sleep during the whole journey from Bilbao (Spain) to San Francisco.

Due to jet lag I couldn’t rest a lot, however, I was ready for my first day. Apart from the sessions where I was going to talk with Andy Fawcett, I had my agenda full of sessions, so everything was under control.

But at the momento that you go inside the Moscone center, suddenly all your plans seems to be wrong, and you try to take up as much as posible.

We have mi-workshops areas, rooms for breakout sessions and workshops, talks at community launch … and every hour there is a something new. For me it was quite hard to decide. Sometimes I was looking at the session title of the room that I had on my right, and then look at the left one, then right, left, right, left … really? Ok, finally took a decision, but I had the feeling that meanwhile, I was in a session, I was missing something else, but Salesforce has everything in mind, so you can find here a link with all sessions, so at the end, you don’t need to miss anything at all.

I have been focused on Dev Zone, but Dreamforce it’s more than this. Of course that you can find sessions related to some other topics and obviously keynotes are amazing. However I would like to highlight some other things that you, as developer can find. There is a library for those that love to have a book in their hands. There is a place to create your own Dreamforce shirt. You can visit companies stands and get some goodies, and if you are lucky, then you can sit down on the grass and think about what you have done during the day and what you can do next, or just enjoying San Francisco sun.

But maybe the most important thing at Dreamforce is the opportunity to talk face to face to those that you follow on twitter, or maybe read their blogs every day, or they just help you replying your question on Stack Exchange.

That was my Dreamforce, and the experience helps me to try to do it better next time.

Looking forward to being there again.