こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ACCESSでテキストデータから伝票データにしたいのですが教えて下さい。

ACCESS2003でテキストデータをテーブルにインポートしたのですがこのデータを3行毎に伝票番号を変更したデータの作り方がありましたら教えて下さい。よろしくお願いします。
例(テキストデータ5行の場合)
伝票番号1行番号1明細1
伝票番号1行番号2明細2
伝票番号1行番号3明細3
伝票番号2行番号1明細4
伝票番号2行番号2明細5

投稿日時 - 2007-08-28 11:47:05

QNo.3293583

すぐに回答ほしいです

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

元のレコードには並び順を指定できるユニークな(重複のない)フィールドは存在しますか
それがないと出来ませんよ

あれば頭から連番を振り3つずつ区切ってやるだけです

条件を満たす主キーという数値型のフィールドがあるとすると

伝票番号:(DCount("*","テーブル名","主キー<" & 主キー) \ 3) + 1
行番号:(DCount("*","テーブル名","主キー<" & 主キー) MOD 3) + 1

投稿日時 - 2007-08-28 17:05:09

補足

回答頂きありがとうございます。
行番号はうまくいきました。
伝票番号ですが
伝票番号: (DCount("*","売上伝票","番号<" & [ID])\3+1)とすると
[ID]を3で割った番号から連番になってしまいます。
伝票番号: (DCount("*","売上伝票","番号>" & [ID])\3+1)とすると
番号を3で割った番号から連番になってしまいます。
番号から連番にする場合はどうすれば良いでしょうか?
お手数ですがご回答よろしくお願いします。

投稿日時 - 2007-08-29 11:32:30

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(6)

ゴミ回答のまま退散するのも・・・。

? CNNExecute("INSERT INTO Dempyo SELECT DISTINCT (ID+2) \ 3 AS 伝票番号,伝票日付 FROM DempyoDatas")
True

ID____伝票番号___伝票日付
14____10000_______2007/08/01
15____10001_______2007/08/01
16____1_____________2007/08/01
17____2_____________2007/08/01

と、一旦、仮の伝票番号を付けます。

? CNNExecute("UPDATE Dempyo SET 伝票番号=(伝票番号 + DBMAX('伝票番号', 'Dempyo')) WHERE 伝票番号<100")
True

D____伝票番号___伝票日付
14____10000_______2007/08/01
15____10001_______2007/08/01
16____10002_______2007/08/01
17____10003_______2007/08/01

これで、仮の伝票番号は正規化されます。

※DempoDatas は、もちろん、日々、クリアされることが大前提です。
※DempoDatas にもオートナンバーの[ID]があることも大前提です。

しかし、テキストからダイレクトにテーブルを生成した方が早いし間違いもないと思うのですが・・・。

投稿日時 - 2007-08-29 12:52:04

失礼、テキストデータからの正規テーブルの生成の質問と勘違いしていました。
よって、私の回答は無視して下さい。

投稿日時 - 2007-08-29 11:49:57

<DempyoDatas>
ID___伝票番号______行番号___伝票日付_______商品名
1____2007080001_________1____2007/08/01___aaa1
2____2007080001_________2____2007/08/01___aaa2
3____2007080001_________3____2007/08/01___aaa3
4____2007080002_________1____2007/08/01___bbb1
5____2007080002_________2____2007/08/01___bbb2
6____2007080002_________3____2007/08/01___bbb3

例えば、こういうテーブルがあったとします。

[イミディエイト]
? CNNExecute("INSERT INTO Dempyo SELECT DISTINCT 伝票番号,伝票日付 FROM DempyoDatas")
True

<Dempyo>
ID___伝票番号______伝票日付
1____2007080001__2007/08/01
2____2007080002__2007/08/01

このように Dempyo にレコードが追加されます。
[ID]は、オートナンバーにしています。

[イミディエイト]
? DBSelect("SELECT Dempyo.ID, DempyoDatas.行番号, DempyoDatas.商品名 FROM Dempyo INNER JOIN DempyoDatas ON Dempyo.伝票番号 = DempyoDatas.伝票番号")
1;3;aaa3;
1;2;aaa2;
1;1;aaa1;
2;3;bbb3;
2;2;bbb2;
2;1;bbb1;

これで、伝票明細をSelect文で抽出できました。
ここまでくれば、後は、Insert文に組み込むだけです。

[イミディエイト]
? CNNExecute("INSERT INTO DempyoMeisais SELECT Dempyo.ID, DempyoDatas.行番号, DempyoDatas.商品名 FROM Dempyo INNER JOIN DempyoDatas ON Dempyo.伝票番号 = DempyoDatas.伝票番号")
True

<DempyoMeisais>
ID___行番号_______商品名
1___________1_______aaa1
1___________2_______aaa2
1___________3_______aaa3
2___________1_______bbb1
2___________2_______bbb2
2___________3_______bbb3

あたしが希望しているテーブルじゃないと思われるかも知れません。
が、そこはリレーショナルデータベースです。
クエリを作れば済むことです。

<クエリ1>
ID___伝票番号______伝票日付________行番号______商品名
1____2007080001__2007/08/01____________1______aaa1
1____2007080001__2007/08/01____________2______aaa2
1____2007080001__2007/08/01____________3______aaa3
2____2007080002__2007/08/01____________1______bbb1
2____2007080002__2007/08/01____________2______bbb2
2____2007080002__2007/08/01____________3______bbb3

ここでは、クエリを利用していませんが、全てはクエリで再現できます。
要は、ステップを追って攻められたら良いと思います。

投稿日時 - 2007-08-29 11:36:48

ANo.2

以下のマクロをクエリーに組み入れれば出来ると思います。

以下はSQLの内容ですが、テーブル1に番号をいれています。

SELECT テーブル1.番号, 行番号([番号]) AS 番号作成
FROM テーブル1;

以下の条件で回答させていただきます。
1・明細行は不連続で無い
2・明細行はN行目~連続である

Option Compare Database
Option Explicit
Function 行番号(明細行 As Long) As Long
Dim num001 As Double
Dim num002 As Double
Dim num003 As Double
Dim 結果 As Long
num001 = 明細行 / 3
num002 = Int(明細行 / 3)
num003 = num001 - Int(num001)
If (num003 >= 0) And (num003 <= 0.34) Then
結果 = Int(num001) + 1
End If
If (num003 >= 0.34) And (num003 <= 0.67) Then
結果 = Int(num001) + 1
End If
If num003 = 0 Then
結果 = Int(num001)
End If
行番号 = 結果
End Function

投稿日時 - 2007-08-28 15:48:49

質問が明確に理解できませんが。
頻繁に繰り返されることがない作業と理解して

1.テーブルにオートナンバー型のフィールドを追加する
2.以下の更新クエリーを実行する(テーブル名、フィールド名は適切に変更してください)
UPDATE SAMPLE SET SAMPLE.[NO] = ([ID]+1)/3;
4.オートナンバー型のフィールドを削除する

オートナンバー型で作成した連続する数値を3で割っています。

投稿日時 - 2007-08-28 14:01:18

補足

回答頂きありがとうございました。分かりにくい質問で失礼しました。具体的に書きますとテーブル名明細 フィールド名[商品]・[数量]と言うデータがあります。これをテーブル名伝票 フィールド名[伝票番号]・[行番号]・[商品]・[数量]という形にしたいのです。[伝票番号]は最後に作られた番号+1から連番で作りたいです。作成希望例は下記になります。
最後に作成したデータの伝票番号が5の場合
テーブル名明細 → テーブル名伝票
[商品]・[数量] → [伝票番号]・[行番号]・[商品]・[数量]
商品A,5 → 5,1,商品A,5
商品B,2 → 5,2,商品B,2
商品C,4 → 5,3,商品C,4
商品D,3 → 6,1,商品D,3
商品E,5 → 6,2,商品E,5
商品F,1 → 6,3,商品F,1
商品G,2 → 7,1,商品G,2
商品H,1 → 7,2,商品H,1
次回は
商品I,5 → 8,1,商品A,5
商品J,2 → 8,2,商品B,2
商品K,4 → 8,3,商品C,4
商品L,3 → 9,1,商品D,3
このような形にしたいのです。よろしくお願いします。

投稿日時 - 2007-08-28 14:55:56

あなたにオススメの質問