You need to sign in to do that
Don't have an account?
muromuro
VisualforceからApexへページ遷移なしで引数を渡すには
初投稿です。ご覧いただきありがとうございます。
社内で勉強中なのですが、先輩方でも打開できなかったので、お知恵をお貸しいただけると幸いです。
VisualforceとApexを使用し、社内のソフトウェア・備品とそれに関連付けられたPCを表示するシステムを作っています。
Visualforce(viewSoftwareFixture.vfp)からApex(getPC.apxc)に備品名(SoftwareFixturAdmin__c.Name)を、ページ遷移なしで動的に渡す方法を知りたいです。
今回の学習範囲的に、Javascriptなどもできれば使わずに済むのであればうれしいです。
どなたかよろしくお願いします。
関連するカスタムオブジェクトとリレーション(備品セットは中間オブジェクト)
出力イメージ(特定の備品を静的に指定しているため、同じ備品の情報が出力されています)
コード
・Visualforceページ viewSoftwareFixture.vfp
社内で勉強中なのですが、先輩方でも打開できなかったので、お知恵をお貸しいただけると幸いです。
VisualforceとApexを使用し、社内のソフトウェア・備品とそれに関連付けられたPCを表示するシステムを作っています。
Visualforce(viewSoftwareFixture.vfp)からApex(getPC.apxc)に備品名(SoftwareFixturAdmin__c.Name)を、ページ遷移なしで動的に渡す方法を知りたいです。
今回の学習範囲的に、Javascriptなどもできれば使わずに済むのであればうれしいです。
どなたかよろしくお願いします。
関連するカスタムオブジェクトとリレーション(備品セットは中間オブジェクト)
出力イメージ(特定の備品を静的に指定しているため、同じ備品の情報が出力されています)
コード
・Visualforceページ viewSoftwareFixture.vfp
<apex:page standardController="SoftwareFixtureAdmin__c" extensions="getFixture,getPC"> <apex:pageBlock > <apex:repeat value="{!fixtures}" var="fix" id="repeatFix"> <apex:pageBlockSection title="{!fix.Name}" columns="1"> <apex:pageBlockSection columns="3"> <apex:outputField value="{!fix.ProductID__c}" rendered="{!fix.ProductID__c!=NULL}"/> <apex:outputField value="{!fix.ProductKey__c}" rendered="{!fix.ProductKey__c!=NULL}"/> <apex:outputField value="{!fix.UserID__c}" rendered="{!fix.UserID__c!=NULL}"/> <apex:outputField value="{!fix.LicenseLimit__c}" rendered="{!fix.LicenseLimit__c!=NULL}"/> <apex:outputField value="{!fix.Having__c}"/> <apex:outputField value="{!fix.Using__c}"/> <apex:outputField value="{!fix.CanUse__c}"/> </apex:pageBlockSection> <apex:repeat value="{!PCs}" var="pc" id="repeatPC"> <apex:pageBlockSection title="{!pc.Name}" columns="3"> <apex:outputField value="{!pc.User__c}"/> <apex:outputField value="{!pc.Place__c}"/> <apex:outputField value="{!pc.RentalDay__c}"/> </apex:pageBlockSection> </apex:repeat> </apex:pageBlockSection> </apex:repeat> </apex:pageBlock> </apex:page>・Apexクラス getFixture.apxc
public class getFixture { public List<SoftwareFixtureAdmin__c> fixtures{ get; set; } public getFixture(ApexPages.StandardController controller){ this.fixtures = [SELECT Name, ProductID__c, ProductKey__c, UserID__c, LicenseLimit__c, Having__c, Using__c, CanUse__c FROM SoftwareFixtureAdmin__c]; } }・Apexクラス getPC.apxc
public class getPC { public List<PCAdmin__c> PCs{ get; set; } public getPC(ApexPages.StandardController controller){ SoftwareFixtureAdmin__c fixId = [SELECT s.Id FROM SoftwareFixtureAdmin__c AS s WHERE Name =: Name]; //出力イメージはWHERE句を"WHERE Name = 'Microsoft Office 2013'と指定して出力 this.PCs = [SELECT p.Name, p.User__c, p.Place__c, p.RentalDay__c FROM PCAdmin__c AS p WHERE p.Id IN(SELECT f.PC__c FROM FixtureSet__c AS f WHERE f.SoftwareFixtureAdmin__c =: fixId.Id) ORDER BY p.Name]; } public String Name { get; set; } }
- VFページ
- コントローラクラス
- コントローラクラスから呼び出すクラス (getFixtureとgetPCはこちら)
取引先検索画面を例とした実装イメージです。
クラスのコンストラクタの部分は画面を表示したタイミングで必ず実行される処理となります。
doSearchのメソッドはapex:commandButtonから呼び出すときのサンプルです。
コンストラクタ内の処理ではページ遷移は実行できませんので、もし特定の条件で遷移する仕様の場合はコンストラクタではなくapex:pageタグでactionを指定して処理を実行してください。
下記の処理でコントローラクラスから別のクラスを呼び出しています。
クラス名は自由に付けることができるのでHelperやDaoである必要はありません。クラス内の処理も記載しておきます。
システム管理者の権限でアクセス件が無いとエラーになっているのはおそらくクラスの宣言方法などに誤りがあるからだと思います。
ページから呼び出すのはコントローラクラスの一つだけにしてシンプルな形にしてみてください。
All Answers
http://tyoshikawa1106.hatenablog.com/entry/2012/12/20/003123
ご教授ありがとうございます。
commandButtonとparamを以下のように試してみたのですが、アクセス権がありませんとエラーが出たため実行できませんでした(練習用の環境のため実質的な管理者です)。 また、可能であればアクセスと同時に表示できるようにしたいと考えています(Javascriptのonload()と同じタイミング)。よろしくお願いいたします。
- VFページ
- コントローラクラス
- コントローラクラスから呼び出すクラス (getFixtureとgetPCはこちら)
取引先検索画面を例とした実装イメージです。
クラスのコンストラクタの部分は画面を表示したタイミングで必ず実行される処理となります。
doSearchのメソッドはapex:commandButtonから呼び出すときのサンプルです。
コンストラクタ内の処理ではページ遷移は実行できませんので、もし特定の条件で遷移する仕様の場合はコンストラクタではなくapex:pageタグでactionを指定して処理を実行してください。
下記の処理でコントローラクラスから別のクラスを呼び出しています。
クラス名は自由に付けることができるのでHelperやDaoである必要はありません。クラス内の処理も記載しておきます。
システム管理者の権限でアクセス件が無いとエラーになっているのはおそらくクラスの宣言方法などに誤りがあるからだと思います。
ページから呼び出すのはコントローラクラスの一つだけにしてシンプルな形にしてみてください。
ありがとうございます。
提示していただいた取引先の例を実行しようとしたのですが、いくらかエラーが出てしまい保存できない状況です。これはどのようにすれば直りますでしょうか。
『CommonConst.PARAM_RETURN_URL』の中身は 文字列の 'retURL' です。
『System.Label.System_Error_Message』の中身は文字列の 'システムエラー' です。
ひとまずこれで保存できると思います。
よろしくお願いいたします。
ありがとうございます。
動作が確認できましたので、これを参考にして書いていきたいと思います。
昨日、先輩と再度この件について協議した結果、以下のような形に落ち着きましたので、ご報告いたします。
SOQLで主従関係をV字に辿れるということが分かったので、それを採用しました。
(デザインはその後のフィードバックにより多少変更しております)
この度はわざわざ時間を割いていただきありがとうございました。
またご縁がありましたら、よろしくお願いいたします。
viewSoftwareFixture.vfp
getFixture.apxc
getPC.apxc→廃止