• ベストアンサー

ストアドの作成のコツは?

普段はAccessMDBの開発が多いのですが、ADPでのプログラミングに挑戦しています。 TSQLの理解が浅く、ストアドの作成のコツがつかめません。ご教授頂けませんか? やりたいことは、 ユーザーテーブルにある月間の集計を集計用テーブルへ書き出したいのです。 条件としては、集計テーブルに該当月のデータがない場合は追加、ある場合は更新としたいのです。 Accessからは、コマンドボタンからユーザーIDと該当年、月をパラメータとして渡すことを考えています。

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

  • ベストアンサー
  • sakko99
  • ベストアンサー率63% (19/30)
回答No.4

select 氏名 dateadd(mi, cast(substring(時間2,3,2) as int), dateadd(hh, cast(left(時間2,2) as int), [対象月]))- --AS 時間2 dateadd(mi, cast(substring(時間1,3,2) as int), dateadd(hh, cast(left(時間1,2) as int), [対象月])) --AS 時間1, from ・・・datediffは不要でした。

mymy_y
質問者

お礼

何度もご丁寧にありがとうございました。 少しT_sqlが理解できたような気がします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • sakko99
  • ベストアンサー率63% (19/30)
回答No.3

もう解決されているかもしれませんが。 >集計元に時間2-時間1がある場合のものですよね。 時間がvarcharとはどのような持ち方ですか? 09:00→0900ですか? dateadd, left, substr, datediff 等の関数を調べてみてください。

mymy_y
質問者

補足

お世話になっております。実はまだ解決しておりません。 集計元は 氏名、日付、時間1、時間2とあり、以下のようなデータです。 太郎、2006/4/1、0900、1200 太郎、2006/4/2、1200、1700 次郎、2006/4/1、0900、1730 次郎、2006/4/2、0900、2130 この集計元から 太郎、2006/4、8 次郎、2006/4、21 のような集計を行いたいのです。 datediffを使う場合、日付と時間1、日付と時間2を結合して、日付型へ変換する必要がありそうですね。 となると、 Select 氏名,sum(datediff(日付+時間2,日付+時間1)) From 集計元 Where 日付>=2006/4/1 And 日付<=2006/4/30 Group by 氏名 といった感じでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • sakko99
  • ベストアンサー率63% (19/30)
回答No.2

>集計では、各レコードでの計算を行うつもりですが、 集計元テーブルの構成が分かりませんと、何とも。 何をどう集計したいのですか?

mymy_y
質問者

補足

お世話になっております。 説明不足で申し訳ありません。 データとしては、 名前(nvarchar(20)、日付(datetime)、時間1(nvarchar(4)、時間2(nvarchar(4)とありまして、 名前毎の時間2-時間1を計算し、月間の合計として集計を行いたいのです。 前の回答を頂いたサンプルでは、 集計元に時間2-時間1がある場合のものですよね。 この時間差もストアド内で行いたいと考えています。

全文を見る
すると、全ての回答が全文表示されます。
  • sakko99
  • ベストアンサー率63% (19/30)
回答No.1

if(select(*) from Table1 where f_m=@m)>0 begin insert into Table1 (f_m, f_data) select m, sum(d) from Table2 where m=@m group by m end else begin update Table1 set fdata=d from Table1 T1 inner join ( select m, sum(d) from Table2 where m=@m group by m ) T2 on T1.f_m=T2.m end ・・・こんな感じですかね。うちではIF文で分岐させています。

mymy_y
質問者

補足

ご親切なサンプルをありがとうございます。 併せてもう一点ご教授頂きたいのですが、 集計では、各レコードでの計算を行うつもりですが、 VBAのレコードセットからループする方法しか思いつかないのですが、ストアドでもそのようにするものでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Accessプロジェクト ストアドプロシージャでのデータ更新

    AccessのMDBをADPへ作り変えています。 MDBの更新クエリーの場合、「レコードの更新」欄に更新したい値を記述します。たとえば、ユーザー定義関数を使っている場合は、ユーザー関数名([○○○]) ・・・。 これと同じことを、ADPのストアドプロシージャで行う場合はどのようにすればよいのでしょうか? スツアドプロシージャは「デザイナを使用してストアドプロシージャを作成する」を使って作成しています。ここで、「新しい値」欄に ユーザー関数名(○○○) と記述すると、 ”ADOエラー:"ユーザー関数名"は関数名として認識されません” となります。 初めてADPを使用するのでよくわかりません。 以上、よろしくお願いします。

  • アクセスadpでのDLookUp関数

    アクセス2003 adpのレポートのあるコントロールのコントロールソースにDLookUp関数を使おうとしています。 =DLookUp("列名","ストアドプロシージャー名") *ストアドプロシージャーの抽出条件にパラメータを設定してあります レポートの「入力パラメータ」にも記入してあります *ストアドプロシージャーを実行した結果のレコードは1つのみです mdbでは =DLookUp("列名","クエリー名") でうまくいっていたのですが adpの場合#エラーになってしまいます 一時ファイルにレコードを追加してそれを引数にすればうまくいくのですが、 できればストアドプロシージャーを引数にしたいと思っています。 どなたかご教授をお願いいたします

  • SQLSERVERエージェントからのストアド実行方法について

    いつもお世話になります。 表題の件ですが、当方オラクル育ちの為四苦八苦しながらの開発です。 とりあえずストアドの作成、登録、クエリアナライザーからの実行、デバックまでは完了しており 最終的にSQLSERVERエージェントのジョブ登録にて毎日設定した時間に作成したストアドを実行したいと思っているのですがエージェントからストアドを起動させるステップのコマンド記述が良く分からないのです。 exec aaa (パラメータ無しです) と書いて実行しても ”ジョブは失敗しました。 ジョブは ユーザー sa が起動しました。最終実行ステップはステップ 1 (ステップ 1) でした。” というメッセージが表示されます。 エージェントから起動する場合、どのようにコーディングすればいいのでしょうか? 開発環境はsqlserver2000です。 申し訳ありませんが宜しくお願いします。

  • 【SQLServer ストアドプロシージャ】 変数の定義型について

    SQLServer暦が浅くいまいち把握できていないので 詳しい方教えてください。 SQLServerのストアドでは変数の型に、既存のテーブルの型を流用できないのでしょうか? ORAcleでは以下のような定義が出来たので不便に感じています。 【テーブルM_USER】 USER_ID VARCHAR2(8) USER_NANE VARCHAR2(50) ・・・ ・・・ 上記のようなテーブルがある場合、 変数を「VAR_USER_ID M_USER.USER_ID@TYPE」 のような宣言ができ、 VAR_USER_ID変数はテーブルM_USERのUSER_IDと同じ型、ということになります。 SQLSERVERではこのようなことは出来ないのでしょうか?

  • ストアド、トリガーの同時呼出

    SQL Server 2008 です。 在庫管理DBを作ろうとしています。 複数のクライアントから一つのレコードに更新が発生した場合を考えています。 複数のクライアントから同一のストアド(在庫引落)を読んだ場合 呼ばれたストアドは同時に複数走るのでしょうか、一つずつ走るのでしょうか? こんな時(在庫引落)はストアドにパラメータを渡すよりも、一時テーブルに 書き込んで、トリガーで更新(引落)ってな事をした方がいいのでしょうか? その場合トリガーも同時に走るのでしょうか?一つづつでしょうか? 複数のクライアントから更新がかかり、直接レコードを更新出来ないような 場合はSQLではどう処理するのがメジャーなんでしょうか? オフコンでは仮想記憶って云うのがあって、そこに書き込むとバックグランドで ウェイティングしていたプログラムが一件ずつ読み込んで更新する仕組みでした。 更新が終わると、また読込みでウェイティングする仕組みです。 複数の端末から一つの仮想記憶に書きこみ、読込みはシーケンシャルで一件ずつですので、 在庫がマイナスになることは合っても、整合性が取れなくなることはありませんでした。 こんな仕組みでSQLに移行したいと考えています。

  • SQLServer2008R2 ストアド

    データベースはSQLServer2008R2を使って開発を行っています。 トリガを作成する事になったのですが、ストアドは初心者です。 なにかと足りない内容などがあると思いますが、ご了承下さい。 あるリンクテーブル(ODBC経由)でInsertの処理があった場合にSQLServerのテーブルにInsert処理を行いたいと思っています(履歴を作成する為)。 しかしリンクテーブルの定義が分からず、現在調べている最中です。 ちなみにリンクテーブルは下記の内容になります。 select * from openQuery (Host39Kelfjk, 'select * from TblAkDfoe') リンク:「Host39Kelfjk」.「DB1」.「Host39Kelfjk」 リンクサーバ:Host39Kelfjk カタログ:DB1 テーブル名:TblAkDfoe 参考になるような、サイトなどありましたら教えて下さい。 宜しくお願いします。

  • ストアドのフィールド指定方法

    MS SQL Server7.0のストアドプロシージャについての質問です。 複数のフィールドを持つテーブルの、各フィールドに入ってる値を順番に調べる方法について教えて下さい。 具体的には、フィールドは"月日_01"から"月日_31"まであり、各フィールドには"1"か"0"のどちらかの値を持ってます。この31個のフィールド値を調べて、"1"と"0"の各合計値を求めたいです。 ADOのレコードセットなら、Fields でフィールドのインデックス値を指定出来ますので簡単にループ処理できますが、ストアドの場合インデックスによるフィールド指定がうまく出来ません。 現在はIF文で各フィールドを一つづつ判定してる状態です。もっとスムーズに行う方法がありましたらご教授下さい!どうぞ宜しくお願いします。

  • ストアド内で動的にSQLを作る際のLIKE演算子シングルクォーテーションの数

    現在Access2003とSQLServer2005ExpressEditonで勉強中の者です。 ストアドプロシージャを動的に作成したいと思い 以下のページを参考に、NorthwindCS.adpはダウンロードせず 自前で簡単に環境を作ってストアドプロシージャをつくりテストに成功しました。 http://support.microsoft.com/kb/286828/ja そこで「もし検索対象のテーブルに摘要欄があり、"未"を含む検索をしたい場合はどうすればよいか」と思い、摘要フィールド(Varchar)を作成してストアドプロシージャに変数@TEKIYO(Varchar)を作り、以下の行を足しました。 ---------------------------------------------------------------- --摘要の検索条件がNULLかどうかを確認します。 --ここに値が含まれている場合WHERE句を作成します。 IF @TEKIYO IS NOT NULL BEGIN IF @SQLSTRING IS NOT NULL BEGIN SELECT @SQLSTRING = @SQLSTRING + ' AND TEKIYO LIKE ''%''' + @TEKIYO + '%''' END ELSE BEGIN SELECT @SQLSTRING = 'WHERE TEKIYO LIKE ''%''' + @TEKIYO + '%''' END END ---------------------------------------------------------------- adpの検索フォーム摘要欄に「未」と入力し実行ボタンを押すと「実行時エラー102 '未'付近に不適切な構文があります」と出てしまいました。 シングルクォーテーションの打ち方が間違っているのだろうと色々調べたり、打ち方を変えてみたりしたのですが、解決できず悩んでおります。 正解はどうなのでしょうか?教えてください。 なにとぞよろしくお願いいたします。

  • ストアド実行時のタイムアウト

    SQL-Server2000,VB6 データ抽出クエリを高速化すべくストアドプロシージャをVBプログラムから起動しています。 以下抜粋 cmd.ActiveConnection = Conn cmd.CommandText = sp_Shukei cmd.CommandType = adCmdStoredProc Set Rs = cmd.Execute 抽出基となるテーブルのレコード件数が大量になったせいなのか、最近以下のエラーが発生するようになりました。 -2147217871(80040e31)[microsoft ] [odbc sql server driver]時間切れになりました いろいろ調べて、プログラムで Conn.CommandTimeout = 0 としてもだめでした。 ストアド自体はReadOnlyですし、トランザクション排他待ちが起きている可能性はありません。 ですのでLOCK_TIMEOUTとは違うと思っています。 単にストアドに記述しているクエリの解釈か実行に時間が掛かっているものと思えるのです。 DB接続自体はこの処理前に何の問題もなく終わっています。 ※実はエンドユーザ環境でのみ発生します。開発環境で同じデータ量で試しても再現しないのです。 エンドユーザのネットワークが遅いのも、ひとつの原因になっているものと思われます。 時間切れを起きなくするにはどうしたらよいのでしょうか? どなたかご存知の方、教えてください。

  • vbからストアドプロシージャ内発生のエラーメッセージ取得

    タイトル通りの質問です。例えば、重複キーエラー時等はクエリアナライザを使用してストアドプロシージャを実行した場合に、「PRIMARY KEY 違反、制約 'PK_xxx': オブジェクト 'tbl_xxx' には重複したキーは挿入できません。」という様なメッセージが返されます。このメッセージをVB側に返したいのですが、方法がわかりません。質問は以下の3つです。 1)上記の様なエラーの場合は、vb側でon error goto&errorsコレクションでエラーハンドリングは出来ないのでしょうか?(現状トラップしてくれません。) 2)出来ないのであれば、ストアド内でエラーメッセージを取得して、outputパラメータで返却するしかないのかなと思っております。 3)なぜか、create tableで既にあるテーブルを指定してわざとエラーを発生させた直後に@@errorでvb側にリターン値を返却してもempty値として返されます。なぜでしょう。 以上、3点について教えて下さい。(何れかでも構いません)よろしくお願いします。 環境:win2000,sqlserver2000