Login ProductsSalesSupportDownloadsAbout |
Home » Technical Support » Elevate Web Builder Technical Support » Support Forums » Elevate Web Builder General » View Thread |
Messages 1 to 10 of 19 total |
Can't save random number to database |
Mon, Dec 1 2014 4:36 PM | Permanent Link |
TD Advanced Data Systems, Inc. | I have a form where I create a random number. I then assign this random number to a TEdit which is connected to a dataset. When I save the record everything gets written to the database table except the random number. I am using ElevateDB as the database engine and the field, that the random number is being written to, has the data type set to float. What am I doing wrong?
Thanks, TD Here is a screen capture of the form and the code behind this form: unit Unit6; interface uses WebCore, WebForms, WebCtrls, WebData; type TForm6 = class(TForm) Edit1: TEdit; Label1: TLabel; Label2: TLabel; Edit2: TEdit; Label3: TLabel; Edit3: TEdit; Edit4: TEdit; Button1: TButton; ComboBox1: TComboBox; Label5: TLabel; ds6: TDataSet; Label4: TLabel; Label6: TLabel; procedure Button1Click(Sender: TObject); procedure Form6Show(Sender: TObject); procedure ds6AfterLoad(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form6: TForm6; implementation uses unit1; var dblRandom: double; strRandom: string; intRandom: integer; procedure TForm6.Button1Click(Sender: TObject); begin Database.StartTransaction; try Form6.ds6.Save; Database.Commit; Form1.LoadDateRange(false); except Database.Rollback; raise; end; Form6.Close; end; procedure TForm6.Form6Show(Sender: TObject); begin Database.Load(ds6); end; procedure TForm6.ds6AfterLoad(Sender: TObject); begin Form6.ds6.Insert; dblRandom := Random; strRandom := DoubleToStr(dblRandom); //strRandom := StrReplace(strRandom,'0.','',true,true); intRandom := StrToInt(strRandom); Form6.Edit1.SetFocus; Form6.Edit1.Text := strRandom; //Form6.ds6.columns['random_number'].AsFloat := dblRandom; end; end. Attachments: Form6.JPG |
Mon, Dec 1 2014 5:14 PM | Permanent Link |
Walter Matte Tactical Business Corporation | This is what I do.
You need to StartTransaction - Before Dataset.Insert.... Database.StartTransaction; DataSet.Insert(False) DataSet.Columns['xxx'].As integer := myRandom; DataSet.Save; In Dataset.OnSaveEvent Database.Commit; Walter |
Mon, Dec 1 2014 5:59 PM | Permanent Link |
Walter Matte Tactical Business Corporation | You should associate OnCommit event - before the Database.Commit; (and OnCommitError)
Then in the OnCommit do the Database.Load(XXXX); Walter |
Mon, Dec 1 2014 6:15 PM | Permanent Link |
Walter Matte Tactical Business Corporation | I have attached a Data Entry Example. Walter Attachments: DatasetExample.zip |
Mon, Dec 1 2014 9:40 PM | Permanent Link |
TD Advanced Data Systems, Inc. | Walter Matte wrote:
I have attached a Data Entry Example. Walter Thank you Walter, I will take a look at this tomorrow. Thanks again! TD |
Fri, Dec 19 2014 10:23 PM | Permanent Link |
TD Advanced Data Systems, Inc. | TD wrote:
Walter Matte wrote: I have attached a Data Entry Example. Walter Thank you Walter, I will take a look at this tomorrow. Thanks again! TD That solved that problem, now I have a problem implementing the next part. Right after the record is saved I need to use a second dataset that uses a select query to find the record I just saved by using the random number in the WHERE clause. I would then be able to have the primary key field's value that I could past to the next form that will appear as this form closes. I goal is to create a wizard using several forms instead of having all of the fields on one form. The wizard will be used for adding a new record as well as editing an existing record. My problem I think is a timing issue as the query never finds and record. Below is the code on the form that opens when adding a new record. Also T attached a screen capture of the query in ds6B. Any help with this is greatly appreciated! TD <code> unit Unit6; interface uses WebCore, WebForms, WebCtrls, WebData; type TForm6 = class(TForm) Edit1: TEdit; Label1: TLabel; Label2: TLabel; Edit2: TEdit; Label3: TLabel; Edit3: TEdit; Edit4: TEdit; Button1: TButton; ComboBox1: TComboBox; Label5: TLabel; ds6: TDataSet; Label6: TLabel; ds6B: TDataSet; procedure Button1Click(Sender: TObject); procedure Form6Show(Sender: TObject); procedure ds6AfterLoad(Sender: TObject); procedure Form6Close(Sender: TObject); procedure ds6BAfterLoad(Sender: TObject); private { Private declarations } public { Public declarations } dblRandom: double; //public field end; var Form6: TForm6; implementation uses unit1, unit7; procedure TForm6.Button1Click(Sender: TObject); var strRandom: string; begin if Database.InTransaction then try Form6.ds6.columns['random_number'].AsFloat := dblRandom; Form6.ds6.Save; Database.Commit; //find pid of record just saved strRandom := DoubleToStr(Form6.dblRandom); ds6B.params.clear; ds6B.params.add('rannum='+strRandom+''); Database.Load(ds6B); Form1.LoadDateRange(false); except Database.Rollback; raise; end; Form6.Close; end; procedure TForm6.Form6Show(Sender: TObject); begin Database.Load(ds6); end; procedure TForm6.ds6AfterLoad(Sender: TObject); begin dblRandom := Random; Database.StartTransaction; Form6.ds6.Insert; end; procedure TForm6.Form6Close(Sender: TObject); begin Form7.ShowModal; end; procedure TForm6.ds6BAfterLoad(Sender: TObject); var strMyPID: string; begin strMyPID := ds6B.columns['pid'].AsString; Form1.strPID := strMyPID; //pid saved to public field on main form where Form7 can access it end; end. <code> Attachments: ds6B.JPG |
Sat, Dec 20 2014 7:14 AM | Permanent Link |
Uli Becker | Generally be aware that everything in JS is async. That's why you always
have to make sure that a value was saved before you use it. In your case you could use the OnCommit event. Since the event is called after *every* commit, you can set a flag to find the one you are searching for. Uli |
Sat, Dec 20 2014 8:59 AM | Permanent Link |
Walter Matte Tactical Business Corporation | Just as Uli wrote:
Everything is in JS is async. procedure TForm6.Button1Click(Sender: TObject); var strRandom: string; begin if Database.InTransaction then try Form6.ds6.columns['random_number'].AsFloat := dblRandom; Form6.ds6.Save; Database.Commit; //find pid of record just saved strRandom := DoubleToStr(Form6.dblRandom); ds6B.params.clear; ds6B.params.add('rannum='+strRandom+''); Database.Load(ds6B); Form1.LoadDateRange(false); except Database.Rollback; raise; end; Form6.Close; end; You need to think about what is happening at the Browser and what is happening at the Server. When you call Database.Commit the Browser is not behave like a desktop program. It does not wait for the Commit to finish before doing the next command. It immediately does the next command. You do not know how many seconds or milliseconds it will take to do the trip to the server and back. That is why it continues, and you will get the response back in an event. You only know the Commit is finished when the event OnCommit is fired or it fails when the OnCommitError is fired. The you can ask for the Database.Load. in the OnCommit event. Also the Rollback logic needs a change of thinking too. Basically when you issue a StartTransaction EWB (the browser) starts to track and remember all your browser side dataset actions. If you were to give your user a button that says Cancel - after a StartTransaction was begun, then in that button event you would do a Rollback - to tell the Datasets that you have no intention of sending the dataset changes to the server for processing. Working on Web Applications requires a paradigm shift - the program flow and events when interacting between Browser and Server are different than a Desktop Client Server database application. Also the EWB Database and Datasets are browser side objects. Don't look at them as commands to manipulate the database directly. When you issue a StartTransaction, Commit and Rollback in EWB you are not issuing commands to a database program (EDB, DBISAM for example). You are working on the local data storage objects (variables) in the browser, which mange data for you (based on EWB Framework) - which then get sent as JSON requests back to the Server when you ask for a Database.Commit. So a Database Commit is really just creating a JSON object and sending it over the internet to the server. Walter |
Sat, Dec 20 2014 10:24 AM | Permanent Link |
TD Advanced Data Systems, Inc. | Walter Matte wrote:
Just as Uli wrote: Everything is in JS is async. procedure TForm6.Button1Click(Sender: TObject); var strRandom: string; begin if Database.InTransaction then try Form6.ds6.columns['random_number'].AsFloat := dblRandom; Form6.ds6.Save; Database.Commit; //find pid of record just saved strRandom := DoubleToStr(Form6.dblRandom); ds6B.params.clear; ds6B.params.add('rannum='+strRandom+''); Database.Load(ds6B); Form1.LoadDateRange(false); except Database.Rollback; raise; end; Form6.Close; end; You need to think about what is happening at the Browser and what is happening at the Server. When you call Database.Commit the Browser is not behave like a desktop program. It does not wait for the Commit to finish before doing the next command. It immediately does the next command. You do not know how many seconds or milliseconds it will take to do the trip to the server and back. That is why it continues, and you will get the response back in an event. You only know the Commit is finished when the event OnCommit is fired or it fails when the OnCommitError is fired. The you can ask for the Database.Load. in the OnCommit event. Also the Rollback logic needs a change of thinking too. Basically when you issue a StartTransaction EWB (the browser) starts to track and remember all your browser side dataset actions. If you were to give your user a button that says Cancel - after a StartTransaction was begun, then in that button event you would do a Rollback - to tell the Datasets that you have no intention of sending the dataset changes to the server for processing. Working on Web Applications requires a paradigm shift - the program flow and events when interacting between Browser and Server are different than a Desktop Client Server database application. Also the EWB Database and Datasets are browser side objects. Don't look at them as commands to manipulate the database directly. When you issue a StartTransaction, Commit and Rollback in EWB you are not issuing commands to a database program (EDB, DBISAM for example). You are working on the local data storage objects (variables) in the browser, which mange data for you (based on EWB Framework) - which then get sent as JSON requests back to the Server when you ask for a Database.Commit. So a Database Commit is really just creating a JSON object and sending it over the internet to the server. Walter Uli, Walter thank you so much for helping! I have searched the EWB manual and this forum for information on the OnCommit event and have found nothing. Can you guys give me an example as to how to use / work with this event? Thanks, TD |
Sat, Dec 20 2014 11:59 AM | Permanent Link |
Raul Team Elevate | On 12/20/2014 10:24 AM, TD wrote:
> Uli, Walter thank you so much for helping! I have searched the EWB manual and this forum for information on the OnCommit event and have found nothing. Can you guys give me an example as to how to use / work with this event? I don't believe there is a OnCommit event - i assume what they meant was that you call "Commit" and then wait for either AfterCommit or OnCommitError events. I suggest you review the datasets section : http://www.elevatesoft.com/manual?action=topics&id=ewb1§ion=using_datasets It really does cover all the details on how this works. Start with DataSet Architecture and at least read Transactions (though i'd suggest you read them all). For example you need to be aware of the TransactionLevel : only if it reaches 0 does the data get posted to back end server, etc. Raul |
Page 1 of 2 | Next Page » | |
Jump to Page: 1 2 |
This web page was last updated on Friday, March 29, 2024 at 03:30 AM | Privacy PolicySite Map © 2024 Elevate Software, Inc. All Rights Reserved Questions or comments ? E-mail us at info@elevatesoft.com |