Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 75 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
75
Dung lượng
0,91 MB
Nội dung
objTimeSheetDS.Tables(“TimeSheets”).Rows.Count - 1 blnEvenRow = Not blnEvenRow If blnEvenRow Then Response.Write(“<tr class=””EvenRow””>”) Else Response.Write(“<tr class=””OddRow””>”) End If If strReport = “TimesheetsDue” Then Response.Write(“<td class=””ReportText””><a href=””mailto:” & _ objTimeSheetDS.Tables(“TimeSheets”).Rows(intIndex).Item( _ “Email”) & “?subject=Timesheet Due&body=Your timesheet “ & _ “for week ending date “ & dteWeekEndingDate.ToString & _ “ is due. Please submit your timesheet for approval.””>” & _ objTimeSheetDS.Tables(“TimeSheets”).Rows(intIndex).Item( _ “UserName”) & “</a></td>”) Else Response.Write(“<td class=””ReportText””>” & _ objTimeSheetDS.Tables(“TimeSheets”).Rows(intIndex).Item( _ “UserName”) & “</td>”) End If Response.Write(“<td class=””ReportText”” align=””right””>” & _ objTimeSheetDS.Tables( _ “TimeSheets”).Rows(intIndex).Item(“TotalHours”) & “</td>”) Response.Write(“<td> </td>”) Response.Write(“</tr>”) Next Response.Write(“</table>”) End Sub 11. The last procedure that you need to add is the ProcessLongReport procedure. This procedure will be called to process the report data for the Timesheets Month-to-Date, Timesheets Quarter- to-Date, and Timesheets Year-to-Date reports. Add the following code to create this procedure: Private Sub ProcessLongReport() Response.Write(“<table cellspacing=””0”” cellpadding=””3””” & _ “border=””0””>”) Response.Write(“<tr class=””ReportHeader””>”) Response.Write(“<td nowrap width=””200px””>Employee</td>”) Response.Write(“<td nowrap>Total Hours</td>”) Response.Write(“<td width=””5px””> </td>”) Response.Write(“<td nowrap>Week Ending Date</td>”) Response.Write(“<td width=””5px””> </td>”) Response.Write(“<td nowrap>Approval Date</td>”) Response.Write(“<td width=””100%””> </td>”) Response.Write(“</tr>”) For intIndex As Integer = 0 To _ objTimeSheetDS.Tables(“TimeSheets”).Rows.Count - 1 blnEvenRow = Not blnEvenRow 588 Chapter 16 19_58894x ch16.qxd 10/13/05 5:59 PM Page 588 If blnEvenRow Then Response.Write(“<tr class=””EvenRow””>”) Else Response.Write(“<tr class=””OddRow””>”) End If Response.Write(“<td class=””ReportText””>” & objTimeSheetDS.Tables( _ “TimeSheets”).Rows(intIndex).Item(“UserName”) & “</td>”) Response.Write(“<td class=””ReportText”” align=””right””>” & _ objTimeSheetDS.Tables(“TimeSheets”).Rows(intIndex).Item( _ “TotalHours”) & “</td>”) Response.Write(“<td> </td>”) Response.Write(“<td class=””ReportText”” align=””right””>” & _ objTimeSheetDS.Tables( _ “TimeSheets”).Rows(intIndex).Item(“WeekEndingDate”) & “</td>”) Response.Write(“<td> </td>”) Response.Write(“<td class=””ReportText”” align=””right””>”) If IsDBNull(objTimeSheetDS.Tables( _ “TimeSheets”).Rows(intIndex).Item(“ApprovalDate”)) Then Response.Write(“</td>”) Else Response.Write(Format(objTimeSheetDS.Tables( _ “TimeSheets”).Rows(intIndex).Item( _ “ApprovalDate”), “Short Date”) & “</td>”) End If Response.Write(“<td> </td>”) Response.Write(“</tr>”) Next Response.Write(“</table>”) End Sub 12. Now view the Form Designer for the TimeSheetReport Web page. To display the report, you need to call the Main procedure, so add the following code: <asp:Content ID=”Content1” ContentPlaceHolderID=”ContentPlaceHolder1” Runat=”Server”> <% Call Main() %> </asp:Content> That’s all the code that you need to implement to generate and process report data from your Web Service. Start your project by clicking the Start button on the toolbar or by clicking the Debug menu and selecting the Start menu item. When the Login form is displayed, log in as a manager so that you are redirected to the Reports Web page. When the Reports Web page is displayed, click any report to see the report data in a new browser win- dow. The Timesheets Due and Timesheets Submitted reports produce a report with only two columns: the employee name and total hours. The Timesheets Due report will display the employee name as a hyperlink, and clicking an employee opens a new e-mail message, as shown in Figure 16-5. You can see that the To line, the Subject line, and the body of the message are already filled in with the appropri- ate data. 589 Accessing a Web Service 19_58894x ch16.qxd 10/13/05 5:59 PM Page 589 Figure 16-5 The Timesheets MTD, Timesheets QTD, and Timesheets YTD reports display four columns of data as shown in the Timesheets YTD report shown in Figure 16-6. These reports not only display the employee name and total hours, but also the week ending date for which a timesheet was submitted and the date that the timesheet was approved. Figure 16-6 How It Works You start this exercise by modifying the Login Web page to redirect users logging to the Reports Web page if they are managers. This is very similar to the code that you added to the Main module in your Time Tracker application to redirect users with the admin role to the Admin form. Here you check the RoleName column in the DataSet to determine whether it contains text that is like the word manager. If it does, you redirect the user to the Reports Web page, passing it the UserID of the 590 Chapter 16 19_58894x ch16.qxd 10/13/05 5:59 PM Page 590 manager logging in. If the RoleName column doesn’t contain text that is like the word manager, then you execute the previous code that you had in this Web page whereby you redirected the user to the TimeSheet Web page. If objDataSet.Tables(“User”).Rows(0).Item( _ “RoleName”).ToString.ToLower Like “manager” Then Response.Redirect(“Reports.aspx?UserID=” & _ objDataSet.Tables(“User”).Rows(0).Item(“UserID”).ToString) Else You create the Reports Web page next, and add a JavaScript function that accepts the report type to be processed and opens a new browser window so the report can be processed and displayed. The window object represents an open window in a browser and the open method of the window object will cause a new browser window to be opened and to navigate to the URL passed as an input parameter to this method. The open method accepts four optional parameters: URL, window name, window features, and replace. The URL parameter specifies the document to be displayed in the new window. In the code that follows, you are building the URL by specifying string constants, the input parameter to this function, and the UserID from the query string passed to the Reports Web page. You concatenate the values using a plus ( +) sign. Because the date value that you are passing as a query string value in the URL contains forward slashes, you must properly escape the date so that the forward slashes are not interpreted as part of the URL. This is done using the escape function, which encodes values so that they can be read on all computers. Basically, the escape function replaces special characters, such as a forward slash, using a %xx format. The percent ( %) sign is a signifier that a two-digit hexadecimal value follows and that this constitutes a complete value. The window name parameter of the open method has been specified as TimeSheetReport. This is a name that can be used by the TARGET attribute in a Web form. Whether or not this attribute is used, it is a good idea to specify the window name when opening new browser windows. This enables you to call this method again with a different report while the new window is open and the window will automati- cally display the new report; a new window will not be opened as long as a window with that name is already open. When a new browser window is opened using the open method of the window object, all the features and the size of the browser are used when the window is opened. For example, if you have multiple toolbars displayed in your current browser window, they will be displayed when this new window is opened. You can control which features are displayed when the new window is opened by specifying the window features parameter. This is a comma-separated list of window features, as shown in the following code. Here you are specifying that the new window be opened with a specified width and height and that the scrollbars and toolbars be visible. Note that when the window features parameter is specified, any features not specified in this parameter are considered to be turned off, meaning that they will not be displayed. This was evident in the window displayed in Figure 16-5. The replace parameter is not specified in the code, but if it were present it would be a Boolean value indicating whether the URL parameter that was specified should replace the existing entry in the history list or if a new entry should be created in the history list. 591 Accessing a Web Service 19_58894x ch16.qxd 10/13/05 5:59 PM Page 591 <script language=javascript> function TimeSheetReport(ReportType) { window.open(“TimeSheetReport.aspx?Report=” + ReportType + “&ManagerID=” + “<%=Request.QueryString(“UserID”)%>” + “&WeekEndingDate=” + escape(document.all.ctl00$ContentPlaceHolder1$cboWeekEndingDate.options[ document.all.ctl00$ContentPlaceHolder1$cboWeekEndingDate.options.selectedIndex] .value), “TimeSheetReport”, “width=800,height=600,scrollbars=yes,resizable=yes,toolbar=yes”); } </script> The next table that you create contains all of your controls for this Web page, as shown in Figure 16-4. You basically create an empty table with text in only one column. The controls are added to the table when you switch to Design view. <table border=”0” cellpadding=”1” cellspacing=”2”> <tr> <td>Week Ending Date</td> <td colspan=”4”></td> </tr> <tr> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> </table> In this exercise, you add mostly HTML controls, rather than Web Form controls, which were added to your Web forms in Chapter 14. Because there is no major implementation of code in the code-behind file, there is no need to implement server-side controls in the Reports Web page except for the combo box, which holds the week ending dates. Most of the processing done in this page is done via client-side script, so HTML controls suited your purpose very well. You drag the appropriate HTML controls from the toolbox, drop them into the appropriate cells in the table, and then set some basic properties for these controls to change their appearance. When you switch back to the Source view for your Web form, you modify the code for these HTML controls to add code for the onclick event for each of the buttons. The following code causes the TimeSheetReport function to be executed when a user clicks this button on the Web form. Here you are passing the TimeSheetReport function an input parameter of TimesheetsDue. This value will be used in the TimeSheetReport function as part of the query string for the URL that is used to display a timesheet report. You repeat this same process for each of the <INPUT> elements, passing the appropriate value to the TimeSheetReport function. Therefore, the code for each of these elements is not listed again here. <input class=”FlatButton” id=”Button1” type=”button” value=”Timesheets Due” onclick=”JavaScript:TimeSheetReport(‘TimesheetsDue’);”/> 592 Chapter 16 19_58894x ch16.qxd 10/13/05 5:59 PM Page 592 The only code you add in the code-behind file is the code to get the week ending dates and load them in the combo box on the Web form. Here you add the code to the Load event for the page and use the Dates class that you created in Chapter 14. You call the GetPreviousWeekEndingDate procedure to get and load the previous week ending date and the GetCurrentWeekEndingDate procedure to get and load the current week ending date. Then you set the current week ending date as the default date selected by setting the SelectedIndex property to 1. Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.Load If Not IsPostBack Then ‘Load the week ending dates in the form Dim objDates As New Dates cboWeekEndingDate.Items.Add(objDates.GetPreviousWeekEndingDate) cboWeekEndingDate.Items.Add(objDates.GetCurrentWeekEndingDate) cboWeekEndingDate.SelectedIndex = 1 End If End Sub Before testing your code, you add the TimeSheetReport Web page. Then you are able to run your Web application and log in as a manager, and you are redirected to the Reports Web page (refer to Figure 16-4). When you click each of the buttons, the TimeSheetReport Web page opens in a new window. The next step in this exercise is to add a Web reference to your Web Service. The exact same steps were used in this exercise as the steps that were performed in the first exercise. You right-click the project in Solution Explorer, choose Add Web Reference from the context menu, and then paste the URL for your Web Service in the Add Web Reference dialog box. Then you enter a name for your Web Service that will be used to reference the Web service in your project. You then add some new user defined styles, which are used when building your timesheet reports, to your style sheet. You have a style for the report title, styles for subtitles, a style for your report header, and a style for your report text. .ReportTitle { COLOR: black; FONT-SIZE: 12pt; FONT-WEIGHT: bold; } .SubTitleBold { COLOR: black; FONT-SIZE: 9pt; FONT-WEIGHT: bold; } .SubTitleNormal { COLOR: black; FONT-SIZE: 9pt; 593 Accessing a Web Service 19_58894x ch16.qxd 10/13/05 5:59 PM Page 593 } .ReportHeader { BACKGROUND-COLOR: #4682B4; FONT-SIZE: 8pt; COLOR: White; FONT-WEIGHT: bold; } .ReportText { COLOR: black; FONT-SIZE: 8pt; } In your code-behind file for the TimeSheetReport Web page, you first import the System.Data names- pace (code not shown here) and then declare some variables that will be accessible to all functions in this page. The blnEvenRow variable will be used to toggle the style used between even and odd rows in your TimeSheet report. The strReport variable will contain the report to be generated and the strManagerID variable will hold the GUID of the manager. The dteWeekEndingDate variable will be used to contain the date for the report and the objTimeSheetDS variable should be pretty obvious as you’ve used this one before; it will contain the timesheet report data. ‘Private variables and objects Private blnEvenRow As Boolean = True Private strReport As String Private strManagerID As String Private dteWeekEndingDate As Date Private objTimeSheetDS As New DataSet When the TimeSheetReport Web page is processed, the first event that is executed is the Load event for the page. This is where you want to capture and save the query string values passed to this page. In the Page_Load procedure that follows, you save the type of report being processed in the strReport vari- able, the week ending date requested in the dteWeekEndingDate variable, and the manager ID in the strManagerID variable: Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.Load If Not IsPostBack Then ‘Save the QueryString values strReport = Request.QueryString(“Report”) dteWeekEndingDate = CType(Request.QueryString(“WeekEndingDate”), Date) strManagerID = Request.QueryString(“ManagerID”) End If End Sub The Main procedure is called from server-side code in the HTML code in your Web form. This procedure determines which report to process based on the value contained in the strReport variable. The first 594 Chapter 16 19_58894x ch16.qxd 10/13/05 5:59 PM Page 594 thing that you do in this procedure is initialize a new instance of the TimeSheetsWS Web Service and then set the Credentials property of the Web Service using the default credentials of your Web application. Then, using a Select Case statement, you determine which report was requested and then call the appropriate Web method in your Web Service to have the report data generated and returned in a DataSet. There are two basic report types: a short report containing two columns and a long report containing four columns. The first two Case statements process the short report, while the last three Case statements process the long report. Public Sub Main() Using objReports As New TimeSheetsWS.Reports objReports.Credentials = _ System.Net.CredentialCache.DefaultCredentials Select Case strReport Case “TimesheetsDue” objTimeSheetDS = objReports.TimeSheetsDue( _ guidManagerID, dteWeekEndingDate) Call WriteReportHeader() Call ProcessShortReport() Case “TimesheetsSubmitted” objTimeSheetDS = objReports.TimeSheetsSubmitted( _ guidManagerID, dteWeekEndingDate) Call WriteReportHeader() Call ProcessShortReport() Case “TimesheetsMTD” objTimeSheetDS = objReports.TimeSheetsMTD( _ guidManagerID) Call WriteReportHeader() Call ProcessLongReport() Case “TimesheetsQTD” objTimeSheetDS = objReports.TimeSheetsQTD( _ guidManagerID) Call WriteReportHeader() Call ProcessLongReport() Case “TimesheetsYTD” objTimeSheetDS = objReports.TimeSheetsYTD( _ guidManagerID) Call WriteReportHeader() Call ProcessLongReport() End Select End Using End Sub The WriteReportHeader procedure is responsible for writing the report header in the Web page for all reports. The first line of code here calls the Write method of the Response object to begin writing a <TABLE> element in the HTML of your Web page. You set some basic attributes for the <TABLE> ele- ment, which controls how the table will look. Private Sub WriteReportHeader() Response.Write(“<table cellspacing=””0”” cellpadding=””3””” & _ “border=””0””>”) 595 Accessing a Web Service 19_58894x ch16.qxd 10/13/05 5:59 PM Page 595 The first row in the table contains the report title. There is only one table cell in this row and it spans three cells, as indicated by the colspan attribute. The text in this cell should be centered on the page, as specified by the align attribute. The data for the report title is retrieved from the Title column of the objTimeSheetDS DataSet. Response.Write(“<tr>”) Response.Write(“<td colspan=””3”” align=””center””” & _ “class=””ReportTitle””>” & _ objTimeSheetDS.Tables(“ReportHeader”).Rows(0).Item(“Title”) & _ “</td>”) Response.Write(“</tr>”) The next row in the table contains three cells. The first cell contains the manager’s name for which this report is produced, a filler cell, and the date for this report. You do not want the data in the first cell to wrap to the next line, so you specify the nowrap attribute. The text Manager: should be bold, so you have specified the <FONT> element and tell it to use the SubTitleBold class in your style sheet. The manager’s name is retrieved from the ManagerName column in the objTimeSheetDS DataSet. The next cell here is just a filler cell. The report that is displayed on this page contains the manager’s name in the left side of the report and is aligned to the left. The date for this report is contained in the right side and is aligned to the right. To have the manager’s name aligned to the left and the date aligned to the right, you need to specify a filler cell in between that takes up all the extra room in the row. To accomplish this, you specify the width attribute for this cell and set its value to 100%. You must also specify the text , which causes a blank space to be written in this cell, effectively creating white space in this cell. Response.Write(“<tr>”) Response.Write(“<td nowrap><font class=””SubTitleBold””>” & _ “Manager:</font><font class=””SubTitleNormal””>” & _ objTimeSheetDS.Tables(“ReportHeader”).Rows(0).Item(“ManagerName”) & _ “</font></td>”) Response.Write(“<td width=””100%””> </td>”) The third cell in this row contains the report date, and a Select Case statement is used to determine what text to write in the cell. For the short reports, the text Week Ending Date: is written, followed by the date specified in the Date column of the objTimeSheetDS DataSet. For the long reports, the text Report Date: is written, followed by the date in the Date column of the DataSet. Notice that there are only two Case statements here and that each Case statement contains multiple test expressions, with each one separated by a comma. Because the same action is to be performed for the short reports and the long reports, it only makes sense to combine the test expressions for the Case state- ment in one line. This prevents you from duplicating code for each test expression. The align attribute specified for this cell aligns the data to the right. The nowrap attribute has also been specified and prevents the text in this cell from wrapping to the next line. Finally, the date displayed from the Date column of the DataSet is formatted using the Format function. The Format function accepts two parameters: the expression to be formatted and the format style to use to format the expression. There are many defined styles, and the one being used here formats a date using the short date format, as shown in Figure 16-6. 596 Chapter 16 19_58894x ch16.qxd 10/13/05 5:59 PM Page 596 Select Case strReport Case “TimesheetsDue”, “TimesheetsSubmitted” Response.Write(“<td align=””right”” nowrap>” & _ “<font class=””SubTitleBold””>Week Ending Date:</font>” & _ “<font class=””SubTitleNormal””> “ & _ Format(objTimeSheetDS.Tables(“ReportHeader”).Rows(0).Item( _ “Date”), “Short Date”) & “</font></td>”) Case “TimesheetsMTD”, “TimesheetsQTD”, “TimesheetsYTD” Response.Write(“<td align=””right”” nowrap>” & _ “<font class=””SubTitleBold””>Report Date:</font>” & _ “<font class=””SubTitleNormal””> “ & _ Format(objTimeSheetDS.Tables(“ReportHeader”).Rows(0).Item( _ “Date”), “Short Date”) & “</font></td>”) End Select Response.Write(“</tr>”) The final row in the header table is just a filler row to take up space between the header of the report and the actual report data. Response.Write(“<tr>”) Response.Write(“<td colspan=””3”” width=””100%””> </td>”) Response.Write(“</tr>”) Response.Write(“</table>”) End Sub The ProcessShortReport procedure processes the report data for the Timesheets Due and Time- sheets Submitted reports. The first thing that you do in this procedure is start a new table for the actual report data. The first row in the table is the header row, which contains a steel-blue background with the header text in white, as specified in the ReportStyle style in your style sheet. The first column in this table has the width attribute specified so that this column will always be the same width. The second column does not need a width specified as it contains the total hours. However, the nowrap attribute has been speci- fied to prevent the data in this column from wrapping. Finally, the third column in this table is used as a filler column to keep the data in the first two columns aligned to the left of the report. This ensures that the data is displayed in a consistent manner when the browser window is resized. Private Sub ProcessShortReport() Response.Write(“<table cellspacing=””0”” cellpadding=””3””” & _ “border=””0””>”) Response.Write(“<tr class=””ReportHeader””>”) Response.Write(“<td nowrap width=””200px””>Employee</td>”) Response.Write(“<td nowrap>Total Hours</td>”) Response.Write(“<td width=””100%””> </td>”) Response.Write(“</tr>”) After the header row of the report data has been written, it’s time to process the data in the DataSet and write the report data. Using a For Next loop, you process all rows of data in the DataSet. The first 597 Accessing a Web Service 19_58894x ch16.qxd 10/13/05 5:59 PM Page 597 [...]... through December 31, 99 99 DATETIME DATE January 1, 1753 through December 31, 99 99 January 1, 4712 BC to December 31, 4712 AD NUMBER: DECIMAL –10^28 –1 through 10^28 –1 DECIMAL NUMBER –10^38 +1 through 10^38 –1 –10^38 +1 through 10^38 –1 Table continued on following page Appendix A Table A-1: Data Type Cross-Reference (continued) Access NUMBER: DOUBLE -1. 797 693 13486231E308 to -4 .94 065645841247E-324 for... and from 1. 797 693 13486231E308 to 4 .94 065645841247E-324 for positive values OLE OBJECT Variable-length up to 1,073,741,823 bytes SQL Server Oracle FLOAT NUMBER -1.79E + 308 through -2.23E - 308, 0 and 2.23E + 308 through 1.79E + 308 -10^38 +1 through 10^38 -1 Image LONGRAW Variable-length up to 2,147,483,647 bytes Variable-length up to 2,147,483,648 bytes BLOB Variable-length up to 4, 294 ,96 7, 296 bytes... 82, 70 ❑ 98 Set Name to txtGroupDescription Set Size to 480, 20 Drag a Label control from the Toolbox and drop it onto GroupBox2 Set the following properties for this control: ❑ ❑ Set Text to Update Date ❑ 99 Set Location to 8, 99 Set TextAlign to MiddleRight Drag a TextBox control from the Toolbox and drop it onto GroupBox2 Set the following properties for this control: ❑ ❑ Set Location to 82, 96 ❑ Set... SMALLDATETIME January 1, 190 0 through June 6, 20 79 NUMBER: INTEGER -32,768 to 32,767 SMALLINT NUMBER -32,768 to 32,767 -10^38 +1 through 10^38 -1 SMALLMONEY -214,748.3648 through +214,748.3647 MEMO Variable-length up to 65,535 characters TEXT LONG Variable-length up to 2,147,483,647 characters Variable-length up to 2,147,483,648 characters CLOB Variable-length up to 4, 294 ,96 7, 296 characters NUMBER: BYTE... NCHAR Fixed-length up to 2,000 Unicode characters NTEXT Variable-length up to 1,073,741,823 Unicode characters NCLOB Variable-length up to 4, 294 ,96 7, 296 Unicode characters NVARCHAR NUMBER: SINGLE -3.402823E38 to -1.401 298 E-45 for negative values and from 1.401 298 E-45 to 3.402823E38 for positive values 604 NVARCHAR2 Variable-length up to 4,000 Unicode characters Variable-length up to 4,000 Unicode characters... create these images or find some icons or bitmaps that will represent these categories Visual Studio 2005 contains a collection of bitmaps and icons that can be used in your menus and toolbars In a default installation, these bitmaps and icons are located at C:\Program Files\ Microsoft Visual Studio 8\Common7\ VS2005ImageLibrary You’ll find that using icons, with their transparent backgrounds, in your... TextAlign to MiddleRight 621 Appendix B 95 Drag a TextBox control from the Toolbox and drop it onto GroupBox2 Set the following properties for this control: ❑ ❑ Set Location to 82, 44 ❑ 96 Set Name to txtGroupName Set Size to 176, 20 Drag a Label control from the Toolbox and drop it onto GroupBox2 Set the following properties for this control: ❑ ❑ Set Text to Description ❑ 97 Set Location to 15, 73 Set TextAlign... use in your everyday programming tasks; the table does not contain every data type supported by each of the databases In Table A-1, characters refer to character data, and bytes refer to binary data Table A-1: Data Type Cross-Reference Access SQL Server Oracle BIGINT 9, 223,372,036,854,775,808 to 9, 223,372,036,854,775,807 BINARY Fixed-length up to 8,000 bytes YES/NO Yes/No, True/False or On/Off BIT 0... book However, this is by no means the end of your learning experience with VB 2005, ADO.NET, or database programming in general While you have learned a lot and have covered a lot of ground, there are still volumes of information to learn As you progress in your career and sharpen your database programming skills with VB 2005, you’ll want to network with your peers to share experiences and information... be very useful and informative I have enjoyed writing it and sharing my knowledge with you and I hope that you find it to be an invaluable reference not only for database programming with VB 2005 but also for VB 2005 in general The Wrox team of editors and I wish you much success in your ventures 602 A Data Type Cross-Reference This appendix provides a general data type cross-reference between Microsoft . DATE January 1, 100 through January 1, 1753 through January 1, 4712 BC to December 31, 99 99 December 31, 99 99 December 31, 4712 AD NUMBER: DECIMAL DECIMAL NUMBER –10^28 –1 through 10^28 –1 –10^38. the table are written using the background color of White Smoke. 599 Accessing a Web Service 19_ 58 894 x ch16.qxd 10/13/05 5: 59 PM Page 599 For intIndex As Integer = 0 To _ objTimeSheetDS.Tables(“TimeSheets”).Rows.Count. bold; } .SubTitleBold { COLOR: black; FONT-SIZE: 9pt; FONT-WEIGHT: bold; } .SubTitleNormal { COLOR: black; FONT-SIZE: 9pt; 593 Accessing a Web Service 19_ 58 894 x ch16.qxd 10/13/05 5: 59 PM Page 593 } .ReportHeader { BACKGROUND-COLOR: