すいません。SQLの話ですが。。。
ぜひお教えください。
VB6.0 +JET4.0です。
SQLのORDER BY句にパラメータを使用したいのですが、
もともとできない?のでしょうか?
だとしましたら代替としてどのような手法がございますでしょうか。
SELECT *
FROM TBLKAIIN
WHERE (JOB_NO =
(SELECT MASTER_JOB.JOB_NO
FROM MASTER_JOB
WHERE MASTER_JOB.JOB名 = ?))
ORDER BY ?
???…Field 名を指定すればいいんでないの?
パラメータってどんな?
ありがとうございます。
パラメータはFORMから受け渡すようにしています。
Set Prm = New ADODB Parameter
なんとか可変にしたいのです。。。
どうでしょうか。
SQL 文は VB 側で編集している間はただの文字列ですので
文字列として"ORDER BY "の後に加えるので良いのではないでしょうか?
ありがとうございます。
私もそう思い、文字列で指定してみたのですが、
WHERE句の場合はうまく動きますが、
ORDER BY句のパラメータは反応しません。
下記URLにそれっぽい事が書いてありました。
ORDER BYへのパラメータ指定はVBではできないのでしょうか。。。
http://www.macromedia.com/jp/support/dreamweaver/building/aspnet_tags/aspnet_tags03.html
ASP はやったことないので分かりません。
ただ、VB6.0 +JET4.0 だからというのは関係ないと思います。
ローカルの Access に関する質問が少し前にありましたが、
ADODB.Command で指定した SQL 文で ORDER BY 句は使えました。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200402/04020054.txt
そもそも
>Set Prm = New ADODB Parameter
の ADODB と Parameter の間に何でスペースが入ってるのか?…とか
SQL 文を実行するなら ADODB.Command じゃないのか?…とかTOTORO
さんがどういう環境で、どういう情報を何に設定しているのか想像できません。
ありがとうございます。
ソースは下記のようにしています。
Private Sub Command1_Click()
Dim mysqlr As String
Dim rsd As New ADODB.Recordset
Dim Prm As ADODB.Parameter
Dim Prm1 As ADODB.Parameter
Dim GT As String
Dim HT As String
GT = ctlJOB名.Text
HT = ctl選択項目(0).Text
'パラメータクエリを作成
mysqlr = "SELECT * From TBLKAIIN WHERE TBLKAIIN.JOB_NO = (SELECT MASTER_JOB.JOB_NO From MASTER_JOB WHERE MASTER_JOB.JOB名 = ?) ORDER BY ?"
'Commandオブジェクトを作成
Set cmdMaster = New ADODB.Command
cmdMaster.ActiveConnection = cn
cmdMaster.CommandText = mysqlr
'Parameterオブジェクトを作成(JOB選択)
Set Prm = New ADODB.Parameter
Set Prm = cmdMaster.CreateParameter("Prm", adVariant, adParamInput, 30)
cmdMaster.Parameters.Append Prm
'Parameterオブジェクトを作成(第1SORT順)
Set Prm1 = New ADODB.Parameter
Set Prm1 = cmdMaster.CreateParameter("Prm1", adVariant, adParamInput, 30)
cmdMaster.Parameters.Append Prm1
'Parameterを設定
cmdMaster.Parameters("Prm").Value = GT
cmdMaster.Parameters("Prm1").Value = HT
'パラメータクエリを実行
Set rsd = New ADODB.Recordset
Set rsd = cmdMaster.Execute
With deMain
.cmdMaster ctlJOB名.Text, ctl選択項目(0).Text
End With
Unload Me
Set rsd = Nothing
Set Prm = Nothing
Set Prm1 = Nothing
Load Form1
Form1.Show
End Sub
※ORDER BY ? を ORDER BY "+ HT +"としましても
ソートしてくれません。
う〜む。。。です
パラメータは普段使わないのであまり詳しくないですが、
ORDER BY句に指定するのは普通、列名ですからパラメータにはできないでしょう。
(1、2、・・・等の番号指定の場合はどうでしょう??)
で、
HT = ctl選択項目(0).Text
とありますが、この値は列名なんですか?
ありがとうございます。
>HT = ctl選択項目(0).Text
>とありますが、この値は列名なんですか?
そうです。TBLKAIINテーブルの列名を
別テーブルで値としてもたせています。
それをctl選択項目(0).Textに連結させています。
であれば、
>※ORDER BY ? を ORDER BY "+ HT +"としましても
> ソートしてくれません。
> う〜む。。。です
このやり方で問題ないはずですけどね。
変数mysqlrの中身は確認されましたか?
ありがとうございます。
ORDER BY "+ HT +" とした場合、
SQLにうまく収まっているようです。
ORDER BY 自宅電話番号
このままSQLのみをDBで実行してみるとうまくソートされます。
が、上記VBの中だとソートされません。。。
どうしてなのでしょうか?
なんかオイラの環境じゃレコードセット自体うまく取れないです(;▽;)
原因は…分かりませんが、とりあえず以下のソースを試してみてもらって
いいですか?
[VB6.0]
Private Sub Command1_Click()
Dim cmdMaster As ADODB.Command
Dim rsd As ADODB.Recordset
Dim mysqlr As String
mysqlr = "SELECT * FROM TBLKAIIN WHERE TBLKAIIN.JOB_NO = (SELECT MASTER_JOB.JOB_NO FROM MASTER_JOB " _
& "WHERE MASTER_JOB.JOB名 = '" & ctlJOB名.Text _
& "') ORDER BY " & ctl選択項目(0).Text
Set cmdMaster = New ADODB.Command
cmdMaster.ActiveConnection = cn
cmdMaster.CommandText = mysqlr
Set rsd = New ADODB.Recordset
rsd.CursorLocation = adUseClient
rsd.Open cmdMaster
Debug.Print rsd.RecordCount
End Sub