how to pass dictionary through openargs

hey guys,

how do i pass a dictionary object from one form to another? i'm trying to pass it through the openargs - which is a variant. but i can't and i'm not sure why.


Dim dicOpenArgs As Variant 'if i dim dicOpenArgs as Dictionary it also doesn't work
    
    If IsNull(Me.txtDate) Or IsNull(Me.cmbReconciliationAccount) Then
        Call MsgBox("Please fill in both Reconciliation Account and Date before adding a Manual Entry!", vbInformation, "Reconciliation Account and Date Required")
    Else
        Set dicOpenArgs = New Dictionary
        dicOpenArgs("ReconciliationAccountID") = Me.cmbReconciliationAccount
        dicOpenArgs("TransactionDate") = Me.txtDate
        dicOpenArgs("ParentForm") = Me.Name
        DoCmd.OpenForm "frmRecon_NG506Balancing_CreateManualEntry", , , , , , dicOpenArgs
    End If

Open in new window

developingprogrammerAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Rey Obrero (Capricorn1)Commented:
try something like this

Dim dicOpenArgs as object
set dicOpenargs= createObject(Scripting.Dictionary)
     
dicOpenArgs.add "ReconciliationAccountID", Me.cmbReconciliationAccount
dicOpenArgs.add "TransactionDate", Me.txtDate
0
developingprogrammerAuthor Commented:
guys i found it

http://www.access-programmers.co.uk/forums/showthread.php?t=221978

any criticisms to this method?

another poster had problems with it using a UDT - but a UDT is not an object anyway.
http://www.utteraccess.com/forum/Pass-Object-Openargs-t1967468.html

any criticisms to this method is most appreciated guys. thanks!
0
Rey Obrero (Capricorn1)Commented:
i thought you want to use "dictionary"!!
0
Determine the Perfect Price for Your IT Services

Do you wonder if your IT business is truly profitable or if you should raise your prices? Learn how to calculate your overhead burden with our free interactive tool and use it to determine the right price for your IT services. Download your free eBook now!

developingprogrammerAuthor Commented:
yup yup capricorn1 i want to use dictionary however openargs can only be a string so i will instead have to pass the object pointer to it so that in the opened form i can use the pointer to and assign it to a variable so that get the object back

thanks for suggesting dimming it as an object! = ) i tried that however it didn't work = (
0
Rey Obrero (Capricorn1)Commented:
<i tried that however it didn't work >
how it didn't worked?

anyway, you can pass a string as openargs..

something like this

dim strArg as string

strArg = Me.cmbReconciliationAccount & ";" & Me.txtDate & ";" & Me.Name

DoCmd.OpenForm "frmRecon_NG506Balancing_CreateManualEntry", , , , , ,strArg

in the load event of "frmRecon_NG506Balancing_CreateManualEntry"

private sub form_load()

if me.openargs & ""<>"" then
    me.ReconciliationAccountID=split(me.openargs,";")(0)
    me.TransactionDate=split(me.openargs,";")(1)
    me.ParentForm=split(me.openargs,";")(2)
end if

end sub
0
developingprogrammerAuthor Commented:
Whao capricorn1!! I didn't know about the split function!! I was about to write one myself haha. Thanks!! = ))

But what so you think of Chris O's object pointer method? Thanks capricorn1!! = ))
0
Rey Obrero (Capricorn1)Commented:
that will work, but why will i have so many codes where i can accomplish it in a very simple way using few lines of codes
0
developingprogrammerAuthor Commented:
Yup good point capricorn1 but I guess being able to pass objects instead of strings allow us to pass recordsets and other things? Yes can open recordset at form load but I think gives us more options for other techniques = )
0
Rey Obrero (Capricorn1)Commented:
i don't know what you will gain from doing so.. i always keep things as simple as possible.
0
BitsqueezerCommented:
Hi,

passing an object is simpler than you think, but not with OpenArgs (although I'm sure that the author of your link has tested that, I personally try to avoid direct access to memory specific APIs especially with VBA variables/objects, I'm always unsure how VBA uses this if it is not produced by VBA...)

1. Create a Public Property with the object type you want in the form you want to open.
2. Use DoCmd.OpenForm with acHidden to open the form hidden.
3. Set the property using the object you want to pass
4. Make the form visible by using DoCmd.OpenForm as normal.

Of course the Open/Load events and so on are executing at the first OpenForm so you can't use them, but as a property is a procedure you can do anything you normally would have done in the Form Load event here instead.

This doesn't work if you want to open a form with the parameter acDialog which normally waits after OpenForm with code execution until the opened form is closed.

Cheers,

Christian
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
developingprogrammerAuthor Commented:
Cool!! Great idea with the Public Property in the called form Christian!! Thanks once again!! = ))))
0
developingprogrammerAuthor Commented:
Thanks capricorn1 too!! = ))
0
BitsqueezerCommented:
Hi,

I made a simple demo for you to show you how you can open a form in the object orientied way multiple times and how you can pass an object to the called form and back to the parent and in the end clean up the collections.

Cheers,

Christian
OpenMultipleFormObjects.zip
0
developingprogrammerAuthor Commented:
whao! thanks so much Christian!!

i went through the database twice already but spent time understanding different parts. will go through it a few more time after i grab a quick bite.

hrmm Christian what's the difference to you between a Public Variable vs a Property?

cause in your form class headers you put a Public Variable under your Property comments heading.

when do you use an actual property and when do you use a public variable as a property?

the answer i can think of now is - if you want to do something more than just directly set the variable, then use a property cause you can assign the value and do things at the same time tightly coupled.

right now i'm ALWAYS dimming private variables and then using public properties to give other objects access to them. it's quite irritating to keep having to type so much code hahaha but i thought it's the right way so i kept doing it though it keeps raising my blood pressure hahaha = ))

well UNLESS you sanction me using public variables instead of properties Christian then i'll start just use public variables when i don't need to do anything else other than just setting the variable!! = ))
0
developingprogrammerAuthor Commented:
i think i'm a do things right machine hahaha (or at least i try to be!! = ))   )
0
BitsqueezerCommented:
Hi,

you're right, that's exactly the difference: If you do not need to have any kind of control over the properties, it's enough to use a public variable, a property procedure is only useful if you want i.e. check the value, make a read/write variable to be read only or write only and so on (didn't I already told that to you in the long answer about properties?...;-))

Cheers,

Christian
0
developingprogrammerAuthor Commented:
oh no!!! forgive me sir!!!! i will do my best to remember what you've taught me before!! = ))
0
developingprogrammerAuthor Commented:
ok Christian! got rid of the memory pointer and started using public properties for my forms already = )) thanks!! = ))

the work around for acDialog forms is that on form load, i will go to the parent form and get the dictionary object and set it to the acDialog form's dictionary property object

thanks Christian!! = ))
0
developingprogrammerAuthor Commented:
and how i handle different places calling the acDialog form is i call the acDialog form with the parent form name in the OpenArgs and in the OnLoad event for the acDialog form i have a select case statement which tests the openargs for the parent form name to get the dictionary from the different parents = )
0
BitsqueezerCommented:
Hi,

no, it's like in nature: The child should not control the parent, the parent should control what the children has to do.

So not the child should find out the parent, the parent should fill a "Parent" property (should not be named "Parent" as that is already in the properties of controls/forms) in the child object so that this can access the parent in a generic way without knowing which parent has opened it (that differs a little bit from nature...;-)  ).

Exactly that's what an Interface can do for you: If you implement some standard properties which you can use in such cases you can be sure that all needed elements are available in the object which implements this Interface. One could be something like "MyParent".

You can't simulate what acDialog does, this parameter can only work in this single scenario: If you directly use it within OpenForm. If you would, for example, open the form first in hidden mode and then try again OpenForm with acDialog to make it visible the acDialog does not have any effect.

So the better way is to design the parent form in a way that it simply does not need the acDialog. Like in the demo above: The parent form opens the child and then it doesn't wait to come back, it will be inactive until the child form fills the property of the parent form which then can go on working with the returned result. The result for the user is the same if you switch the modal property of the child form to True: Any other form cannot be used anymore until the child form will be closed.
If the child form is closed and have returned the value to the parent form this can go on working with it - and as the child was informed before who IS the direct parent it will report to this one only with no need to search through any collection and of course not by name which is very unsecure as you have seen in the demo above where any child form has the same name. Without using a parent reference the child form could not be found if the child form would open another child form and this one would need to find out now which of the ten opened forms is the the right one - but if the grandchild has also got a reference to the right child form it's no problem to directly report to exactly this one and so the acDialog is never needed.

Cheers,

Christian
0
developingprogrammerAuthor Commented:
Whao Christian great explanation! I was thinking of it quite a bit today. I think more than writing good nice code, now I have to learn how to write code that is logically flowing according to nature's paradigm so we have an already familiar paradigm to structure our code mechanism.

Hrmm Christian how about custom input forms? Access has trained newbies like me to expect code to halt whilst users input their values. And sometimes this code pausing makes sense.

Does your custom input form halt the code? And if it doesn't, doesn't that change the structure of your method? Getting all the variables before running something.
0
BitsqueezerCommented:
Hi,

a good workflow is always a good idea, but it doesn't need to rebuild nature structures...:-)
It should only be oriented maybe to a user or business workflow, whatever needed in a situation.

Yes, you're right, code pausing would be good in some cases but with acDialog there is only one possibility: Using it or not and if, you can't use properties to fill something, you can only use OpenArgs.
My own InputBox replacement (and also my HTML-MsgBox replacement) uses a Do..Loop with DoEvents where a "Sleep 100" call to the Windows API avoids executing DoEvents too much, that works good. I've experimented a lot with this issue but didn't found a better way, maybe someone else has a better replacement for acDialog code pausing. There are a lot more in Windows APIs so maybe there is a wait function which would work in this scenario (but it must prohibit that Access gets in "not responding" state).

But that method is not forcibly needed (using any kind of code pausing): You can also insert a public event or the callback property method I've shown you in the demo database to inform the calling parent form that something has happened and the called child form can get closed. This method only needs to separate the steps into different procedures if you want to avoid the Do..Loop method. I.e. like this:

Private Sub Form_Load()
'    Not possible, as MyInputBox doesn't pause the code
'     strMyVariable = MyInputBox("Please enter something")
'    Alternative:
    MyInputBox "Please enter something"
End Sub

Public Property Set Answer(strAnswer As String)
    Static intStep As Integer
    Select Case intStep
        Case 0
            MyVariable = strAnswer
            procStep2
        Case 1
            MyVariable2 = strAnswer
            procStep3
        Case 2
            MyVariable3 = strAnswer
            procStep4
    End Select
    intStep = intStep + 1
End Property

Private Sub procStep2()
    ' Do something
    MyInputBox "Next input #2"
End Sub

Private Sub procStep3()
    ' Do something
    MyInputBox "Next input #3"
End Sub

Private Sub procStep4()
    ' Do something
    MyInputBox "Next input #3"
End Sub

Open in new window


On this way a custom InputBox could always use the public property "Answer" to set the result string and then you have a "dispatcher" procedure (the "Answer" property) which can decide what to do next or if the input was the expected one or whatever. Of course you would not need to always call a new procedure, you can also handle that inside the property. You could also use a public sub here instead of a property (maybe better).

That's no unusual way, MS also uses such approaches. Open a form with a combobox in design mode, then go into the properties of the combobox and click on "Data" - "Row Source Type" and then hit F1 key. In the middle of the help text you'll find a hint that you can also use a user defined function for the RowSourceType if you follow a specific way of creating it. Click on "specific function code arguments" which opens the code example (you can also find it in msdn here).
There you'll see that the sub is controlled by changing the "code" parameter so the the Select Case can do different things depending on that value.

The same here, only that I used in this example a static variable so the code goes on with every new call to the custom input box.

You see, there are also other possibilities, but maybe need a little bit more work to do.

Cheers,

Christian
0
developingprogrammerAuthor Commented:
WHAO Christian! another super great sharing that i can learn so much from = )

1)  "I've experimented a lot with this issue but didn't found a better way, maybe someone else has a better replacement for acDialog code pausing."

translated in my mind

"it's a great idea to go to a casino to see if i can find a better way of making money!! = ))  "

errr.... NO. so there is no better way and i will stick to your way hahaha = )))

2) whao super cool! i also thought of this splitting the workflow procedure into smaller procedures and using a "dispatcher" procedure when you first told me about the events and custom inputbox a long while ago haha (that's why i was so stressed then!! but not like i'm less stressed now hahaha = PP  )

but to hear that that's what you would do as well puts an offical stamp APPROVED to that method = ))

P.S. i always never liked the term dispatcher - i always thought it was a counterfeit name for controller - but controller is already used in MVC so can't us it in my programming anymore = ((( haha - or rather i haven't figured out the naming convention yet!! so i'm staying away from it!! = )) do you use the name controller in your apps or do you keep the name of "dispatcher" in your mind so that you don't overlap the meaning of MVC controller and procedure dispatcher?

3) ya!! i did read about the UDF for row source - but then immediately averted my eyes onwards cause i knew if i opened that pandora's box a huge atomic bomb would blow up in my head hahaha = PP but soon my head will be able to take it cause i'm slowly wrapping it around stuff!! = PP not the bomb around stuff but my head around stuff!! haha = PPPP
0
BitsqueezerCommented:
Hi,

1+2) no, not anything which I tried out and actually use is meant to be automatically the best way. I'm not better than other experts, we all are learning every day and maybe tomorrow I find a really better way and would never use the old one again. As I said earlier: Please keep your mind open and always understand the things we all say to you never as "the one and only" way, many things rely on personal preferences or environments, many things comes from "didn't knew a better way, but it works, so what?" and so on. Maybe YOU will be the one which will taught us in future a lot of interesting new ways of doing things better, who knows? Programming is a very creative job and often the things only depends on enough imagination.

3) I did not find a better word, but English is not my native language, you know.. I don't use controller AND dispatcher, as you've seen in the air code above. I don't try to reuse design patterns, I read about them, I see if they are useful (for me), I extract what I think I can use and throw away the rest and follow my own naming conventions. As I am a standalone-programmer all the time I have the freedom to do that (I don't believe that I could work in the programming sector inside of a programming team..)

4) UDF as RowSourceType: Should only show the way how to use a parameter to control the things a procedure does in a callback procedure. I cannot recommend use exactly this method, I experimented with it as my combobox got too small for the number of vendors but it is horrible slow so I think that was also only an experiment of MS but no serious alternative. Any other method is much more faster than that. Maybe useful in a very small number of elements, but in this case it's also easier to use a value list instead or a little lookup table. (Did you saw my new article about AutoComplete TextBoxes...;-)...?)

Cheers,

Christian
0
developingprogrammerAuthor Commented:
whao! new article????!!! cool Christian let me check it out!! but later ya? i'm just so, so, so overloaded now ha = )

i want to apologise to all the other experts helping me now as well but i don't want to post and then let them down so i'm in runaway mode temporarily now!! = PP

sorry all experts it's my fault i'm way way too overloaded but yall are ALL SO FANTASTIC to keep helping me out!!!! = ))

expertsexchange is like the ground for fantastic kharma haha = )

thanks Christian!! = ))
0
Rey Obrero (Capricorn1)Commented:
developingprogrammer,

when you have time don't miss to take a look at this
TempVars Collection

by default, a TempVar object remains in memory until Access is closed unlike module variables that initialize and loss their values when you encounter an error.

you can also use the TempVar object for reports, forms and queries.

my 2¢

.
0
developingprogrammerAuthor Commented:
hi capricorn1!!

sorry for the late reply i missed this out!! (i've got 1,500 unread mails now haha.. = (((    )

yup i've perused it briefly already but i will need to spend a bit more time linking it to the portions of my small brain so that it's connected and digested = ))

thanks for pointing this out to me capricorn1!! = ))
0
developingprogrammerAuthor Commented:
hi Christian! i came back to read your response more in detail and to reflect a bit too ha.

you know, i think that being a stand alone programmer is sometime the best. because, if a group of friend stand at the roadside to flag a cab, everyone will think that someone is going to do it but then eventually nobody does it.

so if we're stand alone, we shoulder ALL the responsibility and we must take all the initiative.

i think being in an environment where people don't understand IT and have more or less zilch knowledge about it / development, it is a double edged sword. people give opportunities more easily cause they are awed by the possibilities of development - but at the same time they don't understand things take it and demand completely impossible timeframes.

however in business development it's always - get the opportunity first and then try and make it happen right?

i think i'm in a unique situation cause of 3 things -
1) i was a completely clueless moron programmer. i just knew it was possible.
2) my work environment knows NOTHING about IT and thus they gave opportunities easy and expected me to finish my project initially in 9 days - it's coming to 3 months now already ha. if i can't wrap this up i'll be gone soon ha. though 3 months is quite fast according to my friend who's the head of investment banking tech in another global bank. 3) i have yall.

can you imagine what it's like for me to have yall?

it's... hrmmm.. not just a forum. not just a google. not just a question and answer.

but rather a support group. pretty much quite that of an emotional support group which gives us real help. camaraderie, coaching and esprit de corp. you know for once in my life i feel i have belonging. once.

i want to write an article about a developer's feelings - lack of appreciation and how to deal with it. how this affects self worth, how this triggers loneliness when we put in 200% effort but our environment's people doesn't appreciate us. how to deal with it. i finally found the solution and definitely want to share once i'm done with my current project.

how to get self worth and confidence from within based on pure logic and reason, not any religion (because people could have different religions) or any subjective matter.

= )

thanks so much for including me in your team Christian, it means a lot to me = )

and to all the experts too who have included me in their team and helped me out too = )
0
BitsqueezerCommented:
Hi,

I'm glad if I can help a promising developer getting better. It's always better to know how you can achieve something on your own so that you can be sure you can do it if you need to do it. In the end you're more independant.

I know about "impossible timelines", my current project is to develop a really BIG global ERP system from ground up, and the timeline is to do a rollout at beginning of next year... that's really similar than your 9 days...:-)
(And I'm also sure that it will take more time...)

Cheers,

Christian
0
developingprogrammerAuthor Commented:
And YET you're taking all this time to write to me Christian. = ) I really appreciate it.

I want to be a billionaire this life time, by - earning it through creating something new or better. Not through wrangling limited resources. Cause that means I contributed a billion dollars of goods and services to the world. That my life has been worth living. I think if I ever win the lottery it would screw up my rags to riches self made plan haha, I will give that money away or probably you know what, I will multiply that by many many fold instead. Set up my consummate Cerebro office just like Professor X has in the mansion in Cerebro = )) haha.

Yup, a person like you whom I look up to will of course push the limits more than what I can = ) I'm glad to be under your tutelage!! = ) ok let me figure out that algorithm in the other question myself and post the solution there!! Thanks Christian and hope you're having a good weekend!! = ))
0
developingprogrammerAuthor Commented:
Christian i'm curious, how do you cope with so many things? you're build a MONOLITHIC project, you're helping me so much and others on EE, ALSO writing articles, you've got family and personal life too. at least 1 thing that you've surely got down already are your skills - you've already gotten 99.998% of all the skills you needs, way past the 10,000 hrs for mastery.

but even so, how do you cope with so many things?

for me i'm very focused in what i do but the biggest time constraint for me is i'm in the learning phase. i love to be in the execution phase cause that's the phase where you have the most creativity, the most control over what you're doing. it's like you're coming into an environment where your app embraces you with open arms and you've come home = ) WHEN you don't face the "Implements is BUGGY!" problem and your app crashes for "no" reason every time hahahaha

it's like once you know your stuff, you're in your comfort zone already. i really enjoy the feeling of being in the comfort zone - as does everyone i'm sure, where we feel safe because we are in control = ) however i've ALWAYS found that i put myself in the most uncomfortable positions where the torrential winds are just buffeting my face giving plastic surgery in the process hahahaha. i'm sure iOS will be one of them cause there's not that much link - different paradigm. but at least not as big a leap as what i'm doing now. iOS will just be a nose job. now it's a chin tuck, face lift, jawbone shave, eye setting deepening, teeth straightening, rhinoplasty and... of course! a botox! haha = ))

so yup Christian, how do you cope with everything? = )
0
BitsqueezerCommented:
Hi,

maybe you don't believe that but answering questions about problems which have completely nothing to do with an own project REALLY helps in getting better and it also widens the own horizon about new ways of doing something. Any new person (and especially the beginners which have a real lower knowledge than you have) have a fresh look on doing something and it helps understanding how we look at and work with applications if we have never touched a computer before. You would be very surprised if you would go out, grab a person which has no technology knowledge and let him/her sit in front of your application, explain only what it is good for and let him/her explore the rest. This person will get you a complete better understanding of what YOU as developer would never thought about before - and how easily this person get your application from one crash to the next which you've never seen during development only because this person uses your application in a completely different way.

That's what I often say: Keep your mind open, try to put yourself in someone elses shoes as often as possible and try to look at the world with the eyes of other persons, you will often learn more than reading professional books or tips from professionals who are showing you "the right way" (including me!).

No, I really do not have that much skill, I learn myself EVERY day, I try out new things and new ways to get better, and I'm sure that only in this environment here at EE there are a lot of experts which have more experience than I or at least experience in other directions which I do not have. The simple fact that I am a standalone programmer is a real big difference to a programmer who had always worked in a team, has experience with unit testing or work together with other programmers on the same project. I believe that you must think that I can answer any question on the world in database design or programming, but that's really not the case. I know many things and what I don't know I will always find in the Internet and some books so I can count the number of questions I have written in any IT forum, really not many. But not because I do not have any questions on my own, I have a lot. It's because I am sure that in 99.99999% someone else already has asked the same question and that also someone else has already answered that. And so I've found nearly ANY answer I need ANY time in the Internet!
But of course that cannot work if anybody would do it that way: If nobody asks like you do nobody would answer and so I would also not be able to find an answer. So if I have an answer to a question or I'm better at searching in Google than the questioner was why should I not write an answer on my own? The next one will find that and get the answer and you would lough: I sometimes have searched for a question and found a forum thread and the answer which I searched was my own answer from a year before...:-)

The more often you answer on your own the better is the knowledge which stays in the brain because we humans only learn if we repeat and use the knowledge constantly. I have written a Public Domain tool called "Professional Soundmaker" in the 80ies on C64 using Assembler. At that time I was really good in programming in Assembler. Now the knowledge is gone, I would not be able to write a program in 6510 Assembler anymore because I simply didn't use that after the 90ies anymore. I know that SYS 64738 was the command to soft reset C64, that's the rest about that...:-)

So if you learn, don't stay in the illusion that anything you've learnt will be available in a year if you do not use that constantly. And so answering questions in a forum is a perfect training, otherwise your brain will throw away anything around your current problem you're working on and that often leads to dig deeper and deeper into very special algorithms which maybe in the end works but when you step away from it a while you suddenly discover that you have worked on a level far away from the problem you initially tried to solve and you've wasted a lot of time exploring "the right way" and forgot that there was a concrete problem to solve and your solution has only solved 5% of it but used a lot of time to find that out.
So in the time when I have a difficult problem where I can find no concrete solution it really helps me to look into the next forum, catch a problem and try to answer that - it normally has nothing to do with what I want to currently solve but after that my brain is grounded to reality and it's really often the case that suddenly I find a solution which I didn't thought of in hours before. And also very often that the solution in the forum helped me find a completely new idea about solving a problem in general.

So in the end answering the forum threads also helps me to make a better job and find better solutions on my own. Try it: You really know enough now to answer questions of beginners. Look into the current list here or in other forums. Read the question, if you think you cannot answer, try to find a solution for that question elsewhere, read it, try to understand it, try it using a little demo file and you got new knowledge. And then answer that question in the way you've understand it and with your own words. You will learn a LOT more if you try to explain something to others than if someone try to explain something to you. The reason is that you'll force your brain to think about what you say: You can NEVER explain something to someone else what you did not understand by yourself before, doesn't matter which theme. So if you can explain, you've the understanding, and so you got better. Really, doing that would bring you a lot more knowledge and understanding than any exam or certification. Moreover an employer will see what you are able to do for him in the first weeks of working for him, if you have a ton of certifications it maybe impresses him, but that would be lost faster than you can look if you only have nice looking certification papers but you cannot use that knowledge as you have no real understanding, only some useless knowledge without practical experience of how to use that in the real world.

So a comfort zone is great, but it's wrong to stay there, if you want to get better you NEED to leave the comfort zone as often as possible, in the end you'll see that it helps you getting more knowledge and make your comfort zone greater.

Cheers,

Christian
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft Access

From novice to tech pro — start learning today.