• ベストアンサー

VB.NETについて

.NETの初心者です。 只今、.NETで売上の実績表を作ろうとしています。 SQL Serverに店舗No.や売上額などのデータが入ったテーブルから取り出し、図の様に作りたいのですが「FOR」「While」を使ってもうまくいきません。 店舗NO.を1から順番にループし、その店舗NO.がデータにあればエクセルに書き込む、なければ次の番号へといった処理をしたいのですが、どうすれば良いのでしょうか? 漠然とし分かりづらい質問で申し訳ありませんが、ヒントやアドバイスを頂けたら幸いです。 ご教授の程宜しくお願いします。

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

  • ベストアンサー
回答No.1

老婆心ながら。 「SQL Serverにあるデータを集計処理してExcelブックに書きこむ」という処理を、 For や While という反復処理のキーワードが魔法のようにやるというわけではありません。 次のような流れですね。 SQL Server  … (A) RDBだからSQLで操作。テーブル、レコードとかフィールドとか。  |      … (B) ADO.NET、ADO、ODBC など VB.NET    … (C) アルゴリズム  |      … (D) OLE(COM)、ブックではなくCSVならファイルの読み書き Excel ブック … (E) Excel、CSV? 画像では (E) の最終形しか示されてませんが、まず (A) のテーブル構造がわからないと、(C) のロジック(あなたがいう For とか While の部分)の指針を示しようがないですね。また、具体的なコードを示そうとしても、(B)がどういった方式かわからないので、コードの示しようがないです。また、(E) はブックといってますが、(D) の方式がわからないし、(E) はほんとうにブックでしょうか?CSVのテキストファイルではないですか? さて。 (A) が一般的な正規化をされていて、(B)がADO.NET、(D) がOLE、(E) がブックだとすると、 (A) は 売上ID、店舗名、商品名、売上高 だとすれば、 (C) では、店舗名、商品名、売上高を順に並べ替えて DataSetを取得しましょう。このとき、店舗名、商品名をキーにして、売上高で合計してあればよいですが、SQLは割愛します。 並べ替えられ、集計されたDataSetが取得できたならば、あとはブックに順にはめていくだけです。 VB.NET で OLE で Excel を新しくひらくときは、以下。 Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Add Dim xlSheets As Excel.Sheets = xlBook.Worksheets そうすると、xlSheets 変数に、ワークシートの参照ができるから、Range や Cells プロパティで座標を指定してはめていけばよいでしょう。 DataSetが複数行に対して、Excel一列になりますから、For は列を中心にするとわかりやすいかな。列を固定して、DataSetが、同一店舗で、商品名が前のレコードと違えば、セルの行を次へ。店舗、商品名の両方がちがえば、For は つぎのループをまわしてください。 お悩みなのは、典型的なキーブレイクの処理です。 まず、方式を明らかにしましょう。これが明らかになったなら、どこにどういう値が入らなければならないかという現象(I/O)を理解したうえ、順次、判断、繰り返しを用いたフローチャートを書くこと。一生懸命考えてください。 キーワードがなにかすべてをやってくれるわけではないですよ。 がんばってください。    

regulus0725
質問者

お礼

分かりづらい質問の中で回答をして下さってありがとうございます。 方式などは書いて下さった通りです。また方式等をしっかりと理解し、考えていこうと思います。

関連するQ&A

  • 行数をカウントするSQLにつきまして

    行数をカウントするSQLにつきまして いつもお世話になっております。 下記の売上テーブルから みかん=3(行目) というようなデータを抽出するSQLはどのように記述したら良いのでしょうか? ・・・・売上テーブル・・・ 売上番号 品名 単価 101   りんご 100 102   りんご 100 103   みかん 150 104   りんご 100 105   みかん 150 106   メロン 250 postgre8.3のためrow_numberが使えません

  • 内部結合のSQL文

    次のような条件でのSQL文はどのように書けばよいのでしょうか? 売上テーブル(フィールドは「売上No.」)と売上明細テーブル(フィールドは「売上No.」「行番号」)を内部結合します。 結合の条件は売上明細テーブルの売上No.が売上テーブルの売上No.と等しいもの、かつ売上明細テーブルの行番号の一番小さいもの、です。 行番号はユニークですが、必ずしも1から順に振られているとは限りません。 どうぞよろしくお願いします。

  • 複数のシート上にある同一のテーブルから今日の売上を集計したい

    こんにちは。 複数の店舗を抱えており、店舗ごとにシート一枚で様々なデータをまとめてます。 A1~G1まで、No.、販売日、商品コード、商品名、定価、販売個数、販売価格となっているときに、それぞれの店舗で今日売り上げたデータを同じテーブル形式(No.、販売日、商品コード、商品名、定価、販売個数、販売価格)で別シートに転記するには何か方法がありますか?並ぶ順番とかはどうでもよく、単に今日の売上品目と販売個数&金額がわかればいいのですが。

  • ORACLE UPDATEについて

    いつもお世話になっています。 SQLのUPDATEについて、教えてください。 (例) 各店舗の売上累積ファイルに、日ごとの売上トランの情報を累計する。 処理日が12月31日の場合、年次繰越を行う。 売上実績ファイル │店舗│当年売上│前年売上│ ┼──┼────┼────┼ │A店│ 50000 │ 60000 │ │B店│ 25000 │ 32000 │ 売上トラン │店舗│本日売上│ ┼──┼────┼ │A店│ 25000 │ │B店│ 14000 │ ーー結果(12月31日の処理の場合)ーー 売上実績ファイル │店舗│当年売上│前年売上│ ┼──┼────┼────┼ │A店│   0 │ 75000 │ │B店│   0 │ 39000 │ ーー結果(12月31日以外の場合)ーー 売上実績ファイル │店舗│当年売上│前年売上│ ┼──┼────┼────┼ │A店│ 75000 │ 60000 │ │B店│ 39000 │ 32000 │ ※Keyは”店舗”、実績とトランの関係は1:1 UPDATE 売上実績ファイル SET 前年売上 = CASE ( WHEN WK-処理日 = 12/31        THEN 売上実績ファイル.当年売上 + 売上トラン.本日売上        ELSE 売上実績ファイル.前年売上 ) SET 当年売上 = CASE ( WHEN WK-処理日 = 12/31        THEN 0        ELSE 売上実績ファイル.当年売上 + 売上トラン.本日売上 ) WHERE 売上実績ファイル.店舗 = 売上トラン.店舗 上記処理をPL/SQLで行いたいのですが、正しい処理結果は求まるのでしょうか? よろしくお願いします。 ※環境がなく、動作検証が出来ない為、質問させて頂きました・・・

  • SQLの抽出方法について

    あるテーブルに以下のカラムがあります。 店舗コード,売上日,金種コード,履歴番号,売上金額 プライマリキー(店舗コード~履歴番号) このテーブルには、店舗、売上日、金種コードごとの売上金額が履歴で管理されています。 ・データイメージ 0001,2004/04/01,01,0,1000 ・・・1行目 0001,2004/04/01,01,1,1100 ・・・2行目 0002,2004/04/01,02,0,500 ・・・3行目 0003,2004/04/01,03,0,2000 ・・・4行目 0003,2004/04/01,03,1,2010 ・・・5行目 0003,2004/04/01,03,2,1500 ・・・6行目 0001,2004/04/02,01,0,800 ・・・7行目      ・      ・ このデータから、売上日を指定して、 全店舗の金種ごとの履歴番号が最大のレコード(2,3,6行) を取得したいのですが、いいSQLが思いつかないので、ご存知の方教えてください。

  • VBで配列に格納されているデータをUPDATEや INSERTするには

    配列変数にあるデータを一度に更新や追加したい場合SQL文を(繰り返し)ループするのが良いのでしょうか?ほかに方法はありますか 例えば dim AAA(100) as integer dim BBB(100) as string にさまざまな値データが入っているとしてそれらを、SQL文にして書き込みしたい 場合です。データテーブルはあるものしますが、何番目の配列までデータが 入っているか可変です よろしくお願い致します

  • ORACLE UPDATE文の書き方について

    いつもお世話になっています。 SQLのUPDATEについて、教えてください。 (例) 売上実績には、売上日を過去3回前まで保存しており、 売上トランの売上区分が”1”の情報を元に、売上実績の売上日情報を更新しています。 【売上実績】 │店舗│今 回│前 回│前々回│ ┼──┼───┼───┼───┼ │A店│12/05 │10/25 │10/01 │ │B店│11/15 │10/18 │09/05 │ │C店│11/30 │10/05 │09/15 │ │D店│12/01 │12/01 │11/01 │ │E店│12/07 │11/07 │10/07 │ │F店│11/18 │10/17 │08/11 │ 【売上トラン】 │店舗│売上日│売上区分│ ┼──┼───┼────┼ │A店│12/08 │ 1 │ ※繰越対象 │A店│12/08 │ 2 │ │B店│12/08 │ 2 │ │C店│12/08 │ 1 │ ※繰越対象 │D店│12/08 │ 2 │ │F店│12/08 │ 2 │ ーー結果ーー 【売上実績】 │店舗│今 回│前 回│前々回│ ┼──┼───┼───┼───┼ │A店│12/08 │12/05 │10/25 │ ※繰り越される │B店│11/15 │10/18 │09/05 │ │C店│12/08 │11/30 │10/05 │ ※繰り越される │D店│12/01 │12/01 │11/01 │ │E店│12/07 │11/07 │10/07 │ │F店│11/18 │10/17 │08/11 │ ※Keyは”店舗”  UPDATE 売上実績   Set 売上実績.今回 =        (Select 売上トラン.売上日 From 売上トラン           Where 売上トラン.店舗 = 売上実績.店舗 AND 売上トラン.売上区分= 1 ),     前回 = 今回,     前々回 = 前回       Where Exists ( Select 売上トラン.* From 売上トラン              Where 売上トラン.店舗 = 売上実績.店舗               AND 売上トラン.売上区分= 1 ) 上記処理をPL/SQLで行いたいのですが、正しい処理結果が作成されるのでしょうか? よろしくお願いします。 ※ORACLE環境がなく、ACCESSではうまく動作しなった為、質問させて頂きました・・・

  • VB.NET DataReaderが開かれている

    おはようございます。 今回はVB.NETについて質問させてください。 【開発環境】 ・VB.NET(Visual Studio2010) ・PostgreSQL8.3 ・WindowsXP 【質問内容】 ある一定の操作をすると、 『この Command に関連付けられている DataReader が既に開かれています。このコマンドを最初に閉じる必要があります』 とエラーが出てしまい、例外で落ちてしまいます。 【落ちる原因の操作】 1.メインフレームを起動 2.親品番マスタから取得した親品番一覧を表示しているListViewの1件をダブルクリック 3.親品番に紐付いている子品番を品番テーブルから取得 4.表示内容の切り替えラジオボタンを全て⇒図面ありに変更 5.表示内容の切り替えラジオボタンを図面あり⇒全てに変更 6.表示内容の切り替えラジオボタンを全て⇒図面ありに変更 7.表示内容の切り替えラジオボタンを図面あり⇒全てに変更←ここで先ほどの例外が発生する。 【該当部分のソース】 Private Sub ArticleTableUpdate(ByVal sParents As String) Dim articleResult As Odbc.OdbcDataReader ' 品番テーブル用 Dim articleSql As String Dim zumenSql As String Dim sChild As String Dim articleCount As Integer Dim zumenCount As Integer Dim zumenFlag As String ' 品番テーブルからデータを取得するSQLを作成 articleSql = "SELECT * FROM ""ARTICLE_TBL"" WHERE ""P_ARTICLE_NUMBER"" = '" + sParents + "'" Debug.WriteLine("【ArticleTableUpdate】 品番テーブルからデータを取得SQL:" + articleSql) ODBCCommand.CommandText = articleSql ' 品番テーブルから該当の親品番のデータ件数を取得 'articleCount = ODBCCommand.ExecuteNonQuery() ' 品番テーブルに該当の親品番のデータが存在するか 'If articleCount = 0 Then 'Exit Sub 'End If ' 品番テーブルから該当の親品番のデータを取得 articleResult = ODBCCommand.ExecuteReader() ←ここで例外発生 ' 取得した件数分処理 While articleResult.Read() ' 子品番データを取得 sChild = articleResult("C_ARTICLE_NUMBER").ToString If sChild <> "" Then ' 子品番データをキーに図面マスタからデータを取得するSQLを作成 zumenSql = "SELECT * FROM ""ZUMEN_MST"" WHERE ""PLAN_NUMBER"" = '" + sChild + "'" Else sParents = articleResult("P_ARTICLE_NUMBER").ToString zumenSql = "SELECT * FROM ""ZUMEN_MST"" WHERE ""PLAN_NUMBER"" = '" + sParents + "'" End If Debug.WriteLine("【ArticleTableUpdate】 図面マスタからデータを取得SQL:" + zumenSql) ODBCCommand2.CommandText = zumenSql ' 図面マスタから該当の品番のデータの件数を取得 zumenCount = ODBCCommand2.ExecuteNonQuery ' 図面マスターに該当の品番のデータが存在するか If zumenCount = 0 Then ' 図面データが存在しない為、更新値を0とする zumenFlag = "0" Else ' 図目データが存在する為、更新値を1とする zumenFlag = "1" End If ' 品番テーブルを更新するSQLを作成 zumenSql = "UPDATE ""ARTICLE_TBL"" " + vbCrLf + "SET " + vbCrLf + vbTab + """C_ARTICLE_NUMBER"" = '" + sChild + "', " + vbCrLf + vbTab + """PLAN_FLAG"" = '" + zumenFlag + "', " + vbCrLf + vbTab + """UPDATE_DATE"" = '" + Today + "'" + vbCrLf + "WHERE ""P_ARTICLE_NUMBER"" = '" + sParents + "'" Debug.WriteLine("【ArticleTableUpdate】 品番テーブルを更新するSQL:" + zumenSql) ODBCCommand2.CommandText = zumenSql ' 品番テーブルを更新 zumenCount = ODBCCommand2.ExecuteNonQuery() End While articleResult.Close() ODBCCommand = New Odbc.OdbcCommand ODBCCommand.Connection = ODBCSession End Sub 【DB接続関数】 Public Function ODBC_CONNECT() As Boolean ' 戻り値をセット ODBC_CONNECT = False If ConnectFlag = False Then Try ODBCSession = New Odbc.OdbcConnection ODBCCommand = New Odbc.OdbcCommand ODBCCommand2 = New Odbc.OdbcCommand ' データベース接続情報 ODBCSession.ConnectionString = "Provider=MSDASQL;DSN=HOGE;UID=hogeU;PWD=hogeP;" ODBCCommand.Connection = ODBCSession ODBCCommand2.Connection = ODBCSession ' データベースに接続 ODBCSession.Open() ConnectFlag = True ODBC_CONNECT = True Catch Debug.WriteLine("えらー") End Try End If End Function 今のところ、このエラーが発生した場合、再起動すると発生しなくなるみたいです。(たまたまそうなったのかもしれません) 何か原因がわかる方、ご教授お願い致します。

  • SQL server:SELECT文について

    SQL serverにてデータの管理をしてます。SELECT文について質問なのですが、 例えば、取引先データが入っているテーブルを「A_取引先」とします。 また、ここ何年かの売上データが入っているテーブルを「B_売上」とします。 今回、取引先整理のため売上データ(B_売上)にない取引先を取引先データ(A_取引先)から抽出したいのですが、どのように書けばよいでしょうか not inを使っても「B_売上」にまったくない取引先は抽出されません。 分かりにくい文章かもしれませんが、ご教授の程よろしくお願い致します。

  • VBでExecuteが通らない

    朝倉@東京です。 VBで、以下の手順で ODBCデータベースを開きました。 Set wrkODBC = CreateWorkspace("NewODBCWorkspace", "admin", "", dbUseODBC) Set curDB = wrkODBC.OpenDatabase("", _ dbDriverNoPrompt, _ False, _ "ODBC;" & _ "DATABASE=" & CST_DB_NAME & ";" & _ "UID=;" & _ "PWD=;" & _ "DSN=" & CST_DS_NAME) その後レコードセットを取得する際に sql_str = "select * from テーブルA" Set pb_Rec_F5 = pb_curDB.OpenRecordset(sql_str, dbOpenDynaset) を実行して、 Data_String=pb_Rec_F5("~フィールド名~") でテーブルA内の各フィールドを呼び出して各処理を行いました。 ここからなのですが、データの削除を行う必要があって、 sql_str = "delete from テーブルA where Num = 0001" curDB.Execute sql_str を実行しようとすると 「ODBC--呼び出しは失敗しました。」(Error.Number 3146) とエラー表示が出ます。 ODBCの設定なども見ましたがよくわかりませんでした。 構文に間違いがあるのでしょうか?それともODBCの設定? 初歩的な質問ですがご教授お願いします。

専門家に質問してみよう