Lazarus

Programming => Databases => Topic started by: TheNick on May 25, 2021, 03:43:38 pm

Title: [SOLVED] Copy a record ?
Post by: TheNick on May 25, 2021, 03:43:38 pm
Hi all,
I'm trying to make a copy of an existing record into the same dataset with some entries changed.

1) I copy the contents to a XML-file with the SaveToFile-procedure
2) I append a a new record to the dataset
3) I now populate the dataset with the old data by using the LoadFromFile-procedure
4) I post the new record and set the mode to edit
5) I change some data

No matter what I do, I end up with empty data. The code looks something like this:
Code: Pascal  [Select][+][-]
  1. DataModuleRules.SQLSelectRulesList.SaveToFile('SQLSelectRulesList.xml', dfXML);  //This generates a nice XML-file
  2.  
  3. DataModuleRules.SQLSelectRulesList.Append;
  4.  
  5. if FileExists('SQLSelectRulesList.xml') Then
  6.        DataModuleRules.SQLSelectRulesList.LoadFromFile('SQLSelectRulesList.xml'); //The file are being read but nothing happens...
  7.  
  8. DataModuleRules.SQLSelectRulesList.Post;
  9. DataModuleRules.SQLSelectRulesList.Edit;
  10. DataModuleRules.SQLSelectRulesList.FieldByName('name').AsString:='Copy from - '+ DataModuleRules.SQLSelectRulesList.FieldByName('name').AsString;
  11.  
  12.  

Anyone got an idea what is going wrong?

//Cheers Niclas
Title: Re: Copy a record ?
Post by: Zvoni on May 25, 2021, 04:35:26 pm
Is it just me, or is there an "ApplyUpdate" missing?

EDIT: And shouldn't the LoadFromFile also have a Format specified?
https://www.freepascal.org/docs-html/fcl/bufdataset/tcustombufdataset.loadfromfile.html

EDIT2: Why don't you use "CopyFromDataset"?
https://www.freepascal.org/docs-html/fcl/bufdataset/tcustombufdataset.copyfromdataset.html

EDIT3: another one: Why not use "INSERT INTO SELECT"?
https://www.w3schools.com/sql/sql_insert_into_select.asp
Title: Re: Copy a record ?
Post by: egsuh on May 26, 2021, 09:15:43 am
How to copy is your choice depending on your application's conditions, but I would suggest to use SQL statement itself to copy records.  Following is an example from Firebird documentation.

Code: SQL  [Select][+][-]
  1. INSERT INTO Members (NUMBER, name)
  2.   SELECT NUMBER, name FROM NewMembers WHERE Accepted = 1
  3.     UNION
  4.   SELECT NUMBER, name FROM SuspendedMembers WHERE Vindicated = 1

And then you may change the data of copied records.

Of course this is an option.
Title: Re: Copy a record ?
Post by: TheNick on May 26, 2021, 11:01:30 am
Thank you both for your examples and suggestions. From my pov a safe way of doing this (without defining to much stuff around) is by doing a classic record:
Code: Pascal  [Select][+][-]
  1.  
  2. with (rulerecord) do
  3.          begin
  4.               name:='Copy of - ' + DataModuleRules.SQLSelectRulesList.FieldByName('name').AsString;
  5.               FAIClass:= DataModuleRules.SQLSelectRulesList.FieldByName('class').AsString;
  6.               typeofcomp:=DataModuleRules.SQLSelectRulesList.FieldByName('type').AsString;
  7.               created_at:=TimeStamp;
  8.               DataModuleRules.SQLSelectRulesList.Append;
  9.               DataModuleRules.SQLSelectRulesList.FieldByName('name').AsString:=name;
  10.               DataModuleRules.SQLSelectRulesList.FieldByName('created_at').AsLargeInt:=created_at;
  11.               DataModuleRules.SQLSelectRulesList.FieldByName('class').AsString:=FAIclass;
  12.               DataModuleRules.SQLSelectRulesList.FieldByName('type').AsString:=typeofcomp;
  13.          end;
  14.  
   
Can't say that I like it but it works. I was having higher hopes for the 'CopyFromDataSet' but that costed more of effort then to create an record-type (I have probably not figured out yet how to use in a correct way!).

Cheers Niclas
Title: Re: Copy a record ?
Post by: Zvoni on May 26, 2021, 11:25:22 am
If i read it right, your SQLSelectRulesList is already of Type DataSet, (Is it a DataSource/TSQLQuery?)
so it would be something like

DataModuleRules.SQLSelectRulesList.CopyFromDataSet(DataModuleRules.SQLSelectRulesList.DataSet, True);



Title: Re: Copy a record ?
Post by: TheNick on May 26, 2021, 01:10:08 pm
If i read it right, your SQLSelectRulesList is already of Type DataSet, (Is it a DataSource/TSQLQuery?)
so it would be something like

DataModuleRules.SQLSelectRulesList.CopyFromDataSet(DataModuleRules.SQLSelectRulesList.DataSet, True);

True, it is an TSQLQuery.

I will try, what you suggested, in my other copydata-procedures.

Thanks,
Niclas
TinyPortal © 2005-2018