Link to home
Start Free TrialLog in
Avatar of Nothern_Lights
Nothern_Lights

asked on

Multiple transactions POS software

Hey Experts

I am making POS software for a company.

The company have asked for the software to be able to handle multiple transactions

The problem is i dont know how to Implement it in visual basic i was thinking about multiple arrays

I am using a Microsoft Access Database.

Thanks

Northern_Lights
Avatar of [ fanpages ]
[ fanpages ]

Do they mean multiple concurrent transactions?  i.e. a multi-user application where more than one transaction can be in progress on separate POS terminals at any given point in time.

Or, do they mean that they would like the facility for the POS terminal operator to 'park' the current transaction, open a new transaction, progress this until completion, then return to the first transaction, 'unpark' it, and continue with that?

Please advise further, after gaining clarification from your client, if necessary.

Thanks.

BFN,

fp.
Avatar of Nothern_Lights

ASKER

Sorry about that fanpages

The facility for the POS terminal operator to 'park' the current transaction, open a new transaction, progress this until completion, then return to the first transaction, 'unpark' it, and continue with that is what the client wants.

Thanks

Northern_Lights
Personally, I would create a Visual Basic application with a Multiple Document Interface (MDI) Form environment.

I would offer a "New Transaction" menu item (or button) & this would create a new form.  A record would be created in the database with a temporary transaction reference.  When the transaction is confirmed the reference would be replaced with a normal reference (so that you could distinguish between temporary & confirmed transactions).

Many "New Transaction" forms could be opened concurrently, and confirmed in any order, or a temporary transaction form could be closed (and the information would be retained within the database for subsequent selection/re-opening).

I would not progress using arrays to store data unnecessarily, if you have a dedicated database.

BFN,

fp.

fanpages has a good idea. But not sure you even need to save with temporary transaction reference. Why not just wait until the operator clicks the Accept button or presses a special key like "F10" or something. You could also have a button "Hold" which would simply minimise the form. You can open as many MDI child forms as you need.

MDI form gives you a kind of desktop. Minimized forms just stack up along the bottom of the form. The operator just clicks on a minimized for to reopen it. No need any data.

When you open the form for each new transaction:

On Application startup or perhaps a key combination Alt/N

Sub OpenPOS
Dim frm As frmMyChild
Set frm = New frmMyChild
frm.Show
End Sub

After a transaction is complete, the is no need to reopen a new form just reset the variables.

On your pos form you could have a Hold button or key combination say ALT/H

Private Sub cmdHold_Click()
Me.WindowState = vbMinimized ' place transaction on hold
OpenPOS ' automatically open a new POS screen for next customer
End Sub

"fanpages has a good idea. But not sure you even need to save with temporary transaction reference. Why not just wait until the operator clicks the Accept button or presses a special key like "F10" or something."

My reasoning was in case of application/machine failure.  Following a re-boot/re-start you would not need to re-key everything.

I also did not know if the system was a mail order (distance selling) concern or high street store, the ability to save details for retrieval later, not necessarily the same day, may be useful.

BFN,

fp.
Can fanpages or inthedark explain in more detail how to carryout multiple transactions using MDI forms I have never used them before.

Can i upload the current Beta of the POS to a server so you can see what the interface is like and the problem?

Thanks

Northern_Lights
fanpages in a pos system if the system fails the computer manager and computer programmer both get sacked.  Just a few minutes after all of the customers walked out of the store. When the store manager reports his turnover for the week to the head office his job is on the line too.
I worked for an software house specialising in EPOS software & hardware for over 5 years.  Do I sense you've had experience here too?
MDI Applications

1) New project
2) Right click on form1 and select remove
3) Project, ADD MDI Form
4) change the name of the form to frmaMain or something, import  to give a name so will always be at the top of the forms
5) Add a picture box to the form just deep enough to put icons onto it like New, Save , Print, etc. The picture box will lock to the top of the form. Later you can add command buttons and put graphics on the buttons to act as your tool bar. Or you can use a cool bar but this can be a pain.
6) Right click on the mdi form and create the pull-down menus you will need like say: File, Edit, View, Window, Help, etc.
In the File menu add a menu item like New. Save the menu scrutctrue.
7) Click on file, New to show the code window and slap in a call to the OpenPOS sub.
8) Project , Add Form. Edit the form's properties and make sure that MDI child is selected and also show in task bar is set to false.
Edit the form's font so that it has the normal font styling that you wish to apply to you whole application.
In the add a few subs like this:
Public Sub SaveData()
End Sub
Public Sub PrintData()
End Sub

This is done so that if the operator clicks on a print icon, or selects the File-Print menu option. The code will look like this:

Sub mnuPrint()
Screen.ActiveForm.PrintData
End Sub

And for saving:

Sub mnuSave()
Dim frm as Form
On Error Resume Next
For each frm in Forms
   frm.SaveData
Next
End Sub

9) Select "Save As" and save the MDI Child form into the Projects Templates folder (normally C:\Program Files\Microsoft Visual Studio\VB98\Template\Forms)

Give the form a name like MDI Child.

Now remove the MDI child form from the project.

10) Projects, Add, Form, now select the MDI Child template. Change the name of the form to something like
frmcPOS

(frm then c, the c keeps all child forms together under the master form)

11) Add a module and create the OpenPOS Sub which is used by the

Sub OpenPOS
Dim frm As frmcPOS
Set frm = New frmcPOS
frm.Show
End Sub

12) In the MDI form the main application for (frmaMain) add into the form_load event

OpenPOS ' main data entry form will auto show at startup.

The application will now run. You add code as needed until the app is complete.

13) Customise your pull-down menus. With short-cut keystrokes. Like File-New could be ALT/N.
Prefix your pull-down menus &File, &Edit and sub menus too So that operator can also type ALT/F/N

etc.



My FTP Server is 192.168.1.2

Login Name = Experts Exchange
Password = Experts

Thanks

Northern_Lights
Sorry?

Why are you providing log-on information to your LAN?
Yes but mostly with head-office interacing, pricing updates and store signs systems, etc. Have done some till apps. Very serious processes. And sometimes with trade discounts, settlement discounts, BOGOFFs, multibuys. It was just one small step to do the same thing for web-site shopping baskets.

So I sugest that Nothern_Lights has a think about where the company is going before starting to code too much.

You could make your VB app work from a web-server.  In some ways this makes the app quite easy as you don't need to get envloved with so many events. But for bulk input, bar code readers etc. it more likely to be an MDI App.

I would write all of the code arround a couple of classes: OrderHeader and OrderLines.  In this way you can use the same code in your MDI child as you do in your web-site to work out totals, costs, discounts, multi-currency issues etc.
 
inthedark

I am interested in VB app work from a web-server how would i go about doing this

do you have any examples

Thanks

Nothern_Lights
Sorry to shake your world but you will not be able to create a reliable POS system using MS Access and VB arrays.
Web system would be a little complicated as you would need to create activex to handle input from bar code readers etc.

nmcdermaid I suspect that Nothern_Lights is using a VB client to access the MS Access database.

Web apps:

1) The client browser sends a Request to a server. This is done using the URL.

http://myserver/myfile.asp?field1=data1&field2=data2

The request is defined like this:

protocol//servername/documentname?querystring

The operator cannot se it but each time a browser sends a request, it also sends any cookies that the server has given it before. The first time a server receives a request from a scpecific client the server starts a session. A session is like a bucket called the Session object. The software can put stuff into the bucket. Each client has a different bucket. The contents of the bucket stay on the server.  If the operator does not make a request for a few minutes, say 20, the bucket gets emptied (session time-out).

In the example myfile.asp will start to run.  The ASP file is simple and just sets going a VB DLL which you create using ordinary VB using the ActiveX DLL new project model.

As simple ASP page will look like this:

Dim MyDLL
Set MyDLL = Server.CreateObject("MyProject.MyClass")
MyDLL.Run Server, Session,  Request, Response ' process the request

The main IIS objects Server, Session,  Request, Response are passed as parameters to your application

2) The class  decodes the querystring and sends a Response. The response can also include cookies, to identify the user.

The response can include either information or data entry fields.. The response can also include DHTML and scripting, so that when the opertor does stuff code runs in his browser to perform specific tasks. When data entry fields are present they can be returned to the server as a block of data, called POST or as URL fields known as query string fields.  This is control by the HTML.

So how does the software know what data to display:

Private Sub Display
' Create html to send back to the client
sPage =LCase( Request.QueryString("page"))
Select Case sPage
    Case = 'order': DisplayOrder ' run the subroutine to display the order
    Case = 'info': DisplayInfo ' run the subroutine to display some info
etc.
End Select
End Sub

Sample HTML:

<html>
<body>
<form method='post' action='http://server/myfile.asp?page=order&user=12345'>
Enter product code:
<!-- this is a comment. The following hidden item is present on all forms in the system -->
<input type='hidden' name='HID' value='order' size='0'>
<input type='text' name='code' value='ABCDE' size='10'>
Price: <input type='text' name='price' value='10.34' size='10'>

<input type='submit' name='action' value='Add'>
<input type='submit' name='action' value='Hold'>
<input type='submit' name='action' value='Cancel'>
</form>
</body>
</html>

3) The client decodes the response and display the web-page. The user types in the data and clicks on a button (Submit input type). When a submit button is clicked the data in the form is sent back to the server as a new request.

So the Run subroutine will look like this:

Public Sub Run(pServer, pSession, pRequest, pResponse)

' web apps must be very good at recording problems
On Error GoTo ErrorTrap

mSaveTickcount = GetTickCount ' we will want to know how long it took to create a request

' set up IIS objects to be visible throughout the application
Set Server = pServer
Set Session = pSession
Set Request = pRequest
Set Response = pResponse

' Is this a new user?
If Val(Session("UserID")) < 1 Then
    StartSession ' call the sub that sets up data and cookies for a new session
End If

' Log the details of the Hit
LogHit "S"

' Is data present in the request object
mbRequest = Len(Request("HID")) > 0
If mbRequest Then
    HandlePost ' save the incomming data
End If

If OutputMode = Failed Then
    GoTo ReportError
End If

' Did the handling of the response cause a new URL to be needed?
If OutputMode = Redirect Then
     Response.Redirect msRedirect ' tell the client to request a new page
     Exit Sub
End If

' Create the HTML
Display
If OutputMode = Failed Then
    GoTo ReportError
End If

' perhaps display sub needed to go elsewhere
If OutputMode = Redirect Then
     Response.Redirect msRedirect ' tell the client to request a new page
     Exit Sub
Else
      Response.Write msHTML ' send the response to the client
End If

sStatus = "OK"

Exiter:
LogHit Status ' logs details of hit and time taken to process
Exit Sub

ErrorTrap:
ErrN = Err.Number
ErrD = Err.Description

ReportError:
On Error Resume Next ' prevent looping

LogError ' send email with details of any errors
sStatus = "FAIL"
GoTo Exiter

End Sub


 
Whatever he uses as a client, MS Access is not a 'recoverable' database. Its just not reliable enough.

Anyway I don't seem to be adding anything constructive so I'll bow out now!
nmcdermaid does have a good point.  Access can be used for vaildation of data. But best place to save POS transactions is a text file using good old binary access opens which support sharing and locking. Which can then be imported by a procedure which can handle recovery.
inthedark

So what you are saying is that I need to have a procedure to write the all the transaction information into a temp text file and then once the transaction is done clear the text file.

Inthedark do u have IM client or a e-mail address I can contact you on?

Thanks

Nothern_Lights
No dump the sales transactions into a text file. DO NOT UPDATE YOUR DATABASE WITH LIVE DATA. If your database is down you can carry on trading. You then have a diffent process that updates the database.  In this way you can change the back-end database without affecting the POS or change the pos without affecting the back-end. back-end = sales and stock levels data.  You can update stock levels live if you want but codes needs to be able to work offline.
"Inthedark do u have IM client or a e-mail address I can contact you on?"

All correspondence should be restricted to comments posted here only, as private messages can be seen as one Expert having an unfair advantage over any other.

I am getting a error when i try to run the code Sub OpenPOS

Sub OpenPOS
Dim frm As frmMyChild          - Compile Error "User-Defined type not defined"
Set frm = New frmMyChild
frm.Show
End Sub

The Code for the VB Web Server App there is an error
Set MyDLL = Server.CreateObject("MyProject.MyClass")  - Compile Error "Invalid Outside Procedure

Help

Thanks

Nothern_Lights
I have another problem i am trying to read inforamtion from the form caption but its reading the origional caption text not the one that is on screen

In the frmSaleToClient properties i have in the caption "Sale To Client"

but i have changed it to show the Transaction ID using the following code

Dim frm As New frmSaleToClient

Transcode = Transcode + 1

frm.Caption = Transcode

frm.Show

then in the

frm_load

I have lblTest.Caption = Me.Caption

so i should read "1" but it still says "Sale To Client"

How do i fix this problem

Thanks

Nothern_Lights
All FYI:
"Giving a Form a Unique ID"
[ https://www.experts-exchange.com/questions/21895348/Giving-a-Form-a-Unique-ID.html ]

I am going to respectfully retire from this question as it seems to have moved on since I made my original comments.

BFN,

fp.
frmMyChild was just an example form name.  You should use whatever name you gave to your MDI child form.

Also "MyProject.MyClass" was an example. If you want to go the web-server route you ned to create an ActiveX DLL project. You need to have at least one public class. So you would change MyProject to whatever you called your project and
change my class to be the name of your public class.
 
ASKER CERTIFIED SOLUTION
Avatar of inthedark
inthedark
Flag of United Kingdom of Great Britain and Northern Ireland image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
inthedark

It is possible to use and SDI interface instead of using MDI

Thanks

Nothern_Lights
Yes you can create new forms in sdi in the same way. The difference is that you have to keep a track of which forms you created.

Thanks for all your help inthedark my program can now handle multiple transactions :)

Nothern_Lights
Cool. Now all you have to do is make sure it will never crash!