2016-10-28 2 views
2

私は奇妙なクエリを持っています。私は車両メンテナンスデータベースを作成しています。各車両は、250,500,1000,2000で異なるメンテナンスサイクルを持ちます。したがって、ユーザーが車両を引き上げて走行距離を入力すると、次のメンテナンスサイクルを知る必要があります。次のメンテナンスサイクルを見つけるためのアクセスクエリ

ここは例です。次のサイクルが1250となるように、1150マイルがあるでしょう。私は、250,500,1000、および2000サイクルがあると言うテーブルを持っていますが、同じであるため、1250または1500または1750のものはありません250として... 250のメンテナンスサイクルを選ぶ必要があり、1250を超えると1500が次のサイクルであることを示す必要があります。

次のメンテナンスサイクルを選択するにはどうすればよいですか?ここで

は、いくつかのデータです:

250 Cycle 
500 Cycle 
1000 Cycle 
2000 Cycle 

ユーザーは、ユーザーが1050年に車両にプルアップした場合、私はまた、この場合には1000年を選ぶが、ど​​うすればよい、850サイクルで車両にプルアップ(1250サイクルがないため)250サイクルを選択する必要があります。

+0

次の550サイクルのメンテナンスサイクルで仮想車両が250にならないのはなぜですか?あなたには750のメンテナンスサイクルもありません。 – jac

+0

あなたは自分自身と矛盾していますか?次のサイクルは1250サイクルです* ... * 1250サイクル*がないため? – Parfait

+0

@jac、はいいいえ。私はそれを訂正します。 – djblois

答えて

2

、関数を作成するためにはるかに簡単である:

Public Function NextCycle(ByVal Mileage As Long) As Long 

    Dim rst   As DAO.Recordset 

    Dim SQL   As String 
    Dim Cycle  As Long 
    Dim ThisCycle As Long 
    Dim NextService As Long 

    SQL = "Select Cycle From Cycles Order By 1" 
    Set rst = CurrentDb.OpenRecordset(SQL) 

    Cycle = rst!Cycle.Value 
    While Not rst.EOF 
     ThisCycle = rst!Cycle.Value 
     NextService = -Int(-Mileage/ThisCycle) * ThisCycle 
     If NextService - Mileage < Cycle Then 
      Cycle = ThisCycle 
     End If 
     Debug.Print Mileage, ThisCycle, NextService, NextService - Mileage, Cycle 
     rst.MoveNext 
    Wend 
    rst.Close 

    Set rst = Nothing 

    NextCycle = Cycle 

End Function 

例の結果:

? NextCycle(850) 
850   250   1000   150   250 
850   500   1000   150   500 
850   1000   1000   150   1000 
850   2000   2000   1150   1000 
1000 

? NextCycle(1050) 
1050   250   1250   200   250 
1050   500   1500   450   250 
1050   1000   2000   950   250 
1050   2000   2000   950   250 
250 

? NextCycle(10850) 
10850   250   11000   150   250 
10850   500   11000   150   500 
10850   1000   11000   150   1000 
10850   2000   12000   1150   1000 
1000 
+0

私は臆病なdownvoter見ています。あなたが答えを理解していないなら、話してください。私は説明します。 – Gustav

+0

あなたの答えは私のために働いた。 – djblois

0

何かこれはうまくいくはずです。これはSQLにあります。 MS Accessを使用している場合、私はMS Accessを持っていないので、翻訳する必要があります。このサンプルは、テンポラリテーブル変数を作成して設定します。次に、現在のサイクル数と次の大きなサイクル数の差を求めます。次に、caseステートメントでは、差分を使用して、tempテーブルから次に小さいサイクルを選択します。使用可能なサイクルがない場合は、現在のサイクル値よりも大きい次のサイクルを返します。

私はラップアラウンドを処理する作業を行っていないことに注意してください。ここでは、現在のサイクルがテーブルの最大値よりも大きい場合があります。アクセスにおいて

DECLARE @CurrCycle int = 749 

DECLARE @Temp TABLE 
(
    Cycle int 
) 

INSERT INTO @Temp VALUES (250) 
INSERT INTO @Temp VALUES (500) 
INSERT INTO @Temp VALUES (1000) 
INSERT INTO @Temp VALUES (2000) 

DECLARE @Difference int 

SET @Difference = 
(
    SELECT 
     TOP 1 (Temp1.Cycle - @CurrCycle) 
    FROM 
     @Temp Temp1 
    WHERE 
     (Temp1.Cycle >= @CurrCycle) 
) 

SELECT (CASE 
    WHEN 
     (SELECT TOP 1 Cycle FROM @Temp WHERE Cycle <= @Difference) IS NOT NULL THEN (SELECT TOP 1 Cycle FROM @Temp WHERE Cycle <= @Difference ORDER BY Cycle DESC) 
    ELSE 
     (SELECT TOP 1 Cycle FROM @Temp WHERE Cycle >= @CurrCycle) 
END) 
+0

MS AccessはSQLを使用します。あなたは方言、特にTSQLはSQL Serverで使用され、MS AccessのJet/ACE SQLでは使用されません。 OPがストアドプロシージャをAccessアプリケーションに変換する方法を知らないため、ソリューションが実現できない場合があります。 – Parfait

+0

@ Parfait私はSQL Serverでストアドプロシージャを作成する方法を知っています。私はそれにかなり熟練していますが、Accessに変換する方法が失われています。私もかなり堪能です。 – djblois

0
[cycle]*(1+Int([miles]/[cycle])) 

これは、彼らが均等に発生すると仮定すると、次のサイクルを与えます。周期が常に250の場合は、変数の代わりにそのサイクルを使用できます。

関連する問題