Avatar billede michael-schou Novice
24. juli 2009 - 12:32 Der er 10 kommentarer og
1 løsning

Opdatering af post i tabel.

Hej Eksperten.

Jeg har 2 tabeller i en ADODB.

Tabel 1 : Nv
Tabel 2 : Grp

I begge tabeller er der et felt ved navn : Gruppe

Tabel 2 indeholder KUN dette ene felt.

Der er oprettet en 1-til mange relation mellem de 2 tabeller som linker gruppe feltet fra begge tabeller.

Når jeg editere posten i Tabel 2 vil jeg gerne have posten opdateret i Tabel 1.

Hvordan gør men det på den rette måde.? via. ADOQuery?

Jeg har prøvet alt fra refresh af dataset til at lukke ADOTable/ADOQuery.

Mvh.

Michael.
Avatar billede hrc Mester
24. juli 2009 - 15:27 #1
Du laver en autoinc primærnøgle i "grp" og linker til den i "ny".

Alternativet er at Gruppe er primærnøglen. Du skal derefter lave en relation til grp og specificere at fremmednøglen er Gruppe. Oveni skal du sætte Cascade på dens update

Hvis du efterfølgende retter i gruppe i ny, så bliver den også rettet i grp.

Skal gerne lave tabeloprettelserne, men det kommer i næste post.
Avatar billede hrc Mester
24. juli 2009 - 15:35 #2
CREATE TABLE [dbo].[Grp](
    [Gruppe] [nchar](10) NOT NULL,
CONSTRAINT [PK_Grp] PRIMARY KEY([Gruppe] ASC)
)

CREATE TABLE [dbo].[Ny](
    [Gruppe] [nchar](10) NOT NULL,
    [Tekst] [nchar](100) NULL
)

ALTER TABLE [dbo].[Ny]  WITH CHECK ADD  CONSTRAINT [fk_grp] FOREIGN KEY([Gruppe])
REFERENCES [dbo].[Grp] ([Gruppe])
ON UPDATE CASCADE
ON DELETE CASCADE

ALTER TABLE [dbo].[Ny] CHECK CONSTRAINT [fk_grp]
Avatar billede michael-schou Novice
27. juli 2009 - 11:56 #3
Hey hrc.

Det kan jeg ikke få til at virke da det er en "1-til-mange" relation det skal det være for "Gruppe" i NV tabellen kan indeholde den samme gruppe flere gange.

Gruppe må KUN forkomme 1 gang i Grp Tabellen.

Eks :

-----------------------------------------------------------------
>>NV Tabellen :

Navn : Peter
Efternavn : Petersen
Gruppe : Familie

Navn : Hans
Efternavn : Hansen
Gruppe : Arbejdskollega

Navn : Jens
Efternavn : Jensen
Gruppe : Arbejdskollega


>>Grp Tabellen :

Familie
Arbejdskollega

-----------------------------------------------------------------

Så når man kigger i tabellen GRP vil den vise de 2 personer under gruppen Arbejdskollega.

Når jeg så editere Arbejdskollega til f.eks : Arb.Kollega

Så bliver den ændret med det samme Grp tabellen og updateret i NV tabellen.

Men Delphi opfatter først denne editering når man trykker på F5 eller Lukker-åbner programmet.
Avatar billede hrc Mester
27. juli 2009 - 12:41 #4
Datasættest OnAfterPost kan bruges til at vise ændringen (close, open). Hvis du bruger TClientDataSet er der en Update du kan fyre af; det er lidt pænere.
Avatar billede michael-schou Novice
28. juli 2009 - 15:25 #5
Hey hrc.

Det er lige meget hvad jeg gør så skal man enten trykke på F5 eller lukke / åbne programmet for at opdatere, så jeg bruger bare F5

Så jeg lukker bare dette spm.

Så smid et svar for point.

Men tak for hjælpen og forsøget som altid :D

Mvh.

Michael.
Avatar billede hrc Mester
28. juli 2009 - 18:33 #6
Jeg tror ikke du gør som jeg foreslår for det skal virke. Hvis du bruger TADOQuery.AfterPost (eller TADODTable.AfterPost) eventen kan du lukke og åbne den der - og så bliver datasættet opdateret.

For ADO noget i retning af dette:

procedure TfrmMain.ADOQuery1AfterPost(DataSet: TDataSet);
begin
  DataSet.Close;
  DataSet.Open;
end;

Bruger du TClientDataSet er det sådan:

procedure TfrmMain.CDSQuery1AfterPost(DataSet: TDataSet);
begin
  (DataSet as TClientDataSet.Update;
end;
Avatar billede michael-schou Novice
29. juli 2009 - 09:13 #7
Jeg gør det på en anden måde :

Der skal ikke editeres i gruppe feltet, der kan man bare vælge en Gruppe via en DBComboBox.

Hvis der er en gruppe der skal editeres bliver dette gjort på en anden form også virker det :D

Takker hrc.
Avatar billede hrc Mester
29. juli 2009 - 10:09 #8
Selv tak.

.. Har vist misforstået spørgsmålet lidt...

Når nu du ikke har behov for at kunne rette her og nu i dialogen, er det rette at bruge nedenstående løsning:

Brug en TDBLookupCombo med nøglen (field) ID og vise navn(ene) i comboen. Så er opgaven løst. Skal du rettet et navn går du ind i grp-tabellen og retter der. Så rettes det alle steder, simpelthen fordi den laver opslaget i grp og ser hvar der er der.

Det er smart at separere intern logik og ekstern data. De databærende felter skal ikke også være de der får tabellerne til at hænge sammen.

Desuden fylder det en del mindre da en tekststreng på 50 (her godtnok varchar som kun fylder hvad der bliver brugt - tror slet ikke MSSQL vil være med på det) er noget voldsommere end et heltal på 4 bytes.

Der er større risiko for at skrive forkert. En nøgle der hedder "Kontorforsyningsenhed" er mere usikkert end tallet 12.

Ulempen med en primærnøgle er, at du kan have sammenfald på navne (eks. flere forekomster af "Delahaye"), men det kan løses med et unikt indeks på navn-feltet.

CREATE TABLE [dbo].[grp]
(
  [ID] [int] IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL,
  [navn] [varchar](50),
  CONSTRAINT [pk_grp] PRIMARY KEY([ID])
)

CREATE TABLE [dbo].[nv]
(
  [ID] [int] IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL,
  [grp_ID] [int] NULL,
  [oprettet] [datetime] NULL CONSTRAINT [df_nv_oprettet]
  CONSTRAINT [pk_nv] PRIMARY KEY([ID]),
  CONSTRAINT [fk_nv_grp] FOREIGN KEY([grp_ID]) REFERENCES [grp] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE
)


Kan sagtens strikke et eksempel sammen hvis du lægger en email.
Avatar billede michael-schou Novice
29. juli 2009 - 13:22 #9
Vil da gerne se et eksempel :D

Det er altid godt at lære noget nyt :-)

michael_schou@hotmail.com
Avatar billede hrc Mester
31. juli 2009 - 01:59 #10
Det blev et lidt besværligt eksempel. Jeg valgte at bruge ClientDataSet selvom de aldrig har forekommet mig lette, endsige fejlfrie. Der er dog ting i konceptet der har fordele.

Dernæst valgte jeg et gammelt eksempel på at proppe en LookupComboBox ind i gridden; desværre lidt for gammelt.

Det du primært kigger efter er kun 5% af koden - jeg beklager. Det er OnAfterPost hvor du skal lave en Close, Open for at få gridden opdateret. Det andet sted er qNV's script som joiner med qGrp og derved kan vise navnet i gridden. Endelig er der opsætningen af LookupComboen.

Håber du kan skille "godt" fra "snot" (eller hvad man nu siger)
Avatar billede michael-schou Novice
31. juli 2009 - 08:28 #11
Okay jeg takker :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester