• ベストアンサー

oracle8に接続、Access97での質問。自動でIDを取得するには…

仮にoracleのテーブルのデータ(02EE9001、02EE9002)があるとしAccessのフォーム上でIDコードを入力しなかった場合自動でIDコードを割り当てられるようにしたいのです。たとえば今Accessのフォーム上でIDコードを入力しないで登録した場合、02EE9003が自動で割り当てられるようにしたいのですがどうすればいいですか?ちなみ16進数でIDコードを割り当てています。しかも、02EEは固定です。仮にコードを割り当てられなくなったときは「空きIDがありません。」というようなメッセージも出したいのです。どうかよろしくお願いします。かってなことばかりですみません。

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.3

こんにちわ。 トリガは、DDL (Insert/Delete/Update) 文実行時にDDL の延長上で 動くPL/SQL の事です。 詳細は、PL/SQL のマニュアルを参照してみてください。 ちょっとプログラムを書いてみましたので、参考にしてみて下さい。 ※ 但し、このプログラムには以下の問題がありますので   ご注意下さい。   1. 採番テーブルにあるコードが全て採番済みになっている     場合を考慮していません。   2. テーブルから採番をしているため、複数の端末から同時に     Insert が行われた時に、同じ番号を採番してしまう可能性     があります。 --採番テーブル Create table SeqTab ( code varchar2(8) not null, flag varchar2(1) not null ); Create index IXseq on Seqtab(flag); --実際にデータを登録するテーブル Create table test ( id number not null, code varchar2(8) null ); -- 採番テーブルを初期化するプロシージャ declare vcode varchar2(8); begin FOR vloop in 9000..9100 LOOP vcode := '02EE' || to_char(vloop, 'FM9999'); Insert into SeqTab(code, flag) values (vcode, '0'); END LOOP; commit; end; / -- Insert 文実行時のトリガ Create or Replace trigger Ttest before insert on test for each row declare vcode varchar2(8); begin IF :new.code IS NOT NULL THEN -- code が指定されていれば、採番テーブルの該当番号を -- 採番済みにする Update SeqTab set flag = '1' where code = :new.code; -- 採番テーブルに無いcode が指定されたら、採番テーブルに -- 登録する IF SQL%NOTFOUND THEN Insert into SeqTab (code, flag) values (:new.code, '1'); END IF; ELSE -- 採番テーブルから未採番のコードを取り出す Select min(code) into vcode from SeqTab where flag = '0'; -- 採番テーブルの該当コードを採番済みにする Update SeqTab set flag = '1' where code = vcode; -- 採取したコードをセットする :new.code := vcode; END IF; end; / 採番テーブルを初期化した状態で、TEST 表にデータをInsert すると 定義したトリガが動きます。 SQL> insert into test (id, code) values (1, '02EE9001'); SQL> insert into test (id, code) values (2, '02EE9999'); SQL> commit; SQL> select * from test; ID CODE ---------- -------- 1 02EE9001 2 02EE9999 この状態で採番テーブルの状態を確認すると、 SQL> select * from Seqtab where code in (select code from test); CODE F -------- - 02EE9001 1 02EE9999 1 のようになっています。 ここで、code=null としてデータをInsert すると、採番テーブルから 未採番 (flag='0') のデータを検索して採番します。 SQL> insert into test (id, code) values (3, null); SQL> insert into test (id, code) values (4, null); SQL> commit; SQL> select * from test; ID CODE ---------- -------- 1 02EE9001 2 02EE9999 3 02EE9000 4 02EE9002 SQL> select * from Seqtab where code in (select code from test); CODE F -------- - 02EE9000 1 02EE9001 1 02EE9002 1 02EE9999 1

moshamosha
質問者

補足

まことにありがとうございます。しかしながら、まだ新人のためAccessしか使わせてもらっていません。なのでPL/SQLは使えないし、触らせてもらえません。なのでこの処理をAccess側でやらなければなりません。よろしくお願いします。

その他の回答 (3)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.4

> なのでPL/SQLは使えないし、触らせてもらえません。 使えないのは勉強すれば良いだけですが、触れさせてもらえません、ってのは将来の事を考えると、ちょっともったいない気がします。 頼み込んで、多少実験できるアカウントを作ってもらっては。 おそらくここで回答しているほとんどの人が、sqlplusを叩いていく事で、ORACLEやSQLをマスターしていったと思われるので。 ともあれ、Accessでやるなら、VBAでIDを生成、ADOかDAOでテーブルに挿入、するとか。 同時アクセス/変更とか、考えなくて済むなら、結構お手軽にできます (ただし、仕事として請け負うレベルのものなら、考えなくて済む場合ってのはほとんどないでしょうが)。 詳しくは、職場の先輩にでもお尋ね下さい。

  • cse_ri2
  • ベストアンサー率25% (830/3287)
回答No.2

No.1の方の言うとおりです。 AccessからOracleのテーブルを参照していますので、 参照するテーブルの機能はAccessではなく、Oracle の機能が適用されます。 項目に自動でIDを振る機能はAccessのテーブル固有の 機能なので、それをOracleで実現しようとしたら専用 のプログラムを開発しなくてはいけません。 それが、No.1の方の言う「トリガー」です。 moshamoshaさんは初心者とのことですので、たぶん これを自分で作成するのは非常に困難だと思われます。 あきらめるか、Oracleサーバの管理者に相談して問題 解決を依頼することをオススメします。

moshamosha
質問者

補足

そのためのプログラムを教えてもらいたくて投稿したのですが…あきらめるわけにはいきません!どなたかよろしくお願いします!本当に困っています。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

Insert時のトリガを使っては。

moshamosha
質問者

補足

初心者なのでゆってる意味がわかりません。トリガって何ですか?本当のド素人です。

関連するQ&A

  • oracle8に接続Access97での質問

    Access97のフォーム上にoracleのテーブルからデータを呼び出したいのです。oracle側でのIDコードは8桁あり、初めの4桁は固定で例えばIDコードgggg0000とあるとするとggggの部分は固定です。これをAccess97のフォーム上に呼び出すときは後半の4桁(0000)だけをテキストボックスに取り出したいのです。また反対にAccess97のフォーム上で登録するときは後半の4桁(例えば0001)だけをテキストボックスに入力します。そしてoracle側には8桁(gggg0001)でデータを保存したいのです。初心者なんで丁寧かつ詳しい説明をお願いします。説明不足でありましたら質問してください!よろしくお願いします。

  • oracle8に接続、Access97での質問

    oracleのテーブルのフィールドには日付がありまして、このフィールドにはデータとして200010と入っています。これをAccess97のフォーム上で読み込んだときは2000/10という風に表示させたいのですがどうすればいいのですか?反対にAccess97のフォーム上に2000/10(定型入力で9999\/99;0、書式でyyyy/mm)と入力して登録ボタンをクリックしたときolacleのテーブルに200010という風にデータを格納したいのですがどうか教えてください。よろしくお願いします。

  • Accessでの質問

    ID ----- 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A このようなテーブルがあり、フォームにいくつかのテキストボックスと登録というコマンドがあります。登録ボタンをクリックしたときtxtidというテキストボックスに何も入力されていないとき上のテーブルを参照してIDを採番し、登録できるようにするにはどうすればいいですか?ちなみIDコードの登録は16進数で登録できるようになっています。上の場合だと000Bを採番したいのです。仮に0007がないときは0007を採番したいんですが…初心者なので本当に困っています。お願いします。説明不足でわかりにくい時は質問していただければ大変助かります!

  • アクセス2010フォーム上で自動でIDを振る

    アクセス2010 初心者です。わかりやすく教えていただければ幸いです。 テーブル 取引先一覧に取引先のID(数値型)を4ケタで振りました。 1001~1400...と振っています。 取引先一覧テーブルをもとに、新規取引先登録フォームを作成し ここに、コマンドボタン押したら、新規レコードを追加して、新規IDを振る方法を教えてください。 色々、検索して調べたのですが上手くいきませんでした。 SQL、VBのコードはまだ理解できていません。 イベントのビルドを最近いじりはじめました。 宜しくお願いします。

  • 【Access2000】マシンIDの取得方法

    1つのAccessファイルを複数人で利用するため、排他テーブルを作成しています。 フォームを開いた時に、入力フォームに記載されている伝票番号を、排他テーブルに入力し、ほかの人が見た場合、編集できないようにしています。 現在、排他テーブルには伝票番号の項目しかありません。あわせてどのマシンがその伝票番号を取得しているかを確認したいのですが、VBAでマシンIDを取得するにはどうすればよいでしょうか。 もし何か方法があればお教えください。

  • ACCESSとoracleのODBC接続

    accessでoracleとODBC接続しています。access2003です。oracleは最新。 oracleのテーブルの項目数が255を超えています。 ACCESSの制限とか(?)で項目が350位あるので100項目くらいがリンクできません。VBAからselect文で(Select SYA_ID from IDOU)起動してもエラーになってしまいます。 何とか後ろのほうの項目を取得する方法は無いでしょうか? ご指導のほど宜しくお願い致します。

  • ACCESS 2000での自動発番

    Microsoft Access2000で固定の文字+数字(AAA00001など)のように自動発番をしたいのですが、どうにもいきずまってしまいお力をお貸しください。 現在の (テーブル)  品番テーブル   品番   名前   備考    (フォーム)  品番発番フォーム   品番   名前   発番ボタン  品番発番フォームより名前を入力し発番ボタンをクリックし固定の文字+数字(AAA00001など)の自動発番した品番を、品番テーブルの品番の中に入れてたい。 発番ルールは  文字(AAA)+5桁の数字です。 宜しくお願いします。

  • アクセスについての質問です

    アクセスについて、次の項目について教えてください。 1.テーブルからフォームを作り、後でテーブルのフィールドの属性を変えた場合(たとえば、テキスト ボックスからコンボボックス等)、フォームにこれ が対応しません。対応させる方法はありますか。 2.アクセスでデータベースを開いたときに希望のフォームが最初に自動的に開くように設定したいので すが、どのようにすればよいでしょうか 3.生年月日を入力したらそれが自動的に年齢になるような背低は可能でしょうか。(フリガナ入力支援 のような) たくさん質問して恐縮ですが、分かるものだけでもけっこうですのでご回答よろしくお願いします

  • ACCESS2003 フォームでの自動挿入

    ACCESS2003です。 テーブル1が IDと会員名 テーブル2が、 ID、利用時間、利用状況 このような2つのテーブルがあります。 このテーブルから ID、会員名、利用時間、利用状況のフォームを作り、 IDは、コンボボックスから選べるようにしてあります。 この、IDを入力した時に、会員名が自動挿入されるようなやり方はありますか? マクロやVBAを使わずにできたら、 よりありがたいのですが、、、 ご存知の方いらっしゃいましたら、 教えていただけないでしょうか?

  • アクセスの自動入力フォームに手動で入力したい

    初心者ですが、ネットで調べながらaccess2013で、納品書フォームを作りました。 納品書明細テーブルと商品マスタテーブル(商品コード、品番、単位)を納品書明細クエリで紐づけしてフォームを作成しました。商品コードを入力すると、自動的に品番と単位が入るようになっています。 ここで、商品コードがついていない商品(商品マスタに含まれず、今後登録する予定もない)も品番と単位の欄に手動で入力できるようにしたいのですが、可能でしょうか。 今手動で入力すると「フィールド'商品コード'とキーが一致しているレコードをテーブル'商品マスタ'で探すことができません」とエラーが出てしまいます。 ご教示いただけましたら幸いです。よろしくお願いいたします。