レコードの詳細ページを開いた状態で次のレコードに移動したい

レコードの基本的なところは既に作成されていて、詳細ページを開いて中身を確認しながら修正するという作業が複数回発生しました。
ビューでインライン編集でもいいのですが、編集したいフィールドが多いので詳細画面からクイックアクションを使ってデフォルト値を入力の手間を省きたいと思います。しかしこれではやっぱりインライン編集はできずに、毎回詳細画面とビューを往復しないといけないですね。超めんどくさい。


そこで、次のレコードに移るクイックアクションのボタンを作りたいと思い立った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/59f5cd5a-da0d-c6e1-a939-8f4b746aa450.png)


さて、中身はAura コンポーネントを開いた時に次のレコードの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(response){
            if (action.getState() == "SUCCESS") {   
                var myVal = response.getReturnValue();
                var RetString = myVal.RetString;
                //component.set("v.dispMap",myVal);   
                
                if ($A.util.isEmpty(RetString) || $A.util.isUndefined(RetString) ) {
                	alert("次のレコードはありません");
                } else {
                    var urlEvent = $A.get("e.force:navigateToURL");
                    var myUrl = "/lightning/r/CustomObject1__c/" + RetString + "/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);
        
        
        
	},
})
```
Apex Classではあるビューと同じ検索条件で検索して今のレコードの次を取得します。

```
public with sharing class Next_Record_CustomObject1 {

    // *************************************************
    // 来場者管理用QucikAction                       
    // K.Otsubo 2022/05/02
    //                 
    // *************************************************
     
     
    /**
     * 次のレコードIdを得る
     */    
    @AuraEnabled
    public static Map<String,Object> Next_Record_Id(String myId) {
        Map<String,Object>  RetMap = new Map<String,Object>();
        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;
        RetMap.put('RetString', RetString);
            
        return RetMap;
    }
}
```

ボタンを押すと一瞬、何もないコンポーネントが表示され、次のレコードの詳細画面に遷移します。
う～ん、ちょっと不細工だけどこの画面を消せないですね。何かいい方法はないかな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b3b3e886-2aee-0a0e-0f47-573bc2657c14.png)