1レコードのデータを数量条件に応じて分割してレコードデータを作成する方法

このQ&Aのポイント
  • 現在、もともとつくられたアクセスを改修しております。いただいたデータを取り込んだ基のテーブル「届け先一覧」があります。このデータから、宅配便に発送する出荷データを作成しようと思っております。ただし、1箱に入る個数が15個までなので、15個以上の個数の場合は、15個づつデータを分割する必要があります。
  • 具体的な手順としては、まず個数が15個以上であるデータを選択し、そのデータを15個づつ分割します。分割されたデータは「届け先一覧」に追加されます。分割されたデータには、住所・電話・名前・品目などの情報が含まれます。分割されたデータをもとに、「届先のピッキングリスト」も作成されます。
  • 以上の手順を実行するためには、データを分割する関数を作成する必要があります。この関数は、個数が15個以上であるデータを選択し、選択されたデータを15個づつ分割して新しいレコードデータを作成します。また、分割されたデータを元のテーブル「届け先一覧」に追加し、「届先のピッキングリスト」も作成します。
回答を見る
  • ベストアンサー

1レコードのデータを数量条件に応じて分割してレコー

access初心者です。 現在、もともとつくられたアクセスを改修しております。 いただいたデータを取り込んだ基のテーブル「届け先一覧」があります。 項目に住所・電話・名前・品目(1商品のみ)・個数があります。 このデータから、宅配便に発送する出荷データを作成しようと思っております。 ただし、1箱に入る個数が15個までなので15個以上の発送を希望される方には15個づつデータを分割しなくてはなりません 例) 住所・電話・名前・品目(1商品のみ)・個数 1届け先で個数40個の場合 15個・15個・10個というようにもともとあるレコードを15個毎に分割して作りたいのです。 上記の1レコードを15個以上の個数の場合下記のような結果を作り出したい 例) 住所・電話・名前・品目(1商品のみ)・15個 住所・電話・名前・品目(1商品のみ)・15個 住所・電話・名前・品目(1商品のみ)・10個 それをもとに「届先のピッキングリスト」「届け先一覧」 どのような手順でもとのデータを分割するような関数を作って希望するレコードデータを作成したら良いのでしょうか?

noname#259301
noname#259301

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.3

No2の追加です。 一意のデータフィールドがない場合に 追加のSQLを使わずに直接tmpテーブルに書き込む方法です。 Private Sub 出荷データ作成_Click() Dim RTmp As DAO.Recordset Dim StrSQL As String Dim i As Integer, j As Integer Dim Lot As Long Lot = 15 DoCmd.SetWarnings False 'tmpテーブルのデータ削除 StrSQL = "Delete [tmp].[住所] " & _ "FROM [tmp] " & _ "WHERE ((([tmp].[住所]) Like ""*""));" DoCmd.RunSQL (StrSQL) 'tmpテーブルへのデータ追加 If Me.[個数] Mod Lot = 0 Then j = Me.[個数] / Lot Else j = Int(Me.[個数] / Lot) + 1 End If Set RTmp = CurrentDb.OpenRecordset("tmp", dbOpenTable) With RTmp For i = 1 To j If i = Int(Me.[個数] / Lot) + 1 Then Lot = Me.[個数] Mod Lot End If .AddNew .Fields("住所") = Me!住所 .Fields("電話") = Me!電話 .Fields("名前") = Me!名前 .Fields("品目") = Me!品目 .Fields("個数") = Lot .Update Next End With RTmp.Close Set RTmp = Nothing DoCmd.SetWarnings True End Sub

noname#259301
質問者

お礼

ありがとうございました。 書き込みを参考に既に動いているVBAに以下のように加えて 動作確認をいたしましたところ、思うような結果が得られました。 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ '出荷データをエクスポートする前に分割する DoCmd.OpenQuery "累積データ編集集約_work" DoCmd.OpenQuery "累積データ編集集約_削除" Dim cnWork As ADODB.Connection Dim rsWork As ADODB.Recordset Dim cnDest As ADODB.Connection Dim rsDest As ADODB.Recordset Const lotMax As Integer = 15 '1ピッキングのマックス数 Dim cnt As Integer '数量の残数管理 Dim setValue As Integer 'テーブルへの設定値 Set cnWork = CurrentProject.Connection Set rsWork = New ADODB.Recordset Set cnDest = CurrentProject.Connection Set rsDest = New ADODB.Recordset Call rsWork.Open("累積データ編集集約_work", cnWork, adOpenDynamic, adLockPessimistic) Call rsDest.Open("累積データ編集集約", cnDest, adOpenDynamic) Set RWork = CurrentDb.OpenRecordset("累積データ編集集約_work", dbOpenTable) Set RDest = CurrentDb.OpenRecordset("累積データ編集集約", dbOpenTable) RWork.MoveFirst Do Until RWork.EOF cnt = RWork!数量1 Do While cnt > 0 RDest.AddNew RDest!ID = RWork!ID RDest!ご連絡先 = RWork!ご連絡先 RDest!郵便番号 = RWork!郵便番号 RDest!住所 = RWork!住所 RDest!電話番号 = RWork!電話番号 RDest!品目CD1 = RWork!品目CD1 RDest!品目名1 = RWork!品目名1 RDest!数量1 = RWork!数量1 RDest!区分1 = RWork!区分1 If cnt >= lotMax Then setValue = lotMax Else setValue = cnt End If RDest!数量1 = setValue cnt = cnt - setValue RDest.Update Loop RWork.MoveNext Loop

その他の回答 (2)

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.2

方法のひとつです。 以下の説明での名前は適当なのでプロシージャの中も含めて適宜変更してください。 届け先一覧をコピーして貼り付けの時に「テーブル構造のみ」で「tmp」というテーブルを作成します。 届け先一覧をもとにした単票フォーム「届け先一覧フォーム」を作成します。 フォームにボタンを作成します。プロパティ→その他の「名前」を「出荷データ作成」にします。 ボタンのイベントプロシージャを作成したら Private Sub 出荷データ作成_Click() End Sub というのができますから以下のように変更します。 IDは届け先一覧テーブルの中でレコードの中で一意のデータがあるフィールドを指定します。注文番号とか。 作成したフォームに表示する必要があります。 ボタンをクリックしたらフォームに表示されているデータが分割されて「tmp」に出力されます。 Private Sub 出荷データ作成_Click() Dim StrSQL As String Dim i As Integer, j As Integer Dim Lot As Long Lot = 15 DoCmd.SetWarnings False 'tmpテーブルのデータ削除 StrSQL = "Delete [tmp].[ID] " & _ "FROM [tmp] " & _ "WHERE ((([tmp].[ID]) Like ""*""));" DoCmd.RunSQL (StrSQL) 'tmpテーブルへのデータ追加 If Me.[個数] Mod Lot = 0 Then j = Me.[個数] / Lot Else j = Int(Me.[個数] / Lot) + 1 End If For i = 1 To j If i = Int(Me.[個数] / Lot) + 1 Then Lot = Me.[個数] Mod Lot End If StrSQL = "INSERT INTO [tmp] ( [住所], [電話], [名前], [品目], [個数] ) " & _ "SELECT [届け先一覧].[住所], [届け先一覧].[電話], [届け先一覧].[名前], [届け先一覧].[品目], " & Lot & " AS [定数]" & _ "FROM [届け先一覧] " & _ "WHERE ((([届け先一覧].[ID])=[Forms]![届け先一覧フォーム]![ID]));" DoCmd.RunSQL (StrSQL) Next DoCmd.SetWarnings True End Sub

  • bardfish
  • ベストアンサー率28% (5029/17765)
回答No.1

私なら・・・ということで参考までに。 作業用の中間データを入れておく一時作業テーブルを作成します。 そのテーブルは1レコード=1個とします。ですから個数は持ちません。 そしてデータのムダを省くために発送先をコード化するための発送先テーブルを作成し、一時テーブルには発送先の住所や電話番号は持たずに発送先テーブルの発送先コードだけを用意します。 で、発送先コードと品目があれば出荷テーブルを作成すときに一時テーブルから15レコードずつ読み込んで出荷テーブルに1レコード書き出す。 一時テーブルから読み込むレコードがなくなったら15件に満たなくても出荷テーブルに書き出す。 というアルゴリズムを基本としてコードを書き始めるかな? 初心者ならば、いきなりAccessに向き合うのではなく、フローチャートでも箇条書きでもなんでもいいですが、どういう流れにするかを考えることから始めたほうがいいです。 私の場合は、AccessやExcelを使用していてもクエリとかVLOOKUPなどの便利な関数は使用せずに、代替をSQLで済ませてしまいます。 その際のメリットというのは、Visual Basicに移行しやすいからというのが理由。 Accessがインストールされているパソコンならmdb、accdファイルをVisual Studio VB.NETにアタッチして比較的簡単に利用することができるからです。更にいうと、VB .NETでは配列変数にDataTable型というものがあり、変数内でかんたんなクエリを実行してデータを抽出したりソートすることができるし、DataGriViewというExcelのワークシートみたいなコントロールにバインドするとかんたんにAccessのテーブルを開いたときに似たような感じで変数のデータを見ることができます。 このあたりはもう少しスキルを高めてからのほうがいいのかな?それともAccessは捨てていきなりVB.NETで開発を始めてもいいのかな? Visual Studio .NETは無料で利用できるExpressエディションがあります。 Windowsデスクトップソフトを作りたいならVisual Basic 2017が最新かな?2019もあって無利用版もダウンロードできるけどWindowsストアアプリみたいなものしか作れないかもしれない。 無難なところで「Visual Basic Desktop」で検索してみてください。

noname#259301
質問者

お礼

ありがとうございます。 本当は、いただいたアドバイスように最初から考えて作るのがまっとうなのですが、運用方法もいただくデータ等も同じもので今回流用のが軽微改修と判断されたためです。話があってから動きがなく、年始からすぐにはじまるということなので、今あるものを直して使えないかと思いご相談した次第です。

関連するQ&A

  • エクセルで条件に合うデータをレコードごと自動に削除するには?

    エクセルで教えてください。在庫管理です。商品コードをキーに出し入れ数(プラス1、マイナス2など)を合計し、値が0(ゼロ)になったデータをレコードごと(行ごと)削除する方法を教えてください。「集計」を使って、手作業で0の値を探し削除することも出来ますが、数式で行うか、マクロを作成したいと思っています。 例フィールド 商品コード、個数、

  • エクセルの複数行にわたったデータの処理

    名前、住所、注文商品等が入ったエクセルのデータから、納品書を印刷したくて困っています。 こんな感じ↓ 受注日 お名前   住所    商品   個数 12/1 山田太郎  東京都~  ワイン  1                 日本酒  2                    エクセルのデータの方が、商品を複数注文された方の場合、2行目が名前、住所等が空欄になり、商品、価格のみデータセルに入っています。 最初はアクセスに変換して納品書印刷と思っていたのですが、この注文商品2品目以降の、住所等が空欄になっている行の処理がうまくいきません。 この複数行のデータを、入力し直すことなしに納品書印刷できるものなのでしょうか? 連続印刷ができればアクセスにはこだわりません。 よろしくお願いします。

  • 複数レコードのデータを1レコードへ

    お世話になります。 現在php+mysqlでシステムを構築しようとしています。 複数レコードのデータを1レコードへまとめる方法を知りたいのです。 元のデータ: 名前,グループ,詳細1,詳細2 佐藤,年齢,18,歳 佐藤,役職,本部長,, 佐藤,・・・・ ・・・ 元のデータは、このように個人の情報が300行ほどの書かれているCSVファイルです。個人ごとに存在します。(今のところ400ほど) これをmysqlにインポートするのですが、普通、そのまま4フィールドのテーブルを作ってインポートするのではなく、個人1人で1レコードのデータを持つようにすると思います。 インポート後のテーブルデータ: 名前 年齢 単位 役職 ・・・・ 佐藤 18  歳  部長 ・・・・ このように変換するには、どのような手順でするのが普通なのでしょうか?? セオリーというか考え方をお教えください。 例)まずtempテーブルにインポート後、それを加工する?? よろしくお願いいたします。

  • データの抽出方法

    エクセルでデータの抽出を行いたいです。 シートが、「9月売上商品個数」(シート1)、「10月売上商品個数」(シート2)、「商品データベース ※20品目のみ ※JAN入力済」(シート3)の3枚あります。シート1と2の中から、シート3に入力されている20品目だけの商品をJAN(これは必ずJANとさせてください)で抽出し、シート3内の商品のみが9月と10月でどれほど売れたかのデータを作りたいです。 欲を言うと、シート3の商品の並び順と、シート1と2の商品の並び順は異なります。シート3のJANの横に「9月」と「10月」の列を作るので、そこに一括で個数が入るととても便利なのですが.... わかりづらく申し訳ありません。アドバイスいただければ幸いです。

  • 発送済み荷物の届け先変更

    ネットで購入した商品の届け先が、相当間違っていました。それは私のミスなのですが、佐川急便の方で発送されたと31日、連絡がきました。この場合、届け先変更の電話をするのは、間違っている住所の担当店か、正しい住所の担当店か、どちらですか? また、なんといえば良いですか? 今日の夕方に連絡をしようと思うので、早めにお願いします。

  • ファイルメーカーで1レコードを複数レコードに分割する方法(CSVファイルの1行を複数行に)

    宜しくお願い致します。 雑貨店を営んでおります。 受注データーをCSVファイル形式にて、ダウンロードして、ファイルメーカーに取り込んでおりますが、 【1レコード】=【1注文】 の状態にて、ダウンロードされてきます。 それを 【1レコード】=【1品番単位】 に変換させる何かいいアイデアがございましたら、ぜひ、ご教示お願い致します。  現在は、手作業にて、上記の状態に変換しております。 【例】 データー(※購入品番は15個くらいまでは存在します) 注文番号 お名前  品番1 個数1 品番2 個数2 品番3 個数3 1    田中さん   くつ    2   かばん   3 2    佐藤さん   かばん  1   さいふ   1   かさ  1  ↓ 下記のように変換したい!! 注文番号 お名前  購入品番 個数 1    田中さん  くつ     2 1    田中さん  かばん   3 2    佐藤さん  かばん   1 2    佐藤さん  さいふ    1 2    佐藤さん  かさ     1 CSVファイルの段階で変換したものを、ファイルメーカーに取り込めると非常に便利ですが、何度か段階を踏んでもOKですので、 出来る限り、手作業で行う事を避けたいと思っております。 どうか宜しくお願い致します。 ------------------------------------------------ OS:WinXP. SP2 ファイルメーカーPro7.4 ------------------------------------------------

  • VBで

    VBでお客様管理の様なものを作っています。 入力画面で お名前 住所 電話番号 があって お届け先お名前 お届け先住所 お届け先電話番号 があります。 お届け先のお名前・住所・電話番号が お名前・住所・電話番号と同じならば 何かボタンを押すと 自動的にそれぞれのテキストボックスへ 書き込まれるようにしたいのですが 教えてください。

  • エクセル関数について教えて下さい。

    商品発送リストがありまして、漢字名・郵便番号・住所・電話番号・発送日・商品名の入力があります。 この中からAさんに何時・何を・何回発送したかを調べたいのです。 名前で検索をかけ、データにAさんの名前がある行数分、全てを抽出したいです。 例)Aさん・〒・住所・TEL・発送日・商品名 のデータ全てを1行にし、Aさんへ5回発送していたら、5行に渡り各発送時の内容を全て表示させたいのです。 この場合何の関数を使えばよいでしょうか? 名前のかな表示を別セルで作るべきでしょうか? 急いでおります。 宜しくお願いしますm(__)m

  • Amazonのフィギュア

    Amazonでフィギュアを注文するときにお届け先の指定でコンビニ受け取りを希望すると、 「この商品は選択された住所には発送できません。お届け先を変更するか、数量を「0」に変更後、下の「更新」ボタンをクリックして商品をキャンセルしてください。」こんなことが出るんですね。これはどうすればいいんでしょうか?それともフィギュアとかはだめなんですか?コンビニ受け取りじゃ。

  • access 2003 レコードのプリントについて

     access 2003 でデータベースを作成中です レコードを プリントしたいのですが たとえば3つのデータレコードがあり 1~3のレコードは、共通のデータがあるとき並び替えをしておき、プリントしたい。  所在地  酒の名前(1つ目)    酒の名前(2つ目のレコード) 東京    多摩          福生  新潟    越しの金杯  例ですがのこのように6レコード共通レコードがあれば右側に 表示したいのですが、どなたかお教えください。

専門家に質問してみよう