• ベストアンサー

最終レコードの値の求め方について

WinXP、Access2002にて以下のような納入先テーブルを作っています。 ここで、あるフォームから、「0002:株B」の新しい納入先を登録する場合 納入先コードは「03」としたいのですが、その場合の 最終の納入先コードの求め方がわかりません。 (「0001:株A」だと次に追加する場合は「04」になる) DLastでは、フィールド内の最後の値になるため 用件を満たせません。。 「対象顧客IDの納入先コードの最終番号+1」を 求める命令文になると思うのですが・・ 顧客ID 納入先コード 会社名 都道府県 ------------------------------------- 0001  01      株A   大阪 0001  02      株A   東京 0001  03      株A   兵庫 0002  01      株B   北海道 0002  02      株B   京都 求める方法はおそらくSQLでも関数でもいけるような 気がしますが、どなたか教えてください。

  • SOU48
  • お礼率35% (51/144)

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

  • ベストアンサー
noname#22222
noname#22222
回答No.2

<納入先> ID  顧客ID 納入先コード 会社名 都道府県 1   1    1      A   XX 2   1    2      A   XX 3   1    3      A   XXX 4   2    1      B   XXXX 5   2    2      B   XX というテーブルとデータが存在する場合、 ? DBMax("納入先コード", "納入先", "顧客ID=1") + 1 4 ? DBMax("納入先コード", "納入先", "顧客ID=2") + 1 3 と、イミディエイトウィンドウで確認すれば良いと思います。 なお、DMAX関数は非常に遅いので自作した方がいいです。 (意見)列[会社名]と[都道府県]は無用かと思います。 Public Function DBMax(ByVal strField As String, _            ByVal strTable As String, _            Optional strWhere As String = "") As Variant On Error GoTo Err_DBMax   Dim N   Dim strQuerySQL As String   Dim rst     As ADODB.Recordset      Set rst = New ADODB.Recordset   strQuerySQL = "SELECT MAX(" & strField & ") FROM " & strTable   If Len(strWhere) > 0 Then     strQuerySQL = strQuerySQL & " WHERE " & strWhere   End If   With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then        .MoveFirst        N = Nz(.Fields(0), 0)      End If   End With Exit_DBMax: On Error Resume Next    rst.Close    Set rst = Nothing    DBMax = N    Exit Function Err_DBMax:    MsgBox "SELECT 文の実行時にエラーが発生しました。(DBMax)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBMax End Function

その他の回答 (1)

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.1

顧客ID、納入先コードがテキスト型だとして、 (1) DMax("納入先コード","納入先テーブル","顧客ID='" & [顧客ID] & "'")   を求める (2) (1)の値が Nullだったら "0" に変換 (3) 文字列から数値に変換 (4) 1を加算する。 (5) 2桁の文字列に変換。 以上のことは、書こうと思えば1つの式で書けます。 デバッグが大変なので、 途中の経過を変数に代入するほうがお薦めですが。 (特に初心者の場合には) ヒント (1) もし数値型なら 「'」はいらない。 (2) Nz関数 (3) "02" + 1 は、数値の 3 になるので実際は不要。   (暗黙の型変換です) (4) Format(数値,"00")   もし数値型なら 処理不要

関連するQ&A

  • 同じ値が存在しないレコードの抽出方法について

    下記のテーブルの中で、 b_tableテーブルのidフィールドの値が1つしかない(重複していない)フィールドを抽出したいと思います(この場合ですが、3002と3004を抽出したいです)。 その際、抽出条件を下記の【※※※ここに記述を追加※※※】に記述することで実現したいと思ったのですが、その場合どのようなsql文を書けば良いか分かりませんでした。 その為、このような場合、どのようなsql文を書けば良いかご存知の方がいらっしゃいましたら、ご教示の程、よろしくお願いします。 なお、【※※※ここに記述を追加※※※】に記述を追加したい理由ですが、既存のSQL文にこの条件を追加したいのですが、WHERE以前は別の部分に記述されており、その部分が変更できない為です。 なお、下記のWHERE以前の記述はあくまでサンプルであり、重複していないフィールドを抽出するSQL文と直接関係のない記述でしたら、変更していただいても大丈夫かもしれません(この点曖昧で申し訳ございません。移植元の記述ではテーブルを連結しているように見受けられたため、連結の仕方が多少変わる分には問題ないのかなと思っています。この点については実際にソースをご提示いただければ、それを元に移植させていただいた上で、ご回答差し上げたいと思います)。 ■SQL文 SELECT a.id FROM `a_table` AS a LEFT JOIN `b_table` AS b ON a.id = b.id WHERE 【※※※ここに記述を追加※※※】 ■a_tableテーブル CREATE TABLE IF NOT EXISTS `a_table` ( `auto_id` int(3) NOT NULL, `id` varchar(4) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `a_table` (`auto_id`, `id`) VALUES (101, '3001'), (102, '3002'), (103, '3003'), (104, '3004'); ■b_tableテーブル CREATE TABLE IF NOT EXISTS `b_table` ( `auto_id` int(3) NOT NULL, `id` varchar(4) NOT NULL, `no` varchar(1) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `b_table` (`auto_id`, `id`, `no`) VALUES (101, '3001', '1'), (102, '3001', '2'), (103, '3001', '3'), (104, '3002', '2'), (105, '3003', '1'), (106, '3003', '2'), (107, '3004', '1'); 以上、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Accessで作りたい資料があります!

    仕事で至急作らないといけない資料なので、よろしくお願いします。 概要を説明しますと、 ・A店・B店・C店の各顧客IDの一覧表を作る ・A店には900人の顧客、B店には350人の顧客、C店には145人の顧客がいる。 ・顧客は,だぶっていることがある。(A店の顧客でもあり、B店の顧客でもある場合がある) ・今つくったテーブルは以下の4つです。  1、(延べ)全顧客の名前フィールドと顧客番号フィールド  2 、顧客番号フィールドとA店の顧客IDフィールド  3 、顧客番号フィールドとB店の顧客IDフィールド  4 、顧客番号フィールドとC店の顧客IDフィールド 顧客番号とは全店共通の番号です。顧客IDは各店でおのおのつけています。最終的に作りたい表は横軸が「全顧客名」「顧客番号」「A店」「B店」「C店」となります。そして該当する店舗のところに顧客IDがはいります。むろん空欄もあります。 どのようにクエリを作成すればいいのでしょうか。Access初心者のため本当に困っています。わかりにくい説明ですがぜひよろしくお願いします。

  • 2つのフィールドの値が同じレコードをひとつと見なす

    id     field1     field2 1      1        A 2      1        A 3      1        B 4      2        A 5      2        B 6      2        C 7      3        D 8      3        D 9      3        D field1とfield2の値が他のレコードのfield1とfield2と重複している場合はひとつのデータとして返したいです。 id1.2はfield1とfield2の値が同じなので、ひとつのデータしか返しませんが、id3はfield2が異なるので返します。 id4.5.6はいずれもfield2の値が異なるので4.5.6全てを返します。 id7.8.9はfield1とfield2が同じ値なのでひとつのデータしか返しません。 id 1 3 4 5 6 7 該当するレコードは上記のように6個となるようにするにはどのようなsql文を発行すれば良いでしょうか? ご教示頂けますと幸いです。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • Access 既に開いているフォームへの値渡し

    Access初心者です。 業務管理DBを作成し、行き詰ってしまいました。 どなたかアドバイスお願いいたします。 フォームA:  受付日付、担当、顧客情報、注文内容などそれぞれのマスタテーブルからおもなフィールドを  クエリで作成 フォームB:  顧客情報テーブルを単票で作成 注文受付時に顧客がリーピータでない場合、フォームAからコマンドボタン実行し、 フォームBを開き、顧客情報テーブルに新規登録します。  《AからBをOpen》 フォームBで顧客情報の新規登録完了後、コマンドボタンを押下し、 その値(顧客ID)をフォームAに渡したいのですが、うまくいきません。  《B→A 値引き渡し》 --------------- Private Sub cmd_BT_Click() DoCmd.OpenForm "フォームA", , , "顧客ID=" & Me.顧客ID End Sub --------------- 他のフォーム間 《A→C》 では、上記のコマンドで正常に動作することを確認できています。 フォームA側のプロパティなど調べましたが、見当がつきません。 こういう場合は、どのあたりを手掛かりに調べればよろしいのでしょうか。 キーワードなどなんでも結構です。 用語などまだ理解していないところはありますが、 なにとぞご教示願います。

  • クエリ表示と、ADOで抽出したレコードセットが違う

    Accessで作ったクエリで表示されるデータと、VBAでSQLを組んでそのクエリから抽出したデータが異なるので困っています。 ちょっと言葉では説明しにくいので表で説明します。 元となるテーブル(t_test)がたとえば以下のようになっているとします。 t_test 顧客id  商品id 1      A-1 2      A-2 3      B-1 4      A-1 これを元に、以下のようなクエリ(q_test)を作ります。 q_test 顧客id  商品id  式1: IIf([商品id] Like "A*",1,0) 1      A-1    1 2      A-2    1 3      B-1    0 4      A-1    1 VBAで以下のようなSQLを実行すると、なぜか式1の値が全て0となります。 sql = "SELECT * FROM q_test" 1      A-1    0 2      A-2    0 3      B-1    0 4      A-1    0 式1でLIKEを使っていることが原因なのか、 IIf([商品id] = "A-1",1,0) とかだと、クエリとSQLの結果に違いはありません。 IIfだけでなくSwitchを使った場合も同様(LIKEだとおかしい、=だと平気)でした。 ちなみに、Accessのバージョンは2003、VBAで使っているレコードセットはADODBです。 (今確認したところ、DAOでは問題なくできました。) 冒頭で、困っていると書きましたが、これを回避する方法はいくつか思いついていますので、 別の方法を教えていただきたいわけではなく、単純になぜこのようなことが起きるのかが知りたいです。 是非よろしくお願いします。

  • 重複していないレコードの抽出方法について

    下記のテーブルでフィールドAとBの関係で矛盾が生じているID 1と2を抜き出すSQLを必要としております。 AとBを合体させて判断しようと試みましたがダメでした。 ご存知の方ご教示いただけると大変助かります。 【テーブル】 ―――――――――― |ID| A |B| ―――――――――― |1 |AAA|B | |2 |AAA|C | |3 |BBB|D | |4 |BBB|D | |5 |CCC|E | |6 |DDD|F | ―――――――――― よろしくお願いします。

  • MySQLで別テーブルを参照し、レコードを消したい

    お世話になります。MySQL4のデータベース上に2つのテーブルがあるのですが、 片方のテーブル(a)にあるフィールド(b_id)の値を参照し、もう片方のテーブル(b)のレコードを消していきたいのです。 具体的には以下のようなテーブル(a)とテーブル(b)があります。 TBL: a =========================== id    b_id    category =========================== 0     1       3 --------------------------- 1     2       1 --------------------------- 2     3       2 --------------------------- 3     4       2 --------------------------- TBL: b =========================== id    name    price =========================== 0    goodsA   1,000 --------------------------- 1    goodsB   500 --------------------------- 2    goodsC   250 --------------------------- 3    goodsD   2,500 --------------------------- 4    goodsE    1,800 --------------------------- やりたいことは、テーブル(a)の「category」フィールドが「2」以外であれば、 そのレコードの「b_id」にある数値を「id」にもつ、テーブル(b)のレコードを消していきたいのです。 上記の例だと、テーブル(a)のid「0」と「1」がcategoryに「2」以外を持っています。 この2つのレコードのb_idは「1」と「2」ですので、テーブル(b)のid「1」と「2」を消したいと思っています。 SQLについて知識がなく、困っています。どなたかご存知の方がいらっしゃいましたら、お知恵をお貸しください。 よろしくお願いします。

  • ACCESSで複数あるコードを分類して1レコードで集計したい

    いつもお世話になっています。 ACCESS初心者です。ACCESS2000を使用しています。 下記のような表をACCESSで、集計したいと思っています。 顧客ID 商品コード 商品購入日 1    123     20050223 1    124     20050403 2    123     20050302 3    124     20041223 3    133     20050131 これを、1顧客1レコードとして集計したいのです。 それぞれの商品フィールドをつくり、各購入数と そのうち一番最近購入した商品コードと、日付を 顧客別に一覧表示したいのです。 顧客ID 商品123+124 数 123+124購入日 商品133 数 133購入日 1    124      2   20050403     2    123      1   20050302 3    124      1   20041223    133   1   20050131 ↑こんな感じです。 これを最終的には、csvで書き出したいと思っています。 色々試してみましたが、思ったような結果がでません。 ご教授よろしくお願いいたしますm(__)m

  • リレーションシップの設定について

    リレーションシップの設定について Access2002にて受注管理を行っており テーブル、フィールドが次のように存在しています。 <T_納入先>  顧客ID  納入先コード  住所等情報... <T_顧客>  顧客ID  住所等情報... <T_売上情報>  受注ID  顧客ID  売上日やその他情報... <T_売上明細>  受注ID  明細や金額等... ---------- <T_顧客>に登録した顧客は複数の納入先を持つため [<T_顧客>の顧客ID 対 <T_納入先>の顧客ID]を[1 対 多]にてリレーションシップを作成しています。 <T_売上情報>の顧客IDと、<T_顧客>の顧客IDを[1 対 1]にて リレーションシップを作成しています。 ---------- ここで売上情報を登録するために「売上入力フォーム」なるものを作成し、 顧客IDや納入先の指定、売上日の記録や売り上げた明細を登録したいのですが 明細の入力部分は、サブフォームを作成し、<T_売上情報>と<T_売上明細>のクエリで問題ないのですが このフォーム自体のレコードソースとして使用するために <T_納入先><T_顧客><T_売上情報>の3つのテーブルの情報を含んだクエリを 作成したのですが、クエリ作成後、実行してもレコードが一切表示されません。 (おそらく<T_顧客>の中にさらに納入先が複数ある部分が うまくリレーションシップできていなくて矛盾を起こしているのでは・・と思ったのですが。) もちろん<T_納入先>と<T_顧客>のみであれば問題なくクエリは実行し、レコードも表示されます。 ある一つの顧客情報内にも複数の情報(=納入先)がある場合、 リレーションシップの設定はどのようにすればよいでしょうか。 長々とありますが、お分かりのかた是非とも教えて下さい。 よろしくお願いいたします。

  • DELETE命令

    例えば テーブルAとテーブルBがあり 両方に顧客ID、店舗IDがあります。 もしテーブルA、Bのレコードで 顧客ID、店舗IDが同じなら テーブルAのみレコード削除したいです。 このような場合のSQL文を教えてください。 よろしくお願いします。

専門家に質問してみよう