Ga terug   Computer Idee Forum > Internet > Websites maken

Antwoord
 
Discussietools Weergave
Oud 10 October 2013, 16:34   #1
anoniem31645
Guest
 
Berichten: n/a
Standaard sql

Ik wil graag een overzicht maken van de bestellingen in een webshop (gebaseerd op zencart). Per bestelling wil ik afgezien van de algemene info het volgende in een tabel tonen per regel, totaal exclusief btw, totaal btw 21%, totaal btw 6%, totaal inclusief btw.

Hiervoor heb de onderstaande code geschreven. Hoewel ik nog niet weet of dit zo verder klopt loop ik eerst nog tegen een ander probleem aan:
Elke bestelling heeft een uniek id nummer echter kan een bestelling bestaan uit meerdere producten. Deze data (welke producten horen bij 1 bestelling) staat in de tabel "orders_products" (de 2e tabel dus). Elk besteld product heeft dus een nummer welke vervolgens weer aan de bestelling gekoppeld is aan de hand van het "order_id" nummer.

Hier onder heb ik dus de data uit 2 tabellen gekoppeld aan de hand van het order_id nummer. Echter komt het order_id nummer in de 2e tabel meerdere keren voor omdat een bestelling dus is opgebouwd uit meerdere producten.

Nu moet ik dus op één of andere manier eerst berekenen hoeveel btw 6% en hoeveel btw 21% er is betaald per bestelling wat vervolgens aan de hand van het order_id gekoppeld kan gaan worden aan de overige data uit de eerste tabel.

Heeft iemand enig idee hoe ik dat kan doen?

PHP-code:
  $sql "
    SELECT
        1.orders_id
        1.customers_name,
        1.customers_company,
        1.date_purchased,
        1.orders_status,
        1.payment_method,
        1.order_total,
        
        2.orders_products_id
        2.final_price,
        2.products_quantity,
        2.products_tax,
    
    FROM
        orders AS 1
    INNER JOIN
        orders_products AS 2
            ON 1.orders_id = 2.orders_id
            
 "
. >= $startdatum && <=$einddatum
 

  Met citaat antwoorden
Oud 10 October 2013, 18:17   #2
anoniem14945
Guest
 
Berichten: n/a
Standaard

Dat is best een uitdaging. Is er ergens bekend wat het BTW-percentage van een product is? In neem aan van wel, of moet je dat ook nog gaan uitrekenen?

Hoe dan ook moet je je denk ik gaan verdiepen in subqueries en GROUP BY. In jouw code hoef je trouwens AS 1 en AS 2 niet te doen, je kunt ook de originele tabelnamen gebruiken.

Even een hypothetisch voorbeeld, geen idee of het werkt want ik heb niets om het op te testen.

Code:
SELECT
        1.orders_id
        1.customers_name,
        1.customers_company,
        1.date_purchased,
        1.orders_status,
        1.payment_method,
        1.order_total,
        `t6`.`tax`,
        `t21`.`tax`
FROM `orders` AS 1
LEFT JOIN
 (SELECT `orders_id`, SUM(`products_tax`) AS `tax` 
 FROM `orders_products`
 GROUP BY `products_tax`
 WHERE `tax_percent` = 6)
 AS `t6`
 ON `1`.`orders_id` = `t6`.`orders_id`
LEFT JOIN
 (SELECT `orders_id`, SUM(`products_tax`)  AS `tax`
 FROM `orders_products`
 GROUP BY `products_tax`
 WHERE `tax_percent` = 21)
 AS `t21`
 ON `1`.`orders_id` = `t21`.`orders_id`
Het kan zijn dat AS `t6` en AS `t21` op de verkeerde plek staan. Daar zit ik zelf altijd mee te stoeien.
  Met citaat antwoorden
Oud 10 October 2013, 18:47   #3
anoniem31645
Guest
 
Berichten: n/a
Standaard

In de 2e tabel staat deze relevante data:

orders_products.orders_id: Bestel nummer, komt overeen met die uit de andere tabel
orders_products.orders_products_id : Uniek nummer (voor dit product voor 1 keer)
orders_products.final_price: De prijs excl btw die de klant heeft betaald
orders_products.products_quantity: Aantal keer dat het product besteld is
orders_products.products_tax: Het btw tarief wat voor dit product geld/gold

Ik moet het dus zo krijgen dat hij eerst in deze tabel kijkt naar bijvoorbeeld order_id 1
1) Hij kijkt dan of een zelfde product meerdere keren is bestel en vermenigvuldigd dit dan met het aantal.
2) Hij telt alle bedragen van dat btw tarief bij elkaar op.
3) Hij berekent het btw bedrag uit (products.final_price*0.21) .
4) Hij doet hetzelfde met de andere btw tarieven.
5) hij kopeld deze info aan de info uit de andere tabel.

Daarna door naar orders_id 2 enz.

ik weet dus het betaalde btw bedrag niet maar wel het tarief en het bedrag exclusief (per product).

in de bijlage heb ik een printscreen van php my admin tabel 2

(overigens word btw 19% en 21% als hetzelfde beschouwd namelijk btw hoog)
Bijgevoegde afbeelding(e)
Bestandstype: jpg tabel.jpg‎ (62,2 KB, 5x gelezen)

Laatst gewijzigd door Sjoukito : 10 October 2013 om 19:17 Reden: duidelijker gemaakt?
  Met citaat antwoorden
Oud 10 October 2013, 23:58   #4
anoniem31645
Guest
 
Berichten: n/a
Standaard

Ik heb er inmiddels dit onderstaande van gemaakt.

Ik snap op zich wel wat er moet gebeuren alleen het deel met :

`tlaag`.`tax`,
`thoog`.`tax`
'tnul`.`tax`

Wat gebeurt hier mee nou pressies ?

en hier AS `tax` en hier AS `tlaag`?

overigens moet ik ook nog de resultaten filteren op datum en op status (alleen afgeronde bestellingen zijn relevant).

PHP-code:
  $start $startdatum['startdatum'];
  
$eind $einddatum['einddatum'];
 
  
$nul 0;
  
$laag 6;
  
$laagnieuw = ;
  
$hoogoud 19;
  
$Hoog 21;
  
$Hoognieuw = ;
 
  
$sql "
  SELECT
        orders.orders_id,
        orders.customers_name,
        orders.customers_company,
        orders.date_purchased,
        orders.orders_status,
    orders.payment_method, 
    orders.order_total,
        
    `tlaag`.`tax`,
        `thoog`.`tax`    
    `tnul`.`tax`    
FROM
        orders 

LEFT JOIN
 (SELECT `orders_id`, SUM(`final_price`* `products_quantity`) AS `tax` 
 FROM `orders_products`
 WHERE `products_tax` = 
$laag || $laagnieuw)
 AS `tlaag`
 ON orders.orders_id = `tlaag`.`orders_id`

LEFT JOIN
 (SELECT `orders_id`, SUM(`final_price`* `products_quantity`)  AS `tax`
 FROM `orders_products`
 WHERE `products_tax` = 
$hoog || $hoognieuw || $Hoognieuw)
 AS `thoog`
 ON orders.orders_id = `thoog`.`orders_id`
 
LEFT JOIN
 (SELECT `orders_id`, SUM(`final_price` * `products_quantity`)  AS `tax`
 FROM `orders_products`
 WHERE `products_tax` = 
$nul )
 AS `tnul`
 ON orders.orders_id = `tnul`.`orders_id`
            
 " 

 
if(!
$res mysql_query($sql))
{
    
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(
mysql_num_rows($res) == 0)
{
    echo 
'Geen data gevonden.';
}
else
{ echo 
'<table width="930" border="0" cellspacing="3" cellpadding="2">
  <tr>
    <td>Datum</td>
    <td>Factuur nr.</td>
    <td>factuur nr. </br> corectie</td>
    <td>Omschrijving</td>
    <td>Klant</td>
    <td>Prijs excl</td>
    <td>BTW Hoog</td>
    <td>BTW laag</td>
    <td>BTW Nul</td>
    <td>Totaal</td>
    <td>Status</td>
  </tr>'
;


    while(
$row mysql_fetch_assoc($res))
   
        {
            echo 
 
'<tr>
    <td>'
$row['date_purchased'].'</td>
    <td>'
$row['orders_id'].'</td>
    <td> </td>
    <td>'
$row['payment_method'].'</td>
    <td>'
$row['customers_name'].'</br>'$row['customers_company'].'</td>
    <td>'
$row['order_total'].'</td>
    <td>'
$row['thoog'].'</td>
    <td>'
$row['tlaag'].'</td>
    <td>'
$row['tnul'].'</td>
    <td>'
$row['order_total'] + $row['tlaag'] + $row['thoog'].'</td>
    <td>'
$row['orders_status'].'</td>
  </tr>'
;
  
         }

echo 
'</table>'
 
 
mysql_close();

?> 
  Met citaat antwoorden
Oud 11 October 2013, 15:02   #5
anoniem14945
Guest
 
Berichten: n/a
Standaard

Moet het trouwens één query worden? Bij dit soort complexe dingen is het vaak handiger om meer queries te doen. Dat is minder efficient, maar een stuk makkelijker te begrijpen.
Dan doe je eerst een query die alle bestellingen opvraagt, gefilterd op datum en status. In de loop van die query ga je dan voor iedere bestelling een nieuwe query doen waar je de product details opvraagt. Eventueel laat je dan wat extra berekeningen door PHP doen.

PHP-code:
$sql "SELECT * FROM `orders` WHERE `date_purchased` BETWEEN '"$datum_start"' AND '".$datum_eind."' AND `orders_status` = 'open'";
$result mysqli_query($link$sql);
while (
$row mysqli_fetch_assoc($result)) {

$sql2 "SELECT SUM(`producs_price`), `products_tax` FROM `orders_products` WHERE `orders_id` = '".$row['orders_id']."' GROUP BY `products_tax`";
$result2 mysqli_query($link$sql2);
//etc


EDIT:
Dit werkt toch niet, of wel:
Code:
WHERE `products_tax` = $hoog || $hoognieuw || $Hoognieuw
Moet volgens mij iets zijn als
Code:
WHERE `products_tax` IN ($hoog,$hoognieuw,$Hoognieuw)
  Met citaat antwoorden
Oud 17 October 2013, 22:25   #6
anoniem31645
Guest
 
Berichten: n/a
Standaard

Ok dit is wat ik nu helemaal heb, niet veel verder gekomen moet ik toe geven.

vlak onder de sql query staat nu //etc maar is het niet zo dat aangezien het per belasting groep word gegroepeerd dat ik verder geen code hier voor nodig heb?

Overigens doet nog niks het, geen foutcode, niks. De datum wil ik dus kunnen intypen in het formulier waarna het die waardes gebruikt om te selecteren maar zelfs het formulier word niet getoond. Het zal vast vol fouten zitten maar ik zie ze niet.

Kan iemand me zeggen hoe ik het het beste te werk ga (een stappenplan o.i.d)?

Code:
<body>

<style type='text/css'>
tr:nth-child(even) {
    background-color: #F4F4F4 ;
}
</style>
<form id="form1" name="form1" method="GET" action=""> 
<input name="Begindatum " type="text" value="startdatum" size="30" maxlength="15">
<input name="Einddatum " type="text" value="einddatum" size="30" maxlength="15">
<input type="submit" name="Search" id="Search" value="ga" />
</form>

<?php

  mysql_connect("localhost", "xxx", "xxx") or die(mysql_error());
  mysql_select_db("xxx") or die(mysql_error());
 
  $datum_start = $startdatum['startdatum'];
  $datum_eind = $einddatum['einddatum'];

  
    $sql = "SELECT 
  
  		`shop15_1_orders.orders_id`,
        `shop15_1_orders.customers_name`,
        `shop15_1_orders.customers_company`,
        `shop15_1_orders.date_purchased`,
        `shop15_1_orders.orders_status`,
		`shop15_1_orders.payment_method`, 
		`shop15_1_orders.order_total`, 
		FROM `orders` WHERE `date_purchased` BETWEEN '"$datum_start"' AND '".$datum_eind."' AND `orders_status` = '3'";
$result = mysqli_query($link, $sql);
while ($row = mysqli_fetch_assoc($result)) {

$sql2 = "SELECT SUM(`producs_price`), `products_tax` FROM `orders_products` WHERE `orders_id` = '".$row['orders_id']."' GROUP BY `products_tax`";
$result2 = mysqli_query($link, $sql2);
//etc

} 
 
if(!$res = mysql_query($sql))
{
    trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(mysql_num_rows($res) == 0)
{
    echo 'Geen data gevonden.';
}
else
{ echo '<table width="930" border="0" cellspacing="3" cellpadding="2">
  <tr>
    <td scope="col">Datum</td>
	<td scope="col">Factuur nr.</td>
	<td scope="col">factuur nr. </br> corectie</td>
    <td scope="col">Omschrijving</td>
    <td scope="col">Klant</td>
    <td scope="col">Prijs excl</td>
	<td scope="col">BTW Hoog</td>
    <td scope="col">BTW laag</td>
    <td scope="col">BTW Nul</td>
    <td scope="col">Totaal</td>
    <td scope="col">Status</td>
  </tr>';


    while($row = mysql_fetch_assoc($res))
   
        {
            echo 
 '<tr>
    <td>'$row['date_purchased'].'</td>
	<td>'$row['orders_id'].'</td>
	<td> </td>
    <td>'$row['payment_method'].'</td>
    <td>'$row['customers_name'].'</br>'$row['customers_company'].'</td>
    <td>'$row['order_total'].'</td>
	<td>'$row['thoog'].'</td>
    <td>'$row['tlaag'].'</td>
    <td>'$row['tnul'].'</td>
    <td>'$row['order_total'] + $row['tlaag'] + $row['thoog'].'</td>
	<td>'$row['orders_status'].'</td>
  </tr>';
  
         }

echo '</table>'
 
 
mysql_close();

?>

</body>
  Met citaat antwoorden
Oud 18 October 2013, 17:11   #7
anoniem14945
Guest
 
Berichten: n/a
Standaard

Bij //etc heb je geen sql code nodig. Je moet natuurlijk wel iets met het resultaat doen. Nu lijkt het alsof je twee dingen onder elkaar hebt geplakt.

Dat het niks doet klopt. Er is namelijk geen enkele connectie tussen het formulier en de rest van het script. Maar daarvoor moeten ook nog eerst de syntax fouten uit de php code gehaald worden. Er ontbreekt in ieder geval een puntkomma voor mysql_close.

Als je geen foutmelding krijgt zou het kunnen dat die zijn uitgeschakeld. Zeker als je dit probeert op je productieserver is dat heel goed mogelijk. Vaak wordt dat gedaan om het kwaadwillenden moeilijker te maken zwakke plekken in je script te vinden.
  Met citaat antwoorden
Oud 24 October 2013, 19:33   #8
anoniem31645
Guest
 
Berichten: n/a
Standaard

Ok inmiddels heb ik een html formulier gemaakt en deze gekoppeld aan het sql script (zie de scripts hier onder).
Het html formulier spreekt voor zich. Vervolgens roept het php script dus verschillende informatie op wat later getoond moet worden natuurlijk. Maar klopt dat script sql/php technisch zo want er gebeurt nog niets (ook geen fout codes. Voor zover ik het nu zie klopt dit toch?

Wel moet er nog bij $sql2 = "SELECT SUM(`producs_price`), gezorgd worden dat dit producs_price keer (x) products_quantity word (hetzelfde product kan meerdere keren besteld zijn ) maar kan ik daar gewoon een * voor gebruiken?

HTML-code:
<form action="data.php" method="get">
    <p>
        <label for="Begindatum">Begindatum:</label>
        <input type="text" name="Begindatum" id="Begindatum" />
    </p>
    <p>
        <label for="Einddatum">Einddatum:</label>
        <input type="text" name="Einddatum" id="Einddatum" />
    </p>
    <p>
        <input type="submit" value="Opvragen" />
    </p>
    </form>
PHP-code:
<?php

  mysql_connect
("localhost""xxx""xxx") or die(mysql_error());
  
mysql_select_db("xxx") or die(mysql_error());
 
  
$datum_start = ($_GET['Begindatum']);
  
$datum_eind = ($_GET['Einddatum']);

  
    
$sql "SELECT 
  
          `shop15_1_orders.orders_id`,
        `shop15_1_orders.customers_name`,
        `shop15_1_orders.customers_company`,
        `shop15_1_orders.date_purchased`,
        `shop15_1_orders.orders_status`,
        `shop15_1_orders.payment_method`, 
        `shop15_1_orders.order_total`, 
        FROM `orders` WHERE `date_purchased` BETWEEN '"
.$datum_start."' AND '".$datum_eind."' AND `orders_status` = '3'";
$result mysqli_query($link$sql);
while (
$row mysqli_fetch_assoc($result)) {

$sql2 "SELECT SUM(`producs_price`), `products_tax` FROM `orders_products` WHERE `orders_id` = '".$row['orders_id']."' GROUP BY `products_tax`";
$result2 mysqli_query($link$sql2);
  Met citaat antwoorden
Oud 25 October 2013, 18:30   #9
anoniem15124
Guest
 
Berichten: n/a
Standaard

Waarom werk je met GET in je formulier ipv POST?
Waarom maak je nieuwe variabelen aan ($datum_start en $datum_eind)?
Waar controleer je of beide waarden wel een datum zijn?
Wat zit er in de beide variabelen?
Klopt de query met wat je verwacht?
Waar is de foutafhandeling van je query?
Ik zie nergens dat je error-reporting hebt aangezet.
  Met citaat antwoorden
Antwoord

Discussietools
Weergave

Regels voor berichten
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit

Forumnavigatie


Alle tijden zijn GMT +1. Het is nu 19:31.


Powered by vBulletin Version 3.8.6
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.