Hawkes, Mick I <mailto:[EMAIL PROTECTED]> wrote:

: I am having trouble getting a subprocedure to work using
: parameter data passed with shift

    Your call to the GetOfficers() looks suspect twice. First
calling it with a reference ( \GetOfficers() ) doesn't look right.
Have you tested the results with a test return?

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper 'Dumper';

my %foo = ( db_loop => \GetOfficers() );

print Dumper \%foo;

sub GetOfficers {
    return ( 1 .. 9 );
}

__END__

    I get:

$VAR1 = {
          'SCALAR(0x224f84)' => \7,
          'SCALAR(0x224f60)' => \5,
          'db_loop' => \1,
          'SCALAR(0x18243b0)' => \9,
          'SCALAR(0x224f3c)' => \3
        };


    What you probably wanted was an array reference. If it was,
why not return a reference?

sub GetOfficers {
    return [ 1 .. 9 ];
}

    I get:

$VAR1 = {
          'db_loop' => \[
                           1,
                           2,
                           3,
                           4,
                           5,
                           6,
                           7,
                           8,
                           9
                         ]
        };


    Second, GetOfficers() is called as a subroutine, not as a
method of an object. But it is written as an object method. Try
this.

$template->param( db_loop => $self->GetOfficers() );


    Now for some code review. :)


: sub mainmenu
: {
:   my $self = shift;
:   my $dbh = $self->param('mydbh');
:
:   # Get the CGI query object so that you can use the CGI.pm
:   # modules.
:   my $q = $self->query();

    This is not needed unless you plan to do something with $q.

:
:   # Setup the template to use for the output.
:   my $template = $self->load_tmpl('test2.tmpl.htm');
:
:   # call param to fill in the loop with the loop data by
:   # reference.
:   $template->param(db_loop => \GetOfficers());

$template->param( db_loop => $self->GetOfficers() );


:   # Output the template...
:   $template->output;
: }
:
: sub GetOfficers
: {
:   my $self = shift;
:
:   my $dbh = $self->param('mydbh');
:
:   # Get the CGI query object so that you can use the CGI.pm modules.
:   my $q = $self->query();

    Not needed unless you plan to do something with $q.


:   my $sqlstr = '';
:
:     $sqlstr = <<SQLStmt;
:     SELECT Name FROM qryOfficer;
:
: SQLStmt

    What's wrong with this? Why use a HERE doc for such a short
assignment?

    my $sqlstr = 'SELECT Name FROM qryOfficer';


:     #SELECT Family FROM tblOfficer;
:
:   # Get the database connection then Prepare and Execute the SQL
:   Statement my $sth = $dbh->prepare($sqlstr);
:   $sth->execute()
:     || die "Could not execute SQL Statement!!\n$sqlstr";
:
:   # Setup the template to use for the output.
:   my $template = $self->load_tmpl('test2.tmpl.htm');

    No, that's not needed here. The template isn't used in this
method.


:   my @Officer;  # the loop data will be put in here for the html
:                 # template.
:
:   # Now get the table rows and send the list off to the HTML form.....
:   while ( my $row = $sth->fetchrow_hashref )
:   {
:     #set up the data in an array to give to the HTML template....
:     my %line =
:     (
:       HTML_ProjectName => $row->{Name},
:     );
:     # put this row into the loop by reference
:     push(@Officer, \%line);

    Wouldn't fetchall_arrayref() be better here? (Not tested.)

sub GetOfficers {
    my $self = shift;

    my $sql = 'SELECT Name as HTML_ProjectName FROM qryOfficer';

    my $dbh = $self->param( 'mydbh' );
    my $sth = $dbh->prepare( $sql );
    $sth->execute()
        || die qq(Could not execute SQL: "$sql");

    return fetchall_arrayref( { HTML_ProjectName => 1 } );
}



:
:   }
:   return @Officer

return [EMAIL PROTECTED];

: }

HTH,


Charles K. Clarkson
--
Mobile Homes Specialist
254 968-8328


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to