Deleted records not deleted in table after SAVE-ROW-CHANGES?

Posted by Admin on 26-Nov-2009 03:53

Hi,


I have an issue where the records I deleted in my temp-table haven't been deleted from the database table after I ran SAVE-ROW-CHANGES on the before-table.


Does it have something to do with the fact that the buffer I delete and save is a child table, because I can delete records from the top buffer and those are saved to the database.

I have a nutshell example of what I'm trying to achieve...

DEFINE TEMP-TABLE ttUserQuery LIKE UserQuery BEFORE-TABLE btUserQuery.
DEFINE TEMP-TABLE ttUserQueryCriteria LIKE UserQueryCriteria BEFORE-TABLE btUserQueryCriteria.

DEFINE DATASET dsUserQuery FOR ttUserQuery , ttUserQueryCriteria
  DATA-RELATION UserQueryCriteria FOR ttUserQuery, ttUserQueryCriteria
    RELATION-FIELDS (ttUserQuery.QueryUser, ttUserQueryCriteria.QueryUser, ttUserQuery.Entity, ttUserQueryCriteria.Entity, ttUserQuery.QueryName, ttUserQueryCriteria.QueryName).

DEFINE QUERY qryUQ FOR UserQuery.

DEFINE DATA-SOURCE srcUQ FOR QUERY qryUQ.
DEFINE DATA-SOURCE srcUQC FOR UserQueryCriteria KEYS(UserQueryCriteria.QueryUser, UserQueryCriteria.Entity, UserQueryCriteria.QueryName).

TEMP-TABLE ttUserQuery:DEFAULT-BUFFER-HANDLE:ATTACH-DATA-SOURCE(DATA-SOURCE srcUQ:HANDLE).
TEMP-TABLE ttUserQueryCriteria:DEFAULT-BUFFER-HANDLE:ATTACH-DATA-SOURCE(DATA-SOURCE srcUQC:HANDLE).

QUERY qryUQ:QUERY-PREPARE("FOR EACH UserQuery WHERE UserQuery.QueryUser = 'KVA' AND UserQuery.Entity = 'Customer' AND UserQuery.QueryName = 'Nummer'").

DATASET dsUserQuery:FILL().

TEMP-TABLE ttUserQueryCriteria:TRACKING-CHANGES = TRUE.

FOR EACH ttUserQueryCriteria EXCLUSIVE-LOCK:
    DELETE ttUserQueryCriteria.   
END.
TEMP-TABLE ttUserQueryCriteria:TRACKING-CHANGES = FALSE.

FOR EACH btUserQueryCriteria:
  BUFFER btUserQueryCriteria:SAVE-ROW-CHANGES().
END.

TEMP-TABLE ttUserQuery:DEFAULT-BUFFER-HANDLE:DETACH-DATA-SOURCE().
TEMP-TABLE ttUserQueryCriteria:DEFAULT-BUFFER-HANDLE:DETACH-DATA-SOURCE().


/* Records for QueryName = 'Nummer' are still in the table... */
FOR EACH UserQueryCriteria NO-LOCK:
    DISPLAY UserQueryCriteria.
END.

Does anyone have an idea of what I'm doing wrong, or forgot, or whatever...

Many thanks in advance...

Regards,

Tekka

All Replies

Posted by Admin on 26-Nov-2009 05:13

Without checking through you code as it's late at night here, are you getting any messages?

Add NO-ERROR to the SAVE-ROW-CHANGES and then this code.

DO iErrors = 1 TO ERROR-STATUS:NUM-MESSAGES:

     message ERROR-STATUS:GET-NUMBER(iErrors) view-as alert-box.

END.

What messages do you get?

Posted by Admin on 26-Nov-2009 05:49

I just tried your suggestion.

I'm not getting any messages at all.

Posted by guilmori on 26-Nov-2009 08:30

Your code seems ok, it works for me with tt simulating your database tables.

Does yout ttUserQueryCriteria contains records after the FILL ?

DEF TEMP-TABLE UserQuery

   FIELD QueryUser AS CHAR

   FIELD entity AS CHAR

   FIELD QueryName AS CHAR.

  

DEF TEMP-TABLE UserQueryCriteria

   FIELD QueryUser AS CHAR

   FIELD entity AS CHAR

   FIELD QueryName AS CHAR.  

  

DO TRANSACTION:

CREATE UserQuery.

ASSIGN UserQuery.entity = "Customer"

       UserQuery.QueryName = "Nummer"

       UserQuery.QueryUser = "KVA".

     

CREATE UserQueryCriteria.

ASSIGN UserQueryCriteria.entity = "Customer"

       UserQueryCriteria.QueryName = "Nummer"

       UserQueryCriteria.QueryUser = "KVA".     

END.

  

DEFINE TEMP-TABLE ttUserQuery LIKE UserQuery BEFORE-TABLE btUserQuery.

DEFINE TEMP-TABLE ttUserQueryCriteria LIKE UserQueryCriteria BEFORE-TABLE btUserQueryCriteria.


DEFINE DATASET dsUserQuery FOR ttUserQuery , ttUserQueryCriteria

  DATA-RELATION UserQueryCriteria FOR ttUserQuery, ttUserQueryCriteria

    RELATION-FIELDS (ttUserQuery.QueryUser,
ttUserQueryCriteria.QueryUser, ttUserQuery.Entity,
ttUserQueryCriteria.Entity, ttUserQuery.QueryName,
ttUserQueryCriteria.QueryName).




DEFINE QUERY qryUQ FOR UserQuery.


DEFINE DATA-SOURCE srcUQ FOR QUERY qryUQ.

DEFINE DATA-SOURCE srcUQC FOR UserQueryCriteria
KEYS(UserQueryCriteria.QueryUser, UserQueryCriteria.Entity,
UserQueryCriteria.QueryName).


TEMP-TABLE ttUserQuery:DEFAULT-BUFFER-HANDLE:ATTACH-DATA-SOURCE(DATA-SOURCE srcUQ:HANDLE).

TEMP-TABLE ttUserQueryCriteria:DEFAULT-BUFFER-HANDLE:ATTACH-DATA-SOURCE(DATA-SOURCE srcUQC:HANDLE).


QUERY qryUQ:QUERY-PREPARE("FOR EACH UserQuery WHERE UserQuery.QueryUser
= 'KVA' AND UserQuery.Entity = 'Customer' AND UserQuery.QueryName =
'Nummer'").


DATASET dsUserQuery:FILL().


TEMP-TABLE ttUserQueryCriteria:TRACKING-CHANGES = TRUE.


FOR EACH ttUserQueryCriteria EXCLUSIVE-LOCK:

    DELETE ttUserQueryCriteria.  

END.

TEMP-TABLE ttUserQueryCriteria:TRACKING-CHANGES = FALSE.


FOR EACH btUserQueryCriteria:

  BUFFER btUserQueryCriteria:SAVE-ROW-CHANGES().

END.


TEMP-TABLE ttUserQuery:DEFAULT-BUFFER-HANDLE:DETACH-DATA-SOURCE().

TEMP-TABLE ttUserQueryCriteria:DEFAULT-BUFFER-HANDLE:DETACH-DATA-SOURCE().


FOR EACH UserQueryCriteria NO-LOCK:

    DISPLAY UserQueryCriteria.

END.











Posted by Admin on 26-Nov-2009 08:46

Yep, the temp-tables are properly filled after the FILL().

The delete on the temp-tables works fine too.

The deleted rows in the before table of ttUserQueryCriteria have ROW-STATE = ROW-DELETED.

And, naturally, they are removed from the after-table.

It's just the deleted rows which aren't saved to the database.

If I were to create or update rows in this example those would work perfectly correct and they would be saved to the database.

Another note is that a delete on ttUserQuery (the top-buffer in the dataset) does work perfect aswell.

Could it be a database configuration issue?

Posted by Admin on 26-Nov-2009 14:22

The code works for me as well.  When you run to the database, I assume that you have removed the temp-table definition for UserQuery and UserQueryCriteria?  Are there any messages in the database log?

Posted by Admin on 27-Nov-2009 03:24

I checked the database log just now...

There are no messages logged concerning this issue.

Posted by Håvard Danielsen on 27-Nov-2009 06:46

DEFINE TEMP-TABLE ttUserQuery LIKE UserQuery BEFORE-TABLE btUserQuery.
DEFINE TEMP-TABLE ttUserQueryCriteria LIKE UserQueryCriteria BEFORE-TABLE btUserQueryCriteria.

DEFINE DATASET dsUserQuery FOR ttUserQuery , ttUserQueryCriteria
  DATA-RELATION UserQueryCriteria FOR ttUserQuery, ttUserQueryCriteria
    RELATION-FIELDS (ttUserQuery.QueryUser, ttUserQueryCriteria.QueryUser, ttUserQuery.Entity, ttUserQueryCriteria.Entity, ttUserQuery.QueryName, ttUserQueryCriteria.QueryName).

DEFINE QUERY qryUQ FOR UserQuery.

DEFINE DATA-SOURCE srcUQ FOR QUERY qryUQ.
DEFINE DATA-SOURCE srcUQC FOR UserQueryCriteria KEYS(UserQueryCriteria.QueryUser, UserQueryCriteria.Entity, UserQueryCriteria.QueryName).

The data source needs to have a unique key to be able to find a record for update or delete. The KEYS for UserQueryCriteria seems suspiciously short to be a child of UserQuery.

Posted by guilmori on 27-Nov-2009 07:27

Yep, creating two UserQueryCriteria records (in my sample using tt source) with the same Entity, QueryName and QueryUser reproduce the problem.

But then, why no error is reported ?

Posted by Håvard Danielsen on 27-Nov-2009 08:51

But then, why no error is reported ?

That seems a bit weird and should be reported to Support. It will return false and add the error message to the errror-status if you (try to) save an update. A delete seems to be treated as a "make sure the record is not there" request.

Posted by Admin on 02-Dec-2009 05:09

*Slaps forehead*

Offcourse... how silly of me!


I knew it was something so easy... but I guess that's what stress does to ya!

Solved my issue.

Thanks a bundle!

Tekka.

This thread is closed