verzamelfactuur samenstellen
Nu heb ik een tabel met alle (losse) bestellingen voorzien van een ordernr en klantID.
Om nu alle bestellingen per klant op één factuur te krijgen heb ik zelf het volgende bedacht.
Ik loop door middel van een while loop alle bestellingen in de bestellingen tabel van die periode door, en maak voor iedere bestelling een nieuwe factuur aan in de 'facturen tabel'. Maar voor ik dit doe laat ik controleren of er in de 'facturen tabel' al een factuur bestaat in die periode voor die klant controlerend op klantID.
Als er al een factuur aanwezig is, laat ik de bestelling in de koppeltabel zetten naast de alreeds aanwezige bestelling voor die factuur.
Zo zou ik een factuur moeten kunnen samenstellen per klant voor die bepaalde periode van twee weken.
Nog even structuur van de twee tabellen. bestellingen_facturen is dus die koppeltabel waarin staat welke bestellingen op welke factuur moeten staan.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
--
-- Tabel structuur voor tabel `bestellingen_facturen`
--
CREATE TABLE `bestellingen_facturen` (
`id` int(11) NOT NULL auto_increment,
`factuurnummer` int(11) NOT NULL default '0',
`bestellingsID` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Tabel structuur voor tabel `facturen`
--
CREATE TABLE `facturen` (
`id` int(11) NOT NULL auto_increment,
`factuurnr` int(10) NOT NULL default '0',
`klantID` int(11) NOT NULL default '0',
`factuurdatum` date NOT NULL default '0000-00-00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- Tabel structuur voor tabel `bestellingen_facturen`
--
CREATE TABLE `bestellingen_facturen` (
`id` int(11) NOT NULL auto_increment,
`factuurnummer` int(11) NOT NULL default '0',
`bestellingsID` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Tabel structuur voor tabel `facturen`
--
CREATE TABLE `facturen` (
`id` int(11) NOT NULL auto_increment,
`factuurnr` int(10) NOT NULL default '0',
`klantID` int(11) NOT NULL default '0',
`factuurdatum` date NOT NULL default '0000-00-00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Nu mijn vraag aan jullie, is dit de goede methode of raden jullie een andere aan?
Gewijzigd op 01/01/1970 01:00:00 door Stefan van Iwaarden
*schop*
Ik raad je aan om z.s.m. innoDB te gaan gebruiken en de boel met foreignkey's aan elkaar te knopen. Dan zal de database zelf zorgen dat de boel keurig bij elkaar blijft staan.
Dan het probleem:
Waarom sla je geen besteldatum op? Dan kun je op basis van deze datum vaststellen welke bestellingen moeten worden gefactureerd. Vervolgens ga je een nieuw factuurnummer aanmaken en alle bestellingen m.b.v. een foreignkey aan deze factuur verbinden. Geef in de tabel 'facturen' aan of een factuur open staat voor nieuwe bestellingen of moet worden voltooid (gesloten).
De tabel 'bestellingen_facturen' lijkt mij overbodig. Je hebt maar 1 factuurnummer die een meerdere bestellingen kan bevatten. De tabel waar de bestellingen in staan heeft dus een kolom met het factuur_id nodig. Zodra een nieuwe bestelling wordt gemaakt, kijk je of er een factuurnummer voor deze klant open staat en zo niet, dan maak je een nieuwe factuur aan.
Eens in de X-dagen sluit je de openstaande facturen en verstuur je de boel. De datum waarop je dit doet, wordt uiteraard de factuurdatum.
Op deze manier kun je ook eenvoudig checken of een factuur al boven een bepaald bedrag uitkomt. Je zou kunnen besluiten om dan automatisch de factuur te sluiten en te versturen (i.v.m. fin. risico's) en voor nieuwe bestellingen een nieuwe factuur aan te maken.
Hopelijk kun je hier wat mee.
MyISAM, tja, dat is omdat op mijn huidige host waar deze website op staat geen InnoDB beschikbaar is, ik heb wel een andere host die dat wel ondersteunt, maar daar staat een andere website op.
De enige types die ondersteunt worden zijn
MyISAM
HEAP
MEMORY
MERGE
MRG_MYISAM
Overigens dan ook nog een ander vraagje, is het ook mogelijk om het tabeltype te veranderen als de tabel reeds in gebruik is, alle tabellen zijn MyISAM en de database is nu zo'n anderhalf jaar in gebruik en er staan zo'n 52.000 records in op dit moment.
Er is wel een aparte tabel voor de bestellingen, hierin staat dus wel een besteldatum samen met klantID, status, eventuele korting enz.
Voor wat betreft een extra kolom voor een factuurID vind ik niet zo heel gek, dan kan ik gewoon met een cronjob elke 2 weken alle facturen nalopen.
En wat jij zegt over dat maximum bedrag is ook wel handig, want ik wil er namelijk ook een optie in maken dat mensen maar voor een maximum bedrag kunnen bestellen. (dit uiteraard klant afhankelijk).
Wat is eigenlijk het verschil tussen MyISAM en innoDB? volgens mij kan je de database wel exporteren en dan importeren in een innoDB...
http://dev.mysql.com/doc/refman/4.1/en/storage-engines.html
Persoonlijke mening: MyISAM is een snelle maar geen goede, laat staan complete, DBMS. Je kunt bv. geen database maken die zelf de data en de onderlinge verbanden in stand houdt, dat zul zelf extern moeten regelen (met alle risico's van dien). Foreignkey's worden niet ondersteund.
Verder kun je geen transactions doen wat tot gevolg heeft dat je INSERT, UPDATE en DELETE-queries niet ongedaan kunt maken wanneer er elders in de dataverwerking iets mis gaat. Dus zul je weer allemaal in je eigen script moeten gaan regelen. Voor zover dat natuurlijk mogelijk is, eigenlijk onmogelijk.
innoDB ondersteunt wél foreignkey's en transactions. Het kent (helaas) geen full-text search, maar dat heb je in vergelijking met foreignkey's en transactions nauwelijks nodig.
Lees ook dit artikel eens. Dan krijg je een goed overzicht van de pijnpunten van MySQL en dan met name van MyISAM.
Naar mijn bescheiden mening is het altijd een slecht plan om MyISAM te gebruiken. Je kunt dan nooit een goed datamodel opbouwen die vanuit zichzelf voorkomt dat je met corrupte data komt te zitten. MyISAM zal dat echt een rotzorg zijn, wanneer jij er een bende van wilt maken (verkeerde query uitvoeren), dan zal MyISAM daar wel even voor zorgen, geen enkel probleem! Totdat je de boel moet gaan herstellen...
Gewijzigd op 01/01/1970 01:00:00 door Frank -
@Frank, maar kan ik het tabeltype ook nog veranderen als er reeds data in staat of gaat deze data dan verloren?
Hmm,en wat raden jullie aan als de hosting alleen maar MyISAM, HEAP of MERGE beschikbaar heeft?
1) Overstappen naar PostgreSQL welke standaard beschikt over diverse SQL-zaken om integriteit te bewaken en te behouden.
2) Overstappen naar InnoDB support
In alle gevallen dien je altijd te zorgen voor een volledige en regelmatige backup van je gegevens....'t kan niet vaak genoeg gezegd worden :)
Ik zal de host eens vragen of het mogelijk is de InnoDB aan te zetten.