Microsoft Access Club Access超初心者対象Forum Access初級者対象Forum Access初・中級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトル2017_1列138億行の数値をFor文でテーブルに自動入力するコード
記事No16851
投稿日: 2017/02/13(Mon) 17:58
投稿者小川春子
解決済: ON
OS: Windows 10
Access Version: Access 2016


 Access VBAとSQLの超初心者です。どうぞ、よろしくご指導くださいね。
 急いでおりますので、恐れ入りますが、断片的でもいいので、至急ご回答お願いできないでしょうか。

 実現したい目的は、いたってシンプル。膨大なのはレコード数だけで、1列138億行に0から13800000000までの整数の数値のみを1ずつインクリメントするだけという単純明快なプログラム。

1. 1フィールドのみ。
主キーとしてオートナンバーのフィールドを後から追加するが、それでも2列。
2. データ型はLong(長整数型)のみ。
しかも、単純な整数値のインクリメントなので、かんたんなFor文だけでOK.
3. 数個のテーブルに分けて結果データを格納。
4. 問題は、このFor文が100億行を超えると間違った数値を返すということ。
5. ソースコードを記述するので、訂正・改正・アドバイスをお願いしたい。
6. 完全な回答でなくとも、何かしらヒントとかアイデアとか感想のような回答でもOK.

A) 100万行までは下記コードで簡単にテーブルにデータを格納できました。

Sub addNewRecord()

Dim i As Long
Dim j As Long
Dim rs As New ADODB.Recordset

rs.Open "T_Master", CurrentProject.Connection, , adLockOptimistic
rs.AddNew

i = 0
j = 1000000

For i = 0 To j
rs!code = i
rs.AddNew
Next

rs.Update
rs.Close
End Sub

B) でも、同じようなコードなのに、100億行を超えると間違った数値を返します。

Sub addNewRecord_2()

Dim i As Long
Dim j As Long
Dim K As Long
Dim L As Long
Dim rs As New ADODB.Recordset

rs.Open"T_Master", CurrentProject.Connection, , adLockOptimistic
rs.AddNew
rs!code = 10000000

K = 10000001
L = 2000000000
M = 10000000

'If rs!id >= K Then
'For i = i To j
'rs!id = i
'Next
'Else
'i = 1
'For i = 1 To j
'rs!id = i
'Next

'If rs!id >= K Then
If rs!code >= M Then
For K = K To L
rs!code = K
Next
End If
' End If
rs.Update
rs.Close
End Sub

タイトルRe: 2017_1列138億行の数値をFor文でテーブルに自動入力するコード
記事No16852
投稿日: 2017/02/14(Tue) 11:08
投稿者hatena
解決済: ON
長整数型(Long)に格納できる数値の範囲は、

-2,147,483,648 〜 2,147,483,647

です。
それ以上の数値を代入しようとすると、間違って数値は返すという以前に、オーバーフローエラーになるはずです。


フィールドのデータ型を通貨型、変数宣言を Currency に変更して試してみてください。
通貨型なら、兆を超える数値も扱えます。

タイトルRe^2: 2017_1列138億行の数値をFor文でテーブルに自動入力するコード
記事No16853
投稿日: 2017/02/14(Tue) 13:57
投稿者小川春子
解決済: ON
Hatenaさん、ありがとうございます!

「フィールドのデータ型を通貨型、変数宣言を Currency に変更して試してみてください。通貨型なら、兆を超える数値も扱えます。」

これは良いことを聞きました。早速試してみますね。

でも、素朴な疑問が2点ほどあります。

1.  先頭の¥マークなどは外したい

 データ型を通貨型に変えたら、3桁区切りや、先頭に¥マークや$マーク が付きますよね。私が最終的に欲しいデータは、3桁区切りも¥マークもない、単純な数値だけのデータなのです。
 データ型を通貨型「¥13,800,000,000」にしておいて、最終的な格納データを整数値のみの「13800000000」に変換するにはどうすればいいですか?

2.  オーバーフロー回避型プログラムを最初から意図的に組みました

 長整数型(Long)に格納できる数値は+(正数)で2,147,483,647までだということは、実はMicrosoft公式サイトであらかじめ確認していました。なので、A) のFor i = 0 To j文の前に、とりあえず最大値 [j = 1000000] までにしました。それで、VBAプログラムがちゃんと正確に1000000(100万)行までのレコードに整数値1から整数値1000000までの価を格納することに成功したことを、まず確認しました。それから後は、初期値を1000001にしてこういう作業を根気よく繰り返せば、結果的には13800000000(138億)という数値の格納されたレコードが自然に実現されるでしょう?

 ちなみに、Excel2016は1Sheet最大行数1,048,576行までしか入りませんが、Access2016はMicrosoft公式サイトの仕様によると行数は無制限です。ただしAccess容量最大値2 GBまでとなっています。

https://support.office.com/ja-jp/article/Access-2016-%25E3%2581%25AE%25E4%25BB%2595%25E6%25A7%2598-0cf3c66f-9cf2-4e32-9568-98c1025bb47c?ui=ja-JP&rs=ja-JP&ad=JP&fromAR=1

 長整数型に格納できる数値は正数で2,147,483,647までなので、次のような計算になりますね。
(A) 13800000000 ÷ 2,147,483,647 = 6.4261……
(B) 13800000000 ÷ 2,000,000,000 = 6.9000……

長整数型を最大限まで活用すると(A)になって、長整数型のテーブル約7テーブル。
計算と後からの数値のチェックをかんたんにするために、長整数型をキリの良い2,000,000,000(20億)までとしても(B)になって、結局、Accessテーブルが7個あるだけで138億を満たします。その7個のテーブルをSQLのADD構文の「列の追加」か、クエリのテーブルの結合で1テーブルにしようかな……と思っていたのですが。

 ちなみに、この場合、2月13日付けのコード B) のようなFor構文やコーディングを修正するとしたら、どこをどう修正すれば良いのでしょうか? A) のコーディングが成功して、B) のコーディングが失敗したというのは、これから本格的なプログラマーを目指す人々の末席にいるものとして、どうしても知っておきたいです。

 みなさま、どうかよろしくご指導お願いいたしますね。

タイトルRe^3: 2017_1列138億行の数値をFor文でテーブルに自動入力するコード
記事No16855
投稿日: 2017/03/07(Tue) 04:26
投稿者hatena
解決済: ON
返信が付いているを見逃していました。
遅くなってすみません。

> 1.  先頭の¥マークなどは外したい
>
>  データ型を通貨型に変えたら、3桁区切りや、先頭に¥マークや$マーク が付きますよね。私が最終的に欲しいデータは、3桁区切りも¥マークもない、単純な数値だけのデータなのです。
>  データ型を通貨型「¥13,800,000,000」にしておいて、最終的な格納データを整数値のみの「13800000000」に変換するにはどうすればいいですか?

テーブルをデザインビューで開いて、フィールドの「書式」プロパティを確認してください。
初期値のままだと「通貨」になってますので「数値」に変更してください。

これで「13800000000」という表示になります。

通貨型でもテーブルに格納されているのは、13800000000 というような数値です。書式プロパティでお好みの表示に変更できるようになってます。
詳細は書式プロパティのヘルプを参照してください。


> 2.  オーバーフロー回避型プログラムを最初から意図的に組みました

> 長整数型を最大限まで活用すると(A)になって、長整数型のテーブル約7テーブル。
> 計算と後からの数値のチェックをかんたんにするために、長整数型をキリの良い2,000,000,000(20億)までとしても(B)になって、結局、Accessテーブルが7個あるだけで138億を満たします。その7個のテーブルをSQLのADD構文の「列の追加」か、クエリのテーブルの結合で1テーブルにしようかな……と思っていたのですが。

SQLのADD構文、テーブルの結合 の意味を理解していないようですね。
どちらも希望に合致しない処理です。
使うとするとユニオンクエリですね。

>  ちなみに、この場合、2月13日付けのコード B) のようなFor構文やコーディングを修正するとしたら、どこをどう修正すれば良いのでしょうか? A) のコーディングが成功して、B) のコーディングが失敗したというのは、これから本格的なプログラマーを目指す人々の末席にいるものとして、どうしても知っておきたいです。

B) のコーディングは、「どこをどう修正する」以前に、
AddNewを1回だけ実行して、あとは同じレコードを繰り返し上書きしているにすぎません。
この間違いに気づきませんか。


「これから本格的なプログラマーを目指す人々の末席にいる」のなら、
・機能、プロパティを把握して、適切なもの使用する。
・コードの意味をヘルプ等で調べてきちんと理解する。
・やろうとしていることを分析して、まずは論理的な言葉で文章化してみる。
これをコードに変換するという作業をするといいでしょう。
フロー図なども書くといいでしょう。

タイトルRe^4: 2017_1列138億行の数値をFor文でテーブルに自動入力するコード
記事No16857
投稿日: 2017/04/01(Sat) 22:04
投稿者小川春子
解決済: ON
私も、 返信が付いているを見逃していました。
遅くなってすみません。
大変助かりました。
ありがとうございます!

解決しましたので、クローズとさせていただきます。

>
> > 1.  先頭の¥マークなどは外したい
> >
> >  データ型を通貨型に変えたら、3桁区切りや、先頭に¥マークや$マーク が付きますよね。私が最終的に欲しいデータは、3桁区切りも¥マークもない、単純な数値だけのデータなのです。
> >  データ型を通貨型「¥13,800,000,000」にしておいて、最終的な格納データを整数値のみの「13800000000」に変換するにはどうすればいいですか?
>
> テーブルをデザインビューで開いて、フィールドの「書式」プロパティを確認してください。
> 初期値のままだと「通貨」になってますので「数値」に変更してください。
>
> これで「13800000000」という表示になります。
>
> 通貨型でもテーブルに格納されているのは、13800000000 というような数値です。書式プロパティでお好みの表示に変更できるようになってます。
> 詳細は書式プロパティのヘルプを参照してください。
>
>
> > 2.  オーバーフロー回避型プログラムを最初から意図的に組みました
>
> > 長整数型を最大限まで活用すると(A)になって、長整数型のテーブル約7テーブル。
> > 計算と後からの数値のチェックをかんたんにするために、長整数型をキリの良い2,000,000,000(20億)までとしても(B)になって、結局、Accessテーブルが7個あるだけで138億を満たします。その7個のテーブルをSQLのADD構文の「列の追加」か、クエリのテーブルの結合で1テーブルにしようかな……と思っていたのですが。
>
> SQLのADD構文、テーブルの結合 の意味を理解していないようですね。
> どちらも希望に合致しない処理です。
> 使うとするとユニオンクエリですね。
>
> >  ちなみに、この場合、2月13日付けのコード B) のようなFor構文やコーディングを修正するとしたら、どこをどう修正すれば良いのでしょうか? A) のコーディングが成功して、B) のコーディングが失敗したというのは、これから本格的なプログラマーを目指す人々の末席にいるものとして、どうしても知っておきたいです。
>
> B) のコーディングは、「どこをどう修正する」以前に、
> AddNewを1回だけ実行して、あとは同じレコードを繰り返し上書きしているにすぎません。
> この間違いに気づきませんか。
>
>
> 「これから本格的なプログラマーを目指す人々の末席にいる」のなら、
> ・機能、プロパティを把握して、適切なもの使用する。
> ・コードの意味をヘルプ等で調べてきちんと理解する。
> ・やろうとしていることを分析して、まずは論理的な言葉で文章化してみる。
> これをコードに変換するという作業をするといいでしょう。
> フロー図なども書くといいでしょう。

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る