- ベストアンサー
【Access2000】文字列の操作について
Access2000で文字列の操作について質問です。 前任者が突然退職してしまったため、やり方が分からず困っています。。。 ■文字列の操作について 姓(フリガナ)と名(フリガナ)の文字列を下記仕様に変換したいと思います。 【変換前】 姓(フリガナ) 名(フリガナ) ⇒全角カナで2つの項目に分かれている 【変換後】 姓名(フリガナ) ⇒それぞれ半角カナに変換し、1つの項目に結合する ⇒結合後のバイト長は30バイト、右詰で空白は半角スペースで埋める ■レコードのカウント処理について ・条件に合致したレコード数をカウント ・レコード数を右詰にし、前に0をつける(12バイト) Accessに詳しい方、ご返答いただけると助かります。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
>一度テーブルに出力して、それをファイルに出力しようと ワークテーブルを作るのはかなり特殊な場合だけですね 普通はクエリで済ませてしまいます >上記の4つの結果を一つのファイルに出力するのが最終目的です。 4つのテーブルの関係が分かりませんね つなげられるフィールドはあるのですか? >C.トレーラ情報 カウントも合計も集計クエリでできますね その集計クエリをつなげればいいのでは
その他の回答 (8)
- CHRONOS_0
- ベストアンサー率54% (457/838)
>レコードのカウント処理はどのようにやれば良いでしょうか? 普通に考えれば集計クエリですが どこにどのように出したいのかが分からないと回答できませんね 前0をつけるのは 前の回答のスペースを付加するのと同じことです
お礼
ご返答ありがとうございます。 今回の流れについて、詳しくご説明します。 ■テーブルの種類 下記の4つのマスタテーブルで構成されています。 A.ヘッダ情報 ⇒任意の日付(yymm)を入力。右詰で半角スペースで値をセットする。 B.ユーザ情報 ⇒先般ご質問している変換処理を行い、変換後に別テーブルB'に値を格納する。 C.トレーラ情報 ⇒レコード件数をカウント、値をセットする。 また、金額の合計を算出、値をセットする。 D.エンド情報 ⇒既存の値をそのまま流用する。 ■処理について 上記の4つの結果を一つのファイルに出力するのが最終目的です。 一度テーブルに出力して、それをファイルに出力しようと考えていましたが、そこまで至っておりません。。。
- CHRONOS_0
- ベストアンサー率54% (457/838)
>別システムへの流し込みデータを生成するためです。 こういう目的ならクエリでいいんじゃないですか 全角カナ=>半角カナ変換はStrConv関数です 固定長文字にするのは前か後ろにスペースをたっぷりつけてから30文字だけ切り出せばいいのです [姓名(フリガナ)]:Left(StrCnv([姓(フリガナ)] & [名(フリガナ)],8) & Space(30),30)
お礼
ご返答ありがとうございます。 ご教示いただいた内容で実行できました。 仰るようにクエリで生成したいと思います。 レコードのカウント処理はどのようにやれば良いでしょうか? お手数ですが、ご返答いただけると幸いです。
- CHRONOS_0
- ベストアンサー率54% (457/838)
> ⇒それぞれ半角カナに変換し、1つの項目に結合する ひとつにする理由は? 別れたままでも表示時などに簡単に結合できますよ 半角カナはコンピュータの世界では異端児です全角のままの方がいいのでは > ⇒結合後のバイト長は30バイト、右詰で空白は半角スペースで埋める 固定長にする理由は? 可変長の方がメモリー効率もいいですよ それにAccessでは1文字2バイトです30バイトじゃ15文字 姓名のフリガナ文字数としては足りないんじゃないの
お礼
ご返答ありがとうございます。 説明不足で申し訳ありません。 データ変換を行う目的は、別システムへの流し込みデータを生成するためです。 このデータの仕様上、カナは半角カナ、レコードは固定長となっています。 また、フリガナ文字数については、入力時に制限しておりますので、 半角カナで30バイトに収まる仕様になっています。
- BleuLune
- ベストアンサー率57% (15/26)
先ほどに続き連投になりすみません。 ■文字列の操作について 上記の例で間違いを見つけました。 StrConvはDo Whileの前に行う必要があります。 すみませんでした。
お礼
ご返答ありがとうございます。 前述しましたが、VBが全く分かりません。。。 「クエリ」のフィールドの条件式を少し触れるレベルです。 まずはVBから始めることが大事ですね。
- BleuLune
- ベストアンサー率57% (15/26)
■文字列の操作について LastName = 姓の項目値 FirstName = 名の項目値 TempKanaName = LastName & FirstName Do While Len(TempKanaName)<31 TempKanaName = ResultKanaName & " " End Loop ResultKanaName = StrConv(TempKanaName ,vbNarrow) ■レコードのカウント処理について Dim DB As DAO.Database Dim RS As DAO.Recordset Dim RecordCount as Integer Dim Num_I as Integer Dim ResultCount as String Dim ZeroSurpress as String Set DB = CurrentDb() Set RS = Db.OpenRecordset("なんとかテーブル",dbopenDynaset) RecordCount = RS.count ZeroSurpress = "0" For Num_I = 1 to 12 - Len(Str(RecordCount)) ResultCount = ResultCount & ZeroSurpress Next ResultCount = ResultCount & Str(RecordCount) VBA は久しぶりなので、細かい記述に間違いがあったときはご容赦ください。 ロジックはこのようなもので実現できるかと思いますが、いかがでしょうか。 基本がJAVAなので、VBAとしては汚いソースですみません。 参考になれば幸いです。
? SetR(1, "000000000000") 000000000001 チト、例を判りやすく・・・。
お礼
ご返答ありがとうございます。 VBが全く分かりません。。。 ご教示いただいた内容を元に、勉強してみます。
[イミディエイト] ? SetR(StrConv("スズキ イチロウ", 8), "----+----1----+----2----+----3") ----+----1----+----2-スズキ イチロウ ? SetR(1, "----+----1--") ----+----1-1 自宅からの回答なので、Access2000 ではなくExcel2003で検証しただけですが・・・。 このようなことを実現したいのでしょう。 ここでは、次の SetR() を利用しています。 Public Function SetR(ByVal Text1 As String, ByVal Text2 As String) As String Dim I As Integer Dim J As Integer Dim L As Integer Dim M As Integer Dim N As Integer J = Len(Text1) L = LenH(Text2) For I = 1 To J M = LenH(Mid$(Text1, 1, I)) If M > L Then SetR = Left$(Text2, L - N) & Left$(Text1, I - 1) Exit Function Else N = M End If Next I SetR = Left$(Text2, L - N) & Text1 End Function Private Function LenH(ByVal Text As String) As Integer LenH = LenB(StrConv(Text, vbFromUnicode)) End Function
- kiyo1
- ベストアンサー率41% (5/12)
【変換後】 姓名(フリガナ) ⇒それぞれ半角カナに変換し、1つの項目に結合する ⇒結合後のバイト長は30バイト、右詰で空白は半角スペースで埋める 上記は比較的簡単に行えますが、結合後に30バイト以上の場合はどうしますか?
お礼
ご返答ありがとうございます。 説明不足で申し訳ありません。 姓(フリガナ),名(フリガナ)は、それぞれ入力時に文字数制限を設けております。 したがって、結合後に30バイトを超えることはありません。
お礼
ご返答ありがとうございます。 >普通はクエリで済ませてしまいます ご教示ありがとうございます。 クエリで対応することにします。 >4つのテーブルの関係が分かりませんね テーブルはそれぞれレコードになっています。 これらのレコードが最終的に テーブルA テーブルB テーブルC テーブルD の並び順で一つのファイルにし、流し込みデータを生成します。 >つなげられるフィールドはあるのですか? 一部のフィールドをつないでいます。 >カウントも合計も集計クエリでできますね 集計クエリというものを存じ上げませんでした。 CHRONOS_0さんのご回答により、少しずつ分かってきました。 もう少しで形になりそうです。