ACCESS+SQL Serverで主キーを自動採番する
ACCESSを独学で勉強を開始しているものです。
顧客管理のようなものを作りたいと思っているのですが、
オートナンバーではない主キー(顧客コード)を設定しているテーブルがあります。
顧客コードの構成はアルファベット1文字+数字8桁です。
そのうち、数字は西暦2桁+月2桁+日2桁+下2桁は連番です。
ACCESS2007プロジェクトで、SQL Server 2005 Express Editionへ接続しテーブルは作ってあり、既に顧客データが10件ほど入っています。
新規に顧客データを追加する際に、必要事項を入力し、登録ボタンを押した段階で顧客コードを自動生成し、重複チェックし、採番したいと考えています。
アルファベットは必要事項入力時に入力済み、日付もその日の日付を6桁設定し、とりあえず「01」と下2桁を採番して、現在のデータに同じものがないかチェックします。
そして、同じものがあれば「01」+1を繰り返しながらチェックしていくというようなコードはどのようにすればいいでしょうか?
わかりづらいとは思いますが、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
select max(mid([顧客コード], 8, 2)) as [連番最大値]
from 顧客テーブル
where [顧客コード] like アルファベット1文字 & 西暦2桁 & 月2桁 & 日2桁
group by mid([顧客コード], 1, 8) <--- left([顧客コード], 8)でも可
;
これで[連番最大値]が取得できたなら1加算。取得できなければ1を代入。
formar([次の連番], "00")で整形して連結。
select投げる前に、連番までのキー情報を作成して変数に入れとくほうがよさそうですね。
ありがとうございます!
なるほど、私のおバカな頭では、まず1をセットしてイコールじゃなくなるまで+1しながらループする・・・なんて無駄な処理を考えていたので、SQL一発でスッキリしてすごく参考になりました。
ちなみに、SQL ServerではMID関数がありませんでしたので、SUBSTRING関数を代わりに使用しました。あと、ワイルドカードも「*」ではなく「%」でした。
最終的なSQLは以下のようにして動作確認しました。
SELECT MAX(SUBSTRING([顧客コード],8,2)) AS [連番最大値]
FROM 顧客テーブル
WHERE ([顧客コード] LIKE 'アルファベット1+日付6桁%')
GROUP BY SUBSTRING([顧客コード],1,8)
有り難うございました。
ちなみに、GROUP BY がないと、どのようなときに困りますか?
まだSQL勉強不足でわからない事だらけなのですが。
No.2
- 回答日時:
#1です。
likeにワイルドカードの記述が不足してました。
where [顧客コード] like アルファベット1文字 & 西暦2桁 & 月2桁 & 日2桁 & "*"
group by mid([顧客コード], 1, 8) <--- left([顧客コード], 8)でも可
とは
group by mid([顧客コード], 1, 8)
または
group by left([顧客コード], 8)
です。念のため。
No.3
- 回答日時:
#1・#2です。
さらなる訂正があります。
mid(substrでしたね)で、8という値は誤りです、。正しくは 7。
A100402NN の先頭ですよね。8桁だとA1004020まで拾うので、11件目で重複が生じてしまいます。
> ちなみに、GROUP BY がないと、どのようなときに困りますか?
今回は無くてもOKでしたね。ここも勘違い。
「同日のアルファベット別」や「同一アルファベットの日付別」といった一覧作成時に用いてください。
この回答への補足
> mid(substrでしたね)で、8という値は誤りです、。正しくは 7。
SUBSTRINGしか使用してなかったので、気づいていませんでしたw
> 「同日のアルファベット別」や「同一アルファベットの日付別」といった一覧作成時に用いてください。
なるほど、そういう時に利用できるのですね。
覚えておきます。有り難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
ACCESSユニオンクエリでORDER B...
-
1日に1人がこなせるプログラム...
-
access2003 クエリSQL文に...
-
Nullの使い方が不正です。
-
Exel VBA 別ブックから該当デ...
-
access2021 VBA メソッドまたは...
-
VBAでdo内にてWAITを使うとエラ...
-
PreviewKeyDownイベントが2回...
-
COBOLの文法
-
WSH動作しない!!(WScript.Sle...
-
SQL
-
◾️Excel VBA 統合について Cons...
-
変数名「cur」について
-
VBA 現在のセル番地を記憶、復...
-
VBA・VB6.0・VB.NETの文字列型
-
特定行の背景色を変えたいのですが
-
ブログ等で公開されているサン...
-
wechatアプリについての質問で...
-
VLookup関数を使ってラベルに表...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
JANコードとPOSコードは同じ?
-
access2003 クエリSQL文に...
-
1日に1人がこなせるプログラム...
-
オートフィルタで抽出結果に 罫...
-
変数名「cur」について
-
JavaScriptの定数名が取り消し...
-
ACCESSユニオンクエリでORDER B...
-
Exel VBA 別ブックから該当デ...
-
UWSCでMOUSEORG関数が上手く処...
-
COBOLの文法
-
PreviewKeyDownイベントが2回...
-
1、Rstudioで回帰直線を求める...
-
VBAでファイルオープン後にコー...
-
【VB6】実行ファイルとした後、...
-
Nullの使い方が不正です。
-
特定行の背景色を変えたいのですが
-
◾️Excel VBA 統合について Cons...
-
アルファベットに付いて質問し...
-
Excel VBAでOpenTextのFieldInf...
おすすめ情報