you don't need it..
-Original Message-
From: Costas Piliotis [mailto:[EMAIL PROTECTED]]
Sent: 01 May 2002 17:00
To: CF-Talk
Subject: RE: sql Stored Proc
You missed the word AS in the declare statement:
DECLARE @col AS nvarchar(30)
-Original Message-
From: Joshua
the equivalent of Now() in SQL server is Getdate()
-Original Message-
From: Dina Hess [mailto:[EMAIL PROTECTED]]
Sent: 29 April 2002 21:46
To: CF-Talk
Subject: Re: SQL Question
oops...wrong reference. if anyone cares, source is appendix e in
'mastering coldfusion 4.5' and the authors
Can anyone see what is wrong with this wml code:
cfcontent type=text/vnd.wap.wml
?xml version=1.0?
!DOCTYPE wml PUBLIC -//WAPFORUM//DTD WML 1.1//EN
http://www.wapform.org/DTD/wml_2.1.xml;
wml
!-- WML Headers --
head
cfinclude template=no_cache.cfm
Inheritance,encaptualtion etc...are defined concepts of OO design, of which
CF aint. I appreciate what you are saying as when I developed using VB C++
programmers used to argue tht VB was a pile of rubbish as it didn't support
true inheritance (which it doesn't). But then you could develop
Yup - but the point is whether it is true inheritance as defined by OO
concepts or, as true OO programmers (of which I aint) say, poor mans
inheritance as I was constantly accused of using back in the days of VB
5/6. Now I have not used VB.Net (nor CFMX!) so don't know how they deals
with
Remember : Just because you drive a crappy old banger, doesn't mean it
aint a car - agree totally but if you drive a motorbike although it still
gets you to where you want to go it aint a car.
I know I keep harping on about VB but it's the ony arena where I've
implemented OO stuff. I seem to
:) - it's you and me against the C++/Java boys (and girls) then!
-Original Message-
From: Neil Clark - =TMM= [mailto:[EMAIL PROTECTED]]
Sent: 30 April 2002 13:56
To: CF-Talk
Subject: RE: I like CFMX
Hee hee, my analogy was worse ... I sure didn't mean to say/think that
ColdFusion MX
]
+---+
...'If there must be trouble, let it be in my day, that my child may have
peace'...
- Thomas Paine, The American Crisis
-Original Message-
From: Andy Ewings [mailto:[EMAIL PROTECTED]]
Sent: Friday, April 26, 2002 10:18 AM
To: CF-Talk
Subject: Dynamic Var names
I'm having a mind
what's wrong with isql?!!
-Original Message-
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
Sent: 29 April 2002 16:53
To: CF-Talk
Subject: RE: Dreamweaver MX Functionality?? (was: CFMX etc etc)
Hehe.. everyone should try notepad and the command line interface to the
their database
First loop through the recordset in the usual way
Do while Not rs.eof
blah blah
rs.movenext
Loop
Now for the next recordset
Set rs = rs.nextrecordset()
then loop through that one
Andy
-Original Message-
From: John McCosker [mailto:[EMAIL PROTECTED]]
Sent: 29 April 2002 17:02
To:
If you want to group by month you can only output the month and not the
whole date. i.e.
SELECT Cust_ID, Datepart(m,Order_Date), SUM(Order_Total) AS Total
FROM Orders
GROUP BY Cust_ID, Datepart(m,Order_Date)
-Original Message-
From: Bud [mailto:[EMAIL PROTECTED]]
Sent: 29 April 2002
or even better with a Custon Tag
-Original Message-
From: Adrian Lynch [mailto:[EMAIL PROTECTED]]
Sent: 26 April 2002 17:03
To: CF-Talk
Subject: RE: cfif
cfinclude???
-Original Message-
From: Janine Jakim [mailto:[EMAIL PROTECTED]]
Sent: 26 April 2002 16:41
To: CF-Talk
Yep you can do this but what appears to be happening is that you are
creating 2 form controls with the same name (i.e. #VariableName# - make sure
they are all unique
-Original Message-
From: Adrian Lynch [mailto:[EMAIL PROTECTED]]
Sent: 26 April 2002 17:16
To: CF-Talk
Subject: RE:
If you output #GetFields.FieldName# for each iteration of the loop you will
undoubtedly find that two or more values are the same, which you can't have
if you are using this to name form controls
-Original Message-
From: Adrian Lynch [mailto:[EMAIL PROTECTED]]
Sent: 26 April 2002 17:47
eh?.
In answer to your question Will there are ODBC drivers but you'll need to
make sure your RDBMS is running on NT if you are using Access or SQL - if
you want to port that over to then you will need sommat like Oracle
-Original Message-
From: Adrian Lynch [mailto:[EMAIL
is it xtype?.I thiught it was just type but that's off the top of my
head
-Original Message-
From: Costas Piliotis [mailto:[EMAIL PROTECTED]]
Sent: 26 April 2002 18:07
To: CF-Talk
Subject: RE: Get list of tables from a SQL Server DB
Uh... Isn't it:
select [name] from sysobjects
that you may be able to do this using the evaluate
or/and the Delay Evaluation functions
--
Andy Ewings
Director
Thoughtbubble Ltd
http://www.thoughtbubble.net
--
United
Sounds like the majority processing on this page is CF. Check the debugging
output and see how long the SQL queries take. If your SQL queries are
taking a noticable abmount of time then I'd suggest ensuring that your
indexes are correct and that your Transact SQL is effecient. Without seeing
:[EMAIL PROTECTED]]
Sent: 22 April 2002 16:33
To: CF-Talk
Subject: RE: Access /SQL Server
Andy,
It is only selecting data and it is running on the same server
as the access versions?
We would appreciate any advice.
Jerry
-Original Message-
From: Andy Ewings [mailto:[EMAIL
I wouldn't suggest posting the form variables back through - can get pretty
messy. I'd suggest trying to encapsulate your code. i.e. have one page
that is both the form and the action page, that way if there is an error you
can trap it and drop down through the code to redisplay the form with
I assume that this other child directory does not have an Application.CFM of
it's own?
-Original Message-
From: Darren Adams [mailto:[EMAIL PROTECTED]]
Sent: 10 April 2002 14:25
To: CF-Talk
Subject: application.cfm
Hi guys,
Just a quick one for you.
I have an application that
what error are you getting?
-Original Message-
From: Ian Skinner [mailto:[EMAIL PROTECTED]]
Sent: 10 April 2002 15:48
To: CF-Talk
Subject: Still Need Help with Stored Procedure.
Stored Procedure Help!!!
We still have not figured out why we cannot access the following stored
procedure
It's unlike to be this if you are able to execute that SP using ASP.
I'd suggest that you move your procresult tag below your proc params - not
sure this will make a blind bit of difference but worth a try. Also ensure
that your parameters are in the same order in the SP as they are in the call
Are the order of your params in the SP the same order as you are passing
them in? i.e. grade then thcrlink, then studentid?they need to be.
Also double check that the datatypes of the variables in the SP are the same
as the datatypes in the procparam tag. Finally ensure that the data being
I agree Robert.
Basicaly CF is quicker to develop in and has easier syntax and hence is
often the prefference. I find the main reason for this is it is much easier
to debug using CF than ASP which is a pain in the backside. I develop in
both and the only areas that ASP wins is when you are
No - you can get a one single licence of CF server - in fact doesn't it come
on the CD in the back of the Forta book?
-Original Message-
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
Sent: 04 April 2002 16:34
To: CF-Talk
Subject: RE: CF VS ASP - let the trolling being
Where is
I think people are confusing the CF Enterprise with the 1 user license. CF
Enterprise is a version of CF server just with less tags supported. so if
you are not using the full tag list then this may be your bag
-Original Message-
From: Robert Bailey [mailto:[EMAIL PROTECTED]]
Sent: 04
with your Babylon 5 Andy - CF
Express - limited but free, CF Professional - full version but does not
allow clustering, CF Enterprise - full version, but also allows clustering
and beaming stuff up.. :)
J
-Original Message-
From: Andy Ewings [mailto:[EMAIL PROTECTED]]
Sent: Thursday, April
I agree with Dave - putting all of your business logic inside triggers can
be a dangerous game. The best way is to develop objects that implement your
business logic for you and these objects are then used by applications.
-Original Message-
From: Dave Watts [mailto:[EMAIL PROTECTED]]
Try putting the ((Starts-Rejects)/Starts) in your select list, give it an
alias, and order by that alias
-Original Message-
From: Brian Scandale [mailto:[EMAIL PROTECTED]]
Sent: 02 April 2002 10:33
To: CF-Talk
Subject: SQL Order By weirdness
Does anyone recognize why this list seems
Has anyone implemented CFChat on any sites they have built and if so what
sort of overhead was there on the server?
__
Get the mailserver that powers this list at http://www.coolfusion.com
FAQ:
Almosttry
select p.*, g.*
from people p
INNER JOIN grades g ON (p.id = g.peopleid)
where p.id IN (select p.id
from people p
INNER JOIN grades g ON (p.id = g.peopleid)
where g.grade = 'a')
-Original Message-
From: Jamie
Tod
Stick this code in your application.cfm:
cfif IsDefined(Cookie.CFID) AND IsDefined(Cookie.CFTOKEN)
cfset cfid_local = Cookie.CFID
cfset cftoken_local = Cookie.CFTOKEN
cfcookie name=CFID value=#cfid_local#
cfcookie name=CFTOKEN value=#cftoken_local#
/cfif
Not strictly true. Although the set of client vars won't expire on the
server there is no reason why you can't delete the id and token on the
client by using the code that I posted on my last post. In fact Tod almost
had it right initially - just didn't use local vars (2 extra lines of code)
: Andy Ewings [EMAIL PROTECTED]
To: CF-Talk [EMAIL PROTECTED]
Sent: Thursday, March 21, 2002 12:16 PM
Subject: RE: Client variable security (Re: The trouble with cookies ...)
Not strictly true. Although the set of client vars won't expire on the
server there is no reason why you can't delete the id
nice one - seen this before. It aint your disk that is full it's your
filegroup (SQL groups data/objects into filegroups). By any chance are you
running SQL on SBS (Small business Server)?
-Original Message-
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
Sent: 19 March 2002 15:48
If you are running SQL on SBS there is a maximum size to your filegroups
(which you can easily reach). It sucks believe me
-Original Message-
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
Sent: 19 March 2002 16:02
To: CF-Talk
Subject: RE: SQL Error, I know
Not quite sure. Our
Have all of your Application.cfm's have different names for the Application?
-Original Message-
From: Teel, C. Doug [mailto:[EMAIL PROTECTED]]
Sent: 19 March 2002 16:08
To: CF-Talk
Subject: Database storage of client variables
I recently(in the past couple of weeks) set up a database
They also may be including your log files in the space that you use - If
they are not backing up properly you might find that your log files are
massive and that providing the segments in the logfiles are ordered properly
backin g them up should free up a tonne of space
-Original
to me. I think that either I have totally cocked up my error handling
(which I'm sure I haven't) or there must be some difference between CF 4 and
CF 5 as this is not happening in my development environment.
Any Ideas?
Andy
--
Andy
CF isn't a new way or concept of developing applications. Not like the
encapsulation and inheritance properties of OO. For me the most recent new
step was Java and the way the code is executed by JVM's across multi
providers. the other was the introduction of OLEDB as a datasource
connectivity
try wrapping it in the convert function
-Original Message-
From: Paul Ihrig [mailto:[EMAIL PROTECTED]]
Sent: 11 March 2002 18:11
To: CF-Talk
Subject: RE: Update multiple rows
thanks Steve
but that gives me this error:
i may just do all updates separately.
not sure
A little off topic but do any of you know of a good co-location company in
either Telehouse or Redbus. Any good/horror stories about Clara Net or
NewNet? Emails to me directly would be appreciated so as not to clog up
this list
This is interesting. I had a nightmare with Session variables where I
was
adamant that I had locked properly but was still getting session
variables
expiring or swapping of sessions...for this reason I always use client
variables
-Original Message-
From: Chris Bohill
I did this a while back - can't remember if I did it using a custom tag
or
not - I'll try to dig out the code and post it here or email you the
tag off
list (if I did have the foresight to put it in a tag)
--
Andrew Ewings
I used something like the following to work out the number of working
days
between 2 dates. You should be able to manipulate to get what you
want:
cfloop condition=#daysadded# LT #stagelength#
cfset nextdate = DateAdd(D,1,nextdate)
cfif DayOfWeek(nextdate) IS NOT 1 AND DayofWeek(nextdate) IS
In fact Snake - why don't you go to www.thoughtbubble.co.uk and look at The
Team - pictures of everyone!
--
Andrew Ewings
Director
Thoughtbubble Ltd
Media Development House
oops...wrong forumsorry!
-Original Message-
From: Andy Ewings [mailto:[EMAIL PROTECTED]]
Sent: 24 January 2002 19:02
To: CF-Talk
Subject: In fact..
In fact Snake - why don't you go to www.thoughtbubble.co.uk and look at
The
Team - pictures of everyone
yuptry an ampersand ()
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
http://www.thoughtbubble.net
--
United Kingdom
http://www.thoughtbubble.co.uk/
Tel:
SELECT acs.ownerid, sts.siteid, sts.sitename
FROM Accounts acc
INNER JOIN AccountSites acs ON (acc.AccountID = acs.AccountID)
INNER JOIN Sites sts ON (acs.OwnerID = sts.OwnerID)
WHERE acs.Accountid = value
--
Andrew Ewings
Project
Anyone here upgraded to SQL 2000 and found that when you try to release an
SP that uses double quotes to build a string it complains, wheras it was
fine in SQL 7? Is there a server or console setting that gets around this?
--
yep your right pascalsthe distinct works on all of the fields combined
that are listed in trhe select statement
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
http://www.thoughtbubble.net
I'm not sure what the varying output bit is for in your parameter
declarationsI've never seen or used it. What is the line number that it
is erroring on?
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
One way is to write an SP and in it you create a temp table (#temp in this
example) with one field called ID then..
-- Insert initial records
INSERT INTO #Temp (ID)
SELECT ID FROM table WHERE Boss = @ID
--Insert all terms further down the heirarchy
DECLARE @rowcount int
, @rowcount1
Firstly let me congratulate you on your choice of softwareyou will pick
up CF quickly I'm sure. My first suggestion (along with most others) would
be to pick up a book called the Coldfusion web Application construction
kit written by Ben Forta. The man knows everything that there is to know
I agree.especially as you want to provide the ability to update content
by the sounds of it. You are likely to end up with your content in some
kind of db and you will need to know basic SQL in order to manage this
information. In addition to this it is worth knowing a bit about db design.
yeh but remember that you can't write to a cookie and then read it within
the same page call.
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
http://www.thoughtbubble.net
No you need the @.
Th problem is with ColdFusion. IT is a nightmare when passing in proc
params. you unfortunately nedd to specify them all, and in the correct
order. I don't know why it asks for the dbvarname fattribute as it doen't
appear to use it. You have 2 options - either pass in the
Yup it's as simple as thatbut the one thing to bear in mind is that the
results of any select statement in your SP (other than those setting values
of variables) will be considered as returnable resultsets
--
Andrew Ewings
I don't trust CreateODBC date in the slightestare you using SQL? if so I
would use a daterange using a charachter string in the format 'dd/mm/'
to capture all dates between to consecutive dates (hence one day) All you
need to do in addition to this is before executing your SQL statement
Yep this is because SQL and CF don't see dates the same...it's a
nightmare.use a varchar string in the format dd/mm/ as the variable
and set dateformat dmy beforehand as I suggested in my last post
--
Andrew Ewings
Project
Lets assume the name of the variable is Place. The code you need is:
cfset spacepos = Find( , Place)
cfset firstpart = Left(place,spacepos)
cfset secondpart = Right(place,Len(Place)-spacepos)
--
Andrew Ewings
Project Manager
upgrade to SQL Server :)sorry that's not very helpfull but as far as I
know you can't easilly. You have no access to Inserted or @@IDENTITY as you
do in SQL Server
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
Replace multiple with multiple=yes
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
http://www.thoughtbubble.net
--
United Kingdom
Are any of the form values null?..check the versions of the ODBC drivers
(in control panel) on the 2 machines - I bet there is a difference.
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
http://www.thoughtbubble.net
Mike
I assume the check boxes represent the same field in the database? So for
example you might have three checkboxes for 3 employees called Andy, Mike
and Steve and you want to delete the employees whose box is checked? If
this is the case then..
All of your boxes should be called the
It's worth highlighting that group by in SQL is completely different from
group by in Cold Fusion - you do not get the same results..
group by in SQL aggregates the results and passes the summary info back to
SQL (so less rows potentially)
group by in CF still loops through ALL records in
Having said that the project scheduler, quoting utility, and timesheet have
been written in a modularised way so that we can port the backend
functionality to different front ends
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
OK another Javascript teaser.
I have written a function which changes the value in text box 2 when the
value text box 1 changes. I call this function in the onchange event of
text box 1. By definition of the onchange event this function should run if
and only if the value in text box 1 is
, distribute, or
retain this message. Please notify us on +44 (0)207 387 8890.
-Original Message-
From: Andy Ewings [mailto:[EMAIL PROTECTED]]
Sent: 17 August 2001 12:50
To: CF-Talk
Subject: ava script
OK another Javascript teaser.
I have written a function which changes the value
I have 3 radio buttons on a form with the same name but different values.
When each of them is clicked a JS function fires which attempts to trap the
value. However I keep getting undefined. I'm pretty sure this is because
the JS doesn't like the fact that the 3 controls are the same name.
First Query here
IF @@rowcount = 0
BEGIN
-- Second query here
END
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
http://www.thoughtbubble.net
--
Yup no probs
INSERT INTO tablename (filedlist)
SELECT fieldlist FROM databasename.dbo.tablename
..
..
..
HTH
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
http://www.thoughtbubble.net
I don't think this is right..you only need 2 dots if you don't specify
an owner.
In fact we are all saying .dbo. but it all depends on who owns the table in
the db.
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
Index the table to hell and back
Indexing too many fields, or the wrong combinations, can actualy hurt
performance.
It's best to put a few benchmarks in place, and add a few indices at a
time.
True.indexes improve speed of selects but slow down inserts,updates and
deletes as the whole
Yep I realise thisjust trying to make the point as to when and why you'd
use indexesI also think you should limit the amount of fields use in
your index. Don't just put them in their for the hell of it. If you
include fileds in your where clause that are in an index then this will
yeh but what happens if the table grows with time?
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
http://www.thoughtbubble.net
--
United Kingdom
I can't believe that anyone trully thinks that tests are a waste of time.
What we are talking about here applies to all forms of testing. Reading
about CF, practicing it, and then taking a test is identical to taking A
Levels, Degree, etc albeit on a lesser level.
Of course the reults of the
Use an SP to select the records or if you have to use CFQuery use
blockfactor in the CFQuery tag. Also look at what types of cursors you are
using to select the recordsets from within SQL (i.e. keyset or static) as
these impact on performance
You'll find out very quickly whether the person has the technical
knowledge
they claim to have, and if you don't have enough knowledge of ColdFusion
Yeh but it's often too late by then.Properly written tests do have
their worth. I disagree with people who say they are a complte waste
What if the person doesn't test well?
This is exactly why they should be looked at as a supplement to an
interview. If you look at it that way you could argue that all forms of
testing are invalid. I could argue that my degree result does not reflect
my ability because I don't test well.
What
By an anual subscription to Brainbench and get all patential employees to
sit onr of the exams. Either that or buy the Certified CF Developers guide
(Forta) and use the q's out of that.much quicker than writing your own!!
--
I used to work for a company that asked Which was the greatest band, the
Stones or the Beatles? This will obviously separate the good from the
bad ;)
On a more serios note - I guess it all depends on what you are trying to
ascertain. The q's in the books are very similar to the ones asked
:)..I'll have a nible too...
The first after the width= terminates the string so Coldfusion sees cfset
dot =tr width= and then the stuff afterwards causes an error. Therefore
you need cfset dot =tr width=190td/td/tr or you need to escape
the quotes around the width
Triggers, by definition, aren't called by CF, they are automatically
triggered when an action occurs on a table in your db (Insert,update,delete)
so you can't pass data back as CF didn't initiate the trigger
--
Andrew Ewings
Dave
I don't follow this...can you further explain. If you can't call a trigger
form within CF (as it is fires automatically by the DB when a specific
action occurs on a table) then how do you get it to return the data to CF?
--
Nope not at alljust keep the posts CF specific!
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
http://www.thoughtbubble.net
--
United Kingdom
by doing exactly what you said!. Prefix your variables with the
scope e.g.
url.q, form.q, client.q, etc
The order with which CF looks for them is:
QUERY RESULT VARS
LOCAL
CGI
FILE
URL
FORM
COOKIE
CLIENT
--
Andrew Ewings
I heard somewhere that it contained a lot more db stuff
--
Andrew Ewings
Project Manager
Thoughtbubble Ltd
http://www.thoughtbubble.net
--
United Kingdom
yup
In theory you can run any SQL statement in CF. you can run multiple
statements by separating them with a semi colon.
to test if an SP exists the SQL code is:
IF EXISTS (SELECT * FROM sysobjects WHERE name = spname AND type = P)
BEGIN
-- do whatever here
ELSE
BEGIN
-
From: Andy Ewings [mailto:[EMAIL PROTECTED]]
Sent: Monday, 16 July 2001 9:37 PM
To: CF-Talk
Subject: RE: Stored Procedures
yup
In theory you can run any SQL statement in CF. you can run multiple
statements by separating them with a semi colon.
to test if an SP exists the SQL code
to storedprocs. Although I know the syntax I haven't used them much
with CF yet...
-Original Message-
From: Andy Ewings [mailto:[EMAIL PROTECTED]]
Sent: Monday, 16 July 2001 11:14 PM
To: CF-Talk
Subject: RE: Stored Procedures
Never tried it, you may have to put semi colons at the end
Message-
From: Andy Ewings [mailto:[EMAIL PROTECTED]]
Sent: Monday, 16 July 2001 11:50 PM
To: CF-Talk
Subject: RE: Stored Procedures
I'm not sure why you are trying to do what you want to do. By the
looks of
it what you actually want to do is to creat an SP to insert a new
users
details
I agree with the first postee!I think it is rarely usednot because
it isn't worth while, on the contrary, I use it in all my apps. However
it's like the Blockfactor scenario, useful if used properly but often
developers tend to ignore it.
Don't think so because each poece of database software will have a different
list of keywords as a keyword in one db may not be one in another. Your
best bet would be to look at documentation pertaining to your database
product.
--
not sure what the earlier messages were in this thread but
Quick question, the dropping of tables seems very destructive, and of
little point other than trashing a site.
Absolutely - that's why you should tie this downin your code so hackers
can't exploit it.
Is it possible to construct
I'm a bit confused. I have 2 identical cfm pages. The pages do very little
CF at all - just a couple of includes. The Only difference is that one of
them has a CFCACHE at the top of the page. The one with the CFCACHE takes
about 171 milliseconds to execute and the one without takes about 60
You've got a semi-colon at the end of your SQL statement. Although this
would work fine in the SQL Query tool, within a CFQUERY it will not.
I don't think this is true - you can legally use semi colons in a cfquery
providing you are using ODBC 2 as this supports the use of multiple SQL
Just have one table with all of the pages in which inclues the following
fields:
id - Unique ID for entry
parentid - ID of parent page (this value is 0 for category pages)
That way you have a heirachical data structure within 1 table. Querying the
table becomes a bit trickier but still ont
If you've onlyu got 500,000 recs between the three the machine you have
should suffice unless you are running all sorts of other stuff on it. we
have a machine here that is a P500 but we are running it as a file server,
mail server, web server, and SQL server.
The main cause of the speed
101 - 200 of 540 matches
Mail list logo