• sihmeieos
  • NEWBIE
  • 0 Points
  • Member since 2009

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

Accountの取引先名(Name)に対して、入力規則で重複チェックできるのでしょうか??

 

現状は重複してもデータが入ってしまうので困っています。

 

ご存知の方がいらっしゃいましたら、ご教授いただければ幸いです。

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

  • August 11, 2010
  • Like
  • 0

こんにちは。いつもお世話になっております。

 

今回、Apexクラスのスケジューリングを行うため、Apex開発者ガイド日本語版(Beta版)[http://wiki.developerforce.com/index.php/JP:App_Logic]を参考に作成してみました。

 

[スケジュール実行クラス]

 

global class ScheduledShare implements Schedulable {
	public static String CRON_EXP = '0 0 18 ? * 2';
	global void execute(SchedulableContext ctx) {
		CreateAutoShare cas = new CreateAutoShare();
		CronTrigger ct = [select Id, CronExpression, TimesTriggered, NextFireTime from CronTrigger where Id = :ctx.getTriggerId()];
        System.assertEquals(0, ct.TimesTriggered);
	}
}

 

[テストクラス]

 

@isTest
private class testForScheduled {
    static testMethod void testScheduledShare() {
    	ScheduledShare ss = new ScheduledShare();
    	String jobId = System.schedule('testBasicScheduledApex', ScheduledShare.CRON_EXP, ss); // Get the information from the CronTrigger API object
        CronTrigger ct = [SELECT id, CronExpression, TimesTriggered, NextFireTime FROM CronTrigger WHERE id = :jobId]; // Verify the expressions are the same
        System.assertEquals(ScheduledShare.CRON_EXP, ct.CronExpression); // Verify the job has not run
        System.assertEquals(0, ct.TimesTriggered);// Verify the next time the job will run 
        System.assertEquals('2010-09-27 18:00:00', String.valueOf(ct.NextFireTime));
    }
}

 

 

Eclipse上でRunTestを実行すると、スケジュール実行クラス:ScheduledShareのexecute()メソッドがコールされず、カバレッジが75%以下になってしまいます。

開発者ガイドの通りにやっているつもりなのですが、何か間違えているところがあるのでしょうか?

 

 

 

sihmeieos

ガバナ制限にひっかからないよう、updateをする際はリストを利用して一括でデータの更新を行っています。

 

 

CustomObjectA[] la = new CustomObjectA[]{};
CustomObjectA[] a = [select Id, Hour from CustomObjectA];
for(Integer i=0; a.size()>i; i++){
    a.Hour = a.Hour + 1;
    la.add(a);
}
update la;

 

この時、例えばデータの変更履歴を残す目的で同じIDのデータを変更したい場合、「IDが重複していてUPDATEできない」旨のエラーメッセージが表示され、UPDATEできなくなります。

このようなパターンの時は、一括更新できないのでしょうか。また、どのようにすれば同じIDのデータをUPDATEすることが

できるのでしょうか。

画面からの更新の場合はありえないパターンかもしれませんが、データローダなどを使用する場合はあり得ると思います。

 

sihmeieos

 

 

 

 

こんにちは。

 

ApexTriggerとApexClassを使って処理をさせている箇所で、「System.LimitException: Too many SOQL queries: 21」が発生するようになってしまいました。以前は問題なく処理できていたので、何か新しい処理が走っていると思います。原因はわからないのですが、「System.LimitException: Too many SOQL queries: 21」の内容について確認したいと思います。

 

[Trigger]

 

trigger beforeUpdateProduct on Product__c (before update) {
    Product__c[] p = Trigger.new;
    /* Call ApexClass Method */
    CalculateDate.calcProductDate(p);
    /* Call ApexClass Method */
    CreateUpdateAuto.createRental(p);
}

 

上記のようなトリガー、つまり、Classをコールしているだけのトリガーだと、トリガーのガバナー制限(20回)にはひっかからず、Class内で100回SOQLを発行しなければ問題ないと思っていたのですが、違うのでしょうか。

テストだと正常に処理できて、画面からだとエラーになってしまうので、どこでガバナー制限にひっかかっているのか原因を特定できないのです。

テストだと、Classでは58回までSOQLをコールしているようなのですが、エラーにはなっていません。

認識に間違い、または原因に心当たりがある場合、ご指摘いただけるととても助かります。

よろしくお願いします。

 

こんにちは。いつもお世話になっております。

 

テストの度に煩わされるのが、テストデータの作成です。

メソッドごとにテストデータを作成するよう、ソースを書いても良いのですが、ソースコードの量が多くなると見づらいですし、

他に良い方法は無いかと悩んでいました。

テストデータ作成専用のクラスを作成し、テストクラスからCallするようにすれば良いかとも思いましたが、

@isTestアノテーションを使って宣言したクラス・メソッドは全てprivateで無ければならないため、Call

できませんでした。

通常のpublicなクラスだとinsertをすると実データが作成されてしまうと思います。

 

テストデータを作成する上で、以下のようなことが可能な良い方法は無いでしょうか。

・テストデータの管理が容易。

・テストデータの作成ロジックが集まっている。

 

 

こんにちは。

 

カスタムオブジェクトのName項目をユニークにしたいのですが、必ずしもName項目に値があるとは限らず、悩んでいます。

 

[問題]

・Name項目をユニークにしたい。

・Name項目に必ず値があるわけではない。

[対応策]

・Indexのようなものがあれば、Triggerを使ってInsert時に、Name項目の値がNULLの場合のみIndexから数値を取得し、Name項目の値としたい。

[例]

・Name項目:ドキュメント番号

・古すぎてドキュメント番号の不明なドキュメントがある。この時、連番で良いのでSalesforce側でドキュメント番号を自動的に割り当てたい。

・ただし、Name項目のドキュメント番号はユニークでなければならない。

 

こういった場合に使用できるIndexのようなものは実装されているのでしょうか。

ざっと調べてみた限り無かったのですが…。

他に良い実現方法などあれば、ご指摘いただけると非常に助かります。

 

よろしくお願いします。

 

----------------------

sihmeieos

Hi.

 

I create Apex Trigger and Class on Force.com IDE(Eclipse 3.5.2) and my project set to Production Organization.

Now, I want to delete from Apex Trigger and Class I created in past time, but I can't.

 

[can't delete message]

"Remote delete failed with the following message. Delete will be aborted.   <Apex Class Name>: null package.xml:null"

 

[Error Log]

■WARN

"(ProjectService.java:handleRetrieveResult:2068) - Nothing to save to project - retrieve result is empty"

■ERROR

"

(DeleteRefactorController.java:performRemoteDelete:274) - Remote delete failed with the following message.  Delete will be aborted.
  createWork: null

 

(DeleteRefactorController.java:performRemoteDelete:274) - Remote delete failed with the following message.  Delete will be aborted.  <Apex Class Name>k: null"

 

What's that phenomenon?

Why that phenomenon come up?

 

Please tell me that reason if you know.

And please tell me the solution if you will.

 

Thanks.

 

 

こんにちは。

 

超初歩的かつ今更な話で恐縮なのですが、運用組織への正式なデプロイの方法が良くわかりません。

Developer's Guideには「

別の
Salesforce.com 組織への展開

 

Eclipseで入手できるForce.comIDEの「別のSalesforce.com 組織への展開」を参照してください」とありますが、このマニュアルもどこにあるのか良くわかりません。

以下の方法でおかしいところがあると思うので、ご指摘いただけると非常に助かります。

 

【運用組織へのdeploy】

1.新規ApexTrigger,ApexClassを作成する。

2.ソースを書く。

3.Trigger,Classを「Save to Server」でアップロードする。

4.Run Testする。

5.75%になったら「Deploy to Server」が可能になる。

 

現在は、Run Testしても、中身が無いTrigger,Classがサーバーにアップロードされている状態のため、テストが実行できずにデプロイできません。

ちなみに、Developer組織でも上記のような手順でデプロイをしています。(CookBookなどに書かれている手順のはず)

こちらは正常にデプロイでき、実行できています。

 

本当に基本的な質問で申し訳ないのですが、ご指導・ご指摘のほど、よろしくお願いいたします。

 

こんにちは。

 

IDEで運用組織にデプロイしたApexClassを削除しようとすると、以下のエラーが発生します。

 

"Remote delete failed with the following message.  Delete will be aborted.  ApexClass名:null  package.xml:null"

 

package.xmlを確認すると、ApexClassはmembersを"*"で指定していました。

これで全て指定できているので問題なく削除できると思うのですが、削除できません。

どうすれば削除できるのでしょうか。(パッケージを作成しなければならないとか?)

問題点をご存知であればご指摘いただけると助かります。

 

こんにちは。

 

テーブルの結合について ともかぶるかもしれませんが、参照関係にある複数のオブジェクトの項目を一気に取得したい場合、

SOQLでどのように実現すれば良いのか困っています。

 

[SQL]

 

select a.Name, b.Name from tableA a, tableB b where a.Id = b.Id;

 

Apexだと、いくつかSELECT文を書いて変数を使ってデータ取得すれば良いのですが、できればSOQLでさくっと取得

できるものならしたいと思っています。また、Apex中に埋め込むSOQLを事前にApexExplorerで確認するためにも

使いたいです。

これまで調べてきた中だと、親子関係にあるオブジェクトや、参照関係にあるオブジェクトのうち1つのオブジェクトの項目を

取得することはできるようですが、参照関係にあるオブジェクトから複数のオブジェクトの項目を取得する方法が未だに

わかりません。

 

[子→親オブジェクトへのデータ参照]

SELECT Id, Name, parent.Id, parent.Name 

FROM Child;

 [親→子オブジェクトへのデータ参照]

 

SELECT Id, Name, (SELECT Id, Name FROM Child)FROM Parent;

 

 [参照関係にある2つのオブジェクトから1つのオブジェクトの項目のみ取得]

 

SELECT Id, NameFROM tableAWHERE Id IN (SELECT Id from tableB);

 

 SOQL単体では、参照関係にある複数のオブジェクトの項目を取得することは不可能なのでしょうか。(SQLの例のように)

それとも何か方法があるのでしょうか。

 

【参考】

Force.com Blog:Salesforceのアプリケーション・データモデル 

DeveloperBoardJP:テーブルの結合について

Hello.

 

I want to calculate date based on calendar.

I think that use Date.

Date initdate = '2010-02-19 00:00:00';

  Date updatedate;

updatedate = initdate.addYears(1);  //want to know next year's day 

 

But I dought [Date.addYears()] is adiing numeric '1' to only year'2010'.

That reault is  updatedate'2011-02-10 00:00:00'.

 

Do I must to create a logic? example:date calc

Or  can I user any method?

 

please tell me.

 

Thanks. 

 

Hi.

I setup CustomObject and CustomItem.

the CustomItem(RevisionLength__c) is numeric value.

the CustomItem(PreRevisionDate__c) is date value.

I create the trigger.

 

 

trigger updateDeviceMng on DeviceMng__c (before insert, before update) {
Map<ID, ModelVL__c> model = new Map<ID, ModelVL__c>(
[select Id, Name, RevisionLength__c, LifePeriod__c, ReplacementCycle__c from ModelVL__c]);
for(DeviceMng__c d: Trigger.new){
System.debug(model.get(d.Model__c).RevisionLength__c);
for(Integer i=0; i<m.size(); i++){
d.NextRevisionDate__c = d.PreRevisionDate__c.addYears(model.get(d.Model__c).RevisionLength__c);
}
}
}

 

When save it, happend the error. 

 Save error: Method does not exist or incorrect signature: [Date].addYears(Double)

 

so, I change the code.

d.NextRevisionDate__c = d.PreRevisionDate__c.addYears((model.get(d.Model__c).RevisionLength__c).initValue);

 But happend the error.

 Save error: Initial term of field expression must be a concrete SObject: Double

 

Why the CustomItem is Double?(I think it is Integer)

Why don't use initValue? 


If you understand the reason, please tell me.
 
Thanks. 

やむを得ず、ほぼ独学で簡単なアプリケーションを開発しています。(Eclipse使用) 

Javaを知っていればある程度のロジックは組めるのですが、独特なもの(SOQL、ガバナ制限など)に対する対応方法を都度調査して解決している状態で、なかなか体系的な知識には成り得ません。

また、トレーニングやプログラミングバイブルを購入する余裕もなく、周りに聞ける人もおらず、ネット上の情報が頼りです。

 

そこで、良い情報入手方法や勉強方法などあれば、是非おすすめしていただきたいと思います。

実際のコードを見るのも勉強になると思うので、ApexExchangeにあるアプリケーションで参考になりそうなものなどあげていただけると、とても助かります。

 

Hello.

I want to create ApexTrigger(before insert) calls Apex class.

But I try the code run normally in developer organization, don't run in operational organization.

------------------------------------------------------------------------------------

[Trigger]

trigger instCode on CustomObjectA (before insert) {
    CustomObjectA[] a = Trigger.new;
    Class01.addData(a);
}

 

[Class]

 public class Class01 {
    public static void addData(CustomObjectA[] a){
        if(wd.size()>0){
                for(CustomObjectA wdc:wd){
                    CustomObjectB b = [select RunningHour__c from CustomObjectB where Id= :wdc.SerialNum__c];
                    If(a.RunningHour__c > b.RunningHour__c){
                        b.RunningHour__c = a.RunningHour__c;
                        update a;
        }

    //testMethod
    public static testMethod void testAddData(){
        CustomObjectB b = [select Id,Name,RecordTypeId,RunningHour__c from CustomObjectB where Name='10785'];
        b.RunningHour__c = 120.0;
        update b;
        //CustomObjectA>CustomObjectB

       CustomObjectA a = new CustomObjectA(WorkNum__c='a0910000005zwM2AAI',SerialNum__c='a0810000002ZEtGAAW', RunningHour__c=125.5);
        insert a1; //call trigger
        CustomObjectB b01 = [select Id,Name,RunningHour__c from CustomObjectB where Id= :a1.Id];
        System.assertNotEquals(b01.RunningHour__c,a1.RunningHour__c);
        //CustomObjectA<CustomObjectB

       CustomObjectA a2 = new CustomObjectA(WorkNum__c='a0910000005zwM2AAI',SerialNum__c='a0810000002ZEtGAAW',RunningHour__c=119);
        insert a2; //call trigger
        CustomObjectB b02 = [select Id,Name,RunningHour__c from CustomObjectB where Id= :a2.Id];
        System.assertNotEquals(b02.RunningHour__c,a2.RunningHour__c);
    }

}

------------------------------------------------------------------------------------

Testmethod:testAddData run normally,but don't call Trigger: instCode apparently.

Why don't call Trigger.

Hello,

 

I'm trying to get user information(customer portal user= contact)  in Apex class and trigger.

but I don't know how to get customer portal user infomation on Apex.

 

I want to add accountId to customObjectA when customObjectA created by custom portal user.

 

trigger instAccount on ProductNS__c (before insert) {
ProductNS__c[] pns = Trigger.new;
putAccountData.addDeleverCustomer(a)}
}
public with sharing class putAccountData {
public static void addDeleverCustomer(CustomObj A){
ID uid = UserID;//I get logined user's userId,contactId,accountId, here.
If (A.AccountId == null){
ID cid = [select ContactId from User where Id = uid];
ID aid = [select AccountId from Contact where Id = cid];
A.AccountId = aid;
}
}
}
 

 

Please help, how to get userId.

Thank you.

 

sihmeieos

やむを得ず、ほぼ独学で簡単なアプリケーションを開発しています。(Eclipse使用) 

Javaを知っていればある程度のロジックは組めるのですが、独特なもの(SOQL、ガバナ制限など)に対する対応方法を都度調査して解決している状態で、なかなか体系的な知識には成り得ません。

また、トレーニングやプログラミングバイブルを購入する余裕もなく、周りに聞ける人もおらず、ネット上の情報が頼りです。

 

そこで、良い情報入手方法や勉強方法などあれば、是非おすすめしていただきたいと思います。

実際のコードを見るのも勉強になると思うので、ApexExchangeにあるアプリケーションで参考になりそうなものなどあげていただけると、とても助かります。

 

WFRの項目自動更新を利用して参照項目の初期化を行いたいのですが、項目自動更新の候補に参照項目は出て来ません。

これは、出来ないという事でしようか ?。

だとすれば、何か他の方法はないでしようか。

 

こんにちは。

 

ApexTriggerとApexClassを使って処理をさせている箇所で、「System.LimitException: Too many SOQL queries: 21」が発生するようになってしまいました。以前は問題なく処理できていたので、何か新しい処理が走っていると思います。原因はわからないのですが、「System.LimitException: Too many SOQL queries: 21」の内容について確認したいと思います。

 

[Trigger]

 

trigger beforeUpdateProduct on Product__c (before update) {
    Product__c[] p = Trigger.new;
    /* Call ApexClass Method */
    CalculateDate.calcProductDate(p);
    /* Call ApexClass Method */
    CreateUpdateAuto.createRental(p);
}

 

上記のようなトリガー、つまり、Classをコールしているだけのトリガーだと、トリガーのガバナー制限(20回)にはひっかからず、Class内で100回SOQLを発行しなければ問題ないと思っていたのですが、違うのでしょうか。

テストだと正常に処理できて、画面からだとエラーになってしまうので、どこでガバナー制限にひっかかっているのか原因を特定できないのです。

テストだと、Classでは58回までSOQLをコールしているようなのですが、エラーにはなっていません。

認識に間違い、または原因に心当たりがある場合、ご指摘いただけるととても助かります。

よろしくお願いします。

 

Accountの取引先名(Name)に対して、入力規則で重複チェックできるのでしょうか??

 

現状は重複してもデータが入ってしまうので困っています。

 

ご存知の方がいらっしゃいましたら、ご教授いただければ幸いです。

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

  • August 11, 2010
  • Like
  • 0

こんにちは。いつもお世話になっております。

 

テストの度に煩わされるのが、テストデータの作成です。

メソッドごとにテストデータを作成するよう、ソースを書いても良いのですが、ソースコードの量が多くなると見づらいですし、

他に良い方法は無いかと悩んでいました。

テストデータ作成専用のクラスを作成し、テストクラスからCallするようにすれば良いかとも思いましたが、

@isTestアノテーションを使って宣言したクラス・メソッドは全てprivateで無ければならないため、Call

できませんでした。

通常のpublicなクラスだとinsertをすると実データが作成されてしまうと思います。

 

テストデータを作成する上で、以下のようなことが可能な良い方法は無いでしょうか。

・テストデータの管理が容易。

・テストデータの作成ロジックが集まっている。

 

 

こんにちは。

 

カスタムオブジェクトのName項目をユニークにしたいのですが、必ずしもName項目に値があるとは限らず、悩んでいます。

 

[問題]

・Name項目をユニークにしたい。

・Name項目に必ず値があるわけではない。

[対応策]

・Indexのようなものがあれば、Triggerを使ってInsert時に、Name項目の値がNULLの場合のみIndexから数値を取得し、Name項目の値としたい。

[例]

・Name項目:ドキュメント番号

・古すぎてドキュメント番号の不明なドキュメントがある。この時、連番で良いのでSalesforce側でドキュメント番号を自動的に割り当てたい。

・ただし、Name項目のドキュメント番号はユニークでなければならない。

 

こういった場合に使用できるIndexのようなものは実装されているのでしょうか。

ざっと調べてみた限り無かったのですが…。

他に良い実現方法などあれば、ご指摘いただけると非常に助かります。

 

よろしくお願いします。

 

----------------------

sihmeieos

Hi.

 

I create Apex Trigger and Class on Force.com IDE(Eclipse 3.5.2) and my project set to Production Organization.

Now, I want to delete from Apex Trigger and Class I created in past time, but I can't.

 

[can't delete message]

"Remote delete failed with the following message. Delete will be aborted.   <Apex Class Name>: null package.xml:null"

 

[Error Log]

■WARN

"(ProjectService.java:handleRetrieveResult:2068) - Nothing to save to project - retrieve result is empty"

■ERROR

"

(DeleteRefactorController.java:performRemoteDelete:274) - Remote delete failed with the following message.  Delete will be aborted.
  createWork: null

 

(DeleteRefactorController.java:performRemoteDelete:274) - Remote delete failed with the following message.  Delete will be aborted.  <Apex Class Name>k: null"

 

What's that phenomenon?

Why that phenomenon come up?

 

Please tell me that reason if you know.

And please tell me the solution if you will.

 

Thanks.

 

 

こんにちは。

 

超初歩的かつ今更な話で恐縮なのですが、運用組織への正式なデプロイの方法が良くわかりません。

Developer's Guideには「

別の
Salesforce.com 組織への展開

 

Eclipseで入手できるForce.comIDEの「別のSalesforce.com 組織への展開」を参照してください」とありますが、このマニュアルもどこにあるのか良くわかりません。

以下の方法でおかしいところがあると思うので、ご指摘いただけると非常に助かります。

 

【運用組織へのdeploy】

1.新規ApexTrigger,ApexClassを作成する。

2.ソースを書く。

3.Trigger,Classを「Save to Server」でアップロードする。

4.Run Testする。

5.75%になったら「Deploy to Server」が可能になる。

 

現在は、Run Testしても、中身が無いTrigger,Classがサーバーにアップロードされている状態のため、テストが実行できずにデプロイできません。

ちなみに、Developer組織でも上記のような手順でデプロイをしています。(CookBookなどに書かれている手順のはず)

こちらは正常にデプロイでき、実行できています。

 

本当に基本的な質問で申し訳ないのですが、ご指導・ご指摘のほど、よろしくお願いいたします。

 

こんにちは。

 

IDEで運用組織にデプロイしたApexClassを削除しようとすると、以下のエラーが発生します。

 

"Remote delete failed with the following message.  Delete will be aborted.  ApexClass名:null  package.xml:null"

 

package.xmlを確認すると、ApexClassはmembersを"*"で指定していました。

これで全て指定できているので問題なく削除できると思うのですが、削除できません。

どうすれば削除できるのでしょうか。(パッケージを作成しなければならないとか?)

問題点をご存知であればご指摘いただけると助かります。

 

こんにちは。

 

テーブルの結合について ともかぶるかもしれませんが、参照関係にある複数のオブジェクトの項目を一気に取得したい場合、

SOQLでどのように実現すれば良いのか困っています。

 

[SQL]

 

select a.Name, b.Name from tableA a, tableB b where a.Id = b.Id;

 

Apexだと、いくつかSELECT文を書いて変数を使ってデータ取得すれば良いのですが、できればSOQLでさくっと取得

できるものならしたいと思っています。また、Apex中に埋め込むSOQLを事前にApexExplorerで確認するためにも

使いたいです。

これまで調べてきた中だと、親子関係にあるオブジェクトや、参照関係にあるオブジェクトのうち1つのオブジェクトの項目を

取得することはできるようですが、参照関係にあるオブジェクトから複数のオブジェクトの項目を取得する方法が未だに

わかりません。

 

[子→親オブジェクトへのデータ参照]

SELECT Id, Name, parent.Id, parent.Name 

FROM Child;

 [親→子オブジェクトへのデータ参照]

 

SELECT Id, Name, (SELECT Id, Name FROM Child)FROM Parent;

 

 [参照関係にある2つのオブジェクトから1つのオブジェクトの項目のみ取得]

 

SELECT Id, NameFROM tableAWHERE Id IN (SELECT Id from tableB);

 

 SOQL単体では、参照関係にある複数のオブジェクトの項目を取得することは不可能なのでしょうか。(SQLの例のように)

それとも何か方法があるのでしょうか。

 

【参考】

Force.com Blog:Salesforceのアプリケーション・データモデル 

DeveloperBoardJP:テーブルの結合について

やむを得ず、ほぼ独学で簡単なアプリケーションを開発しています。(Eclipse使用) 

Javaを知っていればある程度のロジックは組めるのですが、独特なもの(SOQL、ガバナ制限など)に対する対応方法を都度調査して解決している状態で、なかなか体系的な知識には成り得ません。

また、トレーニングやプログラミングバイブルを購入する余裕もなく、周りに聞ける人もおらず、ネット上の情報が頼りです。

 

そこで、良い情報入手方法や勉強方法などあれば、是非おすすめしていただきたいと思います。

実際のコードを見るのも勉強になると思うので、ApexExchangeにあるアプリケーションで参考になりそうなものなどあげていただけると、とても助かります。