Accessで、Excelにデータを書き込むプログラムを動かしていますと、
---------------
実行時エラー"3601":
パラーメーターが少なすぎます。1を指定してください
--------------
というエラーが出てきまして、一向に希望通りの処理が行われず…。
調べますと、ある変数に格納された下記のSQL文。
-----------------------
select b.都道府県,count(B.都道府県) as 店舗実績
from(select a.都道府県,
a.担当者
from(select 都道府県,
担当者ID as 担当者
sum(目標値)/10 as ksum
from 概要テーブル
where 更新日 between 200401 and 200430
group by 都道府県,担当者ID
union all
select 都道府県
,担当者
,sum(契約件数) as ksum
from 契約詳細テーブル
where 更新日 between 200401 and 200430
group by 都道府県
,募集者
) as a
group by a.都道府県,
a.募集者
having sum(a.ksum) >= 0.5
) as b
group by b.都道府県
order by b.都道府県
------------------------
これに何か原因があるのでは?と考え、ネット上で色々と調べました。
(1)1885-1 | パラメータが少なすぎます。 - VB初心者友の会 - Q&A掲示板過去ログ
http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_1885_1.html
にありますように、where句の後の「更新日」の型が数値型なのがいけないのか?等と考えたりしましたが、
これを文字列型にすると別のエラーのダイアログが出てきたので、検討違いのようでした。
そしてさらに調べますと、
(2)パラメータクエリを含むSQLをVBAから実行する - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-478.html
にありますように、パラメータークエリが存在するのが原因ではないかと考えまして。
上記SQLだけをAccessのクエリデザインで実行してみますと、「パラメーターの入力」というダイアログが出てきて、
------------
契約件数
(テキストボックス)
------------
が出てきます。つまり上記SQL内の「sum(契約件数)」という箇所の"契約件数"という項目に原因があるのでは?と推測したのですが。
(2)の記事を参考にしても、SQL文をどのように修正したら、3601エラーが解消できるのか、応用ができず…具体的にどうすればエラーから抜け出せるか、お知恵をお貸しいただければ幸いです。
よろしくお願い致しますm(__)m
質問の補足を受けて、確認してみました。
まず、これ。
最初の質問とエラー内容が変わってきておりますが…「演算子がありません」と出てきてしまいました。
下記のクエリを実行しようとした際です(ファイル内にはクエリとして保存されてないですが)。
多分、補足に貼りつけたままの SQL で実行していると思うのですが、インデントに全角の空白を使っているのがダメです。
半角の空白に置き換えると、最初の質問通りに、
上記SQLだけをAccessのクエリデザインで実行してみますと、「パラメーターの入力」というダイアログが出てきて
の状態になります。
これの原因は、「契約詳細テーブル」に、「契約件数」という列が無いからです。
勝手に想像するに、契約件数は担当者ごとに契約を取った件数でしょうから、こんな感じの SQL になるのではないかと思います。
select b.都道府県,count(B.都道府県) as 店舗実績 from(select a.都道府県,a.担当者 from(select 都道府県,担当者ID as 担当者,sum(目標値)/10 as ksum from 概要テーブル where 更新日 between 200401 and 200430 group by 都道府県,担当者ID union all select 都道府県,担当者,count(担当者) as ksum from 契約詳細テーブル where 更新日 between 200401 and 200430 group by 都道府県,担当者) as a group by a.都道府県,a.担当者 having sum(a.ksum) >= 0.5) as b group by b.都道府県 order by b.都道府県;
これで、とりあえずエラーはなくなります。
結果として抽出したデータに意味があるかどうかは、ちょっと疑問な感じはしますが。
中に書いてる0.5が原因です。
別の数字に変更しろという意味だと思います。
chsmさん失礼しました、再度テーブルが入っているファイルをアップしました。
ファイルを確認したら、何かの列が欠けているようです。
皆さま、失礼しました。テーブルをこちら https://xfs.jp/mJk9Wn にアップしましたので、よかったら再度、ご確認いただけますと幸いです<m(__)m>
「概要テーブル」と「契約詳細テーブル」が入ってます。
最初の質問とエラー内容が変わってきておりますが…「演算子がありません」と出てきてしまいました。
下記のクエリを実行しようとした際です(ファイル内にはクエリとして保存されてないですが)。
--------------------------------------
select b.都道府県,count(B.都道府県) as 店舗実績
from(select a.都道府県,a.担当者
from(select 都道府県,担当者ID as 担当者,sum(目標値)/10 as ksum
from 概要テーブル
where 更新日 between 200401 and 200430
group by 都道府県,担当者ID
union all
select 都道府県,担当者,sum(契約件数) as ksum
from 契約詳細テーブル
where 更新日 between 200401 and 200430
group by 都道府県,担当者) as a
group by a.都道府県,a.担当者
having sum(a.ksum) >= 0.5) as b
group by b.都道府県
order by b.都道府県;
--------------------------------------
契約詳細テーブルに「契約件数」という列がないからでしょうか…でもテーブルを見ると、その列はやはり見当たらないような…もう1度、確認します。
質問の補足を受けて、確認してみました。
まず、これ。
最初の質問とエラー内容が変わってきておりますが…「演算子がありません」と出てきてしまいました。
下記のクエリを実行しようとした際です(ファイル内にはクエリとして保存されてないですが)。
多分、補足に貼りつけたままの SQL で実行していると思うのですが、インデントに全角の空白を使っているのがダメです。
半角の空白に置き換えると、最初の質問通りに、
上記SQLだけをAccessのクエリデザインで実行してみますと、「パラメーターの入力」というダイアログが出てきて
の状態になります。
これの原因は、「契約詳細テーブル」に、「契約件数」という列が無いからです。
勝手に想像するに、契約件数は担当者ごとに契約を取った件数でしょうから、こんな感じの SQL になるのではないかと思います。
select b.都道府県,count(B.都道府県) as 店舗実績 from(select a.都道府県,a.担当者 from(select 都道府県,担当者ID as 担当者,sum(目標値)/10 as ksum from 概要テーブル where 更新日 between 200401 and 200430 group by 都道府県,担当者ID union all select 都道府県,担当者,count(担当者) as ksum from 契約詳細テーブル where 更新日 between 200401 and 200430 group by 都道府県,担当者) as a group by a.都道府県,a.担当者 having sum(a.ksum) >= 0.5) as b group by b.都道府県 order by b.都道府県;
これで、とりあえずエラーはなくなります。
結果として抽出したデータに意味があるかどうかは、ちょっと疑問な感じはしますが。
そうだったんですね、ありがとうございます。
確かにテーブルには「契約件数」という列がなく、これを実際に存在する列名にSQLを修正すると、プログラム全体でも「実行時エラー"3601":」は回避できました!
ありがとうございます(^^)
そうだったんですね、ありがとうございます。
2020/03/24 07:49:42確かにテーブルには「契約件数」という列がなく、これを実際に存在する列名にSQLを修正すると、プログラム全体でも「実行時エラー"3601":」は回避できました!
ありがとうございます(^^)