mdbのあるフィールドの空文字ornullの確認方法

解決


ピタゴラスの定理  2008-02-10 20:11:09  No: 29766

はじめて投稿しますピタゴラスの定理です。
初歩的な質問と思いますが宜しくお願いします。

ADO−mdbの処理で、フォームにEditをいくつか置いて
レコードのフィールドを表示しようと思っています。

それであるフィールドが空文字orNULLの場合
 LabeledEdit3.Text := Trim(rs.Fields[2]);  //担当者
のコードですと、エラーになります。

エラー表示「デバッカ例外が発生
プロジェクト**がEOleErrorクラスの例外を生成しました
メソッド'Field'はオートメーションオブジェクトでサポートしていません」
【raise EOleError.CreateResFmt(@SNoMethod, [Names]);】が反転表示

主キー以外は
Tb.Columns(i).Properties("Jet OLEDB:Allow Zero Length").Value = True
Tb.Columns(i).Properties("Nullable").Value = True
の設定をしています。

どのような方法でフォームのコントロールに表示するのでしょうか
伺いたいのですが
私が考えた事はあるフィールドが空文字orNULLを確認し
if関数を使いEdit等に表示する方法かな?

[1]フィールドはダミーも含めすべて埋めて、表示する時に置き換える
[2]表示するコードが違う
[2]なにか他のよい方法がある
の何れでその処理方法をご指示下さい。
出来ればmdbは空文字orNULLをTRUEで使用したい。

環境Delphi6free  Provider=Microsoft.Jet.OLEDB.4.0


KHE00221  2008-02-10 22:28:25  No: 29767

例外が発生するのなら

try
  LabeledEdit3.Text := Trim(rs.Fields[2]);  //担当者
except
  LabeledEdit3.Text := '';
end;

でいいんじゃない?


Mr.XRAY  2008-02-11 01:10:36  No: 29768

クエリー内で処理するなら,以下を選択クエリーに追加してFieldの別名で
取得する方法もあります.
この例では,項目は整数で,空の時は0を取得します.

IIf(IsNull(項目名),0,CInt(項目名)) as 項目別名

また,取得した項目値に対して,

if VarIsNull(項目値) then Result:=0 else Result:=項目値;

というのも考えられます.


ピタゴラスの定理  2008-02-11 05:53:29  No: 29769

お二人のご回答ありがとう御座います。

KHE00221さまの方法で試しますと
「ソースファイルが見つかりません」
ソースファイルへのパス
variants.pas
と出ます。なぜでしょう?

Mr.XRAYさま「クエリー内で処理するなら」は私にはまだ
知識不足で理解できません。

ちなみにmdbの作成コードをアップします(VBA)

Sub 新規mdb作成() 'ADO
    'Microsoft ActiveX Data Objects 2.X Library 参照設定
    'Microsoft ADO Ext. 2.1 for DDL and Security 参照設定
    Dim myCat As New ADOX.Catalog
    Dim myCon As ADODB.Connection
    Dim myPathName As String
    Dim Tb As New Table
    Dim Idx As New ADOX.Index
    Dim i As Long
    
    myPathName = ThisWorkbook.Path & "\newdb受注書.mdb" '作成するファイル名を指定
    If Dir(myPathName) <> "" Then Kill myPathName  '同名のmdbファイルがある場合は削除する
    
    myCat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & myPathName
    Set myCon = myCat.ActiveConnection
    'Debug.Print myCon.ConnectionString
    'If Dir(mypathName) <> "" Then MsgBox "db受注書ファイルが作成されました"
    
    Set Tb.ParentCatalog = myCat
    With Tb
        .Name = "受注書"
        .Columns.Append "受注No", adWChar, 7
        .Columns.Append "受注先会社名", adWChar, 25
        .Columns.Append "受注先担当者", adWChar, 15
        .Columns.Append "工事名称", adWChar, 50
        .Columns.Append "建物用途", adWChar, 15
        .Columns.Append "作成者", adWChar, 12
        .Columns.Append "受注日", adWChar, 10
        ---中省略---
        .Columns.Append "値入", adWChar, 10
        .Columns.Append "補足事項", adWChar, 255
    End With
    
        For i = 2 To 27
        '空文字列の許可
        Tb.Columns(i).Properties("Jet OLEDB:Allow Zero Length").Value = True
        '「値要求なし」
        'Tb.Columns(i).Properties("Nullable").Value = True
        Next i
    
    myCat.Tables.Append Tb
        
    With Idx 'インデックスの作成
        .Name = "IdxName"
        .IndexNulls = adIndexNullsIgnore   'Nullを許容しない
        .Columns.Append "受注No"             '列名の指定
        .PrimaryKey = True                   '主キーに設定
        .Unique = True                       '重複無しに設定
    End With
    Tb.Indexes.Append Idx
      
    myCon.Close
    
    Set myCon = Nothing  'オブジェクトの解放
    Set myCat = Nothing
    
End Sub


KHE00221  2008-02-11 22:54:46  No: 29770

ところで  環境Delphi6free って業務利用可能だっけ?


???  2008-02-12 03:36:33  No: 29771

> Delphi6free って業務利用可能だっけ?
とりあえず、↓によると
http://www.forest.impress.co.jp/article/2001/08/24/delphi6.html

> 商用・業務アプリケーションの開発はできない

だってさ。


めじな  2008-02-12 20:08:37  No: 29772

なんだかADOのRecordSetをDelphi上で作成しているように見受けられます。
CreateOleObject('ADODB.Recordset'); みたいな感じでRecordSetを作っていませんか?
テーブル作成用のVBAを書かれているのでVBAと同じように処理しようとしたのかもしれませんが
DelphiではTableやQueryコントロールを用いてSQLを発行するのが一般的ですし簡単です。
(間違っていたらゴメンなさい)

もし、Queryコントロールを用いている場合は Mr.XRAYさん が書いたようにSelect文で処理してしまえば簡単だと思います。


ピタゴラスの  2008-02-13 07:42:36  No: 29773

レス有り難う御座います。
KHE00221様
>環境Delphi6free って業務利用可能だっけ?  の件ですが
そうですね、違法扱いになりますね。
この件は諦めるか違う言語で考えて見ます。

めじな様
>DelphiではTableやQueryコントロールを用いてSQLを発行するのが一般的ですし
おそらくDelphi6freeにはそのコントロールは付いていないのだと思います。
またおっしゃる通りの事をしていました。他に知識が無いものですから

まだ発展途上の私ですが、
今後も意見をいただければ幸いです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加