Page 1 of 1
To Nages Problem with Tdatabase and new DAtepick
Posted: Mon May 03, 2021 8:29 am
by Silvio.Falconi
On a Edit dialog I have
Code: Select all | Expand
@ 6,120 SAY "Dal :" SIZE 20,11 PIXEL OF oFolder:aDialogs[1] TRANSPARENT FONT oBold
@ 3, 140 DTPICKER aGet[3] VAR ddcheckin SIZE 80,12 PIXEL OF oFolder:aDialogs[1] ;
PICTURE "ddd dd mmm yyyy"
WITH OBJECT aGet[3]
:lNoToday := .t.
:lNoTodayCircle := .t.
:SetRange( dStagioneMin,dStagioneMax )
END
@ 23,120 SAY "al :" SIZE 20,11 PIXEL OF oFolder:aDialogs[1] TRANSPARENT FONT oBold
@ 22,140 DTPICKER aGet[4] VAR ddcheckout SIZE 80,12 PIXEL OF oFolder:aDialogs[1] ;
PICTURE "ddd dd mmm yyyy" UPDATE
WITH OBJECT aGet[4]
:lNoToday := .t.
:lNoTodayCircle := .t.
:SetRange( ddcheckin, dStagioneMax )
END
If I use directly
oPrenotazione:check_in instead of aGet[3] VAR ddcheckin
or
oPrenotazione:chek_out instead of aGet[4] VAR ddcheckout
Code: Select all | Expand
@ 6,120 SAY "Dal :" SIZE 20,11 PIXEL OF oFolder:aDialogs[1] TRANSPARENT FONT oBold
@ 3, 140 DTPICKER oPrenotazione:check_in SIZE 80,12 PIXEL OF oFolder:aDialogs[1] ;
PICTURE "ddd dd mmm yyyy"
WITH OBJECT oPrenotazione:check_in
:lNoToday := .t.
:lNoTodayCircle := .t.
:SetRange( dStagioneMin,dStagioneMax )
END
@ 23,120 SAY "al :" SIZE 20,11 PIXEL OF oFolder:aDialogs[1] TRANSPARENT FONT oBold
@ 22,140 DTPICKER oPrenotazione:check_out SIZE 80,12 PIXEL OF oFolder:aDialogs[1] ;
PICTURE "ddd dd mmm yyyy" UPDATE
WITH OBJECT oPrenotazione:check_out
:lNoToday := .t.
:lNoTodayCircle := .t.
:SetRange(oPrenotazione:check_in, dStagioneMax )
END
the dialog make this errorError description: Error BASE/1005 Variabile non disponibile: LNOTODAY
Args:
[ 1] = D - -
[ 2] = L .T.
Stack Calls
===========
Called from: => _LNOTODAY( 0 )
Called from: test.prg => PRENOTAZIONE( 778 )
at line 778 there is
WITH OBJECT oPrenotazione:check_in
:lNoToday := .t.obviously
oPrenotazione is oPrenotazione: = oReservations: record (.t.) or record()
How I can resolve it ?
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Wed May 05, 2021 6:01 pm
by James Bott
Silvio,
Code: Select all | Expand
WITH OBJECT oPrenotazione:check_in
:lNoToday := .t.
:lNoTodayCircle := .t.
:SetRange( dStagioneMin,dStagioneMax )
END
You are still using a variable here, not an object. Check_in is a variable of the object oPrenotazone. oPprenotazone is the object.
WITH OBJECT oPrenotazione:check_in
You have to use the object name only:
WITH OBJECT oPrentazione
The above line is just shorthand so you don't have to specify the object for each line. Otherwise it would have to be:
oPrentazione:lNoToday := .t.
oPrentazione:lNoTodayCircle := .t.
oPrentazione:setRange :=( dStagioneMin,dStagioneMax )
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Wed May 05, 2021 7:12 pm
by Silvio.Falconi
james,
if you call datepick control you make
@x,y DATEPICK oPrenotazione:check_in .....
so the field is oPrenotazione:check_in on tdatabase because
oPrenotazione is the single record
oPrenotazione:= oReservations:record(.t.)
as (exlusive) RESERVA->CHECK_IN
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Thu May 06, 2021 12:22 am
by James Bott
Silvio,
Well, it still seems to me that this is incorrect syntax. The ":check_in" signifies a variable of the object oPrenotazione, When I try to run it, I get an error with a logical, so it seems to me the program thinks this is incorrect too.
It would make more sense if you named it oPrentazonieCheckIn instead. Try it.
obviously oPrenotazione is oPrenotazione: = oReservations: record (.t.) or record()
I can't test that because my older version of Fivewin doesn't support the TDatabase Record method.
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Thu May 06, 2021 4:34 am
by nageswaragunupudi
Please revise this code
Code: Select all | Expand
@ 3, 140 DTPICKER oPrenotazione:check_in SIZE 80,12 PIXEL OF oFolder:aDialogs[1] ;
PICTURE "ddd dd mmm yyyy"
WITH OBJECT oPrenotazione:check_in
:lNoToday := .t.
:lNoTodayCircle := .t.
:SetRange( dStagioneMin,dStagioneMax )
END
as
Code: Select all | Expand
@ 3, 140 DTPICKER oDtpIn VAR oPrenotazione:check_in SIZE 80,12 PIXEL OF oFolder:aDialogs[1] ;
PICTURE "ddd dd mmm yyyy"
WITH OBJECT oDtpIn
:lNoToday := .t.
:lNoTodayCircle := .t.
:SetRange( dStagioneMin,dStagioneMax )
END
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Thu May 06, 2021 7:03 am
by Silvio.Falconi
nageswaragunupudi wrote:Please revise this code
Code: Select all | Expand
@ 3, 140 DTPICKER oPrenotazione:check_in SIZE 80,12 PIXEL OF oFolder:aDialogs[1] ;
PICTURE "ddd dd mmm yyyy"
WITH OBJECT oPrenotazione:check_in
:lNoToday := .t.
:lNoTodayCircle := .t.
:SetRange( dStagioneMin,dStagioneMax )
END
as
Code: Select all | Expand
@ 3, 140 DTPICKER oDtpIn VAR oPrenotazione:check_in SIZE 80,12 PIXEL OF oFolder:aDialogs[1] ;
PICTURE "ddd dd mmm yyyy"
WITH OBJECT oDtpIn
:lNoToday := .t.
:lNoTodayCircle := .t.
:SetRange( dStagioneMin,dStagioneMax )
END
Nages, the problem is this :
the oReservation object is actually the single record
With Tdatabase(tdatarow) oReservation := Tdatabase():New(.....)
oPrenotazione:= oReservations:Record(.t.) /record()
With tdata CLASS TReservatios from Tdata
METHOD New()
ENDCLASS
CLASS TReserva from Trecord
METHOD New()
ENDCLASS
oReservas := TReservations():New(.....)
oOne_Reserva:=TReserva():New(...)
and Mr James
sad me allway to not to use type variables
@ 3, 140 DTPICKER
oDtp var oPrenotazione:check_in SIZE ...
but directly
@ 3, 140 DTPICKER
oPrenotazione:check_in SIZE ...
Nages,
I Know I must use
@ 3, 140 DTPICKER
oDtpIn VAR oPrenotazione:check_in SIZE 80,12 PIXEL OF oFolder:aDialogs[1] ;
PICTURE "ddd dd mmm yyyy"
because then I have problems with :lNoToday
but James doesn't want to understand this passage
doing in this way I must first transfer the single record in variables:
cFirst: = oCust: first
cLast: = oCust: Last
cAddress: = oCust: address
as I did before when I used the exclusive way
and then when I have to save I can't just use oCust:Save ()
but I must save all fields with
oCust: first := cFirst
oCust: Last:= cLast
and then
oCust:save()
I hope to make James understand what my concern is
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Thu May 06, 2021 4:36 pm
by James Bott
Silvio,
Code: Select all | Expand
@ 3, 140 DTPICKER oPrenotazione:check_in SIZE 80,12 PIXEL OF oFolder:aDialogs[1] ;
PICTURE "ddd dd mmm yyyy"
WITH OBJECT oPrenotazione:check_in
:lNoToday := .t.
:lNoTodayCircle := .t.
:SetRange( dStagioneMin,dStagioneMax )
END
In the above code you were trying to make the variable (oPrenoTazoine:check_in) into the dtPicker control object. Then you were trying to assign values to the data of the DTPicker object, which of course you can't do.
You need to do it as Nages showed. Make up an object name (oDtpin) for the TDpicker object and then assign the record data (oPrenotazione:check_in) to be the VAR of the DTPICKER object as Nages showed.
Code: Select all | Expand
@ 3, 140 DTPICKER oDtpIn VAR oPrenotazione:check_in SIZE 80,12 PIXEL OF oFolder:aDialogs[1] ;
PICTURE "ddd dd mmm yyyy"
WITH OBJECT oDtpIn // the datepicker control object name, NOT the variable name
:lNoToday := .t. // The next three are data of the datepicker object oDtpin
:lNoTodayCircle := .t.
:SetRange( dStagioneMin,dStagioneMax )
END
as I did before when I used the exclusive way
and then when I have to save I can't just use oCust:Save ()
but I must save all fields with
oCust: first := cFirst
oCust: Last:= cLast
I don't see why you would need to do that if you are using the code Nages showed. Just call oPrenotazione:Save().
James
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Fri May 07, 2021 9:21 am
by Silvio.Falconi
>n the above code you were trying to make the variable (oPrenoTazoine:check_in) into the dtPicker control object. Then you were trying to assign values to the data of the DTPicker object, which of course you can't do.
>You need to do it as Nages showed. Make up an object name (oDtpin) for the TDpicker object and then assign the record data (oPrenotazione:check_in) to be the VAR of the DTPICKER object as Nages showed
Right I made as Nages sad
>I don't see why you would need to do that if you are using the code Nages showed. Just call oPrenotazione:Save().
Here I don't understand, that is, if I have to use a command like
@ 3, 140 DTPICKER oDtpIn VAR oPrenotazione:check_in
I have to use the same rule for the other fields that I need for editing or for a new record
Example
@ x, y GET aGet [1] VAR oPrenotazione:First
or should I just use the object only for the Datepick?
I ask you because you always told me not to put the objects ( Type ie. @x,y GET aGET[x] VAR field ....)
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Fri May 07, 2021 3:56 pm
by James Bott
Silvio,
>or should I just use the object only for the Datepick? -No
>I ask you because you always told me not to put the objects ( Type ie. @x,y GET aGET[x] VAR field ....)
You should use it for everything. Because the record object has it's own set of field variables, you don't need to code scatter/gather routines. Just use the object syntax for any field you want to edit, then call the save method when you are done.
Here is an example using a record object (not a table object):
oReservation:StartDate:= date()
oReservation:EndDate:= date() + nDays
oReservation:save()
It doesn't get any easier than that.
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Mon May 10, 2021 9:37 am
by Silvio.Falconi
James
Every day I found problem to found a solution with (tdata)base
for a sample today I cannot execute a bchange of a Get
@ 96, 145 Say "Sconto :" SIZE 90,10 PIXEL OF oDlgMod
@ 94, 175 GET aGet[8] VAR oTariffa:sconto OF oDlgMod SIZE 60, 12 ;
PIXEL PICTURE '@ €99,999.99' RIGHT FONT oFont UPDATE ;
ON CHANGE ((nTotale:= oTariffa:costo-oTariffa:sconto),oTariffa:totale:=ntotale ,aGet[9]:refresh())
@ 116, 10 Say "Totale :" SIZE 90,10 PIXEL OF oDlgMod
@ 114, 75 GET aGet[9] VAR oTariffa:totale OF oDlgMod SIZE 60, 12 ;
PIXEL PICTURE '@ €99,999.99' RIGHT FONT oFont UPDATE
how I must make it ?
If I made
nCosto:=otariffa:costo
nSconto:=otariffa:sconto
nTotale:=otariffa:totale
@ 96, 10 Say "Costo :" SIZE 90,10 PIXEL OF oDlgMod
@ 94, 75 GET aGet[7] VAR ncosto OF oDlgMod SIZE 60, 12 ;
PIXEL PICTURE '@ €99,999.99' RIGHT FONT oFont UPDATE
@ 96, 145 Say "Sconto :" SIZE 90,10 PIXEL OF oDlgMod
@ 94, 175 GET aGet[8] VAR nsconto OF oDlgMod SIZE 60, 12 ;
PIXEL PICTURE '@ €99,999.99' RIGHT FONT oFont UPDATE ;
ON CHANGE ((nTotale:= nCosto-nsconto) ,aGet[9]:refresh())
@ 116, 10 Say "Totale :" SIZE 90,10 PIXEL OF oDlgMod
@ 114, 75 GET aGet[9] VAR nTotale OF oDlgMod SIZE 60, 12 ;
PIXEL PICTURE '@ €99,999.99' RIGHT FONT oFont UPDATE
then I must make
otariffa:costo := ncosto
otariffa:sconto:=nSconto
otariffa:totale:=ntotale
otariffa:save()
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Tue May 11, 2021 4:40 pm
by James Bott
Silvio,
@ 94, 175 GET aGet[8] VAR oTariffa:sconto OF oDlgMod SIZE 60, 12 ;
PIXEL PICTURE '@ €99,999.99' RIGHT FONT oFont UPDATE ;
ON CHANGE ((nTotale:= oTariffa:costo-oTariffa:sconto),oTariffa:totale:=ntotale ,aGet[9]:refresh())
The problem exists because the object, oTariffa, is not visible inside the get object. There are ways to solve this, but since your solution only requires 6 lines of code it is probably less work than figuring out the syntax that will work.
Otherwise you might try:
aGet[8]:bChange := {| oTariffa | (nTotale:= oTariffa:costo-oTariffa:sconto),oTariffa:totale:=ntotale ,aGet[9]:refresh() }
This passes the object (oTariffa) to the bChange codeblock so it is visible inside the codeblock.
To make it even shorter you could add a method Total to the TTeriffa class. Then bChange would look like this:
aGet[8]:bChange := {| oTariffa | oTariffa:totale:= oTariffa:Total(), aGet[9]:refresh() }
You might also have to pass aGet[9].
If you add the Method Total to the TTariffa class, then you should probably add these lines to the TTariffa class, then you should also create a new Save() method:
Method Save() Class TTariffa
::totale:= ::Total()
Return ::Save()
This insures that the totale field will always be correct.
Looking at the preprossor output will help understanding how to solve problems like this.
There are lots of things to try if you are so inclined. Otherwise just use what you already have.
James
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Tue May 11, 2021 10:04 pm
by Silvio.Falconi
James Bott wrote:Silvio,
@ 94, 175 GET aGet[8] VAR oTariffa:sconto OF oDlgMod SIZE 60, 12 ;
PIXEL PICTURE '@ €99,999.99' RIGHT FONT oFont UPDATE ;
ON CHANGE ((nTotale:= oTariffa:costo-oTariffa:sconto),oTariffa:totale:=ntotale ,aGet[9]:refresh())
The problem exists because the object, oTariffa, is not visible inside the get object. There are ways to solve this, but since your solution only requires 6 lines of code it is probably less work than figuring out the syntax that will work.
Otherwise you might try:
aGet[8]:bChange := {| oTariffa | (nTotale:= oTariffa:costo-oTariffa:sconto),oTariffa:totale:=ntotale ,aGet[9]:refresh() }
This passes the object (oTariffa) to the bChange codeblock so it is visible inside the codeblock.
To make it even shorter you could add a method Total to the TTeriffa class. Then bChange would look like this:
aGet[8]:bChange := {| oTariffa | oTariffa:totale:= oTariffa:Total(), aGet[9]:refresh() }
You might also have to pass aGet[9].
If you add the Method Total to the TTariffa class, then you should probably add these lines to the TTariffa class, then you should also create a new Save() method:
Method Save() Class TTariffa
::totale:= ::Total()
Return ::Save()
This insures that the totale field will always be correct.
Looking at the preprossor output will help understanding how to solve problems like this.
There are lots of things to try if you are so inclined. Otherwise just use what you already have.
James
Sorry James but I make a test
nCosto := oTariffa:costo
nSconto := oTariffa:sconto
nTotale := oTariffa:totale@ 96, 10 Say "Costo :" SIZE 90,10 PIXEL OF oDlgMod
@ 94, 75 GET aGet[7] VAR nCosto OF oDlgMod SIZE 60, 12 ;
PIXEL PICTURE '@ €99,999.99' RIGHT FONT oFont UPDATE
@ 96, 145 Say "Sconto :" SIZE 90,10 PIXEL OF oDlgMod
@ 94, 175 GET aGet[8] VAR nsconto OF oDlgMod SIZE 60, 12 ;
PIXEL PICTURE '@ €99,999.99' RIGHT FONT oFont UPDATE ;
ON CHANGE ((aGet[8]:assign(),ntotale:= ncosto-nsconto),aGet[9]:assign(),aGet[9]:refresh()) @ 116, 10 Say "Totale :" SIZE 90,10 PIXEL OF oDlgMod
@ 114, 75 GET aGet[9] VAR ntotale OF oDlgMod SIZE 60, 12 ;
PIXEL PICTURE '@ €99,999.99' RIGHT FONT oFont UPDATE
...
ACTIVATE DIALOG oDlgMod ;
ON INIT (DlgCenter( oDlgMod, oGrid ), aGet[5]:aItems[2]:disable())
If oDlgMod:nresult == IDOK
if msgYesNo( i18n("¿ save ?") )
oTariffa:costo := nCosto
oTariffa:sconto := nSconto
oTariffa:totale := nTotale
oTariffa:save() endif
Endif
and it seems to run ok
even if you tell me it's wrong to do it this way
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Wed May 12, 2021 12:35 am
by James Bott
Silvio,
even if you tell me it's wrong to do it this way
I did not tell you it was wrong. You asked me why it wasn't working for you initally, and I explained why.
The problem exists because the object, oTariffa, is not visible inside the get object. There are ways to solve this, but since your solution only requires 6 lines of code it is probably less work than figuring out the syntax that will work.Then I gave some options you could try if you wanted to. Then I said:
There are lots of things to try if you are so inclined. Otherwise just use what you already have.
Re: To Nages Problem with Tdatabase and new DAtepick
Posted: Wed May 12, 2021 10:50 am
by Silvio.Falconi
ok ok ok received the message