• 締切済み

アクセスでSQLを実行させて値をとりたい

masterテーブルに管理noをキーとしてデータが入っています。 管理noは完全に連番になっておらず、ただ新しく追加するものは 最大+1の番号を割り振るようにしようと思っています。 そこで新規追加のフォームを開くと管理noの欄に最大+1の番号が 表示され変更出来ない設定にします。 SQLで書くと select max(管理no)+1 from master でしょうか。 この命令を実行させて返ってきた数字を使いたいのです。 SQLを実行させる為の変数宣言の辺りから詳しくお願いします。 ちなみにMDBもフォームも同じアクセス2003のファイルにあります。

みんなの回答

  • hs1009
  • ベストアンサー率0% (0/0)
回答No.1

連番に意味を持たせないなら、単純に登録する際にぶつかる事のない値を格納してはどうでしょうか? 私はこのような場合には "yyyymmddhhssmm" & "ミリ秒5桁" を登録するタイミングで取得・セットしています。 おそらくdrdrdrdrさんが開発しているPGは、1台のPCでのみ使用するものだと推測します。新規追加フォームを開く時にレコードを追加すると言う事は、ユーザーが登録を行わなかった場合、その不必要なレコードを削除しなければならない手間が出てきます、これは連番のインクリメントでも同じ事が言えると思います。 管理noがどうしても新規追加フォームへの表示が必要であれば、避けては通れませんが... なので登録ボタンクリック時に、下記のようなSQLを書いてみれば... Dim str管理cd AS String str管理cd = Format(Now,"yyyymmddhhmmss") & ミリ秒 INSERT INT master VALUES(str管理cd, フィールド1, フィールド2, ...)

drdrdrdr
質問者

お礼

ありがとうございました。 今回はサブフォームを見えない状態にして埋め込みSetFocusしてとりました。 しかし今後もsqlの実行(select文)結果がほしくなる事が絶対あるのでその時どうするかが問題です。

関連するQ&A

  • アクセスの連番について

    アクセスでテーブルのkanri_Noという項目に管理番号を振りたいと思っています。 他のテーブルに後でインサートするので、そのテーブルのKanri_NOの最大値をKanri_Maxとして引いてきてそのKanri_Max+連番という風に振りたいのですが、どうSQLを入れればいいのか分かりません。 Kanri_Maxが4000だったら、4001、4002、4003・・・、Kanri_Maxが5000だったら5001、5002、5003とKanri_Noの項目に連番を振りたいのです。 連番を振る前のKanri_Noは空白です。 初心者で申し訳ないのですが教えてください。

  • VS2005でSQLを実行したいんです。

    Visual studio 2005(C#を使っています)でAccessのデータベース(mdbファイル)を扱っているのですが、プログラムを実行する度に(データベースの)あるフィールドの最大値・最小値を取得出来るようにしたいと考えています。その為、SQL文をmdbファイルに対して実行し、その結果を数値として取得したのですが、その手段がなかなか見つかりません。 mdbに対してSQL文を実行する方法をご存知の方がいらっしゃいましたら、どなたか教えて頂けないでしょうか。宜しくお願いします。

  • PLSQLでのSQLの実行に関しての質問

    [環境] db:oracle 11g express edition os:windowsXP 言語:PLSQL [質問] PLSQLを使用したプログラムを作成していたのですが、SQLの文字数がVARCHAR2(32767)で宣言した変数の文字数を超えてしまいエラーとなります。 理由としては、引数で受け取った配列の数分だけUNIONでSQLを結合し、変数に格納しているのですが、配列の量が多いと変数の最大文字列を超えてしまうようです。(ソースイメージは下記に記述) 対応としては、変数を分割し、SQLを実行することや、SQLを組みなおすなどの対応が考えられるのですが、”(1)処理速度の都合上、できれば1度のSQLで実行したい。”、”(2)抽出条件が配列の条件によって、複雑に変わることと、既に稼働しているプログラムの為あまりソースを変更したくない”という理由から検索条件は変えずに、1度のSQLでどうにか実行できないかと考えています。 上記条件をクリアする何か良い方法はありますでしょうか? (もし、1回のSQLで実行は難しいのであれば、最悪配列を使用してSQLを分割して対応しようとは思っています。ただ、他に方法があるのであればそれに越したことはないです。) どなたか良い方法をご存知の方がおりましたら教えていただけないでしょうか? 宜しくお願い致します。 [ソースイメージ] <引数> 配列[100];          <-- 条件が格納された配列 <変数定義部> hensu_union VARCHAR2(32767); <-- 結合したSQLを格納 hensu_where VARCHAR2(1000); <-- SELECTの条件の格納 <プログラム部>  <省略>  .  .  .   FOR i IN 1..配列分 LOOP <-- 配列の数分、UNIONでSQLを結合 IF i > 1 THEN hensu_union := hensu_union || 'union '; END IF; hensu_union := hensu_union || 'select A,B,C .... from マスタA、マスタB WHERE ' || hensu_where ;  ←ここのUNIONで結合しすぎると最大文字列を超えエラー  END LOOP; . .  省略 . .   OPEN カーソル名 FOR hensu_union ; ←SQLを実行する部分でどうにか1回で済ませたい。                    VARCHAR2を超えるような文字列を格納できたり、                    他の良い方法はあるのか?

  • 一度のSQL発行で結果を得るにはどのようなSQLにすれば良いでしょうか

    一度のSQL発行で結果を得るにはどのようなSQLにすれば良いでしょうか? データベースはOracleです。 二つの履歴テーブルがあり、それぞれ主キーは「連番」です。 連番が最も大きい値の社員番号と社員名を取得しようとしています。 (他にもカラムはありますが質問では省略しています。) 連番は別に管理テーブルがあり、そちらから採番しているので 二つのテーブルで連番が重複することはありません。 【RIREKI_TBL_A】 連番 NUMBER(10) 社員番号 VARCHAR(7) 社員名 NVARCHAR(20) 【RIREKI_TBL_B】 連番 NUMBER(10) 社員番号 VARCHAR(7) 社員名 NVARCHAR(20)

  • 1回しか実行していないはずが、2回SQLが実行?

    リンクをクリックするとPHPで以下のようなINSERT文が中で実行されるプログラムを記述しました。 実行したところ、当然画面には「*」が一つだけ表示されるのですが、 なぜがSQL自身が2回実行されてしまう状況に陥りました。 echo "*"; $sql0 = 'INSERT INTO wakuwaku (customer_id,comment ,up_date,type,var_id) VALUES ( ?,?, ?, ?,?)'; $message = "わくわくが追加"; $type0 = array('integer','text', 'timestamp', 'text','integer'); $data0 = array($target_custid,$message,$upp_date,"iine_click",$target_id); $sth0 = $mdb2->prepare($sql0, $type0, MDB2_PREPARE_MANIP); $res0 = $sth0->execute($data0); 別の部分で同様な実行をしている可能性を考えて、上記の$messageをAAA等の他の文字列に 変えたところ、変えた文字列で2重実行されたので、はやり上記のSQLがなぜか2回実行されているようです。 まわりにfor文などはなく、*が一回しか表示されていないことからも、 プログラム自体の実行は1巡だけだとおもうのですが、なぜSQL部分だけ2重に実行されるのでしょうか。 ちなみに、エラーの表示はありません。 さらに、自端末のXAMPP環境下では、上記の問題は発生せず、 なぜか、ロリポップ上で動かすと、再現するようです。 いろいろ切り分けを行ったのですが、正直お手上げです。 切り分け方法を含めて、アドバイスいただけると幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • Access パスワード付きDBへの接続について

    お世話になります。 アクセスについて行き詰まりましたので質問をさせて下さい。 現在、Access2000にて開発を行っております。 フォームやクエリのみのファイル(A.mdb)と、DBのパスワード設定がされているファイル(B.mdb)があり、B.mdbはA.mdbのリンクテーブルとなっています。 A.mdbにはフォームが複数あり、フォームA上のボタンを押下するとDoCmd.Openform命令にてフォームBが立ち上がります。 フォームBではレコードソース(SELECT文)が設定されており、データが画面の各項目に表示された状態でフォームBが立ち上がる動きとなっています。 ここで問題なのですが、DBにパスワードが設定されているため、フォームBのレコードソースのSQL文が実行された時に「パスワードが正しくありません」というエラーが発生しフォームBを立ち上げることが出来ません。 フォームBのOpenイベントにDBへ接続するプログラム(OpenDatabase命令で4つ目の引数にパスワードを設定)を入れましたがエラーは変わりませんでした。 解決策をどなたかご存知でしたら、ご教授いただきたいと思います。 以上、よろしくお願い致します。

  • (ACCESS)連番取得について

    アクセスで顧客管理をしています。 DMax関数を用いて、レコードを追加する度に自動で連番を振る設定に したいと思っていますが、上手くいかないため質問させてください。 【テーブル名】T_顧客一覧 【入力用のフォーム名】F_顧客登録 【連番を入力させたい項目(フィールド名)】No(テーブルでは主キーに設定) とし、フォームの”No”の既定値に   =DMax("No","T_顧客一覧")+1 と入力するのですが、フォームには1としか表示されません。 非常に初歩的な質問だとは思うのですが、 何か原因として考えられることがありますでしょうか? 情報が足りないようでしたら補足させていただきます。 よろしくお願いします。

  • SQLのパラメータ・・

    たびたびお世話になっております。 顧客マスタの新規コードを、最大値に1を足して生成しています。 既存の顧客コードの最大値を求める為、 Dim mySQL as Stirng,Rst as Recordset mySQL="SELECT Max(局コード) AS 局コードの最大, 会社コード FROM 顧客マスタ GROUP BY 会社コード HAVING (会社コード=[Forms]![フォーム]![テキスト1]);" Set Rst = CurrentDB.OpenRecordset(mySQL) というSQL文をかきました。 ところが、SQLをレコードセットにすると「パラメータが少なすぎます。1を指定してください(3061)」というエラーメッセージが出てしまいます。 クエリーを作成して実行しても正しい結果を返すのに、SQLだとダメなのはなぜなのでしょうか。 どうぞよろしくお願いいたします。

  • ACCESSのSQL文

    ACCESSのSQL文 いつもお世話になります。 SQL文でテーブルのデータを抽出したいのですが上手くいきません。 Dim rs4 As ADODB.Recordset Dim cmdrs4 As New ADODB.Command Set cmdrs4.ActiveConnection = CurrentProject.Connection a = "SELECT 管理NO" & " FROM マスタ" If strFlter = "" Then a = a & ";" Else a = a & " WHERE " & strFlter & ";" End If cmdrs4.CommandText = a Set rs4 = cmdrs4.Execute() MsgBox rs4.GetString aの内容は a = "SELECT 管理NO FROM マスタ WHERE 管理NO Like ""*2*"";" 実行すると、rs4.GetString文で下記エラーが出ます。 「BOFとEOFのいづれかがTrueになっているか、または現在のレコードが削除されています。 要求された操作には、現在のレコードが必要です。」 aを "SELECT 管理NO FROM マスタ WHERE 管理NO = ""2-6"";" なら問題ありません。 Likeの使い方が悪いのでしょうか? よろしくお願いします。

  • アクセスのクエリを開く前にマクロを実行できますか?

    フォームやレポートを開く前にマクロを実行できますが、同様のことをクエリを開く前にもする方法はないでしょうか? 具体的には、いくつかのテーブル作成クエリと追加クエリをまとめて行うマクロを実行してから、選択クエリを開きたいのです。 「SQLビューで1行加えるだけ」みたいなのができると助かります。 よろしくお願いします。

専門家に質問してみよう