Windows 8 Logo: The Good, the Bad, and the UglyPosted on February 21, 2012 by Karen Baer
According to Sam Moreau, Director of User Experience for Windows, Windows 8 is “a complete reimagination of the Windows operating system.” So while focusing on and updating modern PC capabilities, it only makes sense (to me), that they leave no rock unturned, that they, as Moreau stated, explore everything and evolve. This includes their logo:
In redesigning the logo, Microsoft had three goals in mind:
But is it too far from the multi-colored look of the past? Is it too much like the logo of Windows 1.0? Does it really deviate from the appearance of a flag, or does it scream Finland? What are people saying?
The Good: “The new Windows 8 logo is pure genius. It has captured attention, it is driving discussion, and it has clearly established itself in just a few days as a unique, distinguished symbol of the future of Windows.” – Tony Bradley, PCWorld “All the criticism is flat out wrong. The new Windows 8 logo is a winner.” – Clinton Stark, StarkInsider
The Bad: “It’s hard for me to see how this is a great leap forward in design from the Windows 1.0 logo. I realize that this is all very much a matter of taste, but to me the blue window panel in the original is more eye-catching than the tilted blue panel in the Windows 8 version.” – E.D. Kain, Forbes Magazine “It’s a simple one-colour logo that emphasises Windows 8’s simple design, but it’s so bland that it doesn’t convey anything important about the new operating system.” – Sean Ludwig, VentureBeat “The new Windows logo washes away the familiar color scheme and any resemblance to earlier variations. It’s a rectangle cut vertically and horizontally by two lines. The logo lacks dimension, depth or distinction.” – Joe Wilcox, Beta News
The Ugly: “I think it’s very appropriate to have 4 Blue Screens of Death coming right toward you. Pretty much captures my Windows experience, anyway.” – David Van Brunt “What the new #Windows8 logo actually is.” (see image below from Twitter) “Microsoft should have hired me, ‘cause I could have done this in 10 minutes and charged only $100.” – Random dude named Ben So, what do you think? Good, bad, or just plain ugly? Why I Am Not Allowed to Pick Hotels (Or Even the Towns Where We Stay)Posted on February 16, 2012 by Rick Beckley
There are a lot of things you have to keep up with when you’re running a power plant. Part of it is how you track your vendors and contractors. Back in 2008, we started working with American Electric Power (AEP) to provide them with software and hardware that would allow management to track Quality Assurance/Quality Control (QA/QC) issues from their headquarters in Columbus. To set that up, we traveled to the Kyger Creek plant in Ohio, just outside of Gallipolis. I was pretty new to Terraine at the time, and I hadn’t done a great deal of on-the-road traveling up to that point. So I just looked at a Google map and picked the motel that was closest to the plant. No need to start laughing yet, it gets better. So my boss Jim and I travel all day and finally get to Gallipolis around 7 or 8. And the accommodations? Not exactly what we expected. Ever watch any 70s or 80s-era cop shows where the bad guys hole up in a cheap motel and wait for the cops to show up? Well, not that nice. Or imagine the motel from “My Name is Earl”, but without the charm or cleanliness. That’s where we stayed (the bad hotel photos on MSNBC’s website offer a glimpse of similar accommodations). Then, on to dinner. This does have a happy ending, though. Gallipolis aside, we’ve been working with AEP for several years now, and there’s a great article about what we do for them for QA/QC located here: http://www.fieldtechnologiesonline.com/download.mvc/Rugged-Handhelds-Automate-Inspection-0001 You’ll need to register, but it’s free and makes me look much better than my skill at picking hotels. New Mexico Livestock Board Jumps into the Technology Era Branding Irons and ComputersPosted on February 14, 2012 by admin
“Trust Everyone But Brand Your Cattle” are words to live by in the West, even in this age of technological leaps and bounds. However, meshing laws and rules of the Old West hasn’t been as big a challenge as one might think. Cowboys, computers, and the Internet have come to serve the livestock industry in New Mexico well. A bit of history: our agency was formed in 1887 as the Cattle Sanitary Board, the Sheep Sanitary Board subsequently forming in 1889. The two organizations merged in 1967, becoming the New Mexico Livestock Board, which continues today as a law enforcement and brand registration agency of the State of New Mexico. Our mission is to protect the integrity of New Mexico’s livestock industry. Our team of about 60 full-time inspectors and another 60 full- and part-time deputies continuously patrol and perform inspections around our state to help keep our livestock free from disease and safe from theft. We are also the office of the State Veterinarian. Dr. Dave Fly and his team of veterinarians collaborate with various government and private sector partners to ensure that our state remains free of diseases. The operations of this agency were abundant in paper forms; mounds and mounds of reporting were mailed to the main office for proper filing and processing. Time lag from the rural areas where our inspectors worked to our office in Albuquerque carried a negative financial and logistical impact on the benefits and safety we provided for the industry. In the early stages of the agency, inspectors may have had no communication with the office administration for weeks, even months at a time. Hence, the New Mexico Livestock Board moved forward with a grant from the State’s Legislature in 2005 to upgrade our inspection and animal ID tracing system during the outbreak of BSE, more commonly known as “Mad Cow Disease”. This grant gave us the ability to purchase Toughbook laptops for every inspector in our agency and integrate the Adesso client into our main office framework. This allowed for faster communication and more readily available data from the field of inspectors in the rural outreaches of New Mexico. We have continued to increase the functionality of Adesso into our daily work and have had a successful partnership with the Terraine team in doing so. The digital forms built in the client are being used daily to report livestock movement, brand and ownership information, and animal health inspection requirements. It’s hard to imagine how things were done just 6 short years ago, let alone a century ago. Kudos to Terraine for making our mission and service to the State of New Mexico an easier trail to blaze. Guest Author: Julie Gauman IT Lead Support Tech New Mexico Livestock Board Samsung: In a Galaxy Far, Far AwayPosted on February 08, 2012 by Karen Baer
Samsung has been bashed by every single social outlet following their Super Bowl commercial that promotes the Galaxy Note. I’ve read the articles on Mashable Tech and on Information Week Mobility. I’ve seen tweets like: “Reversing 7 years of smartphone progress by bringing the stylus back.” And “After that very fun, very big, and very expensive Samsung Superbowl ad… People everywhere are thinking, ‘meh, I like my iPhone…’” But even after reading all of that, I’ve simply decided that I’m going to cut Samsung a break. Why? Because there’s just been too much focus on the “pen”. I’m sure there are plenty of overgrown boys around the world (or maybe just in Kyrgyzstan) that have never heard of a stylus. I just refuse to bust on Samsung, because I really think the commercial was actually pretty clever, funny, and memorable (in an I’m-not-a-fan-of-opposable-thumbs sort of way). I mean, who cares if it brought back memories of searching through foot-tall grass in an I-lost-my-contact-lens kind of desperation trying to find the stylus that came with my 2002 T-Mobile Pocket PC? What I will say without hesitation is this: The general tone of the Samsung ad is a bit (ok, ridiculously) over the top. I mean, Mr. Guitar Hero with the circus-like, super tight, hot pink and white striped jumpsuit? I’m pretty sure that women across the nation threw up a few buffalo wings watching his nearly pubescent hairy chest gyrate all over the place. And the skateboarder on government property?! Yikes. The anarchy! Samsung isn’t alone, though. Another ad that comes to mind is HP’s “I Got a Pair of Brand New Roller Skates” where a baby is flying around in her death-trap walker on a highway with mac trucks and at one point appears to be heading straight for the edge of a cliff (forget stairs being a safety concern). At least the baby passed vehicles on the left hand side and wasn’t trampled by a stampede a la Running of the Bulls. I think HP and Samsung were just trying to be unforgettable. And in my opinion, they’ve succeeded; I’m going to have nightmares for years. Windows 8: Sink or Swim?
Rumor has it that the Consumer Preview for Windows 8 will be coming out later this month. Just yesterday, the hearts of techies around the world got all aflutter about a Betta-fish Bing page turned pile o’ rocks today.
There are differing and extremely opinionated viewpoints on Windows 8. Will it be the next big thing, or is it doomed for Vistaland? I could give you my opinion on it all, but given that Adesso is a Windows-based product, you’d probably take it as a sales pitch for the most amazing offline database platform that the market has to offer. You’d probably say, “She’s just saying this because she wants us to buy licenses for the Lexus of custom software solutions.” So instead, I’ve scoured the Internet for two very differing opinions on Windows 8. This dude, Steven Vaughan-Nichols of ZDNet, has already called Windows 8′s time of death (ouch). His five main reasons?
Then there’s self described sleep-deprived techie Matt Buchanan of Gizmodo, who believes Windows 8 will redefine the way computers are used. His 1-minute video has background music that makes me want to run (in slow motion) through a field of poppies. What does he like?
What do you think? Does Windows 8 stand a chance of swimming with the other operating system fishes, or will it sink like a rock? Written By: Karen Baer Terraine, Inc. Yumas: Hard-Core Hardware for Data CollectionMy first experience collecting data electronically was in 2009. I was classifying vegetation for the Bureau of Land Management in Nevada, producing (along with my crew) on average 40 sheets of data a day. That’s a lot of paper, and our manager could see that we were struggling to keep track of it all. One day, we were called into her office, and each technician received a Pocket PC outfitted with software suitable for the job. We were excited: No more paper! That excitement lasted as long as it took us to get to our job site. Within the day, we were back to using paper. The Pocket PCs collected dust the rest of the year. Some of you might be asking – what horrible software or hardware did they make you use? Well, the software was decent, but the Pocket PCs were awful. Slow, difficult to use, no glare-resistant screen…it was a nightmare. Even if the data collection software is smart, if the hardware sucks, then it just doesn’t really matter. Over the last few years at Terraine, I’ve worked with a variety of handheld devices to collect data using our Adesso software, including Smartphones such as HTC Android phones, Panasonic Toughbooks, and TDS Recons, but the one I like most is the Trimble Yuma. And I’m not alone. A lot of our Adesso clients use Yumas, not just for environmental data collection, but for various applications like construction quality control, emergency response, and power plant and health inspections.
Above left: The Trimble Yuma. Trimble Yuma Pros:
Trimble Yuma Cons:
My opinion: the Yuma will pay for itself over time. If you are sending technicians or inspectors to collect data with subpar hardware, they are likely spending unnecessary time on the job. Upgrading will allow your team to complete the job more quickly, which will save money in the long run. Not to mention you will have happier employees! And happy = productive. Consider renting or purchasing a Yuma for your next assignment and see how it works for you! If you’d like more information on the Yuma, we have compiled datasheets and a technical review, which you can access via the link below. Written By: Chris Hollinger Terraine, Inc. Bacon is the New Spam
Although you actually signed up to receive these, it has become truly annoying to open up your inbox and find it full of bacn (on a foodie note, it would be so nice to open my mailbox and find it full of crispy, tasty bacon). Me being the fanatic neat freak that I am, I diligently delete each one of these daily. Which really makes me question why the hell I signed up for these in the first place. We have gotten so used to hearing about all these deals, like 50% off your entire purchase at Whole Foods, which really means buy $20 and pay $10, which really means buy 2 avocados, 1 mango, fresh-made organic salsa and a foreign cheese, and you are now at $25 but sorta feel like you got a bargain? We feel that if we unsubscribe, we are missing out, so we sign up and are continuously annoyed when we check our inbox because deleting or ignoring the email is so much easier than unsubscribing. But seriously, in the past year, the bacn has gotten a little out of control. You want to know why? It’s a bargain for marketers, and it pays off. According to unsubscribe.com, the cost of sending an email is $ 0.0001, and the payoff? In 2009, email marketing generated $26 billion for online retailers. In 2010, there were 27,397,274 bacn emails sent per day. That equals 4 emails per day for every person on the planet. Conclusion: some bacn is good, too much will clog your inbox. Written By: Mariana Gallegos Terraine, Inc. What I Learned at Internet Summit 2011On November 15 and 16, over 1,500 people gathered at the convention center in Raleigh, North Carolina, for the 2011 Internet Summit, hosted by TechMedia. The purpose of the summit is to provide an avenue for successful internet technology professionals and entrepreneurs to share knowledge on the latest industry trends. This year’s summit boasted a ton of excellent speakers, including a riveting keynote by Gary Vaynerchuk, Co-Founder of VaynerMedia and Host of DailyGrape.com. Here’s what I learned: Crisis management is for the birds. Literally. Everything in SEO begins with search, and keywords are the language of search. Manage your reputation. Content is key to success. Get involved! If, like us, you’re a small business with big ideas, just remember to always be thinking of how to engage your customers through the various social media outlets available (Google Plus, Twitter, Facebook, LinkedIn, etc.). And like the exponentially growing world of technology, the realm of Internet marketing is always changing. Keep current on the latest trends, and if you’re in Raleigh this time next year, consider attending the Internet Summit. The content and people are great (and the food’s not so bad, either). Written By: Jennifer Porterfield Terraine, Inc. Move Data Forward: My Introduction to Mobile Data CollectionBack in 2003, I replied to an itty-bitty ad in the Miami Herald’s classified section. It simply said, “Geologist needed.” “With such a specific job description, I would be a fool NOT to apply,” I thought. During my interview at Terraine, I was asked questions like,
For most people, these types of questions would set off some warning flags. Or perhaps warning sirens. Big ones. Like outdoor warning systems for tornadoes. But not me – oh, no, no, no! Given that I had just left a 2 ½-year volunteer stint in Haiti, I answered the questions like a pro:
I got the job, which, during the first three years, consisted of routine groundwater sample collection in the state of Florida. During those initial years, I learned some very important and basic principles for any sampler:
To further explain 3: Yes, initially I had to frequent Motel 6s and use toothpicks and bubble gum to fix things, but one thing I never had to do was write my field data on paper. Around the same time I came on board, my boss discovered this offline database platform called Adesso; built an environmental sampling application, EnvironPro; installed it on a Pocket PC; and put it in an Otter Box for me to use. Paper became a thing of the past. I never had to dry out my paper field logs on the dash of my truck or on top of the hotel room AC unit. I never had to transcribe my data after just getting back from an 80-hour week in the field. I was able to print out accurate, auto-filled field forms quickly, which was a life-saver given that I had, on average, twelve reports to write every three months. Adesso became the end-all, be-all for me, and what made all of the other field challenges manageable. Eight years later, some things have changed. Terraine owns Adesso; we’ve rolled out multiple improved versions of the database platform; and we serve clients outside of the environmental industry, even outside of the US. But what remains the same is our desire to improve the lives of those of you that are out in the field collecting data every day. We’ve been there; we know what it’s like. We want better for you. Move data forward. Written By: Karen Baer, LRS Terraine, Inc. Remote Data Collection Gone WrongI had a job working in northeastern Nevada (Elko District) collecting vegetation data for the Bureau of Land Management (BLM). This work involved traveling to remote areas of the desert, visiting areas that had recently been burned from wildfires, and looking at how vegetation was recovering and what species were recovering. There were two main goals for doing this:
My team and I would travel to pre-determined plots and conduct different density frame and line transects to obtain this data. It was extremely paperwork heavy. We would collect a minimum of about 10 pages of paper information per plot. These paper forms all went in a folder in our truck. About three quarters of the way through the season, the BLM asked us to turn in our data so far. We brought in our folder and were horrified to discover hundreds of pages of data in no particular order. More so, one of our field techs had been forgoing writing the plot names on his sheets, which meant we had to match them to plots using dates and other pertinent information. The entire next 2 days were used up reorganizing data, and at the end we found that data from three plots up in the mountains (that had required a 3-mile hike to get to) were lost. We were told we had to go back out there and collect the data again. Now I use Adesso, a tool for building mobile data collection apps, and I wonder how I ever conducted field events like this without it. Not only would it have saved us having to spend time reorganizing our data and having to travel back out to recollect lost data, but someone had to spend time looking through those hundreds of pages and entering everything into an online database – likely months of work that could all have been done with a simple click on a synchronize button. Written by: Chris Hollinger Terraine, Inc. Business of Software 2011 OverviewBusiness of Software 2011 I just arrived back home in Raleigh after attending this year’s Business of Software (#BoS2011) conference in Boston, MA. Like last year’s event, it was really good, with an impressive lineup of speakers. If someone asked me “Well, what did you really learn there?” I would say that the following are the basic (condensed) principals and recurring themes that I learned over the last 3 days: Creativity Honesty Test and Tweak, Always #JFDI Don’t Sell (Your Dream) Out
Here’s a transcript of the interview. Definitely worth your time to read it: http://productprinciples.posterous.com/an-interview-with-john-nese Ask Written by: James L. Young, PG, REM Terraine, Inc. Adesso Version 5 – Bigger and Better!Do you remember 4 years ago when a little company called Microsoft introduced Office 2007? Think back…recall all of the times you cursed Bill Gates for making ribbons instead of dropdowns…or, if you didn’t HAVE 2007 yet, remember cursing your co-workers who did and who never remembered to save as .doc files. Oh, how time has flown by. I, for one, have grown so accustomed to the Microsoft Office 2007 / 2010 setup that I feel I could never go back. But what does this have to do with our (shameless plug alert) incredibly versatile offline data collection software? Well, we are rolling out Adesso Version 5, and one of the major changes our users will notice up front is that Adesso now looks like (you guessed it) an Office 2007 / 2010 program! We have the ribbons! We have the nifty circle button in the upper-left corner with our logo on it! Please, try to contain your excitement. I could go on and on about all of the changes we have made to enhance your Adesso data collection experience (and I do, at our Adesso Support Portal), or you could just take me at my word that it’s awesome and download a free trial at the Adesso website. Written By: Jennifer Porterfield Terraine, Inc. How to Improve Your WebsiteThe following article from Joel Spolski and his team at FogCreek Software is really really good. It discusses how to improve a website the right way, for today’s readers/users. Rather than paraphrasing, we thought it would be good to simply share it: Jim Young Introducing Our Newest Product…ezCoC™!If you are an Adesso user or are at all familiar with our products, then you know how versatile our software platform is. It’s already been used in several industries and could be adapted for use in many more. For example – we started off primarily as an environmental company, performing site investigations and monitoring for federal, state, and private companies. Adesso appealed to us because we were collecting large amounts of data outside, often in adverse conditions, and it gave us a way to do that without having to deal with pen and paper. In short, Adesso made our lives easier while also making us more efficient. In that spirit, we are rolling out a new product this spring / summer called ezCoC™ – Chain of Custody Preparation the Easy Way. Separate from Adesso, this is a web-based service used to create and track lab chain of custody (CoC) forms. While electronic CoCs are not a new technology, ezCoC™ is based on the premise of Software as a Service, allowing anyone with a computer or mobile phone and an Internet connection to use the system. Basic overview – a user (environmental scientist, geologist, etc.) logs into the ezCoC™ website to create a CoC form for a sampling event and submits it to the lab. He / she collects the samples and, using our mobile app, signs the samples over to the lab courier (or the CoC can be printed and signed). The user and lab can now track the sample progress online at ezcoc.com. If you are interested in learning more about ezCoC™, you can click here to see an overview of the benefits, both for field users and labs. You can also click here for some videos that will give you a look into the system. The point of all of this, however, is not just to introduce to you a new product. It’s a reminder that the world is constantly evolving. You can either sit back and watch it happen, you can evolve with it, or you can take the lead and be the one helping to shape the future of your industry. Be on the lookout for new products, new ideas, new ways to improve what you’re already doing. And if you find one that looks interesting, give it a try! Written By: Jennifer Porterfield Terraine, Inc. Internet Summit 2010 – A Non-Conventioneer’s OverviewLet me preface this blog by stating two key facts about myself: I am not comfortable meeting new people or going new places – at least not alone. So while I was excited for the opportunity to participate in Internet Summit 2010, the prospect of a convention with over 1,400 people in a city I’d never been to before was a bit daunting. Not only did I survive, however, but I truly feel like it was a valuable experience – not only for the wealth of information they managed to cram into a day and a half, but for the chance to overcome some of my personal inhibitions. Internet Summit 2010 was a convention discussing web-related topics and trends. It took place in beautiful downtown Raleigh – a six and a half hour drive for me (quite the experience for someone whose husband typically hogs the wheel on road trips). What did I learn at the summit? Well, I took pages upon pages of notes at each of the breakout sessions I attended, but for this blog entry, I’m just going to discuss a few key points that were stressed in multiple sessions. 1) Have a plan. Whether you’re talking about social media marketing, web analytics, online advertising, or any other facet of an online presence, having a plan is a key factor to success. This includes knowing what you have to market, how you’re going to present it, and who you intend to target. You should also always have some sort of goal in mind. One of the presenters (Emma Battle, Director of Online Marketing for Red Hat) gave the example of having a P.L.A.N. This is a circular model that involves planning, launching, assessing (see number two below), and nurturing. 2) Measure, measure, measure. How are you going to know if what you’re doing is working if you don’t track your actions and goals? There are many ways to track site analytics, the most popular provided by Google. You’ve got Google Analytics, Google AdWords, and something they discussed at the Summit called Google AdWords Experiments (ACE). You should have tracking codes on your page links so that Google can track who clicked on what, and you should have some form of method for tracking conversions (discussed more below). 3) Engagement is important, but conversions are key. Two key goals of just about any website are getting customers to stay on the site and getting them to return to the site. Creating a good customer experience through an attractive and usable website can help establish engagement, but it’s something that is far more difficult to measure than conversions. A conversion can be measured in any number of ways – if someone bought a product, if someone downloaded a free trial, if someone watched a video. One of the first questions asked during the keynote speech was which was more important – conversions or engagement – and the answer was definite. We want to engage our customers, but that isn’t going to count for anything if the people don’t inevitably buy your product. 4) One of the best places to meet people is at the hotel bar. My main complaint about this Summit is that I felt overwhelmed. You have all of these people in this enormous space, and we were either claustrophobically gathered together outside of the meeting rooms, or we were spread out far enough that we weren’t forced to be social inside of the meeting rooms. There were after parties both nights that might have helped with the social / mingling aspect, but I was on alcohol restriction (doctor’s orders), which made the prospect of an after party not so much fun. Instead, I returned to my hotel and had dinner at the bar of my hotel’s 20th floor restaurant overlooking the city. While there, I met a few people from the Internet Summit and a few in town for other conventions and actually had some surprisingly great conversations about a variety of topics. It was quite possibly the most fulfilling part of the entire trip for me. So…since I have nothing to which to compare Internet Summit 2010, I can’t really give an accurate rating. This was my first ever convention. I can say that it was an enlightening trip. There was an overload of information – some of it perhaps a bit too general for my taste. And it drove home the fact that, when it comes to many aspects of having an online presence, I am a complete dunderhead (and yes, I did just use that word). But for just under $300, I think it was well worth the money (or, in my case, the company’s money). If you’re in or near Raleigh next year, check it out! Written By: Jennifer Porterfield Terraine, Inc. Build a Simple Adesso App in Under 20 MinutesLast night I recorded a video on how to build a basic Adesso application in about 20 minutes. In the video I mention building it in 15 minutes. That was the goal. However, it took me about 5 minutes more than that to build, and then another few minutes to populate it with records to show the user what it looks like when its completed. Regardless of the time, an application from concept to reality in under 25 minutes is pretty good. It’s not difficult, and since the application is essential a live app, it can be improved upon over time, features added, tables and fields added, etc. What I showed in the video was how to build a simple inspection form application, where a user would fill out some details of the location or facility being inspected, and then the user would fill out the actual inspection results and sign the form. Common elements such as a listbox, checkboxes, and free-form text entry fields were present on the form. The sample inspection form I used for this topic is presented below, followed by the video. What I learned at Business of Software 2010 ConferenceI was fortunate enough to have attended the Business of Software 2010 conference in Boston. It was amazing, like the all-stars of software all in one place. Seth Godin, Joel Spolski, Dan Bricklin, Eric Sink, and many many others. I mean, the dude that invented the spreadsheet was there! And he’s still building stuff! Really really worth every penny spent to get there. I’d like to share a few things that I learned there, in no particular order.
Seriously now, here are just a few pointers/tips/lessons that I learned. Please note that these are solely my opinions, and I am the only person responsible for what I say below. Seth Godin. It’s not about the code.The value you provide others, the inherent value within whatever it is you do is not the code. It’s the artistry behind it. It’s the creative genius behind it, the value of the aggregate users. Code can be copied and written, whether in Bangalore, Shanghai, or Malaysia, but your idea, and the community of people using it, can’t. Case in point: eBay. eBay’s value is not in the code, it’s in the giant community of users. Be an artist. THAT can’t be copied. Scott Farquhar. Get a partner.Inevitably shit happens, and when it does, it’s a huge load off your back to know that someone is there taking care of things when you can’t. In his case, he was on his honeymoon when all hell broke loose, and when he got back to cover, it was refreshing to know that someone was there watching his back. Rob Walling. It‘s ok to be small.Nowadays, a one-man show can be very successful. You can pretty much outsource everything, from user testing and merchant accounts to creation of a killer landing page. Quick tips from Rob included getting a killer landing page, and the purpose of your website is to get a visitor to come back. Get them to come back because the conversion rate of second time visitors is several times the rate of first time visitors. Youngme Moon. Be Different. REALLY different.By far my favorite talk. She was amazing. Her talk revolved around the idea that everyone nowadays tries to be new and improved, just like everyone else, to the point that its nearly impossible to distinguish among a sea of likeness. Example: what really is the difference between Evian, Perrier, Dasani, AquaFina, and the other 100 bottled water vendors? Is it really the water? In today’s society, what does it mean to be really be different? Her examples of truly different firms were of Ikea, Mini Cooper, and Twitter. Ikea: flimsy furniture, all one style, they make you pick up and assemble your furniture. Mini Cooper: yea, we know its small, in fact its so small its smaller than extra small. They embraced their smallness. Twitter: in the age of unlimited voice and data plans, they unleashed a product that actually limits you to 140 characters to type. WTF? In her talk, she said that in an idea’s infancy, sometimes ‘different’ can look just like ‘crazy’. Embrace ‘crazy’. Dan Bricklin. Everything is changing, all the time.Dan invented VisiCalc, the precursor to Lotus 1-2-3. Today he’s writing apps for the Apple iPad. Wow! Here’s a guy that started building stuff in the 1970′s, practically before Apple had computers. And he’s still building products that ease pain for people. His talk was partly history about VisiCalc, how he got started, how computers have changed over time, etc. But the main gist of his talk was really about change. You have to be willing to change with the changes around you. It’s inevitable. Don’t hide from it. Embrace it. Keep on keeping on. Joel Spolski. The good guys really do win, even if they have to make tough decisions.Do good with your success. Build a responsible business where you would like to work. Treat your employees like family. Because they really are. If you succeed at whatever you do, use your success for positive change. Don’t be selfish. Also from Joel Spolski: Leaders of organizations only need to do 3 things well: 1) get the right people on the bus; 2) find the money; and 3) be the keepers of the vision. Leaders don’t manage, they lead. Leave the managing to others in the organization. You don’t need to be answering questions all day long from your team. Derek Sivers. Happiness is not about the money.After a certain amount of money, people are happy. Increasing your amount of money beyond that does not increase your happiness. In Derek’s case, he sold CD Baby and donated all that money to charity (with a small amount of it going to him each year for living expenses). It’s not just about the money. It’s about what you do. Eric Ries. Test ideas, and use metrics to track everything.Be scientific about things. Test your ideas but track it all, track your traffic, your conversion rates, etc etc. Test using A-B split tests, send a newsletter with a promotion to 10% of your customer list, then send a slightly different one to a different 10% of your customer list. Track results. Then send the promotion that succeeded best to the remaining 80% of your customer list. Engage with your prospect. Send them followup emails on specific days after trying out a product. But track their use of the product as best you can. Did they log in, did they use it? If not, send them help tips, engage with them, and do this is a semi-automatic fashion. Peldi Guilizzoni (founder of Balsamiq). You can do it too.Peldi launched his firm and went from zero to over 3,000 customers in 2 years. A success story that has its roots in great software. His mantra is life is too short for bad software. Build a good product, and you will succeed. Don’t worry about people stealing your product through cracks, hacks, and serialz. If people are doing this, then that means your company is growing. Worry about the volume of hacks if the volume decreases. This means that sales are probably dropping off. Peldi built Balsamiq while working for another firm, during nights and weekends. Now he can do whatever he wants. Eric Sink. Selling a product or company to another organization is extremely painful and time-consuming.Eric discussed his experience selling one of his company’s flagship products to Microsoft. He said it was the most painful experience he’s ever gone through. Be prepared to walk away from the deal at least once, if not more. If possible, try to obtain several offers, and if you don’t have them, use your poker face to fake it. Chances are that the other side is experienced in acquiring product, and you won’t be. Get a pair (not one, but a pair) of excellent lawyers. Be expected to shell out $500/hour for the good ones. And get them early on in the process, which might take 6 months out of your life. Make sure your intellectual property documentation is in order, you will need to get all your programmers to sign off on everything, even if they don’t work for you anymore. When asked by the audience “was it worth it”, Eric hesitated for a few seconds, and said yes. But it was not a resounding yes. What he meant from that, I think, is that it’s like going through cancer treatment, or delivering a baby. Extremely painful, but the outcome, at least for him, was worth it. Jason Cohen. Listen to your gut instinct.If a slick salesperson starts telling you what and how to do it, don’t necessarily listen to them, or worse, do what they say to do. Listen to your gut. Don’t be pressured into something if it feels wrong. In his case, an experienced sales pro told him he needed to change the name of his firm from Smart Bear to something more business-friendly, that corporations wouldn’t take him seriously. In the end, he didn’t listen, and companies like Intuit and Adobe purchased tens of thousands of dollars worth of Smart Bear software. He sold his firm to another company, which then changed its name to Smart Bear. Go figure. Don’t be bullied by people who think they are smarter or more experienced than you if it doesn’t feel right. Some other nuggets I learned:
The conference was amazing, and I took back more than what I gave in money and time away from family. I highly recommend next year’s conference. I also highly recommend looking up the people mentioned here and reading some of their books and blogs. ### How to Create a Crystal Report Plug-in for AdessoDisclaimer: This blog post was made by Ravindra (Ravi) Dhole, not by me. Ravi has been building Crystal Report and .NET plugins for me since December 2007. He knows this stuff well. In the example below, Ravi explains how to build a Crystal Report plugin that hooks into an Adesso database. The objective of this plugin is to produce a customized printed report that retrieves data stored in a local Adesso database and displays it in specific locations on the report. By duplicating the steps outlined below, you should be able to create your own plugin that essentially harvests data stored in your own Adesso database. Sample code and development guides can be downloaded from the links below. Download Sample Code 1. Steps to Create Crystal Report For Adesso 1.2. Create Class Library Project Ø Once class library project is created then you can find one class1.cs file. Rename this class file equivalent to project name. For example PrintWSWTablePlugin.cs.
Ø Add following reference of Adesso in class file. string IExtensionHandler.Handler(string filename) string IExtensionHandler.GetFieldNames(string filename) string IExtensionHandler.GetParameterNames(string filename)
1.3. Design Dataset Ø Once Data set .xsd file is created then next step is to create crystal report. 1.4. Design Report
Ø Check Using the Report Wizards and select Standard as report type and click on OK button.
Ø Click on next button. It will display added tables with relationship. May be you can clear this relationship between table if needed. Click on Clear Link to clear all relationship. Refer screen below
Ø Click on yes button and finally click on Finished button.
1.5. Fill Dataset and Display Crystal Report using System; namespace Adesso.Client //Adesso Driver connection string // This is actual event handler method which is executed when user click on button. //take application path and password from event handler xml //System.Windows.Forms.MessageBox.Show(“Application Name: ” + applicationName + ” Password: “+password); //Make connection string // Get the root node of the XmlDocument // Determine the path to where the Plug-In lives so we can get to the dependency files. //Take out the temp directory path //Take project number from event handler xml //fill dataset //Assign report parameters //Export report as PDF on disk //Open PDF in Acrobat reader // This is adesso event handler method. It always return blank value // This is adesso event handler method. It always return blank value. #endregion // This method open the PDF in Acrobat Reader. // This method read project number data from event handler xml and return it. // This method decode the password and make a connection string // This method converts base64 format string in to normal strign and return it //WSW Data 1.6. Plug-in Creations in Adesso Ø Once you click on OK button then we have to add more details related to plug-in. If we and to display crystal report on button click then checked checkbox of Button under Can be used as: section. Then under resources section, for Resource Dropdown, browse for our project dll. For example. PrintWSWTableReport.dll. Once this dll is added then it will prompt for Class name selection. Select Adesso.Client.PrintWSWTablePlugin. If there any dependencies other than Adesso.Interop.AdessoDataObjectsLib.dll, Adesso.Interop.TBSYNCLib.dll and AdessoInterfaces.dll these DLL’s then you can add those dependencies from Dependencies Section Ø Click on OK button to save this plug-in
Ø Click OK button and save the form Ø When user click on button then it execute the plug-in and display the report in report viewer or it will create PDF from RPT file. Here we have created the report as PDF. Refer screen below
Tip: How to test the crystal report in Adesso application. Ø Add MessageBox.Show(“test print function.”); method in plugin file ( Eg. PrintWSWTablePlugin.cs file) where you want to check the code is run properly or not.
LAST() FunctionLAST() Function We recently created a new function in Adesso called LAST(). This function, which is available in the expression editor, was created so that values from records in a child table could be extracted with ease in the parent table. This is useful for when you want to compare two or more values in a child table against each other and/or calculate something between those values (for example, like the difference between the last two temperature readings recorded from the child table). e function’s syntax is as follows: LAST(fieldname or O2M.view.fieldname, record number) Where the O2M (one to many) view listed in the function is a view that has at least one sorting order assigned to it. The record number in the function is an integer denoting which record to pull the value from, based on the last record in the child table’s view being record number 1, the second to last record being record number 2, and so forth. Note the expression in the following screenshot: The expression assigned to the field which I have called LAST1_Temp is: LAST([Well Sampling > Purging].Included.Temp_Reading, 1) Note that I have selected a view called “Included” that I built for the o2m grid that is displayed on the parent form. But the name of this view is something that looks complex…”[Well Sampling > Purging].Included. The reason for this is that a relationship exists between the parent table Well Sampling, and the table Purging. I created a o2m relationship between those tables and named that relationship Well Sampling > Purging. Hence the name of the view. An easy way to populate this is to select the view right from the top left listbox in the expression editor, as illustrated below: Once I select the proper view, then I simply select the field I want from the field selection listbox just to the right, as illustrated below: Please note that what I am doing here is selecting the proper VIEW and then the correct field from the related CHILD table. In our case here, the child table is called Purging, and the parent table is called Well_Sampling_Events. Now that I have selected the proper field from the proper view of the related child (many) table, then the last piece of missing information is the record number. In this particular case, I have assigned it as “1″. This means that the function, which is loaded into a field that is present in the parent table (the Well_Sampling_Events table) and which I have called LAST1_Temp will pick up the value in the field Temp_Reading from the last record in the Purging table, where the last record is based on a particular sort order which was assigned in the Included view. This sounds like a mouthful, so if you are confused, its understandable. So lets look at this another way. Step by step, this is what you would do: 1. Create a parent table, a child table, and relate the two using a one to many (o2m) relationship. Once you do these things, then you can use that value to calculate something in another field/expression, etc. In our case above, we did this to figure out when groundwater from a monitoring well has stabilized based on temperature readings. Now, if I want to then store the value of the 2nd to last temperature reading from this table, my expression would look like this: LAST([Well Sampling > Purging].Included.Temp_Reading, 2) Once I have those two fields, then I can calculate the absolute difference between the two temperature readings by creating yet another local field (with the same data type as the others being used in the expressions) in the parent table, where the expression would look like this: ABS(LAST2_Temp – LAST1_Temp), where ABS is the absolute value, meaning that the negative sign is dropped off. What this does, then, is it gives me the numerical change between the last two temperature readings obtained and recorded in the child table, and it does this based on the sort order assigned in the view that I called “Included”. Simple as that. The following screenshots are of this functionality in runtime mode: Note that on the screenshot above, there’s some textual reference that says “Continue purging”. This is an expression that displays either “Continue Purging” or “Stabilization Complete”, and it displays this dependent upon the difference between certain stabilization criteria, of which temperature is one of them. In our case here, a well is considered “stable” if the change in temperature over the last 3 readings is less than 0.2 degrees Celsius. So what we did was use the LAST() function to capture the values of the last 3 temperature readings, compared them to each other, and if they all fall below +/- 0.2, then the well is considered stabilized based on temperature. I have placed a button that opens a hidden tab on the bottom of the form, so that users can quickly see the calculations. The screenshot below displays this form: Please note that all of this functionality also works on a PDA (although a bit slower than on a Tablet PC). Screenshots of this application running on PPC is displayed below: The Secret Sauce – An IntroductionOn its own, Adesso Client is a pretty good tool to use to build database applications. Sure, there are other, more powerful tools to build robust applications that run on PCs, but can they run on Pocket PCs and Windows Mobile? And even if they can, can they run in offline mode, using a device’s local database to store its data? And even if they can do that, can they sync to an intelligent server that handles all the synchronization between the device database and a centralized database? And even if they can do that, are they easy enough for non-database administrators to use, set up permissions, sync rules, audit trails, user groups, sync type, and conflict resolution? Herein lies the power of Adesso. The Secret Sauce, if you will. Today we are going to taste this sauce, just a small taste. In my opinion, Adesso Server is the easiest, most powerful sync server there is, bar none. Because its easy to use, it makes it that much more powerful. I’ve used PenDragon, iAnywhere, Visual CE, and Bright Software. And what I mean is that I’ve actually purchased, installed, and tried building apps using these other products. I also know of people that swore by iAnywhere, SQL Anywhere and Visual CE, until they started using Adesso. Nothing compares to Adesso Server. Its the brains behind the system. Its why people use this stuff. Without it, Adesso is just another database system like all the others out there. The SyncAdmin Web Portal When you first log into the SyncAdmin portal (it’s typical URL is http://serveraddress/SyncAdmin/), you will see a page like the following: The left pane is the main navigation of the site. the screenshot above was taken of our ASP version of Adesso Server. This is the server version that we use to host multiple accounts. If you are hosting your own server, your version of Adesso would be the Enterprise Edition, and would look slightly different than the one illustrated above. We will talk about the Enterprise Edition version later in this blog.
The most important section of the portal is the Managed Accounts section. When you click on it, you will see the following screen displayed.
In the left pane you are presented with a list of accounts. In the main pane, those same accounts are displayed with some basic statistics. If you click on one of the accounts in the left pane, the screen will refresh, with a list of databases that are associated with that particular account, and some details of that account in the main pane. Adding Users To An Account To add a user, simply click on the Add User link below the menus. To change a particular user’s rights, click on the box to the left of the username, then click on the boxes to the right, and click on the Update Permissions button. It’s that simple. Now, please note that there are two levels of users…first you have to add a user to an ACCOUNT. Then that user will be available to be added to an application, but you have to actually add that user to the database application in order for that user to see the app. By default, users added to an account don’t have access to any applications in the account until they are actually assigned to that application. This is done in the next step I will show you. Adding Users To An Application To add a user to an application, expand the account name on the left pane (if its not expanded yet). Then click on an application in that list. In the example below, I have clicked on one of our legacy applications, EnvironPro2009. This app is used by our field technicians, geologist, and project managers to collect and manage low-flow groundwater data by our field technicians. This application is also used by other environmental firms for the same purpose. Notice that the main pane refreshes and you are presented with a new series of menus on the top. From the first tab, the Info tab, you can assign someone who has admin rights to the account as the admin for the application. You can also flag the application to become a template to create other applications, and you can even propagate changes and data from this “parent app” to all the instances you create. More about this awesome feature will be covered in a separate blog post. Very powerful feature that requires its own blog post. To add a user to the app, click on the users tab. Your screen will look like the following: If a user has access to the account (as I showed you previously), he will appear on the left window. To add him tot he application, highlight his name and click on the Add button. It’s that simple. Once you add a person to an app, you can then control that person’s permissions and sync rules from this same area. To do this, simply click on the Permissions tab (its a submenu below the top menus on the main pane). User Permissions Notice that in the main pane, you are presented with several columns: * Table – the table name in the database In essence, from this screen, you can control EXACTLY what you want your user to see and do, down to the table and field level. you can control- or shift-click to select several fields from the Read, Modify, and View columns. In the Read and Modify columns, there are also “All Fields” and “No Fields” options. When you first add a user to an application, by default it allows a new user to read all the fields in all the tables, and locks out a user from being able to modify values in records created by others. That’s what the Modify column is all about…for example, if User X creates a record for Table 1 and syncs, you can control whether or not User Y can edit a specific field in that table created by User X. To give him rights to edit a specific field, simply highlight that field on that table for that user. If you want a particular table to be hidden from a user, just click on “No Views” in the Views column for that particular user. Application Designer (Modify Schema) Permissions Notice that on the Permissions screen, there’s a checkbox for Application Designer permission. If that box is checked for a particular user, then that user will be able to open the Application Designer in Adesso Client and will be able to modify the application schema…tables, fields, views, forms, etc. If the checkbox is unchecked, the Application Designer menu will be grayed out/inactive on his copy of Adesso Client. Sync Settings The second part of controlling what a user can do and what he can see in a particular application is handled via sync settings. When you click on the Sync Settings link, your screen will look like this: From this screen you can click on a particular user, then a particular table, select a particular type of sync, and even the type of conflict resolution. Depending on the sync type, you can even add sync rules/queries that will control which records are pushed up to the server from the client or vice versa, down to the client from the server. All of this can be done at the table level, meaning you can change any of these parameters for a particular user for a particular table. In other words, you can have a particular type of sync (client to server) for one table, and have a completely different type of sync type (bi-directional) for a different table for the same user. Very simple to use. The sync types are as follows: * Bi-directional – data gets sent first from the client to the server, then back down to the client from the server Conflict Resolution * Ask User – during sync, if a conflict is detected, a window pops open, the server record and the client record are displayed side by side in this window, with the conflict field highlighted in bright green. The window contains controls to tell the server how to handle the conflict: overwrite the server record with the local record, overwrite the local record with the server record, or keep both records. For each conflict, it will display this windows unless the user clicks a box in the window to treat all conflicts in the same manner Like I said earlier, you can assign a different conflict resolution to different tables for a particular user. By default, when you first add a user to the application, it will assign bi-directional sync settings and “ask user” conflict resolution to each table. Sync Rules Sync rules are used to control the data going either up to the server from the client and/or down to the client from the server. Sync rules are typically uses for instances where you want to have bi-directional sync type, but you want to control the records being pushed down to the client for a particular user or user group. When you use Pocket PCs and small Windows Mobile devices, you don’t want to clog up the device with thousands or even hundreds of records…if you do, the PPC will either run ridiculously sluggish or won’t run at all. Those devices have a limited amount of RAM and aren’t meant to handle hundreds of records. That’s what the sync rules are for. Another benefit of using a sync rule is that you can use them to push only records to someone that meet a specific criteria, like a project number or company name, for example. This allows you to use a single database and use it for multiple departments, companies, groups, teams, etc, and no one on one team/group/dept/company would see what another group sees…they would only see what is relevant to their own group. The screenshot below illustrates a bi-directional sync type with a rule inserted in the server-to-client direction: In the example above, we are passing records FROM server TO client that meet the following criteria: [Project_No] LIKE ’05-53014%’ OR [Project_No] LIKE ’07-71009/2%’ The syntax above follows certain rules: * Fieldnames are enclosed in brackets ( [ and ] ) Build Sync Rule Helper You will also notice that there is a button called “Build Sync Rule”. If you click on it, a new window will appear that looks like the following: On the left pane of this new window, all the fields available for this rule will appear. On the right pane, different functions appear. Several controls like AND, OR, NOT, =, <, >, etc appear. Toward the bottom some instructions are displayed. Once you have built your rule, simply click on the “Done” button to push it out to the sync rule direction box. Advanced Sync Rule Link If you feel up to it, there’s also an advanced sync rule link, that, when clicked, displays a slightly different sync rule box with a help screen to guide you on how to build a proper sync rule. Your screen should look like the following if you click on this advanced sync rule link: User Groups If you don’t want to mess with assigning permissions and sync rules to every single user individually, you can do this using user groups. Let’s say that you have 100 users, and 75 of them are field folks that are only going to enter records, 20 other people manage the data in-house, and 5 others need to access the database schema to make edits to it. Rather than going through each of the 100 users manually, which can take forever), you can set up 3 groups to handle this. What you would do is create a Field Team group, a Data Manager group, and a Database Designer group. To set these groups up, click on the User Groups tab on the top of the main pane. From this screen, you can create, rename, and delete groups. This is pretty much self-explanatory. Nest you will want to push users to specific groups. To do this, click on the “Group Users” link. Simply click on the group from the top scroll window, click on view, then find the users you want to add to the group, and click on the Add button. A FEW NOTES ABOUT GROUPS: 1. The groups feature does not currently support cascading groups. What I mean by this is that you can’t add a group into another group, and so on. The rest of permissions and sync rules for Groups is the same exact process as what I described in Users. So there’s no need to explain this. The SyncAdmin portal also has a feature to allow you to send messages to the users. Pretty simple feature. Screenshot is displayed below: Sync Activities This particular feature allows you to view every single sync activity that has been conducted on the server for a particular application. When you first click on the Sync Activities tab, your screen will refresh and look like the screenshot below: From here, you can enter a date range, an optional user credential, an (optional) machine name to search for, and a sync status type (succeeded, currently syncing, aborted, and failed). There are also two other checkboxes to the right: * Show All Sync Details – lists every single sync item. By default, this is not checked. If you provide a date range, but and leave the checkboxes unchecked, if there was activity on the server, it would look like the following: If you click on an expand button for one of the rows, you will see all the details for that one sync session, similar to the screenshot below: If, before you click on the View Report button, you had checked both checkboxes, your screen would look something like this: Advanced Features If you click on the Advanced Features tab, you will be presented with the ability to change the sync order of the tables, and also be able to add an audit trail to your application. Sync Order If for some reason, you want to have a specific order of syncing tables, you can do this from this screen. Audit Trails If you want to add an audit trail, click on the Audit Trail link. Your screen will refresh and look like the following: Locking Records Function – How to ensure that records in Adesso are absolutely uneditableOne of our clients asked us how we could essentially lock records so that they would be completely uneditable, even by the user that created them as well as the Adesso Administrator (a.k.a. the god-mode dude). While you can control some of these permissions from the SyncAdmin portal, the Adesso Administrator could still technically edit whatever he wants. So we ended up implementing some new code last year into the Adesso source that completely locks entire records from being edited by anyone. The business case for this functionality is to ensure that records that were created by someone are not altered at all at a later date, ensuring the validity of the data stored in that record. This is important in medical records and other highly personal or security-prone data. Today, I am going to explain how to create a button that, when clicked, essentially locks out records completely, so that they are absolutely uneditable by anyone. Locking a record consists of two components: 1. three separate fields, one which stores a yes/no value, and two of which contain expressions Step 1 – Create the Fields You will need to create 3 fields in the table where you want to use record locking: 1. Field Name: “Record is locked” , data type: “Yes/No”, Display: “Checkbox” The following screenshots illustrate what these fields look like in the field editor. This is the “record is locked” field. This is the “locking expression” field. Note that local field checkbox is checked. This means that the value stored in this field won’t get synced back the Adesso Server. This is the “lock record button expression” field. Note that it too is a local field, but also observe that the expression contained in this field is triggered only via a button control (checkbox on bottom right of expression editor). Step 2 – Create the Button on the Form Now we simply need to create a button control that triggers the “lock record button expression” field we created in Step 1 above. To do this, open the form for the table where you want to lock a record, add the button to that form, select “calculate expression” from the action menu, and then select the “lock record button expression” field from the dropdown below the action menu. The screenshot below illustrates this: To add a button, simply click on an empty row and select “button” from the popup menu (its located close to the bottom of the popup menu) The main point here is to create a button, select the “calculate expression” action, and then select the field you created that stores the SETFIELD and GETSYSPARAM code. We are calling this field the “lock record button expression” field. When you click on the ‘appearance tab in the button designer, you need to click on the ‘Disable on click’ checkbox, and then change the colors to something different from the colors when the button is active. Test Your Code in Runtime When the user clicks on the button, the GETSYSPARAM (11) alert message pops up, displaying the alert message text that you entered. Notice that after the user clicks on the ‘Yes’ button on the alert message, the ‘finalize record’ button greys out. This is because we set the button to be disabled upon click and to change to default colors for background and text. Once the user clicks clicks ‘yes’ on the alert message, and then on the OK button of the form, then the record will lock and will become completely uneditable. 1. Validation controls are triggered upon clicking on the OK button on the form. What this means is that if the user clicks on the ‘yes’ button on the alert message box, and then on the ok form button, and some validations are not met, the validation controls will appear as a popup, preventing the record from actually being saved to the database. If this happens, then the record will NOT become uneditable. Rather, it will revert back to the state of the record before clicking on the ‘finalize record’ button. What this means is that all validation rules will need to be met before the record can be saved to the database and thus become locked. Views – It’s All About the ViewToday I am going to talk about Adesso Views…how to build ‘em, how to manage ‘em, how to add filters to ‘em, etc etc. What are Views for? A View is the very first thing you see when you open an Adesso application. think of Excel…what you see when you open an Excel spreadsheet is a series of workbooks listed on the bottom of the spreadsheet, and when you click on a worksheet, what you see is usually a huge grid of columns and rows. That’s essentially what an Adesso View is…a listing page that displays all or some of the records in a particular table. With Views, you can narrow your listing to a subset of all the records, you can sort by clicking on the column headers, you can expand and shrink the column headers, you can group subsets of records that share common values for certain fields, you can even display a few basic math functions (minimum, maximum, average, and sum). Bottom line: Views are very versatile in Adesso, and you can have as many as you want. For teaching this topic of Views, I am going to use an application we built for the US Army Corps of Engineers as a demonstration on how our software could be utilized to conduct power assessments using Adesso. This database was built to showcase how Adesso could be used to replace paper forms with a digital system capable of capturing kilowatt, voltage, and other data for life sustaining facilities so that the Army 249th Battalion, whose mission is emergency generators, could supply the proper emergency generators to facilities if a natural or man-made disaster occurred. Its a bit more complex than just going to Home Depot to pick up any ‘ol generator and getting UPS to deliver it! Anyway, lets get started on Views. Adesso Views Designer The Views designer in Adesso is used to create grid views that look sort of like what an Excel spreadsheet looks like: a bunch of columns and rows of data. An Adesso view behaves like Excel in many instances, but Adesso is a database engine, not a spreadsheet, so it can do a lot of things that Excel can’t do, but it also can’t do a lot of things that Excel can do (like complex mathematical calculations, cut and pasting from cell to cell, etc). The views designer screen is illustrated below: Whenever you create a new view, it will appear in the right pane in the image above. If you want to sort the list, click on either the Name or Data Source header and it will sort the list by that column. To create a new view, click on the ‘New’ button on the bottom of the Views designer window. Once you do that, a new window will appear on your computer that will look like the following: You will be prompted to give your view a name. What should you call your view? Whatever you want. I tend to name my views by the name of the main sorting function in that particular view. In other words, if I create a view and set it so that that particular view, when first opened, sorts by column X, then I would name that view “by Column X”. By doing it this way, my users already know by just looking at the view that the records in that view will be sorted by Column X. Easy as pie to understand. The only other option in the screen above is the data source you will use for your view. Data source is just another big term for table. When you click on the data source dropdown menu, all the tables you have created in your application will be available as a data source. Simply pick one from the dropdown, name your view, and click on ok. (You can change the view name later, so don’t get paranoid about getting the name just right). Once you select a data source and a name, and click on the ok button, you will see the following window: Notice that there are several tabs across the top of the window. When you first create or open a view, the first tab to be displayed is the Columns tab. Columns Tab The columns tab (shown above) displays 2 separate panes: * The left pane lists all the fields available to you to insert into the view. To move fields from the left pane (the available fields) to the right pane, simply click on the Add arrow or All arrow buttons in the middle. If you made a mistake and want to get rid of a field in the view, click on the Del arrow button. Now notice that there’s a dropdown menu on the bottom left of the screen. That particular dropdown menu will list tables that are available to the view because a relationship has been established between the table being used as a data source for the current view and the table in the dropdown list. If you click on the dropdown, it will look something like this: If you select a different table from this dropdown, the list of fields in the left pane will change to display the fields that are inside that particular table. Notice that in the next screenshot, I have selected the Facility table, and also notice that the left pane contains a totally different set of fields. Notice that the left pane now displays fields but now each fieldname also is followed by a the relationship name inside parentheses. For example, the field mission_no is represented by mission_no(Facility(Assessment-Facility)). The reason it is listed this way is to give you a visual cue that that particular field is not a field that is contained inside the data source table that you are using for this particular view. Rather, it is a field that can be made available to the view because of an established relationship between the data source table and the table that that particular field belongs to. Simple as that. Now that you understand how to place fields in a view, lets go ahead and do that now. I have labeled this view “by State”. What I mean by this is that in this view, I want to sort the records by US State. That means that at a minimum I should place the field ‘state’ in the view. Ok, I added a few fields to the right pane. Screenshot is displayed below: Notice that in the right pane, there are some arrow buttons on the bottom. These arrows are used to push fields up or down. The double arrows push a record all the way to the top or all the way to the bottom. To move a field, click on it once and then on the arrow. Pretty basic. In an Adesso view, as in Excel, fields are displayed in columns from left to right. In the view designer, the topmost column will display as the leftmost column in runtime mode, and the bottommost column will display as the rightmost column in runtime. Min, Max, Average, and SUM Functions * MIN (this will provide the minimum value for the selected field(s) in the entire recordset displayed, including group headers) To run more than one of the functions on a given field, click on the dropdown more than once while highlighting the field you want to perform the function on, and continue selecting the functions you want to run. The field displayed in the right pane will refresh and display, in parentheses, what functions will be calculated for it in that view. Ok, so in this particular view, I want to know the total kilowatts needed by State. How do I do that? First step is to highlight the kw field and select SUM from the bottom dropdown menu. Your screen should look like the following screenshot: Notice that the field kw is now displayed as kw(SUM). This denotes that this field will be summed, with the total sum displayed at the bottom of each grouping and the bottom of the entire recordset. But wait! Do you really want to have the City and State all the way to the right hand side of the grid in runtime? Probably not, especially if we are going to sort the view by State. So let’s move the city and state fields toward the top of the right pane, just below mission_no. Now our screen looks like this: Headers Tab Ok, now back to the Headers tab. When you click on the Headers tab, your screen will look like this: The column header column (on the far left) is essentially the label that will be used to display the name of the column in runtime mode. The fieldname is just that…the field that will be used for populating the column. The miniview column width displays the number of pixels wide that the column will default to when you create a miniview (which is different from a regular view…more about this when we talk about Forms). By default, the number of pixels is 80. The alignment column determines whether the values in that column will be left justified, center justified, or right justified. By default, text and date fields are left justified, numeric fields are right justified, and yes/no fields are centered. However, you can simply click on the alignment column for a specific field and change the alignment by selecting a value (Right, Left, Center) from the dropdown. When you click it, it will look like the following screen: If you want to change the name stored in the column header, just click on the one you want to change, and change it. Self explanatory. Sort Tab Notice that you can have up to 6 different levels of sorting, the first level being at the top of the window. To explain how this works, imagine having a bunch of records that contain the same value for state, and fewer records that contain the same value for city. For example, lets say you have 100 records, and 50 of them have a value of South Carolina in the state field. Out of those 50, 25 have a value of Charleston in the city field, and 10 have a value of Hilton Head in the city field, and so on. If you sort first by state in ascending order and group the records, and the second sort is set to city in ascending order and group those records too, what you will see in runtime is a header for South Carolina, with all 50 records in there but with two more headers: Charleston and Hilton Head. Under the Charleston header, 25 records will be displayed, while under the Hilton Head header 10 records will display. I have decided that for this view, I want to do what I said above, but also add one more level of sort, by facility name. My screen looks likes this: In runtime, my screen will look like this: Notice that because I told the view to group first by State, and THEN by city, you have a series of collapsible/cascading headers, each one expandable/collapsible by clicking on the + or – sign to the left of its name. You can also expand or collapse headers all at once at different levels by clicking on the expand or collapse icons in the icon toolbar. Finally, you should also notice that KW is now totaled at the bottom of each group, at each group level (denoted as TOT on the far left of each total row). That’s because we assigned the SUM function to that field earlier in this tutorial. Let’s get back to the Sort tab. Notice that at the bottom of the sort tab, there is an Appearance section that lets you default the view (if you are using groups in the view) to either display all the records or not display them, and to either display the record count in the header or not display the record count. The way this works is that if you tell it to display the group expanded, then when the user, in runtime, clicks open the view, by default the records will be completely collapsed, and the user will need to pop the headers open using the icons or by manually clicking on each header. Let me show you what this looks like in runtime: If you click on the expand icon once, your screen will refresh and look like this: Finally, notice that there is a number in parentheses to the right of each header. This is the record count. If you want to hide this record count, all you need to do is click on the checkbox called “Hide record count in group headers”. This checkbox is listed at the bottom of the sort tab (screenshot is displayed below): Print Tab Unfortunately, there’s not much in the print tab to work with. This part of Adesso is admittedly weak, and we need to improve this. Plans are to build a much-improved print feature in the next major release, Adesso v5 (we are currently on v4.1.3). But for now, it’s merely a way to create simple print output formats for record listings. Printing detail forms is not supported currently…only grid view/record listings. Events 1. Create a new record The purpose of events is to allow the application designer to control the behavior of data entry and data record detail display associated with a view. In other words, when a user wants to look at an existing record, he double-clicks on the record in the view. When a user wants to enter a new record, he clicks on the “new Record” menu. What happens next is controlled by these so-called “events”. When you click on the Events tab, you will see the following screen: Notice that there are two main functions on this screen: 1) New Record; and 2) Open Record. you will also notice that for each of these event types, there are two separate options: 1) Navigate to form; and 2) Call Plug-In. By default, when you create a view, it will automatically use the default form for both types of events. However, if you create multiple forms for a particular table, you can select a specific form from the dropdown menu for either event or both events. Let’s say you want to hide some fields if a user is going to open an existing record, but you want the user to see a completely different form with more fields in it if he is creating a new record. You can select a particular form for new record events and a completely different form for opening records. To select from a listing of available forms, simply click on the dropdown box. If you only have one form, the dropdown will only contain that one form plus a conditional statement. If there are more forms available for that table, they will all show up there, plus the conditional statement. Let me show you what the dropdown menu looks like when you have created more than one form for a table. In this new example app, we have built several forms for the same table. Notice that they all appear in the dropdown, in addition to that conditional statement: To select a form, simply select it from the dropdown. Conditional Form Selection You can create extremely complicated expressions, but its not too difficult and shouldn’t scare you. The complicated expression that I am using for this particular conditional statement is a series of nested IF statements. The entire expressions is listed below: Notice the pattern here: IF the first 3 characters in the field Inspection_id = “something of importance”, then use the form labeled “DiscrepancyCIP1″, ELSE, IF the first 3 characters in the field …. and so on and so on. The syntax for forms is GUIDOF([Forms!FormName]) To simplify things, think of it this way: IF(field_x) = “value you are looking for”, GUIDOF([Forms!FormX]), GUIDOF([Forms!FormY])) I hope this makes sense. Run Plug-In Event from a View Notice that in this example view, instead of selecting a particular view created in Adesso, we are selecting a plug-in labeled PickupForm for both types of events. Discussion of plug-ins is beyond the scope of this particular blog post (I will talk more about plug-ins in a separate blog post). Although we are triggering the plug-in by itself, notice that you can trigger the plug-in AND select an Adesso form at the same time. In our particular case, we only want to pop open our own customized form. In runtime, when the user creates a new record from this view, it will run the plug-in, and this particular plug-in opens an input form of our own, as illustrated below: What we wanted to do was create a form with 2 giant buttons only (along with a big cancel button). While you could do this in an Adesso form, there are some functions running in the background when the user clicks on either button that cannot be done in a native Adesso form. So we chose to build a plug-in in .NET to create a very specific form. NOTE: if you use your own forms via the plug-in architecture, you need to know that you will need to create your own validation controls in .NET. In a native Adesso form, you can create validation controls pretty easily, but they won’t be available for custom forms…you will have to do this manually. Appearance Tab The appearance tab allows you to select a theme for the coloring of the rows, headers, fonts, etc. Themes have their own designer from the main Application Designer screen. Build a theme from there, and it will be made available in the dropdown menu from the themes tab. Other Tab When you first click on the Other Tab, it will look like this: Filters Notice that in the filters section of this tab, there is a required view filter and a default view filter. A required filter is just that: the view will ALWAYS use that filter, and won’t let the user de-select the filter. The default filter means that the view, when first opened by the user, will use that particular filter as a default, but the user can take the filter off or change it to a different one. The display XX lines per row defaults to a value of 1 but can be changed here. The do not include this view in the list view checkbox, if checked, means that users in runtime won’t even know that that view even exists. You may want to build invisible views that you use for 04m controls within forms, and for import and export templates that you don’t want your users to see in runtime. Disable statistics means that no record counts will be displayed in headers, etc Automatically recalculate expressions on open means that when a user pops open a record, all the expressions in that table will recalc. Buttons Part II – A Closer Look at Button ActionsToday I watched a live feed from Engadget (http://engadget.com) and saw the unveiling of the Apple iPad. Man, I want one of those. That thing is awesome. Makes my Kindle look like a piece of crap. Heck, it makes Windows and Windows Mobile look like crap. I want our software to run on the iPad. Fortunately, we own the source code for Adesso, and we have a few crack programmers who could probably make it happen. All in time. Maybe by the end of this year, maybe. Ok, enough said about that. On my last post, I talked about how to design buttons in Adesso. Today we are going to look at a few of the more complex types of buttons, with the principal point of showing you real-life buttons, what they look like in runtime, and what they do. Run Plugin Action A few notes about plugins: * in order to run a Crystal Report plugin, you will need to have installed the Crystal Report runtime engine (its free and provided by SAP) on your PC. If you need it, email me and I can get it for you The screenshot below illustrates 3 buttons that are used to generate a document in 3 different ways: 1. Print TA – generate document and display it in a Crystal Report form Print TA (Crystal Report Format) On the upper left corner there are a few icons. The leftmost icon is an export menu, which, when you click on it, displays a dropdown menu that allows you to select a format to export to. Choices include Crystal Report (.rpt), Word (.doc), Excel (.xls), .rtf, and xml. NOTES: * in order for this menu to work, you need to have MS Office installed on your PC. Generate TA PDF (Adobe Acrobat Format) When you click on the button, your screen will look like this:
When I click on the Print TA button, the button designer appears, as illustrated below: The core of the functionality produced by the button is the Run Plug-in action. Notice that when you select “Run Plug-in”action from the action dropdown, the dropdown menu below will populate with the plugins stored in the plugin designer section of the application Notice that the plugin being called by this button is labeled “PrintTAFormReport”. Now we know that we need to look for this plugin in the Plugin designer section of the Application Designer. So the next step is to close the button designer and the form, and click on Plugins from the left pane of the Application Designer. When you do this, you will see all the plugins that have been created for this particular application. One of them is called PrintTAFormReport. Double-click on this plugin to take a look at it. The main piece here is that this particular plugin is calling a resource called NCSLTAForm.dll and allowing buttons, expressions, and events to trigger the use of that DLL. In a nutshell, you need to design the DLLs outside of Adesso and import them into Adesso. In its current state, Adesso DLLs should be created in Visual Studio 2005, and they need to target/be compiled for .NET 2.0 Framework. We will be updating Adesso to .NET 3.5 sometime this year. To import your DLL into Adesso, you need to navigate to the Resources section of the Application Designer and click on the New button on the bottom. Your screen should look like the following. Notice that the DLL called NCSLTAForm.dll is in there. Both of the other 2 plugins (Generate TA PDF and Email TA to DENR Mgr) operate under the same concept: 1. Create a form or .NET executable in something else like Visual Studio 2005 Read GPS Action This action is a much simpler one to create…no DLLs or external applications to worry about…you can do this right from within Adesso in a matter of a few minutes. The basic principal behind creating code that can read a GPS device is as follows: 1. Create your GPS fields in your tables first. They must be of float data type and of display type GPS. The following screenshot illustrates what the form would generally look like: In the form above, I created a big red rectangular button that has a label on it “Update Lat/Long from GPS”. Below the button I have two fields that would populate with values read from the GPS device. The last piece in this puzzle is that your device needs to be connected to a GPS device. Many PPCs come with integrated GPS devices built-in. And some use compact flash slots or SD cards for the GPS. regardless of the type of GPS device, you need to assign a port number in the preferences section of Adesso Client (Tools>Preferences menu). A screenshot of this is displayed below: Field types that you create to assign latitude, longitude, and altitude should be float type. The field designer is illustrated below: The dropdown menu in the GPS Control has several options which you can select to read from your GPS device. Finally, to create a button that can be used to read the GPS device, simply add a button to the form where your GPS fields are, and select “Read GPS” from the action dropdown. Your button designer should look like the following: This action type is very popular and powerful. You can use it to create child records from a parent table. When you do this, the fields in the child table that are connected to the parent table through the 02m (one-to-many) relationship automatically pre-populate with those values. This makes it nice because the child record will retain the relationship to the parent record as long as there is uniqueness within the relationship. An example of this type of button is illustrated below: Typically, this type of button control is used on the same tab as an 02m grid that is used to display the child records that are related to the parent record displayed on the form. In the example above, the 02m grid is displayed above the large button labeled “New Line Item”. In the Application Designer, the form looks like this: The button control is very simple. It is displayed below: To trigger this type of button action, all you need to do is select “New One-to-Many Record” from the Action dropdown menu, and then select the correct relationship from the Parameter dropdown menu. Of note here is that the relationship that you select must be on the same tab on the form. New One-To-Many Record Using Tags A second way to create child records from a parent record using a button control is to select an action type called New One-to-Many Record Using Tags. This action type is useful when you have more than one form for a table. It is basically used to navigate the user to the correct input form for a table that has several forms. In runtime, the button looks exactly the same as any other button. But in the Application Designer, you have to do a few things to get this action right. A screenshot of the an example form is illustrated below: In this particular form, there is a 02m (one to many) grid above the button. That particular 02m table has several forms associated with it, so in order to open the correct form, we can use tags. If you double-click on the 02m grid, you will see the following 02m designer screen: Two important things to notice about this screen: the Tag number (top part of the form control properties window), and the Display View dropdown menu. The Display View menu, when clicked, will show you several views available for the 02m, as illustrated below: Each view listed in that dropdown has different filters and form events assigned to it. Let’s take a look at the view that we have selected: IncludedLowFlow: Notice that in the Events tab, you can navigate to a specific form for two different action types: creating a new record, and opening an existing record. For this particular view, we have chosen the GW Sampling – LowFlow form, a very specific form with certain fields and tabs on it. Since this view has a specific form assigned to it for both action types, if the user navigates to this view, then if he opens an existing record or creates a new record from that view, it will open that very specific form. So, long story short, if you want to create a button that will navigate the user to that very specific form, you need to use the button action of New One-to-Many Record Using Tags and assign the correct tag number on the 02m grid that navigates the user to the specific form you want to open. Lets go back and take a look at the 02m grid properties. Notice that the tag ID assigned to it is 1. You can give this tag any number between 0 and 255. Default ID is 0. We have chosen to give it an ID of 1. All you really need to do at this point is make sure that the Tag ID in the parameters box below the button action is the same number as the tag ID in the 02m grid properties. Since we assigned it a value of 1, then the parameters box has a value of 1 in it as well. That’s how this works. Once you do that, the correct form will appear when the user clicks on that button to create a new child record. Calculate Expression Action This is one of the more powerful button features in Adesso. With this feature, you can trigger a calculation, an action, etc with the click of the button. You can also disable the button after clicking on it once, thereby giving you additional control on when the button can be clicked. To use this action, there are several steps. We will peel back, or reverse engineer, how this functionality operates in Adesso. Let’s take a look at an example button that uses this feature: In this example application, we are going to take a closer look at the BP Presented button. It’s the one on the top left of the form window. This particular application was built as a demonstration on how Adesso could be used to track the amount of time it takes an airline passenger to go through security at an airport. In the case of the BP Presented button, we want to be able to click the button when the passenger hands his boarding pass (BP) to the TSA employee. In the background, when the button is clicked, several actions are being performed: a time stamp is stored in a field; the button becomes disabled; and the foreground color of the button changes. In this particular example, we are disabling and changing the color of the button programmatically, but it can also be done through the button GUI. In runtime, if the user clicks on the BP Presented button, it will become disabled and change colors, as depicted in the screenshot below: Notice that the button now has a white background. Although the user doesn’t see it, a timestamp is also created and stored in a separate field. Let’s take a look at what’s going on behind the scenes. A screenshot of the main form and button designer is presented below: Ok, notice that the button action is “Calculate Expression”, and the Field dropdown menu has a field labeled “B_BP_Pres”. Basically, when you select “Calculate Expression” from the action menu, you will then be able to select a specific field from the list of all the fields in the table associated with the form. All you need to do is select the field that contains the expression you want to run, and presto! it’s done. Ok, not so fast. Let’s take a look at that field that we selected, and see what it says: A fe things to notice. In the Field properties box (on the left in the screenshot), you will notice two key elements: Is Local is checked, and its an expression display type. Is Local is checked because you don’t want to sync the values in this field back to the server…there’s no need to do that, this is a local action only, and other users using this field will have different values in that field when they use it, so the chances of creating conflicts during sync increases if this checkbox remains unchecked. Remember that local fields don’t pass the values in them back to the server…they are treated as null values. When you click on the settings button (next to expression display type), the expression editor appears. A key element here is that “calculate via button only” is checked. What this flag does is disables the expression from running EXCEPT when it is triggered by a button. You don’t want to trigger this expression every time the user opens the form…only when the user clicks on the button. Finally, the expression itself {EXEC(“FORM:SetBkgColor”, 2, 16777215);EXEC(“FORM:Enable”, 99, 1);SETFIELD(times_paused, 0);SETFIELD(BP_pres_stamp, NOW());} Is a series of functions separated by the semi-colon, and all within curly quote {} brackets. If you want your expression to do several actions, that’s the syntax that you need to use. Notice that we are assigning background colors, then disabling the button all programmatically. This can now be done by using the button designer GUI. The last 2 functions in the expression above are assigning values to other fields. This is done by using the SETFIELD function. I am not going to elaborate on functions and how to use them in this blog. We will cover expressions in future blogs….it will probably take 3 or more blogs just to cover expressions and how they are used. Ok, I think I’ve covered some basic elements of how to use buttons in Adesso. Next time I will review Views, Filters, and Forms, and how you can use them to get to the data you want to see. Buttons, Buttons, Buttons! – How to Create Buttons on Adesso FormsOn my last blog, I wrote about Pesto Garden, Inc., and how to build a bathroom quality control inspection system. I mentioned that I would continue tweaking that app, but I feel like tackling something more interesting today: buttons. Today, I am going to dive into button controls…how to build buttons and assign them actions on an Adesso form. This will be part 1 of 2 (or 3) parts. This first part we will review the button designer and what you can do with it. In part 2 of this blog series, I will show you some real buttons in real applications that I have built, and what actions those buttons perform under the hood. Where are button controls found? Once you select “Button” from this popup menu, your screen will look like the following: While this window appears simple enough, there are quite a few controls here. Notice that there are two tabs: an ‘Action’ tab and an ‘Appearance’ tab. The Action tab is exactly that…specifying the action that a click on this button will perform. The appearance tab specifies what the button will look like. We’ll take a look at the action tab first. Action Tab Type Dropdown * Standard When you first create a button control, it will default to Standard. * Standard buttons are exactly what they sound like…basic buttons with some basic color and appearance settings found on the ‘Appearance’ tab. * Hyperlink buttons are simply links, that when clicked on, navigate to a particular URL or perform some action specified in the Action dropdown. * Image buttons are button controls where you can specify images for two separate states of the button: when inactive, and when a user clicks, or presses on it. Adesso comes with several button images stored in folders, and you can drop additional images in those folders, or navigate to your hard drive to select a specific image. Images can be anything…rectangles, arrows, icons, etc. If you select Image from the Type dropdown, two additional parameters will appear in your window, as illustrated below: The two additional parameters are Regular and Pressed. Regular means what the button looks like in inactive state. Pressed means what the button looks like when a user clicks or taps on it, and remains that way while the button is pressed, then reverts back to Regular once the user releases the button. There is an icon with three dots to the right of each dropdown. If you click on that icon, a navigational window will appear that will allow you to navigate through your hard drive to find and select an image. The dropdown will display recently used images for faster selection. Standard Image Folders in Adesso If you open the ButtonShapes folder and view the items, you will see the following default button images: Now, don’t get me wrong here, these are not just ugly images, they are FUGLY with a capital F. However, what you need to understand here is that these are simply basic button images in folders…yes, folders. What this means is that if you have your own graphic-artist quality images that you want to use for buttons, just copy them into these folders, and presto! they will be available for your app right from here. The ButtonShapesPressed folder includes very similar images, but with slightly different colors/gradients. By using these in pressed mode state, the user will see a slight change in the button when he clicks on it, giving the illusion of a click action. The screenshot below illustrates what the ButtonShapesPressed folder looks like. Action Dropdown When you click on the dropdown, you will see a series of actions that you can select. Your popup menu will look like the screenshot below: Some of these actions are pretty obvious, so I won’t waste my time explaining what Zoom In, or Save Record mean. Ok, just in case, lets go thru some of these. When the user presses the button, the following actions are performed for the following actions listed in the dropdown menu: Zoom In – the form zooms in one level from current level I’m not going to show you each and every single action on this list…too much writing. I will show you a few that are more complex than your typical Save Record action, but I will leave this for another section of this blog, or maybe the next blog (depending on the # of bottles of Guinness in the ‘fridge). Let’s move to the other tab in the button designer. Appearance Tab If you select ‘Standard’ from the Type dropdown in the Action tab, the ‘Appearance’ tab will look like the following screenshot: If you instead select ‘Image’ from the Type dropdown in the Action tab, the ‘Appearance’ tab will look like the following screenshot…notice that there are slight differences…The height and width are displayed in pixels. this is set up that way because we are using images instead of the standard rectangle for your button shape. You will also see a preview of your button in the preview area on the bottom of the window. Disable on Click Shape On my next blog I will show you some real buttons, what they look like on an Adesso application, and what they actually do. Building a Mystery Shopper (Bathroom QA) ApplicationPesto Garden, Inc. Bathroom QA Application Ok, lets get started building a fun application. Let’s say you were hired by Pesto Garden, one of the many Italian restaurant chains in the US. Your boss, Mr. Pasta Lasagna, just read a news story about how the new White House administration thinks that technology can improve the healthcare industry via e-records and other neato things that high tech gadgets and computers can do. Mr. Lasagna thinks that if it can work in healthcare, why not in restaurants? So he tells you that you need to build a system to collect bathroom cleanliness data electronically so that he can quickly tell which of his restaurants are providing a clean bathroom experience to its customers. So your new assignment is to develop a quality control program that helps improve the restaurant’s bathrooms. You decide that collecting this information in offline mode is the way to go because not all of Pesto Garden restaurants have internet access. Besides, not having to rely on Pesto Garden’s crappy and unreliable internet service, even when it is available, won’t slow you down on your job. Before you build your application, you first have to think about what sort of data you will be collecting and how to store it. Think of it in terms of one-to-many relationships. Each restaurant is a fixed location. You will store information about each restaurant like its address, city, state, its capacity, when was it opened for the first time, etc. Each restaurant most likely will have more than one bathroom, so you need to create a table to store bathroom information such as the the bathroom number, whether its a men’s bathroom, women’s bathroom, or unisex bathroom, the number of toilets, number of stalls, urinals, sinks, etc. You then need to assume that your QA program will require that someone from your department will be visiting each restaurant more than once, maybe once every three months. So the inspection information would be stored in a many table and would contain things like the inspection date, the inspector name, what the bathroom conditions were like, etc. Another table you probably want to build would be an Inspector table. Here you would store information about the inspector conducting the inspection…his name, contact info, and so forth. STEP 1 – TABLES AND FIELDS So lets launch Adesso and build four tables: 1) Restaurants; 2) Bathrooms; 3) Inspections; and 4) Inspectors. We will build the easiest one first. Restaurants. Once you create your application and the Restaurant table, you will be presented with the following screen, which is where you create fields that become part of that table. I am going to create a bunch of fields that should go in the Restaurant table. Most will be plain text fields, some will be listboxes so that you can enter State in there, and some will be numerical type of fields. A screenshot of the ‘state’ listbox is presented below. For the ‘State’ field we are simply adding static text to the listbox for each state in the US. I also added a photo field…to store a photo of the facility itself, maybe the entrance of the restaurant. To create a binary field and assign it a display type of image, see the screenshot below. Notice that you can set the binary image to download always, on request, on a condition, or not sync at all. These options are there because remember that we are dealing with an offline database system that runs on small devices. You have to be careful when designing your application as to what the target device(s) are going to be. If you choose ‘on request’, the image will be uploaded to the server once the user syncs, but when someone else syncs to the database, only the header information will download from the server, sort of like email headers. If that particular user wants to download the image, then he will have the option of marking the binary file for download upon next sync. Ok, we have completed building the Restaurant table, your table editor should look like the screen below. OOPS! I just realized that we haven’t even discussed the idea behind ensuring a unique identifier in each table. Notice in the above image, there’s a field called restaurant_name. We can assume that this field is the one that would contain a unique value for each restaurant. That means that the user cannot enter “Pesto Garden” into each record. If he does, then how would one know Pesto Garden #10 from Pesto Garden #251 in the database? One way to tackle this is to use a unique names or a unique restaurant ID number that was assigned by Pesto Garden in their accounting system. However, this company is still in the dark ages and doesn’t do that, so we have to figure out how to assign a unique value to each record on our own. One way to do this is to create a “restaurant_no” text field and give it an expression of RECORDID(). This function uses a hexadecimal function to assign a unique value to the field. Remember that this is an offline system, so there’s no way to autoincrement the value without potentially causing conflicts with other users. So let’s go ahead and add a new field called restaurant_id_no and give it the RECORDID() function as an expression. Now that we have a unique identifier in this table, we will go ahead and create the bathroom table. I will create fields for bathroom type (mens, womens, or unisex), # of toilets, # of urinals, trash receptacles, etc. Don’t forget to also include a unique identifier for this table too. My table looks like this: Note that there is a restaurant_id_no field in the related bathroom table. In order to connect the Restaurant table to the Bathroom table, all you need to do is create one single field in the Bathroom table that will act as the “connector” field to connect the two related tables. I usually name the fields exactly the same in all the tables to make it easy to know that it is a “relationship” field. Remember my prfevious blog post when I talked about relationships: always think one to many. In this case, one restaurant can have many bathrooms. More about relationships later in this blog post. Inspection Table Inspector Table Notice that I have included both a comments and a recommendations field. If you want to include an autowriter widget next to the field on the form, so that the user can simply select commonly-occurring things from a checkbox list, then all you need to do is click on the settings button next to the display type drowdown, select autowriter, and then click on the edit button. Here you will have the ability to enter all the values you want to display from the autowriter widget. See screenshot below: STEP 2 – RELATIONSHIPS The very next step in building your bathroom QA application is to connect the tables to each other. Remember to ALWAYS think one to many. In our case here, each restaurant can have many bathrooms, and each bathroom can have many inspections. By logical deduction, then each restaurant can also have many inspections. And each inspector can also conduct many inspections. If you understand this one concept, then you have what it takes to build a database application in Adesso. Building a Relationship Between Restaurant and Bathroom There are two types of relationships in Adesso: a one-to-many (O2M) and a one-to-one (O2O) relationship. A O2M relationship is exactly what we described above, where, for example, one restaurant can have many bathrooms, and one bathroom can have many inspections. In Adesso, a O2O relationship is exactly the opposite. This concept may be difficult to understand, so for purposes of building good Adesso applications, all you really need to know about relationships is this: if you build a O2M relationship between two tables in Adesso, you need to build a O2O relationship in the exact opposite direction between those same two tables. The reason for this is for allowing the many, or child, record to be able to display fields from the parent onto its form and its views. More on this later. The easiest way to start is to first build a O2M relationship, then build the opposite O2O. Although you can use any naming convention you like, its good practice to follow something like this: Table1 > Table2. That way you know which tables are related, and in which direction. Notice that the icons are slightly different for the two available relationship types. In or case here, name the relationship Restaurant > Bathroom and click ok. Your screen will look like this: Notice that there is a Master table and a Detail table. This is the same thing as a one table and a many table. The Master table = the one table, and the Detail table is the many table. this is also referred as a Parent to Child relationship. Parent = Master = One. Child = Detail = many. Now you can see why it is important to include a field in the many table that is the labeled the same in the one table…it makes it easier to connect them to build the relationship correctly. You will also notice that there are three field dropdowns for each table. This feature allows you to create uniqueness within the many table by narrowing down the list of records in the many table that will match up. The more fields you use, the fewer records will match. However, it is not absolutely necessary to use this if you are creating uniqueness in your application in another way, such as using the RECORDID() function. In such a case, all you need to do is connect the tables by selecting the same field that is present in both tables. Ok, once you create a O2M relationship, you need to create an exact opposite O2O relationship for the same tables. Click on New, type in Bathroom > Restaurant, and click on the One to One icon. Your screen will look like this: Note that an O2O relationship contains a display view dropdown. From here you would select the view that you want to display when a user clicks on a related field widget (more on this later). Since we haven’t built any views yet, you can leave this dropdown alone and come back to it once you build some views. Now you will need to build O2M relationships between Restaurant > Inspection; Bathroom > Inspection, and Inspector > Inspection. Then you will need to build O2O relationships in the exact opposite direction for these table pairs. Your Bathroom > Inspection relationship should look something like this: And your Inspector > Inspection relationship should look something like this: Your main relationships designer screen should look like the following: STEP 3 – FORMS Now that you have connected the tables, we need to build forms for each table. In Adesso, you can create an unlimited number of forms per table, and link different forms to different filtered views programmatically by using different events or conditions. This gives you the ability to use the same table to store data, but navigate a user to a completely different form depending on where he is or what he is looking at in the database. Very powerful. For purposes of this simple application, we will focus on building only one form for each table. The Form Wizard To create a form, click on the Forms icon on the left pane of the Application Designer screen, then click on ‘New’ on the bottom of the right pane. Before entering a name for the form, click on the Data Source dropdown and select a table. In this case, select the Restaurant table. Notice that Adesso will automatically name the form the same as the table name. You can change the name manually, but for now, leave it as is. Note that there are 3 form types: Data form, Home form, and Startup form. Almost all your forms will be of type Data form. The Home form is a special form that allows you to build dashboard-style screens for both PC and PPC. The Startup form is essentially a simple splash screen that displays at launch only. It is typically used to display author information, version numbers, logos, etc. For our bathroom qa app, we will stick to data forms only. Once you click ok, the wizard will pop up a window asking if you would like Adesso to create the form based on your field definitions. Click yes. The initial form will look something like this: In Adesso, you can place a maximum of two fields on a row. While this is a limitation, keep in mind that the forms need to be readable on PPCs, hence the limitation. Despite this limitation, you can still build very powerful and aesthetically pleasing forms in Adesso that provide a lot of flexibility. I will show you how. On the form in the example above, notice that there are labels on the left, and fields on the right. They are separated from each other by a large vertical line. This is a slider. If you move the slider from left to right, you will give the labels more space while shrinking the space available for the fields. These screen constraints are set so that the application designer can effectively build an app that can be viewed on a PPC. If your target devices are PCs (and not PPCs), its ok. Users can stretch the forms however they want in runtime. On the top of the form you have two menus: Tools and View. Most functionality is available from the Tools menu: validation conditions, form style, form properties, and tabs. See screenshot below: The validation conditions menu function allows you to set an unlimited number of validations that are checked when the user tries to save the record. If a condition is not met, a popup is displayed with the error condition that the app designer enters for display. All functions that are available within Adesso are also available in the validation conditions section of the form. The form style menu allows you to select a predefined style or create your own custom style. The form properties menu allows you to set the default size of the window on a PC, the total height of the form (maximum = 100 rows), select a background image, and basic form background colors. The tabs menu is where you create tabs for the form, and in what order they will appear on the form from left to right. You can also hide tabs if you want to force the app user to navigate to tabs using button controls, for example. Form Designer Controls & Tips * To drop a field into a row, simply click on a blank row and a popup will appear where you can then select a field from that table or its related one tables, where you have created O2O relationships. I went ahead and formatted the Restaurant table somewhat. Screenshot is provided below. We will go over some of the form items now: * When you create tabs, a section at the top of the form is then split by a horizontal line. this horizontal line signifies that everything above that line will display on each form, while everything below the line will display only on the respective form. To move the line up and down, simply drag it up or down. Please note that in order to move the line, the form has to be large enough in height (Tools>Format>Form Properties) and/or have enough blank spaces. When you click into a blank field, your screen will look something like this: If you right-click into a blank field, the popup will instead look like this: If you select a button control to place in a blank field, the button designer will look like this: Notice that with buttons, you can do all sorts of stuff. In our case, we want to read the GPS on the PPC, so we select an action of Read GPS. Now take a look at the second tab I created for the Restaurant form. The control I placed below the static text is a O2M control which displays the related many records. To load this control onto the form, simply click into a blank row, and select ‘Restaurant > Bathroom’ from the popup menu. O2M grid controls are labeled with the same names that you created them in on the Relationships designer. Once you drop a O2M grid control onto the form, you can then click on them to change its design. Screenshot of this is displayed below: Of key importance is the display view. We haven’t created any views yet, but you will want to later go back into this control and select one from the dropdown menu. This allows you to fully control what displays in that grid view from within that form. Very powerful feature. Once you have created all your forms, you can then proceed to creating your views. STEP 4 – VIEWS Building views is relatively straightforward. To get started, click on the views icon on the left pane of the Application Designer. Click on the ‘new’ button on the bottom of the right pane to create a new view. The following screen will display: enter a name and a data source. The data source is simply the table. Same thing. A note on views: * Views are merely sorting and grouping views of the records stored in the table When you create a view, you will be presented with the following screen: I pushed several fields into the right hand side of the screen, then made sure the field labels/headers made sense and were justified correctly. Then I clicked on the sort tab and told it to sort by restaurant_name field. Screenshots of these tabs are listed below: STEP 5 – TESTING YOUR APPLICATION Once you create a few views for each table, you are ready to test your application. The following is a screenshot of the restaurant table and form while entering our first restaurant record: Once we enter a restaurant record, then we can enter a bathroom that is inside the restaurant. To do that, navigate to the bathroom tab on the same form and click on the button. Bathroom records created from this form will associate with its parent and show up in the O2M grid box in the screenshot above. the following screenshot is the view you will see when entering a new bathroom record. Note that I have used two different types of input widgets for numerical values: a spinner, denoted with two arrows < > . Click on the right arrow to increase the number, and click on the left arrow to decrease the number. The other type of widget available for numbers is a numerical keypad, as illustrated below: After taking the screenshot, I notieced a mistake on the display type for the yes/no fields on this form. I changed the yes/no field sfrom display type of text to checkbox. Screenshot is displayed below: Once you enter a record for restaurant and a record for bathroom, you are ready to test the inspection table. To test, click on the Inspections tab and click the button to enter a new inspection record. You will notice that the Inspector field doesn’t have any values in it. This doesn’t mean that that field is messed up…it is because we haven’t actually created any records for the Inspector table. We can add records for that table later. Now let’s click on the Notes tab: Notice that there’s an autowriter widget to the right of the comments field. It is populated with the autowriter items we created when designing the Inspection table and fields. you can check boxes off in the autowriter, and then edit them within the comments field later. Fully editable comments. The photo field allows you to select a photo from your hard drive, and it also can drive an integrated camera on a PPC device directly. The sketch field is simply a doodle field. The audiro field allows you to record an audio clip as long as your device has a microphone. My Very First Post – Introduction to Adesso DevelopmentHi, This is my first weblog post, ever. I am usually a private person who doesn’t post much…even on Facebook and LinkedIn, I don’t like to post many status updates. So publishing something public is something somewhat uncomfortable for me to do. However frightening it is, its also somewhat exciting to be able to share some Adesso application development tips, tricks, how-to’s, and new features. Over the course of 2010 I will post various topics on how to build Adesso applications quickly, how to design forms with button controls to do cool things, and how to basically improve Adesso applications. Hopefully these post will actually be read by some people and through sheer curiosity, those people will try these tips out on their own. Perhaps some people that don’t even know what Adesso is might even give it a spin. n December 2007, Adesso Systems filed for Chapter 7 bankruptcy protection. Their focus changed into developing and marketing an application developed in Adesso called Tubes, which was targeted to the consumer market. Venture capital ran out, and that was that. In May 2008, Terraine, Inc. purchased the intellectual property of Adesso. By August 2008 our build environment was up and running, churning out new versions of Adesso executables. It is now January 2010, and we have succeeded in building many applications for various clients in several markets. The source code is continually improving, and features we had never thought about and which were suggested by our clients are slowly being added. We are about to kick off a true web client for our software…code named Project Mermaid. With this new functionality, users of Adesso will be able to build an application in Adesso that works offline on PPC and PC, and out-of-the-box, the entire system will automatically work using a standard web browser in online mode. Validation control, expressions, and forms will have virtually the same look and feel as the Adesso Client experience. We are very excited about this new enhancement to our product. Barring any unforseen problems, expect to see Version 1 of Mermaid sometime in March 2010. About Adesso (very brief) The Adesso Application Designer – Part 1 (Tables & Fields) Ok, now that that is finally done, I can move on to the good stuff…examples of cool things you can do with this stuff. However, in order to show you the cool stuff, you must first have a basic understanding of the Design Environment. For purposes of this Blog, I will assume that most everyone has already downloaded the Adesso Client application and is somewhat familiar with it. If you haven’t, go here to download it: http://navfac.net (u: adessouser; p: adesso). It’s a free download. In this first part of describing the Adesso Application Designer environment, I will first go over the most basic elements of the Designer environment. To create an application, go to File>New Application and enter a name and path to store the app. After that, your first screen will look like this: It’s an OFFLINE System, So Keep that in Mind Another thing to keep in mind when building an Adesso database is that you need to consider the target devices or devices that will be used. If your target device is PPC only, then you have to try to build your app in a way that is nimble, with a small footprint. After all, PPCs are small and don’t have much memory. The easiest way to fail is to build a large database with more than 25 tables, dozens of large plugins, and a large number of big graphic files. It is much better to build a few small applications than one large one. Adesso contains an instantiation/data propagation feature on the server side that allows sharing of schema and records for common elements, so it is easy to build very small apps that run very efficiently on small devices without losing a lot of features. In the case of Adesso, small and nimble is better than big and feature-rich. The more you program with Adesso, the more you will see that you can build a small efficient application that is also very feature rich. Another thing to keep in mind when building an Adesso database is that you need to consider the target devices or devices that will be used. If your target device is PPC only, then you have to try to build your app in a way that is nimble, with a small footprint. After all, PPCs are small and don’t have much memory. The easiest way to fail is to build a large database with more than 25 tables, dozens of large plugins, and a large number of big graphic files. It is much better to build a few small applications than one large one. Adesso contains an instantiation/data propagation feature on the server side that allows sharing of schema and records for common elements, so it is easy to build very small apps that run very efficiently on small devices without losing a lot of features. In the case of Adesso, small and nimble is better than big and feature-rich. The more you program with Adesso, the more you will see that you can build a small efficient application that is also very feature rich. Tables and Fields Once you create your table, you will be presented with a new screen to enter fields for this new table, similar to the one below. To create a new field, click on the new button. Once you click on the new button, you will then be presented with the field designer window, similar to the one below. From this screen, you will be able to enter a fieldname, a default field label, a field type (text, integer, float, boolean, date/time, binary), and settings for each type of field. You will also have the option of not allowing a user to save a record without entering something into that field (Is not NULL), indexing the field, is a unique field (on the local database only, since this is an offline system), and a local field. Local fields are used for instances when you don’t want to sync the value in the field back to the server. A typical use for this field are date ranges used for printing Crystal Reports. You don’t really care what the actual value in the field is because its going to be unique for each user. I will explain more about using local fields in a future blog. I will stop here for now, and the next blog I will use a generic inspection form as the basis for building a simple application using Adesso. We will cover all the field types available in Adesso next. |
Latest Posts
|



The dining choices in Gallipolis on a weekday night are pretty limited. We ended up in a bar/restaurant that was probably named “The Bar/Restaurant”. Jim asked the bartender what kinds of dark beer they had, and the bartender thought about it for a bit and said, “We got Michelob.” Between the bad beer, the cigarette holes in our crunchy bedspreads, and the on-again, off-again fluorescent sign glaring in our windows, Jim looked at me and declared that I am never allowed to choose the hotel that we stay at — not even the town we stay in — ever again.








































































































































































