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

     

リストへもどる

投稿記事の一括表示

タイトルテーブル内容をテキストボックスに転記
記事No42934
投稿日: 2018/08/02(Thu) 17:06
投稿者たかし
OS:Win8.1
Access Version:2016

お世話になります。
発注情報をメールで送るために新しいテーブル「T入庫明細」を作り、
コピーしてF通信文のテキストボックス「本文」へ転記したいのですがうまくいきません。
MoveNextで1件づつコピーしようとしましたがレコードが回数分上書きされるだけです。
テーブル全体をコピーする正しい方法をどなたか教えてくださいませんでしょうか?

Private Sub メール送信_Click()

Dim cnc As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim SQL As String

Set cnc = CurrentProject.Connection
Set cmd.ActiveConnection = cnc
SQL = "SELECT 伝票番号,商品名,入庫数量 INTO T入庫明細 " & _
"FROM Q仕入入庫明細データ連番 ;"
DoCmd.RunSQL SQL
rst.Open "T入庫明細", cnc, adOpenKeyset, adLockOptimistic, adCmdTableDirect
Do Until rst.EOF
DoCmd.OpenForm "F通信文", acNormal, "", "", , acNormal
Forms!F通信文.送信先コード = Forms![F仕入入庫伝票]!仕入先コード
Forms!F通信文.本文.SetFocus
Forms!F通信文.本文.Text = rst!伝票番号 & " " & rst!商品名 & " " & rst!入庫数量 & _
Chr(13) & Chr(10) & Chr(13) & Chr(10)
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
cnc.Close
Set cnc = Nothing

End Sub

タイトルRe: テーブル内容をテキストボックスに転記
記事No42935
投稿日: 2018/08/03(Fri) 09:31
投稿者ナバ
おはようございます。

> MoveNextで1件づつコピーしようとしましたがレコードが回数分上書きされるだけです。
> テーブル全体をコピーする正しい方法をどなたか教えてくださいませんでしょうか?

Accessの帳票形式フォームでは、複数行あるように見えてもコントロールは1つづつです。
複数行の入力をしたければ、それ用のテーブルが必要です。

「Q仕入入庫明細データ連番」から新しく作ったテーブルへレコードを追加するか、
あるいは「Q仕入入庫明細データ連番」をフォームのレコードソースにしてフォームを開くかしてください。

タイトルRe^2: テーブル内容をテキストボックスに転記
記事No42936
投稿日: 2018/08/03(Fri) 17:42
投稿者たかし
ナバ様、ありがとうございます。

>Accessの帳票形式フォームでは、複数行あるように見えてもコントロールは1つづつです。
>複数行の入力をしたければ、それ用のテーブルが必要です。
>「Q仕入入庫明細データ連番」から新しく作ったテーブルへレコードを追加するか、
>あるいは「Q仕入入庫明細データ連番」をフォームのレコードソースにしてフォームを開くかしてください。

先のコードの
Forms!F通信文.本文.Text = rst!伝票番号 & " " & rst!商品名 & " " & rst!入庫数量 & _
Chr(13) & Chr(10) & Chr(13) & Chr(10)

の箇所を、念のためイミディエイトウィンドウに表示させましたところちゃんと全件が表示されるんですね。
ですからコードの基本は合っていると思うんですが・・・。

Debug.Print ; rst!伝票番号 & " " & rst!商品名 & " " & rst!入庫数量 & _
Chr(13) & Chr(10) & Chr(13) & Chr(10)

タイトルRe^3: テーブル内容をテキストボックスに転記
記事No42937
投稿日: 2018/08/03(Fri) 17:54
投稿者ナバ
> の箇所を、念のためイミディエイトウィンドウに表示させましたところちゃんと全件が表示されるんですね。
> ですからコードの基本は合っていると思うんですが・・・。

コードがあっていて全レコードを表示できたとしても、同じコントロールに上書きするだけなので
お望みの結果にはなりません。
そういうものだ、として方針を変えましょう。

タイトルRe^4: テーブル内容をテキストボックスに転記
記事No42938
投稿日: 2018/08/04(Sat) 21:28
投稿者たかし
> そういうものだ、として方針を変えましょう。

どのように方針を変えればよいのでしょうか?
ご指示いただけたらと思います。

タイトルRe^5: テーブル内容をテキストボックスに転記
記事No42939
投稿日: 2018/08/06(Mon) 09:16
投稿者ナバ
これです。

> 「Q仕入入庫明細データ連番」から新しく作ったテーブルへレコードを追加するか、
> あるいは「Q仕入入庫明細データ連番」をフォームのレコードソースにしてフォームを開くかしてください。

タイトルRe^6: テーブル内容をテキストボックスに転記
記事No42940
投稿日: 2018/08/07(Tue) 14:12
投稿者たかし
ナバ様、お世話になっております。

> 「Q仕入入庫明細データ連番」から新しく作ったテーブルへレコードを追加するか、

とは、具体的にどういう処理なのかが分かりません。もう少し詳しく教えていただけませんでしょうか?

タイトルRe^7: テーブル内容をテキストボックスに転記
記事No42941
投稿日: 2018/08/07(Tue) 14:48
投稿者ナバ
> とは、具体的にどういう処理なのかが分かりません。もう少し詳しく教えていただけませんでしょうか?

いくつかの手段がありますが、最初にお書きになったコードを変えていきますかね。
項目「送信先コード」と「本文」を持った「メール用」というテーブルを作っておきます。
F通信文のレコードソースを「メール用」します。

------------------------------------------------
Dim cnc As New ADODB.Connection
Dim rst1 As New ADODB.Recordset
Dim rst2 As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim SQL As String

Set cnc = CurrentProject.Connection
Set cmd.ActiveConnection = cnc
SQL = "SELECT * FROM Q仕入入庫明細データ連番"
rst1.Open SQL, cnc, adOpenKeyset, adLockOptimistic, adCmdTableDirect
SQL = "SELECT * FROM メール用"
rst2.Open SQL, cnc, adOpenKeyset, adLockOptimistic, adCmdTableDirect

Do Until rst1.EOF
  rst2!送信先コード = Forms![F仕入入庫伝票]!仕入先コード
  rst2!本文 = rst1!伝票番号 & " " & rst1!商品名 & " " & rst1!入庫数量 & _
Chr(13) & Chr(10) & Chr(13) & Chr(10)
  rst2.update
rst1.MoveNext
Loop
rst2.Close
rst1.Close

DoCmd.OpenForm "F通信文", acNormal, "", "", , acNormal

タイトルRe^8: テーブル内容をテキストボックスに転記
記事No42942
投稿日: 2018/08/07(Tue) 17:10
投稿者たかし
ナバ様、

>項目「送信先コード」と「本文」を持った「メール用」というテーブルを作っておきます。
>F通信文のレコードソースを「メール用」します。
 
「メール用」テーブルを作り、F通信文のレコードソースを直しました。その上でいただいたコードを実行しますと
rst1.Open SQL, cnc, adOpenKeyset, adLockOptimistic, adCmdTableDirect
の箇所で<実行時エラー’-2147217904(80040e10)'パラメータが少なすぎます。1を指定してください。>
と出ます。どこがいけないのでしょうか?

タイトルRe^9: テーブル内容をテキストボックスに転記
記事No42943
投稿日: 2018/08/07(Tue) 17:13
投稿者ナバ
> rst1.Open SQL, cnc, adOpenKeyset, adLockOptimistic, adCmdTableDirect
> の箇所で<実行時エラー’-2147217904(80040e10)'パラメータが少なすぎます。1を指定してください。>
> と出ます。どこがいけないのでしょうか?

その行の前を
SQL = "SELECT 伝票番号,商品名,入庫数量 INTO T入庫明細 " & _
"FROM Q仕入入庫明細データ連番 ;"

としたらどうですか?

タイトルRe^10: テーブル内容をテキストボックスに転記
記事No42944
投稿日: 2018/08/07(Tue) 17:33
投稿者たかし
ナバ様、

>その行の前を
>SQL = "SELECT 伝票番号,商品名,入庫数量 INTO T入庫明細 " & _
>"FROM Q仕入入庫明細データ連番 ;"

>としたらどうですか?

今度は<実行時エラー’-2147217865(80040e37)’アクションクエリを”開くことが出来ません。>
となります。

タイトルRe^11: テーブル内容をテキストボックスに転記
記事No42945
投稿日: 2018/08/08(Wed) 11:46
投稿者ナバ
> 今度は<実行時エラー’-2147217865(80040e37)’アクションクエリを”開くことが出来ません。>
> となります。

おっと、勘違いしていました。
最初のコードではテーブル作成SQLを実行していたのですね。

ちょっと前提とやりたいことを確認させてください。

-------------------------------------------------
1.「Q仕入入庫明細データ連番」はフォーム「F仕入入庫伝票」の仕入先コードを条件にして
なにかのテーブルからデータを抽出していますか?

2."SELECT 伝票番号,商品名,入庫数量 INTO T入庫明細 FROM Q仕入入庫明細データ連番"
を実行して作成された「T入庫明細」テーブルには複数レコードが存在しますか?

3.フォーム「F通信文」は「送信先コード」がヘッダー、
「本文」が明細にある形ですか。
それとも両方とも明細にありますか?

タイトルRe^12: テーブル内容をテキストボックスに転記
記事No42946
投稿日: 2018/08/08(Wed) 12:46
投稿者たかし
ナバ様、お世話になっております。

>1.「Q仕入入庫明細データ連番」はフォーム「F仕入入庫伝票」の仕入先コードを条件にして
>なにかのテーブルからデータを抽出していますか?

仕入先コードではなく「伝票番号」で抽出しています。

SELECT DCount("*","Q仕入入庫明細データ抽出","[明細番号]<=" & [Q仕入入庫明細データ抽出]![明細番号]) AS 連番, Q仕入入庫明細データ抽出.伝票番号, Q仕入入庫明細データ抽出.明細番号, Q仕入入庫明細データ抽出.入庫商品コード, Q仕入入庫明細データ抽出.商品名, Q仕入入庫明細データ抽出.分類名, Q仕入入庫明細データ抽出.入庫数量, Q仕入入庫明細データ抽出.仕入価格, Q仕入入庫明細データ抽出.仕入合計, Q仕入入庫伝票.仕入先コード
FROM Q仕入入庫明細データ抽出 INNER JOIN Q仕入入庫伝票 ON Q仕入入庫明細データ抽出.伝票番号 = Q仕入入庫伝票.伝票番号;


>2."SELECT 伝票番号,商品名,入庫数量 INTO T入庫明細 FROM Q仕入入庫明細データ連番"
>を実行して作成された「T入庫明細」テーブルには複数レコードが存在しますか?

複数存在します。

>3.フォーム「F通信文」は「送信先コード」がヘッダー、
>「本文」が明細にある形ですか。
>それとも両方とも明細にありますか?

「送信先コード」がヘッダー、「本文」が明細にある形です。

タイトルRe^13: テーブル内容をテキストボックスに転記
記事No42947
投稿日: 2018/08/08(Wed) 13:15
投稿者ナバ
ふむふむ。

テーブルを増やさずに、フォーム「F通信文」のレコードソースを「T入庫明細」にしてしまっても
いいような気がします。
テーブルを作成する際に項目「送信先コード」「本文」を作って、あとから編集するのはいかがでしょうか。

---------------------------------------
Dim cnc As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim SQL As String

Set cnc = CurrentProject.Connection
Set cmd.ActiveConnection = cnc
SQL = "SELECT 伝票番号,商品名,入庫数量,'' AS 送信先コード, '' AS 本文 INTO T入庫明細 " & _
"FROM Q仕入入庫明細データ連番 ;"
DoCmd.RunSQL SQL
rst.Open "T入庫明細", cnc, adOpenKeyset, adLockOptimistic, adCmdTableDirect
Do Until rst.EOF
  rst!送信先コード = Forms![F仕入入庫伝票]!仕入先コード
  rst!本文. = rst!伝票番号 & " " & rst!商品名 & " " & rst!入庫数量 & _
Chr(13) & Chr(10) & Chr(13) & Chr(10)
  rst.update
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
cnc.Close
Set cnc = Nothing

DoCmd.OpenForm "F通信文", acNormal, "", "", , acNormal

----------------------------------
テーブル作成クエリーだけでやれるかもしれませんが、
今回はレコードセットのループと編集を覚えることを優先しましょう。

タイトルRe^14: テーブル内容をテキストボックスに転記
記事No42948
投稿日: 2018/08/08(Wed) 16:56
投稿者たかし
ナバ様、

>Do Until rst.EOF
> rst!送信先コード = Forms![F仕入入庫伝票]!仕入先コード
> rst!本文 = rst!伝票番号 & " " & rst!商品名 & " " & rst!入庫数量 & _
>Chr(13) & Chr(10) & Chr(13) & Chr(10)
>rst.update
>rst.MoveNext
>Loop

転記されるレコードは一つだけです。
ひとつ違うのは一番最初のレコードのみだということです。
Loopで上書きされている形跡はありません。

タイトルRe^15: テーブル内容をテキストボックスに転記
記事No42949
投稿日: 2018/08/08(Wed) 17:23
投稿者ナバ
> 転記されるレコードは一つだけです。
> ひとつ違うのは一番最初のレコードのみだということです。

@
まずは訂正。

rst!本文 = rst!伝票番号 & " " & rst!商品名 & " " & rst!入庫数量 & _

の、rst!本文の後ろのピリオドはエラーになるので消してください。


A
> Loopで上書きされている形跡はありません。

シングルステップ実行して、どのように動いているか確認してください。

rst.Open〜 の行にカーソルを置いてF9キーを押すと紫色になってそこで
いったん止まるようになります。
あとはF8キーを押していくと1行ずつ実行されます。


B
あと、Docmdの非同期の問題かもしれません。
DoCmd.RunSQL SQL

の行を

cmd.CommandText = SQL
cmd.Execute

と変えてください。

タイトルRe^16: テーブル内容をテキストボックスに転記
記事No42950
投稿日: 2018/08/08(Wed) 18:14
投稿者たかし
>シングルステップ実行して、どのように動いているか確認してください。

回数分Loopしていることが確認されました。

>DoCmd.RunSQL SQL
>の行を
>cmd.CommandText = SQL
>cmd.Execute
>と変えてください。

cmd.Execute
のところで<実行時エラー’2147217904(80040e10)'1つ以上の必要なパラメーターの値が設定されていません。>
のエラーとなります。

タイトルRe^17: テーブル内容をテキストボックスに転記
記事No42951
投稿日: 2018/08/09(Thu) 10:52
投稿者ナバ
>> シングルステップ実行して、どのように動いているか確認してください。

> 回数分Loopしていることが確認されました。

どうして「一番最初のレコードのみ」なんでしょうかね。

SQLをこちらに戻して、

SQL = "SELECT 伝票番号,商品名,入庫数量,'' AS 送信先コード, '' AS 本文 INTO T入庫明細 " & _
"FROM Q仕入入庫明細データ連番 ;"
DoCmd.RunSQL SQL

Do Until rst.EOF

の下に

Debug.print rst!伝票番号 & " " & rst!商品名

と記述して、イミディエイトウィンドで思ったようにレコードが処理されているか、
確認してください。

タイトルRe^18: テーブル内容をテキストボックスに転記
記事No42952
投稿日: 2018/08/09(Thu) 13:04
投稿者たかし
ナバ様、

>と記述して、イミディエイトウィンドで思ったようにレコードが処理されているか、
確認してください。

イミディエイトウィンドウにはちゃんと正しいレコード5件が表示されましたよ。
これは私が42936のレスで書いたのと同じことなのでは?
違うのは「最後」ではなく「最初」のデータのみがテキストボックスには表示されること、です。

タイトルRe^19: テーブル内容をテキストボックスに転記
記事No42953
投稿日: 2018/08/09(Thu) 13:32
投稿者ナバ
> イミディエイトウィンドウにはちゃんと正しいレコード5件が表示されましたよ。
> これは私が42936のレスで書いたのと同じことなのでは?
> 違うのは「最後」ではなく「最初」のデータのみがテキストボックスには表示されること、です。

念のためお聞きしますが、今現在、フォーム「F通信文」に表示されているのは1レコードのみなのですね?
フォームの「既定のビュー」は「帳票フォーム」になっていますよね?

タイトルRe^20: テーブル内容をテキストボックスに転記
記事No42954
投稿日: 2018/08/09(Thu) 13:56
投稿者たかし
>念のためお聞きしますが、今現在、フォーム「F通信文」に表示されているのは1レコードのみなのですね?

そのとおりです。

>フォームの「既定のビュー」は「帳票フォーム」になっていますよね?

「単票フォーム」になっておりました。念のため「帳票フォーム」に直しましたが変わらずです。

タイトルRe^21: テーブル内容をテキストボックスに転記
記事No42955
投稿日: 2018/08/09(Thu) 14:25
投稿者ナバ
> >念のためお聞きしますが、今現在、フォーム「F通信文」に表示されているのは1レコードのみなのですね?
>
> そのとおりです。
>
> >フォームの「既定のビュー」は「帳票フォーム」になっていますよね?
>
> 「単票フォーム」になっておりました。念のため「帳票フォーム」に直しましたが変わらずです。

「T入庫明細」には5件レコードがあり、
「F通信文」のレコードソースは「T入庫明細」であり、帳票フォームである、
にも拘わらず、最初の1レコードしか表示されていない、ですか。

うーん、なんでだろう?

フォームの「移動ボタン」プロパティを「はい」にしてみてください。
他のレコードに@同できますか?

タイトルRe^22: テーブル内容をテキストボックスに転記
記事No42956
投稿日: 2018/08/09(Thu) 14:36
投稿者たかし
ナバ様、お疲れ様です。

>フォームの「移動ボタン」プロパティを「はい」にしてみてください。
>他のレコードに@同できますか?

やってみました、出来るようです!
これが何か手がかりになるのではないでしょうか?

タイトルRe^22: テーブル内容をテキストボックスに転記
記事No42957
投稿日: 2018/08/09(Thu) 14:36
投稿者ナバ
> 他のレコードに@同できますか?

×「@同」
○「移動」
です。

タイトルRe^23: テーブル内容をテキストボックスに転記
記事No42958
投稿日: 2018/08/09(Thu) 14:38
投稿者たかし
ナバ様、長い間お付き合いくださりありがとうございます。
このスレも大分長くなってきました。この間私も、ウェブ上で思いつく限りのキーワードを使い検索してみましたが、この手の処理に関する記事は「皆無」でした。やはりこのコードはAccessでは実現不可能なのかも知れません。残る手立てとして、このスレッドを見ていただいている第三者の方に下駄を預けてみたいと存じますがいかがでしょうか?ナバさんさえよかったら、もう少しこのスレッドを開けておきたいと思います。ご意見をお聞かせください。

タイトルRe^24: テーブル内容をテキストボックスに転記
記事No42959
投稿日: 2018/08/09(Thu) 14:51
投稿者ナバ
> ナバ様、長い間お付き合いくださりありがとうございます。
> このスレも大分長くなってきました。この間私も、ウェブ上で思いつく限りのキーワードを使い検索してみましたが、この手の処理に関する記事は「皆無」でした。やはりこのコードはAccessでは実現不可能なのかも知れません。

ぴったりの事例が見つからないだけで、処理としてはよくあるパターンなのです。
「できない」とは到底思えないんですよ。

移動ボタンでレコード移動ができるとなると、
このコードを処理する前に、フォームが単票形式で開かれている、なんてことはないですか?


> 残る手立てとして、このスレッドを見ていただいている第三者の方に下駄を預けてみたいと存じますがいかがでしょうか?ナバさんさえよかったら、もう少しこのスレッドを開けておきたいと思います。ご意見をお聞かせください。

このあとも、思いついたら書き込みますが、他の人の意見もお待ちください。

タイトルRe^25: テーブル内容をテキストボックスに転記
記事No42960
投稿日: 2018/08/09(Thu) 15:03
投稿者たかし
>移動ボタンでレコード移動ができるとなると、
>このコードを処理する前に、フォームが単票形式で開かれている、なんてことはないですか?

いいえ、イベントプロシージャで初めて開いています。
DoCmd.OpenForm "F通信文", acNormal, "", "", , acNormal

>このあとも、思いついたら書き込みますが、他の人の意見もお待ちください。

そういたします。あらためてお礼申し上げます。

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

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