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
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?
I just tried your suggestion.
I'm not getting any messages at all.
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.
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?
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?
I checked the database log just now...
There are no messages logged concerning this issue.
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.
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 ?
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.
*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.