× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



Hi All,

I'm getting a decimal data error in an SQLRPGLE program that does a PREPARE:

c/exec SQL
c+ PREPARE SQLstmt FROM :@SELECT
c/end-exec

and in my problem situation, @SELECT is

SELECT * FROM ERPLOG WHERE ELDATE BETWEEN 20020601 AND 20020631 AND
ELAPSEDHOURS(ELDATE,ELTIMI,ELDATE,ELTIMO) < 24

Further down in the program, it gets the decimal data error on the
following:

c                   eval      Hours = ElapsedHours(
c                                        ELDATE: ELTIMI:
c                                        ELDATE: ELTIMO)

where Hours is

D Hours           s             10i 0

Note that this is *after* it has successfully selected the record using the
exact same UDF.  The values of the fields as seen in the dump are:

ELDATE              ZONED(8,0)           20020601.
'F2F0F0F2F0F6F0F1'X
ELTIMI              ZONED(4,0)           1847.            'F1F8F4F7'X
ELTIMO              ZONED(4,0)           2100.            'F2F1F0F0'X

The UDF is in a service program and looks like this:

P ElapsedHours    B                   export
D ElapsedHours    PI            10i 0
D   FromDate                          like(ELDATE) const
D   FromTime                          like(ELTIMI) const
D   ThruDate                          like(ELDATE) const
D   ThruTime                          like(ELTIMO) const
D FromTS          s               z
D Hours           s             10i 0
D ThruTS          s               z
 ****** The following stmt is where it gets the decimal data error *******
c                   eval      FromTS = TimeStamp(FromDate: FromTime)
c                   eval      ThruTS = TimeStamp(ThruDate: ThruTime)
c                   if        FromDate = ThruDate and
c                             ThruTime < FromTime
c                   adddur    24:*H         ThruTS
c                   endif
c     ThruTS        subdur    FromTS        Hours:*H
c                   return    Hours
P                 E

and the UDF was created with the following SQL:

CREATE FUNCTION ElapsedHours (DEC(8,0), DEC(4,0), DEC(8,0), DEC(4,0))
   RETURNS INTEGER
   RETURNS NULL ON NULL INPUT
   PARAMETER STYLE GENERAL
   DETERMINISTIC
   NO EXTERNAL ACTION
   NO SQL
   DISALLOW PARALLEL
   LANGUAGE RPGLE
   EXTERNAL NAME 'HS#LIBR/ER0100S(ELAPSEDHOURS)'

If I run the SQL SELECT shown above interactively, the UDF works just fine.

The TimeStamp procedure is in the same service program and looks like this:

P TimeStamp       B                   export

D TimeStamp       PI              z
D   Date                         8s 0 const
D   Time                         4s 0 const

D DateTime        s               z
D                 ds
D  DateCCYY                      4s 0
D  DateMM                        2s 0
D  DateDD                        2s 0
D DateDS                  1      8s 0
D                 ds
D  TimeHH                        2s 0
D  TimeMM                        2s 0
D TimeDS                  1      4s 0
D                 ds
D TempDateTime                  26a   inz('CCYY-MM-DD-HH.NN.00.000000')
D  TempCCYY                      4s 0 overlay(TempDateTime:1)
D  TempMM                        2s 0 overlay(TempDateTime:6)
D  TempDD                        2s 0 overlay(TempDateTime:9)
D  TempHH                        2s 0 overlay(TempDateTime:12)
D  TempNN                        2s 0 overlay(TempDateTime:15)

c                   eval      DateDS = Date
c                   eval      TempCCYY = DateCCYY
c                   eval      TempMM   = DateMM
c                   eval      TempDD   = DateDD

c                   eval      TimeDS = Time
c                   eval      TempHH   = TimeHH
c                   eval      TempNN   = TimeMM

c                   test(ze)                TempDateTime
c                   if        %error
c                   return    *hival
c                   else
c     *iso          move      TempDateTime  DateTime
c                   return    DateTime
c                   endif

P                 E

All this is on a VRM450 machine.  What am I missing?

tia,
Peter Dow
Dow Software Services, Inc.
909 793-9050 voice
909 522-3214 cellular
909 793-4480 fax





As an Amazon Associate we earn from qualifying purchases.

This thread ...


Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.