質問 |
||
| QNo.3865610 | 【Access2000】文字列の操作について | |
|---|---|---|
| 質問者:woolrich |
Access2000で文字列の操作について質問です。 前任者が突然退職してしまったため、やり方が分からず困っています。。。 ■文字列の操作について 姓(フリガナ)と名(フリガナ)の文字列を下記仕様に変換したいと思います。 【変換前】 姓(フリガナ) 名(フリガナ) ⇒全角カナで2つの項目に分かれている 【変換後】 姓名(フリガナ) ⇒それぞれ半角カナに変換し、1つの項目に結合する ⇒結合後のバイト長は30バイト、右詰で空白は半角スペースで埋める ■レコードのカウント処理について ・条件に合致したレコード数をカウント ・レコード数を右詰にし、前に0をつける(12バイト) Accessに詳しい方、ご返答いただけると助かります。 |
|
困り度:
|
||
| 質問投稿日時: 08/03/15 19:29 |
||
回答良回答20pt |
|
| ANo.9 | >一度テーブルに出力して、それをファイルに出力しようと ワークテーブルを作るのはかなり特殊な場合だけですね 普通はクエリで済ませてしまいます >上記の4つの結果を一つのファイルに出力するのが最終目的です。 4つのテーブルの関係が分かりませんね つなげられるフィールドはあるのですか? >C.トレーラ情報 カウントも合計も集計クエリでできますね その集計クエリをつなげればいいのでは |
|---|---|
| 回答者:CHRONOS_0 | |
| 種類:回答 どんな人:経験者 自信:自信あり |
|
| 回答日時: 08/03/18 14:39 |
|
| |
| この回答へのお礼 | ご返答ありがとうございます。 >普通はクエリで済ませてしまいます ご教示ありがとうございます。 クエリで対応することにします。 >4つのテーブルの関係が分かりませんね テーブルはそれぞれレコードになっています。 これらのレコードが最終的に テーブルA テーブルB テーブルC テーブルD の並び順で一つのファイルにし、流し込みデータを生成します。 >つなげられるフィールドはあるのですか? 一部のフィールドをつないでいます。 >カウントも合計も集計クエリでできますね 集計クエリというものを存じ上げませんでした。 CHRONOS_0さんのご回答により、少しずつ分かってきました。 もう少しで形になりそうです。 |
回答 |
|
| ANo.8 | >レコードのカウント処理はどのようにやれば良いでしょうか? 普通に考えれば集計クエリですが どこにどのように出したいのかが分からないと回答できませんね 前0をつけるのは 前の回答のスペースを付加するのと同じことです |
|---|---|
| 回答者:CHRONOS_0 | |
| 種類:回答 どんな人:経験者 自信:自信あり |
|
| 回答日時: 08/03/18 12:21 |
|
| |
| この回答へのお礼 | ご返答ありがとうございます。 今回の流れについて、詳しくご説明します。 ■テーブルの種類 下記の4つのマスタテーブルで構成されています。 A.ヘッダ情報 ⇒任意の日付(yymm)を入力。右詰で半角スペースで値をセットする。 B.ユーザ情報 ⇒先般ご質問している変換処理を行い、変換後に別テーブルB'に値を格納する。 C.トレーラ情報 ⇒レコード件数をカウント、値をセットする。 また、金額の合計を算出、値をセットする。 D.エンド情報 ⇒既存の値をそのまま流用する。 ■処理について 上記の4つの結果を一つのファイルに出力するのが最終目的です。 一度テーブルに出力して、それをファイルに出力しようと考えていましたが、そこまで至っておりません。。。 |
回答 |
|
| ANo.7 | >別システムへの流し込みデータを生成するためです。 こういう目的ならクエリでいいんじゃないですか 全角カナ=>半角カナ変換はStrConv関数です 固定長文字にするのは前か後ろにスペースをたっぷりつけてから30文字だけ切り出せばいいのです [姓名(フリガナ)]:Left(StrCnv([姓(フリガナ)] & [名(フリガナ)],8) & Space(30),30) |
|---|---|
| 回答者:CHRONOS_0 | |
| 種類:回答 どんな人:経験者 自信:自信あり |
|
| 回答日時: 08/03/17 17:46 |
|
| |
| この回答へのお礼 | ご返答ありがとうございます。 ご教示いただいた内容で実行できました。 仰るようにクエリで生成したいと思います。 レコードのカウント処理はどのようにやれば良いでしょうか? お手数ですが、ご返答いただけると幸いです。 |
回答 |
|
| ANo.6 | > ⇒それぞれ半角カナに変換し、1つの項目に結合する ひとつにする理由は? 別れたままでも表示時などに簡単に結合できますよ 半角カナはコンピュータの世界では異端児です全角のままの方がいいのでは > ⇒結合後のバイト長は30バイト、右詰で空白は半角スペースで埋める 固定長にする理由は? 可変長の方がメモリー効率もいいですよ それにAccessでは1文字2バイトです30バイトじゃ15文字 姓名のフリガナ文字数としては足りないんじゃないの |
|---|---|
| 回答者:CHRONOS_0 | |
| 種類:回答 どんな人:経験者 自信:自信あり |
|
| 回答日時: 08/03/15 22:24 |
|
| |
| この回答へのお礼 | ご返答ありがとうございます。 説明不足で申し訳ありません。 データ変換を行う目的は、別システムへの流し込みデータを生成するためです。 このデータの仕様上、カナは半角カナ、レコードは固定長となっています。 また、フリガナ文字数については、入力時に制限しておりますので、 半角カナで30バイトに収まる仕様になっています。 |
回答 |
|
| ANo.5 | 先ほどに続き連投になりすみません。 ■文字列の操作について 上記の例で間違いを見つけました。 StrConvはDo Whileの前に行う必要があります。 すみませんでした。 |
|---|---|
| 回答者:BleuLune | |
| 種類:アドバイス どんな人:専門家 自信:参考意見 |
|
| 回答日時: 08/03/15 20:32 |
|
| |
| この回答へのお礼 | ご返答ありがとうございます。 前述しましたが、VBが全く分かりません。。。 「クエリ」のフィールドの条件式を少し触れるレベルです。 まずはVBから始めることが大事ですね。 |
回答良回答10pt |
|
| ANo.4 | ■文字列の操作について 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としては汚いソースですみません。 参考になれば幸いです。 |
|---|---|
| 回答者:BleuLune | |
| 種類:回答 どんな人:専門家 自信:参考意見 |
|
| 回答日時: 08/03/15 20:27 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.3 | ? SetR(1, "000000000000") 000000000001 チト、例を判りやすく・・・。 |
|---|---|
| 回答者:Husky2007 | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/03/15 20:23 |
|
| |
| この回答へのお礼 | ご返答ありがとうございます。 VBが全く分かりません。。。 ご教示いただいた内容を元に、勉強してみます。 |
回答 |
|
| ANo.2 | [イミディエイト] ? 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 |
|---|---|
| 回答者:Husky2007 | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/03/15 20:21 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.1 | 【変換後】 姓名(フリガナ) ⇒それぞれ半角カナに変換し、1つの項目に結合する ⇒結合後のバイト長は30バイト、右詰で空白は半角スペースで埋める 上記は比較的簡単に行えますが、結合後に30バイト以上の場合はどうしますか? |
|---|---|
| 回答者:kiyo1 | |
| 種類:補足要求 どんな人:経験者 自信:参考意見 |
|
| 回答日時: 08/03/15 20:12 |
|
| |
| この回答へのお礼 | ご返答ありがとうございます。 説明不足で申し訳ありません。 姓(フリガナ),名(フリガナ)は、それぞれ入力時に文字数制限を設けております。 したがって、結合後に30バイトを超えることはありません。 |