PDF関数を使うとこんなことできます
どうも、dai365です。いつもポエムばかり書いていますので、今回は関数ポエムを書いてみたいと思います。
ところで皆さんはPDF関数を使ったことはありますか?この機能、試験段階なんですけど、私は出始めからめっちゃ気に入って使っています。
特に帳票周りでは威力ものすごいです。とはいえ、試験段階当初は相当文字化けしてましたし、今は私の運用においては実害がないレベルなのでこうして記事化しようと思った次第です。(最後にオチが待ってます)
ちなみにポエマーなので何が文字化けするかとかの検証はその道の方にお任せします。今年の初めに検証した時点では数字大文字がNGだった記憶があります。
この関数使うと、画面全体とかギャラリーだけとかをPDFにすることが出来ます。
私がよく多用するパターンは以下の2つ
➀ギャラリーを含む画面全体をボタン押したらOutlookの添付ファイルにして送信
➁ギャラリーを含む画面全体をボタン押したらSharepointに保存
まあ、私が考え出したわけでもなんでもなく、いつものようにRezaさんのおかげです。
この動画、何度見たことか(笑)、まさに私のバイブルです。
以前やってみたこと
いや、PDF関数でしょ、動画のとおりに写経しただけでしょ、そんな声が聞こえてきそうですね(笑)、実際そうなんですけどね。
実は、今年の春先にとある日報アプリをリリースして、リリースして一月ほどたったところでこんな問題が起きました。
当初の私の想定はひと月=多くても25営業日程度、なら25行で十分⇒1ページの想定でした。
それがですね、ひと月になんとなんと70回=70行もある場合があることに気づいたんです。
もちろん最初からPDF関数使って作りこんでましたので、1ページにボタン一つしか作ってませんよね、でもそれでは26行目以降はちゃんと印刷されない・・・
さて、どうしたものか・・・ということで、このときはベタに最大4ページなら4画面作って遷移すればいいと思いそのような対応をしました。
まあ、これはこれで動作もしますし、何ら問題もないのですが・・・
今回やってみたこと
前回やったときにベタにページ数の分画面を作るというなんとも泥臭い解決方法しか思い浮かばなかったもので・・・
今回は1画面の中で完結させることにチャレンジ!!
今回のネタは年末恒例の有馬記念の暦年結果表示!!
しょーもないネタですねえ(笑)、しかもこんなのPDF化してどうしようと、まあそこは皆さんお使いの帳票だと思って見てやってください。
まずは画面のOnVisibleに変数設定します。
で変数切り替え用に-ボタンを設置して以下のように
次にギャラリーにフィルターかけてみましょう
これで-ボタン押せば、開催年は切り替わりますね
➀メールの添付ファイルとしてPDFを送信する場合
➁SharepointにPDFとして作成する場合
これはフロー必要なので以下のような感じ
まあ、このあたりはRezaさんの動画まんまですね
今回のチャレンジ!?
今回チャレンジというか、いやそれ難易度全然低いだろというお試しを一つしてみました。
春先の私のレベルはページごとに画面作っちゃうようなレベルです。でも今回は変数を用意してみました。
でベタにこう書いてみました。
何のことはないPDF作成する、変数更新する、PDF作成する、を繰り返しています。
例によって回数はベタに書きます。
これ、ちゃんと動くんですよ(笑)
正直、ページ数が限定されているのならこれでもいいのかなあと、実装する際にはif文かswitchで書くと思いますが。
で、ですね、こんなの恥ずかしいよなあと思いながらforall sequenceを試してみたんですが・・・
UpdateContext関数はこういうことらしいですね。
どうにかして連続印刷してみたい
とある方のアドバイスによりコレクションを使ってみました。
変数からコレクションに方針変更です!
まずは画面のOnVisibleにこんな感じで仕込みます。
ギャラリーのフィルターもこんな感じに
でこんなふうにボタンに仕込んでみました
今回のデータは有馬記念31年分の結果が格納されています。
つまり31回繰り返せば全ページ印刷するという算段です。
フロー走らせて、コレクションの値を1つ減らす(ここは用途に応じて)
さあ、上手く動くでしょうか?
順調に作成されてますね。どうやら上手くいったようです。
最後の1回Updateif余計かもしれませんね、1991年分はデータないので(笑)
まあ、そのへんはどうにかしましょう。
いずれにせよ1画面完結のPDF作成がこれにて完成ということで今回は終わります。
と思いきや・・・
問題発生
とあるアプリを作成していたら、あれれ?全角英数字表示されないやん
あらまあどうしましょう、ということで策を練る・・・
いやー慌てましたねえ、なんせ住所必須のアプリですから・・・
このままじゃあマンションの部屋番号全くわかりませんからね(笑)
ということで強制変換を試みる
この記事、お世話になりました。
ということで無事解決・・・したんだよなホントに
つづき
うーん、有馬記念のデータはたまたま年って列があったから減算できたけど、普通はそうはいかないよなあ、ということで
ClearCollect(ct,1);ClearCollect(colyear,Distinct(arimadata,year));ForAll(colyear,Collect(colnumber,{year:ThisRecord.Value,no:CountRows(colnumber)+1}))
ctはカウンター代わりの変数
colnumberにはnoに1からの連番の値、yearには年の値があるだけ入ります
でそれを動かしたうえでギャラリーには
Filter(arimadata,year=Last(FirstN(colnumber,First(ct).Value)).year)
でPDF作成ボタンには
ForAll(Sequence(CountRows(colnumber)),PDF作成.Run({file:{name:Last(FirstN(colnumber,First(ct).Value)).year&"arimadata.pdf",contentBytes:PDF(PDF,{Orientation:"Landscape"})}});UpdateIf(ct,Value=Value,{Value:Value+1}))
無事出来たようです
拙い関数ですが、どうにか作成することが出来ました。
ということで関数ポエムでした。