[prev] [thread] [next] [Date index for 2005/08/11]
I suspect this might be more of a problem with my SQL than with CDBI.
(Plus, there's likely a much better way to do this.)
I have a table and one column is an integer "sort_order". In my
table display I want to have "move up" and "move down" links -- that
adjusts the "sort_order" values on the table to rearrange the overall
sort order. (The top is 1, so move up means decrease sort_order.)
Now, when I run the code I get and exception:
DBI bind_columns: invalid number of arguments: got handle + 0, expected handle + between 1 and -1
But the odd thing is that the table is actually rearranged as I want.
So the update is happening, but I'm still getting the error. I
suspect I'm not passing the bind parameters correctly, or maybe the
CASE statement is causing problems.
Here's the code:
# This returns the items that are *below* the item
# No point in moving $item up if it's already at the top
__PACKAGE__->set_sql('can_move_up', <<'SQL');
SELECT id FROM __TABLE__
WHERE
sort_order <= (SELECT sort_order FROM __TABLE__ WHERE id = ?)
AND id != ?;
SQL
sub can_move_up {
my ( $class ) = @_;
die "Can't move item up in sort order because no sort_order column"
unless $class->find_column('sort_order');
return $class->search_can_move_up( $class->id, $class->id );
}
# This moves $item up the list (lower number) and moves everything
# at $item->sort_order -1 down one (sort_order+1).
# (FIX - bumps items when they don't need to be incremented)
__PACKAGE__->set_sql('move_up', <<'SQL');
UPDATE __TABLE__
SET sort_order =
CASE
-- subtract one from the item's sort, unless it's already "1"
WHEN id = ? AND sort_order > 1 THEN sort_order-1
-- for other items that are greater or equal to sort-1
-- bump their sort order
WHEN id != ? AND sort_order >= (select sort_order from __TABLE__ where id = ?)-1
THEN sort_order+1
-- all others, leave alone
ELSE sort_order
END;
SQL
sub move_item_up {
my ( $class ) = @_;
return unless $class->can_move_up;
my $id = $class->id;
$class->search_move_up( $id, $id, $id );
$class->dbi_commit;
}
--
Bill Moseley
moseley@xxxx.xxx
_______________________________________________
ClassDBI mailing list
ClassDBI@xxxxx.xxxxxxxxxxxxxxxx.xxx
http://lists.digitalcraftsmen.net/mailman/listinfo/classdbi
|
[CDBI] set_sql() and bind columns
|
Generated at 13:17 on 19 Aug 2005 by mariachi v0.52