in reply to Logic problem on loops

No logic errors stand out immediately, but you're doing way too much work. For example,
$xf = 0; $sthf->execute; while (@dataf = $sthf->fetchrow_array()) { $filiais[$xf] = $dataf[0]; $xf++; }
is generally better written as:
while (my ($col) = $sthf->fetchrow_array()) { push @filiais, $col; }
Similarly,
for ($m=1; $m<=12; $m++)#Make an array of months { $months[$m] = $m; } foreach $months(@months) {
would be shorter, clearer, and prone to one less boundary condition as:
foreach my $month (1 ... 12) {
The biggest issue you have is what appears to be a complete reliance on package globals. If you forget to reset one to zero at the start of the sub, you'll have values bleading over across invocations -- exactly what you describe. Change all of these variables into lexicals within your sub and I suspect your error will disappear.