2023年1月19日木曜日

Microsoft OneDriveを操作するAPEXアプリの作成(5) - ファイルとフォルダの操作

 ファイルの作成、更新、削除、およびフォルダの作成、更新(名前の変更)、削除を実装します。

最初にMicrosoft Graph APIを呼び出して、上記の操作を行うプロシージャを実装したパッケージMS356_ONEDRIVEを作成します。

以下のコードをデータベースで実行します。

すべてのプロシージャは引数p_credential_static_idとして、Azure ADで認証されたWeb資格証明を必要としています。ここで指定するWeb資格証明を、置換文字列に定義します。

アプリケーション定義の置換を開き、置換文字列としてG_CREDENTIAL_NAME、置換値はMS_AZURE_ADとします。

変更の適用をクリックし、保存します。


パッケージMS365_ONEDRIVEのプロシージャを呼び出す際に、引数p_credential_static_idに渡す値はアイテムG_CREDENTIAL_NAMEと指定できるようになりました。

これから、アプリケーションにドロワーのページを2つ作成します。ひとつはファイルの操作、もうひとつはフォルダの操作を行います。

最初に、ファイルを操作するページを作成します。

ページの作成を実行し、フォームを選択します。


ページ定義のページ番号は対話モード・レポートから呼び出す際の宛先として使用するため、必ず4を指定します。名前はFile、ページ・モードとしてドロワーを選択します。

データ・ソースはローカル・データベース、ソース・タイプとしてSQL問合せを選択し、SQL SELECT文を入力として以下を記述します。
select
    'this_is_dummy_data_for_item_id' "ITEM_ID"
    ,'this_is_dummy_data_for_folder_id' "FOLDER_ID"
    ,'this_is_dummy_data_for_file' "FILE"
from dual
ページ作成ウィザードによって作成されるページに、ページ・アイテムとしてP4_ITEM_ID、P4_FOLDER_ID、P4_FILEが作成されます。また、ページ・タイプにフォームを選んでいるため、ボタンとしてCREATE、SAVE、DELETEおよびCANCELも作成されます。

ページ・タイプがフォームの場合、ナビゲーションは作成されません。

次へ進みます。


主キー列1としてITEM_ID(Varchar2)を選択します。ITEM_IDの指定がない場合は作成のページ、指定がある場合は変更または削除を行うページになります。

ページの作成をクリックします。


ページが作成されます。

作成されたページに含まれるリージョンFileの識別のタイプを、フォームから静的コンテンツに変更します。また、ヘッダーの前にあるプロセス初期化フォームFileを削除します。


ページ・アイテムP4_ITEM_IDとP4_FOLDER_IDを選択し、識別のタイプを非表示、セッション・ステートのストレージをリクエストごと(メモリーのみ)に変更します。


ページ・アイテムP4_FILEを選択し、識別のタイプをファイル参照...に変更します。設定のファイルをパージするタイミングはEnd of Requestとします。セッション・ステートのストレージはリクエストごと(メモリーのみ)に変更します。

検証の最大値に値が設定されている場合は、空白にします。


左ペインでプロセス・ビューを開きます。最初にプロセスプロセス・フォームFileを削除します。


ファイルの作成、更新、削除を行うプロセスを作成します。

プロセスを作成し、識別の名前をファイルの作成とします。タイプとしてAPIの呼出しを選択します。設定のパッケージとしてMS365_ONEDRIVE、プロシージャまたはファンクションとしてCREATE_FILEを選択します。

サーバー側の条件のボタン押下時としてCREATEを選択します。


パラメータとしてp_file、p_folder_id、p_credential_static_idが現れますが、p_file、p_folder_idはデフォルトでページ・アイテムP4_FILE、P4_FOLDER_IDが選択されます。

残りのp_credential_static_idの値は、タイプをアイテム、アイテムとしてG_CREDENTIAL_NAMEを指定します。


ファイルの更新を行うプロセスを作成します。プロシージャまたはファンクションはUPDATE_FILE、ボタン押下時にはSAVEを選択します。パラメータp_credential_static_idとしてアイテムG_CREDENTIAL_NAMEを設定します。


ファイルの削除を行うプロセスを作成します。プロシージャまたはファンクションはDELETE_DRIVE_ITEM、ボタン押下時にはDELETEを選択します。


ファイルを操作するページは以上で完成です。

続いてフォルダを操作するページを作成します。作成手順はファイルのドロワーと同じです。

ページ定義のページ番号は5、名前はFolderとします。ページ・モードはドロワーです。データ・ソースのSQL SELECT文を入力として以下を記述します。
select
    'This_is_dummy_data_for_parent_folder_id' "PARENT_FOLDER_ID"
    ,'This_is_dummy_data_for_folder_id' "FOLDER_ID"
    ,'This_is_dummy_data_for_folder_name' "FOLDER_NAME"
from dual

主キー列1としてFOLDER_ID(Varchar2)を選択します。


作成されたページに含まれるリージョンFolderを選択し、タイプを静的コンテンツに変更します。また、ヘッダーの前のプロセス初期化フォームFolderを削除します。


作成されたページ・アイテムP5_FOLDER_ID、P5_PARENT_FOLDER_IDの識別のタイプを非表示にします。セッション・ステートのストレージはリクエストごと(メモリーのみ)とします。


ページ・アイテムP5_FOLDER_NAMEは、セッション・ステートのストレージをリクエストごと(メモリーのみ)に変更し、検証の最大値は80程度に拡張します。


フォルダの作成、更新(名前の変更)、削除を行うプロセスを作成します。

最初にプロセスプロセス・フォームFolderを削除します。


フォルダの作成を行うプロセスのプロシージャまたはファンクションは、CREATE_FOLDERです。ボタン押下時としてCREATEを選択します。


フォルダの更新をするプロセスのプロシージャまたはファンクションは、RENAME_FOLDERです。ボタン押下時としてSAVEを選択します。


フォルダの削除をするプロセスのプロシージャまたはファンクションは、DELETE_DRIVE_ITEMです。ボタン押下時としてDELETEを選択します。


パラメータp_item_idはデフォルトでアイテムが選択されません。アイテムとしてP5_FOLDER_IDを指定します。


フォルダを操作するページは以上で完成です。

ページ番号3のページFolderを開き、対話モード・レポートFolderよりファイルとフォルダの操作を呼び出せるようにします。

リージョンFolderにボタンを作成します。

識別のボタン名はCREATE、ラベルはCreateとします。レイアウトの位置として対話モード・レポートの検索バーの右を選びます。

動作のアクションとして、このアプリケーションのページにリダイレクトを選択します。


ターゲットをクリックし、リンク・ビルダー・ターゲットを開きます。

ターゲットのページはファイルの操作を実装したドロワーのページである4、アイテムの設定として名前P4_FOLDER_IDに値&P3_ITEM_ID.を設定します。


同様の手順にて、フォルダを作成するボタンを作成します。

識別のボタン名はCREATE_FOLDER、ラベルはCreate Folderとします。レイアウトの位置として対話モード・レポートの検索バーの右を選びます。

動作のアクションとして、このアプリケーションのページにリダイレクトを選択します。


ターゲットをクリックし、リンク・ビルダー・ターゲットを開きます。

ターゲットのページはフォルダの操作を実装したドロワーのページである5、アイテムの設定として名前P5_PARENT_FOLDER_IDに値&P3_ITEM_ID.を設定します。


すでに作成済みのファイルまたはフォルダを選択して、ドロワーを開く実装を追加します。

対話モード・レポートFolderのローカル後処理のSQL問合せに、以下の2つの列を追加します。ファイルの編集を行うL_EXIST_ITEMと、フォルダの編集を行うL_EXIST_FOLDERです。
,apex_page.get_url(
    p_page => 4
    ,p_items => 'P4_FOLDER_ID,P4_ITEM_ID'
    ,p_values => :P3_ITEM_ID || ',' || ID
) L_EXIST_ITEM
,apex_page.get_url(
    p_page => 5
    ,p_items => 'P5_FOLDER_ID,P5_FOLDER_NAME'
    ,p_values => ID || ',' || NAME
) L_EXIST_FOLDER


追加された列L_EXIST_ITEM、L_EXIST_FOLDERを選択し、識別のタイプを非表示に変更します。


列IDをクリックして、ファイルやフォルダの編集画面が開くようにします。

列IDを選択し、列の書式のHTML式として以下を記述します。



ファイルやフォルダの編集が完了し、ドロワーが閉じたときに対話モード・レポートFolderがリフレッシュされるように、動的アクションを作成します。このようにすることで、作成、更新、削除したファイルやフォルダが、ドロワーを閉じた時点で対話モード・レポートの表示に反映されます。ページ作成ウィザードを使ってレポートとフォームのページを作成すると、この動的アクションはウィザードが作成してくれます。

左ペインで動的アクション・ビューを開きます。ダイアログのクローズ上でコンテキスト・メニューを開き、動的アクションの作成を実行します。


作成された動的アクションの識別の名前は、ファイルおよびフォルダの編集とします。タイミングのイベントはダイアログのクローズ、選択タイプはリージョン、リージョンとしてFolderを選択します。


リージョンFolderがドロワーを開く操作を起動したHTML要素を含むため、タイミングのリージョンにFolderを選択しています。リフレッシュの対象だからではありません。

TRUEアクションを選択します。識別の名前をFolderのリフレッシュ、アクションとしてリフレッシュを選択します。影響を受ける要素として、リフレッシュの対象であるリージョン、Folderを指定します。


以上でファイルとフォルダの操作を行うページの実装は完了です。

アプリケーションの実装は以上で完了です。

最後の記事は、いくつか作業中に気付いたことを紹介します。

続く