Factuur maken in excel via access

Status
Niet open voor verdere reacties.

Dj NRG

Gebruiker
Lid geworden
22 mrt 2009
Berichten
49
Hey

ik ben aan het proberen om facturen automatisch aan te maken, en op te slagen.

er moet de mogelijkheid zijn om manueel aanpassingen te doen, en ze daarna af te printen / op te slaan, ...

nu dacht ik om de gegevens in access te verzamelen (via query) en ze dan naar excel te exporteren, en daar men factuur te maken. kan dit? en kan ik dan in excel manueel dingen aanpassen? kan ik deze factuur ook automatisch opslaan?
om ze automatisch op te slaan dacht ik om een map te maken met klantnaam, en daarin een submap "facturen" en dan het bestand te op te slaan als factuur 1 tem factuur 5 (klant krijgt max 5 facturen)

kan dit? en hoe ga ik best te werk? iemand die me op weg kan helpen?

mvg

Dj NRG
 
Ik heb zelf iets dergelijks gemaakt.
Alleen gebruik ik (nog) geen acces.

Ik los automatisch nummeren op in een klanten history per klant.
In een cel plaats ik een regel waarin een korte omschriving van die factuur (5 / 6 woorden), een factuur nummer incl hyperlink naar de factuur toe en een vinkje als de factuur is betaald.
Factuur nummer bestaat uit klantnummer en een volgnummer voor die klant.

Zodra ik een history van een klant open, wordt gekeken het commentaar achter het factuur nummer is ingevuld. (macro-werk)
Zo nee, dan wordt de datum geplaatst, factuurnummer met 1 verhoogd en op de eerstvolgende lege regel geplaatst.
Plaats ik die keer geen commentaar omdat ik alleen inzie, dan gebeurd er verder niets.
Eerstvolgende keer, zelfde nummer en andere datum ervoor.

Het is een tikkie complex om de code (die overigens nog niet 100% vlekkeloos werkt) hier even te posten.
Een leeg voorbeeld document heb ik ook niet. Staan ook mijn bedrijfs gegevens enzo in.

Ik ben eventueel wel bereid je met je eigen document op weg te helpen.
 
Wij gebruiken de techniek die je wilt wel zoals je hem beschrijft. Bijvoorbeeld om bevestigingsbrieven te maken met een Word sjabloon. Ik gebruik hier dan een query voor die m.b.v. een knop een Excel bestand genereert met daarin bijvoorbeeld de klantnaam, datum enzovoort. Vervolgens wordt de samenvoeging gedaan met het Word document en het Excel bestand.
Alles wordt dus aangestuurd vanuit de knop in het Access formulier.

Als dit ongeveer is wat je zoekt, kan ik je dus wel verder helpen, als je weer een voorbeeldje kunt neerzetten.

Michel
 
Hey Michel, dit is inderdaad wat ik zoek.
welke gegevens heb je allemaal nodig? is de query zelf genoeg?

ps: Paul Rt, bedankt voor je antwoord!


mvg

Dj NRG
 
De query zou wel handig zijn, in ieder geval de naam van de query.
Omdat je verder wilt automatiseren vanuit Excel, zou ik zelf een factuursjabloon in Excel maken, waar je dan het gegevensbestand dat uit Access komt vast aan koppelt. Dat houdt dan dus in, dat je een vast bestand vanuit Access exporteert naar een vaste locatie, waarna Excel het a.H.W. overneemt en de factuur voor je maakt.
Overigens kun je in Access uiteraard ook facturen laten rollen, en die zijn dan uiteraard veel makkelijker te koppelen aan je gegevens, omdat die toch al in Access staan. Is dat geen optie?

Michel
 
dat is zeker een optie... maar kan ik die factuur dan ook makkelijk opslagen? en kan ik manueel ook gegevens aanpassen? en hoe ga ik dan best te werk? via een rapport?

mvg

Dj NRG
 
Het maken van een factuur in Access m.b.v. een rapport heeft voordelen en nadelen; persoonlijk vind ik het een voordeel dat de gegevens niet kunnen worden bewerkt, omdat het naar mijn mening juist de bedoeling is om al het voorwerk te doen vóór de factuur wordt afgedrukt; nabewerking zou dan ook niet nodig hoeven te zijn.

Als je het hebt over aanpassingen van de gegevens, dan neem ik aan, dat je die aanpassingen wel opgeslagen wilt hebben. Dat zal neem ik aan ook de bedoeling zijn van je Excel bestand. In Access kun je dat bereiken door alle factuurgegevens eerst op een formulier weer te geven, waar je dan m.b.v. tekstvakken al dan niet gegevens kunt wijzigen, en met formules de juiste bedragen te berekenen.

Het nabewerken van factuurgegevens in Excel heeft, vermoed ik, als gevolg dat de factuur(gegevens) niet meer overeenstemmen met de Access gegevens, en dat lijkt mij de problemen alleen maar groter te maken.
Als je de factuurgegevens opslaat in tabellen, met eventuele berekeningen erbij, dan is een rapport feitelijk een weergave van de opgeslagen gegevens. Je kunt er dan ook altijd op terugvallen. Ik zou dus altijd opteren voor een rapport in Access.

Michel
 
ik had eerst een factuur gemaakt via een formulier, maar ik kon hier niets op wijzigen. de bedoeling van dingen te wijzigen is om vb de naam aan te passen (ipv op mijnheer zijn naam op mevrouw haar naam bijvoorbeeld).

maar goed, ik had dus een factuur als formulier, maar buiten het feit dat het me niet lukte om iets aan te passen (dit zal nog wel op te lossen zijn denk ik); hoe sla ik dit op? er kom namelijk ook de huidige datum op een factuur te staan, dus door die factuur opnieuw te genereren hab ik een nieuwe factuur, en niet men oorspronelijke...

dus, 2 vragen: hoe pas ik die gegevens aan (wat deed ik toen fout?)
en hoe sla ik die factuur (hetzij als formulier, hetzij als rapport) op?

mvg

Dj NRG
 
Ik vermoed dat het probleem met je formulier simpel is op te lossen. En hetzelfde geldt voor het datumveld.
Om met het laatste te beginnen: waarschijnlijjk heb je het datumveld een standaardwaarde gegeven, bijvoorbeeld de functie Date(). Dat zou op zich geen probleem hoeven te geven; bij het aanmaken van een nieuw record (nieuwe factuur) krijg je de datum van vandaag, die je op altijd zou moeten kunnen veranderen. Ook zou de datum niet moeten veranderen als je een ouder record opent. Een standaardwaarde is eigenlijk niet meer dan een voorstel, wat je al dan niet accepteert of verandert.
Anders wordt het, als je op het formulier een knop Opslaan maakt, die alle gegevens overschrijft die al in de tabel staan. In dat geval heeft een fomulierveld met de standaardwaarde Date() uiteraard tot gevolg, dat je een nieuwe datum krijgt. En dat is dan weer niet de bedoeling....
En dat brengt ons bij het eerste probleem! Een formulier is altijd gebaseerd op een tabel, query of recordset. De laatste variant gebruik je als je allemaal losse, niet-gebonden tekstvakken en keuzelijsten gebruikt, maar ze toch wil vullen in een tabel.
Als je het formulier baseert op ee query die niet kan worden bijgewerkt, is het ook niet mogelijk om het formulier met zijn gegevens op te slaan. Het formulier werkt namelijk als een doorslag van de query. De eerste stap zou dan ook moeten zijn om de bron van het formulier te controleren. Als je records kan toevoegen aan de query, dan kan het ook met het formulier.
Om een factuur te kunnen factureren aan een ander persoon, of bijvoorbeeld een ander afleveradres, kun je denk ik het beste ongebonden keuzelijsten maken, die je wel als bron de adressentabel geeft, maar die je in de factuurtabel opslaat in een veld dat niet is gekoppeld aan de adressentabel. Zo kun je wel een adres(persoon) kiezen, en toch overschrijven als het anders moet. Voor andere gegevens kun je bijvoorbeeld functies gebruiken die het geslacht M/V vertalen naar De heer/Mevrouw.

Om wat specifieker op jouw situatie in te kunnen gaan, zou een voorbeeldje wel weer handig zijn;)

Michel
 
Hey Michel

bedankt voor je antwoord...

als ik een beetje kan volgen wat je zegt, bedoel je dus dat ik best een formulier gebruik, daaraan de layout van men factuur geef, de gegevens op het factuur tevoorschijn moet toveren dmv een query (die heb ik al :)) en vervolgens al die gegevens die in het factuur staan, op moet slagen als een record?

die query en dat factuur vormt geen probleem, maar hoe laat ik die gegevens opslaan in een query? en als ik die query run, dan genereert hij de datum van vandaag via de query, maar als ik later dat formulier open, en eventueel iets aanpas, past hij dan niet enkel de record aan met hetgeen ikzelf aangepast heb (aangezien ik de query niet laat lopen waar date() instaat)?

en om gegevens manueel aan te passen, als die gegevens opgeslagen worden als een record in een aparte tabel, kan ik dan niet gewoon de naam wijzigen als ik die record open in men formulier?

dus, als bovenstaande dingen kloppen, dan blijft er slechts 1 vraag over: hoe sla ik de gegevens van men factuurformulier op in een aparte tabel? :)

een voorbeeldje plaatsen is vrij lastig, aangezien de query gebruik maakt van een heleboel verschillende tabellen en zo... als het echt nodig is probeer ik alles wel bij elkaar te krijgen wat je nodig hebt...

alvast bedankt!


mvg

Dj NRG
 
Dat zijn weer een hoop vragen :D .Om met het eerste te beginnen: als je met de query die je nu hebt records kunt toevoegen, dan zit je prima, want dan kan dat ook als je hem als basis voor je formulier gebruikt.
Je ziet dat gauw genoeg als je bijvoorbeeld een veld probeert te wijzigen via de query; lukt dat niet, dan is de query niet geschikt om in te voeren. Ook kun je dat aan de knop zien voor Nieuw record; die is grijs als je geen records kunt toevoegen. Je gebruikt dan geen tabel als Recordbron, maar die query.

Als je op je formulier vervolgens een knop hebt gemaakt om een nieuw record te maken, dan worden de gegevens van je formulier opgeslagen in de velden van de query. Meestal zul je de gegevens voor je query uit meerdere tabellen halen, maar dat maakt voor het formulier niet uit. Als je bijvoorbeeld een klantnummer opslaat in de tabel Facturen, en ook adresgegevens laat zien uit de tabel Klanten, dan wordt het klantnummer opgeslagen in de tabel Facturen, en de klantgegevens in de tabel Klanten. Een wijziging in het adres zal dus in de tabel Klanten worden opgeslagen, en niet in de tabel Facturen, omdat daar geen adresgegevens in worden opgeslagen (althans, in dit voorbeeld).

Om het verhaal misschien nog complexer te maken dan het al is, kun je zelfs de situatie hebben dat je een nieuw record opslaat in de tabel Facturen, omdat je dus op Nieuw record hebt geklikt, maar, omdat je bijvoorbeeld een telefoonnummer hebt veranderd bij het invoeren, tevens de tabel Klanten aan het bijwerken bent! Da's nog eens multitasken ;)

Het voordeel van zo'n oplossing is, dat je dus eigenlijk alleen de voor de factuur noodzakelijke gegevens opslaat in de tabel facturen, maar veel meer gegevens kunt zien en controleren op het formulier. En dat heeft weer als voordeel dat je in de volgende fase gelijk een factuur kunt afdrukken via een rapport, waarbij je de gegevens uit het formulier als bron gebruikt voor dat rapport. Daar moeten dan uiteraard wel de klantgegevens op staan.

Persoonlijk zou ik een startformulier maken met een knop om nieuwe records toe te voegen, waarbij je via de kenop het formulier activeert in Toevoegmodus, en een knop om records te bewerken, waarbij het formulier in Edit modus wordt geopend. Je kunt dan voor elke modus bepaalde elementen dichttikken, zodat je bijvoorbeeld bij het toevoegen geen adresgegevens kunt wijzigen, maar in de bewerkmodus weer wel.

Conclusie: je hoeft de query dus helemaal niet te draaien, want dat gebeurt op het formulier. Je moet de query zien als een tijdelijke tabel, die hetzelfde werkt als een gewone tabel op een formulier. Standaardwaarde leg je ook vast op het formulier, of in de tabel, maar niet in de query. Alles draait in deze om gegevens opslaan, wijzigen en teruglezen, en alles komt dus feitelijk gewoon uit de onderliggende tabellen!

Mocht je nog vragen hebben: you know the way!
Michel
 
:s

ok, euhm... ff stap voor stap? ;) (ben een beetje een leek hoor)

dus

al de gegevens voor men factuur te maken staan in tabellen (ook de totaal prijs, hetgeen er moet gefactureerd worden, ...)

ik heb nu een query die al deze gegevens bij elkaar zoekt, en weergeeft, maar ik kan hier niks meer aan wijzigen...
hoe zorg ik ervoor dat dit wel kan? :s
ik neem aan dat die query die gegevens dan eerst naar een tabel moet kopieren als nieuwe record? ik maak dus vb een tabel facturen aan, met daarin alle velden die op men factuur voorkomen, kan ik dan al de gegevens van men query naar men factuur tabel kopieren? (en hoe :) ?)
als die gegevens dan in die tabel opgeslagen zijn, zou ik dus men formulier moeten openen (factuur formulier) met al die gegevens op (in edit modus), waar ik dus eventueel enkele aanpassingen aan adres ed kan maken. deze aanpassingen worden dan in de tabel facturen overschreven, zodat als ik op een later tijdstip die factuur terug oproep, ik de factuur incl aanpassingen zie

juist tot hier toe?

das eigenlijk hetgeen ik zou willen bereiken :)

ik zou dus gewoon met 1 knop willen werken "factuur maken" en 1 knop "factuur weergeven".

de knop factuur weergeven zou niet klikbaar mogen zijn als er nog geen factuur gemaakt is, en vice versa...

dus, om bij het begin te beginnen: hoe zorg ik ervoor dat men query al de gegevens die hij opzoekt in een nieuwe tabel (facturen) kopieert? en hoe kan ik er dan achteraf voor zorgen dat die gegevens gekoppeld zijn aan de knop "factuur weergeven" voor die bepaalde factuur van die klant? (die bepaalde factuur is niet zo moeilijk, aangezien er per klant max 5 facturen gemaakt moeten worden, en elke factuur een aparte knop zal krijgen)

bedankt voor al je tijd en moeite


mvg
Dj NRG
dus, hoe zorg ik ervoor dat men query die gegevens in een tabel zet als nieuwe record?
 
Eerst maar eens de basis goedleggen...

ik heb nu een query die al deze gegevens bij elkaar zoekt, en weergeeft, maar ik kan hier niks meer aan wijzigen...
hoe zorg ik ervoor dat dit wel kan? :s

De reden hiervoor ligt vermoedelijk in de gekozen velden. Je moet eigenlijk in het achterhoofd houden, dat je een query baseert op éen tabel, in dit geval de tabel Facturen. Je moet dan ook alle velden uit die tabel opnemen in de query. Vervolgens wil je gerelateerde gegevens laten zien, zoals adresgegevens. Die velden haal je uit de gekoppelde tabellen. Wat je vooral niet moet doen, is sleutelvelden opnemen in de query uit de gekoppelde tabellen.
Het veld KlantID bijvoorbeeld is in de tabel Klanten een sleutel; bij het maken van een factuur heb je een KlantID nodig, dus die zal ook in de tabel Factuur zitten. Omdat je alle velden uit de tabel Factuur meeneemt in de query, heb je dus ook je KlantID al in de query zitten. Het is een beetje zinloos om hetzelfde veld twee keer op te nemen.
Plus: dank zij het veld KlantID uit de tabel Klanten kun je geen records meer toevoegen aan de tabel Factuur! De reden is eigenlijk wel logisch: je probeert nu namelijk om het KlantID nog een keer toe te voegen aan de tabel klanten, en dat mag uiteraard niet bij een sleutelveld.

Dus: kijk daar eerst eens naar. Mocht je er niet uitkomen, dan moet je de SQL code van de query maar posten, dan kunnen we wat meer zien. Die kun je vinden als je in het queryontwerpscherm staat, en <Beeld>, <SQL> kiest.

Michel
 
en hoe zorg ik er voor dat die gegevens in een aparte tabel (facturen) terecht komen? kan dit door eerst een query te maken (die ik al heb) en die vervolgens naar een tabel te kopieren?

mvg

Dj NRG
 
Waar is de huidige query op gebaseerd? Eventueel is het wel handig om daar eerst naar te kijken... Het hangt allemaal af van de velden die je in de query hebt opgenomen, of je de query als basis kunt gebruiken.
Zoals ik al eerder probeerde uit te leggen, hoeft een query niet veel anders te werken als een tabel. Als je een formulier maakt, die op een tabel werkt, kun je dat formulier ook gebruiken op een query die op dezelfde tabel is gebaseerd. Vaak zal het formulier dan ook nog sneller werken!
Als je dus records aanmaakt op het formulier worden ze gelijk opgeslagen in de juiste tabel, ongeacht of je een tabel of een query gebruikt.

Wat dus nu handig is, is om de SQL code te kopieën en hier te plaatsen. Dat doe je vanuit het query ontwerpscherm en dan <Beeld>, <SQL>.

Michel
 
Hey Michel

hier is de sql code van men query... zoals je zal zien is deze dus gebaseerd op verschillende tabellen... kan ik al de gegevens vanuit deze query in 1 nieuwe tabel krijgen? of hoe ga ik dan best te werk?

Code:
SELECT klantgegevens.Achternaam, klantgegevens.adres, klantgegevens.Postcode, klantgegevens.Gemeente, klantgegevens.[Offerte ref], klantgegevens.[Offerte datum], Date() AS Expr2, Date()+14 AS Expr3, klantgegevens.KlantID, facturatiegegevens.Schijf1, [Schijf1]+[Expr6] AS Expr4, IIf([klantgegevens]![Recht op 6% BTW?]=-1,0.06,0.21)*100 AS Expr5, IIf([klantgegevens]![Recht op 6% BTW?]=-1,0.06,0.21)*[facturatiegegevens]![Schijf1] AS Expr6, totaalvermogenpanelen.Expr1
FROM (facturatiegegevens RIGHT JOIN (klantgegevens LEFT JOIN installatiegegevens ON klantgegevens.KlantID = installatiegegevens.KlantID) ON facturatiegegevens.KlantID = klantgegevens.KlantID) INNER JOIN totaalvermogenpanelen ON klantgegevens.KlantID = totaalvermogenpanelen.KlantID;

mvg

Dj NRG
 
even inspringen op de discussie maar niet alles gelezen te hebben (even aan het scannen).
Het probleem van de factuur datum is makkelijk op te lossen.
De datum van een factuur mag na aanmaken nooit meer wijzigen. Dit is makkelijk op te lossen door een aparte tabel aan te maken met daarin factuurnummer en factuurdatum.
Een andere mogelijk zou zijn om te controleren of er reeds een factuurdatum is aangemaakt en indien ja, bij het veld van de factuurdatum de mogelijkheid uit te zetten om deze aan te passen.
 
Hey Floor E,

bedankt voor je reactie, maar dit lijkt me een probleem voor later.. eerst zou ik ervoor willen zorgen dat ik zo efficient mogelijk de gegevens van men huidige query (al de gegevens die ik nodig heb om men factuur op te stellen) in een aparte tabel gekopieerd krijg...

enig idee hoe ik dit doe?

mvg

Dj NRG
 
We pakken de draad gewoon weer op waar ik hem heb laten liggen... de query dus. Ik denk wel te weten waarom je niks kunt opslaan: je gebruikt het veld klantgegevens.KlantID om het klantID te tonen. Daarmee heb je de query direct onbruikbaar gemaakt om records mee op te slaan in de tabel facturen, want je hebt, als je een factuur op wilt slaan, in die tabel ook een KlantID nodig. De onderstaande aanpassing is dus nodig om de query werkend te krijgen.
Je zult zien, dat de gegevens bij het uitvoeren er niet anders uitzien, wat uiteraard logisch is, omdat je de klantgegevens op de juiste manier aan de factuurgegevens hebt gekoppeld.

SELECT klantgegevens.Achternaam, klantgegevens.adres, klantgegevens.Postcode, klantgegevens.Gemeente, klantgegevens.[Offerte ref], klantgegevens.[Offerte datum], Date() AS Expr2, Date()+14 AS Expr3, facturatiegegevens.KlantID, facturatiegegevens.Schijf1, [Schijf1]+[Expr6] AS Expr4,
IIf([klantgegevens]![Recht op 6% BTW?]=-1,0.06,0.21)*100 AS Expr5, IIf([klantgegevens]![Recht op 6% BTW?]=-1,0.06,0.21)*[facturatiegegevens]![Schijf1] AS Expr6, totaalvermogenpanelen.Expr1
FROM (facturatiegegevens RIGHT JOIN (klantgegevens LEFT JOIN installatiegegevens ON klantgegevens.KlantID = installatiegegevens.KlantID) ON facturatiegegevens.KlantID = klantgegevens.KlantID) INNER JOIN totaalvermogenpanelen ON klantgegevens.KlantID = totaalvermogenpanelen.KlantID;

Kijk eens of deze variant wel geschikt is om records te maken?
Overigens heb ik verder nog geen inzicht in je factuurtabel, dus ik weet niet of alle velden uit die tabel wel in de query zitten.

Nogmaals, als je een query wilt maken om records in een tabel op te slaan, zorg er dan voor dat je alle velden uit die tabel opneemt in de query, en vul de query aan met overige gegevens die je wilt zien, zoals je ook hebt gedaan.
Neem zowiezo géén sleutelvelden op in de query, want dat betekent automatisch dat je query niet meer goed zal werken....

Als ik de query zo bekijk, kan er trouwens nog wel meer verbeterd worden aan de database; ik zie bijvoorbeeld aan de velden klantgegevens.[Offerte ref] en klantgegevens.[Offerte datum] dat je geen aparte tabel hebt voor offertes; tenzij ik mij sterk vergis, kun je maar eén offerte nummer en offerte datum opslaan, en zelf zou ik daar absoluut een andere tabel voor maken!

Michel
 
Laatst bewerkt:
Michel

bedankt voor je antwoord...

ik heb de query aangepast, maar zie geen verschil (zoals het hoort).
even voor alle duidelijkheid, die query is gebaseerd op enkele tabellen (vb klantgegevens, installatiegegevens, ...) maar niet (nog niet) op de tabel facturen. (die heb ik nl nog niet)

ik heb een tabel met gegevens voor de facturatie, maar de eigenlijk gegevens van de factuur wil ik in de tabel "facturen" opslaan. "facturatiegegevens" bevat informatie over het bedrag, wat er al dan niet betaald is, enz, maar hieruit wordt enkel het bedrag gehaald voor de factuur

dus, ik heb de query nu aangepast, hoe zorg ik er nu voor dat al de gegevens die men query weergeeft in men tabel "facturen" terecht komen? ik veronderstel dat ik dus alvast een tabel "facturen" aan moet maken, met als velden al de gegevens die men query weergeeft?

dat lukt me nog, maar hoe krijg ik dan die gegevens er in?

mvg

Dj NRG
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan