verzamelfactuur samenstellen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Stefan van Iwaarden

Stefan van Iwaarden

09/12/2006 20:45:00
Quote Anchor link
Ik wil graag iedere 2 weken alle facturen versturen met de geplaatste bestellingen in die tijd. Iedere klant moet één factuur krijgen met daarop alle geplaatste bestellingen bij elkaar.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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 ;


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
 
PHP hulp

PHP hulp

24/01/2025 02:20:51
 
Stefan van Iwaarden

Stefan van Iwaarden

10/12/2006 23:12:00
Quote Anchor link
*schop*
 
Frank -

Frank -

10/12/2006 23:56:00
Quote Anchor link
Vraagje: Waarom gebruik je MyISAM? Nu kun je onmogelijk met foreignkey's werken met als gevolg dat de tabellen als los zand aan elkaar hangen. Met 1 verkeerde query (kan iedereen gebeuren) stort de hele boel als een kaartenhuis in elkaar. Hopelijk zie je dat op tijd, maar voor hetzelfde geld ben je een half jaar verder voordat je de fout ziet.

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.
 
Stefan van Iwaarden

Stefan van Iwaarden

11/12/2006 00:11:00
Quote Anchor link
@Frank,

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).
 
Jan geen

Jan geen

11/12/2006 00:24:00
Quote Anchor link
Wat is eigenlijk het verschil tussen MyISAM en innoDB? volgens mij kan je de database wel exporteren en dan importeren in een innoDB...
 
Frank -

Frank -

11/12/2006 00:39:00
Quote Anchor link
@Rik:
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 -
 
Stefan van Iwaarden

Stefan van Iwaarden

11/12/2006 01:01:00
Quote Anchor link
@Frank, maar kan ik het tabeltype ook nog veranderen als er reeds data in staat of gaat deze data dan verloren?
 
Remco van Arkelen

Remco van Arkelen

11/12/2006 06:33:00
Quote Anchor link
Het kán wel, maar wordt afgeraden door MySQL, maak dus eerst een volledige backup voordat je dit gaat doen. Lees ook het artikel eens dat ik over MySQL en InnoDB heb geschreven: http://www.phphulp.nl/php/tutorials/3/274/
 
Robert Deiman

Robert Deiman

11/12/2006 09:11:00
Quote Anchor link
Hmm,en wat raden jullie aan als de hosting alleen maar MyISAM, HEAP of MERGE beschikbaar heeft?
 
Remco van Arkelen

Remco van Arkelen

11/12/2006 09:16:00
Quote Anchor link
Misschien tijd om over te stappen naar een andere host? Je kunt natuurlijk vragen óf en wanneer je host een update gaat uitvoeren, InnoDB wordt standaard meegeleverd vanaf MySQL versie 4.1 als ik me niet vergis, dat zou betekenen dat je met een nog oudere versie werkt? Als je data écht belangrijk is heb je een aantal opties:

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 :)
 
Robert Deiman

Robert Deiman

11/12/2006 09:36:00
Quote Anchor link
Back-up is helemaal geen probleem, dat doe ik (en de host) regelmatig. Ze draaien MySQL 5, dus daar ligt het niet aan. Ik denk dat ze hem dus hebben uitgeschakeld, maar die HEAP of MERGE tabellen zijn eigenlijk hetzelfde (simpele) tabellensysteem als MyISAM?

Ik zal de host eens vragen of het mogelijk is de InnoDB aan te zetten.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.