I have posted the code from class related to writing and reading text files at GitHub
Wednesday, July 31, 2013
Tuesday, July 30, 2013
Misc SQL Server Stuff (Hash, backup, fulltext)
Declare @password Varbinary(5000) Declare @passwordseed DateTime Set @passwordseed=GetDate() Set @password=HashBytes('Sha1', cast(@passwordseed as NVarchar) +'P@ssw0rd1') Select @passwordSeed as seed, @password as [password] use Automart Alter table Customer.RegisteredCustomer add HashedPassword varbinary(5000) Update Customer.RegisteredCustomer Set hashedPassword=hashbytes('sha1', CustomerPassword) where RegisteredCustomerID=1 Select * from Customer.RegisteredCustomer Declare @myPassword nvarchar(20) set @myPassword='amypass' Declare @hPassword varbinary(5000) Set @hPassword=hashbytes('sha1',@myPassword) if exists (Select hashedPassword from Customer.RegisteredCustomer where hashedPassword=@hPassword) Begin print 'Successful Login' End Else Begin Print 'Login Failed' End Declare @myPassword nvarchar(20) set @myPassword='jpass' Declare @hPassword varbinary(5000) Set @hPassword=hashbytes('sha1',N'jpass') if exists (Select hashedPassword from Customer.RegisteredCustomer where hashedPassword=@hPassword) Begin print 'Successful Login' End Else Begin Print 'Login Failed' End --backups -- change recovery model ALTER DATABASE Automart SET RECOVERY SIMPLE; --ALTER DATABASE Automart SET RECOVERY BulkLogged; ALTER DATABASE Automart SET RECOVERY full; -- create a full backup of Automart BACKUP DATABASE Automart TO DISK = 'C:\Backups\Automart.bak' with init; use Automart Alter table Customer.RegisteredCustomer add HashedPassword varbinary(500) -- create a differential backup of Automart appending to the last full backup BACKUP DATABASE Automart TO DISK = 'C:\Backups\Automart.bak' with differential; -- create a backup of the log use master; BACKUP LOG Automart TO disk = 'C:\Backups\AutomartLog.bak' WITH NORECOVERY, NO_TRUNCATE; create table TestTable ( ID int identity(1,1) primary key, MyTimestamp datetime ); insert into TestTable values ( GETDATE() ); use Automart; select * from TestTable; -- restore from the full backup use master; RESTORE DATABASE Automart FROM disk = 'C:\Backups\Automart.bak' with norecovery, file = 1; -- restore from the differential backup on file 2 RESTORE DATABASE Automart FROM disk = 'C:\Backups\Automart.bak' with norecovery, file = 2; -- restore from the differential backup on file 3 RESTORE DATABASE Automart FROM disk = 'C:\Backups\Automart.bak' with norecovery, file = 3; -- restore from the log use master; RESTORE LOG Automart FROM disk = 'C:\Backups\AutomartLog.bak' WITH NORECOVERY; restore database Automart; --Full Text Catalog use Master --add a filegroup Alter Database Automart Add Filegroup FullTextCatalog use Automart --add a table with some text Create Table TextTest ( TestId int identity (1,1) primary key, TestNotes Nvarchar(255) ) --insert text Insert into TextTest(TestNotes) Values('For test to be successful we must have a lot of text'), ('The test was not successful. sad face'), ('there is more than one test that can try a man'), ('Success is a relative term'), ('It is a rare man that is always successful'), ('The root of satisfaction is sad'), ('men want success') Select * From TextTest --create full text catalog Create FullText Catalog TestDescription on Filegroup FullTextCatalog --Create a full text index Create FullText index on textTest(TestNotes) Key Index PK__TextTest__8CC331603A9A1988 on TestDescription With Change_tracking auto --run queries on the full text catalog --find all instances that have the word "sad" Select TestID, TestNotes From TextTest Where FreeText(TestNotes, 'sad') --do the same with successful Select TestID, TestNotes From TextTest Where FreeText(TestNotes, 'successful') Select TestID, TestNotes From TextTest Where Contains(TestNotes, '"success"') --look for any words containing the letters "success" --the * is a wildcard Select TestID, TestNotes From TextTest Where Contains(TestNotes, '"success*"') --looks for all grammatical forms of a word Select TestID, TestNotes From TextTest Where Contains(TestNotes, ' Formsof (Inflectional, man)') --finds words near another word Select TestID, TestNotes From TextTest Where Contains(TestNotes, ' not near successful') Select TestID, TestNotes From TextTest Where Contains(TestNotes, ' sad near successful') Select ServiceName, ServiceDescription.query ('declare namespace s="http://www.automart.com/servicedescription"; //s:servicedescription/s:labor') From Customer.AutoService Where ServiceName='Tune Up' Select * From Customer.AutoService
Xml in SQL Server once again
If you search this blog you will find several similar and some more detailed versions of this
Use Automart Select * from Customer.AutoService Insert into Customer.AutoService(Servicename, ServicePrice, ServiceDescription) values('Pinstriping', '10000.00', '<servicedescription xmlns="http://www.automart.com/servicedescription"> <description> Change of oil and replacement of oil filter. check of all filters, fluids and tire pressure </description> <parts> <part> <partname>oil quarts</partname> <quantity>5</quantity> <perpartprice>3.22</perpartprice> </part> <part> <partname>Oil Filter</partname> <quantity>1</quantity> <perpartprice>3.15</perpartprice> </part> </parts> <labor> <workers>2</workers> <hours>0.5</hours> </labor> </servicedescription>') Select * from Person for xml raw('person'), elements, root('dataroot') Select LastName, FirstName, LicenseNumber, VehicleMake, VehicleYear From Person person inner join Customer.vehicle vehicle on person.personkey=vehicle.personkey Where person.personkey=43 For xml auto, elements, root('Vehicles') use CommunityAssist alter table ServiceGrant drop column GrantNotes --if you wanted to save the existing grant notes --you could do this before the previous statement Insert into GrantTemp (grantKey, grantnotes) Select GrantKey, GrantNotes from ServiceGrant Create xml schema collection sc_ServiceNotesSchema AS '<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.communityassist.org/servicenotes" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="servicenotes"> <xs:complexType> <xs:sequence> <xs:element name="header"> <xs:complexType> <xs:sequence> <xs:element name="date" type="xs:string" /> <xs:element name="topic" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element maxOccurs="unbounded" name="note" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>' alter table ServiceGrant add ServiceNotes xml(sc_ServiceNotesSchema) Update ServiceGrant Set ServiceNotes= '<?xml version="1.0" encoding="utf-8"?> <servicenotes xmlns="http://www.communityassist.org/servicenotes"> <header> <topic>Loan issues</topic> <date>7/30/2013</date> </header> <note> the client spent his last loan money on gambling, but he did win more than we lent </note> <note> I think he should pay us any profits </note> </servicenotes>' Where GrantKey=2 Select * From ServiceGrant use Automart Select * from customer.AutoService
Here is the xslt file we used for AutoService Descriptions
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:a="http://www.automart.com/servicedescription" xmlns="http://www.w3.org/1999/xhtml"> <!--xsl:output method="xml" indent="yes"/>--> <xsl:template match="/"> <h2>Service Description</h2> <p> <xsl:value-of select="//a:servicedescription/a:description"/> </p> <h3>Parts</h3> <ul> <xsl:for-each select="//a:servicedescription/a:parts/a:part"> <li> <xsl:value-of select="a:partname"/> , <xsl:value-of select="a:quantity"/> <xsl:value-of select="a:perpartprice"/> </li> </xsl:for-each> </ul> </xsl:template> </xsl:stylesheet>
Here is the default.aspx markup
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" DataKeyNames="AutoServiceID" DataSourceID="SqlDataSource1" ForeColor="#333333" GridLines="None" OnSelectedIndexChanged="GridView1_SelectedIndexChanged"> <AlternatingRowStyle BackColor="White" /> <Columns> <asp:CommandField ShowSelectButton="True" /> <asp:BoundField DataField="AutoServiceID" HeaderText="AutoServiceID" InsertVisible="False" ReadOnly="True" SortExpression="AutoServiceID" /> <asp:BoundField DataField="ServiceName" HeaderText="ServiceName" SortExpression="ServiceName" /> <asp:BoundField DataField="ServicePrice" HeaderText="ServicePrice" SortExpression="ServicePrice" /> </Columns> <EditRowStyle BackColor="#2461BF" /> <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /> <RowStyle BackColor="#EFF3FB" /> <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /> <SortedAscendingCellStyle BackColor="#F5F7FB" /> <SortedAscendingHeaderStyle BackColor="#6D95E1" /> <SortedDescendingCellStyle BackColor="#E9EBEF" /> <SortedDescendingHeaderStyle BackColor="#4870BE" /> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:AutomartConnectionString %>" SelectCommand="Select AutoServiceID, ServiceName, ServicePrice from Customer.AutoService"></asp:SqlDataSource> </div> <asp:Xml ID="Xml1" runat="server"></asp:Xml> </form> </body> </html>
And finally here is the C# code
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data.SqlClient; using System.Xml; using System.Configuration; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { SqlConnection connect = new SqlConnection( ConfigurationManager.ConnectionStrings["AutomartConnectionString"].ToString()); string sql = "Select ServiceDescription from Customer.AutoService where AutoServiceID=@ID"; SqlCommand cmd = new SqlCommand(sql, connect); cmd.Parameters.AddWithValue("@ID", int.Parse(GridView1.SelectedRow.Cells[1].Text)); XmlReader xreader = null; XmlDocument xdoc = new XmlDocument(); connect.Open(); xreader = cmd.ExecuteXmlReader(); xdoc.Load(xreader); xreader.Close(); connect.Close(); Xml1.Document = xdoc; Xml1.TransformSource = MapPath("ServiceDescription.xslt"); } }
Thursday, July 25, 2013
Stored procedures for CommunityAssist
Here is the SQL we did in class. The C# code is posted on gitHub
use CommunityAssist go Create schema Client Go Create view client.vw_services As Select ServiceKey, ServiceName, ServiceDescription From [Service] go Select * from vw_Services go Create Proc Client.uspLogin @userName nvarchar(255), @userPassword nvarchar(255) As Select PersonKey from Person Where userName=@userName And userPassword=@userPassword usplogin 'JAnderson', 'APass' Select * From Person Go Alter proc Client.usp_Register @lastName Nvarchar(255), @FirstName Nvarchar(255), @userName Nvarchar(255), @password Nvarchar(255), @email Nvarchar(255), @HomePhone Nvarchar(255) As Begin Tran Begin Try Insert into Person(Lastname, FirstName, UserName, userPassword) Values(@LastName, @FirstName, @Username, @password) Declare @Personkey int Set @PersonKey=ident_current('Person'); --Select @personkey=personkey --from Person --where PersonKey=(Select max(personkey) from Person) Insert into PersonContact(ContactInfo, PersonKey, contactTypeKey) Values (@Email, @PersonKey, 6) Insert into PersonContact(ContactInfo, PersonKey, contactTypeKey) Values (@HomePhone, @PersonKey,1) Commit tran End Try Begin Catch Rollback Tran return error_number() End Catch Go Client.usp_Register @Lastname='Danielle', @FirstName='Mary', @UserName='maryD', @password='marypass', @email='md@gmail.com', @HomePhone='2065553256' Select * from PersonContact Go Alter proc Client.uspGetGrants @PersonKey int As Select GrantDate, GrantAmount, Servicename, GrantDateApproved From ServiceGrant sg inner join [Service] s on s.ServiceKey=sg.ServiceKey Where personkey=@personkey Go Client.uspGetGrants 1 Go Create proc Client.uspNewGrant @GrantAmount money, @ServiceKey int, @PersonKey int As Insert into ServiceGrant(GrantAmount, GrantDate, PersonKey, ServiceKey) Values(@GrantAmount, getDate(), @PersonKey, @ServiceKey) Client.uspNewGrant 300.00,3,52 Select * From ServiceGrant Create Login ClientLogin with password='P@ssw0rd1', default_database=CommunityAssist Create user ClientUser for login ClientLogin with default_schema=Client Grant execute, select on Schema::Client to ClientUser
Monday, July 22, 2013
Box Classes
Here is the UML diagram
I have also posted this on Git Hub. Also look at the comment to this blog to see a correction to the code offered by Mitchel
Here is the Box class
package com.spconger.Boxes; public class Box { private int height; private int width; private int depth; public void setHeight(int height){ this.height=height; } public int getHeight(){ return height; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getDepth() { return depth; } public void setDepth(int depth) { this.depth = depth; } @Override public String toString() { // TODO Auto-generated method stub return "height: " + getHeight() + ", width: " + getWidth() + ", depth: " + getDepth(); } }
Here is the BoxManager class
package com.spconger.Boxes; import java.util.ArrayList; public class BoxManager { private ArrayListboxList; public BoxManager(){ boxList=new ArrayList (); } public void add(Box b){ boxList.add(b); } public int getVolume(){ int volume=0; int h=0, w=0, d=0; for(Box b:boxList){ h = b.getHeight(); w = b.getWidth(); d = b.getDepth(); volume += h * w * d; } //volume=h * w * d; return volume; } public int getVolume(int boxNumber){ int volume=0; if (boxNumber <= boxList.size()){ Box b = boxList.get(boxNumber); volume =b.getDepth() * b.getHeight() * b.getWidth(); } return volume; } }
Here is the MainForm class
package com.spconger.Boxes; import javax.swing.*; import java.awt.GridLayout; import java.awt.event.*; public class MainForm { //declare all the form elements private JFrame frame; private JPanel panel; private JLabel lblHeight; private JTextField txtHeight; private JLabel lblWidth; private JTextField txtWidth; private JLabel lblDepth; private JTextField txtDepth; private JLabel lblVolume; private JButton btnAdd; private JButton btnGetVolume; private JTextField txtBoxNumber; private JButton btnExit; private BoxManager bxManager; public MainForm(){ //constructor // createFrame(); bxManager=new BoxManager(); } //create the frame private void createFrame(){ frame = new JFrame(); frame.setSize(300,300); createPanel(); frame.add(panel); frame.setVisible(true); } //create the panel private void createPanel(){ panel = new JPanel(); panel.setLayout(new GridLayout(6,2,5,5)); //make all the objects new lblHeight=new JLabel("Enter the Height"); txtHeight=new JTextField(); lblWidth=new JLabel("Enter the Width"); txtWidth=new JTextField(); lblDepth=new JLabel("Enter the Depth"); txtDepth=new JTextField(); btnAdd = new JButton("Add"); btnAdd.addActionListener(new AddBox()); btnGetVolume = new JButton("Get Volume"); btnGetVolume.addActionListener(new GetBoxVolumes()); txtBoxNumber = new JTextField(); btnExit = new JButton("Exit"); btnExit.addActionListener(new ExitEvent()); lblVolume = new JLabel(); //add them all to the panel panel.add(lblHeight); panel.add(txtHeight); panel.add(lblWidth); panel.add(txtWidth); panel.add(lblDepth); panel.add(txtDepth); panel.add(btnAdd); panel.add(btnGetVolume); panel.add(txtBoxNumber); panel.add(btnExit); panel.add(lblVolume); } //private classes to implement button actions private class ExitEvent implements ActionListener{ @Override public void actionPerformed(ActionEvent arg0) { System.exit(0); } } private class AddBox implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { Box b = new Box(); b.setWidth(Integer.parseInt(txtWidth.getText())); b.setDepth(Integer.parseInt(txtDepth.getText())); b.setHeight(Integer.parseInt(txtHeight.getText())); bxManager.add(b); txtHeight.setText(""); txtWidth.setText(""); txtDepth.setText(""); } } private class GetBoxVolumes implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { int volume=0; //if (txtBoxNumber.getText() != null || !txtBoxNumber.getText().equals("")){ // int boxIndex=Integer.parseInt(txtBoxNumber.getText()); //volume=bxManager.getVolume(boxIndex); //} // else //{ volume=bxManager.getVolume(); //} lblVolume.setText("the volume is: " + volume); } } }
Here is the Program class
package com.spconger.Boxes; public class Program { /** * @param args */ public static void main(String[] args) { //call main form that creates form MainForm form = new MainForm(); } }
Sunday, July 14, 2013
Stored Procedures For Automart Employee
Here is a script for the stored procedures and view we will use in the ASP.Net application
The code for this is at GitHub
Use Automart Go --the login will just consist of the employeeID --and the locationID Create Proc Employee.usp_GetVehicleandCustomerInfo @License nvarchar(10) As Select LastName, Firstname, VehicleID, LicenseNumber, vehicleMake, VehicleYear From Person p inner join Customer.Vehicle v on p.personkey=v.PersonKey Where LicenseNumber=@License Go Create proc Employee.usp_Services @VehicleID int As Select VehicleServiceID, LocationName, ServiceDate, ServiceTime From Employee.VehicleService vs inner join Customer.Location l on l.locationId=vs.LocationID Where VehicleID = @VehicleID go Create Proc Employee.usp_ServiceDetails @VehicleServiceID int As Select ServiceName, DiscountPercent, TaxPercent, ServiceNotes From Employee.VehicleServiceDetail vsd Inner Join Customer.AutoService a on a.AutoServiceID=vsd.AutoServiceID Where VehicleServiceID=@vehicleServiceID Go Alter Proc Employee.usp_AddNewVehicle @lastname Nvarchar(255), @FirstName Nvarchar(255), @License Nvarchar(10), @VehicleMake Nvarchar(255), @vehicleYear Nchar(4) As Begin tran Begin Try Insert into Person(LastName, firstname) Values (@lastName, @firstName) Declare @Personkey int Select @personkey = max(personKey) from Person Insert into Customer.Vehicle(LicenseNumber, VehicleMake, VehicleYear, PersonKey) Values(@License, @VehicleMake, @vehicleYear, @PersonKey) Commit tran End try Begin Catch Rollback tran Return error_number() End Catch GO Create proc Employee.usp_AddVehicleService @vehicleID int, @LocationID int As Declare @ServiceDate Date Declare @serviceTime Time Set @ServiceDate = GetDate() Set @ServiceTime=GetDate() Insert into Employee.VehicleService( VehicleID, LocationID, ServiceDate, ServiceTime ) Values( @VehicleID, @LOcationID, @ServiceDate, @ServiceTime ) Go Create proc Employee.usp_AddServiceDetails @AutoServiceID int, @DiscountPercent decimal(3,2), @ServiceNotes xml As Declare @TaxPercent decimal(3,2) Declare @VehicleServiceID int Set @TaxPercent = .09; Set @VehicleServiceID=IDENT_CURRENT('Employee.VehicleService') Insert into Employee.VehicleServiceDetail( VehicleServiceID, AutoServiceID, DiscountPercent, TaxPercent, serviceNotes ) values( @VehicleServiceID, @AutoServiceID, @DiscountPercent, @TaxPercent, @serviceNotes) Go Create view Employee.vw_Services As Select ServiceName, AutoServiceID From Customer.AutoService Go Create login EmployeeLogin with password='P@ssw0rd1', default_database=Automart Go Create user EmployeeUser for Login EmployeeLogin with default_schema=Employee Go Grant exec on schema::Employee to EmployeeUser Grant select on Schema::Employee to EmployeeUser
Friday, July 12, 2013
Introduction to swing and swing layouts
Swing is a set if libraries in Java that provide the tools to build graphical forms. You get the libraries by adding this import:
import javax.swing.*;
Some of the layouts we will use such as the BorderLayout can be found in java.awt:
import java.awt.BorderLayout;
First we will look at the basics structure of a Swing form. The basic window is called a JFrame. The JFrame is the container for any windows content. Essentially it just forms a box. Here is some code that makes a basic JFrame and a picture of it running:
package com.spconger.SwingTests; import javax.swing.*; public class program { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub JFrame frame = new JFrame(); frame.setBounds(200,200,300,200); frame.setVisible(true); } }
Inside the JFrame it is most common to put one or more JPanel. JPanels are containers for controls such as labels, text boxes and buttons. We will look at three common layouts and then combine them in our simple hello world application. The types of layout are:
* FlowLayout
* GridLayout
* BorderLayout
Flow layout just flows the controls one after another a wraps at the form edges. It can be LEFT aligned or RIGHT aligned. Here is the code that adds a panel and uses flow layout. To illustrate the flow I have added JLabel controls. I also narrowed the JFrame width to 100 to show the flow wrap.
package com.spconger.SwingTests; import java.awt.FlowLayout; import javax.swing.*; public class program { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub program p = new program(); JFrame frame = new JFrame(); frame.setBounds(200,200,100,200); JPanel panel = p.createFlowLayoutPanel(); frame.add(panel); frame.setVisible(true); } private JPanel createFlowLayoutPanel(){ JPanel panel = new JPanel(); panel.setLayout(new FlowLayout(FlowLayout.LEFT)); JLabel lblOne=new JLabel("ONE"); JLabel lblTwo=new JLabel("TWO"); JLabel lblThree=new JLabel("THREE"); JLabel lblFour=new JLabel("FOUR"); panel.add(lblOne); panel.add(lblTwo); panel.add(lblThree); panel.add(lblFour); return panel; }
Here is a picture of the form.
Next we will do a grid layout. For a grid layout you set up the rows and the columns you want. You don't have control over which grid cell a control goes into really. They just flow first control, first cell, second goes into the second cell, left to right, etc.
package com.spconger.SwingTests; import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.*; public class program { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub program p = new program(); JFrame frame = new JFrame(); frame.setBounds(200,200,100,200); JPanel panel = p.createGridLayoutPanel(); frame.add(panel); frame.setVisible(true); } private JPanel createGridLayoutPanel(){ JPanel panel = new JPanel(); //this is the only line that is different panel.setLayout(new GridLayout(2,2)); JLabel lblOne=new JLabel("ONE"); JLabel lblTwo=new JLabel("TWO"); JLabel lblThree=new JLabel("THREE"); JLabel lblFour=new JLabel("FOUR"); panel.add(lblOne); panel.add(lblTwo); panel.add(lblThree); panel.add(lblFour); return panel; } }
Here is a picture of the form with the grid layout
The border layout we will use in context with our hello world app. The border layout sets designations for the different areas of the panel. The top is NORTH, the botton SOUTH, Left is EAST and Right is WEST. The center has a CENTER designation. You can use the border layout of a panel to help arrange other panels.
What we are going to do, is create a panel with a border layout. We will add a grid layout in the center that has a JLabel, a aJTextField and another JLabel
Then we will add a JPanel to the SOUTH. It will have a flow layout and contain two JButtons.
What the program will do is take a user's name as in a JTextField. When the user clicks the JButton btnSubmit. the second JLabel will display a greeting. A second JButton, btnExit, will exit the program. To handle the buttons we will need to add Action listeners. Will will do this by implementing the ActionListeners interface. Later I will show how to do listeners as internal classes.
Here is the full code. I have commented it to help clarify what is going on.
package com.spconger.FirstSwing; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; //the class implements the interface ActionListener public class Program implements ActionListener{ JButton btnExit; JButton btnGetName; JLabel result; JTextField txtName; /** * Build through this one very slowly in class * first show flow layout then grid * build up the panel, add one thing at a time * until we arrive at this form * talk about frame and panel and controls * and then the listeners. * maybe reorganize the methods to have more logic * and declare all the elements at top. * @param args */ public static void main(String[] args){ //instantiate the non static parts of the class Program p = new Program(); //call the createFrame method p.createFrame(); } private void createFrame(){ JFrame frame = new JFrame(); //frame.setDefaultCloseOperation(EXIT_ON_CLOSE)); frame.add(createPanel()); frame.setBounds(200,200,300,150); frame.setVisible(true); } private JPanel createPanel(){ //this method creates the main panel which //has a border layout //then it calls and adds the grid and flow layout //panels JPanel mainPanel=new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.add(createInfoPanel(),BorderLayout.CENTER); mainPanel.add(createButtonPanel(), BorderLayout.SOUTH); return mainPanel; } private JPanel createInfoPanel(){ //this creates a new grid layout panel JPanel panel = new JPanel(); //the grid has two rows and 2 columns with a 5 pixel space //between them panel.setLayout(new GridLayout(2,2,5,5)); //add the controls JLabel label = new JLabel("Enter You name"); panel.add(label); txtName = new JTextField(); panel.add(txtName); result = new JLabel(); panel.add(result); return panel; } private JPanel createButtonPanel(){ //the button panel is a flow layout panel JPanel buttonPanel =new JPanel(); buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); btnGetName=new JButton("Submit"); //each button needs to be directed to the action listener btnGetName.addActionListener(this); buttonPanel.add(btnGetName); btnExit = new JButton("Exit"); btnExit.addActionListener(this); buttonPanel.add(btnExit); return buttonPanel; } @Override //this method handles the button click events //for both buttons public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub Object source = e.getSource(); if(source==btnExit){ System.exit(0); } if (source==btnGetName){ result.setText("Hello, " + txtName.getText()); } } }
Now here is a picture of the code running after the name has been entered and the submit button clicked
Thursday, July 11, 2013
Table Partitioning 2013
Here is a script for table partiioning
Use Master /************************* this creates a database with several files and file groups so we can partition a large table across file groups. This can improve performance in large tables *************************/ if exists (SELECT name from sys.Databases where Name='PartitionTest') Begin Drop Database PartitionTest End Create database PartitionTest go Alter database PartitionTest Add FileGroup Sales2005; Go Alter Database PartitionTest Add file ( name ='Sales2005', FileName='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SALES2005File.ndf', Size=5MB, MaxSize=200MB, FileGrowth=5mb ) to filegroup Sales2005 Go Alter database PartitionTest Add FileGroup Sales2006; Go Alter Database PartitionTest Add file ( name ='Sales2006', FileName='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SALES2006File.ndf', Size=5MB, MaxSize=200MB, FileGrowth=5mb ) To filegroup Sales2006 Go Alter database PartitionTest Add FileGroup Sales2007; Go Alter Database PartitionTest Add file ( name ='Sales2007', FileName='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SALES2007File.ndf', Size=5MB, MaxSize=200MB, FileGrowth=5mb ) to filegroup Sales2007 Go Alter database PartitionTest Add FileGroup Sales2008; Go Alter Database PartitionTest Add file ( name ='Sales2008', FileName='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SALES2008File.ndf', Size=5MB, MaxSize=200MB, FileGrowth=5mb ) to filegroup Sales2008 Go Alter database PartitionTest Add FileGroup Sales2009; Go Alter Database PartitionTest Add file ( name ='Sales2009', FileName='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SALES2009File.ndf', Size=5MB, MaxSize=200MB, FileGrowth=5mb ) to filegroup Sales2009 go
Here is a picture of the database properties showing the file groups
-- next we need to create a partition function --this tells it where to break --range left means the numbers in the values --represent the highest value or endpoint --for that partition --there must always be one more file group than partition go use partitionTest Create Partition Function Fx_orderdate (dateTime) As range left For values('20051231', '20061231','20071231','20081231') go --now we create a partitioning scheme that uses the --partition function above Create Partition scheme sch_orderdate As Partition fx_orderdate to (Sales2005, sales2006, sales2007, sales2008, sales2009) --now we will create a table using the partition scheme go CREATE TABLE [PurchaseOrderHeader]( [PurchaseOrderID] [int] NOT NULL, [RevisionNumber] [tinyint] NOT NULL, [Status] [tinyint] NOT NULL, [EmployeeID] [int] NOT NULL, [VendorID] [int] NOT NULL, [ShipMethodID] [int] NOT NULL, [OrderDate] [datetime] NOT NULL, [ShipDate] [datetime] NULL, [SubTotal] [money] NOT NULL, [TaxAmt] [money] NOT NULL, [Freight] [money] NOT NULL, [TotalDue] MONEY NOT NULL, [ModifiedDate] [datetime] NOT NULL, ) on sch_orderdate(orderDate) --now we will populate the table from adventure works go Insert into PurchaseOrderHeader( PurchaseOrderID, RevisionNumber, Status, EmployeeID, VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight, TotalDue, ModifiedDate) SELECT PurchaseOrderID, RevisionNumber, Status, EmployeeID, VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight, TotalDue, ModifiedDate FROM AdventureWorks2012.Purchasing.PurchaseOrderHeader --partition queries Select * from PurchaseOrderHeader --2006 Select * from PurchaseOrderHeader where $partition.Fx_OrderDate(OrderDate)=2 --2007 Select * from PurchaseOrderHeader where $partition.fx_orderDate(OrderDate)=3 --2008 Select * from PurchaseOrderHeader where $partition.fx_orderDate(OrderDate)=4 --etc.
Tuesday, July 9, 2013
Indexes
Here is the link to the Power Point
And here is the brief code we did in class with the force index. You have to run the CREATE INDEX on the bottom before you can force the index. remember to click the icon for "Show Actual Execution path" on the tool bar to see the statistics.
Select LicenseNumber as License, VehicleMake as Make, VehicleYear as [Year], LocationName as [Location], ServiceDate as [Date], ServiceTime as [Time], ServiceName as [Service], '$' + Cast(ServicePrice as nvarchar) as [Price], DiscountPercent, TaxPercent, '$' + Cast(Cast(ServicePrice -(ServicePrice* DiscountPercent) + ((ServicePrice * DiscountPercent) * TaxPercent) as Decimal(6,2))as nvarchar) as ServiceTotal From Customer.Vehicle v inner join Employee.vehicleService vs with (nolock, index (Ix_VehicleServiceVehicleID)) on v.VehicleId=vs.VehicleID inner join Customer.Location loc on loc.LocationID=vs.LocationID inner Join Employee.VehicleServiceDetail vsd on vs.VehicleServiceID=vsd.VehicleServiceID inner join Customer.AutoService a on a.AutoServiceID=vsd.AutoServiceID go Create index ix_VehicleServiceVehicleID on Employee.VehicleService(VehicleID)
Stored procedure assignment
The assignment
Here is a clearer view of exactly what needs to be done
Create a schema called "Client"
All of the following procedures and views should belong to this client schema.
We will create a user for the client next week and set permissions
A view that shows the available services. Alias the fields
A simple stored procedure showing past grants based on person key
Status of current grant stored proc with grant number or personkey
Stored proc for new client
Store proc for new grant
Trigger on insert for lifetime limit of $2500
Optional function for total grant amount across individual grants
Here is the code for the procedures and triggers we did in class
/* this stored procedure inserts a new customer */ Alter proc usp_NewCustomer --these are the parameters @LastName nvarchar(255), @FirstName Nvarchar(255), @LicenseNumber nvarchar(10), @VehicleMake nvarchar(255), @VehicleYear nchar(4), @Email nvarchar(255), @CustomerPassword nvarchar(20) As Begin Transaction --begin the transaction Begin try --begin try to try the code --as soon as it encounters an error it will abort --and go to the catch --do inserts Insert into Person(lastname, firstname) values (@lastName, @firstname) Declare @Personkey int Set @Personkey=Ident_current('Person') Insert into Customer.Vehicle(LicenseNumber, VehicleMake, VehicleYear, PersonKey) Values(@LicenseNumber, @VehicleMake, @VehicleYear, @Personkey) Insert into Customer.RegisteredCustomer(Email, CustomerPassword, PersonKey) Values (@Email, @CustomerPassword, @PersonKey) --if no errors commit the inserts --won't get here if there is an error Commit transaction End try --end the try Begin Catch --catch any errors Rollback tran --rollback the transaction print error_Message() --print the error End catch go exec usp_NewCustomer @LastName ='Rubble', @FirstName='Barney', @LicenseNumber='12Stone', @VehicleMake='boulder', @VehicleYear='0000', @Email ='brubble@flinstone.com', @CustomerPassword='bpass' Select * from Person Select * from Customer.Vehicle Select * From customer.RegisteredCustomer alter table Customer.RegisteredCustomer add constraint unique_email unique(email) Go Create trigger tr_PoorRating on Customer.CustomerSurvey after insert As Declare @Rating int Select @Rating = rating from inserted if @Rating < 3 Begin if not exists (Select name from sys.tables where name = 'LowRatings') Begin Create table LowRatings ( LocationID int, SurveyDate datetime, Rating int, comments xml ) end Insert into LowRatings(LocationID, SurveyDate, Rating, Comments) Select LocationId, SurveyDate, Rating, Comments from Inserted end Insert into Customer.CustomerSurvey(LocationID, SurveyDate, Rating, Comments) Values(2, GetDate(), 1, null) Select * from Customer.CustomerSurvey Select * From LowRatings
Monday, July 8, 2013
Ball and Paddle
package com.spconger.BreakoutPaddle; import acm.graphics.*; import acm.program.*; import acm.util.*; import java.awt.Color; import java.awt.event.*; import java.awt.color.*; public class Program extends GraphicsProgram { /** * This class is a test for Breakout * it sets up the ball and the paddle and * gets the ball to interact with the paddle * in class 2013-7-8 */ //these are our constants private final int BALLDIAMETER = 20; private final int FORMWIDTH=400; private final int FORMHEIGHT=600; private final int PADDLEWIDTH=60; private final int PADDLEHEIGHT=10; private final int PADDLEOFFSET=FORMHEIGHT -30; private final int BALLSTARTX=FORMWIDTH/2-BALLDIAMETER/2; private final int BALLSTARTY=FORMHEIGHT/2-BALLDIAMETER/2; //class level variables private GOval ball; private GRect paddle; private double ballVX=3; private double ballVY; public void run(){ setSize(FORMWIDTH, FORMHEIGHT); //call all the methods createPaddle(); addKeyListeners(); createBall(); waitForClick(); moveBall(); } //create the paddle private void createPaddle(){ paddle=new GRect(FORMWIDTH/2-PADDLEWIDTH/2, PADDLEOFFSET, PADDLEWIDTH, PADDLEHEIGHT); paddle.setFillColor(Color.DARK_GRAY); paddle.setFilled(true); add(paddle); } public void keyPressed(KeyEvent e){ //this method moves the paddle //and keeping it in form bounds double x=paddle.getX(); double y=paddle.getY(); switch (e.getKeyCode()){ case KeyEvent.VK_RIGHT: if(x <(FORMWIDTH-PADDLEWIDTH)){ paddle.move(PADDLEWIDTH, 0); } break; case KeyEvent.VK_LEFT: if (x > 0){ paddle.move(-PADDLEWIDTH, 0); } break; default: break; } } private void createBall(){ //create the ball and give it an initial //random y velocity RandomGenerator rand = new RandomGenerator(); ballVY=rand.nextDouble(1.0,3.0); ball = new GOval(BALLSTARTX, BALLSTARTY, BALLDIAMETER, BALLDIAMETER); ball.setFillColor(Color.BLUE); ball.setFilled(true); add(ball); } private void moveBall(){ //this moves the ball and keeps it in bounds boolean play=true; while(play){ if (ball.getX()>FORMWIDTH-BALLDIAMETER || ball.getX()<=0){ ballVX=-ballVX; } if(ball.getY()>=FORMHEIGHT-BALLDIAMETER || ball.getY()<=0){ ballVY=-ballVY; } //this makes it interact with the paddle, //though you should check for all for corners if(getElementAt(ball.getX()+ BALLDIAMETER, ball.getY()+BALLDIAMETER)==paddle){ ballVY=-ballVY; } //if the ball hits the bottom turn over if(ball.getY() >= FORMHEIGHT-BALLDIAMETER) { play=false; } ball.move(ballVX, ballVY); pause(30); } } }
Wednesday, July 3, 2013
Events Examples
package com.spconger.EventExamples; import acm.graphics.*; import acm.program.*; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; public class Program extends GraphicsProgram{ /** * This program moves a turtle around using * two different events: KeyEvent and MouseEvent * July, 3 2013 */ //declare our turtle private GTurtle bob; //set constants for form width private final int FORMWIDTH=400; private final int FORMHEIGHT=600; public void run(){ //set form size setSize(FORMWIDTH,FORMHEIGHT); //place the turtle in the center of the screen bob = new GTurtle(FORMWIDTH/2, FORMHEIGHT/2); //add the turtle to the screen add(bob); //wait for a mouse click to start waitForClick(); //add the key listener addKeyListeners(); //add the mouse listener addMouseListeners(); } public void keyPressed(KeyEvent e){ //this method handles the key event //we use a switch to determine //which keys to react to //for us just the arrow keys switch(e.getKeyCode()){ case KeyEvent.VK_RIGHT: bob.setDirection(0); break; case KeyEvent.VK_LEFT: bob.setDirection(180); break; case KeyEvent.VK_UP: bob.setDirection(90); break; case KeyEvent.VK_DOWN: bob.setDirection(-90); break; default: return; } //move the turtle bob.forward(10); } public void mouseMoved(MouseEvent e){ //get the mouse position Point movePos=e.getPoint(); //get the x and y of the current mouse position int x = movePos.x; int y = movePos.y; //use them to set bob.setLocation(x,y); } }
Tuesday, July 2, 2013
views Procedures and a function
Use Automart Go Create schema Corporation Go Create view Customer.vw_Services As Select ServiceName As [Service Name], ServicePrice AS [Price], ServiceDescription As [Description] From customer.AutoService go Select * From Customer.vw_Services Where [service name]='Oil Change' go Create view Customer.vw_Locations As Select LocationName as Name, LocationAddress as [Address], LocationCity as City, LocationState as [State], LocationZip as ZipCode, LocationPhone as Phone From Customer.Location go Select * from Customer.vw_locations go Drop procedure Customer.usp_VehicleServiceHistory go Alter procedure Customer.usp_VehicleServiceHistory @PersonKey int As Select LicenseNumber as License, VehicleMake as Make, VehicleYear as [Year], LocationName as [Location], ServiceDate as [Date], ServiceTime as [Time], ServiceName as [Service], '$' + Cast(ServicePrice as nvarchar) as [Price], DiscountPercent, TaxPercent, '$' + Cast(Cast(ServicePrice -(ServicePrice* DiscountPercent) + ((ServicePrice * DiscountPercent) * TaxPercent) as Decimal(6,2))as nvarchar) as ServiceTotal From Customer.Vehicle v inner join Employee.vehicleService vs on v.VehicleId=vs.VehicleID inner join Customer.Location loc on loc.LocationID=vs.LocationID inner Join Employee.VehicleServiceDetail vsd on vs.VehicleServiceID=vsd.VehicleServiceID inner join Customer.AutoService a on a.AutoServiceID=vsd.AutoServiceID Where personkey=@personkey execute customer.usp_VehicleServiceHistory 1 Select LicenseNumber, VehicleMake, VehicleYear, ServiceDate, ServiceTime, sum(ServicePrice -(ServicePrice* DiscountPercent) + ((ServicePrice * DiscountPercent) * TaxPercent)) as [Total] From Customer.Vehicle v inner join Employee.VehicleService vs on v.VehicleId=vs.VehicleID inner join Employee.VehicleServiceDetail vsd on vs.VehicleServiceID=vsd.VehicleServiceID inner join Customer.AutoService a on a.AutoServiceID=vsd.AutoServiceID Where v.VehicleID=1 Group by LicenseNumber, VehicleMake, VehicleYear, ServiceDate, ServiceTime Select LicenseNumber, ServicePrice, DiscountPercent, TaxPercent From Customer.Vehicle v Inner join Employee.VehicleService vs on v.VehicleId=vs.VehicleID inner join Employee.VehicleServiceDetail vsd on vs.VehicleServiceID=vsd.VehicleServiceID inner join Customer.Autoservice a on a.AutoServiceID=vsd.AutoServiceID Where ServiceDate='2010-02-22' go alter function fx_TotalDue (@ServicePrice money, @DiscountPercent decimal(4,3), @TaxPercent decimal(4,3)) returns money As Begin Declare @Discounted money Declare @TaxAmount money if (@DiscountPercent is not null) Begin set @Discounted=@ServicePrice-@ServicePrice* @DiscountPercent End else Begin Set @Discounted=@ServicePrice End Set @TaxAmount=@Discounted * @TaxPercent return @Discounted + @TaxAmount End Select ServiceDate,Sum (dbo.fx_TotalDue(ServicePrice, DiscountPercent, TaxPercent)) as Total From Employee.VehicleService vs inner join Employee.VehicleServiceDetail vsd on vs.VehicleServiceID = vsd.VehicleServiceID inner join Customer.AutoService a on a.AutoServiceID = vsd.AutoServiceID Where vs.VehicleID =1 Group by ServiceDate Select ServiceDate, ServiceName, ServicePrice, DiscountPercent, TaxPercent, (dbo.fx_TotalDue(ServicePrice, DiscountPercent, TaxPercent)) as Total From Employee.VehicleService vs inner join Employee.VehicleServiceDetail vsd on vs.VehicleServiceID = vsd.VehicleServiceID inner join Customer.AutoService a on a.AutoServiceID = vsd.AutoServiceID Where vs.VehicleID =1
Monday, July 1, 2013
First use of a class
Here is the code for the MilesToKilometersConversion class
The code is also available at Github
package com.spconger.MilesToKilometers; public class MilesToKilometersConversion { /** * This class takes miles as an argument * and converts it to kilometers * 7/1/2013 */ //private fields private double miles; private double kilometers; //private constant private final double CONVERSIONFACTOR=1.6; //empty constructor public MilesToKilometersConversion(){ setMiles(0); setKilometers(0); } //constructor that takes miles as a parameter public MilesToKilometersConversion(double miles){ setMiles(miles); setKilometers(0); } //public sets and gets for private fields public double getMiles() { return miles; } public void setMiles(double miles) { this.miles = miles; } public double getKilometers() { return kilometers; } public void setKilometers(double kilometers) { this.kilometers = kilometers; } //public method to convert miles to kilometers public void convertToKilometers(){ setKilometers(getMiles() * CONVERSIONFACTOR); } }
Here is the Program
package com.spconger.MilesToKilometers; import acm.program.*; import acm.graphics.*; import acm.io.IODialog;; @SuppressWarnings("serial") public class Program extends GraphicsProgram{ /** * this class gets the Miles from the user * with a dialog box and passes it to the * MilesToKilometersConversion class * which does the conversion and passes the * kilometers value back to a label * 7/1/2013 */ public void run(){ setSize(400,500); //create a dialog box IODialog dialog = new IODialog(); //get the value from the dialog double miles = dialog.readDouble("Please enter the miles"); //initialize the class and pass the miles //in the constructor MilesToKilometersConversion mToK= new MilesToKilometersConversion(miles); //call the conversion method mToK.convertToKilometers(); //Display the results in a label GLabel label=new GLabel(miles + " equals " +mToK.getKilometers() + " Kilometers", 50,60); //add the label to the graphics program add(label); } }