製品等の売上の管理用のファイルを作成しています。顧客により支払条件(締め日、支払期日)が異なります。
必要なテーブルを作成して売上日に対する締め日、支払期日をスイッチ関数等を使い基となるクエリーを作成しました。
そのクエリーは問題なく動作しているのですが、それを基にフォームを作成し 締め日、期日の年・年月(その期間)・顧客でコンボボックスを更新時に抽出するコードを記述しました。顧客・締め日でのフィルターを問題ないのですが、何故か期日では”実行時エラー2766このオブジェクトには、オートメーションオブジェクト**は含まれません”となります。**は同ファイルの似たようなフォームに使ってますコントロール名です。エラーとなるフォームにはどこにもそのコントロールの痕跡がないのに不思議で、お手上げ状態になってます。
基となるクエリのSQLは下記です。(支払期日はスイッチ関数の文字制限ある様なので2つに分けてます)
SELECT Q振替メインとサブ.発生日付, Q振替メインとサブ.摘要, Q振替メインとサブ.借方選択, Q振替メインとサブ.借方科目名, Q振替メインとサブ.借方金額, Q振替メインとサブ.貸方選択, Q振替メインとサブ.貸方科目名, Q振替メインとサブ.貸方金額, Q振替メインとサブ.売掛先ID, Q売掛金の顧客一覧.顧客名カナ半角, Q売掛金の顧客一覧.支払条件, Q売掛金の顧客一覧.締め日ID, Q売掛金の顧客一覧.支払日ID, Q振替メインとサブ.振替ID, Q振替メインとサブ.振替明細ID, Switch([貸方選択]=9,"回収処理",[締め日ID]=1,DateSerial(Year([発生日付]),Month([発生日付])+1,0),[締め日ID]=2,DateSerial(Year([発生日付]),Month([発生日付])+IIf(Day([発生日付])<=10,0,1),10),[締め日ID]=3,DateSerial(Year([発生日付]),Month([発生日付])+IIf(Day([発生日付])<=20,0,1),20),[締め日ID]=4,DateSerial(Year([発生日付]),Month([発生日付])+IIf(Day([発生日付])<=25,0,1),25),[締め日ID]=5,DateSerial(Year([発生日付]),Month([発生日付]),Day([発生日付]+1)),[締め日ID]=7,DateSerial(Year([発生日付]),Month([発生日付])+IIf(Day([発生日付])<=15,0,1),15)) AS 売掛締日, IIf([貸方選択]=9,[発生日付],IIf(IsNull([期日の参照1]),[期日の参照2],[期日の参照1])) AS 回収期日, Switch([支払日ID]=1,DateSerial(Year([売掛締日]),Month([売掛締日])+2,0),[支払日ID]=2,DateSerial(Year([売掛締日]),Month([売掛締日])+1,10),[支払日ID]=3,DateSerial(Year([売掛締日]),Month([売掛締日])+1,15),[支払日ID]=4,DateSerial(Year([売掛締日]),Month([売掛締日])+1,20),[支払日ID]=5,DateSerial(Year([売掛締日]),Month([売掛締日])+1,25),[支払日ID]=6,DateSerial(Year([売掛締日]),Month([売掛締日])+1,27),[支払日ID]=7,DateSerial(Year([売掛締日]),Month([売掛締日])+3,0),[支払日ID]=8,DateSerial(Year([売掛締日]),Month([売掛締日])+2,10),[支払日ID]=9,DateSerial(Year([売掛締日]),Month([売掛締日])+2,15),[支払日ID]=10,DateSerial(Year([売掛締日]),Month([売掛締日])+2,20)) AS 期日の参照1, Switch([支払日ID]=11,DateSerial(Year([売掛締日]),Month([売掛締日])+2,25),[支払日ID]=12,DateSerial(Year([売掛締日]),Month([売掛締日])+2,27),[支払日ID]=13,DateSerial(Year([売掛締日]),Month([売掛締日]),Day([売掛締日])+10),[支払日ID]=15,DateSerial(Year([売掛締日]),Month([売掛締日])+2,5),[支払日ID]=16,DateSerial(Year([売掛締日]),Month([売掛締日])+1,0),[支払日ID]=19,DateSerial(Year([売掛締日]),Month([売掛締日]),Day([売掛締日])+30),[支払日ID]=21,DateSerial(Year([売掛締日]),Month([売掛締日])+2,0)) AS 期日の参照2, CLng(Switch([借方選択]=9,[借方金額],[貸方選択]=9,[貸方金額]*-1)) AS 売上の掛金額2, Switch([借方選択]=9,[貸方科目名],[貸方選択]=9,[借方科目名]) AS 相手勘定科目, IIf([貸方選択]=9,"",Year([売掛締日])) AS 売掛締の年, IIf([貸方選択]=9,"",Month([売掛締日])) AS 売掛締の月, Format([売掛締日],"yyyy/mm") AS 売掛締の年月, Year([回収期日]) AS 回収期日の年, Format([回収期日],"yyyy/mm") AS 回収期日の年月, IIf([借方選択]=9,[借方金額],0) AS 売掛金額, IIf([貸方選択]=9,[貸方金額],0) AS 回収金額, Switch([借方金額]>[貸方金額],"売掛金に含む",[貸方選択]=33,"今回で処理",[貸方選択]=9,"",[貸方金額]<=[借方金額],"未") AS 消費税の処理
FROM Q振替メインとサブ INNER JOIN Q売掛金の顧客一覧 ON Q振替メインとサブ.売掛先ID = Q売掛金の顧客一覧.顧客ID
WHERE (((Q振替メインとサブ.借方選択)=9)) OR (((Q振替メインとサブ.貸方選択)=9));
⇒私の知識不足が原因と思っているのですが手がかりがなくて先に進めない状態です。アドバイスが頂けると大変ありがたいです。宜しくお願いします。
通報 ...
実行時エラーを解決して、なんだかんだで希望通りに動く完成品まで漕ぎ着けたとしても、蓋を開けてみればスパゲティクエリじゃ駄目です。設計が杜撰だからデスマーチが始まって、頑張れば頑張るほどぐちゃぐちゃになっている場合、設計からやり直すしかないです。
締日と請求日はもう少しテーブルに落とし込まないと。
確かにクエリーはごちゃごちゃ過ぎますね。顧客毎の締め日は7パターン程で支払条件は20パターン程あり、それを売上日付からSwitch条件でDateSeriaで締め日と回収期日をわりだしているためごちゃごちゃとなってます。それしか思いつかなかったもので。
*全然わからないことはフォームで期日の年や年月でフィルターしたときに実行時エラー2766がでて、他のフォームで非連結にしているコントロールが存在しないとなることです。それとは全く関係してないのに・・・それが全く理解できずにおります。
問題なく動いているクエリだけ表示されてもみんなお手上げじゃないですかね
データの作り方は悩ましいところですが、「締日」や「支払日」なんかの日付のデータはそのままずばり日付で扱ったほうがすっきりしますよ(末日の処理に工夫が必要ですが)
すみません確かにクエリーだけ開示しても意味不明となりますね。その後、同じ内容で新たなフォームを作成して試してみました。そしてFilter実行すると”クエリーが複雑すぎる”のエラーとなりました。それでそのクエリを基にテーブル作成して、それをフォームの基にすると動作は正常となりました。やはりクエリーへの記述等が多すぎて(IIF・Switchを多用)ごちゃごちゃになったのが原因の様です。売上日付から締め日・支払期日をだすのはSwitch条件でDateSeria関数でするしか思いつかないので厄介なところです・・・
カレンダーは決まったルールでしか動かないので、わざわざパターンの登録から処理を分岐させず、生のデータを使うようにすれば冗長な条件分岐を避けることができます
例えば
hirotonさんコードの記載ありがとうございます。
顧客毎に締め日、支払条件が異なる。例えばA社は末締めの約月末払い、B社は20日締めの翌々10日払い、C社は15日締めの翌月25日支払等・・・このパターンが今のところ締め日7ヶ、支払条件が20ヶ程あるのです。日々の入力は売上日付、顧客名(ID)、金額等で、そこから自動的に締め・支払期日(条件の基づき)を算出してます。それでSwitch条件分岐にしてます。生のデータにするにはどうなるのでしょうか?(IIfでも大分長くなりそうで・・・)
「生の」とは例えば20日締めなら「締日」のフィールドを用意し「20」と保存しておくなどです
その他、「支払月」として当月=0、翌月=1、翌々月=2・・・、「支払日」として日の数値を保存するようにすればそのまま日付計算に使えるようになります
ただ、数値としてそのまま保存できない条件として、「末締め」「末払い」のような、「該当月の末日」が指定される場合などもあります。このような、結果として日付が変動するような条件については、日にちのデータだけでは表現できないので工夫や、条件分岐せざるを得ないこともあるでしょう
さらに複雑な条件も考えられますが、いずれにせよ、現在の質問のような「締め日ID」「支払日ID」というデータのとり方は無駄に複雑でわかりにくいもににするだけのものです
これを改善するだけでもかなりすっきりしたクエリになりますよ
hirotonさん ありがとうございます。なるほどそういう事ですね。その方が加工するのが分かり易い感じですね。ちょっと固定観念にとらわれてました。トライしてみます。アイデアありがとうございました。