データテーブルを特定条件で抽出した複数行の一部列を一括で更新する方法について教えてほしい。

やりたいことは以下の画像です。
データテーブルAに発行番号列があり、値が空白の状態から
取引先列と受領日列が同じ値ごとに発行番号を自動採番、データテーブルAに更新したいです。
かつ、
データテーブルAを更新後、データテーブルBにも該当する行を更新したいです。

自分でやってみた事としまして
まずデータテーブルAを「データテーブルの各行」で繰り返し
「データテーブルをフィルター」でcurrentrowの値「取引先」「受領日」でフィルター。

取引先列=CurrentRow(“取引先”)
受領日列=CurrentRow(“受領日”)

データテーブルA’を出力。
データテーブルA’を「データテーブルの各行」で繰り返し、代入を使用して発行番号をデータテーブルA’に格納したのですが、
ここからどうデータテーブルAの発行番号を更新するかで迷っています。

そのためお聞きしたい事としまして
上記の続き方法でデータテーブルAにどうやって発行番号を更新すれば良いか
もしくはもっと楽な方法がないか確認したいです。
かつデータテーブルBへの更新方法についても教えてほしいです。
宜しくお願いします。

こんにちは

以下いかがでしょうか?

Sample20231227-1a.zip (8.9 KB)

こんばんは
ご丁寧にzipファイルありがとうございます。
ただ、studioが会社PCにしかインストールしておらず、
自宅PCがMACの為、xamlファイルが見ることができませんでした。
もし宜しければ繰り返しの際の代入の右辺式が何を記述しているか教えていただけないでしょうか?

こんにちは

もし宜しければ繰り返しの際の代入の右辺式が何を記述しているか教えていただけないでしょうか?

Dictionary生成

 dict = dt1.AsEnumerable.GroupBy(Function(r) Tuple.Create(r("取引先").ToString,r("受領日").ToString)).Select(Function(g,i) Tuple.Create(g,i)).ToDictionary(Function(t) t.Item1.Key,Function(t) "xxxx-"+(t.Item2+1).ToString("D6"))

ループの中

CurrentRow("発行番号")=dict(Tuple.Create(CurrentRow("取引先").ToString,CurrentRow("受領日").ToString))

になります。
上記はTupleを使っていますが、例えば両者をtabで結合した文字列をキーにしてもよいと思います。

たびたび申し訳ございません。
dictはdictionary型の変数でしょうか?
その場合、keyとvalueは何の型を設定すればよろしいでしょうか?

上記サンプルでは、Dictionary<Tuple<String,String>,String>になります。

Tupleになじみがなければ、2つの文字列をtab等で結合してString型をキーにしても大抵のケースは問題ないかと思います。

教えていただきありがとうございました!
発行番号を「取引先」「受領日」ごとに自動採番出来るようになりました。
ちなみに「dict」に代入する際の右辺式の最後「D6」がどういう意味なのか教えていただけないでしょうか?

また、dt2のif条件式とthenブロックの一つ目の代入の右辺式のそれぞれ隠れている部分を教えていただけないでしょうか?

宜しくお願いします。

数値に対する書式指定になります。詳しくは以下参照ください

また、dt2のif条件式と

dict.ContainsKey(Tuple.Create(CurrentRow("取引先").ToString,CurrentRow("受領日").ToString))

thenブロックの一つ目の代入の右辺式

dict(Tuple.Create(CurrentRow("取引先").ToString,CurrentRow("受領日").ToString))

度々申し訳ございません。
データテーブルAの発行番号に関して最新の発行番号を取得して
そこから自動連番を行いたいです。
例えば、データテーブルAの発行番号列にすでに「xxx-000001」を記述されていた場合、
次に「xxx-000002」から連番できるようにしたいです。
現在、データテーブルAで最新番号を取得するフローを作成していまして、
最新番号をint変数(変数:発行番号int)に格納しています。
今回の場合ですと、「1」で格納しています。
この場合、dict変数の代入にはどのような式が必要でしょうか?

またデータテーブルBに関して
取引先列でなく別の列名「取引先名称」であった場合はどのようにすればよろしいでしょうか?
何度も質問を申し訳ございませんが、宜しくお願いします。

こんにちは

以下の式のitem2+11の部分を初期値にすると、その番号から始まります。

dict = dt1.AsEnumerable.GroupBy(Function(r) Tuple.Create(r("取引先").ToString,r("受領日").ToString)).Select(Function(g,i) Tuple.Create(g,i)).ToDictionary(Function(t) t.Item1.Key,Function(t) "xxxx-"+(t.Item2+1).ToString("D6"))

取引先列でなく別の列名「取引先名称」であった場合はどのようにすればよろしいでしょうか?

CurrentRow("取引先") とある部分を CurrentRow("取引先名称") とすればよいかと思います。

要望事項.xlsx (14.0 KB)
何度も申し訳ございません。
質問が詳細に書けていませんでしたので添付ファイルに書きました。
添付ファイルに記載の各sheetがやりたい事でして、教えていただけないでしょうか。

お忙しいところ、申し訳ございませんが宜しくお願い致します。

こんにちは
やりたいこと1は、前提条件にもよりますが、同じ重複キーで新規のレコードがないなら
単に発行番号が空欄のみになるようフィルターしたデーターテーブルを処理すればよいかと思います。
同じ重複キーで新規レコードがあるなら、既存の重複キーをキー、発行番号が値となるようなDictionaryを生成、データテーブルに対して該当する項目をアップデートした上で、上記と同じことをすればよいかと思います。

やりたいこと2は既存の実装でできていませんか?

はい、やりたい事1は前提条件が発行番号が空欄のみの行に対して実行します。
ただ自動で採番する番号がすでに採番された発行番号の続きから行いたいです。
その為、教えていただいたdictに代入する右辺式に対して+1づつ採番する番号を
すでに採番された発行番号の続きから出来るようにしたいと思っております。

やりたい事2に関しては
現状の実装ですと、今回の出力対象外の取引先C、取引先Dにも連番で採番されている為、
お聞きした次第です。

勉強不足で申し訳ございませんが、宜しくお願いします。

これは

以下の式のitem2+11の部分を初期値にすると、その番号から始まります。

に該当します。

やりたい事2に関しては
現状の実装ですと、今回の出力対象外の取引先C、取引先Dにも連番で採番されている為、
お聞きした次第です。

2つ目の投稿で掲載しているサンプルではそのようになりません。データテーブルAでしか採番をしていませんので、それがデータテーブルBに反映されることはありません。

1 Like

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.