Project

General

Profile

Bug #2607

The java generated code isn't compiled due to there is some implicit scoping that goes on with a trigger.

Added by Sergey Ivanovskiy almost 9 years ago. Updated almost 9 years ago.

Status:
New
Priority:
Normal
Assignee:
-
Target version:
-
Start date:
Due date:
% Done:

0%

billable:
No
vendor_id:
GCD
case_num:
version:

addressApp.p Magnifier (1.2 KB) Sergey Ivanovskiy, 07/10/2015 01:49 PM

History

#1 Updated by Sergey Ivanovskiy almost 9 years ago

The following exceptions occur if the conversion 4GL->Java is applied to the attached addressApp.p
compile:
[javac] Compiling 29 source files to /home/sbi/projects/testcases/uast/build/classes
[javac] Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
[javac] /home/sbi/projects/testcases/uast/src/com/goldencode/testcases/AddressApp.java:90: error: cannot find symbol
[javac] frame0.assignScreenValue(new Element(new FieldReference(address, "addrId"), frame0.widgetAddrId()));
[javac] ^
[javac] symbol: method widgetAddrId()
[javac] location: variable frame0 of type AddressAppFrame0
[javac] /home/sbi/projects/testcases/uast/src/com/goldencode/testcases/AddressApp.java:91: error: cannot find symbol
[javac] frame0.assignScreenValue(new Element(new FieldReference(address, "street"), frame0.widgetStreet()));
[javac] ^
[javac] symbol: method widgetStreet()
[javac] location: variable frame0 of type AddressAppFrame0
[javac] /home/sbi/projects/testcases/uast/src/com/goldencode/testcases/AddressApp.java:92: error: cannot find symbol
[javac] frame0.assignScreenValue(new Element(new FieldReference(address, "state"), frame0.widgetState()));
[javac] ^
[javac] symbol: method widgetState()
[javac] location: variable frame0 of type AddressAppFrame0
[javac] /home/sbi/projects/testcases/uast/src/com/goldencode/testcases/AddressApp.java:93: error: cannot find symbol
[javac] frame0.assignScreenValue(new Element(new FieldReference(address, "zipCode"), frame0.widgetZipCode()));
[javac] ^
[javac] symbol: method widgetZipCode()
[javac] location: variable frame0 of type AddressAppFrame0
[javac] /home/sbi/projects/testcases/uast/src/com/goldencode/testcases/AddressApp.java:94: error: cannot find symbol
[javac] frame0.assignScreenValue(new Element(new FieldReference(address, "addrType"), frame0.widgetAddrType()));
[javac] ^
[javac] symbol: method widgetAddrType()
[javac] location: variable frame0 of type AddressAppFrame0
[javac] Note: Some input files use unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.
[javac] 5 errors

May be it is because of the fist trigger is linked to a new frame, but the second trigger is linked to the defined frame AddrFrame
Here is the listing of addressApp.p:

define button ExitButton label "Exit".
define button AddButton label "Add".
define button FindButton label "Find".
define var target like Address.city.

/**Frame Address**/

define frame AddrFrame
Address.addr-id at row 2 col 2
Address.addr-type at row 2 col 40
target at row 4 col 2
Address.state at row 4 col 40
Address.street at row 6 col 2
Address.zip-code at row 8 col 2
AddButton at row 10 col 2
FindButton at row 10 col 20
ExitButton at row 10 col 40
with side-labels centered row 2 title "Address Form".
/**Triggers**/
*on choose of AddButton
do:
create Address.
assign Address except Address.city.
assign Address.city=target.
end. *
on choose of FindButton
do:
assign target.
find first Address where Address.city = target no-error.
if available(Address)
then do:
display Address except Address.city with frame AddrFrame.
end.
else do: Message "Couldn't find " + target
view-as alert-box title "Warning.".
end.

end.

find first Address.
if available(Address)
then target = Address.city.

display Address except Address.city with frame AddrFrame.

enable all with frame AddrFrame.
wait-for choose of ExitButton.

The conversion process produces for the first trigger this java code:

public class TriggerBlock0
extends Trigger { {
frame0 = GenericFrame.createFrame(AddressAppFrame0.class, "");
}
public void body() {
address.create();
RecordBuffer.startBatch();
frame0.assignScreenValue(new Element(new FieldReference(address, "addrId"), frame0.widgetAddrId()));
frame0.assignScreenValue(new Element(new FieldReference(address, "street"), frame0.widgetStreet()));
frame0.assignScreenValue(new Element(new FieldReference(address, "state"), frame0.widgetState()));
frame0.assignScreenValue(new Element(new FieldReference(address, "zipCode"), frame0.widgetZipCode()));
frame0.assignScreenValue(new Element(new FieldReference(address, "addrType"), frame0.widgetAddrType()));
RecordBuffer.endBatch();
RecordBuffer.startBatch();
address.setCity(target);
RecordBuffer.endBatch(); {
public void body() {
addrframeFrame.assignScreenValue(new Element(target, addrframeFrame.widgetTarget()));
ErrorManager.silentErrorEnable();
new FindQuery(address, "upper(address.city) = ?", null, "address.city asc, address.state asc", new Object[] {
toUpperCase(target)
}).first();
ErrorManager.silentErrorDisable();
if (address._available()) {
FrameElement[] elementList1 = new FrameElement[] {
new Element(new FieldReference(address, "addrId"), addrframeFrame.widgetAddrId()),
new Element(new FieldReference(address, "street"), addrframeFrame.widgetStreet()),
new Element(new FieldReference(address, "state"), addrframeFrame.widgetState()),
new Element(new FieldReference(address, "zipCode"), addrframeFrame.widgetZipCode()),
new Element(new FieldReference(address, "addrType"), addrframeFrame.widgetAddrType())
};
addrframeFrame.display(elementList1);
}
else {
messageBox(concat(new character("Couldn't find "), target), ALERT_MESSAGE, BTN_OK, "Warning.");
}
}
}

Greg pointed out that there is some implicit scoping that goes on with a trigger, such that the references inside the trigger will be first resolved against any frame that is involved in the widget specification (AddButton in this case).

if the first trigger

/**Triggers**/
on choose of AddButton
do:
create Address.
assign Address except Address.city.
assign Address.city=target.
end.
is changed to this one
/**Triggers**/
on choose of AddButton
do:
create Address.
assign frame AddrFrame target.
assign frame AddrFrame Address.addr-id.
assign frame AddrFrame Address.addr-type.
assign frame AddrFrame Address.state.
assign frame AddrFrame Address.street.
assign frame AddrFrame Address.zip-code.
assign Address.city=target.
end.

then the conversion process is successfully performed.

Also available in: Atom PDF