function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
yuukiyuuki 

ログインしているユーザに紐づいているカスタムオブジェクト情報の取得

カスタムオブジェクトとVisualforceページを作成しています。

 

カスタムオブジェクトの中にはカスタム項目で

Userテーブルから参照する項目があります。

 

その項目がログインユーザのレコードだけを

Visalforceページに表示させたいと考えています。

 

String userid = UserInfo.getUserId();

sObject x = [select Id , Name from CustomObject  where  Field__c = :userid];

 

自分のユーザーIDを取得して、それをSOQLに

渡せばできると思ったのですが、上手くいきません。

 

また、whereで指定できる項目には制限があるのでしょうか。

 

何か上手くできる方法があればご教授頂けると幸いです。

 

以上、宜しくお願いいたします。

 

aki124aki124

ぱっと見た感じでは、コードの書き方には問題が無いように見えますので、「上手くいかない」症状をもう少しだけ具体的に記載していただけると、原因がわかるかも知れません。

 

「もしかしたら、原因かもしれない」と思われる点を、挙げておきます。

 

  • SOQLの取得結果を単一の変数に格納している。 (複数件のデータを返す可能性がある場合は、sObjectのリストや配列に格納する必要がある)
  • from句のカスタムオブジェクト名がAPI名になっていない。(カスタムオブジェクト名に "__c" が付加されていない)
  • 取得したレコードに対して、ログインしているユーザが参照する権限を持っていない。

 

yuukiyuuki

返信が遅れてしまい申し訳ありません。

 

以下のようなソースを書いています。

 

【Visualforceページ】

<apex:pageBlockTable title="自分の保守状況" value="{!customobject1}" var="u">
                <apex:column >
                    <apex:facet name="header">問合せ番号</apex:facet>
                    <apex:outputLink value="/{!u.id}">{!u.name}
                    </apex:outputLink>
                </apex:column>
</apex:pageBlockTable>

【コントローラー】

public List<CustomObject1__c> getCustomObject1(){
   
        String userid = UserInfo.getUserId();
       
        User[] myuser = [select Id,Name from User where id = :userid];
       
        return [select Id , Name from CustomObject1__c Field2__c = :userid];
 }

 

 

ちなみにこの状態で保存しようとすると、以下のエラーが出力されます。

「expecting right square bracket,found '='」

 

ご教授頂けると幸いです。

 

また、ちょっと話が変わるかも知れませんが、色々なサンプルソースや

ガイドブックをみていると、SOQLの書き方に疑問を感じます。

 

普通のSQLだと、「select Id, Name from テーブル名」と実行すると

Id と Name の2つの列が出力されると思います。

 

ただ、SOQLで「User[] myuser = [select Id,Name from User where id = :userid];」

と実行した場合、変数myuserには Id と Name の2つが入っていることになるの

でしょうか?

 

初心者のような質問で申し訳ありませんが、ご教授頂けると幸いです。

 

宜しくお願いいたします。

aki124aki124

 


yuuki さんは書きました:

 

【コントローラー】

public List<CustomObject1__c> getCustomObject1(){
   
        String userid = UserInfo.getUserId();
       
        User[] myuser = [select Id,Name from User where id = :userid];
       
        return [select Id , Name from CustomObject1__c Field2__c = :userid];
 }

 

 

ちなみにこの状態で保存しようとすると、以下のエラーが出力されます。

「expecting right square bracket,found '='」


このエラーについては、return文のSOQLに”where”が抜けているだけかと思います。

 

 

 


yuuki さんは書きました:

ただ、SOQLで「User[] myuser = [select Id,Name from User where id = :userid];」

と実行した場合、変数myuserには Id と Name の2つが入っていることになるの

でしょうか?

 


 

SOQLのイメージは、その通りです。

上記のSOQLでは、Id項目とName項目のみに値が入っているUserオブジェクトが、検索条件にヒットしたレコードの数だけ配列となり、変数myuserに格納されます。

 

yuukiyuuki

where句が抜けているとは思ってもいませんでした…。

本当にすいません。

 

where句を付けて試していたら、今度は以下のような

エラーメッセージが出力されました…。

 

「Invalid bind expression type of LIST:SOBJECT:User for column of type Id」

 

Field2__c のデータ型はUserオブジェクトを参照している項目なのですが、

それがいけないのでしょうか?

 

何回もすいませんが宜しくお願い致します。

NM03NM03

ちょっと質問なのですが ↓ のように書き換えたらエラーになったということでしょうか?

 

       String userid = UserInfo.getUserId();
      
        User[] myuser = [select Id,Name from User where id = :userid];
      
        return [select Id , Name from CustomObject1__c Field2__c = :userid];

 

これだとたぶんエラーは出ないと思うのですが

 

間違ってたらすいませんがもしかしてこんなのを書いてたりしませんか?

↓ みたいな書き方をすると同じエラーメッセージがでます

 

     Id userid = UserInfo.getUserId();
      
        User[] myuser = [select Id,Name from User where id = :userid];
      
        return [select Id , Name from CustomObject1__c where Field2__c = :myuser];

 

エラーメッセージはIDの項目に対してListのSobjectでwhere書いているのでエラーになっていますが

ちょうどいい感じに使ってないmyuserがいるのでちょっとそんな気がしました

 

 

良い直し方ではありませんが簡単に動くようにするのであれば

 

 

追記・修正

 

WorkBookで同じように現在のユーザーのIDを取得して

SOQLを使って値を取得する方法を見たところStringで受けていました

 

UserInfo.getUserID()の戻り値もStringになっていますし

IDで受けるよりもStringで受けるのが正しいのかもしれません

 

     String userid = UserInfo.getUserId();
       
        String myUserId = [select Id,Name from User where id = :userid].Id;
      
        return [select Id , Name from CustomObject1__c where Field2__c = :myUserId];

 

② ①を短くしたもの

        return [select Id , Name from CustomObject1__c where Field2__c = :UserInfo.getUserId()];

 

こんな感じでいかがでしょうか?

 

 

yuukiyuuki

返信が遅くなりました。

 

出来ました!!

 

1点確認したいのですが、データ型をIDにするとありますが

ID型というのは、元々存在するデータ型なのでしょうか?

 

宜しくお願い致します。

NM03NM03

>ID型というのは、元々存在するデータ型なのでしょうか?

 

元々がどこを指すのかにもよりますが、ID型は定義されています

リファレンスとか見ると載ってますよ

 

(日本語の説明が書いてる資料もどこかあった気がしますが忘れました)

 

 

 

 

 

yuukiyuuki

ご回答ありがとうございました!

 

また何かありましたら宜しくお願い致します。