Question

Firebird, Delphi - Need help in an efficient way of updating a table

Asked by: MerlaP83

Hi all,

Well, I am using 2 tables (Players+teams) and at the moment I am using a rather slow process using Listboxes etc to get the result I want. But I think I can manage to achieve it using only FB SQL commands which I would think improves the speed a lot.

What I want to achieve:

I want to select the first 6 names(field is called NAME) where Club = clubchosen.caption and Injury = 0 and Pos = D. No problems doing this using:

SELECT  First 6 * FROM SPELARE where klubb = '''+clubchosencaption+'''' and Pos = 'D' and Injury = '0' order by Def DESC;

Here's basically what I need help with:

From those 6 records chosen, the first 2 needs to have its field "Lineup" updated to '1', the following two results(3+4) should have the field "Lineup" set to 2 and finally the last 2 records(5+6) should have the field "Lineup" set to 3.

At the same time, the Players table holds 2 fields called Def and Off (basically the strength of the player)

From the query mentioned above and the 6 records that shows up, the Def and Off(holds a number from 1-20) should be added and the final result should be placed in LineupDef.Caption(for Def field) and LineupOff.Caption(for Off field).

What would be the most efficient way to achieve this, especially the update method where it also needs to do some counting? (The db will only be used locally.. used Paradox before but it was way too slow when I reached 10k records).

Hope you can understand me and bare with my poor english.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2009-04-02 at 02:51:29ID24287861
Topics

Interbase / Firebird Database

,

Delphi Database

,

Delphi IDE

Participating Experts
2
Points
500
Comments
13

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Paradox
    Is there a Paradox help area or does anybody know Paradox?
  2. Paradox to Interbase conversion.
    I' ve got an application written for Paradox tables. I want to make it work with Interbase/ Firebird tables. How can I convert Paradox into Interbase/ Firebird tables in the easiest way? What is the best free tool to deal with Interbase/ Firebird tables? Jack
  3. Connect to Firebird in Delphi 5,7
    Hi, I am using Delphi 5 and Delphi 7. Previously I am using Paradox and use BDE to connect. If I need to change my database to firebird. What is the best way for my Delphi 5 and delphi 7 to use to connect to Firebird database? I am using Delphi 5 and Delphi 7 to develope a w...
  4. installation of firebird 2 client for Delphi application
    I have installed a Firebird superserver on a machine I plan to write a client application running on other networked machines that will need to access the Firebird database The application is written in Delphi using Interbase component (I already succeeded this with the Fire...
  5. Delphi and Firebird
    how can I create a Firebird Database domain in an existing database programmatically using Delphi

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: Geert_GruwezPosted on 2009-04-02 at 02:55:39ID: 24048017

the fastest way is using calculated fields

the thing i don't see is what you do with the select ...
are you using this only in your program in memory or writing this back into a third table ?

 

by: MerlaP83Posted on 2009-04-02 at 03:01:54ID: 24048051

The thing with the Select function is that I want to edit the 6 records(players) with the highest Def skill set. The other records are not to be updated(there are about 30 records per team, only 6 are to be edited).

I am only using this in my program in memory - need to do the calculation to get the team skill, so I need to do a fast calculation.

 

by: MerlaP83Posted on 2009-04-03 at 10:42:51ID: 24062402

Forgot to ask what it means with "calculated fields" ? How to use and take advantage of this?

 

by: Geert_GruwezPosted on 2009-04-04 at 17:31:26ID: 24069662

a calculated field is a field you add to the dataset
put a query on a form
right click and click edit fields
then you can add fields
you set the type to calculated

then assign the oncalculate event handler
this gets called for each record on loading the data, and you can set the value of your fields to what you want

procedure TForm1.Query1OnCalculate(Dataset: TDataset);
begin
  DataSet.FieldByName('TOTAL').AsFloat := Dataset.FieldByName('QUANTITY').AsFloat * DataSet.FieldByName('PRICE').AsFloat;
end;

 

by: MerlaP83Posted on 2009-04-09 at 03:49:55ID: 24105914

Sounds good, but didn't get it to work with Zeos? Any good tutorial link for calc?

The main problem I have though is the following:

I have a query that returns, say 5 results and I would like the Off field (number 1-20) from those 5 results to be added to count_off.caption.

with Spelare do
      begin
      Close;
      SQL.Clear;
      SQL.text := 'select first 5 * from spelare where klubb = ''Tomteland'' and Pos = ''F'' order by Off DESC';
      Open;
end;
 
//Adding this, which is probably not that efficient, will only give me the number of the first result's Off field (not the total amount from the returned results).
 
count_off.caption.caption := inttostr(strtoint( count_off.caption) + strtoint(Spelare['Off']));
 
//

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:

Select allOpen in new window

 

by: rfwoolfPosted on 2009-04-10 at 04:41:42ID: 24114757

"//Adding this, which is probably not that efficient, will only give me the number of the first result's Off field (not the total amount from the returned results)."

Okay, well then why don't you cycle/iterate through your dataset and add up the off field that way?

var
 i : integer;

i := 0;

MyDataset.First;

While MyDataset.eof = false do

begin

 i := i + MyDataSet.Fieldbyname('Off').asInteger;
 MyDataset.Next;

end;

 

by: MerlaP83Posted on 2009-04-10 at 10:52:54ID: 24117556

Thanks, that did the trick; however, my final question before I close and accept it as a solution is how I, at the same time, can update the results?

with Spelare do
      begin
      Close;
      SQL.Clear;
      SQL.text := 'select first 3 skip 3 * from spelare where klubb = ''+nuvklubb.caption+''' and Pos = ''B'' order by Def DESC';
      Open;
end;
i := 0;
Spelare.First;
While Spelare.eof = false do
begin
 i := Spelare.Fieldbyname('Def').asInteger;
 Spelare.sql.text := 'update spelare set platsar = ''2''';
 Spelare.Next;
end;

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:

Select allOpen in new window

 

by: rfwoolfPosted on 2009-04-10 at 11:34:30ID: 24117979

"From the query mentioned above and the 6 records that shows up, the Def and Off(holds a number from 1-20) should be added and the final result should be placed in LineupDef.Caption(for Def field) and LineupOff.Caption(for Off field)."

Okay so you first said you just want to put the result of the count in "Lineupdef" (what type of object is LineupDef anyways? Is it a DBEdit? Is it even data-aware?)
You could just change your above code to this:

i := 0;
Spelare.First;
While Spelare.eof = false do
begin
 i := Spelare.Fieldbyname('Def').asInteger;
// Spelare.sql.text := 'update spelare set platsar = ''2''';
 Spelare.Next;
end;
LineupDef.caption := inttostr(i);
 
Next you said
"From those 6 records chosen, the first 2 needs to have its field "Lineup" updated to '1', the following two results(3+4) should have the field "Lineup" set to 2 and finally the last 2 records(5+6) should have the field "Lineup" set to 3."
Well then you would change your above code to something like this:
 
 
  i := 0;
  Spelare.First;
  While Spelare.eof = false do
  begin
   i := Spelare.Fieldbyname('Def').asInteger;
   if (Spelare.RecNo => 0) and (Spelare.RecNo <= 1) then
   begin
     Spelare.Edit;
     Spelare.Fieldbyname('LineUp').asinteger := '1';
     Spelare.Post;
   end;
   if (Spelare.RecNo => 2) and (Spelare.RecNo <= 3) then
   begin
     Spelare.Edit;
     Spelare.Fieldbyname('LineUp').asinteger := '2';
     Spelare.Post;
   end;
   if (Spelare.RecNo => 4) and (Spelare.RecNo <= 5) then
   begin
     Spelare.Edit;
     Spelare.Fieldbyname('LineUp').asinteger := '3';
     Spelare.Post;
   end;
   Spelare.sql.text := 'update spelare set platsar = ''2''';
   Spelare.Next;
  end;
 
 
===
Warning: Actually making changes to the dataset while you are iterating/cycling through it might be a bad idea. So you can update the table using a query instead. Usually you will need the IDs of the fields to be updated. Does your resultset have an ID field you can use? Here is an example:
REPLACE THESE:
     Spelare.Edit;
     Spelare.Fieldbyname('LineUp').asinteger := '3';
     Spelare.Post;
WITH THESE:
     OtherQuery.SQL.Clear;
     OtherQuery.SQL.Text := 'SET Spelare.LineUp = 3 WHERE Spelare.ID = ' + Spelare.Fieldbyname('ID').asstring);
     OtherQuery.ExecSQL;

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:

Select allOpen in new window

 

by: rfwoolfPosted on 2009-04-10 at 11:36:40ID: 24118000

Hey I see an error in your code that I have repeated above. You say:
  i := Spelare.Fieldbyname('Def').asInteger
that should be:
 i := i +  Spelare.Fieldbyname('Def').asInteger;
otherwise i will not count.

 

by: MerlaP83Posted on 2009-04-10 at 12:06:17ID: 24118280

Thanks for all your information and tips, very useful.

Sorry if I've said different things, its because I haven't found the best solution for the query yet. Unfortunately, I do not have any ID for the table.

LineUp has nothing to do with the DB, its just a label.

6 records will be chosen.

First 2 should have its 'Def' attributes added to Line1Def, and their 'Platsar' should be set to '1'.
#3 and #4 should have its 'Def' attribute added to Line2Def, and their 'Platsar' should be set to '2'.
#5 and #6 should have its 'Def' attribute added to Line3Def and their 'Platsar' should be set to '3'.

It needs to be a fast procedure since it will be used a lot in updating lineups for the teams.

//By adding this I will pull the first 2 results of the 6 (seemed like an easy method, but requires a lot of coding (copy/change/paste) and will probably be a little bit slow.
 
with Spelare
do
      begin
      Close;
      SQL.Clear;
      SQL.text := 'select first 2 * from spelare where klubb = ''+nuvklubb.caption+''' and Pos = ''B'' order by Def DESC';
      Open;
end;
i := 0;
Spelare.First;
While Spelare.eof = false do
begin
 i := i + Spelare.Fieldbyname('Def').asInteger;
 Spelare.Next;
end;
Line1Def.Caption := inttostr(i);
 
//Doing the following will give the error "Expression expected but '>' found. Looked like a good solution otherwise though since it will be a lot less coding to go through. But do I have to go with Edit/Post? It's a bit slower, isn't it?
 
  While Spelare.eof = false do
  begin
   if (Spelare.RecNo => 0) and (Spelare.RecNo <= 1) then
   begin

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:

Select allOpen in new window

 

by: rfwoolfPosted on 2009-04-10 at 12:50:37ID: 24118687

sorry change => to >=
i forget that it likes to say "..is greater than or equal to" but doesn't like "is equal to or greater than".

 

by: rfwoolfPosted on 2009-04-10 at 12:51:58ID: 24118698

I'm also slightly confused about which are your datasets and which are your table names. I suspect you have a TZTable or TZQuery called "Spealer" and also a table in your database called "Spealer". It's probably my fault, I should read through all of this carefully to understand 100%

 

by: MerlaP83Posted on 2009-04-10 at 14:58:56ID: 24119655

I'm sorry, I'm not too easy to understand sometimes with my somewhat poor english :)

You were correct in the fact that I have a TZQuery called "Spelare" and a table in my db called "Spelare".

Finally I got everything settled and working perfectly (A LOT faster than it used to be + a lot less code). Thanks for your patience and excellent help, really appreciated as always rfwoolf.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...