• kobacky
  • NEWBIE
  • 0 Points
  • Member since 2011

  • Chatter
    Feed
  • 0
    Best Answers
  • 1
    Likes Received
  • 0
    Likes Given
  • 2
    Questions
  • 2
    Replies

お世話になっております。

数式項目が計算されるタイミングについてご質問させて頂きます。
数式項目は、データベースからSelectされる時にのみ計算され、以後は再計算されないのでしょうか?

(数式項目はSOQLのSelect文で取得された後は、数値型と同じ扱いとなるのでしょうか?)

なお、これを検証するため、下記のような環境条件でコードを実行してみました。

■環境条件
カスタムオブジェクト(MathTest__c)を作成
  ・param__c(数値):数式のパラメータとして使用
  ・CalcResult__c(数式):「param__c * 2」

■コード(Visualforce)

<apex:page controller="MathTestController" >
	<apex:pageBlock >
		<apex:pageBlockSection id="refresh" >
			<apex:form >
				<apex:outputText value="{!MathTest.param__c}" />
				<apex:outputText value="{!MathTest.CalcResult__c}" />
				<apex:commandButton action="{!ChangeParam}" value="変数変更" rerender="refresh" />
				<apex:commandButton action="{!Save}" value="保存" />
				<apex:commandButton action="{!Cancel}" value="キャンセル" />
			</apex:form>
		</apex:pageBlockSection>
	</apex:pageBlock>
</apex:page>

 
■コード(コントローラ)

public with sharing class MathTestController {
	//オブジェクト
	private MathTest__c sobjMathTest = null;
	public MathTest__c MathTest{
		get
		{
			return sobjMathTest;
		}
	}
	
	//コンストラクタ
	public MathTestController(){
		//レコードを1件取得
		sobjMathTest = [select Id, param__c, CalcResult__c from MathTest__c limit 1];
	}
	
	//数式計算の元となる値をインクリメント
	public Pagereference ChangeParam(){
		sobjMathTest.param__c++;
		return null;
	}
	
    //保存する
    public PageReference Save() {
    	//DBのアップデート
    	update sobjMathTest;
    	//リファレンスの作成
    	Pagereference page = new Pagereference(System.currentPageReference().getUrl());
    	page.setRedirect(true);
    	//リファレンスの返却
        return page;
    }
    
    //キャンセルする
    public PageReference Cancel(){
    	//リファレンスの作成
    	Pagereference page = new Pagereference(System.currentPageReference().getUrl());
    	page.setRedirect(true);
    	//リファレンスの返却
        return page;
    }
	
}

 

このページを表示すると、(param__cの初期値が1の場合)param__cの値として1が、
CalcResult__cの値として2(1 × 2)が表示されます。

ここで「変数変更」ボタンを押下すると、ChangeParamメソッドが呼び出され、param__cが
1つインクリメントされます。さらに、「id="refresh"」を指定してrerendarをかけているので、
param__cに2、CalcResult__cに4が表示されることを期待しました。

しかし、実際の動作としてはparam__cに2が、CalcResult__cに2が表示されました。
このことから、数式の計算はデータベースからSelectで値を持ってきた時にのみ行なわれる
のだと考えたのですが、これは間違いないでしょうか?

ちなみに最終的に実現したいことのイメージは下記のような感じで、

その過程で数式に関する上記の疑問が生じました。
1.データベースからレコードを取得し、画面に描画する。
2.画面に描画されたコントロールに対してユーザーが様々な編集を行う。
3.rerendar属性を持つボタン動作(ajax)により、コントローラに保持する変数の値を変更する。

  (上記のテストコードにおいては、sobjMathTest)
4.ユーザーには編集内容に従って、画面が更新して表示される。
  (上記のテストコードにおいては、数式が再計算されて「4」と表示されて欲しい、など。)
5-1.ユーザーが保存ボタンを押すと、変更がDBに保存される。
5-2.ユーザーがキャンセルボタンを押すと、変更が破棄され、最初に画面を開いた状態に戻る。

 

 

なお、VisualforceやApexの経験が浅いということもあり、

上記のコードや、言っていることにおかしなことがあるかもしれません。

もし何かおかしなところがありましたら、ご指摘頂けると幸いです。

 

以上、よろしくお願い致します。

はじめまして。Force.comを使い始めて1週間ほどの者です。
初歩的な質問をしてしまうかもしれませんが、よろしくお願い致します。

 

下記のような機能は実現可能でしょうか?

 

あるカスタムオブジェクト(ObjAとします)に、ユーザー毎に自動採番される項目(ItemObjIDとします)
を作りたいと思っています。
例えばユーザーAとユーザーBがいた場合、
ユーザーAが作成した1つ目のレコード:「UserA001」
ユーザーAが作成した2つ目のレコード:「UserA002」
ユーザーAが作成した1つ目のレコード:「UserB001」
・・といった具合です。

 

「新規作成」ボタンからこのオブジェクトを作成する場合、「ObjAの編集」画面が表示されます。
ここで既にItemObjIDが「UserA001」のレコードと「UserA002」のレコードが存在している場合、
「ItemObjID」の入力値項目にデフォルトで「UserA003」と入力されているようにしたいです。

 

「ObjAの編集」画面が表示される段階で「既に存在するレコードを検索してItemObjIDの
デフォルト値として入力されるべき値が"UserA003"であるということを割り出し、
項目に値を設定する」というApexロジックを差し込めれば実現できるかと思ったのですが、
Apexロジックはこのように使用することが可能な物なのでしょうか?

 

無知のため頓珍漢なことを聞いてしまっているかもしれません。
もし質問の意図がわかりにくいなどあれば、その旨お返事頂ければ幸いです。
どうぞよろしくお願い致します。

はじめまして。Force.comを使い始めて1週間ほどの者です。
初歩的な質問をしてしまうかもしれませんが、よろしくお願い致します。

 

下記のような機能は実現可能でしょうか?

 

あるカスタムオブジェクト(ObjAとします)に、ユーザー毎に自動採番される項目(ItemObjIDとします)
を作りたいと思っています。
例えばユーザーAとユーザーBがいた場合、
ユーザーAが作成した1つ目のレコード:「UserA001」
ユーザーAが作成した2つ目のレコード:「UserA002」
ユーザーAが作成した1つ目のレコード:「UserB001」
・・といった具合です。

 

「新規作成」ボタンからこのオブジェクトを作成する場合、「ObjAの編集」画面が表示されます。
ここで既にItemObjIDが「UserA001」のレコードと「UserA002」のレコードが存在している場合、
「ItemObjID」の入力値項目にデフォルトで「UserA003」と入力されているようにしたいです。

 

「ObjAの編集」画面が表示される段階で「既に存在するレコードを検索してItemObjIDの
デフォルト値として入力されるべき値が"UserA003"であるということを割り出し、
項目に値を設定する」というApexロジックを差し込めれば実現できるかと思ったのですが、
Apexロジックはこのように使用することが可能な物なのでしょうか?

 

無知のため頓珍漢なことを聞いてしまっているかもしれません。
もし質問の意図がわかりにくいなどあれば、その旨お返事頂ければ幸いです。
どうぞよろしくお願い致します。

お世話になっております。

数式項目が計算されるタイミングについてご質問させて頂きます。
数式項目は、データベースからSelectされる時にのみ計算され、以後は再計算されないのでしょうか?

(数式項目はSOQLのSelect文で取得された後は、数値型と同じ扱いとなるのでしょうか?)

なお、これを検証するため、下記のような環境条件でコードを実行してみました。

■環境条件
カスタムオブジェクト(MathTest__c)を作成
  ・param__c(数値):数式のパラメータとして使用
  ・CalcResult__c(数式):「param__c * 2」

■コード(Visualforce)

<apex:page controller="MathTestController" >
	<apex:pageBlock >
		<apex:pageBlockSection id="refresh" >
			<apex:form >
				<apex:outputText value="{!MathTest.param__c}" />
				<apex:outputText value="{!MathTest.CalcResult__c}" />
				<apex:commandButton action="{!ChangeParam}" value="変数変更" rerender="refresh" />
				<apex:commandButton action="{!Save}" value="保存" />
				<apex:commandButton action="{!Cancel}" value="キャンセル" />
			</apex:form>
		</apex:pageBlockSection>
	</apex:pageBlock>
</apex:page>

 
■コード(コントローラ)

public with sharing class MathTestController {
	//オブジェクト
	private MathTest__c sobjMathTest = null;
	public MathTest__c MathTest{
		get
		{
			return sobjMathTest;
		}
	}
	
	//コンストラクタ
	public MathTestController(){
		//レコードを1件取得
		sobjMathTest = [select Id, param__c, CalcResult__c from MathTest__c limit 1];
	}
	
	//数式計算の元となる値をインクリメント
	public Pagereference ChangeParam(){
		sobjMathTest.param__c++;
		return null;
	}
	
    //保存する
    public PageReference Save() {
    	//DBのアップデート
    	update sobjMathTest;
    	//リファレンスの作成
    	Pagereference page = new Pagereference(System.currentPageReference().getUrl());
    	page.setRedirect(true);
    	//リファレンスの返却
        return page;
    }
    
    //キャンセルする
    public PageReference Cancel(){
    	//リファレンスの作成
    	Pagereference page = new Pagereference(System.currentPageReference().getUrl());
    	page.setRedirect(true);
    	//リファレンスの返却
        return page;
    }
	
}

 

このページを表示すると、(param__cの初期値が1の場合)param__cの値として1が、
CalcResult__cの値として2(1 × 2)が表示されます。

ここで「変数変更」ボタンを押下すると、ChangeParamメソッドが呼び出され、param__cが
1つインクリメントされます。さらに、「id="refresh"」を指定してrerendarをかけているので、
param__cに2、CalcResult__cに4が表示されることを期待しました。

しかし、実際の動作としてはparam__cに2が、CalcResult__cに2が表示されました。
このことから、数式の計算はデータベースからSelectで値を持ってきた時にのみ行なわれる
のだと考えたのですが、これは間違いないでしょうか?

ちなみに最終的に実現したいことのイメージは下記のような感じで、

その過程で数式に関する上記の疑問が生じました。
1.データベースからレコードを取得し、画面に描画する。
2.画面に描画されたコントロールに対してユーザーが様々な編集を行う。
3.rerendar属性を持つボタン動作(ajax)により、コントローラに保持する変数の値を変更する。

  (上記のテストコードにおいては、sobjMathTest)
4.ユーザーには編集内容に従って、画面が更新して表示される。
  (上記のテストコードにおいては、数式が再計算されて「4」と表示されて欲しい、など。)
5-1.ユーザーが保存ボタンを押すと、変更がDBに保存される。
5-2.ユーザーがキャンセルボタンを押すと、変更が破棄され、最初に画面を開いた状態に戻る。

 

 

なお、VisualforceやApexの経験が浅いということもあり、

上記のコードや、言っていることにおかしなことがあるかもしれません。

もし何かおかしなところがありましたら、ご指摘頂けると幸いです。

 

以上、よろしくお願い致します。

はじめまして。Force.comを使い始めて1週間ほどの者です。
初歩的な質問をしてしまうかもしれませんが、よろしくお願い致します。

 

下記のような機能は実現可能でしょうか?

 

あるカスタムオブジェクト(ObjAとします)に、ユーザー毎に自動採番される項目(ItemObjIDとします)
を作りたいと思っています。
例えばユーザーAとユーザーBがいた場合、
ユーザーAが作成した1つ目のレコード:「UserA001」
ユーザーAが作成した2つ目のレコード:「UserA002」
ユーザーAが作成した1つ目のレコード:「UserB001」
・・といった具合です。

 

「新規作成」ボタンからこのオブジェクトを作成する場合、「ObjAの編集」画面が表示されます。
ここで既にItemObjIDが「UserA001」のレコードと「UserA002」のレコードが存在している場合、
「ItemObjID」の入力値項目にデフォルトで「UserA003」と入力されているようにしたいです。

 

「ObjAの編集」画面が表示される段階で「既に存在するレコードを検索してItemObjIDの
デフォルト値として入力されるべき値が"UserA003"であるということを割り出し、
項目に値を設定する」というApexロジックを差し込めれば実現できるかと思ったのですが、
Apexロジックはこのように使用することが可能な物なのでしょうか?

 

無知のため頓珍漢なことを聞いてしまっているかもしれません。
もし質問の意図がわかりにくいなどあれば、その旨お返事頂ければ幸いです。
どうぞよろしくお願い致します。