[Delphi] Programma leest DB in verkeerde volgorde in

Pagina: 1
Acties:

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Mijn programma leest een database in, maar i kwam erachter dat hij dat in een andere volgorde doet dan de volgorde die de database heeft als ik hem open met Access. De volgorde is voor 99% hetzelfde, maar op een gegeven moment wisselt hij een paar rijen om.

De tabel uit de database die hij inleest ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Id  ProdOrder   ArtNr   VolgNr  ... ....
1   1   1   10
2   1   1   20
3   1   1   30
4   1   1   40
5   2   2   10
.
.
.
20  4   4   40
21  5   5   10
22  5   5   20
23  5   5   30
24  5   5   40
25  5   5   50
26  6   6   10
27  6   6   20
28  6   6   30
.
.
.

Hij leest alles goed in totdat hij bij regel 22 komt, hij springt daarna naar regel 25 en vervolgens naar 23 dan 24 en vervolgens gaat hij verder bij regel 26 en vanaf dan gaat alles weer goed.

Dit is de code die ik gebruik om de tabel in de database uit te lezen. Deze code zet nog niks in het geheugen, omdat ik eerst wat dingen moet vaststellen, maar bij het daadwerkelijk inlezen gaat hij op dezelfde manier de fout in zoals hij hier al doet:
Delphi:
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
Function TForm1.BepaalMaxAantalMachines(locatie: string):integer;
var
  Aantalbewerkingen: integer;
  VorigeArt: String;
  VorigeVolgnr: Integer;
  i,j:  integer;
begin
  ADOTable1.Close;
  ADOTable1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+LocatieInputFile+';Mode=ReadWrite;Persist Security Info=False';
  ADOTable1.TableName:='TBL_Productie_Gegevens';
  try
    ADOTable1.Active:=True;
  except
    FreeAndNil(FrStatus);
    Screen.Cursor := crDefault;
    btnStart.Caption:='&Start';
    ShowMessage('Please select another database, which has the correct layout');
    abort;
  end;
  
  Result:=0;
  AantalBewerkingen:=1;
  MaxAantalBewerkingen:=1;
  AantalArtikelen:=1;

  { Lees eerste regel in }
  ADOTable1.FindFirst;
  VorigeArt:=ADOTable1.FieldByName('ArtNr').AsString;


  j:=ADOTable1.RecordCount;
  for i:=1 to j-1 do
  begin
    frStatus.pgbStatus.Position:=Round(((i/j)*100)/2);
    application.ProcessMessages;
    VorigeVolgNr:=ADOTable1.FieldByName('VolgNr').AsInteger;
    ADOTable1.FindNext;
    if (ADOTable1.FieldByName('ArtNr').AsString=VorigeArt) AND (ADOTable1.FieldByName('VolgNr').AsInteger > VorigeVolgNr) then
      AantalBewerkingen:=AantalBewerkingen+1
    else
    begin
      VorigeArt:=ADOTable1.FieldByName('ArtNr').AsString;
      AantalArtikelen:=AantalArtikelen+1;
      if Aantalbewerkingen>MaxAantalbewerkingen then
        MaxAantalBewerkingen:=Aantalbewerkingen;
      AantalBewerkingen:=1;
    end;
    if ADOTable1.FieldByName('MachineNummer').AsInteger>Result then
      Result:=ADOTable1.FieldByName('MachineNummer').AsInteger;
  end;
  if Aantalbewerkingen>MaxAantalbewerkingen then
    MaxAantalBewerkingen:=Aantalbewerkingen;
end;

  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 30-04 11:12
Wat versta je onder 'verkeerd' ? Dat als je inleest die regels ineens eerder komen? Of dat de data onder die id's omgewisseld is? Bedenk wel dat je geen sorteervolgorde opgeeft dus in principe in willekeurige volgorde data kan krijgen !

[ Voor 5% gewijzigd door Pino op 18-08-2005 14:13 ]

"If you don't know where you are going, any road will take you there"


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Pino schreef op donderdag 18 augustus 2005 @ 14:10:
Wat versta je onder 'verkeerd' ? Dat als je inleest die regels ineens eerder komen? Of dat de data onder die id's omgewisseld is? Bedenk wel dat je geen sorteervolgorde opgeeft dus in principe in willekeurige volgorde data kan krijgen !
Tot nu is het altijd goed gegaan en ik geef nooit een sorteer volgorde op. In Acces is hij gesorteerd met via de "Id" kolom (autonummering), dat is dus ook de volgorde die ik wil bij het inlezen. Maar als je een db inleest dan moet je bij Delphi dus ook een sorteervolgorde opgeven? Nooit geweten (stond niet in de about delphi cursu over databases inlezen). Maar hoe doe je dat?

Ik bedoel met volgorde dus inderdaad dat regels ineens eerder komen ja. :)

[ Voor 15% gewijzigd door Oscar Mopperkont op 18-08-2005 14:19 ]


  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 30-04 11:12
Oscar Mopperkont schreef op donderdag 18 augustus 2005 @ 14:16:
[...]

Tot nu is het altijd goed gegaan en ik geef nooit een sorteer volgorde op. In Acces is hij gesorteerd met via de "Id" kolom (autonummering). Maar als je een db inleest dan moet je bij Delphi dus ook een sorteervolgorde opgeven? Nooit geweten (stond niet in de about delphi cursu over databases inlezen). Maar hoe doe je dat?
Waarschijnlijk sorteert acces dat ding automatisch. Jij hebt waarschijnlijk wijzigingen aangebracht in regel 23 en 24, waardoor die chronologisch later in de database gekomen zijn.

Vul eens een index in bij IndexName

"If you don't know where you are going, any road will take you there"


  • whoami
  • Registratie: December 2000
  • Laatst online: 02-05 14:39
Haal de gegevens op met een SELECT query, en specfiieer een ORDER BY.

https://fgheysels.github.io/


  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 30-04 11:12
whoami schreef op donderdag 18 augustus 2005 @ 14:20:
Haal de gegevens op met een SELECT query, en specfiieer een ORDER BY.
Dan moet hij van een ADOtable gaan ombouwen naar een ADOquery, is in dit geval niet nodig.

In de eigenschappen van je AdoTable kun je zeer waarschijnlijk in de indexnames je primary key terugvinden. Zet die aan en je bent er.

[ Voor 20% gewijzigd door Pino op 18-08-2005 14:23 ]

"If you don't know where you are going, any road will take you there"


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Pino schreef op donderdag 18 augustus 2005 @ 14:19:
Waarschijnlijk sorteert acces dat ding automatisch. Jij hebt waarschijnlijk wijzigingen aangebracht in regel 23 en 24, waardoor die chronologisch later in de database gekomen zijn.

Vul eens een index in bij IndexName
Als ik het volgende invul:

ADOTable1.IndexName:='Id';

Dan crasht hij met de volgende melding:
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EOleException with message 'Current provider does not support the necessary interface for Index functionality'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 30-04 11:12
Oscar Mopperkont schreef op donderdag 18 augustus 2005 @ 14:23:
[...]

Als ik het volgende invul:

ADOTable1.IndexName:='Id';

Dan crasht hij met de volgende melding:

[...]
Doe het eens in de object inspector. heb je indexen aangegeven in je MDB?

Hmm, uit je foutmelding lees ik dat de Index niet ondersteund word? Welke acces versie gebruik je? En welke JET engine?

Anders moet je toch een ADOQuery gaan gebruiken zoals WHOAMI al aangaf, heb je gelijk meer controle over je data.

[ Voor 29% gewijzigd door Pino op 18-08-2005 14:29 ]

"If you don't know where you are going, any road will take you there"


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Ik gebruik Access 2003 en waar vind ik welke JET engine ik gebruik?

MDB= Master Database? Ik heb Id als index (iig daar staat het sleuteltje bij en de opmerking "Geindexeerd: Ja (geen duplicaten) )

[ Voor 50% gewijzigd door Oscar Mopperkont op 18-08-2005 14:33 ]


  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 30-04 11:12
Oscar Mopperkont schreef op donderdag 18 augustus 2005 @ 14:31:
Ik gebruik Access 2003 en waar vind ik welke JET engine ik gebruik?

MDB= Master Database? Ik heb Id als index (iig daar staat het sleuteltje bij en de opmerking "Geindexeerd: Ja (geen duplicaten) )
mdb = file extensie van access. :)

Heb je het nu al in de Object Inspector geprobeerd?

"If you don't know where you are going, any road will take you there"


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Pino schreef op donderdag 18 augustus 2005 @ 14:37:
[...]


mdb = file extensie van access. :)

Heb je het nu al in de Object Inspector geprobeerd?
Er komt net iemand voor me langs, zal het vanavond even proberen. Ik werk nooit met de object inspector, maar ik zal het wel uitvogelen hoe je daarmee werkt.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 28-04 18:15

Tomatoman

Fulltime prutser

Oscar Mopperkont schreef op donderdag 18 augustus 2005 @ 14:40:
Ik werk nooit met de object inspector, maar ik zal het wel uitvogelen hoe je daarmee werkt.
:? Hoe programmeer jij dan? Zonder Object Inspector valt er weinig in design time te doen in Delphi, het is een van de belangrijkste onderdelen van de IDE. Het lijkt me sterk dat je de Object Inspector niet benut.

Een goede grap mag vrienden kosten.


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
tomatoman schreef op donderdag 18 augustus 2005 @ 15:03:
[...]

:? Hoe programmeer jij dan? Zonder Object Inspector valt er weinig in design time te doen in Delphi, het is een van de belangrijkste onderdelen van de IDE. Het lijkt me sterk dat je de Object Inspector niet benut.
Foutje! Wist niet dat die balk aan de zijkant de Object Inspector heette :X

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 28-04 18:15

Tomatoman

Fulltime prutser

Vaak is het handig om TADODataSet in plaats van TADOTable te gebruiken. In het begin kun je dan een eenvoudige tabel gebruiken en in een later stadium kun je de tabel vervangen door een SQL query, zonder dat je dan de TADODataSet hoeft te vervangen door een andere component.

Een goede grap mag vrienden kosten.


  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 30-04 11:12
tomatoman schreef op donderdag 18 augustus 2005 @ 16:57:
Vaak is het handig om TADODataSet in plaats van TADOTable te gebruiken. In het begin kun je dan een eenvoudige tabel gebruiken en in een later stadium kun je de tabel vervangen door een SQL query, zonder dat je dan de TADODataSet hoeft te vervangen door een andere component.
Kijk, zo leren we ook nog eens wat! Ik vind trouwens de datasetcomponenten nogal verwarrend, je hebt veel keus, maar ook veel voor en nadelen.

"If you don't know where you are going, any road will take you there"


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
tomatoman schreef op donderdag 18 augustus 2005 @ 16:57:
Vaak is het handig om TADODataSet in plaats van TADOTable te gebruiken. In het begin kun je dan een eenvoudige tabel gebruiken en in een later stadium kun je de tabel vervangen door een SQL query, zonder dat je dan de TADODataSet hoeft te vervangen door een andere component.
Ik maak alleen maar gebruik van 1 eenvoudige tabel die ik moet inlezen. Maar kan ik dan "gewoon" TADOTable vervangen door TADODataSet? Of moet ik dan nog veel meer dingen wijzigen?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 28-04 18:15

Tomatoman

Fulltime prutser

Uit de helpfiles:
Set CommandType to indicate the type of command that is contained in the CommandText property. The value in CommandType should agree with that of CommandText. For instance, if CommandText is the name of a table, CommandType should be cmdTable or cmdTableDirect.
Use the TADODataSet component's CommandText property to retrieve the dataset, specifying either a table name or an SQL statement (SELECT only).
Je stelt dus in: CommandType = cmdTabel, CommandText = MijnTabelnaam. Dan werkt hij precies zoals TADOTable.

Als je later besluit dat je liever een SQL query gebruikt, verander je CommandType naar cmdText en vul je bij CommandText de SQL query in (bijvoorbeeld: SELECT * FROM MijnTabelnaam).

TADODataSet heeft geen overhead ten opzichte van TADOTable, omdat ze achter de schermen allebei een SQL query genereren.

Een goede grap mag vrienden kosten.


  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 30-04 11:12
tomatoman schreef op donderdag 18 augustus 2005 @ 17:40:
Uit de helpfiles:

[...]


[...]
Je stelt dus in: CommandType = cmdTabel, CommandText = MijnTabelnaam. Dan werkt hij precies zoals TADOTable.

Als je later besluit dat je liever een SQL query gebruikt, verander je CommandType naar cmdText en vul je bij CommandText de SQL query in (bijvoorbeeld: SELECT * FROM MijnTabelnaam).

TADODataSet heeft geen overhead ten opzichte van TADOTable, omdat ze achter de schermen allebei een SQL query genereren.
Als Oscar dat ding gelijk als Query instelt en een order by in de query zet is het probleem opgelost.

"If you don't know where you are going, any road will take you there"


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
tomatoman schreef op donderdag 18 augustus 2005 @ 17:40:
Uit de helpfiles:
Je stelt dus in: CommandType = cmdTabel, CommandText = MijnTabelnaam. Dan werkt hij precies zoals TADOTable.

Als je later besluit dat je liever een SQL query gebruikt, verander je CommandType naar cmdText en vul je bij CommandText de SQL query in (bijvoorbeeld: SELECT * FROM MijnTabelnaam).

TADODataSet heeft geen overhead ten opzichte van TADOTable, omdat ze achter de schermen allebei een SQL query genereren.
Thnx, ik heb het nu omgezet en het werkt inderdaad op dezelfde manier als TADOTable, maar dus ook met die inleesvolgorde. Hoe zeg je tegen TADOset dat hij de volgorde van de "Id" kolom moet aanhouden? Dus het sorteren?

Als ik:

ADODataset1.Sort:='Id';

doe dan werkt dat niet, hij lijkt niks te doen.

[ Voor 7% gewijzigd door Oscar Mopperkont op 19-08-2005 11:57 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 28-04 18:15

Tomatoman

Fulltime prutser

Zoals Pino aangeeft kun je hem nu heel gemakkelijk omzetten naar een query, waarmee je sorteerprobleem is opgelost.

CommandType = cmdText

CommandText =
SQL:
1
2
3
SELECT *
FROM MijnTabelnaam
ORDER BY Id

Het ORDER BY gedeelte zorgt voor een sortering op Id. Je kunt * (= alle velden in de tabel) ook vervangen door specifieke veldnamen die je met een komma scheidt: Id, ProdOrder, ArtNr, VolgNr. Afhankelijk van de query-opbouw is dat In veel gevallen zelfs vereist.

Een goede grap mag vrienden kosten.


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Thnx tomatoman! Het (lijkt) nu helemaal goed te werken _/-\o_

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 02:17

alienfruit

the alien you never expected

Welke delphi cursus heb je gebruikt dan ? Als je de door Borland gelicenseerde materiaal gebruikt, dan hoor ik graag wat het probleem is. Ik heb dat proefgelezen als database nitwitt en het ging mij goed af :)

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Ik had het van delphi.about.com, maar misschien ligt de fout ook wel bij mij. Het werkt nu in ieder geval :)
Pagina: 1