ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

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バイトを超えることはありません。