jptechon
(jptechon)
May 9, 2019, 5:00am
1
Hi,
My environment is 10.3.1, DA : [-9.6.113.1419], Android SDK 26.2
I build a FMX application wizard for server an client.
It only have 2 function open table without dynamic where and open table with dynamic where.
When run in a android
open table without dynamic where --> run correctly
open table with dynamic where --> show exception ( DOMelement is NIL).
IN the attached picture: Open , Number of record 2 << from open table without dynamic where
Exception message is from open table with dynamic where
I attached the Testing project for reference
please advise how to solve.
actually before this error also found in version 9.5.111.1399 but only occur in client direct select sql to server to get data.
mobileConnectDB.zip (209.6 KB)
EvgenyK
(Evgeny Karpov)
May 10, 2019, 12:11pm
2
Hi,
can you test this issue with 9.7 beta? we have already fixed this or similar issue after 9.6 RTM
jptechon
(jptechon)
May 15, 2019, 5:20am
3
will test later and let you know
jptechon
(jptechon)
June 17, 2019, 9:15am
4
we tested RemObjects Data Abstract for Delphi, Server Edition - 9.7.115.1441 this version
The result is same.
Which version I should Try?
EvgenyK
(Evgeny Karpov)
June 18, 2019, 11:16am
5
weird, I’ll retest your testcase
jptechon
(jptechon)
June 18, 2019, 11:18am
6
Thanks wait for your reply
EvgenyK
(Evgeny Karpov)
June 18, 2019, 12:22pm
7
yep, I can reproduce this issue.
by some reasons, fDocument.documentElement
is nil.
will see what is wrong with Xml.omnixmldom
Thanks, logged as bugs://82801
bugs://82801 got closed with status fixed.
EvgenyK
(Evgeny Karpov)
June 18, 2019, 3:48pm
10
pls update uRONextGenXMLImpl.pas
as
function TRONextGenXMLNode.GetXML: UnicodeString;
..
{$IFDEF DELPHIXE7UP}
Result := TrimRight(TrimLeft((fNode as IDOMNodeEx).xml)); //changed
procedure TRONextGenXMLDocument.New(aDocumentName : UnicodeString = ''; anEncoding : TXMLEncoding = xeUTF8; aNameSpace: UnicodeString='');
..
fDocument := OmniXML4Factory.DOMImplementation.createDocument(aNameSpace, aDocumentName, nil);
fDocument.appendChild(fDocument.createElementNS(aNameSpace, aDocumentName)); //added
jptechon
(jptechon)
June 21, 2019, 3:40am
11
Thanks it solved. But I hit another issue on it.
whenever I open a datatable with a Float field. it show bus error see attached .
Also when I open datatable with datetime field it can open but locate a datetime field it also with same bus error.
I attached a sample project and DB for reference. Please comment.
mobileConnectDB(1).zip (227.9 KB)
EvgenyK
(Evgeny Karpov)
June 21, 2019, 9:54am
12
I can’t reproduce this error:
I’ve used Delphi 10.2.3 & Android 5.1.1 (API=22)
jptechon
(jptechon)
June 21, 2019, 9:58am
13
My Environment is:
delphi Version 10.3, Android API = 26.2 ( 32bit)
Any Suggestion?
EvgenyK
(Evgeny Karpov)
June 21, 2019, 9:59am
14
can you show callstack for this error, pls?
EvgenyK
(Evgeny Karpov)
June 21, 2019, 11:15am
16
try to add empty OnReadFieldValue
event:
procedure TClientDataModule.DataStreamerReadFieldValue(const aField: TDAField;
var Value: Variant);
begin
//
end;
will it solve this issue?
jptechon
(jptechon)
June 22, 2019, 6:46am
17
This can solve open table but cant solve locate issue.
But this is will slow down the open process. Can you explain why bus error come?
any suggestion on solve it with good speed?
EvgenyK
(Evgeny Karpov)
June 24, 2019, 1:24pm
18
I’ve tried to reproduce this but it was unsuccessfully - Delphi IDE shows Performing Streamed Install
error when it tried to upload project to emulator with Android API = 25-29.
From your callstack and errors, it may dislike PDouble(buf1)^
in
datFloat: PDouble(buf1)^ := Bin2_ReadDoubleFromStream(Data);
can you confirm this in debugging, pls?
jptechon
(jptechon)
June 26, 2019, 3:19am
19
Yes you are correct this is the problem line
EvgenyK
(Evgeny Karpov)
June 26, 2019, 9:40am
20
as I see, they have changed
procedure TFloatField.SetAsFloat(Value: Double);
begin
if FCheckRange and ((Value < FMinValue) or (Value > FMaxValue)) then
RangeError(Value, FMinValue, FMaxValue);
SetData(@Value);
end;
with
procedure TFloatField.SetAsFloat(Value: Double);
begin
if FCheckRange and ((Value < FMinValue) or (Value > FMaxValue)) then
RangeError(Value, FMinValue, FMaxValue);
if FIOBuffer <> nil then
TDBBitConverter.UnsafeFrom<Double>(Value, FIOBuffer);
SetData(FIOBuffer);
end;
looks like we should also use TDBBitConverter
methods.