Subtraction dates

mirekpa

New Member
Hi,
Anyone have a similar problem?
I write dynamic module to construct full txt query from outside details,
to calculate logical values from parsed text, geting file, fields, function, methods and other to construct condition and validate this text,
and I use more dynamic engine in my source.
I receive problem with source when calculate date - [FONT=&quot] subtrac[/FONT] dates should returns int, but i got compiler exectepion - incompatybile type
other types (IMHO) works correctly.

Of course solution is easy - strong cast types - but way, its necessary?
Anyone know something.

In answer I trying sends simplyfy source.

Mirek

mirekpa@poczta.onet.pl
mirek.pawluk@forweb.pl
+48 0505 712 009
 

mirekpa

New Member
Simplified source:
When uncoments 7 subsection progress throw error.

DEF VAR hSet AS HANDLE.
DEF VAR hQ AS HANDLE.
DEF VAR cTxtQuery AS CHAR.

DEF TEMP-TABLE tt
FIELDS d AS DATE
FIELDS i AS INT
FIELDS l AS LOG
FIELDS dd AS DEC.

DEF BUFFER btt FOR tt.
CREATE tt.
ASSIGN
tt.d = TODAY
tt.i = 1
tt.l = TRUE
tt.dd = 1.1.

FIND FIRST btt NO-LOCK NO-ERROR.

CREATE QUERY hQ.

CREATE BUFFER hSet FOR TABLE "tt".
hQ:ADD-BUFFER(hSet).
cTxtQuery = "FOR EACH tt NO-LOCK".

hQ:QUERY-PREPARE(cTxtQuery).
hQ:QUERY-OPEN.
hQ:GET-FIRST.

/*1*/
MESSAGE hSet:BUFFER-FIELD("d"):BUFFER-VALUE = btt.d
VIEW-AS ALERT-BOX INFO BUTTONS OK.

/*2*/
MESSAGE hSet:BUFFER-FIELD("i"):BUFFER-VALUE - btt.i
VIEW-AS ALERT-BOX INFO BUTTONS OK.

/*3*/
MESSAGE hSet:BUFFER-FIELD("i"):BUFFER-VALUE - btt.i
VIEW-AS ALERT-BOX INFO BUTTONS OK.

/*4*/
MESSAGE hSet:BUFFER-FIELD("l"):BUFFER-VALUE = btt.l
VIEW-AS ALERT-BOX INFO BUTTONS OK.

/*5*/
MESSAGE hSet:BUFFER-FIELD("dd"):BUFFER-VALUE = btt.dd
VIEW-AS ALERT-BOX INFO BUTTONS OK.

/*6*/
MESSAGE hSet:BUFFER-FIELD("d"):BUFFER-VALUE + btt.d
VIEW-AS ALERT-BOX INFO BUTTONS OK.

/*7*/
/*
MESSAGE hSet:BUFFER-FIELD("d"):BUFFER-VALUE - btt.d
VIEW-AS ALERT-BOX INFO BUTTONS OK.
*/

hQ:QUERY-CLOSE.
DELETE OBJECT hQ.
DELETE OBJECT hSet.

Mirek
 

Casper

ProgressTalk.com Moderator
Staff member
What is your Progress version. And it would be handy if you would sent us some example code where this error is clear.

Casper.
 

mirekpa

New Member
I use
in test environment - OpenEdge Release 10.1B
produce - Release 10.1B03

the real source:

FUNCTION isDataOtrzDataUm16OK$ RETURN LOG (INPUT bh AS HANDLE):
DEF VAR lOk AS LOG INIT TRUE.
DEF VAR lClass AS LOG.
DEF VAR hSet AS HANDLE.
DEF VAR p-data-umow AS CHAR.
DEF VAR f AS CHAR.
DEF VAR i AS INT.
DEF VAR dTemppdk AS DATE.
DEF VAR dTempdo AS DATE.

p-data-umow = bh:BUFFER-FIELD("p-data-umow"):BUFFER-VALUE NO-ERROR.
IF ERROR-STATUS:ERROR THEN RETURN ?.

f = SESSION:DATE-FORMAT.
SESSION:DATE-FORMAT="mdy".

lClass = setOneClassVariable("pl.pfs.utils.Uproc").

IF lClass THEN
DO:
hSet = uproc:getProcHandle("validProc.p").
lOK = DYNAMIC-FUNCTION("isDateOk" IN hSet, INPUT p-data-umow ).

IF lOK THEN
DO:
lClass = setOneClassVariable("pl.pfs.utils.Uvalid").
dTemppdk = DATE(uvalid:convDateString(p-data-umow)) NO-ERROR.
IF NOT ERROR-STATUS:ERROR THEN
DO:
/* when in place of dTempdo is buffer fiels - progres throws error */
dTempdo = bh:BUFFER-FIELD("data-otrz"):BUFFER-VALUE.
IF dTempdo - dTemppdk >= 16 THEN lOk = FALSE.
END.
END.
END.
ELSE lOK = ?.

SESSION:DATE-FORMAT=f.
RETURN lOK.
END FUNCTION.
 

Casper

ProgressTalk.com Moderator
Staff member
Hi there, I was to impatient... :lol:

Your problem has to do with how the compiler work.
In short your solution would be to cast the date field to date in the buffer during substraction.

I added an extra field in the temp-table for some testing purposes, here you see what I mean:
Code:
DEF VAR hSet AS HANDLE.
DEF VAR hQ AS HANDLE.
DEF VAR cTxtQuery AS CHAR.
DEFINE VARIABLE dTest AS DATE        NO-UNDO.
DEF TEMP-TABLE tt 
FIELDS d AS DATE
FIELDS d2 AS DATE
FIELDS i AS INT
FIELDS l AS LOG
FIELDS dd AS DEC.
DEF BUFFER btt FOR tt.
CREATE tt.
ASSIGN
tt.d = TODAY
tt.d2 = TODAY + 2
tt.i = 1
tt.l = TRUE
tt.dd = 1.1.
RELEASE tt.
FIND FIRST btt NO-LOCK NO-ERROR.
CREATE QUERY hQ.
CREATE BUFFER hSet FOR TABLE "tt".
hQ:ADD-BUFFER(hSet). 
cTxtQuery = "FOR EACH tt NO-LOCK".
hQ:QUERY-PREPARE(cTxtQuery).
hQ:QUERY-OPEN.
hQ:GET-FIRST. 
IF hSet:BUFFER-FIELD("d"):DATA-TYPE = 'DATE' AND 
   hSet:BUFFER-FIELD("d2"):DATA-TYPE = 'DATE'
THEN DO:
    
    MESSAGE hSet::d2 - hSet::d
        VIEW-AS ALERT-BOX INFO BUTTONS OK.
    MESSAGE btt.d2 - btt.d
        VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
    MESSAGE btt.d2 - date(hSet::d)
        VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
    MESSAGE date(hSet::d2) - btt.d
        VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
    MESSAGE DATE(hSet::d) - btt.d
        VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
hQ:QUERY-CLOSE.
DELETE OBJECT hQ. 
DELETE OBJECT hSet.

BTW what are you trying to acomplish by adding dates?

As you can see, you can make this dynamic by asking the data-type at runtime.


Regards,

Casper.
 

mirekpa

New Member
Thanks Casper,

Cast is my types solve, in validator function I cast to static date var,
because one side is calculate from string fileds.
Are you meet similar situation in other types, operator or something else?
I repeat my question - cast is realy necessary, in all types for safe?
I would like create agile module, which other programers use's easly.
In Java ok, but in 4gl.

adding dates (that's test for compiler or to measure infinitum:lol:)
Mirek
 
Top