FoxPro から SQL Server にコードを少し変換しようとしていますが、非常に奇妙な動作に直面しています。
FoxPro のアプリケーションで書かれたこのコード:
lcZnak1 = "HM,P6";
SELECT Zakslozkap.datum,ABS(Zakslozkap.hodnota) hodnota, ABS(Zakslozkap.koruny)
koruny, Zakslozka.sekce;
FROM Zakslozkap, Zakslozka;
WHERE (Zakslozkap.SW $ lcZnak1) AND;
BETWEEN(Zakslozkap.datum,Thisform.cDatOd,Thisform.cDatDo) AND ;
Zakslozkap.ide_slozka = Zakslozka.ide_slozka AND ;
Zakslozka.ide_zak = "6065" ;
INTO CURSOR QueryNakladMZD
SUM (koruny) FOR sekce $ ('REZIE4') TO lnostat
SUM (koruny) FOR sekce $ ('REZIE3') TO lnRezie
SUM (koruny) FOR sekce $ ('SEKTOR') TO lnSekce
SUM (koruny) TO lnPodil
lnPodil= lnPodil - lnostat - lnRezie - lnSekce
lnPodil = 1 721 761,07 の結果を生成します。
SQL で書かれた私のコード:
declare @lnOstat decimal(18,5) = 0
declare @lnRezie decimal(18,5) = 0
declare @lnSekce decimal(18,5) = 0
declare @lnPodil decimal(18,5) = 0
select p.datum, abs(p.hodnota) as 'hodnota', abs(p.koruny) as 'koruny', z.sekce into #tmp
from [DOCHAZKA]...[zakslozkap] p, [DOCHAZKA]...[zakslozka] z
where (p.SW = 'HM' or p.SW = 'P6')
and p.datum between @datestart and @dateend
and p.ide_slozka = z.ide_slozka
and z.ide_zak = '6065'
select @lnOstat = SUM(koruny) from #tmp where sekce = 'REZIE4'
select @lnRezie = SUM(koruny) from #tmp where sekce = 'REZIE3'
select @lnSekce = SUM(koruny) from #tmp where sekce = 'SEKTOR'
select @lnPodil = SUM(koruny) from #tmp
select @lnPodil = isnull(@lnPodil,0) - isnull(@lnOstat,0) - isnull(@lnRezie,0) - isnull(@lnSekce,0)
drop table #tmp
@lnPodil = 1 623 779.67 の結果を生成します。
つまり、100k の差があり、これはお金に関するものなので、かなりの差があります。解決策を探すのに必死なので、そこで質問しています。SQL 変換は FoxPro のコードを正確に反映していますか?
テーブルは同じなので、データです。SQL では、これらの dbfs にアクセスするためにリンク サーバーを使用しています。フィールド「koruny」は、浮動データ型として dbf に格納されます。