- ベストアンサー
ACCESSのSQLで勘定科目と仕訳帳を集計し予実集計に反映する方法
- ACCESS210で存在する勘定科目、仕訳帳、予実集計の3つのテーブルを使用して、仕訳帳を月毎に集計し予実集計に反映する方法について教えてください。
- 具体的には、Delete文とInsert文を使用して予実集計テーブルをクリアし、仕訳帳テーブルを集計して予実集計に反映します。
- しかし、DoCmd.RunSQLの実行時にエラーが発生し、「構文エラー演算子がありません」というエラーメッセージが表示されます。乱用を避けたいので他の方法を知りたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No1からNo4はリセットします。 テーブルのデータ型、テーブルのデータがないのでよく わかりませんが、クエリで求めたいのは、 INSERT INTO 予実集計 ( 当年実績, 月度, 科目ID ) SELECT Sum(IIf([貸借区分]="借方",[借方]-[貸方],[貸方]-[借方])) AS 収支, Month([仕訳帳].[仕訳日]) AS 月度, 仕訳帳.科目ID FROM 勘定科目 INNER JOIN 仕訳帳 ON 勘定科目.ID = 仕訳帳.科目ID GROUP BY Month([仕訳帳].[仕訳日]), 仕訳帳.科目ID; のようなもので、SQL文にすると、 DoCmd.RunSQL "INSERT INTO 予実集計 ( 当年実績, 月度, 科目ID )" _ & " SELECT Sum(IIf([貸借区分]='借方',[借方]-[貸方],[貸方]-[借方])) AS 収支, Month([仕訳帳].[仕訳日]) AS 月度, 仕訳帳.科目ID" _ & " FROM 勘定科目 INNER JOIN 仕訳帳 ON 勘定科目.ID = 仕訳帳.科目ID" _ & " GROUP BY Month([仕訳帳].[仕訳日]), 仕訳帳.科目ID;" では? なお、質問の中の「月初」とは「2013/11/01」という 日にちというようにとれますし、「月度」といえば 普通は「11月度」あるいは「11」だと思います。 したがって「月度」となればMonth([仕訳帳].[仕訳日] でいいのでは、と思います。わたしには、 仕訳日の月初=仕訳日-DAY(仕訳日)+1 の式がよく飲み込めないので、上記のように しました。あるいは、 月度: CStr(Month(DateSerial(Year([仕訳帳].[仕訳日]),Month([仕訳帳].[仕訳日]),1))) でも、とれます。 また、月の初めの日にちならば、 DateSerial(Year([仕訳帳].[仕訳日]), Month([仕訳帳].[仕訳日]), 1)
その他の回答 (4)
- piroin654
- ベストアンサー率75% (692/917)
仕訳帳の仕分日は日付型とします。また、予実集計の月度はテキスト型 とします。 SQL文で 月初:仕訳日-DAY(仕訳日)+1 は認識できないので、月初をサブクエリでグループ化して取り出します。 DoCmd.RunSQL "INSERT INTO 予実集計 ( 月度, 科目ID, 当年実績 )" _ & " SELECT (SELECT CStr(Month(DateSerial(Year([仕訳帳].[仕訳日]),Month([仕訳帳].[仕訳日]),1))) AS 月初 FROM 仕訳帳 GROUP BY CStr(Month(DateSerial(Year([仕訳帳].[仕訳日]),Month([仕訳帳].[仕訳日]),1)))) AS 月初, 仕訳帳.科目ID, Sum(IIf([貸借区分]='借方',[借方]-[貸方],[貸方]-[借方])) AS 収支" _ & " FROM 勘定科目 INNER JOIN 仕訳帳 ON 勘定科目.ID = 仕訳帳.科目ID" _ & " WHERE (((勘定科目.繰越FG)='False'))" _ & " GROUP BY 仕訳帳.科目ID;" では、どうですか。
- piroin654
- ベストアンサー率75% (692/917)
普通に追加クエリを作成してみて、 それを実際にフォームで運用する ときの状況に合わせたSQL文に変更して みてはどうですか? たとえば、以下のようなクエリのSQL文。 (質問のSQL文の中のエラーがでそうなところは、 いくつかは変更しています) INSERT INTO 予実集計 ( 月度, 科目ID, 当年実績 ) SELECT [仕訳日]-Day([仕訳日])+1 AS 月初, [科目ID], sum(IIf([貸借区分]='借方',[借方]-[貸方],[貸方]-[借方])) AS 収支 FROM 勘定科目 INNER JOIN 仕訳帳 ON [勘定科目].[ID]=[仕訳帳].[科目ID] WHERE 繰越FG=False GROUP BY 月初, [科目ID]; なお、No1ではかっこの位置も 変更しています。
- piroin654
- ベストアンサー率75% (692/917)
No1です。そのほか、 >WHERE 繰越FG) 末尾にいらないかっこ >group BY [仕訳日] - Day([仕訳日]) + 1 as 月初,科目ID; は、 >Select [仕訳日]-Day([仕訳日])+1 as 月初 で宣言しているので、 group BY 月初,科目ID; でいいような気もするのですが。 なお、 >貸借区分] = ""借方"" は、 貸借区分] = '"借方"' にしようとしたのでしょうか、それとも 貸借区分] = '借方' にしようとしたのでしょうか。
補足
度重なるご回答感謝します。 WHERE 繰越FG) は明らかなミスです、 訂正しました。 group BY 月初,科目ID; も訂正して実行しましたが解決しません。
- piroin654
- ベストアンサー率75% (692/917)
一部のみしか見ていませんが、 >sum(IIf([貸借区分] = ""借方"",[借方]-[貸方],[貸方]-[借方] as 収支) は、 sum(IIf([貸借区分] = "借方",[借方]-[貸方],[貸方]-[借方])) as 収支 では?
補足
ご回答ありがとうございます。 ""内の文字定数の記述は""文字定数""です。 http://www.postgresql.jp/document/8.4/html/sql-syntax-lexical.html 等に解説してあります。 文字列の記述は'(シングルクォーテーション)も可能と知り ""と' の組み合わせも試してみましたがダメでした。
お礼
有難うございました。
補足
解決しました。 長時間お付き合いいただきまして、ありがとうございます。 No.5のご回答の通り ) 勘定科目.ID RUNSQL内でASの使用はできないようですね 月度も日付型で月初と同じです。説明が足りませんでした。 結論はイカです DoCmd.RunSQL ("Delete From 予実集計;") DoCmd.RunSQL ("Insert Into 予実集計(月度,科目ID,当年実績)" _ & " Select [仕訳日]-Day([仕訳日])+1,科目ID," _ & " sum(IIf([貸借区分] = ""借方"",借方-貸方,貸方-借方))" _ & " FROM 勘定科目 INNER JOIN 仕訳帳 ON 勘定科目.ID = 仕訳帳.科目ID" _ & " WHERE 繰越FG = False group BY [仕訳日]-Day([仕訳日])+1,科目ID; ")