Storing Invoices in MySQL - mysql

I wanted to get some advice on how to go about storing invoice data in a mysql database.
My first understanding would be to have two tables..
Invoices & Invoice_rows..
Invoices would hold FK to Client ID, invoice number, invoice date, paid or unpaid flag
Invoice_rows would hold all the items to invoice, FK to invoices, description, price, tax
Only thing is after the invoice is created it might need to be updated.. spelling mistake, extra item needed to be added etc. So for this is i will first need to query to get all of the rows, then I will need to execute multiple updates to all the rows every time a change is made.
Would storing all the rows as JSON in a text field for each individual invoice in the single invoices table work well or cause more of a problem? the fact that all rows will need to be updated regardless if there was only a change to one row upon save makes no difference just converting it to json and replacing the text field with the new JSON surely? The JSON wouldn't need to be searchable either as it's the client that will be searched and will list all of their invoices based upon their ID.
Any recommendation to make this efficient and easy to work with is most appreciated!

Just keep track of the changes in the front end and call your AJAX method when they're done. The method should take the invoice number and any updated rows including the PKs.
Do NOT store JSON in the database. That would be a truly awful thing. JSON is just a useful mechanism for transit and your choice of UI. It is not your data but a temporary transformation of it.

Related

How do I prevent creating a new record in MS Access 2010 before the current record is correctly saved into the table

Situation
I've created a database for making invoices and similar documents. As we know these documents must be numerated progressively and univocally without any missing number from one invoice (or other document) and the following.
For this reason I added an auto-number field to the table that is the number of the invoice or other document.
As we know MS Access creates a further new record just in the moment something is inserted / edited into the current/new record. So there is a new record no mater what, just right after the user has been started editing the former new record.
So if the db user starts editing a new invoice (or any other doc) just for doing exercise or practice without the will to save and print it but just exiting from the record with the Esc key when he makes mistakes or meet problems that cannot solve yet, a documento number is lost and a hole in numbering remains that cannot be recovered in next new record no mater what.
The problem to solve
How do I set MS Access to create a new record not when the previous former new record is just edited but when it is saved by the user? In this way missing numbering in auto-number fields will be prevented.
In other words how do I populate an auto-number field only when the record is "officially saved" instead of in the moment I start editing the new record?
autonumbers are for internal use only (that means you the develper of the application). For example, when you load a word document, the OS issues a memory segment location - you as a user of word don't care.
The same goes for autonumbers. They are for developers to create relationships between tables. they CAN NOT be used for things like invoice numbers etc.
Even if you move to a new record, start typing, the record is NOT yet saved. However, a NEW auto number will have been issued. If the user hits ESC key, or edit->un to NOT save the record, then the auto number will have not been saved - but now you have a gap in auto numbers. So if a user decides to not save a record, but has started typing in that record, the auto number is issued (and used up). However, if you don't save that record, and the user decides to not add (save) the record, then you will find a gap.
As a result, it is not practical to attempt to use auto numbers this way. You will find the same for Oracle, SQL server, and the vast majority of database systems. The simple and bottom line is such numbers are for you the developer to create and setup relationships. They have ZERO to do with things like invoice numbers etc.
Auto numbers are for relationships. The fact that you want to relate customers to say invoices has ZERO and NOTHING to do with the fact that you have, or have not some invoice number. Why should a whole application break down and your relationships stop working because you don't have some silly invoice number? A invoice number has ZERO ZERO to do with some internal auto number. You might make invoice numbers required, but then again I worked with some systems in that the invoice information is entered, and until such time the invoice is approved, or actually sent out, the invoice number is blank until such time it is approved or sent out. Regardless of some business rules, and even if a invoice number is required, it has nothing to do with auto numbers and relationships you setup. Such relationships will work with, or without a invoice number.
The answer is you cannot and should not use auto numbers in Access for external meaning. There is simply no practical way to control the next number, and to control missing gaps.
Worse, it is HIGH unlikely that such invoice numbers will start at 1. And many companies adopt a system in which each invoice sent out to a given customer does NOT revel for example how many invoices were issued since the last one (this can give away valuable information to your customers).
If you need some incrementing invoice number?
Then YOU the developer have to build and setup a system based on your requirements.
So, I would think that this requirement is something more then just a number starting at 1, then 2, then 3 etc. And you VERY much want the ability in your application to set the next or starting invoice number.
There are as many ways to do this as there are flavors of ice cream. However, a typical and common approach is to setup a small table.
So create a table called tblNextInvoice.
It will look like this:
tblNextInvoice
ID: autonumber PK - you want one of these for all tables.
NextInvoice: long integer. - this is your next invoice number table.
This table will have ONE row. In the above table, simply enter into NextInvoice the next invoice number you want invoice numbers to start at.
Now, in the before update event of your form:
if isnull(me!InvoiceNumber) = True then
' about to save record - set the invoice number
me!InvoiceNumber = GetNextInvoiceNum()
End if
And you need to create a public function (placed in a standard code module - not the forms code module. It can look like this:
Public Function NextInvoice() as long
Dim myRST As Dao.Recordset
set myRST = Currentdb.OpenRecordSet("tblNextInvoice")
NextInovice = myRST!NextInvoiceNum
myRST.Edit
myRST!NextInvoiceNum = myRST!NextInoiceNum + 1
myRST.Update
myRST.Close
End Function
So, if you want to ensure no gaps, be able to set the the starting, and you want control over creating a invoice number?
Then you as a developer must setup, create, and design your invoice number system. Because the system is custom, then you can include say 01152020-00012 types of format (So this sample number has the month, date + a sequence number. You might even has a design and development meeting with your accounting people as to what kind of format and even government regulations are required for your invoice numbering system. So that custom get next invoice does not have to be limited to JUST a number - you can include some string values, and change that function (and invoicenumber) to a text type column as opposed to just a number type of column.
For example, I have some software running for volunteer groups, and some church groups - because of their non-profit status, there are now in place some government regulations as to the format of the invoice(s) issued. And this is especially for the case of receipts numbers issued.
When receipts are issued, then not only must the receipt show the new receipt number, but ALSO show that the receipt issued is a replacement for receipt XXXX has to be clearly marked (this is to prevent someone asking for a 2nd receipt of a donation, and submitting it two times for a double tax deduction. So, now you not even allowed to issue a receipt with the same number two times to a donor! (they must show a new number, and ALSO the number it is replacing).
So, regardless of these issues, in near all business systems, YOU the developer will need complete control over how such numbers re to be issued - and you can't leave this issue to chance, nor can you leave this issue to auto numbers either. This types of numbers are for business rules and business operations - they have nothing to do with using auto numbers to setup some relationships in a database - and relationships are 100% separate concepts from that of business things like invoice numbers, or receipt numbers etc.
Sql server doesn't increment anything if you abort insert operation or there is an error.
In ms access this is not true. Autoincrement does always increment and this is very annoying!
In sql server, if you start to write a new record and abort it, the identity increment doesn't increment. Same thing if you write a new record and cause an error of type data inserted.
In sql server autoincrement does increment if you have an external primary key related and you try to relate wrong id causing error.

How can I create a table that uses an equation to average data from another table?

I have a table that contains data from repeated experiments (for example, site A has one sample, and the lab processed the sample three times obtaining slightly different values). I need to average these results in a separate table, but what I have read on the Microsoft support site is that a query that pulls data into another table with a calculated field is not possible on Access.
Can I query multiple data points from one table into a single calculated field in another table? Thank you.
UPDATE
I ended up doing a lot of manual adjustments of the file format to create a calculated field in the existing table that averages each sites data, so my problem is, for my current purposes, solved. However I would still like to understand. Following up with you both, I think the problem was that I had repeated non-unique IDs between rows when I probably should have made data columns with unique variable names so that I could query each variable name for an average.
So, instead of putting each site separately on the y axis, I formatted it by putting the sample number for each site on the x-axis:
I was able to at least create a calculated field using this second format in order to create an average value for each site.
Would have there been a way to write a query using the first method? Luckily, my data set was not at all very hefty, so I could handle a reformat manually, but if the case were with thousands of data entries, I couldn't have done that.
Also, here is the link to the site I mentioned originally https://support.office.com/en-ie/article/add-a-calculated-field-to-a-table-14a60733-2580-48c2-b402-6de54fafbde3.
Thanks all.

Design - Microsoft Access - Unique "Serial" Number

I am looking for some design techniques to achieve the following:
A 3-part serial number that is generated upon record entry. Format Example: 25-001-14
The number is used to track yearly records from various locations.
The first part states the location the record is associated with, this would be a user input during record creation.
The second part is the record number, I would like for this to be automatically generated, but needs to be sequential and separate for each location and needs to reset each year.
The third part is the two digit number for the year the record was created in. I would like this to be automatically generated if possible. Note: I am currently not concerned with when this cycles back around and I face redundant data issues.
I'm thinking I would like records to be stored in multiple tables that are separated by location, if this would help things!
Any ideas would be greatly welcomed.
I think I would use 3 key fields - one field each for location, record and year. The location and year fields would be created when you get the input to create new records. I would set up a query to find the last record number used by location and year and use that query to assign the new record number when you create a new record. The concatenation of the 3 fields would be the key you described.
With a key field for location, separate tables are not necessary unless that's useful for other reasons. I would probably use just one table - you can always filter the records by location anytime you need to.

How can I have a database table with only one time for each day?

Hi I am developing a Taxreturn Program in Java language and is my first time I am developing a program with database. I have three Forms which means I need three tables in my database where I am going to store information of each form. My first Form is for customers the second is for bookings and the third is for tax records I have successful make the customer form work with the database but i got stuck in the booking form as i need the correct syntax.
in my booking table i need to store the date, time as Is logical I have to have only one booking time for each day how can i do that. I will appreciate any help thanks
It depends on the type of the field.
If field is Date, some implementations assume the time is 00:00:00 ... Many of them simply store the exact timestamp, but truncate and give you the value, as required.
Best way to do it is when inserting, manually specify the exact time yourself. This is the most cross-database way of doing things.

Microsoft Access 2010: Update a field in another table on button click

Basics about the database
I am working on a (relatively) simple database that stores inventory data. I am using Microsoft Access 2010 in order to do this. I have six tables with the following relationships:
Relationships of Database
I have created forms which combine the Transaction table with Ordered, Received, Allocated, or Dispensed. Each form requests an amount which will then be used to update On Hand, On Order, or Allocated (from the Material table) respectively.
The Problem
For example, my form to update Transaction and Order should be able to take in the Amount ordered, save all the data from the fields to the Transaction and Order tables as well as add the amount from Amount to On Order in the Materials table.
I have been working on this database for the past two days. I have searched several times for possible ways to perform a similar function, but have come up with nothing. All the tutorials I have found which seem remotely close to what I need to accomplish are for versions of Access which are much older than 2010. Unfortunately I have had little experience with the actual coding within Access, so I am stuck clicking around within the buttons on its menus.
What I have tried
Currently, the program is set to run the following Update query:
Screenshot of update query
This query works if I have one Material stored in the database but adds all the Amount values from Ordered to On Order every time it is ran, which is unfortunately not what I need it to do. I only need each Amount value added to On Order once.
You need to relate the Ordered and Material tables by adding a foreign key field to the Material table, ex. OrderedFK (Long Integer). This new field must be updated whenever a row is inserted into the Ordered table (assuming the "No" Field is AutoNumber). This is typically performed by using a Form (Ordered) and Sub-Form (Material) and setting the sub-form' Link Master (No) and Link Child fields (OrderedFK).
You can then join the Ordered and Material tables on the Update Query to achieve the desired result.