こんにちは、いつも参考にさせていただいております。
[環境]
VB6SP5+MDB(ADOで接続)OSはとりあえずWin2000でやってます
[やりたいこと]
VB上からADO接続で、MDBよりあるフィールドをSELECTする際に、
固定長文字列(※)としてデータを取得したい。
※例えば「東京」と入っていたら 「東京 」のように、
「神奈川」と入っていたら「神奈川 」のように
先ず最初に思い浮かぶ事として、
「SQLに含めなくても取得した後に編集」
という案があったのですが、
今回は少し事情があってそれができません。
(いや正確にはできるのですが、システムの変更でして、
色々なところをひたすら修正することになってしまうので避けたいのです)
次に、SQL文中にFORMAT関数を入れ込んで、
FORMAT(FIELD,"!@@@@@")のようにすればどうか、と思ったのですが、
全角の場合、「東京」なら「東京」と半角スペース3つで7バイト、
「神奈川」なら半角スペースが2つついて8バイト、
のようにずれが生じてしまいます。
(等幅フォントで見たときに文字列の右端が揃っている状態にしたい)
(スペースは正しく埋まれば半角でも全角でも良いのですが・・・)
その他、MDB内にモジュールを入れてみるも、「未定義関数」のエラー。
(これは過去ログにもあったようですが)
何とかならないものでしょうか?
よいアイデアがありましたら、お願いします。
格好悪いですけど、
こんな感じではどうですか?
select FIELD1 & Space(30 - LenB(StrConv(FIELD1, 128))) from TABLE1
Trim(FIELD1) & String(5-len(Trim(FIELD1)," ")
" "は全角スペース
でもOKかと
> VB上からADO接続で、MDBよりあるフィールドをSELECTする際に、
> 固定長文字列(※)としてデータを取得したい。
Access 97形式のmdb(Jet 3.5x)を使っているのであれば、文字列フィールドの定義を、
VARCHAR型ではなく、CHAR型にしておいては如何でしょうか。
例えば、
『CREATE TABLE TBL1 (FLD1 COUNTER CONSTRAINT PKEY1 PRIMARY KEY, FLD2 CHAR(8))』
『INSERT INTO TBL1 (FLD2) VALUES ('東京')』
『INSERT INTO TBL1 (FLD2) VALUES ('神奈川')』
の場合、FLD2列に含まれるデータは、
「東京****」
「神奈川**」
となります。(*は半角空白)
……なお、Access 2000以降の形式(Jet 4.0)を使っている場合は、
Unicode文字列(NVARCHAR/NCHAR)として扱われてしまうので、
「東京******」
「神奈川*****」
となってしまうので、注意してください。
どうしても Jet 4.0 (OLEDB Providerのバージョンではなく、mdbのバージョン)の
ファイルを使う必要があるのであれば、StrConv関数とLeftB関数を使う事ができます。
# SandBoxの設定次第ですけれども。
例えば、20バイト分だけ取得するのであれば、こんな感じです。
SQL = "SELECT FLD1,"
SQL = SQL & " StrConv(LeftB(StrConv(FLD2 & Space(20), "
SQL = SQL & CStr(vbFromUnicode) & "), 20), "
SQL = SQL & CStr(vbUnicode) & ") AS F2"
SQL = SQL & " FROM TBL1"
ぽちさん・k.kさん・魔界の仮面弁士さん ありがとうございます。
参考にさせていただきました。
特にk.kさんの方式を取り入れてます。
色々、試行錯誤した結果、
以下のようなかたちで進めていこうと思っていますので、
報告させていただきます。
Field1 &
String(5-CInt(Len(IIf(IsNull(Field1),"",Field1))), " ")
1)IIf()とIsNull()
Null値があるレコードがあった場合にエラーで上手くいかないので
Null変換をかけました。
(MDB(今回はAccess2000形式でした)のフィールド設定でゼロスペースOKの
チェックがあったような気がしますが、
どこまで影響するか判断つかないため、とりあえず却下しました)
2)CInt()
Len()で取った値をそのまま使えない(? エラー発生)ようなので、
CInt()をかけております。
と、いう感じでした。
再度、お礼申し上げます。
> Field1 & String(5-CInt(Len(IIf(IsNull(Field1),"",Field1))), " ")
Field1中に、半角文字が含まれる可能性はありませんか?
その式ですと、例えば
Field1 = "ii" だった時
→ 「ii※※※」 (5文字8桁)
Field1 = "WW" だった時
→ 「WW※※※」 (5文字9桁)
Field1 = "ああ" だった時
→ 「ああ※※※」 (5文字10桁)
といった結果になってしまいそうですけれども。(全角空白を※で表現しています)
ご指摘ありがとうございます!
魔界の仮面弁士さん wrote...
>Field1中に、半角文字が含まれる可能性はありませんか?
幸い可能性はゼロです。(^^)
わざわざご指摘ありがとうございます。
#でも実はその可能性を考慮するのを忘れていました。(ぉぃ