隠れていた嫉妬 ソーシャルネットワーク
なんだ、あんまり面白くなかったな
エンディングロールが出たとき、そう思った。よくある話を、ザッカーバーグを奇人にし、ショーン・パーカーをイケイケの悪役に仕立て上げていっちょあがり。そんだけじゃないか。なんでこれが、アカデミー賞ノミネートなんだ?いい!と言ってるブログたちはなんなんだ?昔の映画との類似性なんてのを持ち出して、自分を飾っているだけじゃないか。
けれど、眠れない。いくつかのシーンが、繰り返し目の前に現れる。一度消した電気をまたつける。なぜだ?よくある話じゃないか!
そして気づく。
そうだ、よくある話なんだ。
自分の大学時代、そして今の自分と重ね合わせ、見たくない現実を突きつけられる。
スケールは違うが、一応、私も「創業者」だ。しかし、一人でやること以上のことを、今やるつもりはない。事業を大きくしてどうこう、なんてのは、正直考えの外だ。
だが、今夜は、繰り返し、大学時代の友人が現れる。思えば、私の最後の親友。お互い連絡はないが、最後の親友が、こう語る。
「おまえは、いつも小さくまとまりたがる」
「小さくまとまろうとすると、小さいことまで逃げていくぞ」
まるで、ザッカーバーグにFacebookの規模を大きくすることを解く、ショーン・パーカーのように。
そして、ザッカーバーグの陰鬱な感情・・・強烈なコンプレックスは、やはり田舎から大学にやってきた、という、私の昔のコンプレックスを呼び覚ます。わたしは、ザッカーバーグほどの才能はなかったから、そのコンプレックスを「仕方がない」と受け入れた。大学を卒業したら、田舎に帰って教師をするつもりだった。既存の権威、レールに乗ろうとする、エドゥアルドのように。
そして、既存の権威に乗ろうとした私は、教育実習前に、母校の先生とちょっとしたいざこざを起こした上に、当時の絶望的な教員採用数に直面し、出足がかなり遅れた就職活動をすることになった。
そのとき、最後の親友は言った。
「やっとその気になったか」
「でっかくいけ、でっかく!!」
私は、その言葉のまま、名の通った大企業ばかり、履歴書を送った。すると、2000年対応で人手が必要だった、銀行系のシンクタンクから採用通知が届き、今の私のキャリアが始まった。
そして、その親友は、関西系のTV局に就職していった。「でっかくいくぞ!」の言葉どおり。彼の名前は、名の通った番組のディレクターとして、今は見ることができる。
客観的に見れば、私はヤツに感謝しなければいけない。
しかし、どこかで嫉妬している。
オレは、本当に「おっきく」なる気になったのか?
ヤツの後を追いかけただけなんじゃないか?
幸いなことに、その親友とは別の業界で生きている。
もし、同じ業界ならどうだろう。もし、会社を二人で立ち上げていたりしたらどうなるんだろう。ザッカーバーグ、エドゥアルド、ショーン・パーカーのように、どちらかが、どちらかを「切って」いったんじゃないだろうか。今までは、君は必要だった。よくやってくれた。さよならだ。
ダメだ。そういうのには耐えられない。切るのも切られるのもたくさんだ。だから、会社はひとりでやろう。二年前、フリーランスになるときそう思い、今までやってきた。今のところ、大きなことは考えない代わりに、自分と家族くらいは養えている。
しかし。しかしだ。
大学からあと、親友らしいヤツは誰もいない。
親友とつらい別れをするのはイヤだ、と、思っていた私は、いまや親友すらいない。
ヤツの予言は正しかった。
「小さくまとまろうとすると、小さいことまで逃げていくぞ」
もう10年以上も会っていない、かつての親友に、わたしはまた、嫉妬しなおしている。
それが、眠れない夜の正体。
隠れていた嫉妬を思い出してしまうほど、多分この映画はいい映画なんだろう。
だけど、きらいだ。
ネタバレ注意 disってやる!!Battle Shp ヤマト
いや、ひどい。本当にひどい。
これをいい映画だ、と、本当に思っている人がいる、涙する人がいる、という事実に、心底から驚いてしまう。人はそれぞれ、と、いうわけなんだろうけれど、同じモノを見て、ここまで印象が違うというのは、戦慄を覚えるわけですよ。
思うにその違いは、ストーリーの矛盾だとか、安直なところが気になるかどうか、という点にかかってくるんじゃなかろうか。素直な心を持つ人は、派手な戦闘シーンとか、CGとかで「おお〜」となり、三文芝居の特攻連打で涙するんだろうなあ・・・
しかししかし、素直な心を捨ててしまった、あらふぉーの私にとっては、ストーリーがいけてなければ、どんなCGにも興ざめなわけで。
ということで、ストーリーが破綻しているヤマトを、こんなオレでも、全力でヤマトをdisってやるぜ!という回にしてみるわけであった。
(以下ネタばれ注意)
破ってはいけないお約束
SFの宇宙船ってヤツは、かっこよくしようと思うと、やっぱり実際の軍艦とかをモチーフにするのが定番だったりする。ガンダムもそうだし、マクロスとかもそうだ。
で、ここでひとつ、お約束が存在する。
宇宙空間は3次元なのに、船の下部の防御が絶対的に薄い、もしくはない、という事実を無視して、船のデザインはされなければならんのである。
本当に船の下部からの攻撃まで想定した戦艦をデザインすると、どうしようもなくかっこ悪いものしかできないので、これは、もう、本当にお約束としかいいようがない。
で、このお約束を見ている人に意識させてはいけない、というのも、やはりお約束。
思い出してほしい。船の下部を写した戦闘シーンがいままであっただろうか?アングルは、上斜め45度前後から真横のものばかりではなかったか?
そう、下からの攻撃に対する防御がない、ということを意識させないために、戦艦の戦闘シーンをロングアングルで撮るときには、上斜め45度から、よくて30度までに限定する必要があるのだ。もう、これは、見ている人をしらけさせないための、絶対のお約束といっていい。「下から攻めりゃいきゃいいんじゃね?」は、見終わってからの突っ込みトークであり、見ている間に冷静にさせ、この事実を気づかせてはイカんのである。
ところがところが。このお約束を、完全に無視しやがったのだ、このヤマトは!
その無視したエピソードが、第三艦橋が破壊されるところなのだが、まあ、要するに、下からなんだかペンチのでっかいのみたいのが現れて、第三艦橋を鷲掴みにする。んでもって、それが爆弾っていう設定で、第三艦橋をきりはなさないと、ヤマトが危ない!!という状況なわけである。
当然、下からのアングルでその様を見せるわけで、そこにはなんの対空防御もない、のっぺりとした下部が現れる。全部ここから攻めればいいよね、というのが丸分かり。
しかも、その前後がとんでもなくひどい。
このエピソードの前に、安藤君というサブキャラが一瞬出てくる。本当に一瞬、なんの脈略もなく、どこでなんの知り合いかも明示されず、キムタク扮する古代進の旧知の人間という設定で出てくる。そして、巨大ペンチが第三艦橋を鷲掴みにした際、古代進に、第三艦橋にいる安藤君に向けて「必ず助ける」というコメントを言わせる。が、爆弾につかまっているわけなので、気休め。そんでもって、ヤマトの外にいる黒木メイサ扮する森雪に、第三艦橋をミサイルで切り離せ、と、命令する。で、ミサイルどーんで、無重力状態にもかかわらず、第三艦橋は下に少し落ちていき、でっかいペンチごと爆発する。
心のきれいな人は、その前にあった、古代進の兄、古代守が沖田艦長を逃がすために盾になり、古代進が沖田艦長を「見殺しにしやがって!」となじる、というエピソードを思い出し、おお〜古代よ、お前も沖田艦長と同じ罪を背負ったんだな〜、うんうん、わかるよ、その気持ち〜と、涙するところであろうが、すれた私はそうはいかない。
もう、定番破りをした上に、さっさと爆発すればいいのに、爆発まで時間のかかる巨大ペンチを投入し、ないはずの重力があるみたいな見せかたをしないとつじつまが合わなくなるシーンを織り込み、さらにさらに、なんの必然もなく殺されてしまった安藤君という最強コンボ。映画館で笑いをこらえるのに必死になってしまうわけなのである。
しかし、さすがヤマト。これだけでは終わらない。
ここで、古代進と森雪のラブシーンをかぶせてくるのだ!「ひどい命令をしてすまなかった」「仲間を撃ってまった〜」んで、キスシーン。
うお〜、安藤君は古代と森がキスするために殺されちまうのか〜、もはや、新春かくし芸のパロディドラマなみの展開。
しかししかし!これだけでは許してくれないのだ、われらがヤマトは!!
さらなる衝撃はエンディング。なんと、森雪を「おかあさん」と呼ぶ子供が出てくるのだ!
い?い?い?キスシーンのあと暗転したけど、艦長代理がヤマトのなかで、森雪相手にやっちゃったってこと?そんなパロディAV真っ青の設定でいいのか??二人がやっちゃうために、安藤君は犠牲になったというのか???
答えろ!答えるんだ古代!!!
支離滅裂な真田・斉藤特攻
今回のヤマト、ガミラスの設定はちょっとワクワクした。「一部が全部であり、全部が一部である」水晶のような生命体なのである。各戦闘機だったり、戦艦だったりには、この「一部が全部であり、全部が一部である」水晶のような生命体が細かく憑依のような状態で乗っており、それぞれが独立して動くが、相互は瞬時に意思疎通できる、という設定である。
この設定は野心的だ。特に2時間という映画の尺の中で描くには、とんでもないハードルの高さだ。
なんでかっていうと、ガミラスを倒す、という状況を作り出すのに、これほど難しい設定はない。例えば、原作のように、デスラーが総統であるガミラスであるならば、上層部の連中をまとめてドカン、と、波動砲でやってしまえば、あとは烏合の衆なので、組織だった行動ができず瓦解する、というシナリオが書ける。しかし、「全部が一部であり、一部が全部である」生命体であるならば、この「上層部」という概念が存在しないため、いわばガミラスの全人口を極端に減らさないと瓦解しないわけだ。ガミラスを倒すためには、殲滅戦が必須の設定なのである。
しかし、ヤマトはその設定が出現するまで、基本的にガミラスの攻撃を避けて進んでいる。相当数のガミラス戦力を、地球とイスカンダルの間に残したまま進んでいるように見えるわけである。
その点で、この設定をどうやってつじつまを合わせ、持って行くのか?これは、脚本と監督の力量がとんでもなく高くないと・・・どうするんだろう。そうワクワクしたのである。
ところが。やはり我がヤマトは、私の想像のはるか斜め上を行く大技に出たのだ。
スターシアに会うために、ガミラス本星の洞窟に突入したヤマト一行。首尾よくスターシアにあったその帰り道、なんの必然性もなく突入部隊に入っていた柳葉扮する真田さんが、唐突にこう言い出すのである。
「まて!エネルギーの集まり具合からみると、ここがガミラスの中心だ!!」
「この中心を破壊すれば、地球への攻撃はとまる!!」
え??
今、何をおっしゃいましたか???
そう、この真田さんの、ガミラスの設定を根本から覆すこのセリフだけで、「どうするんだろう」という私のワクワク感を、まさに波動砲なみの破壊力で、我がヤマトは粉砕したのである!
これは笑うところなんだろう、きっと。ほれ、キムタクよ、笑いやすいように、「ちょっと、真田さん、そんな話、これっぽっちもなかったじゃないですか」もしくは、「そんなのしたら、今までの設定ぶちこわしじゃないですか」と、突っ込むのだ!!
と、思っているところに、古代と森は帰らせるのに、斉藤を特攻の道連れに指名。どんだけジャイアン設定なの?真田さん!!
もちろんこれは、原作白色彗星編に出てくる、白色彗星内の動力源爆破作戦における、真田・斉藤特攻を下敷きにしている。きっと、心のきれいな人は、斉藤が握り締める母からもらったお守りを見て、感涙するんだろう。名セリフである、「あわてず、急いで、正確に!」も、斉藤立ち往生も、忠実に再現だ!
あれ?再現って・・・これ、バラエティのパロディドラマでしたっけ??
そうか・・・そうだったんだ。これは、コメディなのだ!壮大なパロディ映画なのだ!!
進行が突っ込みなしの、ボケ連打で行われるという、高度なテクニックを使った、コメディだったのだ!そう思うと、合点がいく。100人いたら、1人か2人笑えばよし、それが本当に面白いネタなんだ!!わからないヤツは泣けばいいし、きょとんとしたまま、映画館を出ればいい。disりたければdisればいい。それがオレの生き方だ!!そういう魂の叫びが聞こえてきたぞ、ヤマトよ!!!
しかし、この高度なコメディセンスが、海外に受入られるかどうか・・・そこが問題だな、うん。
たまにはABAP ALV List その5
今回は小ネタ集でございます。
Excelダウンロード
REUSE_ALV_GRID_DISPLAYを使ったとき、標準のGUIにくっついているExcelボタンは、GUIの中にExcelが現れるパターンです。人情として、SE16データブラウザのALV GRIDみたいに、ローカルダウンロードした上で、Excel自動立ち上げの方式にしたいところ。
やり方は案外単純。
たまにはABAP ALV List その3で説明したように、自分のテストプログラムにGUIステータスをコピーしてきて、ExcelボタンのOKコードを&XXLにいたしましょう。もれなく、SE16チックなExcelダウンロードができます。
ちなみに、ExcelダウンロードのPOPUPで、「常に選択した書式を使用」というチェックボックスを入れてしまい、形式が変更できなくなったかたは、Note1125812あたりをごらんくださいませ。
表示長の固定
FIELDCATのOUTPUTLENを指定しても、指定長より長い表示長のデータが入っていると、自動で調整されちゃいます〜というあなた。そんんな方は、is_layoutのcolwidth_optimaizeに、spaceを明示的に設定してあげましょう。
まあ、パラメータのテキストに書いてあるので、ちょっと調べればわかることでございますが、備忘として・・・
一項目の最大表示長
128バイトだそうです、1項目の最大表示長。
で、この「バイト」ってやつが曲者。今のシステムは大抵UNICODEなので、文字によってバイト数が違います。半角英数は大抵一文字1バイト。全角の日本語は、大体1文字3バイト。ということで、全角テキストは42文字あたりが表示最大長です。
これ、もうちょっと表示できるようになった、という話を聞いた記憶があるんですが、Note発見できませんでした・・・
印刷
印刷ねえ、難しいんですよ、GRID Dysplayでは。
いや、やろうと思えばできるんですよ。けど、表示の横幅は半角256文字以下にしないと、うまく印刷できないんです。それ以上になると、右側が切れちゃう。大体、256文字ってのも、実際に印刷してみると小さくって仕方ないので、A4横だとやっぱり170文字が限界。
標準の挙動を追ってみたところ、どうも半角1054文字で自動で折り返す(2行明細にする)という仕様らしい。じゃあってんで、書式設定で256文字折り返し最大4回設定(合計1024文字分)にして、切れた部分を次のページに送ってみたんだけれども、その折り返し部分に全角文字が入ると、当然文字化け。
じゃあ、170文字以下に項目を限定するか、という話になるんですが、そも、GRIDにする目的は、広めに項目を用意しておいて、レイアウトでユーザさんに絞ってもらおうと思っているからやっているわけで、170文字なんてあっという間に超えてしまう。
ということで、「いや〜GRIDは印刷厳しいっすよ〜印刷用途があるんだったら、REUSE_ALV_LIST_DISPLAY使いましょうよ〜」と、言ってみるのが吉ですな。3行明細の表示レイアウトが設定できるので、170文字に収めるのに便利な感じです。
ま、こんな感じでおしまい!
たまにはABAP ALV List その4
前回までで、ラジオボタンを使ったALV Listを作ってみたので、今回はCheck BOXを使ったALVリストを作ってみようと思いあす、はい。
しかし、のっけからなんですが・・・
Internal use onlyなんですよ、これが
今回、FIELDCATのEDITオプションを使ってみるわけなんですが、型の定義を見てみると、このオプション、「Internal use only」ってコメントに書いてあるんですな。なので、うまくいかなくても、おまいらのせいだよ〜って、独逸人は言ってるのかしら、という気がします。
実際、ちょっと挙動が変なんですよね〜このオプションを使った項目は。
今回のチェックボックスネタでは問題ないんですが、純粋な編集項目として使おうとすると、最後の変更が表示用内部テーブルに反映されない感じなんですよ。Enterをおしたり(前提としてI_GRID_SETTINGSのedt_cll_cbオプションをONにすることが必要。後述します)、リフレッシュを押したりすると反映されるんですが、項目を変更し、Enterも何も押さずに何かのボタンを押した際、I_CALLBACK_USER_COMMANDで指定されているサブルーチンで表示用内部テーブルを取得すると、その項目の変更が反映されていない。ググったりしてみたものの、これといった解法がなく、素直にクラスを使って実装しろ、っつう話なのかしら、という感じでございます。BCALV_TEST_FULLSCREEN_EDITっていうテストプログラムが普通の環境ならあるはずなので、これを本格的に解析すれば、何かわかるのかもしれませぬが・・・ちょっと動かしてみた感じでは、項目単位での編集は、なんだかうまく動かなかったし。
なので、今回のやり方で今現在うまくいったとしても、将来的にはNGになる可能性あり、ということを前提に、見てもらいたいな〜という感じです。
ちなみに、将来的にもOKじゃなきゃヤダ!!という方は、ラジオボタンのやり方と同じやり方で、チェックボックスにhotspotをつけて、おされたらOnにする、というソースコードを、I_CALLBACK_USER_COMMANDで指定されているサブルーチンで書けばOKでございます。
チェックボックス対応 変更するところ
まず、構造を変更します。ラジオボタンの表示用にICONという項目を追加していましたが、これをCHAR1桁の項目に変更です。CHECK_BOXという項目名にして、新しい構造YTEST_ALV_LIST_1を今回のテストプログラムでは、事前に作ってみました。
このままREUSE_ALV_FIELDCATALOG_MERGEにこの構造を入れてやると、当然1桁の項目として認識されてFIELDCATができます。この項目はチェックボックスだよ〜ということを明示するため、fieldcatのcheckboxオプションをOnにします。そうすると、チェックボックスとして表示されるわけですな。
表示されたチェックボックスをON/OFFできるようにするために、editオプションもONにします。先に書いたんですが、Internal use onlyが気持ち悪い人は、editオプションではなく、hotspotオプションをONにして、自前でこの項目の内容をON/OFFしてくださいませ。ついでに、表示長も4文字分にして、チェックボックスの表示がつぶれてしまうのを回避しておきます。
このままだと、チェックボックスの変更がI_CALLBACK_USER_COMMANDで指定されているサブルーチンで認識されないので、I_GRID_SETTINGSのedt_cll_cbオプションをONにします。これをしておくと、正直なんでかわからないんですが、チェックボックスの変更が表示用内部テーブルに反映されるようになったりいたします。
サンプルソースコード
上記のような修正をしまして、実行ボタンを押すと、押されているチェックボックスの数を数え、POPUP表示するようにしてみました。iconのtype-poolはいらないような気がしますが、まあついでということで・・・
*&---------------------------------------------------------------------* *& Report YTEST_ALV_LIST *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT YTEST_ALV_LIST_1. type-pools:slis . type-POOLS:icon . data : itab_feildcat_alv type slis_t_fieldcat_alv . data : itab_out type TABLE OF YTEST_ALV_LIST_1. data : str_variant like DISVARIANT. data : pre_index like sy-tabix . PARAMETERS p_title type sy-title . START-OF-SELECTION . PERFORM data_get . PERFORM set_feildcat. PERFORM set_variant. PERFORM display_alv . *&---------------------------------------------------------------------* *& Form SET_FEILDCAT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM SET_FEILDCAT . data: l_str_fieldcat type slis_fieldcat_alv , l_tabix like sy-tabix . CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING I_PROGRAM_NAME = sy-repid * I_INTERNAL_TABNAME = I_STRUCTURE_NAME = 'YTEST_ALV_LIST_1' * I_CLIENT_NEVER_DISPLAY = 'X' * I_INCLNAME = * I_BYPASSING_BUFFER = * I_BUFFER_ACTIVE = CHANGING CT_FIELDCAT = itab_feildcat_alv * EXCEPTIONS * INCONSISTENT_INTERFACE = 1 * PROGRAM_ERROR = 2 * OTHERS = 3 . IF SY-SUBRC <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. READ TABLE itab_feildcat_alv INTO l_str_fieldcat WITH KEY fieldname = 'CHECK_BOX' . l_tabix = sy-tabix . l_str_fieldcat-checkbox = 'X'. l_str_fieldcat-edit = 'X'. l_str_fieldcat-outputlen = 4. * l_str_fieldcat-hotspot = 'X' . MODIFY itab_feildcat_alv index l_tabix FROM l_str_fieldcat TRANSPORTING checkbox edit outputlen . ENDFORM. " SET_FEILDCAT *&---------------------------------------------------------------------* *& Form DATA_GET *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM DATA_GET . data : l_out type YTEST_ALV_LIST_1 . select * from sflight into CORRESPONDING FIELDS OF table itab_out. ENDFORM. " DATA_GET *&---------------------------------------------------------------------* *& Form DISPLAY_ALV *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM DISPLAY_ALV . data : str_grid TYPE lvc_s_glay. str_grid-edt_cll_cb = 'X' . CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' I_CALLBACK_PROGRAM = sy-repid I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS' I_CALLBACK_USER_COMMAND = 'USER_COMMAND' * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = * I_BACKGROUND_ID = ' ' I_GRID_TITLE = p_title I_GRID_SETTINGS = str_grid * IS_LAYOUT = IT_FIELDCAT = itab_feildcat_alv * IT_EXCLUDING = * IT_SPECIAL_GROUPS = * IT_SORT = * IT_FILTER = * IS_SEL_HIDE = * I_DEFAULT = 'X' I_SAVE = 'X' IS_VARIANT = str_variant * IT_EVENTS = * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES T_OUTTAB = itab_out * EXCEPTIONS * PROGRAM_ERROR = 1 * OTHERS = 2 . IF SY-SUBRC <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. " DISPLAY_ALV *&---------------------------------------------------------------------* *& Form SET_VARIANT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM SET_VARIANT . str_variant-report = sy-repid. str_variant-handle = '0001'. ENDFORM. " SET_VARIANT *&---------------------------------------------------------------------* *& Form SET_PF_STATUS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM SET_PF_STATUS USING rt_extab TYPE slis_t_extab. SET PF-STATUS 'Y_TEST_STATUS' . ENDFORM. "SET_PF_STATUS *&---------------------------------------------------------------------* *& Form USER_COMMAND *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM USER_COMMAND USING u_c_ucomm LIKE sy-ucomm u_str_field TYPE slis_selfield. data : l_out type YTEST_ALV_LIST_1 . data: ct_checkbox type i , l_message type SYMSGV . case u_c_ucomm . when 'EXE'. clear : ct_checkbox . loop at itab_out into l_out . if l_out-check_box = 'X' . ct_checkbox = ct_checkbox + 1. endif. endloop. l_message = ct_checkbox . CALL FUNCTION 'POPUP_DISPLAY_MESSAGE' EXPORTING TITEL = 'TEST_POPUP' MSGID = '00' MSGTY = 'I' MSGNO = '001' MSGV1 = 'チェックされた数' MSGV2 = l_message * MSGV3 = * MSGV4 = . when OTHERS . ENDCASE . ENDFORM. "USER_COMMAND
たまにはABAP ALV List その3
忘れないうちにやってしまおう企画の第三弾。
今回で一応完成でございます。
前回までで、ずら〜っと選択されていないラジオボタンが、最初の列に表示されるようになったので、今度はボタンをクリックすると選択されるようにして、実行ボタンをつけ、押すとPOPUPで該当レコードのキーを表示する、というところまでやってみようかな〜と思います、はい。
事前に・・・GUIステータス作っときましょう
「実行ボタンをつけ」ってことなので、実行ボタンを作らねばなりませぬ。ということで、GUIステータスを作っておきましょう。
まず、REUSE_ALV_GRID_DISPLAYで使用されているGUIステータスですが、プログラムID:SAPLKKBL、ステータス:STANDARD_FULLSCREENとなっております。これを、自分のテストプログラムにコピーし、実行ボタンをつけるわけです。
今回のサンプルコードは、「YTEST_ALV_LIST」というプログラム名になっているので、それに「Y_TEST_STATUS」というステータスをコピーで作り、機能コード「EXE」というボタンを追加します。
アイコンはなんでもいいので、ご自由に!
GUIステータスの設定
REUSE_ALV_GRID_DISPLAYのGUIステータス設定方法ですが、I_CALLBACK_PF_STATUS_SETのパラメータを使います。
これ、ちょっと面白くって、ここにステータスを直接指定するのではなく、普通のレポートプログラムでGUIステータスを設定するときと同じように、「SET PF-STATUS 'Y_TEST_STATUS'」というソースコードを書いてあるサブルーチン名を指定することになっています。
サブルーチンのパラメータは、「rt_extab TYPE slis_t_extab」となっています。ここらへんは、REUSE_ALV_GRID_DISPLAYのパラメータの内容説明に書いておりますね。英語ですけど。
このパラメータは、使いたくないボタンがあったときに、その機能コードをrt_extabに放り込んでおけば、無効化されますよ〜てなものです。必要に応じて設定すればいい感じです。
さて、今回は、その名も「SET_PF_STATUS」というサブルーチンを作り、そこで、ステータスの設定をすることにいたします。
「ボタンが押されたとき」の対応
続いて、ラジオボタン自体の制御。
ラジオボタンだから、当然どれかをクリックすると、クリックされたところは黒くなり、今まで黒かったところは空白にしたいわけですな。
まず、「どれかをクリックする」というのをハンドルするために、ラジオボタンのフィールドのFEILDCATを変更。hotsoptをOnにします。こうすると、ラジオボタンが押されると、機能コードが発行されるんですな。
発行された機能コードを受け取って、処理を行うためには、REUSE_ALV_GRID_DISPLAYのI_CALLBACK_USER_COMMANDに、その処理が書いてあるサブルーチン名を指定します。
サブルーチンのパラメータは、「u_c_ucomm LIKE sy-ucomm」と、「u_str_field TYPE slis_selfield」となっています。u_c_ucommは、ALVリスト上で押された機能コードが入っていて、u_str_fieldは、押された行の情報だとか、処理終了後にALVリストをリフレッシュするか、とか、そういう指定をするための項目が入ってます。
今回は、「USER_COMMAND」という安直な名前でサブルーチンを作ることにいたします。
ハンドルする機能コードは、ラジオボタンが押されたときの機能コード「&IC1」と、上で作ったGUIステータスについている実行ボタン「EXE」。ラジオボタンの機能コードは、hotspotを指定すると、REUSE_ALV_GRID_DISPLAY側で自動で振られます、はい。
ちなみに、このサブルーチンには、OKコードの最初の文字が%以外のものがやってきます。最初の文字が%のものは、このルーチンにはやってこないで、ALVリストの標準機能が動きます。ダウンロードとか、印刷とか、そんなやつですな。
ということで、一応完成のサンプルコード
まず、ラジオボタンですが、今まで選択されていた行をpre_indexという変数でもっておき、別のラジオボタンが押されたときに、消す行として使います。最初は、DATA_GET内で、一行目にONのラジオボタンを設定しています。
REUSE_ALV_GRID_DISPLAYのパラメータは、I_CALLBACK_PROGRAM、I_CALLBACK_PF_STATUS_SET、I_CALLBACK_USER_COMMANDを追加。I_CALLBACK_PROGRAMは、I_CALLBACK_PF_STATUS_SET、I_CALLBACK_USER_COMMANDで指定するサブルーチンが存在するプログラム名を指定します。同じプログラム内にあるので、sy-repidを入れています。
USER_COMMAND内では、ラジオボタンを押されたときの制御と、実行ボタンを押されたときの制御を入れています。
ラジオボタンを押された場合は、pre_indexに入っている、今までONだった行の項目ICONを、空白ラジオボタンに戻します。u_str_field-tabindexに、選択されたラジオボタンの行が入っているので、該当の行のICONを、ONのラジオボタンに差し替えます。せっかく表示用の内部テーブルを差し替えても、u_str_field-refreshをONにしないとALVリストに反映されないので、フラグを忘れずにたてませう。リフレッシュ時に、カーソルの位置をキープしておきたいので、u_str_field-col_stableと、u_str_field-row_stableもONにしておきます。
実行ボタンの処理は、ちょいと簡単ですが、現在選択されている行のキー項目を、POPUP_DISPLAY_MESSAGEで表示させてみました。pre_indexにONになっている行が入っているので、表示用内部テーブルの該当行をREADし、値をとってきます。
*&---------------------------------------------------------------------* *& Report YTEST_ALV_LIST *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT YTEST_ALV_LIST. type-pools:slis . type-POOLS:icon . data : itab_feildcat_alv type slis_t_fieldcat_alv . data : itab_out type TABLE OF sflight . data : str_variant like DISVARIANT. data : pre_index like sy-tabix . PARAMETERS p_title type sy-title . START-OF-SELECTION . PERFORM data_get . PERFORM set_feildcat. PERFORM set_variant. PERFORM display_alv . *&---------------------------------------------------------------------* *& Form DATA_GET *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM DATA_GET . data : l_out type YTEST_ALV_LIST . select * from sflight into CORRESPONDING FIELDS OF table itab_out. l_out-icon = ICON_WD_RADIO_BUTTON_EMPTY . MODIFY itab_out FROM l_out TRANSPORTING icon WHERE icon is INITIAL . pre_index = 1. l_out-icon = ICON_RADIOBUTTON . MODIFY itab_out FROM l_out INDEX pre_index TRANSPORTING icon. ENDFORM. " DATA_GET *&---------------------------------------------------------------------* *& Form SET_VARIANT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM SET_VARIANT . str_variant-report = sy-repid. str_variant-handle = '0001'. ENDFORM. " SET_VARIANT *&---------------------------------------------------------------------* *& Form DISPLAY_ALV *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM DISPLAY_ALV . CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' I_CALLBACK_PROGRAM = sy-repid I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS' I_CALLBACK_USER_COMMAND = 'USER_COMMAND' * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = 'sflight' * I_BACKGROUND_ID = ' ' I_GRID_TITLE = p_title * I_GRID_SETTINGS = * IS_LAYOUT = IT_FIELDCAT = itab_feildcat_alv * IT_EXCLUDING = * IT_SPECIAL_GROUPS = * IT_SORT = * IT_FILTER = * IS_SEL_HIDE = * I_DEFAULT = 'X' I_SAVE = 'X' IS_VARIANT = str_variant * IT_EVENTS = * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES T_OUTTAB = itab_out * EXCEPTIONS * PROGRAM_ERROR = 1 * OTHERS = 2 . IF SY-SUBRC <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. " DISPLAY_ALV *&---------------------------------------------------------------------* *& Form SET_FEILDCAT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM SET_FEILDCAT . data: l_str_fieldcat type slis_fieldcat_alv , l_tabix like sy-tabix . CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING I_PROGRAM_NAME = sy-repid * I_INTERNAL_TABNAME = I_STRUCTURE_NAME = 'YTEST_ALV_LIST' * I_CLIENT_NEVER_DISPLAY = 'X' * I_INCLNAME = * I_BYPASSING_BUFFER = * I_BUFFER_ACTIVE = CHANGING CT_FIELDCAT = itab_feildcat_alv * EXCEPTIONS * INCONSISTENT_INTERFACE = 1 * PROGRAM_ERROR = 2 * OTHERS = 3 . IF SY-SUBRC <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. READ TABLE itab_feildcat_alv INTO l_str_fieldcat WITH KEY fieldname = 'ICON' . l_tabix = sy-tabix . l_str_fieldcat-icon = 'X'. l_str_fieldcat-hotspot = 'X'. MODIFY itab_feildcat_alv index l_tabix FROM l_str_fieldcat TRANSPORTING icon hotspot . ENDFORM. " SET_FEILDCAT *&---------------------------------------------------------------------* *& Form SET_PF_STATUS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM SET_PF_STATUS USING rt_extab TYPE slis_t_extab. SET PF-STATUS 'Y_TEST_STATUS' . ENDFORM. "SET_PF_STATUS *&---------------------------------------------------------------------* *& Form USER_COMMAND *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM USER_COMMAND USING u_c_ucomm LIKE sy-ucomm u_str_field TYPE slis_selfield. data : l_out type YTEST_ALV_LIST , l_message1 type SYMSGV , l_message2 TYPE SYMSGV , l_message3 TYPE SYMSGV. case u_c_ucomm . when '&IC1' . if pre_index is not initial . READ TABLE itab_out INTO l_out INDEX pre_index .. l_out-icon = ICON_WD_RADIO_BUTTON_EMPTY . MODIFY itab_out FROM l_out INDEX pre_index TRANSPORTING icon. ENDIF . READ TABLE itab_out INTO l_out INDEX u_str_field-tabindex. l_out-icon = ICON_RADIOBUTTON . MODIFY itab_out FROM l_out INDEX u_str_field-tabindex TRANSPORTING icon. u_str_field-refresh = 'X'. u_str_field-col_stable = 'X'. u_str_field-row_stable = 'X'. pre_index = u_str_field-tabindex . when 'EXE' . READ TABLE itab_out INTO l_out index pre_index . l_message1 = l_out-CARRID . l_message2 = l_out-CONNID. l_message3 = l_out-FLDATE. CALL FUNCTION 'POPUP_DISPLAY_MESSAGE' EXPORTING TITEL = 'TEST_POPUP' MSGID = '00' MSGTY = 'I' MSGNO = '001' MSGV1 = '選択されたレコード' MSGV2 = l_message1 MSGV3 = l_message2 MSGV4 = l_message3. when OTHERS . ENDCASE .
たまにはABAP ALV List その2
引き続き。今回は、ラジオボタンを表示するところまでいってみましょう。
REUSE_ALV_FIELDCATALOG_MERGEを使ってみる
前回のソースコードでは、FIELDCATをI_STRUCTURE_NAMEで自動生成したのだけれど、ラジオボタンを表示しようと思うと、自動生成されるFIELDCATじゃ足りないんですよ。ということで、REUSE_ALV_FIELDCATALOG_MERGEを使うことにしあす。
この汎用モジュールは、基本的にREUSE_ALV_GRID_DISPLAYのI_STRUCTURE_NAMEパラメータと一緒で、構造を渡してやるとFIELDCATを自動生成し、その結果をCHANGINGパラメータに返します。この返ってきたFIELDCATに細工して、REUSE_ALV_GRID_DISPLAYに渡してやることで、ラジオボタンを表示させませう、というお話ですな。
ラジオボタンの表示のさせ方は、
・構造にCHAR4桁の項目を追加する
・表示用データの該当項目部分に、表示させたいアイコンのコードを放り込む
・該当項目のFIELDCATのiconパラメータをONにする
こんな感じ。
じゃ、やってみるべ。第二回ソースコード
まず、構造「YTEST_ALV_LIST」をABAPディクショナリでつくりあす。最初に「ICON」というCHAR4桁の項目を作り、その後ろはsflightの項目と一緒にします。
その構造を使って、REUSE_ALV_FIELDCATALOG_MERGEを呼び出し、FIELDCATを自動生成します。FORM SET_FEILDCATがその部分で、 I_STRUCTURE_NAMEにYTEST_ALV_LISTを指定し、自動生成したFIELDCATをitab_feildcat_alvに入れています。
itab_feildcat_alvの中身そのままだと、ICONの項目は4桁の文字としてFEILDCATが作られています。そこで、ICONの項目に対するFEILDCATパラメータ内iconパラメータに「X」を入れ、アイコン表示を指定します。これで、表示する内部テーブル内の値に応じた、アイコンを表示する設定になります。
で、表示用の内部テーブル側に、表示するアイコンの値を入れます。
FORM DATA_GETをちょっと変え、データの取得結果は、構造「YTEST_ALV_LIST」を参照したitab_outに入れます。項目iconは、各レコードブランクになっているので、ラジオボタンを表示させるコードをセットします。
*&---------------------------------------------------------------------* *& Report YTEST_ALV_LIST *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT YTEST_ALV_LIST. type-pools:slis . type-POOLS:icon . data : itab_feildcat_alv type slis_t_fieldcat_alv . data : itab_out type TABLE OF sflight . data : str_variant like DISVARIANT. PARAMETERS p_title type sy-title . START-OF-SELECTION . PERFORM data_get . PERFORM set_feildcat. PERFORM set_variant. PERFORM display_alv . *&---------------------------------------------------------------------* *& Form DATA_GET *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM DATA_GET . data : l_out type YTEST_ALV_LIST . select * from sflight into CORRESPONDING FIELDS OF table itab_out. l_out-icon = ICON_WD_RADIO_BUTTON_EMPTY . MODIFY itab_out FROM l_out TRANSPORTING icon WHERE icon is INITIAL . ENDFORM. " DATA_GET *&---------------------------------------------------------------------* *& Form SET_VARIANT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM SET_VARIANT . str_variant-report = sy-repid. str_variant-handle = '0001'. ENDFORM. " SET_VARIANT *&---------------------------------------------------------------------* *& Form DISPLAY_ALV *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM DISPLAY_ALV . CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' * I_CALLBACK_PROGRAM = ' ' * I_CALLBACK_PF_STATUS_SET = ' ' * I_CALLBACK_USER_COMMAND = ' ' * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = 'sflight' * I_BACKGROUND_ID = ' ' I_GRID_TITLE = p_title * I_GRID_SETTINGS = * IS_LAYOUT = IT_FIELDCAT = itab_feildcat_alv * IT_EXCLUDING = * IT_SPECIAL_GROUPS = * IT_SORT = * IT_FILTER = * IS_SEL_HIDE = * I_DEFAULT = 'X' I_SAVE = 'X' IS_VARIANT = str_variant * IT_EVENTS = * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES T_OUTTAB = itab_out * EXCEPTIONS * PROGRAM_ERROR = 1 * OTHERS = 2 . IF SY-SUBRC <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. " DISPLAY_ALV *&---------------------------------------------------------------------* *& Form SET_FEILDCAT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM SET_FEILDCAT . data: l_str_fieldcat type slis_fieldcat_alv , l_tabix like sy-tabix . CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING I_PROGRAM_NAME = sy-repid * I_INTERNAL_TABNAME = I_STRUCTURE_NAME = 'YTEST_ALV_LIST' * I_CLIENT_NEVER_DISPLAY = 'X' * I_INCLNAME = * I_BYPASSING_BUFFER = * I_BUFFER_ACTIVE = CHANGING CT_FIELDCAT = itab_feildcat_alv * EXCEPTIONS * INCONSISTENT_INTERFACE = 1 * PROGRAM_ERROR = 2 * OTHERS = 3 . IF SY-SUBRC <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. READ TABLE itab_feildcat_alv INTO l_str_fieldcat WITH KEY fieldname = 'ICON' . l_tabix = sy-tabix . l_str_fieldcat-icon = 'X'. MODIFY itab_feildcat_alv index l_tabix FROM l_str_fieldcat TRANSPORTING icon . ENDFORM. " SET_FEILDCAT