はじめて投稿しますピタゴラスの定理です。
初歩的な質問と思いますが宜しくお願いします。
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
例外が発生するのなら
try
LabeledEdit3.Text := Trim(rs.Fields[2]); //担当者
except
LabeledEdit3.Text := '';
end;
でいいんじゃない?
クエリー内で処理するなら,以下を選択クエリーに追加してFieldの別名で
取得する方法もあります.
この例では,項目は整数で,空の時は0を取得します.
IIf(IsNull(項目名),0,CInt(項目名)) as 項目別名
また,取得した項目値に対して,
if VarIsNull(項目値) then Result:=0 else Result:=項目値;
というのも考えられます.
お二人のご回答ありがとう御座います。
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
ところで 環境Delphi6free って業務利用可能だっけ?
> Delphi6free って業務利用可能だっけ?
とりあえず、↓によると
http://www.forest.impress.co.jp/article/2001/08/24/delphi6.html
> 商用・業務アプリケーションの開発はできない
だってさ。
なんだかADOのRecordSetをDelphi上で作成しているように見受けられます。
CreateOleObject('ADODB.Recordset'); みたいな感じでRecordSetを作っていませんか?
テーブル作成用のVBAを書かれているのでVBAと同じように処理しようとしたのかもしれませんが
DelphiではTableやQueryコントロールを用いてSQLを発行するのが一般的ですし簡単です。
(間違っていたらゴメンなさい)
もし、Queryコントロールを用いている場合は Mr.XRAYさん が書いたようにSelect文で処理してしまえば簡単だと思います。
レス有り難う御座います。
KHE00221様
>環境Delphi6free って業務利用可能だっけ? の件ですが
そうですね、違法扱いになりますね。
この件は諦めるか違う言語で考えて見ます。
めじな様
>DelphiではTableやQueryコントロールを用いてSQLを発行するのが一般的ですし
おそらくDelphi6freeにはそのコントロールは付いていないのだと思います。
またおっしゃる通りの事をしていました。他に知識が無いものですから
まだ発展途上の私ですが、
今後も意見をいただければ幸いです。
ツイート | ![]() |