public String buildUpdSql(
			AdminTbl tbl, 
			String keyval,
			List<AdminCol> updcols, 
			List<AdminCol> metacols, 
			List<AdminCol> keycols, 
			Map<String,String[]> data,
			String userId,
			String langCd) 
	{
		StringBuilder sql = new StringBuilder();
		
		//build the update set clause for editable fields
		sql.append(" update ").append(tbl.getTblNm()).append(" set ");
		boolean first = true;
		for (AdminCol u : updcols) {
			if (!first) { sql.append(", "); }
			sql.append(u.getColNm()).append(" = ").append(buildColVal(data.get(u.getColNm())[0], u.getDataType()));
			first = false;
		}
		// set the metadata fields
		for (AdminCol m : metacols) {
			if (AdminConstants.META_TYPE_UPD_USER.equals(m.getMetaType())) {
				sql.append(", ").append(m.getColNm()).append(" = ").append(buildColVal(userId, m.getDataType()));
			}
			else if (AdminConstants.META_TYPE_UPD_DT.equals(m.getMetaType())) {
				sql.append(", ").append(m.getColNm()).append(" = ").append(buildColVal(DATE_FORMAT.format(new Date()), AdminConstants.DATA_TYPE_STRING));
			} 
		}
		
		// add the where clause
		parseKeyVals(keyval, keycols);
		sql.append(" where ");
		first = true;
		for (AdminCol k : keycols) {
			if (!first) { sql.append(" and "); }
			sql.append(k.buildWhereClause());
			first = false;
		}
		
		// add language 
		if (tbl.hasLang()) {
			sql.append(" and ").append(tbl.getLangColNm()).append(" = '").append(langCd).append("'");
		}
		
		return sql.toString();
	}