Click here to Skip to main content
15,897,704 members
Articles / Web Development / IIS

Universal Table Editor

Rate me:
Please Sign up or sign in to vote.
4.86/5 (117 votes)
11 May 2003 1.6M   12.3K   275  
Viewer and Editor for any table in any Database you can reach from your IIS/PWS.
<%
'---------------------------------------------------------------------------
'
'   Project:    UTE - (U)niversal ASP (T)able (E)ditor
'
'   Module:     UTE class - Form Functions
'
'   Version:    3.00
'
'   Comments:   This module does the following things:
'                   1. defines all functions being needed in
'                      form view mode
'
'---------------------------------------------------------------------------
'
'   (c) in 2000-2003 by Tom Wellige                    
'   http://www.wellige.com  mailto:tom@wellige.com     
'                                               
'   This project is released under the "GNU General Public License (GPL)" 
'   http://www.gnu.org/licenses/gpl.html
'
'   and is maintained on SourceForge at
'   http://sourceforge.net/projects/ute-asp/
'
'   and can also be found on CodeProject at
'   http://www.codeproject.com/asp/ute.asp
'
'---------------------------------------------------------------------------



''--------------------------------------------------------------------------
'' Name:     getSQLStatement
''           ==================
'' 
'' Returns SQL Statement to select/delete specific record. The statement is
'' compiled by the hidden form "ident" fields.
''
'' Parameter: 
''		sCmd		"select *" or "delete"
''
'' return value:
''		string
''
''--------------------------------------------------------------------------
Private Function getSQLStatement ( sCmd )
	Dim i
	Dim bFirst
	Dim sSQL, sField, nType, sValue
	Dim curField

	i = 1
	bFirst = True
	sSQL = sCmd & " FROM " & m_sTable
	while Request.Form(sFormUTEFieldPrefix & sFormIdentField & CStr(i)) <> ""
		sField = Request.Form(sFormUTEFieldPrefix & sFormIdentField & CStr(i))
		nType  = CInt(Request.Form(sFormUTEFieldPrefix & sFormIdentType & CStr(i)))
		sValue = Request.Form(sFormUTEFieldPrefix & sFormIdentValue & CStr(i))
		Set curField = m_RS(sField)
		sSQL = sSQL & AddWhere (sField, nType, sValue, "=", "AND", bFirst)
		bFirst = False
		i = i + 1
	wend

	getSQLStatement = sSQL

End Function


''--------------------------------------------------------------------------
'' Name:     IsErrorField
''           ============
'' 
'' Is this an Error Field ?
''
'' Parameter: 
''		sName		name of field to be checked
''
'' return value:
''		boolean
''
''--------------------------------------------------------------------------
Private Function IsErrorField ( sName )
	Dim i, bReturn
	bReturn = False
	for i = 1 to UBound(m_ErrorField)
		if m_ErrorField(i) = sName then bReturn = True
	next
	IsErrorField = bReturn
End Function


''--------------------------------------------------------------------------
'' Name:     GetErrorNumber
''           ==============
'' 
'' Returns the Error Description
''
'' Parameter: 
''		sName		name of field the err descr. should be returned
''
'' return value:
''		string
''
''--------------------------------------------------------------------------
Private Function GetErrorDescription ( sName )
	Dim i, sReturn
	sReturn = ""
	for i = 1 to UBound(m_ErrorField)
		if m_ErrorField(i) = sName then sReturn = sReturn & m_ErrorMessage(i) & "<br>"
	next
	' cut traling <br>
	if sReturn <> "" then sReturn = Left(sReturn, Len(sReturn)-4)
	GetErrorDescription = sReturn
End Function


''--------------------------------------------------------------------------
'' Name:     PutError
''           ========
'' 
'' Put Error into Error Management
''
'' Parameter: 
''		errField		name of field that returns an error
''		errNumber		error number
''		errMessage		error description
''
'' return value:
''		none
''
''--------------------------------------------------------------------------
Private Sub PutError ( errField )
	Dim e
	Dim nError
	' the errors collections of the connection object contains all occured errors
	For Each e In m_DB.Errors
		nError = UBound(m_ErrorField) + 1
		Redim Preserve m_ErrorField(nError)
		m_ErrorField(nError)   = errField
		Redim Preserve m_ErrorMessage(nError)
		m_ErrorMessage(nError) = e.Description
	Next
	Err.Clear
	m_DB.Errors.Clear
End Sub


''--------------------------------------------------------------------------
'' Name:     InsertFieldForm
''           ===============
'' 
'' Return HTML code for a single field (incl, heading, form element and definitions
''
'' Parameter: 
''		field			field object
''		bPrimaryKey		this is a primary key field
''
'' return value:
''		string			HTML code
''
''--------------------------------------------------------------------------
Private Function InsertFieldForm ( field, bPrimaryKey )

	Dim sReturn, sValue
	Dim sStyle, sStyleForm
	Dim nSize, nMaxLength
	Dim nMemoCols, nMemoRows
	Dim sChecked

	sStyle = "ute_header"
	if bPrimaryKey then sStyle = sStyle & "_pk"

	sStyleForm = "ute_form_value"
	if IsErrorField (field.name) then sStyleForm = "ute_form_error"

	' field value
	if m_bSubmitted then
		if bPrimaryKey then
			if IsNull(field.value) then
				sValue = ""
			else
				select case field.type
					case else
						sValue = CStr(field.value)
				end select
			end if
		else
			sValue = Trim(Request.Form(field.name))
		end if
	else
		if IsNull(field.value) then
			sValue = ""
		else
			select case field.type
				case else
					sValue = CStr(field.value)
			end select
		end if
	end if
	' html endcode field value
	sValue = Server.HTMLEncode(sValue)

	sReturn  = _
		"<tr>" & _
		"<td class=""" & sStyle & """>" & field.name & "</td>" & _
		"<td class=""" & sStyleForm & """>"

	if	(NotAttrib(field.Attributes, adFldUpdatable) and NotAttrib(field.Attributes, adFldUnknownUpdatable)) or _ 
		((NotAttrib(field.Attributes, adFldUpdatable) and bPrimaryKey)) or _
		(m_nFormMode = MD_DELETE) then 
		' this field is not editable

		if IsExcluded(field.type) then
			' this field is not editable by ute
			sReturn = sReturn & _
				"<img src=""" & m_sIMAGEDir & "exclude.gif"" border=""0"" alt=""" & STR_NON_VIEW & """ " & _
				"width=""16"" height=""16"">"
		else
			' display field value
			sReturn = sReturn & sValue
		end if
	else
		' this field is editable

		select case field.type
			' VARCHAR
			case adBSTR, adVariant, adChar, adVarChar, adWChar, adVarWChar
				nMaxLength = field.DefinedSize
				if nMaxLength > DEF_MAX_INPUT_LENGTH then 
					nSize = DEF_MAX_INPUT_LENGTH
				else
					nSize = nMaxLength
				end if

			' MEMO
			case adLongVarChar, adLongVarWChar
				nMemoCols = DEF_MEMO_COLS
				nMemoRows = DEF_MEMO_ROWS

			' ELSE 
			case else
				nMaxLength = field.Precision
				if nMaxLength > DEF_MAX_INPUT_LENGTH then
					nSize = DEF_MAX_INPUT_LENGTH
				else
					nSize = nMaxLength
				end if

		end select
   
		if IsExcluded(field.type) then
			sReturn = sReturn & _
				"<img src=""" & m_sIMAGEDir & "exclude.gif"" border=""0"" alt=""" & STR_NON_VIEW & """ " & _
				"width=""16"" height=""16"">"
		else
			if (field.type = adLongVarChar) or (field.type = adLongVarWChar) then
				' MEMO -> TEXTAREA
				sReturn = sReturn & "<textarea name=""" & field.name & """ cols=" & CStr(nMemoCols) & _
					" rows=" & CStr(nMemoRows) & ">" & sValue & "</textarea>"
			elseif (field.type = adBoolean) then
				' -> CHECKBOX
				sChecked = ""
				if CBool(field.value) then sChecked = " checked"
				sReturn = sReturn & "<input type=""checkbox"" name=""" & field.name & """" & sChecked & ">" 
			else
				' -> INPUT
				sReturn = sReturn & "<input type=""text"" name=""" & field.name & """ maxlength=" & _       
					CStr(nMaxLength) & " size=" & CStr(nSize) & " value=""" & sValue & """>"
			end if 

			' put error message into form
			if IsErrorField(field.name) then
				sReturn = sReturn & "&nbsp;" & GetErrorDescription(field.name)
			end if 

		end if 
	end if 

	sReturn = sReturn & "</td>" & vbCrLf

	if m_bViewDefinitions then
		sReturn = sReturn & _
			"<td class=""ute_form_def"">" & GetTypeString(field.type) & "</td>" & _
			"<td class=""ute_form_def"">" & GetAttributesString(field.attributes) & "</td>"
	end if

	sReturn = sReturn & "</tr>" & vbCrLf

	InsertFieldForm = sReturn

End Function


''--------------------------------------------------------------------------
'' Name:     InsertIdentFields
''           =================
'' 
'' Return HTML code for hidden form fields. These fields contain the field
'' names and values to identify the current record.
''
'' Parameter: 
''		none
''
'' return value:
''		string
''
''--------------------------------------------------------------------------
Private Function InsertIdentFields ()
	Dim i
	Dim nCount
	Dim curField
	Dim sField, sType, sValue
	Dim sReturn

	sReturn = ""

	if m_nFormMode <> MD_INSERT then

		' do we already have some ident fields in form ?
		if Request.Form(sFormUTEFieldPrefix & sFormIdentField & "1") <> "" then
			' yes, so use these values
			i = 1
			while Request.Form(sFormUTEFieldPrefix & sFormIdentField & CStr(i)) <> ""
				sField = Request.Form(sFormUTEFieldPrefix & sFormIdentField & CStr(i))
				sType  = Request.Form(sFormUTEFieldPrefix & sFormIdentType & CStr(i))
				sValue = Request.Form(sFormUTEFieldPrefix & sFormIdentValue & CStr(i))
				sReturn = sReturn & _
					"<input type=""hidden"" name=""" & sFormUTEFieldPrefix & sFormIdentField & CStr(i) & """ " & _
						"value=""" & sField & """>" & vbCrLf & _
					"<input type=""hidden"" name=""" & sFormUTEFieldPrefix & sFormIdentType & CStr(i) & """ " & _
						"value=""" & sType & """>" & vbCrLf & _
					"<input type=""hidden"" name=""" & sFormUTEFieldPrefix & sFormIdentValue & CStr(i) & """ " & _
						"value=""" & sValue & """>" & vbCrLf
				i = i + 1
			wend
		else
			' no, create ident fields from primary key fields or all fields
			nCount = 0
			if UBound(m_PrimaryKeyFields) > 0 then
				' use Primary Keys for identification
				for i = 1 to UBound(m_PrimaryKeyFields)
					set curField = m_RS(m_PrimaryKeyFields(i))
					if (not IsExcluded(curField.Type)) and not (IsNull(curField.Value)) then
						nCount = nCount + 1
						if (curField.Type = adBoolean) then
							if curField.value then
								sValue = CStr(True)
							else
								sValue = CStr(False)
							end if
						else
							sValue = CStr(curField.Value)
						end if
						sReturn = sReturn & _
							"<input type=""hidden"" name=""" & sFormUTEFieldPrefix & sFormIdentField & CStr(nCount) & _
								""" value=""" & m_PrimaryKeyFields(i) & """>" & vbCrLf & _
							"<input type=""hidden"" name=""" & sFormUTEFieldPrefix & sFormIdentType & CStr(nCount) & _
								""" value=""" & m_PrimaryKeyTypes(i) & """>" & vbCrLf & _
							"<input type=""hidden"" name=""" & sFormUTEFieldPrefix & sFormIdentValue & CStr(nCount) & _
								""" value=""" & sValue & """>" & vbCrLf
					end if
				next
			else
				' use all fields for identification
				for i = 1 to UBound(m_StandardFields)
					set curField = m_RS(m_StandardFields(i))
					if (not IsExcluded(curField.Type)) and not (IsNull(curField.Value)) then
						nCount = nCount + 1
						if (curField.Type = adBoolean) then
							if curField.value then
								sValue = CStr(True)
							else
								sValue = CStr(False)
							end if
						else
							sValue = CStr(curField.Value)
						end if
						sReturn = sReturn & _
							"<input type=""hidden"" name=""" & sFormUTEFieldPrefix & sFormIdentField & CStr(nCount) & _
								""" value=""" & m_StandardFields(i) & """>" & vbCrLf & _
							"<input type=""hidden"" name=""" & sFormUTEFieldPrefix & sFormIdentType & CStr(nCount) & _
								""" value=""" & m_StandardTypes(i) & """>" & vbCrLf & _
							"<input type=""hidden"" name=""" & sFormUTEFieldPrefix & sFormIdentValue & CStr(nCount) & _
								""" value=""" & sValue & """>" & vbCrLf
					end if
				next
			end if 
		end if 
	end if

	InsertIdentFields = sReturn
End Function


''--------------------------------------------------------------------------
'' Name:     InitForm
''           ========
'' 
'' Initialises a recordset for the form. This is either created as a new
'' (empty) one, or as a copy from the current record from the table view.
''
'' Parameter: 
''		none
''
'' return value:
''		none
''
''--------------------------------------------------------------------------
Private Sub InitForm ()

	Dim s

	' if cancel button was pressed redirect back to table
	if Request.Form(sFormUTEFieldPrefix & sFormButton) = STR_CANCEL then
		s = Request.QueryString
		s = getLink(m_sUTEScript, s, sParamMode,      CStr(MD_TABLE))
		s = getLink(m_sUTEScript, s, sParamFormMode,  CStr(DEF_FORM_MODE))
		s = getLink(m_sUTEScript, s, sParamSubmitted, "0")
		Response.Redirect s
	end if

	' get RecordSet for this form
	if m_nFormMode = MD_INSERT then
		' create new RecordSet
		Set m_RSForm = Server.CreateObject("ADODB.Recordset")
		m_RSForm.Open m_sTable, m_DB, adOpenStatic, adLockPessimistic, adCmdTable
		m_RSForm.AddNew
	else
		if not m_bSubmitted then
			' identify record by "record" URL param
			m_RS.Move m_nRecord - 1, adBookmarkFirst
			Set m_RSForm = m_RS
		else
			' identify record by hidden form fields
			Set m_RSForm = Server.CreateObject("ADODB.Recordset")
			m_RSForm.Open getSQLStatement("SELECT *"), m_DB, adOpenStatic, adLockPessimistic, adCmdText
		end if
	end if

End Sub


''--------------------------------------------------------------------------
'' Name:     IsFormField
''           ===========
'' 
'' Returns TRUE if thegiven field name is a field on the current submitted form.
''
'' Parameter: 
''		name		name of field
''
'' return value:
''		boolean
''
''--------------------------------------------------------------------------
Private Function IsFormField ( name )
	Dim bReturn
	Dim field
	bReturn = False
	for each field in Request.Form
		if (field = name) then bReturn = True
	next
	IsFormField = bReturn
End Function


''--------------------------------------------------------------------------
'' Name:     UpdateRecordSet
''           ===============
'' 
'' Put form values into record set
''
'' Parameter: 
''		rsUpdt		recordset to be updated
''
'' return value:
''		none
''
''--------------------------------------------------------------------------
Private Sub UpdateRecordSet ( byref rsUpdt )

	Dim field

	' own error handling
	On Error Resume Next

	'for each field in Request.Form
	for each field in rsUpdt.fields

		select case field.type
			case adBoolean
				rsUpdt(field.name) = (Request.Form(field.name) = "on")
			case else
				' is this a field being set in the form ?
				if IsFormField(field.name) then
					if Request.Form(field.name) = "" then
						rsUpdt(field.name) = NULL
					else
						rsUpdt(field.name) = Request.Form(field.name)
					end if
				end if
		end select
	
		if Err <> 0 then PutError field.name

	next

	if UBound(m_ErrorField) = 0 then 
		' make update permanent in DB
		rsUpdt.Update
		if Err <> 0 then PutError ""
	end if

	' disable own error handling
	On Error Goto 0

End Sub


''--------------------------------------------------------------------------
'' Name:     Update
''           ======
'' 
'' Updates record in database. If successful redirect to ute page in table
'' view mode (else do not redirect, this will lead to display the form and
'' show the error)
''
'' Parameter: 
''		none
''
'' return value:
''		none
''
''--------------------------------------------------------------------------
Private Sub Update
	Dim s
	
	' initialise form
	InitForm

	if m_bSubmitted then

		select case m_nFormMode
			case MD_INSERT
				' Insert New Record
				UpdaterecordSet m_RSForm

			case MD_EDIT
				' Edit Record
				UpdaterecordSet m_RSForm

			case MD_DELETE
				' Delete Record
				m_DB.Execute getSQLStatement("DELETE")
		end select

		' If everything is ok return to table view
		if UBound(m_ErrorField) = 0 then 
			s = Request.QueryString
			s = getLink(m_sUTEScript, s, sParamMode,      CStr(MD_TABLE))
			s = getLink(m_sUTEScript, s, sParamFormMode,  CStr(DEF_FORM_MODE))
			s = getLink(m_sUTEScript, s, sParamSubmitted, "0")
			if m_nPageSize = m_RS.RecordCount-1 then
				s = getLink(m_sUTEScript, s, sParamPageSize, CStr(m_RS.RecordCount-1))
			end if
			Response.Redirect s
		end if

	end if

End Sub


''--------------------------------------------------------------------------
'' Name:     getFormToolBar
''           ==============
'' 
'' Returns HTML code for the toolbar on top of the form.
''
'' Parameter: 
''		none
''
'' return value:
''		string		HTML code
''
''--------------------------------------------------------------------------
Private Function getFormToolBar( nColCount )
	Dim s, sValue, sSubmitted

	sValue = ""

	if m_bShowDefLink then

		sValue = "<tr><td class=""ute_toolbar"" colspan=""" & CStr(nColCount)& """>" & vbCrLf

		s = Request.QueryString

		' show/hide field definitions
		if (m_bShowDefLink) and (m_RS.RecordCount > 0) then
			if m_bViewDefinitions then
				if m_bSubmitted then
					sSubmitted = "1"
				else
					sSubmitted = "0"
				end if
				s = getLink(m_sUTEScript, s, sParamSubmitted, sSubmitted)
				s = getLink(m_sUTEScript, s, sParamDefs, "0")
				sValue = sValue & _
					"<a href=""" & s & """ " & _
						"onMouseover=""SelectImage('Definition_down','Definition');""" & _
						"onMouseout=""SelectImage('Definition_down_sel','Definition');"">" & _
							"<img src=""" & m_sIMAGEDir & "definition_down_sel.gif"" name=""Definition"" border=""0"" " & _
							"height=""25"" width=""25"" title=""" & STR_DEF_HIDE & """>" & _
					"</a>" & vbCrLf
			else
				s = getLink(m_sUTEScript, s, sParamDefs, "1")
				s = getLink(m_sUTEScript, s, sParamSubmitted, "0")
				sValue = sValue & _
					"<a href=""" & s & """ " & _
						"onMouseover=""SelectImage('Definition_up','Definition');""" & _
						"onMouseout=""SelectImage('Definition_normal','Definition');"">" & _
							"<img src=""" & m_sIMAGEDir & "definition.gif"" name=""Definition"" border=""0"" " & _
							"height=""25"" width=""25"" title=""" & STR_DEF_SHOW & """>" & _
					"</a>" & vbCrLf
			end if
		end if

		sValue = sValue & "</td></tr>" & vbCrLf

	end if

	getFormToolBar = sValue

End Function


''--------------------------------------------------------------------------
'' Name:     buildHTML_Form
''           ==============
'' 
'' Creates entire UTE HTML code for form view mode.
''
'' Parameter: 
''		none
''
'' return value:
''		string		HTML code
''
''--------------------------------------------------------------------------
Private Function buildHTML_Form()
	Dim i, nColCount
	Dim s, sValue, sSubmitted

	if m_bViewDefinitions then
		nColCount = 4
	else
		nColCount = 2
	end if

	s = Request.QueryString
	s = getLink(m_sUTEScript, s, sParamSubmitted, "1")

	' add javascript code
	sValue = _
		"<script language=""JavaScript"">" & vbCrLf & _
		"<!--" & vbCrLf & _
		"	browserName = navigator.appName;" & vbCrLf & _
		"	browserVer = parseInt(navigator.appVersion);" & vbCrLf & _
		vbCrLf & _
		"	if (browserName == ""Netscape"" && browserVer >= 3)" & vbCrLf & _
		"	{" & vbCrLf & _
		"	version = ""n3"";" & vbCrLf & _
		"	}" & vbCrLf & _
		"	else if (browserName == ""Microsoft Internet Explorer"" && browserVer >= 3)" & vbCrLf & _
		"	{" & vbCrLf & _
		"	version = ""n3"";" & vbCrLf & _
		"	}" & vbCrLf & _
		"	else version = ""n2"";" & vbCrLf & _
		vbCrLf & _
		"	if (version == ""n3"")" & vbCrLf & _
		"	{" & vbCrLf & _
		"		// create image objects" & vbCrLf & _
		"		Definition_normal       = new Image();" & vbCrLf & _
		"		Definition_up           = new Image();" & vbCrLf & _
		"		Definition_down         = new Image();" & vbCrLf & _
		"		Definition_down_sel     = new Image();" & vbCrLf & _
		vbCrLf & _
		"		// assign actual images to image objects" & vbCrLf & _
		"		Definition_normal.src   = """ & m_sIMAGEDir & "definition.gif"";" & vbCrLf & _
		"		Definition_up.src       = """ & m_sIMAGEDir & "definition_up.gif"";" & vbCrLf & _
		"		Definition_down.src     = """ & m_sIMAGEDir & "definition_down.gif"";" & vbCrLf & _
		"		Definition_down_sel.src = """ & m_sIMAGEDir & "definition_down_sel.gif"";" & vbCrLf & _

		"	}" & vbCrLf & _
		"" & vbCrLf & _
		"	function SelectImage(img_src, img_name)" & vbCrLf & _
		"	{" & vbCrLf & _
		"		if (version == ""n3"")" & vbCrLf & _
		"		{" & vbCrLf & _
		"			imgOn = eval(img_src + "".src"");" & vbCrLf & _
		"			document [img_name].src = imgOn;" & vbCrLf & _
		"		}" & vbCrLf & _
		"	}" & vbCrLf & _
		"//-->" & vbCrLf & _
		"</script>" & vbCrLf & _
		"<p><span class=""ute_headline"">" & m_sTable & "</span></p>" & vbCrLf & _
		"<p><span class=""ute_subheadline"">" & m_sHeadline & "</span></p>" & vbCrLf

	for i = 1 to UBound(m_ErrorField)
		if m_ErrorField(i) = "" then
			sValue = sValue & _
				"<p><span class=""ute_form_error"">" & _
				m_ErrorMessage(i) & _
				"</span></p>" & vbCrLf
		end if
	next

	sValue = sValue & _
		"<form method=""post"" action=""" & s & """>" & vbCrLf & _
		InsertIdentFields & vbCrLf & _
		"<table class=""ute_form"">" & vbCrLf

	' add toolbar
	sValue = sValue & getFormToolBar(nColCount) & vbCrLf

	' insert all primary keys
	for i = 1 to UBound(m_PrimaryKeyFields)
		sValue = sValue & InsertFieldForm (m_RSForm.fields(m_PrimaryKeyFields(i)), True)
	next

	' insert all other fields
	for i = 1 to UBound(m_StandardFields)
		sValue = sValue & InsertFieldForm (m_RSForm.fields(m_StandardFields(i)), False)
	next

	sValue = sValue & _
		"<tr>" & vbCrLf & _
		"<td colspan=""" & CStr(nColCount) & """>" & vbCrLf & _
		"<br><br>&nbsp;" & vbCrLf & _
		"<input type=""submit"" name=""" & sFormUTEFieldPrefix & sFormButton & """ class=""ute_btn_ok"" " & _
				"value=""" & STR_OK & """>" & vbCrLf & _
		"&nbsp;" & vbCrLf & _
		"<input type=""submit"" name=""" & sFormUTEFieldPrefix & sFormButton & """ class=""ute_btn_cancel"" " & _
				"value=""" & STR_CANCEL & """>" & vbCrLf & _
		"&nbsp;" & vbCrLf & _
		"</td>" & vbCrLf & _
		"</tr>" & vbCrLf

	sValue = sValue & _
		"</table>" & vbCrLf & _
		"</from>"

	buildHTML_Form = sValue

End Function


%>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
CEO Student
Germany Germany
Tom is in software development for about 15 years. He started with a SHARP MZ80k in Basic and Assembly Language. After collecting some experiance on an ATARI 1040ST he bought his very first IBM XT 286 (incl. 287!) and started to program in Turbo Pascal. He became very familiar with Borland's Turbo Vision and over the last years did a lot of development in C++ (MFC), Visual Basic, VB Script, ASP and SQL. He currently works as senior consultant for Swyx Solutions GmbH, based in Dortmund, Germany.
His absolute favourite is Guinness Wink | ;-) Sláinte!

Comments and Discussions