Dzięki za podpowiedzi.
Sprawdzanie sumy i listowanie odbywa się za pomocą dwóch zapytań, ale oba mają identyczne WHERE dlatego FROM wygląda jak wygląda.
Z DISTINCT i GROUB BY troche kombinowałem, ale bez efektu... może przez późną godzinę. Chociaż prawdopodobniejsza jest moja niewiedza
Może od początku jak wygląda cały główny kod.
Na samym początku znajdują się filtry w postaci
if (isset($_REQUEST["fldCechaTw"]) && is_numeric($_REQUEST["fldCechaTw"]) && $_REQUEST["fldCechaTw"] > 0
) {
$arrFiltr["CechaTw"] = $_REQUEST["fldCechaTw"];
$arrFiltr["All"] .= "&fldCechaTw=".$arrFiltr["CechaTw"];
}
else
$arrFiltr["CechaTw"] = 0;
Następnie na podstawie powyższych filtrów ustawiam klauzulę WHERE
# Konstrukcja klauzuli WHERE na podstawie filtra
$arrNazwa = explode(" ",$arrFiltr["Nazwa"]); $strWhere = "";
if (strlen($arrFiltr["Nazwa"])) foreach($arrNazwa as $Nazwas) { $strWhere .= "MATCH (NAZWA) AGAINST ('+".StringToMySQL
($Nazwas)."*' IN BOOLEAN MODE) AND "; } if (isset($_REQUEST["fldFiltrDataOd"])) {
if (strlen($arrFiltr["DataOd"])) $strWhere .= "(DAD >= '".$arrFiltr["DataOd"]."') AND "; if (strlen($arrFiltr["DataDo"])) $strWhere .= "(DAD <= '".$arrFiltr["DataDo"]."') AND "; }
if (strlen($arrFiltr["GrupaTw"])) $strWhere .= "sprz_pa.GR = '".$arrFiltr["GrupaTw"]."' AND "; if ($arrFiltr["CechaTw"] > 0) $strWhere .= "(symbolcecha.cecha_id = ".$arrFiltr["CechaTw"].") AND ";
if ($arrFiltr["noGroup"] == 'DEFA') $strWhere .= "sprz_pa.GR != 'DEFA' AND ";
if (isset($_REQUEST["fldFiltrStanOd"]) OR
isset($_REQUEST["fldFiltrStanDo"]) ) {
if (strlen($arrFiltr["StanOd"])) $strWhere .= "(STAK >= ".$arrFiltr["StanOd"].") AND "; if (strlen($arrFiltr["StanDo"])) $strWhere .= "(STAK <= ".$arrFiltr["StanDo"].") AND "; }
kolejną częścią jest właśnie zapytanie o SUM(sprz_pa.WART), które obecnie wygląda tak
$strSql = "SELECT DISTINCT SUM(sprz_pa.WART) AS SumWart FROM sprz_pa LEFT JOIN dbf_MT ON sprz_pa.SYM = dbf_MT.SYM
LEFT JOIN symbolcecha ON sprz_pa.SYM = symbolcecha.SYM ";
if (strlen($strWhere)) {$strSql .= "WHERE ".$strWhere." AND sprz_pa.TYPD = 'P01' ";} else { $strSql .= "WHERE (DAD = '".$wczoraj."') AND sprz_pa.TYPD = 'P01' ";}
$intWartTotal = $arrRowAll["SumWart"];
//echo $intWartTotal;
Pełne zapytanie dla powyższego wygląda tak:
[codel]SELECT DISTINCT SUM(sprz_pa.WART) AS SumWart FROM sprz_pa
LEFT JOIN dbf_MT ON sprz_pa.SYM = dbf_MT.SYM
LEFT JOIN symbolcecha ON sprz_pa.SYM = symbolcecha.SYM
WHERE (DAD >= '20131002') AND (DAD <= '20131002')
AND sprz_pa.TYPD = 'P01'[/code]
i nie działa poprawnie. Po odjęciu
LEFT JOIN symbolcecha ON sprz_pa.SYM = symbolcecha.SYM zwraca poprawną wartość.
kiedy wybieram filtr z cechą zapytanie wygląda tak:
[codel]SELECT DISTINCT SUM(sprz_pa.WART) AS SumWart FROM sprz_pa
LEFT JOIN dbf_MT ON sprz_pa.SYM = dbf_MT.SYM
LEFT JOIN symbolcecha ON sprz_pa.SYM = symbolcecha.SYM
WHERE (DAD >= '20131002') AND (DAD <= '20131002')
AND (symbolcecha.cecha_id = 1)
AND sprz_pa.TYPD = 'P01'[/code]
i wydaje mi się, że zwraca poprawną wartość - ciężko mi to sprawdzić w tym momencie.
Następnie listuję te pozycje za pomocą kolejnego zapytania, które obecnie wygląda tak:
$strSql = "SELECT dbf_MT.EAN, dbf_MT.STAK, dbf_MT.NAZWA, dbf_MT.CEDET, sprz_pa.SYM, SUM(sprz_pa.ILOSC) AS ILOSC, SUM(sprz_pa.WART) AS WART, sprz_pa.DAD, sprz_pa.TYPD, sprz_pa.GR
FROM sprz_pa INNER JOIN symbolcecha ON sprz_pa.SYM = symbolcecha.SYM
INNER JOIN dbf_MT ON sprz_pa.SYM = dbf_MT.SYM ";
if (strlen($strWhere)) {$strSql .= "WHERE ".$strWhere." AND sprz_pa.TYPD = 'P01' ";} else { $strSql .= "WHERE (DAD = '".$wczoraj."') AND sprz_pa.TYPD = 'P01' ";}
$strSql .= "GROUP BY sprz_pa.SYM ";
$strSql .= "ORDER BY ".$arrSortCols[$intParamSortCol]." ".$arrSortDirs[$intParamSortDir]." ";
i zakładając, że pierwsze zapytanie działa błędnie to i to nie będzie poprawne.
Jeszcze się nim nie zajmowałem stąd różnice.
Z ważnych informacji.
Tabela
symbolcecha
id | SYM | cecha_id
jest tabelą wiele do wielu zatem symbole towaru się powielają ( oczywiście w takiej sytuacji z innym cecha_id )
warto wspomnieć że nie zawiera też wszystkich symboli z tabeli
sprz_pa czy tabeli
dbf_MT zawierającej wszystkie możliwe symbole
(jest w trakcie uzupełniania więc docelowo będą wszystkie)
Na razie tyle, muszę iść do pracy.
Może coś mi wpadnie do głowy do wieczora.
Dzięki.