none
テキストボックスの値をデータテーブルに取り込みたい RRS feed

  • 質問

  • 得意先の宛名印刷プログラムを作っております。
    得意先コードをキーにして得意先名や住所、郵便番号をデータテーブルに引き渡す所までは出来ました。

    VS2010Proとアクセス2003を使っております。PCはXPProです。

    Windowsフォームに印刷枚数を入力するテキストボックス2と
    敬称選択出来るラジオボタン1、2、3があります。
    (mdbファイルに印刷枚数や敬称のテーブルはありません。)

    テキストボックス2に数字を入力し、ラジオボタン1から3のいずれかを選択します。

    この情報(入力した印刷枚数と選択した敬称)をデータテーブルに取り込む事は出来るのでしょうか?

    例えば
    得意先コード12345は印刷枚数5枚で、敬称は御中
    得意先コード11111は印刷枚数12枚で、敬称は殿

    取り込む事が出来たら、それをクリスタルレポートへ引き渡したく思います。

    参考になる情報等ありましたら、お教え下さい。

    データテーブルに取り込むコードは以下になります
    Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click

            If TextBox1.Text = Nothing Then 
                MessageBox.Show("コード確認!", "☆エラー画面☆")
            End If
            'プログラムコード 
            Dim Cn As New OleDbConnection
            Dim Command As OleDbCommand = New OleDbCommand
            Dim OLEDBCon As OleDb.OleDbConnection = _
                    New OleDb.OleDbConnection
            OLEDBCon.ConnectionString = _
             "Provider=Microsoft.Jet.OLEDB.4.0;" & _
             "Data Source=" & Form1.TextBox1.Text & ";" & _
             "Persist Security Info=False"
            Command.Connection = OLEDBCon
            Command.CommandText = " select 郵便番号, 住所1, 住所2, 得意先名 from 得意先T where 得意先コード = @得意先コード "
            Command.Parameters.AddWithValue("@得意先コード", TextBox1.Text)
            Dim Adapter As OleDbDataAdapter = New OleDbDataAdapter
            Dim dt As New DataTable
            Adapter.SelectCommand = Command
            Adapter.Fill(dt)
            'レコード取得
            If dt.Rows.Count = 1 Then
                TextBox3.Text = CStr(dt.Rows(0).Item(0)) ’郵便番号
                TextBox4.Text = CStr(dt.Rows(0).Item(1)) '住所1
                TextBox5.Text = CStr(dt.Rows(0).Item(2))  '住所2
                TextBox6.Text = CStr(dt.Rows(0).Item(3))  '得意先名
            Else
                MessageBox.Show("表示出来ません!", "エラー")
            End If

    End Sub

    以上宜しくお願い申し上げます

    2012年12月12日 5:52

回答

  • >画面で、上記の敬称区分、印刷枚数を全レコードに対してセットする。
    →全レコードに対してセットするとは、どういう意味でしょうか?
    参考になるサイト、サンプル等ありましたら、お願いします。

    宛先は複数同時に印刷するのでしょうか? それとも同時に1件ずつ印刷するのでしょうか?(例えば印刷したい1件を画面で開き、そこに印刷ボタンがあって印刷するということです。複数印刷する場合はこの一連の作業を繰り返します。)
    私が全レコードと書いたのは、複数同時に印刷することを勝手に想定してしまったからです。この場合、印刷対象となる宛名の全レコードということになります。
    複数同時に印刷するのか、個別に印刷するのかで実現のアプローチが変わってきます。

    >上記のデータテーブルから印刷用ワークテーブルを作成する。
    →上記のデータテーブルとは、敬称区分、印刷枚数をセット?したデータデーブルですか?
    印刷用ワークテーブルとはなんでしょうか?
    参考になるサイト、サンプル等ありましたら、お願いします。

    これについても、複数同時に印刷することを想定して書いていました。
    「上記のデータテーブル」についてはその通りです。印刷用ワークテーブルは、宛名によって部数が異なることへ対処することが主な目的になります。
    (例)
    ■上記のデータテーブル(列は左から、氏名、敬称、部数)
    Aさん   様    1
    B社    御中     2   
    Cさん   殿    1

       ↓

    ■印刷用ワークテーブル

    Aさん   様
    B社    御中
    B社    御中   
    Cさん   殿

    分からないことばかりで、質問ばかりで恐縮です

    こちらこそわかりにくくなってすみません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク ワカバWA 2012年12月17日 4:40
    2012年12月13日 5:06
    モデレータ

すべての返信

  • レコード毎に敬称情報を持たすのは良いとして、印刷枚数を持たせてもそれをクリスタルレポート側で制御するのは難しいと思いますので、そのデータテーブルから印刷用ワークデータテーブルを作成し、それを元に印刷されると良いと思います。すぐに思い付く流れは、ざっと以下のようになると思います。

    1.データテーブルに敬称と印刷枚数を保持する列が出来るように、select文を以下のようにする。

    select 郵便番号, 住所1, 住所2, 得意先名 , 0 as 敬称区分, 0 as 印刷枚数 from ・・・

    2.画面で、上記の敬称区分、印刷枚数を全レコードに対してセットする。

    3.上記のデータテーブルから印刷用ワークテーブルを作成する。敬称区分によって、実際に'様'などをセットする。複数枚印刷する宛名は、その分レコードを増やす。例えば、印刷枚数が3の宛名は、レコードが3倍の3件になる。

    4.印刷用ワークテーブルをクリスタルレポートに渡し、印刷する。

    #上記で敬称区分としましたが、面倒であれば敬称区分を止め、敬称として、2.の段階で直接'様'などをセットしてもかまいません。

    #(追記)あ~、ごめんなさい。宛名は1件のみ抽出ですね。複数件を抽出しているかと勘違いしました。1件であれば、印刷枚数をデータテーブルに持たす必要はなく、印刷メソッドや印刷ダイアログに印刷部数を指定すれば良いと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/



    2012年12月12日 6:14
    モデレータ
  • trapemiya様

    いつもありがとうございます
    select文を以下にしました
    Command.CommandText = " select 郵便番号, 住所1, 住所2, 得意先名  , 0 as 敬称区分, 0 as 印刷枚数 from 得意先T where 得意先コード = @得意先コード "

    >画面で、上記の敬称区分、印刷枚数を全レコードに対してセットする。
    →全レコードに対してセットするとは、どういう意味でしょうか?
    参考になるサイト、サンプル等ありましたら、お願いします。
     
    >上記のデータテーブルから印刷用ワークテーブルを作成する。
    →上記のデータテーブルとは、敬称区分、印刷枚数をセット?したデータデーブルですか?
    印刷用ワークテーブルとはなんでしょうか?
    参考になるサイト、サンプル等ありましたら、お願いします。


    分からないことばかりで、質問ばかりで恐縮です

    宜しくお願いします

     

    2012年12月13日 2:07
  • ワカバWA さま よろしく。

    プログラムで印刷までの処理ができた後の事になりますが ... 。

    宛名印刷の処理ですが、ご自分で手書きされる時の書き方を思い出して下さい。

    全体の住所の文字の長さから、適切な長さで行を区切り、各行の長さで書き出し位置を決め、変な所では改行しない。
    この様な流れなのではないでしょうか。
    クリスタルレポートについては、使った事が無いので分からないのですが、 VB 標準の印刷機能を使う場合では、
    1. 複数行文の住所分割列(印刷用)を別途用意。(同一データテーブル内でも別テーブルでも、可)
    2. 元データから流し込む。
      敬称も文字列加算する。
      この時、印刷時の長さ(実寸)と印刷可能寸法から、合併・分割・空白挿入 等の処理を行う。(特に住所)
      敬称の位置が可笑しくならない様に、空白挿入数の調整を行う。
    3. フォントが固定ならよいが、可変にする場合、印刷長さ算出ロジックで対応する。

    自分用の葉書宛名書きをプログラミングした折は、この空白挿入数で手こずりましたが、レイアウト(見た目)を左右しますので、面倒ですが、是非して下さい。
    例えば、長い得意先名の時など、... (株) 御 [改行] 中 なぁんて事にもなりますので。

    2012年12月13日 2:39
  • >画面で、上記の敬称区分、印刷枚数を全レコードに対してセットする。
    →全レコードに対してセットするとは、どういう意味でしょうか?
    参考になるサイト、サンプル等ありましたら、お願いします。

    宛先は複数同時に印刷するのでしょうか? それとも同時に1件ずつ印刷するのでしょうか?(例えば印刷したい1件を画面で開き、そこに印刷ボタンがあって印刷するということです。複数印刷する場合はこの一連の作業を繰り返します。)
    私が全レコードと書いたのは、複数同時に印刷することを勝手に想定してしまったからです。この場合、印刷対象となる宛名の全レコードということになります。
    複数同時に印刷するのか、個別に印刷するのかで実現のアプローチが変わってきます。

    >上記のデータテーブルから印刷用ワークテーブルを作成する。
    →上記のデータテーブルとは、敬称区分、印刷枚数をセット?したデータデーブルですか?
    印刷用ワークテーブルとはなんでしょうか?
    参考になるサイト、サンプル等ありましたら、お願いします。

    これについても、複数同時に印刷することを想定して書いていました。
    「上記のデータテーブル」についてはその通りです。印刷用ワークテーブルは、宛名によって部数が異なることへ対処することが主な目的になります。
    (例)
    ■上記のデータテーブル(列は左から、氏名、敬称、部数)
    Aさん   様    1
    B社    御中     2   
    Cさん   殿    1

       ↓

    ■印刷用ワークテーブル

    Aさん   様
    B社    御中
    B社    御中   
    Cさん   殿

    分からないことばかりで、質問ばかりで恐縮です

    こちらこそわかりにくくなってすみません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク ワカバWA 2012年12月17日 4:40
    2012年12月13日 5:06
    モデレータ