94
Views
19
Comments
Solved
Getting NullDates from external Database.
Hi Guys,

So through integration studio I converted a table from a Oracle database to an OutSystems Entity.
The only problem I’m getting is that the database columns of type 'DATE' will map only good if that record contains data. An (null) data is mapped to 1-1-1900 in OutSystems. So I already switched the 'Default Value behaviour to: Convert to/from NULL value in Database, but still getting this problem.

anyone here know how to get a NullDate in OutSystems if the record in the Oracle database is also null?
2018-05-16 11-16-36
João Heleno
 
MVP
Solution
Hi Martijn,
try something like this (the bold part):

ENTITY.ENTRY_DATE <= OTHER_ENTITY.END_DATE or (ENTITY.END_DATE + "" + NullDate() = NullDate())


2017-07-05 18-13-21
Tiago Neves
Hi Martijn,

In the OutSystems platform thats the default value for a null date (in case it's "Date Time": 1900-01-01 00:00:00), the same way that an Entity Identifier appears as 0 or "".
But when the platform communicates with the database, it translates those values to the equivalent for that database.
2018-12-11 13-32-05
Martijn Habraken
Hi Tiago,

Thanks for you quick responce.
So I get the following attribute from the database: RetireDate.
I only want the employee's who are not retired yet so I use the filter: RetireDate = NullDate
Because If an employee isn't yet retired this column in the database is empty.
The result of this filter is that the aggregate fetcheses no more records.

2018-05-16 11-16-36
João Heleno
 
MVP
Solution
Hi Martijn,
try something like this (the bold part):

ENTITY.ENTRY_DATE <= OTHER_ENTITY.END_DATE or (ENTITY.END_DATE + "" + NullDate() = NullDate())


2018-12-11 13-32-05
Martijn Habraken
Hi Joao,
That works tnx alot.
Do you also have something for kind of the same problem but then with text.
I have an Textfield from the database with contains "N" if the Employee is active and null otherwise.
The filter: Employee.IsActive = "N" gives me indeed all the employees that arn't active annymore but something like:Employee.IsActive <> "N" ands up with no records found. 

In the database I can solve this problem with the Where Clause: WHERE IsActive IS null;
2018-05-16 11-16-36
João Heleno
 
MVP
Being a text field I would say <> "N" should work...  is that also an imported table? Have you checked if that field has the correct type?
2018-12-11 13-32-05
Martijn Habraken
Yes it's an imported table.
The type in the Oracle database is an: varchar2 1 byte
The type in OutSytems is text 1 lenght.
2018-05-16 11-16-36
João Heleno
 
MVP
Perhaps you must try (Employee.IsActive <> "N" or Employee.IsActive is null)
2018-12-11 13-32-05
Martijn Habraken
The second part how would you write that in OutSystems?
Because Employee.IsActive = "" isn't working
2018-05-16 11-16-36
João Heleno
 
MVP
Are you using an aggregate? Can you post a printscreen of what you are trying?
2017-07-05 18-13-21
Tiago Neves
Martijn,
If you are dealing with Oracle you should use Employee.IsActive = " "
Notice the space between double quotes
2018-05-16 11-16-36
João Heleno
 
MVP
Tiago Neves wrote:
Martijn,
If you are dealing with Oracle you should use Employee.IsActive = " "
Notice the space between double quotes
You only have to take that in account in an advanced query, otherwise "" (no space) is just fine. The platform will do NVL('', ' ') for you internally.
 
2018-12-11 13-32-05
Martijn Habraken
So I got the advanced query to work:
SELECT *
FROM {CAS_MEDEWERKERS}
WHERE {CAS_MEDEWERKERS}.[IND_UIT_DIENST] IS NULL AND
({CAS_MEDEWERKERS}.[DATUM_UIT_DIENST] IS NULL or 
{CAS_MEDEWERKERS}.[DATUM_UIT_DIENST] > sysdate)
But is this posible in an agregate. 

 

Sorry its in Dutch!
2017-07-05 18-13-21
Tiago Neves
Martijn,
In that case, I would say you should use these 2 filters in your aggregate:

CAS_MEDEWERKERS.DATUM_UIT_DIENST = NullDateTime() or CAS_MEDEWERKERS.DATUM_UIT_DIENST > CurrDateTime()

CAS_MEDEWERKERS.IND_UIT_DIENST = NullTextIdentifier()
2018-12-11 13-32-05
Martijn Habraken
Tiago, 

When I use your fist filter. The CAS_MEDEWERKERS.DATUM_UIT_DIENST = NullDate() (NullDateTime isnt recognized) ends up giving no more records.

CAS_MEDEWERKERS.IND_UIT_DIENST = NullTextIdentifier() gives an error: Incompatible datatypes
And 
CAS_MEDEWERKERS.IND_UIT_DIENST = EntityRefTextToText(NullTextIdentifier())
also doenst return any records.

I think I will solve this just by using an advanced query :)
2017-07-05 18-13-21
Tiago Neves
Ok... :)

But aren't the outsystems data types for those attributes "Date" (I thought it was "Date Time") and "Entity Identifer"? It should work... the only difference from my suggestion is to change NullDateTime() and CurrDateTime() to NullDate() and CurrDate() and NullTextIdentifier() to "", like so:

CAS_MEDEWERKERS.DATUM_UIT_DIENST = NullDate() or CAS_MEDEWERKERS.DATUM_UIT_DIENST > CurrDate()

CAS_MEDEWERKERS.IND_UIT_DIENST = ""

PS: Are you sure the conversion, through the extension, was correct?
(I edited this post, I had an incorrection here - it's not good idea to post while waiting for 1 click publish on the other window... fast and perfect doesn't exist :D)
2018-12-11 13-32-05
Martijn Habraken
Hi,
yea extension works perfect and published it multiply times without errors.
The CAS_MEDEWERKERS.DATUM_UIT_DIENST is indeed a "Date" but the CAS_MEDEWERKERS.IND_UIT_DIENST isn't a "Entity Identifer" but a "Text" type.

Indeed in your sugesstion was also my first thought but doesn't seem to work strangly. 


2017-07-05 18-13-21
Tiago Neves
Strange indeed. Those filters should work fine... there must be something breaking the aggregate outside the filters scope.
2017-07-05 18-13-21
Tiago Neves
Hi Martijn,
Did you find out how to edit the aggregate to get what you wanted?
2018-12-11 13-32-05
Martijn Habraken
No, just implemented an advanced SQL.
Dit also another Workaround in the entities. Still have no idee why the filters are acting so strange.
Community GuidelinesBe kind and respectful, give credit to the original source of content, and search for duplicates before posting.