アプリ版:「スタンプのみでお礼する」機能のリリースについて

Access2000で文字列の操作について質問です。
前任者が突然退職してしまったため、やり方が分からず困っています。。。

■文字列の操作について
姓(フリガナ)と名(フリガナ)の文字列を下記仕様に変換したいと思います。

【変換前】
  姓(フリガナ) 名(フリガナ)
   ⇒全角カナで2つの項目に分かれている
      
【変換後】
  姓名(フリガナ)
   ⇒それぞれ半角カナに変換し、1つの項目に結合する
   ⇒結合後のバイト長は30バイト、右詰で空白は半角スペースで埋める


■レコードのカウント処理について
・条件に合致したレコード数をカウント
・レコード数を右詰にし、前に0をつける(12バイト)

Accessに詳しい方、ご返答いただけると助かります。

A 回答 (9件)

>一度テーブルに出力して、それをファイルに出力しようと


ワークテーブルを作るのはかなり特殊な場合だけですね
普通はクエリで済ませてしまいます

>上記の4つの結果を一つのファイルに出力するのが最終目的です。
4つのテーブルの関係が分かりませんね
つなげられるフィールドはあるのですか?

>C.トレーラ情報
カウントも合計も集計クエリでできますね
その集計クエリをつなげればいいのでは
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

>普通はクエリで済ませてしまいます
ご教示ありがとうございます。
クエリで対応することにします。

>4つのテーブルの関係が分かりませんね
テーブルはそれぞれレコードになっています。
これらのレコードが最終的に
 テーブルA
 テーブルB
 テーブルC
 テーブルD
の並び順で一つのファイルにし、流し込みデータを生成します。

>つなげられるフィールドはあるのですか?
一部のフィールドをつないでいます。

>カウントも合計も集計クエリでできますね
集計クエリというものを存じ上げませんでした。

CHRONOS_0さんのご回答により、少しずつ分かってきました。
もう少しで形になりそうです。

お礼日時:2008/03/18 19:34

>レコードのカウント処理はどのようにやれば良いでしょうか?


普通に考えれば集計クエリですが
どこにどのように出したいのかが分からないと回答できませんね
前0をつけるのは
前の回答のスペースを付加するのと同じことです
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

今回の流れについて、詳しくご説明します。

■テーブルの種類
下記の4つのマスタテーブルで構成されています。
A.ヘッダ情報
  ⇒任意の日付(yymm)を入力。右詰で半角スペースで値をセットする。
B.ユーザ情報
  ⇒先般ご質問している変換処理を行い、変換後に別テーブルB'に値を格納する。
C.トレーラ情報
  ⇒レコード件数をカウント、値をセットする。
   また、金額の合計を算出、値をセットする。
D.エンド情報
  ⇒既存の値をそのまま流用する。

■処理について
上記の4つの結果を一つのファイルに出力するのが最終目的です。
一度テーブルに出力して、それをファイルに出力しようと考えていましたが、そこまで至っておりません。。。

お礼日時:2008/03/18 13:39

>別システムへの流し込みデータを生成するためです。


こういう目的ならクエリでいいんじゃないですか

全角カナ=>半角カナ変換はStrConv関数です

固定長文字にするのは前か後ろにスペースをたっぷりつけてから30文字だけ切り出せばいいのです


[姓名(フリガナ)]:Left(StrCnv([姓(フリガナ)] & [名(フリガナ)],8) & Space(30),30)
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

ご教示いただいた内容で実行できました。
仰るようにクエリで生成したいと思います。

レコードのカウント処理はどのようにやれば良いでしょうか?
お手数ですが、ご返答いただけると幸いです。

お礼日時:2008/03/18 11:33

>   ⇒それぞれ半角カナに変換し、1つの項目に結合する


ひとつにする理由は?
別れたままでも表示時などに簡単に結合できますよ
半角カナはコンピュータの世界では異端児です全角のままの方がいいのでは

>   ⇒結合後のバイト長は30バイト、右詰で空白は半角スペースで埋める
固定長にする理由は?
可変長の方がメモリー効率もいいですよ
それにAccessでは1文字2バイトです30バイトじゃ15文字
姓名のフリガナ文字数としては足りないんじゃないの
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

説明不足で申し訳ありません。
データ変換を行う目的は、別システムへの流し込みデータを生成するためです。
このデータの仕様上、カナは半角カナ、レコードは固定長となっています。

また、フリガナ文字数については、入力時に制限しておりますので、
半角カナで30バイトに収まる仕様になっています。

お礼日時:2008/03/17 15:48

先ほどに続き連投になりすみません。


■文字列の操作について
上記の例で間違いを見つけました。
StrConvはDo Whileの前に行う必要があります。
すみませんでした。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

前述しましたが、VBが全く分かりません。。。
「クエリ」のフィールドの条件式を少し触れるレベルです。

まずはVBから始めることが大事ですね。

お礼日時:2008/03/17 15:45

■文字列の操作について


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としては汚いソースですみません。

参考になれば幸いです。
    • good
    • 0

? SetR(1, "000000000000")


000000000001

チト、例を判りやすく・・・。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

VBが全く分かりません。。。
ご教示いただいた内容を元に、勉強してみます。

お礼日時:2008/03/17 15:43

[イミディエイト]


? 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
    • good
    • 0

【変換後】


  姓名(フリガナ)
   ⇒それぞれ半角カナに変換し、1つの項目に結合する
   ⇒結合後のバイト長は30バイト、右詰で空白は半角スペースで埋める

上記は比較的簡単に行えますが、結合後に30バイト以上の場合はどうしますか?
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

説明不足で申し訳ありません。
姓(フリガナ),名(フリガナ)は、それぞれ入力時に文字数制限を設けております。
したがって、結合後に30バイトを超えることはありません。

お礼日時:2008/03/17 15:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す