みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
3年分の総勘定元帳(GL)データから、キーワードに一致する取引を検索したいと
考えております。
例えば、下記、フィールドの並びで
GLそのものの入っている 「GLテーブル」 と キーワード検索をするブランクの「検索条件テーブル」があります。
<フィールドの並び>
ID | 仕訳日 | 仕訳番号 | 仕訳枝番 | 勘定科目番号 | 勘定科目名 | 通貨名 | 借方金額 | 貸方金額 | 摘要1 | 摘要2 | 相手先コード | 相手先名 | 備考 |
1| 2021/10/31 | A000011 | 001 | 0001-00 | 現金 | JPY | 2,000 | 0 | 支払 | 顧客 | C00001 |〇〇会社| 10月分xx費 |
検索条件は、「検索条件テーブル」に同じフィールドの並びのExcelに入力したものを使いたいと考えております。
(実際にはキーワードが沢山あるため手入力は難しいため)
<検索条件テーブル インポート条件例>
ーーーーーーーーーーー
ID | 仕訳日 | 仕訳番号 | 仕訳枝番 | 勘定科目番号 | 勘定科目名 | 通貨名 | 借方金額 | 貸方金額 | 摘要1 | 摘要2 | 相手先コード | 相手先名 | 備考 |
飲食
交際費
喫茶
ギフト
贈答
寄付
販売促進費
贈答
>=10000
JPY
○○会社
2021
ーーーーーーーーーー
(上記は表示が崩れる可能性があるため、条件に入っている内容をテキスト表示)
勘定科目名:交際費、販売促進費
摘要欄1:飲食、喫茶、贈答
摘要欄2:ギフト、贈答、寄付
借方金額:>=10000
通貨名:JPY
相手先名:〇〇会社
仕訳日:2021
のように、各フィールドにランダムに入っています。
どこのフィールドにいくつ条件を入れるかは、検索の都度変わります。
検索条件が例えば「摘要1」にしか入っていない場合は、
この掲示版の過去のQ&Aを参考にさせて頂き、
以下のスクリプトを使って検索することができました。
<スクリプト ”テスト”>
レイアウト切り替え[ 「検索条件」 (検索条件) ;アニメーション:なし]
レコード/検索条件/ページヘ移動 [最初の]
Loop
コピー[ [ 選択;検索条件::摘要1 ]
レイアウト切り替え[ 「レイアウト 2」 (GLテーブル) ]
検索条件を変更
新規レコード/検索条件
貼り付け[ 選択;[ GLテーブル::摘要1 ]
検索実行[ ]
レイアウト切り替え [ 「検索条件」 (検索条件) ;アニメーション:なし]
レコード/検索条件/ページヘ移動 [ 次の; 最後まできたら終了:オン]
End Loop
レイアウト切り替え[ 「レイアウト 2」 (GLテーブル);アニメーション:なし ]
ーーーここまでスクリプト
上記のように複数フィールドにまたがった条件の場合は、
スクリプト ”テスト” のコードでは検索できませんでした。
条件欄にブランクがあると
スクリプト ”テスト” をフィールド名毎につくって、つなげたスクリプトにしても
1フィールド目(ここではID)がブランクなので、
最初にキーワードが入っているキーワード(上記でいえば、交際費)が
IDの欄のキーワードのような設定になってしまうなど、うまくいきません。
検索条件で抽出されたデータを無事に抽出できましたら
抽出されたデータの仕訳番号を含むデータを3年分のGLから抽出し、
Excelシートにエクスポートしたいと考えております。
(キーワード検索の場合は、仕訳の借方、貸方が片方しか抽出されないこともあり、
借方、貸方が同じ金額にならないため)
恐れ入りますが、まだ使い始めたばかりなので、どうしたら解決できるのか
全く分かりかねますので、お手数をお掛け致しますが、
細かいスクリプトの書き方も含めて、御指南いただけましたら、
幸甚に存じます。
よろしくお願い申し上げます。
Last edited by 2022_Feb_QQ (2022-02-22 10:39:32)
Offline
FMの検索では、AND条件は1つの検索条件に、ORは追加の検索条件に入れないといけないので、ANDとORが混在しているこのような条件は、どこがANDなのか判別しないとできません。
この例の場合は金額以降はAND条件で勘定科目名と適用は行ごとにORだと思いますが、何か明確なルールがありますか?
himadanee さま
ご確認ありがとうございます。
画面だとわかりにくいですが、
すべてのキーワードは別々の行(レコード)に入れており、
「OR] 条件になっているという理解です。
よろしくお願いいたします。
Last edited by 2022_Feb_QQ (2022-02-22 08:29:21)
Offline
Excel上ではそのように入力されてますが、そのままFMの検索条件に取り込むと意図した検索になりません。
例えば最後の2行
相手先名:〇〇会社
仕訳日:2021
これはAND条件のはずです。(相手先名:〇〇会社のデータのうち仕訳日:2021のものだけを検索したい)
これをORにすると、「仕訳日は関係なくすべての〇〇会社のデータ」と「相手先名は関係なくすべての仕訳日:2021のデータ」を検索してしまいます。
ANDやORを日本語で「かつ」「または」と表現しても誤解する人はたびたび見かけるのであえて論理関数用語そのまま書きましたけど...
ANDは絞り込む動作、ORは広げる動作です。
himadanee さま
確かに3年分のGLから検索するという小生の説明では、「AND」と
読めてしまいますね。わかりにくい書き方で申し訳ございませんでした。
3年分のGLだけでなく、一旦、特定の条件で、絞ったGLから検索するときには、
その中のデータで2021と入っているもの、もしくは、 〇〇会社と入っているものという
条件にしたい時もあるというだけで、年度とか会社が「AND」に見えますが、
あくまでも、存在するすべてのフィールドのうち、複数のフィールドに
複数のキーワードを「OR」条件でいれた場合という
前提で御指南いただけましたら、嬉しく存じます。
よろしくお願いいたします。
Last edited by 2022_Feb_QQ (2022-02-22 09:00:24)
Offline
いや、その前提自体が多分間違ってます。
最初の例のExcelで検索条件を入力した人は、それなりのANDとORを組み合わせている意図があるはずです。
勘定科目名:交際費、販売促進費
摘要欄1:飲食、喫茶、贈答
摘要欄2:ギフト、贈答、寄付
これは、「勘定科目が交際費と販売促進費」のうち適用が「~」のもの(科目別にそれぞれ指定している)だけを検索したいということではないですか?
これを全部ORにしたら、意味のある検索になるとは思えません。
全部を OR 検索だとして、、
検索条件テーブルの1レコードで、
複数のフィールドに値が入力されている場合も有りますか?
有れば、それは AND 検索になるのでしょうか?
Offline
トピック投稿者の2022_Feb_QQでございます。
みなさま色々、ご質問、ご確認ありがとうございます。
himadenee さま
混乱させてしまって申し訳ございません。
キーワードはあくまでもすべて「or」条件でお願いします。
チボ さま
検索条件の1レコードで複数行に値を入力してしまうと
「AND」条件になるとの理解ですので、
1レコードには、どこか1か所のフィールドのみ
キーワードが入力されている状態を前提で考えております。
よろしくお願いいたします。
Offline
GLテーブルと検索条件テーブルの各レイアウトで、
フィールドのタブ順を同じに設定しておきます。
検索条件テーブルで
次のフィールドに移動
を繰り返し、値の有るフィールドに行ったらそこで値を変数にします。
GLテーブルで、
新規検索条件
上記と同じ回数
次のフィールドに移動
を繰り返し、変数を入力。
これを検索条件テーブルのレコード数分繰り返します。
このとき、
検索条件テーブルではブラウズモード
GLテーブルでは検索モード
ですから、
別ウインドウにして行き来を繰り返した方がいいでしょうか。。
それとも、
検索2回目以降を
対象レコードの拡大
で繰り返した方がいいかもしれませんね。
余談です
このサイトでは、全角スペースは半角に置き換わります。
横の位置合わせは半角スペースで送ればいいでしょう。
Offline
チボ さま
トピック投稿者の2022_Feb_QQでございます。
ご確認ありがとうございます。
また、全角・半角の扱いについて教えて頂きありがとうございました。
ご質問の件、初心者すぎて、理解が追い付いていないかもしれません。。。
GLテーブルと、検索条件テーブルの
フィールドの並び順は同じにしています。
検索条件は、必ずしも左にあるフィールドの方が
上のレコードに条件が入っているとは限らないため、
キーワードの入力位置のイメージの意図が伝わりやすくなるように
当初投稿のキーワードの交際費を2レコード目に移動してみました。
1フィールド目(ID)にレコードがない場合、
2フィールド目(仕訳日)にレコードがあるか判断する を
繰り返して、
どこかのフィールドで、
1行目のレコード行ではなく、
どのレコード行にデータがあっても取得できて、
また、次のレコードがあるフィールドの
1行目にレコードがあっても取得できる
というご提案ならば、小生の作りたいスクリプトになると思われます。
ウィンドウの行き来と対象レコードの拡大で
検索スピードはだいぶ異なるのでしょうか?
GLデータ自体は、1000万行ぐらいあってかなり重たいため、
なるべく検索スピードが速くなる方法を御指南いただけましたら、
幸甚に存じます。
よろしくお願い致します。
Last edited by 2022_Feb_QQ (2022-02-22 10:41:21)
Offline
1条件ごとに検索するより、複数の検索条件を構成して1回で検索した方が早いと思います。
FM19の「データAPIを実行」の出番のような気がする(リレーション関係なく他のテーブル=この場合検索条件からデータを取得できる。)んですが、使ったことないのでうまい使い方がわからない...
https://help.claris.com/ja/pro-help/con … a-api.html
私の提案は、
検索条件がどこにあっても構いませんよ。
必要なのはフィールドの並び順ではなく、
そのタブ順です。
レイアウトモードで設定ができます。
ヘルプのリンクです
https://help.claris.com/ja/pro-help/con … order.html?
スクリプトステップ
次のフィールドへ移動
は、なにも選択されていない状態だと
タブ順1が選択され、それ以降はそのタブ順通りに移動します。
1000万レコード!
それほどのは扱ったことがないので、
なんともですが、、
複数回の拡大より、1回のほうが早いでしょうが、、
テーブルの行き来より最初に全部の値を格納して、
それを検索条件に移したほうが早いかな?
それも可能ですが、スクリプトがちょっと面倒になりますか。。
Offline
himadanee さま
チポさま
ご提案ありがとうございます。
トピック投稿者の2022_Feb_QQでございます。
タブという機能があるのですね。
チポさまが、面倒と言われるほど難解なスクリプトを理解できるか
自信がありません・・・・。
固有名詞ぐらいは変更できると思うというレベルでございますので、
可能な限り、詳しいスクリプトの記載を教えて頂けましたら、助かります。
よろしくお願い申し上げます。
Offline
検索条件テーブルで
次のフィールドに移動
を繰り返し、
値の有るフィールドに行ったらそこで
変数に、そのフィールド名とその値を設定します。
その式は
List ( 変数名 ; Get ( アクティブフィールド名 ) ; Get ( アクティブフィールド内容 ) )
これを対象レコード全部に繰り返します。
これで、
変数の奇数行にはフィールド名、その次の行にはそのフィールドの値
が入力され、全部のレコードのリストになりますね。
これをGLテーブルの検索条件に入力します。
その方法は
フィールドを名前で設定
で
フィールド名の指定は
Get ( アクティブフィールドテーブル名 ) & "::" & GetValue ( 変数名 ; 2n - 1 )
値の指定は
GetValue ( 変数名 ; 2n )
nは1から始まるループの回数で、
検索条件テーブルの対象レコード数で終わります。
Get ( アクティブフィールドテーブル名 )
は適当なフィールドをアクティブにしておく必要があります。
これを新規検索条件を作りながら繰り返します。
Offline
チポさま
早速、ご説明ありがとうございます!
ご説明頂いた方法で、スクリプトをうまく書けるかどうか不安ですが、
トライしてみて、うまく動かなければ、また追加で質問させて頂きたいと
思います。
よろしくお願いいたします。
Offline
チポさま
トピック投稿者の2022_Feb_QQでございます。
トライしましたが、うまく書けませんでした。
レイアウト切り替え[ 「検索条件」 (検索条件) ;アニメーション:なし]
レコード/検索条件/ページヘ移動 [最初の]
Loop
変数を設定 [$LIST ; 値:List (Get (アクティブフィールド名) ; get (アクティブフィールド内容)]
次のフィールドへ移動
End Loop
レイアウト切り替え[ 「レイアウト 2」 (GLテーブル) ]
検索条件を変更
新規レコード/検索条件
Loop
変数を設定[$n ; 値:1]
レコード/検索条件/ページヘ移動 [最初の]
フィールドを名前で設定 [ Get ( アクティブフィールドテーブル名 )&"::"&GetValue ( $LIST; 2n-1; GetValue ( $LIST; 2n ) )]
End Loop
検索実行[ ]
レイアウト切り替え[ 「レイアウト 2」 (GLテーブル);アニメーション:なし ]
という風に書こうとしたのですが、
フィールドを名前で設定 [ Get ( アクティブフィールドテーブル名 )&"::"&GetValue ( $LIST; 2n-1; GetValue ( $LIST; 2n ) )]
のところのGet以降の式が入力してもOKがクリックできませんでした。
誠に申し訳ございませんが、スクリプトの書き方を御指南頂けませんでしょうか?
よろしくお願い申し上げます。
Last edited by 2022_Feb_QQ (2022-02-24 08:39:50)
Offline
#11で書いたAPIを使うと、ループしないでできそうなんですが、JSONは勉強不足なので
APIで検索条件テーブルからレコードを取得すると、空欄のフィールドは空文字列として取得する。
それをそのままAPIで検索条件に使うと、空欄のフィールドは条件がないことになる。(どのフィールドに入力されてるか探さなくていい)
ただ、そのままといってもレコード内のFieldDataのとこだけレコード数分だけ取り出すのに結局ループになってしまうのかな。XMLみたいにまとめて変換する操作ができるのかどうかわかりません。
While関数でスクリプト自体は1行で済むかもしれないが...
トピック投稿者の2022_Feb_QQでございます。
Loop
変数を設定 [$リスト; 値:List (Get (アクティブフィールド名 ) ; Get (アクティブフィールド内容 ))]
次のフィールドへ移動
End Loop
でフィールドデータを取得しようとしましたが、
テストデータでレコード数が4個だったのですが、
なぜか、4番めのレコードの値のみが取得される形で
ループされ、最終的に、最終フィールドの4レコード目の値しか
取得できませんでした。
恐れ入りますが、もう一度、スクリプトの書き方を御指南頂けませんでしょうか?
よろしくお願い申し上げます。
Offline
Loopを2重にして外側は「次のレコードへ移動」しないと、1つのレコードからしか取得しないですよ。
List()の中に$リストも入れないと、毎回上書きしてしまい最後のフィールドの値しか入りません。
前レスで書いた通り、
値のあるフィールドを探さなければだめですよ。
スクリプトです
Loop
次のフィールドへ移動
Exit Loop If [not IsEmpty ( Get (アクティブフィールド内容 ) )]
End Loop
変数 = List ( 変数名 ; Get ( アクティブフィールド名 ) ; Get ( アクティブフィールド内容 ) )
これが1レコード分です。
これを
Loopで対象レコード全部に回して、
検索フィールド名とその検索値のリストを作ります。
Offline
himadaneeさま、チポさま
トピック投稿者の2022_Feb_QQでございます。
御指南ありがとうございます。
最後のレコードまで移動しても
最後のレコードデータをループして取得し続けてしまい、
Loopから離脱できませんでした。
Loop
Loop
Loop
次のフィールドへ移動
Exit loop If [Get (アクティブフィールド名 ) = "最後のフィールド名" ]
Exit Loop If [not IsEmpty ( Get (アクティブフィールド内容 ) )]
End Loop
変数を設定 [変数名 ; 値: List ( 変数名 ; Get ( アクティブフィールド名 ) ; Get ( アクティブフィールド内容 ) )]
次のフィールドへ移動
Exit loop If [Get (アクティブフィールド名 ) = "最後のフィールド名" ]
End Loop
レコード/検索条件/ページへ移動 [次の; 最後まできたら終了 : オン]
End Loop
再度、御指南いただけましたら、嬉しく存じます。
よろしくお願い申し上げます
Offline
Loopが3重になってしまってますが?
検索条件なので空のレコードはない、必ず1つのフィールドにだけ値が入ってる、という条件なのでは。それであれば、最後のフィールドかどうかは関係ないです。
どの状態から実行するかによりますけど、最初に「最初のレコードへ移動」の必要があるのでは。
私の提案は
> 1レコードには、どこか1か所のフィールドのみ
> キーワードが入力されている状態を前提で考えております
これを前提に考えています。
ですから、
入力されたフィールドに行ったらそれ以降のフィールドを見に行きません。
2022_Feb_QQさんが掲示したスクリプトは
> "最後のフィールド名"
でループを抜けたときも変数を設定しています。
そこの値がなければ検索に影響は出ませんが、
思考としてはおかしいですよね。
また、最後のフィールドでループを抜けるのなら、
最初のフィールドからループを始めないとだめですよ。
> 最初に「最初のレコードへ移動」の必要があるのでは。
タブ順をちゃんと振ってあればどのフィールドから始めても、
値のあるフィールドにたどり着き、そこで終わることができます。
また、フィールドが選択されていない状態では、
次のフィールドへ移動
はタブ順1番のフィールドへ行きます。
Offline
チポさま、himadaneeさま
トピック投稿者の2022_Feb_QQでございます。
何度も御指南ありがとうございます。
おかげさまで、以下のスクリプトで、とりあえずは、
検索条件テーブルから、テーブル1の検索条件画面に
検索条件をすべてコピーすることができましたが、
チポさまのおっしゃるとおり、
>>入力されたフィールドに行ったらそれ以降のフィールドを見に行きません。
ということで、
入力されたフィールド以降は次のレコードに移動でOKです。
タブ順は設定はしていますが、なぜか、もともと書いていたスクリプトでは、
Loopを抜けてくれず、最後のフィールドまで行ってもまた同じレコードの段を
チェックするエンドレスループになってしまったため、
フィールド数をExit Loop IFの条件に加えて、Loopを脱する記載にしています。
当初、変数は、$で始まる名前にしていたのですが、
$のままだとListでうまく値を取得できなかったり、Loopがうまく動かなかったりしたため
一部の変数を$$で始まる名称にしております。
きっともっと美しい書き方があると思われますので、フィールドの移動の仕方と併せて
どこを修正すればよいのか、御指南頂けましたら、嬉しいです。
よろしくお願い致します。
----
ブラウズモードに切り替え
レイアウト切り替え [ 「検索条件」 (検索条件) ]
レコード/検索条件/ページへ移動 [ 最初の ]
変数を設定 [ $$カウント; 値:Get ( レコード総数 ) ]
変数を設定 [ $$カウント2; 値:1 ]
変数を設定 [ $$リスト; 値:"" ]
変数を設定 [ $$フィールドの数; 値:1 ]
Loop
Loop
Loop
次のフィールドへ移動
変数を設定 [ $$フィールドの数; 値:$$フィールドの数+1 ]
Exit Loop If [ $$フィールドの数>34 ]
Exit Loop If [ not IsEmpty ( Get ( アクティブフィールド内容 ) ) ]
End Loop
Exit Loop If [ $$フィールドの数>34 ]
変数を設定 [ $$リスト; 値:List($$リスト; Get ( アクティブフィールド名 ); Get ( アクティブフィールド内容 ) ) ]
End Loop
レコード/検索条件/ページへ移動 [ 次の; 最後まできたら終了 ]
変数を設定 [ $$カウント2; 値:$$カウント2∔1 ]
変数を設定 [ $$フィールドの数; 値:1 ]
Exit Loop If [ $カウント>$$カウント ]
End Loop
変数を設定 [ $$リスト要素数; 値:ValueCount ( $$リスト ) ]
レイアウト切り替え [ 「レイアウト1」 (テーブル1) ]
検索モードに切り替え [ ]
変数を設定 [ $n; 値:1 ]
Loop
新規レコード/検索条件
フィールドを名前で設定 [ Get ( アクティブフィールドテーブル名 )&"::"&GetValue ( $$リスト;$n); GetValue ( $$リスト;$n+1 ) ]
変数を設定 [ $n; 値:$n+2 ]
Exit Loop If [ $n+1>$$リスト要素数 ]
End Loop
Offline
>一部の変数を$$で始まる名称にしております。
これは、スクリプトが1つで完結しているので、正しく書けば必要ないはずです。
ローカル変数だとスクリプトが終わると変数が消えてしまうので、$$のグローバル変数の方がデバッグがしやすいかもしれませんが...
Exit Loop If [ $カウント>$$カウント ]
のところが、変では?$$カウントと$$カウント2を比較するんですよね?
どっちがどっちかわからないので、変数の名称をわかりやすくした方がいいでしょう。
[ Generated in 0.008 seconds, 9 queries executed - Memory usage: 637.77 KiB (Peak: 690.67 KiB) ]