> HI,
> I want to provide remittance slips to my suppliers. I've extracted data 
> from my payments database and pushed records into an array. Here is a 
> sample of data from that array :
> 
> 01,supplierA,100.00,1st May 2005
> 02,supplierB,100.00,3rd May 2005
> 03,supplierC,100.00,3rd May 2005
> 04,supplierA,100.00,4th May 2005
> 
> I would identify the fields thus :
> 
> foreach $item(@array) {
> ($transaction,$supplier,$amount,$pay_date) = split /,/,$item;
> }
> 
> This allows me to print a remittance by transaction(record) but I need some 
> sort of grouping mechanism to group transactions belonging to the same 
> supplier.
> In other words - although the sample above has 4 transactions, it should 
> only produce 3 remittance slips.
> Cheers,
> Mark


Here is a technique that uses some complex data structures.  Read 
the Perl Data Structures Cookbook ( perldoc perldsc ) if any of this is not
obviously clear to you.

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;


# 
# For each of several transactions, add one line to a slip
#
sub Produce_remittance_slip ($@)
{

    my ($supplier, @transaction) = @_ ;
    print "begin slip for $supplier\n";
    for my $transaction (@transaction) {
        print
            'Transaction: ',
            $transaction->{serial},
            ' on ', 
            $transaction->{pay_date},
            ' amount: ',
            $transaction->{amount},"\n";
    }
    print "end slip for $supplier\n\n\n";
}

#
# a hash to hold a arrayref of transaction details for
# each supplier
#

my %transaction; 

while (<DATA>) {
    #
    # a little hashref to hold the details of one record
    #

    my $details ;

    #
    # since you sent this question to the DBI list as well
    # as the beginners list, you might want to consider
    # using the fetchrow_hashref() DBI method
    # such that $details will already BE a hashref
    # of the form $details = { serial => '123',
    #                          supplier => 'Wombly Bog Bitters',
    #                          amount => '150.00',
    #                          date => '21st May' }
    # 

    #
    # use a hash-slice to populate the record from the data file row
    #

    chomp;
    @$details{qw / serial supplier amount pay_date / } = split ',';


    #
    # this following line is equivalent to the following:
    # $transactions_for_this_supplier = $transaction{$details->{supplier}};
    # push @$transactions_for_this_supplier, $details;
    #
    # but that will not work quite right, because
    # you don't get autovifification.
    #
    # you could MAKE it work by making sure each supplier
    # has an empty arrayref in %transaction
    # with a line like
    #
    # $transaction{$details->{supplier}} ||= [];
    #
    # but I think that notation is more confusing than
    # mastering this rather-common idiom:
    #

    push @{$transaction{$details->{supplier}}}, $details;

}

#
# now, %transaction looks like
#

# %transaction  = (
#           'supplierB' => [
#                            {
#                              'amount' => '100.00',
#                              'pay_date' => '3rd May 2005',
#                              'supplier' => 'supplierB',
#                              'serial' => '02'
#                            }
#                          ],
#           'supplierA' => [
#                            {
#                              'amount' => '100.00',
#                              'pay_date' => '1st May 2005',
#                              'supplier' => 'supplierA',
#                              'serial' => '01'
#                            },
#                            {
#                              'amount' => '100.00',
#                              'pay_date' => '4th May 2005',
#                              'supplier' => 'supplierA',
#                              'serial' => '04'
#                            }
#                          ],
#           'supplierC' => [
#                            {
#                              'amount' => '100.00',
#                              'pay_date' => '3rd May 2005',
#                              'supplier' => 'supplierC',
#                              'serial' => '03'
#                            }
#                          ]
#         );


#
# now, for each supplier, produce a remittance slip with each of their 
transactions
#


for my $supplier ( sort { $a cmp $b } keys %transaction ) {
    my @transaction = @{$transaction{$supplier}};
    Produce_remittance_slip ($supplier, @transaction ); 
}

__DATA__
01,supplierA,100.00,1st May 2005
02,supplierB,100.00,3rd May 2005
03,supplierC,100.00,3rd May 2005
04,supplierA,100.00,4th May 2005


-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
        Lawrence Statton - [EMAIL PROTECTED] s/aba/c/g
Computer  software  consists of  only  two  components: ones  and
zeros, in roughly equal proportions.   All that is required is to
sort them into the correct order.



-- 
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