Toon posts:

[delphi] DbGrid (simpel)

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een dbGrid op een formpje die stuur ik aan met een dbNavigator (ik moest effe snel zijn).
In dat grid komt een tabelletje met als eerste veld een nummer dat niet gewijzigd mag worden door de user,maar dat nummer moet ie dus wel wegschrijven naar de tabel als je een nieuw record aanmaakt.

Ook maak ik gebruik van een datamodule dus ik mag in het form zelf niets met de tabellen zetten.

De key die ik moet opmaken moet gewoon het hooste keynummer+1 zijn van de recordd die al bestaan.
bijv. 1 bestaat al
2 bestaat al
3 maak ik maar de 3 moet ie automatisch beforepost ofzo er in zetten.

kan iemend me op weg helpen met het vullen van dat nieuwe record met de aangemaakte key???

Verwijderd

Topicstarter
is het nog te vroeg voor programmeurs ofzo???

  • whoami
  • Registratie: December 2000
  • Nu online
Brr.. Data aware controls, daar hou ik niet zo van.

Ik vind het veel beter om alles van uw query zelf in een ListView of Grid te zetten.
Het updaten/inserten kan je dan doen met een SQL insert of update statement.
Zo heb je veel meer controle vind ik over het programma.

Anyway, ik denk dat je je tabel zult moeten voor edit zult moeten openen. Ik denk zo iets (zelf niet getest, te lui om BCB of Delphi op te starten)
code:
1
2
3
4
5
Table1.Open();
Table1.Append();
Table1.Edit();
Table1.FieldByName ('Id_veld').AsInteger := NieuwGegenereerdeKey;
Table1.Post();

https://fgheysels.github.io/


Verwijderd

Maak een nieuwe tabel aan b.v. " SEQ " zet in die tabel een veld " usercount " van het type integer.

En nu elke keer als je nu een user toevoegd dan hoog je eerst het nummer in usercount op ! en dat nummer gebruik je dan als je unieke nummer.

En het ophogen kan met een query of gewoon

Seq.edit;
seqUsercount.value := seqUsercount.value +1;
seq.post;

etc .... ik neem aan dat het nu duidelijk is.

  • whoami
  • Registratie: December 2000
  • Nu online
Op woensdag 12 december 2001 18:38 schreef D32 het volgende:
Maak een nieuwe tabel aan b.v. " SEQ " zet in die tabel een veld " usercount " van het type integer.

En nu elke keer als je nu een user toevoegd dan hoog je eerst het nummer in usercount op ! en dat nummer gebruik je dan als je unieke nummer.

En het ophogen kan met een query of gewoon

Seq.edit;
seqUsercount.value := seqUsercount.value +1;
seq.post;

etc .... ik neem aan dat het nu duidelijk is.
Ik denk niet dat zijn probleem was hoe hij die nieuwe key moest bepalen/bereken maar hoe hij hem in de DB kreeg.

https://fgheysels.github.io/


Verwijderd

oh dan heb ik het verkeerd begrepen. Ja dan is het simpel.

user.edit;
usernumber.asinteger := newnumber;
user.post;

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Ik had ook nog even een klein vraagje wat hier een beetje op aansluit:

Ik heb een DBase table met een index op in column. Het gaat hier om een column met getallen. Hoe kan ik nou het grootste getal eruit vissen?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Op woensdag 12 december 2001 20:14 schreef jelmervos het volgende:
Ik heb een DBase table met een index op in column. Het gaat hier om een column met getallen. Hoe kan ik nou het grootste getal eruit vissen?
Gewoon met een standaard BDE TTable? Met Table1.Last ga je naar 't laatste record, en als je de index goed hebt staan is dat dus 't record met de hoogste waarde in die column.
Met de drivers van Halcyon en Apollo werkt 't op een soortgelijke manier.

Met de gratis drivers van Advantage kun je 't meer op een SQL manier aanpakken, met een query als
'select max(column) from "table.dbf"' bijvoorbeeld.

Apollo heeft ook zo'n soort toevoeging, maar die is niet echt gratis. En in de praktijk zijn hier de Advantage drivers een stuk betrouwbaarder gebleken dan Apollo en Halcyon, zeker wanneer je met uitgebreide (FoxPro) compound indexes werkt.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Oke, thanks voor de info.

Als ik een index heb gemaakt op een kolom van een tabel, wordt deze dan automatisch gerefreshed enzo. Dus na het maken geen omkijken meer naar???

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Op woensdag 12 december 2001 20:42 schreef jelmervos het volgende:
Als ik een index heb gemaakt op een kolom van een tabel, wordt deze dan automatisch gerefreshed enzo. Dus na het maken geen omkijken meer naar???
Ja, mits 'ie is opgenomen in de IndexFiles van dat TTable component. Bij dBase files moet de client al dat soort dingen bijhouden, en dus ook weten wat 'ie moet bijhouden.

Gebruik je compound indexes (aan te raden bij meer dan een stuk of 3 indexen op een tabel), en die indexfile heet hetzelfde als de tabel, dan maintainen de drivers van Advantage, Halcyon en Apollo die automatisch. De BDE kan echter niet goed met compound indexes overweg...

  • whoami
  • Registratie: December 2000
  • Nu online
En hierbij nomineer ik Jelmervos als de 'koekoek' van het forum. >:) :)
Hij is nl specialist in het stellen van een vraag over zijn probleem in andermans topic, net zoals een koekoek die een ei legt in een andere vogel zijn nest.

zie ook : [topic=345916]

niet kwaad bedoeld hoor jelmervos, maar waarom zelf geen topic openen?

https://fgheysels.github.io/


Verwijderd

Topicstarter
om het topic nog effe voort te zetten:
hele leuke oplossingen enzo maar ik heb niet echt veel tijd , en nog nooit gewerkt met sql in delphi dus dat met sql wordt nix. de andere Oplossingen zijn ook wel creatief enzo maar niet wat ik zoek.

Ik heb namelijk al de rest van het record gevuld:
code:
1
2
3
nummer|naam|beschrijving|enz..
     |ding1|leuk ding| enz
1001   |ding2|kewl     | enz

nu wil ik dus dat als ik klaar ben met de gegevens in te vullen in de dbgrid van ding1 en als ik dan op post ram dat er automatisch de key 1002 in het record komt

hert maken van die key is geen probleem alleen die key in het record pleuren dus.

  • whoami
  • Registratie: December 2000
  • Nu online
Op maandag 17 december 2001 16:23 schreef Zoepnek het volgende:
om het topic nog effe voort te zetten:
hele leuke oplossingen enzo maar ik heb niet echt veel tijd , en nog nooit gewerkt met sql in delphi dus dat met sql wordt nix. de andere Oplossingen zijn ook wel creatief enzo maar niet wat ik zoek.
Dan moet je toch maar eens SQL gaan bekijken hoor vind ik. Als je een serieuze DB applicatie wilt maken, kan je echt niet zonder SQL.

die nieuwe sleutel ophalen doe je al best mbhv een select max, multi-user problematiek buiten beschouwing gelaten

Maar met volgende code in de OnNewRecord event handler van uw table moet het toch al lukken:
Dit is C++ Builder code, moet je nog ff omzetten naar Delphi
code:
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::Table1NewRecord(TDataSet *DataSet)
{
    int VolgendeSleutel;

    Query1->SQL->Text = "SELECT MAX(Id_veld) AS id FROM table";
    Query1->Open();
    VolgendeSleutel = Query1->FieldByName("id")->AsInteger;
    Query1->Close();
    VolgendeSleutel++;
    DataSet->FieldByName ("Id_Veld")->AsInteger = VolgendeSleutel;
}

edit:
even mijn nalatigheden verbeterd

https://fgheysels.github.io/


Verwijderd

whoami, je vergeet VolgendeSleutel op te hogen... :)
En om 'm AsString terug te zetten terwijl 't een integer is, is misschien ook niet zo handig.

Maar bij databases zonder auto incrementing fields, identities en/of generators is dit idd de netste oplossing (afgezien van het multi-user probleem), met de minste redundancy.
Maar bij tabellen met veel records is 't ook nogal traag, en dan is 't handiger om een redundant tabel bij te houden met de laatst uitgegeven ID's.

Verwijderd

Topicstarter
Op maandag 17 december 2001 16:49 schreef whoami het volgende:

[..]

Dan moet je toch maar eens SQL gaan bekijken hoor vind ik. Als je een serieuze DB applicatie wilt maken, kan je echt niet zonder SQL.
serieus bhahahahahahah nee man t is voor school maar toch bedankt. het is geloof ik wat ik zoek.
effe stoeien

  • whoami
  • Registratie: December 2000
  • Nu online
Op maandag 17 december 2001 17:06 schreef Afterlife het volgende:
whoami, je vergeet VolgendeSleutel op te hogen... :)
En om 'm AsString terug te zetten terwijl 't een integer is, is misschien ook niet zo handig.
Nuja, inderdaad moet nog VolgendeSleutel++ bijkomen. Sorry vergeten.
Dat van die AsString: dat moet idd AsInteger zijn. Was maar omdat ik bij m'n testcase een character veld automatisch liet opvullen, vergeten aan te passen naar AsInteger.
Maar bij databases zonder auto incrementing fields, identities en/of generators is dit idd de netste oplossing (afgezien van het multi-user probleem), met de minste redundancy.
Maar bij tabellen met veel records is 't ook nogal traag, en dan is 't handiger om een redundant tabel bij te houden met de laatst uitgegeven ID's.
Inderdaad, daarom zei ik ook afgezien de multi-user problematiek. Snelheid is idd ook een punt. :)

https://fgheysels.github.io/

Pagina: 1