NOT SOLVED! Re: [ic] User tag on CommonAdjust producing an errormessage

Barry Treahy, Jr. interchange-users@icdevgroup.org
Tue Sep 3 11:32:02 2002


Kevin Walsh wrote:

>>w2k.mmaz.com MxyBptP2:192.168.10.10 - [30/August/2002:15:17:14 -0400] 
>>mmb2c /cgi-bin/mmb2c/TRM-2194-05-EMI-02.html Safe: Can't locate object 
>>method "open_table" via package "Vend::Table::GDBM" (perhaps you forgot 
>>to load "Vend::Table::GDBM"
>>?) at /ibin/interchange/lib/Vend/Data.pm line 910.
>> >
>> > $Tag->tier_pricing( $item->{code}, $item->{quantity} )
>> >
>>
>>After testing with the change, I started working on other parts of the 
>>system and when reviewing the log for another reason, I saw this!  It 
>>return, though it appears to be complaining about a different routine. 
>> In a nutshell, this is what is in the usertag:
>>
>>  my $sql = "select quantity,discount from tiers where tier='" . $tier 
>>."' order by code desc";
>>  my $db = ::database_exists_ref('tiers') or die 'Missing tiers table';
>>  my $results = $db->query({sql => $sql});
>>
>>What kills me is that the code works, so why is IC complaining about it?
>>
>>    
>>
>Have you created a test tag with just those three lines and some
>sort of test return value, such as 123?  I'd be surprised if you
>got the same error message, or anything similar.
>
>If you post the entire UserTag, perhaps something could be suggested.
>It's usually better to post a code snippet, as you have done, but I
>can't see anything functionally wrong with what you posted.  Of course,
>I could be missing something.
>  
>
Hi Kevin,

boy it has been a long weekend and still no launch, though I'm very 
close.  Still struggling with VAT issues for UK only orders and a few 
other irritations but regarding your request for the entire tag, here it 
is with commented out experiments and all:

bash# cat /ibin/interchange/usertag/tier*
# [tier_pricing sku= quantity= ]
#
# This tag allows the support for multi-tiered quantity based
# pricing based on details from Kevin's IC post.  At this time,
# the only place this tag is used is on the CommonAdjust
# statement for the catalog
#
#PriceField      0
#CommonAdjust "& $Tag->tier_pricing( $item->{code}, $item->{quantity} )"
#
UserTag tier_pricing Order sku quantity
UserTag tier_pricing Routine <<EOR
sub
{
  my ($sku, $quantity) = @_;
  my $return;
#  $Tag->iclog("tier_pricing: Startup: sku: " . $sku . ", quantity: " . 
$quantity);
  my $factor = 100.00; #0% off today!
  my $price = $Tag->data( {
      table => 'products',
      field => 'price',
      key => $sku,
    });
  my $tier = $Tag->data( {
      table => 'products',
      field => 'tier',
      key => $sku,
    });
 
  my $sql = "select quantity,discount from tiers where tier='" . $tier 
."' order by code desc";
 
#here you must use the wantarray => 1, cause the documentation says so :)
#The documentation also says that using that will return an arrayref of your
#results, a hashref of the column names, and an arrayref of the column 
names.
#
# Original
# my ($results,$colname_hashref,$colname_arrayref) = $Tag->query({ 
wantarray =>1,sql => $sql, } );
# still use simplied version as easier on eyes, still works, and didn't 
stop the errors...
  my $results = $Tag->query({ wantarray => 1,sql => $sql } );
# This variation worked but produced the same error, different module
#  my $db = ::database_exists_ref('tiers') or die 'Missing tiers table';
#  my $results = $db->query({sql => $sql});
 
#take the arrayref, and convert to an array @results, which is an array 
of array refs.
#Arg, what a headarch, these level of deferrals have really lost me so 
just make it work!
  my @results = @{$results};
  my $notfound = 1;
  my $loadit = 0;
  my $toggle = 0;
  foreach my $ref (@results) {
    my @tmp = @{$ref}; #dereference each arrayref
    foreach my $test (@tmp) { #@temp now holds actual (dereferenced) results
      if ($notfound == 1) {
        if ($toggle == 0) {
#          $Tag->iclog("tier_pricing: Quantity: " . $test);
          $toggle = 1;
# Per BVC, we are not allowing the 200 qty or above!?!?  Go figure!
          if ($quantity >= 200) {
            if ($test < 200) {$loadit = 1; }
          } else {
            if ($test <= $quantity) {$loadit = 1;}
          }
        } else {
#          $Tag->iclog("tier_pricing: Discount: " . $test);
          $toggle = 0;
          if ($loadit == 1) {
            $return = $test;
            $loadit = 0;
            $notfound = 0;
          }
        }
      }
    }
  }
 
#just for debug:
#  $Tag->iclog("tier_pricing: return: " . $return);
  $factor=$return;
#  if ($price ne $price + 0.0) {
#    $Tag->iclog("tier_pricing: locale error: $price " , $price+0.0);
#    return 0;
#  }
#  $Tag->iclog("tier_pricing: Ending: sql: " . $sql . ", sku: " . $sku . 
", tier: " . $tier .  ", quantity: " . $quantity . ", factor: " . 
$factor .  ", pricing: " . $price);
  $price = $price * $factor;
  return $price;
}
EOR
bash#

Please note that I'm still learning Perl and I'm sure that someone like 
a Schwartz could have pobably done the above in a three line statement, 
but I'm still attempting to develope my skills there, in IC and not bug 
the list for each and everything little thing if I can find a 
'brute-force' method of at least getting it to work...

As for reducing the take down to just three lines, I did that and the 
query still produced the results.  What fogs my mind is that even with 
the errors, the CommonAdjust has never failed to work...

Barry