Gå til innhold

Varelager funksjon. Hente ut antall varer på lager fra database. (PHP, MySQL)


Anbefalte innlegg

Skrevet

Heisann!

 

Driver med en hjemmeside for vår ungdomsbedrift, og vi selger to produkter. Derfor trenger jeg å hente ut hvor mange av hvert produkt det er igjen på lager. Dette må selvsagt føres inn i en database, som det deretter kan hentes ut igjen fra.

 

Jeg så for meg at vi la inn tallene for hvor mange puter vi har motatt av leverandør, og at denne summen blir trukket fra hvor mange som er blitt solgt igjen. (Har en egen database hvor alle kundene er listet opp, og hvor mange puter de har kjøpt)

 

 

 

Det å føre inn i databasen er fullført, men jeg trenger hjelp til å få dette vist på hjemmesiden, og utregningen og det greiene med å få det til å stemme med hvor mange av hvert produkt som er igjen. Hvordan kan dette gjøres?

Videoannonse
Annonse
Skrevet (endret)

til dette bør du ha 3 tabeller.

 

for eksempel:

kunder (kundenr, navn, kontaktinfo)

produkt (produktnr, navn, beskrivelse, pris, lagerantall)

transaksjoner (transaksjonnr, kundenr, produktnr, tidspunkt)

 

hver gang et produkt blir solgt legges en rad inn i transaksjoner og lagerantall reduseres med 1

 

for å finne antall puter solgt gjør man

 

select count(transaksjonnr) from transaksjoner t, produkter p where t.produktnr = p.produktnr and p.navn = 'pute';

 

for å begrense selecten til en spesifikk kunde gjør man

 

select count(transaksjonnr) from transaksjoner t, produkter p, kunder k where t.produktnr = p.produktnr and p.navn = 'pute' and t.kundenr = k.kundenr and k.navn = 'kundenavn';

 

for å finne antall varer på lager gjør man

 

select lagerantall from produkt p where p.navn = 'pute';

 

red:

har man mange produkter og kanskje et lager, med lagerplassering kan man fjerne lagerantall fra produkt og ha egen tabell som følger:

 

lager (lagernr, produktnr, plassering, antall)

 

og kanskje

 

leverandør (leverandørnr, navn, kontaktinfo)

 

og legg til feltet leverandørnr i produkter

 

da kan man ha PRIMARY KEY(produktnr, leverandørnr) i produkter slik at man kan ha to rader, med samme produkt id dersom man får tak i samme produkt fra flere leverandører.

Endret av grimjoey
Skrevet

Takk for svar!

 

Det blir ikke litt tungvint å dra inn den transaksjoner tabellen i tillegg da?

 

 

Skal se på det nå, og prøve! Kommer sikkert tilbake med noen problemer jeg støter på.. :)

Skrevet (endret)

transaksjoner tabellen gir deg mulighet til å tracke pris forandringer og se transaksjons tidspunkt.

 

og hvordan ville du ellers holdt rede på hvilke kunder som handlet hvilket produkt og hvor mange?

 

skulle du hatt et nytt felt i kundetabellen for hvert produkt for å notere antall? det er dårlig data modelering.

Endret av grimjoey
Skrevet (endret)

jeg kan forklare litt om det siste jeg skrev også.

 

hadde du hatt 20 produkter og alle brukerene hadde et felt for antall av disse 20 produktene setter databasen av masse ledig plass for å håndtere dette.

 

si du bruker INT(3) som antall produkter. (INT(3) er heltall fra 0 til 999, krever ca 10 bit plass)

 

en bruker kjøper kanskje ett eller to produkter. da er det 19 eller 18 felt som ikke utgjør noen hensikt, men som fortsatt tar 18 * 10 = 180 bit (eller ca 22,5 byte) plass i tabellen.

 

har du 200 kunder så blir dette ca 4,5Kb unødig plassbruk.

 

har du i stedet en tredje tabell som lager en relasjon mellom kunde og produkt, vil ikke databasen sette av unødig plass.

 

dette har ikke så mye å si med disse små datamengdene, men det er to forskjellige måter å tenke på. det er bra å øve på riktig tankegang tilfelle du skulle komme til å utvikle noe større senere.

Endret av grimjoey
Skrevet

Hmm, så jeg burde egentlig endre alle tabellene jeg bruker til system idag.

 

Slik som jeg har det nå, har jeg en tabell med disse:

 

Kundenr, Fornavn, Etternavn, Postnr/sted, Tlf, Mail, Ant. rosa puter, Ant. svarte puter, Ant. blå puter, Total sum, Signatur, Betalt?, Ringt?.

 

 

Går det an å ha det sånn, eller burde det endres med en gang? Isåfall, kan noen vise meg hvordan det burde være oppdelt? Takk for hjelpen! :)

Skrevet (endret)

Kunder:

Kundenr, Fornavn, Etternavn, Postnr, Tlf, Mail, Signatur

 

Produkter:

Produktnr, Navn, Beskrivelse, Lagerantall, Pris

 

Transaksjoner:

Transaksjonsnr, Kundenr, Produktnr, Antall, Pris, Betalt?, Ringt?, Tidspunkt

 

Poststed:

Postnr, Poststed

 

For eksempel. Men for all del, dersom du ikke skal ha noe serlig flere produkter, fungerer det slik du har det.

 

sql:

CREATE TABLE Kunder (
 Kundenr INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
 Fornavn VARCHAR(30) NOT NULL,
 Etternavn VARCHAR(30) NOT NULL,
 Postnr INT(4) NOT NULL,
 Tlf LONGINT(12) NOT NULL,
 Mail VARCHAR(75) NOT NULL,
 Signatur ??? NOT NULL
);

 

bytt ut ??? med en datatype som passer signatur. eller er dette noe som hører til transaksjon?

 

CREATE TABLE Produkter (
 Produktnr INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
 Navn VARCHAR(30) NOT NULL,
 Beskrivelse TEXT NOT NULL,
 Lagerantall INT(4),
 Pris FLOAT(6,2)
);

CREATE TABLE Transaksjoner (
 Transaksjonsnr INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
 Kundenr INT(11) NOT NULL,
 Produktnr INT(11) NOT NULL,
 Antall INT(4),
 Pris FLOAT(6,2)
);

CREATE TABLE Poststed (
 Postnr INT(4) NOT NULL PRIMARY KEY,
 Poststed VARCHAR(40) NOT NULL,
 Postbox BIT(1) DEFAULT NULL
);

 

Data til poststed tabellen kan du hente fra posten.no

Skal du ha flere tabeller slik som dette må du regne med at spørringene blir litt mer kompliserte (Ikke veldig).

 

Red:

Vil du at kunden skal kunne bestille over nett eller ønsker du bare en personlig oversikt?

Endret av grimjoey
Skrevet

Dette er bare en personlig oversikt som vi skal ha på et lukket område på nett. Grunnen til dette er at det blir veldig enkelt for oss å føre opp nye kunder, og hva vi har solgt osv.

 

Vi har jo en enkel nettbutikk også, og er kjekt for kundene å se om vi har det på lager.

 

 

 

Nå blir det vel ganske mye mer avansert når jeg skal hente inn dataene fra alle tabellene?

 

Spørringen for oversikten:

$result = mysql_query("SELECT * FROM _tabell_") or die(mysql_error());

 

Hvordan blir det når jeg skal hente inn alle? Bare gjøre slik som under her?

 

$result = mysql_query("SELECT * FROM _tabell1_") or die(mysql_error());
$result = mysql_query("SELECT * FROM _tabell2_") or die(mysql_error());
$result = mysql_query("SELECT * FROM _tabell3_") or die(mysql_error());

Skrevet

du må vite hvilken informasjon du skal hente, og du må vite relasjonen dersom det er flere tabeller du skal hente fra.

 

for eksempel hvis du skal hente alle produkt en kunde har kjøpt gjør du:

 

SELECT Kunder.Fornavn, Kunder.Etternavn, Produkt.Navn, Transaksjoner.Antall from Produkt, Transaksjoner, Kunder WHERE Produkt.Produktnr = Transaksjon.Produktnr AND Kunder.Kundenr = Transaksjon.Kundenr AND Kunder.Kundenr = _sett_inn_kundenr_her_;

 

alt som er etter WHERE er relasjoner og søkeparameter.

Skrevet (endret)

Jeg skal hente inn alle de 4 tabellene...

 

 

$result = mysql_query("SELECT * FROM kunder, produkter, transaksjoner") or die(mysql_error());

 

 

Går ikke dette da? Bare dele de opp med komma?

 

 

EDIT: Det gikk smertefritt. Fungerte ikke første gangen jeg testet, men nå funker det.. :)

Endret av AnaXyd
Skrevet

Men jeg tror du har misforstått litt grimjoey. Slik som du har tenkt(tror jeg) er en nettbutikk. Jeg skal bare ha en oversikt hvor mine ansatte kan føre inn en og en kunde, hvor mange puter av hvilke farger kunden kjøpte og kontaktinfo slik at vi har lett oversikt over det hele.

 

Så tenkte jeg at det bare var å lage en tabell over lagerstatusen, og trekke fra denne med hvor mange puter som er blitt solgt.

 

 

Skjønner? Føler det blir litt heftig med transaksjoner og greier når jeg bare skal ha det slik.:)

Skrevet

ok.

 

eneste problemet du får er at du må dobbeltlagre varenavnet.

 

CREATE TABLE Lager (Navn VARCHAR(35) PRIMARY KEY NOT NULL, Antall INT(3) NOT NULL);

 

SELECT SUM(Ant._Rosa_Puter) FROM Kunder;

vil gi antall rosa puter solgt

 

SELECT Antall FROM Lager WHERE Navn = "Rosa Puter";

vil gi antall rosa puter på lager

 

men jeg sliter litt med logikken her. skal lagerbeholdningen være fast eller skal den endre seg ettersom varer blir solgt eller kjøpt inn/produsert?

 

i så fall trenger du ikke gjøre noen utregning. du bare trekker fra 1 i lager antall hver gang det selges en pute.

Skrevet

Okay.. :) Skjønte ikke helt hva du mente med dobbeltlagre varenavnet men.. :hmm:

 

For om jeg skal ha det slik, trenger jeg vel bare den tabellen jeg hadde fra før av(med alt i) og en tabell med lagerinformasjon?

 

 

men jeg sliter litt med logikken her. skal lagerbeholdningen være fast eller skal den endre seg ettersom varer blir solgt eller kjøpt inn/produsert?

Jo, vi fører inn et fast beløp av produkter vi får inn av produsenten, som tilsammen blir totalt med produkter.

 

Så det blir jo kanskje noe lignende dette når vi skal føre inn på lager:

leveranse id | Blå puter inn | Rosa puter inn | Svarte puter inn | Total inn(summerer blå, rosa, og svarte)

1 | 50 | 50 | 40 | 140

2 | 10 | 20 | 30 | 60

 

Så må det være noe som drar dette inn i en annen tabell igjen(eller noe) som summerer totalen (for både blå puter, rosa og svarte og totalen) og trekker ifra det kundene har kjøpt, som da blir lagerstatus?

 

Er ikke dette en grei løsning på problemet da? Det kan jo hende det finnes bedre løsninger, så jeg er åpen for forslag! :)

Skrevet (endret)

Dette er (sorry at jeg sier det) dårlig data modellering. Du får det sikkert til, men jeg er ikke vant til å tenke slik.

 

Nå har du to tabeller, hvor begge har et felt for hvert produktnavn. Dette er dobbellagring. Og som i eksemplet ditt her lagrer du faktisk summen av de andre feltene i samme tabell i et eget felt i tabellen. Helt unødvendig.

 

Men ok.

 

Så dette er oversikt over leveranser. og her skal tallene kun settes inn (ikke endres for hvert salg?). Ved salg setter du bare antall +1 i kundetabellen.

 

Det virker som du har kommet et stykke på vei da. Hva nøyaktig er det du ikke klarer som stopper deg i å gjøre det ferdig?

 

Har du den tabellen fra forrige post vil du kunne hente antall varer ved å gjøre følgende:

 

// hente antall varer solgt:

$res = mysql_query( 'SELECT SUM(antall_rosa_puter) FROM kunder;' );

$row = mysql_fetch_row( $res );

mysql_free_result( $res );

 

$antall_rosa_puter_solgt = $row[0];

 

// hente antall varer levert:

$res = mysql_query( 'SELECT SUM(rosa_puter) FROM lager;' );

$row = mysql_fetch_row( $res );

mysql_free_result( $res );

 

$antall_rosa_puter_levert = $row[0];

 

// regne ut lagerbeholdning

 

$antall_rosa_puter_i_lager = ((int)$antall_rosa_puter_levert - (int)$antall_rosa_puter_solgt);

 

Du må endre felt (kolonne) og tabell navnene til å passe tabellene dine.

Endret av grimjoey
Skrevet

Helt villt å kunne alt det der utenat ja!

 

 

Men to the case:

Hvis du mener dette er dårlig data modelering, er jeg såklart åpen for forslag! Du er sikkert vant til å tenke annerledes enn meg. Jeg som ikke har drevet så mye med dette, tenker sikkert "basic" når det gjelder dette.. :p Beklager om jeg må få inn alt med teskje, hvis det er slik! :) Men jeg er helt i hundre, og føler at jeg lærer noe av dette hele tiden!

 

 

Men uansett, bra du sier ifra slik at jeg kan lære meg opp til å tenke annerledes!

 

 

Så dette er oversikt over leveranser. og her skal tallene kun settes inn (ikke endres for hvert salg?). Ved salg setter du bare antall +1 i kundetabellen.

Helt korrekt.. :) Tenkte at vi bare kunne føre inn tallene i den tabellen, og at det var statisk. Da har vi også en oversikt over hvor mange puter vi har hatt innom oss også.

 

Hva mener du med det jeg har merket som bold?

 

Det virker som du har kommet et stykke på vei da. Hva nøyaktig er det du ikke klarer som stopper deg i å gjøre det ferdig?

Takk for det! :) Føles ihvertfall slik ut også. Har jo fått til en del alt!

 

Det som hindrer meg å gjøre alt ferdig, er vel faktisk å gjøre rede for dette med de ulike tabellene og tallene som skal hit og dit. Akkurat nå er jeg skikkelig forrvirret ang. det der, men jeg håper det blir bedre!

 

Det er også begrenset PHP og MySQL kunnskaper som hindrer meg. Men du har jo hjulpet meg langt på vei alt!

Skrevet (endret)

Nå har jeg opprettet de to databasene kunder og lager, hvor lager inneholder 5 kolonner(id, rosa_inn, blaa_inn, svarte_inn, total_inn)

 

Jeg veit ikke om dette er dårlig data modelering eller ikke, men jeg dobbeltlagrer vel ikkenoe her nå? lager inneholder kun hvor mange puter vi har fått inn fra leverandør.

 

 

Jeg har brukt php koden du gav til meg i forrige post grimjoey, og det ser slik ut nå:

 

Klikk for å se/fjerne innholdet nedenfor
<?PHP
			// summere antall rosa puter og regne ut lagerbeholdning
			// hente antall varer solgt:
			$res = mysql_query( 'SELECT SUM(antall_rosa) FROM kunder;' );
			$row = mysql_fetch_row( $res );
			mysql_free_result( $res );

			$antall_rosa_puter_solgt = $row[0];

			// hente antall varer levert:
			$res = mysql_query( 'SELECT SUM(rosa_inn) FROM lager;' );
			$row = mysql_fetch_row( $res );
			mysql_free_result( $res );

			$antall_rosa_puter_levert = $row[0];

			// regne ut lagerbeholdning

			$antall_rosa_puter_i_lager = ((int)$antall_rosa_puter_levert - (int)$antall_rosa_puter_solgt);
			echo "<p> Lagerbeholdning på rosa puter: " .$antall_rosa_puter_i_lager. " på lager</p>"
			?>
			 <?PHP
			// summere antall blå puter og regne ut lagerbeholdning
			// hente antall varer solgt:
			$res = mysql_query( 'SELECT SUM(antall_blaa) FROM kunder;' );
			$row = mysql_fetch_row( $res );
			mysql_free_result( $res );

			$antall_blaa_puter_solgt = $row[0];

			// hente antall varer levert:
			$res = mysql_query( 'SELECT SUM(blaa_inn) FROM lager;' );
			$row = mysql_fetch_row( $res );
			mysql_free_result( $res );

			$antall_blaa_puter_levert = $row[0];

			// regne ut lagerbeholdning

			$antall_blaa_puter_i_lager = ((int)$antall_blaa_puter_levert - (int)$antall_blaa_puter_solgt);
			echo "<p> Lagerbeholdning på blå puter: " .$antall_blaa_puter_i_lager. " på lager</p>"
			?>
			 <?PHP
			// summere antall rosa puter og regne ut lagerbeholdning
			// hente antall varer solgt:
			$res = mysql_query( 'SELECT SUM(antall_svarte) FROM kunder;' );
			$row = mysql_fetch_row( $res );
			mysql_free_result( $res );

			$antall_svart_puter_solgt = $row[0];

			// hente antall varer levert:
			$res = mysql_query( 'SELECT SUM(svart_inn) FROM lager;' );
			$row = mysql_fetch_row( $res );
			mysql_free_result( $res );

			$antall_svart_puter_levert = $row[0];

			// regne ut lagerbeholdning

			$antall_svart_puter_i_lager = ((int)$antall_svart_puter_levert - (int)$antall_svart_puter_solgt);
			echo "<p> Lagerbeholdning på svarte puter: " .$antall_svart_puter_i_lager. " på lager</p>"
			?>

 

 

Men det jeg får ut, inneholder en error som er:

 

 

Lagerbeholdning på rosa puter: 94 på lager

 

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /vei/til/fil/index.php on line 88

 

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /vei/til/fil/index.php on line 89

 

Lagerbeholdning på blå puter: 108 på lager

 

Lagerbeholdning på svarte puter: 108 på lager

 

 

Hva er egentlig galt? Går det ikke an å bruke samme kode flere ganger på rad?

Endret av AnaXyd
Skrevet (endret)

det hadde hjulpet å vite hvilke linjer som var nr 88 og 89. koden du skrev er på 63 linjer.

 

bruk funksjonen my_query som jeg skrev tidligere. tipper du har noe feil i et par av queriene. sjekk feltnavn i tabellene osv.

 

det går fint an å ha samme kode 2 ganger eller mer, men det er dumt. lag løkke eller funksjon dersom du skal gjenta kode. da slipper du å ha 4 kopier av så å si samme kode hvor 3 fungerer og 1 ikke.

 

med funksjon eller løkke er det slik at enten fungerer det eller ikke. mye lettere å finne feil.

 

<?php

function my_query_single_field( $sql ) {
 $res = mysql_query( $sql ) or die( 'Feil med database.' ); // kommer denne erroren er det feil i querien.
 $row = mysql_fetch_row( $res );
 return $row[0];
}

// her kan du enkelt legge inn andre farger
foreach ( array( 'rosa', 'blaa', 'svarte' ) as $farge ) {
 $kunde = my_query_single_field( 'SELECT SUM(antall_' . $farge . ') FROM kunder;' );
 $lager = my_query_single_field( 'SELECT ' . $farge . '_inn FROM lager;' );
 $sum[$farge] = ($lager - $kunde);
}

$out = '';
foreach ( $sum as $k => $v ) {
 $out .= "<p>Det er $v $k puter på lager</p>\n";
}

$out = str_replace( 'aa', 'å', $out );

print $out;

?>

 

elns

Endret av grimjoey

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...