Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1673 / 2272 ツリー ←次へ | 前へ→

【5707】最終項目の最後の移動 安久 05/7/30(土) 16:19 質問[未読]
【5710】Re:最終項目の最後の移動 小僧 05/8/1(月) 10:33 発言[未読]
【5738】Re:最終項目の最後の移動 安久 05/8/3(水) 12:40 質問[未読]
【5739】Re:最終項目の最後の移動 小僧 05/8/3(水) 13:55 回答[未読]
【5772】Re:最終項目の最後の移動 安久 05/8/5(金) 16:15 質問[未読]
【5778】Re:最終項目の最後の移動 小僧 05/8/8(月) 9:30 発言[未読]
【5842】Re:最終項目の最後の移動 安久 05/8/11(木) 18:08 質問[未読]
【5844】Re:最終項目の最後の移動 小僧 05/8/12(金) 10:07 発言[未読]
【5847】Re:最終項目の最後の移動 小僧 05/8/12(金) 10:45 回答[未読]
【5876】Re:最終項目の最後の移動 hikaru 05/8/17(水) 14:58 質問[未読]
【5882】Re:最終項目の最後の移動 小僧 05/8/17(水) 16:47 発言[未読]

【5707】最終項目の最後の移動
質問  安久  - 05/7/30(土) 16:19 -

引用なし
パスワード
   今、Form1とForm2があります。Form1には検査結果の項目とその結果が表示されるようにしています。
 Form1の検査項目は多数あり、検査結果も多数あります。
今、それぞれの項目ごとの結果をForm1のなかのコマンドボタンを押すとその結果がForm2の各項目のテキストボックスに移動するように設定しています。
 しかし、Form1の項目の一つ一つは検査結果が多数(日にちにより値が違う)あるので移動しません。(日にちを指定してその日の結果だけだとできます。)
(今は、Dloolupで指定しています。
  例、 Forms!患者名!TG = ("[検査結果]","Ka検査q","[検査コード]=`010092`")
 このような漢字で全ての検査項目ごとに今は設定しています。
  (Form1はクエリで大元からデータを引っ張っています。)

 Form1の各検査項目の最終の値(各検査項目で最終の日にちが違う)を一度でForm2の各項目の指定のテキストボックスに移動するやり方はありますか? 
 よろしくお願いします。

【5710】Re:最終項目の最後の移動
発言  小僧  - 05/8/1(月) 10:33 -

引用なし
パスワード
   ▼安久 さん:
こんにちは。

元のテーブルに「日付」フィールドがあるとすると、

1) クエリを作成して(Ka検査qという名前が既にクエリのようですが)、
  日付で降順にソートする。

2) DMax関数を使って最大日付を求めてからDLookup関数を使う。


2) の方法ですと、

Private Sub Test()
Dim MyDate As Date
  MyDate = DMax("[日付]", "Ka検査q", "[検査コード]='010092'")
  Forms!患者名!TG = DLookup("[検査結果]", "Ka検査q", "[検査コード]='010092' " _
          & "AND [日付]=#" & MyDate & "#")
End Sub

「日付」に該当するフィールドが無い場合は厳しいと思われます。

【5738】Re:最終項目の最後の移動
質問  安久  - 05/8/3(水) 12:40 -

引用なし
パスワード
   お返事ありがとうございました。
>
>クエリに「検査日」があります。
今、
>Private Sub データ入力1 Click()
If MsgBOX("追加","vbOKCancel + vbDefaultButton1)=vbOK Then
DoCmd.Hourglass True
>Dim a As Date
If Dlloup("[検査日]", "Ka検査q", "[検査コード]='010092'")=NotNull Then
>  a = DMax("[検査日]", "Ka検査q", "[検査コード]='010092'")
>  Forms!患者名!TG = DLookup("[検査結果]", "Ka検査q", "[検査コード]='010092' " _& "AND [検査日]=#" & a & "#")
End If
Dim b As Date
If Dlloup("[検査日]", "Ka検査q", "[検査コード]='020010'")=NotNull Then
>  a = DMax("[検査日]", "Ka検査q", "[検査コード]='020010'")
>  Forms!患者名!WBC = DLookup("[検査結果]", "Ka検査q", "[検査コード]='020010' " _& "AND [検査日]=#" & b & "#")
End If
後、これと同じようなやつが20個ぐらいあります。

DoCmd.Hourglass False
End If
>End Sub
>というふうに変えました。
 (お返事いただいたやつでしたらa = DMax("[日付]", "Ka検査q", "[検査コード]='010092'") ここで データがなかったらNullになりいかなかったので変えてみました。)
しかし、エラーはでないのですが凄く重くてデータの移動を確認できません。
 (30分ぐらいしても無理でした)
これでできるか教えて下さい。
また、何か別の方法があるのでしたら教えて下さい。
お願いします。

【5739】Re:最終項目の最後の移動
回答  小僧  - 05/8/3(水) 13:55 -

引用なし
パスワード
   ▼安久 さん:
こんにちは。

>しかし、エラーはでないのですが凄く重くてデータの移動を確認できません。
> (30分ぐらいしても無理でした)

DLookup関数でクエリ(ですよね?)を開いているため、
クエリを開く時間 + 検索の時間 なのでしょうかね…。

レコード件数やPCの環境によっても違うと思いますが、
クエリで処理されてみてはいかがでしょうか。

検査コード = 010092 が 「TG」
       020010 が 「WBC」

のような形でしたら、

Private Sub 実行_Click()
'※要参照 DAO x.x Object Library
Dim SQLCode As String
Dim RS As DAO.Recordset
Dim KCode As Variant
Dim KName As Variant
Dim I As Long
  KCode = Array("010092", "020010")
  KName = Array("TG", "WBC")

  For I = 0 To UBound(KCode)
    SQLCode = "SELECT Ka検査q.検査結果 " _
        & "FROM Ka検査q " _
        & "WHERE Ka検査q.検査コード = '" & KCode(I) & "' " _
        & "ORDER BY Ka検査q.[検査日] DESC;"
  
    Set RS = CurrentDb.OpenRecordset(SQLCode, dbOpenSnapshot)
      If Not (RS.NoMatch) Then
        Forms![患者名].Controls(KName(I)) = RS![検査結果]
      End If
    RS.Close
  Next
End Sub

ただこの場合も「Ka検査q」を開いているので、
できれば元テーブルから「SELECT」した方が早い処理になると思います。

【5772】Re:最終項目の最後の移動
質問  安久  - 05/8/5(金) 16:15 -

引用なし
パスワード
   お返事ありがとうございます。
 先の返事の通りFormにコマンドボタンを作りVBAをつくったのですが、識別しませんでした。

Formにリストボックスとして今は日にち順にクエリからデータを引っ張っています。(SELECT Ka検査.検査日,ka検査.検査名,ka検査.検査結果,ka検査.単位 FROM ka検査 ORDER BY ka検査.検査日 DESC;)
と言う風に表示されるように作っています。
(日にち順に全ての結果が表示されている)

今、このリストボックスに各検査名ごとの最後の日にちの結果を表示できるようにすればDLookup で指定すればできるかと思い意見を聞きたいです。
後、先にうかがったのがうまくいかなかったので詳しく教えていただけたら幸いです。

【5778】Re:最終項目の最後の移動
発言  小僧  - 05/8/8(月) 9:30 -

引用なし
パスワード
   ▼安久 さん:
こんにちは。

>今、このリストボックスに各検査名ごとの最後の日にちの結果を表示できるように

リストボックスに入れるクエリを考えた方が解決がはやそうですね。

クエリの SQL ビューに下記 SQL を入れて結果を確認してみて下さい。

SELECT P.検査日, P.検査名, Ka検査.検査結果, Ka検査.単位
FROM [
SELECT Max(Ka検査.検査日) AS 検査日, Ka検査.検査名
FROM Ka検査
GROUP BY Ka検査.検査名

【5842】Re:最終項目の最後の移動
質問  安久  - 05/8/11(木) 18:08 -

引用なし
パスワード
   今は、ka検査クエリとka検査クエリ2を作っています。
そして、フォームの中のリストボックスは非連結で値集合ソースに 
 SELECT ka検査.検査日,ka検査.検査名,ka検査.検査結果,ka検査.単位 FROM ka検査 ORDER BY ka検査.検査日 DESC; というふうにしています。
 もうひとつのFormにはカルテNoだけを一致させるようにつくっています。

ka検査クエリのSQLビューには
 SELECT kek.saiday AS 検査日,kiukeno AS 受付番号,k.code AS カルテNO,k.kjnam AS 患者氏名,km.kensacode AS 検査コード,km.kensaname AS 検査名,kek.kekka AS 検査結果,km.unit AS 単位
 FROM dbo_kenmasf AS km,dbo_kenkekdt AS kek,dbo_kanmf AS k,dbo_kenirahd AS ki
WHERE AND ((ki.ukeno)=[kek].[ukeno])AND((k.code)=[Forms]![患者名]![カルテNo]AND (ki.kancd)=[k].[code] And (ki.ukeymd)<`90000000`) AND ((kek.kekcode)=[km].[kensacode])AND((ki.ukeymd)=[kek].[ukeymd]))
ORDER BY kek.saiday,ki.kancd;


ka検査クエリ2のSQLビューには
 SELECT kek.saiday AS 検査日,kiukeno AS 受付番号,k.code AS カルテNO,k.kjnam AS 患者氏名,km.kensacode AS 検査コード,km.kensaname AS 検査名,kek.kekka AS 検査結果,km.unit AS 単位
 FROM dbo_kenmasf AS km,dbo_kenkekdt AS kek,dbo_kanmf AS k,dbo_kenirahd AS ki
WHERE((kek.saiday)=[Forms]![2]![テキスト2]AND ((ki.ukeno)=[kek].[ukeno])AND((k.code)=[Forms]![患者名]![カルテNo]AND ((ki.kancd)=[k].[code] And (ki.kancd)<'90000000') AND ((kek.kekcode)=[km].[kensacode]) AND ((ki.ukeymd)=[kek].[ukeymd]))
ORDER BY kek.saiday,ki.kancd;

としています。先に教えてもらったコードはどこに入力すればいいのか教えて下さい。

後、
>SELECT P.検査日, P.検査名, Ka検査.検査結果, Ka検査.単位
>FROM [
>SELECT Max(Ka検査.検査日) AS 検査日, Ka検査.検査名
>FROM Ka検査
>GROUP BY Ka検査.検査名
このコードのFROM[ の所と
2個目のSELECTがわかりません。
 お願いします。

【5844】Re:最終項目の最後の移動
発言  小僧  - 05/8/12(金) 10:07 -

引用なし
パスワード
   ▼安久 さん:
おはようございます。

SQL の解析をして1時間、まだ全体が掴めていません。
質問者の方がSQL さえ提示すれば回答者は全てが解る訳もなく、
回答者(少なくとも自分)は SQL の内容からテーブル構成を
想像しながら作っていかなければいけません。

少なくともテーブル構成とフィールドのデータ型は情報としてご提示して頂きたいです。


まだクエリ1しかみておりませんが、現在のところ解っているのは

>WHERE AND ((ki.ukeno)=・・・

WHERE 句の後にいきなり「AND」 はありえません。

>(ki.ukeymd)<`90000000`)

「ki.ukeymd」は dbo_kenirahd テーブルと dbo_kenkekdt テーブルで持っている
「受付日」にあたる項目ではないのでしょうか?
それが「90000000」という文字列と比較している…「kancd」の間違いでは?

フィールドの名前からある程度判断はできるのですが回答者の想像に委ねることなく、
安久 さんが伝えたい情報をできるだけ正確に回答者(当方だけにでなく)に伝えられる様に
ご提示する内容を検討されてみて下さい。

【5847】Re:最終項目の最後の移動
回答  小僧  - 05/8/12(金) 10:45 -

引用なし
パスワード
   ▼安久 さん:
とりあえず…。

SELECT P.saidayの最大 AS 検査日,
    dbo_kenkekdt.ukeno AS 受付番号,
    P.kancd AS カルテNO,
    dbo_kanmf.kjnam AS 患者氏名,
    dbo_kenmasf.kensacode AS 検査コード,
    dbo_kenmasf.kensaname AS 検査名,
    dbo_kenkekdt.kekka AS 検査結果,
    dbo_kenmasf.unit AS 単位
FROM (([
SELECT dbo_kenkekdt.kekcode,
    Max(dbo_kenkekdt.saiday) AS saidayの最大,
    dbo_kenirahd.kancd
FROM dbo_kenkekdt
INNER JOIN dbo_kenirahd ON (dbo_kenkekdt.ukeymd = dbo_kenirahd.ukeymd)
   AND (dbo_kenkekdt.ukeno = dbo_kenirahd.ukeno)
GROUP BY dbo_kenkekdt.kekcode, dbo_kenirahd.kancd
]. AS P
INNER JOIN dbo_kanmf ON P.kancd = dbo_kanmf.code)
INNER JOIN dbo_kenmasf ON P.kekcode = dbo_kenmasf.kensacode)
INNER JOIN dbo_kenkekdt ON P.saidayの最大 = dbo_kenkekdt.saiday
GROUP BY P.saidayの最大,
     dbo_kenkekdt.ukeno,
     P.kancd, dbo_kanmf.kjnam,
     dbo_kenmasf.kensacode,
     dbo_kenmasf.kensaname,
     dbo_kenkekdt.kekka,
     dbo_kenmasf.unit;

上記 SQL で患者氏名ごとに最新の検査結果が抽出できないでしょうか?

【5876】Re:最終項目の最後の移動
質問  hikaru  - 05/8/17(水) 14:58 -

引用なし
パスワード
   いつもお返事ありがとうございます。

 患者氏名ごとに抽出するのではなく

 検査日 検査名 検査結果  単位
 10/30  TG   10     mg
 10/30  WBC   20     
 10/30  Na   40     
 10/26  TG   60    
 10/22  WBC   5   
 09/25  K    78   
 09/01  TG    20  

というふうに抽出しているのですが
  これを

 検査日 検査名 検査結果  単位
 10/30  TG    10     mg
 10/30  WBC   20  
 10/30  Na    40
 09/25   K    78

というふうに検査名の最後に検査した日だけの結果を抽出したいわけです。

お願いします。

【5882】Re:最終項目の最後の移動
発言  小僧  - 05/8/17(水) 16:47 -

引用なし
パスワード
   ▼hikaru さん:
>質問者の方がSQL さえ提示すれば回答者は全てが解る訳もなく、
>回答者(少なくとも自分)は SQL の内容からテーブル構成を
>想像しながら作っていかなければいけません。
>
>少なくともテーブル構成とフィールドのデータ型は情報としてご提示して頂きたいです。
>
>
>まだクエリ1しかみておりませんが、現在のところ解っているのは
>
>>WHERE AND ((ki.ukeno)=・・・
>
>WHERE 句の後にいきなり「AND」 はありえません。
>
>>(ki.ukeymd)<`90000000`)
>
>「ki.ukeymd」は dbo_kenirahd テーブルと dbo_kenkekdt テーブルで持っている
>「受付日」にあたる項目ではないのでしょうか?
>それが「90000000」という文字列と比較している…「kancd」の間違いでは?
>
>フィールドの名前からある程度判断はできるのですが回答者の想像に委ねることなく、
>安久 さんが伝えたい情報をできるだけ正確に回答者(当方だけにでなく)に伝えられる様に
>ご提示する内容を検討されてみて下さい。

は無視ですか。

>というふうに検査名の最後に検査した日だけの結果を抽出したいわけです。

[#5847]で提示したSQLがそのようになっています。後はご自分で頑張ってください。

1673 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078249
(SS)C-BOARD v3.8 is Free