[Excel ADO]条件にマッチした伝票の出力

このQ&Aのポイント
  • Excel2007 ADOを使って売上伝票の条件にマッチした伝票の出力方法について教えてください。
  • 売上伝票の条件に合致する明細を含む伝票全体を取得する方法について教えてください。
  • 検索対象を含む売上伝票の伝票番号リストを取得した後、日付と番号でWHERE句を使用するか、EXISTSなどを使用するかについて教えてください。
回答を見る
  • ベストアンサー

[Excel ADO]条件にマッチした伝票の出力

Excel2007 ADOを使ってCSVのSQL処理をしています 対象は売上伝票で、取引先名、商品名などで検索をかけるのですが その結果がマッチした明細のみしか取り出せないのをなんとかしたいです 例えば、1つの伝票には複数明細が含まれるのが通常ですが、 商品名で検索すると、その商品の明細しか出てきません これを、マッチした明細を含む伝票全体を取り出したいのです SELECT 伝票日付,伝票番号 FROM T_売上 WHERE 取引先="A社’ AND 商品名='鉛筆' GROUP BY 伝票日付,伝票番号 こんな形で検索対象を含む伝票の伝票番号リストを得ることはできたので、 次はこの日付と番号でWHEREをかけるのか あるいはEXSISTSなどを使うのか ちょっと具体的にイメージできません 教えていただけるとありがたいです よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8518/19364)
回答No.2

以下のようにして下さい。 SELECT T_売上.* FROM T_売上 WHERE ((([伝票日付] & "##" & [伝票番号]) In (SELECT 伝票日付 & "##" & 伝票番号 as 式1 FROM T_売上 WHERE 取引先='A社' AND 商品名='鉛筆' GROUP BY 伝票日付,伝票番号))); 伝票日付と伝票番号を連結した物を使って「WHERE ~~ IN (サブクエリ)」で抽出しています。 連結時に「##」を挟んでいる理由は、挟まずにそのまま連結してしまうと 日付   番号 2016/7/1 123 2016/7/11 23 というデータがあった場合、連結結果が、どちらの場合でも 2016/7/1123 になってしまい、2つの違いを区別できなくなるからです。 なので、連結結果が 日付   番号   連結結果 2016/7/1 123 ⇒ 2016/7/1##123 2016/7/11 23 ⇒ 2016/7/11##23 となるように「データに出現しない文字を間に挟む」のです。

hzd00430
質問者

お礼

文字列として連結し、ユニークなキーにするのですね (連結時の留意点まで示していただき感謝です) それをそのままWHERE IN のリストに渡す、と 意図した結果が得られました。ありがとうございます。

その他の回答 (2)

  • msMike
  • ベストアンサー率20% (363/1775)
回答No.3

ADOって何のこと? ActiveX Data Objects のこと?

hzd00430
質問者

補足

その通りです 私もまだまだ勉強中ですが、すごく便利ですね

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは 「1つの伝票」の集合体は「T_売上」というテーブルとして、 「含まれる複数明細」はどこ? 前提条件の説明が不足しているので分かりにくいです。 EXSISTSとかJOINとか、条件によって何が使えるのかどうかかと思います。

hzd00430
質問者

お礼

コメントありがとうございます

hzd00430
質問者

補足

端折りすぎでした。申し訳ございません T_売上内のひとつのレコードが以下のようになっており、 伝票日付,伝票番号,明細番号,商品名・・・ ある伝票番号の伝票に含まれる複数明細は、 明細番号を連番したレコードです

関連するQ&A

  • [Excel ADO]合計額の挿入は可能ですか?

    Excel2007のADOを使ってCSVファイルのデータを集計する方法を習得中です ある業務アプリからエクスポートしたデータなのですが、 売上伝票データ: 伝票日付、伝票番号、取引先名、明細番号、商品名、数量、単価、金額、取引区分、納入先コード 納入先コードテーブル: 納入先コード、納入先名 取引区分が0なら売上、1なら入金(入金伝票の場合納入先コードがNULL) これを集計して売上明細表をつくるとして、 伝票毎に伝票合計額、および納入先名を挿入するようなことが SQL文だけで可能でしょうか?

  • [Excel ADO] WITH句の可否

    Excel2007のADOを使ってCSVファイルのデータを集計する方法を習得中です http://okwave.jp/qa/q9081610.htmlで質問させていただきました内容で、 uriage.csv 伝票日付,伝票番号,取引先名,明細番号,納入先コード,商品名,単位,数量,単価,金額,取引区分 270901,00000664,X社,1,0071,商品A,個,4,2250,9000,1 270901,00000664,X社,2,0071,商品B,個,4,1750,7000,1 270901,00000664,X社,3,0071,消費税,,0,0,1280,2 270903,00000739,X社,1,0067,商品C,式,1,0,0,1 270903,00000739,X社,2,0067,商品D,個,1,0,0,1 270915,00000360,X社,1,,振込,,0,0,4320,0 270915,00000363,X社,1,,振込,,0,0,78840,0 270915,00000363,X社,2,,振込,,0,0,135540,0 271022,00000831,Y社,1,0090,商品B,式,1,10000,10000,1 271022,00000831,Y社,2,0090,消費税,,0,0,800,2 271022,00000832,Y社,1,0144,商品D,個,1,2000,2000,1 271022,00000832,Y社,2,0144,消費税,,0,0,160,2 271105,00000447,Y社,1,,振込,,0,0,2160,0 271110,00000459,Y社,1,,振込,,0,0,10800,0 nonyu.csv 納入先コード,納入先名 0067,本社 0071,M支店 0084,N支店 0090,本社 0109,S支店 0144,T支店 というテーブルに対して、以下のようなSQLを発行することで、VBAによらずSQLのみで処理することができるようになりました(実際はもう少し複雑なSQLですが、質問に際して簡略化しました) Sub sqltest() Dim cn As ADODB.Connection Dim rs As Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & ActiveWorkbook.Path & ";" & _ "Extended Properties='Text;HDR=YES'" cn.CursorLocation = adUseClient Sql = "SELECT * FROM ( " Sql = Sql & "SELECT 明細番号,伝票日付,伝票番号,商品名,単位,数量,単価,IIF(取引区分>0,金額),NULL,IIF(取引区分=0,金額) FROM uriage.csv 売上" Sql = Sql & " UNION ALL " & _ "SELECT 0,伝票日付,伝票番号,取引先名,NULL,NULL,NULL,NULL,NULL,NULL FROM uriage.csv 売上" & _ " GROUP BY 取引先名,伝票日付,伝票番号" Sql = Sql & " UNION ALL " & _ "SELECT 99,伝票日付,伝票番号,'納入先: ' & 納入先名,NULL,NULL,NULL,NULL,SUM(金額),NULL FROM uriage.csv 売上" & _ " LEFT JOIN nonyu.csv AS 納入先台帳 ON 売上.納入先コード=納入先台帳.納入先コード" & _ " WHERE NOT ISNULL(売上.納入先コード) " & _ " GROUP BY 取引先名,伝票日付,伝票番号,納入先名" Sql = Sql & ") ORDER BY 伝票日付,伝票番号,明細番号" Set rs = cn.Execute(Sql) Range("A2").CopyFromRecordset rs End Sub 一応できたことはできたのですが、データが大量になってくるとSELECT文を3回発行しているためかレスポンスが非常に悪くなってしまっています(上記では、全データを対象にしていますが、実際はWHEREにより日付、取引先名、納入先名などで絞り込んでいます。これを3回やるのは目に見えて無駄とは思うのです) 高速化の方策をいろいろ検索してみましたところ、UNIONで繋げるのは愚策で、共通するSQL文をWITH句でまとめるのが良いという記事がありました しかし、WITHを使おうとしてもエラーとなってしまいます。Excel ADOでは使えないのでしょうか? あるいは、まったく異なるアプローチなど、何かありましたらご示唆ください。 よろしくお願いします

  • [Excel ADO]ソートキー値の変更方法

    Excel2007を使って、ADOによるCSVデータの集計をしています 対象のデータで、行番号をキーにしてソートするのですが 0の場合のみ一番最後になるような方法はありますか? 素人考えでは、0の場合は999999など十分大きな値に強制的に書き換え、 それからORDER BY 行番号による並び替えができれば、などと妄想しています 参考までに、もう少し具体的に申し上げますと、売上データのフィールドが 伝票日付、伝票番号、明細番号(行番号)、、、と並んでおり 基本的にはこの順番でORDER BYをかければいいのですけど、 締時消費税のみ伝票番号が0、明細番号が0となっているのです(伝票日付は締日) 普通に処理すると締日の売上データが、締時消費税の下に来てしまうので避けたいです 何かいい方法がありましたら教えてください

  • access2003 抽出条件が持ち越されてしまう

    http://okwave.jp/qa3580875.html ↑にて質問させていただいた者です。  一部繰り返しになりますが、2000種ほどの商品を扱っています。伝票を見ながらフォームから直接売上入力を行いたく思います。 ◆親)売上入力フォーム:売上管理番号/日付/取引先/取引先伝票番号/売上合計金額 ◆子)売上明細フォーム:商品コード/商品名/単価/数量/明細金額 ◆売上入力テーブル:売上管理番号/取引先/日付/取引先伝票番号 ◆売上明細テーブル:明細番号/売上管理番号/商品コード/数量/明細単価 子フォームで商品コードのフィルターとして、 1)親フォームで選択した取引先の商品のみ→[Forms]![売上入力フォーム]![取引先]を導入 2)ワイルドカード「Like "*" & [商品コードの一部を入力] & "*"」 のふたつを使っていますが、うまく動作してくれません。 いったん商品コードを選択すると、明細の次の行に移動しても取引先選択のポップアップが出ず、コンボボックスには同じ選択肢が提示されます。さらに、新しいレコードに移動してもポップアップなし&同じ選択肢が続きます。 この状態を回避する方法を教えてください。 長くなりましたが、どうぞよろしくお願いします。

  • [Excel ADO]条件入力の簡素化

    Excel2007を使い、ADOによるCSVファイルのSQL処理をしています ユーザーフォームで条件を入力し、原則以下のようにSQL文化しています 【売上データから商品名で検索する】 sql = "SELECT * FROM 売上.csv WHERE 商品名='" & 商品名.text & "' (「商品名」はユーザーフォーム上のテキストボックスオブジェクト) この際に、ANDやORなども使えたら便利だと思いますが、 SQLとして正しいものは、 商品名='A' OR 商品名='B' とせねばならず、記述がメンドウです。 入力上は 'A' OR 'B' ('A' AND 'B') OR 'C' などとして、それを内部で正しいSQLに変換するような ライブラリなどはないでしょうか? 機械的に「商品名=」という文字列を挿入するような コードを書こうかとも思いましたが、 もう少し賢いパーサーのようなもの(?)が既に存在しても おかしくない気がしました 何かご存じの方がいらっしゃいましたら教えてください よろしくお願いします

  • 伝票リスト中に商品名

    いつもお世話になります。 過去ログを探してみたのですが探し方が悪かったのか見つかりませんでしたので、書き込みさせていただきました。 売上伝票のリスト中に商品名(明細一行目)を入れたいので す。 テーブルとしましては、 [T_売上伝票] 伝票番号,顧客コード.... [T_売上伝票明細] 伝票番号,行番号,商品コード,商品名..... このままクエリーをかけると、 001 000001 商品A ........ 001 000002 商品B ........ 002 000002 商品B ........ となりました。 希望は、 001 000001 商品A ........ 002 000002 商品B ........ となる事です。 何かよい方法があれば教えてくださいませ。 よろしくお願い致します。

  • access2003

    2000種ほどの商品を扱っています。商品コードひとつにつき、仕入先・取引先が1箇所ずつ決まっていて、値段の変化もあまりありません。伝票を見ながら、フォームから直接売上入力を行い、請求処理と売上分析に利用したく思います。 ◆親)売上入力フォーム:売上管理番号/日付/取引先/取引先伝票番号/売上合計金額 ◆子)売上明細フォーム:商品コード/商品名/単価/数量/明細金額 ◆売上入力テーブル:売上管理番号/取引先/日付/取引先伝票番号 ◆売上明細テーブル:明細番号/売上管理番号/商品コード/数量/明細単価 入力の効率化を図るため、1部品1取引先であることを利用して、親フォームで取引先を選択することで商品を絞り込み、子フォームの商品選択コンボボックスにはその取引先の商品だけが表示させるようにしたいと思います。どのような方法が考えれるでしょうか? クエリを使うのだと思いますが、いろいろ試しても失敗してしまいます。 また、その上でさらなる絞込みとして、明細の各行で各商品を選択する際に、商品コードの一部を入れたり、仕入先名を入れると部品が絞り込めるようにできないでしょうか? アドバイス、参考資料、なんでもお寄せください! どうぞよろしくお願いいたします。

  • access2003 複数のフォームから入力したデータに通し番号を付けてストックしたい

    初心者の恥ずかしい質問かもしれないので申し訳ありませんが、自力で解決できないのでアドバイスをお願いします。 伝票入力画面を作っています。  ◆親)売上入力フォーム:売上管理番号/日付/取引先/売上合計金額 ◆子)売上明細フォーム:商品コード/商品名/単価/数量/明細金額 ◆売上入力テーブル:売上管理番号/取引先/日付 ◆売上明細テーブル:明細番号/売上管理番号/商品コード/数量/明細単価 伝票が数種類あるため、それぞれの伝票を画像として取り込んで複数の入力画面を作り、入力しやすくしようと思っています。 このとき、各フォームから入力したデータを、オートナンバーでひとつの売上入力/明細テーブルにストックしていくにはどうしたらよいでしょうか? よろしくお願いします。

  • クエリの抽出条件について

    売掛管理を作成しようと思っています。 「請求書T」と「入金T」 「商品T」「取引先T」を作成しました。 元帳作成にあたって、に必要なテーブル・クエリの組み方を教えてください。。 請求書テーブル フィールド名;請求番号、請求日、得意先番号、 売上額、摘要(商品名など) 入金テーブル フィールド名;ID(オートNo.)、取引先コード、入金日、入金額、調整(振込手数料等)、摘要 クエリで売上明細と商品Tをつなぎ、売掛元帳を作りたいのですが、 クエリのひっぱりかたがわかりません・。。 元帳 → 日付、取引先コード、取引先名、売上額、入金額、繰越残高、残高 (繰越残高は、取引先Tに持たせます) ※残高= 繰越残高 + 売上額 - 入金額 どうぞよろしくお願いします。

  • 入金伝票について

    入金伝票で、 取引先名XXXX殿 金額XXXX 上記の金額正に支払いたしました。 自社名XXXX という伝票にめぐり合いました。 普通、入金伝票とは売上等、現金が増加した時に作成するものだと理解しています。が、伝票文句に「支払いたしました。」という不可解な部分があるのでよく伝票の意味が分かりません。一見、領収書にも見えるレイアウトですし・・・。 この伝票は一体どのような用途で、どんな意味をもつのでしょうか?説明が悪くてすみません。 ぜひ、お返事ください。

専門家に質問してみよう