Well, the explanation for this behavior is rather simple. Function FieldValue() returns the value that is present in the position as specified by the second parameter. But those values are lifted from the Symbol table of the field, not from the table column(s) that make up a particular field. And a field Symbol table stores every distinct value only once.
For the working data, the symbol table of field Bizdays_permonth contains these values:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
For the non-working data, the symbol table of field Bizdays_permonth contains these values:
22, 20, 19, 21
and nothing more...
The order in which symbol table strings are stored is the one in which you load them. So position 3 contains the value from row 5 (may) and position 4 contains the value from row 6 (jun).
If you want to fix this using the code you already wrote, replace the FieldValue() function by a call to Lookup(). That one does peek into the column of the internal table, instead of the symbol table.
Peter is absolutely right, and that's why you shouldn't use FieldValue() to query data table values.
You can probably use Lookup(), but I think the straight forward replacement would be the Peek() function.
[Just take care about the different index start compared to FieldIndex(), Peek() starts table record indexing from 0]
LET vSum = Peek('Bizdays_permonth',vCounter-1);
DO WHILE vCounter < vReport.EndNb ;
LET vCounter = vCounter + 1;
LET vTemp = Peek('Bizdays_permonth',vCounter-1);
Besides this, I wouldn't do the aggregation of your table values like this, using a DO WHILE loop and Peek() the table record values, but that's not the topic of your thread nor your issue.