Subject Re: Does Firebird have a way to reference similar named fields? (Like MONTH_1 thru MONTH_120)
Author thp_pkmi
If I can assume Month_1..Month_120 as fields of your table rather than variables, then I suppose we can do things like this:

I= 1;
while (I <= NoOfCol) do
begin
s= 'update YOUR_TABLE set Month_'||I||' = Month_'||I||' + ? where SOME_CONDITION';
execute statement (s) (nTotalMonth);
I= I+1;
end

"YOUR_TABLE" & "SOME_CONDITION" are just symbolic, sorry to be wordy

This approach is only good in syntax, in real performance I think it will be a bit slower than your long syntax, because of the run time compilation of EXECUTE STATEMENT.


--- In firebird-support@yahoogroups.com, "Softtech Support" <stwizard@...> wrote:
>
> Thanks for your reply.
>
> I should have mentioned that this stored procedure is used to generate a Stair-Step Financial Report (My first attempt at such a report I might add) and therefore option 1 below would not work as I do not need to store the results.
>
> I have used EXECUTE STATEMENT in the past for SELECT statements and even after looking again at the LangRef-Update.pdf (For v1.5) I do not see how it could be used for this instance. Am I missing something?
>
> A little more info:
> I basically created a stored procedure that would generate a Stair-Step Financial report that can list the number of accounts/cases turned, amount turned, average amount turned for collections for a given period, followed by the amount received for every month since the given period.
>
> The report works as follows:
> If Client X has been a client for two years, then it would be a 24 x 24 report. Shown below is an example of a client signed on Oct 2012 and we started receiving accounts in Dec 2012. So the report is ran for the first year 10/01/12 thru 06/30/13 and is a 9 x 9 report (9 rows - Periods x 9 columns - Monthly collections).
>
> The start date for this report is 10/01/12 and every month following the first has to be listed whether they had acounts turned to them for collections or not. Then the Recovery would show how much was received in each month following the turn.
>
> Obviously, each row has one less column filled out..so when you get to the last row, there is only Month 1 on the report.
>
> PERIOD CASES PRINC_AMT AVG_CASE MONTH_1 MONTH_2 MONTH_3 MONTH_4 MONTH_5 MONTH_6 MONTH_7 MONTH_8 MONTH_9
> Oct-12 0 0 0 0 0 0 0 0 0 0 0 0
> Nov-12 0 0 0 0 0 0 0 0 0 0 0 0
> Dec-12 292 162894.14 557.85 1101.64 2721.09 3510.35 2571.71 381.21 256.64 25.00 0 0
> Jan-13 229 161576.07 705.57 3802.94 762.90 3995.06 1062.37 1433.10 3206.25 0 0 0
> Feb-13 182 150174.56 825.13 1315.53 1502.86 1920.46 60.00 87.74 0 0 0 0
> Mar-13 158 122131.82 772.98 187.00 1867.37 1805.65 4251.79 0 0 0 0 0
> Apr-13 207 157906.67 762.83 1629.24 2649.20 500.83 0 0 0 0 0 0
> May-13 208 166616.77 801.04 167.23 1800.69 0 0 0 0 0 0 0
> Jun-13 294 236136.50 803.18 200.00 0 0 0 0 0 0 0 0
>
> Is there somewhere I can post attachments? If so then I could post the full stored procedure and an excel file that was generated by it.
>
> So any other ideas how to modify this stored procedure?
>
> Mike
>
>
> ----- Original Message -----
> From: thp_pkmi
> To: firebird-support@yahoogroups.com
> Sent: Tuesday, June 18, 2013 5:14 AM
> Subject: [firebird-support] Re: Does Firebird have a way to reference similar named fields? (Like MONTH_1 thru MONTH_120)
>
>
>
> I think you have 2 options:
>
> 1. normalize the table to have 2 fields "Month Number" & "Month Value", then you can search record by "Month Number" for updating "Month Value"
>
> 2. use PSQL statement: EXECUTE STATEMENT, you can read about it in Firebird-2.5-LangRef-Update.pdf
>
> --- In firebird-support@yahoogroups.com, "Softtech Support" <stwizard@> wrote:
> >
> > In Delphi I have the ability to reference a field using FieldByName() inside a For loop like this:
> >
> > For I := 1 to 120 do
> > begin
> > with cdsReport do
> > begin
> > FieldByName('MONTH_' + IntToStr(I)).Visible := iNoOfCols >= I;
> > end;
> > end;
> >
> >
> > Is there any way to do this in a Firebird Stored Procedure? I have 120 fields named MONTH_1 thru MONTH_120 and currently I have to reference them like this. Just wanting to know if there is a better way..
> > ...
> > I = 1;
> >
> > WHILE (I <= iNoOfColumns ) DO
> > BEGIN
> > IF (I = 1) THEN
> > MONTH_1 = MONTH_1 + nTotalMonth;
> > ELSE IF (I = 2) THEN
> > MONTH_2 = MONTH_2 + nTotalMonth;
> > ELSE IF (I = 3) THEN
> > MONTH_3 = MONTH_3 + nTotalMonth;
> > ELSE IF (I = 4) THEN
> > MONTH_4 = MONTH_4 + nTotalMonth;
> > ELSE IF (I = 5) THEN
> > MONTH_5 = MONTH_5 + nTotalMonth;
> > ELSE IF (I = 6) THEN
> > MONTH_6 = MONTH_6 + nTotalMonth;
> > ELSE IF (I = 7) THEN
> > MONTH_7 = MONTH_7 + nTotalMonth;
> > ELSE IF (I = 8) THEN
> > MONTH_8 = MONTH_8 + nTotalMonth;
> > ELSE IF (I = 9) THEN
> > MONTH_9 = MONTH_9 + nTotalMonth;
> > ELSE IF (I = 10) THEN
> > MONTH_10 = MONTH_10 + nTotalMonth;
> > ELSE IF (I = 11) THEN
> > MONTH_11 = MONTH_11 + nTotalMonth;
> > ELSE IF (I = 12) THEN
> > MONTH_12 = MONTH_12 + nTotalMonth;
> > ELSE IF (I = 13) THEN
> > MONTH_13 = MONTH_13 + nTotalMonth;
> > ELSE IF (I = 14) THEN
> > MONTH_14 = MONTH_14 + nTotalMonth;
> > ELSE IF (I = 15) THEN
> > MONTH_15 = MONTH_15 + nTotalMonth;
> > ELSE IF (I = 16) THEN
> > MONTH_16 = MONTH_16 + nTotalMonth;
> > ELSE IF (I = 17) THEN
> > MONTH_17 = MONTH_17 + nTotalMonth;
> > ELSE IF (I = 18) THEN
> > MONTH_18 = MONTH_18 + nTotalMonth;
> > ELSE IF (I = 19) THEN
> > MONTH_19 = MONTH_19 + nTotalMonth;
> > ELSE IF (I = 20) THEN
> > MONTH_20 = MONTH_20 + nTotalMonth;
> > ELSE IF (I = 21) THEN
> > MONTH_21 = MONTH_21 + nTotalMonth;
> > ELSE IF (I = 22) THEN
> > MONTH_22 = MONTH_22 + nTotalMonth;
> > ELSE IF (I = 23) THEN
> > MONTH_23 = MONTH_23 + nTotalMonth;
> > ELSE IF (I = 24) THEN
> > MONTH_24 = MONTH_24 + nTotalMonth;
> > ELSE IF (I = 25) THEN
> > MONTH_25 = MONTH_25 + nTotalMonth;
> > ELSE IF (I = 26) THEN
> > MONTH_26 = MONTH_26 + nTotalMonth;
> > ELSE IF (I = 27) THEN
> > MONTH_27 = MONTH_27 + nTotalMonth;
> > ELSE IF (I = 28) THEN
> > MONTH_28 = MONTH_28 + nTotalMonth;
> > ELSE IF (I = 29) THEN
> > MONTH_29 = MONTH_29 + nTotalMonth;
> > ELSE IF (I = 30) THEN
> > MONTH_30 = MONTH_30 + nTotalMonth;
> > ELSE IF (I = 31) THEN
> > MONTH_31 = MONTH_31 + nTotalMonth;
> > ELSE IF (I = 32) THEN
> > MONTH_32 = MONTH_32 + nTotalMonth;
> > ELSE IF (I = 33) THEN
> > MONTH_33 = MONTH_33 + nTotalMonth;
> > ELSE IF (I = 34) THEN
> > MONTH_34 = MONTH_34 + nTotalMonth;
> > ELSE IF (I = 35) THEN
> > MONTH_35 = MONTH_35 + nTotalMonth;
> > ELSE IF (I = 36) THEN
> > MONTH_36 = MONTH_36 + nTotalMonth;
> > ELSE IF (I = 37) THEN
> > MONTH_37 = MONTH_37 + nTotalMonth;
> > ELSE IF (I = 38) THEN
> > MONTH_38 = MONTH_38 + nTotalMonth;
> > ELSE IF (I = 39) THEN
> > MONTH_39 = MONTH_39 + nTotalMonth;
> > ELSE IF (I = 40) THEN
> > MONTH_40 = MONTH_40 + nTotalMonth;
> > ELSE IF (I = 41) THEN
> > MONTH_41 = MONTH_41 + nTotalMonth;
> > ELSE IF (I = 42) THEN
> > MONTH_42 = MONTH_42 + nTotalMonth;
> > ELSE IF (I = 43) THEN
> > MONTH_43 = MONTH_43 + nTotalMonth;
> > ELSE IF (I = 44) THEN
> > MONTH_44 = MONTH_44 + nTotalMonth;
> > ELSE IF (I = 45) THEN
> > MONTH_45 = MONTH_45 + nTotalMonth;
> > ELSE IF (I = 46) THEN
> > MONTH_46 = MONTH_46 + nTotalMonth;
> > ELSE IF (I = 47) THEN
> > MONTH_47 = MONTH_47 + nTotalMonth;
> > ELSE IF (I = 48) THEN
> > MONTH_48 = MONTH_48 + nTotalMonth;
> > ELSE IF (I = 49) THEN
> > MONTH_49 = MONTH_49 + nTotalMonth;
> > ELSE IF (I = 50) THEN
> > MONTH_50 = MONTH_50 + nTotalMonth;
> > ELSE IF (I = 51) THEN
> > MONTH_51 = MONTH_51 + nTotalMonth;
> > ELSE IF (I = 52) THEN
> > MONTH_52 = MONTH_52 + nTotalMonth;
> > ELSE IF (I = 53) THEN
> > MONTH_53 = MONTH_53 + nTotalMonth;
> > ELSE IF (I = 54) THEN
> > MONTH_54 = MONTH_54 + nTotalMonth;
> > ELSE IF (I = 55) THEN
> > MONTH_55 = MONTH_55 + nTotalMonth;
> > ELSE IF (I = 56) THEN
> > MONTH_56 = MONTH_56 + nTotalMonth;
> > ELSE IF (I = 57) THEN
> > MONTH_57 = MONTH_57 + nTotalMonth;
> > ELSE IF (I = 58) THEN
> > MONTH_58 = MONTH_58 + nTotalMonth;
> > ELSE IF (I = 59) THEN
> > MONTH_59 = MONTH_59 + nTotalMonth;
> > ELSE IF (I = 60) THEN
> > MONTH_60 = MONTH_60 + nTotalMonth;
> > ELSE IF (I = 61) THEN
> > MONTH_61 = MONTH_61 + nTotalMonth;
> > ELSE IF (I = 62) THEN
> > MONTH_62 = MONTH_62 + nTotalMonth;
> > ELSE IF (I = 63) THEN
> > MONTH_63 = MONTH_63 + nTotalMonth;
> > ELSE IF (I = 64) THEN
> > MONTH_64 = MONTH_64 + nTotalMonth;
> > ELSE IF (I = 65) THEN
> > MONTH_65 = MONTH_65 + nTotalMonth;
> > ELSE IF (I = 65) THEN
> > MONTH_66 = MONTH_66 + nTotalMonth;
> > ELSE IF (I = 67) THEN
> > MONTH_67 = MONTH_67 + nTotalMonth;
> > ELSE IF (I = 68) THEN
> > MONTH_68 = MONTH_68 + nTotalMonth;
> > ELSE IF (I = 69) THEN
> > MONTH_69 = MONTH_69 + nTotalMonth;
> > ELSE IF (I = 70) THEN
> > MONTH_70 = MONTH_70 + nTotalMonth;
> > ELSE IF (I = 71) THEN
> > MONTH_71 = MONTH_71 + nTotalMonth;
> > ELSE IF (I = 72) THEN
> > MONTH_72 = MONTH_72 + nTotalMonth;
> > ELSE IF (I = 73) THEN
> > MONTH_73 = MONTH_73 + nTotalMonth;
> > ELSE IF (I = 74) THEN
> > MONTH_74 = MONTH_74 + nTotalMonth;
> > ELSE IF (I = 75) THEN
> > MONTH_75 = MONTH_75 + nTotalMonth;
> > ELSE IF (I = 76) THEN
> > MONTH_76 = MONTH_76 + nTotalMonth;
> > ELSE IF (I = 77) THEN
> > MONTH_77 = MONTH_77 + nTotalMonth;
> > ELSE IF (I = 78) THEN
> > MONTH_78 = MONTH_78 + nTotalMonth;
> > ELSE IF (I = 79) THEN
> > MONTH_79 = MONTH_79 + nTotalMonth;
> > ELSE IF (I = 80) THEN
> > MONTH_80 = MONTH_80 + nTotalMonth;
> > ELSE IF (I = 81) THEN
> > MONTH_81 = MONTH_81 + nTotalMonth;
> > ELSE IF (I = 82) THEN
> > MONTH_82 = MONTH_82 + nTotalMonth;
> > ELSE IF (I = 83) THEN
> > MONTH_83 = MONTH_83 + nTotalMonth;
> > ELSE IF (I = 84) THEN
> > MONTH_84 = MONTH_84 + nTotalMonth;
> > ELSE IF (I = 85) THEN
> > MONTH_85 = MONTH_85 + nTotalMonth;
> > ELSE IF (I = 86) THEN
> > MONTH_86 = MONTH_86 + nTotalMonth;
> > ELSE IF (I = 87) THEN
> > MONTH_87 = MONTH_87 + nTotalMonth;
> > ELSE IF (I = 88) THEN
> > MONTH_88 = MONTH_88 + nTotalMonth;
> > ELSE IF (I = 89) THEN
> > MONTH_89 = MONTH_89 + nTotalMonth;
> > ELSE IF (I = 90) THEN
> > MONTH_90 = MONTH_90 + nTotalMonth;
> > ELSE IF (I = 91) THEN
> > MONTH_91 = MONTH_91 + nTotalMonth;
> > ELSE IF (I = 92) THEN
> > MONTH_92 = MONTH_92 + nTotalMonth;
> > ELSE IF (I = 93) THEN
> > MONTH_93 = MONTH_93 + nTotalMonth;
> > ELSE IF (I = 94) THEN
> > MONTH_94 = MONTH_94 + nTotalMonth;
> > ELSE IF (I = 95) THEN
> > MONTH_95 = MONTH_95 + nTotalMonth;
> > ELSE IF (I = 96) THEN
> > MONTH_96 = MONTH_96 + nTotalMonth;
> > ELSE IF (I = 97) THEN
> > MONTH_97 = MONTH_97 + nTotalMonth;
> > ELSE IF (I = 98) THEN
> > MONTH_98 = MONTH_98 + nTotalMonth;
> > ELSE IF (I = 99) THEN
> > MONTH_99 = MONTH_99 + nTotalMonth;
> > ELSE IF (I = 100) THEN
> > MONTH_100 = MONTH_100 + nTotalMonth;
> > ELSE IF (I = 101) THEN
> > MONTH_101 = MONTH_101 + nTotalMonth;
> > ELSE IF (I = 102) THEN
> > MONTH_102 = MONTH_102 + nTotalMonth;
> > ELSE IF (I = 103) THEN
> > MONTH_103 = MONTH_103 + nTotalMonth;
> > ELSE IF (I = 104) THEN
> > MONTH_104 = MONTH_104 + nTotalMonth;
> > ELSE IF (I = 105) THEN
> > MONTH_105 = MONTH_105 + nTotalMonth;
> > ELSE IF (I = 106) THEN
> > MONTH_106 = MONTH_106 + nTotalMonth;
> > ELSE IF (I = 107) THEN
> > MONTH_107 = MONTH_107 + nTotalMonth;
> > ELSE IF (I = 108) THEN
> > MONTH_108 = MONTH_108 + nTotalMonth;
> > ELSE IF (I = 109) THEN
> > MONTH_109 = MONTH_109 + nTotalMonth;
> > ELSE IF (I = 110) THEN
> > MONTH_110 = MONTH_110 + nTotalMonth;
> > ELSE IF (I = 111) THEN
> > MONTH_111 = MONTH_111 + nTotalMonth;
> > ELSE IF (I = 112) THEN
> > MONTH_112 = MONTH_112 + nTotalMonth;
> > ELSE IF (I = 113) THEN
> > MONTH_113 = MONTH_113 + nTotalMonth;
> > ELSE IF (I = 114) THEN
> > MONTH_114 = MONTH_114 + nTotalMonth;
> > ELSE IF (I = 115) THEN
> > MONTH_115 = MONTH_115 + nTotalMonth;
> > ELSE IF (I = 116) THEN
> > MONTH_116 = MONTH_116 + nTotalMonth;
> > ELSE IF (I = 117) THEN
> > MONTH_117 = MONTH_117 + nTotalMonth;
> > ELSE IF (I = 118) THEN
> > MONTH_118 = MONTH_118 + nTotalMonth;
> > ELSE IF (I = 119) THEN
> > MONTH_119 = MONTH_119 + nTotalMonth;
> > ELSE IF (I = 120) THEN
> > MONTH_120 = MONTH_120 + nTotalMonth;
> > END
> >
> > I = I + 1;
> > ...
> >
> > Thanks to all that can lend any insight,
> > Mike
> >
> >
> > [Non-text portions of this message have been removed]
> >
>
>
>
>
>
> [Non-text portions of this message have been removed]
>