Hummmm !
É necessário mais código, teste isto.
Havia muitas considerações a analisar.
No entanto assume que o 1º dia da semana é "Segunda-feira" (Lunes)
Código COBOL:
data division.
working-storage section.
01 input-data pic 9(8) value 20220101.
01 integer-of-input-data binary pic 9(8).
01 work-table.
02 work-item occurs 3.
03 work-year binary pic 9(4).
03 work-jan-4 binary pic 9(8).
03 work-first-date binary pic 9(8).
01 work-sub binary pic 9(4).
01 week-for-input-data pic 9(2).
procedure division.
inicio.
perform with test after until input-data = 0
display "Digite a data YYYYMMDD: " with no advancing
accept input-data
if input-data = 0
exit program
else
perform calculos
display "Nr. da semana da data: " input-data " e "
week-for-input-data " do ano: " work-year (work-sub)
end-if
end-perform
exit program
.
calculos.
divide input-data by 10000 giving work-year (2)
subtract 1 from work-year (2) giving work-year (1)
add 1 to work-year (2) giving work-year (3)
perform varying work-sub from 1 by 1
until work-sub > 3
compute work-jan-4 (work-sub) =
function integer-of-date(work-year (work-sub) * 10000 + 0104)
compute work-first-date (work-sub) =(function integer ((work-jan-4 (work-sub) - 1) / 7)) * 7 + 1
end-perform
compute integer-of-input-data = function integer-of-date (input-data)
evaluate integer-of-input-data
when work-first-date (1) thru (work-first-date (2) - 1)
move 1 to work-sub
perform calculate-nr-semana
when work-first-date (2) thru (work-first-date (3) - 1)
move 2 to work-sub
perform calculate-nr-semana
when other
move 3 to work-sub
perform calculate-nr-semana
end-evaluate
.
calculate-nr-semana.
compute week-for-input-data = (function integer ((integer-of-input-data - work-first-date (work-sub)) / 7)) + 1
.