Copy Data without SQL ( Crosspost )

Hi again

( Crosspost / followup >> https://talk.remobjects.com/t/copy-data-without-sql/12318 )

For some reason this stop working…

    procedure TDM_member.member_switch(Sender: TObject);
    var
       i: Integer;
       NewGUID : TGUID;
    begin
      CreateGUID(NewGUID);

      tbl_member_clone.Insert;
      for i := 0 to tbl_member_clone.Fields.Count-1 do
          tbl_member_clone.Fields[i].Value := tbl_member.Fields[i].Value;

      tbl_member_clone.FieldbyName('ID').AsString := GUIDToString(NewGUID);
      tbl_member_clone.FieldbyName('C_NO').AsString := new_camp_no;
      tbl_member_clone.FieldByName('U_NO').AsInteger:=gideon_no;
      tbl_member_clone.FieldByName('L_UPDATE').AsDateTime := Now;
      tbl_member_clone.FieldByName('STAT_DEL').AsString:=('0');

      tbl_member_clone.Post;
      tbl_member.Refresh;
    end;   

This rises this Error:

The Settings are:

It is unclear to me way it not working.
I did also a Update to the Newest Version on RemObject…

Shalom
Manfred

this error means that your table on server-side has no mapping

you can create it in DASM:

The Mapping is defined:

The Connection tbl_member_clone a clone of tbl_member.

      tbl_member_clone.Post;
      tbl_member.Refresh;

are you sure that your changes in tbl_member_clone will be posted to server or you are using ruoOnPost?

can your create a simple testcase that reproduces this case, pls?

There is the Problem… If i use ruoOnPost ( witch i doo on the Normal ( not clone ) Tables there is the above mentioned Error.
If i use ruoOnPost then i get the Error

I have a field calld RPL$LOCAL…

if you unset ruoOnPost and call usual table.ApplyUpdates() , any error will be raised or not?

There is a Error

have you unset ruoOnPost on main and cloned tables ?

On the Cloned Table on the Main it is set.

try to unset on both tables

Now i get this:

The Above Error shows with tbl_member_clone.ApplyUpdates();

with Post i get this:

Maybe important. on the main Table i have this:

procedure TDM_member.tbl_memberAfterInsert(DataTable: TDADataTable);
var
  NewGUID : TGUID;
begin
       if (tbl_member_CanInsert) then
       begin
         with tbl_member do
         begin
              CreateGUID(NewGUID);
              FieldByName('ID').AsString:=GUIDToString(NewGUID);  // Generate GUID
              FieldByName('C_NO').AsString:=camp_no;
              FieldByName('U_NO').AsInteger:=gideon_no;
              FieldByName('CERT_G').AsString:='False';
              FieldByName('CERT_A').AsString:='False';
              FieldByName('LTM_G').AsString:='False';
              FieldByName('LTM_A').AsString:='False';
              FieldByName('CS_S_T').AsString:='False';
              FieldByName('L_UPDATE').AsDateTime := Now;
              FieldByName('STAT_DEL').AsString:=('0');
              ApplyUpdates();
         end;
       end;
       if not SameText (camp_no, camp_no_cu)
          then ShowMessage('! The Entry is generated in the Camp '+ camp_no +' !');
end;

your code should look like

procedure TDM_member.member_switch(Sender: TObject);
..
     // disable ruoOnPost on both tables
      tbl_member_clone.RemoteUpdatesOptions := [];
      tbl_member.RemoteUpdatesOptions := [];
      try
        tbl_member_clone.Insert;
...
        tbl_member_clone.Post;
        tbl_member.ApplyUpdates();
      finally
        // restore ruoOnPost
        tbl_member.RemoteUpdatesOptions := [ruoOnPost];
      end;
      tbl_member.Refresh;
    end;

of course, you can add tbl_master.DisableControls/EnableControls for avoid problems with grid

hmm, your code in TDM_member.tbl_memberAfterInsert shows that you don’t use ruoOnPost for main table (i.e. tbl_member)


Can you create a simple testcase that reproduces, this problem, pls?
your code has a lot of hidden underwater stones so it can’t be reproduces with simple testcase easily

Can you create a simple testcase that reproduces, this problem, pls?

Will try that…it will take some moments…

Hi Evgeny
Did send you a Testcase to the Support Adresse.
If something is unclear, please just ask.

Shalom
Manfred

thx, we received it

disable MasterSource before Refresh like:

   ds := tbl_member.MasterSource;
   try
     tbl_member.MasterSource := nil;
     tbl_member.Refresh;
   finally
     tbl_member.MasterSource := ds;
   end;   

Will try that, thank you.
Shalom
Manfred

It works now.

The Problem was with this:

tbl_member_clone.Insert;
for i := 0 to tbl_member_clone.Fields.Count-1 do
tbl_member_clone.Fields[i].Value := tbl_member.Fields[i].Value;

i did have to define every field alone…

try
tbl_member_clone.Insert;
tbl_member_clone.FieldbyName(‘ID’).AsString := GUIDToString(NewGUID);
tbl_member_clone.FieldbyName(‘C_NO’).AsString := new_camp_no;
tbl_member_clone.FieldByName(‘U_NO’).AsInteger:=gideon_no;
tbl_member_clone.FieldByName(‘L_UPDATE’).AsDateTime := Now;
,
,
,

Thank you for your Help. As always great Support :coffee:
Shalom
Manfred