Access VBA質問箱 IV

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

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


340 / 500 ページ ←次へ | 前へ→

【6412】Re:データベースから該当の複数データを抽...
回答  小僧  - 05/10/5(水) 9:37 -

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

>>SELECT P.TOSHIBANGO,
>>    P.S_MAX,
>>    Max(TEST.YYMMDD) AS YYMMDDの最大
>>FROM [
>>SELECT TEST.TOSHIBANGO,
>>    Max(TEST.SYORI_KUBUN ) AS S_MAX
>>FROM TEST
>>GROUP BY TEST.TOSHIBANGO
>>]. AS P
>>INNER JOIN TEST ON (P.S_MAX = TEST.SYORI_KUBUN) AND
>>          (P.TOSHIBANGO = TEST.TOSHIBANGO)
>>GROUP BY P.TOSHIBANGO, P.S_MAX
>>HAVING P.S_MAX=1 Or P.S_MAX=2;

>このなかの、P.TOSHIBANGOとP.S_MAXはほかのテーブルということでしょうか?

この P は任意の名前で大丈夫です。
FROM 句 の中に SELECT 〜 でもう一つ SQL を使用していますが、
([ ] に 囲まれた部分です) その結果を AS P という形で別名をつけています。

※ クエリの SQL ビューに貼り付ける際は全角スペースが入ってしまう場合が
  あるので取り除いてください。


>処理区分2が存在している通し番号に関しては、YYMMDDとRENBANが一番最新のもの

日付だけを抽出するのであれば、RENBAN が最新かどうかの判定が必要ないので
上記の SQL では RENBAN を考慮していません。

>>>YYMMDD    TOSHIBANGO   SYORI_KUBUN   RENBAN 
>>>2005/10/05   a1234        2      1   
>>>2005/10/05   a1234        2      2   

>>REBAN がいくつであろうが、最新が2005/10/05である事には変わりがない。


実際に使用されているデータが連番ごとに違う値…

>>>YYMMDD    TOSHIBANGO   SYORI_KUBUN   RENBAN  NAMAE
>>>2005/10/05   a1234        2            1     山田
>>>2005/10/05   a1234        2            2     佐藤

上記のように NAMAE のような値も抽出対象になるようでしたら、
通し番号も含めた SQL にしなければいけないですね。

その場合は再度考えたいと思います。
・ツリー全体表示

【6411】Re:データベースから該当の複数データを抽...
お礼  sayaya  - 05/10/5(水) 9:12 -

引用なし
パスワード
   ▼小僧 さん:
返信ありがとうございます!!

前日、翌日、分かりにくかったですね、ごめんなさい。

つまり、小僧さんがおっしゃる通り、
処理区分3は対象外、
処理区分2が存在している通し番号に関しては、YYMMDDとRENBANが一番最新のもの、
処理区分1のものはそのままで抽出
ということです。

いただいたSQLのなかで分からないところがあったのですが、

>SELECT P.TOSHIBANGO,
>    P.S_MAX,
>    Max(TEST.YYMMDD) AS YYMMDDの最大
>FROM [
>SELECT TEST.TOSHIBANGO,
>    Max(TEST.SYORI_KUBUN ) AS S_MAX
>FROM TEST
>GROUP BY TEST.TOSHIBANGO
>]. AS P
>INNER JOIN TEST ON (P.S_MAX = TEST.SYORI_KUBUN) AND
>          (P.TOSHIBANGO = TEST.TOSHIBANGO)
>GROUP BY P.TOSHIBANGO, P.S_MAX
>HAVING P.S_MAX=1 Or P.S_MAX=2;

このなかの、P.TOSHIBANGOとP.S_MAXはほかのテーブルということでしょうか?
・ツリー全体表示

【6410】Re:データベースから該当の複数データを抽...
発言  小僧  - 05/10/4(火) 16:47 -

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

>前日に実績があっても、翌日にデータを修正していたら(処理区分が2があったら)
>前日の実績を帳票に載せないというのがしたいんです。

この「前日」「翌日」という使い方が良く解らないのですが、
翌日以降に修正があった場合は実績にならない、という事なのでしょうか?

言い換えると

通し番号ごとに、
処理区分 3 があった場合は対象外
処理区分 2 があった場合は最新の日付
処理区分 1 しかなかった場合はその日付

が抽出できれば良いのでしょうか。それでしたら

SELECT P.TOSHIBANGO,
    P.S_MAX,
    Max(TEST.YYMMDD) AS YYMMDDの最大
FROM [
SELECT TEST.TOSHIBANGO,
    Max(TEST.SYORI_KUBUN ) AS S_MAX
FROM TEST
GROUP BY TEST.TOSHIBANGO
]. AS P
INNER JOIN TEST ON (P.S_MAX = TEST.SYORI_KUBUN) AND
          (P.TOSHIBANGO = TEST.TOSHIBANGO)
GROUP BY P.TOSHIBANGO, P.S_MAX
HAVING P.S_MAX=1 Or P.S_MAX=2;

こんな感じで抽出ができると思います。


※半角カタカナは環境によって文字化けしてしまう事があるそうです。
 Web上の掲示板等をご利用される時はなるべく使わないように気をつけましょう^^
・ツリー全体表示

【6409】Re:他のフォームのフィルタを操作したい
発言  NK  - 05/10/4(火) 15:57 -

引用なし
パスワード
   先ほどの6401のコードはコピーミスです。申し訳ありません。
実際に使っているコードは以下の通りです。
なお、コマンド13は「【フォーム】メイン」のサブフォーム上に
あるコマンドボタンです。

−−−−−−−−−−−−−−−−−−−−−−−
Private Sub コマンド13_Click()
  DoCmd.OpenForm "【フォーム】検索結果"
  KeyWord = Forms("【フォ−ム】メイン").サブフォーム.Form.Filter
  DoCmd.Close acForm, "【フォーム】メイン", acSaveYes
End Sub
・ツリー全体表示

【6408】Re:他のフォームのフィルタを操作したい
回答  hatena  - 05/10/4(火) 15:34 -

引用なし
パスワード
   6401のコードの

 DoCmd.OpenForm "Form2"
 KeyWord = Forms("Form1").サブフォーム.Form.Filter
 DoCmd.Close acForm, "Form1", acSaveYes 引数 = Forms
                     ^^^^^^^^^^^^
の部分はコピーミスで実際にはないのですよね。
あればコンパイルが通りませんので。

フォーム名とう変更せずにそのままのコードを
張り付けてもらえますか。

とりあえず、
最初の行にブレイクポイントを設定して、ステップ実行して、
どの行でエラーがでるか確認してみてはどうでしょうか。
・ツリー全体表示

【6407】Re:テキストボックス
回答  NK  - 05/10/4(火) 14:59 -

引用なし
パスワード
   ▼a さん:
>テキストボックスに「""」を入力すると空白になってしまいます。
>これを回避するにはどうしたらいいですか?
>教えてください。

""で囲まれた文字は文字列扱いとなってしまいますから
テキストボックスが更新された際に変更かけるように
マクロを設定すればよろしいかと。↓こんな感じで。

Private Sub テキストボックス_AfterUpdate()
 If Me.テキスト0 = "" Then
  Me.テキスト0 = """"""
 End If
End Sub
・ツリー全体表示

【6406】Re:他のフォームのフィルタを操作したい
発言  NK  - 05/10/4(火) 14:48 -

引用なし
パスワード
   ▼hatena さん:
>>”マクロで記述しているフォーム(Form1)が見つかりません”
>>というMSGが出力されます。
>
>メッセージ通りだとすると、Form1 という名前のフォームが
>無いということですね。フォーム名に間違いは無いですか。

実際にはForm1の部分は、
『【フォーム】メイン』という名前を割り当てています。
他のコードからコピー&ペーストしたので間違いは無いのですが・・・
・ツリー全体表示

【6405】Re:文字列の日付並べ替えができません
回答  hatena  - 05/10/4(火) 14:46 -

引用なし
パスワード
   レポートの方でグループ化の設定をしてませんか。
その場合は、レコードソースの並び順は無視されます。

並び替え/グループ化の設定 で、

=Right([Date],2) & Mid([Date],4,2) & Left([Date],2)

と言う式を設定するか、
レコードソースにこの演算フィールドを追加しておいて、
それを設定するか、してください。
・ツリー全体表示

【6404】Re:他のフォームのフィルタを操作したい
回答  hatena  - 05/10/4(火) 14:39 -

引用なし
パスワード
   >”マクロで記述しているフォーム(Form1)が見つかりません”
>というMSGが出力されます。

メッセージ通りだとすると、Form1 という名前のフォームが
無いということですね。フォーム名に間違いは無いですか。
・ツリー全体表示

【6403】データベースから該当の複数データを抽出したい
質問  sayaya  - 05/10/4(火) 14:31 -

引用なし
パスワード
   お初にお目にかかりますm(_ _)mこちらをよく利用しているという友人から
紹介してもらい、訪問させていただきました。

早速なんですが、私は現在、実績入力のシステムを作っています
(商品の検査項目など)、検査の項目が21あって、その1つ1つにデータベースが存在
しています。つまり21個のデータベースがあります。

実績を登録するフォームと、修正するフォームがあり、それぞれデータをINSERTしたさいに、
データベースに処理区分をもうけており、それぞれ、新規登録は1、修正は2、削除は3とフラグをたてています。

ここからが自分が抱えている問題なのですが、
検査実績を帳票に表示するスプレッドを作りたいのですが,
一番最新の情報だけを表示する方法がわからないのです。

ただ、データの最新のものを、という単純なものならできるのですが、

説明がしにくいですので,仮のデータでお話しますと、

たとえば

日付2005/08/20、 通し番号 a1234、 連番001、 処理区分 1
  2005/08/20、      a1234、   002、      2
  2005/08/28、      a1234、   001、      3
  2005/08/20、      a5678、   003、     1
  2005/08/28、      a5678、   002、     2
  2005/08/20、      a9999、   004、     1

というレコードがあったとします、今回の帳票は、日付を指定して、
その日に行った検査データを表示するというものにしたいのですが、
このテストデータの中には2005/8/20、2005/08/28の日付が存在しますよね?

そこで帳票には、2005/08/20の実績には
2005/08/20   a9999  004  1 のデータ、
2005/08/28の帳票には
2005/08/28   a5678  002  2 のデータが表示されるようにしたいんです。

つまり、処理区分の3のものは帳票に載せない、
前日に実績があっても、翌日にデータを修正していたら(処理区分が2があったら)
前日の実績を帳票に載せないというのがしたいんです。

クエリを4つ作って、1、日付と連番をくっつける
       2、通し番号と1で作った日程連番をそれぞれ昇順と降順で並びかえる
       3、通し番号をグループ化して日程連番を最大のもので集計する
       4、処理区分が3のものを除く

という方法は思いついたのですが、何せよテーブルが21個もあるので、
それぞれにクエリを4つ作ったら,21×4で84個もテーブル、クエリが出来てしまうんです。

SQLでうまいこと出来ないかと思い、書いてみたのですが、
SELECT * FROM TEST WHERE (SYORI_KUBUN <> "3") ORDER BY TOSHIBANGO ASC, YYMMDD DESC, RENBAN DESC GROUP BY TOSHIBANGO HAVING Max([YYMMDD] + [RENBAN])

うまくいかず,,,

本当に困っています。どうか皆さんのお力をお借りできないでしょうか?

長文申し訳ありません。
・ツリー全体表示

【6402】文字列の日付並べ替えができません
質問  さらだ  - 05/10/4(火) 14:21 -

引用なし
パスワード
   文字列の日付を範囲指定することは出来たのですが
今度は並べ替えが上手く行かず、レポートに思うように表示されません。
フィールドの中身はこうです
Date
01-09-05
02-09-05
03-09-05
 ・
 ・
 ・
30-09-05
01-10-05
02-10-05

とこういうふうにdd-mm-yyでフィールドに格納されています。
結果としてほしいのは
01-09-05から01-10-05を範囲指定した場合に
レポートに表示される順番は
01-09-05
02-09-05
 ・
 ・
 ・
01-10-05
という順番で表示してほしいのですが、
現在
01-09-05の次には01-10-05が表示されてしまいます
コードはこう書いています。
Private Sub Report_Open(Cancel As Integer)
  Dim strStart As String
  Dim strEnd As String
  Dim strsql As String


  strStart = Forms!PrintOut!txtStart
  strStart = Right(strStart, 2) & Mid(strStart, 4, 2) & Left(strStart, 2)
  
  strEnd = Forms!PrintOut!txtEnd
  strEnd = Right(strEnd, 2) & Mid(strEnd, 4, 2) & Left(strEnd, 2)


  If (strStart <> "") And (strEnd <> "") Then
    strsql = "SELECT Date, "
    strsql = strsql & "TapeSet, "
    strsql = strsql & "StatusT,ServerDowntimeT, "
    strsql = strsql & "RemarksT,RemarksColumnT, "
    strsql = strsql & "StatusN,ServerDowntimeN, "
    strsql = strsql & "RemarksN,RemarksColumnN, "
    strsql = strsql & "StatusJ,ServerDowntimeJ, "
    strsql = strsql & "RemarksJ,RemarksColumnJ, "
    strsql = strsql & "Memo FROM BackupLog "
    strsql = strsql & "WHERE (((Right([Date],2) & Mid([Date],4,2) & Left([Date],2)) "
    strsql = strsql & "Between '" & strStart & "' And '" & strEnd & "')) "
    strsql = strsql & "ORDER BY Right([Date],2) & Mid([Date],4,2) & Left([Date],2);"

    Me.RecordSource = strsql
  End If
  
  If (strStart = "") And (strEnd = "") Then
    Me.RecordSource = "BackUpLog"
  End If
End Sub


Order by句を使っているのですが、並べ替えが出来ません。
どなたかご教授いただければ大変嬉しく思います。
どうぞよろしくお願いいたします。
・ツリー全体表示

【6401】Re:他のフォームのフィルタを操作したい
質問  NK  - 05/10/4(火) 13:34 -

引用なし
パスワード
   hatenaさん、ありがとうございました。
教えていただいた部分については恐らく上手くいったと思うのですが、
今度はフィルタの元となる引数の取得が上手くいっていない事が
判明してしまいました・・・。

記述は以下の通りです。

 DoCmd.OpenForm "Form2"
 KeyWord = Forms("Form1").サブフォーム.Form.Filter
 DoCmd.Close acForm, "Form1", acSaveYes 引数 = Forms

”マクロで記述しているフォーム(Form1)が見つかりません”
というMSGが出力されます。
なお、このコードはFrom1のサブフォームに記述してあるもので
サブフォームのコマンドボタンを押す事で起動されます。
・ツリー全体表示

【6400】テキストボックス
質問  a  - 05/10/4(火) 13:11 -

引用なし
パスワード
   テキストボックスに「""」を入力すると空白になってしまいます。
これを回避するにはどうしたらいいですか?
教えてください。
・ツリー全体表示

【6399】Re:他のフォームのフィルタを操作したい
回答  hatena  - 05/10/4(火) 12:07 -

引用なし
パスワード
   >Form("Form2").サブフォーム.Form.Filter=引数
^^^^^
Forms("Form2").サブフォーム.Form.Filter=引数

ですね。
他に、

Forms!Form2!サブフォーム.Form.Filter=引数
・ツリー全体表示

【6398】他のフォームのフィルタを操作したい
質問  NK  - 05/10/4(火) 11:59 -

引用なし
パスワード
   Form1を閉じる際、Form2を呼び出した上で
あらかじめ引数に取得しておいた文字列を元に
Form2のサブフォームに対してフィルタを実行したいのですが
うまくいきません。
Form("Form2").サブフォーム.Form.Filter=引数

どういったコードを記述すればよろしいでしょうか。
どなたかご教授願います。

Private Sub CloseButton_Click()
  DoCmd.OpenForm "Form2"
  ※ここでForm2のサブフォームに対してFilterをかけたい
  DoCmd.Close acForm, "Form1", acSaveYes
End Sub
・ツリー全体表示

【6397】Re:文字列の日付検索について
お礼  さらだ  - 05/10/4(火) 11:51 -

引用なし
パスワード
   hatenaさん
お知恵拝借ありがとうございました。
無事に表示することが出来ました。ありがとうございました。
・ツリー全体表示

【6396】Re:文字列の日付検索について
回答  hatena  - 05/10/4(火) 0:57 -

引用なし
パスワード
   >Dateの並び方がdd-mm-yyなので

あっ、なるほど、これを見逃していました。

テキスト型の並び順は先頭から優先されるので、
yy-mm-dd になるように並び替えて比較することに
なりますね。

Right([Date],2) & Mid([Date],4,2) & Left([Date],2)

strStart strEnd も同様に並び替えてください。
・ツリー全体表示

【6395】Re:文字列の日付検索について
質問  さらだ  - 05/10/3(月) 23:26 -

引用なし
パスワード
   ▼hatena さん:
>>Dateというフィールドに
>>01-09-05(dd-mm-yy)という形で文字列で日付が入っています。
>>02-09-05
>>03-09-05
>>01-10-05
>>
>>レポートを作成するときに、
>>フォームで01-09-05から、03-09-05までのデータをプリントアウトしたい
>>というTEXTBOXを作成しました。
>>(日付を指定してその間にあるデータをプリントアウトさせるというものです)
>>結果としては01-09-05、02-09-05、03-09-05のデータがプリントアウト
>>されたらOKなのですが、
>>実際はすべてされてしまいます。
>
>>    strsql = "Select * From BackupLog Where Date Between '" & strStart & "' And '" & strEnd & "
>Between A And B は、A〜Bまでの間(A以上B未満)ということなので、
>
>>01-10-05のデータまでプリントアウトされてしまいました。
>
>01-10-05 は当然入りますよね。
>
>希望のことは、01年から03年までの、09-05 のデータを抽出したいと
>言うことですか。
>それとも別の意味なのかな?

Dateの並び方がdd-mm-yyなので
09-05のものを抽出したいという意味です。
説明不足で申し訳ありません。
たとえばDateフィールドに
31-08-05
01-09-05
02-09-05
03-09-05
04-09-05
05-09-05
01-10-05
02-10-05
03-10-05
と入っていたとして
01-09-05から05-09-05を抽出したいということになります。
場合によっては
01-09-05から02-10-05を抽出する場合もあります。
ご面倒なのですがどうぞご教授願えればと思います。
よろしくお願いいたします
・ツリー全体表示

【6394】Re:文字列の日付検索について
回答  hatena  - 05/10/3(月) 22:44 -

引用なし
パスワード
   >Dateというフィールドに
>01-09-05(dd-mm-yy)という形で文字列で日付が入っています。
>02-09-05
>03-09-05
>01-10-05
>
>レポートを作成するときに、
>フォームで01-09-05から、03-09-05までのデータをプリントアウトしたい
>というTEXTBOXを作成しました。
>(日付を指定してその間にあるデータをプリントアウトさせるというものです)
>結果としては01-09-05、02-09-05、03-09-05のデータがプリントアウト
>されたらOKなのですが、
>実際はすべてされてしまいます。

>    strsql = "Select * From BackupLog Where Date Between '" & strStart & "' And '" & strEnd & "
Between A And B は、A〜Bまでの間(A以上B未満)ということなので、

>01-10-05のデータまでプリントアウトされてしまいました。

01-10-05 は当然入りますよね。

希望のことは、01年から03年までの、09-05 のデータを抽出したいと
言うことですか。
それとも別の意味なのかな?
・ツリー全体表示

【6393】文字列の日付検索について
質問  さらだ  - 05/10/3(月) 17:20 -

引用なし
パスワード
   初めて質問します。
よろしくお願いいたします。

Dateというフィールドに
01-09-05(dd-mm-yy)という形で文字列で日付が入っています。
02-09-05
03-09-05
01-10-05

レポートを作成するときに、
フォームで01-09-05から、03-09-05までのデータをプリントアウトしたい
というTEXTBOXを作成しました。
(日付を指定してその間にあるデータをプリントアウトさせるというものです)
結果としては01-09-05、02-09-05、03-09-05のデータがプリントアウト
されたらOKなのですが、
実際はすべてされてしまいます。

コードの記述はこうです。
Private Sub Report_Open(Cancel As Integer)
  Dim strStart As String
  Dim strEnd As String
  Dim strsql As String
  
  strStart = Forms!PrintOut!txtStart ’範囲指定する画面からの値
  
  strEnd = Forms!PrintOut!txtEnd
  
  If (strStart <> "") And (strEnd <> "") Then
    strsql = "Select * From BackupLog Where Date Between '" & strStart & "' And '" & strEnd & "'"
    Me.RecordSource = strsql
  End If
  
  If (strStart = "") And (strEnd = "") Then
    Me.RecordSource = "BackUpLog"
  End If

あっさり動くと考えておりましたら、
01-10-05のデータまでプリントアウトされてしまいました。
01が先に来ているのが原因と思われます。

お知恵をお借りしたいのですが、
このように
dd-mm-yyで文字列としてフィールドに格納されている場合、
範囲指定をする方法をどなたかご教授ください。
・ツリー全体表示

340 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1084703
(SS)C-BOARD v3.8 is Free