あらかじめレコードが作成されているオブジェクトの編集時に次のレコードに移動したい


以下のように予めレコードが作成されているオブジェクトの詳細画面からクイックアクションのボタンを使って次のレコードに移動したいと思います。詳細画面にはクイックアクションで修正が必要なフィールドのみを表示しています。ただし、詳細画面を開いたまま次のレコードに移動することができないんですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4d60758c-9ea2-9de8-bc76-3631eb0b1195.png)

こんなボタンで異動したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e78721d0-5872-30c4-2af5-71d228f6881f.png)

レコードはちょうどNmae(自動採番）順に並んでいます。よってSOQLで自レコードのIdは取得できそうです。

ここではforce:lightningQuickActionを使ってAuraコンポーネントからApex Classを呼び出して SOQLで自レコードのIdを探します。
その後にそのIdの画面に移動すれば実現できそうです。


```
<aura:component controller="Next_Record_CustomObject1" implements="force:lightningQuickAction,force:hasRecordId" access="global">
	<!-- ************************************************* -->
    <!-- 来場者管理用QucikAction                           -->
    <!--  K.Otsubo 2022/05/02                              -->
    <!--  Next_Record_CustomObject1                        -->
    <!-- ************************************************* -->
    
    <aura:attribute name="recordId" type="String" />
    <aura:attribute name="message" type="String" />
    
    <!-- 画面ロード時のイベントがあればここに書く          -->  
    <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
    
</aura:component>
```

```
({
	doInit : function(component, event, helper) {
        
        var myId = component.get("v.recordId");
        var action = component.get("c.Next_Record_Id");
        action.setParams({"myId":myId});
        action.setCallback(this, function(a){
            if (action.getState() == "SUCCESS") {   
                var myVal = action.getReturnValue();   
                
                if ($A.util.isEmpty(myVal) || $A.util.isUndefined(myVal) ) {
                	alert("次のレコードはありません");
                } else {
                    var urlEvent = $A.get("e.force:navigateToURL");
                    var myUrl = "/lightning/r/CustomObject1__c/" + myVal + "/view";
                    urlEvent.setParams({
                        "url": myUrl
                    });
                    urlEvent.fire();    
                }
                            
                
                // Close the action panel 
                var dismissActionPanel = $A.get("e.force:closeQuickAction"); 
                dismissActionPanel.fire();   
                
            }  else if (action.getState() == "ERROR" ) {
                var errors = a.getError();
                if (errors[0] && errors[0].message) {
                    // サーバーサイドでcatchできなかったパターン
                    component.set("v.message", errors[0].message);
                } 
            }
        });
        $A.enqueueAction(action);
        
        
        
	},
})
```

```
public with sharing class Next_Record_CustomObject1 {

    // *************************************************
    // 来場者管理用QucikAction                       
    // K.Otsubo 2022/05/02
    //                 
    // *************************************************
     
     
    /**
     * 次のレコードIdを得る
     */    
    @AuraEnabled
    public static String Next_Record_Id(String myId) {
        String RetString = '';
        
        List<CustomObject1__c> myList = [SELECT Id,Name FROM CustomObject1__c WHERE Id =:myId];
        system.debug('===== myList ===========>>> '+ myList );
            
        List<CustomObject1__c> RetList = [SELECT Id,Name FROM CustomObject1__c WHERE Name > : myList[0].Name order by Name Limit 1];    
        system.debug('===== RetList ===========>>> '+ RetList );
        
        IF( RetList.size() >0 ) RetString = RetList[0].Id;
            
        return RetString;
    }
}
```

思ったより簡単に実装できました。
こうなれば、編集用のクイックアクションもこのコンポーネントに入れてしまえば編集作業も楽かもしれないですね。
特に編集内容を次レコードのデフォルト値にしてきれたらかなり入力が楽になる予感です。