OK, thanks for the help. I figured it out. Mostly it was my bonehead
forgetting that I was playing with ways to get around a couple of
perceived limitations in the way that Reactor's constructed DAO works
and I was querying a view and not a table at the point that I starting
having this trouble and did not switch everything back.
But it raises the question again, since it appears this will not work
with views. In my experience most of this stuff belongs in the database
in stored procedures. I was willing to try to refactor my database for
this new project because I can recognize the savings that not having to
build all of this would provide. But I am having a hard time getting my
head around how Reactor is useful for all but the most basic of
applications. (This is NOT a criticism... it is a tremendous project...
I just may not get it yet).
It seems that for anything beyond very basic data structure you end up
having to use custom query functions anyway and that defeats the purpose
of Reactor abstracting for you. It is seeming like I could use this for
maybe 20% of the app, but beyond that the processing is just too intense
to leave to simple table updates.
Am I not getting it? Or are my needs just something other than what this
is intended to provide? Has anyone else tried to take an app done in
sprocs and refactor it to allow Reactor to handle it?
I want to love this. Please help me... :-)
Ray
João Fernandes wrote:
Sorry ray, you missunderstood me,
This is what reactor does when you call load method on your record.
<cfset record.load()>
Executes load method from the abstractRecord (reactor.base.abstractRecord)
Look this code
<!-------------- CODE INSIDE LOAD METHOD OF THE RECORD -------------------->
<cfif IsDefined("arguments") AND fieldList IS 1>
<cfset fieldList = arguments[1] />
<cfelseif IsDefined("arguments") AND fieldList IS NOT 1>
<cfloop collection="#arguments#" item="item">
<cfinvoke component="#this#" method="set#item#">
<cfinvokeargument name="#item#"
value="#arguments[item]#" />
</cfinvoke>
</cfloop>
</cfif>
<cftry>
<cfset _getDao().read(_getTo(), fieldList) />
<cfcatch type="Reactor.Record.NoMatchingRecord">
<cfset nothingLoaded = true />
</cfcatch>
</cftry>
<!-------------- CODE INSIDE LOAD METHOD OF THE RECORD -------------------->
When it calls <cfset _getDao().read(_getTo(), fieldList) />
It will invoke read method in the DAO passing all arguments to it, but since
you didn't pass any (in this case) inside the DAO you'll be executing
<!-------------- CODE INSIDE READ METHOD OF THE DAO ----------------------->
<cfif Len(arguments.loadFieldList)>
<cfset UserQuery = UserGateway.createQuery() />
<cfloop list="#arguments.loadFieldList#"
index="field">
<cfset UserQuery.getWhere().isEqual("User",
field, arguments.to[field]) />
</cfloop>
<cfset qRead =
UserGateway.getByQuery(UserQuery,true) />
<cfelse>
<cfset qRead = UserGateway.getByFields(
) />
</cfif>
<!-------------- CODE INSIDE READ METHOD OF THE DAO ----------------------->
Since the arguments.loadFieldList in your case will be empty, it will
execute
<cfset qRead = UserGateway.getByFields( ) />
It should be
<cfset qRead = UserGateway.getByFields( UserId = arguments.to.UserId ) />
Why is it doing this?
Because it couldn't find the primary key during the generation
Try to run this query
SELECT
col.COLUMN_NAME as name,
CASE
WHEN colCon.CONSTRAINT_NAME IS NOT
NULL THEN 'true'
ELSE 'false'
END as primaryKey,
CASE
WHEN
columnProperty(object_id(col.TABLE_NAME), col.COLUMN_NAME, 'IsIdentity') > 0
THEN 'true'
ELSE 'false'
END AS [identity],
CASE
WHEN col.IS_NULLABLE = 'No' THEN
'false'
ELSE 'true'
END as nullable,
col.DATA_TYPE as dbDataType,
CASE
WHEN
ISNUMERIC(col.CHARACTER_MAXIMUM_LENGTH) = 1 THEN
col.CHARACTER_MAXIMUM_LENGTH
ELSE 0
END as length,
col.COLUMN_DEFAULT as [default]
FROM INFORMATION_SCHEMA.COLUMNS as col LEFT JOIN
INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tabCon
ON col.TABLE_NAME = tabCon.TABLE_NAME
AND tabCon.CONSTRAINT_TYPE = 'PRIMARY KEY'
LEFT JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
as colCon
ON col.COLUMN_NAME = colCon.COLUMN_NAME
AND col.TABLE_NAME = colCon.TABLE_NAME
AND colCon.CONSTRAINT_NAME =
tabCon.CONSTRAINT_NAME
WHERE col.TABLE_NAME = 'User'
And drop the result here.
João Fernandes
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On
Behalf Of Ray West
Sent: quinta-feira, 10 de Agosto de 2006 16:41
To: [email protected]
Subject: Re: [Reactor for CF] Ambiguous Record Problem
OK, replying to a couple of emails here. Thanks everyone for the help...
Yes the UserID field is definitely a PK. I turned it off and saved and
turned it back on to be sure it was set. Same problem exists.
While the PK was turned off I tried the shortcut method. It still worked.
I am in development mode.
I have deleted all of my project files and they were recreated... Same
problem exists.
So are you saying that I can only 'search' by fields that are primary
keys? What if I want to create a record and run a login script on it
comparing a username and password that are not keys? This works using
the shortcut method. Why should it not work by setting the properties
and loading the object?
Hope I answered everything.
Ray
João Fernandes wrote:
The problem is, when you use
<cfset record.setUserid(someval)>
<cfset record.load()>
In the read method inside UserDao.cfc if you take a look into the code I
posted in my last email, load() and load(userid=val) go through different
paths. The load() method goes through
<cfset qRead = UserGateway.getByFields(
<!------- This part is blank ------->
) />
The part in blank is where reactor should put the code to load the record
based on the primary key definition. Delete your project files and
regenerate to see if the problem persists.
João Fernandes
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On
Behalf Of Ray West
Sent: quinta-feira, 10 de Agosto de 2006 16:15
To: [email protected]
Subject: Re: [Reactor for CF] Ambiguous Record Problem
The shortcut method appears to be using the same setUserID property
setter that I am calling. And yet the shortcut method works...
Ray
Ray West wrote:
frak... well... it is not working here and I need to be able to pass the
object into a method for processing (not to mention that that is the
better way to do it) so the shortcut method won't work for this.
R
Jared Rypka-Hauer wrote:
I've been using it just fine with SQL Server for eons... well, not
eons, but a long time.
I'm trying to think of what the issue could be man. Coming up, as
usual, with a big fat blank. ;)
J
------------------------------------------------
Jared C. Rypka-Hauer
Continuum Media Group LLC
http://www.web-relevant.com
Member, Team Macromedia - ColdFusion
"That which does not kill me makes me stranger." - Yonah Schmeidler
On Aug 10, 2006, at 9:25 AM, Ray West wrote:
NP Chris,
This is an exception thrown by Reactor and not a CF error. I don't
get anything extra when I turn on debugging in CF. A query of some
sort apparently runs fine, it just returns unexpected data.
I am going to load the new version and see if there is any difference.
Have anyone reproduced this or gotten it to run correctly with SQL
Server?
Ray
Chris Phillips wrote:
I appologize Ray.
I didn't catch that you were saying that
<cfset objUser.setUserID(1) />
<cfset objUser.load() />
didn't work
and
<cfset objUser.load(UserID=1) />
did.
Which makes this rather wierd.
If it were me, I'd turn on debugging and watch the queries that CF
is generating to see how they are different.
Let us know what you see.
Regards,
Chris
On 8/9/06, *Ray West* <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:
It is... second guess? :-)
Can anyone repro this?
Ray
Chris Phillips wrote:
> First guess is that UserID is not a PrimaryKey.
>
> On 8/9/06, *Ray West* < [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
<mailto:[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>>> wrote:
>
> Hi,
>
> In MS SQL Server, whenever I create a record and do this:
>
> <cfset objUser.setUserID (1) />
> <cfset objUser.load() />
>
> I get an ambiguous record error, even though there is
only one
> record in
> the table with that ID.
>
> When I do:
>
> <cfset objUser.load(UserID=1) />
>
> It works fine.
>
> Any help appreciated...
>
> Ray
>
>
>
>
> -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- --
> -- -- -- -- --
> Reactor for ColdFusion Mailing List
> [email protected] <mailto:[email protected]>
<mailto:[email protected] <mailto:[email protected]>>
> Archives at:
http://www.mail-archive.com/reactor%40doughughes.net/
> < http://www.mail-archive.com/reactor%40doughughes.net/>
> -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- --
> -- -- -- -- --
>
>
>
>
> --
> Chris Phillips
> www.dealerpeak.com <http://www.dealerpeak.com>
<http://www.dealerpeak.com>
> Senior Application Developer
> -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- --
> -- -- -- --
> Reactor for ColdFusion Mailing List
> [email protected] <mailto:[email protected]>
> Archives at:
http://www.mail-archive.com/reactor%40doughughes.net/
> -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- --
> -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- --
-- -- -- --
Reactor for ColdFusion Mailing List
[email protected] <mailto:[email protected]>
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
<http://www.mail-archive.com/reactor%40doughughes.net/>
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- --
-- -- -- --
--
Chris Phillips
www.dealerpeak.com <http://www.dealerpeak.com>
Senior Application Developer
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- --
Reactor for ColdFusion Mailing List
[email protected] <mailto:[email protected]>
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- --
Reactor for ColdFusion Mailing List
[email protected] <mailto:[email protected]>
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- --
Reactor for ColdFusion Mailing List
[email protected]
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- --
Reactor for ColdFusion Mailing List
[email protected]
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- --
Reactor for ColdFusion Mailing List
[email protected]
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- --
Reactor for ColdFusion Mailing List
[email protected]
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- --
Reactor for ColdFusion Mailing List
[email protected]
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Reactor for ColdFusion Mailing List
[email protected]
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Reactor for ColdFusion Mailing List
[email protected]
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --