過去の桐井戸端BBS (桐ver.8)
16955 特定の曜日を年月日から抽出したい katsuyoshi 2002/08/12-19:18
毎月毎週月曜日と木曜日に配達するのに配達先名簿を作成していますが
月の入力で下のような表を作成したいのですが
関数の中には無いような気がするのですが教えてください。

 8月
  1日  5日  8日  12日・・・・・・
   木   月   木   月 ・・・・・・
16957 Re:特定の曜日を年月日から抽出したい 郷司 2002/08/12-23:45
記事番号16955へのコメント
こんばんは、katsuyoshiさん
私もいつも質問ばかりなので、ちょっと考えてみました。

特定の曜日を年月日から抽出したい ということなので抽出だけですが。
関数で一発解決というのは世の中のどんなソフトでも汎用では無いと思います。

尚、年(&y)と月(&m)は、katsuyoshiさんの使い勝手のいい方法で
別に入力してやって下さい。


変数 整数{&y=2002,&m=8,&d,&n=1},{&week[10]}
for &d=1,#日(#月末( #年月日))
if (#曜日(#日時値生成(&y,&m,&d))="月" \
    .or #曜日(#日時値生成(&y,&m,&d))="木")
&week[&n]=#str(&d)+"日 "+#曜日( #日時値生成( &y , &m , &d ) )+"曜日"
&n=&n+1
end
end

こんなのでどうでしょうか?
16958 Re:特定の曜日を年月日から抽出したい pokopon 2002/08/13-08:20
記事番号16955へのコメント
katsuyoshiさん こんにちは

使用している桐のバージョン、使用形態(一覧表での操作、CMD、KEV?)、
入力データの種類、構成など、肝心な部分が不明なため、殆ど「霧」状態です。

また、桐は行単位でデータを処理しますので、
> 8月
>  1日  5日  8日  12日・・・・・・
>   木   月   木   月 ・・・・・・
の様に表示するためには、また一工夫必要ですが、それはおいて置いて。 (^^ゞ 

次のようなイメージですか?
データがあったとして(比較のため、[曜日]、[配達日]を追加)
年月日    担当者 曜日 配達日
2002/ 8/ 7  A    水
2002/ 8/ 8  B    木  配達
2002/ 8/ 9  C    金
2002/ 8/10  A    土
2002/ 8/11  B    日
2002/ 8/12  C    月  配達
2002/ 8/13  A    火
2002/ 8/14  B    水
2002/ 8/15  C    木  配達
2002/ 8/16  A    金

上記のように行単位での処理なのか、あくまで「列」で表示させたいのか?
(また、縦か横かの論議が始まりそうですが・・・・)

あくまで「特定の曜日を年月日から抽出したい」という趣旨であれば、上記のデータ並びと仮定して、

1.絞り込み 条件名 で .or の絞込条件を設定し、それを実行
 #曜日([年月日])="月" と #曜日([年月日])="木"
2.[配達日]に計算式をおいて、「配達」と自動計算させ、それを抽出する
 計算式:#COND(#曜日([年月日])="月" .or #曜日([年月日])="木","配達",1,#U)

でしょうか。一度に .or の絞込みはできないと思いましたが・・・・。

投稿内容だけで判断すれば、「ようわからん」状態です。
もう少し、ヒントを!!

16960 Re:特定の曜日を年月日から抽出したい katsuyoshi 2002/08/13-09:30
記事番号16958へのコメント
郷司さん、pokoponさんありがとうございました。
質問するには内容が不十分だったようですみませんでした。
使用している桐のバージョンは8sp6です。
毎月毎週の月曜日と木曜日に牛乳を配達していますが
その名簿を作成したいと思っています。
名簿は次のような内容でレポート出力したいと思っています。

8月     1日  5日  8日  12日  15日  19日
        木   月   木    月    木    月
顧客A    白   1   2   1    2    1    2
顧客B  コーヒー 2   2   2    2    2    2
顧客C   白    2   1   2    1    2    1

合計    白    3   3   3    3    3    3
      コーヒー 2   2   2    2    2    2

顧客A、B、Cはそれぞれ毎週購入する数量内容は決まっていますので
変更の申し出が無い限り月、木の購入数量内容に変更はありません。

毎月の配達明細表を作成しなければならないので8月と入力したら
曜日、日が上記のように自動取得できるようにしたいのですが。
できればtbl,wfm,viw,rptで作成したいと思っています。
縦とか横はこだわりませんが最終的には上記のレポート出力が目標です。
説明が下手ですみませんがよろしくお願いします

16966 Re:特定の曜日を年月日から抽出したい 今村 誠 2002/08/13-19:07
記事番号16960へのコメント
katsuyoshiさんこんにちは、集計と印刷が目的なら列項目を増やしたほうが良いのではないでしょうか。
白は普通の牛乳、コはコーヒー リはリンゴ牛乳の省略文字です。
8月  1日木 5日月 8日水 12日月 15日木 19日月
    白コリ 白コリ 白コリ 白コリ 白コリ 白コリ
顧客A 1   2   1    2    1   2
顧客B  2   2   2  2   2   2
顧客C   2   1   2   1   2   1
顧客D 2   1   2    1  
合計  322 321 322 231 2 3 2 3

項目名の並びを
1A白 1B白 2A白 3B白 3A白 3B白 4A白 4B白 5A白
1Aコ 1Bコ 2Aコ 3Bコ 3Aコ 3Bコ 4Aコ 4Bコ 5Aコ
1Aリ 1Bリ 2Aリ 3Bリ 3Aリ 3Bリ 4Aリ 4Bリ 5Aリ
#横合計([1A白],5A白)これで1ヶ月まとめて合計がでます。

フォームを作り、項目名のテキストに日付を表示するために
月の初めの曜日を算出するために[年][月][曜日]と[1A]を追加します。

[曜日]の計算式 /* 最初の曜日*/
#cond([年]>0 .OR [月]>0,
#対応番号("日,月,火,水,木,金,土",
#曜日(#日時値生成([年]+1988,[月],1+[1A]))),1,"")

[1A]の計算式 /* 最初の日付*/
#progn(#setq(&実行リターン,
#cond([年]>0 .OR [月]>0,
#対応番号("日,月,火,水,木,金,土",
#曜日(#日時値生成([年]+1988,[月],1))),1,"")),
#setq(&実行リターン,
#COND(&実行リターン<3,3-&実行リターン,
&実行リターン<6,6-&実行リターン,
1,8-&実行リターン+2)))

以下はフォームRPTのテキストオブジェクトに貼り付けるだけで項目は要らない
[4B]の計算式 [1A]+#cond([曜日]=2,3,1,4)+3*7
[5A]の計算式 #cond(#日(#月末(#日時値生成([年]+1988,[月],1+[1A])))<[1A]+4*7,"",1,[1A]+4*7)
16967 Re:ちょっと訂正 今村 誠 2002/08/13-19:55
記事番号16966へのコメント
よく確認したら以下の.orを.andに替えたが良いと思います。
また日付の1+[1A]の1+は不要ですので削除してください。
>[曜日]の計算式 /* 最初の曜日*/
>#cond([年]>0 .OR [月]>0,
>#対応番号("日,月,火,水,木,金,土",
>#曜日(#日時値生成([年]+1988,[月],1+[1A]))),1,"")
正しい[曜日]の計算式
#cond([年]>0 .and [月]>0,
#対応番号("日,月,火,水,木,金,土",
#曜日(#日時値生成([年]+1988,[月],[1A]))),1,"")


16973 ありがとうございました katsuyoshi 2002/08/14-10:57
記事番号16966へのコメント
今村 誠さんありがとうございました。
これから挑戦してみます。
成果は後日報告します。
これからもよろしくご教授ください。
16974 Re:特定の曜日を年月日から抽出したい 桐香 2002/08/14-12:25
記事番号16960へのコメント
はじめまして。
桐に限らずデータベースソフトの真価は1つの入力表で色々な表を自動作成するところにあると思います。
タイトルのご要望には反しますが、この場合はごく自然に売上帳を1つ作成すれば私はいいと思います。
項目は
@日付
A曜日
B顧客名
C商品名
D数量
E単価
F金額
などとして曜日とか金額は計算項目、顧客名や商品名は表引きなど
設定して入力の省力化を図る。
この表に配達した日にデータを入力する。もちろんまとめて入力してもかまいませんが。
データが入力されたら後は簡単
ご要望の配達表は、まず月で絞り込みをして後は転置集計で表が自動作成されます。
転置集計→グループ項目はB顧客名とC商品名、転置項目は@日付
集計項目はF数量となります。
また当然この売上帳を元に請求書や納品書なども発行できます。
タイトルのご要望にこだわると、配達日も現在は固定しているかも
しれませんが祭日前にまとめてとか、数量も増減がある場合などに対応が複雑になります。
後はフォームを作成しイベントで実行すればいいと思います。

ご要望の答えになっていないかもしれませんが、お許しを。

16978 縦か横か 今村 誠 2002/08/14-15:37
記事番号16974へのコメント
桐香さんはじめまして。
縦と横はいつも議論の対象になると思いますが。
レポートに合わせる表定義が一番良いと思います。
今回は、「月の配達用の名簿」がいるとのことだったので、
月ごとの納品書を作成したつもりです。
会社などでは、5行明細がよく使われるのが多いようですが、
そんなときは、5行をまとめて1レコードとすることが多いです。
請求処理では当然展開して明細をつけることになると思います。

日付が変更のことがあるなら印字日付を項目に持ち、編集初期値や
イベントで対応可能ではないでしょうか。
(修正があるときはその値未定義の時は計算式の値)
私が使うわけではないのでどちらがいいとはわかりませんが。
配達途中でチェックしたりする場面を考えると、月ごとのカード
を作成した方がいいように思いました。
 他にも配達順序みたいな連番を作成したらもっと使い勝手がいいように思いました。



16980 ごめんなさい。誤解です。 桐香 2002/08/14-16:23
記事番号16978へのコメント
今村様はじめまして。「縦横の議論」など滅相もない。
今村様のを見てその内容にUPしたわけではなく、
私はすでにUP文章を書いていまして、それを送るのが遅れただけなのです。確認せずに。
おまけに配達予定表を勝手に配達済表が必要と勘違いしたり、
なんとKATUYOSHIさんが〆のお礼のUPまでした後ではないですか。
私もいまじっくり見ていますが、色々なテクニックもがあることに感心しつつ、
管理人さんに私の削除が出来ないかと思っている盆初日です。

16982 Re:ごめんなさい。誤解です。 今村 誠 2002/08/14-17:08
記事番号16980へのコメント
桐香さん削除などとんでもないです。

>私もいまじっくり見ていますが、色々なテクニックもがあることに感心

テクニックがないので項目を増やすんです。(^_^)
商品が少ないと問題ないですが、ヤクルトさんみたいに10個以上もあると
項目増やすのも無理になるので、テクニックが必要になりますよね。
正統派の答え(桐楓さんの方法)から予定表や転置集計をして
明細表を作るのが一番ですが入力のしやすさなど難しいですね。

17000 まず、表を作ります natsu 2002/08/15-13:51
記事番号16960へのコメント
項目名が[15日(木)][19日(月)]・・・と毎月変更するとすれば
まず、そのような表を作る必要があります

とりあえず、次月の表を作りましょう
少し変更すれば、フォームやキー入力で指定月の予定表作成も可能です
カレンダー.tbl(項目数は5ヶの表)だけ用意して以下の一括処理を実行します
項目は[カウンタ]:カウンタ型,[日付]:日時型,[曜日]:文字列型,
[曜日条件]:整数型,[日付曜日]:文字列型
第一段階目的の表は次月予定.tblですが、これは自動作成されます

*************test1.cmd*************
代入 &昭和年=#日(#月末(#日数加算(#月末(#年月日),1)))
表 "カレンダー"
行削除 *,圧縮
繰り返し
行追加
&昭和年=&昭和年-1
条件 ( &昭和年=0 ) 繰り返し中止
繰り返し終了
置換 [日付]=#日数加算(#月末(#日時値),[カウンタ])
置換 [曜日]=#曜日([日付])
置換 [曜日条件]=#条件選択([曜日]="月",1,[曜日]="木",1,1,0)
置換 [日付曜日]=#STR(#日([日付]),2)+"日@"+[曜日]
絞り込み [曜日条件]=1

印字開始 "次月予定.csv"
印字 "配達先,商品,備考,", /*旅行だから配達止めてね!とかありそうなの
で[備考]も*/
繰り返し
印字 [日付曜日],
ジャンプ 行番号 = 次行
条件 (#EOF≠1 ) 印字 ",",
条件 (#EOF=1 ) 繰り返し中止
繰り返し終了
印字

印字 "a,b,c,",  /*以下8行はデータ属性設定のためのダミー行です*/
ジャンプ 行番号=先頭
繰り返し
印字 "1",
ジャンプ 行番号 = 次行
条件 (#EOF≠1 ) 印字 ",",
条件 (#EOF=1 ) 繰り返し中止
繰り返し終了

印字終了

ファイル変換 CSV,"次月予定","次月予定",項目名行=あり,自動設定=する
ファイル属性  強制改行文字 = "@" , 未定義項目値処理 = ゼロ /* 一
覧表印刷時に項目名で効果がわかります */
行削除 *,圧縮  /*データ属性設定のためのダミー行を削除します*/

*************test1.cmd*************
これで目的の表は完成です
ある表のレコード(縦のレコード)を項目名にした新しい表を作る方法でした
印字コマンドでCSVファイルにして、ファイル変換コマンドを使用すればOK
項目名が"02日@月"の様にするのは何故かは、長くなるので後のスレッドで

17001 次に、データをセット natsu 2002/08/15-13:53
記事番号17000へのコメント
次は、目的の表にデータを入れなければいけません
とにかく配達先の表が必要です 配達マスター.tblにしましょう
項目は[配達先]:文字列型,[商品]:文字列型(白、コーヒーなどの値集合にします),
[月]:整数型,[木]:整数型
この配達マスター.tblの管理は[配達先]をグループ項目とした伝票フォームで行ってください
さて、先ほどの一括処理の続きです
*************test2.cmd*************
表 "配達先マスター"
並べ替え {[配達先]昇順,[商品]昇順} 
表 "次月予定"
読み込み 表,"配達先マスター",編集表=する,{[配達先][配達先],[商品][商品] } 
*これなら、いくら商品種類が増えても配達先マスター.tblだけメンテナンスすれば次月予定.tbl
に反映されます
&実行リターン=4   /* 4番目の項目_月初の配達本数_から併合で処理を開始します */
繰り返し
ケース開始
ケース (#右側文字列( #項目属性( &実行リターン , 1 ) , 1 )  ="月")
   併合 "配達先マスター",置換,編集表=する,{[配達先]照合[配達先], [商品]照合[商品],&
実行リターン 複写[月] } /* &実行リターンと複写の間にスペースを忘れずに */
ケース (#右側文字列( #項目属性( &実行リターン , 1 ) , 1 )  ="木")
   併合 "配達先マスター",置換,編集表=する,{[配達先]照合[配達先], [商品]照合[商品],&
実行リターン 複写[木] }
ケース終了
&実行リターン=&実行リターン+1
条件 (&実行リターン>#項目数 ) 繰り返し中止
繰り返し終了

*************test2.cmd*************
17002 集計用の行を何とかして natsu 2002/08/15-13:55
記事番号17001へのコメント
続いて集計表を作る作業になります
別の表に書き出しますから、次月予定.tblを手作業で変更した後でも使えます
*************test3.cmd*************
表 "次月予定"
書き出し 表,"月集計表",*

表 "配達先マスター"
絞り込み 単一化={ [商品] }
並べ替え {[商品]昇順} 
表 "月集計表"
ジャンプ 行番号=終端
行追加 /* 配達マスター.tblに登録された商品を集計行用に追加します この行追加はデータ行と集計行の間を
1行あけるだけです */
読み込み 表,"配達先マスター",編集表=する,{[商品]}

編集表 "配達先マスター"
繰り返し     /* この繰り返しで、集計したい商品を1ヶずつ変数に取り出します */
&STR=[商品]

  編集表 "月集計表"
  絞り込み [商品]_&STR  /* これで集計行も含め、単一の商品が絞り込まれました */

    &実行リターン=4   /* 4番目の項目_月初の配達本数_から処理を開始します */
    繰り返し      /* 先頭行から1行ずつ、本数を累計します */
    ジャンプ 行番号=先頭
    &昭和年=0

      繰り返し
      ケース開始
      ケース ([配達先]≠#U)
      &昭和年=&昭和年++#項目属性( &実行リターン , 0 )
      ケース ([配達先]=#U)  /* 配達先がなければ集計用の行なので、牛乳の累計本数を入れてその
列の処理はおしまい */
      行訂正 &実行リターン =&昭和年
      繰り返し中止
      ケース終了
      ジャンプ 行番号=次行
      繰り返し終了

    &実行リターン=&実行リターン+1
    条件 (&実行リターン>#項目数 ) 繰り返し中止
    繰り返し終了

  絞り込み解除 *

編集表 "配達先マスター"
ジャンプ 行番号=次行
条件 (#EOF=1) 繰り返し中止
繰り返し終了

*************test3.cmd*************
17003 一覧表印刷でおしまい natsu 2002/08/15-13:57
記事番号17002へのコメント
最後が印刷です
月毎に集計表の項目名が替わるので、一覧表印刷コマンドを使って処理しましょう
*************test4.cmd*************
表 "月集計表"

&実行リターン=4   /* デフォルトではデータ項目の幅が広いので調整します */
繰り返し
項目属性変更2 変更,&実行リターン,{ ,,C600 }
&実行リターン=&実行リターン+1
条件 (&実行リターン>#項目数 ) 繰り返し中止
繰り返し終了

一覧表印刷条件開始   "月集計表" ,\
プリンタ = "" ,\
用紙サイズ ="A4 210 x 297 mm",\
給紙方法 = "オートシートフィーダ" ,\
用紙の向き = 横
一覧表印刷条件終了  
一覧表印刷 条件名 = "月集計表",プレビュー = する

*************test4.cmd*************
後はお好みで一覧表設定を仕上げてください
17004 まとめ natsu 2002/08/15-14:05
記事番号17003へのコメント
ということで、全自動でやろうと思えば
(カレンダー.tblと配達先マスター.tblだけは、あらかじめ必要)
結構な行数の一括処理になりますが
4つの一括処理を順番に実行するだけで目的の印刷物が
出力されます(検証す済みです)

昨日まで家族で家を空けていて、数日間新聞の配達を止めてもらっていたものですから
何となく気になって作ってみました
17011 Re:まとめ 今村 誠 2002/08/15-22:05
記事番号17004へのコメント
natsuさんこんにちは、試してみました。
同じ方が2種類以上注文した場合などもう一度行集計の必要
が出るかもしれませんね。

話は変わりますが、これだけの一括は作るのも大変ですよね。
「商品が増えたら」と余計なことを書いたのでフォローして
頂いたのではと恐縮しております。

17018 Re:まとめ natsu 2002/08/16-10:29
記事番号17011へのコメント
>同じ方が2種類以上注文した場合などもう一度行集計の必要
>が出るかもしれませんね。

行の集計は、桐の行集計コマンドではなく繰り返しコマンドで
1行ずつ累計していきますから、一回ですみます はい

それから、この一括だけだったら正味1時間半くらいでした
一番時間がかかったのは、最後の一覧表印刷のところで
余白が不正だとかいろいろ出てきて余分に1時間ほどかかりました
(最後は、ご覧の通り大分パラメータを省略しています)
17034 恐縮しています katsuyoshi 2002/08/18-12:40
記事番号16955へのコメント
今村様、桐香様、natsu様
大変ありがとうございました。
これだけのみなさんから私がアドバイスをしていただくとは
大変恐縮しています。
今までは自分用に桐を使っていろいろ仕事をしてきましたが
最近では同僚から頼まれて作っているのが現状です。
自分が納得して作り、他の人が使いやすいものを作るのは
本当に難しいです。
今後とも遠慮しないで質問しますので面倒をみてください。
お願いします。
ありがとうございました。

戻る