• matsu
  • NEWBIE
  • 75 Points
  • Member since 2010

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

Visualforceで「renderAs="pdf"」を使用してpdf出力する際、
特定の行数で改ページする方法を検討しています。

検討用のサンプルとして以下のようなVisualforceページを作成したのですが、
出力されたpdfは、改ページはできているものの、
どのページにも最終ページ分のデータが表示されてしまいました。

どのようにすれば、ページごとに適切なデータが表示されるでしょうか?

もしくは、他に適切な改ページ方法がありますでしょうか?


ご教示いただければ幸いに存じます。

 

【Visualforce】

<apex:page standardController="Account" extensions="ExtensionController" showHeader="false" sidebar="false" renderAs="pdf">
  <body style="font-family: Arial Unicode MS;">
    <apex:repeat value="{!printRecords}" var="items" id="thePage">
      <apex:repeat value="{!items}" var="item" id="theTable">
        <apex:outputtext value="{!item.Name}"/>
        <br />
      </apex:repeat>
      <div style="page-break-after: always;"/>
    </apex:repeat>
  </body>
</apex:page>

 

【コントローラ】

public class ExtensionController {

    private final Account AccountObj;
    private static Integer pageSize = 5;

    public List<Contact[]> printRecords {get; private set;}

    public ExtensionController(ApexPages.StandardController controller) {
        this.AccountObj = (Account)controller.getRecord();
        BindData();
    }

    private void BindData(){
        String nowId = AccountObj.Id;
        Contact[] Contacts = 
            [SELECT id, Name
               FROM Contact 
              WHERE AccountId = :nowId 
              ORDER BY Name];

        printRecords = new List<Contact[]>();

        Contact[] pageContacts = new Contact[]{};
        Integer counter = 0;
         
        for(Contact c : Contacts){
            if (counter <= pageSize){
                pageContacts.add(c);
                counter++;
            }
            if (counter == pageSize){
                counter = 0;
                printRecords.add(pageContacts);
                pageContacts.clear();
            }
        }
        if(!pageContacts.isEmpty()){
            printRecords.add(pageContacts);
        }
    }
}

 



 

  • April 12, 2011
  • Like
  • 0

Visutalforceページにアクセスしたときのシステムログはどうやったら見られるのでしょうか?

前は何もせずにシステムログのウィンドウに表示されていたと思うのですが、

今は出力されません。何かすれば出力されるようになるのでしょうか?

 

 

 

  • March 26, 2010
  • Like
  • 0

datetime型のデータをページに表示する際、タイムゾーンを指定する方法はありますか?(<apex:outputText>を使ったりして)

DBからの値はいつも標準時間しかとれないので、画面表示時日本時間がほしいのですが。。。

 

ご教授いただけたら幸いです。

よろしくお願いいたします。

  • March 01, 2010
  • Like
  • 0

以前も「.Net」を使っていてという、似たような質問があったのですが、

解決せず・・・、

 

お知恵をお借りできたら幸いです。

 

Javaで、Salesforceのデータを取得しにいっています。

ソースは省略していますが、以下の通りです。

 

QueryResult qr = null;
QueryOptions qo = new QueryOptions();
qo.setBatchSize(500);
ButtonIventLogin.stub.setHeader(new SforceServiceLocator().getServiceName().getNamespaceURI(), "QueryOptions", qo);//ButtonIventLoginでログイン処理をしています。stubはSoapBindingStubです。
boolean done = false;

String queryS = "select Name , (中略) from CustomObject1";

qr =ButtonIventLogin.stub.query(queryS);
if(qr.getSize() > 0){
    while (!done) {
        for (int i=0;i<qr.getRecords().length;i++) {
            //―個々のデータの処理。Mapに収納するレベル
        }
        if(qr.isDone()){
            done = true;

        }else{
            qr = ButtonIventLogin.stub.queryMore(qr.getQueryLocator()); //―(A)
        }
    }
}

 

(A)の部分で、

『INVALID_QUERY_LOCATOR: Unable to find query cursor data for this QueryLocator, please retry your query.』

が発生します。

 

・発生するタイミングは様々です。

 初めて(A)を通る時に発生することもあれば、

 7~8回目で発生することもあります(2~4回目で発生することが多いです)。

 また、約9000件のデータをエラーなしに取得し終えることもあります。

 (今は開発中ですが、本番では約4万件のデータを取得したいと思っています)

・ログインしてからの時間はあまり経っていません(プログラムを流すまでに1分程度でも、10秒程度でもエラーはおきます)。

・昨日まで発生しなかったのですが、今日になって、そこより前のソースを何も触っていないのに、急に発生するようになりました。

・qo.setBatchSize(500);の部分を(50)や(1000)に変えてみても、様々なタイミングで同じエラーが発生します。

 

困ってしまいまして・・・。

原因と解決策をご存じの方がいらっしゃいましたら、よろしくお願いします。

 

――――――

追記

(A)より前の、qr =ButtonIventLogin.stub.query(queryS);の箇所で

『SERVER_UNAVAILABLE: Unable to complete the creation of the query cursor at this time, please retry your query later.』

も頻繁に発生するようになってしまいました。

ログインから時間はたっていません。

何かご存知の方、よろしくお願いします。

 

  • April 06, 2011
  • Like
  • 0

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

 

たとえば、

取引先Objと、取引先責任者Objを使い、

 

<apex:pageBlockTable value="{!account.Contacts}" var="contact" >
           <apex:column value="{!contact.id}"/>
       <apex:column value="{!contact.name}"/>   
</apex:pageBlockTable> 

 

のようにすると

1つの取引先に紐づく取引先責任者が、複数あれば、複数が返されます が、

その並び順はどのような並び順なのでしょう。

見たところ、Id順でも、Name順でも、作成日順でもないようなのですが・・・。

また、順番を制御する方法はありますでしょうか。

 

おわかりの方がいらっしゃいましたら、よろしくお願いいたします。

  • July 02, 2010
  • Like
  • 0

Visualforceで「renderAs="pdf"」を使用してpdf出力する際、
特定の行数で改ページする方法を検討しています。

検討用のサンプルとして以下のようなVisualforceページを作成したのですが、
出力されたpdfは、改ページはできているものの、
どのページにも最終ページ分のデータが表示されてしまいました。

どのようにすれば、ページごとに適切なデータが表示されるでしょうか?

もしくは、他に適切な改ページ方法がありますでしょうか?


ご教示いただければ幸いに存じます。

 

【Visualforce】

<apex:page standardController="Account" extensions="ExtensionController" showHeader="false" sidebar="false" renderAs="pdf">
  <body style="font-family: Arial Unicode MS;">
    <apex:repeat value="{!printRecords}" var="items" id="thePage">
      <apex:repeat value="{!items}" var="item" id="theTable">
        <apex:outputtext value="{!item.Name}"/>
        <br />
      </apex:repeat>
      <div style="page-break-after: always;"/>
    </apex:repeat>
  </body>
</apex:page>

 

【コントローラ】

public class ExtensionController {

    private final Account AccountObj;
    private static Integer pageSize = 5;

    public List<Contact[]> printRecords {get; private set;}

    public ExtensionController(ApexPages.StandardController controller) {
        this.AccountObj = (Account)controller.getRecord();
        BindData();
    }

    private void BindData(){
        String nowId = AccountObj.Id;
        Contact[] Contacts = 
            [SELECT id, Name
               FROM Contact 
              WHERE AccountId = :nowId 
              ORDER BY Name];

        printRecords = new List<Contact[]>();

        Contact[] pageContacts = new Contact[]{};
        Integer counter = 0;
         
        for(Contact c : Contacts){
            if (counter <= pageSize){
                pageContacts.add(c);
                counter++;
            }
            if (counter == pageSize){
                counter = 0;
                printRecords.add(pageContacts);
                pageContacts.clear();
            }
        }
        if(!pageContacts.isEmpty()){
            printRecords.add(pageContacts);
        }
    }
}

 



 

  • April 12, 2011
  • Like
  • 0

以前も「.Net」を使っていてという、似たような質問があったのですが、

解決せず・・・、

 

お知恵をお借りできたら幸いです。

 

Javaで、Salesforceのデータを取得しにいっています。

ソースは省略していますが、以下の通りです。

 

QueryResult qr = null;
QueryOptions qo = new QueryOptions();
qo.setBatchSize(500);
ButtonIventLogin.stub.setHeader(new SforceServiceLocator().getServiceName().getNamespaceURI(), "QueryOptions", qo);//ButtonIventLoginでログイン処理をしています。stubはSoapBindingStubです。
boolean done = false;

String queryS = "select Name , (中略) from CustomObject1";

qr =ButtonIventLogin.stub.query(queryS);
if(qr.getSize() > 0){
    while (!done) {
        for (int i=0;i<qr.getRecords().length;i++) {
            //―個々のデータの処理。Mapに収納するレベル
        }
        if(qr.isDone()){
            done = true;

        }else{
            qr = ButtonIventLogin.stub.queryMore(qr.getQueryLocator()); //―(A)
        }
    }
}

 

(A)の部分で、

『INVALID_QUERY_LOCATOR: Unable to find query cursor data for this QueryLocator, please retry your query.』

が発生します。

 

・発生するタイミングは様々です。

 初めて(A)を通る時に発生することもあれば、

 7~8回目で発生することもあります(2~4回目で発生することが多いです)。

 また、約9000件のデータをエラーなしに取得し終えることもあります。

 (今は開発中ですが、本番では約4万件のデータを取得したいと思っています)

・ログインしてからの時間はあまり経っていません(プログラムを流すまでに1分程度でも、10秒程度でもエラーはおきます)。

・昨日まで発生しなかったのですが、今日になって、そこより前のソースを何も触っていないのに、急に発生するようになりました。

・qo.setBatchSize(500);の部分を(50)や(1000)に変えてみても、様々なタイミングで同じエラーが発生します。

 

困ってしまいまして・・・。

原因と解決策をご存じの方がいらっしゃいましたら、よろしくお願いします。

 

――――――

追記

(A)より前の、qr =ButtonIventLogin.stub.query(queryS);の箇所で

『SERVER_UNAVAILABLE: Unable to complete the creation of the query cursor at this time, please retry your query later.』

も頻繁に発生するようになってしまいました。

ログインから時間はたっていません。

何かご存知の方、よろしくお願いします。

 

  • April 06, 2011
  • Like
  • 0

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

 

たとえば、

取引先Objと、取引先責任者Objを使い、

 

<apex:pageBlockTable value="{!account.Contacts}" var="contact" >
           <apex:column value="{!contact.id}"/>
       <apex:column value="{!contact.name}"/>   
</apex:pageBlockTable> 

 

のようにすると

1つの取引先に紐づく取引先責任者が、複数あれば、複数が返されます が、

その並び順はどのような並び順なのでしょう。

見たところ、Id順でも、Name順でも、作成日順でもないようなのですが・・・。

また、順番を制御する方法はありますでしょうか。

 

おわかりの方がいらっしゃいましたら、よろしくお願いいたします。

  • July 02, 2010
  • Like
  • 0

Visutalforceページにアクセスしたときのシステムログはどうやったら見られるのでしょうか?

前は何もせずにシステムログのウィンドウに表示されていたと思うのですが、

今は出力されません。何かすれば出力されるようになるのでしょうか?

 

 

 

  • March 26, 2010
  • Like
  • 0

datetime型のデータをページに表示する際、タイムゾーンを指定する方法はありますか?(<apex:outputText>を使ったりして)

DBからの値はいつも標準時間しかとれないので、画面表示時日本時間がほしいのですが。。。

 

ご教授いただけたら幸いです。

よろしくお願いいたします。

  • March 01, 2010
  • Like
  • 0