バーコードリーダーコントロールの使い方について

# 動画でも解説しています
動画【PowerApps】バーコードリーダーコントロール①使用方法
<iframe width="560" height="400" src="https://www.youtube.com/embed/yuAutW8FDj8?si=CaBw9fBMGpNBXiwa" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# バーコードリーダーコントロールについて
廃止されたバーコードスキャナーコントロールの代わりに、高機能なバーコードリーダーコントロールが実装されています。
現在でも設定からバーコードスキャナーコントロールを使用することができますが、これから開発するのであればそれを使用する意味はありません。

左メニューの+アイコン➤メディア➤バーコードリーダーと選択すると、画面にバーコードリーダーコントロールが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/601e5b2c-4c5c-4a73-bb6b-12bc5b8c02d9.png)
見た目は「バーコードリーダー」と書かれたボタンですが、ツリービューで見るとバーコードマークが付いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/fbd89c83-03d3-4784-bc04-23f51501e4f8.png)
今のところ、プレビューで押してみてもモバイルアプリでないと警告が表示されて動作させることができません。
いちいち公開してモバイルアプリで動作確認しないといけないところが、このコントロールを使用した開発を難しくしている要因になっている気がします。
# ScanningModeプロパティ（スキャン モード）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/cdf91c74-2b3b-42c0-a3a1-486b7c2288af.png)

* `Automatically Scan`
バーコードを検出するとスキャンして元の画面に戻ります。いちいちボタンを押す必要がないので、素早くバーコードを読み込んで処理したい場合に適しています。

* `Select To Scan`
検出されたバーコードが枠で囲まれ、✅マークでスキャンします。
複数のバーコードがある場合に、正しいバーコードを選択して読み取りたい場合に適しています。

* `Scan Multiple`
複数のバーコードを繰り返しスキャンして、Subimitボタンで送信。複数のバーコードを処理することができます。

例えばこのようなドロップダウンコントロールを配置して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/77b138a4-e5a5-4654-a07b-69d428c15160.png)

ドロップダウンコントロールのOnChangeプロパティに以下のように記述
```
If(
    Self.SelectedText.Value = "Auto",
    UpdateContext({scan_type: 'BarcodeReader.ScanningMode'.AutomaticallyScan}),
    If(
        Self.SelectedText.Value = "Select",
        UpdateContext({scan_type: 'BarcodeReader.ScanningMode'.SelectToScan}),
        If(
            Self.SelectedText.Value = "multiple",
            UpdateContext({scan_type: 'BarcodeReader.ScanningMode'.ScanMultiple})
        )
    )
)
```
バーコードリーダーコントロールのScanningModeプロパティに
```
scan_type
```
変数「scan_type」を設定すれば、ユーザーが使用したいスキャンモードでスキャンすることが出来ます。

## BarCodeReader.Barcodes
スキャンしたバーコードの情報は、BarCodeReader.Barcodesに以下のようなテーブル形式で
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/c153346b-9a6e-44e1-9548-048a25cffcde.png)
バーコードの種類とバーコードの内容が保存されています。
バーコードリーダーを起動した時点で保存された内容はクリアされるようです。

# スキャンした内容をコレクションにする
バーコードリーダーコントロールのOnScanプロパティに以下のように記述
```
//スキャンしたコードをコレクション「col_code」に保存する
ClearCollect(
    col_code,
    BarcodeReader1.Barcodes
)
```
これで、スキャンしたらcol_codeに保存されます。
この場合はスキャンする度に前の内容はクリアされるので、
追加していきたい場合は、ClearCollectをCollectにしてください。

# ギャラリーのアイテム検索に使用してみる

バーコードリーダーの活用例です。
以下のようなリストをギャラリーで表示しておいて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/6e2ff38e-5681-464b-9b9d-19fd54f8f971.png)

バーコードでスキャンして得られる値で、ギャラリーを絞り込みます。
複数スキャンした場合にも該当するアイテムを表示したいのでForAll関数を使用します。

ギャラリーのItemsプロパティに以下

```
ForAll(
    col_code,
    LookUp(
        リスト名,
        user_id = Value
    )
)
```
第1引数のcol_codeを繰り返し処理するので、複数バーコードをスキャンした場合は、バーコードの数分繰り返されます。
第2引数でリストからuser_idが現在のValueに一致するアイテムを取得します。
これでギャラリーにはスキャンしたバーコードに対応したアイテムが表示されることになります。

備品にバーコードを貼っておいて、アプリで貸し出しの管理をする。
などアイデア次第で活用できそうですね。